@riverbankcms/sdk 0.109.0 → 0.111.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 (186) hide show
  1. package/dist/{PreviewEditorSidebar-DWqwfy3_.mjs → PreviewEditorSidebar-CTR6LUhN.mjs} +178 -117
  2. package/dist/{PreviewEditorUI-B7OL4sfR.mjs → PreviewEditorUI-DZg15Zip.mjs} +3 -4
  3. package/dist/{PreviewQueryProvider-D0y2l8JN.mjs → PreviewQueryProvider-kkmjklLG.mjs} +1 -1
  4. package/dist/{SdkPreviewModeRuntime-D8Gt9Gbe.mjs → SdkPreviewModeRuntime-DeOTAFvR.mjs} +229 -219
  5. package/dist/{SiteChromeCustomizeContext-DUpalEdL.mjs → SiteChromeCustomizeContext-DOSDLCiJ.mjs} +1695 -2169
  6. package/dist/_dts/ai/src/contracts/proposals.d.ts +1716 -76
  7. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +5 -5
  8. package/dist/_dts/api/src/contentRuntime.d.ts +4 -1
  9. package/dist/_dts/api/src/courses.d.ts +30 -15
  10. package/dist/_dts/api/src/endpoints.d.ts +14 -4
  11. package/dist/_dts/api/src/index.d.ts +2 -2
  12. package/dist/_dts/api/src/sdkContracts.d.ts +23 -11
  13. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +5 -1
  14. package/dist/_dts/api/src/siteOperations.d.ts +11 -19
  15. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +6 -6
  16. package/dist/_dts/api/src/webhooks.d.ts +98 -1
  17. package/dist/_dts/billing/src/site-arrangements.d.ts +3 -0
  18. package/dist/_dts/blocks/src/client/course-registration.d.ts +4 -1
  19. package/dist/_dts/blocks/src/client.d.ts +4 -1
  20. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -4
  21. package/dist/_dts/blocks/src/index.d.ts +3 -1
  22. package/dist/_dts/blocks/src/system/blocks/course-registration.d.ts +2 -1
  23. package/dist/_dts/blocks/src/system/blocks/courses/shared/types.d.ts +2 -1
  24. package/dist/_dts/blocks/src/system/blocks/cta-full.d.ts +2 -4
  25. package/dist/_dts/blocks/src/system/blocks/event-registration.d.ts +2 -1
  26. package/dist/_dts/blocks/src/system/blocks/events/event-listing.d.ts +2 -1
  27. package/dist/_dts/blocks/src/system/blocks/events/event-spotlight.d.ts +2 -1
  28. package/dist/_dts/blocks/src/system/blocks/events/recurring-schedule.d.ts +3 -2
  29. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +2 -1
  30. package/dist/_dts/blocks/src/system/blocks/file-download.d.ts +2 -1
  31. package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +2 -1
  32. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +2 -1
  33. package/dist/_dts/blocks/src/system/blocks/single-button.d.ts +2 -1
  34. package/dist/_dts/blocks/src/system/constants/buttonRoles.d.ts +35 -0
  35. package/dist/_dts/blocks/src/system/fields/button.d.ts +10 -21
  36. package/dist/_dts/blocks/src/system/fields/ctas.d.ts +2 -1
  37. package/dist/_dts/blocks/src/system/fragments/library/heroCtaRow.d.ts +9 -5
  38. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +18 -18
  39. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +9 -9
  40. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessWholeSeriesRegistrationFlow.d.ts +29 -0
  41. package/dist/_dts/blocks/src/system/runtime/nodes/buttonAffordance.d.ts +1 -1
  42. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/ErrorStep.d.ts +2 -1
  43. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/PaymentFailedStep.d.ts +2 -1
  44. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/VerifyingTimeoutStep.d.ts +2 -1
  45. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/types.d.ts +21 -0
  46. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.d.ts +4 -4
  47. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/whole-series-registration.headless.contract.d.ts +326 -0
  48. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/whole-series-registration.headless.planning.d.ts +27 -0
  49. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.interactive.d.ts +5 -4
  50. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +3 -2
  51. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +2 -1
  52. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +5 -4
  53. package/dist/_dts/blocks/src/system/runtime/nodes/file-download.d.ts +2 -3
  54. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.types.d.ts +2 -1
  55. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +6 -3
  56. package/dist/_dts/blocks/src/system/runtime/nodes/shop.interactive.d.ts +7 -6
  57. package/dist/_dts/blocks/src/system/runtime/nodes/shop.types.d.ts +2 -1
  58. package/dist/_dts/blocks/src/system/runtime/shared/types.d.ts +2 -1
  59. package/dist/_dts/content-editor/src/FooterComposerPanel.d.ts +4 -2
  60. package/dist/_dts/content-editor/src/index.d.ts +12 -12
  61. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +17 -2
  62. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +221 -53
  63. package/dist/_dts/editor-blocks/src/widgets/button/context.d.ts +3 -2
  64. package/dist/_dts/preview-next/src/client/index.d.ts +3 -2
  65. package/dist/_dts/preview-next/src/client/preview/ButtonStylePicker.d.ts +16 -0
  66. package/dist/_dts/preview-next/src/client/preview/PageBlockEditorPanel.d.ts +2 -3
  67. package/dist/_dts/preview-next/src/client/preview/PreviewDesignOpenRequestContext.d.ts +7 -0
  68. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +5 -11
  69. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +5 -6
  70. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +6 -7
  71. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +7 -9
  72. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.d.ts +4 -11
  73. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +7 -7
  74. package/dist/_dts/preview-next/src/client/preview/sidebarTabPreference.d.ts +0 -8
  75. package/dist/_dts/preview-next/src/client/preview/siteChromeLookRows.d.ts +1 -11
  76. package/dist/_dts/preview-next/src/client/preview/siteChromeQuickControlHistoryState.d.ts +1 -5
  77. package/dist/_dts/preview-next/src/client/preview/siteChromeSavePlan.d.ts +2 -3
  78. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +3 -4
  79. package/dist/_dts/preview-next/src/client/preview/styleConfiguratorSnapshot.d.ts +3 -5
  80. package/dist/_dts/sdk/src/bookings/index.d.ts +5 -4
  81. package/dist/_dts/sdk/src/bookings/types.d.ts +3 -3
  82. package/dist/_dts/sdk/src/cli/commands/style.d.ts +3 -2
  83. package/dist/_dts/sdk/src/client/management/types.d.ts +2 -1
  84. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +12 -15
  85. package/dist/_dts/sdk/src/public-api/contracts.d.ts +1 -1
  86. package/dist/_dts/sdk/src/version.d.ts +1 -1
  87. package/dist/_dts/sdk/src/webhooks/index.d.ts +1 -1
  88. package/dist/_dts/sdk/src/webhooks/verify.d.ts +3 -3
  89. package/dist/_dts/site-commands/src/commands.d.ts +129 -6
  90. package/dist/_dts/theme-core/src/buttons/index.d.ts +1 -1
  91. package/dist/_dts/theme-core/src/buttons/styles/domain.d.ts +80 -0
  92. package/dist/_dts/theme-core/src/buttons/styles/index.d.ts +3 -0
  93. package/dist/_dts/theme-core/src/buttons/styles/recipes/defineStaticButtonStyleRecipe.d.ts +49 -0
  94. package/dist/_dts/theme-core/src/buttons/styles/recipes/quietArrow.d.ts +67 -0
  95. package/dist/_dts/theme-core/src/buttons/styles/recipes/staticRecipes.d.ts +649 -0
  96. package/dist/_dts/theme-core/src/buttons/styles/registry.d.ts +753 -0
  97. package/dist/_dts/theme-core/src/buttons/styles/selection.d.ts +69 -0
  98. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +26 -24
  99. package/dist/_dts/theme-core/src/site-styles/footerLooks.d.ts +19 -153
  100. package/dist/_dts/theme-core/src/site-styles/headerCtaVariants.d.ts +3 -1
  101. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +8 -9
  102. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +4 -4
  103. package/dist/_dts/ui/src/palette/hex.d.ts +3 -3
  104. package/dist/cli/index.mjs +1760 -1914
  105. package/dist/cli/init-docs/content/workflow-isr-revalidation.md +1 -1
  106. package/dist/client/{DiscountCodeDisclosure-DU1ygxU2.mjs → DiscountCodeDisclosure-C4xvTBux.mjs} +1 -1
  107. package/dist/client/{EventCombined.client-DB5zagCo.mjs → EventCombined.client-Cr7G131j.mjs} +2 -3
  108. package/dist/client/{EventListing.client-CTX9JHBL.mjs → EventListing.client-CAjbseNy.mjs} +2 -2
  109. package/dist/client/{LeafletStaticMap-BYImhgiB.mjs → LeafletStaticMap-BMlWfwz3.mjs} +1 -1
  110. package/dist/client/{MagicLinkForm-CRkw_M3l.mjs → MagicLinkForm-ChdFz96y.mjs} +1 -2
  111. package/dist/client/{StepIndicator-BnmVBJJh.mjs → StepIndicator-7D3GaBeM.mjs} +2 -2
  112. package/dist/client/{accordion-CeGreumd.mjs → accordion-D8JTs2Si.mjs} +1 -1
  113. package/dist/client/{bookingForm-CSzFNrpN.mjs → bookingForm-H3DCRBHs.mjs} +6 -7
  114. package/dist/client/bookings.mjs +3069 -1447
  115. package/dist/client/{carousel-B2jDtogf.mjs → carousel-DMr_QWlz.mjs} +1 -1
  116. package/dist/client/{cart-D-jZ-vaY.mjs → cart-DWMbfBdR.mjs} +3 -3
  117. package/dist/client/{checkout-Dza-LA7N.mjs → checkout-zmfdkXLx.mjs} +3 -3
  118. package/dist/client/client.mjs +1732 -1913
  119. package/dist/client/{colorStyles-CrgzoXsm.mjs → colorStyles-gcTh5yZT.mjs} +2 -12
  120. package/dist/client/{colorTokenParts-CMugwvX_.mjs → colorTokenParts-FSS3al6l.mjs} +31 -1
  121. package/dist/client/{courseRegistration-TYkNychb.mjs → courseRegistration-Z_mn18jy.mjs} +100 -37
  122. package/dist/client/{eventCalendar-BI_90SsT.mjs → eventCalendar-CYp0YJGF.mjs} +4 -5
  123. package/dist/client/{eventCombined-mNrpryE9.mjs → eventCombined-rKyYZUa9.mjs} +2 -2
  124. package/dist/client/{eventDetails-D4GVlCIY.mjs → eventDetails-X0ZaUuMj.mjs} +3 -3
  125. package/dist/client/{eventListing-YhKN018y.mjs → eventListing-W1SuL7EP.mjs} +2 -2
  126. package/dist/client/{eventRegistration-CdHGtilr.mjs → eventRegistration-ClWricui.mjs} +6 -7
  127. package/dist/client/{form-AcAL45rA.mjs → form--eKPwAAD.mjs} +1 -2
  128. package/dist/client/{headerSection-uEC52ueD.mjs → headerSection-BSeGr-FS.mjs} +2 -3
  129. package/dist/client/hooks.mjs +1554 -1871
  130. package/dist/client/{locationMap-_wJDSUYe.mjs → locationMap-BpOrtNYn.mjs} +8 -5
  131. package/dist/client/{media-BK0O3b-U.mjs → media-DoF0dcVx.mjs} +2 -2
  132. package/dist/client/{newsletterForm-DrArsb2B.mjs → newsletterForm-Bt7it7Dy.mjs} +1 -2
  133. package/dist/client/{pricing-BSYVghwo.mjs → pricing-BTjSDDr4.mjs} +1 -1
  134. package/dist/client/{productDetail-Dyk90sMs.mjs → productDetail-ICnVTcCg.mjs} +3 -3
  135. package/dist/client/{productList-BCKThwAI.mjs → productList-ZHr6D604.mjs} +3 -3
  136. package/dist/client/{propsDecoder-CkXxkdSR.mjs → propsDecoder-wWN0tBDF.mjs} +2351 -129
  137. package/dist/client/rendering/client.mjs +1664 -1824
  138. package/dist/client/rendering/islands.mjs +20 -20
  139. package/dist/client/rendering.mjs +1697 -1909
  140. package/dist/client/{shop-DeltVH10.mjs → shop-C1u_BUn0.mjs} +5 -6
  141. package/dist/client/{shop-commerce-BD9Jsm2Z.mjs → shop-commerce-CleZdRha.mjs} +5 -6
  142. package/dist/client/{shop-commerce-store-CmXD6FDS.mjs → shop-commerce-store-ycnoB2Ce.mjs} +1 -1
  143. package/dist/client/{shopShared-B8v-lH_F.mjs → shopShared-CPhByt2a.mjs} +3 -3
  144. package/dist/client/{useDiscountCodeUi-DbWJN8ld.mjs → useDiscountCodeUi-cStSQI6C.mjs} +1 -1
  145. package/dist/client/{useEventFilters-EJIMUnqT.mjs → useEventFilters-DKPN7hSY.mjs} +26 -27
  146. package/dist/client/{usePolling-Cmh14fc7.mjs → usePolling-BKAd6pkZ.mjs} +2 -2
  147. package/dist/preview-next/before-render.mjs +37 -6
  148. package/dist/preview-next/client/runtime.mjs +4 -4
  149. package/dist/preview-next/middleware.mjs +37 -6
  150. package/dist/{previewAuthStore-CTO7CRPk.mjs → previewAuthStore-BkT1D06A.mjs} +37 -6
  151. package/dist/{sdk-runtime-Dou0GAav.mjs → sdk-runtime-hu3wr3ng.mjs} +2 -2
  152. package/dist/{separator-CI5wZNXT.mjs → separator-Bln8izQ9.mjs} +1 -1
  153. package/dist/server/components.mjs +1472 -1788
  154. package/dist/server/config-validation.mjs +1559 -1876
  155. package/dist/server/config.mjs +1559 -1876
  156. package/dist/server/data.mjs +1554 -1871
  157. package/dist/server/index.mjs +38 -7
  158. package/dist/server/next/revalidate.mjs +53 -1
  159. package/dist/server/next.mjs +1584 -1869
  160. package/dist/server/page-converter.mjs +1543 -1860
  161. package/dist/server/prebuild.mjs +1 -1
  162. package/dist/server/rendering/server.mjs +1472 -1788
  163. package/dist/server/rendering.mjs +1472 -1788
  164. package/dist/server/routing.mjs +1600 -1891
  165. package/dist/server/server.mjs +1574 -1860
  166. package/dist/server/theme-bridge.mjs +1436 -1619
  167. package/dist/server/theme.mjs +1345 -1241
  168. package/dist/server/webhooks.mjs +54 -2
  169. package/package.json +1 -1
  170. package/dist/_dts/theme-core/src/buttons/personalities/brushed-wash.d.ts +0 -16
  171. package/dist/_dts/theme-core/src/buttons/personalities/confident-chip.d.ts +0 -16
  172. package/dist/_dts/theme-core/src/buttons/personalities/earth-pill.d.ts +0 -16
  173. package/dist/_dts/theme-core/src/buttons/personalities/editorial-link.d.ts +0 -16
  174. package/dist/_dts/theme-core/src/buttons/personalities/flat-ink.d.ts +0 -20
  175. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +0 -172
  176. package/dist/_dts/theme-core/src/buttons/personalities/ink-stamp.d.ts +0 -16
  177. package/dist/_dts/theme-core/src/buttons/personalities/joy-stamp.d.ts +0 -22
  178. package/dist/_dts/theme-core/src/buttons/personalities/ornate-ritual.d.ts +0 -16
  179. package/dist/_dts/theme-core/src/buttons/personalities/pebble.d.ts +0 -16
  180. package/dist/_dts/theme-core/src/buttons/personalities/quiet-arrow.d.ts +0 -17
  181. package/dist/_dts/theme-core/src/buttons/personalities/showtime-pill.d.ts +0 -17
  182. package/dist/_dts/theme-core/src/buttons/personalities/soft-pill.d.ts +0 -16
  183. package/dist/_dts/theme-core/src/buttons/personalities/two-tone-pill.d.ts +0 -17
  184. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +0 -285
  185. package/dist/client/buttons-DoFV7KDL.mjs +0 -2115
  186. package/dist/client/foregroundContract-xICPq59x.mjs +0 -31
@@ -8649,7 +8649,7 @@ const gradientDirectionSchema$1 = z$1.enum([
8649
8649
  "to-br",
8650
8650
  "to-bl"
8651
8651
  ]);
