@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
@@ -45,8 +45,6 @@ function fallbackBinding(...sources) {
45
45
  sources: [...sources]
46
46
  };
47
47
  }
48
- //#endregion
49
- //#region ../api/src/apiEndpointTypes.ts
50
48
  function blockedDemoMutationPolicy(classification, publicMessage) {
51
49
  if (publicMessage.trim() === "") throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
52
50
  return {
@@ -74,6 +72,7 @@ const TAG_TEMPLATES = {
74
72
  siteRouteOutcomes: "riverbank:site:{siteId}:route-outcomes",
75
73
  routeById: "riverbank:route:{routeId}",
76
74
  pageById: "riverbank:page:{pageId}",
75
+ pageSurfaceById: "riverbank:page-surface:{pageSurfaceId}",
77
76
  workflowRunById: "riverbank:workflow-run:{runId}",
78
77
  siteForms: "riverbank:site:{siteId}:forms",
79
78
  formById: "riverbank:form:{formId}",
@@ -97,7 +96,7 @@ const TAG_TEMPLATES = {
97
96
  blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
98
97
  blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
99
98
  blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
100
- 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;
99
+ 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;
101
100
  //#endregion
102
101
  //#region ../core/src/result.ts
103
102
  function ok(value) {
@@ -250,19 +249,29 @@ function isRecord$7(value) {
250
249
  //#region ../core/src/booking-date-time.ts
251
250
  const DEFAULT_LOCALE = "en-US";
252
251
  const FALLBACK_TIMEZONE = "UTC";
252
+ const DATE_TIME_FORMATTER_CACHE_LIMIT = 100;
253
+ const dateTimeFormatterCache = /* @__PURE__ */ new Map();
254
+ const timeZoneValidityCache = /* @__PURE__ */ new Map();
253
255
  function isValidTimeZone(timeZone) {
256
+ const cached = timeZoneValidityCache.get(timeZone);
257
+ if (cached !== void 0) return cached;
258
+ let isValid;
254
259
  try {
255
260
  new Intl.DateTimeFormat(DEFAULT_LOCALE, { timeZone }).format(/* @__PURE__ */ new Date());
256
- return true;
261
+ isValid = true;
257
262
  } catch {
258
- return false;
263
+ isValid = false;
259
264
  }
265
+ if (timeZoneValidityCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) timeZoneValidityCache.clear();
266
+ timeZoneValidityCache.set(timeZone, isValid);
267
+ return isValid;
260
268
  }
261
269
  function getSafeTimeZone(timeZone) {
262
270
  const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
263
271
  return normalized.length > 0 && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
264
272
  }
265
273
  function parseStrictBookingTimeZone(timeZone) {
274
+ if (typeof timeZone !== "string") return null;
266
275
  const normalized = timeZone.trim();
267
276
  if (normalized.length === 0 || !isValidTimeZone(normalized)) return null;
268
277
  return normalized;
@@ -275,10 +284,19 @@ function formatParseError(error) {
275
284
  }
276
285
  }
277
286
  function formatToPartsLookup(date, locale, timeZone, format) {
278
- return new Map(new Intl.DateTimeFormat(locale, {
287
+ return new Map(getCachedDateTimeFormatter(locale, timeZone, format).formatToParts(date).map((part) => [part.type, part.value]));
288
+ }
289
+ function getCachedDateTimeFormatter(locale, timeZone, format) {
290
+ const key = `${locale}\u0000${timeZone}\u0000${JSON.stringify(Object.entries(format).sort(([left], [right]) => left.localeCompare(right)))}`;
291
+ const cached = dateTimeFormatterCache.get(key);
292
+ if (cached !== void 0) return cached;
293
+ const formatter = new Intl.DateTimeFormat(locale, {
279
294
  ...format,
280
295
  timeZone
281
- }).formatToParts(date).map((part) => [part.type, part.value]));
296
+ });
297
+ if (dateTimeFormatterCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) dateTimeFormatterCache.clear();
298
+ dateTimeFormatterCache.set(key, formatter);
299
+ return formatter;
282
300
  }
283
301
  function getZonedDateTimeParts(date, timeZone) {
284
302
  const parts = formatToPartsLookup(date, "en-GB", timeZone, {
@@ -321,23 +339,9 @@ function toUtcIsoDateTimeString(value) {
321
339
  return parsed.value;
322
340
  }
323
341
  function parseScheduledBookingDateTime(input) {
342
+ let startsAt;
324
343
  try {
325
- const startsAt = toUtcIsoDateTimeString(input.startsAt);
326
- const timeZone = parseStrictBookingTimeZone(input.timeZone);
327
- if (timeZone === null) return {
328
- ok: false,
329
- field: "timeZone",
330
- reason: "invalid_time_zone",
331
- value: input.timeZone
332
- };
333
- return {
334
- ok: true,
335
- value: {
336
- startsAt,
337
- timeZone,
338
- locale: input.locale
339
- }
340
- };
344
+ startsAt = toUtcIsoDateTimeString(input.startsAt);
341
345
  } catch {
342
346
  return {
343
347
  ok: false,
@@ -346,6 +350,21 @@ function parseScheduledBookingDateTime(input) {
346
350
  value: input.startsAt
347
351
  };
348
352
  }
353
+ const timeZone = parseStrictBookingTimeZone(input.timeZone);
354
+ if (timeZone === null) return {
355
+ ok: false,
356
+ field: "timeZone",
357
+ reason: "invalid_time_zone",
358
+ value: typeof input.timeZone === "string" ? input.timeZone : ""
359
+ };
360
+ return {
361
+ ok: true,
362
+ value: {
363
+ startsAt,
364
+ timeZone,
365
+ locale: input.locale
366
+ }
367
+ };
349
368
  }
350
369
  function toScheduledBookingDateTime(input) {
351
370
  const result = parseScheduledBookingDateTime(input);
@@ -3475,6 +3494,111 @@ const mediaSchema$1 = z.object({
3475
3494
  transform: transformSchema$1.optional()
3476
3495
  });
3477
3496
  //#endregion
3497
+ //#region ../theme-core/src/buttons/effectClassification.ts
3498
+ /**
3499
+ * Exhaustive live policy for every registered effect id.
3500
+ *
3501
+ * The resolver consumes the transition payload directly, so adding an effect
3502
+ * cannot update classification without also defining its runtime behavior.
3503
+ */
3504
+ const BUTTON_EFFECT_POLICIES = {
3505
+ "darken-background": {
3506
+ classification: "colour-transition",
3507
+ transition: {
3508
+ kind: "adjust-shade",
3509
+ direction: "darker"
3510
+ }
3511
+ },
3512
+ "lighten-background": {
3513
+ classification: "colour-transition",
3514
+ transition: {
3515
+ kind: "adjust-shade",
3516
+ direction: "lighter"
3517
+ }
3518
+ },
3519
+ "background-on-hover": {
3520
+ classification: "colour-transition",
3521
+ transition: { kind: "replace-background" }
3522
+ },
3523
+ "background-on-hover-alpha": {
3524
+ classification: "unsupported-colour",
3525
+ reason: "alpha_requires_surface"
3526
+ },
3527
+ "fade-background": {
3528
+ classification: "unsupported-colour",
3529
+ reason: "changes_element_opacity"
3530
+ },
3531
+ "opacity-reduce": {
3532
+ classification: "unsupported-colour",
3533
+ reason: "changes_element_opacity"
3534
+ },
3535
+ "gradient-text": {
3536
+ classification: "unsupported-colour",
3537
+ reason: "changes_foreground"
3538
+ },
3539
+ "text-color-change": {
3540
+ classification: "unsupported-colour",
3541
+ reason: "changes_foreground"
3542
+ },
3543
+ "border-color-change": {
3544
+ classification: "unsupported-colour",
3545
+ reason: "changes_border"
3546
+ },
3547
+ "aurora-glow": {
3548
+ classification: "unsupported-background-overlay",
3549
+ reason: "unresolved_background_overlay"
3550
+ },
3551
+ "cosmic-stardust": {
3552
+ classification: "unsupported-background-overlay",
3553
+ reason: "unresolved_background_overlay"
3554
+ },
3555
+ "gradient-border-fill": {
3556
+ classification: "unsupported-background-overlay",
3557
+ reason: "unresolved_background_overlay"
3558
+ },
3559
+ "animated-gradient-border-fill": {
3560
+ classification: "unsupported-background-overlay",
3561
+ reason: "unresolved_background_overlay"
3562
+ },
3563
+ "nav-underline": {
3564
+ classification: "not-button",
3565
+ reason: "not_button_effect"
3566
+ },
3567
+ "nav-frosted-base": {
3568
+ classification: "not-button",
3569
+ reason: "not_button_effect"
3570
+ },
3571
+ "nav-frosted-hover": {
3572
+ classification: "not-button",
3573
+ reason: "not_button_effect"
3574
+ },
3575
+ "nav-frosted-active": {
3576
+ classification: "not-button",
3577
+ reason: "not_button_effect"
3578
+ },
3579
+ "animated-gradient": { classification: "non-colour" },
3580
+ "border-glow": { classification: "non-colour" },
3581
+ "drop-shadow": { classification: "non-colour" },
3582
+ "inner-shadow": { classification: "non-colour" },
3583
+ "neumorphic-shadow": { classification: "non-colour" },
3584
+ "outer-glow": { classification: "non-colour" },
3585
+ "retro-3d-shadow": { classification: "non-colour" },
3586
+ "scale-up": { classification: "non-colour" },
3587
+ "scale-down": { classification: "non-colour" },
3588
+ lift: { classification: "non-colour" },
3589
+ "press-down": { classification: "non-colour" },
3590
+ pop: { classification: "non-colour" },
3591
+ "border-bottom-grow": { classification: "non-colour" },
3592
+ "sketchy-border": { classification: "non-colour" },
3593
+ "pulse-animation": { classification: "non-colour" }
3594
+ };
3595
+ function getButtonEffectPolicy(effectId) {
3596
+ return Object.prototype.hasOwnProperty.call(BUTTON_EFFECT_POLICIES, effectId) ? BUTTON_EFFECT_POLICIES[effectId] : null;
3597
+ }
3598
+ function classifyButtonEffectId(effectId) {
3599
+ return getButtonEffectPolicy(effectId)?.classification ?? "unknown";
3600
+ }
3601
+ //#endregion
3478
3602
  //#region ../theme-core/src/buttons/types.ts
3479
3603
  /**
3480
3604
  * Standard semantic variant roles a theme exposes.
@@ -3491,6 +3615,20 @@ const VARIANT_ROLES = [
3491
3615
  "tertiary",
3492
3616
  "accent"
3493
3617
  ];
3618
+ function parseOpaqueButtonColourToken(value) {
3619
+ const token = parseThemeColorToken(value);
3620
+ if (token === null) return null;
3621
+ const parts = parseColorTokenParts(token);
3622
+ return parts.kind === "token" && parts.opacityPercent === null ? token : null;
3623
+ }
3624
+ function unsafeAsOpaqueButtonColourToken(value) {
3625
+ return value;
3626
+ }
3627
+ const opaqueButtonColourTokenSchema = themeColorTokenSchema.refine((value) => parseOpaqueButtonColourToken(value) !== null, "Button colour tokens must be opaque").transform((value) => {
3628
+ const token = parseOpaqueButtonColourToken(value);
3629
+ if (token === null) throw new Error("Invariant: opaque button token passed its schema");
3630
+ return token;
3631
+ });
3494
3632
  const cornerStyleSchema = z$1.enum([
3495
3633
  "square",
3496
3634
  "rounded",
@@ -3592,7 +3730,7 @@ const buttonSizesSchema = z$1.object({
3592
3730
  lg,
3593
3731
  xl: xl ?? lg
3594
3732
  }));
3595
- const buttonGlobalSettingsSchema = z$1.object({
3733
+ const canonicalButtonGlobalSettingsSchema = z$1.object({
3596
3734
  cornerStyle: cornerStyleSchema,
3597
3735
  cornerRadius: z$1.number().min(0).max(24).optional(),
3598
3736
  /**
@@ -3623,11 +3761,12 @@ const buttonGlobalSettingsSchema = z$1.object({
3623
3761
  paddingPreset: buttonPaddingPresetSchema.optional(),
3624
3762
  hoverTransform: hoverTransformSchema,
3625
3763
  hoverColor: hoverColorSchema,
3626
- hoverColorToken: themeColorTokenSchema.optional(),
3764
+ hoverColorToken: opaqueButtonColourTokenSchema.optional(),
3627
3765
  gradientStyle: gradientStyleSchema.optional(),
3628
3766
  gradientAngle: z$1.number().min(0).max(360).optional(),
3629
3767
  gradientSharpness: gradientSharpnessSchema.optional()
3630
3768
  });
3769
+ const buttonGlobalSettingsSchema = z$1.preprocess(normalizeLegacyButtonGlobalInput, canonicalButtonGlobalSettingsSchema);
3631
3770
  const gradientDirectionSchema$1 = z$1.enum([
3632
3771
  "to-r",
3633
3772
  "to-l",
@@ -3641,27 +3780,33 @@ const gradientDirectionSchema$1 = z$1.enum([
3641
3780
  const buttonBackgroundSchema = z$1.discriminatedUnion("type", [
3642
3781
  z$1.object({
3643
3782
  type: z$1.literal("solid"),
3644
- colorToken: themeColorTokenSchema
3783
+ colorToken: opaqueButtonColourTokenSchema
3645
3784
  }),
3646
3785
  z$1.object({
3647
3786
  type: z$1.literal("gradient"),
3648
- stops: z$1.array(themeColorTokenSchema).min(2),
3649
- direction: gradientDirectionSchema$1
3787
+ stops: z$1.array(opaqueButtonColourTokenSchema).min(2).transform((stops) => {
3788
+ const [first, second, ...rest] = stops;
3789
+ if (first === void 0 || second === void 0) throw new Error("Invariant: gradient stops passed the minimum length schema");
3790
+ return [
3791
+ first,
3792
+ second,
3793
+ ...rest
3794
+ ];
3795
+ }),
3796
+ direction: gradientDirectionSchema$1,
3797
+ foregroundToken: opaqueButtonColourTokenSchema
3650
3798
  }),
3651
- z$1.object({ type: z$1.literal("transparent") })
3799
+ z$1.object({
3800
+ type: z$1.literal("surface"),
3801
+ role: z$1.literal("link")
3802
+ })
3652
3803
  ]);
3653
3804
  const effectApplicationSchema$1 = z$1.object({
3654
3805
  effectId: z$1.string(),
3655
- options: z$1.record(z$1.string(), z$1.any()).optional()
3656
- });
3657
- const buttonBorderSchema = z$1.object({
3658
- widthClass: z$1.string(),
3659
- colorToken: themeColorTokenSchema
3660
- });
3661
- const buttonVariantAffordanceSchema = z$1.object({
3662
- iconId: z$1.string().min(1),
3663
- colorToken: themeColorTokenSchema.optional()
3806
+ options: z$1.record(z$1.string(), z$1.json()).optional()
3664
3807
  });
3808
+ const buttonBorderSchema = z$1.object({ widthClass: z$1.string() });
3809
+ const buttonVariantAffordanceSchema = z$1.object({ iconId: z$1.string().min(1) });
3665
3810
  const variantShadowSchema = z$1.object({
3666
3811
  elevation: z$1.enum([
3667
3812
  "none",
@@ -3702,27 +3847,170 @@ const variantSizeOverridesSchema = z$1.object({
3702
3847
  * default (e.g. link-style variants declaring zero horizontal padding at
3703
3848
  * every size).
3704
3849
  */
3705
- const buttonVariantSchema = z$1.object({
3850
+ const canonicalButtonVariantSchema = z$1.object({
3706
3851
  id: z$1.string(),
3707
3852
  name: z$1.string().min(1).max(20),
3708
3853
  enabled: z$1.boolean(),
3709
3854
  priority: prioritySchema,
3710
3855
  background: buttonBackgroundSchema,
3711
- textColorToken: themeColorTokenSchema,
3712
3856
  /** Tailwind radius token (e.g. `'rounded-md'`). Omit to inherit from `global.cornerStyle`. */
3713
3857
  borderRadius: z$1.string().optional(),
3714
3858
  shadow: variantShadowSchema.optional(),
3715
3859
  border: buttonBorderSchema.optional(),
3716
- hoverBackgroundToken: z$1.string().optional(),
3860
+ hoverBackgroundToken: opaqueButtonColourTokenSchema.optional(),
3717
3861
  effects: variantEffectsSchema.optional(),
3718
3862
  sizes: variantSizeOverridesSchema.optional(),
3719
3863
  affordance: buttonVariantAffordanceSchema.optional()
3720
3864
  });
3865
+ /**
3866
+ * Temporary persisted-theme admission boundary for issue #1206.
3867
+ *
3868
+ * Production inventory on 2026-07-22 found 22 rows using the old independent
3869
+ * `textColorToken`/border colour shape. New source and all downstream code use
3870
+ * only the canonical relationship. Delete this preprocessor after the reviewed
3871
+ * production rewrite reports zero legacy rows.
3872
+ */
3873
+ const buttonVariantSchema = z$1.preprocess(normalizeLegacyButtonVariantInput, canonicalButtonVariantSchema);
3721
3874
  const buttonSystemSchema = z$1.object({
3722
3875
  global: buttonGlobalSettingsSchema,
3723
3876
  variants: z$1.array(buttonVariantSchema).min(1).max(6),
3724
3877
  sizes: buttonSizesSchema.optional()
3725
3878
  });
3879
+ function normalizeLegacyButtonVariantInput(input) {
3880
+ if (!isUnknownRecord(input)) return input;
3881
+ const background = input.background;
3882
+ if (!isUnknownRecord(background)) return input;
3883
+ 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;
3884
+ const { textColorToken, ...withoutLegacyText } = input;
3885
+ const normalizedBorder = isUnknownRecord(input.border) && typeof input.border.widthClass === "string" ? { widthClass: input.border.widthClass } : input.border;
3886
+ const normalizedAffordance = isUnknownRecord(input.affordance) && typeof input.affordance.iconId === "string" ? { iconId: input.affordance.iconId } : input.affordance;
3887
+ const normalizedEffects = normalizeLegacyButtonEffects(input.effects, background.type);
3888
+ const hoverBackgroundToken = stripLegacyTokenAlpha(input.hoverBackgroundToken);
3889
+ if (background.type === "transparent") return {
3890
+ ...withoutLegacyText,
3891
+ background: {
3892
+ type: "surface",
3893
+ role: "link"
3894
+ },
3895
+ border: normalizedBorder,
3896
+ affordance: normalizedAffordance,
3897
+ effects: normalizedEffects,
3898
+ hoverBackgroundToken
3899
+ };
3900
+ if (background.type === "gradient") {
3901
+ const stops = Array.isArray(background.stops) ? background.stops.map(stripLegacyTokenAlpha) : background.stops;
3902
+ return {
3903
+ ...withoutLegacyText,
3904
+ background: {
3905
+ ...background,
3906
+ stops,
3907
+ foregroundToken: stripLegacyTokenAlpha(background.foregroundToken ?? textColorToken)
3908
+ },
3909
+ border: normalizedBorder,
3910
+ affordance: normalizedAffordance,
3911
+ effects: normalizedEffects,
3912
+ hoverBackgroundToken
3913
+ };
3914
+ }
3915
+ return {
3916
+ ...withoutLegacyText,
3917
+ background: background.type === "solid" ? {
3918
+ ...background,
3919
+ colorToken: stripLegacyTokenAlpha(background.colorToken)
3920
+ } : background,
3921
+ border: normalizedBorder,
3922
+ affordance: normalizedAffordance,
3923
+ effects: normalizedEffects,
3924
+ hoverBackgroundToken
3925
+ };
3926
+ }
3927
+ function normalizeLegacyButtonGlobalInput(input) {
3928
+ if (!isUnknownRecord(input)) return input;
3929
+ const hoverColorToken = stripLegacyTokenAlpha(input.hoverColorToken);
3930
+ return hoverColorToken === input.hoverColorToken ? input : {
3931
+ ...input,
3932
+ hoverColorToken
3933
+ };
3934
+ }
3935
+ function hasLegacyAlphaToken(input, background) {
3936
+ const stops = isUnknownArray(background.stops) ? background.stops : [];
3937
+ return [
3938
+ input.hoverBackgroundToken,
3939
+ background.colorToken,
3940
+ background.foregroundToken,
3941
+ ...stops
3942
+ ].some((token) => stripLegacyTokenAlpha(token) !== token);
3943
+ }
3944
+ function stripLegacyTokenAlpha(value) {
3945
+ if (typeof value !== "string") return value;
3946
+ const slashIndex = value.indexOf("/");
3947
+ return slashIndex < 0 ? value : value.slice(0, slashIndex);
3948
+ }
3949
+ function hasLegacyButtonEffects(input) {
3950
+ if (!isUnknownRecord(input)) return false;
3951
+ return [
3952
+ "base",
3953
+ "hover",
3954
+ "active",
3955
+ "focus"
3956
+ ].some((state) => {
3957
+ const effects = input[state];
3958
+ return Array.isArray(effects) && effects.some((effect) => {
3959
+ if (!isUnknownRecord(effect) || typeof effect.effectId !== "string") return true;
3960
+ const classification = classifyButtonEffectId(effect.effectId);
3961
+ if (classification !== "colour-transition" && classification !== "non-colour") return true;
3962
+ return effect.effectId === "background-on-hover" && isUnknownRecord(effect.options) && stripLegacyTokenAlpha(effect.options.colorToken) !== effect.options.colorToken;
3963
+ });
3964
+ });
3965
+ }
3966
+ function normalizeLegacyButtonEffects(input, backgroundType) {
3967
+ if (!isUnknownRecord(input)) return input;
3968
+ const normalized = {};
3969
+ for (const state of [
3970
+ "base",
3971
+ "hover",
3972
+ "active",
3973
+ "focus"
3974
+ ]) {
3975
+ const effects = input[state];
3976
+ if (!Array.isArray(effects)) continue;
3977
+ const safeEffects = effects.flatMap((effect) => {
3978
+ if (!isUnknownRecord(effect) || typeof effect.effectId !== "string") return [];
3979
+ const classification = classifyButtonEffectId(effect.effectId);
3980
+ if (classification === "non-colour") return [effect];
3981
+ if (classification !== "colour-transition") return [];
3982
+ if (effect.effectId === "background-on-hover") {
3983
+ const options = isUnknownRecord(effect.options) ? effect.options : null;
3984
+ const colorToken = options === null ? null : parseOpaqueButtonColourToken(stripLegacyTokenAlpha(options.colorToken));
3985
+ return colorToken === null ? [] : [{
3986
+ ...effect,
3987
+ options: {
3988
+ ...options,
3989
+ colorToken
3990
+ }
3991
+ }];
3992
+ }
3993
+ if (backgroundType !== "solid") return [];
3994
+ const rawAmount = isUnknownRecord(effect.options) ? effect.options.amount : void 0;
3995
+ const amount = typeof rawAmount === "number" && rawAmount > 0 ? Math.max(100, Math.round(rawAmount / 100) * 100) : 100;
3996
+ return [{
3997
+ ...effect,
3998
+ options: {
3999
+ ...isUnknownRecord(effect.options) ? effect.options : {},
4000
+ amount
4001
+ }
4002
+ }];
4003
+ });
4004
+ if (safeEffects.length > 0) normalized[state] = safeEffects;
4005
+ }
4006
+ return Object.keys(normalized).length === 0 ? void 0 : normalized;
4007
+ }
4008
+ function isUnknownRecord(value) {
4009
+ return typeof value === "object" && value !== null && !Array.isArray(value);
4010
+ }
4011
+ function isUnknownArray(value) {
4012
+ return Array.isArray(value);
4013
+ }
3726
4014
  buttonSizeNameSchema.options;
3727
4015
  //#endregion
3728
4016
  //#region ../theme-core/src/buttons/personalities/types.ts
@@ -3749,7 +4037,7 @@ function defineButtonPersonality(input) {
3749
4037
  name: input.name,
3750
4038
  description: input.description,
3751
4039
  tags: input.tags,
3752
- buttonSystem: input.buttonSystem
4040
+ buttonSystem: buttonSystemSchema.parse(input.buttonSystem)
3753
4041
  };
3754
4042
  }
3755
4043
  //#endregion
@@ -3802,19 +4090,15 @@ const brushedWash = defineButtonPersonality({
3802
4090
  background: {
3803
4091
  type: "gradient",
3804
4092
  stops: ["primary", "accent"],
3805
- direction: "to-r"
4093
+ direction: "to-r",
4094
+ foregroundToken: "primaryForeground"
3806
4095
  },
3807
- textColorToken: "primaryForeground",
3808
4096
  borderRadius: "rounded-lg",
3809
4097
  shadow: {
3810
4098
  elevation: "low",
3811
4099
  softness: "soft",
3812
4100
  position: "bottom"
3813
- },
3814
- effects: { hover: [{
3815
- effectId: "opacity-reduce",
3816
- options: { reduction: -15 }
3817
- }] }
4101
+ }
3818
4102
  },
3819
4103
  {
3820
4104
  id: "secondary",
@@ -3824,32 +4108,27 @@ const brushedWash = defineButtonPersonality({
3824
4108
  background: {
3825
4109
  type: "gradient",
3826
4110
  stops: ["secondary", "accent"],
3827
- direction: "to-br"
4111
+ direction: "to-br",
4112
+ foregroundToken: "primaryForeground"
3828
4113
  },
3829
- textColorToken: "primaryForeground",
3830
4114
  borderRadius: "rounded-lg",
3831
4115
  shadow: {
3832
4116
  elevation: "low",
3833
4117
  softness: "soft",
3834
4118
  position: "bottom"
3835
- },
3836
- effects: { hover: [{
3837
- effectId: "opacity-reduce",
3838
- options: { reduction: -15 }
3839
- }] }
4119
+ }
3840
4120
  },
3841
4121
  {
3842
4122
  id: "outline",
3843
4123
  name: "Outline",
3844
4124
  enabled: true,
3845
4125
  priority: 3,
3846
- background: { type: "transparent" },
3847
- textColorToken: "primary",
3848
- borderRadius: "rounded-lg",
3849
- border: {
3850
- widthClass: "border",
3851
- colorToken: "primary"
4126
+ background: {
4127
+ type: "surface",
4128
+ role: "link"
3852
4129
  },
4130
+ borderRadius: "rounded-lg",
4131
+ border: { widthClass: "border" },
3853
4132
  effects: { hover: [{
3854
4133
  effectId: "background-on-hover",
3855
4134
  options: { colorToken: "surface" }
@@ -3860,8 +4139,10 @@ const brushedWash = defineButtonPersonality({
3860
4139
  name: "Ghost",
3861
4140
  enabled: true,
3862
4141
  priority: 3,
3863
- background: { type: "transparent" },
3864
- textColorToken: "text",
4142
+ background: {
4143
+ type: "surface",
4144
+ role: "link"
4145
+ },
3865
4146
  borderRadius: "rounded-lg",
3866
4147
  effects: { hover: [{
3867
4148
  effectId: "background-on-hover",
@@ -3907,7 +4188,6 @@ const confidentChip = defineButtonPersonality({
3907
4188
  type: "solid",
3908
4189
  colorToken: "primary"
3909
4190
  },
3910
- textColorToken: "primaryForeground",
3911
4191
  borderRadius: "rounded-md",
3912
4192
  shadow: {
3913
4193
  elevation: "medium",
@@ -3917,7 +4197,7 @@ const confidentChip = defineButtonPersonality({
3917
4197
  effects: {
3918
4198
  hover: [{
3919
4199
  effectId: "darken-background",
3920
- options: { amount: 60 }
4200
+ options: { amount: 100 }
3921
4201
  }],
3922
4202
  active: [{
3923
4203
  effectId: "scale-down",
@@ -3934,12 +4214,8 @@ const confidentChip = defineButtonPersonality({
3934
4214
  type: "solid",
3935
4215
  colorToken: "surface"
3936
4216
  },
3937
- textColorToken: "text",
3938
4217
  borderRadius: "rounded-md",
3939
- border: {
3940
- widthClass: "border",
3941
- colorToken: "border"
3942
- },
4218
+ border: { widthClass: "border" },
3943
4219
  effects: { hover: [{
3944
4220
  effectId: "background-on-hover",
3945
4221
  options: { colorToken: "background" }
@@ -3950,13 +4226,12 @@ const confidentChip = defineButtonPersonality({
3950
4226
  name: "Outline",
3951
4227
  enabled: true,
3952
4228
  priority: 3,
3953
- background: { type: "transparent" },
3954
- textColorToken: "primary",
3955
- borderRadius: "rounded-md",
3956
- border: {
3957
- widthClass: "border",
3958
- colorToken: "primary"
4229
+ background: {
4230
+ type: "surface",
4231
+ role: "link"
3959
4232
  },
4233
+ borderRadius: "rounded-md",
4234
+ border: { widthClass: "border" },
3960
4235
  effects: { hover: [{
3961
4236
  effectId: "background-on-hover",
3962
4237
  options: { colorToken: "surface" }
@@ -3967,8 +4242,10 @@ const confidentChip = defineButtonPersonality({
3967
4242
  name: "Ghost",
3968
4243
  enabled: true,
3969
4244
  priority: 3,
3970
- background: { type: "transparent" },
3971
- textColorToken: "primary",
4245
+ background: {
4246
+ type: "surface",
4247
+ role: "link"
4248
+ },
3972
4249
  borderRadius: "rounded-md",
3973
4250
  effects: { hover: [{
3974
4251
  effectId: "background-on-hover",
@@ -4031,7 +4308,6 @@ const earthPill = defineButtonPersonality({
4031
4308
  type: "solid",
4032
4309
  colorToken: "primary"
4033
4310
  },
4034
- textColorToken: "primaryForeground",
4035
4311
  borderRadius: "rounded-full",
4036
4312
  shadow: {
4037
4313
  elevation: "low",
@@ -4057,13 +4333,12 @@ const earthPill = defineButtonPersonality({
4057
4333
  name: "Secondary",
4058
4334
  enabled: true,
4059
4335
  priority: 2,
4060
- background: { type: "transparent" },
4061
- textColorToken: "primary",
4062
- borderRadius: "rounded-full",
4063
- border: {
4064
- widthClass: "border",
4065
- colorToken: "primary"
4336
+ background: {
4337
+ type: "surface",
4338
+ role: "link"
4066
4339
  },
4340
+ borderRadius: "rounded-full",
4341
+ border: { widthClass: "border" },
4067
4342
  effects: { hover: [{
4068
4343
  effectId: "background-on-hover",
4069
4344
  options: { colorToken: "muted" }
@@ -4074,13 +4349,12 @@ const earthPill = defineButtonPersonality({
4074
4349
  name: "Outline",
4075
4350
  enabled: true,
4076
4351
  priority: 3,
4077
- background: { type: "transparent" },
4078
- textColorToken: "text",
4079
- borderRadius: "rounded-full",
4080
- border: {
4081
- widthClass: "border",
4082
- colorToken: "border"
4352
+ background: {
4353
+ type: "surface",
4354
+ role: "link"
4083
4355
  },
4356
+ borderRadius: "rounded-full",
4357
+ border: { widthClass: "border" },
4084
4358
  effects: { hover: [{
4085
4359
  effectId: "background-on-hover",
4086
4360
  options: { colorToken: "surfaceAlt" }
@@ -4091,8 +4365,10 @@ const earthPill = defineButtonPersonality({
4091
4365
  name: "Ghost",
4092
4366
  enabled: true,
4093
4367
  priority: 3,
4094
- background: { type: "transparent" },
4095
- textColorToken: "primary",
4368
+ background: {
4369
+ type: "surface",
4370
+ role: "link"
4371
+ },
4096
4372
  borderRadius: "rounded-full",
4097
4373
  shadow: {
4098
4374
  elevation: "none",
@@ -4113,11 +4389,7 @@ const earthPill = defineButtonPersonality({
4113
4389
  padding: "0.625rem 0",
4114
4390
  fontSize: "text-xl"
4115
4391
  }
4116
- },
4117
- effects: { hover: [{
4118
- effectId: "opacity-reduce",
4119
- options: { reduction: 25 }
4120
- }] }
4392
+ }
4121
4393
  }
4122
4394
  ]
4123
4395
  }
@@ -4153,8 +4425,10 @@ const editorialLink = defineButtonPersonality({
4153
4425
  name: "Primary",
4154
4426
  enabled: true,
4155
4427
  priority: 1,
4156
- background: { type: "transparent" },
4157
- textColorToken: "text",
4428
+ background: {
4429
+ type: "surface",
4430
+ role: "link"
4431
+ },
4158
4432
  borderRadius: "rounded-none",
4159
4433
  sizes: {
4160
4434
  sm: { padding: "0.25rem 0" },
@@ -4176,8 +4450,10 @@ const editorialLink = defineButtonPersonality({
4176
4450
  name: "Secondary",
4177
4451
  enabled: true,
4178
4452
  priority: 2,
4179
- background: { type: "transparent" },
4180
- textColorToken: "mutedText",
4453
+ background: {
4454
+ type: "surface",
4455
+ role: "link"
4456
+ },
4181
4457
  borderRadius: "rounded-none",
4182
4458
  sizes: {
4183
4459
  sm: { padding: "0.25rem 0" },
@@ -4199,8 +4475,10 @@ const editorialLink = defineButtonPersonality({
4199
4475
  name: "Outline",
4200
4476
  enabled: true,
4201
4477
  priority: 3,
4202
- background: { type: "transparent" },
4203
- textColorToken: "accent",
4478
+ background: {
4479
+ type: "surface",
4480
+ role: "link"
4481
+ },
4204
4482
  borderRadius: "rounded-none",
4205
4483
  sizes: {
4206
4484
  sm: { padding: "0.25rem 0" },
@@ -4222,19 +4500,17 @@ const editorialLink = defineButtonPersonality({
4222
4500
  name: "Ghost",
4223
4501
  enabled: true,
4224
4502
  priority: 3,
4225
- background: { type: "transparent" },
4226
- textColorToken: "mutedText",
4503
+ background: {
4504
+ type: "surface",
4505
+ role: "link"
4506
+ },
4227
4507
  borderRadius: "rounded-none",
4228
4508
  sizes: {
4229
4509
  sm: { padding: "0.25rem 0" },
4230
4510
  md: { padding: "0.5rem 0" },
4231
4511
  lg: { padding: "0.625rem 0" },
4232
4512
  xl: { padding: "0.75rem 0" }
4233
- },
4234
- effects: { hover: [{
4235
- effectId: "opacity-reduce",
4236
- options: { reduction: -20 }
4237
- }] }
4513
+ }
4238
4514
  }
4239
4515
  ]
4240
4516
  }
@@ -4296,12 +4572,8 @@ const flatInk = defineButtonPersonality({
4296
4572
  type: "solid",
4297
4573
  colorToken: "primary"
4298
4574
  },
4299
- textColorToken: "primaryForeground",
4300
4575
  borderRadius: "rounded-lg",
4301
- affordance: {
4302
- iconId: "ArrowRight",
4303
- colorToken: "accent"
4304
- },
4576
+ affordance: { iconId: "ArrowRight" },
4305
4577
  effects: { hover: [{
4306
4578
  effectId: "lift",
4307
4579
  options: { translateY: "-2px" }
@@ -4315,13 +4587,12 @@ const flatInk = defineButtonPersonality({
4315
4587
  name: "Secondary",
4316
4588
  enabled: true,
4317
4589
  priority: 2,
4318
- background: { type: "transparent" },
4319
- textColorToken: "primary",
4320
- borderRadius: "rounded-lg",
4321
- border: {
4322
- widthClass: "border",
4323
- colorToken: "border"
4590
+ background: {
4591
+ type: "surface",
4592
+ role: "link"
4324
4593
  },
4594
+ borderRadius: "rounded-lg",
4595
+ border: { widthClass: "border" },
4325
4596
  effects: { hover: [{
4326
4597
  effectId: "lift",
4327
4598
  options: { translateY: "-2px" }
@@ -4339,12 +4610,8 @@ const flatInk = defineButtonPersonality({
4339
4610
  type: "solid",
4340
4611
  colorToken: "accent"
4341
4612
  },
4342
- textColorToken: "accentForeground",
4343
4613
  borderRadius: "rounded-lg",
4344
- affordance: {
4345
- iconId: "ArrowRight",
4346
- colorToken: "accentForeground"
4347
- },
4614
+ affordance: { iconId: "ArrowRight" },
4348
4615
  effects: { hover: [{
4349
4616
  effectId: "lift",
4350
4617
  options: { translateY: "-2px" }
@@ -4407,7 +4674,6 @@ const inkStamp = defineButtonPersonality({
4407
4674
  type: "solid",
4408
4675
  colorToken: "primary"
4409
4676
  },
4410
- textColorToken: "primaryForeground",
4411
4677
  borderRadius: "rounded-md",
4412
4678
  effects: {
4413
4679
  hover: [{
@@ -4428,13 +4694,12 @@ const inkStamp = defineButtonPersonality({
4428
4694
  name: "Secondary",
4429
4695
  enabled: true,
4430
4696
  priority: 2,
4431
- background: { type: "transparent" },
4432
- textColorToken: "primary",
4433
- borderRadius: "rounded-md",
4434
- border: {
4435
- widthClass: "border-2",
4436
- colorToken: "primary"
4697
+ background: {
4698
+ type: "surface",
4699
+ role: "link"
4437
4700
  },
4701
+ borderRadius: "rounded-md",
4702
+ border: { widthClass: "border-2" },
4438
4703
  effects: { hover: [{
4439
4704
  effectId: "background-on-hover",
4440
4705
  options: { colorToken: "surface" }
@@ -4445,13 +4710,12 @@ const inkStamp = defineButtonPersonality({
4445
4710
  name: "Outline",
4446
4711
  enabled: true,
4447
4712
  priority: 3,
4448
- background: { type: "transparent" },
4449
- textColorToken: "text",
4450
- borderRadius: "rounded-md",
4451
- border: {
4452
- widthClass: "border-2",
4453
- colorToken: "border"
4713
+ background: {
4714
+ type: "surface",
4715
+ role: "link"
4454
4716
  },
4717
+ borderRadius: "rounded-md",
4718
+ border: { widthClass: "border-2" },
4455
4719
  effects: { hover: [{
4456
4720
  effectId: "background-on-hover",
4457
4721
  options: { colorToken: "surface" }
@@ -4462,8 +4726,10 @@ const inkStamp = defineButtonPersonality({
4462
4726
  name: "Ghost",
4463
4727
  enabled: true,
4464
4728
  priority: 3,
4465
- background: { type: "transparent" },
4466
- textColorToken: "accent",
4729
+ background: {
4730
+ type: "surface",
4731
+ role: "link"
4732
+ },
4467
4733
  borderRadius: "rounded-none",
4468
4734
  sizes: {
4469
4735
  sm: {
@@ -4556,7 +4822,6 @@ const joyStamp = defineButtonPersonality({
4556
4822
  type: "solid",
4557
4823
  colorToken: "primary"
4558
4824
  },
4559
- textColorToken: "primaryForeground",
4560
4825
  borderRadius: "rounded-full",
4561
4826
  shadow: {
4562
4827
  elevation: "high",
@@ -4570,13 +4835,12 @@ const joyStamp = defineButtonPersonality({
4570
4835
  name: "Secondary",
4571
4836
  enabled: true,
4572
4837
  priority: 2,
4573
- background: { type: "transparent" },
4574
- textColorToken: "text",
4575
- borderRadius: "rounded-full",
4576
- border: {
4577
- widthClass: "border-2",
4578
- colorToken: "text"
4838
+ background: {
4839
+ type: "surface",
4840
+ role: "link"
4579
4841
  },
4842
+ borderRadius: "rounded-full",
4843
+ border: { widthClass: "border-2" },
4580
4844
  shadow: {
4581
4845
  elevation: "high",
4582
4846
  softness: "hard",
@@ -4641,12 +4905,8 @@ const ornateRitual = defineButtonPersonality({
4641
4905
  type: "solid",
4642
4906
  colorToken: "primary"
4643
4907
  },
4644
- textColorToken: "primaryForeground",
4645
4908
  borderRadius: "rounded-md",
4646
- border: {
4647
- widthClass: "border",
4648
- colorToken: "primary"
4649
- },
4909
+ border: { widthClass: "border" },
4650
4910
  effects: {
4651
4911
  hover: [{
4652
4912
  effectId: "background-on-hover",
@@ -4667,12 +4927,8 @@ const ornateRitual = defineButtonPersonality({
4667
4927
  type: "solid",
4668
4928
  colorToken: "secondary"
4669
4929
  },
4670
- textColorToken: "primaryForeground",
4671
4930
  borderRadius: "rounded-md",
4672
- border: {
4673
- widthClass: "border",
4674
- colorToken: "primary"
4675
- },
4931
+ border: { widthClass: "border" },
4676
4932
  effects: { hover: [{
4677
4933
  effectId: "background-on-hover",
4678
4934
  options: { colorToken: "surface" }
@@ -4683,13 +4939,12 @@ const ornateRitual = defineButtonPersonality({
4683
4939
  name: "Outline",
4684
4940
  enabled: true,
4685
4941
  priority: 3,
4686
- background: { type: "transparent" },
4687
- textColorToken: "primary",
4688
- borderRadius: "rounded-md",
4689
- border: {
4690
- widthClass: "border",
4691
- colorToken: "primary"
4942
+ background: {
4943
+ type: "surface",
4944
+ role: "link"
4692
4945
  },
4946
+ borderRadius: "rounded-md",
4947
+ border: { widthClass: "border" },
4693
4948
  effects: { hover: [{
4694
4949
  effectId: "background-on-hover",
4695
4950
  options: { colorToken: "muted" }
@@ -4700,8 +4955,10 @@ const ornateRitual = defineButtonPersonality({
4700
4955
  name: "Ghost",
4701
4956
  enabled: true,
4702
4957
  priority: 3,
4703
- background: { type: "transparent" },
4704
- textColorToken: "accent",
4958
+ background: {
4959
+ type: "surface",
4960
+ role: "link"
4961
+ },
4705
4962
  borderRadius: "rounded-none",
4706
4963
  sizes: {
4707
4964
  sm: {
@@ -4783,14 +5040,10 @@ const pebble = defineButtonPersonality({
4783
5040
  type: "solid",
4784
5041
  colorToken: "primary"
4785
5042
  },
4786
- textColorToken: "primaryForeground",
4787
5043
  borderRadius: "rounded-full",
4788
5044
  effects: { hover: [{
4789
- effectId: "background-on-hover-alpha",
4790
- options: {
4791
- colorToken: "primary",
4792
- opacity: 88
4793
- }
5045
+ effectId: "darken-background",
5046
+ options: { amount: 100 }
4794
5047
  }] }
4795
5048
  },
4796
5049
  {
@@ -4798,13 +5051,12 @@ const pebble = defineButtonPersonality({
4798
5051
  name: "Secondary",
4799
5052
  enabled: true,
4800
5053
  priority: 2,
4801
- background: { type: "transparent" },
4802
- textColorToken: "primary",
4803
- borderRadius: "rounded-full",
4804
- border: {
4805
- widthClass: "border-2",
4806
- colorToken: "accent"
5054
+ background: {
5055
+ type: "surface",
5056
+ role: "link"
4807
5057
  },
5058
+ borderRadius: "rounded-full",
5059
+ border: { widthClass: "border-2" },
4808
5060
  effects: { hover: [{
4809
5061
  effectId: "background-on-hover",
4810
5062
  options: { colorToken: "accent" }
@@ -4815,13 +5067,12 @@ const pebble = defineButtonPersonality({
4815
5067
  name: "Outline",
4816
5068
  enabled: true,
4817
5069
  priority: 3,
4818
- background: { type: "transparent" },
4819
- textColorToken: "text",
4820
- borderRadius: "rounded-full",
4821
- border: {
4822
- widthClass: "border",
4823
- colorToken: "border"
5070
+ background: {
5071
+ type: "surface",
5072
+ role: "link"
4824
5073
  },
5074
+ borderRadius: "rounded-full",
5075
+ border: { widthClass: "border" },
4825
5076
  effects: { hover: [{
4826
5077
  effectId: "background-on-hover",
4827
5078
  options: { colorToken: "surface" }
@@ -4832,8 +5083,10 @@ const pebble = defineButtonPersonality({
4832
5083
  name: "Ghost",
4833
5084
  enabled: true,
4834
5085
  priority: 3,
4835
- background: { type: "transparent" },
4836
- textColorToken: "primary",
5086
+ background: {
5087
+ type: "surface",
5088
+ role: "link"
5089
+ },
4837
5090
  borderRadius: "rounded-full",
4838
5091
  sizes: {
4839
5092
  sm: {
@@ -4849,11 +5102,7 @@ const pebble = defineButtonPersonality({
4849
5102
  padding: "0.75rem 1.5rem",
4850
5103
  fontSize: "text-xl"
4851
5104
  }
4852
- },
4853
- effects: { hover: [{
4854
- effectId: "opacity-reduce",
4855
- options: { reduction: 30 }
4856
- }] }
5105
+ }
4857
5106
  }
4858
5107
  ]
4859
5108
  }
@@ -4915,15 +5164,11 @@ const quietArrow = defineButtonPersonality({
4915
5164
  type: "solid",
4916
5165
  colorToken: "primary"
4917
5166
  },
4918
- textColorToken: "primaryForeground",
4919
5167
  borderRadius: "rounded-xl",
4920
5168
  affordance: { iconId: "ArrowRight" },
4921
5169
  effects: { hover: [{
4922
- effectId: "background-on-hover-alpha",
4923
- options: {
4924
- colorToken: "primary",
4925
- opacity: 90
4926
- }
5170
+ effectId: "darken-background",
5171
+ options: { amount: 100 }
4927
5172
  }] }
4928
5173
  },
4929
5174
  {
@@ -4931,13 +5176,12 @@ const quietArrow = defineButtonPersonality({
4931
5176
  name: "Secondary",
4932
5177
  enabled: true,
4933
5178
  priority: 2,
4934
- background: { type: "transparent" },
4935
- textColorToken: "primary",
4936
- borderRadius: "rounded-xl",
4937
- border: {
4938
- widthClass: "border",
4939
- colorToken: "primary"
5179
+ background: {
5180
+ type: "surface",
5181
+ role: "link"
4940
5182
  },
5183
+ borderRadius: "rounded-xl",
5184
+ border: { widthClass: "border" },
4941
5185
  affordance: { iconId: "ArrowRight" },
4942
5186
  effects: { hover: [{
4943
5187
  effectId: "background-on-hover",
@@ -4949,21 +5193,22 @@ const quietArrow = defineButtonPersonality({
4949
5193
  name: "Outline",
4950
5194
  enabled: true,
4951
5195
  priority: 3,
4952
- background: { type: "transparent" },
4953
- textColorToken: "primary",
5196
+ background: {
5197
+ type: "surface",
5198
+ role: "link"
5199
+ },
4954
5200
  borderRadius: "rounded-xl",
4955
- border: {
4956
- widthClass: "border",
4957
- colorToken: "primary"
4958
- }
5201
+ border: { widthClass: "border" }
4959
5202
  },
4960
5203
  {
4961
5204
  id: "ghost",
4962
5205
  name: "Ghost",
4963
5206
  enabled: true,
4964
5207
  priority: 3,
4965
- background: { type: "transparent" },
4966
- textColorToken: "primary",
5208
+ background: {
5209
+ type: "surface",
5210
+ role: "link"
5211
+ },
4967
5212
  borderRadius: "rounded-xl"
4968
5213
  }
4969
5214
  ]
@@ -5027,7 +5272,6 @@ const showtimePill = defineButtonPersonality({
5027
5272
  type: "solid",
5028
5273
  colorToken: "primary"
5029
5274
  },
5030
- textColorToken: "background",
5031
5275
  borderRadius: "rounded-full",
5032
5276
  effects: { hover: [{ effectId: "pop" }] }
5033
5277
  },
@@ -5036,13 +5280,12 @@ const showtimePill = defineButtonPersonality({
5036
5280
  name: "Secondary",
5037
5281
  enabled: true,
5038
5282
  priority: 2,
5039
- background: { type: "transparent" },
5040
- textColorToken: "primary",
5041
- borderRadius: "rounded-full",
5042
- border: {
5043
- widthClass: "border-2",
5044
- colorToken: "primary"
5283
+ background: {
5284
+ type: "surface",
5285
+ role: "link"
5045
5286
  },
5287
+ borderRadius: "rounded-full",
5288
+ border: { widthClass: "border-2" },
5046
5289
  effects: { hover: [{ effectId: "pop" }] }
5047
5290
  },
5048
5291
  {
@@ -5054,7 +5297,6 @@ const showtimePill = defineButtonPersonality({
5054
5297
  type: "solid",
5055
5298
  colorToken: "secondary"
5056
5299
  },
5057
- textColorToken: "primary",
5058
5300
  borderRadius: "rounded-full",
5059
5301
  effects: { hover: [{ effectId: "pop" }] }
5060
5302
  },
@@ -5067,12 +5309,8 @@ const showtimePill = defineButtonPersonality({
5067
5309
  type: "solid",
5068
5310
  colorToken: "background"
5069
5311
  },
5070
- textColorToken: "primary",
5071
5312
  borderRadius: "rounded-full",
5072
- border: {
5073
- widthClass: "border-2",
5074
- colorToken: "primary"
5075
- },
5313
+ border: { widthClass: "border-2" },
5076
5314
  effects: { hover: [{
5077
5315
  effectId: "background-on-hover",
5078
5316
  options: { colorToken: "surface" }
@@ -5083,13 +5321,12 @@ const showtimePill = defineButtonPersonality({
5083
5321
  name: "Outline",
5084
5322
  enabled: true,
5085
5323
  priority: 3,
5086
- background: { type: "transparent" },
5087
- textColorToken: "primary",
5088
- borderRadius: "rounded-full",
5089
- border: {
5090
- widthClass: "border-2",
5091
- colorToken: "primary"
5324
+ background: {
5325
+ type: "surface",
5326
+ role: "link"
5092
5327
  },
5328
+ borderRadius: "rounded-full",
5329
+ border: { widthClass: "border-2" },
5093
5330
  effects: { hover: [{
5094
5331
  effectId: "background-on-hover",
5095
5332
  options: { colorToken: "background" }
@@ -5100,8 +5337,10 @@ const showtimePill = defineButtonPersonality({
5100
5337
  name: "Ghost",
5101
5338
  enabled: true,
5102
5339
  priority: 3,
5103
- background: { type: "transparent" },
5104
- textColorToken: "primary",
5340
+ background: {
5341
+ type: "surface",
5342
+ role: "link"
5343
+ },
5105
5344
  borderRadius: "rounded-full",
5106
5345
  effects: { hover: [{
5107
5346
  effectId: "background-on-hover",
@@ -5112,104 +5351,151 @@ const showtimePill = defineButtonPersonality({
5112
5351
  }
5113
5352
  });
5114
5353
  //#endregion
5115
- //#region ../theme-core/src/buttons/personalities/index.ts
5116
- const buttonPersonalities = [
5117
- defineButtonPersonality({
5118
- id: "soft-pill",
5119
- name: "Soft Pill",
5120
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
5121
- tags: {
5122
- tone: "classic",
5123
- energy: "calm",
5124
- motion: "subtle",
5125
- era: "organic"
5354
+ //#region ../theme-core/src/buttons/personalities/soft-pill.ts
5355
+ /**
5356
+ * Soft Pill — rounded-full pill buttons with a hover lift. The default for
5357
+ * Calm Studio and Modern Wellness; reads as quietly modern and welcoming.
5358
+ */
5359
+ const softPill = defineButtonPersonality({
5360
+ id: "soft-pill",
5361
+ name: "Soft Pill",
5362
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
5363
+ tags: {
5364
+ tone: "classic",
5365
+ energy: "calm",
5366
+ motion: "subtle",
5367
+ era: "organic"
5368
+ },
5369
+ buttonSystem: {
5370
+ global: {
5371
+ cornerStyle: "pill",
5372
+ shadow: "low",
5373
+ textTransform: "none",
5374
+ fontWeight: 500,
5375
+ borderWidth: 2,
5376
+ hoverTransform: "lift",
5377
+ hoverColor: "none"
5126
5378
  },
5127
- buttonSystem: {
5128
- global: {
5129
- cornerStyle: "pill",
5130
- shadow: "low",
5131
- textTransform: "none",
5132
- fontWeight: 500,
5133
- borderWidth: 2,
5134
- hoverTransform: "lift",
5135
- hoverColor: "none"
5379
+ variants: [
5380
+ {
5381
+ id: "primary",
5382
+ name: "Primary",
5383
+ enabled: true,
5384
+ priority: 1,
5385
+ background: {
5386
+ type: "solid",
5387
+ colorToken: "primary"
5388
+ },
5389
+ borderRadius: "rounded-full",
5390
+ shadow: {
5391
+ elevation: "low",
5392
+ softness: "soft",
5393
+ position: "bottom"
5394
+ },
5395
+ effects: {
5396
+ hover: [{
5397
+ effectId: "lift",
5398
+ options: { translateY: "-1px" }
5399
+ }],
5400
+ active: [{
5401
+ effectId: "scale-down",
5402
+ options: { scale: "0.98" }
5403
+ }]
5404
+ }
5136
5405
  },
5137
- variants: [
5138
- {
5139
- id: "primary",
5140
- name: "Primary",
5141
- enabled: true,
5142
- priority: 1,
5143
- background: {
5144
- type: "solid",
5145
- colorToken: "primary"
5146
- },
5147
- textColorToken: "primaryForeground",
5148
- borderRadius: "rounded-full",
5149
- shadow: {
5150
- elevation: "low",
5151
- softness: "soft",
5152
- position: "bottom"
5153
- },
5154
- effects: {
5155
- hover: [{
5156
- effectId: "lift",
5157
- options: { translateY: "-1px" }
5158
- }],
5159
- active: [{
5160
- effectId: "scale-down",
5161
- options: { scale: "0.98" }
5162
- }]
5163
- }
5406
+ {
5407
+ id: "secondary",
5408
+ name: "Secondary",
5409
+ enabled: true,
5410
+ priority: 2,
5411
+ background: {
5412
+ type: "surface",
5413
+ role: "link"
5164
5414
  },
5165
- {
5166
- id: "secondary",
5167
- name: "Secondary",
5168
- enabled: true,
5169
- priority: 2,
5170
- background: { type: "transparent" },
5171
- textColorToken: "primary",
5172
- borderRadius: "rounded-full",
5173
- border: {
5174
- widthClass: "border-2",
5175
- colorToken: "primary"
5176
- },
5177
- effects: { hover: [{
5178
- effectId: "background-on-hover",
5179
- options: { colorToken: "surface" }
5180
- }] }
5415
+ borderRadius: "rounded-full",
5416
+ border: { widthClass: "border-2" },
5417
+ effects: { hover: [{
5418
+ effectId: "background-on-hover",
5419
+ options: { colorToken: "surface" }
5420
+ }] }
5421
+ },
5422
+ {
5423
+ id: "outline",
5424
+ name: "Outline",
5425
+ enabled: true,
5426
+ priority: 3,
5427
+ background: {
5428
+ type: "surface",
5429
+ role: "link"
5181
5430
  },
5182
- {
5183
- id: "outline",
5184
- name: "Outline",
5185
- enabled: true,
5186
- priority: 3,
5187
- background: { type: "transparent" },
5188
- textColorToken: "text",
5189
- borderRadius: "rounded-full",
5190
- border: {
5191
- widthClass: "border",
5192
- colorToken: "border"
5193
- },
5194
- effects: { hover: [{
5195
- effectId: "background-on-hover",
5196
- options: { colorToken: "surface" }
5197
- }] }
5431
+ borderRadius: "rounded-full",
5432
+ border: { widthClass: "border" },
5433
+ effects: { hover: [{
5434
+ effectId: "background-on-hover",
5435
+ options: { colorToken: "surface" }
5436
+ }] }
5437
+ },
5438
+ {
5439
+ id: "ghost",
5440
+ name: "Ghost",
5441
+ enabled: true,
5442
+ priority: 3,
5443
+ background: {
5444
+ type: "surface",
5445
+ role: "link"
5198
5446
  },
5199
- {
5200
- id: "ghost",
5201
- name: "Ghost",
5202
- enabled: true,
5203
- priority: 3,
5204
- background: { type: "transparent" },
5205
- textColorToken: "text",
5206
- borderRadius: "rounded-full",
5207
- effects: { hover: [{
5208
- effectId: "background-on-hover",
5209
- options: { colorToken: "surface" }
5210
- }] }
5211
- }
5212
- ]
5447
+ borderRadius: "rounded-full",
5448
+ effects: { hover: [{
5449
+ effectId: "background-on-hover",
5450
+ options: { colorToken: "surface" }
5451
+ }] }
5452
+ }
5453
+ ]
5454
+ }
5455
+ });
5456
+ //#endregion
5457
+ //#region ../theme-core/src/buttons/personalities/two-tone-pill.ts
5458
+ const solidSecondary = {
5459
+ id: "secondary",
5460
+ name: "Secondary",
5461
+ enabled: true,
5462
+ priority: 2,
5463
+ background: {
5464
+ type: "solid",
5465
+ colorToken: unsafeAsOpaqueButtonColourToken("secondary")
5466
+ },
5467
+ borderRadius: "rounded-full",
5468
+ shadow: {
5469
+ elevation: "none",
5470
+ softness: null,
5471
+ position: "bottom"
5472
+ },
5473
+ effects: {
5474
+ hover: [{
5475
+ effectId: "background-on-hover-alpha",
5476
+ options: {
5477
+ colorToken: "secondary",
5478
+ opacity: 88
5479
+ }
5480
+ }],
5481
+ active: [{
5482
+ effectId: "scale-down",
5483
+ options: { scale: "0.98" }
5484
+ }]
5485
+ }
5486
+ };
5487
+ //#endregion
5488
+ //#region ../theme-core/src/buttons/personalities/index.ts
5489
+ const buttonPersonalities = [
5490
+ softPill,
5491
+ defineButtonPersonality({
5492
+ id: "two-tone-pill",
5493
+ name: "Two-tone Pill",
5494
+ description: "Rounded pills with distinct solid primary and secondary brand colours.",
5495
+ tags: softPill.tags,
5496
+ buttonSystem: {
5497
+ ...softPill.buttonSystem,
5498
+ variants: softPill.buttonSystem.variants.map((variant) => variant.id === "secondary" ? solidSecondary : variant)
5213
5499
  }
5214
5500
  }),
5215
5501
  earthPill,
@@ -5225,6 +5511,27 @@ const buttonPersonalities = [
5225
5511
  quietArrow
5226
5512
  ];
5227
5513
  new Map(buttonPersonalities.map((p) => [p.id, p]));
5514
+ buttonPersonalities.map((personality) => ({
5515
+ id: personality.id,
5516
+ name: personality.name,
5517
+ description: personality.description,
5518
+ category: presetCategory(personality),
5519
+ buttonSystem: personality.buttonSystem,
5520
+ compatibility: {
5521
+ ...personality.tags.tone ? { tones: [personality.tags.tone] } : {},
5522
+ ...personality.tags.energy ? { energies: [personality.tags.energy] } : {}
5523
+ }
5524
+ }));
5525
+ function presetCategory(personality) {
5526
+ switch (personality.tags.era) {
5527
+ case "retro": return "retro";
5528
+ case "editorial": return "minimal";
5529
+ case "organic": return "artistic";
5530
+ case "modern": return personality.tags.tone === "bold" ? "modern" : "technical";
5531
+ case "technical": return "technical";
5532
+ case void 0: return "modern";
5533
+ }
5534
+ }
5228
5535
  //#endregion
5229
5536
  //#region ../theme-core/src/cards/types.ts
5230
5537
  const cardVariantRoleValues = ["default", "alternative"];
@@ -6743,6 +7050,7 @@ const navFontWeight = z$1.enum([
6743
7050
  "bold"
6744
7051
  ]);
6745
7052
  const headerMaxWidth = z$1.enum(["container", "full"]);
7053
+ const headerBarFrame = z$1.enum(["full-bleed", "inset-shell"]);
6746
7054
  const headerContainerSchema = z$1.object({
6747
7055
  rounded: z$1.enum([
6748
7056
  "none",
@@ -6887,6 +7195,7 @@ const headerSchema = z$1.object({
6887
7195
  positioning: headerPositioning,
6888
7196
  shrinkOnScroll: z$1.boolean(),
6889
7197
  maxWidth: headerMaxWidth,
7198
+ barFrame: headerBarFrame.optional(),
6890
7199
  logoOverride: mediaSchema$1.nullable().optional(),
6891
7200
  background: headerBackgroundSchema.default({
6892
7201
  type: "color",
@@ -6896,6 +7205,7 @@ const headerSchema = z$1.object({
6896
7205
  navStyle: headerNavStyle,
6897
7206
  navColor: themeColorTokenSchema.nullable().optional(),
6898
7207
  navWeight: navFontWeight.default("medium"),
7208
+ navFontRole: z$1.enum(["body", "heading"]).optional(),
6899
7209
  navTypography: z$1.enum(["body", "heading"]).optional(),
6900
7210
  navTextSize: navLinkStyleSchema.shape.textSize,
6901
7211
  navPlacement: z$1.enum(["end", "center"]).optional(),
@@ -6911,7 +7221,21 @@ const headerSchema = z$1.object({
6911
7221
  ctaTreatment: headerCtaTreatmentSchema.optional(),
6912
7222
  ctaVariant: z$1.string().min(1).optional(),
6913
7223
  dropdownStyle: dropdownStyleSchema
6914
- });
7224
+ }).transform(normaliseHeaderNavFontRole);
7225
+ /**
7226
+ * Normalises the legacy `navTypography` font-role alias into the canonical
7227
+ * `navFontRole` field so persisted themes migrate at the parse boundary without
7228
+ * a data migration. `navFontRole` always wins when both are present; the legacy
7229
+ * field is dropped so we never carry a dual write forward.
7230
+ */
7231
+ function normaliseHeaderNavFontRole(header) {
7232
+ if (header.navTypography === void 0) return header;
7233
+ const { navTypography, ...rest } = header;
7234
+ return header.navFontRole === void 0 ? {
7235
+ ...rest,
7236
+ navFontRole: navTypography
7237
+ } : rest;
7238
+ }
6915
7239
  const footerVariant = z$1.enum([
6916
7240
  "simple",
6917
7241
  "columns",
@@ -8583,6 +8907,241 @@ const originalJoyCardSystem = { variants: [{
8583
8907
  const serifDisplayQuote = { style: "serif-display" };
8584
8908
  /** Punchy quotation mark in the secondary accent colour. Bold / accent styles. */
8585
8909
  const accentGlyphQuote = { style: "accent-glyph" };
8910
+ /**
8911
+ * Curated library of gradient presets.
8912
+ * All gradients use theme color tokens, so they adapt to the site's palette.
8913
+ */
8914
+ const GRADIENT_PRESETS = [
8915
+ {
8916
+ id: "primary-secondary",
8917
+ name: "Primary to Secondary",
8918
+ description: "Blend your primary and secondary brand colors",
8919
+ type: "linear",
8920
+ angle: 135,
8921
+ stops: [{
8922
+ color: "primary-500",
8923
+ position: 0
8924
+ }, {
8925
+ color: "secondary-500",
8926
+ position: 100
8927
+ }]
8928
+ },
8929
+ {
8930
+ id: "primary-accent",
8931
+ name: "Primary to Accent",
8932
+ description: "Energetic gradient from primary to accent",
8933
+ type: "linear",
8934
+ angle: 135,
8935
+ stops: [{
8936
+ color: "primary-500",
8937
+ position: 0
8938
+ }, {
8939
+ color: "accent-500",
8940
+ position: 100
8941
+ }]
8942
+ },
8943
+ {
8944
+ id: "secondary-accent",
8945
+ name: "Secondary to Accent",
8946
+ description: "Vibrant secondary to accent blend",
8947
+ type: "linear",
8948
+ angle: 135,
8949
+ stops: [{
8950
+ color: "secondary-500",
8951
+ position: 0
8952
+ }, {
8953
+ color: "accent-500",
8954
+ position: 100
8955
+ }]
8956
+ },
8957
+ {
8958
+ id: "primary-light-dark",
8959
+ name: "Primary Light to Dark",
8960
+ description: "Subtle primary color fade",
8961
+ type: "linear",
8962
+ angle: 180,
8963
+ stops: [{
8964
+ color: "primary-500",
8965
+ position: 0
8966
+ }, {
8967
+ color: "primary-900",
8968
+ position: 100
8969
+ }]
8970
+ },
8971
+ {
8972
+ id: "primary-dark-light",
8973
+ name: "Primary Dark to Light",
8974
+ description: "Reverse primary fade",
8975
+ type: "linear",
8976
+ angle: 180,
8977
+ stops: [{
8978
+ color: "primary-900",
8979
+ position: 0
8980
+ }, {
8981
+ color: "primary-50",
8982
+ position: 100
8983
+ }]
8984
+ },
8985
+ {
8986
+ id: "secondary-light-dark",
8987
+ name: "Secondary Light to Dark",
8988
+ description: "Subtle secondary color fade",
8989
+ type: "linear",
8990
+ angle: 180,
8991
+ stops: [{
8992
+ color: "secondary-500",
8993
+ position: 0
8994
+ }, {
8995
+ color: "secondary-900",
8996
+ position: 100
8997
+ }]
8998
+ },
8999
+ {
9000
+ id: "accent-light-dark",
9001
+ name: "Accent Light to Dark",
9002
+ description: "Accent color depth fade",
9003
+ type: "linear",
9004
+ angle: 180,
9005
+ stops: [{
9006
+ color: "accent-500",
9007
+ position: 0
9008
+ }, {
9009
+ color: "accent-900",
9010
+ position: 100
9011
+ }]
9012
+ },
9013
+ {
9014
+ id: "background-surface",
9015
+ name: "Background to Surface",
9016
+ description: "Subtle depth using base colors",
9017
+ type: "linear",
9018
+ angle: 180,
9019
+ stops: [{
9020
+ color: "background",
9021
+ position: 0
9022
+ }, {
9023
+ color: "surface",
9024
+ position: 100
9025
+ }]
9026
+ },
9027
+ {
9028
+ id: "neutral-fade",
9029
+ name: "Neutral Gradient",
9030
+ description: "Elegant neutral color fade",
9031
+ type: "linear",
9032
+ angle: 180,
9033
+ stops: [{
9034
+ color: "neutral-900",
9035
+ position: 0
9036
+ }, {
9037
+ color: "neutral-50",
9038
+ position: 100
9039
+ }]
9040
+ },
9041
+ {
9042
+ id: "primary-glow",
9043
+ name: "Primary glow",
9044
+ description: "A soft top-centred glow using your primary palette",
9045
+ type: "radial",
9046
+ shape: "ellipse",
9047
+ position: "top center",
9048
+ stops: [{
9049
+ color: "primary-900",
9050
+ position: 0
9051
+ }, {
9052
+ color: "primary-950",
9053
+ position: 100
9054
+ }],
9055
+ foreground: {
9056
+ textColor: "onPrimary900",
9057
+ headingColor: "onPrimary900",
9058
+ linkColor: "onPrimary900",
9059
+ supportingColor: "onPrimary900"
9060
+ }
9061
+ },
9062
+ {
9063
+ id: "accent-glow",
9064
+ name: "Accent glow",
9065
+ description: "A soft top-centred glow using your accent palette",
9066
+ type: "radial",
9067
+ shape: "ellipse",
9068
+ position: "top center",
9069
+ stops: [{
9070
+ color: "accent-900",
9071
+ position: 0
9072
+ }, {
9073
+ color: "accent-950",
9074
+ position: 100
9075
+ }],
9076
+ foreground: {
9077
+ textColor: "onAccent900",
9078
+ headingColor: "onAccent900",
9079
+ linkColor: "onAccent900",
9080
+ supportingColor: "onAccent900"
9081
+ }
9082
+ },
9083
+ {
9084
+ id: "primary-secondary-accent",
9085
+ name: "Brand Trio",
9086
+ description: "All three brand colors in harmony",
9087
+ type: "linear",
9088
+ angle: 135,
9089
+ stops: [
9090
+ {
9091
+ color: "primary-500",
9092
+ position: 0
9093
+ },
9094
+ {
9095
+ color: "secondary-500",
9096
+ position: 50
9097
+ },
9098
+ {
9099
+ color: "accent-500",
9100
+ position: 100
9101
+ }
9102
+ ]
9103
+ }
9104
+ ].map((preset) => ({
9105
+ ...preset,
9106
+ id: preset.id,
9107
+ stops: preset.stops
9108
+ }));
9109
+ const GRADIENT_PRESET_IDS = GRADIENT_PRESETS.map((preset) => preset.id);
9110
+ const gradientPresetIdSet = new Set(GRADIENT_PRESET_IDS);
9111
+ const gradientPresetById = Object.fromEntries(GRADIENT_PRESETS.map((preset) => [preset.id, preset]));
9112
+ function parseGradientPresetId(value) {
9113
+ if (typeof value !== "string") return null;
9114
+ const normalized = value.trim();
9115
+ if (!gradientPresetIdSet.has(normalized)) return null;
9116
+ return normalized;
9117
+ }
9118
+ function getGradientPreset(id) {
9119
+ return gradientPresetById[id];
9120
+ }
9121
+ //#endregion
9122
+ //#region ../theme-core/src/gradients/utils.ts
9123
+ /**
9124
+ * Convert a GradientConfig to a CSS gradient string
9125
+ *
9126
+ * @param config - The gradient configuration using theme tokens
9127
+ * @param tokens - Map of theme color tokens to hex values
9128
+ * @returns CSS gradient string (e.g., "linear-gradient(180deg, #3b82f6 0%, #f59e0b 100%)")
9129
+ */
9130
+ function gradientToCss(config, tokens) {
9131
+ const stops = config.stops.map((stop) => {
9132
+ return `${tokens[stop.color] ?? "#000000"} ${stop.position}%`;
9133
+ }).join(", ");
9134
+ const type = config.type ?? "linear";
9135
+ if (type === "radial") {
9136
+ const position = config.position ?? "center";
9137
+ return `radial-gradient(${config.shape ?? "circle"} at ${position}, ${stops})`;
9138
+ }
9139
+ if (type === "conic") {
9140
+ const position = config.position ?? "center";
9141
+ return `conic-gradient(from ${config.angle ?? 0}deg at ${position}, ${stops})`;
9142
+ }
9143
+ return `linear-gradient(${config.angle ?? 180}deg, ${stops})`;
9144
+ }
8586
9145
  //#endregion
8587
9146
  //#region ../theme-core/src/site-styles/headerLooks.ts
8588
9147
  function asHeaderLookId(value) {
@@ -8717,7 +9276,7 @@ const overlayLogoAccommodations = [
8717
9276
  * optional nested styling fields that would otherwise leak from another Look.
8718
9277
  */
8719
9278
  function baseHeader(theme) {
8720
- 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;
9279
+ 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;
8721
9280
  return {
8722
9281
  ...header,
8723
9282
  navContainer: {
@@ -8866,6 +9425,17 @@ const headerStyleCatalog = defineExactCatalog()([
8866
9425
  navTypography: "brand-caps",
8867
9426
  moods: ["expressive"]
8868
9427
  },
9428
+ {
9429
+ id: asHeaderStyleId("brand-capsule"),
9430
+ label: "Brand Capsule",
9431
+ description: "Solid brand chrome designed as a floating capsule, with quiet-caps nav, a soft pill active state, and an inverted CTA pill.",
9432
+ supportedLayoutIds: supportedLayouts(["classic"]),
9433
+ navInteraction: "pill-background",
9434
+ surface: "brand-solid",
9435
+ defaultDepth: "shadow",
9436
+ navTypography: "quiet-caps",
9437
+ moods: ["expressive", "professional"]
9438
+ },
8869
9439
  {
8870
9440
  id: asHeaderStyleId("serif-line"),
8871
9441
  label: "Serif Line",
@@ -8959,6 +9529,7 @@ const headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
8959
9529
  "brand-bar",
8960
9530
  "brand-underline",
8961
9531
  "brand-pill",
9532
+ "brand-capsule",
8962
9533
  "serif-line",
8963
9534
  "flat-tabs"
8964
9535
  ])],
@@ -8996,6 +9567,11 @@ headerStyleRepairChain([
8996
9567
  "brand-pill",
8997
9568
  "brand-bar",
8998
9569
  "minimal"
9570
+ ]), headerStyleRepairChain([
9571
+ "brand-capsule",
9572
+ "brand-pill",
9573
+ "brand-bar",
9574
+ "minimal"
8999
9575
  ]), headerStyleRepairChain([
9000
9576
  "pill-nav",
9001
9577
  "soft-bar",
@@ -10609,6 +11185,19 @@ z$1.object({
10609
11185
  }).strict();
10610
11186
  //#endregion
10611
11187
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
11188
+ function defineSectionForegroundRuntimeTokens(input) {
11189
+ return {
11190
+ textColor: requireThemeColorToken(input.textColor),
11191
+ headingColor: requireThemeColorToken(input.headingColor),
11192
+ linkColor: requireThemeColorToken(input.linkColor),
11193
+ supportingColor: requireThemeColorToken(input.supportingColor)
11194
+ };
11195
+ }
11196
+ function requireThemeColorToken(value) {
11197
+ const token = parseThemeColorToken(value);
11198
+ if (!token) throw new Error(`Invalid section foreground Theme color token: ${String(value)}`);
11199
+ return token;
11200
+ }
10612
11201
  function defineDesignRuntimeRules(rules) {
10613
11202
  return rules;
10614
11203
  }
@@ -10879,24 +11468,24 @@ const kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
10879
11468
  type: "color",
10880
11469
  color: "muted"
10881
11470
  },
10882
- foreground: {
11471
+ foreground: defineSectionForegroundRuntimeTokens({
10883
11472
  textColor: "text",
10884
11473
  headingColor: "primary",
10885
11474
  linkColor: "primary",
10886
11475
  supportingColor: "text"
10887
- }
11476
+ })
10888
11477
  },
10889
11478
  "brand-depth-band": {
10890
11479
  background: {
10891
11480
  type: "color",
10892
11481
  color: "primary-800"
10893
11482
  },
10894
- foreground: {
11483
+ foreground: defineSectionForegroundRuntimeTokens({
10895
11484
  textColor: "text",
10896
11485
  headingColor: "primary",
10897
11486
  linkColor: "primary",
10898
11487
  supportingColor: "text"
10899
- }
11488
+ })
10900
11489
  },
10901
11490
  "hero-image": {
10902
11491
  background: {
@@ -10904,12 +11493,32 @@ const kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
10904
11493
  opacity: 1,
10905
11494
  position: "center center"
10906
11495
  },
10907
- foreground: {
11496
+ foreground: defineSectionForegroundRuntimeTokens({
10908
11497
  textColor: "text",
10909
11498
  headingColor: "primary",
10910
11499
  linkColor: "primary",
10911
11500
  supportingColor: "text"
10912
- }
11501
+ })
11502
+ }
11503
+ }
11504
+ });
11505
+ const primaryGlowGradientPresetId = parseGradientPresetId("primary-glow");
11506
+ if (!primaryGlowGradientPresetId) throw new Error("Expected primary-glow in the Theme Core gradient catalog");
11507
+ const fulcrumDesignRuntimeRules = defineDesignRuntimeRules({
11508
+ ...defaultDesignRuntimeRules,
11509
+ sectionSurfaces: {
11510
+ ...defaultDesignRuntimeRules.sectionSurfaces,
11511
+ "accent-band": {
11512
+ background: {
11513
+ type: "gradient",
11514
+ gradientPresetId: primaryGlowGradientPresetId
11515
+ },
11516
+ foreground: defineSectionForegroundRuntimeTokens({
11517
+ textColor: "primaryForeground",
11518
+ headingColor: "primaryForeground",
11519
+ linkColor: "primaryForeground",
11520
+ supportingColor: "primaryForeground"
11521
+ })
10913
11522
  }
10914
11523
  }
10915
11524
  });
@@ -11233,6 +11842,7 @@ const curatedSiteStyles = [
11233
11842
  ],
11234
11843
  buttonPersonalityChoices: [
11235
11844
  buttonChoice("soft-pill"),
11845
+ buttonChoice("two-tone-pill"),
11236
11846
  buttonChoice("pebble"),
11237
11847
  buttonChoice("editorial-link"),
11238
11848
  buttonChoice("brushed-wash")
@@ -12296,6 +12906,8 @@ const curatedSiteStyles = [
12296
12906
  },
12297
12907
  compositionBudget: quietBudget,
12298
12908
  typography: fulcrumTypography,
12909
+ designRuntimeRules: fulcrumDesignRuntimeRules,
12910
+ recommendedAppearancePresetIds: ["cta-accent-band"],
12299
12911
  themeOverrides: {
12300
12912
  shadow: { colorToken: "primary" },
12301
12913
  accordions: {
@@ -12412,6 +13024,7 @@ const curatedSiteStyles = [
12412
13024
  ],
12413
13025
  buttonPersonalityChoices: [
12414
13026
  buttonChoice("quiet-arrow"),
13027
+ buttonChoice("two-tone-pill"),
12415
13028
  buttonChoice("flat-ink"),
12416
13029
  buttonChoice("editorial-link")
12417
13030
  ],
@@ -12667,213 +13280,6 @@ z$1.object({
12667
13280
  spacing: z$1.enum(themeTokenRecipeOptions.spacing),
12668
13281
  motion: z$1.enum(themeTokenRecipeOptions.motion)
12669
13282
  });
12670
- //#endregion
12671
- //#region ../theme-core/src/gradients/presets.ts
12672
- /**
12673
- * Curated library of gradient presets
12674
- * All gradients use theme color tokens, so they adapt to the site's palette
12675
- */
12676
- const GRADIENT_PRESETS = [
12677
- {
12678
- id: "primary-secondary",
12679
- name: "Primary to Secondary",
12680
- description: "Blend your primary and secondary brand colors",
12681
- type: "linear",
12682
- angle: 135,
12683
- stops: [{
12684
- color: "primary-500",
12685
- position: 0
12686
- }, {
12687
- color: "secondary-500",
12688
- position: 100
12689
- }]
12690
- },
12691
- {
12692
- id: "primary-accent",
12693
- name: "Primary to Accent",
12694
- description: "Energetic gradient from primary to accent",
12695
- type: "linear",
12696
- angle: 135,
12697
- stops: [{
12698
- color: "primary-500",
12699
- position: 0
12700
- }, {
12701
- color: "accent-500",
12702
- position: 100
12703
- }]
12704
- },
12705
- {
12706
- id: "secondary-accent",
12707
- name: "Secondary to Accent",
12708
- description: "Vibrant secondary to accent blend",
12709
- type: "linear",
12710
- angle: 135,
12711
- stops: [{
12712
- color: "secondary-500",
12713
- position: 0
12714
- }, {
12715
- color: "accent-500",
12716
- position: 100
12717
- }]
12718
- },
12719
- {
12720
- id: "primary-light-dark",
12721
- name: "Primary Light to Dark",
12722
- description: "Subtle primary color fade",
12723
- type: "linear",
12724
- angle: 180,
12725
- stops: [{
12726
- color: "primary-500",
12727
- position: 0
12728
- }, {
12729
- color: "primary-900",
12730
- position: 100
12731
- }]
12732
- },
12733
- {
12734
- id: "primary-dark-light",
12735
- name: "Primary Dark to Light",
12736
- description: "Reverse primary fade",
12737
- type: "linear",
12738
- angle: 180,
12739
- stops: [{
12740
- color: "primary-900",
12741
- position: 0
12742
- }, {
12743
- color: "primary-50",
12744
- position: 100
12745
- }]
12746
- },
12747
- {
12748
- id: "secondary-light-dark",
12749
- name: "Secondary Light to Dark",
12750
- description: "Subtle secondary color fade",
12751
- type: "linear",
12752
- angle: 180,
12753
- stops: [{
12754
- color: "secondary-500",
12755
- position: 0
12756
- }, {
12757
- color: "secondary-900",
12758
- position: 100
12759
- }]
12760
- },
12761
- {
12762
- id: "accent-light-dark",
12763
- name: "Accent Light to Dark",
12764
- description: "Accent color depth fade",
12765
- type: "linear",
12766
- angle: 180,
12767
- stops: [{
12768
- color: "accent-500",
12769
- position: 0
12770
- }, {
12771
- color: "accent-900",
12772
- position: 100
12773
- }]
12774
- },
12775
- {
12776
- id: "background-surface",
12777
- name: "Background to Surface",
12778
- description: "Subtle depth using base colors",
12779
- type: "linear",
12780
- angle: 180,
12781
- stops: [{
12782
- color: "background",
12783
- position: 0
12784
- }, {
12785
- color: "surface",
12786
- position: 100
12787
- }]
12788
- },
12789
- {
12790
- id: "neutral-fade",
12791
- name: "Neutral Gradient",
12792
- description: "Elegant neutral color fade",
12793
- type: "linear",
12794
- angle: 180,
12795
- stops: [{
12796
- color: "neutral-900",
12797
- position: 0
12798
- }, {
12799
- color: "neutral-50",
12800
- position: 100
12801
- }]
12802
- },
12803
- {
12804
- id: "primary-radial",
12805
- name: "Primary Spotlight",
12806
- description: "Radial primary gradient from center",
12807
- type: "radial",
12808
- position: "center",
12809
- stops: [{
12810
- color: "primary-500",
12811
- position: 0
12812
- }, {
12813
- color: "primary-900",
12814
- position: 100
12815
- }]
12816
- },
12817
- {
12818
- id: "accent-radial",
12819
- name: "Accent Spotlight",
12820
- description: "Radial accent gradient from center",
12821
- type: "radial",
12822
- position: "center",
12823
- stops: [{
12824
- color: "accent-500",
12825
- position: 0
12826
- }, {
12827
- color: "accent-900",
12828
- position: 100
12829
- }]
12830
- },
12831
- {
12832
- id: "primary-secondary-accent",
12833
- name: "Brand Trio",
12834
- description: "All three brand colors in harmony",
12835
- type: "linear",
12836
- angle: 135,
12837
- stops: [
12838
- {
12839
- color: "primary-500",
12840
- position: 0
12841
- },
12842
- {
12843
- color: "secondary-500",
12844
- position: 50
12845
- },
12846
- {
12847
- color: "accent-500",
12848
- position: 100
12849
- }
12850
- ]
12851
- }
12852
- ];
12853
- //#endregion
12854
- //#region ../theme-core/src/gradients/utils.ts
12855
- /**
12856
- * Convert a GradientConfig to a CSS gradient string
12857
- *
12858
- * @param config - The gradient configuration using theme tokens
12859
- * @param tokens - Map of theme color tokens to hex values
12860
- * @returns CSS gradient string (e.g., "linear-gradient(180deg, #3b82f6 0%, #f59e0b 100%)")
12861
- */
12862
- function gradientToCss(config, tokens) {
12863
- const stops = config.stops.map((stop) => {
12864
- return `${tokens[stop.color] ?? "#000000"} ${stop.position}%`;
12865
- }).join(", ");
12866
- const type = config.type ?? "linear";
12867
- if (type === "radial") {
12868
- const position = config.position ?? "center";
12869
- return `radial-gradient(${config.shape ?? "circle"} at ${position}, ${stops})`;
12870
- }
12871
- if (type === "conic") {
12872
- const position = config.position ?? "center";
12873
- return `conic-gradient(from ${config.angle ?? 0}deg at ${position}, ${stops})`;
12874
- }
12875
- return `linear-gradient(${config.angle ?? 180}deg, ${stops})`;
12876
- }
12877
13283
  const BREAKPOINT_LG = 1024;
12878
13284
  const BREAKPOINT_XL = 1280;
12879
13285
  const BREAKPOINT_LG_DOWN = BREAKPOINT_LG - 1;
@@ -13299,7 +13705,7 @@ const ALLOWED_TRANSFORM_IDS = [
13299
13705
  "media.fromUrl",
13300
13706
  "background.resolveStyle",
13301
13707
  "background.resolveColorsStyle",
13302
- "background.resolveAllowOverflow",
13708
+ "background.resolveFrameClassName",
13303
13709
  "background.resolveImageStyle",
13304
13710
  "background.resolveImageClassName",
13305
13711
  "background.resolveOverlayStyle",
@@ -13960,6 +14366,20 @@ const blockCategoryEnum = z$1.enum([
13960
14366
  "layout",
13961
14367
  "interactive"
13962
14368
  ]);
14369
+ const blockContentSourceSchema = z$1.object({
14370
+ kind: z$1.enum([
14371
+ "inline",
14372
+ "entries",
14373
+ "mixed"
14374
+ ]),
14375
+ contentType: z$1.string().min(1).optional()
14376
+ }).superRefine((value, ctx) => {
14377
+ if (value.kind === "inline" && value.contentType) ctx.addIssue({
14378
+ code: z$1.ZodIssueCode.custom,
14379
+ path: ["contentType"],
14380
+ message: "contentType is not allowed when contentSource.kind is \"inline\""
14381
+ });
14382
+ });
13963
14383
  z$1.object({
13964
14384
  name: z$1.string().min(1),
13965
14385
  version: z$1.string().min(1),
@@ -13990,6 +14410,12 @@ z$1.object({
13990
14410
  }).optional()).optional(),
13991
14411
  category: blockCategoryEnum.optional(),
13992
14412
  contentTypes: z$1.array(z$1.string()).optional(),
14413
+ /**
14414
+ * Explicit content-source classification (inline / entries / mixed). Optional at the
14415
+ * schema level for backward compatibility with SDK-defined custom blocks, but every
14416
+ * registered SYSTEM block must declare it (enforced by a registry-wide test).
14417
+ */
14418
+ contentSource: blockContentSourceSchema.optional(),
13993
14419
  tags: z$1.array(z$1.string()).optional(),
13994
14420
  icon: z$1.string().optional()
13995
14421
  });
@@ -14966,6 +15392,7 @@ function devValidate(node) {
14966
15392
  }
14967
15393
  //#endregion
14968
15394
  //#region ../blocks/src/system/node/fragments/backgroundLayer.ts
15395
+ 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";
14969
15396
  /**
14970
15397
  * Creates background layer nodes for rendering backgrounds from field data.
14971
15398
  *
@@ -15031,6 +15458,34 @@ function backgroundLayer(path, options = {}) {
15031
15458
  ];
15032
15459
  }
15033
15460
  /**
15461
+ * Wrap decorative background layers in their own clipping frame.
15462
+ *
15463
+ * Foreground content remains outside this frame, so editor outlines, focus
15464
+ * rings, and floating controls are never clipped by a visual background.
15465
+ * Backgrounds that explicitly opt into overflow keep that behavior within
15466
+ * the decorative layer rather than changing the content root.
15467
+ */
15468
+ function backgroundFrame(path, options = {}) {
15469
+ const { leadingNodes = [], ...layerOptions } = options;
15470
+ const framedLayerOptions = {
15471
+ ...layerOptions,
15472
+ styleClassName: layerOptions.styleClassName ?? "background-style rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none",
15473
+ imageClassName: layerOptions.imageClassName ?? "rb-absolute rb-z-0",
15474
+ overlayClassName: layerOptions.overlayClassName ?? "background-overlay rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none"
15475
+ };
15476
+ return el("div", {
15477
+ className: { $bind: {
15478
+ from: path,
15479
+ transforms: [{
15480
+ id: "background.resolveFrameClassName",
15481
+ options: { baseClass: BACKGROUND_FRAME_BASE_CLASS }
15482
+ }],
15483
+ fallback: `${BACKGROUND_FRAME_BASE_CLASS} rb-overflow-hidden`
15484
+ } },
15485
+ style: { borderRadius: "inherit" }
15486
+ }, [...leadingNodes, ...backgroundLayer(path, framedLayerOptions)]);
15487
+ }
15488
+ /**
15034
15489
  * Creates a media node for rendering background image/video media with conditional rendering.
15035
15490
  *
15036
15491
  * This helper creates a media element that:
@@ -15192,8 +15647,8 @@ function sectionContainer(children, opts) {
15192
15647
  * - content
15193
15648
  */
15194
15649
  function styledContainer(config) {
15195
- 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;
15196
- const backgroundNodes = backgroundLayer(`${bindFrom}.background`, { imageClassName });
15650
+ const { children, rootType = "div", rootProps, bindFrom = "_containerStyles", baseClassName = "rb-relative rb-isolate rb-overflow-visible", imageClassName = "rb-absolute rb-z-0", constrainWidth = true } = config;
15651
+ const backgroundNode = backgroundFrame(`${bindFrom}.background`, { imageClassName });
15197
15652
  const childrenArray = Array.isArray(children) ? children : [children];
15198
15653
  const { className: _ignoredClassName, style: _ignoredStyle, ...safeRootProps } = rootProps ?? {};
15199
15654
  return el(rootType, {
@@ -15216,7 +15671,7 @@ function styledContainer(config) {
15216
15671
  }],
15217
15672
  fallback: constrainWidth ? `${baseClassName} rb-container` : baseClassName
15218
15673
  } }
15219
- }, [...backgroundNodes, ...childrenArray]);
15674
+ }, [backgroundNode, ...childrenArray]);
15220
15675
  }
15221
15676
  //#endregion
15222
15677
  //#region ../blocks/src/system/spacing.ts
@@ -15349,7 +15804,7 @@ const DEFAULT_SECTION_SPACING = "medium";
15349
15804
  * - Creating a section wrapper with background theme
15350
15805
  * - Adding background color/gradient/image layers
15351
15806
  * - Binding className to section styles with transform
15352
- * - Binding allowOverflow for background positioning
15807
+ * - Keeping foreground overflow visible while decorative backgrounds clip independently
15353
15808
  * - Wrapping content children
15354
15809
  *
15355
15810
  * Use this helper to eliminate 25+ lines of boilerplate section setup code.
@@ -15385,8 +15840,8 @@ const DEFAULT_SECTION_SPACING = "medium";
15385
15840
  * });
15386
15841
  */
15387
15842
  function styledSection(config) {
15388
- 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;
15389
- const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
15843
+ 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;
15844
+ const renderedBackgroundNode = backgroundFrame(`${bindFrom}.background`, {
15390
15845
  imageClassName,
15391
15846
  fallbackToken: background,
15392
15847
  omitImageLayer: !renderBackgroundImage,
@@ -15409,13 +15864,8 @@ function styledSection(config) {
15409
15864
  fullWidthPath
15410
15865
  }
15411
15866
  }]
15412
- } },
15413
- allowOverflow: allowOverflow ? true : { $bind: {
15414
- from: `${bindFrom}.background`,
15415
- transforms: [{ id: "background.resolveAllowOverflow" }],
15416
- fallback: false
15417
15867
  } }
15418
- }, [...renderedBackgroundNodes, ...childrenArray]);
15868
+ }, [renderedBackgroundNode, ...childrenArray]);
15419
15869
  }
15420
15870
  //#endregion
15421
15871
  //#region ../blocks/src/system/node/fragments/ctaButton.ts
@@ -16267,9 +16717,12 @@ function responsiveTwoColumn({ image, text, ratioFrom, imagePositionFrom, gapCla
16267
16717
  //#endregion
16268
16718
  //#region ../blocks/src/system/node/fragments/styledCard.ts
16269
16719
  function styledCard(children, opts, ...mods) {
16270
- const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-hidden rb-border";
16271
- 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" });
16272
- const backgroundNodes = backgroundLayer(opts.backgroundFrom);
16720
+ const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-visible rb-border";
16721
+ const defaultBackgroundLayer = el("div", {
16722
+ className: "rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none rb-bg-surface",
16723
+ style: { borderRadius: "inherit" }
16724
+ });
16725
+ const backgroundNode = backgroundFrame(opts.backgroundFrom);
16273
16726
  const style = {
16274
16727
  ...opts.style ?? {},
16275
16728
  borderColor: { $bind: {
@@ -16296,7 +16749,7 @@ function styledCard(children, opts, ...mods) {
16296
16749
  ...style ? { style } : {}
16297
16750
  }, [
16298
16751
  defaultBackgroundLayer,
16299
- ...backgroundNodes,
16752
+ backgroundNode,
16300
16753
  ...children
16301
16754
  ], ...mods);
16302
16755
  }
@@ -17076,9 +17529,15 @@ function createButtonGroup(options = {}) {
17076
17529
  //#endregion
17077
17530
  //#region ../blocks/src/system/fields/ctas.ts
17078
17531
  function createCtasRepeater(options = {}) {
17079
- const { id = "ctas", label = "Calls to action", itemLabel = "CTA", minItems = 0, maxItems, button } = options;
17532
+ const { id = "ctas", label = "Calls to action", itemLabel = "CTA", minItems = 0, maxItems, button, defaultValue } = options;
17533
+ const fieldId = id;
17534
+ const buttonField = createButtonGroup({
17535
+ showGroupLabel: false,
17536
+ ...button ?? {},
17537
+ flattenInRepeater: true
17538
+ });
17080
17539
  return {
17081
- id,
17540
+ id: fieldId,
17082
17541
  type: "repeater",
17083
17542
  label,
17084
17543
  itemLabel,
@@ -17087,11 +17546,8 @@ function createCtasRepeater(options = {}) {
17087
17546
  maxItems,
17088
17547
  required: false,
17089
17548
  allowConversion: true,
17090
- schema: { fields: [createButtonGroup({
17091
- showGroupLabel: false,
17092
- ...button ?? {},
17093
- flattenInRepeater: true
17094
- })] }
17549
+ ...defaultValue !== void 0 ? { defaultValue: [...defaultValue] } : {},
17550
+ schema: { fields: [buttonField] }
17095
17551
  };
17096
17552
  }
17097
17553
  //#endregion
@@ -17141,6 +17597,7 @@ const heroCtaRowFragment = defineFragment({
17141
17597
  label: "Calls to action",
17142
17598
  itemLabel: "CTA",
17143
17599
  maxItems: 3,
17600
+ defaultValue: [],
17144
17601
  button: {
17145
17602
  variants: [
17146
17603
  {
@@ -17208,7 +17665,7 @@ const ctaCopyFragment = defineFragment({
17208
17665
  eyebrowPath: "content.eyebrow",
17209
17666
  titlePath: "content.title",
17210
17667
  className: "cta-heading"
17211
- }), richText({ className: "cta-content rb-prose rb-mx-auto rb-max-w-none" }, when("content.content"), bind("content.content"))]
17668
+ }), richText({ className: "cta-content rb-prose rb-mx-auto rb-max-w-none" }, when("content"), bind("content"))]
17212
17669
  });
17213
17670
  //#endregion
17214
17671
  //#region ../blocks/src/system/fragments/library/testimonialsHeading.ts
@@ -17305,7 +17762,7 @@ function buildTestimonialCard(...mods) {
17305
17762
  }, 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())])], {
17306
17763
  stylesFrom: "content._cardStyles",
17307
17764
  backgroundFrom: "content._cardStyles.background",
17308
- baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-hidden rb-p-8"
17765
+ baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-visible rb-p-8"
17309
17766
  }, ...mods);
17310
17767
  }
17311
17768
  /**
@@ -17777,39 +18234,6 @@ const formEmbedFragment = defineFragment({
17777
18234
  }
17778
18235
  });
17779
18236
  //#endregion
17780
- //#region ../blocks/src/system/fragments/library/footerBottomText.ts
17781
- const footerBottomTextFragment = defineFragment({
17782
- id: "footerBottomText",
17783
- title: "Footer Text",
17784
- description: "Rich text content for the main footer body and optional bottom bar.",
17785
- fields: [{
17786
- id: "bodyText",
17787
- type: "richText",
17788
- label: "Body text",
17789
- description: "Appears in the main footer area.",
17790
- ui: { variant: "limited" }
17791
- }, {
17792
- id: "bottomText",
17793
- type: "richText",
17794
- label: "Bottom bar text",
17795
- description: "Appears in the optional footer bottom bar.",
17796
- ui: { variant: "limited" }
17797
- }],
17798
- layout: [richText({
17799
- className: "rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center",
17800
- style: textColorStyle("text/80")
17801
- }, when("bodyText"), bind("bodyText", { transforms: [{
17802
- id: "content.interpolateRichTextTokens",
17803
- options: { tokens: ["year", "site_name"] }
17804
- }] })), richText({
17805
- className: "rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center",
17806
- style: textColorStyle("text/80")
17807
- }, when("bottomText"), bind("bottomText", { transforms: [{
17808
- id: "content.interpolateRichTextTokens",
17809
- options: { tokens: ["year", "site_name"] }
17810
- }] }))]
17811
- });
17812
- //#endregion
17813
18237
  //#region ../blocks/src/system/fragments/library/singleButton.ts
17814
18238
  const singleButtonFragment = defineFragment({
17815
18239
  id: "singleButton",
@@ -17982,7 +18406,7 @@ function createFaqAccordionLayout(options = {}) {
17982
18406
  options: {
17983
18407
  axis: "all",
17984
18408
  includeSpacing: false,
17985
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
18409
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-visible"
17986
18410
  }
17987
18411
  }]
17988
18412
  },
@@ -18973,6 +19397,7 @@ function createBlockManifest(config) {
18973
19397
  previewCustomize: config.previewCustomize,
18974
19398
  category: config.category,
18975
19399
  contentTypes: config.contentTypes ? [...config.contentTypes] : void 0,
19400
+ contentSource: config.contentSource,
18976
19401
  tags: config.tags ? [...config.tags] : [],
18977
19402
  icon: config.icon ?? "Box",
18978
19403
  layout,
@@ -19106,7 +19531,6 @@ function splitLayoutWith(children) {
19106
19531
  }
19107
19532
  }),
19108
19533
  renderBackgroundImage: false,
19109
- allowOverflow: true,
19110
19534
  baseClass: ""
19111
19535
  });
19112
19536
  }
@@ -19119,6 +19543,7 @@ const heroBlockDefinition = { manifest: createBlockManifest({
19119
19543
  title: "Hero",
19120
19544
  titleSource: "headline",
19121
19545
  category: "layout",
19546
+ contentSource: { kind: "inline" },
19122
19547
  includeContainerStyles: true,
19123
19548
  promotedFields: ["_sectionStyles.background.image"],
19124
19549
  fragments: [
@@ -19392,6 +19817,7 @@ const introBlockDefinition = { manifest: createBlockManifest({
19392
19817
  id: "block.intro",
19393
19818
  title: "Intro",
19394
19819
  category: "layout",
19820
+ contentSource: { kind: "inline" },
19395
19821
  includeContainerStyles: true,
19396
19822
  titleSource: "title",
19397
19823
  previewCustomize: { quickFieldPriority: [
@@ -19577,6 +20003,7 @@ const bodyTextBlockDefinition = { manifest: createBlockManifest({
19577
20003
  title: "Body Text",
19578
20004
  titleSource: "heading",
19579
20005
  category: "content",
20006
+ contentSource: { kind: "inline" },
19580
20007
  fragments: [{
19581
20008
  fragment: bodyCopyFragment,
19582
20009
  fieldPriority: 0
@@ -19633,6 +20060,10 @@ const blogPostBlockDefinition = {
19633
20060
  description: "Highlights a single blog post with title, image, and excerpt.",
19634
20061
  category: "blog",
19635
20062
  contentTypes: ["post"],
20063
+ contentSource: {
20064
+ kind: "entries",
20065
+ contentType: "post"
20066
+ },
19636
20067
  tags: [
19637
20068
  "blog",
19638
20069
  "post",
@@ -19734,7 +20165,7 @@ function postCard(children, ...mods) {
19734
20165
  return styledCard(children, {
19735
20166
  stylesFrom: "content._cardStyles",
19736
20167
  backgroundFrom: "content._cardStyles.background",
19737
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-flex-col rb-h-full"
20168
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-flex rb-flex-col rb-h-full"
19738
20169
  }, ...mods);
19739
20170
  }
19740
20171
  const gridPostCard = postCard([postImageLink("rb-h-48 rb-w-full rb-object-cover rb-transition-transform rb-hover-scale-105", {
@@ -19770,7 +20201,7 @@ const stackPostCard = styledCard([inline({
19770
20201
  ])])], {
19771
20202
  stylesFrom: "content._cardStyles",
19772
20203
  backgroundFrom: "content._cardStyles.background",
19773
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border"
20204
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border"
19774
20205
  }, repeat("data.posts", "post"));
19775
20206
  const emptyState$2 = {
19776
20207
  ...styledCard([text({
@@ -19779,7 +20210,7 @@ const emptyState$2 = {
19779
20210
  }, bind("content.emptyMessage", { fallback: "No posts published yet." }))], {
19780
20211
  stylesFrom: "content._cardStyles",
19781
20212
  backgroundFrom: "content._cardStyles.background",
19782
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-border-dashed rb-p-8 rb-text-center"
20213
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-border-dashed rb-p-8 rb-text-center"
19783
20214
  }),
19784
20215
  $when: {
19785
20216
  when: { from: "data.posts[0]" },
@@ -19789,7 +20220,7 @@ const emptyState$2 = {
19789
20220
  function blogListingShell(children) {
19790
20221
  return styledSection({
19791
20222
  children: styledContainer({
19792
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden",
20223
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
19793
20224
  children
19794
20225
  }),
19795
20226
  baseClass: ""
@@ -19930,6 +20361,10 @@ const blogListingManifest = createBlockManifest({
19930
20361
  ],
19931
20362
  description: "Display a collection of blog posts in grid or stack layout.",
19932
20363
  contentTypes: ["post"],
20364
+ contentSource: {
20365
+ kind: "entries",
20366
+ contentType: "post"
20367
+ },
19933
20368
  tags: [
19934
20369
  "blog",
19935
20370
  "posts",
@@ -19972,6 +20407,7 @@ const ctaFullBlockDefinition = { manifest: createBlockManifest({
19972
20407
  id: "block.cta-full",
19973
20408
  title: "Full-width CTA",
19974
20409
  category: "marketing",
20410
+ contentSource: { kind: "inline" },
19975
20411
  fragments: [{
19976
20412
  fragment: ctaCopyFragment,
19977
20413
  fieldPriority: 0
@@ -20005,6 +20441,7 @@ const singleButtonBlockDefinition = { manifest: createBlockManifest({
20005
20441
  id: "block.single-button",
20006
20442
  title: "Single Button",
20007
20443
  category: "marketing",
20444
+ contentSource: { kind: "inline" },
20008
20445
  fragments: [{
20009
20446
  fragment: singleButtonFragment,
20010
20447
  fieldPriority: 0
@@ -20201,7 +20638,7 @@ const copyLayout = fragmentLayoutNode$1(formCopyFragment.layout);
20201
20638
  const formSurface = styledContainer({
20202
20639
  bindFrom: "_containerStyles",
20203
20640
  constrainWidth: false,
20204
- baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-hidden",
20641
+ baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-visible",
20205
20642
  children: fragmentLayoutNode$1(formEmbedFragment.layout)
20206
20643
  });
20207
20644
  function createFormLayout(variant) {
@@ -20265,6 +20702,7 @@ const formManifest = createBlockManifest({
20265
20702
  paletteHidden: false
20266
20703
  },
20267
20704
  category: "interactive",
20705
+ contentSource: { kind: "inline" },
20268
20706
  tags: [
20269
20707
  "form",
20270
20708
  "contact",
@@ -20327,6 +20765,7 @@ const contactNewsletterBlockDefinition = {
20327
20765
  titleSource: "contactTitle",
20328
20766
  description: "Two-column newsletter signup and contact form section.",
20329
20767
  category: "interactive",
20768
+ contentSource: { kind: "inline" },
20330
20769
  layout: contactNewsletterLayout,
20331
20770
  defaultVariant: "default",
20332
20771
  variants: { default: contactNewsletterLayout },
@@ -20530,6 +20969,7 @@ const faqBlockDefinition = { manifest: createBlockManifest({
20530
20969
  title: "FAQ",
20531
20970
  titleSource: "title",
20532
20971
  category: "content",
20972
+ contentSource: { kind: "inline" },
20533
20973
  includeContainerStyles: true,
20534
20974
  fragments: [{
20535
20975
  fragment: faqHeadingFragment,
@@ -21418,6 +21858,7 @@ const headerRootClassTransform = {
21418
21858
  ];
21419
21859
  const variant = header?.variant;
21420
21860
  if (variant && VALID_VARIANTS.includes(variant)) classes.push(`header-variant-${variant}`);
21861
+ if (header?.barFrame === "inset-shell" && variant === "classic") classes.push("header-bar-frame-inset-shell");
21421
21862
  return joinClasses(classes);
21422
21863
  }
21423
21864
  };
@@ -21931,7 +22372,7 @@ function desktopOnlyDisplay(display) {
21931
22372
  }
21932
22373
  //#endregion
21933
22374
  //#region ../blocks/src/system/blocks/site-header.ts
21934
- const whenTransformed$1 = (from, transformId, equals = true) => (node) => ({
22375
+ const whenTransformed = (from, transformId, equals = true) => (node) => ({
21935
22376
  ...node,
21936
22377
  $when: {
21937
22378
  when: {
@@ -21959,7 +22400,7 @@ const logoRow = link({
21959
22400
  text({
21960
22401
  as: "strong",
21961
22402
  className: "header-logo-text rb-truncate"
21962
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22403
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
21963
22404
  ]);
21964
22405
  const centeredLogoRow = link({
21965
22406
  href: "/",
@@ -21979,7 +22420,7 @@ const centeredLogoRow = link({
21979
22420
  text({
21980
22421
  as: "strong",
21981
22422
  className: "header-logo-text"
21982
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22423
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
21983
22424
  ]);
21984
22425
  const createNavRow = (className, align = "end") => navRow({
21985
22426
  className: `${className} header-nav-row`,
@@ -22111,7 +22552,7 @@ const classicLayout = inline({
22111
22552
  logoRow,
22112
22553
  createNavRow(`rb-ml-auto ${desktopOnlyDisplay("flex")} rb-gap-6`),
22113
22554
  headerCta
22114
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "inline"));
22555
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "inline"));
22115
22556
  const classicCenteredNavLayout = inline({
22116
22557
  className: bindProp("$root.theme.header.maxWidth", {
22117
22558
  transforms: pipe(tx("layout.maxWidthClass", { base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-items-center rb-gap-6` })),
@@ -22122,7 +22563,7 @@ const classicCenteredNavLayout = inline({
22122
22563
  logoRow,
22123
22564
  createNavRow(`rb-flex-1 rb-justify-center ${desktopOnlyDisplay("flex")} rb-gap-6`, "center"),
22124
22565
  headerCta
22125
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "centered"));
22566
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "centered"));
22126
22567
  const centeredLayout = stack({
22127
22568
  gap: "md",
22128
22569
  align: "center",
@@ -22162,6 +22603,7 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
22162
22603
  id: "block.site-header",
22163
22604
  title: "Site Header",
22164
22605
  category: "layout",
22606
+ contentSource: { kind: "inline" },
22165
22607
  additionalFields: [{
22166
22608
  id: "mode",
22167
22609
  type: "select",
@@ -22185,7 +22627,6 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
22185
22627
  transforms: pipe(tx("layout.headerSectionBackground")),
22186
22628
  fallback: "background"
22187
22629
  }),
22188
- allowOverflow: true,
22189
22630
  className: bindProp("$root.theme.header", {
22190
22631
  transforms: pipe(tx("layout.headerRootClass")),
22191
22632
  fallback: "header-root rb-z-40 rb-w-full transition-theme"
@@ -22235,218 +22676,155 @@ const footerNavGroupsLayout = stack({
22235
22676
  linkRequired: true,
22236
22677
  target: { $bind: { from: "entry.target" } },
22237
22678
  rel: { $bind: { from: "entry.rel" } }
22238
- }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], when("footerMenu.groups"));
22679
+ }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], whenCollectionHasItems("footerMenu.groups"));
22239
22680
  //#endregion
22240
22681
  //#region ../blocks/src/system/blocks/site-footer.ts
22241
- const footerTextLayout = () => materializeFragment({ fragment: footerBottomTextFragment }).layout;
22242
- const whenTransformed = (from, transformId, equals = true) => (node) => ({
22243
- ...node,
22244
- $when: {
22245
- when: {
22246
- from,
22247
- transforms: [{ id: transformId }]
22248
- },
22249
- equals
22250
- }
22251
- });
22252
- const bottomBarTextLayout = () => {
22253
- const bottomTextNode = footerTextLayout()[1];
22254
- return bottomTextNode ? [bottomTextNode] : [];
22255
- };
22256
- const bodyTextLayout = () => {
22257
- const bodyTextNode = footerTextLayout()[0];
22258
- return bodyTextNode ? [bodyTextNode] : [];
22259
- };
22260
- const businessAddressLayout = () => [text({
22261
- as: "p",
22262
- className: "rb-caption rb-opacity-80"
22263
- }, bind("site.businessAddress.displayAddress"), when("content.showBusinessAddress", { equals: true }))];
22264
- const inlineBottomTextLayout = () => {
22265
- const bottomTextNode = footerTextLayout()[1];
22266
- if (!bottomTextNode) return [];
22267
- return [when("$root.theme.footer.bottomBar.enabled", {
22268
- equals: true,
22269
- not: true
22270
- })(bottomTextNode)];
22271
- };
22272
- const simpleFooterLayout = stack({
22273
- gap: "md",
22274
- align: "start",
22275
- className: { $bind: {
22276
- from: "$root.theme.footer",
22277
- transforms: [{ id: "layout.footerSimpleRootClass" }],
22278
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-items-start rb-gap-4 rb-py-10 rb-text-left"
22279
- } }
22280
- }, [
22281
- link({
22282
- href: "/",
22283
- className: { $bind: {
22284
- from: "$root.theme.footer.logo",
22285
- transforms: [{
22286
- id: "layout.footerLogoClass",
22287
- options: { requireExplicitShow: true }
22288
- }],
22289
- fallback: "rb-hidden"
22290
- } }
22291
- }, [
22292
- media({ className: { $bind: {
22293
- from: "$root.theme.footer.logo",
22294
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22295
- fallback: "rb-w-auto"
22296
- } } }, when("content.logo"), bind("content.logo")),
22297
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
22298
- from: "$root.theme.footer.logo",
22299
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22300
- fallback: "rb-w-auto"
22301
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
22302
- text({
22303
- as: "strong",
22304
- className: "footer-logo-text rb-nav-text"
22305
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22306
- ]),
22307
- footerNav({
22308
- collectionPath: "footerMenu.items",
22309
- mode: "flatten",
22310
- className: { $bind: {
22311
- from: "$root.theme.footer.navLayout",
22312
- transforms: [{ id: "layout.footerSimpleNavClass" }],
22313
- fallback: "footer-nav rb-flex rb-flex-wrap rb-justify-start rb-gap-x-6 rb-gap-y-3"
22314
- } },
22315
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
22316
- }),
22317
- ...bodyTextLayout(),
22318
- ...businessAddressLayout(),
22319
- ...inlineBottomTextLayout()
22320
- ], when("$root.theme.footer.variant", { equals: "simple" }));
22321
- const columnsFooterLayout = stack({
22322
- gap: "xl",
22323
- align: "start",
22682
+ const brandLogo = link({
22683
+ href: "/",
22324
22684
  className: { $bind: {
22325
- from: "$root.theme.footer.maxWidth",
22685
+ from: "$root.theme.footer.logo",
22326
22686
  transforms: [{
22327
- id: "layout.maxWidthClass",
22328
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
22687
+ id: "layout.footerLogoClass",
22688
+ options: { base: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline" }
22329
22689
  }],
22330
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
22690
+ fallback: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline"
22331
22691
  } }
22332
- }, [
22333
- footerNavGroupsLayout,
22334
- inline({ className: "rb-flex rb-w-full rb-flex-wrap rb-items-center rb-justify-between rb-gap-4" }, [text({
22335
- as: "strong",
22336
- className: "rb-block rb-nav-text",
22337
- style: textColorStyle("text")
22338
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" })), footerNav({
22339
- collectionPath: "footerMenu.items",
22340
- mode: "links-only",
22341
- className: "rb-flex rb-flex-wrap rb-justify-end rb-gap-x-6 rb-gap-y-3",
22342
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
22343
- })]),
22344
- ...bodyTextLayout(),
22345
- ...businessAddressLayout(),
22346
- ...inlineBottomTextLayout()
22347
- ], when("$root.theme.footer.variant", { equals: "columns" }));
22348
- const splitFooterLayout = stack({
22349
- gap: "xl",
22350
- align: "start",
22692
+ }, [media({ className: { $bind: {
22693
+ from: "$root.theme.footer.logo",
22694
+ transforms: [{
22695
+ id: "layout.footerLogoMediaClass",
22696
+ options: { base: "rb-h-10 rb-w-auto" }
22697
+ }],
22698
+ fallback: "rb-h-10 rb-w-auto"
22699
+ } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content.logo")), text({
22700
+ as: "strong",
22701
+ className: "footer-logo-text rb-nav-text"
22702
+ }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
22703
+ const navigation = stack({
22704
+ gap: "md",
22705
+ className: "rb-w-full"
22706
+ }, [footerNavGroupsLayout, footerNav({
22707
+ collectionPath: "footerMenu.items",
22708
+ mode: "links-only",
22351
22709
  className: { $bind: {
22352
- from: "$root.theme.footer.maxWidth",
22353
- transforms: [{
22354
- id: "layout.maxWidthClass",
22355
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
22356
- }],
22357
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
22358
- } }
22710
+ from: "module.navigationClassName",
22711
+ fallback: "footer-nav rb-flex rb-flex-wrap rb-gap-x-6 rb-gap-y-3"
22712
+ } },
22713
+ linkClassName: "footer-nav-link rb-nav-text transition-theme-standard"
22714
+ })], when("module.kind", { equals: "navigation" }));
22715
+ const legalNavigation = footerNav({
22716
+ collectionPath: "legalFooterMenu.items",
22717
+ mode: "links-only",
22718
+ className: "rb-flex rb-flex-wrap rb-gap-x-4 rb-gap-y-2",
22719
+ linkClassName: "footer-nav-link rb-caption transition-theme-standard"
22720
+ });
22721
+ const address = text({
22722
+ as: "address",
22723
+ className: "rb-not-italic rb-opacity-80"
22724
+ }, when("module.kind", { equals: "business-address" }), bind("module.address"));
22725
+ const contact = stack({
22726
+ gap: "sm",
22727
+ className: "rb-items-start"
22728
+ }, [link({
22729
+ href: { $bind: { from: "contactLink.href" } },
22730
+ className: "rb-nav-text rb-break-words transition-theme-standard"
22731
+ }, [text({ as: "span" }, bind("contactLink.label"))], repeat("module.contactLinks", "contactLink"))], when("module.kind", { equals: "contact" }));
22732
+ const hours = stack({
22733
+ gap: "sm",
22734
+ className: "rb-w-full"
22735
+ }, [inline({ className: "rb-flex rb-w-full rb-justify-between rb-gap-4" }, [text({
22736
+ as: "span",
22737
+ className: "rb-label"
22738
+ }, bind("hoursDay.weekday")), text({
22739
+ as: "span",
22740
+ className: "rb-caption rb-opacity-80"
22741
+ }, bind("hoursDay.hours"))], repeat("module.openingHours", "hoursDay")), text({
22742
+ as: "p",
22743
+ className: "rb-caption rb-opacity-70"
22744
+ }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
22745
+ const socials = inline({ className: "rb-flex rb-flex-wrap rb-gap-x-5 rb-gap-y-3" }, [link({
22746
+ href: { $bind: { from: "social.href" } },
22747
+ target: "_blank",
22748
+ rel: "noreferrer noopener",
22749
+ "aria-label": { $bind: { from: "social.label" } },
22750
+ className: "rb-nav-text transition-theme-standard"
22751
+ }, [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" }));
22752
+ const authoredCopy = richText({
22753
+ className: "rb-prose rb-prose-sm rb-max-w-none",
22754
+ style: textColorStyle("text/80")
22755
+ }, when("module.content"), bind("module.content", { transforms: [{
22756
+ id: "content.interpolateRichTextTokens",
22757
+ options: { tokens: ["year", "site_name"] }
22758
+ }] }));
22759
+ const footerGroup = stack({
22760
+ gap: "md",
22761
+ align: "stretch",
22762
+ className: "rb-min-w-0",
22763
+ "data-footer-group": { $bind: { from: "group.kind" } }
22764
+ }, [stack({
22765
+ gap: "md",
22766
+ align: "start",
22767
+ "data-preview-footer-module-id": { $bind: { from: "module.id" } }
22359
22768
  }, [
22360
- inline({ className: { $bind: {
22361
- from: "$root.theme.footer.logo",
22362
- transforms: [{ id: "layout.footerSplitMainClass" }],
22363
- 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"
22364
- } } }, [stack({}, [footerNav({
22365
- collectionPath: "footerMenu.items",
22366
- mode: "flatten",
22367
- className: { $bind: {
22368
- from: "$root.theme.footer.navLayout",
22369
- transforms: [{ id: "layout.footerSplitNavSingleClass" }],
22370
- fallback: "rb-w-full rb-space-y-3 rb-text-left"
22371
- } },
22372
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-whitespace-nowrap rb-nav-text transition-theme-standard"
22373
- })]), link({
22374
- href: "/",
22375
- className: { $bind: {
22376
- from: "$root.theme.footer.logo",
22377
- transforms: [{ id: "layout.footerLogoClass" }],
22378
- 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"
22379
- } }
22380
- }, [
22381
- media({ className: { $bind: {
22382
- from: "$root.theme.footer.logo",
22383
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22384
- fallback: "rb-w-auto"
22385
- } } }, when("content.logo"), bind("content.logo")),
22386
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
22387
- from: "$root.theme.footer.logo",
22388
- transforms: [{ id: "layout.footerLogoMediaClass" }],
22389
- fallback: "rb-w-auto"
22390
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
22391
- text({
22392
- as: "strong",
22393
- className: "footer-logo-text rb-nav-text"
22394
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
22395
- ])]),
22396
- ...businessAddressLayout(),
22397
- ...inlineBottomTextLayout()
22398
- ], when("$root.theme.footer.variant", { equals: "split" }));
22399
- const footerLayout = section({
22400
- background: "background",
22769
+ text({
22770
+ as: "h2",
22771
+ className: "rb-label",
22772
+ style: textColorStyle("text/70")
22773
+ }, bind("module.heading"), when("module.heading")),
22774
+ brandLogo,
22775
+ navigation,
22776
+ stack({
22777
+ gap: "sm",
22778
+ className: "rb-w-full"
22779
+ }, [legalNavigation], when("module.kind", { equals: "legal-navigation" })),
22780
+ address,
22781
+ contact,
22782
+ hours,
22783
+ socials,
22784
+ stack({ className: "rb-w-full" }, [authoredCopy], when("module.kind", { equals: "supporting-text" })),
22785
+ stack({ className: "rb-w-full rb-lg-col-span-3" }, [authoredCopy], when("module.kind", { equals: "legal" }))
22786
+ ], repeat("group.modules", "module"))], repeat("region.groups", "group"));
22787
+ const footerMainRegion = stack({
22788
+ className: { $bind: { from: "region.className" } },
22789
+ "data-footer-region": { $bind: { from: "region.kind" } }
22790
+ }, [footerGroup], when("region.kind", { equals: "main" }), repeat("content.footerRuntime.regions", "region"));
22791
+ const footerBottomRegion = stack({ className: { $bind: {
22792
+ from: "$root.theme.footer",
22793
+ transforms: [{ id: "layout.footerBottomBarContainerClass" }],
22794
+ fallback: "rb-w-full"
22795
+ } } }, [stack({
22401
22796
  className: { $bind: {
22402
22797
  from: "$root.theme.footer",
22403
- transforms: [{ id: "layout.footerRootClass" }],
22404
- fallback: "rb-w-full rb-border-t transition-theme"
22798
+ transforms: [{ id: "layout.footerBottomBarClass" }],
22799
+ fallback: "rb-w-full rb-border-t rb-px-6 rb-py-6 rb-text-center"
22405
22800
  } },
22406
22801
  style: { $bind: {
22407
22802
  from: "$root.theme.footer",
22408
- transforms: [{ id: "layout.footerRootStyle" }],
22409
- fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
22410
- } }
22411
- }, [
22412
- simpleFooterLayout,
22413
- columnsFooterLayout,
22414
- splitFooterLayout,
22415
- stack({
22416
- className: { $bind: {
22417
- from: "$root.theme.footer",
22418
- transforms: [{ id: "layout.footerBottomBarClass" }],
22419
- fallback: "rb-w-full rb-border-t rb-py-5"
22420
- } },
22421
- style: { $bind: {
22422
- from: "$root.theme.footer",
22423
- transforms: [{ id: "layout.footerBottomBarStyle" }]
22424
- } }
22425
- }, [stack({ className: { $bind: {
22426
- from: "$root.theme.footer",
22427
- transforms: [{ id: "layout.footerBottomBarContainerClass" }],
22428
- fallback: "rb-container"
22429
- } } }, [...bottomBarTextLayout()])], when("$root.theme.footer.bottomBar.enabled", { equals: true }))
22430
- ]);
22803
+ transforms: [{ id: "layout.footerBottomBarStyle" }]
22804
+ } },
22805
+ "data-footer-region": "bottom"
22806
+ }, [footerGroup])], when("region.kind", { equals: "bottom" }), repeat("content.footerRuntime.regions", "region"));
22431
22807
  const siteFooterBlockDefinition = { manifest: createBlockManifest({
22432
22808
  id: "block.site-footer",
22433
22809
  title: "Site Footer",
22434
22810
  category: "layout",
22435
- fragments: [{
22436
- fragment: footerBottomTextFragment,
22437
- fieldPriority: 0
22438
- }],
22811
+ contentSource: { kind: "inline" },
22439
22812
  skipSectionStyles: true,
22440
- additionalFields: [{
22441
- id: "showBusinessAddress",
22442
- type: "boolean",
22443
- label: "Add business address to site footer?",
22444
- required: false,
22445
- defaultValue: false,
22446
- ui: { intent: "content" }
22447
- }],
22448
- layout: footerLayout,
22449
- description: "Site-wide footer with navigation links and optional columns.",
22813
+ layout: section({
22814
+ background: "background",
22815
+ className: { $bind: {
22816
+ from: "$root.theme.footer",
22817
+ transforms: [{ id: "layout.footerRootClass" }],
22818
+ fallback: "rb-w-full rb-border-t transition-theme"
22819
+ } },
22820
+ style: { $bind: {
22821
+ from: "$root.theme.footer",
22822
+ transforms: [{ id: "layout.footerRootStyle" }],
22823
+ fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
22824
+ } },
22825
+ "data-footer-membership": { $bind: { from: "content.footerRuntime.membershipKey" } }
22826
+ }, [footerMainRegion, footerBottomRegion]),
22827
+ description: "Site-wide composed footer with canonical shared details.",
22450
22828
  styleTokens: { spacing: "md" },
22451
22829
  paletteHidden: true
22452
22830
  }) };
@@ -22580,6 +22958,7 @@ const testimonialsBlockDefinition = {
22580
22958
  id: "block.testimonials",
22581
22959
  title: "Testimonials",
22582
22960
  category: "marketing",
22961
+ contentSource: { kind: "inline" },
22583
22962
  includeContainerStyles: true,
22584
22963
  previewCustomize: { quickFieldPriority: [
22585
22964
  "avatarLayout",
@@ -22738,6 +23117,7 @@ const columnsBlockDefinition = { manifest: createBlockManifest({
22738
23117
  id: "block.columns",
22739
23118
  title: "Columns",
22740
23119
  category: "layout",
23120
+ contentSource: { kind: "inline" },
22741
23121
  additionalFields: [
22742
23122
  parseFieldDefinition({
22743
23123
  id: "equalHeight",
@@ -22924,7 +23304,7 @@ const repeatedItemsNode = repeaterFragmentLayout({
22924
23304
  id: "boxStyles.all",
22925
23305
  options: {
22926
23306
  axis: "all",
22927
- baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-hidden rb-border"
23307
+ baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-visible rb-border"
22928
23308
  }
22929
23309
  }]
22930
23310
  },
@@ -22971,6 +23351,7 @@ const collectionBlockDefinition = { manifest: createBlockManifest({
22971
23351
  id: "block.collection",
22972
23352
  title: "Collection",
22973
23353
  category: "layout",
23354
+ contentSource: { kind: "inline" },
22974
23355
  additionalFields: [
22975
23356
  parseFieldDefinition({
22976
23357
  id: "layout",
@@ -23207,6 +23588,7 @@ const featureCardsBlockDefinition = { manifest: createBlockManifest({
23207
23588
  id: "block.feature-cards",
23208
23589
  title: "Feature Cards",
23209
23590
  category: "layout",
23591
+ contentSource: { kind: "inline" },
23210
23592
  includeContainerStyles: true,
23211
23593
  titleSource: "title",
23212
23594
  additionalFields: [
@@ -23590,6 +23972,7 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
23590
23972
  id: "block.media-text",
23591
23973
  title: "Media and Text",
23592
23974
  category: "layout",
23975
+ contentSource: { kind: "inline" },
23593
23976
  includeContainerStyles: true,
23594
23977
  titleSource: "title",
23595
23978
  previewCustomize: { quickFieldPriority: [
@@ -23990,6 +24373,7 @@ const appointmentBookingBlockDefinition = {
23990
24373
  paletteHidden: false
23991
24374
  },
23992
24375
  category: "interactive",
24376
+ contentSource: { kind: "inline" },
23993
24377
  tags: [
23994
24378
  "booking",
23995
24379
  "appointment",
@@ -24154,6 +24538,7 @@ const weeklySlotAvailabilityManifest = createBlockManifest({
24154
24538
  paletteHidden: false
24155
24539
  },
24156
24540
  category: "interactive",
24541
+ contentSource: { kind: "inline" },
24157
24542
  tags: [
24158
24543
  "booking",
24159
24544
  "appointment",
@@ -25718,6 +26103,7 @@ const eventRegistrationBlockDefinition = {
25718
26103
  titleSource: "heading",
25719
26104
  description: "Multi-step event registration form",
25720
26105
  category: "interactive",
26106
+ contentSource: { kind: "inline" },
25721
26107
  tags: [
25722
26108
  "events",
25723
26109
  "registration",
@@ -25824,15 +26210,9 @@ const eventRegistrationBlockDefinition = {
25824
26210
  defaultValue: "Complete Registration",
25825
26211
  maxLength: 40
25826
26212
  },
25827
- {
25828
- id: "buttonVariant",
25829
- type: "select",
25830
- label: "Button style",
26213
+ createButtonVariantField({
25831
26214
  description: "Choose a button style from your theme",
25832
- required: false,
25833
- multiple: false,
25834
- defaultValue: "primary",
25835
- options: [
26215
+ variants: [
25836
26216
  {
25837
26217
  value: "primary",
25838
26218
  label: "Primary"
@@ -25845,9 +26225,8 @@ const eventRegistrationBlockDefinition = {
25845
26225
  value: "outline",
25846
26226
  label: "Outline"
25847
26227
  }
25848
- ],
25849
- ui: { intent: "style" }
25850
- }
26228
+ ]
26229
+ })
25851
26230
  ],
25852
26231
  layout: [styledSection({
25853
26232
  baseClass: "",
@@ -26040,6 +26419,7 @@ const courseRegistrationBlockDefinition = {
26040
26419
  titleSource: "heading",
26041
26420
  description: "Enrollment form for multi-session courses",
26042
26421
  category: "interactive",
26422
+ contentSource: { kind: "inline" },
26043
26423
  tags: [
26044
26424
  "courses",
26045
26425
  "enrollment",
@@ -26153,15 +26533,9 @@ const courseRegistrationBlockDefinition = {
26153
26533
  defaultValue: "Sign up",
26154
26534
  maxLength: 40
26155
26535
  },
26156
- {
26157
- id: "buttonVariant",
26158
- type: "select",
26159
- label: "Button style",
26536
+ createButtonVariantField({
26160
26537
  description: "Choose a button style from your theme",
26161
- required: false,
26162
- multiple: false,
26163
- defaultValue: "primary",
26164
- options: [
26538
+ variants: [
26165
26539
  {
26166
26540
  value: "primary",
26167
26541
  label: "Primary"
@@ -26174,9 +26548,8 @@ const courseRegistrationBlockDefinition = {
26174
26548
  value: "outline",
26175
26549
  label: "Outline"
26176
26550
  }
26177
- ],
26178
- ui: { intent: "style" }
26179
- }
26551
+ ]
26552
+ })
26180
26553
  ],
26181
26554
  layout: [styledSection({
26182
26555
  baseClass: "",
@@ -26256,6 +26629,7 @@ const eventDetailsManifest = createBlockManifest({
26256
26629
  titleSource: "heading",
26257
26630
  description: "Date/time, venue, map, and other dates for an event",
26258
26631
  category: "content",
26632
+ contentSource: { kind: "entries" },
26259
26633
  tags: [
26260
26634
  "events",
26261
26635
  "venue",
@@ -26461,6 +26835,7 @@ const courseDetailsBlockDefinition = {
26461
26835
  titleSource: "heading",
26462
26836
  description: "Schedule, venue, price, and enrollment status for a course",
26463
26837
  category: "content",
26838
+ contentSource: { kind: "entries" },
26464
26839
  tags: [
26465
26840
  "courses",
26466
26841
  "schedule",
@@ -26752,6 +27127,7 @@ const eventSpotlightBlockDefinition = {
26752
27127
  paletteHidden: false
26753
27128
  },
26754
27129
  category: "content",
27130
+ contentSource: { kind: "entries" },
26755
27131
  tags: [
26756
27132
  "events",
26757
27133
  "featured",
@@ -27298,6 +27674,7 @@ const eventListingBlockDefinition = {
27298
27674
  paletteHidden: true
27299
27675
  },
27300
27676
  category: "interactive",
27677
+ contentSource: { kind: "entries" },
27301
27678
  tags: [
27302
27679
  "events",
27303
27680
  "listing",
@@ -28470,6 +28847,7 @@ const eventCalendarBlockDefinition = {
28470
28847
  paletteHidden: false
28471
28848
  },
28472
28849
  category: "interactive",
28850
+ contentSource: { kind: "entries" },
28473
28851
  tags: [
28474
28852
  "events",
28475
28853
  "calendar",
@@ -28643,6 +29021,7 @@ const recurringScheduleBlockDefinition = {
28643
29021
  titleSource: "heading",
28644
29022
  description: "A compact weekly schedule with one row per recurring series.",
28645
29023
  category: "interactive",
29024
+ contentSource: { kind: "entries" },
28646
29025
  icon: "CalendarDays",
28647
29026
  tags: [
28648
29027
  "schedule",
@@ -29060,7 +29439,10 @@ const offeringsPreviewFields = [
29060
29439
  label: "Link"
29061
29440
  }
29062
29441
  ],
29063
- ui: { intent: "display" }
29442
+ ui: {
29443
+ intent: "display",
29444
+ widget: "buttonVariant"
29445
+ }
29064
29446
  },
29065
29447
  {
29066
29448
  id: "buttonText",
@@ -29113,6 +29495,7 @@ const offeringsPreviewManifest = createBlockManifest({
29113
29495
  paletteHidden: false
29114
29496
  },
29115
29497
  category: "content",
29498
+ contentSource: { kind: "mixed" },
29116
29499
  tags: [
29117
29500
  "offerings",
29118
29501
  "events",
@@ -29281,6 +29664,7 @@ const embedManifest = createBlockManifest({
29281
29664
  id: "block.embed",
29282
29665
  title: "Embed Content",
29283
29666
  category: "content",
29667
+ contentSource: { kind: "entries" },
29284
29668
  titleSource: "heading",
29285
29669
  additionalFields: [
29286
29670
  parseFieldDefinition({
@@ -29768,6 +30152,7 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
29768
30152
  id: "block.image-gallery",
29769
30153
  title: "Image Gallery",
29770
30154
  category: "content",
30155
+ contentSource: { kind: "inline" },
29771
30156
  previewCustomize: { quickFieldPriority: [
29772
30157
  "aspectRatio",
29773
30158
  "slidesToShow",
@@ -30420,6 +30805,7 @@ const videoGridBlockDefinition = { manifest: createBlockManifest({
30420
30805
  id: "block.video-grid",
30421
30806
  title: "Video Grid",
30422
30807
  category: "media",
30808
+ contentSource: { kind: "inline" },
30423
30809
  skipSectionStyles: true,
30424
30810
  additionalFields: parseFieldDefinitions([
30425
30811
  {
@@ -30590,6 +30976,7 @@ const audioPlayerBlockDefinition = { manifest: createBlockManifest({
30590
30976
  title: "Audio Player",
30591
30977
  titleSource: "title",
30592
30978
  category: "media",
30979
+ contentSource: { kind: "inline" },
30593
30980
  description: "Add a branded audio player for a single track.",
30594
30981
  tags: [
30595
30982
  "audio",
@@ -30701,6 +31088,7 @@ const fileDownloadBlockDefinition = { manifest: createBlockManifest({
30701
31088
  title: "File Download",
30702
31089
  titleSource: ["title", "file.filename"],
30703
31090
  category: "media",
31091
+ contentSource: { kind: "inline" },
30704
31092
  description: "Add a simple public download link for a document, ZIP, or audio file.",
30705
31093
  tags: [
30706
31094
  "file",
@@ -31645,6 +32033,7 @@ const shopBlockDefinition = {
31645
32033
  paletteHidden: false
31646
32034
  },
31647
32035
  category: "interactive",
32036
+ contentSource: { kind: "entries" },
31648
32037
  tags: [
31649
32038
  "shop",
31650
32039
  "passes",
@@ -31844,6 +32233,7 @@ const productListBlockDefinition = {
31844
32233
  paletteHidden: false
31845
32234
  },
31846
32235
  category: "interactive",
32236
+ contentSource: { kind: "entries" },
31847
32237
  tags: [
31848
32238
  "shop",
31849
32239
  "products",
@@ -31985,6 +32375,7 @@ const productDetailBlockDefinition = {
31985
32375
  paletteHidden: false
31986
32376
  },
31987
32377
  category: "interactive",
32378
+ contentSource: { kind: "entries" },
31988
32379
  tags: [
31989
32380
  "shop",
31990
32381
  "product",
@@ -32101,6 +32492,7 @@ const cartBlockDefinition = {
32101
32492
  paletteHidden: false
32102
32493
  },
32103
32494
  category: "interactive",
32495
+ contentSource: { kind: "inline" },
32104
32496
  tags: [
32105
32497
  "shop",
32106
32498
  "cart",
@@ -32183,6 +32575,7 @@ const checkoutBlockDefinition = {
32183
32575
  paletteHidden: false
32184
32576
  },
32185
32577
  category: "interactive",
32578
+ contentSource: { kind: "inline" },
32186
32579
  tags: [
32187
32580
  "shop",
32188
32581
  "checkout",
@@ -32386,6 +32779,7 @@ const giftingBlockDefinition = {
32386
32779
  paletteHidden: false
32387
32780
  },
32388
32781
  category: "interactive",
32782
+ contentSource: { kind: "entries" },
32389
32783
  tags: [
32390
32784
  "gifting",
32391
32785
  "gift cards",
@@ -32729,6 +33123,7 @@ const newsletterSignupBlockDefinition = {
32729
33123
  titleSource: "title",
32730
33124
  description: "Newsletter subscription form with configurable field presets.",
32731
33125
  category: "interactive",
33126
+ contentSource: { kind: "inline" },
32732
33127
  fragments: [{
32733
33128
  fragment: newsletterCopyFragment,
32734
33129
  fieldPriority: 0
@@ -32910,6 +33305,7 @@ const teamMembersBlockDefinition = {
32910
33305
  id: "block.team-members",
32911
33306
  title: "Team Members",
32912
33307
  category: "content",
33308
+ contentSource: { kind: "mixed" },
32913
33309
  titleSource: "heading",
32914
33310
  additionalFields: [
32915
33311
  parseFieldDefinition({
@@ -33330,6 +33726,7 @@ const locationMapBlockDefinition = {
33330
33726
  titleSource: "heading",
33331
33727
  description: "Show a business location with an interactive map and directions link.",
33332
33728
  category: "content",
33729
+ contentSource: { kind: "inline" },
33333
33730
  tags: [
33334
33731
  "map",
33335
33732
  "location",
@@ -34445,9 +34842,9 @@ function appendBackgroundMediaClasses(baseClassName, input) {
34445
34842
  ].filter(Boolean).join(" ");
34446
34843
  }
34447
34844
  function gradientPresetCss(value) {
34448
- if (!isString(value)) return null;
34449
- const preset = GRADIENT_PRESETS.find((candidate) => candidate.id === value.trim());
34450
- if (!preset) return null;
34845
+ const presetId = parseGradientPresetId(value);
34846
+ if (!presetId) return null;
34847
+ const preset = getGradientPreset(presetId);
34451
34848
  return gradientToCss(preset, Object.fromEntries(preset.stops.map((stop) => [stop.color, `rgb(var(--tb-${stop.color}))`])));
34452
34849
  }
34453
34850
  const backgroundTransforms = [
@@ -34486,16 +34883,17 @@ const backgroundTransforms = [
34486
34883
  run: (value, _options, context) => resolveSurfaceForegroundStyles(value, context)
34487
34884
  },
34488
34885
  {
34489
- id: "background.resolveAllowOverflow",
34886
+ id: "background.resolveFrameClassName",
34490
34887
  kind: "formatter",
34491
- summary: "Resolve allowOverflow from background config (explicit overflow or scaled image)",
34492
- run: (value) => {
34493
- if (!value || typeof value !== "object") return false;
34888
+ summary: "Resolve clipping on a decorative background frame without clipping foreground content",
34889
+ run: (value, options) => {
34890
+ const baseClass = options?.baseClass?.trim() ?? "";
34891
+ if (!value || typeof value !== "object") return `${baseClass} rb-overflow-hidden`.trim();
34494
34892
  const input = value;
34495
- if (input.overflow === true) return true;
34893
+ if (input.overflow === true) return `${baseClass} rb-overflow-visible`.trim();
34496
34894
  const objectFit = isString(input.objectFit) ? input.objectFit.trim() : null;
34497
34895
  const scale = isString(input.scale) ? input.scale.trim() : isNumber(input.scale) ? String(input.scale) : null;
34498
- return Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0);
34896
+ return `${baseClass} ${Boolean((objectFit === "custom" || objectFit === "original") && scale && scale.trim().length > 0) ? "rb-overflow-visible" : "rb-overflow-hidden"}`.trim();
34499
34897
  }
34500
34898
  },
34501
34899
  {
@@ -35120,6 +35518,7 @@ const CANONICAL_REFUND_PLANNER_ERROR_CODES = [
35120
35518
  "already_refunded",
35121
35519
  "idempotency_amount_mismatch",
35122
35520
  "idempotency_method_mismatch",
35521
+ "idempotency_receipt_mismatch",
35123
35522
  "refund_in_progress"
35124
35523
  ],
35125
35524
  "invalid_amount",
@@ -35132,7 +35531,12 @@ const CANONICAL_ADMIN_REFUND_FAILURE_CODES = [
35132
35531
  "payment_intent_not_found",
35133
35532
  "stripe_error",
35134
35533
  "stale_pending_missing_context",
35135
- "non_refundable_deposit_remaining"
35534
+ "non_refundable_deposit_remaining",
35535
+ "deposit_refund_override_required",
35536
+ "refund_revoke_requires_full_line_refund",
35537
+ "payment_receipt_not_found",
35538
+ "payment_receipt_not_refundable",
35539
+ "payment_receipt_attribution_required"
35136
35540
  ];
35137
35541
  [...CANONICAL_REFUND_PLANNER_ERROR_CODES];
35138
35542
  //#endregion
@@ -35145,7 +35549,10 @@ const STANDARD_LINE_ITEM_REFUND_INVALID_CODES = [
35145
35549
  "missing_credit_customer",
35146
35550
  "deposit_refund_override_required",
35147
35551
  "refund_revoke_requires_full_line_refund",
35148
- "unified_order_link_required"
35552
+ "unified_order_link_required",
35553
+ "payment_receipt_not_found",
35554
+ "payment_receipt_not_refundable",
35555
+ "payment_receipt_attribution_required"
35149
35556
  ];
35150
35557
  const EVENT_ATTENDEE_REFUND_INVALID_CODES = ["manual_booking_not_refundable", ...STANDARD_LINE_ITEM_REFUND_INVALID_CODES];
35151
35558
  [...CANONICAL_ADMIN_REFUND_FAILURE_CODES];
@@ -36110,8 +36517,14 @@ const navigationMenuConfigSchema = z$1.object({
36110
36517
  name: z$1.string().min(1, "Name is required"),
36111
36518
  isPrimary: z$1.boolean().optional(),
36112
36519
  isFooter: z$1.boolean().optional(),
36520
+ footerRole: z$1.enum(["main", "legal-policy"]).nullable().optional(),
36113
36521
  items: z$1.array(navigationItemConfigSchema)
36114
36522
  }).superRefine((menu, ctx) => {
36523
+ if (menu.footerRole !== void 0 && menu.isFooter !== void 0 && menu.isFooter !== (menu.footerRole === "main")) ctx.addIssue({
36524
+ code: "custom",
36525
+ message: "footerRole and isFooter disagree",
36526
+ path: ["footerRole"]
36527
+ });
36115
36528
  const portalStats = collectPortalLinkStats(menu.items);
36116
36529
  if (portalStats.count > 1) ctx.addIssue({
36117
36530
  code: z$1.ZodIssueCode.custom,