@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
@@ -2917,6 +2917,111 @@ const mediaSchema$1 = z.object({
2917
2917
  transform: transformSchema$1.optional()
2918
2918
  });
2919
2919
  //#endregion
2920
+ //#region ../theme-core/src/buttons/effectClassification.ts
2921
+ /**
2922
+ * Exhaustive live policy for every registered effect id.
2923
+ *
2924
+ * The resolver consumes the transition payload directly, so adding an effect
2925
+ * cannot update classification without also defining its runtime behavior.
2926
+ */
2927
+ const BUTTON_EFFECT_POLICIES = {
2928
+ "darken-background": {
2929
+ classification: "colour-transition",
2930
+ transition: {
2931
+ kind: "adjust-shade",
2932
+ direction: "darker"
2933
+ }
2934
+ },
2935
+ "lighten-background": {
2936
+ classification: "colour-transition",
2937
+ transition: {
2938
+ kind: "adjust-shade",
2939
+ direction: "lighter"
2940
+ }
2941
+ },
2942
+ "background-on-hover": {
2943
+ classification: "colour-transition",
2944
+ transition: { kind: "replace-background" }
2945
+ },
2946
+ "background-on-hover-alpha": {
2947
+ classification: "unsupported-colour",
2948
+ reason: "alpha_requires_surface"
2949
+ },
2950
+ "fade-background": {
2951
+ classification: "unsupported-colour",
2952
+ reason: "changes_element_opacity"
2953
+ },
2954
+ "opacity-reduce": {
2955
+ classification: "unsupported-colour",
2956
+ reason: "changes_element_opacity"
2957
+ },
2958
+ "gradient-text": {
2959
+ classification: "unsupported-colour",
2960
+ reason: "changes_foreground"
2961
+ },
2962
+ "text-color-change": {
2963
+ classification: "unsupported-colour",
2964
+ reason: "changes_foreground"
2965
+ },
2966
+ "border-color-change": {
2967
+ classification: "unsupported-colour",
2968
+ reason: "changes_border"
2969
+ },
2970
+ "aurora-glow": {
2971
+ classification: "unsupported-background-overlay",
2972
+ reason: "unresolved_background_overlay"
2973
+ },
2974
+ "cosmic-stardust": {
2975
+ classification: "unsupported-background-overlay",
2976
+ reason: "unresolved_background_overlay"
2977
+ },
2978
+ "gradient-border-fill": {
2979
+ classification: "unsupported-background-overlay",
2980
+ reason: "unresolved_background_overlay"
2981
+ },
2982
+ "animated-gradient-border-fill": {
2983
+ classification: "unsupported-background-overlay",
2984
+ reason: "unresolved_background_overlay"
2985
+ },
2986
+ "nav-underline": {
2987
+ classification: "not-button",
2988
+ reason: "not_button_effect"
2989
+ },
2990
+ "nav-frosted-base": {
2991
+ classification: "not-button",
2992
+ reason: "not_button_effect"
2993
+ },
2994
+ "nav-frosted-hover": {
2995
+ classification: "not-button",
2996
+ reason: "not_button_effect"
2997
+ },
2998
+ "nav-frosted-active": {
2999
+ classification: "not-button",
3000
+ reason: "not_button_effect"
3001
+ },
3002
+ "animated-gradient": { classification: "non-colour" },
3003
+ "border-glow": { classification: "non-colour" },
3004
+ "drop-shadow": { classification: "non-colour" },
3005
+ "inner-shadow": { classification: "non-colour" },
3006
+ "neumorphic-shadow": { classification: "non-colour" },
3007
+ "outer-glow": { classification: "non-colour" },
3008
+ "retro-3d-shadow": { classification: "non-colour" },
3009
+ "scale-up": { classification: "non-colour" },
3010
+ "scale-down": { classification: "non-colour" },
3011
+ lift: { classification: "non-colour" },
3012
+ "press-down": { classification: "non-colour" },
3013
+ pop: { classification: "non-colour" },
3014
+ "border-bottom-grow": { classification: "non-colour" },
3015
+ "sketchy-border": { classification: "non-colour" },
3016
+ "pulse-animation": { classification: "non-colour" }
3017
+ };
3018
+ function getButtonEffectPolicy(effectId) {
3019
+ return Object.prototype.hasOwnProperty.call(BUTTON_EFFECT_POLICIES, effectId) ? BUTTON_EFFECT_POLICIES[effectId] : null;
3020
+ }
3021
+ function classifyButtonEffectId(effectId) {
3022
+ return getButtonEffectPolicy(effectId)?.classification ?? "unknown";
3023
+ }
3024
+ //#endregion
2920
3025
  //#region ../theme-core/src/buttons/types.ts
2921
3026
  /**
2922
3027
  * Standard semantic variant roles a theme exposes.
@@ -2933,6 +3038,20 @@ const VARIANT_ROLES = [
2933
3038
  "tertiary",
2934
3039
  "accent"
2935
3040
  ];
3041
+ function parseOpaqueButtonColourToken(value) {
3042
+ const token = parseThemeColorToken(value);
3043
+ if (token === null) return null;
3044
+ const parts = parseColorTokenParts(token);
3045
+ return parts.kind === "token" && parts.opacityPercent === null ? token : null;
3046
+ }
3047
+ function unsafeAsOpaqueButtonColourToken(value) {
3048
+ return value;
3049
+ }
3050
+ const opaqueButtonColourTokenSchema = themeColorTokenSchema.refine((value) => parseOpaqueButtonColourToken(value) !== null, "Button colour tokens must be opaque").transform((value) => {
3051
+ const token = parseOpaqueButtonColourToken(value);
3052
+ if (token === null) throw new Error("Invariant: opaque button token passed its schema");
3053
+ return token;
3054
+ });
2936
3055
  const cornerStyleSchema = z$1.enum([
2937
3056
  "square",
2938
3057
  "rounded",
@@ -3034,7 +3153,7 @@ const buttonSizesSchema = z$1.object({
3034
3153
  lg,
3035
3154
  xl: xl ?? lg
3036
3155
  }));
3037
- const buttonGlobalSettingsSchema = z$1.object({
3156
+ const canonicalButtonGlobalSettingsSchema = z$1.object({
3038
3157
  cornerStyle: cornerStyleSchema,
3039
3158
  cornerRadius: z$1.number().min(0).max(24).optional(),
3040
3159
  /**
@@ -3065,11 +3184,12 @@ const buttonGlobalSettingsSchema = z$1.object({
3065
3184
  paddingPreset: buttonPaddingPresetSchema.optional(),
3066
3185
  hoverTransform: hoverTransformSchema,
3067
3186
  hoverColor: hoverColorSchema,
3068
- hoverColorToken: themeColorTokenSchema.optional(),
3187
+ hoverColorToken: opaqueButtonColourTokenSchema.optional(),
3069
3188
  gradientStyle: gradientStyleSchema.optional(),
3070
3189
  gradientAngle: z$1.number().min(0).max(360).optional(),
3071
3190
  gradientSharpness: gradientSharpnessSchema.optional()
3072
3191
  });
3192
+ const buttonGlobalSettingsSchema = z$1.preprocess(normalizeLegacyButtonGlobalInput, canonicalButtonGlobalSettingsSchema);
3073
3193
  const gradientDirectionSchema$1 = z$1.enum([
3074
3194
  "to-r",
3075
3195
  "to-l",
@@ -3083,27 +3203,33 @@ const gradientDirectionSchema$1 = z$1.enum([
3083
3203
  const buttonBackgroundSchema = z$1.discriminatedUnion("type", [
3084
3204
  z$1.object({
3085
3205
  type: z$1.literal("solid"),
3086
- colorToken: themeColorTokenSchema
3206
+ colorToken: opaqueButtonColourTokenSchema
3087
3207
  }),
3088
3208
  z$1.object({
3089
3209
  type: z$1.literal("gradient"),
3090
- stops: z$1.array(themeColorTokenSchema).min(2),
3091
- direction: gradientDirectionSchema$1
3210
+ stops: z$1.array(opaqueButtonColourTokenSchema).min(2).transform((stops) => {
3211
+ const [first, second, ...rest] = stops;
3212
+ if (first === void 0 || second === void 0) throw new Error("Invariant: gradient stops passed the minimum length schema");
3213
+ return [
3214
+ first,
3215
+ second,
3216
+ ...rest
3217
+ ];
3218
+ }),
3219
+ direction: gradientDirectionSchema$1,
3220
+ foregroundToken: opaqueButtonColourTokenSchema
3092
3221
  }),
3093
- z$1.object({ type: z$1.literal("transparent") })
3222
+ z$1.object({
3223
+ type: z$1.literal("surface"),
3224
+ role: z$1.literal("link")
3225
+ })
3094
3226
  ]);
3095
3227
  const effectApplicationSchema$1 = z$1.object({
3096
3228
  effectId: z$1.string(),
3097
- options: z$1.record(z$1.string(), z$1.any()).optional()
3098
- });
3099
- const buttonBorderSchema = z$1.object({
3100
- widthClass: z$1.string(),
3101
- colorToken: themeColorTokenSchema
3102
- });
3103
- const buttonVariantAffordanceSchema = z$1.object({
3104
- iconId: z$1.string().min(1),
3105
- colorToken: themeColorTokenSchema.optional()
3229
+ options: z$1.record(z$1.string(), z$1.json()).optional()
3106
3230
  });
3231
+ const buttonBorderSchema = z$1.object({ widthClass: z$1.string() });
3232
+ const buttonVariantAffordanceSchema = z$1.object({ iconId: z$1.string().min(1) });
3107
3233
  const variantShadowSchema = z$1.object({
3108
3234
  elevation: z$1.enum([
3109
3235
  "none",
@@ -3144,27 +3270,170 @@ const variantSizeOverridesSchema = z$1.object({
3144
3270
  * default (e.g. link-style variants declaring zero horizontal padding at
3145
3271
  * every size).
3146
3272
  */
