@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
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { d as unwrapResponse, s as ApiRequestError } from "./previewAuthStore-CTO7CRPk.mjs";
2
+ import { d as unwrapResponse, s as ApiRequestError } from "./previewAuthStore-BkT1D06A.mjs";
3
3
  import * as React$1 from "react";
4
4
  import React, { cloneElement, createContext, createElement, forwardRef, isValidElement, memo, useCallback, useContext, useDebugValue, useEffect, useId, useLayoutEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore } from "react";
5
5
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -76432,7 +76432,7 @@ const gradientDirectionSchema$1 = z$1.enum([
76432
76432
  "to-br",
76433
76433
  "to-bl"
76434
76434
  ]);
76435
- const buttonBackgroundSchema = z$1.discriminatedUnion("type", [
76435
+ const buttonColourTreatmentSchema = z$1.discriminatedUnion("type", [
76436
76436
  z$1.object({
76437
76437
  type: z$1.literal("solid"),
76438
76438
  colorToken: opaqueButtonColourTokenSchema
@@ -76456,6 +76456,7 @@ const buttonBackgroundSchema = z$1.discriminatedUnion("type", [
76456
76456
  role: z$1.literal("link")
76457
76457
  })
76458
76458
  ]);
76459
+ const buttonBackgroundSchema = buttonColourTreatmentSchema;
76459
76460
  const effectApplicationSchema$1 = z$1.object({
76460
76461
  effectId: z$1.string(),
76461
76462
  options: z$1.record(z$1.string(), z$1.json()).optional()
@@ -79502,298 +79503,440 @@ function resolveBoxShadow(variant, global, theme, tokens) {
79502
79503
  return generateShadowValue$1(shadowConfig.elevation, shadowConfig.softness, shadowConfig.position ?? "bottom", color);
79503
79504
  }
79504
79505
  //#endregion
79505
- //#region ../theme-core/src/site-styles/styleTags.ts
79506
- /**
79507
- * Descriptive style-axis metadata for button personalities and palette
79508
- * variants. Site Style picker shape is curated explicitly; these tags remain
79509
- * for catalog audit, docs, and future discovery tooling.
79510
- */
79511
- const STYLE_AXIS_VALUES = {
79512
- tone: [
79513
- "minimal",
79514
- "classic",
79515
- "bold"
79516
- ],
79517
- energy: ["calm", "vibrant"],
79518
- motion: [
79519
- "subtle",
79520
- "standard",
79521
- "expressive"
79522
- ],
79523
- era: [
79524
- "editorial",
79525
- "modern",
79526
- "organic",
79527
- "technical",
79528
- "retro"
79529
- ]
79530
- };
79531
- const styleTagsSchema = z$1.object({
79532
- tone: z$1.enum(STYLE_AXIS_VALUES.tone).optional(),
79533
- energy: z$1.enum(STYLE_AXIS_VALUES.energy).optional(),
79534
- motion: z$1.enum(STYLE_AXIS_VALUES.motion).optional(),
79535
- era: z$1.enum(STYLE_AXIS_VALUES.era).optional()
79536
- });
79537
- //#endregion
79538
- //#region ../theme-core/src/buttons/personalities/types.ts
79539
- function asButtonPersonalityId(value) {
79540
- if (value.length === 0) throw new Error("ButtonPersonalityId must be a non-empty string");
79541
- return value;
79506
+ //#region ../theme-core/src/buttons/styles/domain.ts
79507
+ const PUBLIC_BUTTON_ROLES = [
79508
+ "primary",
79509
+ "secondary",
79510
+ "outline",
79511
+ "ghost",
79512
+ "accent"
79513
+ ];
79514
+ function defineButtonStyleRecipe(recipe) {
79515
+ return recipe;
79542
79516
  }
79543
- const buttonPersonalityIdSchema = z$1.string().min(1).transform((value) => asButtonPersonalityId(value));
79544
- z$1.object({
79545
- id: buttonPersonalityIdSchema,
79546
- name: z$1.string().min(1),
79547
- description: z$1.string().min(1),
79548
- tags: styleTagsSchema,
79549
- buttonSystem: buttonSystemSchema
79550
- });
79551
- /**
79552
- * Helper for personality file modules to keep the call site short and
79553
- * type-safe. `as const satisfies ...` would also work but produces wider
79554
- * types at use sites.
79555
- */
79556
- function defineButtonPersonality(input) {
79517
+ function materializeButtonRoles(definitions) {
79518
+ const primary = materializeCompleteRole("primary", definitions.primary.appearance);
79519
+ const secondary = materializeCompleteRole("secondary", definitions.secondary.appearance);
79520
+ const completeRoles = {
79521
+ primary,
79522
+ secondary
79523
+ };
79557
79524
  return {
79558
- id: asButtonPersonalityId(input.id),
79559
- name: input.name,
79560
- description: input.description,
79561
- tags: input.tags,
79562
- buttonSystem: buttonSystemSchema.parse(input.buttonSystem)
79525
+ primary,
79526
+ secondary,
79527
+ outline: materializeSupportingRole("outline", definitions.outline, completeRoles),
79528
+ ghost: materializeSupportingRole("ghost", definitions.ghost, completeRoles),
79529
+ accent: materializeSupportingRole("accent", definitions.accent, completeRoles)
79563
79530
  };
79564
79531
  }
79565
- //#endregion
79566
- //#region ../theme-core/src/buttons/personalities/brushed-wash.ts
79567
- /**
79568
- * Brushed Wash — gradient backgrounds that read as watercolour washes.
79569
- * Generous padding, soft shadows; pairs with vibrant organic brands.
79570
- */
79571
- const brushedWash = defineButtonPersonality({
79572
- id: "brushed-wash",
79573
- name: "Brushed Wash",
79574
- description: "Watercolour-gradient buttons with soft shadows and generous padding.",
79532
+ function resolveButtonStyleRecipe(recipe, parameters) {
79533
+ const parsedParameters = recipe.parameterSchema.safeParse(parameters);
79534
+ if (!parsedParameters.success) return {
79535
+ kind: "error",
79536
+ error: {
79537
+ kind: "invalid-parameters",
79538
+ styleId: recipe.id,
79539
+ issues: parsedParameters.error.issues.map((issue) => issue.message)
79540
+ }
79541
+ };
79542
+ const definition = recipe.defineSystem(parsedParameters.data);
79543
+ const roles = materializeButtonRoles(definition.roles);
79544
+ const buttonSystem = {
79545
+ global: definition.global,
79546
+ variants: PUBLIC_BUTTON_ROLES.map((role) => roles[role]),
79547
+ ...definition.sizes ? { sizes: definition.sizes } : {}
79548
+ };
79549
+ const parsedButtonSystem = buttonSystemSchema.safeParse(buttonSystem);
79550
+ if (!parsedButtonSystem.success) return {
79551
+ kind: "error",
79552
+ error: {
79553
+ kind: "invalid-button-system",
79554
+ styleId: recipe.id,
79555
+ issues: parsedButtonSystem.error.issues.map((issue) => issue.message)
79556
+ }
79557
+ };
79558
+ return {
79559
+ kind: "resolved",
79560
+ buttonSystem: parsedButtonSystem.data
79561
+ };
79562
+ }
79563
+ function materializeSupportingRole(role, definition, completeRoles) {
79564
+ if (definition.kind === "complete") return materializeCompleteRole(role, definition.appearance);
79565
+ return {
79566
+ ...completeRoles[definition.from],
79567
+ ...definition.overrides,
79568
+ id: role,
79569
+ name: roleName(role),
79570
+ enabled: true,
79571
+ priority: 3
79572
+ };
79573
+ }
79574
+ function materializeCompleteRole(role, appearance) {
79575
+ return {
79576
+ ...appearance,
79577
+ id: role,
79578
+ name: roleName(role),
79579
+ enabled: true,
79580
+ priority: rolePriority$1(role)
79581
+ };
79582
+ }
79583
+ function roleName(role) {
79584
+ return role.charAt(0).toUpperCase() + role.slice(1);
79585
+ }
79586
+ function rolePriority$1(role) {
79587
+ if (role === "primary") return 1;
79588
+ if (role === "secondary") return 2;
79589
+ return 3;
79590
+ }
79591
+ //#endregion
79592
+ //#region ../theme-core/src/buttons/styles/selection.ts
79593
+ const BUTTON_STYLE_IDS = [
79594
+ "soft-pill",
79595
+ "earth-pill",
79596
+ "confident-chip",
79597
+ "editorial-link",
79598
+ "pebble",
79599
+ "ink-stamp",
79600
+ "flat-ink",
79601
+ "brushed-wash",
79602
+ "showtime-pill",
79603
+ "joy-stamp",
79604
+ "ornate-ritual",
79605
+ "quiet-arrow"
79606
+ ];
79607
+ const quietArrowParametersSchema = z$1.object({ secondaryTreatment: z$1.enum(["outlined", "solid-accent"]) }).strict();
79608
+ const emptyParametersSchema$1 = z$1.object({}).strict();
79609
+ function selectionBranch(styleId, parameters) {
79610
+ return z$1.object({
79611
+ styleId: z$1.literal(styleId),
79612
+ parameters
79613
+ }).strict();
79614
+ }
79615
+ const buttonStyleSelectionSchema = z$1.discriminatedUnion("styleId", [
79616
+ selectionBranch("soft-pill", emptyParametersSchema$1),
79617
+ selectionBranch("earth-pill", emptyParametersSchema$1),
79618
+ selectionBranch("confident-chip", emptyParametersSchema$1),
79619
+ selectionBranch("editorial-link", emptyParametersSchema$1),
79620
+ selectionBranch("pebble", emptyParametersSchema$1),
79621
+ selectionBranch("ink-stamp", emptyParametersSchema$1),
79622
+ selectionBranch("flat-ink", emptyParametersSchema$1),
79623
+ selectionBranch("brushed-wash", emptyParametersSchema$1),
79624
+ selectionBranch("showtime-pill", emptyParametersSchema$1),
79625
+ selectionBranch("joy-stamp", emptyParametersSchema$1),
79626
+ selectionBranch("ornate-ritual", emptyParametersSchema$1),
79627
+ selectionBranch("quiet-arrow", quietArrowParametersSchema)
79628
+ ]);
79629
+ /**
79630
+ * Stable identity for a validated style selection. Parsing first canonicalises
79631
+ * parameter key order, so future recipe parameters do not require editor-core
79632
+ * equality or key logic.
79633
+ */
79634
+ function buttonStyleSelectionKey(selection) {
79635
+ return JSON.stringify(buttonStyleSelectionSchema.parse(selection));
79636
+ }
79637
+ function buttonStyleSelectionsEqual(a, b) {
79638
+ return buttonStyleSelectionKey(a) === buttonStyleSelectionKey(b);
79639
+ }
79640
+ //#endregion
79641
+ //#region ../theme-core/src/buttons/styles/recipes/quietArrow.ts
79642
+ const quietArrowRecipe = defineButtonStyleRecipe({
79643
+ id: "quiet-arrow",
79644
+ accessibilityLabel: "Wide uppercase buttons with trailing arrows",
79575
79645
  tags: {
79576
79646
  tone: "classic",
79577
- energy: "vibrant",
79578
- motion: "standard",
79579
- era: "organic"
79647
+ energy: "calm",
79648
+ motion: "subtle",
79649
+ era: "editorial"
79580
79650
  },
79581
- buttonSystem: {
79651
+ parameterSchema: quietArrowParametersSchema,
79652
+ defaultParameters: { secondaryTreatment: "outlined" },
79653
+ controls: [{
79654
+ kind: "choice",
79655
+ parameter: "secondaryTreatment",
79656
+ label: "Secondary button treatment",
79657
+ options: [{
79658
+ value: "outlined",
79659
+ label: "Outlined"
79660
+ }, {
79661
+ value: "solid-accent",
79662
+ label: "Solid accent"
79663
+ }]
79664
+ }],
79665
+ defineSystem: (parameters) => ({
79582
79666
  global: {
79583
79667
  cornerStyle: "rounded",
79584
- shadow: "low",
79585
- textTransform: "none",
79668
+ textTransform: "uppercase",
79586
79669
  fontWeight: 500,
79587
79670
  borderWidth: 1,
79671
+ typography: "body",
79672
+ fontSize: "text-sm",
79673
+ letterSpacing: "loose",
79588
79674
  hoverTransform: "none",
79589
79675
  hoverColor: "none"
79590
79676
  },
79591
79677
  sizes: {
79592
79678
  sm: {
79593
- padding: "0.75rem 2rem",
79679
+ padding: "0.625rem 1.25rem",
79680
+ fontSize: "text-xs"
79681
+ },
79682
+ md: {
79683
+ padding: "0.8125rem 1.75rem",
79594
79684
  fontSize: "text-sm"
79595
79685
  },
79596
- md: { padding: "1rem 2.5rem" },
79597
79686
  lg: {
79598
- padding: "1.25rem 3rem",
79599
- fontSize: "text-lg"
79687
+ padding: "0.9375rem 2.125rem",
79688
+ fontSize: "text-sm"
79600
79689
  },
79601
79690
  xl: {
79602
- padding: "1.625rem 3.75rem",
79603
- fontSize: "text-xl"
79691
+ padding: "1.0625rem 2.5rem",
79692
+ fontSize: "text-base"
79604
79693
  }
79605
79694
  },
79606
- variants: [
79607
- {
79608
- id: "primary",
79609
- name: "Primary",
79610
- enabled: true,
79611
- priority: 1,
79612
- background: {
79613
- type: "gradient",
79614
- stops: ["primary", "accent"],
79615
- direction: "to-r",
79616
- foregroundToken: "primaryForeground"
79617
- },
79618
- borderRadius: "rounded-lg",
79619
- shadow: {
79620
- elevation: "low",
79621
- softness: "soft",
79622
- position: "bottom"
79695
+ roles: {
79696
+ primary: {
79697
+ kind: "complete",
79698
+ appearance: {
79699
+ background: {
79700
+ type: "solid",
79701
+ colorToken: unsafeAsOpaqueButtonColourToken("primary")
79702
+ },
79703
+ borderRadius: "rounded-xl",
79704
+ affordance: { iconId: "ArrowRight" },
79705
+ effects: { hover: [{
79706
+ effectId: "darken-background",
79707
+ options: { amount: 100 }
79708
+ }] }
79623
79709
  }
79624
79710
  },
79625
- {
79626
- id: "secondary",
79627
- name: "Secondary",
79628
- enabled: true,
79629
- priority: 2,
79630
- background: {
79631
- type: "gradient",
79632
- stops: ["secondary", "accent"],
79633
- direction: "to-br",
79634
- foregroundToken: "primaryForeground"
79635
- },
79636
- borderRadius: "rounded-lg",
79637
- shadow: {
79638
- elevation: "low",
79639
- softness: "soft",
79640
- position: "bottom"
79711
+ secondary: {
79712
+ kind: "complete",
79713
+ appearance: parameters.secondaryTreatment === "solid-accent" ? {
79714
+ background: {
79715
+ type: "solid",
79716
+ colorToken: unsafeAsOpaqueButtonColourToken("accent")
79717
+ },
79718
+ borderRadius: "rounded-xl",
79719
+ affordance: { iconId: "ArrowRight" },
79720
+ effects: { hover: [{
79721
+ effectId: "darken-background",
79722
+ options: { amount: 100 }
79723
+ }] }
79724
+ } : {
79725
+ background: {
79726
+ type: "surface",
79727
+ role: "link"
79728
+ },
79729
+ borderRadius: "rounded-xl",
79730
+ border: { widthClass: "border" },
79731
+ affordance: { iconId: "ArrowRight" },
79732
+ effects: { hover: [{
79733
+ effectId: "background-on-hover",
79734
+ options: { colorToken: "surfaceAlt" }
79735
+ }] }
79641
79736
  }
79642
79737
  },
79643
- {
79644
- id: "outline",
79645
- name: "Outline",
79646
- enabled: true,
79647
- priority: 3,
79648
- background: {
79649
- type: "surface",
79650
- role: "link"
79651
- },
79652
- borderRadius: "rounded-lg",
79653
- border: { widthClass: "border" },
79654
- effects: { hover: [{
79655
- effectId: "background-on-hover",
79656
- options: { colorToken: "surface" }
79657
- }] }
79738
+ outline: {
79739
+ kind: "complete",
79740
+ appearance: {
79741
+ background: {
79742
+ type: "surface",
79743
+ role: "link"
79744
+ },
79745
+ borderRadius: "rounded-xl",
79746
+ border: { widthClass: "border" }
79747
+ }
79658
79748
  },
79659
- {
79660
- id: "ghost",
79661
- name: "Ghost",
79662
- enabled: true,
79663
- priority: 3,
79664
- background: {
79665
- type: "surface",
79666
- role: "link"
79667
- },
79668
- borderRadius: "rounded-lg",
79669
- effects: { hover: [{
79670
- effectId: "background-on-hover",
79671
- options: { colorToken: "surface" }
79672
- }] }
79749
+ ghost: {
79750
+ kind: "complete",
79751
+ appearance: {
79752
+ background: {
79753
+ type: "surface",
79754
+ role: "link"
79755
+ },
79756
+ borderRadius: "rounded-xl"
79757
+ }
79758
+ },
79759
+ accent: {
79760
+ kind: "derive",
79761
+ from: "primary",
79762
+ overrides: { background: {
79763
+ type: "solid",
79764
+ colorToken: unsafeAsOpaqueButtonColourToken("accent")
79765
+ } }
79673
79766
  }
79674
- ]
79675
- }
79767
+ }
79768
+ })
79676
79769
  });
79677
79770
  //#endregion
79678
- //#region ../theme-core/src/buttons/personalities/confident-chip.ts
79679
- /**
79680
- * Confident Chip — moderate-radius solid buttons that read as competent and
79681
- * direct. Default for Clear Professional; works for any modern brand voice.
79682
- */
79683
- const confidentChip = defineButtonPersonality({
79684
- id: "confident-chip",
79685
- name: "Confident Chip",
79686
- description: "Mid-radius solid buttons with a crisp hover.",
79771
+ //#region ../theme-core/src/buttons/styles/recipes/defineStaticButtonStyleRecipe.ts
79772
+ const emptyParametersSchema = z$1.object({}).strict();
79773
+ function defineStaticButtonStyleRecipe(input) {
79774
+ const system = normalizeSystem(input.system);
79775
+ return defineButtonStyleRecipe({
79776
+ id: input.id,
79777
+ accessibilityLabel: input.accessibilityLabel,
79778
+ tags: input.tags,
79779
+ parameterSchema: emptyParametersSchema,
79780
+ defaultParameters: {},
79781
+ controls: [],
79782
+ defineSystem: () => system
79783
+ });
79784
+ }
79785
+ function normalizeSystem(input) {
79786
+ return {
79787
+ global: buttonGlobalSettingsSchema.parse(input.global),
79788
+ ...input.sizes ? { sizes: input.sizes } : {},
79789
+ roles: {
79790
+ primary: normalizeCompleteRole(input.roles.primary),
79791
+ secondary: normalizeCompleteRole(input.roles.secondary),
79792
+ outline: normalizeSupportingRole(input.roles.outline),
79793
+ ghost: normalizeSupportingRole(input.roles.ghost),
79794
+ accent: normalizeSupportingRole(input.roles.accent)
79795
+ }
79796
+ };
79797
+ }
79798
+ function normalizeCompleteRole(role) {
79799
+ return {
79800
+ kind: "complete",
79801
+ appearance: normalizeAppearance(role.appearance)
79802
+ };
79803
+ }
79804
+ function normalizeSupportingRole(role) {
79805
+ if (role.kind === "complete") return normalizeCompleteRole(role);
79806
+ return {
79807
+ kind: "derive",
79808
+ from: role.from,
79809
+ ...role.overrides ? { overrides: normalizeAppearanceOverrides(role.overrides) } : {}
79810
+ };
79811
+ }
79812
+ function normalizeAppearance(appearance) {
79813
+ const { background, hoverBackgroundToken, ...rest } = appearance;
79814
+ return {
79815
+ ...rest,
79816
+ background: buttonColourTreatmentSchema.parse(background),
79817
+ ...hoverBackgroundToken ? { hoverBackgroundToken: opaqueButtonColourTokenSchema.parse(hoverBackgroundToken) } : {}
79818
+ };
79819
+ }
79820
+ function normalizeAppearanceOverrides(overrides) {
79821
+ const { background, hoverBackgroundToken, ...rest } = overrides;
79822
+ return {
79823
+ ...rest,
79824
+ ...background ? { background: buttonColourTreatmentSchema.parse(background) } : {},
79825
+ ...hoverBackgroundToken ? { hoverBackgroundToken: opaqueButtonColourTokenSchema.parse(hoverBackgroundToken) } : {}
79826
+ };
79827
+ }
79828
+ //#endregion
79829
+ //#region ../theme-core/src/buttons/styles/recipes/staticRecipes.ts
79830
+ const softPillRecipe = defineStaticButtonStyleRecipe({
79831
+ id: "soft-pill",
79832
+ accessibilityLabel: "Rounded pill buttons with a gentle hover lift",
79687
79833
  tags: {
79688
79834
  tone: "classic",
79689
79835
  energy: "calm",
79690
- motion: "standard",
79691
- era: "modern"
79836
+ motion: "subtle",
79837
+ era: "organic"
79692
79838
  },
79693
- buttonSystem: {
79839
+ system: {
79694
79840
  global: {
79695
- cornerStyle: "rounded",
79696
- shadow: "medium",
79841
+ cornerStyle: "pill",
79842
+ shadow: "low",
79697
79843
  textTransform: "none",
79698
- fontWeight: 600,
79699
- borderWidth: 1,
79700
- hoverTransform: "none",
79844
+ fontWeight: 500,
79845
+ borderWidth: 2,
79846
+ hoverTransform: "lift",
79701
79847
  hoverColor: "none"
79702
79848
  },
79703
- variants: [
79704
- {
79705
- id: "primary",
79706
- name: "Primary",
79707
- enabled: true,
79708
- priority: 1,
79709
- background: {
79710
- type: "solid",
79711
- colorToken: "primary"
79712
- },
79713
- borderRadius: "rounded-md",
79714
- shadow: {
79715
- elevation: "medium",
79716
- softness: "soft",
79717
- position: "bottom"
79718
- },
79719
- effects: {
79720
- hover: [{
79721
- effectId: "darken-background",
79722
- options: { amount: 100 }
79723
- }],
79724
- active: [{
79725
- effectId: "scale-down",
79726
- options: { scale: "0.97" }
79727
- }]
79849
+ roles: {
79850
+ primary: {
79851
+ kind: "complete",
79852
+ appearance: {
79853
+ background: {
79854
+ type: "solid",
79855
+ colorToken: "primary"
79856
+ },
79857
+ borderRadius: "rounded-full",
79858
+ shadow: {
79859
+ elevation: "low",
79860
+ softness: "soft",
79861
+ position: "bottom"
79862
+ },
79863
+ effects: {
79864
+ hover: [{
79865
+ effectId: "lift",
79866
+ options: { translateY: "-1px" }
79867
+ }],
79868
+ active: [{
79869
+ effectId: "scale-down",
79870
+ options: { scale: "0.98" }
79871
+ }]
79872
+ }
79728
79873
  }
79729
79874
  },
79730
- {
79731
- id: "secondary",
79732
- name: "Secondary",
79733
- enabled: true,
79734
- priority: 2,
79735
- background: {
79736
- type: "solid",
79737
- colorToken: "surface"
79738
- },
79739
- borderRadius: "rounded-md",
79740
- border: { widthClass: "border" },
79741
- effects: { hover: [{
79742
- effectId: "background-on-hover",
79743
- options: { colorToken: "background" }
79744
- }] }
79875
+ secondary: {
79876
+ kind: "complete",
79877
+ appearance: {
79878
+ background: {
79879
+ type: "surface",
79880
+ role: "link"
79881
+ },
79882
+ borderRadius: "rounded-full",
79883
+ border: { widthClass: "border-2" },
79884
+ effects: { hover: [{
79885
+ effectId: "background-on-hover",
79886
+ options: { colorToken: "surface" }
79887
+ }] }
79888
+ }
79745
79889
  },
79746
- {
79747
- id: "outline",
79748
- name: "Outline",
79749
- enabled: true,
79750
- priority: 3,
79751
- background: {
79752
- type: "surface",
79753
- role: "link"
79754
- },
79755
- borderRadius: "rounded-md",
79756
- border: { widthClass: "border" },
79757
- effects: { hover: [{
79758
- effectId: "background-on-hover",
79759
- options: { colorToken: "surface" }
79760
- }] }
79890
+ outline: {
79891
+ kind: "complete",
79892
+ appearance: {
79893
+ background: {
79894
+ type: "surface",
79895
+ role: "link"
79896
+ },
79897
+ borderRadius: "rounded-full",
79898
+ border: { widthClass: "border" },
79899
+ effects: { hover: [{
79900
+ effectId: "background-on-hover",
79901
+ options: { colorToken: "surface" }
79902
+ }] }
79903
+ }
79761
79904
  },
79762
- {
79763
- id: "ghost",
79764
- name: "Ghost",
79765
- enabled: true,
79766
- priority: 3,
79767
- background: {
79768
- type: "surface",
79769
- role: "link"
79770
- },
79771
- borderRadius: "rounded-md",
79772
- effects: { hover: [{
79773
- effectId: "background-on-hover",
79774
- options: { colorToken: "surface" }
79775
- }] }
79905
+ ghost: {
79906
+ kind: "complete",
79907
+ appearance: {
79908
+ background: {
79909
+ type: "surface",
79910
+ role: "link"
79911
+ },
79912
+ borderRadius: "rounded-full",
79913
+ effects: { hover: [{
79914
+ effectId: "background-on-hover",
79915
+ options: { colorToken: "surface" }
79916
+ }] }
79917
+ }
79918
+ },
79919
+ accent: {
79920
+ kind: "derive",
79921
+ from: "primary",
79922
+ overrides: { background: {
79923
+ type: "solid",
79924
+ colorToken: "accent"
79925
+ } }
79776
79926
  }
79777
- ]
79927
+ }
79778
79928
  }
79779
79929
  });
79780
- //#endregion
79781
- //#region ../theme-core/src/buttons/personalities/earth-pill.ts
79782
- /**
79783
- * Earth Pill - warm studio pills with compact, primary-coloured ghost CTAs.
79784
- * Built for grounded editorial wellness styles such as Soft Earth.
79785
- */
79786
- const earthPill = defineButtonPersonality({
79930
+ const earthPillRecipe = defineStaticButtonStyleRecipe({
79787
79931
  id: "earth-pill",
79788
- name: "Earth Pill",
79789
- description: "Compact terracotta pills with quiet primary-coloured ghost CTAs.",
79932
+ accessibilityLabel: "Compact rounded buttons with a quiet hover lift",
79790
79933
  tags: {
79791
79934
  tone: "classic",
79792
79935
  energy: "calm",
79793
79936
  motion: "subtle",
79794
79937
  era: "organic"
79795
79938
  },
79796
- buttonSystem: {
79939
+ system: {
79797
79940
  global: {
79798
79941
  cornerStyle: "pill",
79799
79942
  shadow: "low",
@@ -79820,576 +79963,547 @@ const earthPill = defineButtonPersonality({
79820
79963
  fontSize: "text-xl"
79821
79964
  }
79822
79965
  },
79823
- variants: [
79824
- {
79825
- id: "primary",
79826
- name: "Primary",
79827
- enabled: true,
79828
- priority: 1,
79829
- background: {
79830
- type: "solid",
79831
- colorToken: "primary"
79832
- },
79833
- borderRadius: "rounded-full",
79834
- shadow: {
79835
- elevation: "low",
79836
- softness: "soft",
79837
- position: "bottom"
79838
- },
79839
- effects: {
79840
- hover: [{
79841
- effectId: "lift",
79842
- options: { translateY: "-1px" }
79843
- }, {
79844
- effectId: "background-on-hover",
79845
- options: { colorToken: "accent" }
79846
- }],
79847
- active: [{
79848
- effectId: "scale-down",
79849
- options: { scale: "0.98" }
79850
- }]
79966
+ roles: {
79967
+ primary: {
79968
+ kind: "complete",
79969
+ appearance: {
79970
+ background: {
79971
+ type: "solid",
79972
+ colorToken: "primary"
79973
+ },
79974
+ borderRadius: "rounded-full",
79975
+ shadow: {
79976
+ elevation: "low",
79977
+ softness: "soft",
79978
+ position: "bottom"
79979
+ },
79980
+ effects: {
79981
+ hover: [{
79982
+ effectId: "lift",
79983
+ options: { translateY: "-1px" }
79984
+ }, {
79985
+ effectId: "background-on-hover",
79986
+ options: { colorToken: "accent" }
79987
+ }],
79988
+ active: [{
79989
+ effectId: "scale-down",
79990
+ options: { scale: "0.98" }
79991
+ }]
79992
+ }
79851
79993
  }
79852
79994
  },
79853
- {
79854
- id: "secondary",
79855
- name: "Secondary",
79856
- enabled: true,
79857
- priority: 2,
79858
- background: {
79859
- type: "surface",
79860
- role: "link"
79861
- },
79862
- borderRadius: "rounded-full",
79863
- border: { widthClass: "border" },
79864
- effects: { hover: [{
79865
- effectId: "background-on-hover",
79866
- options: { colorToken: "muted" }
79867
- }] }
79995
+ secondary: {
79996
+ kind: "complete",
79997
+ appearance: {
79998
+ background: {
79999
+ type: "surface",
80000
+ role: "link"
80001
+ },
80002
+ borderRadius: "rounded-full",
80003
+ border: { widthClass: "border" },
80004
+ effects: { hover: [{
80005
+ effectId: "background-on-hover",
80006
+ options: { colorToken: "muted" }
80007
+ }] }
80008
+ }
79868
80009
  },
79869
- {
79870
- id: "outline",
79871
- name: "Outline",
79872
- enabled: true,
79873
- priority: 3,
79874
- background: {
79875
- type: "surface",
79876
- role: "link"
79877
- },
79878
- borderRadius: "rounded-full",
79879
- border: { widthClass: "border" },
79880
- effects: { hover: [{
79881
- effectId: "background-on-hover",
79882
- options: { colorToken: "surfaceAlt" }
79883
- }] }
80010
+ outline: {
80011
+ kind: "complete",
80012
+ appearance: {
80013
+ background: {
80014
+ type: "surface",
80015
+ role: "link"
80016
+ },
80017
+ borderRadius: "rounded-full",
80018
+ border: { widthClass: "border" },
80019
+ effects: { hover: [{
80020
+ effectId: "background-on-hover",
80021
+ options: { colorToken: "surfaceAlt" }
80022
+ }] }
80023
+ }
79884
80024
  },
79885
- {
79886
- id: "ghost",
79887
- name: "Ghost",
79888
- enabled: true,
79889
- priority: 3,
79890
- background: {
79891
- type: "surface",
79892
- role: "link"
79893
- },
79894
- borderRadius: "rounded-full",
79895
- shadow: {
79896
- elevation: "none",
79897
- softness: null,
79898
- position: "bottom"
79899
- },
79900
- sizes: {
79901
- sm: {
79902
- padding: "0.25rem 0",
79903
- fontSize: "text-sm"
80025
+ ghost: {
80026
+ kind: "complete",
80027
+ appearance: {
80028
+ background: {
80029
+ type: "surface",
80030
+ role: "link"
79904
80031
  },
79905
- md: { padding: "0.375rem 0" },
79906
- lg: {
79907
- padding: "0.5rem 0",
79908
- fontSize: "text-lg"
80032
+ borderRadius: "rounded-full",
80033
+ shadow: {
80034
+ elevation: "none",
80035
+ softness: null,
80036
+ position: "bottom"
79909
80037
  },
79910
- xl: {
79911
- padding: "0.625rem 0",
79912
- fontSize: "text-xl"
80038
+ sizes: {
80039
+ sm: {
80040
+ padding: "0.25rem 0",
80041
+ fontSize: "text-sm"
80042
+ },
80043
+ md: { padding: "0.375rem 0" },
80044
+ lg: {
80045
+ padding: "0.5rem 0",
80046
+ fontSize: "text-lg"
80047
+ },
80048
+ xl: {
80049
+ padding: "0.625rem 0",
80050
+ fontSize: "text-xl"
80051
+ }
79913
80052
  }
79914
80053
  }
80054
+ },
80055
+ accent: {
80056
+ kind: "derive",
80057
+ from: "primary",
80058
+ overrides: { background: {
80059
+ type: "solid",
80060
+ colorToken: "accent"
80061
+ } }
79915
80062
  }
79916
- ]
80063
+ }
79917
80064
  }
79918
80065
  });
79919
- //#endregion
79920
- //#region ../theme-core/src/buttons/personalities/editorial-link.ts
79921
- /**
79922
- * Editorial Link — all variants are link-style with a growing underline.
79923
- * Default for Warm Editorial and Quiet Luxury; reads as refined and quiet.
79924
- */
79925
- const editorialLink = defineButtonPersonality({
79926
- id: "editorial-link",
79927
- name: "Editorial Link",
79928
- description: "Link-style with a growing underline. Refined, typographic.",
80066
+ const confidentChipRecipe = defineStaticButtonStyleRecipe({
80067
+ id: "confident-chip",
80068
+ accessibilityLabel: "Moderately rounded solid buttons with a crisp hover",
79929
80069
  tags: {
79930
- tone: "minimal",
80070
+ tone: "classic",
79931
80071
  energy: "calm",
79932
- motion: "subtle",
79933
- era: "editorial"
80072
+ motion: "standard",
80073
+ era: "modern"
79934
80074
  },
79935
- buttonSystem: {
80075
+ system: {
79936
80076
  global: {
79937
- cornerStyle: "square",
80077
+ cornerStyle: "rounded",
80078
+ shadow: "medium",
79938
80079
  textTransform: "none",
79939
- fontWeight: 500,
80080
+ fontWeight: 600,
79940
80081
  borderWidth: 1,
79941
80082
  hoverTransform: "none",
79942
80083
  hoverColor: "none"
79943
80084
  },
79944
- variants: [
79945
- {
79946
- id: "primary",
79947
- name: "Primary",
79948
- enabled: true,
79949
- priority: 1,
79950
- background: {
79951
- type: "surface",
79952
- role: "link"
79953
- },
79954
- borderRadius: "rounded-none",
79955
- sizes: {
79956
- sm: { padding: "0.25rem 0" },
79957
- md: { padding: "0.5rem 0" },
79958
- lg: { padding: "0.625rem 0" },
79959
- xl: { padding: "0.75rem 0" }
79960
- },
79961
- effects: { base: [{
79962
- effectId: "border-bottom-grow",
79963
- options: {
79964
- height: 2,
79965
- colorToken: "text",
79966
- origin: "left"
80085
+ roles: {
80086
+ primary: {
80087
+ kind: "complete",
80088
+ appearance: {
80089
+ background: {
80090
+ type: "solid",
80091
+ colorToken: "primary"
80092
+ },
80093
+ borderRadius: "rounded-md",
80094
+ shadow: {
80095
+ elevation: "medium",
80096
+ softness: "soft",
80097
+ position: "bottom"
80098
+ },
80099
+ effects: {
80100
+ hover: [{
80101
+ effectId: "darken-background",
80102
+ options: { amount: 100 }
80103
+ }],
80104
+ active: [{
80105
+ effectId: "scale-down",
80106
+ options: { scale: "0.97" }
80107
+ }]
79967
80108
  }
79968
- }] }
80109
+ }
79969
80110
  },
79970
- {
79971
- id: "secondary",
79972
- name: "Secondary",
79973
- enabled: true,
79974
- priority: 2,
79975
- background: {
79976
- type: "surface",
79977
- role: "link"
79978
- },
79979
- borderRadius: "rounded-none",
79980
- sizes: {
79981
- sm: { padding: "0.25rem 0" },
79982
- md: { padding: "0.5rem 0" },
79983
- lg: { padding: "0.625rem 0" },
79984
- xl: { padding: "0.75rem 0" }
79985
- },
79986
- effects: { base: [{
79987
- effectId: "border-bottom-grow",
79988
- options: {
79989
- height: 1,
79990
- colorToken: "mutedText",
79991
- origin: "left"
79992
- }
79993
- }] }
80111
+ secondary: {
80112
+ kind: "complete",
80113
+ appearance: {
80114
+ background: {
80115
+ type: "solid",
80116
+ colorToken: "surface"
80117
+ },
80118
+ borderRadius: "rounded-md",
80119
+ border: { widthClass: "border" },
80120
+ effects: { hover: [{
80121
+ effectId: "background-on-hover",
80122
+ options: { colorToken: "background" }
80123
+ }] }
80124
+ }
79994
80125
  },
79995
- {
79996
- id: "outline",
79997
- name: "Outline",
79998
- enabled: true,
79999
- priority: 3,
80000
- background: {
80001
- type: "surface",
80002
- role: "link"
80003
- },
80004
- borderRadius: "rounded-none",
80005
- sizes: {
80006
- sm: { padding: "0.25rem 0" },
80007
- md: { padding: "0.5rem 0" },
80008
- lg: { padding: "0.625rem 0" },
80009
- xl: { padding: "0.75rem 0" }
80010
- },
80011
- effects: { base: [{
80012
- effectId: "border-bottom-grow",
80013
- options: {
80014
- height: 1,
80015
- colorToken: "accent",
80016
- origin: "left"
80017
- }
80018
- }] }
80126
+ outline: {
80127
+ kind: "complete",
80128
+ appearance: {
80129
+ background: {
80130
+ type: "surface",
80131
+ role: "link"
80132
+ },
80133
+ borderRadius: "rounded-md",
80134
+ border: { widthClass: "border" },
80135
+ effects: { hover: [{
80136
+ effectId: "background-on-hover",
80137
+ options: { colorToken: "surface" }
80138
+ }] }
80139
+ }
80019
80140
  },
80020
- {
80021
- id: "ghost",
80022
- name: "Ghost",
80023
- enabled: true,
80024
- priority: 3,
80025
- background: {
80026
- type: "surface",
80027
- role: "link"
80028
- },
80029
- borderRadius: "rounded-none",
80030
- sizes: {
80031
- sm: { padding: "0.25rem 0" },
80032
- md: { padding: "0.5rem 0" },
80033
- lg: { padding: "0.625rem 0" },
80034
- xl: { padding: "0.75rem 0" }
80141
+ ghost: {
80142
+ kind: "complete",
80143
+ appearance: {
80144
+ background: {
80145
+ type: "surface",
80146
+ role: "link"
80147
+ },
80148
+ borderRadius: "rounded-md",
80149
+ effects: { hover: [{
80150
+ effectId: "background-on-hover",
80151
+ options: { colorToken: "surface" }
80152
+ }] }
80035
80153
  }
80154
+ },
80155
+ accent: {
80156
+ kind: "derive",
80157
+ from: "primary",
80158
+ overrides: { background: {
80159
+ type: "solid",
80160
+ colorToken: "accent"
80161
+ } }
80036
80162
  }
80037
- ]
80163
+ }
80038
80164
  }
80039
80165
  });
80040
- //#endregion
80041
- //#region ../theme-core/src/buttons/personalities/flat-ink.ts
80042
- /**
80043
- * Flat Ink — a solid ink primary, a hairline ghost secondary, and a single
80044
- * amber accent climax, all completely flat (no drop shadow) with a modest
80045
- * radius. Reads as grounded, editorial and clinician-precise: the Fulcrum
80046
- * physiotherapy voice. The primary shifts to the secondary (moss) on hover and
80047
- * every variant lifts 2px; the amber accent is meant to be used sparingly as
80048
- * the page's one conversion climax.
80049
- */
80050
- const flatInk = defineButtonPersonality({
80051
- id: "flat-ink",
80052
- name: "Flat Ink",
80053
- description: "Flat solid-ink primary, hairline ghost secondary, and a single amber accent climax — modest radius, no shadow.",
80166
+ const editorialSizes = {
80167
+ sm: { padding: "0.25rem 0" },
80168
+ md: { padding: "0.5rem 0" },
80169
+ lg: { padding: "0.625rem 0" },
80170
+ xl: { padding: "0.75rem 0" }
80171
+ };
80172
+ const editorialLinkRecipe = defineStaticButtonStyleRecipe({
80173
+ id: "editorial-link",
80174
+ accessibilityLabel: "Flat typographic buttons with an underline treatment",
80054
80175
  tags: {
80055
- tone: "classic",
80176
+ tone: "minimal",
80056
80177
  energy: "calm",
80057
80178
  motion: "subtle",
80058
80179
  era: "editorial"
80059
80180
  },
80060
- buttonSystem: {
80181
+ system: {
80061
80182
  global: {
80062
- cornerStyle: "rounded",
80183
+ cornerStyle: "square",
80063
80184
  textTransform: "none",
80064
- fontWeight: 600,
80185
+ fontWeight: 500,
80065
80186
  borderWidth: 1,
80066
- typography: "body",
80067
- letterSpacing: "tight",
80068
- paddingPreset: "default",
80069
- hoverTransform: "lift",
80187
+ hoverTransform: "none",
80070
80188
  hoverColor: "none"
80071
80189
  },
80072
- sizes: {
80073
- sm: {
80074
- padding: "0.625rem 1.125rem",
80075
- fontSize: "text-sm"
80190
+ roles: {
80191
+ primary: {
80192
+ kind: "complete",
80193
+ appearance: {
80194
+ background: {
80195
+ type: "surface",
80196
+ role: "link"
80197
+ },
80198
+ borderRadius: "rounded-none",
80199
+ sizes: editorialSizes,
80200
+ effects: { base: [{
80201
+ effectId: "border-bottom-grow",
80202
+ options: {
80203
+ height: 2,
80204
+ colorToken: "text",
80205
+ origin: "left"
80206
+ }
80207
+ }] }
80208
+ }
80076
80209
  },
80077
- md: { padding: "0.8125rem 1.375rem" },
80078
- lg: {
80079
- padding: "0.9375rem 1.625rem",
80080
- fontSize: "text-lg"
80210
+ secondary: {
80211
+ kind: "complete",
80212
+ appearance: {
80213
+ background: {
80214
+ type: "surface",
80215
+ role: "link"
80216
+ },
80217
+ borderRadius: "rounded-none",
80218
+ sizes: editorialSizes,
80219
+ effects: { base: [{
80220
+ effectId: "border-bottom-grow",
80221
+ options: {
80222
+ height: 1,
80223
+ colorToken: "mutedText",
80224
+ origin: "left"
80225
+ }
80226
+ }] }
80227
+ }
80081
80228
  },
80082
- xl: {
80083
- padding: "1.0625rem 2rem",
80084
- fontSize: "text-xl"
80085
- }
80086
- },
80087
- variants: [
80088
- {
80089
- id: "primary",
80090
- name: "Primary",
80091
- enabled: true,
80092
- priority: 1,
80093
- background: {
80094
- type: "solid",
80095
- colorToken: "primary"
80096
- },
80097
- borderRadius: "rounded-lg",
80098
- affordance: { iconId: "ArrowRight" },
80099
- effects: { hover: [{
80100
- effectId: "lift",
80101
- options: { translateY: "-2px" }
80102
- }, {
80103
- effectId: "background-on-hover",
80104
- options: { colorToken: "secondary" }
80105
- }] }
80229
+ outline: {
80230
+ kind: "complete",
80231
+ appearance: {
80232
+ background: {
80233
+ type: "surface",
80234
+ role: "link"
80235
+ },
80236
+ borderRadius: "rounded-none",
80237
+ sizes: editorialSizes,
80238
+ effects: { base: [{
80239
+ effectId: "border-bottom-grow",
80240
+ options: {
80241
+ height: 1,
80242
+ colorToken: "accent",
80243
+ origin: "left"
80244
+ }
80245
+ }] }
80246
+ }
80106
80247
  },
80107
- {
80108
- id: "secondary",
80109
- name: "Secondary",
80110
- enabled: true,
80111
- priority: 2,
80112
- background: {
80113
- type: "surface",
80114
- role: "link"
80115
- },
80116
- borderRadius: "rounded-lg",
80117
- border: { widthClass: "border" },
80118
- effects: { hover: [{
80119
- effectId: "lift",
80120
- options: { translateY: "-2px" }
80121
- }, {
80122
- effectId: "background-on-hover",
80123
- options: { colorToken: "surfaceAlt" }
80124
- }] }
80248
+ ghost: {
80249
+ kind: "complete",
80250
+ appearance: {
80251
+ background: {
80252
+ type: "surface",
80253
+ role: "link"
80254
+ },
80255
+ borderRadius: "rounded-none",
80256
+ sizes: editorialSizes
80257
+ }
80125
80258
  },
80126
- {
80127
- id: "accent",
80128
- name: "Accent",
80129
- enabled: true,
80130
- priority: 3,
80131
- background: {
80132
- type: "solid",
80133
- colorToken: "accent"
80134
- },
80135
- borderRadius: "rounded-lg",
80136
- affordance: { iconId: "ArrowRight" },
80137
- effects: { hover: [{
80138
- effectId: "lift",
80139
- options: { translateY: "-2px" }
80140
- }] }
80259
+ accent: {
80260
+ kind: "derive",
80261
+ from: "primary",
80262
+ overrides: { effects: { base: [{
80263
+ effectId: "border-bottom-grow",
80264
+ options: {
80265
+ height: 2,
80266
+ colorToken: "accent",
80267
+ origin: "left"
80268
+ }
80269
+ }] } }
80141
80270
  }
80142
- ]
80271
+ }
80143
80272
  }
80144
80273
  });
80145
- //#endregion
80146
- //#region ../theme-core/src/buttons/personalities/ink-stamp.ts
80147
- /**
80148
- * Ink Stamp — solid earthy fills with a bordered, hand-stamped block-print
80149
- * feel. Reads as bold and handmade; suits expressive craft brands.
80150
- */
80151
- const inkStamp = defineButtonPersonality({
80152
- id: "ink-stamp",
80153
- name: "Ink Stamp",
80154
- description: "Hand-stamped block-print buttons with a slight lift on hover.",
80274
+ const pebbleRecipe = defineStaticButtonStyleRecipe({
80275
+ id: "pebble",
80276
+ accessibilityLabel: "Generously padded pill buttons",
80155
80277
  tags: {
80156
- tone: "bold",
80157
- energy: "vibrant",
80278
+ tone: "classic",
80279
+ energy: "calm",
80158
80280
  motion: "standard",
80159
80281
  era: "organic"
80160
80282
  },
80161
- buttonSystem: {
80283
+ system: {
80162
80284
  global: {
80163
- cornerStyle: "rounded",
80164
- textTransform: "uppercase",
80165
- fontWeight: 600,
80166
- borderWidth: 1,
80285
+ cornerStyle: "pill",
80286
+ textTransform: "none",
80287
+ fontWeight: 500,
80288
+ borderWidth: 2,
80167
80289
  hoverTransform: "none",
80168
- hoverColor: "none",
80169
- letterSpacing: "loose"
80290
+ hoverColor: "none"
80170
80291
  },
80171
80292
  sizes: {
80172
80293
  sm: {
80173
- padding: "0.5rem 1.25rem",
80174
- fontSize: "text-xs"
80175
- },
80176
- md: {
80177
- padding: "0.75rem 1.75rem",
80294
+ padding: "0.625rem 1.75rem",
80178
80295
  fontSize: "text-sm"
80179
80296
  },
80297
+ md: { padding: "0.875rem 2.25rem" },
80180
80298
  lg: {
80181
- padding: "0.875rem 2.25rem",
80182
- fontSize: "text-base"
80183
- },
80184
- xl: {
80185
80299
  padding: "1.125rem 2.75rem",
80186
80300
  fontSize: "text-lg"
80301
+ },
80302
+ xl: {
80303
+ padding: "1.5rem 3.5rem",
80304
+ fontSize: "text-xl"
80187
80305
  }
80188
80306
  },
80189
- variants: [
80190
- {
80191
- id: "primary",
80192
- name: "Primary",
80193
- enabled: true,
80194
- priority: 1,
80195
- background: {
80196
- type: "solid",
80197
- colorToken: "primary"
80198
- },
80199
- borderRadius: "rounded-md",
80200
- effects: {
80201
- hover: [{
80202
- effectId: "drop-shadow",
80203
- options: { intensity: "medium" }
80204
- }, {
80205
- effectId: "scale-up",
80206
- options: { scale: "1.02" }
80207
- }],
80208
- active: [{
80209
- effectId: "scale-down",
80210
- options: { scale: "0.98" }
80211
- }]
80307
+ roles: {
80308
+ primary: {
80309
+ kind: "complete",
80310
+ appearance: {
80311
+ background: {
80312
+ type: "solid",
80313
+ colorToken: "primary"
80314
+ },
80315
+ borderRadius: "rounded-full",
80316
+ effects: { hover: [{
80317
+ effectId: "darken-background",
80318
+ options: { amount: 100 }
80319
+ }] }
80212
80320
  }
80213
80321
  },
80214
- {
80215
- id: "secondary",
80216
- name: "Secondary",
80217
- enabled: true,
80218
- priority: 2,
80219
- background: {
80220
- type: "surface",
80221
- role: "link"
80222
- },
80223
- borderRadius: "rounded-md",
80224
- border: { widthClass: "border-2" },
80225
- effects: { hover: [{
80226
- effectId: "background-on-hover",
80227
- options: { colorToken: "surface" }
80228
- }] }
80229
- },
80230
- {
80231
- id: "outline",
80232
- name: "Outline",
80233
- enabled: true,
80234
- priority: 3,
80235
- background: {
80236
- type: "surface",
80237
- role: "link"
80238
- },
80239
- borderRadius: "rounded-md",
80240
- border: { widthClass: "border-2" },
80241
- effects: { hover: [{
80242
- effectId: "background-on-hover",
80243
- options: { colorToken: "surface" }
80244
- }] }
80245
- },
80246
- {
80247
- id: "ghost",
80248
- name: "Ghost",
80249
- enabled: true,
80250
- priority: 3,
80251
- background: {
80252
- type: "surface",
80253
- role: "link"
80254
- },
80255
- borderRadius: "rounded-none",
80256
- sizes: {
80257
- sm: {
80258
- padding: "0.375rem 0",
80259
- fontSize: "text-xs"
80322
+ secondary: {
80323
+ kind: "complete",
80324
+ appearance: {
80325
+ background: {
80326
+ type: "surface",
80327
+ role: "link"
80260
80328
  },
80261
- md: {
80262
- padding: "0.5rem 0",
80263
- fontSize: "text-sm"
80329
+ borderRadius: "rounded-full",
80330
+ border: { widthClass: "border-2" },
80331
+ effects: { hover: [{
80332
+ effectId: "background-on-hover",
80333
+ options: { colorToken: "accent" }
80334
+ }] }
80335
+ }
80336
+ },
80337
+ outline: {
80338
+ kind: "complete",
80339
+ appearance: {
80340
+ background: {
80341
+ type: "surface",
80342
+ role: "link"
80264
80343
  },
80265
- lg: {
80266
- padding: "0.625rem 0",
80267
- fontSize: "text-base"
80344
+ borderRadius: "rounded-full",
80345
+ border: { widthClass: "border" },
80346
+ effects: { hover: [{
80347
+ effectId: "background-on-hover",
80348
+ options: { colorToken: "surface" }
80349
+ }] }
80350
+ }
80351
+ },
80352
+ ghost: {
80353
+ kind: "complete",
80354
+ appearance: {
80355
+ background: {
80356
+ type: "surface",
80357
+ role: "link"
80268
80358
  },
80269
- xl: {
80270
- padding: "0.75rem 0",
80271
- fontSize: "text-lg"
80272
- }
80273
- },
80274
- effects: { base: [{
80275
- effectId: "border-bottom-grow",
80276
- options: {
80277
- height: 1,
80278
- colorToken: "accent",
80279
- origin: "left"
80359
+ borderRadius: "rounded-full",
80360
+ sizes: {
80361
+ sm: {
80362
+ padding: "0.375rem 0.875rem",
80363
+ fontSize: "text-sm"
80364
+ },
80365
+ md: { padding: "0.5rem 1rem" },
80366
+ lg: {
80367
+ padding: "0.625rem 1.25rem",
80368
+ fontSize: "text-lg"
80369
+ },
80370
+ xl: {
80371
+ padding: "0.75rem 1.5rem",
80372
+ fontSize: "text-xl"
80373
+ }
80280
80374
  }
80281
- }] }
80375
+ }
80376
+ },
80377
+ accent: {
80378
+ kind: "derive",
80379
+ from: "primary",
80380
+ overrides: { background: {
80381
+ type: "solid",
80382
+ colorToken: "accent"
80383
+ } }
80282
80384
  }
80283
- ]
80385
+ }
80284
80386
  }
80285
80387
  });
80286
- //#endregion
80287
- //#region ../theme-core/src/buttons/personalities/joy-stamp.ts
80288
- /**
80289
- * Joy Stamp — neo-brutalist pills with a hard, brand-coloured offset shadow
80290
- * that collapses as the button presses into it on hover. Authored for the
80291
- * Original Joy site style: a cream "stamp" shadow under the solid primary, and
80292
- * a brown shadow under the cream outline. Reads as bold, warm, and handmade.
80293
- *
80294
- * The coloured offset shadow relies on the per-variant `shadow.colorToken`
80295
- * extension; the press is the shared `press-down` effect, which matches its
80296
- * translate to each variant's own shadow offset.
80297
- */
80298
- const joyStamp = defineButtonPersonality({
80299
- id: "joy-stamp",
80300
- name: "Joy Stamp",
80301
- description: "Pill buttons with a hard, brand-coloured offset shadow that presses in on hover.",
80388
+ const brushedWashRecipe = defineStaticButtonStyleRecipe({
80389
+ id: "brushed-wash",
80390
+ accessibilityLabel: "Generously padded gradient buttons with soft shadows",
80302
80391
  tags: {
80303
- tone: "bold",
80392
+ tone: "classic",
80304
80393
  energy: "vibrant",
80305
- motion: "expressive",
80394
+ motion: "standard",
80306
80395
  era: "organic"
80307
80396
  },
80308
- buttonSystem: {
80397
+ system: {
80309
80398
  global: {
80310
- cornerStyle: "pill",
80311
- shadow: "high",
80399
+ cornerStyle: "rounded",
80400
+ shadow: "low",
80312
80401
  textTransform: "none",
80313
- typography: "heading",
80314
- fontWeight: 700,
80315
- fontSize: "text-lg",
80316
- borderWidth: 2,
80402
+ fontWeight: 500,
80403
+ borderWidth: 1,
80317
80404
  hoverTransform: "none",
80318
80405
  hoverColor: "none"
80319
80406
  },
80320
80407
  sizes: {
80321
80408
  sm: {
80322
- padding: "0.625rem 1.25rem",
80323
- fontSize: "text-base"
80324
- },
80325
- md: {
80326
- padding: "0.875rem 1.75rem",
80327
- fontSize: "text-lg"
80409
+ padding: "0.75rem 2rem",
80410
+ fontSize: "text-sm"
80328
80411
  },
80412
+ md: { padding: "1rem 2.5rem" },
80329
80413
  lg: {
80330
- padding: "1.125rem 2.25rem",
80331
- fontSize: "text-xl"
80414
+ padding: "1.25rem 3rem",
80415
+ fontSize: "text-lg"
80332
80416
  },
80333
80417
  xl: {
80334
- padding: "1.25rem 2.75rem",
80335
- fontSize: "text-2xl"
80418
+ padding: "1.625rem 3.75rem",
80419
+ fontSize: "text-xl"
80336
80420
  }
80337
80421
  },
80338
- variants: [{
80339
- id: "primary",
80340
- name: "Primary",
80341
- enabled: true,
80342
- priority: 1,
80343
- background: {
80344
- type: "solid",
80345
- colorToken: "primary"
80422
+ roles: {
80423
+ primary: {
80424
+ kind: "complete",
80425
+ appearance: {
80426
+ background: {
80427
+ type: "gradient",
80428
+ stops: ["primary", "accent"],
80429
+ direction: "to-r",
80430
+ foregroundToken: "primaryForeground"
80431
+ },
80432
+ borderRadius: "rounded-lg",
80433
+ shadow: {
80434
+ elevation: "low",
80435
+ softness: "soft",
80436
+ position: "bottom"
80437
+ }
80438
+ }
80346
80439
  },
80347
- borderRadius: "rounded-full",
80348
- shadow: {
80349
- elevation: "high",
80350
- softness: "hard",
80351
- position: "bottom-right",
80352
- colorToken: "text"
80440
+ secondary: {
80441
+ kind: "complete",
80442
+ appearance: {
80443
+ background: {
80444
+ type: "gradient",
80445
+ stops: ["secondary", "accent"],
80446
+ direction: "to-br",
80447
+ foregroundToken: "primaryForeground"
80448
+ },
80449
+ borderRadius: "rounded-lg",
80450
+ shadow: {
80451
+ elevation: "low",
80452
+ softness: "soft",
80453
+ position: "bottom"
80454
+ }
80455
+ }
80353
80456
  },
80354
- effects: { hover: [{ effectId: "press-down" }] }
80355
- }, {
80356
- id: "secondary",
80357
- name: "Secondary",
80358
- enabled: true,
80359
- priority: 2,
80360
- background: {
80361
- type: "surface",
80362
- role: "link"
80457
+ outline: {
80458
+ kind: "complete",
80459
+ appearance: {
80460
+ background: {
80461
+ type: "surface",
80462
+ role: "link"
80463
+ },
80464
+ borderRadius: "rounded-lg",
80465
+ border: { widthClass: "border" },
80466
+ effects: { hover: [{
80467
+ effectId: "background-on-hover",
80468
+ options: { colorToken: "surface" }
80469
+ }] }
80470
+ }
80363
80471
  },
80364
- borderRadius: "rounded-full",
80365
- border: { widthClass: "border-2" },
80366
- shadow: {
80367
- elevation: "high",
80368
- softness: "hard",
80369
- position: "bottom-right",
80370
- colorToken: "secondary"
80472
+ ghost: {
80473
+ kind: "complete",
80474
+ appearance: {
80475
+ background: {
80476
+ type: "surface",
80477
+ role: "link"
80478
+ },
80479
+ borderRadius: "rounded-lg",
80480
+ effects: { hover: [{
80481
+ effectId: "background-on-hover",
80482
+ options: { colorToken: "surface" }
80483
+ }] }
80484
+ }
80371
80485
  },
80372
- effects: { hover: [{ effectId: "press-down" }] }
80373
- }]
80486
+ accent: {
80487
+ kind: "derive",
80488
+ from: "primary",
80489
+ overrides: { background: {
80490
+ type: "solid",
80491
+ colorToken: "accent"
80492
+ } }
80493
+ }
80494
+ }
80374
80495
  }
80375
80496
  });
80376
- //#endregion
80377
- //#region ../theme-core/src/buttons/personalities/ornate-ritual.ts
80378
- /**
80379
- * Ornate Ritual — framed, ceremonial buttons with jewel-toned fills and
80380
- * deliberate spacing. Designed for music, ceremony, and soulful event sites.
80381
- */
80382
- const ornateRitual = defineButtonPersonality({
80383
- id: "ornate-ritual",
80384
- name: "Ornate Ritual",
80385
- description: "Ceremonial framed buttons with jewel-toned fills and quiet color-change hover states.",
80497
+ const inkStampRecipe = defineStaticButtonStyleRecipe({
80498
+ id: "ink-stamp",
80499
+ accessibilityLabel: "Uppercase block-print buttons with a playful hover",
80386
80500
  tags: {
80387
- tone: "classic",
80501
+ tone: "bold",
80388
80502
  energy: "vibrant",
80389
- motion: "subtle",
80503
+ motion: "standard",
80390
80504
  era: "organic"
80391
80505
  },
80392
- buttonSystem: {
80506
+ system: {
80393
80507
  global: {
80394
80508
  cornerStyle: "rounded",
80395
80509
  textTransform: "uppercase",
@@ -80401,359 +80515,256 @@ const ornateRitual = defineButtonPersonality({
80401
80515
  },
80402
80516
  sizes: {
80403
80517
  sm: {
80404
- padding: "0.5625rem 1.25rem",
80518
+ padding: "0.5rem 1.25rem",
80405
80519
  fontSize: "text-xs"
80406
80520
  },
80407
80521
  md: {
80408
80522
  padding: "0.75rem 1.75rem",
80409
- fontSize: "text-xs"
80523
+ fontSize: "text-sm"
80410
80524
  },
80411
80525
  lg: {
80412
80526
  padding: "0.875rem 2.25rem",
80413
- fontSize: "text-sm"
80414
- },
80415
- xl: {
80416
- padding: "1rem 2.75rem",
80417
80527
  fontSize: "text-base"
80418
- }
80419
- },
80420
- variants: [
80421
- {
80422
- id: "primary",
80423
- name: "Primary",
80424
- enabled: true,
80425
- priority: 1,
80426
- background: {
80427
- type: "solid",
80428
- colorToken: "primary"
80429
- },
80430
- borderRadius: "rounded-md",
80431
- border: { widthClass: "border" },
80432
- effects: {
80433
- hover: [{
80434
- effectId: "background-on-hover",
80435
- options: { colorToken: "primary-100" }
80436
- }],
80437
- active: [{
80438
- effectId: "scale-down",
80439
- options: { scale: "0.98" }
80440
- }]
80441
- }
80442
- },
80443
- {
80444
- id: "secondary",
80445
- name: "Secondary",
80446
- enabled: true,
80447
- priority: 2,
80448
- background: {
80449
- type: "solid",
80450
- colorToken: "secondary"
80451
- },
80452
- borderRadius: "rounded-md",
80453
- border: { widthClass: "border" },
80454
- effects: { hover: [{
80455
- effectId: "background-on-hover",
80456
- options: { colorToken: "surface" }
80457
- }] }
80458
80528
  },
80459
- {
80460
- id: "outline",
80461
- name: "Outline",
80462
- enabled: true,
80463
- priority: 3,
80464
- background: {
80465
- type: "surface",
80466
- role: "link"
80467
- },
80468
- borderRadius: "rounded-md",
80469
- border: { widthClass: "border" },
80470
- effects: { hover: [{
80471
- effectId: "background-on-hover",
80472
- options: { colorToken: "muted" }
80473
- }] }
80474
- },
80475
- {
80476
- id: "ghost",
80477
- name: "Ghost",
80478
- enabled: true,
80479
- priority: 3,
80480
- background: {
80481
- type: "surface",
80482
- role: "link"
80483
- },
80484
- borderRadius: "rounded-none",
80485
- sizes: {
80486
- sm: {
80487
- padding: "0.375rem 0",
80488
- fontSize: "text-xs"
80489
- },
80490
- md: {
80491
- padding: "0.5rem 0",
80492
- fontSize: "text-sm"
80493
- },
80494
- lg: {
80495
- padding: "0.625rem 0",
80496
- fontSize: "text-base"
80497
- },
80498
- xl: {
80499
- padding: "0.75rem 0",
80500
- fontSize: "text-lg"
80501
- }
80502
- },
80503
- effects: { base: [{
80504
- effectId: "border-bottom-grow",
80505
- options: {
80506
- height: 1,
80507
- colorToken: "accent",
80508
- origin: "left"
80509
- }
80510
- }] }
80511
- }
80512
- ]
80513
- }
80514
- });
80515
- //#endregion
80516
- //#region ../theme-core/src/buttons/personalities/pebble.ts
80517
- /**
80518
- * Pebble — large pill primaries with generous padding. Reads as spa-luxurious
80519
- * and natural; pairs well with wellness/yoga/dance brands.
80520
- */
80521
- const pebble = defineButtonPersonality({
80522
- id: "pebble",
80523
- name: "Pebble",
80524
- description: "Generous pill buttons with a quiet colour-softening hover.",
80525
- tags: {
80526
- tone: "classic",
80527
- energy: "calm",
80528
- motion: "standard",
80529
- era: "organic"
80530
- },
80531
- buttonSystem: {
80532
- global: {
80533
- cornerStyle: "pill",
80534
- textTransform: "none",
80535
- fontWeight: 500,
80536
- borderWidth: 2,
80537
- hoverTransform: "none",
80538
- hoverColor: "none"
80539
- },
80540
- sizes: {
80541
- sm: {
80542
- padding: "0.625rem 1.75rem",
80543
- fontSize: "text-sm"
80544
- },
80545
- md: { padding: "0.875rem 2.25rem" },
80546
- lg: {
80529
+ xl: {
80547
80530
  padding: "1.125rem 2.75rem",
80548
80531
  fontSize: "text-lg"
80549
- },
80550
- xl: {
80551
- padding: "1.5rem 3.5rem",
80552
- fontSize: "text-xl"
80553
80532
  }
80554
80533
  },
80555
- variants: [
80556
- {
80557
- id: "primary",
80558
- name: "Primary",
80559
- enabled: true,
80560
- priority: 1,
80561
- background: {
80562
- type: "solid",
80563
- colorToken: "primary"
80564
- },
80565
- borderRadius: "rounded-full",
80566
- effects: { hover: [{
80567
- effectId: "darken-background",
80568
- options: { amount: 100 }
80569
- }] }
80534
+ roles: {
80535
+ primary: {
80536
+ kind: "complete",
80537
+ appearance: {
80538
+ background: {
80539
+ type: "solid",
80540
+ colorToken: "primary"
80541
+ },
80542
+ borderRadius: "rounded-md",
80543
+ effects: {
80544
+ hover: [{
80545
+ effectId: "drop-shadow",
80546
+ options: { intensity: "medium" }
80547
+ }, {
80548
+ effectId: "scale-up",
80549
+ options: { scale: "1.02" }
80550
+ }],
80551
+ active: [{
80552
+ effectId: "scale-down",
80553
+ options: { scale: "0.98" }
80554
+ }]
80555
+ }
80556
+ }
80570
80557
  },
80571
- {
80572
- id: "secondary",
80573
- name: "Secondary",
80574
- enabled: true,
80575
- priority: 2,
80576
- background: {
80577
- type: "surface",
80578
- role: "link"
80579
- },
80580
- borderRadius: "rounded-full",
80581
- border: { widthClass: "border-2" },
80582
- effects: { hover: [{
80583
- effectId: "background-on-hover",
80584
- options: { colorToken: "accent" }
80585
- }] }
80558
+ secondary: {
80559
+ kind: "complete",
80560
+ appearance: {
80561
+ background: {
80562
+ type: "surface",
80563
+ role: "link"
80564
+ },
80565
+ borderRadius: "rounded-md",
80566
+ border: { widthClass: "border-2" },
80567
+ effects: { hover: [{
80568
+ effectId: "background-on-hover",
80569
+ options: { colorToken: "surface" }
80570
+ }] }
80571
+ }
80586
80572
  },
80587
- {
80588
- id: "outline",
80589
- name: "Outline",
80590
- enabled: true,
80591
- priority: 3,
80592
- background: {
80593
- type: "surface",
80594
- role: "link"
80595
- },
80596
- borderRadius: "rounded-full",
80597
- border: { widthClass: "border" },
80598
- effects: { hover: [{
80599
- effectId: "background-on-hover",
80600
- options: { colorToken: "surface" }
80601
- }] }
80573
+ outline: {
80574
+ kind: "complete",
80575
+ appearance: {
80576
+ background: {
80577
+ type: "surface",
80578
+ role: "link"
80579
+ },
80580
+ borderRadius: "rounded-md",
80581
+ border: { widthClass: "border-2" },
80582
+ effects: { hover: [{
80583
+ effectId: "background-on-hover",
80584
+ options: { colorToken: "surface" }
80585
+ }] }
80586
+ }
80602
80587
  },
80603
- {
80604
- id: "ghost",
80605
- name: "Ghost",
80606
- enabled: true,
80607
- priority: 3,
80608
- background: {
80609
- type: "surface",
80610
- role: "link"
80611
- },
80612
- borderRadius: "rounded-full",
80613
- sizes: {
80614
- sm: {
80615
- padding: "0.375rem 0.875rem",
80616
- fontSize: "text-sm"
80588
+ ghost: {
80589
+ kind: "complete",
80590
+ appearance: {
80591
+ background: {
80592
+ type: "surface",
80593
+ role: "link"
80617
80594
  },
80618
- md: { padding: "0.5rem 1rem" },
80619
- lg: {
80620
- padding: "0.625rem 1.25rem",
80621
- fontSize: "text-lg"
80595
+ borderRadius: "rounded-none",
80596
+ sizes: {
80597
+ sm: {
80598
+ padding: "0.375rem 0",
80599
+ fontSize: "text-xs"
80600
+ },
80601
+ md: {
80602
+ padding: "0.5rem 0",
80603
+ fontSize: "text-sm"
80604
+ },
80605
+ lg: {
80606
+ padding: "0.625rem 0",
80607
+ fontSize: "text-base"
80608
+ },
80609
+ xl: {
80610
+ padding: "0.75rem 0",
80611
+ fontSize: "text-lg"
80612
+ }
80622
80613
  },
80623
- xl: {
80624
- padding: "0.75rem 1.5rem",
80625
- fontSize: "text-xl"
80626
- }
80614
+ effects: { base: [{
80615
+ effectId: "border-bottom-grow",
80616
+ options: {
80617
+ height: 1,
80618
+ colorToken: "accent",
80619
+ origin: "left"
80620
+ }
80621
+ }] }
80627
80622
  }
80623
+ },
80624
+ accent: {
80625
+ kind: "derive",
80626
+ from: "primary",
80627
+ overrides: { background: {
80628
+ type: "solid",
80629
+ colorToken: "accent"
80630
+ } }
80628
80631
  }
80629
- ]
80632
+ }
80630
80633
  }
80631
80634
  });
80632
- //#endregion
80633
- //#region ../theme-core/src/buttons/personalities/quiet-arrow.ts
80634
- /**
80635
- * Quiet Arrow — wide, flat editorial buttons for grounded service businesses.
80636
- * Primary and secondary keep stable semantic colours; surrounding surfaces are
80637
- * responsible for contrast rather than reversing the button roles.
80638
- */
80639
- const quietArrow = defineButtonPersonality({
80640
- id: "quiet-arrow",
80641
- name: "Quiet Arrow",
80642
- description: "Wide, flat arrow buttons with a solid primary and a primary-colour outlined secondary.",
80635
+ const flatInkRecipe = defineStaticButtonStyleRecipe({
80636
+ id: "flat-ink",
80637
+ accessibilityLabel: "Flat rounded buttons with arrow affordances",
80643
80638
  tags: {
80644
80639
  tone: "classic",
80645
80640
  energy: "calm",
80646
80641
  motion: "subtle",
80647
80642
  era: "editorial"
80648
80643
  },
80649
- buttonSystem: {
80644
+ system: {
80650
80645
  global: {
80651
80646
  cornerStyle: "rounded",
80652
- textTransform: "uppercase",
80653
- fontWeight: 500,
80647
+ textTransform: "none",
80648
+ fontWeight: 600,
80654
80649
  borderWidth: 1,
80655
80650
  typography: "body",
80656
- fontSize: "text-sm",
80657
- letterSpacing: "loose",
80658
- hoverTransform: "none",
80651
+ letterSpacing: "tight",
80652
+ paddingPreset: "default",
80653
+ hoverTransform: "lift",
80659
80654
  hoverColor: "none"
80660
80655
  },
80661
80656
  sizes: {
80662
80657
  sm: {
80663
- padding: "0.625rem 1.25rem",
80664
- fontSize: "text-xs"
80665
- },
80666
- md: {
80667
- padding: "0.8125rem 1.75rem",
80658
+ padding: "0.625rem 1.125rem",
80668
80659
  fontSize: "text-sm"
80669
80660
  },
80661
+ md: { padding: "0.8125rem 1.375rem" },
80670
80662
  lg: {
80671
- padding: "0.9375rem 2.125rem",
80672
- fontSize: "text-sm"
80663
+ padding: "0.9375rem 1.625rem",
80664
+ fontSize: "text-lg"
80673
80665
  },
80674
80666
  xl: {
80675
- padding: "1.0625rem 2.5rem",
80676
- fontSize: "text-base"
80667
+ padding: "1.0625rem 2rem",
80668
+ fontSize: "text-xl"
80677
80669
  }
80678
80670
  },
80679
- variants: [
80680
- {
80681
- id: "primary",
80682
- name: "Primary",
80683
- enabled: true,
80684
- priority: 1,
80685
- background: {
80686
- type: "solid",
80687
- colorToken: "primary"
80688
- },
80689
- borderRadius: "rounded-xl",
80690
- affordance: { iconId: "ArrowRight" },
80691
- effects: { hover: [{
80692
- effectId: "darken-background",
80693
- options: { amount: 100 }
80694
- }] }
80671
+ roles: {
80672
+ primary: {
80673
+ kind: "complete",
80674
+ appearance: {
80675
+ background: {
80676
+ type: "solid",
80677
+ colorToken: "primary"
80678
+ },
80679
+ borderRadius: "rounded-lg",
80680
+ affordance: { iconId: "ArrowRight" },
80681
+ effects: { hover: [{
80682
+ effectId: "lift",
80683
+ options: { translateY: "-2px" }
80684
+ }, {
80685
+ effectId: "background-on-hover",
80686
+ options: { colorToken: "secondary" }
80687
+ }] }
80688
+ }
80695
80689
  },
80696
- {
80697
- id: "secondary",
80698
- name: "Secondary",
80699
- enabled: true,
80700
- priority: 2,
80701
- background: {
80702
- type: "surface",
80703
- role: "link"
80704
- },
80705
- borderRadius: "rounded-xl",
80706
- border: { widthClass: "border" },
80707
- affordance: { iconId: "ArrowRight" },
80708
- effects: { hover: [{
80709
- effectId: "background-on-hover",
80710
- options: { colorToken: "surfaceAlt" }
80711
- }] }
80690
+ secondary: {
80691
+ kind: "complete",
80692
+ appearance: {
80693
+ background: {
80694
+ type: "surface",
80695
+ role: "link"
80696
+ },
80697
+ borderRadius: "rounded-lg",
80698
+ border: { widthClass: "border" },
80699
+ effects: { hover: [{
80700
+ effectId: "lift",
80701
+ options: { translateY: "-2px" }
80702
+ }, {
80703
+ effectId: "background-on-hover",
80704
+ options: { colorToken: "surfaceAlt" }
80705
+ }] }
80706
+ }
80712
80707
  },
80713
- {
80714
- id: "outline",
80715
- name: "Outline",
80716
- enabled: true,
80717
- priority: 3,
80718
- background: {
80719
- type: "surface",
80720
- role: "link"
80721
- },
80722
- borderRadius: "rounded-xl",
80723
- border: { widthClass: "border" }
80708
+ outline: {
80709
+ kind: "complete",
80710
+ appearance: {
80711
+ background: {
80712
+ type: "surface",
80713
+ role: "link"
80714
+ },
80715
+ borderRadius: "rounded-lg",
80716
+ border: { widthClass: "border" },
80717
+ effects: { hover: [{
80718
+ effectId: "lift",
80719
+ options: { translateY: "-2px" }
80720
+ }, {
80721
+ effectId: "background-on-hover",
80722
+ options: { colorToken: "surfaceAlt" }
80723
+ }] }
80724
+ }
80724
80725
  },
80725
- {
80726
- id: "ghost",
80727
- name: "Ghost",
80728
- enabled: true,
80729
- priority: 3,
80730
- background: {
80731
- type: "surface",
80732
- role: "link"
80733
- },
80734
- borderRadius: "rounded-xl"
80726
+ ghost: {
80727
+ kind: "complete",
80728
+ appearance: {
80729
+ background: {
80730
+ type: "surface",
80731
+ role: "link"
80732
+ },
80733
+ borderRadius: "rounded-lg",
80734
+ effects: { hover: [{
80735
+ effectId: "lift",
80736
+ options: { translateY: "-2px" }
80737
+ }] }
80738
+ }
80739
+ },
80740
+ accent: {
80741
+ kind: "complete",
80742
+ appearance: {
80743
+ background: {
80744
+ type: "solid",
80745
+ colorToken: "accent"
80746
+ },
80747
+ borderRadius: "rounded-lg",
80748
+ affordance: { iconId: "ArrowRight" },
80749
+ effects: { hover: [{
80750
+ effectId: "lift",
80751
+ options: { translateY: "-2px" }
80752
+ }] }
80753
+ }
80735
80754
  }
80736
- ]
80755
+ }
80737
80756
  }
80738
80757
  });
80739
- //#endregion
80740
- //#region ../theme-core/src/buttons/personalities/showtime-pill.ts
80741
- /**
80742
- * Showtime Pill — bold, spacious, fully rounded buttons with playful pop
80743
- * motion. Suits energetic schools, performers, festivals, and community brands
80744
- * that need calls to action to feel loud without becoming visually chaotic.
80745
- */
80746
- const showtimePill = defineButtonPersonality({
80758
+ const showtimePillRecipe = defineStaticButtonStyleRecipe({
80747
80759
  id: "showtime-pill",
80748
- name: "Showtime Pill",
80749
- description: "Bold pill buttons with uppercase labels, generous padding, and a playful pop.",
80760
+ accessibilityLabel: "Bold uppercase pill buttons with playful movement",
80750
80761
  tags: {
80751
80762
  tone: "bold",
80752
80763
  energy: "vibrant",
80753
80764
  motion: "expressive",
80754
80765
  era: "modern"
80755
80766
  },
80756
- buttonSystem: {
80767
+ system: {
80757
80768
  global: {
80758
80769
  cornerStyle: "pill",
80759
80770
  shadow: "low",
@@ -80784,286 +80795,395 @@ const showtimePill = defineButtonPersonality({
80784
80795
  fontSize: "1.125rem"
80785
80796
  }
80786
80797
  },
80787
- variants: [
80788
- {
80789
- id: "primary",
80790
- name: "Primary",
80791
- enabled: true,
80792
- priority: 1,
80793
- background: {
80794
- type: "solid",
80795
- colorToken: "primary"
80796
- },
80797
- borderRadius: "rounded-full",
80798
- effects: { hover: [{ effectId: "pop" }] }
80799
- },
80800
- {
80801
- id: "secondary",
80802
- name: "Secondary",
80803
- enabled: true,
80804
- priority: 2,
80805
- background: {
80806
- type: "surface",
80807
- role: "link"
80808
- },
80809
- borderRadius: "rounded-full",
80810
- border: { widthClass: "border-2" },
80811
- effects: { hover: [{ effectId: "pop" }] }
80798
+ roles: {
80799
+ primary: {
80800
+ kind: "complete",
80801
+ appearance: {
80802
+ background: {
80803
+ type: "solid",
80804
+ colorToken: "primary"
80805
+ },
80806
+ borderRadius: "rounded-full",
80807
+ effects: { hover: [{ effectId: "pop" }] }
80808
+ }
80812
80809
  },
80813
- {
80814
- id: "hero",
80815
- name: "Hero",
80816
- enabled: true,
80817
- priority: 1,
80818
- background: {
80819
- type: "solid",
80820
- colorToken: "secondary"
80821
- },
80822
- borderRadius: "rounded-full",
80823
- effects: { hover: [{ effectId: "pop" }] }
80810
+ secondary: {
80811
+ kind: "complete",
80812
+ appearance: {
80813
+ background: {
80814
+ type: "surface",
80815
+ role: "link"
80816
+ },
80817
+ borderRadius: "rounded-full",
80818
+ border: { widthClass: "border-2" },
80819
+ effects: { hover: [{ effectId: "pop" }] }
80820
+ }
80824
80821
  },
80825
- {
80826
- id: "header",
80827
- name: "Header",
80828
- enabled: true,
80829
- priority: 2,
80830
- background: {
80831
- type: "solid",
80832
- colorToken: "background"
80833
- },
80834
- borderRadius: "rounded-full",
80835
- border: { widthClass: "border-2" },
80836
- effects: { hover: [{
80837
- effectId: "background-on-hover",
80838
- options: { colorToken: "surface" }
80839
- }] }
80822
+ outline: {
80823
+ kind: "complete",
80824
+ appearance: {
80825
+ background: {
80826
+ type: "surface",
80827
+ role: "link"
80828
+ },
80829
+ borderRadius: "rounded-full",
80830
+ border: { widthClass: "border-2" },
80831
+ effects: { hover: [{
80832
+ effectId: "background-on-hover",
80833
+ options: { colorToken: "background" }
80834
+ }] }
80835
+ }
80840
80836
  },
80841
- {
80842
- id: "outline",
80843
- name: "Outline",
80844
- enabled: true,
80845
- priority: 3,
80846
- background: {
80847
- type: "surface",
80848
- role: "link"
80849
- },
80850
- borderRadius: "rounded-full",
80851
- border: { widthClass: "border-2" },
80852
- effects: { hover: [{
80853
- effectId: "background-on-hover",
80854
- options: { colorToken: "background" }
80855
- }] }
80837
+ ghost: {
80838
+ kind: "complete",
80839
+ appearance: {
80840
+ background: {
80841
+ type: "surface",
80842
+ role: "link"
80843
+ },
80844
+ borderRadius: "rounded-full",
80845
+ effects: { hover: [{
80846
+ effectId: "background-on-hover",
80847
+ options: { colorToken: "surface" }
80848
+ }] }
80849
+ }
80856
80850
  },
80857
- {
80858
- id: "ghost",
80859
- name: "Ghost",
80860
- enabled: true,
80861
- priority: 3,
80862
- background: {
80863
- type: "surface",
80864
- role: "link"
80865
- },
80866
- borderRadius: "rounded-full",
80867
- effects: { hover: [{
80868
- effectId: "background-on-hover",
80869
- options: { colorToken: "surface" }
80870
- }] }
80851
+ accent: {
80852
+ kind: "complete",
80853
+ appearance: {
80854
+ background: {
80855
+ type: "solid",
80856
+ colorToken: "secondary"
80857
+ },
80858
+ borderRadius: "rounded-full",
80859
+ effects: { hover: [{ effectId: "pop" }] }
80860
+ }
80871
80861
  }
80872
- ]
80862
+ }
80873
80863
  }
80874
80864
  });
80875
- //#endregion
80876
- //#region ../theme-core/src/buttons/personalities/soft-pill.ts
80877
- /**
80878
- * Soft Pill — rounded-full pill buttons with a hover lift. The default for
80879
- * Calm Studio and Modern Wellness; reads as quietly modern and welcoming.
80880
- */
80881
- const softPill = defineButtonPersonality({
80882
- id: "soft-pill",
80883
- name: "Soft Pill",
80884
- description: "Rounded pills with a gentle lift on hover. Quietly modern.",
80865
+ const joyStampRecipe = defineStaticButtonStyleRecipe({
80866
+ id: "joy-stamp",
80867
+ accessibilityLabel: "Bold pill buttons with a hard offset shadow",
80885
80868
  tags: {
80886
- tone: "classic",
80887
- energy: "calm",
80888
- motion: "subtle",
80869
+ tone: "bold",
80870
+ energy: "vibrant",
80871
+ motion: "expressive",
80889
80872
  era: "organic"
80890
80873
  },
80891
- buttonSystem: {
80874
+ system: {
80892
80875
  global: {
80893
80876
  cornerStyle: "pill",
80894
- shadow: "low",
80877
+ shadow: "high",
80895
80878
  textTransform: "none",
80896
- fontWeight: 500,
80879
+ typography: "heading",
80880
+ fontWeight: 700,
80881
+ fontSize: "text-lg",
80897
80882
  borderWidth: 2,
80898
- hoverTransform: "lift",
80883
+ hoverTransform: "none",
80899
80884
  hoverColor: "none"
80900
80885
  },
80901
- variants: [
80902
- {
80903
- id: "primary",
80904
- name: "Primary",
80905
- enabled: true,
80906
- priority: 1,
80907
- background: {
80908
- type: "solid",
80909
- colorToken: "primary"
80910
- },
80911
- borderRadius: "rounded-full",
80912
- shadow: {
80913
- elevation: "low",
80914
- softness: "soft",
80915
- position: "bottom"
80916
- },
80917
- effects: {
80918
- hover: [{
80919
- effectId: "lift",
80920
- options: { translateY: "-1px" }
80921
- }],
80922
- active: [{
80923
- effectId: "scale-down",
80924
- options: { scale: "0.98" }
80925
- }]
80886
+ sizes: {
80887
+ sm: {
80888
+ padding: "0.625rem 1.25rem",
80889
+ fontSize: "text-base"
80890
+ },
80891
+ md: {
80892
+ padding: "0.875rem 1.75rem",
80893
+ fontSize: "text-lg"
80894
+ },
80895
+ lg: {
80896
+ padding: "1.125rem 2.25rem",
80897
+ fontSize: "text-xl"
80898
+ },
80899
+ xl: {
80900
+ padding: "1.25rem 2.75rem",
80901
+ fontSize: "text-2xl"
80902
+ }
80903
+ },
80904
+ roles: {
80905
+ primary: {
80906
+ kind: "complete",
80907
+ appearance: {
80908
+ background: {
80909
+ type: "solid",
80910
+ colorToken: "primary"
80911
+ },
80912
+ borderRadius: "rounded-full",
80913
+ shadow: {
80914
+ elevation: "high",
80915
+ softness: "hard",
80916
+ position: "bottom-right",
80917
+ colorToken: "text"
80918
+ },
80919
+ effects: { hover: [{ effectId: "press-down" }] }
80926
80920
  }
80927
80921
  },
80928
- {
80929
- id: "secondary",
80930
- name: "Secondary",
80931
- enabled: true,
80932
- priority: 2,
80933
- background: {
80934
- type: "surface",
80935
- role: "link"
80936
- },
80937
- borderRadius: "rounded-full",
80938
- border: { widthClass: "border-2" },
80939
- effects: { hover: [{
80940
- effectId: "background-on-hover",
80941
- options: { colorToken: "surface" }
80942
- }] }
80922
+ secondary: {
80923
+ kind: "complete",
80924
+ appearance: {
80925
+ background: {
80926
+ type: "surface",
80927
+ role: "link"
80928
+ },
80929
+ borderRadius: "rounded-full",
80930
+ border: { widthClass: "border-2" },
80931
+ shadow: {
80932
+ elevation: "high",
80933
+ softness: "hard",
80934
+ position: "bottom-right",
80935
+ colorToken: "secondary"
80936
+ },
80937
+ effects: { hover: [{ effectId: "press-down" }] }
80938
+ }
80943
80939
  },
80944
- {
80945
- id: "outline",
80946
- name: "Outline",
80947
- enabled: true,
80948
- priority: 3,
80949
- background: {
80950
- type: "surface",
80951
- role: "link"
80952
- },
80953
- borderRadius: "rounded-full",
80954
- border: { widthClass: "border" },
80955
- effects: { hover: [{
80956
- effectId: "background-on-hover",
80957
- options: { colorToken: "surface" }
80958
- }] }
80940
+ outline: {
80941
+ kind: "derive",
80942
+ from: "secondary"
80959
80943
  },
80960
- {
80961
- id: "ghost",
80962
- name: "Ghost",
80963
- enabled: true,
80964
- priority: 3,
80965
- background: {
80966
- type: "surface",
80967
- role: "link"
80968
- },
80969
- borderRadius: "rounded-full",
80970
- effects: { hover: [{
80971
- effectId: "background-on-hover",
80972
- options: { colorToken: "surface" }
80973
- }] }
80944
+ ghost: {
80945
+ kind: "complete",
80946
+ appearance: {
80947
+ background: {
80948
+ type: "surface",
80949
+ role: "link"
80950
+ },
80951
+ borderRadius: "rounded-full",
80952
+ effects: { hover: [{ effectId: "press-down" }] }
80953
+ }
80954
+ },
80955
+ accent: {
80956
+ kind: "derive",
80957
+ from: "primary",
80958
+ overrides: { background: {
80959
+ type: "solid",
80960
+ colorToken: "accent"
80961
+ } }
80974
80962
  }
80975
- ]
80963
+ }
80976
80964
  }
80977
80965
  });
80978
- //#endregion
80979
- //#region ../theme-core/src/buttons/personalities/two-tone-pill.ts
80980
- const solidSecondary = {
80981
- id: "secondary",
80982
- name: "Secondary",
80983
- enabled: true,
80984
- priority: 2,
80985
- background: {
80986
- type: "solid",
80987
- colorToken: unsafeAsOpaqueButtonColourToken("secondary")
80988
- },
80989
- borderRadius: "rounded-full",
80990
- shadow: {
80991
- elevation: "none",
80992
- softness: null,
80993
- position: "bottom"
80966
+ const ornateRitualRecipe = defineStaticButtonStyleRecipe({
80967
+ id: "ornate-ritual",
80968
+ accessibilityLabel: "Uppercase framed buttons with restrained movement",
80969
+ tags: {
80970
+ tone: "classic",
80971
+ energy: "vibrant",
80972
+ motion: "subtle",
80973
+ era: "organic"
80994
80974
  },
80995
- effects: {
80996
- hover: [{
80997
- effectId: "background-on-hover-alpha",
80998
- options: {
80999
- colorToken: "secondary",
81000
- opacity: 88
80975
+ system: {
80976
+ global: {
80977
+ cornerStyle: "rounded",
80978
+ textTransform: "uppercase",
80979
+ fontWeight: 600,
80980
+ borderWidth: 1,
80981
+ hoverTransform: "none",
80982
+ hoverColor: "none",
80983
+ letterSpacing: "loose"
80984
+ },
80985
+ sizes: {
80986
+ sm: {
80987
+ padding: "0.5625rem 1.25rem",
80988
+ fontSize: "text-xs"
80989
+ },
80990
+ md: {
80991
+ padding: "0.75rem 1.75rem",
80992
+ fontSize: "text-xs"
80993
+ },
80994
+ lg: {
80995
+ padding: "0.875rem 2.25rem",
80996
+ fontSize: "text-sm"
80997
+ },
80998
+ xl: {
80999
+ padding: "1rem 2.75rem",
81000
+ fontSize: "text-base"
81001
81001
  }
81002
- }],
81003
- active: [{
81004
- effectId: "scale-down",
81005
- options: { scale: "0.98" }
81006
- }]
81002
+ },
81003
+ roles: {
81004
+ primary: {
81005
+ kind: "complete",
81006
+ appearance: {
81007
+ background: {
81008
+ type: "solid",
81009
+ colorToken: "primary"
81010
+ },
81011
+ borderRadius: "rounded-md",
81012
+ border: { widthClass: "border" },
81013
+ effects: {
81014
+ hover: [{
81015
+ effectId: "background-on-hover",
81016
+ options: { colorToken: "primary-100" }
81017
+ }],
81018
+ active: [{
81019
+ effectId: "scale-down",
81020
+ options: { scale: "0.98" }
81021
+ }]
81022
+ }
81023
+ }
81024
+ },
81025
+ secondary: {
81026
+ kind: "complete",
81027
+ appearance: {
81028
+ background: {
81029
+ type: "solid",
81030
+ colorToken: "secondary"
81031
+ },
81032
+ borderRadius: "rounded-md",
81033
+ border: { widthClass: "border" },
81034
+ effects: { hover: [{
81035
+ effectId: "background-on-hover",
81036
+ options: { colorToken: "surface" }
81037
+ }] }
81038
+ }
81039
+ },
81040
+ outline: {
81041
+ kind: "complete",
81042
+ appearance: {
81043
+ background: {
81044
+ type: "surface",
81045
+ role: "link"
81046
+ },
81047
+ borderRadius: "rounded-md",
81048
+ border: { widthClass: "border" },
81049
+ effects: { hover: [{
81050
+ effectId: "background-on-hover",
81051
+ options: { colorToken: "muted" }
81052
+ }] }
81053
+ }
81054
+ },
81055
+ ghost: {
81056
+ kind: "complete",
81057
+ appearance: {
81058
+ background: {
81059
+ type: "surface",
81060
+ role: "link"
81061
+ },
81062
+ borderRadius: "rounded-none",
81063
+ sizes: {
81064
+ sm: {
81065
+ padding: "0.375rem 0",
81066
+ fontSize: "text-xs"
81067
+ },
81068
+ md: {
81069
+ padding: "0.5rem 0",
81070
+ fontSize: "text-sm"
81071
+ },
81072
+ lg: {
81073
+ padding: "0.625rem 0",
81074
+ fontSize: "text-base"
81075
+ },
81076
+ xl: {
81077
+ padding: "0.75rem 0",
81078
+ fontSize: "text-lg"
81079
+ }
81080
+ },
81081
+ effects: { base: [{
81082
+ effectId: "border-bottom-grow",
81083
+ options: {
81084
+ height: 1,
81085
+ colorToken: "accent",
81086
+ origin: "left"
81087
+ }
81088
+ }] }
81089
+ }
81090
+ },
81091
+ accent: {
81092
+ kind: "derive",
81093
+ from: "primary",
81094
+ overrides: { background: {
81095
+ type: "solid",
81096
+ colorToken: "accent"
81097
+ } }
81098
+ }
81099
+ }
81007
81100
  }
81008
- };
81101
+ });
81009
81102
  //#endregion
81010
- //#region ../theme-core/src/buttons/personalities/index.ts
81011
- const buttonPersonalities = [
81012
- softPill,
81013
- defineButtonPersonality({
81014
- id: "two-tone-pill",
81015
- name: "Two-tone Pill",
81016
- description: "Rounded pills with distinct solid primary and secondary brand colours.",
81017
- tags: softPill.tags,
81018
- buttonSystem: {
81019
- ...softPill.buttonSystem,
81020
- variants: softPill.buttonSystem.variants.map((variant) => variant.id === "secondary" ? solidSecondary : variant)
81021
- }
81022
- }),
81023
- earthPill,
81024
- confidentChip,
81025
- editorialLink,
81026
- pebble,
81027
- inkStamp,
81028
- flatInk,
81029
- brushedWash,
81030
- showtimePill,
81031
- joyStamp,
81032
- ornateRitual,
81033
- quietArrow
81103
+ //#region ../theme-core/src/buttons/styles/registry.ts
81104
+ const buttonStyleRecipes = [
81105
+ softPillRecipe,
81106
+ earthPillRecipe,
81107
+ confidentChipRecipe,
81108
+ editorialLinkRecipe,
81109
+ pebbleRecipe,
81110
+ inkStampRecipe,
81111
+ flatInkRecipe,
81112
+ brushedWashRecipe,
81113
+ showtimePillRecipe,
81114
+ joyStampRecipe,
81115
+ ornateRitualRecipe,
81116
+ quietArrowRecipe
81034
81117
  ];
81035
- const personalitiesById = new Map(buttonPersonalities.map((p) => [p.id, p]));
81036
- function findButtonPersonality(id) {
81037
- return personalitiesById.get(id);
81038
- }
81039
- function parsePersistedButtonPersonalityId(value) {
81040
- if (!value) return { kind: "empty" };
81041
- const personality = personalitiesById.get(value);
81042
- return personality ? {
81043
- kind: "known",
81044
- id: personality.id
81045
- } : {
81046
- kind: "unknown",
81047
- raw: value
81048
- };
81049
- }
81050
- buttonPersonalities.map((personality) => ({
81051
- id: personality.id,
81052
- name: personality.name,
81053
- description: personality.description,
81054
- category: presetCategory(personality),
81055
- buttonSystem: personality.buttonSystem,
81056
- compatibility: {
81057
- ...personality.tags.tone ? { tones: [personality.tags.tone] } : {},
81058
- ...personality.tags.energy ? { energies: [personality.tags.energy] } : {}
81059
- }
81060
- }));
81061
- function presetCategory(personality) {
81062
- switch (personality.tags.era) {
81118
+ const recipesById = new Map(buttonStyleRecipes.map((recipe) => [recipe.id, recipe]));
81119
+ function findButtonStyleRecipe(id) {
81120
+ const recipe = recipesById.get(id);
81121
+ if (recipe === void 0) throw new Error(`Button style registry is missing known style ${id}`);
81122
+ return recipe;
81123
+ }
81124
+ function resolveButtonStyleSelection(selection) {
81125
+ switch (selection.styleId) {
81126
+ case "soft-pill": return resolveButtonStyleRecipe(softPillRecipe, selection.parameters);
81127
+ case "earth-pill": return resolveButtonStyleRecipe(earthPillRecipe, selection.parameters);
81128
+ case "confident-chip": return resolveButtonStyleRecipe(confidentChipRecipe, selection.parameters);
81129
+ case "editorial-link": return resolveButtonStyleRecipe(editorialLinkRecipe, selection.parameters);
81130
+ case "pebble": return resolveButtonStyleRecipe(pebbleRecipe, selection.parameters);
81131
+ case "ink-stamp": return resolveButtonStyleRecipe(inkStampRecipe, selection.parameters);
81132
+ case "flat-ink": return resolveButtonStyleRecipe(flatInkRecipe, selection.parameters);
81133
+ case "brushed-wash": return resolveButtonStyleRecipe(brushedWashRecipe, selection.parameters);
81134
+ case "showtime-pill": return resolveButtonStyleRecipe(showtimePillRecipe, selection.parameters);
81135
+ case "joy-stamp": return resolveButtonStyleRecipe(joyStampRecipe, selection.parameters);
81136
+ case "ornate-ritual": return resolveButtonStyleRecipe(ornateRitualRecipe, selection.parameters);
81137
+ case "quiet-arrow": return resolveButtonStyleRecipe(quietArrowRecipe, selection.parameters);
81138
+ }
81139
+ }
81140
+ function defaultButtonStyleSelectionFor(styleId) {
81141
+ return {
81142
+ styleId,
81143
+ parameters: findButtonStyleRecipe(styleId).defaultParameters
81144
+ };
81145
+ }
81146
+ function buttonStyleSelectionParameterValue(selection, parameter) {
81147
+ const entry = Object.entries(selection.parameters).find(([key]) => key === parameter);
81148
+ return typeof entry?.[1] === "string" ? entry[1] : null;
81149
+ }
81150
+ /**
81151
+ * Applies a descriptor-driven choice and re-parses the complete discriminated
81152
+ * selection. Preview controls never need recipe-specific parameter branches.
81153
+ */
81154
+ function updateButtonStyleSelectionChoice(selection, parameter, value) {
81155
+ const parameters = Object.fromEntries([...Object.entries(selection.parameters).filter(([key]) => key !== parameter), [parameter, value]]);
81156
+ const parsed = buttonStyleSelectionSchema.safeParse({
81157
+ styleId: selection.styleId,
81158
+ parameters
81159
+ });
81160
+ return parsed.success ? {
81161
+ kind: "updated",
81162
+ selection: parsed.data
81163
+ } : { kind: "invalid-control-value" };
81164
+ }
81165
+ 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");
81166
+ buttonStyleRecipes.map((recipe) => {
81167
+ const resolved = resolveButtonStyleSelection(defaultButtonStyleSelectionFor(recipe.id));
81168
+ if (resolved.kind === "error") throw new Error(`Invalid registered button style ${recipe.id}: ${resolved.error.issues.join(", ")}`);
81169
+ return {
81170
+ id: recipe.id,
81171
+ name: recipe.accessibilityLabel,
81172
+ description: recipe.accessibilityLabel,
81173
+ category: presetCategory(recipe),
81174
+ buttonSystem: resolved.buttonSystem,
81175
+ compatibility: {
81176
+ ...recipe.tags.tone ? { tones: [recipe.tags.tone] } : {},
81177
+ ...recipe.tags.energy ? { energies: [recipe.tags.energy] } : {}
81178
+ }
81179
+ };
81180
+ });
81181
+ function presetCategory(recipe) {
81182
+ switch (recipe.tags.era) {
81063
81183
  case "retro": return "retro";
81064
81184
  case "editorial": return "minimal";
81065
81185
  case "organic": return "artistic";
81066
- case "modern": return personality.tags.tone === "bold" ? "modern" : "technical";
81186
+ case "modern": return recipe.tags.tone === "bold" ? "modern" : "technical";
81067
81187
  case "technical": return "technical";
81068
81188
  case void 0: return "modern";
81069
81189
  }
@@ -83638,6 +83758,39 @@ function resolveIconPickerPreset(value) {
83638
83758
  return isIconPickerPreset(value) ? value : "cta";
83639
83759
  }
83640
83760
  //#endregion
83761
+ //#region ../blocks/src/system/constants/buttonRoles.ts
83762
+ /**
83763
+ * Semantic button roles available to block authors.
83764
+ *
83765
+ * These roles are deliberately independent of a site's visual button style:
83766
+ * the active theme owns how each role looks.
83767
+ */
83768
+ const BLOCK_BUTTON_ROLES = PUBLIC_BUTTON_ROLES;
83769
+ const blockButtonRoleSchema = z$1.enum(BLOCK_BUTTON_ROLES);
83770
+ /**
83771
+ * Temporary rollout boundary for persisted content written before issue #1220.
83772
+ * Authoring remains strict through `blockButtonRoleSchema`; this parser exists
83773
+ * only until the post-deploy role rewrite has been audited in production.
83774
+ */
83775
+ function canonicalizePersistedBlockButtonRole(value) {
83776
+ return value === "link" || value === "tertiary" ? "ghost" : value;
83777
+ }
83778
+ const persistedBlockButtonRoleSchema = z$1.preprocess((value) => typeof value === "string" ? canonicalizePersistedBlockButtonRole(value) : value, blockButtonRoleSchema);
83779
+ const BLOCK_BUTTON_ROLE_LABELS = {
83780
+ primary: "Primary",
83781
+ secondary: "Secondary",
83782
+ outline: "Outline",
83783
+ ghost: "Ghost",
83784
+ accent: "Accent"
83785
+ };
83786
+ const BLOCK_BUTTON_ROLE_OPTIONS = BLOCK_BUTTON_ROLES.map((value) => ({
83787
+ value,
83788
+ label: BLOCK_BUTTON_ROLE_LABELS[value]
83789
+ }));
83790
+ function isBlockButtonRole(value) {
83791
+ return blockButtonRoleSchema.safeParse(value).success;
83792
+ }
83793
+ //#endregion
83641
83794
  //#region ../blocks/src/system/inlineText.ts
83642
83795
  const inlineTextAccentTones = [
83643
83796
  "accent",
@@ -86631,24 +86784,7 @@ const publicEventSchema = z$1.object({
86631
86784
  const publicEventsArraySchema = z$1.array(publicEventSchema);
86632
86785
  //#endregion
86633
86786
  //#region ../blocks/src/system/fields/button.ts
86634
- const DEFAULT_THEME_BUTTON_VARIANTS = [
86635
- {
86636
- value: "primary",
86637
- label: "Primary"
86638
- },
86639
- {
86640
- value: "secondary",
86641
- label: "Secondary"
86642
- },
86643
- {
86644
- value: "outline",
86645
- label: "Outline"
86646
- },
86647
- {
86648
- value: "link",
86649
- label: "Link"
86650
- }
86651
- ];
86787
+ const DEFAULT_THEME_BUTTON_VARIANTS = BLOCK_BUTTON_ROLE_OPTIONS;
86652
86788
  function createButtonVariantField(options = {}) {
86653
86789
  return {
86654
86790
  id: options.id ?? "buttonVariant",
@@ -86666,20 +86802,7 @@ function createButtonVariantField(options = {}) {
86666
86802
  };
86667
86803
  }
86668
86804
  function createButtonGroup(options = {}) {
86669
- const { variants = [
86670
- {
86671
- value: "primary",
86672
- label: "Primary"
86673
- },
86674
- {
86675
- value: "secondary",
86676
- label: "Secondary"
86677
- },
86678
- {
86679
- value: "outline",
86680
- label: "Outline"
86681
- }
86682
- ], defaultVariant, includeSize = true, defaultSize = "md", showGroupLabel = false, groupId = "button", groupLabel = "Button", flattenInRepeater = true } = options;
86805
+ const { variants = BLOCK_BUTTON_ROLE_OPTIONS, defaultVariant, includeSize = true, defaultSize = "md", showGroupLabel = false, groupId = "button", groupLabel = "Button", flattenInRepeater = true } = options;
86683
86806
  const mainFields = [
86684
86807
  {
86685
86808
  id: "label",
@@ -87314,17 +87437,8 @@ function isEventContentType(slug) {
87314
87437
  //#endregion
87315
87438
  //#region ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
87316
87439
  const previewStageSchema = z$1.enum(["preview", "published"]);
87317
- const registrationButtonVariantSchema = z$1.enum([
87318
- "primary",
87319
- "secondary",
87320
- "outline"
87321
- ]);
87322
- const eventButtonVariantSchema = z$1.enum([
87323
- "primary",
87324
- "secondary",
87325
- "outline",
87326
- "link"
87327
- ]);
87440
+ const registrationButtonVariantSchema = blockButtonRoleSchema;
87441
+ const eventButtonVariantSchema = persistedBlockButtonRoleSchema;
87328
87442
  const eventLayoutSchema = z$1.enum(eventCalendarListLayoutValues);
87329
87443
  const eventCalendarDisplayModeSchema = z$1.enum(eventCalendarDisplayModeValues);
87330
87444
  const eventCalendarDefaultViewSchema = z$1.enum(eventCalendarDefaultViewValues);
@@ -91367,6 +91481,39 @@ function paletteAccessibleLabel(prefix, colors) {
91367
91481
  ].join(" ");
91368
91482
  }
91369
91483
  //#endregion
91484
+ //#region ../theme-core/src/site-styles/styleTags.ts
91485
+ /**
91486
+ * Descriptive style-axis metadata for button personalities and palette
91487
+ * variants. Site Style picker shape is curated explicitly; these tags remain
91488
+ * for catalog audit, docs, and future discovery tooling.
91489
+ */
91490
+ const STYLE_AXIS_VALUES = {
91491
+ tone: [
91492
+ "minimal",
91493
+ "classic",
91494
+ "bold"
91495
+ ],
91496
+ energy: ["calm", "vibrant"],
91497
+ motion: [
91498
+ "subtle",
91499
+ "standard",
91500
+ "expressive"
91501
+ ],
91502
+ era: [
91503
+ "editorial",
91504
+ "modern",
91505
+ "organic",
91506
+ "technical",
91507
+ "retro"
91508
+ ]
91509
+ };
91510
+ const styleTagsSchema = z$1.object({
91511
+ tone: z$1.enum(STYLE_AXIS_VALUES.tone).optional(),
91512
+ energy: z$1.enum(STYLE_AXIS_VALUES.energy).optional(),
91513
+ motion: z$1.enum(STYLE_AXIS_VALUES.motion).optional(),
91514
+ era: z$1.enum(STYLE_AXIS_VALUES.era).optional()
91515
+ });
91516
+ //#endregion
91370
91517
  //#region ../theme-core/src/palette/curated/types.ts
91371
91518
  function asCuratedPaletteAuthoringKey(value) {
91372
91519
  if (value.length === 0) throw new Error("CuratedPaletteAuthoringKey must be a non-empty string");
@@ -95896,7 +96043,7 @@ function getHeaderLookOrThrow(id) {
95896
96043
  if (!look) throw new Error(`Unknown Theme V2 header Look: ${id}`);
95897
96044
  return look;
95898
96045
  }
95899
- function rejectReasonsForLook$1(look, context) {
96046
+ function rejectReasonsForLook(look, context) {
95900
96047
  const brandPresentation = resolveHeaderBrandPresentation({
95901
96048
  logo: context.logo,
95902
96049
  accommodations: look.logoAccommodations
@@ -95914,7 +96061,7 @@ function resolveHeaderLook(input) {
95914
96061
  guaranteedFallbackLookId: guaranteedFallbackHeaderLookId,
95915
96062
  getLookOrThrow: getHeaderLookOrThrow,
95916
96063
  context,
95917
- rejectReasonsForLook: rejectReasonsForLook$1,
96064
+ rejectReasonsForLook,
95918
96065
  compileLook: (look) => look.compile(input.theme)
95919
96066
  });
95920
96067
  return {
@@ -95934,97 +96081,10 @@ function resolveHeaderLook(input) {
95934
96081
  function asFooterLookId(value) {
95935
96082
  return value;
95936
96083
  }
95937
- function asFooterLayoutId(value) {
95938
- return value;
95939
- }
95940
- function asFooterStyleId(value) {
95941
- return value;
95942
- }
95943
- const defaultFooterSelectionContext = {
95944
- navDensity: "unknown",
95945
- groupedNav: "unknown",
95946
- contentPresence: "unknown"
95947
- };
95948
- const guaranteedFallbackFooterLookId = asFooterLookId("footer-identity-quiet");
95949
- const footerLayoutCatalog = defineExactCatalog()([
95950
- {
95951
- id: asFooterLayoutId("identity"),
95952
- label: "Identity",
95953
- description: "Logo, site text, address, and legal copy without relying on footer navigation."
95954
- },
95955
- {
95956
- id: asFooterLayoutId("centered"),
95957
- label: "Centered",
95958
- description: "A calm centered stack for identity, short copy, and optional compact navigation.",
95959
- maxRecommendedNavDensity: "sparse"
95960
- },
95961
- {
95962
- id: asFooterLayoutId("split"),
95963
- label: "Split",
95964
- description: "Navigation and brand signoff separated into a wider split footer.",
95965
- requiresFooterNav: true,
95966
- maxRecommendedNavDensity: "balanced"
95967
- },
95968
- {
95969
- id: asFooterLayoutId("columns"),
95970
- label: "Columns",
95971
- description: "Grouped footer navigation columns with a supporting bottom line.",
95972
- requiresFooterNav: true,
95973
- requiresFooterNavGroups: true
95974
- }
95975
- ]);
95976
- const footerStyleCatalog = defineExactCatalog()([
95977
- {
95978
- id: asFooterStyleId("quiet"),
95979
- label: "Quiet",
95980
- description: "Lightweight, practical footer treatment."
95981
- },
95982
- {
95983
- id: asFooterStyleId("calm"),
95984
- label: "Calm",
95985
- description: "Soft centered treatment with restrained dividers."
95986
- },
95987
- {
95988
- id: asFooterStyleId("editorial"),
95989
- label: "Editorial",
95990
- description: "Text-forward treatment with fine-line structure."
95991
- },
95992
- {
95993
- id: asFooterStyleId("brand-band"),
95994
- label: "Brand band",
95995
- description: "High-contrast brand treatment with a stronger bottom bar."
95996
- }
95997
- ]);
95998
- const footerLayoutsById = new Map(footerLayoutCatalog.map((layout) => [layout.id, layout]));
95999
- const footerStylesById = new Map(footerStyleCatalog.map((style) => [style.id, style]));
96000
- function getFooterLayout(id) {
96001
- return footerLayoutsById.get(id) ?? null;
96002
- }
96003
- function getFooterStyle(id) {
96004
- return footerStylesById.get(id) ?? null;
96005
- }
96006
- function getFooterLooksForLayout(layoutId) {
96007
- return footerLookCatalog.filter((look) => look.layoutId === layoutId);
96008
- }
96009
- function findFooterLookForLayoutStyle(input) {
96010
- return footerLookCatalog.find((look) => look.layoutId === input.layoutId && look.styleId === input.styleId) ?? null;
96011
- }
96012
- function findDefaultFooterLookForLayout(layoutId) {
96013
- return getFooterLooksForLayout(layoutId)[0] ?? null;
96014
- }
96015
- /**
96016
- * No-nav-safe identity footer: brand and legal/supporting copy carry the
96017
- * footer without implying missing navigation.
96018
- */
96019
- function identityQuietFooter(theme) {
96084
+ const guaranteedFallbackFooterLookId = asFooterLookId("footer-links-quiet");
96085
+ function quietFooterLinks(theme) {
96020
96086
  return {
96021
96087
  ...theme.footer,
96022
- variant: "simple",
96023
- maxWidth: "container",
96024
- background: {
96025
- type: "color",
96026
- color: "surface"
96027
- },
96028
96088
  navStyle: "minimal",
96029
96089
  navWeight: "regular",
96030
96090
  navColor: "text",
@@ -96037,285 +96097,38 @@ function identityQuietFooter(theme) {
96037
96097
  hoverColorToken: "primary",
96038
96098
  padding: "none",
96039
96099
  borderRadius: "none"
96040
- },
96041
- navLayout: {
96042
- layout: "inline-wrap",
96043
- align: "start",
96044
- gapX: "default",
96045
- gapY: "tight"
96046
- },
96047
- logo: {
96048
- showLogo: true,
96049
- showLogoText: true,
96050
- placement: "left",
96051
- size: "sm",
96052
- align: "start"
96053
- },
96054
- bottomBar: {
96055
- enabled: false,
96056
- fullBleed: false,
96057
- textAlign: "left",
96058
- paddingX: "default",
96059
- paddingY: "compact",
96060
- borderTop: { width: "none" }
96061
96100
  }
96062
96101
  };
96063
96102
  }
96064
- /**
96065
- * Back-compat alias for the previous default footer Look. It keeps existing
96066
- * persisted selections valid while staying hidden from the new layout/style UI.
96067
- */
96068
- function mutedGroundingFooter(theme) {
96069
- return {
96070
- ...identityQuietFooter(theme),
96071
- background: theme.footer.background,
96072
- navStyle: theme.footer.navStyle,
96073
- navColor: theme.footer.navColor,
96074
- navWeight: theme.footer.navWeight,
96075
- navLinkStyle: theme.footer.navLinkStyle,
96076
- bottomTextLinkStyle: theme.footer.bottomTextLinkStyle
96077
- };
96078
- }
96079
- /** Applies a high-contrast brand band with a darker full-bleed bottom bar. */
96080
- function brandTwoBandFooter(theme) {
96103
+ function emphasizedFooterLinks(theme) {
96081
96104
  return {
96082
96105
  ...theme.footer,
96083
- variant: "split",
96084
- maxWidth: "container",
96085
- background: {
96086
- type: "color",
96087
- color: "primary-800"
96088
- },
96089
96106
  navStyle: "minimal",
96090
96107
  navWeight: "medium",
96091
- navColor: "primaryForeground",
96092
- navLinkStyle: {
96093
- typography: "body",
96094
- fontWeight: "medium",
96095
- textTransform: "none",
96096
- italic: false,
96097
- colorToken: "primaryForeground",
96098
- hoverColorToken: "secondary",
96099
- padding: "none",
96100
- borderRadius: "none"
96101
- },
96102
- bottomTextLinkStyle: {
96103
- colorToken: "secondary",
96104
- decorationColorToken: "secondary"
96105
- },
96106
- navLayout: {
96107
- layout: "inline-wrap",
96108
- align: "start",
96109
- gapX: "default",
96110
- gapY: "tight"
96111
- },
96112
- logo: {
96113
- showLogo: true,
96114
- showLogoText: false,
96115
- placement: "left",
96116
- size: "sm",
96117
- align: "start"
96118
- },
96119
- bottomBar: {
96120
- enabled: true,
96121
- fullBleed: true,
96122
- background: {
96123
- type: "color",
96124
- color: "primary-900"
96125
- },
96126
- textColor: "primaryForeground",
96127
- textAlign: "center",
96128
- paddingX: "default",
96129
- paddingY: "compact",
96130
- borderTop: { width: "none" }
96131
- }
96132
- };
96133
- }
96134
- /**
96135
- * Centered stack on a softly tinted band: logo, inline nav, address, and a
96136
- * hairline-topped copyright line, all centered.
96137
- */
96138
- function centeredCalmFooter(theme) {
96139
- return {
96140
- ...theme.footer,
96141
- variant: "simple",
96142
- maxWidth: "container",
96143
- background: {
96144
- type: "color",
96145
- color: "surfaceAlt"
96146
- },
96147
- navStyle: "minimal",
96148
- navWeight: "regular",
96149
- navColor: "text",
96150
- navLinkStyle: {
96151
- typography: "body",
96152
- fontWeight: "regular",
96153
- textTransform: "none",
96154
- italic: false,
96155
- colorToken: "text",
96156
- hoverColorToken: "primary",
96157
- padding: "none",
96158
- borderRadius: "none"
96159
- },
96160
- navLayout: {
96161
- layout: "inline-wrap",
96162
- align: "center",
96163
- gapX: "relaxed",
96164
- gapY: "tight"
96165
- },
96166
- logo: {
96167
- showLogo: true,
96168
- showLogoText: false,
96169
- placement: "above",
96170
- size: "sm",
96171
- align: "center"
96172
- },
96173
- bottomBar: {
96174
- enabled: true,
96175
- fullBleed: false,
96176
- textAlign: "center",
96177
- paddingX: "default",
96178
- paddingY: "compact",
96179
- borderTop: { width: "thin" }
96180
- }
96181
- };
96182
- }
96183
- /** Editorial split footer: compact nav on one side, brand signoff on the other. */
96184
- function splitEditorialFooter(theme) {
96185
- return {
96186
- ...theme.footer,
96187
- variant: "split",
96188
- maxWidth: "container",
96189
- background: {
96190
- type: "color",
96191
- color: "surface"
96192
- },
96193
- navStyle: "minimal",
96194
- navWeight: "regular",
96195
96108
  navColor: "text",
96196
96109
  navLinkStyle: {
96197
96110
  typography: "body",
96198
- fontWeight: "regular",
96199
- textTransform: "none",
96200
- italic: false,
96201
- colorToken: "text",
96202
- hoverColorToken: "primary",
96203
- padding: "none",
96204
- borderRadius: "none"
96205
- },
96206
- navLayout: {
96207
- layout: "inline-wrap",
96208
- align: "start",
96209
- gapX: "relaxed",
96210
- gapY: "tight"
96211
- },
96212
- logo: {
96213
- showLogo: true,
96214
- showLogoText: true,
96215
- placement: "right",
96216
- size: "sm",
96217
- align: "end"
96218
- },
96219
- bottomBar: {
96220
- enabled: true,
96221
- fullBleed: false,
96222
- textAlign: "left",
96223
- paddingX: "default",
96224
- paddingY: "compact",
96225
- borderTop: { width: "thin" }
96226
- }
96227
- };
96228
- }
96229
- /**
96230
- * Editorial columns: site name and supporting copy on the left, inline nav on
96231
- * the right, with a hairline-topped bottom line. Uses the footer block's
96232
- * columns layout.
96233
- */
96234
- function editorialColumnsFooter(theme) {
96235
- return {
96236
- ...theme.footer,
96237
- variant: "columns",
96238
- maxWidth: "container",
96239
- background: {
96240
- type: "color",
96241
- color: "surface"
96242
- },
96243
- navStyle: "minimal",
96244
- navWeight: "regular",
96245
- navColor: "text",
96246
- navLinkStyle: {
96247
- typography: "body",
96248
- fontWeight: "regular",
96111
+ fontWeight: "medium",
96249
96112
  textTransform: "none",
96250
96113
  italic: false,
96251
96114
  colorToken: "text",
96252
96115
  hoverColorToken: "primary",
96253
96116
  padding: "none",
96254
96117
  borderRadius: "none"
96255
- },
96256
- logo: {
96257
- showLogo: true,
96258
- showLogoText: true,
96259
- placement: "left",
96260
- size: "sm",
96261
- align: "start"
96262
- },
96263
- bottomBar: {
96264
- enabled: true,
96265
- fullBleed: false,
96266
- textAlign: "center",
96267
- paddingX: "default",
96268
- paddingY: "compact",
96269
- borderTop: { width: "thin" }
96270
96118
  }
96271
96119
  };
96272
96120
  }
96273
- const footerLookCatalog = defineExactCatalog()([
96274
- {
96275
- id: asFooterLookId("footer-identity-quiet"),
96276
- label: "Identity footer",
96277
- layoutId: asFooterLayoutId("identity"),
96278
- styleId: asFooterStyleId("quiet"),
96279
- compile: identityQuietFooter
96280
- },
96281
- {
96282
- id: asFooterLookId("footer-muted-grounding"),
96283
- label: "Muted grounding footer",
96284
- layoutId: asFooterLayoutId("identity"),
96285
- styleId: asFooterStyleId("quiet"),
96286
- hiddenFromLayoutStyleControls: true,
96287
- compile: mutedGroundingFooter
96288
- },
96289
- {
96290
- id: asFooterLookId("footer-centered-calm"),
96291
- label: "Centered calm footer",
96292
- layoutId: asFooterLayoutId("centered"),
96293
- styleId: asFooterStyleId("calm"),
96294
- compile: centeredCalmFooter
96295
- },
96296
- {
96297
- id: asFooterLookId("footer-split-editorial"),
96298
- label: "Split editorial footer",
96299
- layoutId: asFooterLayoutId("split"),
96300
- styleId: asFooterStyleId("editorial"),
96301
- compile: splitEditorialFooter
96302
- },
96303
- {
96304
- id: asFooterLookId("footer-editorial-columns"),
96305
- label: "Editorial columns footer",
96306
- layoutId: asFooterLayoutId("columns"),
96307
- styleId: asFooterStyleId("editorial"),
96308
- compile: editorialColumnsFooter
96309
- },
96310
- {
96311
- id: asFooterLookId("site-footer-brand-two-band"),
96312
- label: "Two-band brand footer",
96313
- layoutId: asFooterLayoutId("split"),
96314
- styleId: asFooterStyleId("brand-band"),
96315
- allowedContentPresence: ["default-footer", "default-and-blocks"],
96316
- compile: brandTwoBandFooter
96317
- }
96318
- ]);
96121
+ const footerLookCatalog = defineExactCatalog()([{
96122
+ id: asFooterLookId("footer-links-quiet"),
96123
+ label: "Quiet links",
96124
+ description: "Regular-weight footer navigation with a restrained hover.",
96125
+ compile: quietFooterLinks
96126
+ }, {
96127
+ id: asFooterLookId("footer-links-emphasized"),
96128
+ label: "Emphasized links",
96129
+ description: "Medium-weight footer navigation with a clearer emphasis.",
96130
+ compile: emphasizedFooterLinks
96131
+ }]);
96319
96132
  const footerLooksById = new Map(footerLookCatalog.map((look) => [look.id, look]));
96320
96133
  function getFooterLook(id) {
96321
96134
  return footerLooksById.get(id) ?? null;
@@ -96328,114 +96141,15 @@ function getFooterLookOrThrow(id) {
96328
96141
  if (!look) throw new Error(`Unknown Theme V2 footer Look: ${id}`);
96329
96142
  return look;
96330
96143
  }
96331
- function mergeFooterSelectionContext(context) {
96332
- return mergeWithDefaults(defaultFooterSelectionContext, context);
96333
- }
96334
- function rejectReasonsForLook(look, context) {
96335
- return [
96336
- ...requiresMissingFooterNav(context.navDensity, footerNavRequiredForLook(look)) ? ["footer-nav-required"] : [],
96337
- ...requiresMissingFooterNavGroups(context.groupedNav, footerGroupsRequiredForLook(look)) ? ["footer-nav-groups-required"] : [],
96338
- ...exceedsFooterNavDensity(context.navDensity, maxFooterNavDensityForLook(look)) ? ["footer-nav-too-dense"] : [],
96339
- ...contentPresenceIsIncompatible(context.contentPresence, look.allowedContentPresence) ? ["footer-content-incompatible"] : []
96340
- ];
96341
- }
96342
- const footerNavDensityRank = {
96343
- sparse: 1,
96344
- balanced: 2,
96345
- dense: 3
96346
- };
96347
- function footerNavRequiredForLook(look) {
96348
- return getFooterLayout(look.layoutId)?.requiresFooterNav === true || look.requiresFooterNav === true;
96349
- }
96350
- function footerGroupsRequiredForLook(look) {
96351
- return getFooterLayout(look.layoutId)?.requiresFooterNavGroups === true || look.requiresFooterNavGroups === true;
96352
- }
96353
- function maxFooterNavDensityForLook(look) {
96354
- const layoutMax = getFooterLayout(look.layoutId)?.maxRecommendedNavDensity;
96355
- const lookMax = look.maxRecommendedNavDensity;
96356
- if (!layoutMax) return lookMax;
96357
- if (!lookMax) return layoutMax;
96358
- return footerNavDensityRank[layoutMax] <= footerNavDensityRank[lookMax] ? layoutMax : lookMax;
96359
- }
96360
- function requiresMissingFooterNav(density, required) {
96361
- return required === true && density === "none";
96362
- }
96363
- function requiresMissingFooterNavGroups(groupedNav, required) {
96364
- return required === true && groupedNav === "none";
96365
- }
96366
- function exceedsFooterNavDensity(density, maxRecommendedDensity) {
96367
- if (density === "unknown" || density === "none" || maxRecommendedDensity === void 0) return false;
96368
- return footerNavDensityRank[density] > footerNavDensityRank[maxRecommendedDensity];
96369
- }
96370
- function contentPresenceIsIncompatible(contentPresence, allowedContentPresence) {
96371
- if (contentPresence === "unknown" || allowedContentPresence === void 0) return false;
96372
- return !allowedContentPresence.includes(contentPresence);
96373
- }
96374
96144
  function resolveFooterLook(input) {
96375
- const context = mergeFooterSelectionContext(input.context);
96376
- const result = resolveLook({
96377
- recommendedLookIds: input.recommendedLookIds,
96378
- guaranteedFallbackLookId: guaranteedFallbackFooterLookId,
96379
- getLookOrThrow: getFooterLookOrThrow,
96380
- context,
96381
- rejectReasonsForLook,
96382
- compileLook: (look) => look.compile(input.theme)
96383
- });
96145
+ const selectedLook = input.recommendedLookIds.map(getFooterLook).find((look) => look !== null) ?? getFooterLookOrThrow(guaranteedFallbackFooterLookId);
96384
96146
  return {
96385
- selectedLookId: result.selectedLookId,
96386
- selectedLook: result.selectedLook,
96387
- footer: result.compiled,
96388
- rejected: result.rejected
96147
+ selectedLookId: selectedLook.id,
96148
+ selectedLook,
96149
+ footer: selectedLook.compile(input.theme),
96150
+ rejected: []
96389
96151
  };
96390
96152
  }
96391
- function footerLookRejectionReasonLabel(reason) {
96392
- switch (reason) {
96393
- case "footer-nav-required": return "This footer Layout needs footer navigation.";
96394
- case "footer-nav-groups-required": return "This footer Layout needs grouped footer navigation.";
96395
- case "footer-nav-too-dense": return "Footer navigation is too dense for this Look.";
96396
- case "footer-content-incompatible": return "Footer content does not fit this Look.";
96397
- default: return assertNever$8(reason, "Unhandled footer Look rejection reason");
96398
- }
96399
- }
96400
- //#endregion
96401
- //#region ../theme-core/src/site-styles/curatedChoices.ts
96402
- function defaultCuratedChoice(choices) {
96403
- return choices[0].id;
96404
- }
96405
- function resolveCuratedChoice(requested, choices) {
96406
- const fallback = defaultCuratedChoice(choices);
96407
- if (requested === null) return {
96408
- kind: "defaulted-empty",
96409
- resolved: fallback
96410
- };
96411
- if (typeof requested !== "string") return {
96412
- kind: "defaulted-rejected",
96413
- requested: requested.raw,
96414
- resolved: fallback,
96415
- reason: "unknown"
96416
- };
96417
- if (choices.some((choice) => choice.id === requested)) return {
96418
- kind: "accepted",
96419
- resolved: requested
96420
- };
96421
- return {
96422
- kind: "defaulted-rejected",
96423
- requested,
96424
- resolved: fallback,
96425
- reason: "not-curated-for-style"
96426
- };
96427
- }
96428
- function requireEntriesForCuratedChoices(entries, choices) {
96429
- const byId = new Map(entries.map((entry) => [entry.id, entry]));
96430
- const resolved = choices.map((choice) => {
96431
- const entry = byId.get(choice.id);
96432
- if (!entry) throw new Error(`Curated choice references unknown catalog entry "${choice.id}"`);
96433
- return entry;
96434
- });
96435
- const first = resolved[0];
96436
- if (!first) throw new Error("Expected at least one curated choice");
96437
- return [first, ...resolved.slice(1)];
96438
- }
96439
96153
  //#endregion
96440
96154
  //#region ../theme-core/src/site-styles/sourceCatalogs.ts
96441
96155
  const generatedContentFrames = [
@@ -99592,16 +99306,15 @@ function resolvePalette(recipes, options) {
99592
99306
  };
99593
99307
  }
99594
99308
  /**
99595
- * Looks up the resolved button personality and returns its `ButtonSystem` for
99596
- * emission to `theme.buttons`. Returns `undefined` when no personality ID was
99597
- * supplied so the caller can leave the default theme buttons untouched. An
99598
- * unknown personality ID is a programmer error and throws.
99309
+ * Resolves a validated button-style selection for emission to `theme.buttons`.
99310
+ * Returns `undefined` when no selection was supplied so the caller can leave
99311
+ * the default theme buttons untouched.
99599
99312
  */
99600
99313
  function resolveButtonSystem(options) {
99601
- if (options.buttonPersonalityId === void 0) return void 0;
99602
- const personality = findButtonPersonality(options.buttonPersonalityId);
99603
- if (personality === void 0) throw new Error(`Unknown buttonPersonalityId: ${options.buttonPersonalityId}`);
99604
- return personality.buttonSystem;
99314
+ if (options.buttonStyleSelection === void 0) return void 0;
99315
+ const result = resolveButtonStyleSelection(options.buttonStyleSelection);
99316
+ if (result.kind === "error") throw new Error(`Invalid button style ${result.error.styleId}: ${result.error.issues.join(", ")}`);
99317
+ return result.buttonSystem;
99605
99318
  }
99606
99319
  function compileHeroTypography(recipes) {
99607
99320
  const headlineSize = recipes.typography === "classic-serif" ? "5xl" : recipes.contrast === "maximum" ? "6xl" : recipes.spacing === "compact" ? "4xl" : "5xl";
@@ -99629,7 +99342,7 @@ function compileHeroTypography(recipes) {
99629
99342
  * Theme output before any persistence or Phase 5 integration consumes them.
99630
99343
  *
99631
99344
  * Optional `options` accept an already-resolved palette selection and button
99632
- * personality. Sparse overrides and legacy palette IDs are deliberately not
99345
+ * style. Sparse overrides and legacy palette IDs are deliberately not
99633
99346
  * compiler inputs: callers must resolve a complete palette before compiling.
99634
99347
  */
99635
99348
  function compileTokenRecipes(recipes, options = {}) {
@@ -99977,17 +99690,28 @@ function defineCuratedSiteStyle(input) {
99977
99690
  })),
99978
99691
  recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
99979
99692
  recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
99980
- buttonPersonalityChoices: input.buttonPersonalityChoices,
99693
+ buttonStyleChoices: input.buttonStyleChoices,
99981
99694
  paletteRecommendations: input.paletteRecommendations,
99982
99695
  typography: input.typography ?? defaultTypographyForRecipe(input.tokenRecipes.typography),
99983
99696
  ...input.heroTypography ? { heroTypography: input.heroTypography } : {}
99984
99697
  };
99985
99698
  }
99986
- function buttonChoice(id, note) {
99699
+ function defaultButtonStyleSelectionForSiteStyle(siteStyle) {
99700
+ const { styleId, parameters } = siteStyle.buttonStyleChoices[0];
99701
+ return buttonStyleSelectionSchema.parse({
99702
+ styleId,
99703
+ parameters
99704
+ });
99705
+ }
99706
+ function buttonChoice(styleId, note, parameters) {
99707
+ const selection = parameters === void 0 ? defaultButtonStyleSelectionFor(styleId) : buttonStyleSelectionSchema.parse({
99708
+ styleId,
99709
+ parameters
99710
+ });
99987
99711
  return note ? {
99988
- id: asButtonPersonalityId(id),
99712
+ ...selection,
99989
99713
  note
99990
- } : { id: asButtonPersonalityId(id) };
99714
+ } : selection;
99991
99715
  }
99992
99716
  function paletteRecommendation(authoringKey, note) {
99993
99717
  const valueKey = requireCuratedPaletteValueKey(asCuratedPaletteAuthoringKey(authoringKey));
@@ -100172,9 +99896,8 @@ const curatedSiteStyles = [
100172
99896
  "minimal-transparent",
100173
99897
  "clean-base"
100174
99898
  ],
100175
- buttonPersonalityChoices: [
99899
+ buttonStyleChoices: [
100176
99900
  buttonChoice("soft-pill"),
100177
- buttonChoice("two-tone-pill"),
100178
99901
  buttonChoice("pebble"),
100179
99902
  buttonChoice("editorial-link"),
100180
99903
  buttonChoice("brushed-wash")
@@ -100210,7 +99933,7 @@ const curatedSiteStyles = [
100210
99933
  "brand-solid",
100211
99934
  "clean-base"
100212
99935
  ],
100213
- buttonPersonalityChoices: [
99936
+ buttonStyleChoices: [
100214
99937
  buttonChoice("confident-chip"),
100215
99938
  buttonChoice("soft-pill"),
100216
99939
  buttonChoice("editorial-link")
@@ -100249,7 +99972,7 @@ const curatedSiteStyles = [
100249
99972
  "minimal-transparent",
100250
99973
  "centered-calm"
100251
99974
  ],
100252
- buttonPersonalityChoices: [
99975
+ buttonStyleChoices: [
100253
99976
  buttonChoice("editorial-link"),
100254
99977
  buttonChoice("soft-pill"),
100255
99978
  buttonChoice("brushed-wash")
@@ -100289,7 +100012,7 @@ const curatedSiteStyles = [
100289
100012
  "practical-utility",
100290
100013
  "clean-base"
100291
100014
  ],
100292
- buttonPersonalityChoices: [
100015
+ buttonStyleChoices: [
100293
100016
  buttonChoice("pebble"),
100294
100017
  buttonChoice("brushed-wash"),
100295
100018
  buttonChoice("confident-chip")
@@ -100350,7 +100073,7 @@ const curatedSiteStyles = [
100350
100073
  "serif-line",
100351
100074
  "clean-base"
100352
100075
  ],
100353
- buttonPersonalityChoices: [
100076
+ buttonStyleChoices: [
100354
100077
  buttonChoice("editorial-link"),
100355
100078
  buttonChoice("confident-chip"),
100356
100079
  buttonChoice("soft-pill")
@@ -100412,7 +100135,7 @@ const curatedSiteStyles = [
100412
100135
  "brand-solid",
100413
100136
  "clean-base"
100414
100137
  ],
100415
- buttonPersonalityChoices: [
100138
+ buttonStyleChoices: [
100416
100139
  buttonChoice("confident-chip"),
100417
100140
  buttonChoice("pebble"),
100418
100141
  buttonChoice("ink-stamp")
@@ -100451,7 +100174,7 @@ const curatedSiteStyles = [
100451
100174
  "minimal-transparent",
100452
100175
  "clean-base"
100453
100176
  ],
100454
- buttonPersonalityChoices: [
100177
+ buttonStyleChoices: [
100455
100178
  buttonChoice("soft-pill"),
100456
100179
  buttonChoice("pebble"),
100457
100180
  buttonChoice("confident-chip")
@@ -100524,7 +100247,7 @@ const curatedSiteStyles = [
100524
100247
  "clean-base",
100525
100248
  "centered-calm"
100526
100249
  ],
100527
- buttonPersonalityChoices: [
100250
+ buttonStyleChoices: [
100528
100251
  buttonChoice("pebble"),
100529
100252
  buttonChoice("soft-pill"),
100530
100253
  buttonChoice("editorial-link")
@@ -100643,12 +100366,8 @@ const curatedSiteStyles = [
100643
100366
  "serif-line",
100644
100367
  "minimal-transparent"
100645
100368
  ],
100646
- recommendedFooterLookIds: [
100647
- "footer-centered-calm",
100648
- "footer-editorial-columns",
100649
- "footer-muted-grounding"
100650
- ],
100651
- buttonPersonalityChoices: [
100369
+ recommendedFooterLookIds: ["footer-links-quiet"],
100370
+ buttonStyleChoices: [
100652
100371
  buttonChoice("soft-pill"),
100653
100372
  buttonChoice("pebble"),
100654
100373
  buttonChoice("editorial-link")
@@ -100722,7 +100441,7 @@ const curatedSiteStyles = [
100722
100441
  "centered-calm",
100723
100442
  "minimal-transparent"
100724
100443
  ],
100725
- buttonPersonalityChoices: [
100444
+ buttonStyleChoices: [
100726
100445
  buttonChoice("editorial-link"),
100727
100446
  buttonChoice("soft-pill"),
100728
100447
  buttonChoice("brushed-wash")
@@ -100795,8 +100514,8 @@ const curatedSiteStyles = [
100795
100514
  "practical-utility",
100796
100515
  "clean-base"
100797
100516
  ],
100798
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
100799
- buttonPersonalityChoices: [
100517
+ recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
100518
+ buttonStyleChoices: [
100800
100519
  buttonChoice("pebble"),
100801
100520
  buttonChoice("confident-chip"),
100802
100521
  buttonChoice("ink-stamp"),
@@ -100917,8 +100636,8 @@ const curatedSiteStyles = [
100917
100636
  "minimal-transparent",
100918
100637
  "serif-line"
100919
100638
  ],
100920
- recommendedFooterLookIds: ["footer-muted-grounding", "site-footer-brand-two-band"],
100921
- buttonPersonalityChoices: [
100639
+ recommendedFooterLookIds: ["footer-links-quiet", "footer-links-emphasized"],
100640
+ buttonStyleChoices: [
100922
100641
  buttonChoice("earth-pill"),
100923
100642
  buttonChoice("soft-pill"),
100924
100643
  buttonChoice("pebble"),
@@ -100989,7 +100708,7 @@ const curatedSiteStyles = [
100989
100708
  "floating-glass",
100990
100709
  "brand-solid"
100991
100710
  ],
100992
- buttonPersonalityChoices: [
100711
+ buttonStyleChoices: [
100993
100712
  buttonChoice("ink-stamp"),
100994
100713
  buttonChoice("confident-chip"),
100995
100714
  buttonChoice("brushed-wash"),
@@ -101044,8 +100763,8 @@ const curatedSiteStyles = [
101044
100763
  "transparent-overlay",
101045
100764
  "practical-utility"
101046
100765
  ],
101047
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
101048
- buttonPersonalityChoices: [
100766
+ recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
100767
+ buttonStyleChoices: [
101049
100768
  buttonChoice("showtime-pill"),
101050
100769
  buttonChoice("confident-chip"),
101051
100770
  buttonChoice("ink-stamp"),
@@ -101126,8 +100845,8 @@ const curatedSiteStyles = [
101126
100845
  headerStyleChoice("glass")
101127
100846
  ] },
101128
100847
  recommendedHeaderLookIds: ["minimal-transparent"],
101129
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
101130
- buttonPersonalityChoices: [
100848
+ recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
100849
+ buttonStyleChoices: [
101131
100850
  buttonChoice("ornate-ritual"),
101132
100851
  buttonChoice("joy-stamp"),
101133
100852
  buttonChoice("ink-stamp")
@@ -101180,8 +100899,8 @@ const curatedSiteStyles = [
101180
100899
  headerStyleChoice("glass")
101181
100900
  ] },
101182
100901
  recommendedHeaderLookIds: ["minimal-transparent"],
101183
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
101184
- buttonPersonalityChoices: [
100902
+ recommendedFooterLookIds: ["footer-links-emphasized", "footer-links-quiet"],
100903
+ buttonStyleChoices: [
101185
100904
  buttonChoice("joy-stamp"),
101186
100905
  buttonChoice("ink-stamp"),
101187
100906
  buttonChoice("showtime-pill")
@@ -101271,8 +100990,8 @@ const curatedSiteStyles = [
101271
100990
  "centered-calm",
101272
100991
  "clean-base"
101273
100992
  ],
101274
- recommendedFooterLookIds: ["footer-editorial-columns", "footer-muted-grounding"],
101275
- buttonPersonalityChoices: [
100993
+ recommendedFooterLookIds: ["footer-links-quiet"],
100994
+ buttonStyleChoices: [
101276
100995
  buttonChoice("flat-ink"),
101277
100996
  buttonChoice("confident-chip"),
101278
100997
  buttonChoice("editorial-link")
@@ -101349,14 +101068,9 @@ const curatedSiteStyles = [
101349
101068
  "serif-line",
101350
101069
  "clean-base"
101351
101070
  ],
101352
- recommendedFooterLookIds: [
101353
- "footer-editorial-columns",
101354
- "footer-muted-grounding",
101355
- "footer-identity-quiet"
101356
- ],
101357
- buttonPersonalityChoices: [
101358
- buttonChoice("quiet-arrow"),
101359
- buttonChoice("two-tone-pill"),
101071
+ recommendedFooterLookIds: ["footer-links-quiet"],
101072
+ buttonStyleChoices: [
101073
+ buttonChoice("quiet-arrow", void 0, { secondaryTreatment: "solid-accent" }),
101360
101074
  buttonChoice("flat-ink"),
101361
101075
  buttonChoice("editorial-link")
101362
101076
  ],
@@ -102019,7 +101733,7 @@ function canonicalHeaderSelectionInput(layoutId, styleId) {
102019
101733
  }
102020
101734
  };
102021
101735
  }
102022
- function applySiteChromeLooks({ theme, siteStyle, headerLookId, headerLayoutId, headerStyleId, footerLookId, headerSelectionContext, footerSelectionContext }) {
101736
+ function applySiteChromeLooks({ theme, siteStyle, headerLookId, headerLayoutId, headerStyleId, footerLookId, headerSelectionContext }) {
102023
101737
  const canonicalHeaderSelection = canonicalHeaderSelectionInput(headerLayoutId, headerStyleId);
102024
101738
  const headerSelection = resolveHeaderLook({
102025
101739
  theme,
@@ -102035,8 +101749,7 @@ function applySiteChromeLooks({ theme, siteStyle, headerLookId, headerLayoutId,
102035
101749
  const resolvedHeaderLookId = canonicalHeaderSelection.kind === "canonical" ? findLegacyHeaderLookIdForSelection(headerLayoutStyleSelection) : headerSelection.selectedLookId;
102036
101750
  const footerSelection = resolveFooterLook({
102037
101751
  theme,
102038
- recommendedLookIds: footerLookId ? [footerLookId] : siteStyle.recommendedFooterLookIds,
102039
- context: footerSelectionContext
101752
+ recommendedLookIds: footerLookId ? [footerLookId] : siteStyle.recommendedFooterLookIds
102040
101753
  });
102041
101754
  const footerWithBrandPresentation = headerSelectionContext?.logo ? applyFooterBrandPresentation(footerSelection.footer, headerSelection.brandPresentation) : footerSelection.footer;
102042
101755
  return {
@@ -102088,7 +101801,7 @@ function footerLogoSizeFromBrandPresentation(size) {
102088
101801
  }
102089
101802
  }
102090
101803
  /**
102091
- * High-level, site-style-aware compiler. Resolves the user's personality and
101804
+ * High-level, site-style-aware compiler. Resolves the user's button style and
102092
101805
  * palette selections into theme tokens. Palette authority is always supplied
102093
101806
  * as a complete resolved curated/site selection or an explicit draft.
102094
101807
  *
@@ -102097,17 +101810,20 @@ function footerLogoSizeFromBrandPresentation(size) {
102097
101810
  * notices.
102098
101811
  */
102099
101812
  function compileSiteThemeFromSelections(input) {
102100
- const { siteStyle, buttonPersonalityId, typography, headerLookId, headerLayoutId, headerStyleId, footerLookId, headerSelectionContext, footerSelectionContext } = input;
102101
- const personalityResult = resolveCuratedChoice(toCuratedRequest(parsePersistedButtonPersonalityId(buttonPersonalityId)), siteStyle.buttonPersonalityChoices);
101813
+ const { siteStyle, buttonStyleSelection, typography, headerLookId, headerLayoutId, headerStyleId, footerLookId, headerSelectionContext } = input;
101814
+ const defaultButtonStyle = defaultButtonStyleSelectionForSiteStyle(siteStyle);
101815
+ const requestedButtonStyle = buttonStyleSelection ?? defaultButtonStyle;
101816
+ const acceptsRequestedButtonStyle = siteStyle.buttonStyleChoices.some((choice) => choice.styleId === requestedButtonStyle.styleId);
101817
+ const resolvedButtonStyle = acceptsRequestedButtonStyle ? requestedButtonStyle : defaultButtonStyle;
102102
101818
  const warnings = [];
102103
- if (personalityResult.kind === "defaulted-rejected") warnings.push({
102104
- kind: "rejected-personality",
102105
- requested: personalityResult.requested,
102106
- fellBackTo: personalityResult.resolved
101819
+ if (!acceptsRequestedButtonStyle) warnings.push({
101820
+ kind: "rejected-button-style",
101821
+ requested: requestedButtonStyle.styleId,
101822
+ fellBackTo: defaultButtonStyle
102107
101823
  });
102108
101824
  const siteChromeResult = applySiteChromeLooks({
102109
101825
  theme: applyTypographyToTheme(applySiteStyleThemeOverrides(compileTokenRecipes(siteStyle.template.tokenRecipes, {
102110
- buttonPersonalityId: personalityResult.resolved,
101826
+ buttonStyleSelection: resolvedButtonStyle,
102111
101827
  resolvedPalette: input.resolvedPalette
102112
101828
  }), siteStyle), typography ?? siteStyle.typography, siteStyle.heroTypography),
102113
101829
  siteStyle,
@@ -102115,8 +101831,7 @@ function compileSiteThemeFromSelections(input) {
102115
101831
  headerLayoutId,
102116
101832
  headerStyleId,
102117
101833
  footerLookId,
102118
- headerSelectionContext,
102119
- footerSelectionContext
101834
+ headerSelectionContext
102120
101835
  });
102121
101836
  const commonResult = {
102122
101837
  theme: withSiteStyleMetadata(siteChromeResult.theme, siteStyle),
@@ -102127,7 +101842,7 @@ function compileSiteThemeFromSelections(input) {
102127
101842
  footerLookId: footerLookId ?? null
102128
101843
  },
102129
101844
  resolvedSelections: {
102130
- buttonPersonalityId: personalityResult.resolved,
101845
+ buttonStyleSelection: resolvedButtonStyle,
102131
101846
  headerLookId: siteChromeResult.resolvedHeaderLookId,
102132
101847
  headerLayoutId: siteChromeResult.headerLayoutStyleSelection.layoutId,
102133
101848
  headerStyleId: siteChromeResult.headerLayoutStyleSelection.styleId,
@@ -102145,16 +101860,6 @@ function compileSiteThemeFromSelections(input) {
102145
101860
  }
102146
101861
  };
102147
101862
  }
102148
- function toCuratedRequest(parsed) {
102149
- switch (parsed.kind) {
102150
- case "known": return parsed.id;
102151
- case "unknown": return {
102152
- kind: "unknown",
102153
- raw: parsed.raw
102154
- };
102155
- case "empty": return null;
102156
- }
102157
- }
102158
101863
  function siteStyleIdFromTheme(theme) {
102159
101864
  const rawSiteStyleId = theme?.siteStyleId;
102160
101865
  if (!rawSiteStyleId) return null;
@@ -105610,29 +105315,7 @@ const ctaRowFragment = defineFragment({
105610
105315
  fields: [createCtasRepeater({
105611
105316
  label: "Calls to action",
105612
105317
  itemLabel: "CTA",
105613
- maxItems: 3,
105614
- button: { variants: [
105615
- {
105616
- value: "primary",
105617
- label: "Primary"
105618
- },
105619
- {
105620
- value: "secondary",
105621
- label: "Secondary"
105622
- },
105623
- {
105624
- value: "outline",
105625
- label: "Outline"
105626
- },
105627
- {
105628
- value: "link",
105629
- label: "Link"
105630
- },
105631
- {
105632
- value: "accent",
105633
- label: "Accent"
105634
- }
105635
- ] }
105318
+ maxItems: 3
105636
105319
  })],
105637
105320
  layout: [ctaRow({
105638
105321
  collectionPath: "content.ctas",
@@ -105651,10 +105334,6 @@ const heroCtaRowFragment = defineFragment({
105651
105334
  defaultValue: [],
105652
105335
  button: {
105653
105336
  variants: [
105654
- {
105655
- value: "default",
105656
- label: "Default"
105657
- },
105658
105337
  {
105659
105338
  value: "primary",
105660
105339
  label: "Primary"
@@ -105666,9 +105345,17 @@ const heroCtaRowFragment = defineFragment({
105666
105345
  {
105667
105346
  value: "outline",
105668
105347
  label: "Outline"
105348
+ },
105349
+ {
105350
+ value: "ghost",
105351
+ label: "Ghost"
105352
+ },
105353
+ {
105354
+ value: "accent",
105355
+ label: "Accent"
105669
105356
  }
105670
105357
  ],
105671
- defaultVariant: "default",
105358
+ defaultVariant: "primary",
105672
105359
  includeSize: true,
105673
105360
  defaultSize: "lg"
105674
105361
  }
@@ -106344,11 +106031,13 @@ const blogFeaturedPostFragment = defineFragment({
106344
106031
  as: "p",
106345
106032
  style: textColorStyle("text/80")
106346
106033
  }, bind$1("post.excerpt", { fallback: "Select a blog post to display its preview." })),
106347
- link({
106348
- className: "rb-inline-flex rb-items-center rb-caption rb-hover-opacity-80",
106349
- style: textColorStyle("primary"),
106350
- href: { $bind: { from: "post.path" } }
106351
- }, [text({ as: "strong" }, props({ value: "Read more →" }))])
106034
+ button({
106035
+ className: "rb-self-start",
106036
+ href: { $bind: { from: "post.path" } },
106037
+ variantId: "ghost",
106038
+ size: "sm",
106039
+ linkRequired: true
106040
+ }, [text({ as: "span" }, props({ value: "Read more" }))])
106352
106041
  ])], when("post")), stack({
106353
106042
  gap: "sm",
106354
106043
  className: "rb-rounded-xl rb-border rb-border-dashed rb-p-6",
@@ -106967,21 +106656,7 @@ const newsletterFormFragment = defineFragment({
106967
106656
  createButtonVariantField({
106968
106657
  id: "buttonVariant",
106969
106658
  label: "Button style",
106970
- defaultValue: "primary",
106971
- variants: [
106972
- {
106973
- value: "primary",
106974
- label: "Primary"
106975
- },
106976
- {
106977
- value: "secondary",
106978
- label: "Secondary"
106979
- },
106980
- {
106981
- value: "outline",
106982
- label: "Outline"
106983
- }
106984
- ]
106659
+ defaultValue: "primary"
106985
106660
  }),
106986
106661
  {
106987
106662
  id: "successMessage",
@@ -108227,12 +107902,7 @@ const shopSourceSchema = z$1.object({
108227
107902
  showPrices: z$1.boolean().optional(),
108228
107903
  showValidityPeriod: z$1.boolean().optional(),
108229
107904
  showPricePerCredit: z$1.boolean().nullable().optional(),
108230
- buttonVariant: z$1.enum([
108231
- "primary",
108232
- "secondary",
108233
- "outline",
108234
- "link"
108235
- ]).optional(),
107905
+ buttonVariant: blockButtonRoleSchema.optional(),
108236
107906
  passesHeading: z$1.string().optional(),
108237
107907
  membershipsHeading: z$1.string().optional(),
108238
107908
  buyButtonText: z$1.string().optional(),
@@ -108377,12 +108047,7 @@ const passesMembershipsHydrationSchema = z$1.object({
108377
108047
  passes: z$1.array(publicPassProductSchema),
108378
108048
  memberships: z$1.array(publicMembershipProductSchema),
108379
108049
  passPurchaseMode: z$1.enum(["add_to_cart", "buy_now"]),
108380
- buttonVariant: z$1.enum([
108381
- "primary",
108382
- "secondary",
108383
- "outline",
108384
- "link"
108385
- ])
108050
+ buttonVariant: blockButtonRoleSchema
108386
108051
  });
108387
108052
  const productListHydrationSchema = z$1.object({
108388
108053
  products: z$1.array(publicProductSchema),
@@ -109160,23 +108825,7 @@ const courseRegistrationBlockDefinition = {
109160
108825
  defaultValue: "Sign up",
109161
108826
  maxLength: 40
109162
108827
  },
109163
- createButtonVariantField({
109164
- description: "Choose a button style from your theme",
109165
- variants: [
109166
- {
109167
- value: "primary",
109168
- label: "Primary"
109169
- },
109170
- {
109171
- value: "secondary",
109172
- label: "Secondary"
109173
- },
109174
- {
109175
- value: "outline",
109176
- label: "Outline"
109177
- }
109178
- ]
109179
- })
108828
+ createButtonVariantField()
109180
108829
  ],
109181
108830
  layout: [styledSection({
109182
108831
  baseClass: "",
@@ -109882,23 +109531,7 @@ const eventRegistrationBlockDefinition = {
109882
109531
  defaultValue: "Complete Registration",
109883
109532
  maxLength: 40
109884
109533
  },
109885
- createButtonVariantField({
109886
- description: "Choose a button style from your theme",
109887
- variants: [
109888
- {
109889
- value: "primary",
109890
- label: "Primary"
109891
- },
109892
- {
109893
- value: "secondary",
109894
- label: "Secondary"
109895
- },
109896
- {
109897
- value: "outline",
109898
- label: "Outline"
109899
- }
109900
- ]
109901
- })
109534
+ createButtonVariantField()
109902
109535
  ],
109903
109536
  layout: [styledSection({
109904
109537
  baseClass: "",
@@ -112073,11 +111706,7 @@ const newsletterPresetSchema = z$1.enum([
112073
111706
  "emailNameCompany"
112074
111707
  ]);
112075
111708
  const newsletterDestinationProviderSchema = z$1.enum(["riverbank", "mailchimp"]);
112076
- const newsletterButtonVariantSchema = z$1.enum([
112077
- "primary",
112078
- "secondary",
112079
- "outline"
112080
- ]);
111709
+ const newsletterButtonVariantSchema = blockButtonRoleSchema;
112081
111710
  const newsletterFieldSchema = z$1.object({
112082
111711
  id: z$1.string(),
112083
111712
  type: z$1.enum(["email", "text"]),
@@ -114963,7 +114592,8 @@ function postExcerpt(className) {
114963
114592
  function postReadMore() {
114964
114593
  return button({
114965
114594
  href: { $bind: { from: "post.path" } },
114966
- className: "rb-self-start"
114595
+ className: "rb-self-start",
114596
+ variantId: "ghost"
114967
114597
  }, [text({ as: "span" }, bind$1("content.readMoreText", { fallback: "Read more" }), when("content.readMoreText")), text({
114968
114598
  as: "span",
114969
114599
  value: "Read more"
@@ -118234,31 +117864,7 @@ const featureCardsBlockDefinition = { manifest: createBlockManifest({
118234
117864
  label: "Calls to action",
118235
117865
  itemLabel: "CTA",
118236
117866
  maxItems: 1,
118237
- button: {
118238
- variants: [
118239
- {
118240
- value: "primary",
118241
- label: "Primary"
118242
- },
118243
- {
118244
- value: "secondary",
118245
- label: "Secondary"
118246
- },
118247
- {
118248
- value: "outline",
118249
- label: "Outline"
118250
- },
118251
- {
118252
- value: "ghost",
118253
- label: "Ghost"
118254
- },
118255
- {
118256
- value: "link",
118257
- label: "Link"
118258
- }
118259
- ],
118260
- defaultVariant: "ghost"
118261
- }
117867
+ button: { defaultVariant: "ghost" }
118262
117868
  })
118263
117869
  ] }
118264
117870
  },
@@ -120372,36 +119978,7 @@ const offeringsPreviewFields = [
120372
119978
  ui: { intent: "content" },
120373
119979
  schema: { fields: groupOverrideFields }
120374
119980
  },
120375
- {
120376
- id: "buttonVariant",
120377
- type: "select",
120378
- label: "Button style",
120379
- required: false,
120380
- multiple: false,
120381
- defaultValue: "primary",
120382
- options: [
120383
- {
120384
- value: "primary",
120385
- label: "Primary"
120386
- },
120387
- {
120388
- value: "secondary",
120389
- label: "Secondary"
120390
- },
120391
- {
120392
- value: "outline",
120393
- label: "Outline"
120394
- },
120395
- {
120396
- value: "link",
120397
- label: "Link"
120398
- }
120399
- ],
120400
- ui: {
120401
- intent: "display",
120402
- widget: "buttonVariant"
120403
- }
120404
- },
119981
+ createButtonVariantField(),
120405
119982
  {
120406
119983
  id: "buttonText",
120407
119984
  type: "text",
@@ -120607,7 +120184,7 @@ function normalizeOfferingsPreviewGroupOverride(value) {
120607
120184
  return [override];
120608
120185
  }
120609
120186
  function isButtonVariant(value) {
120610
- return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
120187
+ return value === null || isBlockButtonRole(value);
120611
120188
  }
120612
120189
  function normalizeCardStylesContent(value) {
120613
120190
  return isRecord$3(value) || value === null ? value : void 0;
@@ -136662,15 +136239,15 @@ function createEditorUiStore(options = {}) {
136662
136239
  baseline,
136663
136240
  current: baseline
136664
136241
  });
136665
- set((state) => ({
136242
+ set({
136666
136243
  drawerOpen: true,
136667
136244
  previewSidebarTab: "editor",
136668
136245
  previewInspection: {
136669
136246
  kind: "linked-entry",
136670
136247
  entryId: unsafeAsLinkedContentEntryId(target.entryId),
136671
- requestId: state.previewInspection.kind === "linked-entry" ? state.previewInspection.requestId + 1 : 1
136248
+ requestId: nextRequestId++
136672
136249
  }
136673
- }));
136250
+ });
136674
136251
  if (!changed) triggerUpdate();
136675
136252
  },
136676
136253
  close: () => {
@@ -137004,33 +136581,33 @@ function createEditorUiStore(options = {}) {
137004
136581
  drawerOpen: false,
137005
136582
  previewSidebarTab: "editor",
137006
136583
  previewInspection: { kind: "none" },
136584
+ previewDesignOpenRequest: null,
137007
136585
  activePreviewField: null,
137008
136586
  focusRequest: null,
137009
136587
  activeBlockId: null,
137010
136588
  setDrawerOpen: (open) => set((state) => state.drawerOpen === open ? state : { drawerOpen: open }),
137011
136589
  setPreviewSidebarTab: (tab) => set((state) => state.previewSidebarTab === tab ? state : { previewSidebarTab: tab }),
137012
- inspectBlock: (blockId) => set((state) => ({
136590
+ openPreviewEditor: (intent) => set((state) => {
136591
+ return {
136592
+ drawerOpen: true,
136593
+ previewSidebarTab: "editor",
136594
+ ...previewEditorOpenDestination(state.previewInspection, intent, nextRequestId++)
136595
+ };
136596
+ }),
136597
+ consumePreviewDesignOpenRequest: (requestId) => set((state) => state.previewDesignOpenRequest?.requestId === requestId ? { previewDesignOpenRequest: null } : state),
136598
+ inspectBlock: (blockId) => set({
137013
136599
  previewInspection: {
137014
136600
  kind: "block-customize",
137015
136601
  blockId,
137016
- requestId: state.previewInspection.kind === "block-customize" ? state.previewInspection.requestId + 1 : 1
136602
+ requestId: nextRequestId++
137017
136603
  },
137018
136604
  activeBlockId: blockId
137019
- })),
137020
- inspectLinkedEntry: (entryId) => set((state) => ({ previewInspection: {
136605
+ }),
136606
+ inspectLinkedEntry: (entryId) => set({ previewInspection: {
137021
136607
  kind: "linked-entry",
137022
136608
  entryId: unsafeAsLinkedContentEntryId(entryId),
137023
- requestId: state.previewInspection.kind === "linked-entry" ? state.previewInspection.requestId + 1 : 1
137024
- } })),
137025
- inspectFooterModule: (moduleId) => set((state) => ({ previewInspection: {
137026
- kind: "footer-module",
137027
- moduleId,
137028
- requestId: state.previewInspection.kind === "footer-module" ? state.previewInspection.requestId + 1 : 1
137029
- } })),
137030
- inspectFooter: () => set((state) => ({ previewInspection: {
137031
- kind: "footer",
137032
- requestId: state.previewInspection.kind === "footer" ? state.previewInspection.requestId + 1 : 1
137033
- } })),
136609
+ requestId: nextRequestId++
136610
+ } }),
137034
136611
  clearPreviewInspection: () => set((state) => state.previewInspection.kind === "none" ? state : { previewInspection: { kind: "none" } }),
137035
136612
  setActivePreviewField: (field) => set((state) => activePreviewFieldsEqual(state.activePreviewField, field) ? state : { activePreviewField: field }),
137036
136613
  requestFocus: (payload) => set({ focusRequest: {
@@ -137115,6 +136692,34 @@ function createEditorUiStore(options = {}) {
137115
136692
  };
137116
136693
  });
137117
136694
  }
136695
+ function previewEditorOpenDestination(current, intent, requestId) {
136696
+ switch (intent.kind) {
136697
+ case "design": return {
136698
+ previewInspection: current,
136699
+ previewDesignOpenRequest: {
136700
+ row: intent.row,
136701
+ requestId
136702
+ }
136703
+ };
136704
+ case "footer":
136705
+ if (intent.target === "overview") return {
136706
+ previewInspection: {
136707
+ kind: "footer",
136708
+ requestId
136709
+ },
136710
+ previewDesignOpenRequest: null
136711
+ };
136712
+ return {
136713
+ previewInspection: {
136714
+ kind: "footer-module",
136715
+ moduleId: intent.target.moduleId,
136716
+ requestId
136717
+ },
136718
+ previewDesignOpenRequest: null
136719
+ };
136720
+ default: return assertNever$3(intent, "Unhandled preview editor open intent");
136721
+ }
136722
+ }
137118
136723
  const EditorUiStoreContext = createContext(null);
137119
136724
  const EditorUiStoreProvider = EditorUiStoreContext.Provider;
137120
136725
  function useEditorUiStore(selector) {
@@ -160438,7 +160043,7 @@ function fieldsForModule(module) {
160438
160043
  }];
160439
160044
  return [...moduleFieldCatalog];
160440
160045
  }
160441
- function FooterComposerPanel({ apiClient, siteId: rawSiteId, customFooterMode, manageLinksHref, manageSettingsHref, legalRegion = "integrated", initialTarget, variant = "full", canEdit = true, onSaved }) {
160046
+ function FooterComposerPanel({ apiClient, siteId: rawSiteId, customFooterMode, manageLinksHref, manageSettingsHref, legalRegion = "integrated", initialTarget, variant = "full", canEdit = true, onSaved, loadingFallback }) {
160442
160047
  const siteId = useMemo(() => unsafeAsSiteId(rawSiteId), [rawSiteId]);
160443
160048
  const [compositionSnapshot, setCompositionSnapshot] = useState(null);
160444
160049
  const [profileSnapshot, setProfileSnapshot] = useState(null);
@@ -160446,7 +160051,9 @@ function FooterComposerPanel({ apiClient, siteId: rawSiteId, customFooterMode, m
160446
160051
  const [target, setTarget] = useState(initialTarget ?? { kind: "overview" });
160447
160052
  const [saveState, setSaveState] = useState("idle");
160448
160053
  const [message, setMessage] = useState(null);
160054
+ const [loadError, setLoadError] = useState(null);
160449
160055
  const load = useCallback(async () => {
160056
+ setLoadError(null);
160450
160057
  try {
160451
160058
  const [composition, profile, navigation] = await Promise.all([
160452
160059
  getFooterComposition(apiClient, siteId),
@@ -160457,7 +160064,7 @@ function FooterComposerPanel({ apiClient, siteId: rawSiteId, customFooterMode, m
160457
160064
  setProfileSnapshot(profile);
160458
160065
  setNavigationMenus(navigation.menus);
160459
160066
  } catch (error) {
160460
- setMessage(error instanceof Error ? error.message : "The footer could not be loaded.");
160067
+ setLoadError(error instanceof Error ? error.message : "The footer could not be loaded.");
160461
160068
  }
160462
160069
  }, [
160463
160070
  apiClient,
@@ -160541,14 +160148,12 @@ function FooterComposerPanel({ apiClient, siteId: rawSiteId, customFooterMode, m
160541
160148
  profileSnapshot,
160542
160149
  siteId
160543
160150
  ]);
160544
- if (compositionSnapshot === null || profileSnapshot === null || navigationMenus === null) return /* @__PURE__ */ jsx("p", {
160545
- className: "text-sm text-muted-foreground",
160546
- children: "Loading footer…"
160547
- });
160548
- if (compositionSnapshot.kind === "invalid" || profileSnapshot.kind === "invalid") return /* @__PURE__ */ jsx(RecoveryState, {
160549
- message: "Stored footer data needs repair before it can be edited safely.",
160550
- onReload: load
160151
+ if (loadError !== null) return /* @__PURE__ */ jsx(LoadFailureState, {
160152
+ message: loadError,
160153
+ onRetry: load
160551
160154
  });
160155
+ if (compositionSnapshot === null || profileSnapshot === null || navigationMenus === null) return loadingFallback;
160156
+ if (compositionSnapshot.kind === "invalid" || profileSnapshot.kind === "invalid") return /* @__PURE__ */ jsx(InvalidFooterState, {});
160552
160157
  if (compositionSnapshot.kind === "missing") return /* @__PURE__ */ jsx(MissingFooter, {
160553
160158
  canEdit,
160554
160159
  onCreate: async () => {
@@ -161315,13 +160920,13 @@ function MissingFooter({ onCreate, canEdit }) {
161315
160920
  ]
161316
160921
  });
161317
160922
  }
161318
- function RecoveryState({ message, onReload }) {
160923
+ function LoadFailureState({ message, onRetry }) {
161319
160924
  return /* @__PURE__ */ jsxs("div", {
161320
160925
  className: "space-y-4 rounded-xl border p-6",
161321
160926
  children: [
161322
160927
  /* @__PURE__ */ jsx("h1", {
161323
160928
  className: "text-xl font-semibold",
161324
- children: "Footer needs attention"
160929
+ children: "The footer could not be loaded"
161325
160930
  }),
161326
160931
  /* @__PURE__ */ jsx("p", {
161327
160932
  className: "text-sm text-muted-foreground",
@@ -161330,12 +160935,24 @@ function RecoveryState({ message, onReload }) {
161330
160935
  /* @__PURE__ */ jsx("button", {
161331
160936
  type: "button",
161332
160937
  className: buttonClass,
161333
- onClick: () => void onReload(),
161334
- children: "Reload"
160938
+ onClick: () => void onRetry(),
160939
+ children: "Try again"
161335
160940
  })
161336
160941
  ]
161337
160942
  });
161338
160943
  }
160944
+ function InvalidFooterState() {
160945
+ return /* @__PURE__ */ jsxs("div", {
160946
+ className: "space-y-3 rounded-xl border p-6",
160947
+ children: [/* @__PURE__ */ jsx("h1", {
160948
+ className: "text-xl font-semibold",
160949
+ children: "Footer needs updating"
160950
+ }), /* @__PURE__ */ jsx("p", {
160951
+ className: "text-sm text-muted-foreground",
160952
+ children: "This footer's saved data needs updating before it can be edited."
160953
+ })]
160954
+ });
160955
+ }
161339
160956
  //#endregion
161340
160957
  //#region ../preview-next/src/client/preview/assistantAvailability.ts
161341
160958
  process.env.NEXT_PUBLIC_E2E_ENABLE_PREVIEW_ASSISTANT;
@@ -161542,6 +161159,18 @@ function assertNever$2(value, message) {
161542
161159
  }
161543
161160
  //#endregion
161544
161161
  //#region ../preview-next/src/client/preview/StyleConfigurator.state.ts
161162
+ /**
161163
+ * Pure state module for the Style configurator. Per-action function style so
161164
+ * the picker rows, apply flow, and concurrency layer can call into a small,
161165
+ * exhaustive set of named transitions instead of a centralised reducer
161166
+ * switch.
161167
+ *
161168
+ * The configurator surfaces three site-level decisions (site style, button
161169
+ * button style, palette state). The
161170
+ * "base" snapshot is what the server has persisted; "previewed" is what the
161171
+ * preview pane is currently rendering. They diverge while the user is
161172
+ * picking and converge on apply-success.
161173
+ */
161545
161174
  const STYLE_CONFIGURATOR_TARGET_KEY = "design:site-style";
161546
161175
  function createStyleConfiguratorState(base) {
161547
161176
  return {
@@ -161602,10 +161231,10 @@ function previewSiteStyle(state, siteStyleId) {
161602
161231
  siteStyleId
161603
161232
  });
161604
161233
  }
161605
- function previewButtonPersonality(state, buttonPersonalityId) {
161234
+ function previewButtonStyle(state, buttonStyleSelection) {
161606
161235
  return withPreviewedSelection(state, {
161607
161236
  ...state.previewed,
161608
- buttonPersonalityId
161237
+ buttonStyleSelection
161609
161238
  });
161610
161239
  }
161611
161240
  function previewHeaderLayout(state, headerLayoutId) {
@@ -161719,7 +161348,7 @@ function setPaletteColors(state, colors) {
161719
161348
  /**
161720
161349
  * Records the post-compile resolved selection + any fallback warnings.
161721
161350
  * Used after `compileSiteThemeFromSelections` runs against a new site style:
161722
- * the resolver may have auto-picked a different personality if the user's
161351
+ * the resolver may have auto-picked a different button style if the user's
161723
161352
  * previous selection is not offered for the new style, or a different palette
161724
161353
  * if the persisted palette value key is no longer known.
161725
161354
  *
@@ -161728,7 +161357,7 @@ function applyResolvedSelections(state, input) {
161728
161357
  return {
161729
161358
  ...withPreviewedSelection(state, {
161730
161359
  ...state.previewed,
161731
- buttonPersonalityId: input.resolved.buttonPersonalityId,
161360
+ buttonStyleSelection: input.resolved.buttonStyleSelection,
161732
161361
  headerLayoutId: input.resolved.headerLayoutId,
161733
161362
  headerStyleId: input.resolved.headerStyleId,
161734
161363
  headerLookId: input.resolved.headerLookId,
@@ -162070,7 +161699,7 @@ function createStyleConfiguratorHistoryEntry(previous, next) {
162070
161699
  };
162071
161700
  }
162072
161701
  function selectionSnapshotsEqual(a, b) {
162073
- return a.siteStyleId === b.siteStyleId && a.selectionVersion === b.selectionVersion && a.selectionUpdatedAt === b.selectionUpdatedAt && a.headerLayoutId === b.headerLayoutId && a.headerStyleId === b.headerStyleId && a.headerLookId === b.headerLookId && a.footerLookId === b.footerLookId && a.buttonPersonalityId === b.buttonPersonalityId && paletteSelectionSnapshotsEqual(a.palette, b.palette) && typographyObjectsEqual(a.typography, b.typography);
161702
+ return a.siteStyleId === b.siteStyleId && a.selectionVersion === b.selectionVersion && a.selectionUpdatedAt === b.selectionUpdatedAt && a.headerLayoutId === b.headerLayoutId && a.headerStyleId === b.headerStyleId && a.headerLookId === b.headerLookId && a.footerLookId === b.footerLookId && buttonStyleSelectionsEqual(a.buttonStyleSelection, b.buttonStyleSelection) && paletteSelectionSnapshotsEqual(a.palette, b.palette) && typographyObjectsEqual(a.typography, b.typography);
162074
161703
  }
162075
161704
  function patchTypography(typography, patch) {
162076
161705
  switch (patch.kind) {
@@ -162608,15 +162237,14 @@ function planSiteStylePreviewChange(input) {
162608
162237
  const resolvedPalette = resolvedPaletteForPreview(input.selection.palette, input.siteStyle);
162609
162238
  const compiled = compileSiteThemeFromSelections({
162610
162239
  siteStyle: input.siteStyle,
162611
- buttonPersonalityId: input.selection.buttonPersonalityId,
162240
+ buttonStyleSelection: input.selection.buttonStyleSelection,
162612
162241
  resolvedPalette,
162613
162242
  typography: input.selection.typography,
162614
162243
  headerLayoutId: input.selection.headerLayoutId,
162615
162244
  headerStyleId: input.selection.headerStyleId,
162616
162245
  headerLookId: input.selection.headerLookId,
162617
162246
  footerLookId: input.selection.footerLookId,
162618
- headerSelectionContext: input.headerSelectionContext,
162619
- footerSelectionContext: input.footerSelectionContext
162247
+ headerSelectionContext: input.headerSelectionContext
162620
162248
  });
162621
162249
  return {
162622
162250
  themeOverlay: compiled.theme,
@@ -162680,21 +162308,18 @@ function assertNever(value) {
162680
162308
  //#region ../preview-next/src/client/preview/siteChromeLookRows.ts
162681
162309
  function buildSiteChromeLookModels(input) {
162682
162310
  const selection = input.state.previewed;
162683
- const common = {
162311
+ const current = compileSiteThemeFromSelections({
162684
162312
  siteStyle: input.siteStyle,
162685
- buttonPersonalityId: selection.buttonPersonalityId,
162313
+ buttonStyleSelection: selection.buttonStyleSelection,
162686
162314
  resolvedPalette: resolvedPaletteForPreview(selection.palette, input.siteStyle),
162687
162315
  headerLayoutId: selection.headerLayoutId,
162688
162316
  headerStyleId: selection.headerStyleId,
162689
162317
  headerLookId: selection.headerLookId,
162690
162318
  footerLookId: selection.footerLookId,
162691
- headerSelectionContext: input.headerSelectionContext,
162692
- footerSelectionContext: input.footerSelectionContext
162693
- };
162694
- const current = compileSiteThemeFromSelections(common);
162319
+ headerSelectionContext: input.headerSelectionContext
162320
+ });
162695
162321
  const renderedHeaderLayoutId = current.resolvedSelections.headerLayoutId;
162696
162322
  const renderedHeaderStyleId = current.resolvedSelections.headerStyleId;
162697
- const renderedFooterLayoutId = current.footerSelection.selectedLook.layoutId;
162698
162323
  return {
162699
162324
  headerLayout: {
162700
162325
  renderedLayoutId: renderedHeaderLayoutId,
@@ -162720,10 +162345,6 @@ function buildSiteChromeLookModels(input) {
162720
162345
  };
162721
162346
  })
162722
162347
  },
162723
- footerLayout: {
162724
- renderedLayoutId: renderedFooterLayoutId,
162725
- options: footerLayoutOptions(common)
162726
- },
162727
162348
  footer: {
162728
162349
  renderedLookId: current.resolvedSelections.footerLookId,
162729
162350
  options: [{
@@ -162731,51 +162352,18 @@ function buildSiteChromeLookModels(input) {
162731
162352
  label: "Site style default",
162732
162353
  description: "Use the footer chosen for this site style.",
162733
162354
  available: true
162734
- }, ...footerLookCatalog.filter((look) => look.layoutId === renderedFooterLayoutId && !footerLookHiddenFromLayoutStyleControls(look)).map((look) => {
162735
- const rejected = compileSiteThemeFromSelections({
162736
- ...common,
162737
- footerLookId: look.id
162738
- }).footerSelection.rejected.find((item) => item.lookId === look.id);
162739
- const style = getFooterStyle(look.styleId);
162355
+ }, ...footerLookCatalog.map((look) => {
162740
162356
  return {
162741
162357
  id: look.id,
162742
- label: style?.label ?? look.label,
162743
- description: rejected ? rejected.reasons.map(footerLookRejectionReasonLabel).join(" ") : style?.description,
162744
- available: !rejected
162358
+ label: look.label,
162359
+ description: look.description,
162360
+ available: true
162745
162361
  };
162746
162362
  })],
162747
- diagnostics: diagnosticsForRequestedFooterSelection(selection.footerLookId, current.resolvedSelections.footerLookId, current.footerSelection.rejected)
162363
+ diagnostics: []
162748
162364
  }
162749
162365
  };
162750
162366
  }
162751
- function footerLayoutOptions(common) {
162752
- return footerLayoutCatalog.map((layout) => {
162753
- const availability = visibleFooterLooksForLayout(layout.id).map((look) => footerLookAvailability(common, look.id));
162754
- const firstRejected = availability.find((item) => item.rejected)?.rejected;
162755
- const hasAvailableStyle = availability.some((item) => !item.rejected);
162756
- return {
162757
- id: layout.id,
162758
- label: layout.label,
162759
- description: hasAvailableStyle ? layout.description : firstRejected?.reasons.map(footerLookRejectionReasonLabel).join(" "),
162760
- available: hasAvailableStyle
162761
- };
162762
- });
162763
- }
162764
- function visibleFooterLooksForLayout(layoutId) {
162765
- return footerLookCatalog.filter((look) => look.layoutId === layoutId && !footerLookHiddenFromLayoutStyleControls(look));
162766
- }
162767
- function footerLookHiddenFromLayoutStyleControls(look) {
162768
- return look.hiddenFromLayoutStyleControls === true;
162769
- }
162770
- function footerLookAvailability(common, footerLookId) {
162771
- return {
162772
- footerLookId,
162773
- rejected: compileSiteThemeFromSelections({
162774
- ...common,
162775
- footerLookId
162776
- }).footerSelection.rejected.find((item) => item.lookId === footerLookId)
162777
- };
162778
- }
162779
162367
  function cycleSiteChromeLookId(options, currentId, direction) {
162780
162368
  const cycleable = cycleableSiteChromeOptions(options);
162781
162369
  if (cycleable.length <= 1) return void 0;
@@ -162822,17 +162410,6 @@ function planSiteChromeLookSelection(command) {
162822
162410
  next: { footerLookId: command.lookId }
162823
162411
  };
162824
162412
  }
162825
- function planSiteChromeFooterLayoutSelection(command) {
162826
- const currentStyleId = footerLookCatalog.find((look) => look.id === command.currentLookId)?.styleId ?? null;
162827
- return (currentStyleId ? findFooterLookForLayoutStyle({
162828
- layoutId: command.layoutId,
162829
- styleId: currentStyleId
162830
- }) : null)?.id ?? findDefaultFooterLookForLayout(command.layoutId)?.id;
162831
- }
162832
- function diagnosticsForRequestedFooterSelection(requestedLookId, renderedLookId, rejected) {
162833
- if (!requestedLookId || requestedLookId === renderedLookId) return [];
162834
- return rejected.find((item) => item.lookId === requestedLookId)?.reasons.map(footerLookRejectionReasonLabel) ?? [];
162835
- }
162836
162413
  //#endregion
162837
162414
  //#region ../preview-next/src/client/preview/previewErrorMessages.ts
162838
162415
  const PREVIEW_DESIGN_SAVE_ERROR_MESSAGE = "We couldn’t save that change just now. Please try again in a minute or two.";
@@ -162861,7 +162438,7 @@ function resolveStyleConfiguratorInitialSnapshot(input) {
162861
162438
  } : paletteSelectionSnapshotFromRuntime(runtimePaletteState);
162862
162439
  const compiled = compileSiteThemeFromSelections({
162863
162440
  siteStyle,
162864
- buttonPersonalityId: input.initialSelections.buttonPersonalityId,
162441
+ buttonStyleSelection: input.initialSelections.buttonStyleSelection,
162865
162442
  resolvedPalette: resolvedRuntimePalette?.ok ? resolvedRuntimePalette.resolved : resolvedPaletteForPreview(palette, siteStyle),
162866
162443
  typography: input.theme?.typography ?? siteStyle.typography,
162867
162444
  ...sharedSelectionInputs(input)
@@ -162874,7 +162451,7 @@ function resolveStyleConfiguratorInitialSnapshot(input) {
162874
162451
  headerStyleId: compiled.resolvedSelections.headerStyleId,
162875
162452
  headerLookId: compiled.requestedSelections.headerLookId,
162876
162453
  footerLookId: compiled.requestedSelections.footerLookId,
162877
- buttonPersonalityId: compiled.resolvedSelections.buttonPersonalityId,
162454
+ buttonStyleSelection: compiled.resolvedSelections.buttonStyleSelection,
162878
162455
  palette,
162879
162456
  typography: compiled.theme.typography
162880
162457
  };
@@ -162885,8 +162462,7 @@ function sharedSelectionInputs(input) {
162885
162462
  headerStyleId: input.initialSelections.headerStyleId ?? null,
162886
162463
  headerLookId: input.initialSelections.headerLookId ?? null,
162887
162464
  footerLookId: input.initialSelections.footerLookId ?? null,
162888
- headerSelectionContext: input.headerSelectionContext,
162889
- footerSelectionContext: input.footerSelectionContext
162465
+ headerSelectionContext: input.headerSelectionContext
162890
162466
  };
162891
162467
  }
162892
162468
  //#endregion
@@ -163021,13 +162597,12 @@ function hasLogoInHeaderSelectionContext(context) {
163021
162597
  }
163022
162598
  //#endregion
163023
162599
  //#region ../preview-next/src/client/preview/siteChromeSavePlan.ts
163024
- function buildSiteChromeSavePlan({ surface, siteStyle, selection, baseTheme, headerSelectionContext, footerSelectionContext, headerBrandPreferences, headerNavPreferences, backgroundPreferences, themeId, selectionId, baseSelectionUpdatedAt }) {
162600
+ function buildSiteChromeSavePlan({ surface, siteStyle, selection, baseTheme, headerSelectionContext, headerBrandPreferences, headerNavPreferences, backgroundPreferences, themeId, selectionId, baseSelectionUpdatedAt }) {
163025
162601
  const compiled = planSiteStylePreviewChange({
163026
162602
  siteStyle,
163027
162603
  selection,
163028
162604
  baseTheme,
163029
- headerSelectionContext: withHeaderBrandPreferences(headerSelectionContext, headerBrandPreferences),
163030
- footerSelectionContext
162605
+ headerSelectionContext: withHeaderBrandPreferences(headerSelectionContext, headerBrandPreferences)
163031
162606
  });
163032
162607
  const themeOverlay = applySiteChromeBackgroundPreferences(withHeaderNavThemePreferences(withHeaderBrandThemePreferences(compiled.themeOverlay, headerBrandPreferences), headerNavPreferences), backgroundPreferences);
163033
162608
  return {
@@ -163088,9 +162663,9 @@ function buildApplySiteStyleSelectionBody(input) {
163088
162663
  kind: "set-site-style",
163089
162664
  siteStyleId: input.previewed.siteStyleId
163090
162665
  });
163091
- if (styleChanged || input.base.buttonPersonalityId !== input.previewed.buttonPersonalityId) changes.push({
163092
- kind: "set-button-personality",
163093
- buttonPersonalityId: input.previewed.buttonPersonalityId
162666
+ if (styleChanged || !buttonStyleSelectionsEqual(input.base.buttonStyleSelection, input.previewed.buttonStyleSelection)) changes.push({
162667
+ kind: "set-button-style",
162668
+ buttonStyleSelection: input.previewed.buttonStyleSelection
163094
162669
  });
163095
162670
  if (styleChanged || !paletteSelectionSnapshotsEqual(input.base.palette, input.previewed.palette)) {
163096
162671
  const palettePlan = planPaletteApplyCommand(input);
@@ -163139,7 +162714,7 @@ function selectionSnapshotFromApplySiteStyleSelectionResponse(saved, fallback) {
163139
162714
  siteStyleId: saved.siteStyleId,
163140
162715
  selectionVersion: saved.selectionVersion,
163141
162716
  selectionUpdatedAt: saved.selectionUpdatedAt ?? fallback.selectionUpdatedAt ?? null,
163142
- buttonPersonalityId: saved.buttonPersonalityId,
162717
+ buttonStyleSelection: saved.buttonStyleSelection,
163143
162718
  palette: paletteSnapshotFromApplyResponse(saved),
163144
162719
  typography: saved.theme.typography,
163145
162720
  headerLookId: saved.headerLookId,
@@ -163463,22 +163038,14 @@ function quickControlHistoryEntryFromSelectionChange(previous, next, target) {
163463
163038
  next: nextHeader
163464
163039
  };
163465
163040
  }
163466
- case "footer-layout":
163467
- case "footer-look": return previous.footerLookId === next.footerLookId ? null : footerHistoryEntryForTarget(target, previous.footerLookId, next.footerLookId);
163041
+ case "footer-look": return previous.footerLookId === next.footerLookId ? null : {
163042
+ kind: "footer-look",
163043
+ previous: previous.footerLookId,
163044
+ next: next.footerLookId
163045
+ };
163468
163046
  default: return assertNever$8(target, "Unhandled site chrome quick-control target");
163469
163047
  }
163470
163048
  }
163471
- function footerHistoryEntryForTarget(target, previous, next) {
163472
- return target === "footer-layout" ? {
163473
- kind: "footer-layout",
163474
- previous,
163475
- next
163476
- } : {
163477
- kind: "footer-look",
163478
- previous,
163479
- next
163480
- };
163481
- }
163482
163049
  function quickControlHistoryEntryFromBrandPreferenceChange(previous, next, target) {
163483
163050
  switch (target) {
163484
163051
  case "header-brand-display": return previous.brandDisplay === next.brandDisplay ? null : {
@@ -163667,7 +163234,6 @@ function quickControlReplayPlanForEntry(current, entry, command) {
163667
163234
  }
163668
163235
  };
163669
163236
  }
163670
- case "footer-layout":
163671
163237
  case "footer-look": return {
163672
163238
  kind: "selection",
163673
163239
  surface: "footer",
@@ -163763,7 +163329,6 @@ function siteChromeQuickControlHistoryEntryEquals(left, right) {
163763
163329
  switch (left.kind) {
163764
163330
  case "header-layout": return right.kind === left.kind && headerLayoutSelectionsEqual(left.previous, right.previous) && headerLayoutSelectionsEqual(left.next, right.next);
163765
163331
  case "header-style": return right.kind === left.kind && headerStyleSelectionsEqual(left.previous, right.previous) && headerStyleSelectionsEqual(left.next, right.next);
163766
- case "footer-layout":
163767
163332
  case "footer-look":
163768
163333
  case "header-brand-display":
163769
163334
  case "header-logo-size":
@@ -163789,7 +163354,7 @@ function headerStyleSelectionsEqual(left, right) {
163789
163354
  //#endregion
163790
163355
  //#region ../preview-next/src/client/preview/SiteChromeCustomizeContext.tsx
163791
163356
  const SiteChromeCustomizeContext = createContext(null);
163792
- function SiteChromeCustomizeProvider({ children, siteId, apiClient, theme, themeId = null, selectionId = null, selectionVersion = null, selectionUpdatedAt = null, initialSelections, headerSelectionContext, footerSelectionContext, siteStyleAccess = { kind: "hidden" } }) {
163357
+ function SiteChromeCustomizeProvider({ children, siteId, apiClient, theme, themeId = null, selectionId = null, selectionVersion = null, selectionUpdatedAt = null, initialSelections, headerSelectionContext, siteStyleAccess = { kind: "hidden" }, canOpenDesignEditor = false }) {
163793
163358
  const previewDesign = usePreviewDesignCoordinator();
163794
163359
  const previewDesignHistoryOrder = usePreviewDesignHistoryOrder();
163795
163360
  const { clearPreview, previewTheme } = previewDesign;
@@ -163811,10 +163376,8 @@ function SiteChromeCustomizeProvider({ children, siteId, apiClient, theme, theme
163811
163376
  selectionVersion: initialSelectionVersion,
163812
163377
  selectionUpdatedAt: initialSelections.selectionUpdatedAt ?? selectionUpdatedAt ?? null
163813
163378
  },
163814
- headerSelectionContext,
163815
- footerSelectionContext
163379
+ headerSelectionContext
163816
163380
  }), [
163817
- footerSelectionContext,
163818
163381
  headerSelectionContext,
163819
163382
  initialSelectionVersion,
163820
163383
  initialSelections,
@@ -163924,11 +163487,9 @@ function SiteChromeCustomizeProvider({ children, siteId, apiClient, theme, theme
163924
163487
  return buildSiteChromeLookModels({
163925
163488
  state,
163926
163489
  siteStyle,
163927
- headerSelectionContext: withHeaderBrandPreferences(headerSelectionContext, headerBrandControlState.preferences),
163928
- footerSelectionContext
163490
+ headerSelectionContext: withHeaderBrandPreferences(headerSelectionContext, headerBrandControlState.preferences)
163929
163491
  });
163930
163492
  }, [
163931
- footerSelectionContext,
163932
163493
  headerBrandControlState.preferences,
163933
163494
  headerSelectionContext,
163934
163495
  state
@@ -163970,16 +163531,12 @@ function SiteChromeCustomizeProvider({ children, siteId, apiClient, theme, theme
163970
163531
  const currentId = state.previewed.footerLookId;
163971
163532
  const selected = lookModels.footer.options.find((option) => option.id === currentId);
163972
163533
  const rendered = lookModels.footer.options.find((option) => option.id === lookModels.footer.renderedLookId);
163973
- const renderedLayout = lookModels.footerLayout.options.find((option) => option.id === lookModels.footerLayout.renderedLayoutId);
163974
163534
  return {
163975
163535
  kind: "available",
163976
163536
  surface: "footer",
163977
163537
  label: "Footer",
163978
- currentLayoutId: lookModels.footerLayout.renderedLayoutId,
163979
- currentLayoutLabel: renderedLayout?.label ?? "Unknown Layout",
163980
- layoutOptions: lookModels.footerLayout.options,
163981
163538
  currentId,
163982
- currentLabel: selected?.label ?? (currentId ? "Unknown Look" : `${rendered?.label ?? "Site style"} (default)`),
163539
+ currentLabel: selected?.label ?? (currentId ? "Unknown link treatment" : `${rendered?.label ?? "Site style"} (default)`),
163983
163540
  options: lookModels.footer.options,
163984
163541
  diagnostics: lookModels.footer.diagnostics,
163985
163542
  background: backgroundControlState(backgroundPreferences.footer, true),
@@ -164016,7 +163573,6 @@ function SiteChromeCustomizeProvider({ children, siteId, apiClient, theme, theme
164016
163573
  selection,
164017
163574
  baseTheme: currentThemeRef.current ?? theme,
164018
163575
  headerSelectionContext,
164019
- footerSelectionContext,
164020
163576
  headerBrandPreferences,
164021
163577
  headerNavPreferences,
164022
163578
  backgroundPreferences: nextBackgroundPreferences,
@@ -164148,7 +163704,6 @@ function SiteChromeCustomizeProvider({ children, siteId, apiClient, theme, theme
164148
163704
  return outcome;
164149
163705
  }, [
164150
163706
  apiClient,
164151
- footerSelectionContext,
164152
163707
  headerSelectionContext,
164153
163708
  previewDesignHistoryOrder,
164154
163709
  previewTheme,
@@ -164221,21 +163776,6 @@ function SiteChromeCustomizeProvider({ children, siteId, apiClient, theme, theme
164221
163776
  if (!current) return;
164222
163777
  persistSelection("footer", previewFooterLook(current, planFooterLookSelection(lookId)).previewed, "footer-look");
164223
163778
  }, [applyAllowed, persistSelection]);
164224
- const selectFooterLayout = useCallback((layoutId) => {
164225
- if (!applyAllowed) return;
164226
- const current = stateRef.current;
164227
- if (!current || !lookModels) return;
164228
- const nextLookId = planSiteChromeFooterLayoutSelection({
164229
- layoutId,
164230
- currentLookId: current.previewed.footerLookId ?? lookModels.footer.renderedLookId
164231
- });
164232
- if (!nextLookId) return;
164233
- persistSelection("footer", previewFooterLook(current, nextLookId).previewed, "footer-layout");
164234
- }, [
164235
- applyAllowed,
164236
- lookModels,
164237
- persistSelection
164238
- ]);
164239
163779
  const cycleSurfaceLook = useCallback((surface, direction) => {
164240
163780
  const currentState = getSurfaceState(surface);
164241
163781
  if (currentState.kind !== "available") return;
@@ -164251,29 +163791,13 @@ function SiteChromeCustomizeProvider({ children, siteId, apiClient, theme, theme
164251
163791
  selectFooterLook,
164252
163792
  selectHeaderStyle
164253
163793
  ]);
164254
- const cycleSurfaceLayout = useCallback((surface, direction) => {
164255
- const currentState = getSurfaceState(surface);
164256
- if (currentState.kind !== "available") return;
164257
- switch (currentState.surface) {
164258
- case "header": {
164259
- const next = cycleSiteChromeLookId(currentState.layoutOptions, currentState.currentLayoutId, direction);
164260
- if (next === void 0 || next === null) return;
164261
- selectHeaderLayout(next);
164262
- return;
164263
- }
164264
- case "footer": {
164265
- const next = cycleSiteChromeLookId(currentState.layoutOptions, currentState.currentLayoutId, direction);
164266
- if (next === void 0 || next === null) return;
164267
- selectFooterLayout(next);
164268
- return;
164269
- }
164270
- default: return assertNever$8(currentState, "Unhandled site chrome customize surface state");
164271
- }
164272
- }, [
164273
- getSurfaceState,
164274
- selectFooterLayout,
164275
- selectHeaderLayout
164276
- ]);
163794
+ const cycleHeaderLayout = useCallback((direction) => {
163795
+ const currentState = getSurfaceState("header");
163796
+ if (currentState.kind !== "available" || currentState.surface !== "header") return;
163797
+ const next = cycleSiteChromeLookId(currentState.layoutOptions, currentState.currentLayoutId, direction);
163798
+ if (next === void 0 || next === null) return;
163799
+ selectHeaderLayout(next);
163800
+ }, [getSurfaceState, selectHeaderLayout]);
164277
163801
  const setHeaderBrandDisplay = useCallback((brandDisplay) => {
164278
163802
  if (brandDisplay === "logo-only" && headerBrandControlState.kind === "no-logo") return;
164279
163803
  persistHeaderBrandPreferences({
@@ -164412,9 +163936,10 @@ function SiteChromeCustomizeProvider({ children, siteId, apiClient, theme, theme
164412
163936
  historyFailure: siteChromeQuickControlHistoryFailureMessage(quickControlHistory)
164413
163937
  }), [applyQuickControlHistoryMutation, quickControlHistory]);
164414
163938
  const value = useMemo(() => ({
163939
+ canOpenDesignEditor,
164415
163940
  getSurfaceState,
164416
163941
  cycleSurfaceLook,
164417
- cycleSurfaceLayout,
163942
+ cycleHeaderLayout,
164418
163943
  setHeaderBrandDisplay,
164419
163944
  setHeaderLogoSize,
164420
163945
  setHeaderMenuFont,
@@ -164424,7 +163949,8 @@ function SiteChromeCustomizeProvider({ children, siteId, apiClient, theme, theme
164424
163949
  siteStyleHistory: siteStyleHistoryController,
164425
163950
  quickControlHistory: quickControlHistoryController
164426
163951
  }), [
164427
- cycleSurfaceLayout,
163952
+ cycleHeaderLayout,
163953
+ canOpenDesignEditor,
164428
163954
  cycleSurfaceLook,
164429
163955
  chooseSurfaceBackground,
164430
163956
  getSurfaceState,
@@ -164511,7 +164037,7 @@ function selectionSnapshotFromSiteChromeSaveResponse({ saved, fallback, savePlan
164511
164037
  siteStyleId: fallback.siteStyleId,
164512
164038
  selectionVersion: fallback.selectionVersion,
164513
164039
  selectionUpdatedAt: saved.selectionUpdatedAt ?? fallback.selectionUpdatedAt ?? null,
164514
- buttonPersonalityId: savePlan.compiled.resolvedSelections.buttonPersonalityId,
164040
+ buttonStyleSelection: savePlan.compiled.resolvedSelections.buttonStyleSelection,
164515
164041
  palette: fallback.palette,
164516
164042
  typography: savePlan.themeOverlay.typography,
164517
164043
  headerLookId: saved.headerLookId ?? fallback.headerLookId,
@@ -164546,4 +164072,4 @@ function useSiteChromeCustomizeOptional() {
164546
164072
  return useContext(SiteChromeCustomizeContext);
164547
164073
  }
164548
164074
  //#endregion
164549
- export { beginAutosaveBatch as $, eventPageSizeSchema as $a, getImageUrl as $c, SlidersHorizontal as $d, NAV_LINK_PADDING_X_MAP as $i, Popover as $l, useImageResolveContextOptional as $n, resolveEventLinkProps as $o, headingFragment as $r, resolveIconPickerPreset as $s, evaluateVisibility as $t, cva as $u, deriveStyleConfiguratorCapabilities as A, paletteColorsEqual as Aa, XIcon as Ac, parseMediaAssetId as Ad, CirclePlus as Af, formatSiteChromeBackgroundTokenLabel as Ai, useBlockContext as Al, CSS$1 as An, normalizeEventVenueId as Ao, checkoutBlockDefinition as Ar, getFeatureCardIconCompletion as As, canUndoHistory as At, Surface as Au, previewButtonPersonality as B, buildOfferingsPreviewRenderStates as Ba, resolveMediaNodeResponsiveImage as Bc, err as Bd, ArrowUp as Bf, designRuntimeRulesForTheme as Bi, TooltipContent as Bl, siteHeaderManifest as Bn, normalizeLocationMapProps as Bo, buildProductDetailDisplay as Br, resolveBlockIconRenderValue as Bs, createSnapshotFromPageRecord as Bt, __generator as Bu, usePreviewThemeOverlay as C, foregroundTokenForBackgroundAppearanceColorToken as Ca, MapPinIcon as Cc, publicEventPricingMode as Cd, Eye as Cf, BACKGROUND_POSITION_PRESET_VALUES as Ci, surfaceForegroundDeclarations as Cl, closestCenter as Cn, eventSurfaceScopeValues as Co, getWizardStepsForContext as Cr, ICON_CONFIG as Cs, useEntryController as Ct, Root$3 as Cu, committedPaletteForSnapshot as D, findCuratedPalette as Da, PlusIcon as Dc, formatCurrencyAmount as Dd, CreditCard as Df, resolveBackgroundColorValue as Di, getModalConfig as Dl, useDroppable as Dn, normalizeEventStaffMemberId as Do, buildCourseRegistrationInteractiveIslandProps as Dr, FEATURE_CARD_GENERATED_ICON_SIZE_PX as Ds, useEditorUiStoreInstance as Dt, CardContent as Du, cancelPreview as E, curatedPalettes as Ea, PlayIcon as Ec, publicEventTicketTypes as Ed, Crop as Ef, resolveSurfaceForegroundStyles as Ei, getFieldIntent as El, useDraggable as En, normalizeEventScheduleScope as Eo, courseRegistrationBlockDefinition as Er, mediaSchema$1 as Es, useEditorUiStore as Et, Card as Eu, markApplySaving as F, ctaButton as Fa, computeMediaTransformStyle as Fc, unsafeAsFormId as Fd, ChevronRight as Ff, normalEditorCuratedPromotedFieldPaths as Fi, mapOptionValueForSelect as Fl, isSupportedLoaderEndpoint as Fn, normalizeCardVariantRole as Fo, buildProductListInteractiveIslandProps as Fr, toFeatureCardIconSuggestionInputs as Fs, unsafeAsLinkedContentEntryId as Ft, DropdownMenuSeparator as Fu, previewSitePalette as G, resolveOfferingsPreviewCoursePath as Ga, attachRenderableMediaAssetFields as Gc, Undo2 as Gd, __toESM as Gf, pageDesignEditorBackgroundOverrideOwner as Gi, Select$1 as Gl, contentTransforms as Gn, formatEventPrice as Go, buildProductCartItem as Gr, unwrapRichTextRoot as Gs, usePalette as Gt, useId$1 as Gu, previewFooterLook as H, isOfferingsPreviewSourceKey as Ha, setContextResolveImageUrlContext as Hc, lucide_react_exports as Hd, Archive as Hf, surfaceResolutionContextFromTheme as Hi, TooltipTrigger as Hl, SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR as Hn, formatDate as Ho, formatInterval as Hr, parseGeneratedIconSetId as Hs, resolvePageRouteSlug as Ht, __rest as Hu, openRow as I, OFFERINGS_PREVIEW_DEFAULT_BUTTON_TEXT as Ia, getCurrentResolveImageUrlContext as Ic, unsafeAsMediaAssetId as Id, ChevronLeft as If, planPageDesignLayoutLookCompatibility as Ii, unmapValueFromSelect as Il, getBlockDefinition as In, isCssColorLiteral as Io, buildShopInteractiveIslandProps as Ir, buildGeneratedBlockIconRenderAssetLookupFromUnknown as Is, recordsEqual as It, DropdownMenuTrigger as Iu, resetTypographyToSaved as J, resolveOfferingsPreviewGroups as Ja, formatAspectRatioToken as Jc, Ticket as Jd, parseBlockCustomCssRules as Ji, SelectTrigger as Jl, uiTransforms as Jn, formatTime as Jo, productItemKey as Jr, coerceInlineTextWithFallback as Js, validateBlockManifestIssues as Jt, useControllableState as Ju, previewSiteStyle as K, resolveOfferingsPreviewGroupCta as Ka, isRotationDimensionSwap as Kc, TriangleAlert as Kd, getComponentBorderWidthPx as Ki, SelectContent as Kl, mediaTransforms as Kn, formatEventPriceDisplay as Ko, deriveCommerceCheckoutState as Kr, isObjectRecord$1 as Ks, recoveryConflictCopy as Kt, useDirection as Ku, paletteMutationCapability as L, OFFERINGS_PREVIEW_DEFAULT_EMPTY_MESSAGE as La, renderAudio as Lc, unsafeAsPassId as Ld, ChevronDown as Lf, resolveVisiblePromotedFieldPathsForEditorBlock as Li, FieldFrame as Ll, listBlockDescriptors as Ln, resolveOnColorForThemeToken as Lo, getShopDisplayForItems as Lr, getBlockIconSemanticId as Ls, useMultiAutosave as Lt, __assign as Lu, isPreviewingChange as M, generateCssVars as Ma, ImagePresets as Mc, unsafeAsAppointmentResourceId as Md, CircleCheck as Mf, compileEditorModelRuntime as Mi, useSdkConfig as Ml, useCombinedRefs as Mn, generateCardCss as Mo, buildCartInteractiveIslandProps as Mr, resolveFeatureCardGeneratedIconSizePx as Ms, pushHistoryEntry as Mt, DropdownMenuContent as Mu, markApplyFailed as N, createTransformRegistry as Na, MediaPlaceholder as Nc, unsafeAsAppointmentServiceId as Nd, CircleAlert as Nf, retargetCompiledBoundaryRuntimeForContentAdjacency as Ni, hasEmptyOption as Nl, useIsomorphicLayoutEffect$1 as Nn, generateShadowValue as No, buildCheckoutInteractiveIslandProps as Nr, shouldReserveFeatureCardIconZone as Ns, redoHistory as Nt, DropdownMenuItem as Nu, createPalette as O, buildPaletteLibraryReadModel as Oa, ShoppingCartIcon as Oc, assertNever$9 as Od, Copy as Of, mergeHeaderNavTypographyPreference as Oi, isHeaderField as Ol, useSensor as On, normalizeEventSurfacePresetsCsv as Oo, normalizeEventRegistrationPageSurfaceSubject as Or, FEATURE_CARD_ICON_TREATMENTS as Os, useOptionalEditorUiStoreInstance as Ot, CardHeader as Ou, markApplySaved as P, runTransforms as Pa, buildResolveImageUrlContext as Pc, unsafeAsCustomerPassId as Pd, ChevronsUpDown as Pf, retargetCompiledRuntimeFieldsForContentAdjacency as Pi, mapCurrentValueForSelect as Pl, useUniqueId as Pn, normalizeBoxStylesCardVariant as Po, buildProductDetailInteractiveIslandProps as Pr, suggestSemanticIconForFeatureCard as Ps, undoHistory as Pt, DropdownMenuLabel as Pu, toggleRow as Q, eventListPaginationActionSchema as Qa, getDirectImageUrlForMediaAsset as Qc, Smartphone as Qd, NAV_LINK_PADDING_MAP as Qi, SearchInput as Ql, ImageResolveContextProvider as Qn, resolveEventCta as Qo, richTextFragment as Qr, isIconPickerPreset as Qs, FormRenderer as Qt, Button$1 as Qu, palettePreviewProjection as R, OFFERINGS_PREVIEW_DEFAULT_FAILED_MESSAGE as Ra, renderVideo as Rc, unsafeAsPositiveByteCount as Rd, Check as Rf, componentRuntimeRulesForTheme as Ri, useField as Rl, projectRecurringSchedule as Rn, resolveTokenOrCssColorValue as Ro, buildCartDisplay as Rr, getGeneratedBlockIconStyleState as Rs, useDebouncedLatestSave as Rt, __awaiter as Ru, PreviewThemeOverlayProvider as S, backgroundAppearanceQuickColorTokenNames as Sa, MailIcon as Sc, publicEventPricingCurrency as Sd, FileArchive as Sf, MQ_TABLET_ONLY as Si, DEFAULT_SURFACE_TEXT_COLOR as Sl, PointerSensor as Sn, eventScheduleScopeValues as So, getStepNumber as Sr, ACCORDION_TRIGGER_LETTER_SPACING as Ss, EntryControllerProvider as St, Content$1 as Su, applyTypographyDraftPatch as T, defaultThemeTokens as Ta, PhoneIcon as Tc, publicEventScalarPrice as Td, EllipsisVertical as Tf, boxStylesTransforms as Ti, useBackendWatch as Tl, useDndContext as Tn, normalizeEventCategoryIdsCsv as To, buildGiftingInteractiveIslandProps as Tr, PUBLIC_DOWNLOAD_MEDIA_TYPES as Ts, classifyHistoryShortcut as Tt, createCollapsibleScope as Tu, previewHeaderLayout as U, normalizeOfferingsPreviewGroupOrder as Ua, SECTION_BACKGROUND_MIN_SOURCE_WIDTH as Uc, X as Ud, __commonJSMin as Uf, isThemeV2NormalEditorRawStyleFieldName as Ui, Textarea as Ul, planSiteOverlayHeaderClearance as Un, formatEventCompactDateRail as Uo, EMPTY_COMMERCE_CART_STATE as Ur, parseSiteIconStyleGuideVersionId as Us, resolveContentTitle as Ut, __spreadArray as Uu, previewCuratedPalette as V, inferLegacyOfferingsPreviewGroupOrder as Va, resolveMediaStorageUrl as Vc, ok$1 as Vd, ArrowDown as Vf, getCuratedSiteStyle as Vi, TooltipProvider as Vl, SITE_CHROME_VISIBLE_HEADER_SELECTOR as Vn, toLocationMapHydrationProps as Vo, formatCommercePrice as Vr, parseGeneratedIconAssetId as Vs, deriveRouteMetadataPresentation as Vt, __read as Vu, previewHeaderStyle as W, normalizeOfferingsPreviewItemLimit as Wa, resolveMediaSlotContract as Wc, Upload as Wd, __exportAll as Wf, isThemeV2NormalEditorRawStylePath as Wi, Slider as Wl, visibleHeaderClearancePx as Wn, formatEventDateParts as Wo, buildPassCartItem as Wr, createRichTextDocFromMarkdown as Ws, PaletteProvider as Wt, __spreadArrays as Wu, styleConfiguratorHistoryEntryForPersistedSelection as X, resolveSpacing as Xa, resolveMediaTransformForAspect as Xc, Star as Xd, NAV_LINK_BORDER_RADIUS_MAP as Xi, Label as Xl, createManifestValidator as Xn, getContainerClass as Xo, augmentManifest as Xr, isInlineTextEmpty as Xs, createManifestFormAdapter as Xt, composeEventHandlers as Xu, setPaletteColors as Y, isSemanticSpacing as Ya, parseAspectRatioValue as Yc, Tablet as Yd, parseCustomCssRules as Yi, SelectValue as Yl, formattingTransforms as Yn, getCardOrientation as Yo, reduceCommerceCart as Yr, inlineTextToPlainText as Ys, ManifestForm as Yt, createContextScope as Yu, syncStyleConfiguratorState as Z, buildEventRuntimeFilters as Za, asRecord as Zc, Sparkles as Zd, NAV_LINK_LETTER_SPACING_MAP as Zi, Badge as Zl, isInternalResolvedLinkValue as Zn, groupEventsByDate as Zo, augmentManifestWithStyleGroups as Zr, parseInlineTextFromUnknown as Zs, createManifestValidation as Zt, Primitive as Zu, planSiteChromeFooterLayoutSelection as _, sectionTransitionFamilies as _a, FileArchiveIcon as _c, resolveBookingTimeZoneId as _d, File as _f, MQ_LG_UP as _i, borderColorStyle as _l, DEFAULT_LAUNCH_READINESS_INPUT as _n, el as _o, findPreSelectedEvent as _r, asDesignBlockId as _s, EditorProvider as _t, DialogHeader as _u, previewDesignHistoryDomainForCommand as a, requireEntriesForCuratedChoices as aa, ArrowRightIcon as ac, createEditorRemoveBlockCommand as ad, Pencil as af, formEmbedFragment as ai, generateButtonCss as al, createBlock as an, normalizeOptionalId as ao, eventListingBlockDefinition as ar, blockBookingPaymentTermsSchema as as, createOptimisticActionRunner as at, TabsList as au, PreviewDesignCoordinatorProvider as b, BACKGROUND_BODY_TEXT_MIN_CONTRAST_RATIO as ba, FileTextIcon as bc, parseEventPageSurfaceSubject as bd, FilePlay as bf, MQ_SM_DOWN as bi, rgbColorValue as bl, DndContext as bn, bindingSchema as bo, resolveRegistrationTarget as br, ACCORDION_SPACING_MAP as bs, useUISelector as bt, CollapsibleContent as bu, selectionSnapshotFromApplySiteStyleSelectionResponse as c, getHeaderLayout as ca, ChevronDownIcon as cc, unsafeAsEditorBlockValues as cd, Monitor as cf, testimonialsHeadingFragment as ci, featuresFromHex as cl, deleteBlock as cn, eventButtonVariantSchema as co, buildEventCalendarInteractiveIslandProps as cr, defineInteractiveIslandMetaKeys as cs, PreviewRichTextEditor as ct, List as cu, PREVIEW_DESIGN_REFRESH_ERROR_MESSAGE as d, GRADIENT_PRESETS as da, ChevronUpIcon as dc, formatBookingDateTime as dd, LoaderCircle as df, ctaRowFragment as di, generateBaseInteractiveCSS as dl, listEntryPageContentSlots as dn, filterAutoShowSchema as do, formBlockDefinition as dr, defineProgressiveBlockRuntime as ds, useRichTextEditor as dt, ScrollableDialogContent as du, NAV_LINK_TEXT_SIZE_MAP as ea, SEMANTIC_ICON_DEFINITIONS as ec, useComposedRefs as ed, Settings as ef, cardFragment as ei, getAtPath as el, createStoreBackend as en, getEventRuntimeFiltersKey as eo, shopBlockDefinition as er, getEventAvailability as es, confirmAutosaveBatch as et, PopoverContent as eu, PREVIEW_DESIGN_SAVE_ERROR_MESSAGE as f, GRADIENT_PRESET_IDS as fa, CircleMinusIcon as fc, formatBookingInstant as fd, Image as ff, heroCopyFragment as fi, generateInteractiveChildInheritanceCSS as fl, mutateBlockContent as fn, previewStageSchema as fo, buildFormInteractiveIslandProps as fr, EDITABLE_SURFACE_FORWARDING_PROP as fs, EMPTY_DOC as ft, Dialog as fu, cycleableSiteChromeOptions as g, defaultSectionTransitionVariantForFamily as ga, ExternalLinkIcon as gc, parseBookingLocalDate as gd, GripVertical as gf, siteOptionSources as gi, backgroundColorStyle as gl, decodePublicProductCategorySelectorQuery as gn, bind$1 as go, findEventByOccurrenceId as gr, planSiteChromePlacement as gs, InlineTextEditor as gt, DialogFooter as gu, cycleSiteChromeLookId as h, boundaryRuntimeMetricsForTransition as ha, DownloadIcon as hc, getBookingLocalDateKey as hd, ImageOff as hf, PUBLIC_FILE_FIELD_KINDS as hi, themeButtonClassName as hl, reorderPageSurfaceSlotBlocks as hn, eventCalendarListLayoutOptions as ho, toRegistrationEvents as hr, splitPositioningClasses as hs, insertOrReplaceRichTextImage as ht, DialogDescription as hu, usePreviewDesignHistoryOrder as i, LABEL_FONT_SIZE_MAP as ia, ArrowLeftIcon as ic, createEditorInsertBlockCommand as id, Plus as if, singleButtonFragment as ii, AFFORDANCE_SUPPRESS_CLASS as il, getPageDesignEditorState as in, normalizeCsvString as io, buildNewsletterFormInteractiveIslandProps as ir, resolveRuntimeEventPricing as is, rejectAutosaveBatch as it, TabsContent as iu, dismissWarnings as j, paletteColorsSchema as ja, createIcon as jc, parseSiteId as jd, CircleMinus as jf, applyCompiledRuntimeFieldsToContent as ji, SdkConfigProvider as jl, isKeyboardEvent as jn, publicEventSchema as jo, cartBlockDefinition as jr, parseFeatureCardGeneratedIconSizePx as js, createHistoryState as jt, DropdownMenu as ju, createStyleConfiguratorState as k, paletteColorEntries as ka, UploadIcon as kc, expectParsedBrandedId as kd, Clock3 as kf, readHeaderNavFontSizePreference as ki, isNonEmptyValue as kl, useSensors as kn, normalizeEventSurfaceScope as ko, resolveEventRegistrationScopedEvents as kr, createFeatureCardIconKey as ks, canRedoHistory as kt, CardTitle as ku, resolveStyleConfiguratorInitialSnapshot as l, getHeaderStyle as la, ChevronLeftIcon as lc, addLocalScheduleDays as ld, Minus as lf, ctaCopyFragment as li, generateEffectsCSS as ll, deleteEntrySlotBlock as ln, eventCalendarDefaultViewSchema as lo, buildEventCalendarListingDisplay as lr, createZodCodec as ls, PreviewInlineTextEditor as lt, Root2$1 as lu, buildSiteChromeLookModels as m, parseGradientPresetId as ma, ClockIcon as mc, formatLocalScheduleDate as md, ImagePlus as mf, defineFragment as mi, parseThemeButtonVariantId as ml, reorderEntrySlotBlocks as mn, eventCalendarListLayoutCompatibleDisplayModeValues as mo, buildEventRegistrationInteractiveIslandProps as mr, markEditableSurfaceForwarding as ms, getRichTextImagePositionFromTarget as mt, DialogContent as mu, useSiteChromeCustomizeOptional as n, INPUT_FONT_SIZE_MAP as na, isSemanticIconId as nc, clsx as nd, RotateCcw as nf, faqHeadingFragment as ni, buttonPersonalities as nl, toRoutableLinkPayload as nn, resolveEventListPaginationAction as no, productDetailBlockDefinition as nr, getLocalDateKey as ns, enqueueTransaction as nt, Input as nu, selectPreviewDesignHistoryDomain as o, findFooterLook as oa, CalendarIcon as oc, createEditorReorderBlocksCommand as od, PenLine as of, formCopyFragment as oi, expandPalette as ol, createEntrySlotBlock as on, calendarTabViewsSchema as oo, buildEventListingInteractiveIslandProps as or, buildInteractiveIslandProps as os, resolvePreviewSidebarTab as ot, TabsTrigger as ou, reportPreviewDesignError as p, getGradientPreset as pa, CirclePlusIcon as pc, formatBookingTime as pd, ImageUp as pf, bodyCopyFragment as pi, TokenResolver as pl, reorderBlocks as pn, weekStartSchema as po, eventRegistrationBlockDefinition as pr, composeHeaderSectionWrapperClassName as ps, RichTextEditorSurface as pt, DialogClose as pu, reconcilePaletteLibraryActive as q, resolveOfferingsPreviewGroupOrderEntries as qa, normalizeRightAngle as qc, Trash2 as qd, getComponentShadowVar as qi, SelectItem as ql, layoutTransforms as qn, formatEventTeacherLine as qo, parseStoredCommerceCartState as qr, isRecord$10 as qs, unfinishedBlockCopy as qt, createCollection as qu, PreviewDesignHistoryOrderProvider as r, INPUT_SPACING_MAP as ra, ArrowDownIcon as rc, parseFooterModuleId as rd, Redo2 as rf, blogFeaturedPostFragment as ri, findButtonPersonality as rl, applyPageDesignEditorAction as rn, normalizeCsvIds as ro, newsletterSignupBlockDefinition as rr, getLocalMinuteOfDay as rs, idleEditorTransactionQueueState as rt, Tabs as ru, buildApplySiteStyleSelectionBody as s, getFooterLayout as sa, CheckIcon as sc, unsafeAsEditorBlockId as sd, Palette as sf, testimonialsCarouselFragment as si, getTextColorForBackground as sl, createPageSurfaceSlotBlock as sn, columnOptionSchema as so, eventCalendarBlockDefinition as sr, createInteractiveIslandCodec as ss, FooterComposerPanel as st, Content as su, SiteChromeCustomizeProvider as t, FONT_WEIGHT_MAP as ta, getSemanticIconComponent as tc, cn$1 as td, Search as tf, faqAccordionFragment as ti, siblingPath as tl, listContentTypes as tn, resolveEventCalendarListPageSize as to, productListBlockDefinition as tr, getEventAvailabilityStatus as ts, deriveTransactionCapabilities as tt, PopoverTrigger as tu, PREVIEW_DESIGN_LOAD_ERROR_MESSAGE as u, gradientToCss as ua, ChevronRightIcon as uc, formatBookingDate as ud, Maximize2 as uf, heroCtaRowFragment as ui, generateShadowValue$1 as ul, deletePageSurfaceSlotBlock as un, eventLayoutSchema as uo, buildEventCalendarListingRender as ur, defineClientOwnedBlockRuntime as us, PreviewTextEditor as ut, Trigger$2 as uu, planSiteChromeLookSelection as v, sectionTransitionFamilyForBoundaryOptionId as va, FileAudioIcon as vc, toBookingTimeZone as vd, FileText as vf, MQ_MD_DOWN as vi, cssVarValue as vl, deriveLaunchReadiness as vn, richText as vo, resolveDiscountContext as vr, assertNever$8 as vs, useEditor$1 as vt, DialogTitle as vu, applyResolvedSelections as w, parseBackgroundAppearanceColorToken as wa, MinusIcon as wc, publicEventPricingType as wd, EyeOff as wf, getAnchorClasses as wi, surfaceForegroundValue as wl, getClientRect as wn, normalizeEventBlockKind as wo, giftingBlockDefinition as wr, ICON_SIZE_PX as ws, useEntryEditorController as wt, Trigger$3 as wu, usePreviewDesignCoordinator as x, backgroundAppearanceColorTokenNames as xa, InfoIcon as xc, formatBookingPriceDisplay as xd, FileHeadphone as xf, MQ_SM_UP as xi, textColorStyle as xl, KeyboardCode as xn, eventBlockKindValues as xo, WIZARD_STEPS as xr, ACCORDION_TRIGGER_FONT_SCALE as xs, EditableBlockProvider as xt, CollapsibleTrigger as xu, planSiteStylePreviewChange as y, sectionTransitionVariantForBoundaryOptionId as ya, FileSpreadsheetIcon as yc, toScheduledBookingDateTime as yd, FileSpreadsheet as yf, MQ_MD_UP as yi, mergeStyles as yl, AMBIENT_BACKGROUND_ROLES as yn, when as yo, resolveEventRequiresPayment as yr, ACCORDION_OPEN_ACCENT_THICKNESS as ys, ContentFieldsForm as yt, Collapsible as yu, prepareStalePaletteRetry as z, OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS as za, resolveImageUrlWithContext as zc, unsafeAsPositiveSeconds as zd, Box as zf, curatedSiteStyles as zi, Tooltip as zl, siteFooterManifest as zn, buildGoogleMapsDirectionsUrl as zo, buildProductCardDisplay as zr, parseBlockIconValue as zs, createRoutingHelpers as zt, __extends as zu };
164075
+ export { confirmAutosaveBatch as $, resolveEventListPaginationAction as $a, getImageUrl as $c, Sparkles as $d, NAV_LINK_TEXT_SIZE_MAP as $i, Badge as $l, shopBlockDefinition as $n, getLocalDateKey as $o, cardFragment as $r, resolveIconPickerPreset as $s, createStoreBackend as $t, Primitive as $u, dismissWarnings as A, createTransformRegistry as Aa, XIcon as Ac, assertNever$9 as Ad, Copy as Af, applyCompiledRuntimeFieldsToContent as Ai, isHeaderField as Al, isKeyboardEvent as An, generateShadowValue as Ao, cartBlockDefinition as Ar, shouldReserveFeatureCardIconZone as As, createHistoryState as At, CardHeader as Au, previewCuratedPalette as B, normalizeOfferingsPreviewGroupOrder as Ba, resolveMediaNodeResponsiveImage as Bc, unsafeAsPositiveByteCount as Bd, Check as Bf, getCuratedSiteStyle as Bi, useField as Bl, SITE_CHROME_VISIBLE_HEADER_SELECTOR as Bn, formatEventCompactDateRail as Bo, formatCommercePrice as Br, parseSiteIconStyleGuideVersionId as Bs, deriveRouteMetadataPresentation as Bt, __awaiter as Bu, applyResolvedSelections as C, curatedPalettes as Ca, MapPinIcon as Cc, formatBookingPriceDisplay as Cd, FileHeadphone as Cf, getAnchorClasses as Ci, textColorStyle as Cl, getClientRect as Cn, normalizeEventScheduleScope as Co, giftingBlockDefinition as Cr, mediaSchema$1 as Cs, useEntryEditorController as Ct, CollapsibleTrigger as Cu, createPalette as D, paletteColorsEqual as Da, PlusIcon as Dc, publicEventScalarPrice as Dd, EllipsisVertical as Df, mergeHeaderNavTypographyPreference as Di, useBackendWatch as Dl, useSensor as Dn, normalizeEventVenueId as Do, normalizeEventRegistrationPageSurfaceSubject as Dr, getFeatureCardIconCompletion as Ds, useOptionalEditorUiStoreInstance as Dt, createCollapsibleScope as Du, committedPaletteForSnapshot as E, paletteColorEntries as Ea, PlayIcon as Ec, publicEventPricingType as Ed, EyeOff as Ef, resolveBackgroundColorValue as Ei, surfaceForegroundValue as El, useDroppable as En, normalizeEventSurfaceScope as Eo, buildCourseRegistrationInteractiveIslandProps as Er, createFeatureCardIconKey as Es, useEditorUiStoreInstance as Et, Trigger$3 as Eu, openRow as F, OFFERINGS_PREVIEW_DEFAULT_FAILED_MESSAGE as Fa, computeMediaTransformStyle as Fc, unsafeAsAppointmentServiceId as Fd, CircleAlert as Ff, planPageDesignLayoutLookCompatibility as Fi, hasEmptyOption as Fl, getBlockDefinition as Fn, resolveTokenOrCssColorValue as Fo, buildShopInteractiveIslandProps as Fr, getGeneratedBlockIconStyleState as Fs, recordsEqual as Ft, DropdownMenuItem as Fu, previewSiteStyle as G, resolveOfferingsPreviewGroups as Ga, attachRenderableMediaAssetFields as Gc, X as Gd, __commonJSMin as Gf, getComponentBorderWidthPx as Gi, Textarea as Gl, mediaTransforms as Gn, formatTime as Go, deriveCommerceCheckoutState as Gr, coerceInlineTextWithFallback as Gs, recoveryConflictCopy as Gt, __spreadArray as Gu, previewHeaderLayout as H, resolveOfferingsPreviewCoursePath as Ha, setContextResolveImageUrlContext as Hc, err as Hd, ArrowUp as Hf, isThemeV2NormalEditorRawStyleFieldName as Hi, TooltipContent as Hl, planSiteOverlayHeaderClearance as Hn, formatEventPrice as Ho, EMPTY_COMMERCE_CART_STATE as Hr, unwrapRichTextRoot as Hs, resolveContentTitle as Ht, __generator as Hu, paletteMutationCapability as I, OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS as Ia, getCurrentResolveImageUrlContext as Ic, unsafeAsCustomerPassId as Id, ChevronsUpDown as If, resolveVisiblePromotedFieldPathsForEditorBlock as Ii, mapCurrentValueForSelect as Il, listBlockDescriptors as In, buildGoogleMapsDirectionsUrl as Io, getShopDisplayForItems as Ir, parseBlockIconValue as Is, useMultiAutosave as It, DropdownMenuLabel as Iu, setPaletteColors as J, buildEventRuntimeFilters as Ja, formatAspectRatioToken as Jc, TriangleAlert as Jd, parseCustomCssRules as Ji, SelectContent as Jl, formattingTransforms as Jn, groupEventsByDate as Jo, reduceCommerceCart as Jr, parseInlineTextFromUnknown as Js, ManifestForm as Jt, useDirection as Ju, reconcilePaletteLibraryActive as K, isSemanticSpacing as Ka, isRotationDimensionSwap as Kc, Upload as Kd, __exportAll as Kf, getComponentShadowVar as Ki, Slider as Kl, layoutTransforms as Kn, getCardOrientation as Ko, parseStoredCommerceCartState as Kr, inlineTextToPlainText as Ks, unfinishedBlockCopy as Kt, __spreadArrays as Ku, palettePreviewProjection as L, buildOfferingsPreviewRenderStates as La, renderAudio as Lc, unsafeAsFormId as Ld, ChevronRight as Lf, componentRuntimeRulesForTheme as Li, mapOptionValueForSelect as Ll, projectRecurringSchedule as Ln, normalizeLocationMapProps as Lo, buildCartDisplay as Lr, resolveBlockIconRenderValue as Ls, useDebouncedLatestSave as Lt, DropdownMenuSeparator as Lu, markApplyFailed as M, ctaButton as Ma, ImagePresets as Mc, parseMediaAssetId as Md, CirclePlus as Mf, retargetCompiledBoundaryRuntimeForContentAdjacency as Mi, useBlockContext as Ml, useIsomorphicLayoutEffect$1 as Mn, normalizeCardVariantRole as Mo, buildCheckoutInteractiveIslandProps as Mr, toFeatureCardIconSuggestionInputs as Ms, redoHistory as Mt, Surface as Mu, markApplySaved as N, OFFERINGS_PREVIEW_DEFAULT_BUTTON_TEXT as Na, MediaPlaceholder as Nc, parseSiteId as Nd, CircleMinus as Nf, retargetCompiledRuntimeFieldsForContentAdjacency as Ni, SdkConfigProvider as Nl, useUniqueId as Nn, isCssColorLiteral as No, buildProductDetailInteractiveIslandProps as Nr, buildGeneratedBlockIconRenderAssetLookupFromUnknown as Ns, undoHistory as Nt, DropdownMenu as Nu, createStyleConfiguratorState as O, paletteColorsSchema as Oa, ShoppingCartIcon as Oc, publicEventTicketTypes as Od, Crop as Of, readHeaderNavFontSizePreference as Oi, getFieldIntent as Ol, useSensors as On, publicEventSchema as Oo, resolveEventRegistrationScopedEvents as Or, parseFeatureCardGeneratedIconSizePx as Os, canRedoHistory as Ot, Card as Ou, markApplySaving as P, OFFERINGS_PREVIEW_DEFAULT_EMPTY_MESSAGE as Pa, buildResolveImageUrlContext as Pc, unsafeAsAppointmentResourceId as Pd, CircleCheck as Pf, normalEditorCuratedPromotedFieldPaths as Pi, useSdkConfig as Pl, isSupportedLoaderEndpoint as Pn, resolveOnColorForThemeToken as Po, buildProductListInteractiveIslandProps as Pr, getBlockIconSemanticId as Ps, unsafeAsLinkedContentEntryId as Pt, DropdownMenuContent as Pu, beginAutosaveBatch as Q, resolveEventCalendarListPageSize as Qa, getDirectImageUrlForMediaAsset as Qc, Star as Qd, NAV_LINK_PADDING_X_MAP as Qi, Label as Ql, useImageResolveContextOptional as Qn, getEventAvailabilityStatus as Qo, headingFragment as Qr, isIconPickerPreset as Qs, evaluateVisibility as Qt, composeEventHandlers as Qu, prepareStalePaletteRetry as R, inferLegacyOfferingsPreviewGroupOrder as Ra, renderVideo as Rc, unsafeAsMediaAssetId as Rd, ChevronLeft as Rf, curatedSiteStyles as Ri, unmapValueFromSelect as Rl, siteFooterManifest as Rn, toLocationMapHydrationProps as Ro, buildProductCardDisplay as Rr, parseGeneratedIconAssetId as Rs, createRoutingHelpers as Rt, DropdownMenuTrigger as Ru, usePreviewThemeOverlay as S, defaultThemeTokens as Sa, MailIcon as Sc, parseEventPageSurfaceSubject as Sd, FilePlay as Sf, BACKGROUND_POSITION_PRESET_VALUES as Si, rgbColorValue as Sl, closestCenter as Sn, normalizeEventCategoryIdsCsv as So, getWizardStepsForContext as Sr, PUBLIC_DOWNLOAD_MEDIA_TYPES as Ss, useEntryController as St, CollapsibleContent as Su, cancelPreview as T, buildPaletteLibraryReadModel as Ta, PhoneIcon as Tc, publicEventPricingMode as Td, Eye as Tf, resolveSurfaceForegroundStyles as Ti, surfaceForegroundDeclarations as Tl, useDraggable as Tn, normalizeEventSurfacePresetsCsv as To, courseRegistrationBlockDefinition as Tr, FEATURE_CARD_ICON_TREATMENTS as Ts, useEditorUiStore as Tt, Root$3 as Tu, previewHeaderStyle as U, resolveOfferingsPreviewGroupCta as Ua, SECTION_BACKGROUND_MIN_SOURCE_WIDTH as Uc, ok$1 as Ud, ArrowDown as Uf, isThemeV2NormalEditorRawStylePath as Ui, TooltipProvider as Ul, visibleHeaderClearancePx as Un, formatEventPriceDisplay as Uo, buildPassCartItem as Ur, isObjectRecord$1 as Us, PaletteProvider as Ut, __read as Uu, previewFooterLook as V, normalizeOfferingsPreviewItemLimit as Va, resolveMediaStorageUrl as Vc, unsafeAsPositiveSeconds as Vd, Box as Vf, surfaceResolutionContextFromTheme as Vi, Tooltip as Vl, SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR as Vn, formatEventDateParts as Vo, formatInterval as Vr, createRichTextDocFromMarkdown as Vs, resolvePageRouteSlug as Vt, __extends as Vu, previewSitePalette as W, resolveOfferingsPreviewGroupOrderEntries as Wa, resolveMediaSlotContract as Wc, lucide_react_exports as Wd, Archive as Wf, pageDesignEditorBackgroundOverrideOwner as Wi, TooltipTrigger as Wl, contentTransforms as Wn, formatEventTeacherLine as Wo, buildProductCartItem as Wr, isRecord$10 as Ws, usePalette as Wt, __rest as Wu, syncStyleConfiguratorState as X, eventPageSizeSchema as Xa, resolveMediaTransformForAspect as Xc, Ticket as Xd, NAV_LINK_LETTER_SPACING_MAP as Xi, SelectTrigger as Xl, isInternalResolvedLinkValue as Xn, resolveEventLinkProps as Xo, augmentManifestWithStyleGroups as Xr, canonicalizePersistedBlockButtonRole as Xs, createManifestValidation as Xt, useControllableState as Xu, styleConfiguratorHistoryEntryForPersistedSelection as Y, eventListPaginationActionSchema as Ya, parseAspectRatioValue as Yc, Trash2 as Yd, NAV_LINK_BORDER_RADIUS_MAP as Yi, SelectItem as Yl, createManifestValidator as Yn, resolveEventCta as Yo, augmentManifest as Yr, BLOCK_BUTTON_ROLE_OPTIONS as Ys, createManifestFormAdapter as Yt, createCollection as Yu, toggleRow as Z, getEventRuntimeFiltersKey as Za, asRecord as Zc, Tablet as Zd, NAV_LINK_PADDING_MAP as Zi, SelectValue as Zl, ImageResolveContextProvider as Zn, getEventAvailability as Zo, richTextFragment as Zr, isBlockButtonRole as Zs, FormRenderer as Zt, createContextScope as Zu, planSiteChromeLookSelection as _, BACKGROUND_BODY_TEXT_MIN_CONTRAST_RATIO as _a, FileArchiveIcon as _c, getBookingLocalDateKey as _d, ImageOff as _f, MQ_MD_DOWN as _i, parseThemeButtonVariantId as _l, deriveLaunchReadiness as _n, bindingSchema as _o, resolveDiscountContext as _r, ACCORDION_SPACING_MAP as _s, useEditor$1 as _t, DialogDescription as _u, previewDesignHistoryDomainForCommand as a, getHeaderLayout as aa, ArrowRightIcon as ac, parseFooterModuleId as ad, Redo2 as af, formCopyFragment as ai, updateButtonStyleSelectionChoice as al, createEntrySlotBlock as an, eventButtonVariantSchema as ao, buildEventListingInteractiveIslandProps as ar, defineInteractiveIslandMetaKeys as as, resolvePreviewSidebarTab as at, Tabs as au, usePreviewDesignCoordinator as b, foregroundTokenForBackgroundAppearanceColorToken as ba, FileTextIcon as bc, toBookingTimeZone as bd, FileText as bf, MQ_SM_UP as bi, cssVarValue as bl, KeyboardCode as bn, eventSurfaceScopeValues as bo, WIZARD_STEPS as br, ICON_CONFIG as bs, EditableBlockProvider as bt, DialogTitle as bu, selectionSnapshotFromApplySiteStyleSelectionResponse as c, GRADIENT_PRESETS as ca, ChevronDownIcon as cc, createEditorReorderBlocksCommand as cd, PenLine as cf, ctaCopyFragment as ci, generateButtonCss as cl, deleteEntrySlotBlock as cn, filterAutoShowSchema as co, buildEventCalendarListingDisplay as cr, defineProgressiveBlockRuntime as cs, PreviewInlineTextEditor as ct, TabsTrigger as cu, PREVIEW_DESIGN_REFRESH_ERROR_MESSAGE as d, parseGradientPresetId as da, ChevronUpIcon as dc, addLocalScheduleDays as dd, Minus as df, heroCopyFragment as di, featuresFromHex as dl, mutateBlockContent as dn, eventCalendarListLayoutCompatibleDisplayModeValues as do, buildFormInteractiveIslandProps as dr, markEditableSurfaceForwarding as ds, EMPTY_DOC as dt, Root2$1 as du, FONT_WEIGHT_MAP as ea, SEMANTIC_ICON_DEFINITIONS as ec, Button$1 as ed, Smartphone as ef, faqAccordionFragment as ei, getAtPath as el, listContentTypes as en, normalizeCsvIds as eo, productListBlockDefinition as er, getLocalMinuteOfDay as es, deriveTransactionCapabilities as et, SearchInput as eu, PREVIEW_DESIGN_SAVE_ERROR_MESSAGE as f, boundaryRuntimeMetricsForTransition as fa, CircleMinusIcon as fc, formatBookingDate as fd, Maximize2 as ff, bodyCopyFragment as fi, generateEffectsCSS as fl, reorderBlocks as fn, eventCalendarListLayoutOptions as fo, eventRegistrationBlockDefinition as fr, splitPositioningClasses as fs, RichTextEditorSurface as ft, Trigger$2 as fu, cycleableSiteChromeOptions as g, sectionTransitionVariantForBoundaryOptionId as ga, ExternalLinkIcon as gc, formatLocalScheduleDate as gd, ImagePlus as gf, MQ_LG_UP as gi, TokenResolver as gl, DEFAULT_LAUNCH_READINESS_INPUT as gn, when as go, findPreSelectedEvent as gr, ACCORDION_OPEN_ACCENT_THICKNESS as gs, EditorProvider as gt, DialogContent as gu, cycleSiteChromeLookId as h, sectionTransitionFamilyForBoundaryOptionId as ha, DownloadIcon as hc, formatBookingTime as hd, ImageUp as hf, siteOptionSources as hi, generateInteractiveChildInheritanceCSS as hl, decodePublicProductCategorySelectorQuery as hn, richText as ho, findEventByOccurrenceId as hr, assertNever$8 as hs, InlineTextEditor as ht, DialogClose as hu, usePreviewDesignHistoryOrder as i, findFooterLook as ia, ArrowLeftIcon as ic, clsx as id, RotateCcw as if, formEmbedFragment as ii, resolveButtonStyleSelection as il, createBlock as in, columnOptionSchema as io, eventListingBlockDefinition as ir, createInteractiveIslandCodec as is, createOptimisticActionRunner as it, Input as iu, isPreviewingChange as j, runTransforms as ja, createIcon as jc, expectParsedBrandedId as jd, Clock3 as jf, compileEditorModelRuntime as ji, isNonEmptyValue as jl, useCombinedRefs as jn, normalizeBoxStylesCardVariant as jo, buildCartInteractiveIslandProps as jr, suggestSemanticIconForFeatureCard as js, pushHistoryEntry as jt, CardTitle as ju, deriveStyleConfiguratorCapabilities as k, generateCssVars as ka, UploadIcon as kc, formatCurrencyAmount as kd, CreditCard as kf, formatSiteChromeBackgroundTokenLabel as ki, getModalConfig as kl, CSS$1 as kn, generateCardCss as ko, checkoutBlockDefinition as kr, resolveFeatureCardGeneratedIconSizePx as ks, canUndoHistory as kt, CardContent as ku, resolveStyleConfiguratorInitialSnapshot as l, GRADIENT_PRESET_IDS as la, ChevronLeftIcon as lc, unsafeAsEditorBlockId as ld, Palette as lf, heroCtaRowFragment as li, expandPalette as ll, deletePageSurfaceSlotBlock as ln, previewStageSchema as lo, buildEventCalendarListingRender as lr, EDITABLE_SURFACE_FORWARDING_PROP as ls, PreviewTextEditor as lt, Content as lu, buildSiteChromeLookModels as m, sectionTransitionFamilies as ma, ClockIcon as mc, formatBookingInstant as md, Image as mf, PUBLIC_FILE_FIELD_KINDS as mi, generateBaseInteractiveCSS as ml, reorderPageSurfaceSlotBlocks as mn, el as mo, toRegistrationEvents as mr, asDesignBlockId as ms, insertOrReplaceRichTextImage as mt, Dialog as mu, useSiteChromeCustomizeOptional as n, INPUT_SPACING_MAP as na, isSemanticIconId as nc, useComposedRefs as nd, Settings as nf, blogFeaturedPostFragment as ni, buttonStyleSelectionParameterValue as nl, applyPageDesignEditorAction as nn, normalizeOptionalId as no, newsletterSignupBlockDefinition as nr, blockBookingPaymentTermsSchema as ns, idleEditorTransactionQueueState as nt, PopoverContent as nu, selectPreviewDesignHistoryDomain as o, getHeaderStyle as oa, CalendarIcon as oc, createEditorInsertBlockCommand as od, Plus as of, testimonialsCarouselFragment as oi, buttonStyleSelectionKey as ol, createPageSurfaceSlotBlock as on, eventCalendarDefaultViewSchema as oo, eventCalendarBlockDefinition as or, createZodCodec as os, FooterComposerPanel as ot, TabsContent as ou, reportPreviewDesignError as p, defaultSectionTransitionVariantForFamily as pa, CirclePlusIcon as pc, formatBookingDateTime as pd, LoaderCircle as pf, defineFragment as pi, generateShadowValue$1 as pl, reorderEntrySlotBlocks as pn, bind$1 as po, buildEventRegistrationInteractiveIslandProps as pr, planSiteChromePlacement as ps, getRichTextImagePositionFromTarget as pt, ScrollableDialogContent as pu, resetTypographyToSaved as q, resolveSpacing as qa, normalizeRightAngle as qc, Undo2 as qd, __toESM as qf, parseBlockCustomCssRules as qi, Select$1 as ql, uiTransforms as qn, getContainerClass as qo, productItemKey as qr, isInlineTextEmpty as qs, validateBlockManifestIssues as qt, useId$1 as qu, PreviewDesignHistoryOrderProvider as r, LABEL_FONT_SIZE_MAP as ra, ArrowDownIcon as rc, cn$1 as rd, Search as rf, singleButtonFragment as ri, findButtonStyleRecipe as rl, getPageDesignEditorState as rn, calendarTabViewsSchema as ro, buildNewsletterFormInteractiveIslandProps as rr, buildInteractiveIslandProps as rs, rejectAutosaveBatch as rt, PopoverTrigger as ru, buildApplySiteStyleSelectionBody as s, gradientToCss as sa, CheckIcon as sc, createEditorRemoveBlockCommand as sd, Pencil as sf, testimonialsHeadingFragment as si, AFFORDANCE_SUPPRESS_CLASS as sl, deleteBlock as sn, eventLayoutSchema as so, buildEventCalendarInteractiveIslandProps as sr, defineClientOwnedBlockRuntime as ss, PreviewRichTextEditor as st, TabsList as su, SiteChromeCustomizeProvider as t, INPUT_FONT_SIZE_MAP as ta, getSemanticIconComponent as tc, cva as td, SlidersHorizontal as tf, faqHeadingFragment as ti, siblingPath as tl, toRoutableLinkPayload as tn, normalizeCsvString as to, productDetailBlockDefinition as tr, resolveRuntimeEventPricing as ts, enqueueTransaction as tt, Popover as tu, PREVIEW_DESIGN_LOAD_ERROR_MESSAGE as u, getGradientPreset as ua, ChevronRightIcon as uc, unsafeAsEditorBlockValues as ud, Monitor as uf, ctaRowFragment as ui, getTextColorForBackground as ul, listEntryPageContentSlots as un, weekStartSchema as uo, formBlockDefinition as ur, composeHeaderSectionWrapperClassName as us, useRichTextEditor as ut, List as uu, planSiteStylePreviewChange as v, backgroundAppearanceColorTokenNames as va, FileAudioIcon as vc, parseBookingLocalDate as vd, GripVertical as vf, MQ_MD_UP as vi, themeButtonClassName as vl, AMBIENT_BACKGROUND_ROLES as vn, eventBlockKindValues as vo, resolveEventRequiresPayment as vr, ACCORDION_TRIGGER_FONT_SCALE as vs, ContentFieldsForm as vt, DialogFooter as vu, applyTypographyDraftPatch as w, findCuratedPalette as wa, MinusIcon as wc, publicEventPricingCurrency as wd, FileArchive as wf, boxStylesTransforms as wi, DEFAULT_SURFACE_TEXT_COLOR as wl, useDndContext as wn, normalizeEventStaffMemberId as wo, buildGiftingInteractiveIslandProps as wr, FEATURE_CARD_GENERATED_ICON_SIZE_PX as ws, classifyHistoryShortcut as wt, Content$1 as wu, PreviewThemeOverlayProvider as x, parseBackgroundAppearanceColorToken as xa, InfoIcon as xc, toScheduledBookingDateTime as xd, FileSpreadsheet as xf, MQ_TABLET_ONLY as xi, mergeStyles as xl, PointerSensor as xn, normalizeEventBlockKind as xo, getStepNumber as xr, ICON_SIZE_PX as xs, EntryControllerProvider as xt, Collapsible as xu, PreviewDesignCoordinatorProvider as y, backgroundAppearanceQuickColorTokenNames as ya, FileSpreadsheetIcon as yc, resolveBookingTimeZoneId as yd, File as yf, MQ_SM_DOWN as yi, backgroundColorStyle as yl, DndContext as yn, eventScheduleScopeValues as yo, resolveRegistrationTarget as yr, ACCORDION_TRIGGER_LETTER_SPACING as ys, useUISelector as yt, DialogHeader as yu, previewButtonStyle as z, isOfferingsPreviewSourceKey as za, resolveImageUrlWithContext as zc, unsafeAsPassId as zd, ChevronDown as zf, designRuntimeRulesForTheme as zi, FieldFrame as zl, siteHeaderManifest as zn, formatDate as zo, buildProductDetailDisplay as zr, parseGeneratedIconSetId as zs, createSnapshotFromPageRecord as zt, __assign as zu };