8652
- const buttonBackgroundSchema = z$1.discriminatedUnion("type", [
8652
+ const buttonColourTreatmentSchema = z$1.discriminatedUnion("type", [
8653
8653
  z$1.object({
8654
8654
  type: z$1.literal("solid"),
8655
8655
  colorToken: opaqueButtonColourTokenSchema
@@ -8673,6 +8673,7 @@ const buttonBackgroundSchema = z$1.discriminatedUnion("type", [
8673
8673
  role: z$1.literal("link")
8674
8674
  })
8675
8675
  ]);
8676
+ const buttonBackgroundSchema = buttonColourTreatmentSchema;
8676
8677
  const effectApplicationSchema$1 = z$1.object({
8677
8678
  effectId: z$1.string(),
8678
8679
  options: z$1.record(z$1.string(), z$1.json()).optional()
@@ -8884,265 +8885,429 @@ function isUnknownArray$1(value) {
8884
8885
  return Array.isArray(value);
8885
8886
  }
8886
8887
  //#endregion
8887
- //#region ../theme-core/src/buttons/personalities/types.ts
8888
- function asButtonPersonalityId(value) {
8889
- if (value.length === 0) throw new Error("ButtonPersonalityId must be a non-empty string");
8890
- return value;
8888
+ //#region ../theme-core/src/buttons/styles/domain.ts
8889
+ const PUBLIC_BUTTON_ROLES = [
8890
+ "primary",
8891
+ "secondary",
8892
+ "outline",
8893
+ "ghost",
8894
+ "accent"
8895
+ ];
8896
+ function defineButtonStyleRecipe(recipe) {
8897
+ return recipe;
8898
+ }
8899
+ function materializeButtonRoles(definitions) {
8900
+ const primary = materializeCompleteRole("primary", definitions.primary.appearance);
8901
+ const secondary = materializeCompleteRole("secondary", definitions.secondary.appearance);
8902
+ const completeRoles = {
8903
+ primary,
8904
+ secondary
8905
+ };
8906
+ return {
8907
+ primary,
8908
+ secondary,
8909
+ outline: materializeSupportingRole("outline", definitions.outline, completeRoles),
8910
+ ghost: materializeSupportingRole("ghost", definitions.ghost, completeRoles),
8911
+ accent: materializeSupportingRole("accent", definitions.accent, completeRoles)
8912
+ };
8891
8913
  }
8892
- const buttonPersonalityIdSchema = z$1.string().min(1).transform((value) => asButtonPersonalityId(value));
8893
- z$1.object({
8894
- id: buttonPersonalityIdSchema,
8895
- name: z$1.string().min(1),
8896
- description: z$1.string().min(1),
8897
- tags: styleTagsSchema,
8898
- buttonSystem: buttonSystemSchema
8899
- });
8900
- /**
8901
- * Helper for personality file modules to keep the call site short and
8902
- * type-safe. `as const satisfies ...` would also work but produces wider
8903
- * types at use sites.
8904
- */
8905
- function defineButtonPersonality(input) {
8914
+ function resolveButtonStyleRecipe(recipe, parameters) {
8915
+ const parsedParameters = recipe.parameterSchema.safeParse(parameters);
8916
+ if (!parsedParameters.success) return {
8917
+ kind: "error",
8918
+ error: {
8919
+ kind: "invalid-parameters",
8920
+ styleId: recipe.id,
8921
+ issues: parsedParameters.error.issues.map((issue) => issue.message)
8922
+ }
8923
+ };
8924
+ const definition = recipe.defineSystem(parsedParameters.data);
8925
+ const roles = materializeButtonRoles(definition.roles);
8926
+ const buttonSystem = {
8927
+ global: definition.global,
8928
+ variants: PUBLIC_BUTTON_ROLES.map((role) => roles[role]),
8929
+ ...definition.sizes ? { sizes: definition.sizes } : {}
8930
+ };
8931
+ const parsedButtonSystem = buttonSystemSchema.safeParse(buttonSystem);
8932
+ if (!parsedButtonSystem.success) return {
8933
+ kind: "error",
8934
+ error: {
8935
+ kind: "invalid-button-system",
8936
+ styleId: recipe.id,
8937
+ issues: parsedButtonSystem.error.issues.map((issue) => issue.message)
8938
+ }
8939
+ };
8906
8940
  return {
8907
- id: asButtonPersonalityId(input.id),
8908
- name: input.name,
8909
- description: input.description,
8910
- tags: input.tags,
8911
- buttonSystem: buttonSystemSchema.parse(input.buttonSystem)
8941
+ kind: "resolved",
8942
+ buttonSystem: parsedButtonSystem.data
8912
8943
  };
8913
8944
  }
8945
+ function materializeSupportingRole(role, definition, completeRoles) {
8946
+ if (definition.kind === "complete") return materializeCompleteRole(role, definition.appearance);
8947
+ return {
8948
+ ...completeRoles[definition.from],
8949
+ ...definition.overrides,
8950
+ id: role,
8951
+ name: roleName(role),
8952
+ enabled: true,
8953
+ priority: 3
8954
+ };
8955
+ }
8956
+ function materializeCompleteRole(role, appearance) {
8957
+ return {
8958
+ ...appearance,
8959
+ id: role,
8960
+ name: roleName(role),
8961
+ enabled: true,
8962
+ priority: rolePriority(role)
8963
+ };
8964
+ }
8965
+ function roleName(role) {
8966
+ return role.charAt(0).toUpperCase() + role.slice(1);
8967
+ }
8968
+ function rolePriority(role) {
8969
+ if (role === "primary") return 1;
8970
+ if (role === "secondary") return 2;
8971
+ return 3;
8972
+ }
8914
8973
  //#endregion
8915
- //#region ../theme-core/src/buttons/personalities/brushed-wash.ts
8916
- /**
8917
- * Brushed Wash — gradient backgrounds that read as watercolour washes.
8918
- * Generous padding, soft shadows; pairs with vibrant organic brands.
8919
- */
8920
- const brushedWash = defineButtonPersonality({
8921
- id: "brushed-wash",
8922
- name: "Brushed Wash",
8923
- description: "Watercolour-gradient buttons with soft shadows and generous padding.",
8974
+ //#region ../theme-core/src/buttons/styles/selection.ts
8975
+ const BUTTON_STYLE_IDS = [
8976
+ "soft-pill",
8977
+ "earth-pill",
8978
+ "confident-chip",
8979
+ "editorial-link",
8980
+ "pebble",
8981
+ "ink-stamp",
8982
+ "flat-ink",
8983
+ "brushed-wash",
8984
+ "showtime-pill",
8985
+ "joy-stamp",
8986
+ "ornate-ritual",
8987
+ "quiet-arrow"
8988
+ ];
8989
+ const quietArrowParametersSchema = z$1.object({ secondaryTreatment: z$1.enum(["outlined", "solid-accent"]) }).strict();
8990
+ const emptyParametersSchema$1 = z$1.object({}).strict();
8991
+ function selectionBranch(styleId, parameters) {
8992
+ return z$1.object({
8993
+ styleId: z$1.literal(styleId),
8994
+ parameters
8995
+ }).strict();
8996
+ }
8997
+ const buttonStyleSelectionSchema = z$1.discriminatedUnion("styleId", [
8998
+ selectionBranch("soft-pill", emptyParametersSchema$1),
8999
+ selectionBranch("earth-pill", emptyParametersSchema$1),
9000
+ selectionBranch("confident-chip", emptyParametersSchema$1),
9001
+ selectionBranch("editorial-link", emptyParametersSchema$1),
9002
+ selectionBranch("pebble", emptyParametersSchema$1),
9003
+ selectionBranch("ink-stamp", emptyParametersSchema$1),
9004
+ selectionBranch("flat-ink", emptyParametersSchema$1),
9005
+ selectionBranch("brushed-wash", emptyParametersSchema$1),
9006
+ selectionBranch("showtime-pill", emptyParametersSchema$1),
9007
+ selectionBranch("joy-stamp", emptyParametersSchema$1),
9008
+ selectionBranch("ornate-ritual", emptyParametersSchema$1),
9009
+ selectionBranch("quiet-arrow", quietArrowParametersSchema)
9010
+ ]);
9011
+ //#endregion
9012
+ //#region ../theme-core/src/buttons/styles/recipes/quietArrow.ts
9013
+ const quietArrowRecipe = defineButtonStyleRecipe({
9014
+ id: "quiet-arrow",
9015
+ accessibilityLabel: "Wide uppercase buttons with trailing arrows",
8924
9016
  tags: {
8925
9017
  tone: "classic",
8926
- energy: "vibrant",
8927
- motion: "standard",
8928
- era: "organic"
9018
+ energy: "calm",
9019
+ motion: "subtle",
9020
+ era: "editorial"
8929
9021
  },
8930
- buttonSystem: {
9022
+ parameterSchema: quietArrowParametersSchema,
9023
+ defaultParameters: { secondaryTreatment: "outlined" },
9024
+ controls: [{
9025
+ kind: "choice",
9026
+ parameter: "secondaryTreatment",
9027
+ label: "Secondary button treatment",
9028
+ options: [{
9029
+ value: "outlined",
9030
+ label: "Outlined"
9031
+ }, {
9032
+ value: "solid-accent",
9033
+ label: "Solid accent"
9034
+ }]
9035
+ }],
9036
+ defineSystem: (parameters) => ({
8931
9037
  global: {
8932
9038
  cornerStyle: "rounded",
8933
- shadow: "low",
8934
- textTransform: "none",
9039
+ textTransform: "uppercase",
8935
9040
  fontWeight: 500,
8936
9041
  borderWidth: 1,
9042
+ typography: "body",
9043
+ fontSize: "text-sm",
9044
+ letterSpacing: "loose",
8937
9045
  hoverTransform: "none",
8938
9046
  hoverColor: "none"
8939
9047
  },
8940
9048
  sizes: {
8941
9049
  sm: {
8942
- padding: "0.75rem 2rem",
9050
+ padding: "0.625rem 1.25rem",
9051
+ fontSize: "text-xs"
9052
+ },
9053
+ md: {
9054
+ padding: "0.8125rem 1.75rem",
8943
9055
  fontSize: "text-sm"
8944
9056
  },
8945
- md: { padding: "1rem 2.5rem" },
8946
9057
  lg: {
8947
- padding: "1.25rem 3rem",
8948
- fontSize: "text-lg"
9058
+ padding: "0.9375rem 2.125rem",
9059
+ fontSize: "text-sm"
8949
9060
  },
8950
9061
  xl: {
8951
- padding: "1.625rem 3.75rem",
8952
- fontSize: "text-xl"
9062
+ padding: "1.0625rem 2.5rem",
9063
+ fontSize: "text-base"
8953
9064
  }
8954
9065
  },
8955
- variants: [
8956
- {
8957
- id: "primary",
8958
- name: "Primary",
8959
- enabled: true,
8960
- priority: 1,
8961
- background: {
8962
- type: "gradient",
8963
- stops: ["primary", "accent"],
8964
- direction: "to-r",
8965
- foregroundToken: "primaryForeground"
8966
- },
8967
- borderRadius: "rounded-lg",
8968
- shadow: {
8969
- elevation: "low",
8970
- softness: "soft",
8971
- position: "bottom"
9066
+ roles: {
9067
+ primary: {
9068
+ kind: "complete",
9069
+ appearance: {
9070
+ background: {
9071
+ type: "solid",
9072
+ colorToken: unsafeAsOpaqueButtonColourToken("primary")
9073
+ },
9074
+ borderRadius: "rounded-xl",
9075
+ affordance: { iconId: "ArrowRight" },
9076
+ effects: { hover: [{
9077
+ effectId: "darken-background",
9078
+ options: { amount: 100 }
9079
+ }] }
8972
9080
  }
8973
9081
  },
8974
- {
8975
- id: "secondary",
8976
- name: "Secondary",
8977
- enabled: true,
8978
- priority: 2,
8979
- background: {
8980
- type: "gradient",
8981
- stops: ["secondary", "accent"],
8982
- direction: "to-br",
8983
- foregroundToken: "primaryForeground"
8984
- },
8985
- borderRadius: "rounded-lg",
8986
- shadow: {
8987
- elevation: "low",
8988
- softness: "soft",
8989
- position: "bottom"
9082
+ secondary: {
9083
+ kind: "complete",
9084
+ appearance: parameters.secondaryTreatment === "solid-accent" ? {
9085
+ background: {
9086
+ type: "solid",
9087
+ colorToken: unsafeAsOpaqueButtonColourToken("accent")
9088
+ },
9089
+ borderRadius: "rounded-xl",
9090
+ affordance: { iconId: "ArrowRight" },
9091
+ effects: { hover: [{
9092
+ effectId: "darken-background",
9093
+ options: { amount: 100 }
9094
+ }] }
9095
+ } : {
9096
+ background: {
9097
+ type: "surface",
9098
+ role: "link"
9099
+ },
9100
+ borderRadius: "rounded-xl",
9101
+ border: { widthClass: "border" },
9102
+ affordance: { iconId: "ArrowRight" },
9103
+ effects: { hover: [{
9104
+ effectId: "background-on-hover",
9105
+ options: { colorToken: "surfaceAlt" }
9106
+ }] }
8990
9107
  }
8991
9108
  },
8992
- {
8993
- id: "outline",
8994
- name: "Outline",
8995
- enabled: true,
8996
- priority: 3,
8997
- background: {
8998
- type: "surface",
8999
- role: "link"
9000
- },
9001
- borderRadius: "rounded-lg",
9002
- border: { widthClass: "border" },
9003
- effects: { hover: [{
9004
- effectId: "background-on-hover",
9005
- options: { colorToken: "surface" }
9006
- }] }
9109
+ outline: {
9110
+ kind: "complete",
9111
+ appearance: {
9112
+ background: {
9113
+ type: "surface",
9114
+ role: "link"
9115
+ },
9116
+ borderRadius: "rounded-xl",
9117
+ border: { widthClass: "border" }
9118
+ }
9007
9119
  },
9008
- {
9009
- id: "ghost",
9010
- name: "Ghost",
9011
- enabled: true,
9012
- priority: 3,
9013
- background: {
9014
- type: "surface",
9015
- role: "link"
9016
- },
9017
- borderRadius: "rounded-lg",
9018
- effects: { hover: [{
9019
- effectId: "background-on-hover",
9020
- options: { colorToken: "surface" }
9021
- }] }
9120
+ ghost: {
9121
+ kind: "complete",
9122
+ appearance: {
9123
+ background: {
9124
+ type: "surface",
9125
+ role: "link"
9126
+ },
9127
+ borderRadius: "rounded-xl"
9128
+ }
9129
+ },
9130
+ accent: {
9131
+ kind: "derive",
9132
+ from: "primary",
9133
+ overrides: { background: {
9134
+ type: "solid",
9135
+ colorToken: unsafeAsOpaqueButtonColourToken("accent")
9136
+ } }
9022
9137
  }
9023
- ]
9024
- }
9138
+ }
9139
+ })
9025
9140
  });
9026
9141
  //#endregion
9027
- //#region ../theme-core/src/buttons/personalities/confident-chip.ts
9028
- /**
9029
- * Confident Chip — moderate-radius solid buttons that read as competent and
9030
- * direct. Default for Clear Professional; works for any modern brand voice.
9031
- */
9032
- const confidentChip = defineButtonPersonality({
9033
- id: "confident-chip",
9034
- name: "Confident Chip",
9035
- description: "Mid-radius solid buttons with a crisp hover.",
9142
+ //#region ../theme-core/src/buttons/styles/recipes/defineStaticButtonStyleRecipe.ts
9143
+ const emptyParametersSchema = z$1.object({}).strict();
9144
+ function defineStaticButtonStyleRecipe(input) {
9145
+ const system = normalizeSystem(input.system);
9146
+ return defineButtonStyleRecipe({
9147
+ id: input.id,
9148
+ accessibilityLabel: input.accessibilityLabel,
9149
+ tags: input.tags,
9150
+ parameterSchema: emptyParametersSchema,
9151
+ defaultParameters: {},
9152
+ controls: [],
9153
+ defineSystem: () => system
9154
+ });
9155
+ }
9156
+ function normalizeSystem(input) {
9157
+ return {
9158
+ global: buttonGlobalSettingsSchema.parse(input.global),
9159
+ ...input.sizes ? { sizes: input.sizes } : {},
9160
+ roles: {
9161
+ primary: normalizeCompleteRole(input.roles.primary),
9162
+ secondary: normalizeCompleteRole(input.roles.secondary),
9163
+ outline: normalizeSupportingRole(input.roles.outline),
9164
+ ghost: normalizeSupportingRole(input.roles.ghost),
9165
+ accent: normalizeSupportingRole(input.roles.accent)
9166
+ }
9167
+ };
9168
+ }
9169
+ function normalizeCompleteRole(role) {
9170
+ return {
9171
+ kind: "complete",
9172
+ appearance: normalizeAppearance(role.appearance)
9173
+ };
9174
+ }
9175
+ function normalizeSupportingRole(role) {
9176
+ if (role.kind === "complete") return normalizeCompleteRole(role);
9177
+ return {
9178
+ kind: "derive",
9179
+ from: role.from,
9180
+ ...role.overrides ? { overrides: normalizeAppearanceOverrides(role.overrides) } : {}
9181
+ };
9182
+ }
9183
+ function normalizeAppearance(appearance) {
9184
+ const { background, hoverBackgroundToken, ...rest } = appearance;
9185
+ return {
9186
+ ...rest,
9187
+ background: buttonColourTreatmentSchema.parse(background),
9188
+ ...hoverBackgroundToken ? { hoverBackgroundToken: opaqueButtonColourTokenSchema.parse(hoverBackgroundToken) } : {}
9189
+ };
9190
+ }
9191
+ function normalizeAppearanceOverrides(overrides) {
9192
+ const { background, hoverBackgroundToken, ...rest } = overrides;
9193
+ return {
9194
+ ...rest,
9195
+ ...background ? { background: buttonColourTreatmentSchema.parse(background) } : {},
9196
+ ...hoverBackgroundToken ? { hoverBackgroundToken: opaqueButtonColourTokenSchema.parse(hoverBackgroundToken) } : {}
9197
+ };
9198
+ }
9199
+ //#endregion
9200
+ //#region ../theme-core/src/buttons/styles/recipes/staticRecipes.ts
9201
+ const softPillRecipe = defineStaticButtonStyleRecipe({
9202
+ id: "soft-pill",
9203
+ accessibilityLabel: "Rounded pill buttons with a gentle hover lift",
9036
9204
  tags: {
9037
9205
  tone: "classic",
9038
9206
  energy: "calm",
9039
- motion: "standard",
9040
- era: "modern"
9207
+ motion: "subtle",
9208
+ era: "organic"
9041
9209
  },
9042
- buttonSystem: {
9210
+ system: {
9043
9211
  global: {
9044
- cornerStyle: "rounded",
9045
- shadow: "medium",
9212
+ cornerStyle: "pill",
9213
+ shadow: "low",
9046
9214
  textTransform: "none",
9047
- fontWeight: 600,
9048
- borderWidth: 1,
9049
- hoverTransform: "none",
9215
+ fontWeight: 500,
9216
+ borderWidth: 2,
9217
+ hoverTransform: "lift",
9050
9218
  hoverColor: "none"
9051
9219
  },
9052
- variants: [
9053
- {
9054
- id: "primary",
9055
- name: "Primary",
9056
- enabled: true,
9057
- priority: 1,
9058
- background: {
9059
- type: "solid",
9060
- colorToken: "primary"
9061
- },
9062
- borderRadius: "rounded-md",
9063
- shadow: {
9064
- elevation: "medium",
9065
- softness: "soft",
9066
- position: "bottom"
9067
- },
9068
- effects: {
9069
- hover: [{
9070
- effectId: "darken-background",
9071
- options: { amount: 100 }
9072
- }],
9073
- active: [{
9074
- effectId: "scale-down",
9075
- options: { scale: "0.97" }
9076
- }]
9220
+ roles: {
9221
+ primary: {
9222
+ kind: "complete",
9223
+ appearance: {
9224
+ background: {
9225
+ type: "solid",
9226
+ colorToken: "primary"
9227
+ },
9228
+ borderRadius: "rounded-full",
9229
+ shadow: {
9230
+ elevation: "low",
9231
+ softness: "soft",
9232
+ position: "bottom"
9233
+ },
9234
+ effects: {
9235
+ hover: [{
9236
+ effectId: "lift",
9237
+ options: { translateY: "-1px" }
9238
+ }],
9239
+ active: [{
9240
+ effectId: "scale-down",
9241
+ options: { scale: "0.98" }
9242
+ }]
9243
+ }
9077
9244
  }
9078
9245
  },
9079
- {
9080
- id: "secondary",
9081
- name: "Secondary",
9082
- enabled: true,
9083
- priority: 2,
9084
- background: {
9085
- type: "solid",
9086
- colorToken: "surface"
9087
- },
9088
- borderRadius: "rounded-md",
9089
- border: { widthClass: "border" },
9090
- effects: { hover: [{
9091
- effectId: "background-on-hover",
9092
- options: { colorToken: "background" }
9093
- }] }
9246
+ secondary: {
9247
+ kind: "complete",
9248
+ appearance: {
9249
+ background: {
9250
+ type: "surface",
9251
+ role: "link"
9252
+ },
9253
+ borderRadius: "rounded-full",
9254
+ border: { widthClass: "border-2" },
9255
+ effects: { hover: [{
9256
+ effectId: "background-on-hover",
9257
+ options: { colorToken: "surface" }
9258
+ }] }
9259
+ }
9094
9260
  },
9095
- {
9096
- id: "outline",
9097
- name: "Outline",
9098
- enabled: true,
9099
- priority: 3,
9100
- background: {
9101
- type: "surface",
9102
- role: "link"
9103
- },
9104
- borderRadius: "rounded-md",
9105
- border: { widthClass: "border" },
9106
- effects: { hover: [{
9107
- effectId: "background-on-hover",
9108
- options: { colorToken: "surface" }
9109
- }] }
9261
+ outline: {
9262
+ kind: "complete",
9263
+ appearance: {
9264
+ background: {
9265
+ type: "surface",
9266
+ role: "link"
9267
+ },
9268
+ borderRadius: "rounded-full",
9269
+ border: { widthClass: "border" },
9270
+ effects: { hover: [{
9271
+ effectId: "background-on-hover",
9272
+ options: { colorToken: "surface" }
9273
+ }] }
9274
+ }
9110
9275
  },
9111
- {
9112
- id: "ghost",
9113
- name: "Ghost",
9114
- enabled: true,
9115
- priority: 3,
9116
- background: {
9117
- type: "surface",
9118
- role: "link"
9119
- },
9120
- borderRadius: "rounded-md",
9121
- effects: { hover: [{
9122
- effectId: "background-on-hover",
9123
- options: { colorToken: "surface" }
9124
- }] }
9276
+ ghost: {
9277
+ kind: "complete",
9278
+ appearance: {
9279
+ background: {
9280
+ type: "surface",
9281
+ role: "link"
9282
+ },
9283
+ borderRadius: "rounded-full",
9284
+ effects: { hover: [{
9285
+ effectId: "background-on-hover",
9286
+ options: { colorToken: "surface" }
9287
+ }] }
9288
+ }
9289
+ },
9290
+ accent: {
9291
+ kind: "derive",
9292
+ from: "primary",
9293
+ overrides: { background: {
9294
+ type: "solid",
9295
+ colorToken: "accent"
9296
+ } }
9125
9297
  }
9126
- ]
9298
+ }
9127
9299
  }
9128
9300
  });
9129
- //#endregion
9130
- //#region ../theme-core/src/buttons/personalities/earth-pill.ts
9131
- /**
9132
- * Earth Pill - warm studio pills with compact, primary-coloured ghost CTAs.
9133
- * Built for grounded editorial wellness styles such as Soft Earth.
9134
- */
9135
- const earthPill = defineButtonPersonality({
9301
+ const earthPillRecipe = defineStaticButtonStyleRecipe({
9136
9302
  id: "earth-pill",
9137
- name: "Earth Pill",
9138
- description: "Compact terracotta pills with quiet primary-coloured ghost CTAs.",
9303
+ accessibilityLabel: "Compact rounded buttons with a quiet hover lift",
9139
9304
  tags: {
9140
9305
  tone: "classic",
9141
9306
  energy: "calm",
9142
9307
  motion: "subtle",
9143
9308
  era: "organic"
9144
9309
  },
9145
- buttonSystem: {
9310
+ system: {
9146
9311
  global: {
9147
9312
  cornerStyle: "pill",
9148
9313
  shadow: "low",
@@ -9169,576 +9334,547 @@ const earthPill = defineButtonPersonality({
9169
9334
  fontSize: "text-xl"
9170
9335
  }
9171
9336
  },
9172
- variants: [
9173
- {
9174
- id: "primary",
9175
- name: "Primary",
9176
- enabled: true,
9177
- priority: 1,
9178
- background: {
9179
- type: "solid",
9180
- colorToken: "primary"
9181
- },
9182
- borderRadius: "rounded-full",
9183
- shadow: {
9184
- elevation: "low",
9185
- softness: "soft",
9186
- position: "bottom"
9187
- },
9188
- effects: {
9189
- hover: [{
9190
- effectId: "lift",
9191
- options: { translateY: "-1px" }
9192
- }, {
9193
- effectId: "background-on-hover",
9194
- options: { colorToken: "accent" }
9195
- }],
9196
- active: [{
9197
- effectId: "scale-down",
9198
- options: { scale: "0.98" }
9199
- }]
9337
+ roles: {
9338
+ primary: {
9339
+ kind: "complete",
9340
+ appearance: {
9341
+ background: {
9342
+ type: "solid",
9343
+ colorToken: "primary"
9344
+ },
9345
+ borderRadius: "rounded-full",
9346
+ shadow: {
9347
+ elevation: "low",
9348
+ softness: "soft",
9349
+ position: "bottom"
9350
+ },
9351
+ effects: {
9352
+ hover: [{
9353
+ effectId: "lift",
9354
+ options: { translateY: "-1px" }
9355
+ }, {
9356
+ effectId: "background-on-hover",
9357
+ options: { colorToken: "accent" }
9358
+ }],
9359
+ active: [{
9360
+ effectId: "scale-down",
9361
+ options: { scale: "0.98" }
9362
+ }]
9363
+ }
9200
9364
  }
9201
9365
  },
9202
- {
9203
- id: "secondary",
9204
- name: "Secondary",
9205
- enabled: true,
9206
- priority: 2,
9207
- background: {
9208
- type: "surface",
9209
- role: "link"
9210
- },
9211
- borderRadius: "rounded-full",
9212
- border: { widthClass: "border" },
9213
- effects: { hover: [{
9214
- effectId: "background-on-hover",
9215
- options: { colorToken: "muted" }
9216
- }] }
9366
+ secondary: {
9367
+ kind: "complete",
9368
+ appearance: {
9369
+ background: {
9370
+ type: "surface",
9371
+ role: "link"
9372
+ },
9373
+ borderRadius: "rounded-full",
9374
+ border: { widthClass: "border" },
9375
+ effects: { hover: [{
9376
+ effectId: "background-on-hover",
9377
+ options: { colorToken: "muted" }
9378
+ }] }
9379
+ }
9217
9380
  },
9218
- {
9219
- id: "outline",
9220
- name: "Outline",
9221
- enabled: true,
9222
- priority: 3,
9223
- background: {
9224
- type: "surface",
9225
- role: "link"
9226
- },
9227
- borderRadius: "rounded-full",
9228
- border: { widthClass: "border" },
9229
- effects: { hover: [{
9230
- effectId: "background-on-hover",
9231
- options: { colorToken: "surfaceAlt" }
9232
- }] }
9381
+ outline: {
9382
+ kind: "complete",
9383
+ appearance: {
9384
+ background: {
9385
+ type: "surface",
9386
+ role: "link"
9387
+ },
9388
+ borderRadius: "rounded-full",
9389
+ border: { widthClass: "border" },
9390
+ effects: { hover: [{
9391
+ effectId: "background-on-hover",
9392
+ options: { colorToken: "surfaceAlt" }
9393
+ }] }
9394
+ }
9233
9395
  },
9234
- {
9235
- id: "ghost",
9236
- name: "Ghost",
9237
- enabled: true,
9238
- priority: 3,
9239
- background: {
9240
- type: "surface",
9241
- role: "link"
9242
- },
9243
- borderRadius: "rounded-full",
9244
- shadow: {
9245
- elevation: "none",
9246
- softness: null,
9247
- position: "bottom"
9248
- },
9249
- sizes: {
9250
- sm: {
9251
- padding: "0.25rem 0",
9252
- fontSize: "text-sm"
9396
+ ghost: {
9397
+ kind: "complete",
9398
+ appearance: {
9399
+ background: {
9400
+ type: "surface",
9401
+ role: "link"
9253
9402
  },
9254
- md: { padding: "0.375rem 0" },
9255
- lg: {
9256
- padding: "0.5rem 0",
9257
- fontSize: "text-lg"
9403
+ borderRadius: "rounded-full",
9404
+ shadow: {
9405
+ elevation: "none",
9406
+ softness: null,
9407
+ position: "bottom"
9258
9408
  },
9259
- xl: {
9260
- padding: "0.625rem 0",
9261
- fontSize: "text-xl"
9409
+ sizes: {
9410
+ sm: {
9411
+ padding: "0.25rem 0",
9412
+ fontSize: "text-sm"
9413
+ },
9414
+ md: { padding: "0.375rem 0" },
9415
+ lg: {
9416
+ padding: "0.5rem 0",
9417
+ fontSize: "text-lg"
9418
+ },
9419
+ xl: {
9420
+ padding: "0.625rem 0",
9421
+ fontSize: "text-xl"
9422
+ }
9262
9423
  }
9263
9424
  }
9425
+ },
9426
+ accent: {
9427
+ kind: "derive",
9428
+ from: "primary",
9429
+ overrides: { background: {
9430
+ type: "solid",
9431
+ colorToken: "accent"
9432
+ } }
9264
9433
  }
9265
- ]
9434
+ }
9266
9435
  }
9267
9436
  });
9268
- //#endregion
9269
- //#region ../theme-core/src/buttons/personalities/editorial-link.ts
9270
- /**
9271
- * Editorial Link — all variants are link-style with a growing underline.
9272
- * Default for Warm Editorial and Quiet Luxury; reads as refined and quiet.
9273
- */
9274
- const editorialLink = defineButtonPersonality({
9275
- id: "editorial-link",
9276
- name: "Editorial Link",
9277
- description: "Link-style with a growing underline. Refined, typographic.",
9437
+ const confidentChipRecipe = defineStaticButtonStyleRecipe({
9438
+ id: "confident-chip",
9439
+ accessibilityLabel: "Moderately rounded solid buttons with a crisp hover",
9278
9440
  tags: {
9279
- tone: "minimal",
9441
+ tone: "classic",
9280
9442
  energy: "calm",
9281
- motion: "subtle",
9282
- era: "editorial"
9443
+ motion: "standard",
9444
+ era: "modern"
9283
9445
  },
9284
- buttonSystem: {
9446
+ system: {
9285
9447
  global: {
9286
- cornerStyle: "square",
9448
+ cornerStyle: "rounded",
9449
+ shadow: "medium",
9287
9450
  textTransform: "none",
9288
- fontWeight: 500,
9451
+ fontWeight: 600,
9289
9452
  borderWidth: 1,
9290
9453
  hoverTransform: "none",
9291
9454
  hoverColor: "none"
9292
9455
  },
9293
- variants: [
9294
- {
9295
- id: "primary",
9296
- name: "Primary",
9297
- enabled: true,
9298
- priority: 1,
9299
- background: {
9300
- type: "surface",
9301
- role: "link"
9302
- },
9303
- borderRadius: "rounded-none",
9304
- sizes: {
9305
- sm: { padding: "0.25rem 0" },
9306
- md: { padding: "0.5rem 0" },
9307
- lg: { padding: "0.625rem 0" },
9308
- xl: { padding: "0.75rem 0" }
9309
- },
9310
- effects: { base: [{
9311
- effectId: "border-bottom-grow",
9312
- options: {
9313
- height: 2,
9314
- colorToken: "text",
9315
- origin: "left"
9456
+ roles: {
9457
+ primary: {
9458
+ kind: "complete",
9459
+ appearance: {
9460
+ background: {
9461
+ type: "solid",
9462
+ colorToken: "primary"
9463
+ },
9464
+ borderRadius: "rounded-md",
9465
+ shadow: {
9466
+ elevation: "medium",
9467
+ softness: "soft",
9468
+ position: "bottom"
9469
+ },
9470
+ effects: {
9471
+ hover: [{
9472
+ effectId: "darken-background",
9473
+ options: { amount: 100 }
9474
+ }],
9475
+ active: [{
9476
+ effectId: "scale-down",
9477
+ options: { scale: "0.97" }
9478
+ }]
9316
9479
  }
9317
- }] }
9480
+ }
9318
9481
  },
9319
- {
9320
- id: "secondary",
9321
- name: "Secondary",
9322
- enabled: true,
9323
- priority: 2,
9324
- background: {
9325
- type: "surface",
9326
- role: "link"
9327
- },
9328
- borderRadius: "rounded-none",
9329
- sizes: {
9330
- sm: { padding: "0.25rem 0" },
9331
- md: { padding: "0.5rem 0" },
9332
- lg: { padding: "0.625rem 0" },
9333
- xl: { padding: "0.75rem 0" }
9334
- },
9335
- effects: { base: [{
9336
- effectId: "border-bottom-grow",
9337
- options: {
9338
- height: 1,
9339
- colorToken: "mutedText",
9340
- origin: "left"
9341
- }
9342
- }] }
9482
+ secondary: {
9483
+ kind: "complete",
9484
+ appearance: {
9485
+ background: {
9486
+ type: "solid",
9487
+ colorToken: "surface"
9488
+ },
9489
+ borderRadius: "rounded-md",
9490
+ border: { widthClass: "border" },
9491
+ effects: { hover: [{
9492
+ effectId: "background-on-hover",
9493
+ options: { colorToken: "background" }
9494
+ }] }
9495
+ }
9343
9496
  },
9344
- {
9345
- id: "outline",
9346
- name: "Outline",
9347
- enabled: true,
9348
- priority: 3,
9349
- background: {
9350
- type: "surface",
9351
- role: "link"
9352
- },
9353
- borderRadius: "rounded-none",
9354
- sizes: {
9355
- sm: { padding: "0.25rem 0" },
9356
- md: { padding: "0.5rem 0" },
9357
- lg: { padding: "0.625rem 0" },
9358
- xl: { padding: "0.75rem 0" }
9359
- },
9360
- effects: { base: [{
9361
- effectId: "border-bottom-grow",
9362
- options: {
9363
- height: 1,
9364
- colorToken: "accent",
9365
- origin: "left"
9366
- }
9367
- }] }
9497
+ outline: {
9498
+ kind: "complete",
9499
+ appearance: {
9500
+ background: {
9501
+ type: "surface",
9502
+ role: "link"
9503
+ },
9504
+ borderRadius: "rounded-md",
9505
+ border: { widthClass: "border" },
9506
+ effects: { hover: [{
9507
+ effectId: "background-on-hover",
9508
+ options: { colorToken: "surface" }
9509
+ }] }
9510
+ }
9368
9511
  },
9369
- {
9370
- id: "ghost",
9371
- name: "Ghost",
9372
- enabled: true,
9373
- priority: 3,
9374
- background: {
9375
- type: "surface",
9376
- role: "link"
9377
- },
9378
- borderRadius: "rounded-none",
9379
- sizes: {
9380
- sm: { padding: "0.25rem 0" },
9381
- md: { padding: "0.5rem 0" },
9382
- lg: { padding: "0.625rem 0" },
9383
- xl: { padding: "0.75rem 0" }
9512
+ ghost: {
9513
+ kind: "complete",
9514
+ appearance: {
9515
+ background: {
9516
+ type: "surface",
9517
+ role: "link"
9518
+ },
9519
+ borderRadius: "rounded-md",
9520
+ effects: { hover: [{
9521
+ effectId: "background-on-hover",
9522
+ options: { colorToken: "surface" }
9523
+ }] }
9384
9524
  }
9525
+ },
9526
+ accent: {
9527
+ kind: "derive",
9528
+ from: "primary",
9529
+ overrides: { background: {
9530
+ type: "solid",
9531
+ colorToken: "accent"
9532
+ } }
9385
9533
  }
9386
- ]
9534
+ }
9387
9535
  }
9388
9536
  });
9389
- //#endregion
9390
- //#region ../theme-core/src/buttons/personalities/flat-ink.ts
9391
- /**
9392
- * Flat Ink — a solid ink primary, a hairline ghost secondary, and a single
9393
- * amber accent climax, all completely flat (no drop shadow) with a modest
9394
- * radius. Reads as grounded, editorial and clinician-precise: the Fulcrum
9395
- * physiotherapy voice. The primary shifts to the secondary (moss) on hover and
9396
- * every variant lifts 2px; the amber accent is meant to be used sparingly as
9397
- * the page's one conversion climax.
9398
- */
9399
- const flatInk = defineButtonPersonality({
9400
- id: "flat-ink",
9401
- name: "Flat Ink",
9402
- description: "Flat solid-ink primary, hairline ghost secondary, and a single amber accent climax — modest radius, no shadow.",
9537
+ const editorialSizes = {
9538
+ sm: { padding: "0.25rem 0" },
9539
+ md: { padding: "0.5rem 0" },
9540
+ lg: { padding: "0.625rem 0" },
9541
+ xl: { padding: "0.75rem 0" }
9542
+ };
9543
+ const editorialLinkRecipe = defineStaticButtonStyleRecipe({
9544
+ id: "editorial-link",
9545
+ accessibilityLabel: "Flat typographic buttons with an underline treatment",
9403
9546
  tags: {
9404
- tone: "classic",
9547
+ tone: "minimal",
9405
9548
  energy: "calm",
9406
9549
  motion: "subtle",
9407
9550
  era: "editorial"
9408
9551
  },
9409
- buttonSystem: {
9552
+ system: {
9410
9553
  global: {
9411
- cornerStyle: "rounded",
9554
+ cornerStyle: "square",
9412
9555
  textTransform: "none",
9413
- fontWeight: 600,
9556
+ fontWeight: 500,
9414
9557
  borderWidth: 1,
9415
- typography: "body",
9416
- letterSpacing: "tight",
9417
- paddingPreset: "default",
9418
- hoverTransform: "lift",
9558
+ hoverTransform: "none",
9419
9559
  hoverColor: "none"
9420
9560
  },
9421
- sizes: {
9422
- sm: {
9423
- padding: "0.625rem 1.125rem",
9424
- fontSize: "text-sm"
9561
+ roles: {
9562
+ primary: {
9563
+ kind: "complete",
9564
+ appearance: {
9565
+ background: {
9566
+ type: "surface",
9567
+ role: "link"
9568
+ },
9569
+ borderRadius: "rounded-none",
9570
+ sizes: editorialSizes,
9571
+ effects: { base: [{
9572
+ effectId: "border-bottom-grow",
9573
+ options: {
9574
+ height: 2,
9575
+ colorToken: "text",
9576
+ origin: "left"
9577
+ }
9578
+ }] }
9579
+ }
9425
9580
  },
9426
- md: { padding: "0.8125rem 1.375rem" },
9427
- lg: {
9428
- padding: "0.9375rem 1.625rem",
9429
- fontSize: "text-lg"
9581
+ secondary: {
9582
+ kind: "complete",
9583
+ appearance: {
9584
+ background: {
9585
+ type: "surface",
9586
+ role: "link"
9587
+ },
9588
+ borderRadius: "rounded-none",
9589
+ sizes: editorialSizes,
9590
+ effects: { base: [{
9591
+ effectId: "border-bottom-grow",
9592
+ options: {
9593
+ height: 1,
9594
+ colorToken: "mutedText",
9595
+ origin: "left"
9596
+ }
9597
+ }] }
9598
+ }
9430
9599
  },
9431
- xl: {
9432
- padding: "1.0625rem 2rem",
9433
- fontSize: "text-xl"
9434
- }
9435
- },
9436
- variants: [
9437
- {
9438
- id: "primary",
9439
- name: "Primary",
9440
- enabled: true,
9441
- priority: 1,
9442
- background: {
9443
- type: "solid",
9444
- colorToken: "primary"
9445
- },
9446
- borderRadius: "rounded-lg",
9447
- affordance: { iconId: "ArrowRight" },
9448
- effects: { hover: [{
9449
- effectId: "lift",
9450
- options: { translateY: "-2px" }
9451
- }, {
9452
- effectId: "background-on-hover",
9453
- options: { colorToken: "secondary" }
9454
- }] }
9600
+ outline: {
9601
+ kind: "complete",
9602
+ appearance: {
9603
+ background: {
9604
+ type: "surface",
9605
+ role: "link"
9606
+ },
9607
+ borderRadius: "rounded-none",
9608
+ sizes: editorialSizes,
9609
+ effects: { base: [{
9610
+ effectId: "border-bottom-grow",
9611
+ options: {
9612
+ height: 1,
9613
+ colorToken: "accent",
9614
+ origin: "left"
9615
+ }
9616
+ }] }
9617
+ }
9455
9618
  },
9456
- {
9457
- id: "secondary",
9458
- name: "Secondary",
9459
- enabled: true,
9460
- priority: 2,
9461
- background: {
9462
- type: "surface",
9463
- role: "link"
9464
- },
9465
- borderRadius: "rounded-lg",
9466
- border: { widthClass: "border" },
9467
- effects: { hover: [{
9468
- effectId: "lift",
9469
- options: { translateY: "-2px" }
9470
- }, {
9471
- effectId: "background-on-hover",
9472
- options: { colorToken: "surfaceAlt" }
9473
- }] }
9619
+ ghost: {
9620
+ kind: "complete",
9621
+ appearance: {
9622
+ background: {
9623
+ type: "surface",
9624
+ role: "link"
9625
+ },
9626
+ borderRadius: "rounded-none",
9627
+ sizes: editorialSizes
9628
+ }
9474
9629
  },
9475
- {
9476
- id: "accent",
9477
- name: "Accent",
9478
- enabled: true,
9479
- priority: 3,
9480
- background: {
9481
- type: "solid",
9482
- colorToken: "accent"
9483
- },
9484
- borderRadius: "rounded-lg",
9485
- affordance: { iconId: "ArrowRight" },
9486
- effects: { hover: [{
9487
- effectId: "lift",
9488
- options: { translateY: "-2px" }
9489
- }] }
9630
+ accent: {
9631
+ kind: "derive",
9632
+ from: "primary",
9633
+ overrides: { effects: { base: [{
9634
+ effectId: "border-bottom-grow",
9635
+ options: {
9636
+ height: 2,
9637
+ colorToken: "accent",
9638
+ origin: "left"
9639
+ }
9640
+ }] } }
9490
9641
  }
9491
- ]
9642
+ }
9492
9643
  }
9493
9644
  });
9494
- //#endregion
9495
- //#region ../theme-core/src/buttons/personalities/ink-stamp.ts
9496
- /**
9497
- * Ink Stamp — solid earthy fills with a bordered, hand-stamped block-print
9498
- * feel. Reads as bold and handmade; suits expressive craft brands.
9499
- */
9500
- const inkStamp = defineButtonPersonality({
9501
- id: "ink-stamp",
9502
- name: "Ink Stamp",
9503
- description: "Hand-stamped block-print buttons with a slight lift on hover.",
9645
+ const pebbleRecipe = defineStaticButtonStyleRecipe({
9646
+ id: "pebble",
9647
+ accessibilityLabel: "Generously padded pill buttons",
9504
9648
  tags: {
9505
- tone: "bold",
9506
- energy: "vibrant",
9649
+ tone: "classic",
9650
+ energy: "calm",
9507
9651
  motion: "standard",
9508
9652
  era: "organic"
9509
9653
  },
9510
- buttonSystem: {
9654
+ system: {
9511
9655
  global: {
9512
- cornerStyle: "rounded",
9513
- textTransform: "uppercase",
9514
- fontWeight: 600,
9515
- borderWidth: 1,
9656
+ cornerStyle: "pill",
9657
+ textTransform: "none",
9658
+ fontWeight: 500,
9659
+ borderWidth: 2,
9516
9660
  hoverTransform: "none",
9517
- hoverColor: "none",
9518
- letterSpacing: "loose"
9661
+ hoverColor: "none"
9519
9662
  },
9520
9663
  sizes: {
9521
9664
  sm: {
9522
- padding: "0.5rem 1.25rem",
9523
- fontSize: "text-xs"
9524
- },
9525
- md: {
9526
- padding: "0.75rem 1.75rem",
9665
+ padding: "0.625rem 1.75rem",
9527
9666
  fontSize: "text-sm"
9528
9667
  },
9668
+ md: { padding: "0.875rem 2.25rem" },
9529
9669
  lg: {
9530
- padding: "0.875rem 2.25rem",
9531
- fontSize: "text-base"
9532
- },
9533
- xl: {
9534
9670
  padding: "1.125rem 2.75rem",
9535
9671
  fontSize: "text-lg"
9672
+ },
9673
+ xl: {
9674
+ padding: "1.5rem 3.5rem",
9675
+ fontSize: "text-xl"
9536
9676
  }
9537
9677
  },
9538
- variants: [
9539
- {
9540
- id: "primary",
9541
- name: "Primary",
9542
- enabled: true,
9543
- priority: 1,
9544
- background: {
9545
- type: "solid",
9546
- colorToken: "primary"
9547
- },
9548
- borderRadius: "rounded-md",
9549
- effects: {
9550
- hover: [{
9551
- effectId: "drop-shadow",
9552
- options: { intensity: "medium" }
9553
- }, {
9554
- effectId: "scale-up",
9555
- options: { scale: "1.02" }
9556
- }],
9557
- active: [{
9558
- effectId: "scale-down",
9559
- options: { scale: "0.98" }
9560
- }]
9678
+ roles: {
9679
+ primary: {
9680
+ kind: "complete",
9681
+ appearance: {
9682
+ background: {
9683
+ type: "solid",
9684
+ colorToken: "primary"
9685
+ },
9686
+ borderRadius: "rounded-full",
9687
+ effects: { hover: [{
9688
+ effectId: "darken-background",
9689
+ options: { amount: 100 }
9690
+ }] }
9561
9691
  }
9562
9692
  },
9563
- {
9564
- id: "secondary",
9565
- name: "Secondary",
9566
- enabled: true,
9567
- priority: 2,
9568
- background: {
9569
- type: "surface",
9570
- role: "link"
9571
- },
9572
- borderRadius: "rounded-md",
9573
- border: { widthClass: "border-2" },
9574
- effects: { hover: [{
9575
- effectId: "background-on-hover",
9576
- options: { colorToken: "surface" }
9577
- }] }
9578
- },
9579
- {
9580
- id: "outline",
9581
- name: "Outline",
9582
- enabled: true,
9583
- priority: 3,
9584
- background: {
9585
- type: "surface",
9586
- role: "link"
9587
- },
9588
- borderRadius: "rounded-md",
9589
- border: { widthClass: "border-2" },
9590
- effects: { hover: [{
9591
- effectId: "background-on-hover",
9592
- options: { colorToken: "surface" }
9593
- }] }
9594
- },
9595
- {
9596
- id: "ghost",
9597
- name: "Ghost",
9598
- enabled: true,
9599
- priority: 3,
9600
- background: {
9601
- type: "surface",
9602
- role: "link"
9603
- },
9604
- borderRadius: "rounded-none",
9605
- sizes: {
9606
- sm: {
9607
- padding: "0.375rem 0",
9608
- fontSize: "text-xs"
9693
+ secondary: {
9694
+ kind: "complete",
9695
+ appearance: {
9696
+ background: {
9697
+ type: "surface",
9698
+ role: "link"
9609
9699
  },
9610
- md: {
9611
- padding: "0.5rem 0",
9612
- fontSize: "text-sm"
9700
+ borderRadius: "rounded-full",
9701
+ border: { widthClass: "border-2" },
9702
+ effects: { hover: [{
9703
+ effectId: "background-on-hover",
9704
+ options: { colorToken: "accent" }
9705
+ }] }
9706
+ }
9707
+ },
9708
+ outline: {
9709
+ kind: "complete",
9710
+ appearance: {
9711
+ background: {
9712
+ type: "surface",
9713
+ role: "link"
9613
9714
  },
9614
- lg: {
9615
- padding: "0.625rem 0",
9616
- fontSize: "text-base"
9715
+ borderRadius: "rounded-full",
9716
+ border: { widthClass: "border" },
9717
+ effects: { hover: [{
9718
+ effectId: "background-on-hover",
9719
+ options: { colorToken: "surface" }
9720
+ }] }
9721
+ }
9722
+ },
9723
+ ghost: {
9724
+ kind: "complete",
9725
+ appearance: {
9726
+ background: {
9727
+ type: "surface",
9728
+ role: "link"
9617
9729
  },
9618
- xl: {
9619
- padding: "0.75rem 0",
9620
- fontSize: "text-lg"
9621
- }
9622
- },
9623
- effects: { base: [{
9624
- effectId: "border-bottom-grow",
9625
- options: {
9626
- height: 1,
9627
- colorToken: "accent",
9628
- origin: "left"
9730
+ borderRadius: "rounded-full",
9731
+ sizes: {
9732
+ sm: {
9733
+ padding: "0.375rem 0.875rem",
9734
+ fontSize: "text-sm"
9735
+ },
9736
+ md: { padding: "0.5rem 1rem" },
9737
+ lg: {
9738
+ padding: "0.625rem 1.25rem",
9739
+ fontSize: "text-lg"
9740
+ },
9741
+ xl: {
9742
+ padding: "0.75rem 1.5rem",
9743
+ fontSize: "text-xl"
9744
+ }
9629
9745
  }
9630
- }] }
9746
+ }
9747
+ },
9748
+ accent: {
9749
+ kind: "derive",
9750
+ from: "primary",
9751
+ overrides: { background: {
9752
+ type: "solid",
9753
+ colorToken: "accent"
9754
+ } }
9631
9755
  }
9632
- ]
9756
+ }
9633
9757
  }
9634
9758
  });
9635
- //#endregion
9636
- //#region ../theme-core/src/buttons/personalities/joy-stamp.ts
9637
- /**
9638
- * Joy Stamp — neo-brutalist pills with a hard, brand-coloured offset shadow
9639
- * that collapses as the button presses into it on hover. Authored for the
9640
- * Original Joy site style: a cream "stamp" shadow under the solid primary, and
9641
- * a brown shadow under the cream outline. Reads as bold, warm, and handmade.
9642
- *
9643
- * The coloured offset shadow relies on the per-variant `shadow.colorToken`
9644
- * extension; the press is the shared `press-down` effect, which matches its
9645
- * translate to each variant's own shadow offset.
9646
- */
9647
- const joyStamp = defineButtonPersonality({
9648
- id: "joy-stamp",
9649
- name: "Joy Stamp",
9650
- description: "Pill buttons with a hard, brand-coloured offset shadow that presses in on hover.",
9759
+ const brushedWashRecipe = defineStaticButtonStyleRecipe({
9760
+ id: "brushed-wash",
9761
+ accessibilityLabel: "Generously padded gradient buttons with soft shadows",
9651
9762
  tags: {
9652
- tone: "bold",
9763
+ tone: "classic",
9653
9764
  energy: "vibrant",
9654
- motion: "expressive",
9765
+ motion: "standard",
9655
9766
  era: "organic"
9656
9767
  },
9657
- buttonSystem: {
9768
+ system: {
9658
9769
  global: {
9659
- cornerStyle: "pill",
9660
- shadow: "high",
9770
+ cornerStyle: "rounded",
9771
+ shadow: "low",
9661
9772
  textTransform: "none",
9662
- typography: "heading",
9663
- fontWeight: 700,
9664
- fontSize: "text-lg",
9665
- borderWidth: 2,
9773
+ fontWeight: 500,
9774
+ borderWidth: 1,
9666
9775
  hoverTransform: "none",
9667
9776
  hoverColor: "none"
9668
9777
  },
9669
9778
  sizes: {
9670
9779
  sm: {
9671
- padding: "0.625rem 1.25rem",
9672
- fontSize: "text-base"
9673
- },
9674
- md: {
9675
- padding: "0.875rem 1.75rem",
9676
- fontSize: "text-lg"
9780
+ padding: "0.75rem 2rem",
9781
+ fontSize: "text-sm"
9677
9782
  },
9783
+ md: { padding: "1rem 2.5rem" },
9678
9784
  lg: {
9679
- padding: "1.125rem 2.25rem",
9680
- fontSize: "text-xl"
9785
+ padding: "1.25rem 3rem",
9786
+ fontSize: "text-lg"
9681
9787
  },
9682
9788
  xl: {
9683
- padding: "1.25rem 2.75rem",
9684
- fontSize: "text-2xl"
9789
+ padding: "1.625rem 3.75rem",
9790
+ fontSize: "text-xl"
9685
9791
  }
9686
9792
  },
9687
- variants: [{
9688
- id: "primary",
9689
- name: "Primary",
9690
- enabled: true,
9691
- priority: 1,
9692
- background: {
9693
- type: "solid",
9694
- colorToken: "primary"
9793
+ roles: {
9794
+ primary: {
9795
+ kind: "complete",
9796
+ appearance: {
9797
+ background: {
9798
+ type: "gradient",
9799
+ stops: ["primary", "accent"],
9800
+ direction: "to-r",
9801
+ foregroundToken: "primaryForeground"
9802
+ },
9803
+ borderRadius: "rounded-lg",
9804
+ shadow: {
9805
+ elevation: "low",
9806
+ softness: "soft",
9807
+ position: "bottom"
9808
+ }
9809
+ }
9695
9810
  },
9696
- borderRadius: "rounded-full",
9697
- shadow: {
9698
- elevation: "high",
9699
- softness: "hard",
9700
- position: "bottom-right",
9701
- colorToken: "text"
9811
+ secondary: {
9812
+ kind: "complete",
9813
+ appearance: {
9814
+ background: {
9815
+ type: "gradient",
9816
+ stops: ["secondary", "accent"],
9817
+ direction: "to-br",
9818
+ foregroundToken: "primaryForeground"
9819
+ },
9820
+ borderRadius: "rounded-lg",
9821
+ shadow: {
9822
+ elevation: "low",
9823
+ softness: "soft",
9824
+ position: "bottom"
9825
+ }
9826
+ }
9702
9827
  },
9703
- effects: { hover: [{ effectId: "press-down" }] }
9704
- }, {
9705
- id: "secondary",
9706
- name: "Secondary",
9707
- enabled: true,
9708
- priority: 2,
9709
- background: {
9710
- type: "surface",
9711
- role: "link"
9828
+ outline: {
9829
+ kind: "complete",
9830
+ appearance: {
9831
+ background: {
9832
+ type: "surface",
9833
+ role: "link"
9834
+ },
9835
+ borderRadius: "rounded-lg",
9836
+ border: { widthClass: "border" },
9837
+ effects: { hover: [{
9838
+ effectId: "background-on-hover",
9839
+ options: { colorToken: "surface" }
9840
+ }] }
9841
+ }
9712
9842
  },
9713
- borderRadius: "rounded-full",
9714
- border: { widthClass: "border-2" },
9715
- shadow: {
9716
- elevation: "high",
9717
- softness: "hard",
9718
- position: "bottom-right",
9719
- colorToken: "secondary"
9843
+ ghost: {
9844
+ kind: "complete",
9845
+ appearance: {
9846
+ background: {
9847
+ type: "surface",
9848
+ role: "link"
9849
+ },
9850
+ borderRadius: "rounded-lg",
9851
+ effects: { hover: [{
9852
+ effectId: "background-on-hover",
9853
+ options: { colorToken: "surface" }
9854
+ }] }
9855
+ }
9720
9856
  },
9721
- effects: { hover: [{ effectId: "press-down" }] }
9722
- }]
9857
+ accent: {
9858
+ kind: "derive",
9859
+ from: "primary",
9860
+ overrides: { background: {
9861
+ type: "solid",
9862
+ colorToken: "accent"
9863
+ } }
9864
+ }
9865
+ }
9723
9866
  }
9724
9867
  });
9725
- //#endregion
9726
- //#region ../theme-core/src/buttons/personalities/ornate-ritual.ts
9727
- /**
9728
- * Ornate Ritual — framed, ceremonial buttons with jewel-toned fills and
9729
- * deliberate spacing. Designed for music, ceremony, and soulful event sites.
9730
- */
9731
- const ornateRitual = defineButtonPersonality({
9732
- id: "ornate-ritual",
9733
- name: "Ornate Ritual",
9734
- description: "Ceremonial framed buttons with jewel-toned fills and quiet color-change hover states.",
9868
+ const inkStampRecipe = defineStaticButtonStyleRecipe({
9869
+ id: "ink-stamp",
9870
+ accessibilityLabel: "Uppercase block-print buttons with a playful hover",
9735
9871
  tags: {
9736
- tone: "classic",
9872
+ tone: "bold",
9737
9873
  energy: "vibrant",
9738
- motion: "subtle",
9874
+ motion: "standard",
9739
9875
  era: "organic"
9740
9876
  },
9741
- buttonSystem: {
9877
+ system: {
9742
9878
  global: {
9743
9879
  cornerStyle: "rounded",
9744
9880
  textTransform: "uppercase",
@@ -9750,638 +9886,635 @@ const ornateRitual = defineButtonPersonality({
9750
9886
  },
9751
9887
  sizes: {
9752
9888
  sm: {
9753
- padding: "0.5625rem 1.25rem",
9889
+ padding: "0.5rem 1.25rem",
9754
9890
  fontSize: "text-xs"
9755
9891
  },
9756
9892
  md: {
9757
9893
  padding: "0.75rem 1.75rem",
9758
- fontSize: "text-xs"
9894
+ fontSize: "text-sm"
9759
9895
  },
9760
9896
  lg: {
9761
9897
  padding: "0.875rem 2.25rem",
9762
- fontSize: "text-sm"
9898
+ fontSize: "text-base"
9763
9899
  },
9764
9900
  xl: {
9765
- padding: "1rem 2.75rem",
9766
- fontSize: "text-base"
9901
+ padding: "1.125rem 2.75rem",
9902
+ fontSize: "text-lg"
9767
9903
  }
9768
9904
  },
9769
- variants: [
9770
- {
9771
- id: "primary",
9772
- name: "Primary",
9773
- enabled: true,
9774
- priority: 1,
9775
- background: {
9776
- type: "solid",
9777
- colorToken: "primary"
9778
- },
9779
- borderRadius: "rounded-md",
9780
- border: { widthClass: "border" },
9781
- effects: {
9782
- hover: [{
9783
- effectId: "background-on-hover",
9784
- options: { colorToken: "primary-100" }
9785
- }],
9786
- active: [{
9787
- effectId: "scale-down",
9788
- options: { scale: "0.98" }
9789
- }]
9905
+ roles: {
9906
+ primary: {
9907
+ kind: "complete",
9908
+ appearance: {
9909
+ background: {
9910
+ type: "solid",
9911
+ colorToken: "primary"
9912
+ },
9913
+ borderRadius: "rounded-md",
9914
+ effects: {
9915
+ hover: [{
9916
+ effectId: "drop-shadow",
9917
+ options: { intensity: "medium" }
9918
+ }, {
9919
+ effectId: "scale-up",
9920
+ options: { scale: "1.02" }
9921
+ }],
9922
+ active: [{
9923
+ effectId: "scale-down",
9924
+ options: { scale: "0.98" }
9925
+ }]
9926
+ }
9790
9927
  }
9791
9928
  },
9792
- {
9793
- id: "secondary",
9794
- name: "Secondary",
9795
- enabled: true,
9796
- priority: 2,
9797
- background: {
9798
- type: "solid",
9799
- colorToken: "secondary"
9800
- },
9801
- borderRadius: "rounded-md",
9802
- border: { widthClass: "border" },
9803
- effects: { hover: [{
9804
- effectId: "background-on-hover",
9805
- options: { colorToken: "surface" }
9806
- }] }
9807
- },
9808
- {
9809
- id: "outline",
9810
- name: "Outline",
9811
- enabled: true,
9812
- priority: 3,
9813
- background: {
9814
- type: "surface",
9815
- role: "link"
9816
- },
9817
- borderRadius: "rounded-md",
9818
- border: { widthClass: "border" },
9819
- effects: { hover: [{
9820
- effectId: "background-on-hover",
9821
- options: { colorToken: "muted" }
9822
- }] }
9929
+ secondary: {
9930
+ kind: "complete",
9931
+ appearance: {
9932
+ background: {
9933
+ type: "surface",
9934
+ role: "link"
9935
+ },
9936
+ borderRadius: "rounded-md",
9937
+ border: { widthClass: "border-2" },
9938
+ effects: { hover: [{
9939
+ effectId: "background-on-hover",
9940
+ options: { colorToken: "surface" }
9941
+ }] }
9942
+ }
9823
9943
  },
9824
- {
9825
- id: "ghost",
9826
- name: "Ghost",
9827
- enabled: true,
9828
- priority: 3,
9829
- background: {
9830
- type: "surface",
9831
- role: "link"
9832
- },
9833
- borderRadius: "rounded-none",
9834
- sizes: {
9835
- sm: {
9836
- padding: "0.375rem 0",
9837
- fontSize: "text-xs"
9944
+ outline: {
9945
+ kind: "complete",
9946
+ appearance: {
9947
+ background: {
9948
+ type: "surface",
9949
+ role: "link"
9838
9950
  },
9839
- md: {
9840
- padding: "0.5rem 0",
9841
- fontSize: "text-sm"
9951
+ borderRadius: "rounded-md",
9952
+ border: { widthClass: "border-2" },
9953
+ effects: { hover: [{
9954
+ effectId: "background-on-hover",
9955
+ options: { colorToken: "surface" }
9956
+ }] }
9957
+ }
9958
+ },
9959
+ ghost: {
9960
+ kind: "complete",
9961
+ appearance: {
9962
+ background: {
9963
+ type: "surface",
9964
+ role: "link"
9842
9965
  },
9843
- lg: {
9844
- padding: "0.625rem 0",
9845
- fontSize: "text-base"
9966
+ borderRadius: "rounded-none",
9967
+ sizes: {
9968
+ sm: {
9969
+ padding: "0.375rem 0",
9970
+ fontSize: "text-xs"
9971
+ },
9972
+ md: {
9973
+ padding: "0.5rem 0",
9974
+ fontSize: "text-sm"
9975
+ },
9976
+ lg: {
9977
+ padding: "0.625rem 0",
9978
+ fontSize: "text-base"
9979
+ },
9980
+ xl: {
9981
+ padding: "0.75rem 0",
9982
+ fontSize: "text-lg"
9983
+ }
9846
9984
  },
9847
- xl: {
9848
- padding: "0.75rem 0",
9849
- fontSize: "text-lg"
9850
- }
9851
- },
9852
- effects: { base: [{
9853
- effectId: "border-bottom-grow",
9854
- options: {
9855
- height: 1,
9856
- colorToken: "accent",
9857
- origin: "left"
9858
- }
9859
- }] }
9985
+ effects: { base: [{
9986
+ effectId: "border-bottom-grow",
9987
+ options: {
9988
+ height: 1,
9989
+ colorToken: "accent",
9990
+ origin: "left"
9991
+ }
9992
+ }] }
9993
+ }
9994
+ },
9995
+ accent: {
9996
+ kind: "derive",
9997
+ from: "primary",
9998
+ overrides: { background: {
9999
+ type: "solid",
10000
+ colorToken: "accent"
10001
+ } }
9860
10002
  }
9861
- ]
10003
+ }
9862
10004
  }
9863
10005
  });
9864
- //#endregion
9865
- //#region ../theme-core/src/buttons/personalities/pebble.ts
9866
- /**
9867
- * Pebble — large pill primaries with generous padding. Reads as spa-luxurious
9868
- * and natural; pairs well with wellness/yoga/dance brands.
9869
- */
9870
- const pebble = defineButtonPersonality({
9871
- id: "pebble",
9872
- name: "Pebble",
9873
- description: "Generous pill buttons with a quiet colour-softening hover.",
10006
+ const flatInkRecipe = defineStaticButtonStyleRecipe({
10007
+ id: "flat-ink",
10008
+ accessibilityLabel: "Flat rounded buttons with arrow affordances",
9874
10009
  tags: {
9875
10010
  tone: "classic",
9876
10011
  energy: "calm",
9877
- motion: "standard",
9878
- era: "organic"
10012
+ motion: "subtle",
10013
+ era: "editorial"
9879
10014
  },
9880
- buttonSystem: {
10015
+ system: {
9881
10016
  global: {
9882
- cornerStyle: "pill",
10017
+ cornerStyle: "rounded",
9883
10018
  textTransform: "none",
9884
- fontWeight: 500,
9885
- borderWidth: 2,
9886
- hoverTransform: "none",
10019
+ fontWeight: 600,
10020
+ borderWidth: 1,
10021
+ typography: "body",
10022
+ letterSpacing: "tight",
10023
+ paddingPreset: "default",
10024
+ hoverTransform: "lift",
9887
10025
  hoverColor: "none"
9888
10026
  },
9889
10027
  sizes: {
9890
10028
  sm: {
9891
- padding: "0.625rem 1.75rem",
10029
+ padding: "0.625rem 1.125rem",
9892
10030
  fontSize: "text-sm"
9893
10031
  },
9894
- md: { padding: "0.875rem 2.25rem" },
10032
+ md: { padding: "0.8125rem 1.375rem" },
9895
10033
  lg: {
9896
- padding: "1.125rem 2.75rem",
10034
+ padding: "0.9375rem 1.625rem",
9897
10035
  fontSize: "text-lg"
9898
10036
  },
9899
10037
  xl: {
9900
- padding: "1.5rem 3.5rem",
10038
+ padding: "1.0625rem 2rem",
9901
10039
  fontSize: "text-xl"
9902
10040
  }
9903
10041
  },
9904
- variants: [
9905
- {
9906
- id: "primary",
9907
- name: "Primary",
9908
- enabled: true,
9909
- priority: 1,
9910
- background: {
9911
- type: "solid",
9912
- colorToken: "primary"
9913
- },
9914
- borderRadius: "rounded-full",
9915
- effects: { hover: [{
9916
- effectId: "darken-background",
9917
- options: { amount: 100 }
9918
- }] }
10042
+ roles: {
10043
+ primary: {
10044
+ kind: "complete",
10045
+ appearance: {
10046
+ background: {
10047
+ type: "solid",
10048
+ colorToken: "primary"
10049
+ },
10050
+ borderRadius: "rounded-lg",
10051
+ affordance: { iconId: "ArrowRight" },
10052
+ effects: { hover: [{
10053
+ effectId: "lift",
10054
+ options: { translateY: "-2px" }
10055
+ }, {
10056
+ effectId: "background-on-hover",
10057
+ options: { colorToken: "secondary" }
10058
+ }] }
10059
+ }
9919
10060
  },
9920
- {
9921
- id: "secondary",
9922
- name: "Secondary",
9923
- enabled: true,
9924
- priority: 2,
9925
- background: {
9926
- type: "surface",
9927
- role: "link"
9928
- },
9929
- borderRadius: "rounded-full",
9930
- border: { widthClass: "border-2" },
9931
- effects: { hover: [{
9932
- effectId: "background-on-hover",
9933
- options: { colorToken: "accent" }
9934
- }] }
10061
+ secondary: {
10062
+ kind: "complete",
10063
+ appearance: {
10064
+ background: {
10065
+ type: "surface",
10066
+ role: "link"
10067
+ },
10068
+ borderRadius: "rounded-lg",
10069
+ border: { widthClass: "border" },
10070
+ effects: { hover: [{
10071
+ effectId: "lift",
10072
+ options: { translateY: "-2px" }
10073
+ }, {
10074
+ effectId: "background-on-hover",
10075
+ options: { colorToken: "surfaceAlt" }
10076
+ }] }
10077
+ }
9935
10078
  },
9936
- {
9937
- id: "outline",
9938
- name: "Outline",
9939
- enabled: true,
9940
- priority: 3,
9941
- background: {
9942
- type: "surface",
9943
- role: "link"
9944
- },
9945
- borderRadius: "rounded-full",
9946
- border: { widthClass: "border" },
9947
- effects: { hover: [{
9948
- effectId: "background-on-hover",
9949
- options: { colorToken: "surface" }
9950
- }] }
10079
+ outline: {
10080
+ kind: "complete",
10081
+ appearance: {
10082
+ background: {
10083
+ type: "surface",
10084
+ role: "link"
10085
+ },
10086
+ borderRadius: "rounded-lg",
10087
+ border: { widthClass: "border" },
10088
+ effects: { hover: [{
10089
+ effectId: "lift",
10090
+ options: { translateY: "-2px" }
10091
+ }, {
10092
+ effectId: "background-on-hover",
10093
+ options: { colorToken: "surfaceAlt" }
10094
+ }] }
10095
+ }
9951
10096
  },
9952
- {
9953
- id: "ghost",
9954
- name: "Ghost",
9955
- enabled: true,
9956
- priority: 3,
9957
- background: {
9958
- type: "surface",
9959
- role: "link"
9960
- },
9961
- borderRadius: "rounded-full",
9962
- sizes: {
9963
- sm: {
9964
- padding: "0.375rem 0.875rem",
9965
- fontSize: "text-sm"
10097
+ ghost: {
10098
+ kind: "complete",
10099
+ appearance: {
10100
+ background: {
10101
+ type: "surface",
10102
+ role: "link"
9966
10103
  },
9967
- md: { padding: "0.5rem 1rem" },
9968
- lg: {
9969
- padding: "0.625rem 1.25rem",
9970
- fontSize: "text-lg"
10104
+ borderRadius: "rounded-lg",
10105
+ effects: { hover: [{
10106
+ effectId: "lift",
10107
+ options: { translateY: "-2px" }
10108
+ }] }
10109
+ }
10110
+ },
10111
+ accent: {
10112
+ kind: "complete",
10113
+ appearance: {
10114
+ background: {
10115
+ type: "solid",
10116
+ colorToken: "accent"
9971
10117
  },
9972
- xl: {
9973
- padding: "0.75rem 1.5rem",
9974
- fontSize: "text-xl"
9975
- }
10118
+ borderRadius: "rounded-lg",
10119
+ affordance: { iconId: "ArrowRight" },
10120
+ effects: { hover: [{
10121
+ effectId: "lift",
10122
+ options: { translateY: "-2px" }
10123
+ }] }
9976
10124
  }
9977
10125
  }
9978
- ]
10126
+ }
9979
10127
  }
9980
10128
  });
9981
- //#endregion
9982
- //#region ../theme-core/src/buttons/personalities/quiet-arrow.ts
9983
- /**
9984
- * Quiet Arrow — wide, flat editorial buttons for grounded service businesses.
9985
- * Primary and secondary keep stable semantic colours; surrounding surfaces are
9986
- * responsible for contrast rather than reversing the button roles.
9987
- */
9988
- const quietArrow = defineButtonPersonality({
9989
- id: "quiet-arrow",
9990
- name: "Quiet Arrow",
9991
- description: "Wide, flat arrow buttons with a solid primary and a primary-colour outlined secondary.",
10129
+ const showtimePillRecipe = defineStaticButtonStyleRecipe({
10130
+ id: "showtime-pill",
10131
+ accessibilityLabel: "Bold uppercase pill buttons with playful movement",
9992
10132
  tags: {
9993
- tone: "classic",
9994
- energy: "calm",
9995
- motion: "subtle",
9996
- era: "editorial"
10133
+ tone: "bold",
10134
+ energy: "vibrant",
10135
+ motion: "expressive",
10136
+ era: "modern"
9997
10137
  },
9998
- buttonSystem: {
10138
+ system: {
9999
10139
  global: {
10000
- cornerStyle: "rounded",
10140
+ cornerStyle: "pill",
10141
+ shadow: "low",
10001
10142
  textTransform: "uppercase",
10002
- fontWeight: 500,
10003
- borderWidth: 1,
10143
+ fontWeight: 700,
10144
+ borderWidth: 2,
10145
+ hoverTransform: "lift",
10146
+ hoverColor: "darken",
10004
10147
  typography: "body",
10005
- fontSize: "text-sm",
10006
- letterSpacing: "loose",
10007
- hoverTransform: "none",
10008
- hoverColor: "none"
10148
+ paddingPreset: "spacious",
10149
+ italic: false
10009
10150
  },
10010
10151
  sizes: {
10011
10152
  sm: {
10012
10153
  padding: "0.625rem 1.25rem",
10013
- fontSize: "text-xs"
10154
+ fontSize: "0.875rem"
10014
10155
  },
10015
10156
  md: {
10016
- padding: "0.8125rem 1.75rem",
10017
- fontSize: "text-sm"
10157
+ padding: "0.875rem 1.75rem",
10158
+ fontSize: "1rem"
10018
10159
  },
10019
10160
  lg: {
10020
- padding: "0.9375rem 2.125rem",
10021
- fontSize: "text-sm"
10161
+ padding: "1.125rem 2.25rem",
10162
+ fontSize: "1.125rem"
10022
10163
  },
10023
10164
  xl: {
10024
- padding: "1.0625rem 2.5rem",
10025
- fontSize: "text-base"
10165
+ padding: "1.125rem 2.25rem",
10166
+ fontSize: "1.125rem"
10026
10167
  }
10027
10168
  },
10028
- variants: [
10029
- {
10030
- id: "primary",
10031
- name: "Primary",
10032
- enabled: true,
10033
- priority: 1,
10034
- background: {
10035
- type: "solid",
10036
- colorToken: "primary"
10037
- },
10038
- borderRadius: "rounded-xl",
10039
- affordance: { iconId: "ArrowRight" },
10040
- effects: { hover: [{
10041
- effectId: "darken-background",
10042
- options: { amount: 100 }
10043
- }] }
10169
+ roles: {
10170
+ primary: {
10171
+ kind: "complete",
10172
+ appearance: {
10173
+ background: {
10174
+ type: "solid",
10175
+ colorToken: "primary"
10176
+ },
10177
+ borderRadius: "rounded-full",
10178
+ effects: { hover: [{ effectId: "pop" }] }
10179
+ }
10044
10180
  },
10045
- {
10046
- id: "secondary",
10047
- name: "Secondary",
10048
- enabled: true,
10049
- priority: 2,
10050
- background: {
10051
- type: "surface",
10052
- role: "link"
10053
- },
10054
- borderRadius: "rounded-xl",
10055
- border: { widthClass: "border" },
10056
- affordance: { iconId: "ArrowRight" },
10057
- effects: { hover: [{
10058
- effectId: "background-on-hover",
10059
- options: { colorToken: "surfaceAlt" }
10060
- }] }
10181
+ secondary: {
10182
+ kind: "complete",
10183
+ appearance: {
10184
+ background: {
10185
+ type: "surface",
10186
+ role: "link"
10187
+ },
10188
+ borderRadius: "rounded-full",
10189
+ border: { widthClass: "border-2" },
10190
+ effects: { hover: [{ effectId: "pop" }] }
10191
+ }
10061
10192
  },
10062
- {
10063
- id: "outline",
10064
- name: "Outline",
10065
- enabled: true,
10066
- priority: 3,
10067
- background: {
10068
- type: "surface",
10069
- role: "link"
10070
- },
10071
- borderRadius: "rounded-xl",
10072
- border: { widthClass: "border" }
10193
+ outline: {
10194
+ kind: "complete",
10195
+ appearance: {
10196
+ background: {
10197
+ type: "surface",
10198
+ role: "link"
10199
+ },
10200
+ borderRadius: "rounded-full",
10201
+ border: { widthClass: "border-2" },
10202
+ effects: { hover: [{
10203
+ effectId: "background-on-hover",
10204
+ options: { colorToken: "background" }
10205
+ }] }
10206
+ }
10073
10207
  },
10074
- {
10075
- id: "ghost",
10076
- name: "Ghost",
10077
- enabled: true,
10078
- priority: 3,
10079
- background: {
10080
- type: "surface",
10081
- role: "link"
10082
- },
10083
- borderRadius: "rounded-xl"
10208
+ ghost: {
10209
+ kind: "complete",
10210
+ appearance: {
10211
+ background: {
10212
+ type: "surface",
10213
+ role: "link"
10214
+ },
10215
+ borderRadius: "rounded-full",
10216
+ effects: { hover: [{
10217
+ effectId: "background-on-hover",
10218
+ options: { colorToken: "surface" }
10219
+ }] }
10220
+ }
10221
+ },
10222
+ accent: {
10223
+ kind: "complete",
10224
+ appearance: {
10225
+ background: {
10226
+ type: "solid",
10227
+ colorToken: "secondary"
10228
+ },
10229
+ borderRadius: "rounded-full",
10230
+ effects: { hover: [{ effectId: "pop" }] }
10231
+ }
10084
10232
  }
10085
- ]
10233
+ }
10086
10234
  }
10087
10235
  });
10088
- //#endregion
10089
- //#region ../theme-core/src/buttons/personalities/showtime-pill.ts
10090
- /**
10091
- * Showtime Pill — bold, spacious, fully rounded buttons with playful pop
10092
- * motion. Suits energetic schools, performers, festivals, and community brands
10093
- * that need calls to action to feel loud without becoming visually chaotic.
10094
- */
10095
- const showtimePill = defineButtonPersonality({
10096
- id: "showtime-pill",
10097
- name: "Showtime Pill",
10098
- description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
10236
+ const joyStampRecipe = defineStaticButtonStyleRecipe({
10237
+ id: "joy-stamp",
10238
+ accessibilityLabel: "Bold pill buttons with a hard offset shadow",
10099
10239
  tags: {
10100
10240
  tone: "bold",
10101
10241
  energy: "vibrant",
10102
10242
  motion: "expressive",
10103
- era: "modern"
10243
+ era: "organic"
10104
10244
  },
10105
- buttonSystem: {
10245
+ system: {
10106
10246
  global: {
10107
10247
  cornerStyle: "pill",
10108
- shadow: "low",
10109
- textTransform: "uppercase",
10248
+ shadow: "high",
10249
+ textTransform: "none",
10250
+ typography: "heading",
10110
10251
  fontWeight: 700,
10252
+ fontSize: "text-lg",
10111
10253
  borderWidth: 2,
10112
- hoverTransform: "lift",
10113
- hoverColor: "darken",
10114
- typography: "body",
10115
- paddingPreset: "spacious",
10116
- italic: false
10254
+ hoverTransform: "none",
10255
+ hoverColor: "none"
10117
10256
  },
10118
10257
  sizes: {
10119
10258
  sm: {
10120
10259
  padding: "0.625rem 1.25rem",
10121
- fontSize: "0.875rem"
10260
+ fontSize: "text-base"
10122
10261
  },
10123
10262
  md: {
10124
10263
  padding: "0.875rem 1.75rem",
10125
- fontSize: "1rem"
10264
+ fontSize: "text-lg"
10126
10265
  },
10127
10266
  lg: {
10128
10267
  padding: "1.125rem 2.25rem",
10129
- fontSize: "1.125rem"
10268
+ fontSize: "text-xl"
10130
10269
  },
10131
10270
  xl: {
10132
- padding: "1.125rem 2.25rem",
10133
- fontSize: "1.125rem"
10271
+ padding: "1.25rem 2.75rem",
10272
+ fontSize: "text-2xl"
10134
10273
  }
10135
10274
  },
10136
- variants: [
10137
- {
10138
- id: "primary",
10139
- name: "Primary",
10140
- enabled: true,
10141
- priority: 1,
10142
- background: {
10143
- type: "solid",
10144
- colorToken: "primary"
10145
- },
10146
- borderRadius: "rounded-full",
10147
- effects: { hover: [{ effectId: "pop" }] }
10148
- },
10149
- {
10150
- id: "secondary",
10151
- name: "Secondary",
10152
- enabled: true,
10153
- priority: 2,
10154
- background: {
10155
- type: "surface",
10156
- role: "link"
10157
- },
10158
- borderRadius: "rounded-full",
10159
- border: { widthClass: "border-2" },
10160
- effects: { hover: [{ effectId: "pop" }] }
10275
+ roles: {
10276
+ primary: {
10277
+ kind: "complete",
10278
+ appearance: {
10279
+ background: {
10280
+ type: "solid",
10281
+ colorToken: "primary"
10282
+ },
10283
+ borderRadius: "rounded-full",
10284
+ shadow: {
10285
+ elevation: "high",
10286
+ softness: "hard",
10287
+ position: "bottom-right",
10288
+ colorToken: "text"
10289
+ },
10290
+ effects: { hover: [{ effectId: "press-down" }] }
10291
+ }
10161
10292
  },
10162
- {
10163
- id: "hero",
10164
- name: "Hero",
10165
- enabled: true,
10166
- priority: 1,
10167
- background: {
10168
- type: "solid",
10169
- colorToken: "secondary"
10170
- },
10171
- borderRadius: "rounded-full",
10172
- effects: { hover: [{ effectId: "pop" }] }
10293
+ secondary: {
10294
+ kind: "complete",
10295
+ appearance: {
10296
+ background: {
10297
+ type: "surface",
10298
+ role: "link"
10299
+ },
10300
+ borderRadius: "rounded-full",
10301
+ border: { widthClass: "border-2" },
10302
+ shadow: {
10303
+ elevation: "high",
10304
+ softness: "hard",
10305
+ position: "bottom-right",
10306
+ colorToken: "secondary"
10307
+ },
10308
+ effects: { hover: [{ effectId: "press-down" }] }
10309
+ }
10173
10310
  },
10174
- {
10175
- id: "header",
10176
- name: "Header",
10177
- enabled: true,
10178
- priority: 2,
10179
- background: {
10180
- type: "solid",
10181
- colorToken: "background"
10182
- },
10183
- borderRadius: "rounded-full",
10184
- border: { widthClass: "border-2" },
10185
- effects: { hover: [{
10186
- effectId: "background-on-hover",
10187
- options: { colorToken: "surface" }
10188
- }] }
10311
+ outline: {
10312
+ kind: "derive",
10313
+ from: "secondary"
10189
10314
  },
10190
- {
10191
- id: "outline",
10192
- name: "Outline",
10193
- enabled: true,
10194
- priority: 3,
10195
- background: {
10196
- type: "surface",
10197
- role: "link"
10198
- },
10199
- borderRadius: "rounded-full",
10200
- border: { widthClass: "border-2" },
10201
- effects: { hover: [{
10202
- effectId: "background-on-hover",
10203
- options: { colorToken: "background" }
10204
- }] }
10315
+ ghost: {
10316
+ kind: "complete",
10317
+ appearance: {
10318
+ background: {
10319
+ type: "surface",
10320
+ role: "link"
10321
+ },
10322
+ borderRadius: "rounded-full",
10323
+ effects: { hover: [{ effectId: "press-down" }] }
10324
+ }
10205
10325
  },
10206
- {
10207
- id: "ghost",
10208
- name: "Ghost",
10209
- enabled: true,
10210
- priority: 3,
10211
- background: {
10212
- type: "surface",
10213
- role: "link"
10214
- },
10215
- borderRadius: "rounded-full",
10216
- effects: { hover: [{
10217
- effectId: "background-on-hover",
10218
- options: { colorToken: "surface" }
10219
- }] }
10326
+ accent: {
10327
+ kind: "derive",
10328
+ from: "primary",
10329
+ overrides: { background: {
10330
+ type: "solid",
10331
+ colorToken: "accent"
10332
+ } }
10220
10333
  }
10221
- ]
10334
+ }
10222
10335
  }
10223
10336
  });
10224
- //#endregion
10225
- //#region ../theme-core/src/buttons/personalities/soft-pill.ts
10226
- /**
10227
- * Soft Pill — rounded-full pill buttons with a hover lift. The default for
10228
- * Calm Studio and Modern Wellness; reads as quietly modern and welcoming.
10229
- */
10230
- const softPill = defineButtonPersonality({
10231
- id: "soft-pill",
10232
- name: "Soft Pill",
10233
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
10337
+ const ornateRitualRecipe = defineStaticButtonStyleRecipe({
10338
+ id: "ornate-ritual",
10339
+ accessibilityLabel: "Uppercase framed buttons with restrained movement",
10234
10340
  tags: {
10235
10341
  tone: "classic",
10236
- energy: "calm",
10342
+ energy: "vibrant",
10237
10343
  motion: "subtle",
10238
10344
  era: "organic"
10239
10345
  },
10240
- buttonSystem: {
10346
+ system: {
10241
10347
  global: {
10242
- cornerStyle: "pill",
10243
- shadow: "low",
10244
- textTransform: "none",
10245
- fontWeight: 500,
10246
- borderWidth: 2,
10247
- hoverTransform: "lift",
10248
- hoverColor: "none"
10348
+ cornerStyle: "rounded",
10349
+ textTransform: "uppercase",
10350
+ fontWeight: 600,
10351
+ borderWidth: 1,
10352
+ hoverTransform: "none",
10353
+ hoverColor: "none",
10354
+ letterSpacing: "loose"
10249
10355
  },
10250
- variants: [
10251
- {
10252
- id: "primary",
10253
- name: "Primary",
10254
- enabled: true,
10255
- priority: 1,
10256
- background: {
10257
- type: "solid",
10258
- colorToken: "primary"
10259
- },
10260
- borderRadius: "rounded-full",
10261
- shadow: {
10262
- elevation: "low",
10263
- softness: "soft",
10264
- position: "bottom"
10265
- },
10266
- effects: {
10267
- hover: [{
10268
- effectId: "lift",
10269
- options: { translateY: "-1px" }
10270
- }],
10271
- active: [{
10272
- effectId: "scale-down",
10273
- options: { scale: "0.98" }
10274
- }]
10356
+ sizes: {
10357
+ sm: {
10358
+ padding: "0.5625rem 1.25rem",
10359
+ fontSize: "text-xs"
10360
+ },
10361
+ md: {
10362
+ padding: "0.75rem 1.75rem",
10363
+ fontSize: "text-xs"
10364
+ },
10365
+ lg: {
10366
+ padding: "0.875rem 2.25rem",
10367
+ fontSize: "text-sm"
10368
+ },
10369
+ xl: {
10370
+ padding: "1rem 2.75rem",
10371
+ fontSize: "text-base"
10372
+ }
10373
+ },
10374
+ roles: {
10375
+ primary: {
10376
+ kind: "complete",
10377
+ appearance: {
10378
+ background: {
10379
+ type: "solid",
10380
+ colorToken: "primary"
10381
+ },
10382
+ borderRadius: "rounded-md",
10383
+ border: { widthClass: "border" },
10384
+ effects: {
10385
+ hover: [{
10386
+ effectId: "background-on-hover",
10387
+ options: { colorToken: "primary-100" }
10388
+ }],
10389
+ active: [{
10390
+ effectId: "scale-down",
10391
+ options: { scale: "0.98" }
10392
+ }]
10393
+ }
10275
10394
  }
10276
10395
  },
10277
- {
10278
- id: "secondary",
10279
- name: "Secondary",
10280
- enabled: true,
10281
- priority: 2,
10282
- background: {
10283
- type: "surface",
10284
- role: "link"
10285
- },
10286
- borderRadius: "rounded-full",
10287
- border: { widthClass: "border-2" },
10288
- effects: { hover: [{
10289
- effectId: "background-on-hover",
10290
- options: { colorToken: "surface" }
10291
- }] }
10396
+ secondary: {
10397
+ kind: "complete",
10398
+ appearance: {
10399
+ background: {
10400
+ type: "solid",
10401
+ colorToken: "secondary"
10402
+ },
10403
+ borderRadius: "rounded-md",
10404
+ border: { widthClass: "border" },
10405
+ effects: { hover: [{
10406
+ effectId: "background-on-hover",
10407
+ options: { colorToken: "surface" }
10408
+ }] }
10409
+ }
10292
10410
  },
10293
- {
10294
- id: "outline",
10295
- name: "Outline",
10296
- enabled: true,
10297
- priority: 3,
10298
- background: {
10299
- type: "surface",
10300
- role: "link"
10301
- },
10302
- borderRadius: "rounded-full",
10303
- border: { widthClass: "border" },
10304
- effects: { hover: [{
10305
- effectId: "background-on-hover",
10306
- options: { colorToken: "surface" }
10307
- }] }
10411
+ outline: {
10412
+ kind: "complete",
10413
+ appearance: {
10414
+ background: {
10415
+ type: "surface",
10416
+ role: "link"
10417
+ },
10418
+ borderRadius: "rounded-md",
10419
+ border: { widthClass: "border" },
10420
+ effects: { hover: [{
10421
+ effectId: "background-on-hover",
10422
+ options: { colorToken: "muted" }
10423
+ }] }
10424
+ }
10308
10425
  },
10309
- {
10310
- id: "ghost",
10311
- name: "Ghost",
10312
- enabled: true,
10313
- priority: 3,
10314
- background: {
10315
- type: "surface",
10316
- role: "link"
10317
- },
10318
- borderRadius: "rounded-full",
10319
- effects: { hover: [{
10320
- effectId: "background-on-hover",
10321
- options: { colorToken: "surface" }
10322
- }] }
10426
+ ghost: {
10427
+ kind: "complete",
10428
+ appearance: {
10429
+ background: {
10430
+ type: "surface",
10431
+ role: "link"
10432
+ },
10433
+ borderRadius: "rounded-none",
10434
+ sizes: {
10435
+ sm: {
10436
+ padding: "0.375rem 0",
10437
+ fontSize: "text-xs"
10438
+ },
10439
+ md: {
10440
+ padding: "0.5rem 0",
10441
+ fontSize: "text-sm"
10442
+ },
10443
+ lg: {
10444
+ padding: "0.625rem 0",
10445
+ fontSize: "text-base"
10446
+ },
10447
+ xl: {
10448
+ padding: "0.75rem 0",
10449
+ fontSize: "text-lg"
10450
+ }
10451
+ },
10452
+ effects: { base: [{
10453
+ effectId: "border-bottom-grow",
10454
+ options: {
10455
+ height: 1,
10456
+ colorToken: "accent",
10457
+ origin: "left"
10458
+ }
10459
+ }] }
10460
+ }
10461
+ },
10462
+ accent: {
10463
+ kind: "derive",
10464
+ from: "primary",
10465
+ overrides: { background: {
10466
+ type: "solid",
10467
+ colorToken: "accent"
10468
+ } }
10323
10469
  }
10324
- ]
10470
+ }
10325
10471
  }
10326
10472
  });
10327
10473
  //#endregion
10328
- //#region ../theme-core/src/buttons/personalities/two-tone-pill.ts
10329
- const solidSecondary = {
10330
- id: "secondary",
10331
- name: "Secondary",
10332
- enabled: true,
10333
- priority: 2,
10334
- background: {
10335
- type: "solid",
10336
- colorToken: unsafeAsOpaqueButtonColourToken("secondary")
10337
- },
10338
- borderRadius: "rounded-full",
10339
- shadow: {
10340
- elevation: "none",
10341
- softness: null,
10342
- position: "bottom"
10343
- },
10344
- effects: {
10345
- hover: [{
10346
- effectId: "background-on-hover-alpha",
10347
- options: {
10348
- colorToken: "secondary",
10349
- opacity: 88
10350
- }
10351
- }],
10352
- active: [{
10353
- effectId: "scale-down",
10354
- options: { scale: "0.98" }
10355
- }]
10356
- }
10357
- };
10358
- //#endregion
10359
- //#region ../theme-core/src/buttons/personalities/index.ts
10360
- const buttonPersonalities = [
10361
- softPill,
10362
- defineButtonPersonality({
10363
- id: "two-tone-pill",
10364
- name: "Two-tone Pill",
10365
- description: "Rounded pills with distinct solid primary and secondary brand colours.",
10366
- tags: softPill.tags,
10367
- buttonSystem: {
10368
- ...softPill.buttonSystem,
10369
- variants: softPill.buttonSystem.variants.map((variant) => variant.id === "secondary" ? solidSecondary : variant)
10370
- }
10371
- }),
10372
- earthPill,
10373
- confidentChip,
10374
- editorialLink,
10375
- pebble,
10376
- inkStamp,
10377
- flatInk,
10378
- brushedWash,
10379
- showtimePill,
10380
- joyStamp,
10381
- ornateRitual,
10382
- quietArrow
10474
+ //#region ../theme-core/src/buttons/styles/registry.ts
10475
+ const buttonStyleRecipes = [
10476
+ softPillRecipe,
10477
+ earthPillRecipe,
10478
+ confidentChipRecipe,
10479
+ editorialLinkRecipe,
10480
+ pebbleRecipe,
10481
+ inkStampRecipe,
10482
+ flatInkRecipe,
10483
+ brushedWashRecipe,
10484
+ showtimePillRecipe,
10485
+ joyStampRecipe,
10486
+ ornateRitualRecipe,
10487
+ quietArrowRecipe
10383
10488
  ];
10384
- new Map(buttonPersonalities.map((p) => [p.id, p]));
10489
+ const recipesById = new Map(buttonStyleRecipes.map((recipe) => [recipe.id, recipe]));
10490
+ function findButtonStyleRecipe(id) {
10491
+ const recipe = recipesById.get(id);
10492
+ if (recipe === void 0) throw new Error(`Button style registry is missing known style ${id}`);
10493
+ return recipe;
10494
+ }
10495
+ function resolveButtonStyleSelection(selection) {
10496
+ switch (selection.styleId) {
10497
+ case "soft-pill": return resolveButtonStyleRecipe(softPillRecipe, selection.parameters);
10498
+ case "earth-pill": return resolveButtonStyleRecipe(earthPillRecipe, selection.parameters);
10499
+ case "confident-chip": return resolveButtonStyleRecipe(confidentChipRecipe, selection.parameters);
10500
+ case "editorial-link": return resolveButtonStyleRecipe(editorialLinkRecipe, selection.parameters);
10501
+ case "pebble": return resolveButtonStyleRecipe(pebbleRecipe, selection.parameters);
10502
+ case "ink-stamp": return resolveButtonStyleRecipe(inkStampRecipe, selection.parameters);
10503
+ case "flat-ink": return resolveButtonStyleRecipe(flatInkRecipe, selection.parameters);
10504
+ case "brushed-wash": return resolveButtonStyleRecipe(brushedWashRecipe, selection.parameters);
10505
+ case "showtime-pill": return resolveButtonStyleRecipe(showtimePillRecipe, selection.parameters);
10506
+ case "joy-stamp": return resolveButtonStyleRecipe(joyStampRecipe, selection.parameters);
10507
+ case "ornate-ritual": return resolveButtonStyleRecipe(ornateRitualRecipe, selection.parameters);
10508
+ case "quiet-arrow": return resolveButtonStyleRecipe(quietArrowRecipe, selection.parameters);
10509
+ }
10510
+ }
10511
+ function defaultButtonStyleSelectionFor(styleId) {
10512
+ return {
10513
+ styleId,
10514
+ parameters: findButtonStyleRecipe(styleId).defaultParameters
10515
+ };
10516
+ }
10517
+ if (buttonStyleRecipes.map((recipe) => recipe.id).length !== BUTTON_STYLE_IDS.length || BUTTON_STYLE_IDS.some((id) => !recipesById.has(id))) throw new Error("Button style registry and ButtonStyleId catalog are out of sync");
10385
10518
  //#endregion
10386
10519
  //#region ../theme-core/src/accordions/siteStyleDefaults.ts
10387
10520
  /**
@@ -12146,76 +12279,9 @@ function headerConfigurationKey(configuration) {
12146
12279
  function asFooterLookId(value) {
12147
12280
  return value;
12148
12281
  }
12149
- function asFooterLayoutId(value) {
12150
- return value;
12151
- }
12152
- function asFooterStyleId(value) {
12153
- return value;
12154
- }
12155
- const footerLayoutCatalog = defineExactCatalog()([
12156
- {
12157
- id: asFooterLayoutId("identity"),
12158
- label: "Identity",
12159
- description: "Logo, site text, address, and legal copy without relying on footer navigation."
12160
- },
12161
- {
12162
- id: asFooterLayoutId("centered"),
12163
- label: "Centered",
12164
- description: "A calm centered stack for identity, short copy, and optional compact navigation.",
12165
- maxRecommendedNavDensity: "sparse"
12166
- },
12167
- {
12168
- id: asFooterLayoutId("split"),
12169
- label: "Split",
12170
- description: "Navigation and brand signoff separated into a wider split footer.",
12171
- requiresFooterNav: true,
12172
- maxRecommendedNavDensity: "balanced"
12173
- },
12174
- {
12175
- id: asFooterLayoutId("columns"),
12176
- label: "Columns",
12177
- description: "Grouped footer navigation columns with a supporting bottom line.",
12178
- requiresFooterNav: true,
12179
- requiresFooterNavGroups: true
12180
- }
12181
- ]);
12182
- const footerStyleCatalog = defineExactCatalog()([
12183
- {
12184
- id: asFooterStyleId("quiet"),
12185
- label: "Quiet",
12186
- description: "Lightweight, practical footer treatment."
12187
- },
12188
- {
12189
- id: asFooterStyleId("calm"),
12190
- label: "Calm",
12191
- description: "Soft centered treatment with restrained dividers."
12192
- },
12193
- {
12194
- id: asFooterStyleId("editorial"),
12195
- label: "Editorial",
12196
- description: "Text-forward treatment with fine-line structure."
12197
- },
12198
- {
12199
- id: asFooterStyleId("brand-band"),
12200
- label: "Brand band",
12201
- description: "High-contrast brand treatment with a stronger bottom bar."
12202
- }
12203
- ]);
12204
- new Map(footerLayoutCatalog.map((layout) => [layout.id, layout]));
12205
- new Map(footerStyleCatalog.map((style) => [style.id, style]));
12206
- /**
12207
- * No-nav-safe identity footer: brand and legal/supporting copy carry the
12208
- * footer without implying missing navigation.
12209
- */
12210
- function identityQuietFooter(theme) {
12282
+ function quietFooterLinks(theme) {
12211
12283
  return {
12212
12284
  ...theme.footer,
12213
- variant: "simple",
12214
- maxWidth: "container",
12215
- background: {
12216
- type: "color",
12217
- color: "surface"
12218
- },
12219
12285
  navStyle: "minimal",
12220
12286
  navWeight: "regular",
12221
12287
  navColor: "text",
@@ -12228,285 +12294,38 @@ function identityQuietFooter(theme) {
12228
12294
  hoverColorToken: "primary",
12229
12295
  padding: "none",
12230
12296
  borderRadius: "none"
12231
- },
12232
- navLayout: {
12233
- layout: "inline-wrap",
12234
- align: "start",
12235
- gapX: "default",
12236
- gapY: "tight"
12237
- },
12238
- logo: {
12239
- showLogo: true,
12240
- showLogoText: true,
12241
- placement: "left",
12242
- size: "sm",
12243
- align: "start"
12244
- },
12245
- bottomBar: {
12246
- enabled: false,
12247
- fullBleed: false,
12248
- textAlign: "left",
12249
- paddingX: "default",
12250
- paddingY: "compact",
12251
- borderTop: { width: "none" }
12252
12297
  }
12253
12298
  };
12254
12299
  }
12255
- /**
12256
- * Back-compat alias for the previous default footer Look. It keeps existing
12257
- * persisted selections valid while staying hidden from the new layout/style UI.
12258
- */
12259
- function mutedGroundingFooter(theme) {
12260
- return {
12261
- ...identityQuietFooter(theme),
12262
- background: theme.footer.background,
12263
- navStyle: theme.footer.navStyle,
12264
- navColor: theme.footer.navColor,
12265
- navWeight: theme.footer.navWeight,
12266
- navLinkStyle: theme.footer.navLinkStyle,
12267
- bottomTextLinkStyle: theme.footer.bottomTextLinkStyle
12268
- };
12269
- }
12270
- /** Applies a high-contrast brand band with a darker full-bleed bottom bar. */
12271
- function brandTwoBandFooter(theme) {
12300
+ function emphasizedFooterLinks(theme) {
12272
12301
  return {
12273
12302
  ...theme.footer,
12274
- variant: "split",
12275
- maxWidth: "container",
12276
- background: {
12277
- type: "color",
12278
- color: "primary-800"
12279
- },
12280
12303
  navStyle: "minimal",
12281
12304
  navWeight: "medium",
12282
- navColor: "primaryForeground",
12283
- navLinkStyle: {
12284
- typography: "body",
12285
- fontWeight: "medium",
12286
- textTransform: "none",
12287
- italic: false,
12288
- colorToken: "primaryForeground",
12289
- hoverColorToken: "secondary",
12290
- padding: "none",
12291
- borderRadius: "none"
12292
- },
12293
- bottomTextLinkStyle: {
12294
- colorToken: "secondary",
12295
- decorationColorToken: "secondary"
12296
- },
12297
- navLayout: {
12298
- layout: "inline-wrap",
12299
- align: "start",
12300
- gapX: "default",
12301
- gapY: "tight"
12302
- },
12303
- logo: {
12304
- showLogo: true,
12305
- showLogoText: false,
12306
- placement: "left",
12307
- size: "sm",
12308
- align: "start"
12309
- },
12310
- bottomBar: {
12311
- enabled: true,
12312
- fullBleed: true,
12313
- background: {
12314
- type: "color",
12315
- color: "primary-900"
12316
- },
12317
- textColor: "primaryForeground",
12318
- textAlign: "center",
12319
- paddingX: "default",
12320
- paddingY: "compact",
12321
- borderTop: { width: "none" }
12322
- }
12323
- };
12324
- }
12325
- /**
12326
- * Centered stack on a softly tinted band: logo, inline nav, address, and a
12327
- * hairline-topped copyright line, all centered.
12328
- */
12329
- function centeredCalmFooter(theme) {
12330
- return {
12331
- ...theme.footer,
12332
- variant: "simple",
12333
- maxWidth: "container",
12334
- background: {
12335
- type: "color",
12336
- color: "surfaceAlt"
12337
- },
12338
- navStyle: "minimal",
12339
- navWeight: "regular",
12340
- navColor: "text",
12341
- navLinkStyle: {
12342
- typography: "body",
12343
- fontWeight: "regular",
12344
- textTransform: "none",
12345
- italic: false,
12346
- colorToken: "text",
12347
- hoverColorToken: "primary",
12348
- padding: "none",
12349
- borderRadius: "none"
12350
- },
12351
- navLayout: {
12352
- layout: "inline-wrap",
12353
- align: "center",
12354
- gapX: "relaxed",
12355
- gapY: "tight"
12356
- },
12357
- logo: {
12358
- showLogo: true,
12359
- showLogoText: false,
12360
- placement: "above",
12361
- size: "sm",
12362
- align: "center"
12363
- },
12364
- bottomBar: {
12365
- enabled: true,
12366
- fullBleed: false,
12367
- textAlign: "center",
12368
- paddingX: "default",
12369
- paddingY: "compact",
12370
- borderTop: { width: "thin" }
12371
- }
12372
- };
12373
- }
12374
- /** Editorial split footer: compact nav on one side, brand signoff on the other. */
12375
- function splitEditorialFooter(theme) {
12376
- return {
12377
- ...theme.footer,
12378
- variant: "split",
12379
- maxWidth: "container",
12380
- background: {
12381
- type: "color",
12382
- color: "surface"
12383
- },
12384
- navStyle: "minimal",
12385
- navWeight: "regular",
12386
- navColor: "text",
12387
- navLinkStyle: {
12388
- typography: "body",
12389
- fontWeight: "regular",
12390
- textTransform: "none",
12391
- italic: false,
12392
- colorToken: "text",
12393
- hoverColorToken: "primary",
12394
- padding: "none",
12395
- borderRadius: "none"
12396
- },
12397
- navLayout: {
12398
- layout: "inline-wrap",
12399
- align: "start",
12400
- gapX: "relaxed",
12401
- gapY: "tight"
12402
- },
12403
- logo: {
12404
- showLogo: true,
12405
- showLogoText: true,
12406
- placement: "right",
12407
- size: "sm",
12408
- align: "end"
12409
- },
12410
- bottomBar: {
12411
- enabled: true,
12412
- fullBleed: false,
12413
- textAlign: "left",
12414
- paddingX: "default",
12415
- paddingY: "compact",
12416
- borderTop: { width: "thin" }
12417
- }
12418
- };
12419
- }
12420
- /**
12421
- * Editorial columns: site name and supporting copy on the left, inline nav on
12422
- * the right, with a hairline-topped bottom line. Uses the footer block's
12423
- * columns layout.
12424
- */
12425
- function editorialColumnsFooter(theme) {
12426
- return {
12427
- ...theme.footer,
12428
- variant: "columns",
12429
- maxWidth: "container",
12430
- background: {
12431
- type: "color",
12432
- color: "surface"
12433
- },
12434
- navStyle: "minimal",
12435
- navWeight: "regular",
12436
12305
  navColor: "text",
12437
12306
  navLinkStyle: {
12438
12307
  typography: "body",
12439
- fontWeight: "regular",
12308
+ fontWeight: "medium",
12440
12309
  textTransform: "none",
12441
12310
  italic: false,
12442
12311
  colorToken: "text",
12443
12312
  hoverColorToken: "primary",
12444
12313
  padding: "none",
12445
12314
  borderRadius: "none"
12446
- },
12447
- logo: {
12448
- showLogo: true,
12449
- showLogoText: true,
12450
- placement: "left",
12451
- size: "sm",
12452
- align: "start"
12453
- },
12454
- bottomBar: {
12455
- enabled: true,
12456
- fullBleed: false,
12457
- textAlign: "center",
12458
- paddingX: "default",
12459
- paddingY: "compact",
12460
- borderTop: { width: "thin" }
12461
12315
  }
12462
12316
  };
12463
12317
  }
12464
- const footerLookCatalog = defineExactCatalog()([
12465
- {
12466
- id: asFooterLookId("footer-identity-quiet"),
12467
- label: "Identity footer",
12468
- layoutId: asFooterLayoutId("identity"),
12469
- styleId: asFooterStyleId("quiet"),
12470
- compile: identityQuietFooter
12471
- },
12472
- {
12473
- id: asFooterLookId("footer-muted-grounding"),
12474
- label: "Muted grounding footer",
12475
- layoutId: asFooterLayoutId("identity"),
12476
- styleId: asFooterStyleId("quiet"),
12477
- hiddenFromLayoutStyleControls: true,
12478
- compile: mutedGroundingFooter
12479
- },
12480
- {
12481
- id: asFooterLookId("footer-centered-calm"),
12482
- label: "Centered calm footer",
12483
- layoutId: asFooterLayoutId("centered"),
12484
- styleId: asFooterStyleId("calm"),
12485
- compile: centeredCalmFooter
12486
- },
12487
- {
12488
- id: asFooterLookId("footer-split-editorial"),
12489
- label: "Split editorial footer",
12490
- layoutId: asFooterLayoutId("split"),
12491
- styleId: asFooterStyleId("editorial"),
12492
- compile: splitEditorialFooter
12493
- },
12494
- {
12495
- id: asFooterLookId("footer-editorial-columns"),
12496
- label: "Editorial columns footer",
12497
- layoutId: asFooterLayoutId("columns"),
12498
- styleId: asFooterStyleId("editorial"),
12499
- compile: editorialColumnsFooter
12500
- },
12501
- {
12502
- id: asFooterLookId("site-footer-brand-two-band"),
12503
- label: "Two-band brand footer",
12504
- layoutId: asFooterLayoutId("split"),
12505
- styleId: asFooterStyleId("brand-band"),
12506
- allowedContentPresence: ["default-footer", "default-and-blocks"],
12507
- compile: brandTwoBandFooter
12508
- }
12509
- ]);
12318
+ const footerLookCatalog = defineExactCatalog()([{
12319
+ id: asFooterLookId("footer-links-quiet"),
12320
+ label: "Quiet links",
12321
+ description: "Regular-weight footer navigation with a restrained hover.",
12322
+ compile: quietFooterLinks
12323
+ }, {
12324
+ id: asFooterLookId("footer-links-emphasized"),
12325
+ label: "Emphasized links",
12326
+ description: "Medium-weight footer navigation with a clearer emphasis.",
12327
+ compile: emphasizedFooterLinks
12328
+ }]);
12510
12329
  new Map(footerLookCatalog.map((look) => [look.id, look]));
12511
12330
  //#endregion
12512
12331
  //#region ../theme-core/src/site-styles/sourceCatalogs.ts
@@ -15570,23 +15389,27 @@ function resolveBoxShadow(variant, global, theme, tokens) {
15570
15389
  const color = shadowConfig.colorToken ? tokens.getColor(shadowConfig.colorToken) : void 0;
15571
15390
  return generateShadowValue$1(shadowConfig.elevation, shadowConfig.softness, shadowConfig.position ?? "bottom", color);
15572
15391
  }
15573
- buttonPersonalities.map((personality) => ({
15574
- id: personality.id,
15575
- name: personality.name,
15576
- description: personality.description,
15577
- category: presetCategory(personality),
15578
- buttonSystem: personality.buttonSystem,
15579
- compatibility: {
15580
- ...personality.tags.tone ? { tones: [personality.tags.tone] } : {},
15581
- ...personality.tags.energy ? { energies: [personality.tags.energy] } : {}
15582
- }
15583
- }));
15584
- function presetCategory(personality) {
15585
- switch (personality.tags.era) {
15392
+ buttonStyleRecipes.map((recipe) => {
15393
+ const resolved = resolveButtonStyleSelection(defaultButtonStyleSelectionFor(recipe.id));
15394
+ if (resolved.kind === "error") throw new Error(`Invalid registered button style ${recipe.id}: ${resolved.error.issues.join(", ")}`);
15395
+ return {
15396
+ id: recipe.id,
15397
+ name: recipe.accessibilityLabel,
15398
+ description: recipe.accessibilityLabel,
15399
+ category: presetCategory(recipe),
15400
+ buttonSystem: resolved.buttonSystem,
15401
+ compatibility: {
15402
+ ...recipe.tags.tone ? { tones: [recipe.tags.tone] } : {},
15403
+ ...recipe.tags.energy ? { energies: [recipe.tags.energy] } : {}
15404
+ }
15405
+ };
15406
+ });
15407
+ function presetCategory(recipe) {
15408
+ switch (recipe.tags.era) {
15586
15409
  case "retro": return "retro";
15587
15410
  case "editorial": return "minimal";
15588
15411
  case "organic": return "artistic";
15589
- case "modern": return personality.tags.tone === "bold" ? "modern" : "technical";
15412
+ case "modern": return recipe.tags.tone === "bold" ? "modern" : "technical";
15590
15413
  case "technical": return "technical";
15591
15414
  case void 0: return "modern";
15592
15415
  }
@@ -18475,17 +18298,21 @@ function defineCuratedSiteStyle(input) {
18475
18298
  })),
18476
18299
  recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
18477
18300
  recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
18478
- buttonPersonalityChoices: input.buttonPersonalityChoices,
18301
+ buttonStyleChoices: input.buttonStyleChoices,
18479
18302
  paletteRecommendations: input.paletteRecommendations,
18480
18303
  typography: input.typography ?? defaultTypographyForRecipe(input.tokenRecipes.typography),
18481
18304
  ...input.heroTypography ? { heroTypography: input.heroTypography } : {}
18482
18305
  };
18483
18306
  }
18484
- function buttonChoice(id, note) {
18307
+ function buttonChoice(styleId, note, parameters) {
18308
+ const selection = parameters === void 0 ? defaultButtonStyleSelectionFor(styleId) : buttonStyleSelectionSchema.parse({
18309
+ styleId,
18310
+ parameters
18311
+ });
18485
18312
  return note ? {
18486
- id: asButtonPersonalityId(id),
18313
+ ...selection,
18487
18314
  note
18488
- } : { id: asButtonPersonalityId(id) };
18315
+ } : selection;
18489
18316
  }
18490
18317
  function paletteRecommendation(authoringKey, note) {
18491
18318
  const valueKey = requireCuratedPaletteValueKey(asCuratedPaletteAuthoringKey(authoringKey));
@@ -18670,9 +18497,8 @@ const curatedSiteStyles = [
18670
18497
  "minimal-transparent",
18671
18498
  "clean-base"
18672
18499
  ],
18673
- buttonPersonalityChoices: [
18500
+ buttonStyleChoices: [
18674
18501
  buttonChoice("soft-pill"),
18675
- buttonChoice("two-tone-pill"),
18676
18502
  buttonChoice("pebble"),
18677
18503
  buttonChoice("editorial-link"),
18678
18504
  buttonChoice("brushed-wash")
@@ -18708,7 +18534,7 @@ const curatedSiteStyles = [
18708
18534
  "brand-solid",
18709
18535
  "clean-base"
18710
18536
  ],
18711
- buttonPersonalityChoices: [
18537
+ buttonStyleChoices: [
18712
18538
  buttonChoice("confident-chip"),
18713
18539
  buttonChoice("soft-pill"),
18714
18540
  buttonChoice("editorial-link")
@@ -18747,7 +18573,7 @@ const curatedSiteStyles = [
18747
18573
  "minimal-transparent",
18748
18574
  "centered-calm"
18749
18575
  ],
18750
- buttonPersonalityChoices: [
18576
+ buttonStyleChoices: [
18751
18577
  buttonChoice("editorial-link"),
18752
18578
  buttonChoice("soft-pill"),
18753
18579
  buttonChoice("brushed-wash")
@@ -18787,7 +18613,7 @@ const curatedSiteStyles = [
18787
18613
  "practical-utility",
18788
18614
  "clean-base"
18789
18615
  ],
18790
- buttonPersonalityChoices: [
18616
+ buttonStyleChoices: [
18791
18617
  buttonChoice("pebble"),
18792
18618
  buttonChoice("brushed-wash"),
18793
18619
  buttonChoice("confident-chip")
@@ -18848,7 +18674,7 @@ const curatedSiteStyles = [
18848
18674
  "serif-line",
18849
18675
  "clean-base"
18850
18676
  ],
18851
- buttonPersonalityChoices: [
18677
+ buttonStyleChoices: [
18852
18678
  buttonChoice("editorial-link"),
18853
18679
  buttonChoice("confident-chip"),
18854
18680
  buttonChoice("soft-pill")
@@ -18910,7 +18736,7 @@ const curatedSiteStyles = [
18910
18736
  "brand-solid",
18911
18737
  "clean-base"
18912
18738
  ],
18913
- buttonPersonalityChoices: [
18739
+ buttonStyleChoices: [
18914
18740
  buttonChoice("confident-chip"),
18915
18741
  buttonChoice("pebble"),
18916
18742
  buttonChoice("ink-stamp")
@@ -18949,7 +18775,7 @@ const curatedSiteStyles = [
18949
18775
  "minimal-transparent",
18950
18776
  "clean-base"
18951
18777
  ],
18952
- buttonPersonalityChoices: [
18778
+ buttonStyleChoices: [
18953
18779
  buttonChoice("soft-pill"),
18954
18780
  buttonChoice("pebble"),
18955
18781
  buttonChoice("confident-chip")
@@ -19022,7 +18848,7 @@ const curatedSiteStyles = [
19022
18848
  "clean-base",
19023
18849
  "centered-calm"
19024
18850
  ],
19025
- buttonPersonalityChoices: [
18851
+ buttonStyleChoices: [
19026
18852
  buttonChoice("pebble"),
19027
18853
  buttonChoice("soft-pill"),
19028
18854
  buttonChoice("editorial-link")
@@ -19141,12 +18967,8 @@ const curatedSiteStyles = [
19141
18967
  "serif-line",
19142
18968
  "minimal-transparent"
19143
18969
  ],
19144
- recommendedFooterLookIds: [
19145
- "footer-centered-calm",
19146
- "footer-editorial-columns",
19147
- "footer-muted-grounding"
19148
- ],
19149
- buttonPersonalityChoices: [
18970
+ recommendedFooterLookIds: ["footer-links-quiet"],
18971
+ buttonStyleChoices: [
19150
18972
  buttonChoice("soft-pill"),
19151
18973
  buttonChoice("pebble"),
19152
18974
  buttonChoice("editorial-link")
@@ -19220,7 +19042,7 @@ const curatedSiteStyles = [
19220
19042
  "centered-calm",
19221
19043
  "minimal-transparent"
19222
19044
  ],
19223
- buttonPersonalityChoices: [
19045
+ buttonStyleChoices: [
19224
19046
  buttonChoice("editorial-link"),
19225
19047
  buttonChoice("soft-pill"),
19226
19048
  buttonChoice("brushed-wash")
@@ -19293,8 +19115,8 @@ const curatedSiteStyles = [
19293
19115
  "practical-utility",
19294
19116
  "clean-base"
19295
19117
  ],
19296
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
19297
- buttonPersonalityChoices: [
19118
+ recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
19119
+ buttonStyleChoices: [
19298
19120
  buttonChoice("pebble"),
19299
19121
  buttonChoice("confident-chip"),
19300
19122
  buttonChoice("ink-stamp"),
@@ -19415,8 +19237,8 @@ const curatedSiteStyles = [
19415
19237
  "minimal-transparent",
19416
19238
  "serif-line"
19417
19239
  ],
19418
- recommendedFooterLookIds: ["footer-muted-grounding", "site-footer-brand-two-band"],
19419
- buttonPersonalityChoices: [
19240
+ recommendedFooterLookIds: ["footer-links-quiet", "footer-links-emphasized"],
19241
+ buttonStyleChoices: [
19420
19242
  buttonChoice("earth-pill"),
19421
19243
  buttonChoice("soft-pill"),
19422
19244
  buttonChoice("pebble"),
@@ -19487,7 +19309,7 @@ const curatedSiteStyles = [
19487
19309
  "floating-glass",
19488
19310
  "brand-solid"
19489
19311
  ],
19490
- buttonPersonalityChoices: [
19312
+ buttonStyleChoices: [
19491
19313
  buttonChoice("ink-stamp"),
19492
19314
  buttonChoice("confident-chip"),
19493
19315
  buttonChoice("brushed-wash"),
@@ -19542,8 +19364,8 @@ const curatedSiteStyles = [
19542
19364
  "transparent-overlay",
19543
19365
  "practical-utility"
19544
19366
  ],
19545
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
19546
- buttonPersonalityChoices: [
19367
+ recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
19368
+ buttonStyleChoices: [
19547
19369
  buttonChoice("showtime-pill"),
19548
19370
  buttonChoice("confident-chip"),
19549
19371
  buttonChoice("ink-stamp"),
@@ -19624,8 +19446,8 @@ const curatedSiteStyles = [
19624
19446
  headerStyleChoice("glass")
19625
19447
  ] },
19626
19448
  recommendedHeaderLookIds: ["minimal-transparent"],
19627
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
19628
- buttonPersonalityChoices: [
19449
+ recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
19450
+ buttonStyleChoices: [
19629
19451
  buttonChoice("ornate-ritual"),
19630
19452
  buttonChoice("joy-stamp"),
19631
19453
  buttonChoice("ink-stamp")
@@ -19678,8 +19500,8 @@ const curatedSiteStyles = [
19678
19500
  headerStyleChoice("glass")
19679
19501
  ] },
19680
19502
  recommendedHeaderLookIds: ["minimal-transparent"],
19681
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
19682
- buttonPersonalityChoices: [
19503
+ recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
19504
+ buttonStyleChoices: [
19683
19505
  buttonChoice("joy-stamp"),
19684
19506
  buttonChoice("ink-stamp"),
19685
19507
  buttonChoice("showtime-pill")
@@ -19769,8 +19591,8 @@ const curatedSiteStyles = [
19769
19591
  "centered-calm",
19770
19592
  "clean-base"
19771
19593
  ],
19772
- recommendedFooterLookIds: ["footer-editorial-columns", "footer-muted-grounding"],
19773
- buttonPersonalityChoices: [
19594
+ recommendedFooterLookIds: ["footer-links-quiet"],
19595
+ buttonStyleChoices: [
19774
19596
  buttonChoice("flat-ink"),
19775
19597
  buttonChoice("confident-chip"),
19776
19598
  buttonChoice("editorial-link")
@@ -19847,14 +19669,9 @@ const curatedSiteStyles = [
19847
19669
  "serif-line",
19848
19670
  "clean-base"
19849
19671
  ],
19850
- recommendedFooterLookIds: [
19851
- "footer-editorial-columns",
19852
- "footer-muted-grounding",
19853
- "footer-identity-quiet"
19854
- ],
19855
- buttonPersonalityChoices: [
19856
- buttonChoice("quiet-arrow"),
19857
- buttonChoice("two-tone-pill"),
19672
+ recommendedFooterLookIds: ["footer-links-quiet"],
19673
+ buttonStyleChoices: [
19674
+ buttonChoice("quiet-arrow", void 0, { secondaryTreatment: "solid-accent" }),
19858
19675
  buttonChoice("flat-ink"),
19859
19676
  buttonChoice("editorial-link")
19860
19677
  ],
@@ -22968,25 +22785,41 @@ const heroCopyFragment = defineFragment({
22968
22785
  ]
22969
22786
  });
22970
22787
  //#endregion
22788
+ //#region ../blocks/src/system/constants/buttonRoles.ts
22789
+ /**
22790
+ * Semantic button roles available to block authors.
22791
+ *
22792
+ * These roles are deliberately independent of a site's visual button style:
22793
+ * the active theme owns how each role looks.
22794
+ */
22795
+ const BLOCK_BUTTON_ROLES = PUBLIC_BUTTON_ROLES;
22796
+ const blockButtonRoleSchema = z$1.enum(BLOCK_BUTTON_ROLES);
22797
+ /**
22798
+ * Temporary rollout boundary for persisted content written before issue #1220.
22799
+ * Authoring remains strict through `blockButtonRoleSchema`; this parser exists
22800
+ * only until the post-deploy role rewrite has been audited in production.
22801
+ */
22802
+ function canonicalizePersistedBlockButtonRole(value) {
22803
+ return value === "link" || value === "tertiary" ? "ghost" : value;
22804
+ }
22805
+ const persistedBlockButtonRoleSchema = z$1.preprocess((value) => typeof value === "string" ? canonicalizePersistedBlockButtonRole(value) : value, blockButtonRoleSchema);
22806
+ const BLOCK_BUTTON_ROLE_LABELS = {
22807
+ primary: "Primary",
22808
+ secondary: "Secondary",
22809
+ outline: "Outline",
22810
+ ghost: "Ghost",
22811
+ accent: "Accent"
22812
+ };
22813
+ const BLOCK_BUTTON_ROLE_OPTIONS = BLOCK_BUTTON_ROLES.map((value) => ({
22814
+ value,
22815
+ label: BLOCK_BUTTON_ROLE_LABELS[value]
22816
+ }));
22817
+ function isBlockButtonRole(value) {
22818
+ return blockButtonRoleSchema.safeParse(value).success;
22819
+ }
22820
+ //#endregion
22971
22821
  //#region ../blocks/src/system/fields/button.ts
22972
- const DEFAULT_THEME_BUTTON_VARIANTS = [
22973
- {
22974
- value: "primary",
22975
- label: "Primary"
22976
- },
22977
- {
22978
- value: "secondary",
22979
- label: "Secondary"
22980
- },
22981
- {
22982
- value: "outline",
22983
- label: "Outline"
22984
- },
22985
- {
22986
- value: "link",
22987
- label: "Link"
22988
- }
22989
- ];
22822
+ const DEFAULT_THEME_BUTTON_VARIANTS = BLOCK_BUTTON_ROLE_OPTIONS;
22990
22823
  function createButtonVariantField(options = {}) {
22991
22824
  return {
22992
22825
  id: options.id ?? "buttonVariant",
@@ -23004,20 +22837,7 @@ function createButtonVariantField(options = {}) {
23004
22837
  };
23005
22838
  }
23006
22839
  function createButtonGroup(options = {}) {
23007
- const { variants = [
23008
- {
23009
- value: "primary",
23010
- label: "Primary"
23011
- },
23012
- {
23013
- value: "secondary",
23014
- label: "Secondary"
23015
- },
23016
- {
23017
- value: "outline",
23018
- label: "Outline"
23019
- }
23020
- ], defaultVariant, includeSize = true, defaultSize = "md", showGroupLabel = false, groupId = "button", groupLabel = "Button", flattenInRepeater = true } = options;
22840
+ const { variants = BLOCK_BUTTON_ROLE_OPTIONS, defaultVariant, includeSize = true, defaultSize = "md", showGroupLabel = false, groupId = "button", groupLabel = "Button", flattenInRepeater = true } = options;
23021
22841
  const mainFields = [
23022
22842
  {
23023
22843
  id: "label",
@@ -23153,29 +22973,7 @@ const ctaRowFragment = defineFragment({
23153
22973
  fields: [createCtasRepeater({
23154
22974
  label: "Calls to action",
23155
22975
  itemLabel: "CTA",
23156
- maxItems: 3,
23157
- button: { variants: [
23158
- {
23159
- value: "primary",
23160
- label: "Primary"
23161
- },
23162
- {
23163
- value: "secondary",
23164
- label: "Secondary"
23165
- },
23166
- {
23167
- value: "outline",
23168
- label: "Outline"
23169
- },
23170
- {
23171
- value: "link",
23172
- label: "Link"
23173
- },
23174
- {
23175
- value: "accent",
23176
- label: "Accent"
23177
- }
23178
- ] }
22976
+ maxItems: 3
23179
22977
  })],
23180
22978
  layout: [ctaRow({
23181
22979
  collectionPath: "content.ctas",
@@ -23194,10 +22992,6 @@ const heroCtaRowFragment = defineFragment({
23194
22992
  defaultValue: [],
23195
22993
  button: {
23196
22994
  variants: [
23197
- {
23198
- value: "default",
23199
- label: "Default"
23200
- },
23201
22995
  {
23202
22996
  value: "primary",
23203
22997
  label: "Primary"
@@ -23209,9 +23003,17 @@ const heroCtaRowFragment = defineFragment({
23209
23003
  {
23210
23004
  value: "outline",
23211
23005
  label: "Outline"
23006
+ },
23007
+ {
23008
+ value: "ghost",
23009
+ label: "Ghost"
23010
+ },
23011
+ {
23012
+ value: "accent",
23013
+ label: "Accent"
23212
23014
  }
23213
23015
  ],
23214
- defaultVariant: "default",
23016
+ defaultVariant: "primary",
23215
23017
  includeSize: true,
23216
23018
  defaultSize: "lg"
23217
23019
  }
@@ -23986,11 +23788,13 @@ const blogFeaturedPostFragment = defineFragment({
23986
23788
  as: "p",
23987
23789
  style: textColorStyle("text/80")
23988
23790
  }, bind("post.excerpt", { fallback: "Select a blog post to display its preview." })),
23989
- link({
23990
- className: "rb-inline-flex rb-items-center rb-caption rb-hover-opacity-80",
23991
- style: textColorStyle("primary"),
23992
- href: { $bind: { from: "post.path" } }
23993
- }, [text({ as: "strong" }, props({ value: "Read more →" }))])
23791
+ button({
23792
+ className: "rb-self-start",
23793
+ href: { $bind: { from: "post.path" } },
23794
+ variantId: "ghost",
23795
+ size: "sm",
23796
+ linkRequired: true
23797
+ }, [text({ as: "span" }, props({ value: "Read more" }))])
23994
23798
  ])], when("post")), stack({
23995
23799
  gap: "sm",
23996
23800
  className: "rb-rounded-xl rb-border rb-border-dashed rb-p-6",
@@ -24666,21 +24470,7 @@ const newsletterFormFragment = defineFragment({
24666
24470
  createButtonVariantField({
24667
24471
  id: "buttonVariant",
24668
24472
  label: "Button style",
24669
- defaultValue: "primary",
24670
- variants: [
24671
- {
24672
- value: "primary",
24673
- label: "Primary"
24674
- },
24675
- {
24676
- value: "secondary",
24677
- label: "Secondary"
24678
- },
24679
- {
24680
- value: "outline",
24681
- label: "Outline"
24682
- }
24683
- ]
24473
+ defaultValue: "primary"
24684
24474
  }),
24685
24475
  {
24686
24476
  id: "successMessage",
@@ -26032,7 +25822,8 @@ function postExcerpt(className) {
26032
25822
  function postReadMore() {
26033
25823
  return button({
26034
25824
  href: { $bind: { from: "post.path" } },
26035
- className: "rb-self-start"
25825
+ className: "rb-self-start",
25826
+ variantId: "ghost"
26036
25827
  }, [text({ as: "span" }, bind("content.readMoreText", { fallback: "Read more" }), when("content.readMoreText")), text({
26037
25828
  as: "span",
26038
25829
  value: "Read more"
@@ -29772,31 +29563,7 @@ const featureCardsBlockDefinition = { manifest: createBlockManifest({
29772
29563
  label: "Calls to action",
29773
29564
  itemLabel: "CTA",
29774
29565
  maxItems: 1,
29775
- button: {
29776
- variants: [
29777
- {
29778
- value: "primary",
29779
- label: "Primary"
29780
- },
29781
- {
29782
- value: "secondary",
29783
- label: "Secondary"
29784
- },
29785
- {
29786
- value: "outline",
29787
- label: "Outline"
29788
- },
29789
- {
29790
- value: "ghost",
29791
- label: "Ghost"
29792
- },
29793
- {
29794
- value: "link",
29795
- label: "Link"
29796
- }
29797
- ],
29798
- defaultVariant: "ghost"
29799
- }
29566
+ button: { defaultVariant: "ghost" }
29800
29567
  })
29801
29568
  ] }
29802
29569
  },
@@ -32009,17 +31776,8 @@ function readAmount(value) {
32009
31776
  //#endregion
32010
31777
  //#region ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
32011
31778
  const previewStageSchema = z$1.enum(["preview", "published"]);
32012
- const registrationButtonVariantSchema = z$1.enum([
32013
- "primary",
32014
- "secondary",
32015
- "outline"
32016
- ]);
32017
- const eventButtonVariantSchema = z$1.enum([
32018
- "primary",
32019
- "secondary",
32020
- "outline",
32021
- "link"
32022
- ]);
31779
+ const registrationButtonVariantSchema = blockButtonRoleSchema;
31780
+ const eventButtonVariantSchema = persistedBlockButtonRoleSchema;
32023
31781
  const eventLayoutSchema = z$1.enum(eventCalendarListLayoutValues);
32024
31782
  const eventCalendarDisplayModeSchema = z$1.enum(eventCalendarDisplayModeValues);
32025
31783
  const eventCalendarDefaultViewSchema = z$1.enum(eventCalendarDefaultViewValues);
@@ -32398,23 +32156,7 @@ const eventRegistrationBlockDefinition = {
32398
32156
  defaultValue: "Complete Registration",
32399
32157
  maxLength: 40
32400
32158
  },
32401
- createButtonVariantField({
32402
- description: "Choose a button style from your theme",
32403
- variants: [
32404
- {
32405
- value: "primary",
32406
- label: "Primary"
32407
- },
32408
- {
32409
- value: "secondary",
32410
- label: "Secondary"
32411
- },
32412
- {
32413
- value: "outline",
32414
- label: "Outline"
32415
- }
32416
- ]
32417
- })
32159
+ createButtonVariantField()
32418
32160
  ],
32419
32161
  layout: [styledSection({
32420
32162
  baseClass: "",
@@ -32903,23 +32645,7 @@ const courseRegistrationBlockDefinition = {
32903
32645
  defaultValue: "Sign up",
32904
32646
  maxLength: 40
32905
32647
  },
32906
- createButtonVariantField({
32907
- description: "Choose a button style from your theme",
32908
- variants: [
32909
- {
32910
- value: "primary",
32911
- label: "Primary"
32912
- },
32913
- {
32914
- value: "secondary",
32915
- label: "Secondary"
32916
- },
32917
- {
32918
- value: "outline",
32919
- label: "Outline"
32920
- }
32921
- ]
32922
- })
32648
+ createButtonVariantField()
32923
32649
  ],
32924
32650
  layout: [styledSection({
32925
32651
  baseClass: "",
@@ -38521,36 +38247,7 @@ const offeringsPreviewFields = [
38521
38247
  ui: { intent: "content" },
38522
38248
  schema: { fields: groupOverrideFields }
38523
38249
  },
38524
- {
38525
- id: "buttonVariant",
38526
- type: "select",
38527
- label: "Button style",
38528
- required: false,
38529
- multiple: false,
38530
- defaultValue: "primary",
38531
- options: [
38532
- {
38533
- value: "primary",
38534
- label: "Primary"
38535
- },
38536
- {
38537
- value: "secondary",
38538
- label: "Secondary"
38539
- },
38540
- {
38541
- value: "outline",
38542
- label: "Outline"
38543
- },
38544
- {
38545
- value: "link",
38546
- label: "Link"
38547
- }
38548
- ],
38549
- ui: {
38550
- intent: "display",
38551
- widget: "buttonVariant"
38552
- }
38553
- },
38250
+ createButtonVariantField(),
38554
38251
  {
38555
38252
  id: "buttonText",
38556
38253
  type: "text",
@@ -38756,7 +38453,7 @@ function normalizeOfferingsPreviewGroupOverride(value) {
38756
38453
  return [override];
38757
38454
  }
38758
38455
  function isButtonVariant(value) {
38759
- return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
38456
+ return value === null || isBlockButtonRole(value);
38760
38457
  }
38761
38458
  function normalizeCardStylesContent(value) {
38762
38459
  return isRecord$8(value) || value === null ? value : void 0;
@@ -40608,12 +40305,7 @@ const shopSourceSchema = z$1.object({
40608
40305
  showPrices: z$1.boolean().optional(),
40609
40306
  showValidityPeriod: z$1.boolean().optional(),
40610
40307
  showPricePerCredit: z$1.boolean().nullable().optional(),
40611
- buttonVariant: z$1.enum([
40612
- "primary",
40613
- "secondary",
40614
- "outline",
40615
- "link"
40616
- ]).optional(),
40308
+ buttonVariant: blockButtonRoleSchema.optional(),
40617
40309
  passesHeading: z$1.string().optional(),
40618
40310
  membershipsHeading: z$1.string().optional(),
40619
40311
  buyButtonText: z$1.string().optional(),
@@ -40758,12 +40450,7 @@ const passesMembershipsHydrationSchema = z$1.object({
40758
40450
  passes: z$1.array(publicPassProductSchema),
40759
40451
  memberships: z$1.array(publicMembershipProductSchema),
40760
40452
  passPurchaseMode: z$1.enum(["add_to_cart", "buy_now"]),
40761
- buttonVariant: z$1.enum([
40762
- "primary",
40763
- "secondary",
40764
- "outline",
40765
- "link"
40766
- ])
40453
+ buttonVariant: blockButtonRoleSchema
40767
40454
  });
40768
40455
  const productListHydrationSchema = z$1.object({
40769
40456
  products: z$1.array(publicProductSchema),
@@ -42173,11 +41860,7 @@ const newsletterPresetSchema = z$1.enum([
42173
41860
  "emailNameCompany"
42174
41861
  ]);
42175
41862
  const newsletterDestinationProviderSchema = z$1.enum(["riverbank", "mailchimp"]);
42176
- const newsletterButtonVariantSchema = z$1.enum([
42177
- "primary",
42178
- "secondary",
42179
- "outline"
42180
- ]);
41863
+ const newsletterButtonVariantSchema = blockButtonRoleSchema;
42181
41864
  const newsletterFieldSchema = z$1.object({
42182
41865
  id: z$1.string(),
42183
41866
  type: z$1.enum(["email", "text"]),
@@ -45232,7 +44915,7 @@ const ButtonNode = ({ value, children, href, variantId = "primary", size = "md",
45232
44915
  return null;
45233
44916
  }
45234
44917
  const extraClassName = affordanceIcon ? [className, AFFORDANCE_SUPPRESS_CLASS].filter(Boolean).join(" ") : className;
45235
- const resolvedVariantId = parseThemeButtonVariantId(variantId);
44918
+ const resolvedVariantId = parseThemeButtonVariantId(canonicalizePersistedBlockButtonRole(variantId));
45236
44919
  const combinedClassName = resolvedVariantId ? themeButtonClassName({
45237
44920
  variant: resolvedVariantId,
45238
44921
  size,
@@ -45331,12 +45014,6 @@ const FeatureCardIconNode = ({ value, treatment, generatedIconSizePx, className,
45331
45014
  };
45332
45015
  //#endregion
45333
45016
  //#region ../blocks/src/system/runtime/nodes/file-download.tsx
45334
- const FILE_DOWNLOAD_BUTTON_VARIANTS = [
45335
- "primary",
45336
- "secondary",
45337
- "outline",
45338
- "link"
45339
- ];
45340
45017
  function isDownloadableMediaType(type) {
45341
45018
  return typeof type === "string" && PUBLIC_DOWNLOAD_MEDIA_TYPES.includes(type);
45342
45019
  }
@@ -45368,7 +45045,7 @@ function iconForMediaType(type) {
45368
45045
  }
45369
45046
  }
45370
45047
  function normalizeButtonVariant(value) {
45371
- return typeof value === "string" && FILE_DOWNLOAD_BUTTON_VARIANTS.includes(value) ? value : "primary";
45048
+ return isBlockButtonRole(value) ? value : "primary";
45372
45049
  }
45373
45050
  function FileDownloadNode({ value, title, description, buttonLabel, buttonVariant, className }) {
45374
45051
  if (!value || !isDownloadableMediaType(value.type)) return null;
@@ -46897,8 +46574,11 @@ function LocationMapView({ addressText, location, zoom, heightPx, showAddressTex
46897
46574
  href: directionsUrl,
46898
46575
  target: "_blank",
46899
46576
  rel: "noreferrer",
46900
- className: "rb-inline-flex rb-w-fit rb-items-center rb-justify-center rb-rounded-md rb-border rb-px-4 rb-py-2 rb-text-sm rb-font-medium rb-no-underline transition-theme-standard rb-hover-opacity-90",
46901
- style: mergeStyles(borderColorStyle("border"), backgroundColorStyle("surface"), textColorStyle("text")),
46577
+ className: themeButtonClassName({
46578
+ variant: "ghost",
46579
+ size: "sm",
46580
+ extraClassName: "rb-w-fit"
46581
+ }),
46902
46582
  children: directionsLabel
46903
46583
  }) : null
46904
46584
  ]
@@ -48296,7 +47976,11 @@ function WeeklySlotAvailabilityView({ availability, loading = false, error, empt
48296
47976
  ]
48297
47977
  }),
48298
47978
  resolvedCtaUrl ? /* @__PURE__ */ jsx("a", {
48299
- className: "weekly-slot-availability__cta",
47979
+ className: themeButtonClassName({
47980
+ variant: "ghost",
47981
+ size: "sm",
47982
+ extraClassName: "weekly-slot-availability__cta"
47983
+ }),
48300
47984
  href: buildSlotCtaUrl(resolvedCtaUrl, slot),
48301
47985
  "aria-label": buildSlotCtaLabel(resolvedCtaText, slot),
48302
47986
  children: resolvedCtaText
@@ -70528,7 +70212,7 @@ const TAG_TEMPLATES = {
70528
70212
  blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
70529
70213
  blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
70530
70214
  blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
70531
- TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.workflowRunById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.formById, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEventFilters, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicTeamMembers, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicPasses, TAG_TEMPLATES.publicMemberships, TAG_TEMPLATES.publicProducts, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicShop, TAG_TEMPLATES.publicCheckout, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents;
70215
+ TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.workflowRunById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.formById, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEventFilters, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicTeamMembers, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicCourses, TAG_TEMPLATES.publicPasses, TAG_TEMPLATES.publicMemberships, TAG_TEMPLATES.publicProducts, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicGifting, TAG_TEMPLATES.publicShop, TAG_TEMPLATES.publicCheckout, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents;
70532
70216
  z$1.object({
70533
70217
  formulaVersion: z$1.literal("managed-domain-overage-v1"),
70534
70218
  conversionRule: z$1.literal("usd-to-gbp-1-to-1-v1"),