3147
- const buttonVariantSchema = z$1.object({
3273
+ const canonicalButtonVariantSchema = z$1.object({
3148
3274
  id: z$1.string(),
3149
3275
  name: z$1.string().min(1).max(20),
3150
3276
  enabled: z$1.boolean(),
3151
3277
  priority: prioritySchema,
3152
3278
  background: buttonBackgroundSchema,
3153
- textColorToken: themeColorTokenSchema,
3154
3279
  /** Tailwind radius token (e.g. `'rounded-md'`). Omit to inherit from `global.cornerStyle`. */
3155
3280
  borderRadius: z$1.string().optional(),
3156
3281
  shadow: variantShadowSchema.optional(),
3157
3282
  border: buttonBorderSchema.optional(),
3158
- hoverBackgroundToken: z$1.string().optional(),
3283
+ hoverBackgroundToken: opaqueButtonColourTokenSchema.optional(),
3159
3284
  effects: variantEffectsSchema.optional(),
3160
3285
  sizes: variantSizeOverridesSchema.optional(),
3161
3286
  affordance: buttonVariantAffordanceSchema.optional()
3162
3287
  });
3288
+ /**
3289
+ * Temporary persisted-theme admission boundary for issue #1206.
3290
+ *
3291
+ * Production inventory on 2026-07-22 found 22 rows using the old independent
3292
+ * `textColorToken`/border colour shape. New source and all downstream code use
3293
+ * only the canonical relationship. Delete this preprocessor after the reviewed
3294
+ * production rewrite reports zero legacy rows.
3295
+ */
3296
+ const buttonVariantSchema = z$1.preprocess(normalizeLegacyButtonVariantInput, canonicalButtonVariantSchema);
3163
3297
  const buttonSystemSchema = z$1.object({
3164
3298
  global: buttonGlobalSettingsSchema,
3165
3299
  variants: z$1.array(buttonVariantSchema).min(1).max(6),
3166
3300
  sizes: buttonSizesSchema.optional()
3167
3301
  });
3302
+ function normalizeLegacyButtonVariantInput(input) {
3303
+ if (!isUnknownRecord(input)) return input;
3304
+ const background = input.background;
3305
+ if (!isUnknownRecord(background)) return input;
3306
+ 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;
3307
+ const { textColorToken, ...withoutLegacyText } = input;
3308
+ const normalizedBorder = isUnknownRecord(input.border) && typeof input.border.widthClass === "string" ? { widthClass: input.border.widthClass } : input.border;
3309
+ const normalizedAffordance = isUnknownRecord(input.affordance) && typeof input.affordance.iconId === "string" ? { iconId: input.affordance.iconId } : input.affordance;
3310
+ const normalizedEffects = normalizeLegacyButtonEffects(input.effects, background.type);
3311
+ const hoverBackgroundToken = stripLegacyTokenAlpha(input.hoverBackgroundToken);
3312
+ if (background.type === "transparent") return {
3313
+ ...withoutLegacyText,
3314
+ background: {
3315
+ type: "surface",
3316
+ role: "link"
3317
+ },
3318
+ border: normalizedBorder,
3319
+ affordance: normalizedAffordance,
3320
+ effects: normalizedEffects,
3321
+ hoverBackgroundToken
3322
+ };
3323
+ if (background.type === "gradient") {
3324
+ const stops = Array.isArray(background.stops) ? background.stops.map(stripLegacyTokenAlpha) : background.stops;
3325
+ return {
3326
+ ...withoutLegacyText,
3327
+ background: {
3328
+ ...background,
3329
+ stops,
3330
+ foregroundToken: stripLegacyTokenAlpha(background.foregroundToken ?? textColorToken)
3331
+ },
3332
+ border: normalizedBorder,
3333
+ affordance: normalizedAffordance,
3334
+ effects: normalizedEffects,
3335
+ hoverBackgroundToken
3336
+ };
3337
+ }
3338
+ return {
3339
+ ...withoutLegacyText,
3340
+ background: background.type === "solid" ? {
3341
+ ...background,
3342
+ colorToken: stripLegacyTokenAlpha(background.colorToken)
3343
+ } : background,
3344
+ border: normalizedBorder,
3345
+ affordance: normalizedAffordance,
3346
+ effects: normalizedEffects,
3347
+ hoverBackgroundToken
3348
+ };
3349
+ }
3350
+ function normalizeLegacyButtonGlobalInput(input) {
3351
+ if (!isUnknownRecord(input)) return input;
3352
+ const hoverColorToken = stripLegacyTokenAlpha(input.hoverColorToken);
3353
+ return hoverColorToken === input.hoverColorToken ? input : {
3354
+ ...input,
3355
+ hoverColorToken
3356
+ };
3357
+ }
3358
+ function hasLegacyAlphaToken(input, background) {
3359
+ const stops = isUnknownArray(background.stops) ? background.stops : [];
3360
+ return [
3361
+ input.hoverBackgroundToken,
3362
+ background.colorToken,
3363
+ background.foregroundToken,
3364
+ ...stops
3365
+ ].some((token) => stripLegacyTokenAlpha(token) !== token);
3366
+ }
3367
+ function stripLegacyTokenAlpha(value) {
3368
+ if (typeof value !== "string") return value;
3369
+ const slashIndex = value.indexOf("/");
3370
+ return slashIndex < 0 ? value : value.slice(0, slashIndex);
3371
+ }
3372
+ function hasLegacyButtonEffects(input) {
3373
+ if (!isUnknownRecord(input)) return false;
3374
+ return [
3375
+ "base",
3376
+ "hover",
3377
+ "active",
3378
+ "focus"
3379
+ ].some((state) => {
3380
+ const effects = input[state];
3381
+ return Array.isArray(effects) && effects.some((effect) => {
3382
+ if (!isUnknownRecord(effect) || typeof effect.effectId !== "string") return true;
3383
+ const classification = classifyButtonEffectId(effect.effectId);
3384
+ if (classification !== "colour-transition" && classification !== "non-colour") return true;
3385
+ return effect.effectId === "background-on-hover" && isUnknownRecord(effect.options) && stripLegacyTokenAlpha(effect.options.colorToken) !== effect.options.colorToken;
3386
+ });
3387
+ });
3388
+ }
3389
+ function normalizeLegacyButtonEffects(input, backgroundType) {
3390
+ if (!isUnknownRecord(input)) return input;
3391
+ const normalized = {};
3392
+ for (const state of [
3393
+ "base",
3394
+ "hover",
3395
+ "active",
3396
+ "focus"
3397
+ ]) {
3398
+ const effects = input[state];
3399
+ if (!Array.isArray(effects)) continue;
3400
+ const safeEffects = effects.flatMap((effect) => {
3401
+ if (!isUnknownRecord(effect) || typeof effect.effectId !== "string") return [];
3402
+ const classification = classifyButtonEffectId(effect.effectId);
3403
+ if (classification === "non-colour") return [effect];
3404
+ if (classification !== "colour-transition") return [];
3405
+ if (effect.effectId === "background-on-hover") {
3406
+ const options = isUnknownRecord(effect.options) ? effect.options : null;
3407
+ const colorToken = options === null ? null : parseOpaqueButtonColourToken(stripLegacyTokenAlpha(options.colorToken));
3408
+ return colorToken === null ? [] : [{
3409
+ ...effect,
3410
+ options: {
3411
+ ...options,
3412
+ colorToken
3413
+ }
3414
+ }];
3415
+ }
3416
+ if (backgroundType !== "solid") return [];
3417
+ const rawAmount = isUnknownRecord(effect.options) ? effect.options.amount : void 0;
3418
+ const amount = typeof rawAmount === "number" && rawAmount > 0 ? Math.max(100, Math.round(rawAmount / 100) * 100) : 100;
3419
+ return [{
3420
+ ...effect,
3421
+ options: {
3422
+ ...isUnknownRecord(effect.options) ? effect.options : {},
3423
+ amount
3424
+ }
3425
+ }];
3426
+ });
3427
+ if (safeEffects.length > 0) normalized[state] = safeEffects;
3428
+ }
3429
+ return Object.keys(normalized).length === 0 ? void 0 : normalized;
3430
+ }
3431
+ function isUnknownRecord(value) {
3432
+ return typeof value === "object" && value !== null && !Array.isArray(value);
3433
+ }
3434
+ function isUnknownArray(value) {
3435
+ return Array.isArray(value);
3436
+ }
3168
3437
  buttonSizeNameSchema.options;
3169
3438
  //#endregion
3170
3439
  //#region ../theme-core/src/buttons/personalities/types.ts
@@ -3191,7 +3460,7 @@ function defineButtonPersonality(input) {
3191
3460
  name: input.name,
3192
3461
  description: input.description,
3193
3462
  tags: input.tags,
3194
- buttonSystem: input.buttonSystem
3463
+ buttonSystem: buttonSystemSchema.parse(input.buttonSystem)
3195
3464
  };
3196
3465
  }
3197
3466
  //#endregion
@@ -3244,19 +3513,15 @@ const brushedWash = defineButtonPersonality({
3244
3513
  background: {
3245
3514
  type: "gradient",
3246
3515
  stops: ["primary", "accent"],
3247
- direction: "to-r"
3516
+ direction: "to-r",
3517
+ foregroundToken: "primaryForeground"
3248
3518
  },
3249
- textColorToken: "primaryForeground",
3250
3519
  borderRadius: "rounded-lg",
3251
3520
  shadow: {
3252
3521
  elevation: "low",
3253
3522
  softness: "soft",
3254
3523
  position: "bottom"
3255
- },
3256
- effects: { hover: [{
3257
- effectId: "opacity-reduce",
3258
- options: { reduction: -15 }
3259
- }] }
3524
+ }
3260
3525
  },
3261
3526
  {
3262
3527
  id: "secondary",
@@ -3266,32 +3531,27 @@ const brushedWash = defineButtonPersonality({
3266
3531
  background: {
3267
3532
  type: "gradient",
3268
3533
  stops: ["secondary", "accent"],
3269
- direction: "to-br"
3534
+ direction: "to-br",
3535
+ foregroundToken: "primaryForeground"
3270
3536
  },
3271
- textColorToken: "primaryForeground",
3272
3537
  borderRadius: "rounded-lg",
3273
3538
  shadow: {
3274
3539
  elevation: "low",
3275
3540
  softness: "soft",
3276
3541
  position: "bottom"
3277
- },
3278
- effects: { hover: [{
3279
- effectId: "opacity-reduce",
3280
- options: { reduction: -15 }
3281
- }] }
3542
+ }
3282
3543
  },
3283
3544
  {
3284
3545
  id: "outline",
3285
3546
  name: "Outline",
3286
3547
  enabled: true,
3287
3548
  priority: 3,
3288
- background: { type: "transparent" },
3289
- textColorToken: "primary",
3290
- borderRadius: "rounded-lg",
3291
- border: {
3292
- widthClass: "border",
3293
- colorToken: "primary"
3549
+ background: {
3550
+ type: "surface",
3551
+ role: "link"
3294
3552
  },
3553
+ borderRadius: "rounded-lg",
3554
+ border: { widthClass: "border" },
3295
3555
  effects: { hover: [{
3296
3556
  effectId: "background-on-hover",
3297
3557
  options: { colorToken: "surface" }
@@ -3302,8 +3562,10 @@ const brushedWash = defineButtonPersonality({
3302
3562
  name: "Ghost",
3303
3563
  enabled: true,
3304
3564
  priority: 3,
3305
- background: { type: "transparent" },
3306
- textColorToken: "text",
3565
+ background: {
3566
+ type: "surface",
3567
+ role: "link"
3568
+ },
3307
3569
  borderRadius: "rounded-lg",
3308
3570
  effects: { hover: [{
3309
3571
  effectId: "background-on-hover",
@@ -3349,7 +3611,6 @@ const confidentChip = defineButtonPersonality({
3349
3611
  type: "solid",
3350
3612
  colorToken: "primary"
3351
3613
  },
3352
- textColorToken: "primaryForeground",
3353
3614
  borderRadius: "rounded-md",
3354
3615
  shadow: {
3355
3616
  elevation: "medium",
@@ -3359,7 +3620,7 @@ const confidentChip = defineButtonPersonality({
3359
3620
  effects: {
3360
3621
  hover: [{
3361
3622
  effectId: "darken-background",
3362
- options: { amount: 60 }
3623
+ options: { amount: 100 }
3363
3624
  }],
3364
3625
  active: [{
3365
3626
  effectId: "scale-down",
@@ -3376,12 +3637,8 @@ const confidentChip = defineButtonPersonality({
3376
3637
  type: "solid",
3377
3638
  colorToken: "surface"
3378
3639
  },
3379
- textColorToken: "text",
3380
3640
  borderRadius: "rounded-md",
3381
- border: {
3382
- widthClass: "border",
3383
- colorToken: "border"
3384
- },
3641
+ border: { widthClass: "border" },
3385
3642
  effects: { hover: [{
3386
3643
  effectId: "background-on-hover",
3387
3644
  options: { colorToken: "background" }
@@ -3392,13 +3649,12 @@ const confidentChip = defineButtonPersonality({
3392
3649
  name: "Outline",
3393
3650
  enabled: true,
3394
3651
  priority: 3,
3395
- background: { type: "transparent" },
3396
- textColorToken: "primary",
3397
- borderRadius: "rounded-md",
3398
- border: {
3399
- widthClass: "border",
3400
- colorToken: "primary"
3652
+ background: {
3653
+ type: "surface",
3654
+ role: "link"
3401
3655
  },
3656
+ borderRadius: "rounded-md",
3657
+ border: { widthClass: "border" },
3402
3658
  effects: { hover: [{
3403
3659
  effectId: "background-on-hover",
3404
3660
  options: { colorToken: "surface" }
@@ -3409,8 +3665,10 @@ const confidentChip = defineButtonPersonality({
3409
3665
  name: "Ghost",
3410
3666
  enabled: true,
3411
3667
  priority: 3,
3412
- background: { type: "transparent" },
3413
- textColorToken: "primary",
3668
+ background: {
3669
+ type: "surface",
3670
+ role: "link"
3671
+ },
3414
3672
  borderRadius: "rounded-md",
3415
3673
  effects: { hover: [{
3416
3674
  effectId: "background-on-hover",
@@ -3473,7 +3731,6 @@ const earthPill = defineButtonPersonality({
3473
3731
  type: "solid",
3474
3732
  colorToken: "primary"
3475
3733
  },
3476
- textColorToken: "primaryForeground",
3477
3734
  borderRadius: "rounded-full",
3478
3735
  shadow: {
3479
3736
  elevation: "low",
@@ -3499,13 +3756,12 @@ const earthPill = defineButtonPersonality({
3499
3756
  name: "Secondary",
3500
3757
  enabled: true,
3501
3758
  priority: 2,
3502
- background: { type: "transparent" },
3503
- textColorToken: "primary",
3504
- borderRadius: "rounded-full",
3505
- border: {
3506
- widthClass: "border",
3507
- colorToken: "primary"
3759
+ background: {
3760
+ type: "surface",
3761
+ role: "link"
3508
3762
  },
3763
+ borderRadius: "rounded-full",
3764
+ border: { widthClass: "border" },
3509
3765
  effects: { hover: [{
3510
3766
  effectId: "background-on-hover",
3511
3767
  options: { colorToken: "muted" }
@@ -3516,13 +3772,12 @@ const earthPill = defineButtonPersonality({
3516
3772
  name: "Outline",
3517
3773
  enabled: true,
3518
3774
  priority: 3,
3519
- background: { type: "transparent" },
3520
- textColorToken: "text",
3521
- borderRadius: "rounded-full",
3522
- border: {
3523
- widthClass: "border",
3524
- colorToken: "border"
3775
+ background: {
3776
+ type: "surface",
3777
+ role: "link"
3525
3778
  },
3779
+ borderRadius: "rounded-full",
3780
+ border: { widthClass: "border" },
3526
3781
  effects: { hover: [{
3527
3782
  effectId: "background-on-hover",
3528
3783
  options: { colorToken: "surfaceAlt" }
@@ -3533,8 +3788,10 @@ const earthPill = defineButtonPersonality({
3533
3788
  name: "Ghost",
3534
3789
  enabled: true,
3535
3790
  priority: 3,
3536
- background: { type: "transparent" },
3537
- textColorToken: "primary",
3791
+ background: {
3792
+ type: "surface",
3793
+ role: "link"
3794
+ },
3538
3795
  borderRadius: "rounded-full",
3539
3796
  shadow: {
3540
3797
  elevation: "none",
@@ -3555,11 +3812,7 @@ const earthPill = defineButtonPersonality({
3555
3812
  padding: "0.625rem 0",
3556
3813
  fontSize: "text-xl"
3557
3814
  }
3558
- },
3559
- effects: { hover: [{
3560
- effectId: "opacity-reduce",
3561
- options: { reduction: 25 }
3562
- }] }
3815
+ }
3563
3816
  }
3564
3817
  ]
3565
3818
  }
@@ -3595,8 +3848,10 @@ const editorialLink = defineButtonPersonality({
3595
3848
  name: "Primary",
3596
3849
  enabled: true,
3597
3850
  priority: 1,
3598
- background: { type: "transparent" },
3599
- textColorToken: "text",
3851
+ background: {
3852
+ type: "surface",
3853
+ role: "link"
3854
+ },
3600
3855
  borderRadius: "rounded-none",
3601
3856
  sizes: {
3602
3857
  sm: { padding: "0.25rem 0" },
@@ -3618,8 +3873,10 @@ const editorialLink = defineButtonPersonality({
3618
3873
  name: "Secondary",
3619
3874
  enabled: true,
3620
3875
  priority: 2,
3621
- background: { type: "transparent" },
3622
- textColorToken: "mutedText",
3876
+ background: {
3877
+ type: "surface",
3878
+ role: "link"
3879
+ },
3623
3880
  borderRadius: "rounded-none",
3624
3881
  sizes: {
3625
3882
  sm: { padding: "0.25rem 0" },
@@ -3641,8 +3898,10 @@ const editorialLink = defineButtonPersonality({
3641
3898
  name: "Outline",
3642
3899
  enabled: true,
3643
3900
  priority: 3,
3644
- background: { type: "transparent" },
3645
- textColorToken: "accent",
3901
+ background: {
3902
+ type: "surface",
3903
+ role: "link"
3904
+ },
3646
3905
  borderRadius: "rounded-none",
3647
3906
  sizes: {
3648
3907
  sm: { padding: "0.25rem 0" },
@@ -3664,19 +3923,17 @@ const editorialLink = defineButtonPersonality({
3664
3923
  name: "Ghost",
3665
3924
  enabled: true,
3666
3925
  priority: 3,
3667
- background: { type: "transparent" },
3668
- textColorToken: "mutedText",
3926
+ background: {
3927
+ type: "surface",
3928
+ role: "link"
3929
+ },
3669
3930
  borderRadius: "rounded-none",
3670
3931
  sizes: {
3671
3932
  sm: { padding: "0.25rem 0" },
3672
3933
  md: { padding: "0.5rem 0" },
3673
3934
  lg: { padding: "0.625rem 0" },
3674
3935
  xl: { padding: "0.75rem 0" }
3675
- },
3676
- effects: { hover: [{
3677
- effectId: "opacity-reduce",
3678
- options: { reduction: -20 }
3679
- }] }
3936
+ }
3680
3937
  }
3681
3938
  ]
3682
3939
  }
@@ -3738,12 +3995,8 @@ const flatInk = defineButtonPersonality({
3738
3995
  type: "solid",
3739
3996
  colorToken: "primary"
3740
3997
  },
3741
- textColorToken: "primaryForeground",
3742
3998
  borderRadius: "rounded-lg",
3743
- affordance: {
3744
- iconId: "ArrowRight",
3745
- colorToken: "accent"
3746
- },
3999
+ affordance: { iconId: "ArrowRight" },
3747
4000
  effects: { hover: [{
3748
4001
  effectId: "lift",
3749
4002
  options: { translateY: "-2px" }
@@ -3757,13 +4010,12 @@ const flatInk = defineButtonPersonality({
3757
4010
  name: "Secondary",
3758
4011
  enabled: true,
3759
4012
  priority: 2,
3760
- background: { type: "transparent" },
3761
- textColorToken: "primary",
3762
- borderRadius: "rounded-lg",
3763
- border: {
3764
- widthClass: "border",
3765
- colorToken: "border"
4013
+ background: {
4014
+ type: "surface",
4015
+ role: "link"
3766
4016
  },
4017
+ borderRadius: "rounded-lg",
4018
+ border: { widthClass: "border" },
3767
4019
  effects: { hover: [{
3768
4020
  effectId: "lift",
3769
4021
  options: { translateY: "-2px" }
@@ -3781,12 +4033,8 @@ const flatInk = defineButtonPersonality({
3781
4033
  type: "solid",
3782
4034
  colorToken: "accent"
3783
4035
  },
3784
- textColorToken: "accentForeground",
3785
4036
  borderRadius: "rounded-lg",
3786
- affordance: {
3787
- iconId: "ArrowRight",
3788
- colorToken: "accentForeground"
3789
- },
4037
+ affordance: { iconId: "ArrowRight" },
3790
4038
  effects: { hover: [{
3791
4039
  effectId: "lift",
3792
4040
  options: { translateY: "-2px" }
@@ -3849,7 +4097,6 @@ const inkStamp = defineButtonPersonality({
3849
4097
  type: "solid",
3850
4098
  colorToken: "primary"
3851
4099
  },
3852
- textColorToken: "primaryForeground",
3853
4100
  borderRadius: "rounded-md",
3854
4101
  effects: {
3855
4102
  hover: [{
@@ -3870,13 +4117,12 @@ const inkStamp = defineButtonPersonality({
3870
4117
  name: "Secondary",
3871
4118
  enabled: true,
3872
4119
  priority: 2,
3873
- background: { type: "transparent" },
3874
- textColorToken: "primary",
3875
- borderRadius: "rounded-md",
3876
- border: {
3877
- widthClass: "border-2",
3878
- colorToken: "primary"
4120
+ background: {
4121
+ type: "surface",
4122
+ role: "link"
3879
4123
  },
4124
+ borderRadius: "rounded-md",
4125
+ border: { widthClass: "border-2" },
3880
4126
  effects: { hover: [{
3881
4127
  effectId: "background-on-hover",
3882
4128
  options: { colorToken: "surface" }
@@ -3887,13 +4133,12 @@ const inkStamp = defineButtonPersonality({
3887
4133
  name: "Outline",
3888
4134
  enabled: true,
3889
4135
  priority: 3,
3890
- background: { type: "transparent" },
3891
- textColorToken: "text",
3892
- borderRadius: "rounded-md",
3893
- border: {
3894
- widthClass: "border-2",
3895
- colorToken: "border"
4136
+ background: {
4137
+ type: "surface",
4138
+ role: "link"
3896
4139
  },
4140
+ borderRadius: "rounded-md",
4141
+ border: { widthClass: "border-2" },
3897
4142
  effects: { hover: [{
3898
4143
  effectId: "background-on-hover",
3899
4144
  options: { colorToken: "surface" }
@@ -3904,8 +4149,10 @@ const inkStamp = defineButtonPersonality({
3904
4149
  name: "Ghost",
3905
4150
  enabled: true,
3906
4151
  priority: 3,
3907
- background: { type: "transparent" },
3908
- textColorToken: "accent",
4152
+ background: {
4153
+ type: "surface",
4154
+ role: "link"
4155
+ },
3909
4156
  borderRadius: "rounded-none",
3910
4157
  sizes: {
3911
4158
  sm: {
@@ -3998,7 +4245,6 @@ const joyStamp = defineButtonPersonality({
3998
4245
  type: "solid",
3999
4246
  colorToken: "primary"
4000
4247
  },
4001
- textColorToken: "primaryForeground",
4002
4248
  borderRadius: "rounded-full",
4003
4249
  shadow: {
4004
4250
  elevation: "high",
@@ -4012,13 +4258,12 @@ const joyStamp = defineButtonPersonality({
4012
4258
  name: "Secondary",
4013
4259
  enabled: true,
4014
4260
  priority: 2,
4015
- background: { type: "transparent" },
4016
- textColorToken: "text",
4017
- borderRadius: "rounded-full",
4018
- border: {
4019
- widthClass: "border-2",
4020
- colorToken: "text"
4261
+ background: {
4262
+ type: "surface",
4263
+ role: "link"
4021
4264
  },
4265
+ borderRadius: "rounded-full",
4266
+ border: { widthClass: "border-2" },
4022
4267
  shadow: {
4023
4268
  elevation: "high",
4024
4269
  softness: "hard",
@@ -4083,12 +4328,8 @@ const ornateRitual = defineButtonPersonality({
4083
4328
  type: "solid",
4084
4329
  colorToken: "primary"
4085
4330
  },
4086
- textColorToken: "primaryForeground",
4087
4331
  borderRadius: "rounded-md",
4088
- border: {
4089
- widthClass: "border",
4090
- colorToken: "primary"
4091
- },
4332
+ border: { widthClass: "border" },
4092
4333
  effects: {
4093
4334
  hover: [{
4094
4335
  effectId: "background-on-hover",
@@ -4109,12 +4350,8 @@ const ornateRitual = defineButtonPersonality({
4109
4350
  type: "solid",
4110
4351
  colorToken: "secondary"
4111
4352
  },
4112
- textColorToken: "primaryForeground",
4113
4353
  borderRadius: "rounded-md",
4114
- border: {
4115
- widthClass: "border",
4116
- colorToken: "primary"
4117
- },
4354
+ border: { widthClass: "border" },
4118
4355
  effects: { hover: [{
4119
4356
  effectId: "background-on-hover",
4120
4357
  options: { colorToken: "surface" }
@@ -4125,13 +4362,12 @@ const ornateRitual = defineButtonPersonality({
4125
4362
  name: "Outline",
4126
4363
  enabled: true,
4127
4364
  priority: 3,
4128
- background: { type: "transparent" },
4129
- textColorToken: "primary",
4130
- borderRadius: "rounded-md",
4131
- border: {
4132
- widthClass: "border",
4133
- colorToken: "primary"
4365
+ background: {
4366
+ type: "surface",
4367
+ role: "link"
4134
4368
  },
4369
+ borderRadius: "rounded-md",
4370
+ border: { widthClass: "border" },
4135
4371
  effects: { hover: [{
4136
4372
  effectId: "background-on-hover",
4137
4373
  options: { colorToken: "muted" }
@@ -4142,8 +4378,10 @@ const ornateRitual = defineButtonPersonality({
4142
4378
  name: "Ghost",
4143
4379
  enabled: true,
4144
4380
  priority: 3,
4145
- background: { type: "transparent" },
4146
- textColorToken: "accent",
4381
+ background: {
4382
+ type: "surface",
4383
+ role: "link"
4384
+ },
4147
4385
  borderRadius: "rounded-none",
4148
4386
  sizes: {
4149
4387
  sm: {
@@ -4225,14 +4463,10 @@ const pebble = defineButtonPersonality({
4225
4463
  type: "solid",
4226
4464
  colorToken: "primary"
4227
4465
  },
4228
- textColorToken: "primaryForeground",
4229
4466
  borderRadius: "rounded-full",
4230
4467
  effects: { hover: [{
4231
- effectId: "background-on-hover-alpha",
4232
- options: {
4233
- colorToken: "primary",
4234
- opacity: 88
4235
- }
4468
+ effectId: "darken-background",
4469
+ options: { amount: 100 }
4236
4470
  }] }
4237
4471
  },
4238
4472
  {
@@ -4240,13 +4474,12 @@ const pebble = defineButtonPersonality({
4240
4474
  name: "Secondary",
4241
4475
  enabled: true,
4242
4476
  priority: 2,
4243
- background: { type: "transparent" },
4244
- textColorToken: "primary",
4245
- borderRadius: "rounded-full",
4246
- border: {
4247
- widthClass: "border-2",
4248
- colorToken: "accent"
4477
+ background: {
4478
+ type: "surface",
4479
+ role: "link"
4249
4480
  },
4481
+ borderRadius: "rounded-full",
4482
+ border: { widthClass: "border-2" },
4250
4483
  effects: { hover: [{
4251
4484
  effectId: "background-on-hover",
4252
4485
  options: { colorToken: "accent" }
@@ -4257,13 +4490,12 @@ const pebble = defineButtonPersonality({
4257
4490
  name: "Outline",
4258
4491
  enabled: true,
4259
4492
  priority: 3,
4260
- background: { type: "transparent" },
4261
- textColorToken: "text",
4262
- borderRadius: "rounded-full",
4263
- border: {
4264
- widthClass: "border",
4265
- colorToken: "border"
4493
+ background: {
4494
+ type: "surface",
4495
+ role: "link"
4266
4496
  },
4497
+ borderRadius: "rounded-full",
4498
+ border: { widthClass: "border" },
4267
4499
  effects: { hover: [{
4268
4500
  effectId: "background-on-hover",
4269
4501
  options: { colorToken: "surface" }
@@ -4274,8 +4506,10 @@ const pebble = defineButtonPersonality({
4274
4506
  name: "Ghost",
4275
4507
  enabled: true,
4276
4508
  priority: 3,
4277
- background: { type: "transparent" },
4278
- textColorToken: "primary",
4509
+ background: {
4510
+ type: "surface",
4511
+ role: "link"
4512
+ },
4279
4513
  borderRadius: "rounded-full",
4280
4514
  sizes: {
4281
4515
  sm: {
@@ -4291,11 +4525,7 @@ const pebble = defineButtonPersonality({
4291
4525
  padding: "0.75rem 1.5rem",
4292
4526
  fontSize: "text-xl"
4293
4527
  }
4294
- },
4295
- effects: { hover: [{
4296
- effectId: "opacity-reduce",
4297
- options: { reduction: 30 }
4298
- }] }
4528
+ }
4299
4529
  }
4300
4530
  ]
4301
4531
  }
@@ -4357,15 +4587,11 @@ const quietArrow = defineButtonPersonality({
4357
4587
  type: "solid",
4358
4588
  colorToken: "primary"
4359
4589
  },
4360
- textColorToken: "primaryForeground",
4361
4590
  borderRadius: "rounded-xl",
4362
4591
  affordance: { iconId: "ArrowRight" },
4363
4592
  effects: { hover: [{
4364
- effectId: "background-on-hover-alpha",
4365
- options: {
4366
- colorToken: "primary",
4367
- opacity: 90
4368
- }
4593
+ effectId: "darken-background",
4594
+ options: { amount: 100 }
4369
4595
  }] }
4370
4596
  },
4371
4597
  {
@@ -4373,13 +4599,12 @@ const quietArrow = defineButtonPersonality({
4373
4599
  name: "Secondary",
4374
4600
  enabled: true,
4375
4601
  priority: 2,
4376
- background: { type: "transparent" },
4377
- textColorToken: "primary",
4378
- borderRadius: "rounded-xl",
4379
- border: {
4380
- widthClass: "border",
4381
- colorToken: "primary"
4602
+ background: {
4603
+ type: "surface",
4604
+ role: "link"
4382
4605
  },
4606
+ borderRadius: "rounded-xl",
4607
+ border: { widthClass: "border" },
4383
4608
  affordance: { iconId: "ArrowRight" },
4384
4609
  effects: { hover: [{
4385
4610
  effectId: "background-on-hover",
@@ -4391,21 +4616,22 @@ const quietArrow = defineButtonPersonality({
4391
4616
  name: "Outline",
4392
4617
  enabled: true,
4393
4618
  priority: 3,
4394
- background: { type: "transparent" },
4395
- textColorToken: "primary",
4619
+ background: {
4620
+ type: "surface",
4621
+ role: "link"
4622
+ },
4396
4623
  borderRadius: "rounded-xl",
4397
- border: {
4398
- widthClass: "border",
4399
- colorToken: "primary"
4400
- }
4624
+ border: { widthClass: "border" }
4401
4625
  },
4402
4626
  {
4403
4627
  id: "ghost",
4404
4628
  name: "Ghost",
4405
4629
  enabled: true,
4406
4630
  priority: 3,
4407
- background: { type: "transparent" },
4408
- textColorToken: "primary",
4631
+ background: {
4632
+ type: "surface",
4633
+ role: "link"
4634
+ },
4409
4635
  borderRadius: "rounded-xl"
4410
4636
  }
4411
4637
  ]
@@ -4469,7 +4695,6 @@ const showtimePill = defineButtonPersonality({
4469
4695
  type: "solid",
4470
4696
  colorToken: "primary"
4471
4697
  },
4472
- textColorToken: "background",
4473
4698
  borderRadius: "rounded-full",
4474
4699
  effects: { hover: [{ effectId: "pop" }] }
4475
4700
  },
@@ -4478,13 +4703,12 @@ const showtimePill = defineButtonPersonality({
4478
4703
  name: "Secondary",
4479
4704
  enabled: true,
4480
4705
  priority: 2,
4481
- background: { type: "transparent" },
4482
- textColorToken: "primary",
4483
- borderRadius: "rounded-full",
4484
- border: {
4485
- widthClass: "border-2",
4486
- colorToken: "primary"
4706
+ background: {
4707
+ type: "surface",
4708
+ role: "link"
4487
4709
  },
4710
+ borderRadius: "rounded-full",
4711
+ border: { widthClass: "border-2" },
4488
4712
  effects: { hover: [{ effectId: "pop" }] }
4489
4713
  },
4490
4714
  {
@@ -4496,7 +4720,6 @@ const showtimePill = defineButtonPersonality({
4496
4720
  type: "solid",
4497
4721
  colorToken: "secondary"
4498
4722
  },
4499
- textColorToken: "primary",
4500
4723
  borderRadius: "rounded-full",
4501
4724
  effects: { hover: [{ effectId: "pop" }] }
4502
4725
  },
@@ -4509,12 +4732,8 @@ const showtimePill = defineButtonPersonality({
4509
4732
  type: "solid",
4510
4733
  colorToken: "background"
4511
4734
  },
4512
- textColorToken: "primary",
4513
4735
  borderRadius: "rounded-full",
4514
- border: {
4515
- widthClass: "border-2",
4516
- colorToken: "primary"
4517
- },
4736
+ border: { widthClass: "border-2" },
4518
4737
  effects: { hover: [{
4519
4738
  effectId: "background-on-hover",
4520
4739
  options: { colorToken: "surface" }
@@ -4525,13 +4744,12 @@ const showtimePill = defineButtonPersonality({
4525
4744
  name: "Outline",
4526
4745
  enabled: true,
4527
4746
  priority: 3,
4528
- background: { type: "transparent" },
4529
- textColorToken: "primary",
4530
- borderRadius: "rounded-full",
4531
- border: {
4532
- widthClass: "border-2",
4533
- colorToken: "primary"
4747
+ background: {
4748
+ type: "surface",
4749
+ role: "link"
4534
4750
  },
4751
+ borderRadius: "rounded-full",
4752
+ border: { widthClass: "border-2" },
4535
4753
  effects: { hover: [{
4536
4754
  effectId: "background-on-hover",
4537
4755
  options: { colorToken: "background" }
@@ -4542,8 +4760,10 @@ const showtimePill = defineButtonPersonality({
4542
4760
  name: "Ghost",
4543
4761
  enabled: true,
4544
4762
  priority: 3,
4545
- background: { type: "transparent" },
4546
- textColorToken: "primary",
4763
+ background: {
4764
+ type: "surface",
4765
+ role: "link"
4766
+ },
4547
4767
  borderRadius: "rounded-full",
4548
4768
  effects: { hover: [{
4549
4769
  effectId: "background-on-hover",
@@ -4554,104 +4774,151 @@ const showtimePill = defineButtonPersonality({
4554
4774
  }
4555
4775
  });
4556
4776
  //#endregion
4557
- //#region ../theme-core/src/buttons/personalities/index.ts
4558
- const buttonPersonalities = [
4559
- defineButtonPersonality({
4560
- id: "soft-pill",
4561
- name: "Soft Pill",
4562
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
4563
- tags: {
4564
- tone: "classic",
4565
- energy: "calm",
4566
- motion: "subtle",
4567
- era: "organic"
4777
+ //#region ../theme-core/src/buttons/personalities/soft-pill.ts
4778
+ /**
4779
+ * Soft Pill — rounded-full pill buttons with a hover lift. The default for
4780
+ * Calm Studio and Modern Wellness; reads as quietly modern and welcoming.
4781
+ */
4782
+ const softPill = defineButtonPersonality({
4783
+ id: "soft-pill",
4784
+ name: "Soft Pill",
4785
+ description: "Rounded pills with a gentle lift on hover. Quietly modern.",
4786
+ tags: {
4787
+ tone: "classic",
4788
+ energy: "calm",
4789
+ motion: "subtle",
4790
+ era: "organic"
4791
+ },
4792
+ buttonSystem: {
4793
+ global: {
4794
+ cornerStyle: "pill",
4795
+ shadow: "low",
4796
+ textTransform: "none",
4797
+ fontWeight: 500,
4798
+ borderWidth: 2,
4799
+ hoverTransform: "lift",
4800
+ hoverColor: "none"
4568
4801
  },
4569
- buttonSystem: {
4570
- global: {
4571
- cornerStyle: "pill",
4572
- shadow: "low",
4573
- textTransform: "none",
4574
- fontWeight: 500,
4575
- borderWidth: 2,
4576
- hoverTransform: "lift",
4577
- hoverColor: "none"
4802
+ variants: [
4803
+ {
4804
+ id: "primary",
4805
+ name: "Primary",
4806
+ enabled: true,
4807
+ priority: 1,
4808
+ background: {
4809
+ type: "solid",
4810
+ colorToken: "primary"
4811
+ },
4812
+ borderRadius: "rounded-full",
4813
+ shadow: {
4814
+ elevation: "low",
4815
+ softness: "soft",
4816
+ position: "bottom"
4817
+ },
4818
+ effects: {
4819
+ hover: [{
4820
+ effectId: "lift",
4821
+ options: { translateY: "-1px" }
4822
+ }],
4823
+ active: [{
4824
+ effectId: "scale-down",
4825
+ options: { scale: "0.98" }
4826
+ }]
4827
+ }
4578
4828
  },
4579
- variants: [
4580
- {
4581
- id: "primary",
4582
- name: "Primary",
4583
- enabled: true,
4584
- priority: 1,
4585
- background: {
4586
- type: "solid",
4587
- colorToken: "primary"
4588
- },
4589
- textColorToken: "primaryForeground",
4590
- borderRadius: "rounded-full",
4591
- shadow: {
4592
- elevation: "low",
4593
- softness: "soft",
4594
- position: "bottom"
4595
- },
4596
- effects: {
4597
- hover: [{
4598
- effectId: "lift",
4599
- options: { translateY: "-1px" }
4600
- }],
4601
- active: [{
4602
- effectId: "scale-down",
4603
- options: { scale: "0.98" }
4604
- }]
4605
- }
4829
+ {
4830
+ id: "secondary",
4831
+ name: "Secondary",
4832
+ enabled: true,
4833
+ priority: 2,
4834
+ background: {
4835
+ type: "surface",
4836
+ role: "link"
4606
4837
  },
4607
- {
4608
- id: "secondary",
4609
- name: "Secondary",
4610
- enabled: true,
4611
- priority: 2,
4612
- background: { type: "transparent" },
4613
- textColorToken: "primary",
4614
- borderRadius: "rounded-full",
4615
- border: {
4616
- widthClass: "border-2",
4617
- colorToken: "primary"
4618
- },
4619
- effects: { hover: [{
4620
- effectId: "background-on-hover",
4621
- options: { colorToken: "surface" }
4622
- }] }
4838
+ borderRadius: "rounded-full",
4839
+ border: { widthClass: "border-2" },
4840
+ effects: { hover: [{
4841
+ effectId: "background-on-hover",
4842
+ options: { colorToken: "surface" }
4843
+ }] }
4844
+ },
4845
+ {
4846
+ id: "outline",
4847
+ name: "Outline",
4848
+ enabled: true,
4849
+ priority: 3,
4850
+ background: {
4851
+ type: "surface",
4852
+ role: "link"
4623
4853
  },
4624
- {
4625
- id: "outline",
4626
- name: "Outline",
4627
- enabled: true,
4628
- priority: 3,
4629
- background: { type: "transparent" },
4630
- textColorToken: "text",
4631
- borderRadius: "rounded-full",
4632
- border: {
4633
- widthClass: "border",
4634
- colorToken: "border"
4635
- },
4636
- effects: { hover: [{
4637
- effectId: "background-on-hover",
4638
- options: { colorToken: "surface" }
4639
- }] }
4854
+ borderRadius: "rounded-full",
4855
+ border: { widthClass: "border" },
4856
+ effects: { hover: [{
4857
+ effectId: "background-on-hover",
4858
+ options: { colorToken: "surface" }
4859
+ }] }
4860
+ },
4861
+ {
4862
+ id: "ghost",
4863
+ name: "Ghost",
4864
+ enabled: true,
4865
+ priority: 3,
4866
+ background: {
4867
+ type: "surface",
4868
+ role: "link"
4640
4869
  },
4641
- {
4642
- id: "ghost",
4643
- name: "Ghost",
4644
- enabled: true,
4645
- priority: 3,
4646
- background: { type: "transparent" },
4647
- textColorToken: "text",
4648
- borderRadius: "rounded-full",
4649
- effects: { hover: [{
4650
- effectId: "background-on-hover",
4651
- options: { colorToken: "surface" }
4652
- }] }
4653
- }
4654
- ]
4870
+ borderRadius: "rounded-full",
4871
+ effects: { hover: [{
4872
+ effectId: "background-on-hover",
4873
+ options: { colorToken: "surface" }
4874
+ }] }
4875
+ }
4876
+ ]
4877
+ }
4878
+ });
4879
+ //#endregion
4880
+ //#region ../theme-core/src/buttons/personalities/two-tone-pill.ts
4881
+ const solidSecondary = {
4882
+ id: "secondary",
4883
+ name: "Secondary",
4884
+ enabled: true,
4885
+ priority: 2,
4886
+ background: {
4887
+ type: "solid",
4888
+ colorToken: unsafeAsOpaqueButtonColourToken("secondary")
4889
+ },
4890
+ borderRadius: "rounded-full",
4891
+ shadow: {
4892
+ elevation: "none",
4893
+ softness: null,
4894
+ position: "bottom"
4895
+ },
4896
+ effects: {
4897
+ hover: [{
4898
+ effectId: "background-on-hover-alpha",
4899
+ options: {
4900
+ colorToken: "secondary",
4901
+ opacity: 88
4902
+ }
4903
+ }],
4904
+ active: [{
4905
+ effectId: "scale-down",
4906
+ options: { scale: "0.98" }
4907
+ }]
4908
+ }
4909
+ };
4910
+ //#endregion
4911
+ //#region ../theme-core/src/buttons/personalities/index.ts
4912
+ const buttonPersonalities = [
4913
+ softPill,
4914
+ defineButtonPersonality({
4915
+ id: "two-tone-pill",
4916
+ name: "Two-tone Pill",
4917
+ description: "Rounded pills with distinct solid primary and secondary brand colours.",
4918
+ tags: softPill.tags,
4919
+ buttonSystem: {
4920
+ ...softPill.buttonSystem,
4921
+ variants: softPill.buttonSystem.variants.map((variant) => variant.id === "secondary" ? solidSecondary : variant)
4655
4922
  }
4656
4923
  }),
4657
4924
  earthPill,
@@ -4667,6 +4934,27 @@ const buttonPersonalities = [
4667
4934
  quietArrow
4668
4935
  ];
4669
4936
  new Map(buttonPersonalities.map((p) => [p.id, p]));
4937
+ buttonPersonalities.map((personality) => ({
4938
+ id: personality.id,
4939
+ name: personality.name,
4940
+ description: personality.description,
4941
+ category: presetCategory(personality),
4942
+ buttonSystem: personality.buttonSystem,
4943
+ compatibility: {
4944
+ ...personality.tags.tone ? { tones: [personality.tags.tone] } : {},
4945
+ ...personality.tags.energy ? { energies: [personality.tags.energy] } : {}
4946
+ }
4947
+ }));
4948
+ function presetCategory(personality) {
4949
+ switch (personality.tags.era) {
4950
+ case "retro": return "retro";
4951
+ case "editorial": return "minimal";
4952
+ case "organic": return "artistic";
4953
+ case "modern": return personality.tags.tone === "bold" ? "modern" : "technical";
4954
+ case "technical": return "technical";
4955
+ case void 0: return "modern";
4956
+ }
4957
+ }
4670
4958
  //#endregion
4671
4959
  //#region ../theme-core/src/cards/types.ts
4672
4960
  const cardVariantRoleValues = ["default", "alternative"];
@@ -6110,6 +6398,7 @@ const navFontWeight = z$1.enum([
6110
6398
  "bold"
6111
6399
  ]);
6112
6400
  const headerMaxWidth = z$1.enum(["container", "full"]);
6401
+ const headerBarFrame = z$1.enum(["full-bleed", "inset-shell"]);
6113
6402
  const headerContainerSchema = z$1.object({
6114
6403
  rounded: z$1.enum([
6115
6404
  "none",
@@ -6254,6 +6543,7 @@ const headerSchema = z$1.object({
6254
6543
  positioning: headerPositioning,
6255
6544
  shrinkOnScroll: z$1.boolean(),
6256
6545
  maxWidth: headerMaxWidth,
6546
+ barFrame: headerBarFrame.optional(),
6257
6547
  logoOverride: mediaSchema$1.nullable().optional(),
6258
6548
  background: headerBackgroundSchema.default({
6259
6549
  type: "color",
@@ -6263,6 +6553,7 @@ const headerSchema = z$1.object({
6263
6553
  navStyle: headerNavStyle,
6264
6554
  navColor: themeColorTokenSchema.nullable().optional(),
6265
6555
  navWeight: navFontWeight.default("medium"),
6556
+ navFontRole: z$1.enum(["body", "heading"]).optional(),
6266
6557
  navTypography: z$1.enum(["body", "heading"]).optional(),
6267
6558
  navTextSize: navLinkStyleSchema.shape.textSize,
6268
6559
  navPlacement: z$1.enum(["end", "center"]).optional(),
@@ -6278,7 +6569,21 @@ const headerSchema = z$1.object({
6278
6569
  ctaTreatment: headerCtaTreatmentSchema.optional(),
6279
6570
  ctaVariant: z$1.string().min(1).optional(),
6280
6571
  dropdownStyle: dropdownStyleSchema
6281
- });
6572
+ }).transform(normaliseHeaderNavFontRole);
6573
+ /**
6574
+ * Normalises the legacy `navTypography` font-role alias into the canonical
6575
+ * `navFontRole` field so persisted themes migrate at the parse boundary without
6576
+ * a data migration. `navFontRole` always wins when both are present; the legacy
6577
+ * field is dropped so we never carry a dual write forward.
6578
+ */
6579
+ function normaliseHeaderNavFontRole(header) {
6580
+ if (header.navTypography === void 0) return header;
6581
+ const { navTypography, ...rest } = header;
6582
+ return header.navFontRole === void 0 ? {
6583
+ ...rest,
6584
+ navFontRole: navTypography
6585
+ } : rest;
6586
+ }
6282
6587
  const footerVariant = z$1.enum([
6283
6588
  "simple",
6284
6589
  "columns",
@@ -7911,45 +8216,253 @@ const originalJoyCardSystem = { variants: [{
7911
8216
  type: "solid",
7912
8217
  colorToken: "surface"
7913
8218
  },
7914
- foregroundToken: "text",
7915
- spacing: "comfortable",
7916
- corners: "rounded",
7917
- shadow: {
7918
- elevation: "none",
7919
- softness: null,
7920
- position: "bottom"
7921
- }
7922
- }, {
7923
- id: "alternative",
7924
- name: "Statement",
7925
- enabled: true,
7926
- priority: 2,
7927
- background: {
7928
- type: "solid",
7929
- colorToken: "primary"
8219
+ foregroundToken: "text",
8220
+ spacing: "comfortable",
8221
+ corners: "rounded",
8222
+ shadow: {
8223
+ elevation: "none",
8224
+ softness: null,
8225
+ position: "bottom"
8226
+ }
8227
+ }, {
8228
+ id: "alternative",
8229
+ name: "Statement",
8230
+ enabled: true,
8231
+ priority: 2,
8232
+ background: {
8233
+ type: "solid",
8234
+ colorToken: "primary"
8235
+ },
8236
+ foregroundToken: "primaryForeground",
8237
+ spacing: "comfortable",
8238
+ corners: "rounded",
8239
+ shadow: {
8240
+ elevation: "none",
8241
+ softness: null,
8242
+ position: "bottom"
8243
+ }
8244
+ }] };
8245
+ //#endregion
8246
+ //#region ../theme-core/src/site-styles/testimonialQuotePresets.ts
8247
+ /**
8248
+ * Reusable testimonial quote-mark treatments for curated site styles.
8249
+ *
8250
+ * The quote mark is brand identity the site style owns (analogous to the FAQ
8251
+ * accordion icon); every curated style declares one. `style` is the coarse
8252
+ * selector and the resolver in blocks/vars/testimonials.ts fills in the rest.
8253
+ */
8254
+ /** Large display quotation mark in the heading font. Editorial / calm styles. */
8255
+ const serifDisplayQuote = { style: "serif-display" };
8256
+ /** Punchy quotation mark in the secondary accent colour. Bold / accent styles. */
8257
+ const accentGlyphQuote = { style: "accent-glyph" };
8258
+ /**
8259
+ * Curated library of gradient presets.
8260
+ * All gradients use theme color tokens, so they adapt to the site's palette.
8261
+ */
8262
+ const GRADIENT_PRESETS = [
8263
+ {
8264
+ id: "primary-secondary",
8265
+ name: "Primary to Secondary",
8266
+ description: "Blend your primary and secondary brand colors",
8267
+ type: "linear",
8268
+ angle: 135,
8269
+ stops: [{
8270
+ color: "primary-500",
8271
+ position: 0
8272
+ }, {
8273
+ color: "secondary-500",
8274
+ position: 100
8275
+ }]
8276
+ },
8277
+ {
8278
+ id: "primary-accent",
8279
+ name: "Primary to Accent",
8280
+ description: "Energetic gradient from primary to accent",
8281
+ type: "linear",
8282
+ angle: 135,
8283
+ stops: [{
8284
+ color: "primary-500",
8285
+ position: 0
8286
+ }, {
8287
+ color: "accent-500",
8288
+ position: 100
8289
+ }]
8290
+ },
8291
+ {
8292
+ id: "secondary-accent",
8293
+ name: "Secondary to Accent",
8294
+ description: "Vibrant secondary to accent blend",
8295
+ type: "linear",
8296
+ angle: 135,
8297
+ stops: [{
8298
+ color: "secondary-500",
8299
+ position: 0
8300
+ }, {
8301
+ color: "accent-500",
8302
+ position: 100
8303
+ }]
8304
+ },
8305
+ {
8306
+ id: "primary-light-dark",
8307
+ name: "Primary Light to Dark",
8308
+ description: "Subtle primary color fade",
8309
+ type: "linear",
8310
+ angle: 180,
8311
+ stops: [{
8312
+ color: "primary-500",
8313
+ position: 0
8314
+ }, {
8315
+ color: "primary-900",
8316
+ position: 100
8317
+ }]
8318
+ },
8319
+ {
8320
+ id: "primary-dark-light",
8321
+ name: "Primary Dark to Light",
8322
+ description: "Reverse primary fade",
8323
+ type: "linear",
8324
+ angle: 180,
8325
+ stops: [{
8326
+ color: "primary-900",
8327
+ position: 0
8328
+ }, {
8329
+ color: "primary-50",
8330
+ position: 100
8331
+ }]
8332
+ },
8333
+ {
8334
+ id: "secondary-light-dark",
8335
+ name: "Secondary Light to Dark",
8336
+ description: "Subtle secondary color fade",
8337
+ type: "linear",
8338
+ angle: 180,
8339
+ stops: [{
8340
+ color: "secondary-500",
8341
+ position: 0
8342
+ }, {
8343
+ color: "secondary-900",
8344
+ position: 100
8345
+ }]
8346
+ },
8347
+ {
8348
+ id: "accent-light-dark",
8349
+ name: "Accent Light to Dark",
8350
+ description: "Accent color depth fade",
8351
+ type: "linear",
8352
+ angle: 180,
8353
+ stops: [{
8354
+ color: "accent-500",
8355
+ position: 0
8356
+ }, {
8357
+ color: "accent-900",
8358
+ position: 100
8359
+ }]
8360
+ },
8361
+ {
8362
+ id: "background-surface",
8363
+ name: "Background to Surface",
8364
+ description: "Subtle depth using base colors",
8365
+ type: "linear",
8366
+ angle: 180,
8367
+ stops: [{
8368
+ color: "background",
8369
+ position: 0
8370
+ }, {
8371
+ color: "surface",
8372
+ position: 100
8373
+ }]
8374
+ },
8375
+ {
8376
+ id: "neutral-fade",
8377
+ name: "Neutral Gradient",
8378
+ description: "Elegant neutral color fade",
8379
+ type: "linear",
8380
+ angle: 180,
8381
+ stops: [{
8382
+ color: "neutral-900",
8383
+ position: 0
8384
+ }, {
8385
+ color: "neutral-50",
8386
+ position: 100
8387
+ }]
8388
+ },
8389
+ {
8390
+ id: "primary-glow",
8391
+ name: "Primary glow",
8392
+ description: "A soft top-centred glow using your primary palette",
8393
+ type: "radial",
8394
+ shape: "ellipse",
8395
+ position: "top center",
8396
+ stops: [{
8397
+ color: "primary-900",
8398
+ position: 0
8399
+ }, {
8400
+ color: "primary-950",
8401
+ position: 100
8402
+ }],
8403
+ foreground: {
8404
+ textColor: "onPrimary900",
8405
+ headingColor: "onPrimary900",
8406
+ linkColor: "onPrimary900",
8407
+ supportingColor: "onPrimary900"
8408
+ }
8409
+ },
8410
+ {
8411
+ id: "accent-glow",
8412
+ name: "Accent glow",
8413
+ description: "A soft top-centred glow using your accent palette",
8414
+ type: "radial",
8415
+ shape: "ellipse",
8416
+ position: "top center",
8417
+ stops: [{
8418
+ color: "accent-900",
8419
+ position: 0
8420
+ }, {
8421
+ color: "accent-950",
8422
+ position: 100
8423
+ }],
8424
+ foreground: {
8425
+ textColor: "onAccent900",
8426
+ headingColor: "onAccent900",
8427
+ linkColor: "onAccent900",
8428
+ supportingColor: "onAccent900"
8429
+ }
7930
8430
  },
7931
- foregroundToken: "primaryForeground",
7932
- spacing: "comfortable",
7933
- corners: "rounded",
7934
- shadow: {
7935
- elevation: "none",
7936
- softness: null,
7937
- position: "bottom"
8431
+ {
8432
+ id: "primary-secondary-accent",
8433
+ name: "Brand Trio",
8434
+ description: "All three brand colors in harmony",
8435
+ type: "linear",
8436
+ angle: 135,
8437
+ stops: [
8438
+ {
8439
+ color: "primary-500",
8440
+ position: 0
8441
+ },
8442
+ {
8443
+ color: "secondary-500",
8444
+ position: 50
8445
+ },
8446
+ {
8447
+ color: "accent-500",
8448
+ position: 100
8449
+ }
8450
+ ]
7938
8451
  }
7939
- }] };
7940
- //#endregion
7941
- //#region ../theme-core/src/site-styles/testimonialQuotePresets.ts
7942
- /**
7943
- * Reusable testimonial quote-mark treatments for curated site styles.
7944
- *
7945
- * The quote mark is brand identity the site style owns (analogous to the FAQ
7946
- * accordion icon); every curated style declares one. `style` is the coarse
7947
- * selector and the resolver in blocks/vars/testimonials.ts fills in the rest.
7948
- */
7949
- /** Large display quotation mark in the heading font. Editorial / calm styles. */
7950
- const serifDisplayQuote = { style: "serif-display" };
7951
- /** Punchy quotation mark in the secondary accent colour. Bold / accent styles. */
7952
- const accentGlyphQuote = { style: "accent-glyph" };
8452
+ ].map((preset) => ({
8453
+ ...preset,
8454
+ id: preset.id,
8455
+ stops: preset.stops
8456
+ }));
8457
+ const GRADIENT_PRESET_IDS = GRADIENT_PRESETS.map((preset) => preset.id);
8458
+ const gradientPresetIdSet = new Set(GRADIENT_PRESET_IDS);
8459
+ Object.fromEntries(GRADIENT_PRESETS.map((preset) => [preset.id, preset]));
8460
+ function parseGradientPresetId(value) {
8461
+ if (typeof value !== "string") return null;
8462
+ const normalized = value.trim();
8463
+ if (!gradientPresetIdSet.has(normalized)) return null;
8464
+ return normalized;
8465
+ }
7953
8466
  //#endregion
7954
8467
  //#region ../theme-core/src/site-styles/headerLooks.ts
7955
8468
  function asHeaderLookId(value) {
@@ -8084,7 +8597,7 @@ const overlayLogoAccommodations = [
8084
8597
  * optional nested styling fields that would otherwise leak from another Look.
8085
8598
  */
8086
8599
  function baseHeader(theme) {
8087
- 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;
8600
+ 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;
8088
8601
  return {
8089
8602
  ...header,
8090
8603
  navContainer: {
@@ -8233,6 +8746,17 @@ const headerStyleCatalog = defineExactCatalog()([
8233
8746
  navTypography: "brand-caps",
8234
8747
  moods: ["expressive"]
8235
8748
  },
8749
+ {
8750
+ id: asHeaderStyleId("brand-capsule"),
8751
+ label: "Brand Capsule",
8752
+ description: "Solid brand chrome designed as a floating capsule, with quiet-caps nav, a soft pill active state, and an inverted CTA pill.",
8753
+ supportedLayoutIds: supportedLayouts(["classic"]),
8754
+ navInteraction: "pill-background",
8755
+ surface: "brand-solid",
8756
+ defaultDepth: "shadow",
8757
+ navTypography: "quiet-caps",
8758
+ moods: ["expressive", "professional"]
8759
+ },
8236
8760
  {
8237
8761
  id: asHeaderStyleId("serif-line"),
8238
8762
  label: "Serif Line",
@@ -8326,6 +8850,7 @@ const headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
8326
8850
  "brand-bar",
8327
8851
  "brand-underline",
8328
8852
  "brand-pill",
8853
+ "brand-capsule",
8329
8854
  "serif-line",
8330
8855
  "flat-tabs"
8331
8856
  ])],
@@ -8363,6 +8888,11 @@ headerStyleRepairChain([
8363
8888
  "brand-pill",
8364
8889
  "brand-bar",
8365
8890
  "minimal"
8891
+ ]), headerStyleRepairChain([
8892
+ "brand-capsule",
8893
+ "brand-pill",
8894
+ "brand-bar",
8895
+ "minimal"
8366
8896
  ]), headerStyleRepairChain([
8367
8897
  "pill-nav",
8368
8898
  "soft-bar",
@@ -9976,6 +10506,19 @@ z$1.object({
9976
10506
  }).strict();
9977
10507
  //#endregion
9978
10508
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
10509
+ function defineSectionForegroundRuntimeTokens(input) {
10510
+ return {
10511
+ textColor: requireThemeColorToken(input.textColor),
10512
+ headingColor: requireThemeColorToken(input.headingColor),
10513
+ linkColor: requireThemeColorToken(input.linkColor),
10514
+ supportingColor: requireThemeColorToken(input.supportingColor)
10515
+ };
10516
+ }
10517
+ function requireThemeColorToken(value) {
10518
+ const token = parseThemeColorToken(value);
10519
+ if (!token) throw new Error(`Invalid section foreground Theme color token: ${String(value)}`);
10520
+ return token;
10521
+ }
9979
10522
  function defineDesignRuntimeRules(rules) {
9980
10523
  return rules;
9981
10524
  }
@@ -10246,24 +10789,24 @@ const kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
10246
10789
  type: "color",
10247
10790
  color: "muted"
10248
10791
  },
10249
- foreground: {
10792
+ foreground: defineSectionForegroundRuntimeTokens({
10250
10793
  textColor: "text",
10251
10794
  headingColor: "primary",
10252
10795
  linkColor: "primary",
10253
10796
  supportingColor: "text"
10254
- }
10797
+ })
10255
10798
  },
10256
10799
  "brand-depth-band": {
10257
10800
  background: {
10258
10801
  type: "color",
10259
10802
  color: "primary-800"
10260
10803
  },
10261
- foreground: {
10804
+ foreground: defineSectionForegroundRuntimeTokens({
10262
10805
  textColor: "text",
10263
10806
  headingColor: "primary",
10264
10807
  linkColor: "primary",
10265
10808
  supportingColor: "text"
10266
- }
10809
+ })
10267
10810
  },
10268
10811
  "hero-image": {
10269
10812
  background: {
@@ -10271,12 +10814,32 @@ const kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
10271
10814
  opacity: 1,
10272
10815
  position: "center center"
10273
10816
  },
10274
- foreground: {
10817
+ foreground: defineSectionForegroundRuntimeTokens({
10275
10818
  textColor: "text",
10276
10819
  headingColor: "primary",
10277
10820
  linkColor: "primary",
10278
10821
  supportingColor: "text"
10279
- }
10822
+ })
10823
+ }
10824
+ }
10825
+ });
10826
+ const primaryGlowGradientPresetId = parseGradientPresetId("primary-glow");
10827
+ if (!primaryGlowGradientPresetId) throw new Error("Expected primary-glow in the Theme Core gradient catalog");
10828
+ const fulcrumDesignRuntimeRules = defineDesignRuntimeRules({
10829
+ ...defaultDesignRuntimeRules,
10830
+ sectionSurfaces: {
10831
+ ...defaultDesignRuntimeRules.sectionSurfaces,
10832
+ "accent-band": {
10833
+ background: {
10834
+ type: "gradient",
10835
+ gradientPresetId: primaryGlowGradientPresetId
10836
+ },
10837
+ foreground: defineSectionForegroundRuntimeTokens({
10838
+ textColor: "primaryForeground",
10839
+ headingColor: "primaryForeground",
10840
+ linkColor: "primaryForeground",
10841
+ supportingColor: "primaryForeground"
10842
+ })
10280
10843
  }
10281
10844
  }
10282
10845
  });
@@ -10600,6 +11163,7 @@ const curatedSiteStyles = [
10600
11163
  ],
10601
11164
  buttonPersonalityChoices: [
10602
11165
  buttonChoice("soft-pill"),
11166
+ buttonChoice("two-tone-pill"),
10603
11167
  buttonChoice("pebble"),
10604
11168
  buttonChoice("editorial-link"),
10605
11169
  buttonChoice("brushed-wash")
@@ -11663,6 +12227,8 @@ const curatedSiteStyles = [
11663
12227
  },
11664
12228
  compositionBudget: quietBudget,
11665
12229
  typography: fulcrumTypography,
12230
+ designRuntimeRules: fulcrumDesignRuntimeRules,
12231
+ recommendedAppearancePresetIds: ["cta-accent-band"],
11666
12232
  themeOverrides: {
11667
12233
  shadow: { colorToken: "primary" },
11668
12234
  accordions: {
@@ -11779,6 +12345,7 @@ const curatedSiteStyles = [
11779
12345
  ],
11780
12346
  buttonPersonalityChoices: [
11781
12347
  buttonChoice("quiet-arrow"),
12348
+ buttonChoice("two-tone-pill"),
11782
12349
  buttonChoice("flat-ink"),
11783
12350
  buttonChoice("editorial-link")
11784
12351
  ],
@@ -12284,19 +12851,29 @@ function isRecord$6(value) {
12284
12851
  //#region ../core/src/booking-date-time.ts
12285
12852
  const DEFAULT_LOCALE = "en-US";
12286
12853
  const FALLBACK_TIMEZONE = "UTC";
12854
+ const DATE_TIME_FORMATTER_CACHE_LIMIT = 100;
12855
+ const dateTimeFormatterCache = /* @__PURE__ */ new Map();
12856
+ const timeZoneValidityCache = /* @__PURE__ */ new Map();
12287
12857
  function isValidTimeZone(timeZone) {
12858
+ const cached = timeZoneValidityCache.get(timeZone);
12859
+ if (cached !== void 0) return cached;
12860
+ let isValid;
12288
12861
  try {
12289
12862
  new Intl.DateTimeFormat(DEFAULT_LOCALE, { timeZone }).format(/* @__PURE__ */ new Date());
12290
- return true;
12863
+ isValid = true;
12291
12864
  } catch {
12292
- return false;
12865
+ isValid = false;
12293
12866
  }
12867
+ if (timeZoneValidityCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) timeZoneValidityCache.clear();
12868
+ timeZoneValidityCache.set(timeZone, isValid);
12869
+ return isValid;
12294
12870
  }
12295
12871
  function getSafeTimeZone(timeZone) {
12296
12872
  const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
12297
12873
  return normalized.length > 0 && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
12298
12874
  }
12299
12875
  function parseStrictBookingTimeZone(timeZone) {
12876
+ if (typeof timeZone !== "string") return null;
12300
12877
  const normalized = timeZone.trim();
12301
12878
  if (normalized.length === 0 || !isValidTimeZone(normalized)) return null;
12302
12879
  return normalized;
@@ -12309,10 +12886,19 @@ function formatParseError(error) {
12309
12886
  }
12310
12887
  }
12311
12888
  function formatToPartsLookup(date, locale, timeZone, format) {
12312
- return new Map(new Intl.DateTimeFormat(locale, {
12889
+ return new Map(getCachedDateTimeFormatter(locale, timeZone, format).formatToParts(date).map((part) => [part.type, part.value]));
12890
+ }
12891
+ function getCachedDateTimeFormatter(locale, timeZone, format) {
12892
+ const key = `${locale}\u0000${timeZone}\u0000${JSON.stringify(Object.entries(format).sort(([left], [right]) => left.localeCompare(right)))}`;
12893
+ const cached = dateTimeFormatterCache.get(key);
12894
+ if (cached !== void 0) return cached;
12895
+ const formatter = new Intl.DateTimeFormat(locale, {
12313
12896
  ...format,
12314
12897
  timeZone
12315
- }).formatToParts(date).map((part) => [part.type, part.value]));
12898
+ });
12899
+ if (dateTimeFormatterCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) dateTimeFormatterCache.clear();
12900
+ dateTimeFormatterCache.set(key, formatter);
12901
+ return formatter;
12316
12902
  }
12317
12903
  function getZonedDateTimeParts(date, timeZone) {
12318
12904
  const parts = formatToPartsLookup(date, "en-GB", timeZone, {
@@ -12355,23 +12941,9 @@ function toUtcIsoDateTimeString(value) {
12355
12941
  return parsed.value;
12356
12942
  }
12357
12943
  function parseScheduledBookingDateTime(input) {
12944
+ let startsAt;
12358
12945
  try {
12359
- const startsAt = toUtcIsoDateTimeString(input.startsAt);
12360
- const timeZone = parseStrictBookingTimeZone(input.timeZone);
12361
- if (timeZone === null) return {
12362
- ok: false,
12363
- field: "timeZone",
12364
- reason: "invalid_time_zone",
12365
- value: input.timeZone
12366
- };
12367
- return {
12368
- ok: true,
12369
- value: {
12370
- startsAt,
12371
- timeZone,
12372
- locale: input.locale
12373
- }
12374
- };
12946
+ startsAt = toUtcIsoDateTimeString(input.startsAt);
12375
12947
  } catch {
12376
12948
  return {
12377
12949
  ok: false,
@@ -12380,6 +12952,21 @@ function parseScheduledBookingDateTime(input) {
12380
12952
  value: input.startsAt
12381
12953
  };
12382
12954
  }
12955
+ const timeZone = parseStrictBookingTimeZone(input.timeZone);
12956
+ if (timeZone === null) return {
12957
+ ok: false,
12958
+ field: "timeZone",
12959
+ reason: "invalid_time_zone",
12960
+ value: typeof input.timeZone === "string" ? input.timeZone : ""
12961
+ };
12962
+ return {
12963
+ ok: true,
12964
+ value: {
12965
+ startsAt,
12966
+ timeZone,
12967
+ locale: input.locale
12968
+ }
12969
+ };
12383
12970
  }
12384
12971
  function toScheduledBookingDateTime(input) {
12385
12972
  const result = parseScheduledBookingDateTime(input);
@@ -12637,7 +13224,7 @@ const ALLOWED_TRANSFORM_IDS = [
12637
13224
  "media.fromUrl",
12638
13225
  "background.resolveStyle",
12639
13226
  "background.resolveColorsStyle",
12640
- "background.resolveAllowOverflow",
13227
+ "background.resolveFrameClassName",
12641
13228
  "background.resolveImageStyle",
12642
13229
  "background.resolveImageClassName",
12643
13230
  "background.resolveOverlayStyle",
@@ -13292,6 +13879,20 @@ const blockCategoryEnum$2 = z$1.enum([
13292
13879
  "layout",
13293
13880
  "interactive"
13294
13881
  ]);
13882
+ const blockContentSourceSchema = z$1.object({
13883
+ kind: z$1.enum([
13884
+ "inline",
13885
+ "entries",
13886
+ "mixed"
13887
+ ]),
13888
+ contentType: z$1.string().min(1).optional()
13889
+ }).superRefine((value, ctx) => {
13890
+ if (value.kind === "inline" && value.contentType) ctx.addIssue({
13891
+ code: z$1.ZodIssueCode.custom,
13892
+ path: ["contentType"],
13893
+ message: "contentType is not allowed when contentSource.kind is \"inline\""
13894
+ });
13895
+ });
13295
13896
  z$1.object({
13296
13897
  name: z$1.string().min(1),
13297
13898
  version: z$1.string().min(1),
@@ -13322,6 +13923,12 @@ z$1.object({
13322
13923
  }).optional()).optional(),
13323
13924
  category: blockCategoryEnum$2.optional(),
13324
13925
  contentTypes: z$1.array(z$1.string()).optional(),
13926
+ /**
13927
+ * Explicit content-source classification (inline / entries / mixed). Optional at the
13928
+ * schema level for backward compatibility with SDK-defined custom blocks, but every
13929
+ * registered SYSTEM block must declare it (enforced by a registry-wide test).
13930
+ */
13931
+ contentSource: blockContentSourceSchema.optional(),
13325
13932
  tags: z$1.array(z$1.string()).optional(),
13326
13933
  icon: z$1.string().optional()
13327
13934
  });
@@ -14265,6 +14872,7 @@ function devValidate(node) {
14265
14872
  }
14266
14873
  //#endregion
14267
14874
  //#region ../blocks/src/system/node/fragments/backgroundLayer.ts
14875
+ 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";
14268
14876
  /**
14269
14877
  * Creates background layer nodes for rendering backgrounds from field data.
14270
14878
  *
@@ -14330,6 +14938,34 @@ function backgroundLayer(path, options = {}) {
14330
14938
  ];
14331
14939
  }
14332
14940
  /**
14941
+ * Wrap decorative background layers in their own clipping frame.
14942
+ *
14943
+ * Foreground content remains outside this frame, so editor outlines, focus
14944
+ * rings, and floating controls are never clipped by a visual background.
14945
+ * Backgrounds that explicitly opt into overflow keep that behavior within
14946
+ * the decorative layer rather than changing the content root.
14947
+ */
14948
+ function backgroundFrame(path, options = {}) {
14949
+ const { leadingNodes = [], ...layerOptions } = options;
14950
+ const framedLayerOptions = {
14951
+ ...layerOptions,
14952
+ styleClassName: layerOptions.styleClassName ?? "background-style rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none",
14953
+ imageClassName: layerOptions.imageClassName ?? "rb-absolute rb-z-0",
14954
+ overlayClassName: layerOptions.overlayClassName ?? "background-overlay rb-absolute rb-inset-0 rb-z-0 rb-h-full rb-w-full rb-pointer-events-none"
14955
+ };
14956
+ return el("div", {
14957
+ className: { $bind: {
14958
+ from: path,
14959
+ transforms: [{
14960
+ id: "background.resolveFrameClassName",
14961
+ options: { baseClass: BACKGROUND_FRAME_BASE_CLASS }
14962
+ }],
14963
+ fallback: `${BACKGROUND_FRAME_BASE_CLASS} rb-overflow-hidden`
14964
+ } },
14965
+ style: { borderRadius: "inherit" }
14966
+ }, [...leadingNodes, ...backgroundLayer(path, framedLayerOptions)]);
14967
+ }
14968
+ /**
14333
14969
  * Creates a media node for rendering background image/video media with conditional rendering.
14334
14970
  *
14335
14971
  * This helper creates a media element that:
@@ -14491,8 +15127,8 @@ function sectionContainer(children, opts) {
14491
15127
  * - content
14492
15128
  */
14493
15129
  function styledContainer(config) {
14494
- 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;
14495
- const backgroundNodes = backgroundLayer(`${bindFrom}.background`, { imageClassName });
15130
+ const { children, rootType = "div", rootProps, bindFrom = "_containerStyles", baseClassName = "rb-relative rb-isolate rb-overflow-visible", imageClassName = "rb-absolute rb-z-0", constrainWidth = true } = config;
15131
+ const backgroundNode = backgroundFrame(`${bindFrom}.background`, { imageClassName });
14496
15132
  const childrenArray = Array.isArray(children) ? children : [children];
14497
15133
  const { className: _ignoredClassName, style: _ignoredStyle, ...safeRootProps } = rootProps ?? {};
14498
15134
  return el(rootType, {
@@ -14515,7 +15151,7 @@ function styledContainer(config) {
14515
15151
  }],
14516
15152
  fallback: constrainWidth ? `${baseClassName} rb-container` : baseClassName
14517
15153
  } }
14518
- }, [...backgroundNodes, ...childrenArray]);
15154
+ }, [backgroundNode, ...childrenArray]);
14519
15155
  }
14520
15156
  //#endregion
14521
15157
  //#region ../blocks/src/system/spacing.ts
@@ -14532,7 +15168,7 @@ const DEFAULT_SECTION_SPACING = "medium";
14532
15168
  * - Creating a section wrapper with background theme
14533
15169
  * - Adding background color/gradient/image layers
14534
15170
  * - Binding className to section styles with transform
14535
- * - Binding allowOverflow for background positioning
15171
+ * - Keeping foreground overflow visible while decorative backgrounds clip independently
14536
15172
  * - Wrapping content children
14537
15173
  *
14538
15174
  * Use this helper to eliminate 25+ lines of boilerplate section setup code.
@@ -14568,8 +15204,8 @@ const DEFAULT_SECTION_SPACING = "medium";
14568
15204
  * });
14569
15205
  */
14570
15206
  function styledSection(config) {
14571
- 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;
14572
- const renderedBackgroundNodes = backgroundLayer(`${bindFrom}.background`, {
15207
+ 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;
15208
+ const renderedBackgroundNode = backgroundFrame(`${bindFrom}.background`, {
14573
15209
  imageClassName,
14574
15210
  fallbackToken: background,
14575
15211
  omitImageLayer: !renderBackgroundImage,
@@ -14592,13 +15228,8 @@ function styledSection(config) {
14592
15228
  fullWidthPath
14593
15229
  }
14594
15230
  }]
14595
- } },
14596
- allowOverflow: allowOverflow ? true : { $bind: {
14597
- from: `${bindFrom}.background`,
14598
- transforms: [{ id: "background.resolveAllowOverflow" }],
14599
- fallback: false
14600
15231
  } }
14601
- }, [...renderedBackgroundNodes, ...childrenArray]);
15232
+ }, [renderedBackgroundNode, ...childrenArray]);
14602
15233
  }
14603
15234
  //#endregion
14604
15235
  //#region ../blocks/src/system/node/fragments/ctaButton.ts
@@ -15009,9 +15640,12 @@ function responsiveTwoColumn({ image, text, ratioFrom, imagePositionFrom, gapCla
15009
15640
  //#endregion
15010
15641
  //#region ../blocks/src/system/node/fragments/styledCard.ts
15011
15642
  function styledCard(children, opts, ...mods) {
15012
- const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-hidden rb-border";
15013
- 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" });
15014
- const backgroundNodes = backgroundLayer(opts.backgroundFrom);
15643
+ const baseClassName = opts.baseClassName ?? "rb-relative rb-isolate rb-overflow-visible rb-border";
15644
+ const defaultBackgroundLayer = el("div", {
15645
+ className: "rb-absolute rb-inset-0 rb-z-neg-10 rb-h-full rb-w-full rb-pointer-events-none rb-bg-surface",
15646
+ style: { borderRadius: "inherit" }
15647
+ });
15648
+ const backgroundNode = backgroundFrame(opts.backgroundFrom);
15015
15649
  const style = {
15016
15650
  ...opts.style ?? {},
15017
15651
  borderColor: { $bind: {
@@ -15038,7 +15672,7 @@ function styledCard(children, opts, ...mods) {
15038
15672
  ...style ? { style } : {}
15039
15673
  }, [
15040
15674
  defaultBackgroundLayer,
15041
- ...backgroundNodes,
15675
+ backgroundNode,
15042
15676
  ...children
15043
15677
  ], ...mods);
15044
15678
  }
@@ -15812,9 +16446,15 @@ function createButtonGroup(options = {}) {
15812
16446
  //#endregion
15813
16447
  //#region ../blocks/src/system/fields/ctas.ts
15814
16448
  function createCtasRepeater(options = {}) {
15815
- const { id = "ctas", label = "Calls to action", itemLabel = "CTA", minItems = 0, maxItems, button } = options;
16449
+ const { id = "ctas", label = "Calls to action", itemLabel = "CTA", minItems = 0, maxItems, button, defaultValue } = options;
16450
+ const fieldId = id;
16451
+ const buttonField = createButtonGroup({
16452
+ showGroupLabel: false,
16453
+ ...button ?? {},
16454
+ flattenInRepeater: true
16455
+ });
15816
16456
  return {
15817
- id,
16457
+ id: fieldId,
15818
16458
  type: "repeater",
15819
16459
  label,
15820
16460
  itemLabel,
@@ -15823,11 +16463,8 @@ function createCtasRepeater(options = {}) {
15823
16463
  maxItems,
15824
16464
  required: false,
15825
16465
  allowConversion: true,
15826
- schema: { fields: [createButtonGroup({
15827
- showGroupLabel: false,
15828
- ...button ?? {},
15829
- flattenInRepeater: true
15830
- })] }
16466
+ ...defaultValue !== void 0 ? { defaultValue: [...defaultValue] } : {},
16467
+ schema: { fields: [buttonField] }
15831
16468
  };
15832
16469
  }
15833
16470
  //#endregion
@@ -15877,6 +16514,7 @@ const heroCtaRowFragment = defineFragment({
15877
16514
  label: "Calls to action",
15878
16515
  itemLabel: "CTA",
15879
16516
  maxItems: 3,
16517
+ defaultValue: [],
15880
16518
  button: {
15881
16519
  variants: [
15882
16520
  {
@@ -15944,7 +16582,7 @@ const ctaCopyFragment = defineFragment({
15944
16582
  eyebrowPath: "content.eyebrow",
15945
16583
  titlePath: "content.title",
15946
16584
  className: "cta-heading"
15947
- }), richText({ className: "cta-content rb-prose rb-mx-auto rb-max-w-none" }, when("content.content"), bind("content.content"))]
16585
+ }), richText({ className: "cta-content rb-prose rb-mx-auto rb-max-w-none" }, when("content"), bind("content"))]
15948
16586
  });
15949
16587
  //#endregion
15950
16588
  //#region ../blocks/src/system/fragments/library/testimonialsHeading.ts
@@ -16041,7 +16679,7 @@ function buildTestimonialCard(...mods) {
16041
16679
  }, 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())])], {
16042
16680
  stylesFrom: "content._cardStyles",
16043
16681
  backgroundFrom: "content._cardStyles.background",
16044
- baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-hidden rb-p-8"
16682
+ baseClassName: "rb-testimonial-card rb-relative rb-isolate rb-flex rb-h-full rb-flex-col rb-overflow-visible rb-p-8"
16045
16683
  }, ...mods);
16046
16684
  }
16047
16685
  /**
@@ -16513,39 +17151,6 @@ const formEmbedFragment = defineFragment({
16513
17151
  }
16514
17152
  });
16515
17153
  //#endregion
16516
- //#region ../blocks/src/system/fragments/library/footerBottomText.ts
16517
- const footerBottomTextFragment = defineFragment({
16518
- id: "footerBottomText",
16519
- title: "Footer Text",
16520
- description: "Rich text content for the main footer body and optional bottom bar.",
16521
- fields: [{
16522
- id: "bodyText",
16523
- type: "richText",
16524
- label: "Body text",
16525
- description: "Appears in the main footer area.",
16526
- ui: { variant: "limited" }
16527
- }, {
16528
- id: "bottomText",
16529
- type: "richText",
16530
- label: "Bottom bar text",
16531
- description: "Appears in the optional footer bottom bar.",
16532
- ui: { variant: "limited" }
16533
- }],
16534
- layout: [richText({
16535
- className: "rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center",
16536
- style: textColorStyle("text/80")
16537
- }, when("bodyText"), bind("bodyText", { transforms: [{
16538
- id: "content.interpolateRichTextTokens",
16539
- options: { tokens: ["year", "site_name"] }
16540
- }] })), richText({
16541
- className: "rb-prose rb-prose-sm rb-mx-auto rb-max-w-3xl rb-text-center",
16542
- style: textColorStyle("text/80")
16543
- }, when("bottomText"), bind("bottomText", { transforms: [{
16544
- id: "content.interpolateRichTextTokens",
16545
- options: { tokens: ["year", "site_name"] }
16546
- }] }))]
16547
- });
16548
- //#endregion
16549
17154
  //#region ../blocks/src/system/fragments/library/singleButton.ts
16550
17155
  const singleButtonFragment = defineFragment({
16551
17156
  id: "singleButton",
@@ -16718,7 +17323,7 @@ function createFaqAccordionLayout(options = {}) {
16718
17323
  options: {
16719
17324
  axis: "all",
16720
17325
  includeSpacing: false,
16721
- baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-hidden"
17326
+ baseClass: "rb-faq-item rb-relative rb-isolate rb-overflow-visible"
16722
17327
  }
16723
17328
  }]
16724
17329
  },
@@ -17709,6 +18314,7 @@ function createBlockManifest(config) {
17709
18314
  previewCustomize: config.previewCustomize,
17710
18315
  category: config.category,
17711
18316
  contentTypes: config.contentTypes ? [...config.contentTypes] : void 0,
18317
+ contentSource: config.contentSource,
17712
18318
  tags: config.tags ? [...config.tags] : [],
17713
18319
  icon: config.icon ?? "Box",
17714
18320
  layout,
@@ -17842,7 +18448,6 @@ function splitLayoutWith(children) {
17842
18448
  }
17843
18449
  }),
17844
18450
  renderBackgroundImage: false,
17845
- allowOverflow: true,
17846
18451
  baseClass: ""
17847
18452
  });
17848
18453
  }
@@ -17855,6 +18460,7 @@ const heroBlockDefinition = { manifest: createBlockManifest({
17855
18460
  title: "Hero",
17856
18461
  titleSource: "headline",
17857
18462
  category: "layout",
18463
+ contentSource: { kind: "inline" },
17858
18464
  includeContainerStyles: true,
17859
18465
  promotedFields: ["_sectionStyles.background.image"],
17860
18466
  fragments: [
@@ -18128,6 +18734,7 @@ const introBlockDefinition = { manifest: createBlockManifest({
18128
18734
  id: "block.intro",
18129
18735
  title: "Intro",
18130
18736
  category: "layout",
18737
+ contentSource: { kind: "inline" },
18131
18738
  includeContainerStyles: true,
18132
18739
  titleSource: "title",
18133
18740
  previewCustomize: { quickFieldPriority: [
@@ -18313,6 +18920,7 @@ const bodyTextBlockDefinition = { manifest: createBlockManifest({
18313
18920
  title: "Body Text",
18314
18921
  titleSource: "heading",
18315
18922
  category: "content",
18923
+ contentSource: { kind: "inline" },
18316
18924
  fragments: [{
18317
18925
  fragment: bodyCopyFragment,
18318
18926
  fieldPriority: 0
@@ -18369,6 +18977,10 @@ const blogPostBlockDefinition = {
18369
18977
  description: "Highlights a single blog post with title, image, and excerpt.",
18370
18978
  category: "blog",
18371
18979
  contentTypes: ["post"],
18980
+ contentSource: {
18981
+ kind: "entries",
18982
+ contentType: "post"
18983
+ },
18372
18984
  tags: [
18373
18985
  "blog",
18374
18986
  "post",
@@ -18470,7 +19082,7 @@ function postCard(children, ...mods) {
18470
19082
  return styledCard(children, {
18471
19083
  stylesFrom: "content._cardStyles",
18472
19084
  backgroundFrom: "content._cardStyles.background",
18473
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-flex-col rb-h-full"
19085
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-flex rb-flex-col rb-h-full"
18474
19086
  }, ...mods);
18475
19087
  }
18476
19088
  const gridPostCard = postCard([postImageLink("rb-h-48 rb-w-full rb-object-cover rb-transition-transform rb-hover-scale-105", {
@@ -18506,7 +19118,7 @@ const stackPostCard = styledCard([inline({
18506
19118
  ])])], {
18507
19119
  stylesFrom: "content._cardStyles",
18508
19120
  backgroundFrom: "content._cardStyles.background",
18509
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border"
19121
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border"
18510
19122
  }, repeat("data.posts", "post"));
18511
19123
  const emptyState$2 = {
18512
19124
  ...styledCard([text({
@@ -18515,7 +19127,7 @@ const emptyState$2 = {
18515
19127
  }, bind("content.emptyMessage", { fallback: "No posts published yet." }))], {
18516
19128
  stylesFrom: "content._cardStyles",
18517
19129
  backgroundFrom: "content._cardStyles.background",
18518
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden rb-border rb-border-dashed rb-p-8 rb-text-center"
19130
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible rb-border rb-border-dashed rb-p-8 rb-text-center"
18519
19131
  }),
18520
19132
  $when: {
18521
19133
  when: { from: "data.posts[0]" },
@@ -18525,7 +19137,7 @@ const emptyState$2 = {
18525
19137
  function blogListingShell(children) {
18526
19138
  return styledSection({
18527
19139
  children: styledContainer({
18528
- baseClassName: "rb-relative rb-isolate rb-overflow-hidden",
19140
+ baseClassName: "rb-relative rb-isolate rb-overflow-visible",
18529
19141
  children
18530
19142
  }),
18531
19143
  baseClass: ""
@@ -18666,6 +19278,10 @@ const blogListingManifest = createBlockManifest({
18666
19278
  ],
18667
19279
  description: "Display a collection of blog posts in grid or stack layout.",
18668
19280
  contentTypes: ["post"],
19281
+ contentSource: {
19282
+ kind: "entries",
19283
+ contentType: "post"
19284
+ },
18669
19285
  tags: [
18670
19286
  "blog",
18671
19287
  "posts",
@@ -18708,6 +19324,7 @@ const ctaFullBlockDefinition = { manifest: createBlockManifest({
18708
19324
  id: "block.cta-full",
18709
19325
  title: "Full-width CTA",
18710
19326
  category: "marketing",
19327
+ contentSource: { kind: "inline" },
18711
19328
  fragments: [{
18712
19329
  fragment: ctaCopyFragment,
18713
19330
  fieldPriority: 0
@@ -18741,6 +19358,7 @@ const singleButtonBlockDefinition = { manifest: createBlockManifest({
18741
19358
  id: "block.single-button",
18742
19359
  title: "Single Button",
18743
19360
  category: "marketing",
19361
+ contentSource: { kind: "inline" },
18744
19362
  fragments: [{
18745
19363
  fragment: singleButtonFragment,
18746
19364
  fieldPriority: 0
@@ -18937,7 +19555,7 @@ const copyLayout = fragmentLayoutNode$1(formCopyFragment.layout);
18937
19555
  const formSurface = styledContainer({
18938
19556
  bindFrom: "_containerStyles",
18939
19557
  constrainWidth: false,
18940
- baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-hidden",
19558
+ baseClassName: "rb-form-surface rb-relative rb-isolate rb-overflow-visible",
18941
19559
  children: fragmentLayoutNode$1(formEmbedFragment.layout)
18942
19560
  });
18943
19561
  function createFormLayout(variant) {
@@ -19001,6 +19619,7 @@ const formManifest = createBlockManifest({
19001
19619
  paletteHidden: false
19002
19620
  },
19003
19621
  category: "interactive",
19622
+ contentSource: { kind: "inline" },
19004
19623
  tags: [
19005
19624
  "form",
19006
19625
  "contact",
@@ -19063,6 +19682,7 @@ const contactNewsletterBlockDefinition = {
19063
19682
  titleSource: "contactTitle",
19064
19683
  description: "Two-column newsletter signup and contact form section.",
19065
19684
  category: "interactive",
19685
+ contentSource: { kind: "inline" },
19066
19686
  layout: contactNewsletterLayout,
19067
19687
  defaultVariant: "default",
19068
19688
  variants: { default: contactNewsletterLayout },
@@ -19266,6 +19886,7 @@ const faqBlockDefinition = { manifest: createBlockManifest({
19266
19886
  title: "FAQ",
19267
19887
  titleSource: "title",
19268
19888
  category: "content",
19889
+ contentSource: { kind: "inline" },
19269
19890
  includeContainerStyles: true,
19270
19891
  fragments: [{
19271
19892
  fragment: faqHeadingFragment,
@@ -19371,7 +19992,7 @@ function desktopOnlyDisplay(display) {
19371
19992
  }
19372
19993
  //#endregion
19373
19994
  //#region ../blocks/src/system/blocks/site-header.ts
19374
- const whenTransformed$1 = (from, transformId, equals = true) => (node) => ({
19995
+ const whenTransformed = (from, transformId, equals = true) => (node) => ({
19375
19996
  ...node,
19376
19997
  $when: {
19377
19998
  when: {
@@ -19399,7 +20020,7 @@ const logoRow = link({
19399
20020
  text({
19400
20021
  as: "strong",
19401
20022
  className: "header-logo-text rb-truncate"
19402
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
20023
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
19403
20024
  ]);
19404
20025
  const centeredLogoRow = link({
19405
20026
  href: "/",
@@ -19419,7 +20040,7 @@ const centeredLogoRow = link({
19419
20040
  text({
19420
20041
  as: "strong",
19421
20042
  className: "header-logo-text"
19422
- }, whenTransformed$1("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
20043
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
19423
20044
  ]);
19424
20045
  const createNavRow = (className, align = "end") => navRow({
19425
20046
  className: `${className} header-nav-row`,
@@ -19551,7 +20172,7 @@ const classicLayout = inline({
19551
20172
  logoRow,
19552
20173
  createNavRow(`rb-ml-auto ${desktopOnlyDisplay("flex")} rb-gap-6`),
19553
20174
  headerCta
19554
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "inline"));
20175
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "inline"));
19555
20176
  const classicCenteredNavLayout = inline({
19556
20177
  className: bindProp("$root.theme.header.maxWidth", {
19557
20178
  transforms: pipe(tx("layout.maxWidthClass", { base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-items-center rb-gap-6` })),
@@ -19562,7 +20183,7 @@ const classicCenteredNavLayout = inline({
19562
20183
  logoRow,
19563
20184
  createNavRow(`rb-flex-1 rb-justify-center ${desktopOnlyDisplay("flex")} rb-gap-6`, "center"),
19564
20185
  headerCta
19565
- ], whenTransformed$1("$root.theme.header", "layout.classicNavMode", "centered"));
20186
+ ], whenTransformed("$root.theme.header", "layout.classicNavMode", "centered"));
19566
20187
  const centeredLayout = stack({
19567
20188
  gap: "md",
19568
20189
  align: "center",
@@ -19602,6 +20223,7 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
19602
20223
  id: "block.site-header",
19603
20224
  title: "Site Header",
19604
20225
  category: "layout",
20226
+ contentSource: { kind: "inline" },
19605
20227
  additionalFields: [{
19606
20228
  id: "mode",
19607
20229
  type: "select",
@@ -19625,7 +20247,6 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
19625
20247
  transforms: pipe(tx("layout.headerSectionBackground")),
19626
20248
  fallback: "background"
19627
20249
  }),
19628
- allowOverflow: true,
19629
20250
  className: bindProp("$root.theme.header", {
19630
20251
  transforms: pipe(tx("layout.headerRootClass")),
19631
20252
  fallback: "header-root rb-z-40 rb-w-full transition-theme"
@@ -19675,218 +20296,155 @@ const footerNavGroupsLayout = stack({
19675
20296
  linkRequired: true,
19676
20297
  target: { $bind: { from: "entry.target" } },
19677
20298
  rel: { $bind: { from: "entry.rel" } }
19678
- }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], when("footerMenu.groups"));
20299
+ }, [text({ as: "span" }, bind("entry.label"))], repeat("group.children", "entry"))])], repeat("footerMenu.groups", "group"))], whenCollectionHasItems("footerMenu.groups"));
19679
20300
  //#endregion
19680
20301
  //#region ../blocks/src/system/blocks/site-footer.ts
19681
- const footerTextLayout = () => materializeFragment({ fragment: footerBottomTextFragment }).layout;
19682
- const whenTransformed = (from, transformId, equals = true) => (node) => ({
19683
- ...node,
19684
- $when: {
19685
- when: {
19686
- from,
19687
- transforms: [{ id: transformId }]
19688
- },
19689
- equals
19690
- }
19691
- });
19692
- const bottomBarTextLayout = () => {
19693
- const bottomTextNode = footerTextLayout()[1];
19694
- return bottomTextNode ? [bottomTextNode] : [];
19695
- };
19696
- const bodyTextLayout = () => {
19697
- const bodyTextNode = footerTextLayout()[0];
19698
- return bodyTextNode ? [bodyTextNode] : [];
19699
- };
19700
- const businessAddressLayout = () => [text({
19701
- as: "p",
19702
- className: "rb-caption rb-opacity-80"
19703
- }, bind("site.businessAddress.displayAddress"), when("content.showBusinessAddress", { equals: true }))];
19704
- const inlineBottomTextLayout = () => {
19705
- const bottomTextNode = footerTextLayout()[1];
19706
- if (!bottomTextNode) return [];
19707
- return [when("$root.theme.footer.bottomBar.enabled", {
19708
- equals: true,
19709
- not: true
19710
- })(bottomTextNode)];
19711
- };
19712
- const simpleFooterLayout = stack({
19713
- gap: "md",
19714
- align: "start",
19715
- className: { $bind: {
19716
- from: "$root.theme.footer",
19717
- transforms: [{ id: "layout.footerSimpleRootClass" }],
19718
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-items-start rb-gap-4 rb-py-10 rb-text-left"
19719
- } }
19720
- }, [
19721
- link({
19722
- href: "/",
19723
- className: { $bind: {
19724
- from: "$root.theme.footer.logo",
19725
- transforms: [{
19726
- id: "layout.footerLogoClass",
19727
- options: { requireExplicitShow: true }
19728
- }],
19729
- fallback: "rb-hidden"
19730
- } }
19731
- }, [
19732
- media({ className: { $bind: {
19733
- from: "$root.theme.footer.logo",
19734
- transforms: [{ id: "layout.footerLogoMediaClass" }],
19735
- fallback: "rb-w-auto"
19736
- } } }, when("content.logo"), bind("content.logo")),
19737
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
19738
- from: "$root.theme.footer.logo",
19739
- transforms: [{ id: "layout.footerLogoMediaClass" }],
19740
- fallback: "rb-w-auto"
19741
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
19742
- text({
19743
- as: "strong",
19744
- className: "footer-logo-text rb-nav-text"
19745
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
19746
- ]),
19747
- footerNav({
19748
- collectionPath: "footerMenu.items",
19749
- mode: "flatten",
19750
- className: { $bind: {
19751
- from: "$root.theme.footer.navLayout",
19752
- transforms: [{ id: "layout.footerSimpleNavClass" }],
19753
- fallback: "footer-nav rb-flex rb-flex-wrap rb-justify-start rb-gap-x-6 rb-gap-y-3"
19754
- } },
19755
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
19756
- }),
19757
- ...bodyTextLayout(),
19758
- ...businessAddressLayout(),
19759
- ...inlineBottomTextLayout()
19760
- ], when("$root.theme.footer.variant", { equals: "simple" }));
19761
- const columnsFooterLayout = stack({
19762
- gap: "xl",
19763
- align: "start",
20302
+ const brandLogo = link({
20303
+ href: "/",
19764
20304
  className: { $bind: {
19765
- from: "$root.theme.footer.maxWidth",
20305
+ from: "$root.theme.footer.logo",
19766
20306
  transforms: [{
19767
- id: "layout.maxWidthClass",
19768
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
20307
+ id: "layout.footerLogoClass",
20308
+ options: { base: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline" }
19769
20309
  }],
19770
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
20310
+ fallback: "footer-logo rb-inline-flex rb-items-center rb-gap-3 rb-no-underline"
19771
20311
  } }
19772
- }, [
19773
- footerNavGroupsLayout,
19774
- inline({ className: "rb-flex rb-w-full rb-flex-wrap rb-items-center rb-justify-between rb-gap-4" }, [text({
19775
- as: "strong",
19776
- className: "rb-block rb-nav-text",
19777
- style: textColorStyle("text")
19778
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" })), footerNav({
19779
- collectionPath: "footerMenu.items",
19780
- mode: "links-only",
19781
- className: "rb-flex rb-flex-wrap rb-justify-end rb-gap-x-6 rb-gap-y-3",
19782
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-px-4 rb-py-2 rb-nav-text transition-theme-standard"
19783
- })]),
19784
- ...bodyTextLayout(),
19785
- ...businessAddressLayout(),
19786
- ...inlineBottomTextLayout()
19787
- ], when("$root.theme.footer.variant", { equals: "columns" }));
19788
- const splitFooterLayout = stack({
19789
- gap: "xl",
19790
- align: "start",
20312
+ }, [media({ className: { $bind: {
20313
+ from: "$root.theme.footer.logo",
20314
+ transforms: [{
20315
+ id: "layout.footerLogoMediaClass",
20316
+ options: { base: "rb-h-10 rb-w-auto" }
20317
+ }],
20318
+ fallback: "rb-h-10 rb-w-auto"
20319
+ } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content.logo")), text({
20320
+ as: "strong",
20321
+ className: "footer-logo-text rb-nav-text"
20322
+ }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
20323
+ const navigation = stack({
20324
+ gap: "md",
20325
+ className: "rb-w-full"
20326
+ }, [footerNavGroupsLayout, footerNav({
20327
+ collectionPath: "footerMenu.items",
20328
+ mode: "links-only",
19791
20329
  className: { $bind: {
19792
- from: "$root.theme.footer.maxWidth",
19793
- transforms: [{
19794
- id: "layout.maxWidthClass",
19795
- options: { base: "rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12" }
19796
- }],
19797
- fallback: "rb-container rb-flex rb-w-full rb-flex-col rb-gap-10 rb-py-12"
19798
- } }
20330
+ from: "module.navigationClassName",
20331
+ fallback: "footer-nav rb-flex rb-flex-wrap rb-gap-x-6 rb-gap-y-3"
20332
+ } },
20333
+ linkClassName: "footer-nav-link rb-nav-text transition-theme-standard"
20334
+ })], when("module.kind", { equals: "navigation" }));
20335
+ const legalNavigation = footerNav({
20336
+ collectionPath: "legalFooterMenu.items",
20337
+ mode: "links-only",
20338
+ className: "rb-flex rb-flex-wrap rb-gap-x-4 rb-gap-y-2",
20339
+ linkClassName: "footer-nav-link rb-caption transition-theme-standard"
20340
+ });
20341
+ const address = text({
20342
+ as: "address",
20343
+ className: "rb-not-italic rb-opacity-80"
20344
+ }, when("module.kind", { equals: "business-address" }), bind("module.address"));
20345
+ const contact = stack({
20346
+ gap: "sm",
20347
+ className: "rb-items-start"
20348
+ }, [link({
20349
+ href: { $bind: { from: "contactLink.href" } },
20350
+ className: "rb-nav-text rb-break-words transition-theme-standard"
20351
+ }, [text({ as: "span" }, bind("contactLink.label"))], repeat("module.contactLinks", "contactLink"))], when("module.kind", { equals: "contact" }));
20352
+ const hours = stack({
20353
+ gap: "sm",
20354
+ className: "rb-w-full"
20355
+ }, [inline({ className: "rb-flex rb-w-full rb-justify-between rb-gap-4" }, [text({
20356
+ as: "span",
20357
+ className: "rb-label"
20358
+ }, bind("hoursDay.weekday")), text({
20359
+ as: "span",
20360
+ className: "rb-caption rb-opacity-80"
20361
+ }, bind("hoursDay.hours"))], repeat("module.openingHours", "hoursDay")), text({
20362
+ as: "p",
20363
+ className: "rb-caption rb-opacity-70"
20364
+ }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
20365
+ const socials = inline({ className: "rb-flex rb-flex-wrap rb-gap-x-5 rb-gap-y-3" }, [link({
20366
+ href: { $bind: { from: "social.href" } },
20367
+ target: "_blank",
20368
+ rel: "noreferrer noopener",
20369
+ "aria-label": { $bind: { from: "social.label" } },
20370
+ className: "rb-nav-text transition-theme-standard"
20371
+ }, [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" }));
20372
+ const authoredCopy = richText({
20373
+ className: "rb-prose rb-prose-sm rb-max-w-none",
20374
+ style: textColorStyle("text/80")
20375
+ }, when("module.content"), bind("module.content", { transforms: [{
20376
+ id: "content.interpolateRichTextTokens",
20377
+ options: { tokens: ["year", "site_name"] }
20378
+ }] }));
20379
+ const footerGroup = stack({
20380
+ gap: "md",
20381
+ align: "stretch",
20382
+ className: "rb-min-w-0",
20383
+ "data-footer-group": { $bind: { from: "group.kind" } }
20384
+ }, [stack({
20385
+ gap: "md",
20386
+ align: "start",
20387
+ "data-preview-footer-module-id": { $bind: { from: "module.id" } }
19799
20388
  }, [
19800
- inline({ className: { $bind: {
19801
- from: "$root.theme.footer.logo",
19802
- transforms: [{ id: "layout.footerSplitMainClass" }],
19803
- 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"
19804
- } } }, [stack({}, [footerNav({
19805
- collectionPath: "footerMenu.items",
19806
- mode: "flatten",
19807
- className: { $bind: {
19808
- from: "$root.theme.footer.navLayout",
19809
- transforms: [{ id: "layout.footerSplitNavSingleClass" }],
19810
- fallback: "rb-w-full rb-space-y-3 rb-text-left"
19811
- } },
19812
- linkClassName: "footer-nav-link rb-inline-flex rb-items-center rb-whitespace-nowrap rb-nav-text transition-theme-standard"
19813
- })]), link({
19814
- href: "/",
19815
- className: { $bind: {
19816
- from: "$root.theme.footer.logo",
19817
- transforms: [{ id: "layout.footerLogoClass" }],
19818
- 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"
19819
- } }
19820
- }, [
19821
- media({ className: { $bind: {
19822
- from: "$root.theme.footer.logo",
19823
- transforms: [{ id: "layout.footerLogoMediaClass" }],
19824
- fallback: "rb-w-auto"
19825
- } } }, when("content.logo"), bind("content.logo")),
19826
- stack({ className: "rb-contents" }, [media({ className: { $bind: {
19827
- from: "$root.theme.footer.logo",
19828
- transforms: [{ id: "layout.footerLogoMediaClass" }],
19829
- fallback: "rb-w-auto"
19830
- } } }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
19831
- text({
19832
- as: "strong",
19833
- className: "footer-logo-text rb-nav-text"
19834
- }, whenTransformed("$root.theme.footer", "layout.footerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
19835
- ])]),
19836
- ...businessAddressLayout(),
19837
- ...inlineBottomTextLayout()
19838
- ], when("$root.theme.footer.variant", { equals: "split" }));
19839
- const footerLayout = section({
19840
- background: "background",
20389
+ text({
20390
+ as: "h2",
20391
+ className: "rb-label",
20392
+ style: textColorStyle("text/70")
20393
+ }, bind("module.heading"), when("module.heading")),
20394
+ brandLogo,
20395
+ navigation,
20396
+ stack({
20397
+ gap: "sm",
20398
+ className: "rb-w-full"
20399
+ }, [legalNavigation], when("module.kind", { equals: "legal-navigation" })),
20400
+ address,
20401
+ contact,
20402
+ hours,
20403
+ socials,
20404
+ stack({ className: "rb-w-full" }, [authoredCopy], when("module.kind", { equals: "supporting-text" })),
20405
+ stack({ className: "rb-w-full rb-lg-col-span-3" }, [authoredCopy], when("module.kind", { equals: "legal" }))
20406
+ ], repeat("group.modules", "module"))], repeat("region.groups", "group"));
20407
+ const footerMainRegion = stack({
20408
+ className: { $bind: { from: "region.className" } },
20409
+ "data-footer-region": { $bind: { from: "region.kind" } }
20410
+ }, [footerGroup], when("region.kind", { equals: "main" }), repeat("content.footerRuntime.regions", "region"));
20411
+ const footerBottomRegion = stack({ className: { $bind: {
20412
+ from: "$root.theme.footer",
20413
+ transforms: [{ id: "layout.footerBottomBarContainerClass" }],
20414
+ fallback: "rb-w-full"
20415
+ } } }, [stack({
19841
20416
  className: { $bind: {
19842
20417
  from: "$root.theme.footer",
19843
- transforms: [{ id: "layout.footerRootClass" }],
19844
- fallback: "rb-w-full rb-border-t transition-theme"
20418
+ transforms: [{ id: "layout.footerBottomBarClass" }],
20419
+ fallback: "rb-w-full rb-border-t rb-px-6 rb-py-6 rb-text-center"
19845
20420
  } },
19846
20421
  style: { $bind: {
19847
20422
  from: "$root.theme.footer",
19848
- transforms: [{ id: "layout.footerRootStyle" }],
19849
- fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
19850
- } }
19851
- }, [
19852
- simpleFooterLayout,
19853
- columnsFooterLayout,
19854
- splitFooterLayout,
19855
- stack({
19856
- className: { $bind: {
19857
- from: "$root.theme.footer",
19858
- transforms: [{ id: "layout.footerBottomBarClass" }],
19859
- fallback: "rb-w-full rb-border-t rb-py-5"
19860
- } },
19861
- style: { $bind: {
19862
- from: "$root.theme.footer",
19863
- transforms: [{ id: "layout.footerBottomBarStyle" }]
19864
- } }
19865
- }, [stack({ className: { $bind: {
19866
- from: "$root.theme.footer",
19867
- transforms: [{ id: "layout.footerBottomBarContainerClass" }],
19868
- fallback: "rb-container"
19869
- } } }, [...bottomBarTextLayout()])], when("$root.theme.footer.bottomBar.enabled", { equals: true }))
19870
- ]);
20423
+ transforms: [{ id: "layout.footerBottomBarStyle" }]
20424
+ } },
20425
+ "data-footer-region": "bottom"
20426
+ }, [footerGroup])], when("region.kind", { equals: "bottom" }), repeat("content.footerRuntime.regions", "region"));
19871
20427
  const siteFooterBlockDefinition = { manifest: createBlockManifest({
19872
20428
  id: "block.site-footer",
19873
20429
  title: "Site Footer",
19874
20430
  category: "layout",
19875
- fragments: [{
19876
- fragment: footerBottomTextFragment,
19877
- fieldPriority: 0
19878
- }],
20431
+ contentSource: { kind: "inline" },
19879
20432
  skipSectionStyles: true,
19880
- additionalFields: [{
19881
- id: "showBusinessAddress",
19882
- type: "boolean",
19883
- label: "Add business address to site footer?",
19884
- required: false,
19885
- defaultValue: false,
19886
- ui: { intent: "content" }
19887
- }],
19888
- layout: footerLayout,
19889
- description: "Site-wide footer with navigation links and optional columns.",
20433
+ layout: section({
20434
+ background: "background",
20435
+ className: { $bind: {
20436
+ from: "$root.theme.footer",
20437
+ transforms: [{ id: "layout.footerRootClass" }],
20438
+ fallback: "rb-w-full rb-border-t transition-theme"
20439
+ } },
20440
+ style: { $bind: {
20441
+ from: "$root.theme.footer",
20442
+ transforms: [{ id: "layout.footerRootStyle" }],
20443
+ fallback: mergeStyles(backgroundColorStyle("surface"), surfaceForegroundStyle({ text: "rgb(var(--tb-text))" }), borderColorStyle("border"))
20444
+ } },
20445
+ "data-footer-membership": { $bind: { from: "content.footerRuntime.membershipKey" } }
20446
+ }, [footerMainRegion, footerBottomRegion]),
20447
+ description: "Site-wide composed footer with canonical shared details.",
19890
20448
  styleTokens: { spacing: "md" },
19891
20449
  paletteHidden: true
19892
20450
  }) };
@@ -20020,6 +20578,7 @@ const testimonialsBlockDefinition = {
20020
20578
  id: "block.testimonials",
20021
20579
  title: "Testimonials",
20022
20580
  category: "marketing",
20581
+ contentSource: { kind: "inline" },
20023
20582
  includeContainerStyles: true,
20024
20583
  previewCustomize: { quickFieldPriority: [
20025
20584
  "avatarLayout",
@@ -20178,6 +20737,7 @@ const columnsBlockDefinition = { manifest: createBlockManifest({
20178
20737
  id: "block.columns",
20179
20738
  title: "Columns",
20180
20739
  category: "layout",
20740
+ contentSource: { kind: "inline" },
20181
20741
  additionalFields: [
20182
20742
  parseFieldDefinition({
20183
20743
  id: "equalHeight",
@@ -20364,7 +20924,7 @@ const repeatedItemsNode = repeaterFragmentLayout({
20364
20924
  id: "boxStyles.all",
20365
20925
  options: {
20366
20926
  axis: "all",
20367
- baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-hidden rb-border"
20927
+ baseClass: "rb-collection-item rb-relative rb-isolate rb-overflow-visible rb-border"
20368
20928
  }
20369
20929
  }]
20370
20930
  },
@@ -20411,6 +20971,7 @@ const collectionBlockDefinition = { manifest: createBlockManifest({
20411
20971
  id: "block.collection",
20412
20972
  title: "Collection",
20413
20973
  category: "layout",
20974
+ contentSource: { kind: "inline" },
20414
20975
  additionalFields: [
20415
20976
  parseFieldDefinition({
20416
20977
  id: "layout",
@@ -20647,6 +21208,7 @@ const featureCardsBlockDefinition = { manifest: createBlockManifest({
20647
21208
  id: "block.feature-cards",
20648
21209
  title: "Feature Cards",
20649
21210
  category: "layout",
21211
+ contentSource: { kind: "inline" },
20650
21212
  includeContainerStyles: true,
20651
21213
  titleSource: "title",
20652
21214
  additionalFields: [
@@ -21030,6 +21592,7 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
21030
21592
  id: "block.media-text",
21031
21593
  title: "Media and Text",
21032
21594
  category: "layout",
21595
+ contentSource: { kind: "inline" },
21033
21596
  includeContainerStyles: true,
21034
21597
  titleSource: "title",
21035
21598
  previewCustomize: { quickFieldPriority: [
@@ -21430,6 +21993,7 @@ const appointmentBookingBlockDefinition = {
21430
21993
  paletteHidden: false
21431
21994
  },
21432
21995
  category: "interactive",
21996
+ contentSource: { kind: "inline" },
21433
21997
  tags: [
21434
21998
  "booking",
21435
21999
  "appointment",
@@ -21594,6 +22158,7 @@ const weeklySlotAvailabilityManifest = createBlockManifest({
21594
22158
  paletteHidden: false
21595
22159
  },
21596
22160
  category: "interactive",
22161
+ contentSource: { kind: "inline" },
21597
22162
  tags: [
21598
22163
  "booking",
21599
22164
  "appointment",
@@ -23228,6 +23793,7 @@ const eventRegistrationBlockDefinition = {
23228
23793
  titleSource: "heading",
23229
23794
  description: "Multi-step event registration form",
23230
23795
  category: "interactive",
23796
+ contentSource: { kind: "inline" },
23231
23797
  tags: [
23232
23798
  "events",
23233
23799
  "registration",
@@ -23334,15 +23900,9 @@ const eventRegistrationBlockDefinition = {
23334
23900
  defaultValue: "Complete Registration",
23335
23901
  maxLength: 40
23336
23902
  },
23337
- {
23338
- id: "buttonVariant",
23339
- type: "select",
23340
- label: "Button style",
23903
+ createButtonVariantField({
23341
23904
  description: "Choose a button style from your theme",
23342
- required: false,
23343
- multiple: false,
23344
- defaultValue: "primary",
23345
- options: [
23905
+ variants: [
23346
23906
  {
23347
23907
  value: "primary",
23348
23908
  label: "Primary"
@@ -23355,9 +23915,8 @@ const eventRegistrationBlockDefinition = {
23355
23915
  value: "outline",
23356
23916
  label: "Outline"
23357
23917
  }
23358
- ],
23359
- ui: { intent: "style" }
23360
- }
23918
+ ]
23919
+ })
23361
23920
  ],
23362
23921
  layout: [styledSection({
23363
23922
  baseClass: "",
@@ -23550,6 +24109,7 @@ const courseRegistrationBlockDefinition = {
23550
24109
  titleSource: "heading",
23551
24110
  description: "Enrollment form for multi-session courses",
23552
24111
  category: "interactive",
24112
+ contentSource: { kind: "inline" },
23553
24113
  tags: [
23554
24114
  "courses",
23555
24115
  "enrollment",
@@ -23663,15 +24223,9 @@ const courseRegistrationBlockDefinition = {
23663
24223
  defaultValue: "Sign up",
23664
24224
  maxLength: 40
23665
24225
  },
23666
- {
23667
- id: "buttonVariant",
23668
- type: "select",
23669
- label: "Button style",
24226
+ createButtonVariantField({
23670
24227
  description: "Choose a button style from your theme",
23671
- required: false,
23672
- multiple: false,
23673
- defaultValue: "primary",
23674
- options: [
24228
+ variants: [
23675
24229
  {
23676
24230
  value: "primary",
23677
24231
  label: "Primary"
@@ -23684,9 +24238,8 @@ const courseRegistrationBlockDefinition = {
23684
24238
  value: "outline",
23685
24239
  label: "Outline"
23686
24240
  }
23687
- ],
23688
- ui: { intent: "style" }
23689
- }
24241
+ ]
24242
+ })
23690
24243
  ],
23691
24244
  layout: [styledSection({
23692
24245
  baseClass: "",
@@ -23766,6 +24319,7 @@ const eventDetailsManifest = createBlockManifest({
23766
24319
  titleSource: "heading",
23767
24320
  description: "Date/time, venue, map, and other dates for an event",
23768
24321
  category: "content",
24322
+ contentSource: { kind: "entries" },
23769
24323
  tags: [
23770
24324
  "events",
23771
24325
  "venue",
@@ -23971,6 +24525,7 @@ const courseDetailsBlockDefinition = {
23971
24525
  titleSource: "heading",
23972
24526
  description: "Schedule, venue, price, and enrollment status for a course",
23973
24527
  category: "content",
24528
+ contentSource: { kind: "entries" },
23974
24529
  tags: [
23975
24530
  "courses",
23976
24531
  "schedule",
@@ -24262,6 +24817,7 @@ const eventSpotlightBlockDefinition = {
24262
24817
  paletteHidden: false
24263
24818
  },
24264
24819
  category: "content",
24820
+ contentSource: { kind: "entries" },
24265
24821
  tags: [
24266
24822
  "events",
24267
24823
  "featured",
@@ -24808,6 +25364,7 @@ const eventListingBlockDefinition = {
24808
25364
  paletteHidden: true
24809
25365
  },
24810
25366
  category: "interactive",
25367
+ contentSource: { kind: "entries" },
24811
25368
  tags: [
24812
25369
  "events",
24813
25370
  "listing",
@@ -25980,6 +26537,7 @@ const eventCalendarBlockDefinition = {
25980
26537
  paletteHidden: false
25981
26538
  },
25982
26539
  category: "interactive",
26540
+ contentSource: { kind: "entries" },
25983
26541
  tags: [
25984
26542
  "events",
25985
26543
  "calendar",
@@ -26153,6 +26711,7 @@ const recurringScheduleBlockDefinition = {
26153
26711
  titleSource: "heading",
26154
26712
  description: "A compact weekly schedule with one row per recurring series.",
26155
26713
  category: "interactive",
26714
+ contentSource: { kind: "entries" },
26156
26715
  icon: "CalendarDays",
26157
26716
  tags: [
26158
26717
  "schedule",
@@ -26570,7 +27129,10 @@ const offeringsPreviewFields = [
26570
27129
  label: "Link"
26571
27130
  }
26572
27131
  ],
26573
- ui: { intent: "display" }
27132
+ ui: {
27133
+ intent: "display",
27134
+ widget: "buttonVariant"
27135
+ }
26574
27136
  },
26575
27137
  {
26576
27138
  id: "buttonText",
@@ -26623,6 +27185,7 @@ const offeringsPreviewManifest = createBlockManifest({
26623
27185
  paletteHidden: false
26624
27186
  },
26625
27187
  category: "content",
27188
+ contentSource: { kind: "mixed" },
26626
27189
  tags: [
26627
27190
  "offerings",
26628
27191
  "events",
@@ -26791,6 +27354,7 @@ const embedManifest = createBlockManifest({
26791
27354
  id: "block.embed",
26792
27355
  title: "Embed Content",
26793
27356
  category: "content",
27357
+ contentSource: { kind: "entries" },
26794
27358
  titleSource: "heading",
26795
27359
  additionalFields: [
26796
27360
  parseFieldDefinition({
@@ -27278,6 +27842,7 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
27278
27842
  id: "block.image-gallery",
27279
27843
  title: "Image Gallery",
27280
27844
  category: "content",
27845
+ contentSource: { kind: "inline" },
27281
27846
  previewCustomize: { quickFieldPriority: [
27282
27847
  "aspectRatio",
27283
27848
  "slidesToShow",
@@ -27930,6 +28495,7 @@ const videoGridBlockDefinition = { manifest: createBlockManifest({
27930
28495
  id: "block.video-grid",
27931
28496
  title: "Video Grid",
27932
28497
  category: "media",
28498
+ contentSource: { kind: "inline" },
27933
28499
  skipSectionStyles: true,
27934
28500
  additionalFields: parseFieldDefinitions([
27935
28501
  {
@@ -28100,6 +28666,7 @@ const audioPlayerBlockDefinition = { manifest: createBlockManifest({
28100
28666
  title: "Audio Player",
28101
28667
  titleSource: "title",
28102
28668
  category: "media",
28669
+ contentSource: { kind: "inline" },
28103
28670
  description: "Add a branded audio player for a single track.",
28104
28671
  tags: [
28105
28672
  "audio",
@@ -28211,6 +28778,7 @@ const fileDownloadBlockDefinition = { manifest: createBlockManifest({
28211
28778
  title: "File Download",
28212
28779
  titleSource: ["title", "file.filename"],
28213
28780
  category: "media",
28781
+ contentSource: { kind: "inline" },
28214
28782
  description: "Add a simple public download link for a document, ZIP, or audio file.",
28215
28783
  tags: [
28216
28784
  "file",
@@ -29155,6 +29723,7 @@ const shopBlockDefinition = {
29155
29723
  paletteHidden: false
29156
29724
  },
29157
29725
  category: "interactive",
29726
+ contentSource: { kind: "entries" },
29158
29727
  tags: [
29159
29728
  "shop",
29160
29729
  "passes",
@@ -29354,6 +29923,7 @@ const productListBlockDefinition = {
29354
29923
  paletteHidden: false
29355
29924
  },
29356
29925
  category: "interactive",
29926
+ contentSource: { kind: "entries" },
29357
29927
  tags: [
29358
29928
  "shop",
29359
29929
  "products",
@@ -29495,6 +30065,7 @@ const productDetailBlockDefinition = {
29495
30065
  paletteHidden: false
29496
30066
  },
29497
30067
  category: "interactive",
30068
+ contentSource: { kind: "entries" },
29498
30069
  tags: [
29499
30070
  "shop",
29500
30071
  "product",
@@ -29611,6 +30182,7 @@ const cartBlockDefinition = {
29611
30182
  paletteHidden: false
29612
30183
  },
29613
30184
  category: "interactive",
30185
+ contentSource: { kind: "inline" },
29614
30186
  tags: [
29615
30187
  "shop",
29616
30188
  "cart",
@@ -29693,6 +30265,7 @@ const checkoutBlockDefinition = {
29693
30265
  paletteHidden: false
29694
30266
  },
29695
30267
  category: "interactive",
30268
+ contentSource: { kind: "inline" },
29696
30269
  tags: [
29697
30270
  "shop",
29698
30271
  "checkout",
@@ -29896,6 +30469,7 @@ const giftingBlockDefinition = {
29896
30469
  paletteHidden: false
29897
30470
  },
29898
30471
  category: "interactive",
30472
+ contentSource: { kind: "entries" },
29899
30473
  tags: [
29900
30474
  "gifting",
29901
30475
  "gift cards",
@@ -30239,6 +30813,7 @@ const newsletterSignupBlockDefinition = {
30239
30813
  titleSource: "title",
30240
30814
  description: "Newsletter subscription form with configurable field presets.",
30241
30815
  category: "interactive",
30816
+ contentSource: { kind: "inline" },
30242
30817
  fragments: [{
30243
30818
  fragment: newsletterCopyFragment,
30244
30819
  fieldPriority: 0
@@ -30420,6 +30995,7 @@ const teamMembersBlockDefinition = {
30420
30995
  id: "block.team-members",
30421
30996
  title: "Team Members",
30422
30997
  category: "content",
30998
+ contentSource: { kind: "mixed" },
30423
30999
  titleSource: "heading",
30424
31000
  additionalFields: [
30425
31001
  parseFieldDefinition({
@@ -30840,6 +31416,7 @@ const locationMapBlockDefinition = {
30840
31416
  titleSource: "heading",
30841
31417
  description: "Show a business location with an interactive map and directions link.",
30842
31418
  category: "content",
31419
+ contentSource: { kind: "inline" },
30843
31420
  tags: [
30844
31421
  "map",
30845
31422
  "location",