@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
@@ -8982,7 +8982,7 @@ const gradientDirectionSchema$1 = z$1.enum([
8982
8982
  "to-br",
8983
8983
  "to-bl"
8984
8984
  ]);
8985
- const buttonBackgroundSchema = z$1.discriminatedUnion("type", [
8985
+ const buttonColourTreatmentSchema = z$1.discriminatedUnion("type", [
8986
8986
  z$1.object({
8987
8987
  type: z$1.literal("solid"),
8988
8988
  colorToken: opaqueButtonColourTokenSchema
@@ -9006,6 +9006,7 @@ const buttonBackgroundSchema = z$1.discriminatedUnion("type", [
9006
9006
  role: z$1.literal("link")
9007
9007
  })
9008
9008
  ]);
9009
+ const buttonBackgroundSchema = buttonColourTreatmentSchema;
9009
9010
  const effectApplicationSchema$1 = z$1.object({
9010
9011
  effectId: z$1.string(),
9011
9012
  options: z$1.record(z$1.string(), z$1.json()).optional()
@@ -9217,265 +9218,429 @@ function isUnknownArray$2(value) {
9217
9218
  return Array.isArray(value);
9218
9219
  }
9219
9220
  //#endregion
9220
- //#region ../theme-core/src/buttons/personalities/types.ts
9221
- function asButtonPersonalityId(value) {
9222
- if (value.length === 0) throw new Error("ButtonPersonalityId must be a non-empty string");
9223
- return value;
9221
+ //#region ../theme-core/src/buttons/styles/domain.ts
9222
+ const PUBLIC_BUTTON_ROLES = [
9223
+ "primary",
9224
+ "secondary",
9225
+ "outline",
9226
+ "ghost",
9227
+ "accent"
9228
+ ];
9229
+ function defineButtonStyleRecipe(recipe) {
9230
+ return recipe;
9224
9231
  }
9225
- const buttonPersonalityIdSchema = z$1.string().min(1).transform((value) => asButtonPersonalityId(value));
9226
- z$1.object({
9227
- id: buttonPersonalityIdSchema,
9228
- name: z$1.string().min(1),
9229
- description: z$1.string().min(1),
9230
- tags: styleTagsSchema,
9231
- buttonSystem: buttonSystemSchema
9232
- });
9233
- /**
9234
- * Helper for personality file modules to keep the call site short and
9235
- * type-safe. `as const satisfies ...` would also work but produces wider
9236
- * types at use sites.
9237
- */
9238
- function defineButtonPersonality(input) {
9232
+ function materializeButtonRoles(definitions) {
9233
+ const primary = materializeCompleteRole("primary", definitions.primary.appearance);
9234
+ const secondary = materializeCompleteRole("secondary", definitions.secondary.appearance);
9235
+ const completeRoles = {
9236
+ primary,
9237
+ secondary
9238
+ };
9239
9239
  return {
9240
- id: asButtonPersonalityId(input.id),
9241
- name: input.name,
9242
- description: input.description,
9243
- tags: input.tags,
9244
- buttonSystem: buttonSystemSchema.parse(input.buttonSystem)
9240
+ primary,
9241
+ secondary,
9242
+ outline: materializeSupportingRole("outline", definitions.outline, completeRoles),
9243
+ ghost: materializeSupportingRole("ghost", definitions.ghost, completeRoles),
9244
+ accent: materializeSupportingRole("accent", definitions.accent, completeRoles)
9245
+ };
9246
+ }
9247
+ function resolveButtonStyleRecipe(recipe, parameters) {
9248
+ const parsedParameters = recipe.parameterSchema.safeParse(parameters);
9249
+ if (!parsedParameters.success) return {
9250
+ kind: "error",
9251
+ error: {
9252
+ kind: "invalid-parameters",
9253
+ styleId: recipe.id,
9254
+ issues: parsedParameters.error.issues.map((issue) => issue.message)
9255
+ }
9256
+ };
9257
+ const definition = recipe.defineSystem(parsedParameters.data);
9258
+ const roles = materializeButtonRoles(definition.roles);
9259
+ const buttonSystem = {
9260
+ global: definition.global,
9261
+ variants: PUBLIC_BUTTON_ROLES.map((role) => roles[role]),
9262
+ ...definition.sizes ? { sizes: definition.sizes } : {}
9263
+ };
9264
+ const parsedButtonSystem = buttonSystemSchema.safeParse(buttonSystem);
9265
+ if (!parsedButtonSystem.success) return {
9266
+ kind: "error",
9267
+ error: {
9268
+ kind: "invalid-button-system",
9269
+ styleId: recipe.id,
9270
+ issues: parsedButtonSystem.error.issues.map((issue) => issue.message)
9271
+ }
9272
+ };
9273
+ return {
9274
+ kind: "resolved",
9275
+ buttonSystem: parsedButtonSystem.data
9245
9276
  };
9246
9277
  }
9278
+ function materializeSupportingRole(role, definition, completeRoles) {
9279
+ if (definition.kind === "complete") return materializeCompleteRole(role, definition.appearance);
9280
+ return {
9281
+ ...completeRoles[definition.from],
9282
+ ...definition.overrides,
9283
+ id: role,
9284
+ name: roleName(role),
9285
+ enabled: true,
9286
+ priority: 3
9287
+ };
9288
+ }
9289
+ function materializeCompleteRole(role, appearance) {
9290
+ return {
9291
+ ...appearance,
9292
+ id: role,
9293
+ name: roleName(role),
9294
+ enabled: true,
9295
+ priority: rolePriority(role)
9296
+ };
9297
+ }
9298
+ function roleName(role) {
9299
+ return role.charAt(0).toUpperCase() + role.slice(1);
9300
+ }
9301
+ function rolePriority(role) {
9302
+ if (role === "primary") return 1;
9303
+ if (role === "secondary") return 2;
9304
+ return 3;
9305
+ }
9306
+ //#endregion
9307
+ //#region ../theme-core/src/buttons/styles/selection.ts
9308
+ const BUTTON_STYLE_IDS = [
9309
+ "soft-pill",
9310
+ "earth-pill",
9311
+ "confident-chip",
9312
+ "editorial-link",
9313
+ "pebble",
9314
+ "ink-stamp",
9315
+ "flat-ink",
9316
+ "brushed-wash",
9317
+ "showtime-pill",
9318
+ "joy-stamp",
9319
+ "ornate-ritual",
9320
+ "quiet-arrow"
9321
+ ];
9322
+ const quietArrowParametersSchema = z$1.object({ secondaryTreatment: z$1.enum(["outlined", "solid-accent"]) }).strict();
9323
+ const emptyParametersSchema$1 = z$1.object({}).strict();
9324
+ function selectionBranch(styleId, parameters) {
9325
+ return z$1.object({
9326
+ styleId: z$1.literal(styleId),
9327
+ parameters
9328
+ }).strict();
9329
+ }
9330
+ const buttonStyleSelectionSchema = z$1.discriminatedUnion("styleId", [
9331
+ selectionBranch("soft-pill", emptyParametersSchema$1),
9332
+ selectionBranch("earth-pill", emptyParametersSchema$1),
9333
+ selectionBranch("confident-chip", emptyParametersSchema$1),
9334
+ selectionBranch("editorial-link", emptyParametersSchema$1),
9335
+ selectionBranch("pebble", emptyParametersSchema$1),
9336
+ selectionBranch("ink-stamp", emptyParametersSchema$1),
9337
+ selectionBranch("flat-ink", emptyParametersSchema$1),
9338
+ selectionBranch("brushed-wash", emptyParametersSchema$1),
9339
+ selectionBranch("showtime-pill", emptyParametersSchema$1),
9340
+ selectionBranch("joy-stamp", emptyParametersSchema$1),
9341
+ selectionBranch("ornate-ritual", emptyParametersSchema$1),
9342
+ selectionBranch("quiet-arrow", quietArrowParametersSchema)
9343
+ ]);
9247
9344
  //#endregion
9248
- //#region ../theme-core/src/buttons/personalities/brushed-wash.ts
9249
- /**
9250
- * Brushed Wash — gradient backgrounds that read as watercolour washes.
9251
- * Generous padding, soft shadows; pairs with vibrant organic brands.
9252
- */
9253
- const brushedWash = defineButtonPersonality({
9254
- id: "brushed-wash",
9255
- name: "Brushed Wash",
9256
- description: "Watercolour-gradient buttons with soft shadows and generous padding.",
9345
+ //#region ../theme-core/src/buttons/styles/recipes/quietArrow.ts
9346
+ const quietArrowRecipe = defineButtonStyleRecipe({
9347
+ id: "quiet-arrow",
9348
+ accessibilityLabel: "Wide uppercase buttons with trailing arrows",
9257
9349
  tags: {
9258
9350
  tone: "classic",
9259
- energy: "vibrant",
9260
- motion: "standard",
9261
- era: "organic"
9351
+ energy: "calm",
9352
+ motion: "subtle",
9353
+ era: "editorial"
9262
9354
  },
9263
- buttonSystem: {
9355
+ parameterSchema: quietArrowParametersSchema,
9356
+ defaultParameters: { secondaryTreatment: "outlined" },
9357
+ controls: [{
9358
+ kind: "choice",
9359
+ parameter: "secondaryTreatment",
9360
+ label: "Secondary button treatment",
9361
+ options: [{
9362
+ value: "outlined",
9363
+ label: "Outlined"
9364
+ }, {
9365
+ value: "solid-accent",
9366
+ label: "Solid accent"
9367
+ }]
9368
+ }],
9369
+ defineSystem: (parameters) => ({
9264
9370
  global: {
9265
9371
  cornerStyle: "rounded",
9266
- shadow: "low",
9267
- textTransform: "none",
9372
+ textTransform: "uppercase",
9268
9373
  fontWeight: 500,
9269
9374
  borderWidth: 1,
9375
+ typography: "body",
9376
+ fontSize: "text-sm",
9377
+ letterSpacing: "loose",
9270
9378
  hoverTransform: "none",
9271
9379
  hoverColor: "none"
9272
9380
  },
9273
9381
  sizes: {
9274
9382
  sm: {
9275
- padding: "0.75rem 2rem",
9383
+ padding: "0.625rem 1.25rem",
9384
+ fontSize: "text-xs"
9385
+ },
9386
+ md: {
9387
+ padding: "0.8125rem 1.75rem",
9276
9388
  fontSize: "text-sm"
9277
9389
  },
9278
- md: { padding: "1rem 2.5rem" },
9279
9390
  lg: {
9280
- padding: "1.25rem 3rem",
9281
- fontSize: "text-lg"
9391
+ padding: "0.9375rem 2.125rem",
9392
+ fontSize: "text-sm"
9282
9393
  },
9283
9394
  xl: {
9284
- padding: "1.625rem 3.75rem",
9285
- fontSize: "text-xl"
9395
+ padding: "1.0625rem 2.5rem",
9396
+ fontSize: "text-base"
9286
9397
  }
9287
9398
  },
9288
- variants: [
9289
- {
9290
- id: "primary",
9291
- name: "Primary",
9292
- enabled: true,
9293
- priority: 1,
9294
- background: {
9295
- type: "gradient",
9296
- stops: ["primary", "accent"],
9297
- direction: "to-r",
9298
- foregroundToken: "primaryForeground"
9299
- },
9300
- borderRadius: "rounded-lg",
9301
- shadow: {
9302
- elevation: "low",
9303
- softness: "soft",
9304
- position: "bottom"
9399
+ roles: {
9400
+ primary: {
9401
+ kind: "complete",
9402
+ appearance: {
9403
+ background: {
9404
+ type: "solid",
9405
+ colorToken: unsafeAsOpaqueButtonColourToken("primary")
9406
+ },
9407
+ borderRadius: "rounded-xl",
9408
+ affordance: { iconId: "ArrowRight" },
9409
+ effects: { hover: [{
9410
+ effectId: "darken-background",
9411
+ options: { amount: 100 }
9412
+ }] }
9305
9413
  }
9306
9414
  },
9307
- {
9308
- id: "secondary",
9309
- name: "Secondary",
9310
- enabled: true,
9311
- priority: 2,
9312
- background: {
9313
- type: "gradient",
9314
- stops: ["secondary", "accent"],
9315
- direction: "to-br",
9316
- foregroundToken: "primaryForeground"
9317
- },
9318
- borderRadius: "rounded-lg",
9319
- shadow: {
9320
- elevation: "low",
9321
- softness: "soft",
9322
- position: "bottom"
9415
+ secondary: {
9416
+ kind: "complete",
9417
+ appearance: parameters.secondaryTreatment === "solid-accent" ? {
9418
+ background: {
9419
+ type: "solid",
9420
+ colorToken: unsafeAsOpaqueButtonColourToken("accent")
9421
+ },
9422
+ borderRadius: "rounded-xl",
9423
+ affordance: { iconId: "ArrowRight" },
9424
+ effects: { hover: [{
9425
+ effectId: "darken-background",
9426
+ options: { amount: 100 }
9427
+ }] }
9428
+ } : {
9429
+ background: {
9430
+ type: "surface",
9431
+ role: "link"
9432
+ },
9433
+ borderRadius: "rounded-xl",
9434
+ border: { widthClass: "border" },
9435
+ affordance: { iconId: "ArrowRight" },
9436
+ effects: { hover: [{
9437
+ effectId: "background-on-hover",
9438
+ options: { colorToken: "surfaceAlt" }
9439
+ }] }
9323
9440
  }
9324
9441
  },
9325
- {
9326
- id: "outline",
9327
- name: "Outline",
9328
- enabled: true,
9329
- priority: 3,
9330
- background: {
9331
- type: "surface",
9332
- role: "link"
9333
- },
9334
- borderRadius: "rounded-lg",
9335
- border: { widthClass: "border" },
9336
- effects: { hover: [{
9337
- effectId: "background-on-hover",
9338
- options: { colorToken: "surface" }
9339
- }] }
9442
+ outline: {
9443
+ kind: "complete",
9444
+ appearance: {
9445
+ background: {
9446
+ type: "surface",
9447
+ role: "link"
9448
+ },
9449
+ borderRadius: "rounded-xl",
9450
+ border: { widthClass: "border" }
9451
+ }
9340
9452
  },
9341
- {
9342
- id: "ghost",
9343
- name: "Ghost",
9344
- enabled: true,
9345
- priority: 3,
9346
- background: {
9347
- type: "surface",
9348
- role: "link"
9349
- },
9350
- borderRadius: "rounded-lg",
9351
- effects: { hover: [{
9352
- effectId: "background-on-hover",
9353
- options: { colorToken: "surface" }
9354
- }] }
9453
+ ghost: {
9454
+ kind: "complete",
9455
+ appearance: {
9456
+ background: {
9457
+ type: "surface",
9458
+ role: "link"
9459
+ },
9460
+ borderRadius: "rounded-xl"
9461
+ }
9462
+ },
9463
+ accent: {
9464
+ kind: "derive",
9465
+ from: "primary",
9466
+ overrides: { background: {
9467
+ type: "solid",
9468
+ colorToken: unsafeAsOpaqueButtonColourToken("accent")
9469
+ } }
9355
9470
  }
9356
- ]
9357
- }
9471
+ }
9472
+ })
9358
9473
  });
9359
9474
  //#endregion
9360
- //#region ../theme-core/src/buttons/personalities/confident-chip.ts
9361
- /**
9362
- * Confident Chip — moderate-radius solid buttons that read as competent and
9363
- * direct. Default for Clear Professional; works for any modern brand voice.
9364
- */
9365
- const confidentChip = defineButtonPersonality({
9366
- id: "confident-chip",
9367
- name: "Confident Chip",
9368
- description: "Mid-radius solid buttons with a crisp hover.",
9475
+ //#region ../theme-core/src/buttons/styles/recipes/defineStaticButtonStyleRecipe.ts
9476
+ const emptyParametersSchema = z$1.object({}).strict();
9477
+ function defineStaticButtonStyleRecipe(input) {
9478
+ const system = normalizeSystem(input.system);
9479
+ return defineButtonStyleRecipe({
9480
+ id: input.id,
9481
+ accessibilityLabel: input.accessibilityLabel,
9482
+ tags: input.tags,
9483
+ parameterSchema: emptyParametersSchema,
9484
+ defaultParameters: {},
9485
+ controls: [],
9486
+ defineSystem: () => system
9487
+ });
9488
+ }
9489
+ function normalizeSystem(input) {
9490
+ return {
9491
+ global: buttonGlobalSettingsSchema.parse(input.global),
9492
+ ...input.sizes ? { sizes: input.sizes } : {},
9493
+ roles: {
9494
+ primary: normalizeCompleteRole(input.roles.primary),
9495
+ secondary: normalizeCompleteRole(input.roles.secondary),
9496
+ outline: normalizeSupportingRole(input.roles.outline),
9497
+ ghost: normalizeSupportingRole(input.roles.ghost),
9498
+ accent: normalizeSupportingRole(input.roles.accent)
9499
+ }
9500
+ };
9501
+ }
9502
+ function normalizeCompleteRole(role) {
9503
+ return {
9504
+ kind: "complete",
9505
+ appearance: normalizeAppearance(role.appearance)
9506
+ };
9507
+ }
9508
+ function normalizeSupportingRole(role) {
9509
+ if (role.kind === "complete") return normalizeCompleteRole(role);
9510
+ return {
9511
+ kind: "derive",
9512
+ from: role.from,
9513
+ ...role.overrides ? { overrides: normalizeAppearanceOverrides(role.overrides) } : {}
9514
+ };
9515
+ }
9516
+ function normalizeAppearance(appearance) {
9517
+ const { background, hoverBackgroundToken, ...rest } = appearance;
9518
+ return {
9519
+ ...rest,
9520
+ background: buttonColourTreatmentSchema.parse(background),
9521
+ ...hoverBackgroundToken ? { hoverBackgroundToken: opaqueButtonColourTokenSchema.parse(hoverBackgroundToken) } : {}
9522
+ };
9523
+ }
9524
+ function normalizeAppearanceOverrides(overrides) {
9525
+ const { background, hoverBackgroundToken, ...rest } = overrides;
9526
+ return {
9527
+ ...rest,
9528
+ ...background ? { background: buttonColourTreatmentSchema.parse(background) } : {},
9529
+ ...hoverBackgroundToken ? { hoverBackgroundToken: opaqueButtonColourTokenSchema.parse(hoverBackgroundToken) } : {}
9530
+ };
9531
+ }
9532
+ //#endregion
9533
+ //#region ../theme-core/src/buttons/styles/recipes/staticRecipes.ts
9534
+ const softPillRecipe = defineStaticButtonStyleRecipe({
9535
+ id: "soft-pill",
9536
+ accessibilityLabel: "Rounded pill buttons with a gentle hover lift",
9369
9537
  tags: {
9370
9538
  tone: "classic",
9371
9539
  energy: "calm",
9372
- motion: "standard",
9373
- era: "modern"
9540
+ motion: "subtle",
9541
+ era: "organic"
9374
9542
  },
9375
- buttonSystem: {
9543
+ system: {
9376
9544
  global: {
9377
- cornerStyle: "rounded",
9378
- shadow: "medium",
9545
+ cornerStyle: "pill",
9546
+ shadow: "low",
9379
9547
  textTransform: "none",
9380
- fontWeight: 600,
9381
- borderWidth: 1,
9382
- hoverTransform: "none",
9548
+ fontWeight: 500,
9549
+ borderWidth: 2,
9550
+ hoverTransform: "lift",
9383
9551
  hoverColor: "none"
9384
9552
  },
9385
- variants: [
9386
- {
9387
- id: "primary",
9388
- name: "Primary",
9389
- enabled: true,
9390
- priority: 1,
9391
- background: {
9392
- type: "solid",
9393
- colorToken: "primary"
9394
- },
9395
- borderRadius: "rounded-md",
9396
- shadow: {
9397
- elevation: "medium",
9398
- softness: "soft",
9399
- position: "bottom"
9400
- },
9401
- effects: {
9402
- hover: [{
9403
- effectId: "darken-background",
9404
- options: { amount: 100 }
9405
- }],
9406
- active: [{
9407
- effectId: "scale-down",
9408
- options: { scale: "0.97" }
9409
- }]
9553
+ roles: {
9554
+ primary: {
9555
+ kind: "complete",
9556
+ appearance: {
9557
+ background: {
9558
+ type: "solid",
9559
+ colorToken: "primary"
9560
+ },
9561
+ borderRadius: "rounded-full",
9562
+ shadow: {
9563
+ elevation: "low",
9564
+ softness: "soft",
9565
+ position: "bottom"
9566
+ },
9567
+ effects: {
9568
+ hover: [{
9569
+ effectId: "lift",
9570
+ options: { translateY: "-1px" }
9571
+ }],
9572
+ active: [{
9573
+ effectId: "scale-down",
9574
+ options: { scale: "0.98" }
9575
+ }]
9576
+ }
9410
9577
  }
9411
9578
  },
9412
- {
9413
- id: "secondary",
9414
- name: "Secondary",
9415
- enabled: true,
9416
- priority: 2,
9417
- background: {
9418
- type: "solid",
9419
- colorToken: "surface"
9420
- },
9421
- borderRadius: "rounded-md",
9422
- border: { widthClass: "border" },
9423
- effects: { hover: [{
9424
- effectId: "background-on-hover",
9425
- options: { colorToken: "background" }
9426
- }] }
9579
+ secondary: {
9580
+ kind: "complete",
9581
+ appearance: {
9582
+ background: {
9583
+ type: "surface",
9584
+ role: "link"
9585
+ },
9586
+ borderRadius: "rounded-full",
9587
+ border: { widthClass: "border-2" },
9588
+ effects: { hover: [{
9589
+ effectId: "background-on-hover",
9590
+ options: { colorToken: "surface" }
9591
+ }] }
9592
+ }
9427
9593
  },
9428
- {
9429
- id: "outline",
9430
- name: "Outline",
9431
- enabled: true,
9432
- priority: 3,
9433
- background: {
9434
- type: "surface",
9435
- role: "link"
9436
- },
9437
- borderRadius: "rounded-md",
9438
- border: { widthClass: "border" },
9439
- effects: { hover: [{
9440
- effectId: "background-on-hover",
9441
- options: { colorToken: "surface" }
9442
- }] }
9594
+ outline: {
9595
+ kind: "complete",
9596
+ appearance: {
9597
+ background: {
9598
+ type: "surface",
9599
+ role: "link"
9600
+ },
9601
+ borderRadius: "rounded-full",
9602
+ border: { widthClass: "border" },
9603
+ effects: { hover: [{
9604
+ effectId: "background-on-hover",
9605
+ options: { colorToken: "surface" }
9606
+ }] }
9607
+ }
9443
9608
  },
9444
- {
9445
- id: "ghost",
9446
- name: "Ghost",
9447
- enabled: true,
9448
- priority: 3,
9449
- background: {
9450
- type: "surface",
9451
- role: "link"
9452
- },
9453
- borderRadius: "rounded-md",
9454
- effects: { hover: [{
9455
- effectId: "background-on-hover",
9456
- options: { colorToken: "surface" }
9457
- }] }
9609
+ ghost: {
9610
+ kind: "complete",
9611
+ appearance: {
9612
+ background: {
9613
+ type: "surface",
9614
+ role: "link"
9615
+ },
9616
+ borderRadius: "rounded-full",
9617
+ effects: { hover: [{
9618
+ effectId: "background-on-hover",
9619
+ options: { colorToken: "surface" }
9620
+ }] }
9621
+ }
9622
+ },
9623
+ accent: {
9624
+ kind: "derive",
9625
+ from: "primary",
9626
+ overrides: { background: {
9627
+ type: "solid",
9628
+ colorToken: "accent"
9629
+ } }
9458
9630
  }
9459
- ]
9631
+ }
9460
9632
  }
9461
9633
  });
9462
- //#endregion
9463
- //#region ../theme-core/src/buttons/personalities/earth-pill.ts
9464
- /**
9465
- * Earth Pill - warm studio pills with compact, primary-coloured ghost CTAs.
9466
- * Built for grounded editorial wellness styles such as Soft Earth.
9467
- */
9468
- const earthPill = defineButtonPersonality({
9634
+ const earthPillRecipe = defineStaticButtonStyleRecipe({
9469
9635
  id: "earth-pill",
9470
- name: "Earth Pill",
9471
- description: "Compact terracotta pills with quiet primary-coloured ghost CTAs.",
9636
+ accessibilityLabel: "Compact rounded buttons with a quiet hover lift",
9472
9637
  tags: {
9473
9638
  tone: "classic",
9474
9639
  energy: "calm",
9475
9640
  motion: "subtle",
9476
9641
  era: "organic"
9477
9642
  },
9478
- buttonSystem: {
9643
+ system: {
9479
9644
  global: {
9480
9645
  cornerStyle: "pill",
9481
9646
  shadow: "low",
@@ -9502,576 +9667,547 @@ const earthPill = defineButtonPersonality({
9502
9667
  fontSize: "text-xl"
9503
9668
  }
9504
9669
  },
9505
- variants: [
9506
- {
9507
- id: "primary",
9508
- name: "Primary",
9509
- enabled: true,
9510
- priority: 1,
9511
- background: {
9512
- type: "solid",
9513
- colorToken: "primary"
9514
- },
9515
- borderRadius: "rounded-full",
9516
- shadow: {
9517
- elevation: "low",
9518
- softness: "soft",
9519
- position: "bottom"
9520
- },
9521
- effects: {
9522
- hover: [{
9523
- effectId: "lift",
9524
- options: { translateY: "-1px" }
9525
- }, {
9526
- effectId: "background-on-hover",
9527
- options: { colorToken: "accent" }
9528
- }],
9529
- active: [{
9530
- effectId: "scale-down",
9531
- options: { scale: "0.98" }
9532
- }]
9670
+ roles: {
9671
+ primary: {
9672
+ kind: "complete",
9673
+ appearance: {
9674
+ background: {
9675
+ type: "solid",
9676
+ colorToken: "primary"
9677
+ },
9678
+ borderRadius: "rounded-full",
9679
+ shadow: {
9680
+ elevation: "low",
9681
+ softness: "soft",
9682
+ position: "bottom"
9683
+ },
9684
+ effects: {
9685
+ hover: [{
9686
+ effectId: "lift",
9687
+ options: { translateY: "-1px" }
9688
+ }, {
9689
+ effectId: "background-on-hover",
9690
+ options: { colorToken: "accent" }
9691
+ }],
9692
+ active: [{
9693
+ effectId: "scale-down",
9694
+ options: { scale: "0.98" }
9695
+ }]
9696
+ }
9533
9697
  }
9534
9698
  },
9535
- {
9536
- id: "secondary",
9537
- name: "Secondary",
9538
- enabled: true,
9539
- priority: 2,
9540
- background: {
9541
- type: "surface",
9542
- role: "link"
9543
- },
9544
- borderRadius: "rounded-full",
9545
- border: { widthClass: "border" },
9546
- effects: { hover: [{
9547
- effectId: "background-on-hover",
9548
- options: { colorToken: "muted" }
9549
- }] }
9699
+ secondary: {
9700
+ kind: "complete",
9701
+ appearance: {
9702
+ background: {
9703
+ type: "surface",
9704
+ role: "link"
9705
+ },
9706
+ borderRadius: "rounded-full",
9707
+ border: { widthClass: "border" },
9708
+ effects: { hover: [{
9709
+ effectId: "background-on-hover",
9710
+ options: { colorToken: "muted" }
9711
+ }] }
9712
+ }
9550
9713
  },
9551
- {
9552
- id: "outline",
9553
- name: "Outline",
9554
- enabled: true,
9555
- priority: 3,
9556
- background: {
9557
- type: "surface",
9558
- role: "link"
9559
- },
9560
- borderRadius: "rounded-full",
9561
- border: { widthClass: "border" },
9562
- effects: { hover: [{
9563
- effectId: "background-on-hover",
9564
- options: { colorToken: "surfaceAlt" }
9565
- }] }
9714
+ outline: {
9715
+ kind: "complete",
9716
+ appearance: {
9717
+ background: {
9718
+ type: "surface",
9719
+ role: "link"
9720
+ },
9721
+ borderRadius: "rounded-full",
9722
+ border: { widthClass: "border" },
9723
+ effects: { hover: [{
9724
+ effectId: "background-on-hover",
9725
+ options: { colorToken: "surfaceAlt" }
9726
+ }] }
9727
+ }
9566
9728
  },
9567
- {
9568
- id: "ghost",
9569
- name: "Ghost",
9570
- enabled: true,
9571
- priority: 3,
9572
- background: {
9573
- type: "surface",
9574
- role: "link"
9575
- },
9576
- borderRadius: "rounded-full",
9577
- shadow: {
9578
- elevation: "none",
9579
- softness: null,
9580
- position: "bottom"
9581
- },
9582
- sizes: {
9583
- sm: {
9584
- padding: "0.25rem 0",
9585
- fontSize: "text-sm"
9729
+ ghost: {
9730
+ kind: "complete",
9731
+ appearance: {
9732
+ background: {
9733
+ type: "surface",
9734
+ role: "link"
9586
9735
  },
9587
- md: { padding: "0.375rem 0" },
9588
- lg: {
9589
- padding: "0.5rem 0",
9590
- fontSize: "text-lg"
9736
+ borderRadius: "rounded-full",
9737
+ shadow: {
9738
+ elevation: "none",
9739
+ softness: null,
9740
+ position: "bottom"
9591
9741
  },
9592
- xl: {
9593
- padding: "0.625rem 0",
9594
- fontSize: "text-xl"
9742
+ sizes: {
9743
+ sm: {
9744
+ padding: "0.25rem 0",
9745
+ fontSize: "text-sm"
9746
+ },
9747
+ md: { padding: "0.375rem 0" },
9748
+ lg: {
9749
+ padding: "0.5rem 0",
9750
+ fontSize: "text-lg"
9751
+ },
9752
+ xl: {
9753
+ padding: "0.625rem 0",
9754
+ fontSize: "text-xl"
9755
+ }
9595
9756
  }
9596
9757
  }
9758
+ },
9759
+ accent: {
9760
+ kind: "derive",
9761
+ from: "primary",
9762
+ overrides: { background: {
9763
+ type: "solid",
9764
+ colorToken: "accent"
9765
+ } }
9597
9766
  }
9598
- ]
9767
+ }
9599
9768
  }
9600
9769
  });
9601
- //#endregion
9602
- //#region ../theme-core/src/buttons/personalities/editorial-link.ts
9603
- /**
9604
- * Editorial Link — all variants are link-style with a growing underline.
9605
- * Default for Warm Editorial and Quiet Luxury; reads as refined and quiet.
9606
- */
9607
- const editorialLink = defineButtonPersonality({
9608
- id: "editorial-link",
9609
- name: "Editorial Link",
9610
- description: "Link-style with a growing underline. Refined, typographic.",
9770
+ const confidentChipRecipe = defineStaticButtonStyleRecipe({
9771
+ id: "confident-chip",
9772
+ accessibilityLabel: "Moderately rounded solid buttons with a crisp hover",
9611
9773
  tags: {
9612
- tone: "minimal",
9774
+ tone: "classic",
9613
9775
  energy: "calm",
9614
- motion: "subtle",
9615
- era: "editorial"
9776
+ motion: "standard",
9777
+ era: "modern"
9616
9778
  },
9617
- buttonSystem: {
9779
+ system: {
9618
9780
  global: {
9619
- cornerStyle: "square",
9781
+ cornerStyle: "rounded",
9782
+ shadow: "medium",
9620
9783
  textTransform: "none",
9621
- fontWeight: 500,
9784
+ fontWeight: 600,
9622
9785
  borderWidth: 1,
9623
9786
  hoverTransform: "none",
9624
9787
  hoverColor: "none"
9625
9788
  },
9626
- variants: [
9627
- {
9628
- id: "primary",
9629
- name: "Primary",
9630
- enabled: true,
9631
- priority: 1,
9632
- background: {
9633
- type: "surface",
9634
- role: "link"
9635
- },
9636
- borderRadius: "rounded-none",
9637
- sizes: {
9638
- sm: { padding: "0.25rem 0" },
9639
- md: { padding: "0.5rem 0" },
9640
- lg: { padding: "0.625rem 0" },
9641
- xl: { padding: "0.75rem 0" }
9642
- },
9643
- effects: { base: [{
9644
- effectId: "border-bottom-grow",
9645
- options: {
9646
- height: 2,
9647
- colorToken: "text",
9648
- origin: "left"
9789
+ roles: {
9790
+ primary: {
9791
+ kind: "complete",
9792
+ appearance: {
9793
+ background: {
9794
+ type: "solid",
9795
+ colorToken: "primary"
9796
+ },
9797
+ borderRadius: "rounded-md",
9798
+ shadow: {
9799
+ elevation: "medium",
9800
+ softness: "soft",
9801
+ position: "bottom"
9802
+ },
9803
+ effects: {
9804
+ hover: [{
9805
+ effectId: "darken-background",
9806
+ options: { amount: 100 }
9807
+ }],
9808
+ active: [{
9809
+ effectId: "scale-down",
9810
+ options: { scale: "0.97" }
9811
+ }]
9649
9812
  }
9650
- }] }
9813
+ }
9651
9814
  },
9652
- {
9653
- id: "secondary",
9654
- name: "Secondary",
9655
- enabled: true,
9656
- priority: 2,
9657
- background: {
9658
- type: "surface",
9659
- role: "link"
9660
- },
9661
- borderRadius: "rounded-none",
9662
- sizes: {
9663
- sm: { padding: "0.25rem 0" },
9664
- md: { padding: "0.5rem 0" },
9665
- lg: { padding: "0.625rem 0" },
9666
- xl: { padding: "0.75rem 0" }
9667
- },
9668
- effects: { base: [{
9669
- effectId: "border-bottom-grow",
9670
- options: {
9671
- height: 1,
9672
- colorToken: "mutedText",
9673
- origin: "left"
9674
- }
9675
- }] }
9815
+ secondary: {
9816
+ kind: "complete",
9817
+ appearance: {
9818
+ background: {
9819
+ type: "solid",
9820
+ colorToken: "surface"
9821
+ },
9822
+ borderRadius: "rounded-md",
9823
+ border: { widthClass: "border" },
9824
+ effects: { hover: [{
9825
+ effectId: "background-on-hover",
9826
+ options: { colorToken: "background" }
9827
+ }] }
9828
+ }
9676
9829
  },
9677
- {
9678
- id: "outline",
9679
- name: "Outline",
9680
- enabled: true,
9681
- priority: 3,
9682
- background: {
9683
- type: "surface",
9684
- role: "link"
9685
- },
9686
- borderRadius: "rounded-none",
9687
- sizes: {
9688
- sm: { padding: "0.25rem 0" },
9689
- md: { padding: "0.5rem 0" },
9690
- lg: { padding: "0.625rem 0" },
9691
- xl: { padding: "0.75rem 0" }
9692
- },
9693
- effects: { base: [{
9694
- effectId: "border-bottom-grow",
9695
- options: {
9696
- height: 1,
9697
- colorToken: "accent",
9698
- origin: "left"
9699
- }
9700
- }] }
9830
+ outline: {
9831
+ kind: "complete",
9832
+ appearance: {
9833
+ background: {
9834
+ type: "surface",
9835
+ role: "link"
9836
+ },
9837
+ borderRadius: "rounded-md",
9838
+ border: { widthClass: "border" },
9839
+ effects: { hover: [{
9840
+ effectId: "background-on-hover",
9841
+ options: { colorToken: "surface" }
9842
+ }] }
9843
+ }
9701
9844
  },
9702
- {
9703
- id: "ghost",
9704
- name: "Ghost",
9705
- enabled: true,
9706
- priority: 3,
9707
- background: {
9708
- type: "surface",
9709
- role: "link"
9710
- },
9711
- borderRadius: "rounded-none",
9712
- sizes: {
9713
- sm: { padding: "0.25rem 0" },
9714
- md: { padding: "0.5rem 0" },
9715
- lg: { padding: "0.625rem 0" },
9716
- xl: { padding: "0.75rem 0" }
9845
+ ghost: {
9846
+ kind: "complete",
9847
+ appearance: {
9848
+ background: {
9849
+ type: "surface",
9850
+ role: "link"
9851
+ },
9852
+ borderRadius: "rounded-md",
9853
+ effects: { hover: [{
9854
+ effectId: "background-on-hover",
9855
+ options: { colorToken: "surface" }
9856
+ }] }
9717
9857
  }
9858
+ },
9859
+ accent: {
9860
+ kind: "derive",
9861
+ from: "primary",
9862
+ overrides: { background: {
9863
+ type: "solid",
9864
+ colorToken: "accent"
9865
+ } }
9718
9866
  }
9719
- ]
9867
+ }
9720
9868
  }
9721
9869
  });
9722
- //#endregion
9723
- //#region ../theme-core/src/buttons/personalities/flat-ink.ts
9724
- /**
9725
- * Flat Ink — a solid ink primary, a hairline ghost secondary, and a single
9726
- * amber accent climax, all completely flat (no drop shadow) with a modest
9727
- * radius. Reads as grounded, editorial and clinician-precise: the Fulcrum
9728
- * physiotherapy voice. The primary shifts to the secondary (moss) on hover and
9729
- * every variant lifts 2px; the amber accent is meant to be used sparingly as
9730
- * the page's one conversion climax.
9731
- */
9732
- const flatInk = defineButtonPersonality({
9733
- id: "flat-ink",
9734
- name: "Flat Ink",
9735
- description: "Flat solid-ink primary, hairline ghost secondary, and a single amber accent climax — modest radius, no shadow.",
9870
+ const editorialSizes = {
9871
+ sm: { padding: "0.25rem 0" },
9872
+ md: { padding: "0.5rem 0" },
9873
+ lg: { padding: "0.625rem 0" },
9874
+ xl: { padding: "0.75rem 0" }
9875
+ };
9876
+ const editorialLinkRecipe = defineStaticButtonStyleRecipe({
9877
+ id: "editorial-link",
9878
+ accessibilityLabel: "Flat typographic buttons with an underline treatment",
9736
9879
  tags: {
9737
- tone: "classic",
9880
+ tone: "minimal",
9738
9881
  energy: "calm",
9739
9882
  motion: "subtle",
9740
9883
  era: "editorial"
9741
9884
  },
9742
- buttonSystem: {
9885
+ system: {
9743
9886
  global: {
9744
- cornerStyle: "rounded",
9887
+ cornerStyle: "square",
9745
9888
  textTransform: "none",
9746
- fontWeight: 600,
9889
+ fontWeight: 500,
9747
9890
  borderWidth: 1,
9748
- typography: "body",
9749
- letterSpacing: "tight",
9750
- paddingPreset: "default",
9751
- hoverTransform: "lift",
9891
+ hoverTransform: "none",
9752
9892
  hoverColor: "none"
9753
9893
  },
9754
- sizes: {
9755
- sm: {
9756
- padding: "0.625rem 1.125rem",
9757
- fontSize: "text-sm"
9894
+ roles: {
9895
+ primary: {
9896
+ kind: "complete",
9897
+ appearance: {
9898
+ background: {
9899
+ type: "surface",
9900
+ role: "link"
9901
+ },
9902
+ borderRadius: "rounded-none",
9903
+ sizes: editorialSizes,
9904
+ effects: { base: [{
9905
+ effectId: "border-bottom-grow",
9906
+ options: {
9907
+ height: 2,
9908
+ colorToken: "text",
9909
+ origin: "left"
9910
+ }
9911
+ }] }
9912
+ }
9758
9913
  },
9759
- md: { padding: "0.8125rem 1.375rem" },
9760
- lg: {
9761
- padding: "0.9375rem 1.625rem",
9762
- fontSize: "text-lg"
9914
+ secondary: {
9915
+ kind: "complete",
9916
+ appearance: {
9917
+ background: {
9918
+ type: "surface",
9919
+ role: "link"
9920
+ },
9921
+ borderRadius: "rounded-none",
9922
+ sizes: editorialSizes,
9923
+ effects: { base: [{
9924
+ effectId: "border-bottom-grow",
9925
+ options: {
9926
+ height: 1,
9927
+ colorToken: "mutedText",
9928
+ origin: "left"
9929
+ }
9930
+ }] }
9931
+ }
9763
9932
  },
9764
- xl: {
9765
- padding: "1.0625rem 2rem",
9766
- fontSize: "text-xl"
9767
- }
9768
- },
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-lg",
9780
- affordance: { iconId: "ArrowRight" },
9781
- effects: { hover: [{
9782
- effectId: "lift",
9783
- options: { translateY: "-2px" }
9784
- }, {
9785
- effectId: "background-on-hover",
9786
- options: { colorToken: "secondary" }
9787
- }] }
9933
+ outline: {
9934
+ kind: "complete",
9935
+ appearance: {
9936
+ background: {
9937
+ type: "surface",
9938
+ role: "link"
9939
+ },
9940
+ borderRadius: "rounded-none",
9941
+ sizes: editorialSizes,
9942
+ effects: { base: [{
9943
+ effectId: "border-bottom-grow",
9944
+ options: {
9945
+ height: 1,
9946
+ colorToken: "accent",
9947
+ origin: "left"
9948
+ }
9949
+ }] }
9950
+ }
9788
9951
  },
9789
- {
9790
- id: "secondary",
9791
- name: "Secondary",
9792
- enabled: true,
9793
- priority: 2,
9794
- background: {
9795
- type: "surface",
9796
- role: "link"
9797
- },
9798
- borderRadius: "rounded-lg",
9799
- border: { widthClass: "border" },
9800
- effects: { hover: [{
9801
- effectId: "lift",
9802
- options: { translateY: "-2px" }
9803
- }, {
9804
- effectId: "background-on-hover",
9805
- options: { colorToken: "surfaceAlt" }
9806
- }] }
9952
+ ghost: {
9953
+ kind: "complete",
9954
+ appearance: {
9955
+ background: {
9956
+ type: "surface",
9957
+ role: "link"
9958
+ },
9959
+ borderRadius: "rounded-none",
9960
+ sizes: editorialSizes
9961
+ }
9807
9962
  },
9808
- {
9809
- id: "accent",
9810
- name: "Accent",
9811
- enabled: true,
9812
- priority: 3,
9813
- background: {
9814
- type: "solid",
9815
- colorToken: "accent"
9816
- },
9817
- borderRadius: "rounded-lg",
9818
- affordance: { iconId: "ArrowRight" },
9819
- effects: { hover: [{
9820
- effectId: "lift",
9821
- options: { translateY: "-2px" }
9822
- }] }
9963
+ accent: {
9964
+ kind: "derive",
9965
+ from: "primary",
9966
+ overrides: { effects: { base: [{
9967
+ effectId: "border-bottom-grow",
9968
+ options: {
9969
+ height: 2,
9970
+ colorToken: "accent",
9971
+ origin: "left"
9972
+ }
9973
+ }] } }
9823
9974
  }
9824
- ]
9975
+ }
9825
9976
  }
9826
9977
  });
9827
- //#endregion
9828
- //#region ../theme-core/src/buttons/personalities/ink-stamp.ts
9829
- /**
9830
- * Ink Stamp — solid earthy fills with a bordered, hand-stamped block-print
9831
- * feel. Reads as bold and handmade; suits expressive craft brands.
9832
- */
9833
- const inkStamp = defineButtonPersonality({
9834
- id: "ink-stamp",
9835
- name: "Ink Stamp",
9836
- description: "Hand-stamped block-print buttons with a slight lift on hover.",
9978
+ const pebbleRecipe = defineStaticButtonStyleRecipe({
9979
+ id: "pebble",
9980
+ accessibilityLabel: "Generously padded pill buttons",
9837
9981
  tags: {
9838
- tone: "bold",
9839
- energy: "vibrant",
9982
+ tone: "classic",
9983
+ energy: "calm",
9840
9984
  motion: "standard",
9841
9985
  era: "organic"
9842
9986
  },
9843
- buttonSystem: {
9987
+ system: {
9844
9988
  global: {
9845
- cornerStyle: "rounded",
9846
- textTransform: "uppercase",
9847
- fontWeight: 600,
9848
- borderWidth: 1,
9989
+ cornerStyle: "pill",
9990
+ textTransform: "none",
9991
+ fontWeight: 500,
9992
+ borderWidth: 2,
9849
9993
  hoverTransform: "none",
9850
- hoverColor: "none",
9851
- letterSpacing: "loose"
9994
+ hoverColor: "none"
9852
9995
  },
9853
9996
  sizes: {
9854
9997
  sm: {
9855
- padding: "0.5rem 1.25rem",
9856
- fontSize: "text-xs"
9857
- },
9858
- md: {
9859
- padding: "0.75rem 1.75rem",
9998
+ padding: "0.625rem 1.75rem",
9860
9999
  fontSize: "text-sm"
9861
10000
  },
10001
+ md: { padding: "0.875rem 2.25rem" },
9862
10002
  lg: {
9863
- padding: "0.875rem 2.25rem",
9864
- fontSize: "text-base"
9865
- },
9866
- xl: {
9867
10003
  padding: "1.125rem 2.75rem",
9868
10004
  fontSize: "text-lg"
10005
+ },
10006
+ xl: {
10007
+ padding: "1.5rem 3.5rem",
10008
+ fontSize: "text-xl"
9869
10009
  }
9870
10010
  },
9871
- variants: [
9872
- {
9873
- id: "primary",
9874
- name: "Primary",
9875
- enabled: true,
9876
- priority: 1,
9877
- background: {
9878
- type: "solid",
9879
- colorToken: "primary"
9880
- },
9881
- borderRadius: "rounded-md",
9882
- effects: {
9883
- hover: [{
9884
- effectId: "drop-shadow",
9885
- options: { intensity: "medium" }
9886
- }, {
9887
- effectId: "scale-up",
9888
- options: { scale: "1.02" }
9889
- }],
9890
- active: [{
9891
- effectId: "scale-down",
9892
- options: { scale: "0.98" }
9893
- }]
10011
+ roles: {
10012
+ primary: {
10013
+ kind: "complete",
10014
+ appearance: {
10015
+ background: {
10016
+ type: "solid",
10017
+ colorToken: "primary"
10018
+ },
10019
+ borderRadius: "rounded-full",
10020
+ effects: { hover: [{
10021
+ effectId: "darken-background",
10022
+ options: { amount: 100 }
10023
+ }] }
9894
10024
  }
9895
10025
  },
9896
- {
9897
- id: "secondary",
9898
- name: "Secondary",
9899
- enabled: true,
9900
- priority: 2,
9901
- background: {
9902
- type: "surface",
9903
- role: "link"
9904
- },
9905
- borderRadius: "rounded-md",
9906
- border: { widthClass: "border-2" },
9907
- effects: { hover: [{
9908
- effectId: "background-on-hover",
9909
- options: { colorToken: "surface" }
9910
- }] }
9911
- },
9912
- {
9913
- id: "outline",
9914
- name: "Outline",
9915
- enabled: true,
9916
- priority: 3,
9917
- background: {
9918
- type: "surface",
9919
- role: "link"
9920
- },
9921
- borderRadius: "rounded-md",
9922
- border: { widthClass: "border-2" },
9923
- effects: { hover: [{
9924
- effectId: "background-on-hover",
9925
- options: { colorToken: "surface" }
9926
- }] }
9927
- },
9928
- {
9929
- id: "ghost",
9930
- name: "Ghost",
9931
- enabled: true,
9932
- priority: 3,
9933
- background: {
9934
- type: "surface",
9935
- role: "link"
9936
- },
9937
- borderRadius: "rounded-none",
9938
- sizes: {
9939
- sm: {
9940
- padding: "0.375rem 0",
9941
- fontSize: "text-xs"
10026
+ secondary: {
10027
+ kind: "complete",
10028
+ appearance: {
10029
+ background: {
10030
+ type: "surface",
10031
+ role: "link"
9942
10032
  },
9943
- md: {
9944
- padding: "0.5rem 0",
9945
- fontSize: "text-sm"
10033
+ borderRadius: "rounded-full",
10034
+ border: { widthClass: "border-2" },
10035
+ effects: { hover: [{
10036
+ effectId: "background-on-hover",
10037
+ options: { colorToken: "accent" }
10038
+ }] }
10039
+ }
10040
+ },
10041
+ outline: {
10042
+ kind: "complete",
10043
+ appearance: {
10044
+ background: {
10045
+ type: "surface",
10046
+ role: "link"
9946
10047
  },
9947
- lg: {
9948
- padding: "0.625rem 0",
9949
- fontSize: "text-base"
10048
+ borderRadius: "rounded-full",
10049
+ border: { widthClass: "border" },
10050
+ effects: { hover: [{
10051
+ effectId: "background-on-hover",
10052
+ options: { colorToken: "surface" }
10053
+ }] }
10054
+ }
10055
+ },
10056
+ ghost: {
10057
+ kind: "complete",
10058
+ appearance: {
10059
+ background: {
10060
+ type: "surface",
10061
+ role: "link"
9950
10062
  },
9951
- xl: {
9952
- padding: "0.75rem 0",
9953
- fontSize: "text-lg"
9954
- }
9955
- },
9956
- effects: { base: [{
9957
- effectId: "border-bottom-grow",
9958
- options: {
9959
- height: 1,
9960
- colorToken: "accent",
9961
- origin: "left"
10063
+ borderRadius: "rounded-full",
10064
+ sizes: {
10065
+ sm: {
10066
+ padding: "0.375rem 0.875rem",
10067
+ fontSize: "text-sm"
10068
+ },
10069
+ md: { padding: "0.5rem 1rem" },
10070
+ lg: {
10071
+ padding: "0.625rem 1.25rem",
10072
+ fontSize: "text-lg"
10073
+ },
10074
+ xl: {
10075
+ padding: "0.75rem 1.5rem",
10076
+ fontSize: "text-xl"
10077
+ }
9962
10078
  }
9963
- }] }
10079
+ }
10080
+ },
10081
+ accent: {
10082
+ kind: "derive",
10083
+ from: "primary",
10084
+ overrides: { background: {
10085
+ type: "solid",
10086
+ colorToken: "accent"
10087
+ } }
9964
10088
  }
9965
- ]
10089
+ }
9966
10090
  }
9967
10091
  });
9968
- //#endregion
9969
- //#region ../theme-core/src/buttons/personalities/joy-stamp.ts
9970
- /**
9971
- * Joy Stamp — neo-brutalist pills with a hard, brand-coloured offset shadow
9972
- * that collapses as the button presses into it on hover. Authored for the
9973
- * Original Joy site style: a cream "stamp" shadow under the solid primary, and
9974
- * a brown shadow under the cream outline. Reads as bold, warm, and handmade.
9975
- *
9976
- * The coloured offset shadow relies on the per-variant `shadow.colorToken`
9977
- * extension; the press is the shared `press-down` effect, which matches its
9978
- * translate to each variant's own shadow offset.
9979
- */
9980
- const joyStamp = defineButtonPersonality({
9981
- id: "joy-stamp",
9982
- name: "Joy Stamp",
9983
- description: "Pill buttons with a hard, brand-coloured offset shadow that presses in on hover.",
10092
+ const brushedWashRecipe = defineStaticButtonStyleRecipe({
10093
+ id: "brushed-wash",
10094
+ accessibilityLabel: "Generously padded gradient buttons with soft shadows",
9984
10095
  tags: {
9985
- tone: "bold",
10096
+ tone: "classic",
9986
10097
  energy: "vibrant",
9987
- motion: "expressive",
10098
+ motion: "standard",
9988
10099
  era: "organic"
9989
10100
  },
9990
- buttonSystem: {
10101
+ system: {
9991
10102
  global: {
9992
- cornerStyle: "pill",
9993
- shadow: "high",
10103
+ cornerStyle: "rounded",
10104
+ shadow: "low",
9994
10105
  textTransform: "none",
9995
- typography: "heading",
9996
- fontWeight: 700,
9997
- fontSize: "text-lg",
9998
- borderWidth: 2,
10106
+ fontWeight: 500,
10107
+ borderWidth: 1,
9999
10108
  hoverTransform: "none",
10000
10109
  hoverColor: "none"
10001
10110
  },
10002
10111
  sizes: {
10003
10112
  sm: {
10004
- padding: "0.625rem 1.25rem",
10005
- fontSize: "text-base"
10006
- },
10007
- md: {
10008
- padding: "0.875rem 1.75rem",
10009
- fontSize: "text-lg"
10113
+ padding: "0.75rem 2rem",
10114
+ fontSize: "text-sm"
10010
10115
  },
10116
+ md: { padding: "1rem 2.5rem" },
10011
10117
  lg: {
10012
- padding: "1.125rem 2.25rem",
10013
- fontSize: "text-xl"
10118
+ padding: "1.25rem 3rem",
10119
+ fontSize: "text-lg"
10014
10120
  },
10015
10121
  xl: {
10016
- padding: "1.25rem 2.75rem",
10017
- fontSize: "text-2xl"
10122
+ padding: "1.625rem 3.75rem",
10123
+ fontSize: "text-xl"
10018
10124
  }
10019
10125
  },
10020
- variants: [{
10021
- id: "primary",
10022
- name: "Primary",
10023
- enabled: true,
10024
- priority: 1,
10025
- background: {
10026
- type: "solid",
10027
- colorToken: "primary"
10126
+ roles: {
10127
+ primary: {
10128
+ kind: "complete",
10129
+ appearance: {
10130
+ background: {
10131
+ type: "gradient",
10132
+ stops: ["primary", "accent"],
10133
+ direction: "to-r",
10134
+ foregroundToken: "primaryForeground"
10135
+ },
10136
+ borderRadius: "rounded-lg",
10137
+ shadow: {
10138
+ elevation: "low",
10139
+ softness: "soft",
10140
+ position: "bottom"
10141
+ }
10142
+ }
10028
10143
  },
10029
- borderRadius: "rounded-full",
10030
- shadow: {
10031
- elevation: "high",
10032
- softness: "hard",
10033
- position: "bottom-right",
10034
- colorToken: "text"
10144
+ secondary: {
10145
+ kind: "complete",
10146
+ appearance: {
10147
+ background: {
10148
+ type: "gradient",
10149
+ stops: ["secondary", "accent"],
10150
+ direction: "to-br",
10151
+ foregroundToken: "primaryForeground"
10152
+ },
10153
+ borderRadius: "rounded-lg",
10154
+ shadow: {
10155
+ elevation: "low",
10156
+ softness: "soft",
10157
+ position: "bottom"
10158
+ }
10159
+ }
10035
10160
  },
10036
- effects: { hover: [{ effectId: "press-down" }] }
10037
- }, {
10038
- id: "secondary",
10039
- name: "Secondary",
10040
- enabled: true,
10041
- priority: 2,
10042
- background: {
10043
- type: "surface",
10044
- role: "link"
10161
+ outline: {
10162
+ kind: "complete",
10163
+ appearance: {
10164
+ background: {
10165
+ type: "surface",
10166
+ role: "link"
10167
+ },
10168
+ borderRadius: "rounded-lg",
10169
+ border: { widthClass: "border" },
10170
+ effects: { hover: [{
10171
+ effectId: "background-on-hover",
10172
+ options: { colorToken: "surface" }
10173
+ }] }
10174
+ }
10045
10175
  },
10046
- borderRadius: "rounded-full",
10047
- border: { widthClass: "border-2" },
10048
- shadow: {
10049
- elevation: "high",
10050
- softness: "hard",
10051
- position: "bottom-right",
10052
- colorToken: "secondary"
10176
+ ghost: {
10177
+ kind: "complete",
10178
+ appearance: {
10179
+ background: {
10180
+ type: "surface",
10181
+ role: "link"
10182
+ },
10183
+ borderRadius: "rounded-lg",
10184
+ effects: { hover: [{
10185
+ effectId: "background-on-hover",
10186
+ options: { colorToken: "surface" }
10187
+ }] }
10188
+ }
10053
10189
  },
10054
- effects: { hover: [{ effectId: "press-down" }] }
10055
- }]
10190
+ accent: {
10191
+ kind: "derive",
10192
+ from: "primary",
10193
+ overrides: { background: {
10194
+ type: "solid",
10195
+ colorToken: "accent"
10196
+ } }
10197
+ }
10198
+ }
10056
10199
  }
10057
10200
  });
10058
- //#endregion
10059
- //#region ../theme-core/src/buttons/personalities/ornate-ritual.ts
10060
- /**
10061
- * Ornate Ritual — framed, ceremonial buttons with jewel-toned fills and
10062
- * deliberate spacing. Designed for music, ceremony, and soulful event sites.
10063
- */
10064
- const ornateRitual = defineButtonPersonality({
10065
- id: "ornate-ritual",
10066
- name: "Ornate Ritual",
10067
- description: "Ceremonial framed buttons with jewel-toned fills and quiet color-change hover states.",
10201
+ const inkStampRecipe = defineStaticButtonStyleRecipe({
10202
+ id: "ink-stamp",
10203
+ accessibilityLabel: "Uppercase block-print buttons with a playful hover",
10068
10204
  tags: {
10069
- tone: "classic",
10205
+ tone: "bold",
10070
10206
  energy: "vibrant",
10071
- motion: "subtle",
10207
+ motion: "standard",
10072
10208
  era: "organic"
10073
10209
  },
10074
- buttonSystem: {
10210
+ system: {
10075
10211
  global: {
10076
10212
  cornerStyle: "rounded",
10077
10213
  textTransform: "uppercase",
@@ -10083,638 +10219,635 @@ const ornateRitual = defineButtonPersonality({
10083
10219
  },
10084
10220
  sizes: {
10085
10221
  sm: {
10086
- padding: "0.5625rem 1.25rem",
10222
+ padding: "0.5rem 1.25rem",
10087
10223
  fontSize: "text-xs"
10088
10224
  },
10089
10225
  md: {
10090
10226
  padding: "0.75rem 1.75rem",
10091
- fontSize: "text-xs"
10227
+ fontSize: "text-sm"
10092
10228
  },
10093
10229
  lg: {
10094
10230
  padding: "0.875rem 2.25rem",
10095
- fontSize: "text-sm"
10231
+ fontSize: "text-base"
10096
10232
  },
10097
10233
  xl: {
10098
- padding: "1rem 2.75rem",
10099
- fontSize: "text-base"
10234
+ padding: "1.125rem 2.75rem",
10235
+ fontSize: "text-lg"
10100
10236
  }
10101
10237
  },
10102
- variants: [
10103
- {
10104
- id: "primary",
10105
- name: "Primary",
10106
- enabled: true,
10107
- priority: 1,
10108
- background: {
10109
- type: "solid",
10110
- colorToken: "primary"
10111
- },
10112
- borderRadius: "rounded-md",
10113
- border: { widthClass: "border" },
10114
- effects: {
10115
- hover: [{
10116
- effectId: "background-on-hover",
10117
- options: { colorToken: "primary-100" }
10118
- }],
10119
- active: [{
10120
- effectId: "scale-down",
10121
- options: { scale: "0.98" }
10122
- }]
10238
+ roles: {
10239
+ primary: {
10240
+ kind: "complete",
10241
+ appearance: {
10242
+ background: {
10243
+ type: "solid",
10244
+ colorToken: "primary"
10245
+ },
10246
+ borderRadius: "rounded-md",
10247
+ effects: {
10248
+ hover: [{
10249
+ effectId: "drop-shadow",
10250
+ options: { intensity: "medium" }
10251
+ }, {
10252
+ effectId: "scale-up",
10253
+ options: { scale: "1.02" }
10254
+ }],
10255
+ active: [{
10256
+ effectId: "scale-down",
10257
+ options: { scale: "0.98" }
10258
+ }]
10259
+ }
10123
10260
  }
10124
10261
  },
10125
- {
10126
- id: "secondary",
10127
- name: "Secondary",
10128
- enabled: true,
10129
- priority: 2,
10130
- background: {
10131
- type: "solid",
10132
- colorToken: "secondary"
10133
- },
10134
- borderRadius: "rounded-md",
10135
- border: { widthClass: "border" },
10136
- effects: { hover: [{
10137
- effectId: "background-on-hover",
10138
- options: { colorToken: "surface" }
10139
- }] }
10140
- },
10141
- {
10142
- id: "outline",
10143
- name: "Outline",
10144
- enabled: true,
10145
- priority: 3,
10146
- background: {
10147
- type: "surface",
10148
- role: "link"
10149
- },
10150
- borderRadius: "rounded-md",
10151
- border: { widthClass: "border" },
10152
- effects: { hover: [{
10153
- effectId: "background-on-hover",
10154
- options: { colorToken: "muted" }
10155
- }] }
10262
+ secondary: {
10263
+ kind: "complete",
10264
+ appearance: {
10265
+ background: {
10266
+ type: "surface",
10267
+ role: "link"
10268
+ },
10269
+ borderRadius: "rounded-md",
10270
+ border: { widthClass: "border-2" },
10271
+ effects: { hover: [{
10272
+ effectId: "background-on-hover",
10273
+ options: { colorToken: "surface" }
10274
+ }] }
10275
+ }
10156
10276
  },
10157
- {
10158
- id: "ghost",
10159
- name: "Ghost",
10160
- enabled: true,
10161
- priority: 3,
10162
- background: {
10163
- type: "surface",
10164
- role: "link"
10165
- },
10166
- borderRadius: "rounded-none",
10167
- sizes: {
10168
- sm: {
10169
- padding: "0.375rem 0",
10170
- fontSize: "text-xs"
10277
+ outline: {
10278
+ kind: "complete",
10279
+ appearance: {
10280
+ background: {
10281
+ type: "surface",
10282
+ role: "link"
10171
10283
  },
10172
- md: {
10173
- padding: "0.5rem 0",
10174
- fontSize: "text-sm"
10284
+ borderRadius: "rounded-md",
10285
+ border: { widthClass: "border-2" },
10286
+ effects: { hover: [{
10287
+ effectId: "background-on-hover",
10288
+ options: { colorToken: "surface" }
10289
+ }] }
10290
+ }
10291
+ },
10292
+ ghost: {
10293
+ kind: "complete",
10294
+ appearance: {
10295
+ background: {
10296
+ type: "surface",
10297
+ role: "link"
10175
10298
  },
10176
- lg: {
10177
- padding: "0.625rem 0",
10178
- fontSize: "text-base"
10299
+ borderRadius: "rounded-none",
10300
+ sizes: {
10301
+ sm: {
10302
+ padding: "0.375rem 0",
10303
+ fontSize: "text-xs"
10304
+ },
10305
+ md: {
10306
+ padding: "0.5rem 0",
10307
+ fontSize: "text-sm"
10308
+ },
10309
+ lg: {
10310
+ padding: "0.625rem 0",
10311
+ fontSize: "text-base"
10312
+ },
10313
+ xl: {
10314
+ padding: "0.75rem 0",
10315
+ fontSize: "text-lg"
10316
+ }
10179
10317
  },
10180
- xl: {
10181
- padding: "0.75rem 0",
10182
- fontSize: "text-lg"
10183
- }
10184
- },
10185
- effects: { base: [{
10186
- effectId: "border-bottom-grow",
10187
- options: {
10188
- height: 1,
10189
- colorToken: "accent",
10190
- origin: "left"
10191
- }
10192
- }] }
10318
+ effects: { base: [{
10319
+ effectId: "border-bottom-grow",
10320
+ options: {
10321
+ height: 1,
10322
+ colorToken: "accent",
10323
+ origin: "left"
10324
+ }
10325
+ }] }
10326
+ }
10327
+ },
10328
+ accent: {
10329
+ kind: "derive",
10330
+ from: "primary",
10331
+ overrides: { background: {
10332
+ type: "solid",
10333
+ colorToken: "accent"
10334
+ } }
10193
10335
  }
10194
- ]
10336
+ }
10195
10337
  }
10196
10338
  });
10197
- //#endregion
10198
- //#region ../theme-core/src/buttons/personalities/pebble.ts
10199
- /**
10200
- * Pebble — large pill primaries with generous padding. Reads as spa-luxurious
10201
- * and natural; pairs well with wellness/yoga/dance brands.
10202
- */
10203
- const pebble = defineButtonPersonality({
10204
- id: "pebble",
10205
- name: "Pebble",
10206
- description: "Generous pill buttons with a quiet colour-softening hover.",
10339
+ const flatInkRecipe = defineStaticButtonStyleRecipe({
10340
+ id: "flat-ink",
10341
+ accessibilityLabel: "Flat rounded buttons with arrow affordances",
10207
10342
  tags: {
10208
10343
  tone: "classic",
10209
10344
  energy: "calm",
10210
- motion: "standard",
10211
- era: "organic"
10345
+ motion: "subtle",
10346
+ era: "editorial"
10212
10347
  },
10213
- buttonSystem: {
10348
+ system: {
10214
10349
  global: {
10215
- cornerStyle: "pill",
10350
+ cornerStyle: "rounded",
10216
10351
  textTransform: "none",
10217
- fontWeight: 500,
10218
- borderWidth: 2,
10219
- hoverTransform: "none",
10352
+ fontWeight: 600,
10353
+ borderWidth: 1,
10354
+ typography: "body",
10355
+ letterSpacing: "tight",
10356
+ paddingPreset: "default",
10357
+ hoverTransform: "lift",
10220
10358
  hoverColor: "none"
10221
10359
  },
10222
10360
  sizes: {
10223
10361
  sm: {
10224
- padding: "0.625rem 1.75rem",
10362
+ padding: "0.625rem 1.125rem",
10225
10363
  fontSize: "text-sm"
10226
10364
  },
10227
- md: { padding: "0.875rem 2.25rem" },
10365
+ md: { padding: "0.8125rem 1.375rem" },
10228
10366
  lg: {
10229
- padding: "1.125rem 2.75rem",
10367
+ padding: "0.9375rem 1.625rem",
10230
10368
  fontSize: "text-lg"
10231
10369
  },
10232
10370
  xl: {
10233
- padding: "1.5rem 3.5rem",
10371
+ padding: "1.0625rem 2rem",
10234
10372
  fontSize: "text-xl"
10235
10373
  }
10236
10374
  },
10237
- variants: [
10238
- {
10239
- id: "primary",
10240
- name: "Primary",
10241
- enabled: true,
10242
- priority: 1,
10243
- background: {
10244
- type: "solid",
10245
- colorToken: "primary"
10246
- },
10247
- borderRadius: "rounded-full",
10248
- effects: { hover: [{
10249
- effectId: "darken-background",
10250
- options: { amount: 100 }
10251
- }] }
10375
+ roles: {
10376
+ primary: {
10377
+ kind: "complete",
10378
+ appearance: {
10379
+ background: {
10380
+ type: "solid",
10381
+ colorToken: "primary"
10382
+ },
10383
+ borderRadius: "rounded-lg",
10384
+ affordance: { iconId: "ArrowRight" },
10385
+ effects: { hover: [{
10386
+ effectId: "lift",
10387
+ options: { translateY: "-2px" }
10388
+ }, {
10389
+ effectId: "background-on-hover",
10390
+ options: { colorToken: "secondary" }
10391
+ }] }
10392
+ }
10252
10393
  },
10253
- {
10254
- id: "secondary",
10255
- name: "Secondary",
10256
- enabled: true,
10257
- priority: 2,
10258
- background: {
10259
- type: "surface",
10260
- role: "link"
10261
- },
10262
- borderRadius: "rounded-full",
10263
- border: { widthClass: "border-2" },
10264
- effects: { hover: [{
10265
- effectId: "background-on-hover",
10266
- options: { colorToken: "accent" }
10267
- }] }
10394
+ secondary: {
10395
+ kind: "complete",
10396
+ appearance: {
10397
+ background: {
10398
+ type: "surface",
10399
+ role: "link"
10400
+ },
10401
+ borderRadius: "rounded-lg",
10402
+ border: { widthClass: "border" },
10403
+ effects: { hover: [{
10404
+ effectId: "lift",
10405
+ options: { translateY: "-2px" }
10406
+ }, {
10407
+ effectId: "background-on-hover",
10408
+ options: { colorToken: "surfaceAlt" }
10409
+ }] }
10410
+ }
10268
10411
  },
10269
- {
10270
- id: "outline",
10271
- name: "Outline",
10272
- enabled: true,
10273
- priority: 3,
10274
- background: {
10275
- type: "surface",
10276
- role: "link"
10277
- },
10278
- borderRadius: "rounded-full",
10279
- border: { widthClass: "border" },
10280
- effects: { hover: [{
10281
- effectId: "background-on-hover",
10282
- options: { colorToken: "surface" }
10283
- }] }
10412
+ outline: {
10413
+ kind: "complete",
10414
+ appearance: {
10415
+ background: {
10416
+ type: "surface",
10417
+ role: "link"
10418
+ },
10419
+ borderRadius: "rounded-lg",
10420
+ border: { widthClass: "border" },
10421
+ effects: { hover: [{
10422
+ effectId: "lift",
10423
+ options: { translateY: "-2px" }
10424
+ }, {
10425
+ effectId: "background-on-hover",
10426
+ options: { colorToken: "surfaceAlt" }
10427
+ }] }
10428
+ }
10284
10429
  },
10285
- {
10286
- id: "ghost",
10287
- name: "Ghost",
10288
- enabled: true,
10289
- priority: 3,
10290
- background: {
10291
- type: "surface",
10292
- role: "link"
10293
- },
10294
- borderRadius: "rounded-full",
10295
- sizes: {
10296
- sm: {
10297
- padding: "0.375rem 0.875rem",
10298
- fontSize: "text-sm"
10430
+ ghost: {
10431
+ kind: "complete",
10432
+ appearance: {
10433
+ background: {
10434
+ type: "surface",
10435
+ role: "link"
10299
10436
  },
10300
- md: { padding: "0.5rem 1rem" },
10301
- lg: {
10302
- padding: "0.625rem 1.25rem",
10303
- fontSize: "text-lg"
10437
+ borderRadius: "rounded-lg",
10438
+ effects: { hover: [{
10439
+ effectId: "lift",
10440
+ options: { translateY: "-2px" }
10441
+ }] }
10442
+ }
10443
+ },
10444
+ accent: {
10445
+ kind: "complete",
10446
+ appearance: {
10447
+ background: {
10448
+ type: "solid",
10449
+ colorToken: "accent"
10304
10450
  },
10305
- xl: {
10306
- padding: "0.75rem 1.5rem",
10307
- fontSize: "text-xl"
10308
- }
10451
+ borderRadius: "rounded-lg",
10452
+ affordance: { iconId: "ArrowRight" },
10453
+ effects: { hover: [{
10454
+ effectId: "lift",
10455
+ options: { translateY: "-2px" }
10456
+ }] }
10309
10457
  }
10310
10458
  }
10311
- ]
10459
+ }
10312
10460
  }
10313
10461
  });
10314
- //#endregion
10315
- //#region ../theme-core/src/buttons/personalities/quiet-arrow.ts
10316
- /**
10317
- * Quiet Arrow — wide, flat editorial buttons for grounded service businesses.
10318
- * Primary and secondary keep stable semantic colours; surrounding surfaces are
10319
- * responsible for contrast rather than reversing the button roles.
10320
- */
10321
- const quietArrow = defineButtonPersonality({
10322
- id: "quiet-arrow",
10323
- name: "Quiet Arrow",
10324
- description: "Wide, flat arrow buttons with a solid primary and a primary-colour outlined secondary.",
10462
+ const showtimePillRecipe = defineStaticButtonStyleRecipe({
10463
+ id: "showtime-pill",
10464
+ accessibilityLabel: "Bold uppercase pill buttons with playful movement",
10325
10465
  tags: {
10326
- tone: "classic",
10327
- energy: "calm",
10328
- motion: "subtle",
10329
- era: "editorial"
10466
+ tone: "bold",
10467
+ energy: "vibrant",
10468
+ motion: "expressive",
10469
+ era: "modern"
10330
10470
  },
10331
- buttonSystem: {
10471
+ system: {
10332
10472
  global: {
10333
- cornerStyle: "rounded",
10473
+ cornerStyle: "pill",
10474
+ shadow: "low",
10334
10475
  textTransform: "uppercase",
10335
- fontWeight: 500,
10336
- borderWidth: 1,
10476
+ fontWeight: 700,
10477
+ borderWidth: 2,
10478
+ hoverTransform: "lift",
10479
+ hoverColor: "darken",
10337
10480
  typography: "body",
10338
- fontSize: "text-sm",
10339
- letterSpacing: "loose",
10340
- hoverTransform: "none",
10341
- hoverColor: "none"
10481
+ paddingPreset: "spacious",
10482
+ italic: false
10342
10483
  },
10343
10484
  sizes: {
10344
10485
  sm: {
10345
10486
  padding: "0.625rem 1.25rem",
10346
- fontSize: "text-xs"
10487
+ fontSize: "0.875rem"
10347
10488
  },
10348
10489
  md: {
10349
- padding: "0.8125rem 1.75rem",
10350
- fontSize: "text-sm"
10490
+ padding: "0.875rem 1.75rem",
10491
+ fontSize: "1rem"
10351
10492
  },
10352
10493
  lg: {
10353
- padding: "0.9375rem 2.125rem",
10354
- fontSize: "text-sm"
10494
+ padding: "1.125rem 2.25rem",
10495
+ fontSize: "1.125rem"
10355
10496
  },
10356
10497
  xl: {
10357
- padding: "1.0625rem 2.5rem",
10358
- fontSize: "text-base"
10498
+ padding: "1.125rem 2.25rem",
10499
+ fontSize: "1.125rem"
10359
10500
  }
10360
10501
  },
10361
- variants: [
10362
- {
10363
- id: "primary",
10364
- name: "Primary",
10365
- enabled: true,
10366
- priority: 1,
10367
- background: {
10368
- type: "solid",
10369
- colorToken: "primary"
10370
- },
10371
- borderRadius: "rounded-xl",
10372
- affordance: { iconId: "ArrowRight" },
10373
- effects: { hover: [{
10374
- effectId: "darken-background",
10375
- options: { amount: 100 }
10376
- }] }
10502
+ roles: {
10503
+ primary: {
10504
+ kind: "complete",
10505
+ appearance: {
10506
+ background: {
10507
+ type: "solid",
10508
+ colorToken: "primary"
10509
+ },
10510
+ borderRadius: "rounded-full",
10511
+ effects: { hover: [{ effectId: "pop" }] }
10512
+ }
10377
10513
  },
10378
- {
10379
- id: "secondary",
10380
- name: "Secondary",
10381
- enabled: true,
10382
- priority: 2,
10383
- background: {
10384
- type: "surface",
10385
- role: "link"
10386
- },
10387
- borderRadius: "rounded-xl",
10388
- border: { widthClass: "border" },
10389
- affordance: { iconId: "ArrowRight" },
10390
- effects: { hover: [{
10391
- effectId: "background-on-hover",
10392
- options: { colorToken: "surfaceAlt" }
10393
- }] }
10514
+ secondary: {
10515
+ kind: "complete",
10516
+ appearance: {
10517
+ background: {
10518
+ type: "surface",
10519
+ role: "link"
10520
+ },
10521
+ borderRadius: "rounded-full",
10522
+ border: { widthClass: "border-2" },
10523
+ effects: { hover: [{ effectId: "pop" }] }
10524
+ }
10394
10525
  },
10395
- {
10396
- id: "outline",
10397
- name: "Outline",
10398
- enabled: true,
10399
- priority: 3,
10400
- background: {
10401
- type: "surface",
10402
- role: "link"
10403
- },
10404
- borderRadius: "rounded-xl",
10405
- border: { widthClass: "border" }
10526
+ outline: {
10527
+ kind: "complete",
10528
+ appearance: {
10529
+ background: {
10530
+ type: "surface",
10531
+ role: "link"
10532
+ },
10533
+ borderRadius: "rounded-full",
10534
+ border: { widthClass: "border-2" },
10535
+ effects: { hover: [{
10536
+ effectId: "background-on-hover",
10537
+ options: { colorToken: "background" }
10538
+ }] }
10539
+ }
10406
10540
  },
10407
- {
10408
- id: "ghost",
10409
- name: "Ghost",
10410
- enabled: true,
10411
- priority: 3,
10412
- background: {
10413
- type: "surface",
10414
- role: "link"
10415
- },
10416
- borderRadius: "rounded-xl"
10541
+ ghost: {
10542
+ kind: "complete",
10543
+ appearance: {
10544
+ background: {
10545
+ type: "surface",
10546
+ role: "link"
10547
+ },
10548
+ borderRadius: "rounded-full",
10549
+ effects: { hover: [{
10550
+ effectId: "background-on-hover",
10551
+ options: { colorToken: "surface" }
10552
+ }] }
10553
+ }
10554
+ },
10555
+ accent: {
10556
+ kind: "complete",
10557
+ appearance: {
10558
+ background: {
10559
+ type: "solid",
10560
+ colorToken: "secondary"
10561
+ },
10562
+ borderRadius: "rounded-full",
10563
+ effects: { hover: [{ effectId: "pop" }] }
10564
+ }
10417
10565
  }
10418
- ]
10566
+ }
10419
10567
  }
10420
10568
  });
10421
- //#endregion
10422
- //#region ../theme-core/src/buttons/personalities/showtime-pill.ts
10423
- /**
10424
- * Showtime Pill — bold, spacious, fully rounded buttons with playful pop
10425
- * motion. Suits energetic schools, performers, festivals, and community brands
10426
- * that need calls to action to feel loud without becoming visually chaotic.
10427
- */
10428
- const showtimePill = defineButtonPersonality({
10429
- id: "showtime-pill",
10430
- name: "Showtime Pill",
10431
- description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
10569
+ const joyStampRecipe = defineStaticButtonStyleRecipe({
10570
+ id: "joy-stamp",
10571
+ accessibilityLabel: "Bold pill buttons with a hard offset shadow",
10432
10572
  tags: {
10433
10573
  tone: "bold",
10434
10574
  energy: "vibrant",
10435
10575
  motion: "expressive",
10436
- era: "modern"
10576
+ era: "organic"
10437
10577
  },
10438
- buttonSystem: {
10578
+ system: {
10439
10579
  global: {
10440
10580
  cornerStyle: "pill",
10441
- shadow: "low",
10442
- textTransform: "uppercase",
10581
+ shadow: "high",
10582
+ textTransform: "none",
10583
+ typography: "heading",
10443
10584
  fontWeight: 700,
10585
+ fontSize: "text-lg",
10444
10586
  borderWidth: 2,
10445
- hoverTransform: "lift",
10446
- hoverColor: "darken",
10447
- typography: "body",
10448
- paddingPreset: "spacious",
10449
- italic: false
10587
+ hoverTransform: "none",
10588
+ hoverColor: "none"
10450
10589
  },
10451
10590
  sizes: {
10452
10591
  sm: {
10453
10592
  padding: "0.625rem 1.25rem",
10454
- fontSize: "0.875rem"
10593
+ fontSize: "text-base"
10455
10594
  },
10456
10595
  md: {
10457
10596
  padding: "0.875rem 1.75rem",
10458
- fontSize: "1rem"
10597
+ fontSize: "text-lg"
10459
10598
  },
10460
10599
  lg: {
10461
10600
  padding: "1.125rem 2.25rem",
10462
- fontSize: "1.125rem"
10601
+ fontSize: "text-xl"
10463
10602
  },
10464
10603
  xl: {
10465
- padding: "1.125rem 2.25rem",
10466
- fontSize: "1.125rem"
10604
+ padding: "1.25rem 2.75rem",
10605
+ fontSize: "text-2xl"
10467
10606
  }
10468
10607
  },
10469
- variants: [
10470
- {
10471
- id: "primary",
10472
- name: "Primary",
10473
- enabled: true,
10474
- priority: 1,
10475
- background: {
10476
- type: "solid",
10477
- colorToken: "primary"
10478
- },
10479
- borderRadius: "rounded-full",
10480
- effects: { hover: [{ effectId: "pop" }] }
10481
- },
10482
- {
10483
- id: "secondary",
10484
- name: "Secondary",
10485
- enabled: true,
10486
- priority: 2,
10487
- background: {
10488
- type: "surface",
10489
- role: "link"
10490
- },
10491
- borderRadius: "rounded-full",
10492
- border: { widthClass: "border-2" },
10493
- effects: { hover: [{ effectId: "pop" }] }
10608
+ roles: {
10609
+ primary: {
10610
+ kind: "complete",
10611
+ appearance: {
10612
+ background: {
10613
+ type: "solid",
10614
+ colorToken: "primary"
10615
+ },
10616
+ borderRadius: "rounded-full",
10617
+ shadow: {
10618
+ elevation: "high",
10619
+ softness: "hard",
10620
+ position: "bottom-right",
10621
+ colorToken: "text"
10622
+ },
10623
+ effects: { hover: [{ effectId: "press-down" }] }
10624
+ }
10494
10625
  },
10495
- {
10496
- id: "hero",
10497
- name: "Hero",
10498
- enabled: true,
10499
- priority: 1,
10500
- background: {
10501
- type: "solid",
10502
- colorToken: "secondary"
10503
- },
10504
- borderRadius: "rounded-full",
10505
- effects: { hover: [{ effectId: "pop" }] }
10626
+ secondary: {
10627
+ kind: "complete",
10628
+ appearance: {
10629
+ background: {
10630
+ type: "surface",
10631
+ role: "link"
10632
+ },
10633
+ borderRadius: "rounded-full",
10634
+ border: { widthClass: "border-2" },
10635
+ shadow: {
10636
+ elevation: "high",
10637
+ softness: "hard",
10638
+ position: "bottom-right",
10639
+ colorToken: "secondary"
10640
+ },
10641
+ effects: { hover: [{ effectId: "press-down" }] }
10642
+ }
10506
10643
  },
10507
- {
10508
- id: "header",
10509
- name: "Header",
10510
- enabled: true,
10511
- priority: 2,
10512
- background: {
10513
- type: "solid",
10514
- colorToken: "background"
10515
- },
10516
- borderRadius: "rounded-full",
10517
- border: { widthClass: "border-2" },
10518
- effects: { hover: [{
10519
- effectId: "background-on-hover",
10520
- options: { colorToken: "surface" }
10521
- }] }
10644
+ outline: {
10645
+ kind: "derive",
10646
+ from: "secondary"
10522
10647
  },
10523
- {
10524
- id: "outline",
10525
- name: "Outline",
10526
- enabled: true,
10527
- priority: 3,
10528
- background: {
10529
- type: "surface",
10530
- role: "link"
10531
- },
10532
- borderRadius: "rounded-full",
10533
- border: { widthClass: "border-2" },
10534
- effects: { hover: [{
10535
- effectId: "background-on-hover",
10536
- options: { colorToken: "background" }
10537
- }] }
10648
+ ghost: {
10649
+ kind: "complete",
10650
+ appearance: {
10651
+ background: {
10652
+ type: "surface",
10653
+ role: "link"
10654
+ },
10655
+ borderRadius: "rounded-full",
10656
+ effects: { hover: [{ effectId: "press-down" }] }
10657
+ }
10538
10658
  },
10539
- {
10540
- id: "ghost",
10541
- name: "Ghost",
10542
- enabled: true,
10543
- priority: 3,
10544
- background: {
10545
- type: "surface",
10546
- role: "link"
10547
- },
10548
- borderRadius: "rounded-full",
10549
- effects: { hover: [{
10550
- effectId: "background-on-hover",
10551
- options: { colorToken: "surface" }
10552
- }] }
10659
+ accent: {
10660
+ kind: "derive",
10661
+ from: "primary",
10662
+ overrides: { background: {
10663
+ type: "solid",
10664
+ colorToken: "accent"
10665
+ } }
10553
10666
  }
10554
- ]
10667
+ }
10555
10668
  }
10556
10669
  });
10557
- //#endregion
10558
- //#region ../theme-core/src/buttons/personalities/soft-pill.ts
10559
- /**
10560
- * Soft Pill — rounded-full pill buttons with a hover lift. The default for
10561
- * Calm Studio and Modern Wellness; reads as quietly modern and welcoming.
10562
- */
10563
- const softPill = defineButtonPersonality({
10564
- id: "soft-pill",
10565
- name: "Soft Pill",
10566
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
10670
+ const ornateRitualRecipe = defineStaticButtonStyleRecipe({
10671
+ id: "ornate-ritual",
10672
+ accessibilityLabel: "Uppercase framed buttons with restrained movement",
10567
10673
  tags: {
10568
10674
  tone: "classic",
10569
- energy: "calm",
10675
+ energy: "vibrant",
10570
10676
  motion: "subtle",
10571
10677
  era: "organic"
10572
10678
  },
10573
- buttonSystem: {
10679
+ system: {
10574
10680
  global: {
10575
- cornerStyle: "pill",
10576
- shadow: "low",
10577
- textTransform: "none",
10578
- fontWeight: 500,
10579
- borderWidth: 2,
10580
- hoverTransform: "lift",
10581
- hoverColor: "none"
10681
+ cornerStyle: "rounded",
10682
+ textTransform: "uppercase",
10683
+ fontWeight: 600,
10684
+ borderWidth: 1,
10685
+ hoverTransform: "none",
10686
+ hoverColor: "none",
10687
+ letterSpacing: "loose"
10582
10688
  },
10583
- variants: [
10584
- {
10585
- id: "primary",
10586
- name: "Primary",
10587
- enabled: true,
10588
- priority: 1,
10589
- background: {
10590
- type: "solid",
10591
- colorToken: "primary"
10592
- },
10593
- borderRadius: "rounded-full",
10594
- shadow: {
10595
- elevation: "low",
10596
- softness: "soft",
10597
- position: "bottom"
10598
- },
10599
- effects: {
10600
- hover: [{
10601
- effectId: "lift",
10602
- options: { translateY: "-1px" }
10603
- }],
10604
- active: [{
10605
- effectId: "scale-down",
10606
- options: { scale: "0.98" }
10607
- }]
10689
+ sizes: {
10690
+ sm: {
10691
+ padding: "0.5625rem 1.25rem",
10692
+ fontSize: "text-xs"
10693
+ },
10694
+ md: {
10695
+ padding: "0.75rem 1.75rem",
10696
+ fontSize: "text-xs"
10697
+ },
10698
+ lg: {
10699
+ padding: "0.875rem 2.25rem",
10700
+ fontSize: "text-sm"
10701
+ },
10702
+ xl: {
10703
+ padding: "1rem 2.75rem",
10704
+ fontSize: "text-base"
10705
+ }
10706
+ },
10707
+ roles: {
10708
+ primary: {
10709
+ kind: "complete",
10710
+ appearance: {
10711
+ background: {
10712
+ type: "solid",
10713
+ colorToken: "primary"
10714
+ },
10715
+ borderRadius: "rounded-md",
10716
+ border: { widthClass: "border" },
10717
+ effects: {
10718
+ hover: [{
10719
+ effectId: "background-on-hover",
10720
+ options: { colorToken: "primary-100" }
10721
+ }],
10722
+ active: [{
10723
+ effectId: "scale-down",
10724
+ options: { scale: "0.98" }
10725
+ }]
10726
+ }
10608
10727
  }
10609
10728
  },
10610
- {
10611
- id: "secondary",
10612
- name: "Secondary",
10613
- enabled: true,
10614
- priority: 2,
10615
- background: {
10616
- type: "surface",
10617
- role: "link"
10618
- },
10619
- borderRadius: "rounded-full",
10620
- border: { widthClass: "border-2" },
10621
- effects: { hover: [{
10622
- effectId: "background-on-hover",
10623
- options: { colorToken: "surface" }
10624
- }] }
10729
+ secondary: {
10730
+ kind: "complete",
10731
+ appearance: {
10732
+ background: {
10733
+ type: "solid",
10734
+ colorToken: "secondary"
10735
+ },
10736
+ borderRadius: "rounded-md",
10737
+ border: { widthClass: "border" },
10738
+ effects: { hover: [{
10739
+ effectId: "background-on-hover",
10740
+ options: { colorToken: "surface" }
10741
+ }] }
10742
+ }
10625
10743
  },
10626
- {
10627
- id: "outline",
10628
- name: "Outline",
10629
- enabled: true,
10630
- priority: 3,
10631
- background: {
10632
- type: "surface",
10633
- role: "link"
10634
- },
10635
- borderRadius: "rounded-full",
10636
- border: { widthClass: "border" },
10637
- effects: { hover: [{
10638
- effectId: "background-on-hover",
10639
- options: { colorToken: "surface" }
10640
- }] }
10744
+ outline: {
10745
+ kind: "complete",
10746
+ appearance: {
10747
+ background: {
10748
+ type: "surface",
10749
+ role: "link"
10750
+ },
10751
+ borderRadius: "rounded-md",
10752
+ border: { widthClass: "border" },
10753
+ effects: { hover: [{
10754
+ effectId: "background-on-hover",
10755
+ options: { colorToken: "muted" }
10756
+ }] }
10757
+ }
10641
10758
  },
10642
- {
10643
- id: "ghost",
10644
- name: "Ghost",
10645
- enabled: true,
10646
- priority: 3,
10647
- background: {
10648
- type: "surface",
10649
- role: "link"
10650
- },
10651
- borderRadius: "rounded-full",
10652
- effects: { hover: [{
10653
- effectId: "background-on-hover",
10654
- options: { colorToken: "surface" }
10655
- }] }
10759
+ ghost: {
10760
+ kind: "complete",
10761
+ appearance: {
10762
+ background: {
10763
+ type: "surface",
10764
+ role: "link"
10765
+ },
10766
+ borderRadius: "rounded-none",
10767
+ sizes: {
10768
+ sm: {
10769
+ padding: "0.375rem 0",
10770
+ fontSize: "text-xs"
10771
+ },
10772
+ md: {
10773
+ padding: "0.5rem 0",
10774
+ fontSize: "text-sm"
10775
+ },
10776
+ lg: {
10777
+ padding: "0.625rem 0",
10778
+ fontSize: "text-base"
10779
+ },
10780
+ xl: {
10781
+ padding: "0.75rem 0",
10782
+ fontSize: "text-lg"
10783
+ }
10784
+ },
10785
+ effects: { base: [{
10786
+ effectId: "border-bottom-grow",
10787
+ options: {
10788
+ height: 1,
10789
+ colorToken: "accent",
10790
+ origin: "left"
10791
+ }
10792
+ }] }
10793
+ }
10794
+ },
10795
+ accent: {
10796
+ kind: "derive",
10797
+ from: "primary",
10798
+ overrides: { background: {
10799
+ type: "solid",
10800
+ colorToken: "accent"
10801
+ } }
10656
10802
  }
10657
- ]
10803
+ }
10658
10804
  }
10659
10805
  });
10660
10806
  //#endregion
10661
- //#region ../theme-core/src/buttons/personalities/two-tone-pill.ts
10662
- const solidSecondary = {
10663
- id: "secondary",
10664
- name: "Secondary",
10665
- enabled: true,
10666
- priority: 2,
10667
- background: {
10668
- type: "solid",
10669
- colorToken: unsafeAsOpaqueButtonColourToken("secondary")
10670
- },
10671
- borderRadius: "rounded-full",
10672
- shadow: {
10673
- elevation: "none",
10674
- softness: null,
10675
- position: "bottom"
10676
- },
10677
- effects: {
10678
- hover: [{
10679
- effectId: "background-on-hover-alpha",
10680
- options: {
10681
- colorToken: "secondary",
10682
- opacity: 88
10683
- }
10684
- }],
10685
- active: [{
10686
- effectId: "scale-down",
10687
- options: { scale: "0.98" }
10688
- }]
10689
- }
10690
- };
10691
- //#endregion
10692
- //#region ../theme-core/src/buttons/personalities/index.ts
10693
- const buttonPersonalities = [
10694
- softPill,
10695
- defineButtonPersonality({
10696
- id: "two-tone-pill",
10697
- name: "Two-tone Pill",
10698
- description: "Rounded pills with distinct solid primary and secondary brand colours.",
10699
- tags: softPill.tags,
10700
- buttonSystem: {
10701
- ...softPill.buttonSystem,
10702
- variants: softPill.buttonSystem.variants.map((variant) => variant.id === "secondary" ? solidSecondary : variant)
10703
- }
10704
- }),
10705
- earthPill,
10706
- confidentChip,
10707
- editorialLink,
10708
- pebble,
10709
- inkStamp,
10710
- flatInk,
10711
- brushedWash,
10712
- showtimePill,
10713
- joyStamp,
10714
- ornateRitual,
10715
- quietArrow
10807
+ //#region ../theme-core/src/buttons/styles/registry.ts
10808
+ const buttonStyleRecipes = [
10809
+ softPillRecipe,
10810
+ earthPillRecipe,
10811
+ confidentChipRecipe,
10812
+ editorialLinkRecipe,
10813
+ pebbleRecipe,
10814
+ inkStampRecipe,
10815
+ flatInkRecipe,
10816
+ brushedWashRecipe,
10817
+ showtimePillRecipe,
10818
+ joyStampRecipe,
10819
+ ornateRitualRecipe,
10820
+ quietArrowRecipe
10716
10821
  ];
10717
- new Map(buttonPersonalities.map((p) => [p.id, p]));
10822
+ const recipesById = new Map(buttonStyleRecipes.map((recipe) => [recipe.id, recipe]));
10823
+ function findButtonStyleRecipe(id) {
10824
+ const recipe = recipesById.get(id);
10825
+ if (recipe === void 0) throw new Error(`Button style registry is missing known style ${id}`);
10826
+ return recipe;
10827
+ }
10828
+ function resolveButtonStyleSelection(selection) {
10829
+ switch (selection.styleId) {
10830
+ case "soft-pill": return resolveButtonStyleRecipe(softPillRecipe, selection.parameters);
10831
+ case "earth-pill": return resolveButtonStyleRecipe(earthPillRecipe, selection.parameters);
10832
+ case "confident-chip": return resolveButtonStyleRecipe(confidentChipRecipe, selection.parameters);
10833
+ case "editorial-link": return resolveButtonStyleRecipe(editorialLinkRecipe, selection.parameters);
10834
+ case "pebble": return resolveButtonStyleRecipe(pebbleRecipe, selection.parameters);
10835
+ case "ink-stamp": return resolveButtonStyleRecipe(inkStampRecipe, selection.parameters);
10836
+ case "flat-ink": return resolveButtonStyleRecipe(flatInkRecipe, selection.parameters);
10837
+ case "brushed-wash": return resolveButtonStyleRecipe(brushedWashRecipe, selection.parameters);
10838
+ case "showtime-pill": return resolveButtonStyleRecipe(showtimePillRecipe, selection.parameters);
10839
+ case "joy-stamp": return resolveButtonStyleRecipe(joyStampRecipe, selection.parameters);
10840
+ case "ornate-ritual": return resolveButtonStyleRecipe(ornateRitualRecipe, selection.parameters);
10841
+ case "quiet-arrow": return resolveButtonStyleRecipe(quietArrowRecipe, selection.parameters);
10842
+ }
10843
+ }
10844
+ function defaultButtonStyleSelectionFor(styleId) {
10845
+ return {
10846
+ styleId,
10847
+ parameters: findButtonStyleRecipe(styleId).defaultParameters
10848
+ };
10849
+ }
10850
+ 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");
10718
10851
  //#endregion
10719
10852
  //#region ../theme-core/src/accordions/siteStyleDefaults.ts
10720
10853
  /**
@@ -12475,76 +12608,9 @@ function headerConfigurationKey(configuration) {
12475
12608
  function asFooterLookId(value) {
12476
12609
  return value;
12477
12610
  }
12478
- function asFooterLayoutId(value) {
12479
- return value;
12480
- }
12481
- function asFooterStyleId(value) {
12482
- return value;
12483
- }
12484
- const footerLayoutCatalog = defineExactCatalog()([
12485
- {
12486
- id: asFooterLayoutId("identity"),
12487
- label: "Identity",
12488
- description: "Logo, site text, address, and legal copy without relying on footer navigation."
12489
- },
12490
- {
12491
- id: asFooterLayoutId("centered"),
12492
- label: "Centered",
12493
- description: "A calm centered stack for identity, short copy, and optional compact navigation.",
12494
- maxRecommendedNavDensity: "sparse"
12495
- },
12496
- {
12497
- id: asFooterLayoutId("split"),
12498
- label: "Split",
12499
- description: "Navigation and brand signoff separated into a wider split footer.",
12500
- requiresFooterNav: true,
12501
- maxRecommendedNavDensity: "balanced"
12502
- },
12503
- {
12504
- id: asFooterLayoutId("columns"),
12505
- label: "Columns",
12506
- description: "Grouped footer navigation columns with a supporting bottom line.",
12507
- requiresFooterNav: true,
12508
- requiresFooterNavGroups: true
12509
- }
12510
- ]);
12511
- const footerStyleCatalog = defineExactCatalog()([
12512
- {
12513
- id: asFooterStyleId("quiet"),
12514
- label: "Quiet",
12515
- description: "Lightweight, practical footer treatment."
12516
- },
12517
- {
12518
- id: asFooterStyleId("calm"),
12519
- label: "Calm",
12520
- description: "Soft centered treatment with restrained dividers."
12521
- },
12522
- {
12523
- id: asFooterStyleId("editorial"),
12524
- label: "Editorial",
12525
- description: "Text-forward treatment with fine-line structure."
12526
- },
12527
- {
12528
- id: asFooterStyleId("brand-band"),
12529
- label: "Brand band",
12530
- description: "High-contrast brand treatment with a stronger bottom bar."
12531
- }
12532
- ]);
12533
- new Map(footerLayoutCatalog.map((layout) => [layout.id, layout]));
12534
- new Map(footerStyleCatalog.map((style) => [style.id, style]));
12535
- /**
12536
- * No-nav-safe identity footer: brand and legal/supporting copy carry the
12537
- * footer without implying missing navigation.
12538
- */
12539
- function identityQuietFooter(theme) {
12611
+ function quietFooterLinks(theme) {
12540
12612
  return {
12541
12613
  ...theme.footer,
12542
- variant: "simple",
12543
- maxWidth: "container",
12544
- background: {
12545
- type: "color",
12546
- color: "surface"
12547
- },
12548
12614
  navStyle: "minimal",
12549
12615
  navWeight: "regular",
12550
12616
  navColor: "text",
@@ -12557,285 +12623,38 @@ function identityQuietFooter(theme) {
12557
12623
  hoverColorToken: "primary",
12558
12624
  padding: "none",
12559
12625
  borderRadius: "none"
12560
- },
12561
- navLayout: {
12562
- layout: "inline-wrap",
12563
- align: "start",
12564
- gapX: "default",
12565
- gapY: "tight"
12566
- },
12567
- logo: {
12568
- showLogo: true,
12569
- showLogoText: true,
12570
- placement: "left",
12571
- size: "sm",
12572
- align: "start"
12573
- },
12574
- bottomBar: {
12575
- enabled: false,
12576
- fullBleed: false,
12577
- textAlign: "left",
12578
- paddingX: "default",
12579
- paddingY: "compact",
12580
- borderTop: { width: "none" }
12581
12626
  }
12582
12627
  };
12583
12628
  }
12584
- /**
12585
- * Back-compat alias for the previous default footer Look. It keeps existing
12586
- * persisted selections valid while staying hidden from the new layout/style UI.
12587
- */
12588
- function mutedGroundingFooter(theme) {
12589
- return {
12590
- ...identityQuietFooter(theme),
12591
- background: theme.footer.background,
12592
- navStyle: theme.footer.navStyle,
12593
- navColor: theme.footer.navColor,
12594
- navWeight: theme.footer.navWeight,
12595
- navLinkStyle: theme.footer.navLinkStyle,
12596
- bottomTextLinkStyle: theme.footer.bottomTextLinkStyle
12597
- };
12598
- }
12599
- /** Applies a high-contrast brand band with a darker full-bleed bottom bar. */
12600
- function brandTwoBandFooter(theme) {
12629
+ function emphasizedFooterLinks(theme) {
12601
12630
  return {
12602
12631
  ...theme.footer,
12603
- variant: "split",
12604
- maxWidth: "container",
12605
- background: {
12606
- type: "color",
12607
- color: "primary-800"
12608
- },
12609
12632
  navStyle: "minimal",
12610
12633
  navWeight: "medium",
12611
- navColor: "primaryForeground",
12612
- navLinkStyle: {
12613
- typography: "body",
12614
- fontWeight: "medium",
12615
- textTransform: "none",
12616
- italic: false,
12617
- colorToken: "primaryForeground",
12618
- hoverColorToken: "secondary",
12619
- padding: "none",
12620
- borderRadius: "none"
12621
- },
12622
- bottomTextLinkStyle: {
12623
- colorToken: "secondary",
12624
- decorationColorToken: "secondary"
12625
- },
12626
- navLayout: {
12627
- layout: "inline-wrap",
12628
- align: "start",
12629
- gapX: "default",
12630
- gapY: "tight"
12631
- },
12632
- logo: {
12633
- showLogo: true,
12634
- showLogoText: false,
12635
- placement: "left",
12636
- size: "sm",
12637
- align: "start"
12638
- },
12639
- bottomBar: {
12640
- enabled: true,
12641
- fullBleed: true,
12642
- background: {
12643
- type: "color",
12644
- color: "primary-900"
12645
- },
12646
- textColor: "primaryForeground",
12647
- textAlign: "center",
12648
- paddingX: "default",
12649
- paddingY: "compact",
12650
- borderTop: { width: "none" }
12651
- }
12652
- };
12653
- }
12654
- /**
12655
- * Centered stack on a softly tinted band: logo, inline nav, address, and a
12656
- * hairline-topped copyright line, all centered.
12657
- */
12658
- function centeredCalmFooter(theme) {
12659
- return {
12660
- ...theme.footer,
12661
- variant: "simple",
12662
- maxWidth: "container",
12663
- background: {
12664
- type: "color",
12665
- color: "surfaceAlt"
12666
- },
12667
- navStyle: "minimal",
12668
- navWeight: "regular",
12669
- navColor: "text",
12670
- navLinkStyle: {
12671
- typography: "body",
12672
- fontWeight: "regular",
12673
- textTransform: "none",
12674
- italic: false,
12675
- colorToken: "text",
12676
- hoverColorToken: "primary",
12677
- padding: "none",
12678
- borderRadius: "none"
12679
- },
12680
- navLayout: {
12681
- layout: "inline-wrap",
12682
- align: "center",
12683
- gapX: "relaxed",
12684
- gapY: "tight"
12685
- },
12686
- logo: {
12687
- showLogo: true,
12688
- showLogoText: false,
12689
- placement: "above",
12690
- size: "sm",
12691
- align: "center"
12692
- },
12693
- bottomBar: {
12694
- enabled: true,
12695
- fullBleed: false,
12696
- textAlign: "center",
12697
- paddingX: "default",
12698
- paddingY: "compact",
12699
- borderTop: { width: "thin" }
12700
- }
12701
- };
12702
- }
12703
- /** Editorial split footer: compact nav on one side, brand signoff on the other. */
12704
- function splitEditorialFooter(theme) {
12705
- return {
12706
- ...theme.footer,
12707
- variant: "split",
12708
- maxWidth: "container",
12709
- background: {
12710
- type: "color",
12711
- color: "surface"
12712
- },
12713
- navStyle: "minimal",
12714
- navWeight: "regular",
12715
- navColor: "text",
12716
- navLinkStyle: {
12717
- typography: "body",
12718
- fontWeight: "regular",
12719
- textTransform: "none",
12720
- italic: false,
12721
- colorToken: "text",
12722
- hoverColorToken: "primary",
12723
- padding: "none",
12724
- borderRadius: "none"
12725
- },
12726
- navLayout: {
12727
- layout: "inline-wrap",
12728
- align: "start",
12729
- gapX: "relaxed",
12730
- gapY: "tight"
12731
- },
12732
- logo: {
12733
- showLogo: true,
12734
- showLogoText: true,
12735
- placement: "right",
12736
- size: "sm",
12737
- align: "end"
12738
- },
12739
- bottomBar: {
12740
- enabled: true,
12741
- fullBleed: false,
12742
- textAlign: "left",
12743
- paddingX: "default",
12744
- paddingY: "compact",
12745
- borderTop: { width: "thin" }
12746
- }
12747
- };
12748
- }
12749
- /**
12750
- * Editorial columns: site name and supporting copy on the left, inline nav on
12751
- * the right, with a hairline-topped bottom line. Uses the footer block's
12752
- * columns layout.
12753
- */
12754
- function editorialColumnsFooter(theme) {
12755
- return {
12756
- ...theme.footer,
12757
- variant: "columns",
12758
- maxWidth: "container",
12759
- background: {
12760
- type: "color",
12761
- color: "surface"
12762
- },
12763
- navStyle: "minimal",
12764
- navWeight: "regular",
12765
12634
  navColor: "text",
12766
12635
  navLinkStyle: {
12767
12636
  typography: "body",
12768
- fontWeight: "regular",
12637
+ fontWeight: "medium",
12769
12638
  textTransform: "none",
12770
12639
  italic: false,
12771
12640
  colorToken: "text",
12772
12641
  hoverColorToken: "primary",
12773
12642
  padding: "none",
12774
12643
  borderRadius: "none"
12775
- },
12776
- logo: {
12777
- showLogo: true,
12778
- showLogoText: true,
12779
- placement: "left",
12780
- size: "sm",
12781
- align: "start"
12782
- },
12783
- bottomBar: {
12784
- enabled: true,
12785
- fullBleed: false,
12786
- textAlign: "center",
12787
- paddingX: "default",
12788
- paddingY: "compact",
12789
- borderTop: { width: "thin" }
12790
12644
  }
12791
12645
  };
12792
12646
  }
12793
- const footerLookCatalog = defineExactCatalog()([
12794
- {
12795
- id: asFooterLookId("footer-identity-quiet"),
12796
- label: "Identity footer",
12797
- layoutId: asFooterLayoutId("identity"),
12798
- styleId: asFooterStyleId("quiet"),
12799
- compile: identityQuietFooter
12800
- },
12801
- {
12802
- id: asFooterLookId("footer-muted-grounding"),
12803
- label: "Muted grounding footer",
12804
- layoutId: asFooterLayoutId("identity"),
12805
- styleId: asFooterStyleId("quiet"),
12806
- hiddenFromLayoutStyleControls: true,
12807
- compile: mutedGroundingFooter
12808
- },
12809
- {
12810
- id: asFooterLookId("footer-centered-calm"),
12811
- label: "Centered calm footer",
12812
- layoutId: asFooterLayoutId("centered"),
12813
- styleId: asFooterStyleId("calm"),
12814
- compile: centeredCalmFooter
12815
- },
12816
- {
12817
- id: asFooterLookId("footer-split-editorial"),
12818
- label: "Split editorial footer",
12819
- layoutId: asFooterLayoutId("split"),
12820
- styleId: asFooterStyleId("editorial"),
12821
- compile: splitEditorialFooter
12822
- },
12823
- {
12824
- id: asFooterLookId("footer-editorial-columns"),
12825
- label: "Editorial columns footer",
12826
- layoutId: asFooterLayoutId("columns"),
12827
- styleId: asFooterStyleId("editorial"),
12828
- compile: editorialColumnsFooter
12829
- },
12830
- {
12831
- id: asFooterLookId("site-footer-brand-two-band"),
12832
- label: "Two-band brand footer",
12833
- layoutId: asFooterLayoutId("split"),
12834
- styleId: asFooterStyleId("brand-band"),
12835
- allowedContentPresence: ["default-footer", "default-and-blocks"],
12836
- compile: brandTwoBandFooter
12837
- }
12838
- ]);
12647
+ const footerLookCatalog = defineExactCatalog()([{
12648
+ id: asFooterLookId("footer-links-quiet"),
12649
+ label: "Quiet links",
12650
+ description: "Regular-weight footer navigation with a restrained hover.",
12651
+ compile: quietFooterLinks
12652
+ }, {
12653
+ id: asFooterLookId("footer-links-emphasized"),
12654
+ label: "Emphasized links",
12655
+ description: "Medium-weight footer navigation with a clearer emphasis.",
12656
+ compile: emphasizedFooterLinks
12657
+ }]);
12839
12658
  new Map(footerLookCatalog.map((look) => [look.id, look]));
12840
12659
  //#endregion
12841
12660
  //#region ../theme-core/src/site-styles/sourceCatalogs.ts
@@ -15899,23 +15718,27 @@ function resolveBoxShadow(variant, global, theme, tokens) {
15899
15718
  const color = shadowConfig.colorToken ? tokens.getColor(shadowConfig.colorToken) : void 0;
15900
15719
  return generateShadowValue$1(shadowConfig.elevation, shadowConfig.softness, shadowConfig.position ?? "bottom", color);
15901
15720
  }
15902
- buttonPersonalities.map((personality) => ({
15903
- id: personality.id,
15904
- name: personality.name,
15905
- description: personality.description,
15906
- category: presetCategory(personality),
15907
- buttonSystem: personality.buttonSystem,
15908
- compatibility: {
15909
- ...personality.tags.tone ? { tones: [personality.tags.tone] } : {},
15910
- ...personality.tags.energy ? { energies: [personality.tags.energy] } : {}
15911
- }
15912
- }));
15913
- function presetCategory(personality) {
15914
- switch (personality.tags.era) {
15721
+ buttonStyleRecipes.map((recipe) => {
15722
+ const resolved = resolveButtonStyleSelection(defaultButtonStyleSelectionFor(recipe.id));
15723
+ if (resolved.kind === "error") throw new Error(`Invalid registered button style ${recipe.id}: ${resolved.error.issues.join(", ")}`);
15724
+ return {
15725
+ id: recipe.id,
15726
+ name: recipe.accessibilityLabel,
15727
+ description: recipe.accessibilityLabel,
15728
+ category: presetCategory(recipe),
15729
+ buttonSystem: resolved.buttonSystem,
15730
+ compatibility: {
15731
+ ...recipe.tags.tone ? { tones: [recipe.tags.tone] } : {},
15732
+ ...recipe.tags.energy ? { energies: [recipe.tags.energy] } : {}
15733
+ }
15734
+ };
15735
+ });
15736
+ function presetCategory(recipe) {
15737
+ switch (recipe.tags.era) {
15915
15738
  case "retro": return "retro";
15916
15739
  case "editorial": return "minimal";
15917
15740
  case "organic": return "artistic";
15918
- case "modern": return personality.tags.tone === "bold" ? "modern" : "technical";
15741
+ case "modern": return recipe.tags.tone === "bold" ? "modern" : "technical";
15919
15742
  case "technical": return "technical";
15920
15743
  case void 0: return "modern";
15921
15744
  }
@@ -18804,17 +18627,21 @@ function defineCuratedSiteStyle(input) {
18804
18627
  })),
18805
18628
  recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
18806
18629
  recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
18807
- buttonPersonalityChoices: input.buttonPersonalityChoices,
18630
+ buttonStyleChoices: input.buttonStyleChoices,
18808
18631
  paletteRecommendations: input.paletteRecommendations,
18809
18632
  typography: input.typography ?? defaultTypographyForRecipe(input.tokenRecipes.typography),
18810
18633
  ...input.heroTypography ? { heroTypography: input.heroTypography } : {}
18811
18634
  };
18812
18635
  }
18813
- function buttonChoice(id, note) {
18636
+ function buttonChoice(styleId, note, parameters) {
18637
+ const selection = parameters === void 0 ? defaultButtonStyleSelectionFor(styleId) : buttonStyleSelectionSchema.parse({
18638
+ styleId,
18639
+ parameters
18640
+ });
18814
18641
  return note ? {
18815
- id: asButtonPersonalityId(id),
18642
+ ...selection,
18816
18643
  note
18817
- } : { id: asButtonPersonalityId(id) };
18644
+ } : selection;
18818
18645
  }
18819
18646
  function paletteRecommendation(authoringKey, note) {
18820
18647
  const valueKey = requireCuratedPaletteValueKey(asCuratedPaletteAuthoringKey(authoringKey));
@@ -18999,9 +18826,8 @@ const curatedSiteStyles = [
18999
18826
  "minimal-transparent",
19000
18827
  "clean-base"
19001
18828
  ],
19002
- buttonPersonalityChoices: [
18829
+ buttonStyleChoices: [
19003
18830
  buttonChoice("soft-pill"),
19004
- buttonChoice("two-tone-pill"),
19005
18831
  buttonChoice("pebble"),
19006
18832
  buttonChoice("editorial-link"),
19007
18833
  buttonChoice("brushed-wash")
@@ -19037,7 +18863,7 @@ const curatedSiteStyles = [
19037
18863
  "brand-solid",
19038
18864
  "clean-base"
19039
18865
  ],
19040
- buttonPersonalityChoices: [
18866
+ buttonStyleChoices: [
19041
18867
  buttonChoice("confident-chip"),
19042
18868
  buttonChoice("soft-pill"),
19043
18869
  buttonChoice("editorial-link")
@@ -19076,7 +18902,7 @@ const curatedSiteStyles = [
19076
18902
  "minimal-transparent",
19077
18903
  "centered-calm"
19078
18904
  ],
19079
- buttonPersonalityChoices: [
18905
+ buttonStyleChoices: [
19080
18906
  buttonChoice("editorial-link"),
19081
18907
  buttonChoice("soft-pill"),
19082
18908
  buttonChoice("brushed-wash")
@@ -19116,7 +18942,7 @@ const curatedSiteStyles = [
19116
18942
  "practical-utility",
19117
18943
  "clean-base"
19118
18944
  ],
19119
- buttonPersonalityChoices: [
18945
+ buttonStyleChoices: [
19120
18946
  buttonChoice("pebble"),
19121
18947
  buttonChoice("brushed-wash"),
19122
18948
  buttonChoice("confident-chip")
@@ -19177,7 +19003,7 @@ const curatedSiteStyles = [
19177
19003
  "serif-line",
19178
19004
  "clean-base"
19179
19005
  ],
19180
- buttonPersonalityChoices: [
19006
+ buttonStyleChoices: [
19181
19007
  buttonChoice("editorial-link"),
19182
19008
  buttonChoice("confident-chip"),
19183
19009
  buttonChoice("soft-pill")
@@ -19239,7 +19065,7 @@ const curatedSiteStyles = [
19239
19065
  "brand-solid",
19240
19066
  "clean-base"
19241
19067
  ],
19242
- buttonPersonalityChoices: [
19068
+ buttonStyleChoices: [
19243
19069
  buttonChoice("confident-chip"),
19244
19070
  buttonChoice("pebble"),
19245
19071
  buttonChoice("ink-stamp")
@@ -19278,7 +19104,7 @@ const curatedSiteStyles = [
19278
19104
  "minimal-transparent",
19279
19105
  "clean-base"
19280
19106
  ],
19281
- buttonPersonalityChoices: [
19107
+ buttonStyleChoices: [
19282
19108
  buttonChoice("soft-pill"),
19283
19109
  buttonChoice("pebble"),
19284
19110
  buttonChoice("confident-chip")
@@ -19351,7 +19177,7 @@ const curatedSiteStyles = [
19351
19177
  "clean-base",
19352
19178
  "centered-calm"
19353
19179
  ],
19354
- buttonPersonalityChoices: [
19180
+ buttonStyleChoices: [
19355
19181
  buttonChoice("pebble"),
19356
19182
  buttonChoice("soft-pill"),
19357
19183
  buttonChoice("editorial-link")
@@ -19470,12 +19296,8 @@ const curatedSiteStyles = [
19470
19296
  "serif-line",
19471
19297
  "minimal-transparent"
19472
19298
  ],
19473
- recommendedFooterLookIds: [
19474
- "footer-centered-calm",
19475
- "footer-editorial-columns",
19476
- "footer-muted-grounding"
19477
- ],
19478
- buttonPersonalityChoices: [
19299
+ recommendedFooterLookIds: ["footer-links-quiet"],
19300
+ buttonStyleChoices: [
19479
19301
  buttonChoice("soft-pill"),
19480
19302
  buttonChoice("pebble"),
19481
19303
  buttonChoice("editorial-link")
@@ -19549,7 +19371,7 @@ const curatedSiteStyles = [
19549
19371
  "centered-calm",
19550
19372
  "minimal-transparent"
19551
19373
  ],
19552
- buttonPersonalityChoices: [
19374
+ buttonStyleChoices: [
19553
19375
  buttonChoice("editorial-link"),
19554
19376
  buttonChoice("soft-pill"),
19555
19377
  buttonChoice("brushed-wash")
@@ -19622,8 +19444,8 @@ const curatedSiteStyles = [
19622
19444
  "practical-utility",
19623
19445
  "clean-base"
19624
19446
  ],
19625
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
19626
- buttonPersonalityChoices: [
19447
+ recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
19448
+ buttonStyleChoices: [
19627
19449
  buttonChoice("pebble"),
19628
19450
  buttonChoice("confident-chip"),
19629
19451
  buttonChoice("ink-stamp"),
@@ -19744,8 +19566,8 @@ const curatedSiteStyles = [
19744
19566
  "minimal-transparent",
19745
19567
  "serif-line"
19746
19568
  ],
19747
- recommendedFooterLookIds: ["footer-muted-grounding", "site-footer-brand-two-band"],
19748
- buttonPersonalityChoices: [
19569
+ recommendedFooterLookIds: ["footer-links-quiet", "footer-links-emphasized"],
19570
+ buttonStyleChoices: [
19749
19571
  buttonChoice("earth-pill"),
19750
19572
  buttonChoice("soft-pill"),
19751
19573
  buttonChoice("pebble"),
@@ -19816,7 +19638,7 @@ const curatedSiteStyles = [
19816
19638
  "floating-glass",
19817
19639
  "brand-solid"
19818
19640
  ],
19819
- buttonPersonalityChoices: [
19641
+ buttonStyleChoices: [
19820
19642
  buttonChoice("ink-stamp"),
19821
19643
  buttonChoice("confident-chip"),
19822
19644
  buttonChoice("brushed-wash"),
@@ -19871,8 +19693,8 @@ const curatedSiteStyles = [
19871
19693
  "transparent-overlay",
19872
19694
  "practical-utility"
19873
19695
  ],
19874
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
19875
- buttonPersonalityChoices: [
19696
+ recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
19697
+ buttonStyleChoices: [
19876
19698
  buttonChoice("showtime-pill"),
19877
19699
  buttonChoice("confident-chip"),
19878
19700
  buttonChoice("ink-stamp"),
@@ -19953,8 +19775,8 @@ const curatedSiteStyles = [
19953
19775
  headerStyleChoice("glass")
19954
19776
  ] },
19955
19777
  recommendedHeaderLookIds: ["minimal-transparent"],
19956
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
19957
- buttonPersonalityChoices: [
19778
+ recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
19779
+ buttonStyleChoices: [
19958
19780
  buttonChoice("ornate-ritual"),
19959
19781
  buttonChoice("joy-stamp"),
19960
19782
  buttonChoice("ink-stamp")
@@ -20007,8 +19829,8 @@ const curatedSiteStyles = [
20007
19829
  headerStyleChoice("glass")
20008
19830
  ] },
20009
19831
  recommendedHeaderLookIds: ["minimal-transparent"],
20010
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
20011
- buttonPersonalityChoices: [
19832
+ recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
19833
+ buttonStyleChoices: [
20012
19834
  buttonChoice("joy-stamp"),
20013
19835
  buttonChoice("ink-stamp"),
20014
19836
  buttonChoice("showtime-pill")
@@ -20098,8 +19920,8 @@ const curatedSiteStyles = [
20098
19920
  "centered-calm",
20099
19921
  "clean-base"
20100
19922
  ],
20101
- recommendedFooterLookIds: ["footer-editorial-columns", "footer-muted-grounding"],
20102
- buttonPersonalityChoices: [
19923
+ recommendedFooterLookIds: ["footer-links-quiet"],
19924
+ buttonStyleChoices: [
20103
19925
  buttonChoice("flat-ink"),
20104
19926
  buttonChoice("confident-chip"),
20105
19927
  buttonChoice("editorial-link")
@@ -20176,14 +19998,9 @@ const curatedSiteStyles = [
20176
19998
  "serif-line",
20177
19999
  "clean-base"
20178
20000
  ],
20179
- recommendedFooterLookIds: [
20180
- "footer-editorial-columns",
20181
- "footer-muted-grounding",
20182
- "footer-identity-quiet"
20183
- ],
20184
- buttonPersonalityChoices: [
20185
- buttonChoice("quiet-arrow"),
20186
- buttonChoice("two-tone-pill"),
20001
+ recommendedFooterLookIds: ["footer-links-quiet"],
20002
+ buttonStyleChoices: [
20003
+ buttonChoice("quiet-arrow", void 0, { secondaryTreatment: "solid-accent" }),
20187
20004
  buttonChoice("flat-ink"),
20188
20005
  buttonChoice("editorial-link")
20189
20006
  ],
@@ -23380,25 +23197,41 @@ const heroCopyFragment = defineFragment({
23380
23197
  ]
23381
23198
  });
23382
23199
  //#endregion
23200
+ //#region ../blocks/src/system/constants/buttonRoles.ts
23201
+ /**
23202
+ * Semantic button roles available to block authors.
23203
+ *
23204
+ * These roles are deliberately independent of a site's visual button style:
23205
+ * the active theme owns how each role looks.
23206
+ */
23207
+ const BLOCK_BUTTON_ROLES = PUBLIC_BUTTON_ROLES;
23208
+ const blockButtonRoleSchema = z$1.enum(BLOCK_BUTTON_ROLES);
23209
+ /**
23210
+ * Temporary rollout boundary for persisted content written before issue #1220.
23211
+ * Authoring remains strict through `blockButtonRoleSchema`; this parser exists
23212
+ * only until the post-deploy role rewrite has been audited in production.
23213
+ */
23214
+ function canonicalizePersistedBlockButtonRole(value) {
23215
+ return value === "link" || value === "tertiary" ? "ghost" : value;
23216
+ }
23217
+ const persistedBlockButtonRoleSchema = z$1.preprocess((value) => typeof value === "string" ? canonicalizePersistedBlockButtonRole(value) : value, blockButtonRoleSchema);
23218
+ const BLOCK_BUTTON_ROLE_LABELS = {
23219
+ primary: "Primary",
23220
+ secondary: "Secondary",
23221
+ outline: "Outline",
23222
+ ghost: "Ghost",
23223
+ accent: "Accent"
23224
+ };
23225
+ const BLOCK_BUTTON_ROLE_OPTIONS = BLOCK_BUTTON_ROLES.map((value) => ({
23226
+ value,
23227
+ label: BLOCK_BUTTON_ROLE_LABELS[value]
23228
+ }));
23229
+ function isBlockButtonRole(value) {
23230
+ return blockButtonRoleSchema.safeParse(value).success;
23231
+ }
23232
+ //#endregion
23383
23233
  //#region ../blocks/src/system/fields/button.ts
23384
- const DEFAULT_THEME_BUTTON_VARIANTS = [
23385
- {
23386
- value: "primary",
23387
- label: "Primary"
23388
- },
23389
- {
23390
- value: "secondary",
23391
- label: "Secondary"
23392
- },
23393
- {
23394
- value: "outline",
23395
- label: "Outline"
23396
- },
23397
- {
23398
- value: "link",
23399
- label: "Link"
23400
- }
23401
- ];
23234
+ const DEFAULT_THEME_BUTTON_VARIANTS = BLOCK_BUTTON_ROLE_OPTIONS;
23402
23235
  function createButtonVariantField(options = {}) {
23403
23236
  return {
23404
23237
  id: options.id ?? "buttonVariant",
@@ -23416,20 +23249,7 @@ function createButtonVariantField(options = {}) {
23416
23249
  };
23417
23250
  }
23418
23251
  function createButtonGroup(options = {}) {
23419
- const { variants = [
23420
- {
23421
- value: "primary",
23422
- label: "Primary"
23423
- },
23424
- {
23425
- value: "secondary",
23426
- label: "Secondary"
23427
- },
23428
- {
23429
- value: "outline",
23430
- label: "Outline"
23431
- }
23432
- ], defaultVariant, includeSize = true, defaultSize = "md", showGroupLabel = false, groupId = "button", groupLabel = "Button", flattenInRepeater = true } = options;
23252
+ const { variants = BLOCK_BUTTON_ROLE_OPTIONS, defaultVariant, includeSize = true, defaultSize = "md", showGroupLabel = false, groupId = "button", groupLabel = "Button", flattenInRepeater = true } = options;
23433
23253
  const mainFields = [
23434
23254
  {
23435
23255
  id: "label",
@@ -23565,29 +23385,7 @@ const ctaRowFragment = defineFragment({
23565
23385
  fields: [createCtasRepeater({
23566
23386
  label: "Calls to action",
23567
23387
  itemLabel: "CTA",
23568
- maxItems: 3,
23569
- button: { variants: [
23570
- {
23571
- value: "primary",
23572
- label: "Primary"
23573
- },
23574
- {
23575
- value: "secondary",
23576
- label: "Secondary"
23577
- },
23578
- {
23579
- value: "outline",
23580
- label: "Outline"
23581
- },
23582
- {
23583
- value: "link",
23584
- label: "Link"
23585
- },
23586
- {
23587
- value: "accent",
23588
- label: "Accent"
23589
- }
23590
- ] }
23388
+ maxItems: 3
23591
23389
  })],
23592
23390
  layout: [ctaRow({
23593
23391
  collectionPath: "content.ctas",
@@ -23606,10 +23404,6 @@ const heroCtaRowFragment = defineFragment({
23606
23404
  defaultValue: [],
23607
23405
  button: {
23608
23406
  variants: [
23609
- {
23610
- value: "default",
23611
- label: "Default"
23612
- },
23613
23407
  {
23614
23408
  value: "primary",
23615
23409
  label: "Primary"
@@ -23621,9 +23415,17 @@ const heroCtaRowFragment = defineFragment({
23621
23415
  {
23622
23416
  value: "outline",
23623
23417
  label: "Outline"
23418
+ },
23419
+ {
23420
+ value: "ghost",
23421
+ label: "Ghost"
23422
+ },
23423
+ {
23424
+ value: "accent",
23425
+ label: "Accent"
23624
23426
  }
23625
23427
  ],
23626
- defaultVariant: "default",
23428
+ defaultVariant: "primary",
23627
23429
  includeSize: true,
23628
23430
  defaultSize: "lg"
23629
23431
  }
@@ -24398,11 +24200,13 @@ const blogFeaturedPostFragment = defineFragment({
24398
24200
  as: "p",
24399
24201
  style: textColorStyle("text/80")
24400
24202
  }, bind("post.excerpt", { fallback: "Select a blog post to display its preview." })),
24401
- link({
24402
- className: "rb-inline-flex rb-items-center rb-caption rb-hover-opacity-80",
24403
- style: textColorStyle("primary"),
24404
- href: { $bind: { from: "post.path" } }
24405
- }, [text({ as: "strong" }, props({ value: "Read more →" }))])
24203
+ button({
24204
+ className: "rb-self-start",
24205
+ href: { $bind: { from: "post.path" } },
24206
+ variantId: "ghost",
24207
+ size: "sm",
24208
+ linkRequired: true
24209
+ }, [text({ as: "span" }, props({ value: "Read more" }))])
24406
24210
  ])], when("post")), stack({
24407
24211
  gap: "sm",
24408
24212
  className: "rb-rounded-xl rb-border rb-border-dashed rb-p-6",
@@ -25693,21 +25497,7 @@ const newsletterFormFragment = defineFragment({
25693
25497
  createButtonVariantField({
25694
25498
  id: "buttonVariant",
25695
25499
  label: "Button style",
25696
- defaultValue: "primary",
25697
- variants: [
25698
- {
25699
- value: "primary",
25700
- label: "Primary"
25701
- },
25702
- {
25703
- value: "secondary",
25704
- label: "Secondary"
25705
- },
25706
- {
25707
- value: "outline",
25708
- label: "Outline"
25709
- }
25710
- ]
25500
+ defaultValue: "primary"
25711
25501
  }),
25712
25502
  {
25713
25503
  id: "successMessage",
@@ -26637,7 +26427,8 @@ function postExcerpt(className) {
26637
26427
  function postReadMore() {
26638
26428
  return button({
26639
26429
  href: { $bind: { from: "post.path" } },
26640
- className: "rb-self-start"
26430
+ className: "rb-self-start",
26431
+ variantId: "ghost"
26641
26432
  }, [text({ as: "span" }, bind("content.readMoreText", { fallback: "Read more" }), when("content.readMoreText")), text({
26642
26433
  as: "span",
26643
26434
  value: "Read more"
@@ -30375,31 +30166,7 @@ const featureCardsBlockDefinition = { manifest: createBlockManifest({
30375
30166
  label: "Calls to action",
30376
30167
  itemLabel: "CTA",
30377
30168
  maxItems: 1,
30378
- button: {
30379
- variants: [
30380
- {
30381
- value: "primary",
30382
- label: "Primary"
30383
- },
30384
- {
30385
- value: "secondary",
30386
- label: "Secondary"
30387
- },
30388
- {
30389
- value: "outline",
30390
- label: "Outline"
30391
- },
30392
- {
30393
- value: "ghost",
30394
- label: "Ghost"
30395
- },
30396
- {
30397
- value: "link",
30398
- label: "Link"
30399
- }
30400
- ],
30401
- defaultVariant: "ghost"
30402
- }
30169
+ button: { defaultVariant: "ghost" }
30403
30170
  })
30404
30171
  ] }
30405
30172
  },
@@ -32611,17 +32378,8 @@ function readAmount(value) {
32611
32378
  //#endregion
32612
32379
  //#region ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
32613
32380
  const previewStageSchema = z$1.enum(["preview", "published"]);
32614
- const registrationButtonVariantSchema = z$1.enum([
32615
- "primary",
32616
- "secondary",
32617
- "outline"
32618
- ]);
32619
- const eventButtonVariantSchema = z$1.enum([
32620
- "primary",
32621
- "secondary",
32622
- "outline",
32623
- "link"
32624
- ]);
32381
+ const registrationButtonVariantSchema = blockButtonRoleSchema;
32382
+ const eventButtonVariantSchema = persistedBlockButtonRoleSchema;
32625
32383
  const eventLayoutSchema = z$1.enum(eventCalendarListLayoutValues);
32626
32384
  const eventCalendarDisplayModeSchema = z$1.enum(eventCalendarDisplayModeValues);
32627
32385
  const eventCalendarDefaultViewSchema = z$1.enum(eventCalendarDefaultViewValues);
@@ -32998,23 +32756,7 @@ const eventRegistrationBlockDefinition = {
32998
32756
  defaultValue: "Complete Registration",
32999
32757
  maxLength: 40
33000
32758
  },
33001
- createButtonVariantField({
33002
- description: "Choose a button style from your theme",
33003
- variants: [
33004
- {
33005
- value: "primary",
33006
- label: "Primary"
33007
- },
33008
- {
33009
- value: "secondary",
33010
- label: "Secondary"
33011
- },
33012
- {
33013
- value: "outline",
33014
- label: "Outline"
33015
- }
33016
- ]
33017
- })
32759
+ createButtonVariantField()
33018
32760
  ],
33019
32761
  layout: [styledSection({
33020
32762
  baseClass: "",
@@ -33503,23 +33245,7 @@ const courseRegistrationBlockDefinition = {
33503
33245
  defaultValue: "Sign up",
33504
33246
  maxLength: 40
33505
33247
  },
33506
- createButtonVariantField({
33507
- description: "Choose a button style from your theme",
33508
- variants: [
33509
- {
33510
- value: "primary",
33511
- label: "Primary"
33512
- },
33513
- {
33514
- value: "secondary",
33515
- label: "Secondary"
33516
- },
33517
- {
33518
- value: "outline",
33519
- label: "Outline"
33520
- }
33521
- ]
33522
- })
33248
+ createButtonVariantField()
33523
33249
  ],
33524
33250
  layout: [styledSection({
33525
33251
  baseClass: "",
@@ -39176,36 +38902,7 @@ const offeringsPreviewFields = [
39176
38902
  ui: { intent: "content" },
39177
38903
  schema: { fields: groupOverrideFields }
39178
38904
  },
39179
- {
39180
- id: "buttonVariant",
39181
- type: "select",
39182
- label: "Button style",
39183
- required: false,
39184
- multiple: false,
39185
- defaultValue: "primary",
39186
- options: [
39187
- {
39188
- value: "primary",
39189
- label: "Primary"
39190
- },
39191
- {
39192
- value: "secondary",
39193
- label: "Secondary"
39194
- },
39195
- {
39196
- value: "outline",
39197
- label: "Outline"
39198
- },
39199
- {
39200
- value: "link",
39201
- label: "Link"
39202
- }
39203
- ],
39204
- ui: {
39205
- intent: "display",
39206
- widget: "buttonVariant"
39207
- }
39208
- },
38905
+ createButtonVariantField(),
39209
38906
  {
39210
38907
  id: "buttonText",
39211
38908
  type: "text",
@@ -39411,7 +39108,7 @@ function normalizeOfferingsPreviewGroupOverride(value) {
39411
39108
  return [override];
39412
39109
  }
39413
39110
  function isButtonVariant(value) {
39414
- return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
39111
+ return value === null || isBlockButtonRole(value);
39415
39112
  }
39416
39113
  function normalizeCardStylesContent(value) {
39417
39114
  return isRecord$19(value) || value === null ? value : void 0;
@@ -41263,12 +40960,7 @@ const shopSourceSchema = z$1.object({
41263
40960
  showPrices: z$1.boolean().optional(),
41264
40961
  showValidityPeriod: z$1.boolean().optional(),
41265
40962
  showPricePerCredit: z$1.boolean().nullable().optional(),
41266
- buttonVariant: z$1.enum([
41267
- "primary",
41268
- "secondary",
41269
- "outline",
41270
- "link"
41271
- ]).optional(),
40963
+ buttonVariant: blockButtonRoleSchema.optional(),
41272
40964
  passesHeading: z$1.string().optional(),
41273
40965
  membershipsHeading: z$1.string().optional(),
41274
40966
  buyButtonText: z$1.string().optional(),
@@ -41413,12 +41105,7 @@ const passesMembershipsHydrationSchema = z$1.object({
41413
41105
  passes: z$1.array(publicPassProductSchema),
41414
41106
  memberships: z$1.array(publicMembershipProductSchema),
41415
41107
  passPurchaseMode: z$1.enum(["add_to_cart", "buy_now"]),
41416
- buttonVariant: z$1.enum([
41417
- "primary",
41418
- "secondary",
41419
- "outline",
41420
- "link"
41421
- ])
41108
+ buttonVariant: blockButtonRoleSchema
41422
41109
  });
41423
41110
  const productListHydrationSchema = z$1.object({
41424
41111
  products: z$1.array(publicProductSchema),
@@ -42846,11 +42533,7 @@ const newsletterPresetSchema = z$1.enum([
42846
42533
  "emailNameCompany"
42847
42534
  ]);
42848
42535
  const newsletterDestinationProviderSchema = z$1.enum(["riverbank", "mailchimp"]);
42849
- const newsletterButtonVariantSchema = z$1.enum([
42850
- "primary",
42851
- "secondary",
42852
- "outline"
42853
- ]);
42536
+ const newsletterButtonVariantSchema = blockButtonRoleSchema;
42854
42537
  const newsletterFieldSchema = z$1.object({
42855
42538
  id: z$1.string(),
42856
42539
  type: z$1.enum(["email", "text"]),
@@ -45903,7 +45586,7 @@ const ButtonNode = ({ value, children, href, variantId = "primary", size = "md",
45903
45586
  return null;
45904
45587
  }
45905
45588
  const extraClassName = affordanceIcon ? [className, AFFORDANCE_SUPPRESS_CLASS].filter(Boolean).join(" ") : className;
45906
- const resolvedVariantId = parseThemeButtonVariantId(variantId);
45589
+ const resolvedVariantId = parseThemeButtonVariantId(canonicalizePersistedBlockButtonRole(variantId));
45907
45590
  const combinedClassName = resolvedVariantId ? themeButtonClassName({
45908
45591
  variant: resolvedVariantId,
45909
45592
  size,
@@ -46002,12 +45685,6 @@ const FeatureCardIconNode = ({ value, treatment, generatedIconSizePx, className,
46002
45685
  };
46003
45686
  //#endregion
46004
45687
  //#region ../blocks/src/system/runtime/nodes/file-download.tsx
46005
- const FILE_DOWNLOAD_BUTTON_VARIANTS = [
46006
- "primary",
46007
- "secondary",
46008
- "outline",
46009
- "link"
46010
- ];
46011
45688
  function isDownloadableMediaType(type) {
46012
45689
  return typeof type === "string" && PUBLIC_DOWNLOAD_MEDIA_TYPES.includes(type);
46013
45690
  }
@@ -46039,7 +45716,7 @@ function iconForMediaType(type) {
46039
45716
  }
46040
45717
  }
46041
45718
  function normalizeButtonVariant(value) {
46042
- return typeof value === "string" && FILE_DOWNLOAD_BUTTON_VARIANTS.includes(value) ? value : "primary";
45719
+ return isBlockButtonRole(value) ? value : "primary";
46043
45720
  }
46044
45721
  function FileDownloadNode({ value, title, description, buttonLabel, buttonVariant, className }) {
46045
45722
  if (!value || !isDownloadableMediaType(value.type)) return null;
@@ -50041,8 +49718,11 @@ function LocationMapView({ addressText, location, zoom, heightPx, showAddressTex
50041
49718
  href: directionsUrl,
50042
49719
  target: "_blank",
50043
49720
  rel: "noreferrer",
50044
- 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",
50045
- style: mergeStyles(borderColorStyle("border"), backgroundColorStyle("surface"), textColorStyle("text")),
49721
+ className: themeButtonClassName({
49722
+ variant: "ghost",
49723
+ size: "sm",
49724
+ extraClassName: "rb-w-fit"
49725
+ }),
50046
49726
  children: directionsLabel
50047
49727
  }) : null
50048
49728
  ]
@@ -51440,7 +51120,11 @@ function WeeklySlotAvailabilityView({ availability, loading = false, error, empt
51440
51120
  ]
51441
51121
  }),
51442
51122
  resolvedCtaUrl ? /* @__PURE__ */ jsx("a", {
51443
- className: "weekly-slot-availability__cta",
51123
+ className: themeButtonClassName({
51124
+ variant: "ghost",
51125
+ size: "sm",
51126
+ extraClassName: "weekly-slot-availability__cta"
51127
+ }),
51444
51128
  href: buildSlotCtaUrl(resolvedCtaUrl, slot),
51445
51129
  "aria-label": buildSlotCtaLabel(resolvedCtaText, slot),
51446
51130
  children: resolvedCtaText
@@ -73881,7 +73565,7 @@ const TAG_TEMPLATES = {
73881
73565
  blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
73882
73566
  blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
73883
73567
  blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
73884
- 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;
73568
+ 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;
73885
73569
  z$1.object({
73886
73570
  formulaVersion: z$1.literal("managed-domain-overage-v1"),
73887
73571
  conversionRule: z$1.literal("usd-to-gbp-1-to-1-v1"),