@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
@@ -478,7 +478,7 @@ const gradientDirectionSchema$1 = z$1.enum([
478
478
  "to-br",
479
479
  "to-bl"
480
480
  ]);
481
- const buttonBackgroundSchema = z$1.discriminatedUnion("type", [
481
+ const buttonColourTreatmentSchema = z$1.discriminatedUnion("type", [
482
482
  z$1.object({
483
483
  type: z$1.literal("solid"),
484
484
  colorToken: opaqueButtonColourTokenSchema
@@ -502,6 +502,7 @@ const buttonBackgroundSchema = z$1.discriminatedUnion("type", [
502
502
  role: z$1.literal("link")
503
503
  })
504
504
  ]);
505
+ const buttonBackgroundSchema = buttonColourTreatmentSchema;
505
506
  const effectApplicationSchema$1 = z$1.object({
506
507
  effectId: z$1.string(),
507
508
  options: z$1.record(z$1.string(), z$1.json()).optional()
@@ -1282,298 +1283,429 @@ const RESOLVED_BUTTON_DISABLED_DECLARATIONS = [
1282
1283
  ];
1283
1284
  buttonSizeNameSchema.options;
1284
1285
  //#endregion
1285
- //#region ../theme-core/src/site-styles/styleTags.ts
1286
- /**
1287
- * Descriptive style-axis metadata for button personalities and palette
1288
- * variants. Site Style picker shape is curated explicitly; these tags remain
1289
- * for catalog audit, docs, and future discovery tooling.
1290
- */
1291
- const STYLE_AXIS_VALUES = {
1292
- tone: [
1293
- "minimal",
1294
- "classic",
1295
- "bold"
1296
- ],
1297
- energy: ["calm", "vibrant"],
1298
- motion: [
1299
- "subtle",
1300
- "standard",
1301
- "expressive"
1302
- ],
1303
- era: [
1304
- "editorial",
1305
- "modern",
1306
- "organic",
1307
- "technical",
1308
- "retro"
1309
- ]
1310
- };
1311
- const styleTagsSchema = z$1.object({
1312
- tone: z$1.enum(STYLE_AXIS_VALUES.tone).optional(),
1313
- energy: z$1.enum(STYLE_AXIS_VALUES.energy).optional(),
1314
- motion: z$1.enum(STYLE_AXIS_VALUES.motion).optional(),
1315
- era: z$1.enum(STYLE_AXIS_VALUES.era).optional()
1316
- });
1317
- //#endregion
1318
- //#region ../theme-core/src/buttons/personalities/types.ts
1319
- function asButtonPersonalityId(value) {
1320
- if (value.length === 0) throw new Error("ButtonPersonalityId must be a non-empty string");
1321
- return value;
1286
+ //#region ../theme-core/src/buttons/styles/domain.ts
1287
+ const PUBLIC_BUTTON_ROLES = [
1288
+ "primary",
1289
+ "secondary",
1290
+ "outline",
1291
+ "ghost",
1292
+ "accent"
1293
+ ];
1294
+ function defineButtonStyleRecipe(recipe) {
1295
+ return recipe;
1296
+ }
1297
+ function materializeButtonRoles(definitions) {
1298
+ const primary = materializeCompleteRole("primary", definitions.primary.appearance);
1299
+ const secondary = materializeCompleteRole("secondary", definitions.secondary.appearance);
1300
+ const completeRoles = {
1301
+ primary,
1302
+ secondary
1303
+ };
1304
+ return {
1305
+ primary,
1306
+ secondary,
1307
+ outline: materializeSupportingRole("outline", definitions.outline, completeRoles),
1308
+ ghost: materializeSupportingRole("ghost", definitions.ghost, completeRoles),
1309
+ accent: materializeSupportingRole("accent", definitions.accent, completeRoles)
1310
+ };
1322
1311
  }
1323
- const buttonPersonalityIdSchema = z$1.string().min(1).transform((value) => asButtonPersonalityId(value));
1324
- z$1.object({
1325
- id: buttonPersonalityIdSchema,
1326
- name: z$1.string().min(1),
1327
- description: z$1.string().min(1),
1328
- tags: styleTagsSchema,
1329
- buttonSystem: buttonSystemSchema
1330
- });
1331
- /**
1332
- * Helper for personality file modules to keep the call site short and
1333
- * type-safe. `as const satisfies ...` would also work but produces wider
1334
- * types at use sites.
1335
- */
1336
- function defineButtonPersonality(input) {
1312
+ function resolveButtonStyleRecipe(recipe, parameters) {
1313
+ const parsedParameters = recipe.parameterSchema.safeParse(parameters);
1314
+ if (!parsedParameters.success) return {
1315
+ kind: "error",
1316
+ error: {
1317
+ kind: "invalid-parameters",
1318
+ styleId: recipe.id,
1319
+ issues: parsedParameters.error.issues.map((issue) => issue.message)
1320
+ }
1321
+ };
1322
+ const definition = recipe.defineSystem(parsedParameters.data);
1323
+ const roles = materializeButtonRoles(definition.roles);
1324
+ const buttonSystem = {
1325
+ global: definition.global,
1326
+ variants: PUBLIC_BUTTON_ROLES.map((role) => roles[role]),
1327
+ ...definition.sizes ? { sizes: definition.sizes } : {}
1328
+ };
1329
+ const parsedButtonSystem = buttonSystemSchema.safeParse(buttonSystem);
1330
+ if (!parsedButtonSystem.success) return {
1331
+ kind: "error",
1332
+ error: {
1333
+ kind: "invalid-button-system",
1334
+ styleId: recipe.id,
1335
+ issues: parsedButtonSystem.error.issues.map((issue) => issue.message)
1336
+ }
1337
+ };
1337
1338
  return {
1338
- id: asButtonPersonalityId(input.id),
1339
- name: input.name,
1340
- description: input.description,
1341
- tags: input.tags,
1342
- buttonSystem: buttonSystemSchema.parse(input.buttonSystem)
1339
+ kind: "resolved",
1340
+ buttonSystem: parsedButtonSystem.data
1341
+ };
1342
+ }
1343
+ function materializeSupportingRole(role, definition, completeRoles) {
1344
+ if (definition.kind === "complete") return materializeCompleteRole(role, definition.appearance);
1345
+ return {
1346
+ ...completeRoles[definition.from],
1347
+ ...definition.overrides,
1348
+ id: role,
1349
+ name: roleName(role),
1350
+ enabled: true,
1351
+ priority: 3
1352
+ };
1353
+ }
1354
+ function materializeCompleteRole(role, appearance) {
1355
+ return {
1356
+ ...appearance,
1357
+ id: role,
1358
+ name: roleName(role),
1359
+ enabled: true,
1360
+ priority: rolePriority(role)
1343
1361
  };
1344
1362
  }
1363
+ function roleName(role) {
1364
+ return role.charAt(0).toUpperCase() + role.slice(1);
1365
+ }
1366
+ function rolePriority(role) {
1367
+ if (role === "primary") return 1;
1368
+ if (role === "secondary") return 2;
1369
+ return 3;
1370
+ }
1345
1371
  //#endregion
1346
- //#region ../theme-core/src/buttons/personalities/brushed-wash.ts
1347
- /**
1348
- * Brushed Wash — gradient backgrounds that read as watercolour washes.
1349
- * Generous padding, soft shadows; pairs with vibrant organic brands.
1350
- */
1351
- const brushedWash = defineButtonPersonality({
1352
- id: "brushed-wash",
1353
- name: "Brushed Wash",
1354
- description: "Watercolour-gradient buttons with soft shadows and generous padding.",
1372
+ //#region ../theme-core/src/buttons/styles/selection.ts
1373
+ const BUTTON_STYLE_IDS = [
1374
+ "soft-pill",
1375
+ "earth-pill",
1376
+ "confident-chip",
1377
+ "editorial-link",
1378
+ "pebble",
1379
+ "ink-stamp",
1380
+ "flat-ink",
1381
+ "brushed-wash",
1382
+ "showtime-pill",
1383
+ "joy-stamp",
1384
+ "ornate-ritual",
1385
+ "quiet-arrow"
1386
+ ];
1387
+ const quietArrowParametersSchema = z$1.object({ secondaryTreatment: z$1.enum(["outlined", "solid-accent"]) }).strict();
1388
+ const emptyParametersSchema$1 = z$1.object({}).strict();
1389
+ function selectionBranch(styleId, parameters) {
1390
+ return z$1.object({
1391
+ styleId: z$1.literal(styleId),
1392
+ parameters
1393
+ }).strict();
1394
+ }
1395
+ const buttonStyleSelectionSchema = z$1.discriminatedUnion("styleId", [
1396
+ selectionBranch("soft-pill", emptyParametersSchema$1),
1397
+ selectionBranch("earth-pill", emptyParametersSchema$1),
1398
+ selectionBranch("confident-chip", emptyParametersSchema$1),
1399
+ selectionBranch("editorial-link", emptyParametersSchema$1),
1400
+ selectionBranch("pebble", emptyParametersSchema$1),
1401
+ selectionBranch("ink-stamp", emptyParametersSchema$1),
1402
+ selectionBranch("flat-ink", emptyParametersSchema$1),
1403
+ selectionBranch("brushed-wash", emptyParametersSchema$1),
1404
+ selectionBranch("showtime-pill", emptyParametersSchema$1),
1405
+ selectionBranch("joy-stamp", emptyParametersSchema$1),
1406
+ selectionBranch("ornate-ritual", emptyParametersSchema$1),
1407
+ selectionBranch("quiet-arrow", quietArrowParametersSchema)
1408
+ ]);
1409
+ //#endregion
1410
+ //#region ../theme-core/src/buttons/styles/recipes/quietArrow.ts
1411
+ const quietArrowRecipe = defineButtonStyleRecipe({
1412
+ id: "quiet-arrow",
1413
+ accessibilityLabel: "Wide uppercase buttons with trailing arrows",
1355
1414
  tags: {
1356
1415
  tone: "classic",
1357
- energy: "vibrant",
1358
- motion: "standard",
1359
- era: "organic"
1416
+ energy: "calm",
1417
+ motion: "subtle",
1418
+ era: "editorial"
1360
1419
  },
1361
- buttonSystem: {
1420
+ parameterSchema: quietArrowParametersSchema,
1421
+ defaultParameters: { secondaryTreatment: "outlined" },
1422
+ controls: [{
1423
+ kind: "choice",
1424
+ parameter: "secondaryTreatment",
1425
+ label: "Secondary button treatment",
1426
+ options: [{
1427
+ value: "outlined",
1428
+ label: "Outlined"
1429
+ }, {
1430
+ value: "solid-accent",
1431
+ label: "Solid accent"
1432
+ }]
1433
+ }],
1434
+ defineSystem: (parameters) => ({
1362
1435
  global: {
1363
1436
  cornerStyle: "rounded",
1364
- shadow: "low",
1365
- textTransform: "none",
1437
+ textTransform: "uppercase",
1366
1438
  fontWeight: 500,
1367
1439
  borderWidth: 1,
1440
+ typography: "body",
1441
+ fontSize: "text-sm",
1442
+ letterSpacing: "loose",
1368
1443
  hoverTransform: "none",
1369
1444
  hoverColor: "none"
1370
1445
  },
1371
1446
  sizes: {
1372
1447
  sm: {
1373
- padding: "0.75rem 2rem",
1448
+ padding: "0.625rem 1.25rem",
1449
+ fontSize: "text-xs"
1450
+ },
1451
+ md: {
1452
+ padding: "0.8125rem 1.75rem",
1374
1453
  fontSize: "text-sm"
1375
1454
  },
1376
- md: { padding: "1rem 2.5rem" },
1377
1455
  lg: {
1378
- padding: "1.25rem 3rem",
1379
- fontSize: "text-lg"
1456
+ padding: "0.9375rem 2.125rem",
1457
+ fontSize: "text-sm"
1380
1458
  },
1381
1459
  xl: {
1382
- padding: "1.625rem 3.75rem",
1383
- fontSize: "text-xl"
1460
+ padding: "1.0625rem 2.5rem",
1461
+ fontSize: "text-base"
1384
1462
  }
1385
1463
  },
1386
- variants: [
1387
- {
1388
- id: "primary",
1389
- name: "Primary",
1390
- enabled: true,
1391
- priority: 1,
1392
- background: {
1393
- type: "gradient",
1394
- stops: ["primary", "accent"],
1395
- direction: "to-r",
1396
- foregroundToken: "primaryForeground"
1397
- },
1398
- borderRadius: "rounded-lg",
1399
- shadow: {
1400
- elevation: "low",
1401
- softness: "soft",
1402
- position: "bottom"
1464
+ roles: {
1465
+ primary: {
1466
+ kind: "complete",
1467
+ appearance: {
1468
+ background: {
1469
+ type: "solid",
1470
+ colorToken: unsafeAsOpaqueButtonColourToken("primary")
1471
+ },
1472
+ borderRadius: "rounded-xl",
1473
+ affordance: { iconId: "ArrowRight" },
1474
+ effects: { hover: [{
1475
+ effectId: "darken-background",
1476
+ options: { amount: 100 }
1477
+ }] }
1403
1478
  }
1404
1479
  },
1405
- {
1406
- id: "secondary",
1407
- name: "Secondary",
1408
- enabled: true,
1409
- priority: 2,
1410
- background: {
1411
- type: "gradient",
1412
- stops: ["secondary", "accent"],
1413
- direction: "to-br",
1414
- foregroundToken: "primaryForeground"
1415
- },
1416
- borderRadius: "rounded-lg",
1417
- shadow: {
1418
- elevation: "low",
1419
- softness: "soft",
1420
- position: "bottom"
1480
+ secondary: {
1481
+ kind: "complete",
1482
+ appearance: parameters.secondaryTreatment === "solid-accent" ? {
1483
+ background: {
1484
+ type: "solid",
1485
+ colorToken: unsafeAsOpaqueButtonColourToken("accent")
1486
+ },
1487
+ borderRadius: "rounded-xl",
1488
+ affordance: { iconId: "ArrowRight" },
1489
+ effects: { hover: [{
1490
+ effectId: "darken-background",
1491
+ options: { amount: 100 }
1492
+ }] }
1493
+ } : {
1494
+ background: {
1495
+ type: "surface",
1496
+ role: "link"
1497
+ },
1498
+ borderRadius: "rounded-xl",
1499
+ border: { widthClass: "border" },
1500
+ affordance: { iconId: "ArrowRight" },
1501
+ effects: { hover: [{
1502
+ effectId: "background-on-hover",
1503
+ options: { colorToken: "surfaceAlt" }
1504
+ }] }
1421
1505
  }
1422
1506
  },
1423
- {
1424
- id: "outline",
1425
- name: "Outline",
1426
- enabled: true,
1427
- priority: 3,
1428
- background: {
1429
- type: "surface",
1430
- role: "link"
1431
- },
1432
- borderRadius: "rounded-lg",
1433
- border: { widthClass: "border" },
1434
- effects: { hover: [{
1435
- effectId: "background-on-hover",
1436
- options: { colorToken: "surface" }
1437
- }] }
1507
+ outline: {
1508
+ kind: "complete",
1509
+ appearance: {
1510
+ background: {
1511
+ type: "surface",
1512
+ role: "link"
1513
+ },
1514
+ borderRadius: "rounded-xl",
1515
+ border: { widthClass: "border" }
1516
+ }
1438
1517
  },
1439
- {
1440
- id: "ghost",
1441
- name: "Ghost",
1442
- enabled: true,
1443
- priority: 3,
1444
- background: {
1445
- type: "surface",
1446
- role: "link"
1447
- },
1448
- borderRadius: "rounded-lg",
1449
- effects: { hover: [{
1450
- effectId: "background-on-hover",
1451
- options: { colorToken: "surface" }
1452
- }] }
1518
+ ghost: {
1519
+ kind: "complete",
1520
+ appearance: {
1521
+ background: {
1522
+ type: "surface",
1523
+ role: "link"
1524
+ },
1525
+ borderRadius: "rounded-xl"
1526
+ }
1527
+ },
1528
+ accent: {
1529
+ kind: "derive",
1530
+ from: "primary",
1531
+ overrides: { background: {
1532
+ type: "solid",
1533
+ colorToken: unsafeAsOpaqueButtonColourToken("accent")
1534
+ } }
1453
1535
  }
1454
- ]
1455
- }
1536
+ }
1537
+ })
1456
1538
  });
1457
1539
  //#endregion
1458
- //#region ../theme-core/src/buttons/personalities/confident-chip.ts
1459
- /**
1460
- * Confident Chip — moderate-radius solid buttons that read as competent and
1461
- * direct. Default for Clear Professional; works for any modern brand voice.
1462
- */
1463
- const confidentChip = defineButtonPersonality({
1464
- id: "confident-chip",
1465
- name: "Confident Chip",
1466
- description: "Mid-radius solid buttons with a crisp hover.",
1540
+ //#region ../theme-core/src/buttons/styles/recipes/defineStaticButtonStyleRecipe.ts
1541
+ const emptyParametersSchema = z$1.object({}).strict();
1542
+ function defineStaticButtonStyleRecipe(input) {
1543
+ const system = normalizeSystem(input.system);
1544
+ return defineButtonStyleRecipe({
1545
+ id: input.id,
1546
+ accessibilityLabel: input.accessibilityLabel,
1547
+ tags: input.tags,
1548
+ parameterSchema: emptyParametersSchema,
1549
+ defaultParameters: {},
1550
+ controls: [],
1551
+ defineSystem: () => system
1552
+ });
1553
+ }
1554
+ function normalizeSystem(input) {
1555
+ return {
1556
+ global: buttonGlobalSettingsSchema.parse(input.global),
1557
+ ...input.sizes ? { sizes: input.sizes } : {},
1558
+ roles: {
1559
+ primary: normalizeCompleteRole(input.roles.primary),
1560
+ secondary: normalizeCompleteRole(input.roles.secondary),
1561
+ outline: normalizeSupportingRole(input.roles.outline),
1562
+ ghost: normalizeSupportingRole(input.roles.ghost),
1563
+ accent: normalizeSupportingRole(input.roles.accent)
1564
+ }
1565
+ };
1566
+ }
1567
+ function normalizeCompleteRole(role) {
1568
+ return {
1569
+ kind: "complete",
1570
+ appearance: normalizeAppearance(role.appearance)
1571
+ };
1572
+ }
1573
+ function normalizeSupportingRole(role) {
1574
+ if (role.kind === "complete") return normalizeCompleteRole(role);
1575
+ return {
1576
+ kind: "derive",
1577
+ from: role.from,
1578
+ ...role.overrides ? { overrides: normalizeAppearanceOverrides(role.overrides) } : {}
1579
+ };
1580
+ }
1581
+ function normalizeAppearance(appearance) {
1582
+ const { background, hoverBackgroundToken, ...rest } = appearance;
1583
+ return {
1584
+ ...rest,
1585
+ background: buttonColourTreatmentSchema.parse(background),
1586
+ ...hoverBackgroundToken ? { hoverBackgroundToken: opaqueButtonColourTokenSchema.parse(hoverBackgroundToken) } : {}
1587
+ };
1588
+ }
1589
+ function normalizeAppearanceOverrides(overrides) {
1590
+ const { background, hoverBackgroundToken, ...rest } = overrides;
1591
+ return {
1592
+ ...rest,
1593
+ ...background ? { background: buttonColourTreatmentSchema.parse(background) } : {},
1594
+ ...hoverBackgroundToken ? { hoverBackgroundToken: opaqueButtonColourTokenSchema.parse(hoverBackgroundToken) } : {}
1595
+ };
1596
+ }
1597
+ //#endregion
1598
+ //#region ../theme-core/src/buttons/styles/recipes/staticRecipes.ts
1599
+ const softPillRecipe = defineStaticButtonStyleRecipe({
1600
+ id: "soft-pill",
1601
+ accessibilityLabel: "Rounded pill buttons with a gentle hover lift",
1467
1602
  tags: {
1468
1603
  tone: "classic",
1469
1604
  energy: "calm",
1470
- motion: "standard",
1471
- era: "modern"
1605
+ motion: "subtle",
1606
+ era: "organic"
1472
1607
  },
1473
- buttonSystem: {
1608
+ system: {
1474
1609
  global: {
1475
- cornerStyle: "rounded",
1476
- shadow: "medium",
1610
+ cornerStyle: "pill",
1611
+ shadow: "low",
1477
1612
  textTransform: "none",
1478
- fontWeight: 600,
1479
- borderWidth: 1,
1480
- hoverTransform: "none",
1613
+ fontWeight: 500,
1614
+ borderWidth: 2,
1615
+ hoverTransform: "lift",
1481
1616
  hoverColor: "none"
1482
1617
  },
1483
- variants: [
1484
- {
1485
- id: "primary",
1486
- name: "Primary",
1487
- enabled: true,
1488
- priority: 1,
1489
- background: {
1490
- type: "solid",
1491
- colorToken: "primary"
1492
- },
1493
- borderRadius: "rounded-md",
1494
- shadow: {
1495
- elevation: "medium",
1496
- softness: "soft",
1497
- position: "bottom"
1498
- },
1499
- effects: {
1500
- hover: [{
1501
- effectId: "darken-background",
1502
- options: { amount: 100 }
1503
- }],
1504
- active: [{
1505
- effectId: "scale-down",
1506
- options: { scale: "0.97" }
1507
- }]
1618
+ roles: {
1619
+ primary: {
1620
+ kind: "complete",
1621
+ appearance: {
1622
+ background: {
1623
+ type: "solid",
1624
+ colorToken: "primary"
1625
+ },
1626
+ borderRadius: "rounded-full",
1627
+ shadow: {
1628
+ elevation: "low",
1629
+ softness: "soft",
1630
+ position: "bottom"
1631
+ },
1632
+ effects: {
1633
+ hover: [{
1634
+ effectId: "lift",
1635
+ options: { translateY: "-1px" }
1636
+ }],
1637
+ active: [{
1638
+ effectId: "scale-down",
1639
+ options: { scale: "0.98" }
1640
+ }]
1641
+ }
1508
1642
  }
1509
1643
  },
1510
- {
1511
- id: "secondary",
1512
- name: "Secondary",
1513
- enabled: true,
1514
- priority: 2,
1515
- background: {
1516
- type: "solid",
1517
- colorToken: "surface"
1518
- },
1519
- borderRadius: "rounded-md",
1520
- border: { widthClass: "border" },
1521
- effects: { hover: [{
1522
- effectId: "background-on-hover",
1523
- options: { colorToken: "background" }
1524
- }] }
1644
+ secondary: {
1645
+ kind: "complete",
1646
+ appearance: {
1647
+ background: {
1648
+ type: "surface",
1649
+ role: "link"
1650
+ },
1651
+ borderRadius: "rounded-full",
1652
+ border: { widthClass: "border-2" },
1653
+ effects: { hover: [{
1654
+ effectId: "background-on-hover",
1655
+ options: { colorToken: "surface" }
1656
+ }] }
1657
+ }
1525
1658
  },
1526
- {
1527
- id: "outline",
1528
- name: "Outline",
1529
- enabled: true,
1530
- priority: 3,
1531
- background: {
1532
- type: "surface",
1533
- role: "link"
1534
- },
1535
- borderRadius: "rounded-md",
1536
- border: { widthClass: "border" },
1537
- effects: { hover: [{
1538
- effectId: "background-on-hover",
1539
- options: { colorToken: "surface" }
1540
- }] }
1659
+ outline: {
1660
+ kind: "complete",
1661
+ appearance: {
1662
+ background: {
1663
+ type: "surface",
1664
+ role: "link"
1665
+ },
1666
+ borderRadius: "rounded-full",
1667
+ border: { widthClass: "border" },
1668
+ effects: { hover: [{
1669
+ effectId: "background-on-hover",
1670
+ options: { colorToken: "surface" }
1671
+ }] }
1672
+ }
1541
1673
  },
1542
- {
1543
- id: "ghost",
1544
- name: "Ghost",
1545
- enabled: true,
1546
- priority: 3,
1547
- background: {
1548
- type: "surface",
1549
- role: "link"
1550
- },
1551
- borderRadius: "rounded-md",
1552
- effects: { hover: [{
1553
- effectId: "background-on-hover",
1554
- options: { colorToken: "surface" }
1555
- }] }
1674
+ ghost: {
1675
+ kind: "complete",
1676
+ appearance: {
1677
+ background: {
1678
+ type: "surface",
1679
+ role: "link"
1680
+ },
1681
+ borderRadius: "rounded-full",
1682
+ effects: { hover: [{
1683
+ effectId: "background-on-hover",
1684
+ options: { colorToken: "surface" }
1685
+ }] }
1686
+ }
1687
+ },
1688
+ accent: {
1689
+ kind: "derive",
1690
+ from: "primary",
1691
+ overrides: { background: {
1692
+ type: "solid",
1693
+ colorToken: "accent"
1694
+ } }
1556
1695
  }
1557
- ]
1696
+ }
1558
1697
  }
1559
1698
  });
1560
- //#endregion
1561
- //#region ../theme-core/src/buttons/personalities/earth-pill.ts
1562
- /**
1563
- * Earth Pill - warm studio pills with compact, primary-coloured ghost CTAs.
1564
- * Built for grounded editorial wellness styles such as Soft Earth.
1565
- */
1566
- const earthPill = defineButtonPersonality({
1699
+ const earthPillRecipe = defineStaticButtonStyleRecipe({
1567
1700
  id: "earth-pill",
1568
- name: "Earth Pill",
1569
- description: "Compact terracotta pills with quiet primary-coloured ghost CTAs.",
1701
+ accessibilityLabel: "Compact rounded buttons with a quiet hover lift",
1570
1702
  tags: {
1571
1703
  tone: "classic",
1572
1704
  energy: "calm",
1573
1705
  motion: "subtle",
1574
1706
  era: "organic"
1575
1707
  },
1576
- buttonSystem: {
1708
+ system: {
1577
1709
  global: {
1578
1710
  cornerStyle: "pill",
1579
1711
  shadow: "low",
@@ -1600,940 +1732,808 @@ const earthPill = defineButtonPersonality({
1600
1732
  fontSize: "text-xl"
1601
1733
  }
1602
1734
  },
1603
- variants: [
1604
- {
1605
- id: "primary",
1606
- name: "Primary",
1607
- enabled: true,
1608
- priority: 1,
1609
- background: {
1610
- type: "solid",
1611
- colorToken: "primary"
1612
- },
1613
- borderRadius: "rounded-full",
1614
- shadow: {
1615
- elevation: "low",
1616
- softness: "soft",
1617
- position: "bottom"
1618
- },
1619
- effects: {
1620
- hover: [{
1621
- effectId: "lift",
1622
- options: { translateY: "-1px" }
1623
- }, {
1624
- effectId: "background-on-hover",
1625
- options: { colorToken: "accent" }
1626
- }],
1627
- active: [{
1628
- effectId: "scale-down",
1629
- options: { scale: "0.98" }
1630
- }]
1735
+ roles: {
1736
+ primary: {
1737
+ kind: "complete",
1738
+ appearance: {
1739
+ background: {
1740
+ type: "solid",
1741
+ colorToken: "primary"
1742
+ },
1743
+ borderRadius: "rounded-full",
1744
+ shadow: {
1745
+ elevation: "low",
1746
+ softness: "soft",
1747
+ position: "bottom"
1748
+ },
1749
+ effects: {
1750
+ hover: [{
1751
+ effectId: "lift",
1752
+ options: { translateY: "-1px" }
1753
+ }, {
1754
+ effectId: "background-on-hover",
1755
+ options: { colorToken: "accent" }
1756
+ }],
1757
+ active: [{
1758
+ effectId: "scale-down",
1759
+ options: { scale: "0.98" }
1760
+ }]
1761
+ }
1631
1762
  }
1632
1763
  },
1633
- {
1634
- id: "secondary",
1635
- name: "Secondary",
1636
- enabled: true,
1637
- priority: 2,
1638
- background: {
1639
- type: "surface",
1640
- role: "link"
1641
- },
1642
- borderRadius: "rounded-full",
1643
- border: { widthClass: "border" },
1644
- effects: { hover: [{
1645
- effectId: "background-on-hover",
1646
- options: { colorToken: "muted" }
1647
- }] }
1764
+ secondary: {
1765
+ kind: "complete",
1766
+ appearance: {
1767
+ background: {
1768
+ type: "surface",
1769
+ role: "link"
1770
+ },
1771
+ borderRadius: "rounded-full",
1772
+ border: { widthClass: "border" },
1773
+ effects: { hover: [{
1774
+ effectId: "background-on-hover",
1775
+ options: { colorToken: "muted" }
1776
+ }] }
1777
+ }
1648
1778
  },
1649
- {
1650
- id: "outline",
1651
- name: "Outline",
1652
- enabled: true,
1653
- priority: 3,
1654
- background: {
1655
- type: "surface",
1656
- role: "link"
1657
- },
1658
- borderRadius: "rounded-full",
1659
- border: { widthClass: "border" },
1660
- effects: { hover: [{
1661
- effectId: "background-on-hover",
1662
- options: { colorToken: "surfaceAlt" }
1663
- }] }
1779
+ outline: {
1780
+ kind: "complete",
1781
+ appearance: {
1782
+ background: {
1783
+ type: "surface",
1784
+ role: "link"
1785
+ },
1786
+ borderRadius: "rounded-full",
1787
+ border: { widthClass: "border" },
1788
+ effects: { hover: [{
1789
+ effectId: "background-on-hover",
1790
+ options: { colorToken: "surfaceAlt" }
1791
+ }] }
1792
+ }
1664
1793
  },
1665
- {
1666
- id: "ghost",
1667
- name: "Ghost",
1668
- enabled: true,
1669
- priority: 3,
1670
- background: {
1671
- type: "surface",
1672
- role: "link"
1673
- },
1674
- borderRadius: "rounded-full",
1675
- shadow: {
1676
- elevation: "none",
1677
- softness: null,
1678
- position: "bottom"
1679
- },
1680
- sizes: {
1681
- sm: {
1682
- padding: "0.25rem 0",
1683
- fontSize: "text-sm"
1794
+ ghost: {
1795
+ kind: "complete",
1796
+ appearance: {
1797
+ background: {
1798
+ type: "surface",
1799
+ role: "link"
1684
1800
  },
1685
- md: { padding: "0.375rem 0" },
1686
- lg: {
1687
- padding: "0.5rem 0",
1688
- fontSize: "text-lg"
1801
+ borderRadius: "rounded-full",
1802
+ shadow: {
1803
+ elevation: "none",
1804
+ softness: null,
1805
+ position: "bottom"
1689
1806
  },
1690
- xl: {
1691
- padding: "0.625rem 0",
1692
- fontSize: "text-xl"
1807
+ sizes: {
1808
+ sm: {
1809
+ padding: "0.25rem 0",
1810
+ fontSize: "text-sm"
1811
+ },
1812
+ md: { padding: "0.375rem 0" },
1813
+ lg: {
1814
+ padding: "0.5rem 0",
1815
+ fontSize: "text-lg"
1816
+ },
1817
+ xl: {
1818
+ padding: "0.625rem 0",
1819
+ fontSize: "text-xl"
1820
+ }
1693
1821
  }
1694
1822
  }
1823
+ },
1824
+ accent: {
1825
+ kind: "derive",
1826
+ from: "primary",
1827
+ overrides: { background: {
1828
+ type: "solid",
1829
+ colorToken: "accent"
1830
+ } }
1695
1831
  }
1696
- ]
1832
+ }
1697
1833
  }
1698
1834
  });
1699
- //#endregion
1700
- //#region ../theme-core/src/buttons/personalities/editorial-link.ts
1701
- /**
1702
- * Editorial Link — all variants are link-style with a growing underline.
1703
- * Default for Warm Editorial and Quiet Luxury; reads as refined and quiet.
1704
- */
1705
- const editorialLink = defineButtonPersonality({
1706
- id: "editorial-link",
1707
- name: "Editorial Link",
1708
- description: "Link-style with a growing underline. Refined, typographic.",
1835
+ const confidentChipRecipe = defineStaticButtonStyleRecipe({
1836
+ id: "confident-chip",
1837
+ accessibilityLabel: "Moderately rounded solid buttons with a crisp hover",
1709
1838
  tags: {
1710
- tone: "minimal",
1839
+ tone: "classic",
1711
1840
  energy: "calm",
1712
- motion: "subtle",
1713
- era: "editorial"
1841
+ motion: "standard",
1842
+ era: "modern"
1714
1843
  },
1715
- buttonSystem: {
1844
+ system: {
1716
1845
  global: {
1717
- cornerStyle: "square",
1846
+ cornerStyle: "rounded",
1847
+ shadow: "medium",
1718
1848
  textTransform: "none",
1719
- fontWeight: 500,
1849
+ fontWeight: 600,
1720
1850
  borderWidth: 1,
1721
1851
  hoverTransform: "none",
1722
1852
  hoverColor: "none"
1723
1853
  },
1724
- variants: [
1725
- {
1726
- id: "primary",
1727
- name: "Primary",
1728
- enabled: true,
1729
- priority: 1,
1730
- background: {
1731
- type: "surface",
1732
- role: "link"
1733
- },
1734
- borderRadius: "rounded-none",
1735
- sizes: {
1736
- sm: { padding: "0.25rem 0" },
1737
- md: { padding: "0.5rem 0" },
1738
- lg: { padding: "0.625rem 0" },
1739
- xl: { padding: "0.75rem 0" }
1740
- },
1741
- effects: { base: [{
1742
- effectId: "border-bottom-grow",
1743
- options: {
1744
- height: 2,
1745
- colorToken: "text",
1746
- origin: "left"
1854
+ roles: {
1855
+ primary: {
1856
+ kind: "complete",
1857
+ appearance: {
1858
+ background: {
1859
+ type: "solid",
1860
+ colorToken: "primary"
1861
+ },
1862
+ borderRadius: "rounded-md",
1863
+ shadow: {
1864
+ elevation: "medium",
1865
+ softness: "soft",
1866
+ position: "bottom"
1867
+ },
1868
+ effects: {
1869
+ hover: [{
1870
+ effectId: "darken-background",
1871
+ options: { amount: 100 }
1872
+ }],
1873
+ active: [{
1874
+ effectId: "scale-down",
1875
+ options: { scale: "0.97" }
1876
+ }]
1747
1877
  }
1748
- }] }
1878
+ }
1749
1879
  },
1750
- {
1751
- id: "secondary",
1752
- name: "Secondary",
1753
- enabled: true,
1754
- priority: 2,
1755
- background: {
1756
- type: "surface",
1757
- role: "link"
1758
- },
1759
- borderRadius: "rounded-none",
1760
- sizes: {
1761
- sm: { padding: "0.25rem 0" },
1762
- md: { padding: "0.5rem 0" },
1763
- lg: { padding: "0.625rem 0" },
1764
- xl: { padding: "0.75rem 0" }
1765
- },
1766
- effects: { base: [{
1767
- effectId: "border-bottom-grow",
1768
- options: {
1769
- height: 1,
1770
- colorToken: "mutedText",
1771
- origin: "left"
1772
- }
1773
- }] }
1880
+ secondary: {
1881
+ kind: "complete",
1882
+ appearance: {
1883
+ background: {
1884
+ type: "solid",
1885
+ colorToken: "surface"
1886
+ },
1887
+ borderRadius: "rounded-md",
1888
+ border: { widthClass: "border" },
1889
+ effects: { hover: [{
1890
+ effectId: "background-on-hover",
1891
+ options: { colorToken: "background" }
1892
+ }] }
1893
+ }
1774
1894
  },
1775
- {
1776
- id: "outline",
1777
- name: "Outline",
1778
- enabled: true,
1779
- priority: 3,
1780
- background: {
1781
- type: "surface",
1782
- role: "link"
1783
- },
1784
- borderRadius: "rounded-none",
1785
- sizes: {
1786
- sm: { padding: "0.25rem 0" },
1787
- md: { padding: "0.5rem 0" },
1788
- lg: { padding: "0.625rem 0" },
1789
- xl: { padding: "0.75rem 0" }
1790
- },
1791
- effects: { base: [{
1792
- effectId: "border-bottom-grow",
1793
- options: {
1794
- height: 1,
1795
- colorToken: "accent",
1796
- origin: "left"
1797
- }
1798
- }] }
1895
+ outline: {
1896
+ kind: "complete",
1897
+ appearance: {
1898
+ background: {
1899
+ type: "surface",
1900
+ role: "link"
1901
+ },
1902
+ borderRadius: "rounded-md",
1903
+ border: { widthClass: "border" },
1904
+ effects: { hover: [{
1905
+ effectId: "background-on-hover",
1906
+ options: { colorToken: "surface" }
1907
+ }] }
1908
+ }
1799
1909
  },
1800
- {
1801
- id: "ghost",
1802
- name: "Ghost",
1803
- enabled: true,
1804
- priority: 3,
1805
- background: {
1806
- type: "surface",
1807
- role: "link"
1808
- },
1809
- borderRadius: "rounded-none",
1810
- sizes: {
1811
- sm: { padding: "0.25rem 0" },
1812
- md: { padding: "0.5rem 0" },
1813
- lg: { padding: "0.625rem 0" },
1814
- xl: { padding: "0.75rem 0" }
1910
+ ghost: {
1911
+ kind: "complete",
1912
+ appearance: {
1913
+ background: {
1914
+ type: "surface",
1915
+ role: "link"
1916
+ },
1917
+ borderRadius: "rounded-md",
1918
+ effects: { hover: [{
1919
+ effectId: "background-on-hover",
1920
+ options: { colorToken: "surface" }
1921
+ }] }
1815
1922
  }
1923
+ },
1924
+ accent: {
1925
+ kind: "derive",
1926
+ from: "primary",
1927
+ overrides: { background: {
1928
+ type: "solid",
1929
+ colorToken: "accent"
1930
+ } }
1816
1931
  }
1817
- ]
1932
+ }
1818
1933
  }
1819
1934
  });
1820
- //#endregion
1821
- //#region ../theme-core/src/buttons/personalities/flat-ink.ts
1822
- /**
1823
- * Flat Ink — a solid ink primary, a hairline ghost secondary, and a single
1824
- * amber accent climax, all completely flat (no drop shadow) with a modest
1825
- * radius. Reads as grounded, editorial and clinician-precise: the Fulcrum
1826
- * physiotherapy voice. The primary shifts to the secondary (moss) on hover and
1827
- * every variant lifts 2px; the amber accent is meant to be used sparingly as
1828
- * the page's one conversion climax.
1829
- */
1830
- const flatInk = defineButtonPersonality({
1831
- id: "flat-ink",
1832
- name: "Flat Ink",
1833
- description: "Flat solid-ink primary, hairline ghost secondary, and a single amber accent climax — modest radius, no shadow.",
1935
+ const editorialSizes = {
1936
+ sm: { padding: "0.25rem 0" },
1937
+ md: { padding: "0.5rem 0" },
1938
+ lg: { padding: "0.625rem 0" },
1939
+ xl: { padding: "0.75rem 0" }
1940
+ };
1941
+ const editorialLinkRecipe = defineStaticButtonStyleRecipe({
1942
+ id: "editorial-link",
1943
+ accessibilityLabel: "Flat typographic buttons with an underline treatment",
1834
1944
  tags: {
1835
- tone: "classic",
1945
+ tone: "minimal",
1836
1946
  energy: "calm",
1837
1947
  motion: "subtle",
1838
1948
  era: "editorial"
1839
1949
  },
1840
- buttonSystem: {
1950
+ system: {
1841
1951
  global: {
1842
- cornerStyle: "rounded",
1952
+ cornerStyle: "square",
1843
1953
  textTransform: "none",
1844
- fontWeight: 600,
1845
- borderWidth: 1,
1846
- typography: "body",
1847
- letterSpacing: "tight",
1848
- paddingPreset: "default",
1849
- hoverTransform: "lift",
1850
- hoverColor: "none"
1851
- },
1852
- sizes: {
1853
- sm: {
1854
- padding: "0.625rem 1.125rem",
1855
- fontSize: "text-sm"
1856
- },
1857
- md: { padding: "0.8125rem 1.375rem" },
1858
- lg: {
1859
- padding: "0.9375rem 1.625rem",
1860
- fontSize: "text-lg"
1861
- },
1862
- xl: {
1863
- padding: "1.0625rem 2rem",
1864
- fontSize: "text-xl"
1865
- }
1866
- },
1867
- variants: [
1868
- {
1869
- id: "primary",
1870
- name: "Primary",
1871
- enabled: true,
1872
- priority: 1,
1873
- background: {
1874
- type: "solid",
1875
- colorToken: "primary"
1876
- },
1877
- borderRadius: "rounded-lg",
1878
- affordance: { iconId: "ArrowRight" },
1879
- effects: { hover: [{
1880
- effectId: "lift",
1881
- options: { translateY: "-2px" }
1882
- }, {
1883
- effectId: "background-on-hover",
1884
- options: { colorToken: "secondary" }
1885
- }] }
1886
- },
1887
- {
1888
- id: "secondary",
1889
- name: "Secondary",
1890
- enabled: true,
1891
- priority: 2,
1892
- background: {
1893
- type: "surface",
1894
- role: "link"
1895
- },
1896
- borderRadius: "rounded-lg",
1897
- border: { widthClass: "border" },
1898
- effects: { hover: [{
1899
- effectId: "lift",
1900
- options: { translateY: "-2px" }
1901
- }, {
1902
- effectId: "background-on-hover",
1903
- options: { colorToken: "surfaceAlt" }
1904
- }] }
1905
- },
1906
- {
1907
- id: "accent",
1908
- name: "Accent",
1909
- enabled: true,
1910
- priority: 3,
1911
- background: {
1912
- type: "solid",
1913
- colorToken: "accent"
1914
- },
1915
- borderRadius: "rounded-lg",
1916
- affordance: { iconId: "ArrowRight" },
1917
- effects: { hover: [{
1918
- effectId: "lift",
1919
- options: { translateY: "-2px" }
1920
- }] }
1921
- }
1922
- ]
1923
- }
1924
- });
1925
- //#endregion
1926
- //#region ../theme-core/src/buttons/personalities/ink-stamp.ts
1927
- /**
1928
- * Ink Stamp — solid earthy fills with a bordered, hand-stamped block-print
1929
- * feel. Reads as bold and handmade; suits expressive craft brands.
1930
- */
1931
- const inkStamp = defineButtonPersonality({
1932
- id: "ink-stamp",
1933
- name: "Ink Stamp",
1934
- description: "Hand-stamped block-print buttons with a slight lift on hover.",
1935
- tags: {
1936
- tone: "bold",
1937
- energy: "vibrant",
1938
- motion: "standard",
1939
- era: "organic"
1940
- },
1941
- buttonSystem: {
1942
- global: {
1943
- cornerStyle: "rounded",
1944
- textTransform: "uppercase",
1945
- fontWeight: 600,
1954
+ fontWeight: 500,
1946
1955
  borderWidth: 1,
1947
1956
  hoverTransform: "none",
1948
- hoverColor: "none",
1949
- letterSpacing: "loose"
1950
- },
1951
- sizes: {
1952
- sm: {
1953
- padding: "0.5rem 1.25rem",
1954
- fontSize: "text-xs"
1955
- },
1956
- md: {
1957
- padding: "0.75rem 1.75rem",
1958
- fontSize: "text-sm"
1959
- },
1960
- lg: {
1961
- padding: "0.875rem 2.25rem",
1962
- fontSize: "text-base"
1963
- },
1964
- xl: {
1965
- padding: "1.125rem 2.75rem",
1966
- fontSize: "text-lg"
1967
- }
1957
+ hoverColor: "none"
1968
1958
  },
1969
- variants: [
1970
- {
1971
- id: "primary",
1972
- name: "Primary",
1973
- enabled: true,
1974
- priority: 1,
1975
- background: {
1976
- type: "solid",
1977
- colorToken: "primary"
1978
- },
1979
- borderRadius: "rounded-md",
1980
- effects: {
1981
- hover: [{
1982
- effectId: "drop-shadow",
1983
- options: { intensity: "medium" }
1984
- }, {
1985
- effectId: "scale-up",
1986
- options: { scale: "1.02" }
1987
- }],
1988
- active: [{
1989
- effectId: "scale-down",
1990
- options: { scale: "0.98" }
1991
- }]
1959
+ roles: {
1960
+ primary: {
1961
+ kind: "complete",
1962
+ appearance: {
1963
+ background: {
1964
+ type: "surface",
1965
+ role: "link"
1966
+ },
1967
+ borderRadius: "rounded-none",
1968
+ sizes: editorialSizes,
1969
+ effects: { base: [{
1970
+ effectId: "border-bottom-grow",
1971
+ options: {
1972
+ height: 2,
1973
+ colorToken: "text",
1974
+ origin: "left"
1975
+ }
1976
+ }] }
1992
1977
  }
1993
1978
  },
1994
- {
1995
- id: "secondary",
1996
- name: "Secondary",
1997
- enabled: true,
1998
- priority: 2,
1999
- background: {
2000
- type: "surface",
2001
- role: "link"
2002
- },
2003
- borderRadius: "rounded-md",
2004
- border: { widthClass: "border-2" },
2005
- effects: { hover: [{
2006
- effectId: "background-on-hover",
2007
- options: { colorToken: "surface" }
2008
- }] }
2009
- },
2010
- {
2011
- id: "outline",
2012
- name: "Outline",
2013
- enabled: true,
2014
- priority: 3,
2015
- background: {
2016
- type: "surface",
2017
- role: "link"
2018
- },
2019
- borderRadius: "rounded-md",
2020
- border: { widthClass: "border-2" },
2021
- effects: { hover: [{
2022
- effectId: "background-on-hover",
2023
- options: { colorToken: "surface" }
2024
- }] }
2025
- },
2026
- {
2027
- id: "ghost",
2028
- name: "Ghost",
2029
- enabled: true,
2030
- priority: 3,
2031
- background: {
2032
- type: "surface",
2033
- role: "link"
2034
- },
2035
- borderRadius: "rounded-none",
2036
- sizes: {
2037
- sm: {
2038
- padding: "0.375rem 0",
2039
- fontSize: "text-xs"
1979
+ secondary: {
1980
+ kind: "complete",
1981
+ appearance: {
1982
+ background: {
1983
+ type: "surface",
1984
+ role: "link"
2040
1985
  },
2041
- md: {
2042
- padding: "0.5rem 0",
2043
- fontSize: "text-sm"
1986
+ borderRadius: "rounded-none",
1987
+ sizes: editorialSizes,
1988
+ effects: { base: [{
1989
+ effectId: "border-bottom-grow",
1990
+ options: {
1991
+ height: 1,
1992
+ colorToken: "mutedText",
1993
+ origin: "left"
1994
+ }
1995
+ }] }
1996
+ }
1997
+ },
1998
+ outline: {
1999
+ kind: "complete",
2000
+ appearance: {
2001
+ background: {
2002
+ type: "surface",
2003
+ role: "link"
2044
2004
  },
2045
- lg: {
2046
- padding: "0.625rem 0",
2047
- fontSize: "text-base"
2005
+ borderRadius: "rounded-none",
2006
+ sizes: editorialSizes,
2007
+ effects: { base: [{
2008
+ effectId: "border-bottom-grow",
2009
+ options: {
2010
+ height: 1,
2011
+ colorToken: "accent",
2012
+ origin: "left"
2013
+ }
2014
+ }] }
2015
+ }
2016
+ },
2017
+ ghost: {
2018
+ kind: "complete",
2019
+ appearance: {
2020
+ background: {
2021
+ type: "surface",
2022
+ role: "link"
2048
2023
  },
2049
- xl: {
2050
- padding: "0.75rem 0",
2051
- fontSize: "text-lg"
2052
- }
2053
- },
2054
- effects: { base: [{
2024
+ borderRadius: "rounded-none",
2025
+ sizes: editorialSizes
2026
+ }
2027
+ },
2028
+ accent: {
2029
+ kind: "derive",
2030
+ from: "primary",
2031
+ overrides: { effects: { base: [{
2055
2032
  effectId: "border-bottom-grow",
2056
2033
  options: {
2057
- height: 1,
2034
+ height: 2,
2058
2035
  colorToken: "accent",
2059
2036
  origin: "left"
2060
2037
  }
2061
- }] }
2038
+ }] } }
2062
2039
  }
2063
- ]
2040
+ }
2064
2041
  }
2065
2042
  });
2066
- //#endregion
2067
- //#region ../theme-core/src/buttons/personalities/joy-stamp.ts
2068
- /**
2069
- * Joy Stamp — neo-brutalist pills with a hard, brand-coloured offset shadow
2070
- * that collapses as the button presses into it on hover. Authored for the
2071
- * Original Joy site style: a cream "stamp" shadow under the solid primary, and
2072
- * a brown shadow under the cream outline. Reads as bold, warm, and handmade.
2073
- *
2074
- * The coloured offset shadow relies on the per-variant `shadow.colorToken`
2075
- * extension; the press is the shared `press-down` effect, which matches its
2076
- * translate to each variant's own shadow offset.
2077
- */
2078
- const joyStamp = defineButtonPersonality({
2079
- id: "joy-stamp",
2080
- name: "Joy Stamp",
2081
- description: "Pill buttons with a hard, brand-coloured offset shadow that presses in on hover.",
2043
+ const pebbleRecipe = defineStaticButtonStyleRecipe({
2044
+ id: "pebble",
2045
+ accessibilityLabel: "Generously padded pill buttons",
2082
2046
  tags: {
2083
- tone: "bold",
2084
- energy: "vibrant",
2085
- motion: "expressive",
2047
+ tone: "classic",
2048
+ energy: "calm",
2049
+ motion: "standard",
2086
2050
  era: "organic"
2087
2051
  },
2088
- buttonSystem: {
2052
+ system: {
2089
2053
  global: {
2090
2054
  cornerStyle: "pill",
2091
- shadow: "high",
2092
2055
  textTransform: "none",
2093
- typography: "heading",
2094
- fontWeight: 700,
2095
- fontSize: "text-lg",
2056
+ fontWeight: 500,
2096
2057
  borderWidth: 2,
2097
2058
  hoverTransform: "none",
2098
2059
  hoverColor: "none"
2099
2060
  },
2100
2061
  sizes: {
2101
2062
  sm: {
2102
- padding: "0.625rem 1.25rem",
2103
- fontSize: "text-base"
2104
- },
2105
- md: {
2106
- padding: "0.875rem 1.75rem",
2107
- fontSize: "text-lg"
2063
+ padding: "0.625rem 1.75rem",
2064
+ fontSize: "text-sm"
2108
2065
  },
2066
+ md: { padding: "0.875rem 2.25rem" },
2109
2067
  lg: {
2110
- padding: "1.125rem 2.25rem",
2111
- fontSize: "text-xl"
2068
+ padding: "1.125rem 2.75rem",
2069
+ fontSize: "text-lg"
2112
2070
  },
2113
2071
  xl: {
2114
- padding: "1.25rem 2.75rem",
2115
- fontSize: "text-2xl"
2072
+ padding: "1.5rem 3.5rem",
2073
+ fontSize: "text-xl"
2116
2074
  }
2117
2075
  },
2118
- variants: [{
2119
- id: "primary",
2120
- name: "Primary",
2121
- enabled: true,
2122
- priority: 1,
2123
- background: {
2124
- type: "solid",
2125
- colorToken: "primary"
2076
+ roles: {
2077
+ primary: {
2078
+ kind: "complete",
2079
+ appearance: {
2080
+ background: {
2081
+ type: "solid",
2082
+ colorToken: "primary"
2083
+ },
2084
+ borderRadius: "rounded-full",
2085
+ effects: { hover: [{
2086
+ effectId: "darken-background",
2087
+ options: { amount: 100 }
2088
+ }] }
2089
+ }
2126
2090
  },
2127
- borderRadius: "rounded-full",
2128
- shadow: {
2129
- elevation: "high",
2130
- softness: "hard",
2131
- position: "bottom-right",
2132
- colorToken: "text"
2091
+ secondary: {
2092
+ kind: "complete",
2093
+ appearance: {
2094
+ background: {
2095
+ type: "surface",
2096
+ role: "link"
2097
+ },
2098
+ borderRadius: "rounded-full",
2099
+ border: { widthClass: "border-2" },
2100
+ effects: { hover: [{
2101
+ effectId: "background-on-hover",
2102
+ options: { colorToken: "accent" }
2103
+ }] }
2104
+ }
2133
2105
  },
2134
- effects: { hover: [{ effectId: "press-down" }] }
2135
- }, {
2136
- id: "secondary",
2137
- name: "Secondary",
2138
- enabled: true,
2139
- priority: 2,
2140
- background: {
2141
- type: "surface",
2142
- role: "link"
2106
+ outline: {
2107
+ kind: "complete",
2108
+ appearance: {
2109
+ background: {
2110
+ type: "surface",
2111
+ role: "link"
2112
+ },
2113
+ borderRadius: "rounded-full",
2114
+ border: { widthClass: "border" },
2115
+ effects: { hover: [{
2116
+ effectId: "background-on-hover",
2117
+ options: { colorToken: "surface" }
2118
+ }] }
2119
+ }
2143
2120
  },
2144
- borderRadius: "rounded-full",
2145
- border: { widthClass: "border-2" },
2146
- shadow: {
2147
- elevation: "high",
2148
- softness: "hard",
2149
- position: "bottom-right",
2150
- colorToken: "secondary"
2121
+ ghost: {
2122
+ kind: "complete",
2123
+ appearance: {
2124
+ background: {
2125
+ type: "surface",
2126
+ role: "link"
2127
+ },
2128
+ borderRadius: "rounded-full",
2129
+ sizes: {
2130
+ sm: {
2131
+ padding: "0.375rem 0.875rem",
2132
+ fontSize: "text-sm"
2133
+ },
2134
+ md: { padding: "0.5rem 1rem" },
2135
+ lg: {
2136
+ padding: "0.625rem 1.25rem",
2137
+ fontSize: "text-lg"
2138
+ },
2139
+ xl: {
2140
+ padding: "0.75rem 1.5rem",
2141
+ fontSize: "text-xl"
2142
+ }
2143
+ }
2144
+ }
2151
2145
  },
2152
- effects: { hover: [{ effectId: "press-down" }] }
2153
- }]
2146
+ accent: {
2147
+ kind: "derive",
2148
+ from: "primary",
2149
+ overrides: { background: {
2150
+ type: "solid",
2151
+ colorToken: "accent"
2152
+ } }
2153
+ }
2154
+ }
2154
2155
  }
2155
2156
  });
2156
- //#endregion
2157
- //#region ../theme-core/src/buttons/personalities/ornate-ritual.ts
2158
- /**
2159
- * Ornate Ritual — framed, ceremonial buttons with jewel-toned fills and
2160
- * deliberate spacing. Designed for music, ceremony, and soulful event sites.
2161
- */
2162
- const ornateRitual = defineButtonPersonality({
2163
- id: "ornate-ritual",
2164
- name: "Ornate Ritual",
2165
- description: "Ceremonial framed buttons with jewel-toned fills and quiet color-change hover states.",
2157
+ const brushedWashRecipe = defineStaticButtonStyleRecipe({
2158
+ id: "brushed-wash",
2159
+ accessibilityLabel: "Generously padded gradient buttons with soft shadows",
2166
2160
  tags: {
2167
2161
  tone: "classic",
2168
2162
  energy: "vibrant",
2169
- motion: "subtle",
2163
+ motion: "standard",
2170
2164
  era: "organic"
2171
2165
  },
2172
- buttonSystem: {
2166
+ system: {
2173
2167
  global: {
2174
2168
  cornerStyle: "rounded",
2175
- textTransform: "uppercase",
2176
- fontWeight: 600,
2169
+ shadow: "low",
2170
+ textTransform: "none",
2171
+ fontWeight: 500,
2177
2172
  borderWidth: 1,
2178
2173
  hoverTransform: "none",
2179
- hoverColor: "none",
2180
- letterSpacing: "loose"
2174
+ hoverColor: "none"
2181
2175
  },
2182
2176
  sizes: {
2183
2177
  sm: {
2184
- padding: "0.5625rem 1.25rem",
2185
- fontSize: "text-xs"
2186
- },
2187
- md: {
2188
- padding: "0.75rem 1.75rem",
2189
- fontSize: "text-xs"
2178
+ padding: "0.75rem 2rem",
2179
+ fontSize: "text-sm"
2190
2180
  },
2181
+ md: { padding: "1rem 2.5rem" },
2191
2182
  lg: {
2192
- padding: "0.875rem 2.25rem",
2193
- fontSize: "text-sm"
2183
+ padding: "1.25rem 3rem",
2184
+ fontSize: "text-lg"
2194
2185
  },
2195
2186
  xl: {
2196
- padding: "1rem 2.75rem",
2197
- fontSize: "text-base"
2187
+ padding: "1.625rem 3.75rem",
2188
+ fontSize: "text-xl"
2198
2189
  }
2199
2190
  },
2200
- variants: [
2201
- {
2202
- id: "primary",
2203
- name: "Primary",
2204
- enabled: true,
2205
- priority: 1,
2206
- background: {
2207
- type: "solid",
2208
- colorToken: "primary"
2209
- },
2210
- borderRadius: "rounded-md",
2211
- border: { widthClass: "border" },
2212
- effects: {
2213
- hover: [{
2214
- effectId: "background-on-hover",
2215
- options: { colorToken: "primary-100" }
2216
- }],
2217
- active: [{
2218
- effectId: "scale-down",
2219
- options: { scale: "0.98" }
2220
- }]
2191
+ roles: {
2192
+ primary: {
2193
+ kind: "complete",
2194
+ appearance: {
2195
+ background: {
2196
+ type: "gradient",
2197
+ stops: ["primary", "accent"],
2198
+ direction: "to-r",
2199
+ foregroundToken: "primaryForeground"
2200
+ },
2201
+ borderRadius: "rounded-lg",
2202
+ shadow: {
2203
+ elevation: "low",
2204
+ softness: "soft",
2205
+ position: "bottom"
2206
+ }
2221
2207
  }
2222
2208
  },
2223
- {
2224
- id: "secondary",
2225
- name: "Secondary",
2226
- enabled: true,
2227
- priority: 2,
2228
- background: {
2229
- type: "solid",
2230
- colorToken: "secondary"
2231
- },
2232
- borderRadius: "rounded-md",
2233
- border: { widthClass: "border" },
2234
- effects: { hover: [{
2235
- effectId: "background-on-hover",
2236
- options: { colorToken: "surface" }
2237
- }] }
2238
- },
2239
- {
2240
- id: "outline",
2241
- name: "Outline",
2242
- enabled: true,
2243
- priority: 3,
2244
- background: {
2245
- type: "surface",
2246
- role: "link"
2247
- },
2248
- borderRadius: "rounded-md",
2249
- border: { widthClass: "border" },
2250
- effects: { hover: [{
2251
- effectId: "background-on-hover",
2252
- options: { colorToken: "muted" }
2253
- }] }
2254
- },
2255
- {
2256
- id: "ghost",
2257
- name: "Ghost",
2258
- enabled: true,
2259
- priority: 3,
2260
- background: {
2261
- type: "surface",
2262
- role: "link"
2263
- },
2264
- borderRadius: "rounded-none",
2265
- sizes: {
2266
- sm: {
2267
- padding: "0.375rem 0",
2268
- fontSize: "text-xs"
2209
+ secondary: {
2210
+ kind: "complete",
2211
+ appearance: {
2212
+ background: {
2213
+ type: "gradient",
2214
+ stops: ["secondary", "accent"],
2215
+ direction: "to-br",
2216
+ foregroundToken: "primaryForeground"
2269
2217
  },
2270
- md: {
2271
- padding: "0.5rem 0",
2272
- fontSize: "text-sm"
2218
+ borderRadius: "rounded-lg",
2219
+ shadow: {
2220
+ elevation: "low",
2221
+ softness: "soft",
2222
+ position: "bottom"
2223
+ }
2224
+ }
2225
+ },
2226
+ outline: {
2227
+ kind: "complete",
2228
+ appearance: {
2229
+ background: {
2230
+ type: "surface",
2231
+ role: "link"
2273
2232
  },
2274
- lg: {
2275
- padding: "0.625rem 0",
2276
- fontSize: "text-base"
2233
+ borderRadius: "rounded-lg",
2234
+ border: { widthClass: "border" },
2235
+ effects: { hover: [{
2236
+ effectId: "background-on-hover",
2237
+ options: { colorToken: "surface" }
2238
+ }] }
2239
+ }
2240
+ },
2241
+ ghost: {
2242
+ kind: "complete",
2243
+ appearance: {
2244
+ background: {
2245
+ type: "surface",
2246
+ role: "link"
2277
2247
  },
2278
- xl: {
2279
- padding: "0.75rem 0",
2280
- fontSize: "text-lg"
2281
- }
2282
- },
2283
- effects: { base: [{
2284
- effectId: "border-bottom-grow",
2285
- options: {
2286
- height: 1,
2287
- colorToken: "accent",
2288
- origin: "left"
2289
- }
2290
- }] }
2248
+ borderRadius: "rounded-lg",
2249
+ effects: { hover: [{
2250
+ effectId: "background-on-hover",
2251
+ options: { colorToken: "surface" }
2252
+ }] }
2253
+ }
2254
+ },
2255
+ accent: {
2256
+ kind: "derive",
2257
+ from: "primary",
2258
+ overrides: { background: {
2259
+ type: "solid",
2260
+ colorToken: "accent"
2261
+ } }
2291
2262
  }
2292
- ]
2263
+ }
2293
2264
  }
2294
2265
  });
2295
- //#endregion
2296
- //#region ../theme-core/src/buttons/personalities/pebble.ts
2297
- /**
2298
- * Pebble — large pill primaries with generous padding. Reads as spa-luxurious
2299
- * and natural; pairs well with wellness/yoga/dance brands.
2300
- */
2301
- const pebble = defineButtonPersonality({
2302
- id: "pebble",
2303
- name: "Pebble",
2304
- description: "Generous pill buttons with a quiet colour-softening hover.",
2266
+ const inkStampRecipe = defineStaticButtonStyleRecipe({
2267
+ id: "ink-stamp",
2268
+ accessibilityLabel: "Uppercase block-print buttons with a playful hover",
2305
2269
  tags: {
2306
- tone: "classic",
2307
- energy: "calm",
2270
+ tone: "bold",
2271
+ energy: "vibrant",
2308
2272
  motion: "standard",
2309
2273
  era: "organic"
2310
2274
  },
2311
- buttonSystem: {
2275
+ system: {
2312
2276
  global: {
2313
- cornerStyle: "pill",
2314
- textTransform: "none",
2315
- fontWeight: 500,
2316
- borderWidth: 2,
2277
+ cornerStyle: "rounded",
2278
+ textTransform: "uppercase",
2279
+ fontWeight: 600,
2280
+ borderWidth: 1,
2317
2281
  hoverTransform: "none",
2318
- hoverColor: "none"
2282
+ hoverColor: "none",
2283
+ letterSpacing: "loose"
2319
2284
  },
2320
2285
  sizes: {
2321
2286
  sm: {
2322
- padding: "0.625rem 1.75rem",
2287
+ padding: "0.5rem 1.25rem",
2288
+ fontSize: "text-xs"
2289
+ },
2290
+ md: {
2291
+ padding: "0.75rem 1.75rem",
2323
2292
  fontSize: "text-sm"
2324
2293
  },
2325
- md: { padding: "0.875rem 2.25rem" },
2326
2294
  lg: {
2327
- padding: "1.125rem 2.75rem",
2328
- fontSize: "text-lg"
2295
+ padding: "0.875rem 2.25rem",
2296
+ fontSize: "text-base"
2329
2297
  },
2330
2298
  xl: {
2331
- padding: "1.5rem 3.5rem",
2332
- fontSize: "text-xl"
2299
+ padding: "1.125rem 2.75rem",
2300
+ fontSize: "text-lg"
2333
2301
  }
2334
2302
  },
2335
- variants: [
2336
- {
2337
- id: "primary",
2338
- name: "Primary",
2339
- enabled: true,
2340
- priority: 1,
2341
- background: {
2342
- type: "solid",
2343
- colorToken: "primary"
2344
- },
2345
- borderRadius: "rounded-full",
2346
- effects: { hover: [{
2347
- effectId: "darken-background",
2348
- options: { amount: 100 }
2349
- }] }
2303
+ roles: {
2304
+ primary: {
2305
+ kind: "complete",
2306
+ appearance: {
2307
+ background: {
2308
+ type: "solid",
2309
+ colorToken: "primary"
2310
+ },
2311
+ borderRadius: "rounded-md",
2312
+ effects: {
2313
+ hover: [{
2314
+ effectId: "drop-shadow",
2315
+ options: { intensity: "medium" }
2316
+ }, {
2317
+ effectId: "scale-up",
2318
+ options: { scale: "1.02" }
2319
+ }],
2320
+ active: [{
2321
+ effectId: "scale-down",
2322
+ options: { scale: "0.98" }
2323
+ }]
2324
+ }
2325
+ }
2350
2326
  },
2351
- {
2352
- id: "secondary",
2353
- name: "Secondary",
2354
- enabled: true,
2355
- priority: 2,
2356
- background: {
2357
- type: "surface",
2358
- role: "link"
2359
- },
2360
- borderRadius: "rounded-full",
2361
- border: { widthClass: "border-2" },
2362
- effects: { hover: [{
2363
- effectId: "background-on-hover",
2364
- options: { colorToken: "accent" }
2365
- }] }
2327
+ secondary: {
2328
+ kind: "complete",
2329
+ appearance: {
2330
+ background: {
2331
+ type: "surface",
2332
+ role: "link"
2333
+ },
2334
+ borderRadius: "rounded-md",
2335
+ border: { widthClass: "border-2" },
2336
+ effects: { hover: [{
2337
+ effectId: "background-on-hover",
2338
+ options: { colorToken: "surface" }
2339
+ }] }
2340
+ }
2366
2341
  },
2367
- {
2368
- id: "outline",
2369
- name: "Outline",
2370
- enabled: true,
2371
- priority: 3,
2372
- background: {
2373
- type: "surface",
2374
- role: "link"
2375
- },
2376
- borderRadius: "rounded-full",
2377
- border: { widthClass: "border" },
2378
- effects: { hover: [{
2379
- effectId: "background-on-hover",
2380
- options: { colorToken: "surface" }
2381
- }] }
2342
+ outline: {
2343
+ kind: "complete",
2344
+ appearance: {
2345
+ background: {
2346
+ type: "surface",
2347
+ role: "link"
2348
+ },
2349
+ borderRadius: "rounded-md",
2350
+ border: { widthClass: "border-2" },
2351
+ effects: { hover: [{
2352
+ effectId: "background-on-hover",
2353
+ options: { colorToken: "surface" }
2354
+ }] }
2355
+ }
2382
2356
  },
2383
- {
2384
- id: "ghost",
2385
- name: "Ghost",
2386
- enabled: true,
2387
- priority: 3,
2388
- background: {
2389
- type: "surface",
2390
- role: "link"
2391
- },
2392
- borderRadius: "rounded-full",
2393
- sizes: {
2394
- sm: {
2395
- padding: "0.375rem 0.875rem",
2396
- fontSize: "text-sm"
2357
+ ghost: {
2358
+ kind: "complete",
2359
+ appearance: {
2360
+ background: {
2361
+ type: "surface",
2362
+ role: "link"
2397
2363
  },
2398
- md: { padding: "0.5rem 1rem" },
2399
- lg: {
2400
- padding: "0.625rem 1.25rem",
2401
- fontSize: "text-lg"
2364
+ borderRadius: "rounded-none",
2365
+ sizes: {
2366
+ sm: {
2367
+ padding: "0.375rem 0",
2368
+ fontSize: "text-xs"
2369
+ },
2370
+ md: {
2371
+ padding: "0.5rem 0",
2372
+ fontSize: "text-sm"
2373
+ },
2374
+ lg: {
2375
+ padding: "0.625rem 0",
2376
+ fontSize: "text-base"
2377
+ },
2378
+ xl: {
2379
+ padding: "0.75rem 0",
2380
+ fontSize: "text-lg"
2381
+ }
2402
2382
  },
2403
- xl: {
2404
- padding: "0.75rem 1.5rem",
2405
- fontSize: "text-xl"
2406
- }
2383
+ effects: { base: [{
2384
+ effectId: "border-bottom-grow",
2385
+ options: {
2386
+ height: 1,
2387
+ colorToken: "accent",
2388
+ origin: "left"
2389
+ }
2390
+ }] }
2407
2391
  }
2392
+ },
2393
+ accent: {
2394
+ kind: "derive",
2395
+ from: "primary",
2396
+ overrides: { background: {
2397
+ type: "solid",
2398
+ colorToken: "accent"
2399
+ } }
2408
2400
  }
2409
- ]
2401
+ }
2410
2402
  }
2411
2403
  });
2412
- //#endregion
2413
- //#region ../theme-core/src/buttons/personalities/quiet-arrow.ts
2414
- /**
2415
- * Quiet Arrow — wide, flat editorial buttons for grounded service businesses.
2416
- * Primary and secondary keep stable semantic colours; surrounding surfaces are
2417
- * responsible for contrast rather than reversing the button roles.
2418
- */
2419
- const quietArrow = defineButtonPersonality({
2420
- id: "quiet-arrow",
2421
- name: "Quiet Arrow",
2422
- description: "Wide, flat arrow buttons with a solid primary and a primary-colour outlined secondary.",
2404
+ const flatInkRecipe = defineStaticButtonStyleRecipe({
2405
+ id: "flat-ink",
2406
+ accessibilityLabel: "Flat rounded buttons with arrow affordances",
2423
2407
  tags: {
2424
2408
  tone: "classic",
2425
2409
  energy: "calm",
2426
2410
  motion: "subtle",
2427
2411
  era: "editorial"
2428
2412
  },
2429
- buttonSystem: {
2413
+ system: {
2430
2414
  global: {
2431
2415
  cornerStyle: "rounded",
2432
- textTransform: "uppercase",
2433
- fontWeight: 500,
2416
+ textTransform: "none",
2417
+ fontWeight: 600,
2434
2418
  borderWidth: 1,
2435
2419
  typography: "body",
2436
- fontSize: "text-sm",
2437
- letterSpacing: "loose",
2438
- hoverTransform: "none",
2420
+ letterSpacing: "tight",
2421
+ paddingPreset: "default",
2422
+ hoverTransform: "lift",
2439
2423
  hoverColor: "none"
2440
2424
  },
2441
2425
  sizes: {
2442
2426
  sm: {
2443
- padding: "0.625rem 1.25rem",
2444
- fontSize: "text-xs"
2445
- },
2446
- md: {
2447
- padding: "0.8125rem 1.75rem",
2427
+ padding: "0.625rem 1.125rem",
2448
2428
  fontSize: "text-sm"
2449
2429
  },
2430
+ md: { padding: "0.8125rem 1.375rem" },
2450
2431
  lg: {
2451
- padding: "0.9375rem 2.125rem",
2452
- fontSize: "text-sm"
2432
+ padding: "0.9375rem 1.625rem",
2433
+ fontSize: "text-lg"
2453
2434
  },
2454
2435
  xl: {
2455
- padding: "1.0625rem 2.5rem",
2456
- fontSize: "text-base"
2436
+ padding: "1.0625rem 2rem",
2437
+ fontSize: "text-xl"
2457
2438
  }
2458
2439
  },
2459
- variants: [
2460
- {
2461
- id: "primary",
2462
- name: "Primary",
2463
- enabled: true,
2464
- priority: 1,
2465
- background: {
2466
- type: "solid",
2467
- colorToken: "primary"
2468
- },
2469
- borderRadius: "rounded-xl",
2470
- affordance: { iconId: "ArrowRight" },
2471
- effects: { hover: [{
2472
- effectId: "darken-background",
2473
- options: { amount: 100 }
2474
- }] }
2440
+ roles: {
2441
+ primary: {
2442
+ kind: "complete",
2443
+ appearance: {
2444
+ background: {
2445
+ type: "solid",
2446
+ colorToken: "primary"
2447
+ },
2448
+ borderRadius: "rounded-lg",
2449
+ affordance: { iconId: "ArrowRight" },
2450
+ effects: { hover: [{
2451
+ effectId: "lift",
2452
+ options: { translateY: "-2px" }
2453
+ }, {
2454
+ effectId: "background-on-hover",
2455
+ options: { colorToken: "secondary" }
2456
+ }] }
2457
+ }
2475
2458
  },
2476
- {
2477
- id: "secondary",
2478
- name: "Secondary",
2479
- enabled: true,
2480
- priority: 2,
2481
- background: {
2482
- type: "surface",
2483
- role: "link"
2484
- },
2485
- borderRadius: "rounded-xl",
2486
- border: { widthClass: "border" },
2487
- affordance: { iconId: "ArrowRight" },
2488
- effects: { hover: [{
2489
- effectId: "background-on-hover",
2490
- options: { colorToken: "surfaceAlt" }
2491
- }] }
2459
+ secondary: {
2460
+ kind: "complete",
2461
+ appearance: {
2462
+ background: {
2463
+ type: "surface",
2464
+ role: "link"
2465
+ },
2466
+ borderRadius: "rounded-lg",
2467
+ border: { widthClass: "border" },
2468
+ effects: { hover: [{
2469
+ effectId: "lift",
2470
+ options: { translateY: "-2px" }
2471
+ }, {
2472
+ effectId: "background-on-hover",
2473
+ options: { colorToken: "surfaceAlt" }
2474
+ }] }
2475
+ }
2492
2476
  },
2493
- {
2494
- id: "outline",
2495
- name: "Outline",
2496
- enabled: true,
2497
- priority: 3,
2498
- background: {
2499
- type: "surface",
2500
- role: "link"
2501
- },
2502
- borderRadius: "rounded-xl",
2503
- border: { widthClass: "border" }
2477
+ outline: {
2478
+ kind: "complete",
2479
+ appearance: {
2480
+ background: {
2481
+ type: "surface",
2482
+ role: "link"
2483
+ },
2484
+ borderRadius: "rounded-lg",
2485
+ border: { widthClass: "border" },
2486
+ effects: { hover: [{
2487
+ effectId: "lift",
2488
+ options: { translateY: "-2px" }
2489
+ }, {
2490
+ effectId: "background-on-hover",
2491
+ options: { colorToken: "surfaceAlt" }
2492
+ }] }
2493
+ }
2504
2494
  },
2505
- {
2506
- id: "ghost",
2507
- name: "Ghost",
2508
- enabled: true,
2509
- priority: 3,
2510
- background: {
2511
- type: "surface",
2512
- role: "link"
2513
- },
2514
- borderRadius: "rounded-xl"
2495
+ ghost: {
2496
+ kind: "complete",
2497
+ appearance: {
2498
+ background: {
2499
+ type: "surface",
2500
+ role: "link"
2501
+ },
2502
+ borderRadius: "rounded-lg",
2503
+ effects: { hover: [{
2504
+ effectId: "lift",
2505
+ options: { translateY: "-2px" }
2506
+ }] }
2507
+ }
2508
+ },
2509
+ accent: {
2510
+ kind: "complete",
2511
+ appearance: {
2512
+ background: {
2513
+ type: "solid",
2514
+ colorToken: "accent"
2515
+ },
2516
+ borderRadius: "rounded-lg",
2517
+ affordance: { iconId: "ArrowRight" },
2518
+ effects: { hover: [{
2519
+ effectId: "lift",
2520
+ options: { translateY: "-2px" }
2521
+ }] }
2522
+ }
2515
2523
  }
2516
- ]
2524
+ }
2517
2525
  }
2518
2526
  });
2519
- //#endregion
2520
- //#region ../theme-core/src/buttons/personalities/showtime-pill.ts
2521
- /**
2522
- * Showtime Pill — bold, spacious, fully rounded buttons with playful pop
2523
- * motion. Suits energetic schools, performers, festivals, and community brands
2524
- * that need calls to action to feel loud without becoming visually chaotic.
2525
- */
2526
- const showtimePill = defineButtonPersonality({
2527
+ const showtimePillRecipe = defineStaticButtonStyleRecipe({
2527
2528
  id: "showtime-pill",
2528
- name: "Showtime Pill",
2529
- description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
2529
+ accessibilityLabel: "Bold uppercase pill buttons with playful movement",
2530
2530
  tags: {
2531
2531
  tone: "bold",
2532
2532
  energy: "vibrant",
2533
2533
  motion: "expressive",
2534
2534
  era: "modern"
2535
2535
  },
2536
- buttonSystem: {
2536
+ system: {
2537
2537
  global: {
2538
2538
  cornerStyle: "pill",
2539
2539
  shadow: "low",
@@ -2564,272 +2564,376 @@ const showtimePill = defineButtonPersonality({
2564
2564
  fontSize: "1.125rem"
2565
2565
  }
2566
2566
  },
2567
- variants: [
2568
- {
2569
- id: "primary",
2570
- name: "Primary",
2571
- enabled: true,
2572
- priority: 1,
2573
- background: {
2574
- type: "solid",
2575
- colorToken: "primary"
2576
- },
2577
- borderRadius: "rounded-full",
2578
- effects: { hover: [{ effectId: "pop" }] }
2579
- },
2580
- {
2581
- id: "secondary",
2582
- name: "Secondary",
2583
- enabled: true,
2584
- priority: 2,
2585
- background: {
2586
- type: "surface",
2587
- role: "link"
2588
- },
2589
- borderRadius: "rounded-full",
2590
- border: { widthClass: "border-2" },
2591
- effects: { hover: [{ effectId: "pop" }] }
2567
+ roles: {
2568
+ primary: {
2569
+ kind: "complete",
2570
+ appearance: {
2571
+ background: {
2572
+ type: "solid",
2573
+ colorToken: "primary"
2574
+ },
2575
+ borderRadius: "rounded-full",
2576
+ effects: { hover: [{ effectId: "pop" }] }
2577
+ }
2592
2578
  },
2593
- {
2594
- id: "hero",
2595
- name: "Hero",
2596
- enabled: true,
2597
- priority: 1,
2598
- background: {
2599
- type: "solid",
2600
- colorToken: "secondary"
2601
- },
2602
- borderRadius: "rounded-full",
2603
- effects: { hover: [{ effectId: "pop" }] }
2579
+ secondary: {
2580
+ kind: "complete",
2581
+ appearance: {
2582
+ background: {
2583
+ type: "surface",
2584
+ role: "link"
2585
+ },
2586
+ borderRadius: "rounded-full",
2587
+ border: { widthClass: "border-2" },
2588
+ effects: { hover: [{ effectId: "pop" }] }
2589
+ }
2604
2590
  },
2605
- {
2606
- id: "header",
2607
- name: "Header",
2608
- enabled: true,
2609
- priority: 2,
2610
- background: {
2611
- type: "solid",
2612
- colorToken: "background"
2613
- },
2614
- borderRadius: "rounded-full",
2615
- border: { widthClass: "border-2" },
2616
- effects: { hover: [{
2617
- effectId: "background-on-hover",
2618
- options: { colorToken: "surface" }
2619
- }] }
2591
+ outline: {
2592
+ kind: "complete",
2593
+ appearance: {
2594
+ background: {
2595
+ type: "surface",
2596
+ role: "link"
2597
+ },
2598
+ borderRadius: "rounded-full",
2599
+ border: { widthClass: "border-2" },
2600
+ effects: { hover: [{
2601
+ effectId: "background-on-hover",
2602
+ options: { colorToken: "background" }
2603
+ }] }
2604
+ }
2620
2605
  },
2621
- {
2622
- id: "outline",
2623
- name: "Outline",
2624
- enabled: true,
2625
- priority: 3,
2626
- background: {
2627
- type: "surface",
2628
- role: "link"
2629
- },
2630
- borderRadius: "rounded-full",
2631
- border: { widthClass: "border-2" },
2632
- effects: { hover: [{
2633
- effectId: "background-on-hover",
2634
- options: { colorToken: "background" }
2635
- }] }
2606
+ ghost: {
2607
+ kind: "complete",
2608
+ appearance: {
2609
+ background: {
2610
+ type: "surface",
2611
+ role: "link"
2612
+ },
2613
+ borderRadius: "rounded-full",
2614
+ effects: { hover: [{
2615
+ effectId: "background-on-hover",
2616
+ options: { colorToken: "surface" }
2617
+ }] }
2618
+ }
2636
2619
  },
2637
- {
2638
- id: "ghost",
2639
- name: "Ghost",
2640
- enabled: true,
2641
- priority: 3,
2642
- background: {
2643
- type: "surface",
2644
- role: "link"
2645
- },
2646
- borderRadius: "rounded-full",
2647
- effects: { hover: [{
2648
- effectId: "background-on-hover",
2649
- options: { colorToken: "surface" }
2650
- }] }
2620
+ accent: {
2621
+ kind: "complete",
2622
+ appearance: {
2623
+ background: {
2624
+ type: "solid",
2625
+ colorToken: "secondary"
2626
+ },
2627
+ borderRadius: "rounded-full",
2628
+ effects: { hover: [{ effectId: "pop" }] }
2629
+ }
2651
2630
  }
2652
- ]
2631
+ }
2653
2632
  }
2654
2633
  });
2655
- //#endregion
2656
- //#region ../theme-core/src/buttons/personalities/soft-pill.ts
2657
- /**
2658
- * Soft Pill — rounded-full pill buttons with a hover lift. The default for
2659
- * Calm Studio and Modern Wellness; reads as quietly modern and welcoming.
2660
- */
2661
- const softPill = defineButtonPersonality({
2662
- id: "soft-pill",
2663
- name: "Soft Pill",
2664
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
2634
+ const joyStampRecipe = defineStaticButtonStyleRecipe({
2635
+ id: "joy-stamp",
2636
+ accessibilityLabel: "Bold pill buttons with a hard offset shadow",
2665
2637
  tags: {
2666
- tone: "classic",
2667
- energy: "calm",
2668
- motion: "subtle",
2638
+ tone: "bold",
2639
+ energy: "vibrant",
2640
+ motion: "expressive",
2669
2641
  era: "organic"
2670
2642
  },
2671
- buttonSystem: {
2643
+ system: {
2672
2644
  global: {
2673
2645
  cornerStyle: "pill",
2674
- shadow: "low",
2646
+ shadow: "high",
2675
2647
  textTransform: "none",
2676
- fontWeight: 500,
2648
+ typography: "heading",
2649
+ fontWeight: 700,
2650
+ fontSize: "text-lg",
2677
2651
  borderWidth: 2,
2678
- hoverTransform: "lift",
2652
+ hoverTransform: "none",
2679
2653
  hoverColor: "none"
2680
2654
  },
2681
- variants: [
2682
- {
2683
- id: "primary",
2684
- name: "Primary",
2685
- enabled: true,
2686
- priority: 1,
2687
- background: {
2688
- type: "solid",
2689
- colorToken: "primary"
2690
- },
2691
- borderRadius: "rounded-full",
2692
- shadow: {
2693
- elevation: "low",
2694
- softness: "soft",
2695
- position: "bottom"
2696
- },
2697
- effects: {
2698
- hover: [{
2699
- effectId: "lift",
2700
- options: { translateY: "-1px" }
2701
- }],
2702
- active: [{
2703
- effectId: "scale-down",
2704
- options: { scale: "0.98" }
2705
- }]
2655
+ sizes: {
2656
+ sm: {
2657
+ padding: "0.625rem 1.25rem",
2658
+ fontSize: "text-base"
2659
+ },
2660
+ md: {
2661
+ padding: "0.875rem 1.75rem",
2662
+ fontSize: "text-lg"
2663
+ },
2664
+ lg: {
2665
+ padding: "1.125rem 2.25rem",
2666
+ fontSize: "text-xl"
2667
+ },
2668
+ xl: {
2669
+ padding: "1.25rem 2.75rem",
2670
+ fontSize: "text-2xl"
2671
+ }
2672
+ },
2673
+ roles: {
2674
+ primary: {
2675
+ kind: "complete",
2676
+ appearance: {
2677
+ background: {
2678
+ type: "solid",
2679
+ colorToken: "primary"
2680
+ },
2681
+ borderRadius: "rounded-full",
2682
+ shadow: {
2683
+ elevation: "high",
2684
+ softness: "hard",
2685
+ position: "bottom-right",
2686
+ colorToken: "text"
2687
+ },
2688
+ effects: { hover: [{ effectId: "press-down" }] }
2689
+ }
2690
+ },
2691
+ secondary: {
2692
+ kind: "complete",
2693
+ appearance: {
2694
+ background: {
2695
+ type: "surface",
2696
+ role: "link"
2697
+ },
2698
+ borderRadius: "rounded-full",
2699
+ border: { widthClass: "border-2" },
2700
+ shadow: {
2701
+ elevation: "high",
2702
+ softness: "hard",
2703
+ position: "bottom-right",
2704
+ colorToken: "secondary"
2705
+ },
2706
+ effects: { hover: [{ effectId: "press-down" }] }
2707
+ }
2708
+ },
2709
+ outline: {
2710
+ kind: "derive",
2711
+ from: "secondary"
2712
+ },
2713
+ ghost: {
2714
+ kind: "complete",
2715
+ appearance: {
2716
+ background: {
2717
+ type: "surface",
2718
+ role: "link"
2719
+ },
2720
+ borderRadius: "rounded-full",
2721
+ effects: { hover: [{ effectId: "press-down" }] }
2722
+ }
2723
+ },
2724
+ accent: {
2725
+ kind: "derive",
2726
+ from: "primary",
2727
+ overrides: { background: {
2728
+ type: "solid",
2729
+ colorToken: "accent"
2730
+ } }
2731
+ }
2732
+ }
2733
+ }
2734
+ });
2735
+ const ornateRitualRecipe = defineStaticButtonStyleRecipe({
2736
+ id: "ornate-ritual",
2737
+ accessibilityLabel: "Uppercase framed buttons with restrained movement",
2738
+ tags: {
2739
+ tone: "classic",
2740
+ energy: "vibrant",
2741
+ motion: "subtle",
2742
+ era: "organic"
2743
+ },
2744
+ system: {
2745
+ global: {
2746
+ cornerStyle: "rounded",
2747
+ textTransform: "uppercase",
2748
+ fontWeight: 600,
2749
+ borderWidth: 1,
2750
+ hoverTransform: "none",
2751
+ hoverColor: "none",
2752
+ letterSpacing: "loose"
2753
+ },
2754
+ sizes: {
2755
+ sm: {
2756
+ padding: "0.5625rem 1.25rem",
2757
+ fontSize: "text-xs"
2758
+ },
2759
+ md: {
2760
+ padding: "0.75rem 1.75rem",
2761
+ fontSize: "text-xs"
2762
+ },
2763
+ lg: {
2764
+ padding: "0.875rem 2.25rem",
2765
+ fontSize: "text-sm"
2766
+ },
2767
+ xl: {
2768
+ padding: "1rem 2.75rem",
2769
+ fontSize: "text-base"
2770
+ }
2771
+ },
2772
+ roles: {
2773
+ primary: {
2774
+ kind: "complete",
2775
+ appearance: {
2776
+ background: {
2777
+ type: "solid",
2778
+ colorToken: "primary"
2779
+ },
2780
+ borderRadius: "rounded-md",
2781
+ border: { widthClass: "border" },
2782
+ effects: {
2783
+ hover: [{
2784
+ effectId: "background-on-hover",
2785
+ options: { colorToken: "primary-100" }
2786
+ }],
2787
+ active: [{
2788
+ effectId: "scale-down",
2789
+ options: { scale: "0.98" }
2790
+ }]
2791
+ }
2706
2792
  }
2707
2793
  },
2708
- {
2709
- id: "secondary",
2710
- name: "Secondary",
2711
- enabled: true,
2712
- priority: 2,
2713
- background: {
2714
- type: "surface",
2715
- role: "link"
2716
- },
2717
- borderRadius: "rounded-full",
2718
- border: { widthClass: "border-2" },
2719
- effects: { hover: [{
2720
- effectId: "background-on-hover",
2721
- options: { colorToken: "surface" }
2722
- }] }
2794
+ secondary: {
2795
+ kind: "complete",
2796
+ appearance: {
2797
+ background: {
2798
+ type: "solid",
2799
+ colorToken: "secondary"
2800
+ },
2801
+ borderRadius: "rounded-md",
2802
+ border: { widthClass: "border" },
2803
+ effects: { hover: [{
2804
+ effectId: "background-on-hover",
2805
+ options: { colorToken: "surface" }
2806
+ }] }
2807
+ }
2723
2808
  },
2724
- {
2725
- id: "outline",
2726
- name: "Outline",
2727
- enabled: true,
2728
- priority: 3,
2729
- background: {
2730
- type: "surface",
2731
- role: "link"
2732
- },
2733
- borderRadius: "rounded-full",
2734
- border: { widthClass: "border" },
2735
- effects: { hover: [{
2736
- effectId: "background-on-hover",
2737
- options: { colorToken: "surface" }
2738
- }] }
2809
+ outline: {
2810
+ kind: "complete",
2811
+ appearance: {
2812
+ background: {
2813
+ type: "surface",
2814
+ role: "link"
2815
+ },
2816
+ borderRadius: "rounded-md",
2817
+ border: { widthClass: "border" },
2818
+ effects: { hover: [{
2819
+ effectId: "background-on-hover",
2820
+ options: { colorToken: "muted" }
2821
+ }] }
2822
+ }
2739
2823
  },
2740
- {
2741
- id: "ghost",
2742
- name: "Ghost",
2743
- enabled: true,
2744
- priority: 3,
2745
- background: {
2746
- type: "surface",
2747
- role: "link"
2748
- },
2749
- borderRadius: "rounded-full",
2750
- effects: { hover: [{
2751
- effectId: "background-on-hover",
2752
- options: { colorToken: "surface" }
2753
- }] }
2824
+ ghost: {
2825
+ kind: "complete",
2826
+ appearance: {
2827
+ background: {
2828
+ type: "surface",
2829
+ role: "link"
2830
+ },
2831
+ borderRadius: "rounded-none",
2832
+ sizes: {
2833
+ sm: {
2834
+ padding: "0.375rem 0",
2835
+ fontSize: "text-xs"
2836
+ },
2837
+ md: {
2838
+ padding: "0.5rem 0",
2839
+ fontSize: "text-sm"
2840
+ },
2841
+ lg: {
2842
+ padding: "0.625rem 0",
2843
+ fontSize: "text-base"
2844
+ },
2845
+ xl: {
2846
+ padding: "0.75rem 0",
2847
+ fontSize: "text-lg"
2848
+ }
2849
+ },
2850
+ effects: { base: [{
2851
+ effectId: "border-bottom-grow",
2852
+ options: {
2853
+ height: 1,
2854
+ colorToken: "accent",
2855
+ origin: "left"
2856
+ }
2857
+ }] }
2858
+ }
2859
+ },
2860
+ accent: {
2861
+ kind: "derive",
2862
+ from: "primary",
2863
+ overrides: { background: {
2864
+ type: "solid",
2865
+ colorToken: "accent"
2866
+ } }
2754
2867
  }
2755
- ]
2868
+ }
2756
2869
  }
2757
2870
  });
2758
2871
  //#endregion
2759
- //#region ../theme-core/src/buttons/personalities/two-tone-pill.ts
2760
- const solidSecondary = {
2761
- id: "secondary",
2762
- name: "Secondary",
2763
- enabled: true,
2764
- priority: 2,
2765
- background: {
2766
- type: "solid",
2767
- colorToken: unsafeAsOpaqueButtonColourToken("secondary")
2768
- },
2769
- borderRadius: "rounded-full",
2770
- shadow: {
2771
- elevation: "none",
2772
- softness: null,
2773
- position: "bottom"
2774
- },
2775
- effects: {
2776
- hover: [{
2777
- effectId: "background-on-hover-alpha",
2778
- options: {
2779
- colorToken: "secondary",
2780
- opacity: 88
2781
- }
2782
- }],
2783
- active: [{
2784
- effectId: "scale-down",
2785
- options: { scale: "0.98" }
2786
- }]
2787
- }
2788
- };
2789
- //#endregion
2790
- //#region ../theme-core/src/buttons/personalities/index.ts
2791
- const buttonPersonalities = [
2792
- softPill,
2793
- defineButtonPersonality({
2794
- id: "two-tone-pill",
2795
- name: "Two-tone Pill",
2796
- description: "Rounded pills with distinct solid primary and secondary brand colours.",
2797
- tags: softPill.tags,
2798
- buttonSystem: {
2799
- ...softPill.buttonSystem,
2800
- variants: softPill.buttonSystem.variants.map((variant) => variant.id === "secondary" ? solidSecondary : variant)
2801
- }
2802
- }),
2803
- earthPill,
2804
- confidentChip,
2805
- editorialLink,
2806
- pebble,
2807
- inkStamp,
2808
- flatInk,
2809
- brushedWash,
2810
- showtimePill,
2811
- joyStamp,
2812
- ornateRitual,
2813
- quietArrow
2872
+ //#region ../theme-core/src/buttons/styles/registry.ts
2873
+ const buttonStyleRecipes = [
2874
+ softPillRecipe,
2875
+ earthPillRecipe,
2876
+ confidentChipRecipe,
2877
+ editorialLinkRecipe,
2878
+ pebbleRecipe,
2879
+ inkStampRecipe,
2880
+ flatInkRecipe,
2881
+ brushedWashRecipe,
2882
+ showtimePillRecipe,
2883
+ joyStampRecipe,
2884
+ ornateRitualRecipe,
2885
+ quietArrowRecipe
2814
2886
  ];
2815
- new Map(buttonPersonalities.map((p) => [p.id, p]));
2816
- buttonPersonalities.map((personality) => ({
2817
- id: personality.id,
2818
- name: personality.name,
2819
- description: personality.description,
2820
- category: presetCategory(personality),
2821
- buttonSystem: personality.buttonSystem,
2822
- compatibility: {
2823
- ...personality.tags.tone ? { tones: [personality.tags.tone] } : {},
2824
- ...personality.tags.energy ? { energies: [personality.tags.energy] } : {}
2887
+ const recipesById = new Map(buttonStyleRecipes.map((recipe) => [recipe.id, recipe]));
2888
+ function findButtonStyleRecipe(id) {
2889
+ const recipe = recipesById.get(id);
2890
+ if (recipe === void 0) throw new Error(`Button style registry is missing known style ${id}`);
2891
+ return recipe;
2892
+ }
2893
+ function resolveButtonStyleSelection(selection) {
2894
+ switch (selection.styleId) {
2895
+ case "soft-pill": return resolveButtonStyleRecipe(softPillRecipe, selection.parameters);
2896
+ case "earth-pill": return resolveButtonStyleRecipe(earthPillRecipe, selection.parameters);
2897
+ case "confident-chip": return resolveButtonStyleRecipe(confidentChipRecipe, selection.parameters);
2898
+ case "editorial-link": return resolveButtonStyleRecipe(editorialLinkRecipe, selection.parameters);
2899
+ case "pebble": return resolveButtonStyleRecipe(pebbleRecipe, selection.parameters);
2900
+ case "ink-stamp": return resolveButtonStyleRecipe(inkStampRecipe, selection.parameters);
2901
+ case "flat-ink": return resolveButtonStyleRecipe(flatInkRecipe, selection.parameters);
2902
+ case "brushed-wash": return resolveButtonStyleRecipe(brushedWashRecipe, selection.parameters);
2903
+ case "showtime-pill": return resolveButtonStyleRecipe(showtimePillRecipe, selection.parameters);
2904
+ case "joy-stamp": return resolveButtonStyleRecipe(joyStampRecipe, selection.parameters);
2905
+ case "ornate-ritual": return resolveButtonStyleRecipe(ornateRitualRecipe, selection.parameters);
2906
+ case "quiet-arrow": return resolveButtonStyleRecipe(quietArrowRecipe, selection.parameters);
2825
2907
  }
2826
- }));
2827
- function presetCategory(personality) {
2828
- switch (personality.tags.era) {
2908
+ }
2909
+ function defaultButtonStyleSelectionFor(styleId) {
2910
+ return {
2911
+ styleId,
2912
+ parameters: findButtonStyleRecipe(styleId).defaultParameters
2913
+ };
2914
+ }
2915
+ 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");
2916
+ buttonStyleRecipes.map((recipe) => {
2917
+ const resolved = resolveButtonStyleSelection(defaultButtonStyleSelectionFor(recipe.id));
2918
+ if (resolved.kind === "error") throw new Error(`Invalid registered button style ${recipe.id}: ${resolved.error.issues.join(", ")}`);
2919
+ return {
2920
+ id: recipe.id,
2921
+ name: recipe.accessibilityLabel,
2922
+ description: recipe.accessibilityLabel,
2923
+ category: presetCategory(recipe),
2924
+ buttonSystem: resolved.buttonSystem,
2925
+ compatibility: {
2926
+ ...recipe.tags.tone ? { tones: [recipe.tags.tone] } : {},
2927
+ ...recipe.tags.energy ? { energies: [recipe.tags.energy] } : {}
2928
+ }
2929
+ };
2930
+ });
2931
+ function presetCategory(recipe) {
2932
+ switch (recipe.tags.era) {
2829
2933
  case "retro": return "retro";
2830
2934
  case "editorial": return "minimal";
2831
2935
  case "organic": return "artistic";
2832
- case "modern": return personality.tags.tone === "bold" ? "modern" : "technical";
2936
+ case "modern": return recipe.tags.tone === "bold" ? "modern" : "technical";
2833
2937
  case "technical": return "technical";
2834
2938
  case void 0: return "modern";
2835
2939
  }
@@ -5217,6 +5321,39 @@ const paletteValueKeySchema = z$1.string().transform((value, ctx) => {
5217
5321
  return z$1.NEVER;
5218
5322
  });
5219
5323
  //#endregion
5324
+ //#region ../theme-core/src/site-styles/styleTags.ts
5325
+ /**
5326
+ * Descriptive style-axis metadata for button personalities and palette
5327
+ * variants. Site Style picker shape is curated explicitly; these tags remain
5328
+ * for catalog audit, docs, and future discovery tooling.
5329
+ */
5330
+ const STYLE_AXIS_VALUES = {
5331
+ tone: [
5332
+ "minimal",
5333
+ "classic",
5334
+ "bold"
5335
+ ],
5336
+ energy: ["calm", "vibrant"],
5337
+ motion: [
5338
+ "subtle",
5339
+ "standard",
5340
+ "expressive"
5341
+ ],
5342
+ era: [
5343
+ "editorial",
5344
+ "modern",
5345
+ "organic",
5346
+ "technical",
5347
+ "retro"
5348
+ ]
5349
+ };
5350
+ const styleTagsSchema = z$1.object({
5351
+ tone: z$1.enum(STYLE_AXIS_VALUES.tone).optional(),
5352
+ energy: z$1.enum(STYLE_AXIS_VALUES.energy).optional(),
5353
+ motion: z$1.enum(STYLE_AXIS_VALUES.motion).optional(),
5354
+ era: z$1.enum(STYLE_AXIS_VALUES.era).optional()
5355
+ });
5356
+ //#endregion
5220
5357
  //#region ../theme-core/src/palette/curated/types.ts
5221
5358
  function asCuratedPaletteAuthoringKey(value) {
5222
5359
  if (value.length === 0) throw new Error("CuratedPaletteAuthoringKey must be a non-empty string");
@@ -8165,76 +8302,9 @@ function headerConfigurationKey(configuration) {
8165
8302
  function asFooterLookId(value) {
8166
8303
  return value;
8167
8304
  }
8168
- function asFooterLayoutId(value) {
8169
- return value;
8170
- }
8171
- function asFooterStyleId(value) {
8172
- return value;
8173
- }
8174
- const footerLayoutCatalog = defineExactCatalog()([
8175
- {
8176
- id: asFooterLayoutId("identity"),
8177
- label: "Identity",
8178
- description: "Logo, site text, address, and legal copy without relying on footer navigation."
8179
- },
8180
- {
8181
- id: asFooterLayoutId("centered"),
8182
- label: "Centered",
8183
- description: "A calm centered stack for identity, short copy, and optional compact navigation.",
8184
- maxRecommendedNavDensity: "sparse"
8185
- },
8186
- {
8187
- id: asFooterLayoutId("split"),
8188
- label: "Split",
8189
- description: "Navigation and brand signoff separated into a wider split footer.",
8190
- requiresFooterNav: true,
8191
- maxRecommendedNavDensity: "balanced"
8192
- },
8193
- {
8194
- id: asFooterLayoutId("columns"),
8195
- label: "Columns",
8196
- description: "Grouped footer navigation columns with a supporting bottom line.",
8197
- requiresFooterNav: true,
8198
- requiresFooterNavGroups: true
8199
- }
8200
- ]);
8201
- const footerStyleCatalog = defineExactCatalog()([
8202
- {
8203
- id: asFooterStyleId("quiet"),
8204
- label: "Quiet",
8205
- description: "Lightweight, practical footer treatment."
8206
- },
8207
- {
8208
- id: asFooterStyleId("calm"),
8209
- label: "Calm",
8210
- description: "Soft centered treatment with restrained dividers."
8211
- },
8212
- {
8213
- id: asFooterStyleId("editorial"),
8214
- label: "Editorial",
8215
- description: "Text-forward treatment with fine-line structure."
8216
- },
8217
- {
8218
- id: asFooterStyleId("brand-band"),
8219
- label: "Brand band",
8220
- description: "High-contrast brand treatment with a stronger bottom bar."
8221
- }
8222
- ]);
8223
- new Map(footerLayoutCatalog.map((layout) => [layout.id, layout]));
8224
- new Map(footerStyleCatalog.map((style) => [style.id, style]));
8225
- /**
8226
- * No-nav-safe identity footer: brand and legal/supporting copy carry the
8227
- * footer without implying missing navigation.
8228
- */
8229
- function identityQuietFooter(theme) {
8305
+ function quietFooterLinks(theme) {
8230
8306
  return {
8231
8307
  ...theme.footer,
8232
- variant: "simple",
8233
- maxWidth: "container",
8234
- background: {
8235
- type: "color",
8236
- color: "surface"
8237
- },
8238
8308
  navStyle: "minimal",
8239
8309
  navWeight: "regular",
8240
8310
  navColor: "text",
@@ -8247,285 +8317,38 @@ function identityQuietFooter(theme) {
8247
8317
  hoverColorToken: "primary",
8248
8318
  padding: "none",
8249
8319
  borderRadius: "none"
8250
- },
8251
- navLayout: {
8252
- layout: "inline-wrap",
8253
- align: "start",
8254
- gapX: "default",
8255
- gapY: "tight"
8256
- },
8257
- logo: {
8258
- showLogo: true,
8259
- showLogoText: true,
8260
- placement: "left",
8261
- size: "sm",
8262
- align: "start"
8263
- },
8264
- bottomBar: {
8265
- enabled: false,
8266
- fullBleed: false,
8267
- textAlign: "left",
8268
- paddingX: "default",
8269
- paddingY: "compact",
8270
- borderTop: { width: "none" }
8271
8320
  }
8272
8321
  };
8273
8322
  }
8274
- /**
8275
- * Back-compat alias for the previous default footer Look. It keeps existing
8276
- * persisted selections valid while staying hidden from the new layout/style UI.
8277
- */
8278
- function mutedGroundingFooter(theme) {
8279
- return {
8280
- ...identityQuietFooter(theme),
8281
- background: theme.footer.background,
8282
- navStyle: theme.footer.navStyle,
8283
- navColor: theme.footer.navColor,
8284
- navWeight: theme.footer.navWeight,
8285
- navLinkStyle: theme.footer.navLinkStyle,
8286
- bottomTextLinkStyle: theme.footer.bottomTextLinkStyle
8287
- };
8288
- }
8289
- /** Applies a high-contrast brand band with a darker full-bleed bottom bar. */
8290
- function brandTwoBandFooter(theme) {
8323
+ function emphasizedFooterLinks(theme) {
8291
8324
  return {
8292
8325
  ...theme.footer,
8293
- variant: "split",
8294
- maxWidth: "container",
8295
- background: {
8296
- type: "color",
8297
- color: "primary-800"
8298
- },
8299
8326
  navStyle: "minimal",
8300
8327
  navWeight: "medium",
8301
- navColor: "primaryForeground",
8302
- navLinkStyle: {
8303
- typography: "body",
8304
- fontWeight: "medium",
8305
- textTransform: "none",
8306
- italic: false,
8307
- colorToken: "primaryForeground",
8308
- hoverColorToken: "secondary",
8309
- padding: "none",
8310
- borderRadius: "none"
8311
- },
8312
- bottomTextLinkStyle: {
8313
- colorToken: "secondary",
8314
- decorationColorToken: "secondary"
8315
- },
8316
- navLayout: {
8317
- layout: "inline-wrap",
8318
- align: "start",
8319
- gapX: "default",
8320
- gapY: "tight"
8321
- },
8322
- logo: {
8323
- showLogo: true,
8324
- showLogoText: false,
8325
- placement: "left",
8326
- size: "sm",
8327
- align: "start"
8328
- },
8329
- bottomBar: {
8330
- enabled: true,
8331
- fullBleed: true,
8332
- background: {
8333
- type: "color",
8334
- color: "primary-900"
8335
- },
8336
- textColor: "primaryForeground",
8337
- textAlign: "center",
8338
- paddingX: "default",
8339
- paddingY: "compact",
8340
- borderTop: { width: "none" }
8341
- }
8342
- };
8343
- }
8344
- /**
8345
- * Centered stack on a softly tinted band: logo, inline nav, address, and a
8346
- * hairline-topped copyright line, all centered.
8347
- */
8348
- function centeredCalmFooter(theme) {
8349
- return {
8350
- ...theme.footer,
8351
- variant: "simple",
8352
- maxWidth: "container",
8353
- background: {
8354
- type: "color",
8355
- color: "surfaceAlt"
8356
- },
8357
- navStyle: "minimal",
8358
- navWeight: "regular",
8359
- navColor: "text",
8360
- navLinkStyle: {
8361
- typography: "body",
8362
- fontWeight: "regular",
8363
- textTransform: "none",
8364
- italic: false,
8365
- colorToken: "text",
8366
- hoverColorToken: "primary",
8367
- padding: "none",
8368
- borderRadius: "none"
8369
- },
8370
- navLayout: {
8371
- layout: "inline-wrap",
8372
- align: "center",
8373
- gapX: "relaxed",
8374
- gapY: "tight"
8375
- },
8376
- logo: {
8377
- showLogo: true,
8378
- showLogoText: false,
8379
- placement: "above",
8380
- size: "sm",
8381
- align: "center"
8382
- },
8383
- bottomBar: {
8384
- enabled: true,
8385
- fullBleed: false,
8386
- textAlign: "center",
8387
- paddingX: "default",
8388
- paddingY: "compact",
8389
- borderTop: { width: "thin" }
8390
- }
8391
- };
8392
- }
8393
- /** Editorial split footer: compact nav on one side, brand signoff on the other. */
8394
- function splitEditorialFooter(theme) {
8395
- return {
8396
- ...theme.footer,
8397
- variant: "split",
8398
- maxWidth: "container",
8399
- background: {
8400
- type: "color",
8401
- color: "surface"
8402
- },
8403
- navStyle: "minimal",
8404
- navWeight: "regular",
8405
- navColor: "text",
8406
- navLinkStyle: {
8407
- typography: "body",
8408
- fontWeight: "regular",
8409
- textTransform: "none",
8410
- italic: false,
8411
- colorToken: "text",
8412
- hoverColorToken: "primary",
8413
- padding: "none",
8414
- borderRadius: "none"
8415
- },
8416
- navLayout: {
8417
- layout: "inline-wrap",
8418
- align: "start",
8419
- gapX: "relaxed",
8420
- gapY: "tight"
8421
- },
8422
- logo: {
8423
- showLogo: true,
8424
- showLogoText: true,
8425
- placement: "right",
8426
- size: "sm",
8427
- align: "end"
8428
- },
8429
- bottomBar: {
8430
- enabled: true,
8431
- fullBleed: false,
8432
- textAlign: "left",
8433
- paddingX: "default",
8434
- paddingY: "compact",
8435
- borderTop: { width: "thin" }
8436
- }
8437
- };
8438
- }
8439
- /**
8440
- * Editorial columns: site name and supporting copy on the left, inline nav on
8441
- * the right, with a hairline-topped bottom line. Uses the footer block's
8442
- * columns layout.
8443
- */
8444
- function editorialColumnsFooter(theme) {
8445
- return {
8446
- ...theme.footer,
8447
- variant: "columns",
8448
- maxWidth: "container",
8449
- background: {
8450
- type: "color",
8451
- color: "surface"
8452
- },
8453
- navStyle: "minimal",
8454
- navWeight: "regular",
8455
8328
  navColor: "text",
8456
8329
  navLinkStyle: {
8457
8330
  typography: "body",
8458
- fontWeight: "regular",
8331
+ fontWeight: "medium",
8459
8332
  textTransform: "none",
8460
8333
  italic: false,
8461
8334
  colorToken: "text",
8462
8335
  hoverColorToken: "primary",
8463
8336
  padding: "none",
8464
8337
  borderRadius: "none"
8465
- },
8466
- logo: {
8467
- showLogo: true,
8468
- showLogoText: true,
8469
- placement: "left",
8470
- size: "sm",
8471
- align: "start"
8472
- },
8473
- bottomBar: {
8474
- enabled: true,
8475
- fullBleed: false,
8476
- textAlign: "center",
8477
- paddingX: "default",
8478
- paddingY: "compact",
8479
- borderTop: { width: "thin" }
8480
8338
  }
8481
8339
  };
8482
8340
  }
8483
- const footerLookCatalog = defineExactCatalog()([
8484
- {
8485
- id: asFooterLookId("footer-identity-quiet"),
8486
- label: "Identity footer",
8487
- layoutId: asFooterLayoutId("identity"),
8488
- styleId: asFooterStyleId("quiet"),
8489
- compile: identityQuietFooter
8490
- },
8491
- {
8492
- id: asFooterLookId("footer-muted-grounding"),
8493
- label: "Muted grounding footer",
8494
- layoutId: asFooterLayoutId("identity"),
8495
- styleId: asFooterStyleId("quiet"),
8496
- hiddenFromLayoutStyleControls: true,
8497
- compile: mutedGroundingFooter
8498
- },
8499
- {
8500
- id: asFooterLookId("footer-centered-calm"),
8501
- label: "Centered calm footer",
8502
- layoutId: asFooterLayoutId("centered"),
8503
- styleId: asFooterStyleId("calm"),
8504
- compile: centeredCalmFooter
8505
- },
8506
- {
8507
- id: asFooterLookId("footer-split-editorial"),
8508
- label: "Split editorial footer",
8509
- layoutId: asFooterLayoutId("split"),
8510
- styleId: asFooterStyleId("editorial"),
8511
- compile: splitEditorialFooter
8512
- },
8513
- {
8514
- id: asFooterLookId("footer-editorial-columns"),
8515
- label: "Editorial columns footer",
8516
- layoutId: asFooterLayoutId("columns"),
8517
- styleId: asFooterStyleId("editorial"),
8518
- compile: editorialColumnsFooter
8519
- },
8520
- {
8521
- id: asFooterLookId("site-footer-brand-two-band"),
8522
- label: "Two-band brand footer",
8523
- layoutId: asFooterLayoutId("split"),
8524
- styleId: asFooterStyleId("brand-band"),
8525
- allowedContentPresence: ["default-footer", "default-and-blocks"],
8526
- compile: brandTwoBandFooter
8527
- }
8528
- ]);
8341
+ const footerLookCatalog = defineExactCatalog()([{
8342
+ id: asFooterLookId("footer-links-quiet"),
8343
+ label: "Quiet links",
8344
+ description: "Regular-weight footer navigation with a restrained hover.",
8345
+ compile: quietFooterLinks
8346
+ }, {
8347
+ id: asFooterLookId("footer-links-emphasized"),
8348
+ label: "Emphasized links",
8349
+ description: "Medium-weight footer navigation with a clearer emphasis.",
8350
+ compile: emphasizedFooterLinks
8351
+ }]);
8529
8352
  new Map(footerLookCatalog.map((look) => [look.id, look]));
8530
8353
  //#endregion
8531
8354
  //#region ../theme-core/src/site-styles/sourceCatalogs.ts
@@ -9654,17 +9477,21 @@ function defineCuratedSiteStyle(input) {
9654
9477
  })),
9655
9478
  recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
9656
9479
  recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
9657
- buttonPersonalityChoices: input.buttonPersonalityChoices,
9480
+ buttonStyleChoices: input.buttonStyleChoices,
9658
9481
  paletteRecommendations: input.paletteRecommendations,
9659
9482
  typography: input.typography ?? defaultTypographyForRecipe(input.tokenRecipes.typography),
9660
9483
  ...input.heroTypography ? { heroTypography: input.heroTypography } : {}
9661
9484
  };
9662
9485
  }
9663
- function buttonChoice(id, note) {
9486
+ function buttonChoice(styleId, note, parameters) {
9487
+ const selection = parameters === void 0 ? defaultButtonStyleSelectionFor(styleId) : buttonStyleSelectionSchema.parse({
9488
+ styleId,
9489
+ parameters
9490
+ });
9664
9491
  return note ? {
9665
- id: asButtonPersonalityId(id),
9492
+ ...selection,
9666
9493
  note
9667
- } : { id: asButtonPersonalityId(id) };
9494
+ } : selection;
9668
9495
  }
9669
9496
  function paletteRecommendation(authoringKey, note) {
9670
9497
  const valueKey = requireCuratedPaletteValueKey(asCuratedPaletteAuthoringKey(authoringKey));
@@ -9849,9 +9676,8 @@ const curatedSiteStyles = [
9849
9676
  "minimal-transparent",
9850
9677
  "clean-base"
9851
9678
  ],
9852
- buttonPersonalityChoices: [
9679
+ buttonStyleChoices: [
9853
9680
  buttonChoice("soft-pill"),
9854
- buttonChoice("two-tone-pill"),
9855
9681
  buttonChoice("pebble"),
9856
9682
  buttonChoice("editorial-link"),
9857
9683
  buttonChoice("brushed-wash")
@@ -9887,7 +9713,7 @@ const curatedSiteStyles = [
9887
9713
  "brand-solid",
9888
9714
  "clean-base"
9889
9715
  ],
9890
- buttonPersonalityChoices: [
9716
+ buttonStyleChoices: [
9891
9717
  buttonChoice("confident-chip"),
9892
9718
  buttonChoice("soft-pill"),
9893
9719
  buttonChoice("editorial-link")
@@ -9926,7 +9752,7 @@ const curatedSiteStyles = [
9926
9752
  "minimal-transparent",
9927
9753
  "centered-calm"
9928
9754
  ],
9929
- buttonPersonalityChoices: [
9755
+ buttonStyleChoices: [
9930
9756
  buttonChoice("editorial-link"),
9931
9757
  buttonChoice("soft-pill"),
9932
9758
  buttonChoice("brushed-wash")
@@ -9966,7 +9792,7 @@ const curatedSiteStyles = [
9966
9792
  "practical-utility",
9967
9793
  "clean-base"
9968
9794
  ],
9969
- buttonPersonalityChoices: [
9795
+ buttonStyleChoices: [
9970
9796
  buttonChoice("pebble"),
9971
9797
  buttonChoice("brushed-wash"),
9972
9798
  buttonChoice("confident-chip")
@@ -10027,7 +9853,7 @@ const curatedSiteStyles = [
10027
9853
  "serif-line",
10028
9854
  "clean-base"
10029
9855
  ],
10030
- buttonPersonalityChoices: [
9856
+ buttonStyleChoices: [
10031
9857
  buttonChoice("editorial-link"),
10032
9858
  buttonChoice("confident-chip"),
10033
9859
  buttonChoice("soft-pill")
@@ -10089,7 +9915,7 @@ const curatedSiteStyles = [
10089
9915
  "brand-solid",
10090
9916
  "clean-base"
10091
9917
  ],
10092
- buttonPersonalityChoices: [
9918
+ buttonStyleChoices: [
10093
9919
  buttonChoice("confident-chip"),
10094
9920
  buttonChoice("pebble"),
10095
9921
  buttonChoice("ink-stamp")
@@ -10128,7 +9954,7 @@ const curatedSiteStyles = [
10128
9954
  "minimal-transparent",
10129
9955
  "clean-base"
10130
9956
  ],
10131
- buttonPersonalityChoices: [
9957
+ buttonStyleChoices: [
10132
9958
  buttonChoice("soft-pill"),
10133
9959
  buttonChoice("pebble"),
10134
9960
  buttonChoice("confident-chip")
@@ -10201,7 +10027,7 @@ const curatedSiteStyles = [
10201
10027
  "clean-base",
10202
10028
  "centered-calm"
10203
10029
  ],
10204
- buttonPersonalityChoices: [
10030
+ buttonStyleChoices: [
10205
10031
  buttonChoice("pebble"),
10206
10032
  buttonChoice("soft-pill"),
10207
10033
  buttonChoice("editorial-link")
@@ -10320,12 +10146,8 @@ const curatedSiteStyles = [
10320
10146
  "serif-line",
10321
10147
  "minimal-transparent"
10322
10148
  ],
10323
- recommendedFooterLookIds: [
10324
- "footer-centered-calm",
10325
- "footer-editorial-columns",
10326
- "footer-muted-grounding"
10327
- ],
10328
- buttonPersonalityChoices: [
10149
+ recommendedFooterLookIds: ["footer-links-quiet"],
10150
+ buttonStyleChoices: [
10329
10151
  buttonChoice("soft-pill"),
10330
10152
  buttonChoice("pebble"),
10331
10153
  buttonChoice("editorial-link")
@@ -10399,7 +10221,7 @@ const curatedSiteStyles = [
10399
10221
  "centered-calm",
10400
10222
  "minimal-transparent"
10401
10223
  ],
10402
- buttonPersonalityChoices: [
10224
+ buttonStyleChoices: [
10403
10225
  buttonChoice("editorial-link"),
10404
10226
  buttonChoice("soft-pill"),
10405
10227
  buttonChoice("brushed-wash")
@@ -10472,8 +10294,8 @@ const curatedSiteStyles = [
10472
10294
  "practical-utility",
10473
10295
  "clean-base"
10474
10296
  ],
10475
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
10476
- buttonPersonalityChoices: [
10297
+ recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
10298
+ buttonStyleChoices: [
10477
10299
  buttonChoice("pebble"),
10478
10300
  buttonChoice("confident-chip"),
10479
10301
  buttonChoice("ink-stamp"),
@@ -10594,8 +10416,8 @@ const curatedSiteStyles = [
10594
10416
  "minimal-transparent",
10595
10417
  "serif-line"
10596
10418
  ],
10597
- recommendedFooterLookIds: ["footer-muted-grounding", "site-footer-brand-two-band"],
10598
- buttonPersonalityChoices: [
10419
+ recommendedFooterLookIds: ["footer-links-quiet", "footer-links-emphasized"],
10420
+ buttonStyleChoices: [
10599
10421
  buttonChoice("earth-pill"),
10600
10422
  buttonChoice("soft-pill"),
10601
10423
  buttonChoice("pebble"),
@@ -10666,7 +10488,7 @@ const curatedSiteStyles = [
10666
10488
  "floating-glass",
10667
10489
  "brand-solid"
10668
10490
  ],
10669
- buttonPersonalityChoices: [
10491
+ buttonStyleChoices: [
10670
10492
  buttonChoice("ink-stamp"),
10671
10493
  buttonChoice("confident-chip"),
10672
10494
  buttonChoice("brushed-wash"),
@@ -10721,8 +10543,8 @@ const curatedSiteStyles = [
10721
10543
  "transparent-overlay",
10722
10544
  "practical-utility"
10723
10545
  ],
10724
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
10725
- buttonPersonalityChoices: [
10546
+ recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
10547
+ buttonStyleChoices: [
10726
10548
  buttonChoice("showtime-pill"),
10727
10549
  buttonChoice("confident-chip"),
10728
10550
  buttonChoice("ink-stamp"),
@@ -10803,8 +10625,8 @@ const curatedSiteStyles = [
10803
10625
  headerStyleChoice("glass")
10804
10626
  ] },
10805
10627
  recommendedHeaderLookIds: ["minimal-transparent"],
10806
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
10807
- buttonPersonalityChoices: [
10628
+ recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
10629
+ buttonStyleChoices: [
10808
10630
  buttonChoice("ornate-ritual"),
10809
10631
  buttonChoice("joy-stamp"),
10810
10632
  buttonChoice("ink-stamp")
@@ -10857,8 +10679,8 @@ const curatedSiteStyles = [
10857
10679
  headerStyleChoice("glass")
10858
10680
  ] },
10859
10681
  recommendedHeaderLookIds: ["minimal-transparent"],
10860
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
10861
- buttonPersonalityChoices: [
10682
+ recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
10683
+ buttonStyleChoices: [
10862
10684
  buttonChoice("joy-stamp"),
10863
10685
  buttonChoice("ink-stamp"),
10864
10686
  buttonChoice("showtime-pill")
@@ -10948,8 +10770,8 @@ const curatedSiteStyles = [
10948
10770
  "centered-calm",
10949
10771
  "clean-base"
10950
10772
  ],
10951
- recommendedFooterLookIds: ["footer-editorial-columns", "footer-muted-grounding"],
10952
- buttonPersonalityChoices: [
10773
+ recommendedFooterLookIds: ["footer-links-quiet"],
10774
+ buttonStyleChoices: [
10953
10775
  buttonChoice("flat-ink"),
10954
10776
  buttonChoice("confident-chip"),
10955
10777
  buttonChoice("editorial-link")
@@ -11026,14 +10848,9 @@ const curatedSiteStyles = [
11026
10848
  "serif-line",
11027
10849
  "clean-base"
11028
10850
  ],
11029
- recommendedFooterLookIds: [
11030
- "footer-editorial-columns",
11031
- "footer-muted-grounding",
11032
- "footer-identity-quiet"
11033
- ],
11034
- buttonPersonalityChoices: [
11035
- buttonChoice("quiet-arrow"),
11036
- buttonChoice("two-tone-pill"),
10851
+ recommendedFooterLookIds: ["footer-links-quiet"],
10852
+ buttonStyleChoices: [
10853
+ buttonChoice("quiet-arrow", void 0, { secondaryTreatment: "solid-accent" }),
11037
10854
  buttonChoice("flat-ink"),
11038
10855
  buttonChoice("editorial-link")
11039
10856
  ],