@riverbankcms/sdk 0.108.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 (189) hide show
  1. package/README.md +21 -1
  2. package/dist/{PreviewEditorSidebar-BBT-kZAM.mjs → PreviewEditorSidebar-DWqwfy3_.mjs} +7 -22
  3. package/dist/{PreviewEditorUI-D69xNKT2.mjs → PreviewEditorUI-B7OL4sfR.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-RRu7wyQ5.mjs → PreviewQueryProvider-D0y2l8JN.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-CuDjXH6o.mjs → SdkPreviewModeRuntime-D8Gt9Gbe.mjs} +212 -153
  6. package/dist/{SiteChromeCustomizeContext-BQUY2dEk.mjs → SiteChromeCustomizeContext-DUpalEdL.mjs} +1919 -1032
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +11244 -10741
  8. package/dist/_dts/api/src/bookingAdjustments.d.ts +5 -0
  9. package/dist/_dts/api/src/bookingOperations.d.ts +4 -0
  10. package/dist/_dts/api/src/bookingRecords.d.ts +2 -17
  11. package/dist/_dts/api/src/bookingRefundOutcomes.d.ts +6 -6
  12. package/dist/_dts/api/src/common/envelope.d.ts +7 -0
  13. package/dist/_dts/api/src/courses.d.ts +1 -0
  14. package/dist/_dts/api/src/customerMembershipOutcomes.d.ts +5 -5
  15. package/dist/_dts/api/src/endpoints.d.ts +35 -0
  16. package/dist/_dts/api/src/index.d.ts +2 -2
  17. package/dist/_dts/api/src/participantMessaging.d.ts +18 -12
  18. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +1 -0
  19. package/dist/_dts/api/src/sdkContracts.d.ts +247 -1
  20. package/dist/_dts/api/src/siteInfrastructure.d.ts +13 -0
  21. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +1 -5
  22. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +29 -1
  23. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +33 -27
  24. package/dist/_dts/block-form/src/widgets/BackgroundGradientWidget/BackgroundGradientField.d.ts +9 -0
  25. package/dist/_dts/block-form/src/widgets/BackgroundGradientWidget/BackgroundGradientWidget.d.ts +3 -4
  26. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -4
  27. package/dist/_dts/blocks/src/index.d.ts +1 -1
  28. package/dist/_dts/blocks/src/system/blocks/audio-player.d.ts +3 -0
  29. package/dist/_dts/blocks/src/system/blocks/body-text.d.ts +3 -0
  30. package/dist/_dts/blocks/src/system/blocks/contact-newsletter.d.ts +3 -0
  31. package/dist/_dts/blocks/src/system/blocks/course-registration.d.ts +1 -22
  32. package/dist/_dts/blocks/src/system/blocks/cta-full.d.ts +3 -0
  33. package/dist/_dts/blocks/src/system/blocks/event-registration.d.ts +1 -22
  34. package/dist/_dts/blocks/src/system/blocks/file-download.d.ts +3 -0
  35. package/dist/_dts/blocks/src/system/blocks/form.d.ts +3 -0
  36. package/dist/_dts/blocks/src/system/blocks/image-gallery.d.ts +3 -0
  37. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +3 -0
  38. package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +3 -0
  39. package/dist/_dts/blocks/src/system/blocks/site-header.d.ts +3 -0
  40. package/dist/_dts/blocks/src/system/blocks/team-members.d.ts +3 -0
  41. package/dist/_dts/blocks/src/system/blocks/testimonials.d.ts +3 -0
  42. package/dist/_dts/blocks/src/system/blocks/video-grid.d.ts +3 -0
  43. package/dist/_dts/blocks/src/system/constants/background.d.ts +1 -1
  44. package/dist/_dts/blocks/src/system/customize/backgrounds.d.ts +16 -6
  45. package/dist/_dts/blocks/src/system/defineBlock.d.ts +9 -1
  46. package/dist/_dts/blocks/src/system/fields/ctas.d.ts +8 -0
  47. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +31 -0
  48. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +6 -6
  49. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +3 -3
  50. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +1 -1
  51. package/dist/_dts/content-model/src/content-types/entryValidation.d.ts +31 -0
  52. package/dist/_dts/content-model/src/content-types/scaffold.d.ts +58 -0
  53. package/dist/_dts/content-model/src/content-types/sentinels.d.ts +36 -0
  54. package/dist/_dts/content-model/src/index.d.ts +3 -0
  55. package/dist/_dts/core/src/booking-date-time.d.ts +8 -0
  56. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +3071 -3157
  57. package/dist/_dts/media-core/src/fileMimeDetection.d.ts +16 -0
  58. package/dist/_dts/media-core/src/fileStorage.d.ts +8 -0
  59. package/dist/_dts/media-core/src/storagePathDomain.d.ts +2 -0
  60. package/dist/_dts/media-core/src/uploadVerificationContract.d.ts +3 -0
  61. package/dist/_dts/preview-next/src/client/blocks/BlockToolbar.d.ts +2 -0
  62. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +1 -0
  63. package/dist/_dts/preview-next/src/client/preview/styleConfiguratorApplyPayload.d.ts +1 -1
  64. package/dist/_dts/sdk/src/cli/commands/audit.d.ts +1 -1
  65. package/dist/_dts/sdk/src/cli/commands/compare.d.ts +1 -1
  66. package/dist/_dts/sdk/src/cli/commands/deploy.d.ts +1 -1
  67. package/dist/_dts/sdk/src/cli/commands/drafts.d.ts +18 -0
  68. package/dist/_dts/sdk/src/cli/commands/entry.d.ts +15 -0
  69. package/dist/_dts/sdk/src/cli/commands/init-docs.d.ts +2 -2
  70. package/dist/_dts/sdk/src/cli/commands/publish-all.d.ts +1 -1
  71. package/dist/_dts/sdk/src/cli/commands/pull.d.ts +1 -0
  72. package/dist/_dts/sdk/src/cli/commands/push/execute/diff.d.ts +1 -1
  73. package/dist/_dts/sdk/src/cli/commands/push/options.d.ts +3 -0
  74. package/dist/_dts/sdk/src/cli/commands/push-execute.d.ts +12 -1
  75. package/dist/_dts/sdk/src/cli/commands/setup.d.ts +1 -0
  76. package/dist/_dts/sdk/src/cli/commands/verify.d.ts +1 -0
  77. package/dist/_dts/sdk/src/cli/helpers.d.ts +22 -1
  78. package/dist/_dts/sdk/src/cli/index.d.ts +4 -0
  79. package/dist/_dts/sdk/src/cli/output.d.ts +88 -0
  80. package/dist/_dts/sdk/src/cli/program.d.ts +29 -0
  81. package/dist/_dts/sdk/src/cli/push-config.d.ts +1 -1
  82. package/dist/_dts/sdk/src/client/management/catalog.d.ts +10 -0
  83. package/dist/_dts/sdk/src/client/management/http.d.ts +7 -1
  84. package/dist/_dts/sdk/src/client/management/index.d.ts +1 -1
  85. package/dist/_dts/sdk/src/client/management/types.d.ts +43 -19
  86. package/dist/_dts/sdk/src/date-time/index.d.ts +68 -0
  87. package/dist/_dts/sdk/src/public-api/contracts.d.ts +2 -0
  88. package/dist/_dts/sdk/src/version.d.ts +1 -1
  89. package/dist/_dts/site-commands/src/commands.d.ts +893 -823
  90. package/dist/_dts/theme-core/src/accordions/types.d.ts +1 -1
  91. package/dist/_dts/theme-core/src/buttons/core.d.ts +15 -46
  92. package/dist/_dts/theme-core/src/buttons/effectClassification.d.ts +147 -0
  93. package/dist/_dts/theme-core/src/buttons/effects/types.d.ts +2 -3
  94. package/dist/_dts/theme-core/src/buttons/generateDefaultButtonSystem.d.ts +1 -1
  95. package/dist/_dts/theme-core/src/buttons/index.d.ts +1 -0
  96. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +44 -32
  97. package/dist/_dts/theme-core/src/buttons/presets.d.ts +4 -25
  98. package/dist/_dts/theme-core/src/buttons/resolveButtonColourStates.d.ts +100 -0
  99. package/dist/_dts/theme-core/src/buttons/resolvedButtonCss.d.ts +16 -0
  100. package/dist/_dts/theme-core/src/buttons/types.d.ts +101 -83
  101. package/dist/_dts/theme-core/src/cards/types.d.ts +16 -16
  102. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  103. package/dist/_dts/theme-core/src/gradients/presets.d.ts +200 -8
  104. package/dist/_dts/theme-core/src/gradients/utils.d.ts +6 -2
  105. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +87 -126
  106. package/dist/_dts/theme-core/src/mock-themes/modern-minimal.d.ts +1 -1
  107. package/dist/_dts/theme-core/src/navigation/types.d.ts +2 -2
  108. package/dist/_dts/theme-core/src/palette/curated/index.d.ts +2 -2
  109. package/dist/_dts/theme-core/src/palette/curated/types.d.ts +5 -8
  110. package/dist/_dts/theme-core/src/palette/index.d.ts +0 -1
  111. package/dist/_dts/theme-core/src/schema.d.ts +112 -138
  112. package/dist/_dts/theme-core/src/site-styles/backgroundAppearance.d.ts +2 -2
  113. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +10 -10
  114. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +3 -2
  115. package/dist/_dts/theme-core/src/site-styles/pageDesignIntent.d.ts +13 -6
  116. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +29 -8
  117. package/dist/_dts/theme-core/src/site-styles/styleTags.d.ts +2 -2
  118. package/dist/cli/index.mjs +67956 -66745
  119. package/dist/cli/init-docs/content/cli-reference.md +50 -7
  120. package/dist/cli/init-docs/content/content-management.md +7 -4
  121. package/dist/cli/init-docs/content/workflow-publish.md +5 -1
  122. package/dist/client/{DiscountCodeDisclosure-D6TOf6Hi.mjs → DiscountCodeDisclosure-DU1ygxU2.mjs} +1 -1
  123. package/dist/client/{EventCombined.client-Dao3zxRk.mjs → EventCombined.client-DB5zagCo.mjs} +3 -3
  124. package/dist/client/{EventListing.client-B2NNt4y1.mjs → EventListing.client-CTX9JHBL.mjs} +2 -2
  125. package/dist/client/{LeafletStaticMap-BhwFo16w.mjs → LeafletStaticMap-BYImhgiB.mjs} +1 -1
  126. package/dist/client/{MagicLinkForm-BWnB7cMR.mjs → MagicLinkForm-CRkw_M3l.mjs} +2 -2
  127. package/dist/client/{StepIndicator-TzRiQ0BY.mjs → StepIndicator-BnmVBJJh.mjs} +2 -2
  128. package/dist/client/{accordion-BPy-AJ4_.mjs → accordion-CeGreumd.mjs} +1 -1
  129. package/dist/client/{bookingForm-BL4PGZds.mjs → bookingForm-CSzFNrpN.mjs} +6 -6
  130. package/dist/client/bookings.mjs +512 -252
  131. package/dist/client/{buttons-EBjyslaX.mjs → buttons-DoFV7KDL.mjs} +493 -230
  132. package/dist/client/{carousel-C2b7Cn9-.mjs → carousel-B2jDtogf.mjs} +1 -1
  133. package/dist/client/{cart-BQcbXIVD.mjs → cart-D-jZ-vaY.mjs} +3 -3
  134. package/dist/client/{checkout-DEmpGRJu.mjs → checkout-Dza-LA7N.mjs} +3 -3
  135. package/dist/client/client.mjs +1673 -785
  136. package/dist/client/{colorStyles-jZS6KfkP.mjs → colorStyles-CrgzoXsm.mjs} +1 -30
  137. package/dist/client/{courseRegistration-BqRZPmsq.mjs → courseRegistration-TYkNychb.mjs} +7 -7
  138. package/dist/client/{eventCalendar-B8N_tSl5.mjs → eventCalendar-BI_90SsT.mjs} +5 -5
  139. package/dist/client/{eventCombined-Gjn6gtq7.mjs → eventCombined-mNrpryE9.mjs} +2 -2
  140. package/dist/client/{eventDetails-M-VCxA-r.mjs → eventDetails-D4GVlCIY.mjs} +3 -3
  141. package/dist/client/{eventListing-DR19hqYi.mjs → eventListing-YhKN018y.mjs} +2 -2
  142. package/dist/client/{eventRegistration-BR02a0k3.mjs → eventRegistration-CdHGtilr.mjs} +7 -7
  143. package/dist/client/foregroundContract-xICPq59x.mjs +31 -0
  144. package/dist/client/{form-LY2xIbwg.mjs → form-AcAL45rA.mjs} +2 -2
  145. package/dist/client/{headerSection-CYwwXJfh.mjs → headerSection-uEC52ueD.mjs} +3 -3
  146. package/dist/client/hooks.mjs +890 -497
  147. package/dist/client/{locationMap-DWnBXrFq.mjs → locationMap-_wJDSUYe.mjs} +3 -3
  148. package/dist/client/{media-DHtSxS5V.mjs → media-BK0O3b-U.mjs} +3 -2
  149. package/dist/client/{newsletterForm-D9s-fQ2P.mjs → newsletterForm-DrArsb2B.mjs} +2 -2
  150. package/dist/client/{pricing-DDq80oYc.mjs → pricing-BSYVghwo.mjs} +1 -1
  151. package/dist/client/{productDetail-B0SbWd45.mjs → productDetail-Dyk90sMs.mjs} +3 -3
  152. package/dist/client/{productList-PwYlZn0y.mjs → productList-BCKThwAI.mjs} +3 -3
  153. package/dist/client/{propsDecoder-BRWBiH7i.mjs → propsDecoder-CkXxkdSR.mjs} +63 -24
  154. package/dist/client/rendering/client.mjs +1034 -486
  155. package/dist/client/rendering/islands.mjs +19 -19
  156. package/dist/client/rendering.mjs +1832 -760
  157. package/dist/client/{shop-CMwZPYME.mjs → shop-DeltVH10.mjs} +6 -6
  158. package/dist/client/{shop-commerce-BuxsFate.mjs → shop-commerce-BD9Jsm2Z.mjs} +6 -6
  159. package/dist/client/{shop-commerce-store-boYlEJ91.mjs → shop-commerce-store-CmXD6FDS.mjs} +1 -1
  160. package/dist/client/{shopShared-D2naaOes.mjs → shopShared-B8v-lH_F.mjs} +2 -2
  161. package/dist/client/{useDiscountCodeUi-D9RHpVoj.mjs → useDiscountCodeUi-DbWJN8ld.mjs} +1 -1
  162. package/dist/client/{useEventFilters-igGiK1re.mjs → useEventFilters-EJIMUnqT.mjs} +46 -69
  163. package/dist/client/{usePolling-CI7MbsFB.mjs → usePolling-Cmh14fc7.mjs} +2 -2
  164. package/dist/preview-next/before-render.mjs +35 -0
  165. package/dist/preview-next/client/runtime.mjs +4 -4
  166. package/dist/preview-next/middleware.mjs +35 -0
  167. package/dist/{previewAuthStore-a_cBD28m.mjs → previewAuthStore-CTO7CRPk.mjs} +35 -0
  168. package/dist/{sdk-runtime-MBzD-GmP.mjs → sdk-runtime-Dou0GAav.mjs} +2 -2
  169. package/dist/{separator-5ahRBC85.mjs → separator-CI5wZNXT.mjs} +1 -1
  170. package/dist/server/components.mjs +1832 -784
  171. package/dist/server/config-validation.mjs +890 -497
  172. package/dist/server/config.mjs +890 -497
  173. package/dist/server/data.mjs +890 -497
  174. package/dist/server/date-time.mjs +386 -0
  175. package/dist/server/index.mjs +36 -1
  176. package/dist/server/next.mjs +1868 -785
  177. package/dist/server/page-converter.mjs +849 -285
  178. package/dist/server/prebuild.mjs +1 -1
  179. package/dist/server/rendering/server.mjs +1553 -718
  180. package/dist/server/rendering.mjs +1832 -784
  181. package/dist/server/routing.mjs +933 -522
  182. package/dist/server/server.mjs +929 -501
  183. package/dist/server/theme-bridge.mjs +1408 -392
  184. package/dist/server/theme.mjs +471 -228
  185. package/dist/styles/index.css +5 -0
  186. package/package.json +7 -1
  187. package/dist/_dts/theme-core/src/buttons/presets/types.d.ts +0 -88
  188. package/dist/_dts/theme-core/src/buttons/utils/contrast.d.ts +0 -38
  189. 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",
@@ -4589,7 +4809,6 @@ const softPill = defineButtonPersonality({
4589
4809
  type: "solid",
4590
4810
  colorToken: "primary"
4591
4811
  },
4592
- textColorToken: "primaryForeground",
4593
4812
  borderRadius: "rounded-full",
4594
4813
  shadow: {
4595
4814
  elevation: "low",
@@ -4612,13 +4831,12 @@ const softPill = defineButtonPersonality({
4612
4831
  name: "Secondary",
4613
4832
  enabled: true,
4614
4833
  priority: 2,
4615
- background: { type: "transparent" },
4616
- textColorToken: "primary",
4617
- borderRadius: "rounded-full",
4618
- border: {
4619
- widthClass: "border-2",
4620
- colorToken: "primary"
4834
+ background: {
4835
+ type: "surface",
4836
+ role: "link"
4621
4837
  },
4838
+ borderRadius: "rounded-full",
4839
+ border: { widthClass: "border-2" },
4622
4840
  effects: { hover: [{
4623
4841
  effectId: "background-on-hover",
4624
4842
  options: { colorToken: "surface" }
@@ -4629,13 +4847,12 @@ const softPill = defineButtonPersonality({
4629
4847
  name: "Outline",
4630
4848
  enabled: true,
4631
4849
  priority: 3,
4632
- background: { type: "transparent" },
4633
- textColorToken: "text",
4634
- borderRadius: "rounded-full",
4635
- border: {
4636
- widthClass: "border",
4637
- colorToken: "border"
4850
+ background: {
4851
+ type: "surface",
4852
+ role: "link"
4638
4853
  },
4854
+ borderRadius: "rounded-full",
4855
+ border: { widthClass: "border" },
4639
4856
  effects: { hover: [{
4640
4857
  effectId: "background-on-hover",
4641
4858
  options: { colorToken: "surface" }
@@ -4646,8 +4863,10 @@ const softPill = defineButtonPersonality({
4646
4863
  name: "Ghost",
4647
4864
  enabled: true,
4648
4865
  priority: 3,
4649
- background: { type: "transparent" },
4650
- textColorToken: "text",
4866
+ background: {
4867
+ type: "surface",
4868
+ role: "link"
4869
+ },
4651
4870
  borderRadius: "rounded-full",
4652
4871
  effects: { hover: [{
4653
4872
  effectId: "background-on-hover",
@@ -4666,9 +4885,8 @@ const solidSecondary = {
4666
4885
  priority: 2,
4667
4886
  background: {
4668
4887
  type: "solid",
4669
- colorToken: "secondary"
4888
+ colorToken: unsafeAsOpaqueButtonColourToken("secondary")
4670
4889
  },
4671
- textColorToken: "onSecondary",
4672
4890
  borderRadius: "rounded-full",
4673
4891
  shadow: {
4674
4892
  elevation: "none",
@@ -4716,6 +4934,27 @@ const buttonPersonalities = [
4716
4934
  quietArrow
4717
4935
  ];
4718
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
+ }
4719
4958
  //#endregion
4720
4959
  //#region ../theme-core/src/cards/types.ts
4721
4960
  const cardVariantRoleValues = ["default", "alternative"];
@@ -8016,6 +8255,214 @@ const originalJoyCardSystem = { variants: [{
8016
8255
  const serifDisplayQuote = { style: "serif-display" };
8017
8256
  /** Punchy quotation mark in the secondary accent colour. Bold / accent styles. */
8018
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
+ }
8430
+ },
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
+ ]
8451
+ }
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
+ }
8019
8466
  //#endregion
8020
8467
  //#region ../theme-core/src/site-styles/headerLooks.ts
8021
8468
  function asHeaderLookId(value) {
@@ -10059,6 +10506,19 @@ z$1.object({
10059
10506
  }).strict();
10060
10507
  //#endregion
10061
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
+ }
10062
10522
  function defineDesignRuntimeRules(rules) {
10063
10523
  return rules;
10064
10524
  }
@@ -10329,24 +10789,24 @@ const kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
10329
10789
  type: "color",
10330
10790
  color: "muted"
10331
10791
  },
10332
- foreground: {
10792
+ foreground: defineSectionForegroundRuntimeTokens({
10333
10793
  textColor: "text",
10334
10794
  headingColor: "primary",
10335
10795
  linkColor: "primary",
10336
10796
  supportingColor: "text"
10337
- }
10797
+ })
10338
10798
  },
10339
10799
  "brand-depth-band": {
10340
10800
  background: {
10341
10801
  type: "color",
10342
10802
  color: "primary-800"
10343
10803
  },
10344
- foreground: {
10804
+ foreground: defineSectionForegroundRuntimeTokens({
10345
10805
  textColor: "text",
10346
10806
  headingColor: "primary",
10347
10807
  linkColor: "primary",
10348
10808
  supportingColor: "text"
10349
- }
10809
+ })
10350
10810
  },
10351
10811
  "hero-image": {
10352
10812
  background: {
@@ -10354,12 +10814,32 @@ const kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
10354
10814
  opacity: 1,
10355
10815
  position: "center center"
10356
10816
  },
10357
- foreground: {
10817
+ foreground: defineSectionForegroundRuntimeTokens({
10358
10818
  textColor: "text",
10359
10819
  headingColor: "primary",
10360
10820
  linkColor: "primary",
10361
10821
  supportingColor: "text"
10362
- }
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
+ })
10363
10843
  }
10364
10844
  }
10365
10845
  });
@@ -11747,6 +12227,8 @@ const curatedSiteStyles = [
11747
12227
  },
11748
12228
  compositionBudget: quietBudget,
11749
12229
  typography: fulcrumTypography,
12230
+ designRuntimeRules: fulcrumDesignRuntimeRules,
12231
+ recommendedAppearancePresetIds: ["cta-accent-band"],
11750
12232
  themeOverrides: {
11751
12233
  shadow: { colorToken: "primary" },
11752
12234
  accordions: {
@@ -12369,19 +12851,29 @@ function isRecord$6(value) {
12369
12851
  //#region ../core/src/booking-date-time.ts
12370
12852
  const DEFAULT_LOCALE = "en-US";
12371
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();
12372
12857
  function isValidTimeZone(timeZone) {
12858
+ const cached = timeZoneValidityCache.get(timeZone);
12859
+ if (cached !== void 0) return cached;
12860
+ let isValid;
12373
12861
  try {
12374
12862
  new Intl.DateTimeFormat(DEFAULT_LOCALE, { timeZone }).format(/* @__PURE__ */ new Date());
12375
- return true;
12863
+ isValid = true;
12376
12864
  } catch {
12377
- return false;
12865
+ isValid = false;
12378
12866
  }
12867
+ if (timeZoneValidityCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) timeZoneValidityCache.clear();
12868
+ timeZoneValidityCache.set(timeZone, isValid);
12869
+ return isValid;
12379
12870
  }
12380
12871
  function getSafeTimeZone(timeZone) {
12381
12872
  const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
12382
12873
  return normalized.length > 0 && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
12383
12874
  }
12384
12875
  function parseStrictBookingTimeZone(timeZone) {
12876
+ if (typeof timeZone !== "string") return null;
12385
12877
  const normalized = timeZone.trim();
12386
12878
  if (normalized.length === 0 || !isValidTimeZone(normalized)) return null;
12387
12879
  return normalized;
@@ -12394,10 +12886,19 @@ function formatParseError(error) {
12394
12886
  }
12395
12887
  }
12396
12888
  function formatToPartsLookup(date, locale, timeZone, format) {
12397
- 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, {
12398
12896
  ...format,
12399
12897
  timeZone
12400
- }).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;
12401
12902
  }
12402
12903
  function getZonedDateTimeParts(date, timeZone) {
12403
12904
  const parts = formatToPartsLookup(date, "en-GB", timeZone, {
@@ -12440,23 +12941,9 @@ function toUtcIsoDateTimeString(value) {
12440
12941
  return parsed.value;
12441
12942
  }
12442
12943
  function parseScheduledBookingDateTime(input) {
12944
+ let startsAt;
12443
12945
  try {
12444
- const startsAt = toUtcIsoDateTimeString(input.startsAt);
12445
- const timeZone = parseStrictBookingTimeZone(input.timeZone);
12446
- if (timeZone === null) return {
12447
- ok: false,
12448
- field: "timeZone",
12449
- reason: "invalid_time_zone",
12450
- value: input.timeZone
12451
- };
12452
- return {
12453
- ok: true,
12454
- value: {
12455
- startsAt,
12456
- timeZone,
12457
- locale: input.locale
12458
- }
12459
- };
12946
+ startsAt = toUtcIsoDateTimeString(input.startsAt);
12460
12947
  } catch {
12461
12948
  return {
12462
12949
  ok: false,
@@ -12465,6 +12952,21 @@ function parseScheduledBookingDateTime(input) {
12465
12952
  value: input.startsAt
12466
12953
  };
12467
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
+ };
12468
12970
  }
12469
12971
  function toScheduledBookingDateTime(input) {
12470
12972
  const result = parseScheduledBookingDateTime(input);
@@ -13377,6 +13879,20 @@ const blockCategoryEnum$2 = z$1.enum([
13377
13879
  "layout",
13378
13880
  "interactive"
13379
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
+ });
13380
13896
  z$1.object({
13381
13897
  name: z$1.string().min(1),
13382
13898
  version: z$1.string().min(1),
@@ -13407,6 +13923,12 @@ z$1.object({
13407
13923
  }).optional()).optional(),
13408
13924
  category: blockCategoryEnum$2.optional(),
13409
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(),
13410
13932
  tags: z$1.array(z$1.string()).optional(),
13411
13933
  icon: z$1.string().optional()
13412
13934
  });
@@ -15924,9 +16446,15 @@ function createButtonGroup(options = {}) {
15924
16446
  //#endregion
15925
16447
  //#region ../blocks/src/system/fields/ctas.ts
15926
16448
  function createCtasRepeater(options = {}) {
15927
- 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
+ });
15928
16456
  return {
15929
- id,
16457
+ id: fieldId,
15930
16458
  type: "repeater",
15931
16459
  label,
15932
16460
  itemLabel,
@@ -15935,11 +16463,8 @@ function createCtasRepeater(options = {}) {
15935
16463
  maxItems,
15936
16464
  required: false,
15937
16465
  allowConversion: true,
15938
- schema: { fields: [createButtonGroup({
15939
- showGroupLabel: false,
15940
- ...button ?? {},
15941
- flattenInRepeater: true
15942
- })] }
16466
+ ...defaultValue !== void 0 ? { defaultValue: [...defaultValue] } : {},
16467
+ schema: { fields: [buttonField] }
15943
16468
  };
15944
16469
  }
15945
16470
  //#endregion
@@ -15989,6 +16514,7 @@ const heroCtaRowFragment = defineFragment({
15989
16514
  label: "Calls to action",
15990
16515
  itemLabel: "CTA",
15991
16516
  maxItems: 3,
16517
+ defaultValue: [],
15992
16518
  button: {
15993
16519
  variants: [
15994
16520
  {
@@ -16056,7 +16582,7 @@ const ctaCopyFragment = defineFragment({
16056
16582
  eyebrowPath: "content.eyebrow",
16057
16583
  titlePath: "content.title",
16058
16584
  className: "cta-heading"
16059
- }), 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"))]
16060
16586
  });
16061
16587
  //#endregion
16062
16588
  //#region ../blocks/src/system/fragments/library/testimonialsHeading.ts
@@ -17788,6 +18314,7 @@ function createBlockManifest(config) {
17788
18314
  previewCustomize: config.previewCustomize,
17789
18315
  category: config.category,
17790
18316
  contentTypes: config.contentTypes ? [...config.contentTypes] : void 0,
18317
+ contentSource: config.contentSource,
17791
18318
  tags: config.tags ? [...config.tags] : [],
17792
18319
  icon: config.icon ?? "Box",
17793
18320
  layout,
@@ -17933,6 +18460,7 @@ const heroBlockDefinition = { manifest: createBlockManifest({
17933
18460
  title: "Hero",
17934
18461
  titleSource: "headline",
17935
18462
  category: "layout",
18463
+ contentSource: { kind: "inline" },
17936
18464
  includeContainerStyles: true,
17937
18465
  promotedFields: ["_sectionStyles.background.image"],
17938
18466
  fragments: [
@@ -18206,6 +18734,7 @@ const introBlockDefinition = { manifest: createBlockManifest({
18206
18734
  id: "block.intro",
18207
18735
  title: "Intro",
18208
18736
  category: "layout",
18737
+ contentSource: { kind: "inline" },
18209
18738
  includeContainerStyles: true,
18210
18739
  titleSource: "title",
18211
18740
  previewCustomize: { quickFieldPriority: [
@@ -18391,6 +18920,7 @@ const bodyTextBlockDefinition = { manifest: createBlockManifest({
18391
18920
  title: "Body Text",
18392
18921
  titleSource: "heading",
18393
18922
  category: "content",
18923
+ contentSource: { kind: "inline" },
18394
18924
  fragments: [{
18395
18925
  fragment: bodyCopyFragment,
18396
18926
  fieldPriority: 0
@@ -18447,6 +18977,10 @@ const blogPostBlockDefinition = {
18447
18977
  description: "Highlights a single blog post with title, image, and excerpt.",
18448
18978
  category: "blog",
18449
18979
  contentTypes: ["post"],
18980
+ contentSource: {
18981
+ kind: "entries",
18982
+ contentType: "post"
18983
+ },
18450
18984
  tags: [
18451
18985
  "blog",
18452
18986
  "post",
@@ -18744,6 +19278,10 @@ const blogListingManifest = createBlockManifest({
18744
19278
  ],
18745
19279
  description: "Display a collection of blog posts in grid or stack layout.",
18746
19280
  contentTypes: ["post"],
19281
+ contentSource: {
19282
+ kind: "entries",
19283
+ contentType: "post"
19284
+ },
18747
19285
  tags: [
18748
19286
  "blog",
18749
19287
  "posts",
@@ -18786,6 +19324,7 @@ const ctaFullBlockDefinition = { manifest: createBlockManifest({
18786
19324
  id: "block.cta-full",
18787
19325
  title: "Full-width CTA",
18788
19326
  category: "marketing",
19327
+ contentSource: { kind: "inline" },
18789
19328
  fragments: [{
18790
19329
  fragment: ctaCopyFragment,
18791
19330
  fieldPriority: 0
@@ -18819,6 +19358,7 @@ const singleButtonBlockDefinition = { manifest: createBlockManifest({
18819
19358
  id: "block.single-button",
18820
19359
  title: "Single Button",
18821
19360
  category: "marketing",
19361
+ contentSource: { kind: "inline" },
18822
19362
  fragments: [{
18823
19363
  fragment: singleButtonFragment,
18824
19364
  fieldPriority: 0
@@ -19079,6 +19619,7 @@ const formManifest = createBlockManifest({
19079
19619
  paletteHidden: false
19080
19620
  },
19081
19621
  category: "interactive",
19622
+ contentSource: { kind: "inline" },
19082
19623
  tags: [
19083
19624
  "form",
19084
19625
  "contact",
@@ -19141,6 +19682,7 @@ const contactNewsletterBlockDefinition = {
19141
19682
  titleSource: "contactTitle",
19142
19683
  description: "Two-column newsletter signup and contact form section.",
19143
19684
  category: "interactive",
19685
+ contentSource: { kind: "inline" },
19144
19686
  layout: contactNewsletterLayout,
19145
19687
  defaultVariant: "default",
19146
19688
  variants: { default: contactNewsletterLayout },
@@ -19344,6 +19886,7 @@ const faqBlockDefinition = { manifest: createBlockManifest({
19344
19886
  title: "FAQ",
19345
19887
  titleSource: "title",
19346
19888
  category: "content",
19889
+ contentSource: { kind: "inline" },
19347
19890
  includeContainerStyles: true,
19348
19891
  fragments: [{
19349
19892
  fragment: faqHeadingFragment,
@@ -19680,6 +20223,7 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
19680
20223
  id: "block.site-header",
19681
20224
  title: "Site Header",
19682
20225
  category: "layout",
20226
+ contentSource: { kind: "inline" },
19683
20227
  additionalFields: [{
19684
20228
  id: "mode",
19685
20229
  type: "select",
@@ -19884,6 +20428,7 @@ const siteFooterBlockDefinition = { manifest: createBlockManifest({
19884
20428
  id: "block.site-footer",
19885
20429
  title: "Site Footer",
19886
20430
  category: "layout",
20431
+ contentSource: { kind: "inline" },
19887
20432
  skipSectionStyles: true,
19888
20433
  layout: section({
19889
20434
  background: "background",
@@ -20033,6 +20578,7 @@ const testimonialsBlockDefinition = {
20033
20578
  id: "block.testimonials",
20034
20579
  title: "Testimonials",
20035
20580
  category: "marketing",
20581
+ contentSource: { kind: "inline" },
20036
20582
  includeContainerStyles: true,
20037
20583
  previewCustomize: { quickFieldPriority: [
20038
20584
  "avatarLayout",
@@ -20191,6 +20737,7 @@ const columnsBlockDefinition = { manifest: createBlockManifest({
20191
20737
  id: "block.columns",
20192
20738
  title: "Columns",
20193
20739
  category: "layout",
20740
+ contentSource: { kind: "inline" },
20194
20741
  additionalFields: [
20195
20742
  parseFieldDefinition({
20196
20743
  id: "equalHeight",
@@ -20424,6 +20971,7 @@ const collectionBlockDefinition = { manifest: createBlockManifest({
20424
20971
  id: "block.collection",
20425
20972
  title: "Collection",
20426
20973
  category: "layout",
20974
+ contentSource: { kind: "inline" },
20427
20975
  additionalFields: [
20428
20976
  parseFieldDefinition({
20429
20977
  id: "layout",
@@ -20660,6 +21208,7 @@ const featureCardsBlockDefinition = { manifest: createBlockManifest({
20660
21208
  id: "block.feature-cards",
20661
21209
  title: "Feature Cards",
20662
21210
  category: "layout",
21211
+ contentSource: { kind: "inline" },
20663
21212
  includeContainerStyles: true,
20664
21213
  titleSource: "title",
20665
21214
  additionalFields: [
@@ -21043,6 +21592,7 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
21043
21592
  id: "block.media-text",
21044
21593
  title: "Media and Text",
21045
21594
  category: "layout",
21595
+ contentSource: { kind: "inline" },
21046
21596
  includeContainerStyles: true,
21047
21597
  titleSource: "title",
21048
21598
  previewCustomize: { quickFieldPriority: [
@@ -21443,6 +21993,7 @@ const appointmentBookingBlockDefinition = {
21443
21993
  paletteHidden: false
21444
21994
  },
21445
21995
  category: "interactive",
21996
+ contentSource: { kind: "inline" },
21446
21997
  tags: [
21447
21998
  "booking",
21448
21999
  "appointment",
@@ -21607,6 +22158,7 @@ const weeklySlotAvailabilityManifest = createBlockManifest({
21607
22158
  paletteHidden: false
21608
22159
  },
21609
22160
  category: "interactive",
22161
+ contentSource: { kind: "inline" },
21610
22162
  tags: [
21611
22163
  "booking",
21612
22164
  "appointment",
@@ -23241,6 +23793,7 @@ const eventRegistrationBlockDefinition = {
23241
23793
  titleSource: "heading",
23242
23794
  description: "Multi-step event registration form",
23243
23795
  category: "interactive",
23796
+ contentSource: { kind: "inline" },
23244
23797
  tags: [
23245
23798
  "events",
23246
23799
  "registration",
@@ -23347,15 +23900,9 @@ const eventRegistrationBlockDefinition = {
23347
23900
  defaultValue: "Complete Registration",
23348
23901
  maxLength: 40
23349
23902
  },
23350
- {
23351
- id: "buttonVariant",
23352
- type: "select",
23353
- label: "Button style",
23903
+ createButtonVariantField({
23354
23904
  description: "Choose a button style from your theme",
23355
- required: false,
23356
- multiple: false,
23357
- defaultValue: "primary",
23358
- options: [
23905
+ variants: [
23359
23906
  {
23360
23907
  value: "primary",
23361
23908
  label: "Primary"
@@ -23368,9 +23915,8 @@ const eventRegistrationBlockDefinition = {
23368
23915
  value: "outline",
23369
23916
  label: "Outline"
23370
23917
  }
23371
- ],
23372
- ui: { intent: "style" }
23373
- }
23918
+ ]
23919
+ })
23374
23920
  ],
23375
23921
  layout: [styledSection({
23376
23922
  baseClass: "",
@@ -23563,6 +24109,7 @@ const courseRegistrationBlockDefinition = {
23563
24109
  titleSource: "heading",
23564
24110
  description: "Enrollment form for multi-session courses",
23565
24111
  category: "interactive",
24112
+ contentSource: { kind: "inline" },
23566
24113
  tags: [
23567
24114
  "courses",
23568
24115
  "enrollment",
@@ -23676,15 +24223,9 @@ const courseRegistrationBlockDefinition = {
23676
24223
  defaultValue: "Sign up",
23677
24224
  maxLength: 40
23678
24225
  },
23679
- {
23680
- id: "buttonVariant",
23681
- type: "select",
23682
- label: "Button style",
24226
+ createButtonVariantField({
23683
24227
  description: "Choose a button style from your theme",
23684
- required: false,
23685
- multiple: false,
23686
- defaultValue: "primary",
23687
- options: [
24228
+ variants: [
23688
24229
  {
23689
24230
  value: "primary",
23690
24231
  label: "Primary"
@@ -23697,9 +24238,8 @@ const courseRegistrationBlockDefinition = {
23697
24238
  value: "outline",
23698
24239
  label: "Outline"
23699
24240
  }
23700
- ],
23701
- ui: { intent: "style" }
23702
- }
24241
+ ]
24242
+ })
23703
24243
  ],
23704
24244
  layout: [styledSection({
23705
24245
  baseClass: "",
@@ -23779,6 +24319,7 @@ const eventDetailsManifest = createBlockManifest({
23779
24319
  titleSource: "heading",
23780
24320
  description: "Date/time, venue, map, and other dates for an event",
23781
24321
  category: "content",
24322
+ contentSource: { kind: "entries" },
23782
24323
  tags: [
23783
24324
  "events",
23784
24325
  "venue",
@@ -23984,6 +24525,7 @@ const courseDetailsBlockDefinition = {
23984
24525
  titleSource: "heading",
23985
24526
  description: "Schedule, venue, price, and enrollment status for a course",
23986
24527
  category: "content",
24528
+ contentSource: { kind: "entries" },
23987
24529
  tags: [
23988
24530
  "courses",
23989
24531
  "schedule",
@@ -24275,6 +24817,7 @@ const eventSpotlightBlockDefinition = {
24275
24817
  paletteHidden: false
24276
24818
  },
24277
24819
  category: "content",
24820
+ contentSource: { kind: "entries" },
24278
24821
  tags: [
24279
24822
  "events",
24280
24823
  "featured",
@@ -24821,6 +25364,7 @@ const eventListingBlockDefinition = {
24821
25364
  paletteHidden: true
24822
25365
  },
24823
25366
  category: "interactive",
25367
+ contentSource: { kind: "entries" },
24824
25368
  tags: [
24825
25369
  "events",
24826
25370
  "listing",
@@ -25993,6 +26537,7 @@ const eventCalendarBlockDefinition = {
25993
26537
  paletteHidden: false
25994
26538
  },
25995
26539
  category: "interactive",
26540
+ contentSource: { kind: "entries" },
25996
26541
  tags: [
25997
26542
  "events",
25998
26543
  "calendar",
@@ -26166,6 +26711,7 @@ const recurringScheduleBlockDefinition = {
26166
26711
  titleSource: "heading",
26167
26712
  description: "A compact weekly schedule with one row per recurring series.",
26168
26713
  category: "interactive",
26714
+ contentSource: { kind: "entries" },
26169
26715
  icon: "CalendarDays",
26170
26716
  tags: [
26171
26717
  "schedule",
@@ -26583,7 +27129,10 @@ const offeringsPreviewFields = [
26583
27129
  label: "Link"
26584
27130
  }
26585
27131
  ],
26586
- ui: { intent: "display" }
27132
+ ui: {
27133
+ intent: "display",
27134
+ widget: "buttonVariant"
27135
+ }
26587
27136
  },
26588
27137
  {
26589
27138
  id: "buttonText",
@@ -26636,6 +27185,7 @@ const offeringsPreviewManifest = createBlockManifest({
26636
27185
  paletteHidden: false
26637
27186
  },
26638
27187
  category: "content",
27188
+ contentSource: { kind: "mixed" },
26639
27189
  tags: [
26640
27190
  "offerings",
26641
27191
  "events",
@@ -26804,6 +27354,7 @@ const embedManifest = createBlockManifest({
26804
27354
  id: "block.embed",
26805
27355
  title: "Embed Content",
26806
27356
  category: "content",
27357
+ contentSource: { kind: "entries" },
26807
27358
  titleSource: "heading",
26808
27359
  additionalFields: [
26809
27360
  parseFieldDefinition({
@@ -27291,6 +27842,7 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
27291
27842
  id: "block.image-gallery",
27292
27843
  title: "Image Gallery",
27293
27844
  category: "content",
27845
+ contentSource: { kind: "inline" },
27294
27846
  previewCustomize: { quickFieldPriority: [
27295
27847
  "aspectRatio",
27296
27848
  "slidesToShow",
@@ -27943,6 +28495,7 @@ const videoGridBlockDefinition = { manifest: createBlockManifest({
27943
28495
  id: "block.video-grid",
27944
28496
  title: "Video Grid",
27945
28497
  category: "media",
28498
+ contentSource: { kind: "inline" },
27946
28499
  skipSectionStyles: true,
27947
28500
  additionalFields: parseFieldDefinitions([
27948
28501
  {
@@ -28113,6 +28666,7 @@ const audioPlayerBlockDefinition = { manifest: createBlockManifest({
28113
28666
  title: "Audio Player",
28114
28667
  titleSource: "title",
28115
28668
  category: "media",
28669
+ contentSource: { kind: "inline" },
28116
28670
  description: "Add a branded audio player for a single track.",
28117
28671
  tags: [
28118
28672
  "audio",
@@ -28224,6 +28778,7 @@ const fileDownloadBlockDefinition = { manifest: createBlockManifest({
28224
28778
  title: "File Download",
28225
28779
  titleSource: ["title", "file.filename"],
28226
28780
  category: "media",
28781
+ contentSource: { kind: "inline" },
28227
28782
  description: "Add a simple public download link for a document, ZIP, or audio file.",
28228
28783
  tags: [
28229
28784
  "file",
@@ -29168,6 +29723,7 @@ const shopBlockDefinition = {
29168
29723
  paletteHidden: false
29169
29724
  },
29170
29725
  category: "interactive",
29726
+ contentSource: { kind: "entries" },
29171
29727
  tags: [
29172
29728
  "shop",
29173
29729
  "passes",
@@ -29367,6 +29923,7 @@ const productListBlockDefinition = {
29367
29923
  paletteHidden: false
29368
29924
  },
29369
29925
  category: "interactive",
29926
+ contentSource: { kind: "entries" },
29370
29927
  tags: [
29371
29928
  "shop",
29372
29929
  "products",
@@ -29508,6 +30065,7 @@ const productDetailBlockDefinition = {
29508
30065
  paletteHidden: false
29509
30066
  },
29510
30067
  category: "interactive",
30068
+ contentSource: { kind: "entries" },
29511
30069
  tags: [
29512
30070
  "shop",
29513
30071
  "product",
@@ -29624,6 +30182,7 @@ const cartBlockDefinition = {
29624
30182
  paletteHidden: false
29625
30183
  },
29626
30184
  category: "interactive",
30185
+ contentSource: { kind: "inline" },
29627
30186
  tags: [
29628
30187
  "shop",
29629
30188
  "cart",
@@ -29706,6 +30265,7 @@ const checkoutBlockDefinition = {
29706
30265
  paletteHidden: false
29707
30266
  },
29708
30267
  category: "interactive",
30268
+ contentSource: { kind: "inline" },
29709
30269
  tags: [
29710
30270
  "shop",
29711
30271
  "checkout",
@@ -29909,6 +30469,7 @@ const giftingBlockDefinition = {
29909
30469
  paletteHidden: false
29910
30470
  },
29911
30471
  category: "interactive",
30472
+ contentSource: { kind: "entries" },
29912
30473
  tags: [
29913
30474
  "gifting",
29914
30475
  "gift cards",
@@ -30252,6 +30813,7 @@ const newsletterSignupBlockDefinition = {
30252
30813
  titleSource: "title",
30253
30814
  description: "Newsletter subscription form with configurable field presets.",
30254
30815
  category: "interactive",
30816
+ contentSource: { kind: "inline" },
30255
30817
  fragments: [{
30256
30818
  fragment: newsletterCopyFragment,
30257
30819
  fieldPriority: 0
@@ -30433,6 +30995,7 @@ const teamMembersBlockDefinition = {
30433
30995
  id: "block.team-members",
30434
30996
  title: "Team Members",
30435
30997
  category: "content",
30998
+ contentSource: { kind: "mixed" },
30436
30999
  titleSource: "heading",
30437
31000
  additionalFields: [
30438
31001
  parseFieldDefinition({
@@ -30853,6 +31416,7 @@ const locationMapBlockDefinition = {
30853
31416
  titleSource: "heading",
30854
31417
  description: "Show a business location with an interactive map and directions link.",
30855
31418
  category: "content",
31419
+ contentSource: { kind: "inline" },
30856
31420
  tags: [
30857
31421
  "map",
30858
31422
  "location",