@riverbankcms/sdk 0.108.0 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/README.md +21 -1
  2. package/dist/{PreviewEditorSidebar-BBT-kZAM.mjs → PreviewEditorSidebar-DWqwfy3_.mjs} +7 -22
  3. package/dist/{PreviewEditorUI-D69xNKT2.mjs → PreviewEditorUI-B7OL4sfR.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-RRu7wyQ5.mjs → PreviewQueryProvider-D0y2l8JN.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-CuDjXH6o.mjs → SdkPreviewModeRuntime-D8Gt9Gbe.mjs} +212 -153
  6. package/dist/{SiteChromeCustomizeContext-BQUY2dEk.mjs → SiteChromeCustomizeContext-DUpalEdL.mjs} +1919 -1032
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +11244 -10741
  8. package/dist/_dts/api/src/bookingAdjustments.d.ts +5 -0
  9. package/dist/_dts/api/src/bookingOperations.d.ts +4 -0
  10. package/dist/_dts/api/src/bookingRecords.d.ts +2 -17
  11. package/dist/_dts/api/src/bookingRefundOutcomes.d.ts +6 -6
  12. package/dist/_dts/api/src/common/envelope.d.ts +7 -0
  13. package/dist/_dts/api/src/courses.d.ts +1 -0
  14. package/dist/_dts/api/src/customerMembershipOutcomes.d.ts +5 -5
  15. package/dist/_dts/api/src/endpoints.d.ts +35 -0
  16. package/dist/_dts/api/src/index.d.ts +2 -2
  17. package/dist/_dts/api/src/participantMessaging.d.ts +18 -12
  18. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +1 -0
  19. package/dist/_dts/api/src/sdkContracts.d.ts +247 -1
  20. package/dist/_dts/api/src/siteInfrastructure.d.ts +13 -0
  21. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +1 -5
  22. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +29 -1
  23. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +33 -27
  24. package/dist/_dts/block-form/src/widgets/BackgroundGradientWidget/BackgroundGradientField.d.ts +9 -0
  25. package/dist/_dts/block-form/src/widgets/BackgroundGradientWidget/BackgroundGradientWidget.d.ts +3 -4
  26. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -4
  27. package/dist/_dts/blocks/src/index.d.ts +1 -1
  28. package/dist/_dts/blocks/src/system/blocks/audio-player.d.ts +3 -0
  29. package/dist/_dts/blocks/src/system/blocks/body-text.d.ts +3 -0
  30. package/dist/_dts/blocks/src/system/blocks/contact-newsletter.d.ts +3 -0
  31. package/dist/_dts/blocks/src/system/blocks/course-registration.d.ts +1 -22
  32. package/dist/_dts/blocks/src/system/blocks/cta-full.d.ts +3 -0
  33. package/dist/_dts/blocks/src/system/blocks/event-registration.d.ts +1 -22
  34. package/dist/_dts/blocks/src/system/blocks/file-download.d.ts +3 -0
  35. package/dist/_dts/blocks/src/system/blocks/form.d.ts +3 -0
  36. package/dist/_dts/blocks/src/system/blocks/image-gallery.d.ts +3 -0
  37. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +3 -0
  38. package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +3 -0
  39. package/dist/_dts/blocks/src/system/blocks/site-header.d.ts +3 -0
  40. package/dist/_dts/blocks/src/system/blocks/team-members.d.ts +3 -0
  41. package/dist/_dts/blocks/src/system/blocks/testimonials.d.ts +3 -0
  42. package/dist/_dts/blocks/src/system/blocks/video-grid.d.ts +3 -0
  43. package/dist/_dts/blocks/src/system/constants/background.d.ts +1 -1
  44. package/dist/_dts/blocks/src/system/customize/backgrounds.d.ts +16 -6
  45. package/dist/_dts/blocks/src/system/defineBlock.d.ts +9 -1
  46. package/dist/_dts/blocks/src/system/fields/ctas.d.ts +8 -0
  47. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +31 -0
  48. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +6 -6
  49. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +3 -3
  50. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +1 -1
  51. package/dist/_dts/content-model/src/content-types/entryValidation.d.ts +31 -0
  52. package/dist/_dts/content-model/src/content-types/scaffold.d.ts +58 -0
  53. package/dist/_dts/content-model/src/content-types/sentinels.d.ts +36 -0
  54. package/dist/_dts/content-model/src/index.d.ts +3 -0
  55. package/dist/_dts/core/src/booking-date-time.d.ts +8 -0
  56. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +3071 -3157
  57. package/dist/_dts/media-core/src/fileMimeDetection.d.ts +16 -0
  58. package/dist/_dts/media-core/src/fileStorage.d.ts +8 -0
  59. package/dist/_dts/media-core/src/storagePathDomain.d.ts +2 -0
  60. package/dist/_dts/media-core/src/uploadVerificationContract.d.ts +3 -0
  61. package/dist/_dts/preview-next/src/client/blocks/BlockToolbar.d.ts +2 -0
  62. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +1 -0
  63. package/dist/_dts/preview-next/src/client/preview/styleConfiguratorApplyPayload.d.ts +1 -1
  64. package/dist/_dts/sdk/src/cli/commands/audit.d.ts +1 -1
  65. package/dist/_dts/sdk/src/cli/commands/compare.d.ts +1 -1
  66. package/dist/_dts/sdk/src/cli/commands/deploy.d.ts +1 -1
  67. package/dist/_dts/sdk/src/cli/commands/drafts.d.ts +18 -0
  68. package/dist/_dts/sdk/src/cli/commands/entry.d.ts +15 -0
  69. package/dist/_dts/sdk/src/cli/commands/init-docs.d.ts +2 -2
  70. package/dist/_dts/sdk/src/cli/commands/publish-all.d.ts +1 -1
  71. package/dist/_dts/sdk/src/cli/commands/pull.d.ts +1 -0
  72. package/dist/_dts/sdk/src/cli/commands/push/execute/diff.d.ts +1 -1
  73. package/dist/_dts/sdk/src/cli/commands/push/options.d.ts +3 -0
  74. package/dist/_dts/sdk/src/cli/commands/push-execute.d.ts +12 -1
  75. package/dist/_dts/sdk/src/cli/commands/setup.d.ts +1 -0
  76. package/dist/_dts/sdk/src/cli/commands/verify.d.ts +1 -0
  77. package/dist/_dts/sdk/src/cli/helpers.d.ts +22 -1
  78. package/dist/_dts/sdk/src/cli/index.d.ts +4 -0
  79. package/dist/_dts/sdk/src/cli/output.d.ts +88 -0
  80. package/dist/_dts/sdk/src/cli/program.d.ts +29 -0
  81. package/dist/_dts/sdk/src/cli/push-config.d.ts +1 -1
  82. package/dist/_dts/sdk/src/client/management/catalog.d.ts +10 -0
  83. package/dist/_dts/sdk/src/client/management/http.d.ts +7 -1
  84. package/dist/_dts/sdk/src/client/management/index.d.ts +1 -1
  85. package/dist/_dts/sdk/src/client/management/types.d.ts +43 -19
  86. package/dist/_dts/sdk/src/date-time/index.d.ts +68 -0
  87. package/dist/_dts/sdk/src/public-api/contracts.d.ts +2 -0
  88. package/dist/_dts/sdk/src/version.d.ts +1 -1
  89. package/dist/_dts/site-commands/src/commands.d.ts +893 -823
  90. package/dist/_dts/theme-core/src/accordions/types.d.ts +1 -1
  91. package/dist/_dts/theme-core/src/buttons/core.d.ts +15 -46
  92. package/dist/_dts/theme-core/src/buttons/effectClassification.d.ts +147 -0
  93. package/dist/_dts/theme-core/src/buttons/effects/types.d.ts +2 -3
  94. package/dist/_dts/theme-core/src/buttons/generateDefaultButtonSystem.d.ts +1 -1
  95. package/dist/_dts/theme-core/src/buttons/index.d.ts +1 -0
  96. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +44 -32
  97. package/dist/_dts/theme-core/src/buttons/presets.d.ts +4 -25
  98. package/dist/_dts/theme-core/src/buttons/resolveButtonColourStates.d.ts +100 -0
  99. package/dist/_dts/theme-core/src/buttons/resolvedButtonCss.d.ts +16 -0
  100. package/dist/_dts/theme-core/src/buttons/types.d.ts +101 -83
  101. package/dist/_dts/theme-core/src/cards/types.d.ts +16 -16
  102. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  103. package/dist/_dts/theme-core/src/gradients/presets.d.ts +200 -8
  104. package/dist/_dts/theme-core/src/gradients/utils.d.ts +6 -2
  105. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +87 -126
  106. package/dist/_dts/theme-core/src/mock-themes/modern-minimal.d.ts +1 -1
  107. package/dist/_dts/theme-core/src/navigation/types.d.ts +2 -2
  108. package/dist/_dts/theme-core/src/palette/curated/index.d.ts +2 -2
  109. package/dist/_dts/theme-core/src/palette/curated/types.d.ts +5 -8
  110. package/dist/_dts/theme-core/src/palette/index.d.ts +0 -1
  111. package/dist/_dts/theme-core/src/schema.d.ts +112 -138
  112. package/dist/_dts/theme-core/src/site-styles/backgroundAppearance.d.ts +2 -2
  113. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +10 -10
  114. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +3 -2
  115. package/dist/_dts/theme-core/src/site-styles/pageDesignIntent.d.ts +13 -6
  116. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +29 -8
  117. package/dist/_dts/theme-core/src/site-styles/styleTags.d.ts +2 -2
  118. package/dist/cli/index.mjs +67956 -66745
  119. package/dist/cli/init-docs/content/cli-reference.md +50 -7
  120. package/dist/cli/init-docs/content/content-management.md +7 -4
  121. package/dist/cli/init-docs/content/workflow-publish.md +5 -1
  122. package/dist/client/{DiscountCodeDisclosure-D6TOf6Hi.mjs → DiscountCodeDisclosure-DU1ygxU2.mjs} +1 -1
  123. package/dist/client/{EventCombined.client-Dao3zxRk.mjs → EventCombined.client-DB5zagCo.mjs} +3 -3
  124. package/dist/client/{EventListing.client-B2NNt4y1.mjs → EventListing.client-CTX9JHBL.mjs} +2 -2
  125. package/dist/client/{LeafletStaticMap-BhwFo16w.mjs → LeafletStaticMap-BYImhgiB.mjs} +1 -1
  126. package/dist/client/{MagicLinkForm-BWnB7cMR.mjs → MagicLinkForm-CRkw_M3l.mjs} +2 -2
  127. package/dist/client/{StepIndicator-TzRiQ0BY.mjs → StepIndicator-BnmVBJJh.mjs} +2 -2
  128. package/dist/client/{accordion-BPy-AJ4_.mjs → accordion-CeGreumd.mjs} +1 -1
  129. package/dist/client/{bookingForm-BL4PGZds.mjs → bookingForm-CSzFNrpN.mjs} +6 -6
  130. package/dist/client/bookings.mjs +512 -252
  131. package/dist/client/{buttons-EBjyslaX.mjs → buttons-DoFV7KDL.mjs} +493 -230
  132. package/dist/client/{carousel-C2b7Cn9-.mjs → carousel-B2jDtogf.mjs} +1 -1
  133. package/dist/client/{cart-BQcbXIVD.mjs → cart-D-jZ-vaY.mjs} +3 -3
  134. package/dist/client/{checkout-DEmpGRJu.mjs → checkout-Dza-LA7N.mjs} +3 -3
  135. package/dist/client/client.mjs +1673 -785
  136. package/dist/client/{colorStyles-jZS6KfkP.mjs → colorStyles-CrgzoXsm.mjs} +1 -30
  137. package/dist/client/{courseRegistration-BqRZPmsq.mjs → courseRegistration-TYkNychb.mjs} +7 -7
  138. package/dist/client/{eventCalendar-B8N_tSl5.mjs → eventCalendar-BI_90SsT.mjs} +5 -5
  139. package/dist/client/{eventCombined-Gjn6gtq7.mjs → eventCombined-mNrpryE9.mjs} +2 -2
  140. package/dist/client/{eventDetails-M-VCxA-r.mjs → eventDetails-D4GVlCIY.mjs} +3 -3
  141. package/dist/client/{eventListing-DR19hqYi.mjs → eventListing-YhKN018y.mjs} +2 -2
  142. package/dist/client/{eventRegistration-BR02a0k3.mjs → eventRegistration-CdHGtilr.mjs} +7 -7
  143. package/dist/client/foregroundContract-xICPq59x.mjs +31 -0
  144. package/dist/client/{form-LY2xIbwg.mjs → form-AcAL45rA.mjs} +2 -2
  145. package/dist/client/{headerSection-CYwwXJfh.mjs → headerSection-uEC52ueD.mjs} +3 -3
  146. package/dist/client/hooks.mjs +890 -497
  147. package/dist/client/{locationMap-DWnBXrFq.mjs → locationMap-_wJDSUYe.mjs} +3 -3
  148. package/dist/client/{media-DHtSxS5V.mjs → media-BK0O3b-U.mjs} +3 -2
  149. package/dist/client/{newsletterForm-D9s-fQ2P.mjs → newsletterForm-DrArsb2B.mjs} +2 -2
  150. package/dist/client/{pricing-DDq80oYc.mjs → pricing-BSYVghwo.mjs} +1 -1
  151. package/dist/client/{productDetail-B0SbWd45.mjs → productDetail-Dyk90sMs.mjs} +3 -3
  152. package/dist/client/{productList-PwYlZn0y.mjs → productList-BCKThwAI.mjs} +3 -3
  153. package/dist/client/{propsDecoder-BRWBiH7i.mjs → propsDecoder-CkXxkdSR.mjs} +63 -24
  154. package/dist/client/rendering/client.mjs +1034 -486
  155. package/dist/client/rendering/islands.mjs +19 -19
  156. package/dist/client/rendering.mjs +1832 -760
  157. package/dist/client/{shop-CMwZPYME.mjs → shop-DeltVH10.mjs} +6 -6
  158. package/dist/client/{shop-commerce-BuxsFate.mjs → shop-commerce-BD9Jsm2Z.mjs} +6 -6
  159. package/dist/client/{shop-commerce-store-boYlEJ91.mjs → shop-commerce-store-CmXD6FDS.mjs} +1 -1
  160. package/dist/client/{shopShared-D2naaOes.mjs → shopShared-B8v-lH_F.mjs} +2 -2
  161. package/dist/client/{useDiscountCodeUi-D9RHpVoj.mjs → useDiscountCodeUi-DbWJN8ld.mjs} +1 -1
  162. package/dist/client/{useEventFilters-igGiK1re.mjs → useEventFilters-EJIMUnqT.mjs} +46 -69
  163. package/dist/client/{usePolling-CI7MbsFB.mjs → usePolling-Cmh14fc7.mjs} +2 -2
  164. package/dist/preview-next/before-render.mjs +35 -0
  165. package/dist/preview-next/client/runtime.mjs +4 -4
  166. package/dist/preview-next/middleware.mjs +35 -0
  167. package/dist/{previewAuthStore-a_cBD28m.mjs → previewAuthStore-CTO7CRPk.mjs} +35 -0
  168. package/dist/{sdk-runtime-MBzD-GmP.mjs → sdk-runtime-Dou0GAav.mjs} +2 -2
  169. package/dist/{separator-5ahRBC85.mjs → separator-CI5wZNXT.mjs} +1 -1
  170. package/dist/server/components.mjs +1832 -784
  171. package/dist/server/config-validation.mjs +890 -497
  172. package/dist/server/config.mjs +890 -497
  173. package/dist/server/data.mjs +890 -497
  174. package/dist/server/date-time.mjs +386 -0
  175. package/dist/server/index.mjs +36 -1
  176. package/dist/server/next.mjs +1868 -785
  177. package/dist/server/page-converter.mjs +849 -285
  178. package/dist/server/prebuild.mjs +1 -1
  179. package/dist/server/rendering/server.mjs +1553 -718
  180. package/dist/server/rendering.mjs +1832 -784
  181. package/dist/server/routing.mjs +933 -522
  182. package/dist/server/server.mjs +929 -501
  183. package/dist/server/theme-bridge.mjs +1408 -392
  184. package/dist/server/theme.mjs +471 -228
  185. package/dist/styles/index.css +5 -0
  186. package/package.json +7 -1
  187. package/dist/_dts/theme-core/src/buttons/presets/types.d.ts +0 -88
  188. package/dist/_dts/theme-core/src/buttons/utils/contrast.d.ts +0 -38
  189. package/dist/_dts/theme-core/src/palette/themePaletteCompatibility.d.ts +0 -57
@@ -6334,6 +6334,41 @@ const API_ENDPOINTS$1 = {
6334
6334
  auth: "service",
6335
6335
  responseKind: "json"
6336
6336
  },
6337
+ sdkCatalogTheme: {
6338
+ path: "/sdk/{siteId}/catalog/theme",
6339
+ method: "GET",
6340
+ errors: ["server:internal_error"],
6341
+ auth: "service",
6342
+ responseKind: "json"
6343
+ },
6344
+ sdkCatalogBlocks: {
6345
+ path: "/sdk/{siteId}/catalog/blocks",
6346
+ method: "GET",
6347
+ errors: ["server:internal_error"],
6348
+ auth: "service",
6349
+ responseKind: "json"
6350
+ },
6351
+ sdkCatalogContentTypes: {
6352
+ path: "/sdk/{siteId}/catalog/content-types",
6353
+ method: "GET",
6354
+ errors: ["server:internal_error"],
6355
+ auth: "service",
6356
+ responseKind: "json"
6357
+ },
6358
+ sdkCapabilities: {
6359
+ path: "/sdk/{siteId}/capabilities",
6360
+ method: "GET",
6361
+ errors: ["server:internal_error"],
6362
+ auth: "service",
6363
+ responseKind: "json"
6364
+ },
6365
+ sdkListDemoContent: {
6366
+ path: "/sdk/{siteId}/demo-content",
6367
+ method: "GET",
6368
+ errors: ["server:internal_error"],
6369
+ auth: "service",
6370
+ responseKind: "json"
6371
+ },
6337
6372
  sdkPullPages: {
6338
6373
  path: "/sdk/{siteId}/pull/pages",
6339
6374
  method: "GET",
@@ -7368,17 +7403,17 @@ function buildEndpointURL(baseURL, endpoint) {
7368
7403
  function isFormDataBody(value) {
7369
7404
  return typeof FormData !== "undefined" && value instanceof FormData;
7370
7405
  }
7371
- function isUnknownArray(value) {
7406
+ function isUnknownArray$1(value) {
7372
7407
  return Array.isArray(value);
7373
7408
  }
7374
7409
  function appendQueryParam(queryParams, key, value) {
7375
7410
  if (value === void 0 || value === null) return;
7376
- if (isUnknownArray(value)) {
7411
+ if (isUnknownArray$1(value)) {
7377
7412
  const stack = [...value].reverse();
7378
7413
  while (stack.length > 0) {
7379
7414
  const item = stack.pop();
7380
7415
  if (item === void 0 || item === null) continue;
7381
- if (isUnknownArray(item)) {
7416
+ if (isUnknownArray$1(item)) {
7382
7417
  stack.push(...[...item].reverse());
7383
7418
  continue;
7384
7419
  }
@@ -7751,7 +7786,7 @@ var SimpleCache = class {
7751
7786
  * 1. This constant
7752
7787
  * 2. The "version" field in package.json
7753
7788
  */
7754
- const SDK_VERSION = "0.108.0";
7789
+ const SDK_VERSION = "0.109.0";
7755
7790
  //#endregion
7756
7791
  //#region src/client/error.ts
7757
7792
  let _Symbol$for;
@@ -10352,19 +10387,29 @@ function isRecord$12(value) {
10352
10387
  //#region ../core/src/booking-date-time.ts
10353
10388
  const DEFAULT_LOCALE = "en-US";
10354
10389
  const FALLBACK_TIMEZONE = "UTC";
10390
+ const DATE_TIME_FORMATTER_CACHE_LIMIT = 100;
10391
+ const dateTimeFormatterCache = /* @__PURE__ */ new Map();
10392
+ const timeZoneValidityCache = /* @__PURE__ */ new Map();
10355
10393
  function isValidTimeZone(timeZone) {
10394
+ const cached = timeZoneValidityCache.get(timeZone);
10395
+ if (cached !== void 0) return cached;
10396
+ let isValid;
10356
10397
  try {
10357
10398
  new Intl.DateTimeFormat(DEFAULT_LOCALE, { timeZone }).format(/* @__PURE__ */ new Date());
10358
- return true;
10399
+ isValid = true;
10359
10400
  } catch {
10360
- return false;
10401
+ isValid = false;
10361
10402
  }
10403
+ if (timeZoneValidityCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) timeZoneValidityCache.clear();
10404
+ timeZoneValidityCache.set(timeZone, isValid);
10405
+ return isValid;
10362
10406
  }
10363
10407
  function getSafeTimeZone(timeZone) {
10364
10408
  const normalized = typeof timeZone === "string" ? timeZone.trim() : "";
10365
10409
  return normalized.length > 0 && isValidTimeZone(normalized) ? normalized : FALLBACK_TIMEZONE;
10366
10410
  }
10367
10411
  function parseStrictBookingTimeZone(timeZone) {
10412
+ if (typeof timeZone !== "string") return null;
10368
10413
  const normalized = timeZone.trim();
10369
10414
  if (normalized.length === 0 || !isValidTimeZone(normalized)) return null;
10370
10415
  return normalized;
@@ -10377,10 +10422,19 @@ function formatParseError(error) {
10377
10422
  }
10378
10423
  }
10379
10424
  function formatToPartsLookup(date, locale, timeZone, format) {
10380
- return new Map(new Intl.DateTimeFormat(locale, {
10425
+ return new Map(getCachedDateTimeFormatter(locale, timeZone, format).formatToParts(date).map((part) => [part.type, part.value]));
10426
+ }
10427
+ function getCachedDateTimeFormatter(locale, timeZone, format) {
10428
+ const key = `${locale}\u0000${timeZone}\u0000${JSON.stringify(Object.entries(format).sort(([left], [right]) => left.localeCompare(right)))}`;
10429
+ const cached = dateTimeFormatterCache.get(key);
10430
+ if (cached !== void 0) return cached;
10431
+ const formatter = new Intl.DateTimeFormat(locale, {
10381
10432
  ...format,
10382
10433
  timeZone
10383
- }).formatToParts(date).map((part) => [part.type, part.value]));
10434
+ });
10435
+ if (dateTimeFormatterCache.size >= DATE_TIME_FORMATTER_CACHE_LIMIT) dateTimeFormatterCache.clear();
10436
+ dateTimeFormatterCache.set(key, formatter);
10437
+ return formatter;
10384
10438
  }
10385
10439
  function getZonedDateTimeParts(date, timeZone) {
10386
10440
  const parts = formatToPartsLookup(date, "en-GB", timeZone, {
@@ -10423,23 +10477,9 @@ function toUtcIsoDateTimeString(value) {
10423
10477
  return parsed.value;
10424
10478
  }
10425
10479
  function parseScheduledBookingDateTime(input) {
10480
+ let startsAt;
10426
10481
  try {
10427
- const startsAt = toUtcIsoDateTimeString(input.startsAt);
10428
- const timeZone = parseStrictBookingTimeZone(input.timeZone);
10429
- if (timeZone === null) return {
10430
- ok: false,
10431
- field: "timeZone",
10432
- reason: "invalid_time_zone",
10433
- value: input.timeZone
10434
- };
10435
- return {
10436
- ok: true,
10437
- value: {
10438
- startsAt,
10439
- timeZone,
10440
- locale: input.locale
10441
- }
10442
- };
10482
+ startsAt = toUtcIsoDateTimeString(input.startsAt);
10443
10483
  } catch {
10444
10484
  return {
10445
10485
  ok: false,
@@ -10448,6 +10488,21 @@ function parseScheduledBookingDateTime(input) {
10448
10488
  value: input.startsAt
10449
10489
  };
10450
10490
  }
10491
+ const timeZone = parseStrictBookingTimeZone(input.timeZone);
10492
+ if (timeZone === null) return {
10493
+ ok: false,
10494
+ field: "timeZone",
10495
+ reason: "invalid_time_zone",
10496
+ value: typeof input.timeZone === "string" ? input.timeZone : ""
10497
+ };
10498
+ return {
10499
+ ok: true,
10500
+ value: {
10501
+ startsAt,
10502
+ timeZone,
10503
+ locale: input.locale
10504
+ }
10505
+ };
10451
10506
  }
10452
10507
  function toScheduledBookingDateTime(input) {
10453
10508
  const result = parseScheduledBookingDateTime(input);
@@ -13577,6 +13632,111 @@ const mediaSchema$1 = z.object({
13577
13632
  transform: transformSchema$1.optional()
13578
13633
  });
13579
13634
  //#endregion
13635
+ //#region ../theme-core/src/buttons/effectClassification.ts
13636
+ /**
13637
+ * Exhaustive live policy for every registered effect id.
13638
+ *
13639
+ * The resolver consumes the transition payload directly, so adding an effect
13640
+ * cannot update classification without also defining its runtime behavior.
13641
+ */
13642
+ const BUTTON_EFFECT_POLICIES = {
13643
+ "darken-background": {
13644
+ classification: "colour-transition",
13645
+ transition: {
13646
+ kind: "adjust-shade",
13647
+ direction: "darker"
13648
+ }
13649
+ },
13650
+ "lighten-background": {
13651
+ classification: "colour-transition",
13652
+ transition: {
13653
+ kind: "adjust-shade",
13654
+ direction: "lighter"
13655
+ }
13656
+ },
13657
+ "background-on-hover": {
13658
+ classification: "colour-transition",
13659
+ transition: { kind: "replace-background" }
13660
+ },
13661
+ "background-on-hover-alpha": {
13662
+ classification: "unsupported-colour",
13663
+ reason: "alpha_requires_surface"
13664
+ },
13665
+ "fade-background": {
13666
+ classification: "unsupported-colour",
13667
+ reason: "changes_element_opacity"
13668
+ },
13669
+ "opacity-reduce": {
13670
+ classification: "unsupported-colour",
13671
+ reason: "changes_element_opacity"
13672
+ },
13673
+ "gradient-text": {
13674
+ classification: "unsupported-colour",
13675
+ reason: "changes_foreground"
13676
+ },
13677
+ "text-color-change": {
13678
+ classification: "unsupported-colour",
13679
+ reason: "changes_foreground"
13680
+ },
13681
+ "border-color-change": {
13682
+ classification: "unsupported-colour",
13683
+ reason: "changes_border"
13684
+ },
13685
+ "aurora-glow": {
13686
+ classification: "unsupported-background-overlay",
13687
+ reason: "unresolved_background_overlay"
13688
+ },
13689
+ "cosmic-stardust": {
13690
+ classification: "unsupported-background-overlay",
13691
+ reason: "unresolved_background_overlay"
13692
+ },
13693
+ "gradient-border-fill": {
13694
+ classification: "unsupported-background-overlay",
13695
+ reason: "unresolved_background_overlay"
13696
+ },
13697
+ "animated-gradient-border-fill": {
13698
+ classification: "unsupported-background-overlay",
13699
+ reason: "unresolved_background_overlay"
13700
+ },
13701
+ "nav-underline": {
13702
+ classification: "not-button",
13703
+ reason: "not_button_effect"
13704
+ },
13705
+ "nav-frosted-base": {
13706
+ classification: "not-button",
13707
+ reason: "not_button_effect"
13708
+ },
13709
+ "nav-frosted-hover": {
13710
+ classification: "not-button",
13711
+ reason: "not_button_effect"
13712
+ },
13713
+ "nav-frosted-active": {
13714
+ classification: "not-button",
13715
+ reason: "not_button_effect"
13716
+ },
13717
+ "animated-gradient": { classification: "non-colour" },
13718
+ "border-glow": { classification: "non-colour" },
13719
+ "drop-shadow": { classification: "non-colour" },
13720
+ "inner-shadow": { classification: "non-colour" },
13721
+ "neumorphic-shadow": { classification: "non-colour" },
13722
+ "outer-glow": { classification: "non-colour" },
13723
+ "retro-3d-shadow": { classification: "non-colour" },
13724
+ "scale-up": { classification: "non-colour" },
13725
+ "scale-down": { classification: "non-colour" },
13726
+ lift: { classification: "non-colour" },
13727
+ "press-down": { classification: "non-colour" },
13728
+ pop: { classification: "non-colour" },
13729
+ "border-bottom-grow": { classification: "non-colour" },
13730
+ "sketchy-border": { classification: "non-colour" },
13731
+ "pulse-animation": { classification: "non-colour" }
13732
+ };
13733
+ function getButtonEffectPolicy(effectId) {
13734
+ return Object.prototype.hasOwnProperty.call(BUTTON_EFFECT_POLICIES, effectId) ? BUTTON_EFFECT_POLICIES[effectId] : null;
13735
+ }
13736
+ function classifyButtonEffectId(effectId) {
13737
+ return getButtonEffectPolicy(effectId)?.classification ?? "unknown";
13738
+ }
13739
+ //#endregion
13580
13740
  //#region ../theme-core/src/buttons/types.ts
13581
13741
  /**
13582
13742
  * Standard semantic variant roles a theme exposes.
@@ -13593,6 +13753,20 @@ const VARIANT_ROLES = [
13593
13753
  "tertiary",
13594
13754
  "accent"
13595
13755
  ];
13756
+ function parseOpaqueButtonColourToken(value) {
13757
+ const token = parseThemeColorToken(value);
13758
+ if (token === null) return null;
13759
+ const parts = parseColorTokenParts(token);
13760
+ return parts.kind === "token" && parts.opacityPercent === null ? token : null;
13761
+ }
13762
+ function unsafeAsOpaqueButtonColourToken(value) {
13763
+ return value;
13764
+ }
13765
+ const opaqueButtonColourTokenSchema = themeColorTokenSchema.refine((value) => parseOpaqueButtonColourToken(value) !== null, "Button colour tokens must be opaque").transform((value) => {
13766
+ const token = parseOpaqueButtonColourToken(value);
13767
+ if (token === null) throw new Error("Invariant: opaque button token passed its schema");
13768
+ return token;
13769
+ });
13596
13770
  const cornerStyleSchema = z$1.enum([
13597
13771
  "square",
13598
13772
  "rounded",
@@ -13694,7 +13868,7 @@ const buttonSizesSchema = z$1.object({
13694
13868
  lg,
13695
13869
  xl: xl ?? lg
13696
13870
  }));
13697
- const buttonGlobalSettingsSchema = z$1.object({
13871
+ const canonicalButtonGlobalSettingsSchema = z$1.object({
13698
13872
  cornerStyle: cornerStyleSchema,
13699
13873
  cornerRadius: z$1.number().min(0).max(24).optional(),
13700
13874
  /**
@@ -13725,11 +13899,12 @@ const buttonGlobalSettingsSchema = z$1.object({
13725
13899
  paddingPreset: buttonPaddingPresetSchema.optional(),
13726
13900
  hoverTransform: hoverTransformSchema,
13727
13901
  hoverColor: hoverColorSchema,
13728
- hoverColorToken: themeColorTokenSchema.optional(),
13902
+ hoverColorToken: opaqueButtonColourTokenSchema.optional(),
13729
13903
  gradientStyle: gradientStyleSchema.optional(),
13730
13904
  gradientAngle: z$1.number().min(0).max(360).optional(),
13731
13905
  gradientSharpness: gradientSharpnessSchema.optional()
13732
13906
  });
13907
+ const buttonGlobalSettingsSchema = z$1.preprocess(normalizeLegacyButtonGlobalInput, canonicalButtonGlobalSettingsSchema);
13733
13908
  const gradientDirectionSchema$1 = z$1.enum([
13734
13909
  "to-r",
13735
13910
  "to-l",
@@ -13743,27 +13918,33 @@ const gradientDirectionSchema$1 = z$1.enum([
13743
13918
  const buttonBackgroundSchema = z$1.discriminatedUnion("type", [
13744
13919
  z$1.object({
13745
13920
  type: z$1.literal("solid"),
13746
- colorToken: themeColorTokenSchema
13921
+ colorToken: opaqueButtonColourTokenSchema
13747
13922
  }),
13748
13923
  z$1.object({
13749
13924
  type: z$1.literal("gradient"),
13750
- stops: z$1.array(themeColorTokenSchema).min(2),
13751
- direction: gradientDirectionSchema$1
13925
+ stops: z$1.array(opaqueButtonColourTokenSchema).min(2).transform((stops) => {
13926
+ const [first, second, ...rest] = stops;
13927
+ if (first === void 0 || second === void 0) throw new Error("Invariant: gradient stops passed the minimum length schema");
13928
+ return [
13929
+ first,
13930
+ second,
13931
+ ...rest
13932
+ ];
13933
+ }),
13934
+ direction: gradientDirectionSchema$1,
13935
+ foregroundToken: opaqueButtonColourTokenSchema
13752
13936
  }),
13753
- z$1.object({ type: z$1.literal("transparent") })
13937
+ z$1.object({
13938
+ type: z$1.literal("surface"),
13939
+ role: z$1.literal("link")
13940
+ })
13754
13941
  ]);
13755
13942
  const effectApplicationSchema$1 = z$1.object({
13756
13943
  effectId: z$1.string(),
13757
- options: z$1.record(z$1.string(), z$1.any()).optional()
13758
- });
13759
- const buttonBorderSchema = z$1.object({
13760
- widthClass: z$1.string(),
13761
- colorToken: themeColorTokenSchema
13762
- });
13763
- const buttonVariantAffordanceSchema = z$1.object({
13764
- iconId: z$1.string().min(1),
13765
- colorToken: themeColorTokenSchema.optional()
13944
+ options: z$1.record(z$1.string(), z$1.json()).optional()
13766
13945
  });
13946
+ const buttonBorderSchema = z$1.object({ widthClass: z$1.string() });
13947
+ const buttonVariantAffordanceSchema = z$1.object({ iconId: z$1.string().min(1) });
13767
13948
  const variantShadowSchema = z$1.object({
13768
13949
  elevation: z$1.enum([
13769
13950
  "none",
@@ -13804,27 +13985,170 @@ const variantSizeOverridesSchema = z$1.object({
13804
13985
  * default (e.g. link-style variants declaring zero horizontal padding at
13805
13986
  * every size).
13806
13987
  */
13807
- const buttonVariantSchema = z$1.object({
13988
+ const canonicalButtonVariantSchema = z$1.object({
13808
13989
  id: z$1.string(),
13809
13990
  name: z$1.string().min(1).max(20),
13810
13991
  enabled: z$1.boolean(),
13811
13992
  priority: prioritySchema,
13812
13993
  background: buttonBackgroundSchema,
13813
- textColorToken: themeColorTokenSchema,
13814
13994
  /** Tailwind radius token (e.g. `'rounded-md'`). Omit to inherit from `global.cornerStyle`. */
13815
13995
  borderRadius: z$1.string().optional(),
13816
13996
  shadow: variantShadowSchema.optional(),
13817
13997
  border: buttonBorderSchema.optional(),
13818
- hoverBackgroundToken: z$1.string().optional(),
13998
+ hoverBackgroundToken: opaqueButtonColourTokenSchema.optional(),
13819
13999
  effects: variantEffectsSchema.optional(),
13820
14000
  sizes: variantSizeOverridesSchema.optional(),
13821
14001
  affordance: buttonVariantAffordanceSchema.optional()
13822
14002
  });
14003
+ /**
14004
+ * Temporary persisted-theme admission boundary for issue #1206.
14005
+ *
14006
+ * Production inventory on 2026-07-22 found 22 rows using the old independent
14007
+ * `textColorToken`/border colour shape. New source and all downstream code use
14008
+ * only the canonical relationship. Delete this preprocessor after the reviewed
14009
+ * production rewrite reports zero legacy rows.
14010
+ */
14011
+ const buttonVariantSchema = z$1.preprocess(normalizeLegacyButtonVariantInput, canonicalButtonVariantSchema);
13823
14012
  const buttonSystemSchema = z$1.object({
13824
14013
  global: buttonGlobalSettingsSchema,
13825
14014
  variants: z$1.array(buttonVariantSchema).min(1).max(6),
13826
14015
  sizes: buttonSizesSchema.optional()
13827
14016
  });
14017
+ function normalizeLegacyButtonVariantInput(input) {
14018
+ if (!isUnknownRecord(input)) return input;
14019
+ const background = input.background;
14020
+ if (!isUnknownRecord(background)) return input;
14021
+ if (!(background.type === "transparent" || Object.prototype.hasOwnProperty.call(input, "textColorToken") || isUnknownRecord(input.border) && Object.prototype.hasOwnProperty.call(input.border, "colorToken") || hasLegacyButtonEffects(input.effects) || hasLegacyAlphaToken(input, background))) return input;
14022
+ const { textColorToken, ...withoutLegacyText } = input;
14023
+ const normalizedBorder = isUnknownRecord(input.border) && typeof input.border.widthClass === "string" ? { widthClass: input.border.widthClass } : input.border;
14024
+ const normalizedAffordance = isUnknownRecord(input.affordance) && typeof input.affordance.iconId === "string" ? { iconId: input.affordance.iconId } : input.affordance;
14025
+ const normalizedEffects = normalizeLegacyButtonEffects(input.effects, background.type);
14026
+ const hoverBackgroundToken = stripLegacyTokenAlpha(input.hoverBackgroundToken);
14027
+ if (background.type === "transparent") return {
14028
+ ...withoutLegacyText,
14029
+ background: {
14030
+ type: "surface",
14031
+ role: "link"
14032
+ },
14033
+ border: normalizedBorder,
14034
+ affordance: normalizedAffordance,
14035
+ effects: normalizedEffects,
14036
+ hoverBackgroundToken
14037
+ };
14038
+ if (background.type === "gradient") {
14039
+ const stops = Array.isArray(background.stops) ? background.stops.map(stripLegacyTokenAlpha) : background.stops;
14040
+ return {
14041
+ ...withoutLegacyText,
14042
+ background: {
14043
+ ...background,
14044
+ stops,
14045
+ foregroundToken: stripLegacyTokenAlpha(background.foregroundToken ?? textColorToken)
14046
+ },
14047
+ border: normalizedBorder,
14048
+ affordance: normalizedAffordance,
14049
+ effects: normalizedEffects,
14050
+ hoverBackgroundToken
14051
+ };
14052
+ }
14053
+ return {
14054
+ ...withoutLegacyText,
14055
+ background: background.type === "solid" ? {
14056
+ ...background,
14057
+ colorToken: stripLegacyTokenAlpha(background.colorToken)
14058
+ } : background,
14059
+ border: normalizedBorder,
14060
+ affordance: normalizedAffordance,
14061
+ effects: normalizedEffects,
14062
+ hoverBackgroundToken
14063
+ };
14064
+ }
14065
+ function normalizeLegacyButtonGlobalInput(input) {
14066
+ if (!isUnknownRecord(input)) return input;
14067
+ const hoverColorToken = stripLegacyTokenAlpha(input.hoverColorToken);
14068
+ return hoverColorToken === input.hoverColorToken ? input : {
14069
+ ...input,
14070
+ hoverColorToken
14071
+ };
14072
+ }
14073
+ function hasLegacyAlphaToken(input, background) {
14074
+ const stops = isUnknownArray(background.stops) ? background.stops : [];
14075
+ return [
14076
+ input.hoverBackgroundToken,
14077
+ background.colorToken,
14078
+ background.foregroundToken,
14079
+ ...stops
14080
+ ].some((token) => stripLegacyTokenAlpha(token) !== token);
14081
+ }
14082
+ function stripLegacyTokenAlpha(value) {
14083
+ if (typeof value !== "string") return value;
14084
+ const slashIndex = value.indexOf("/");
14085
+ return slashIndex < 0 ? value : value.slice(0, slashIndex);
14086
+ }
14087
+ function hasLegacyButtonEffects(input) {
14088
+ if (!isUnknownRecord(input)) return false;
14089
+ return [
14090
+ "base",
14091
+ "hover",
14092
+ "active",
14093
+ "focus"
14094
+ ].some((state) => {
14095
+ const effects = input[state];
14096
+ return Array.isArray(effects) && effects.some((effect) => {
14097
+ if (!isUnknownRecord(effect) || typeof effect.effectId !== "string") return true;
14098
+ const classification = classifyButtonEffectId(effect.effectId);
14099
+ if (classification !== "colour-transition" && classification !== "non-colour") return true;
14100
+ return effect.effectId === "background-on-hover" && isUnknownRecord(effect.options) && stripLegacyTokenAlpha(effect.options.colorToken) !== effect.options.colorToken;
14101
+ });
14102
+ });
14103
+ }
14104
+ function normalizeLegacyButtonEffects(input, backgroundType) {
14105
+ if (!isUnknownRecord(input)) return input;
14106
+ const normalized = {};
14107
+ for (const state of [
14108
+ "base",
14109
+ "hover",
14110
+ "active",
14111
+ "focus"
14112
+ ]) {
14113
+ const effects = input[state];
14114
+ if (!Array.isArray(effects)) continue;
14115
+ const safeEffects = effects.flatMap((effect) => {
14116
+ if (!isUnknownRecord(effect) || typeof effect.effectId !== "string") return [];
14117
+ const classification = classifyButtonEffectId(effect.effectId);
14118
+ if (classification === "non-colour") return [effect];
14119
+ if (classification !== "colour-transition") return [];
14120
+ if (effect.effectId === "background-on-hover") {
14121
+ const options = isUnknownRecord(effect.options) ? effect.options : null;
14122
+ const colorToken = options === null ? null : parseOpaqueButtonColourToken(stripLegacyTokenAlpha(options.colorToken));
14123
+ return colorToken === null ? [] : [{
14124
+ ...effect,
14125
+ options: {
14126
+ ...options,
14127
+ colorToken
14128
+ }
14129
+ }];
14130
+ }
14131
+ if (backgroundType !== "solid") return [];
14132
+ const rawAmount = isUnknownRecord(effect.options) ? effect.options.amount : void 0;
14133
+ const amount = typeof rawAmount === "number" && rawAmount > 0 ? Math.max(100, Math.round(rawAmount / 100) * 100) : 100;
14134
+ return [{
14135
+ ...effect,
14136
+ options: {
14137
+ ...isUnknownRecord(effect.options) ? effect.options : {},
14138
+ amount
14139
+ }
14140
+ }];
14141
+ });
14142
+ if (safeEffects.length > 0) normalized[state] = safeEffects;
14143
+ }
14144
+ return Object.keys(normalized).length === 0 ? void 0 : normalized;
14145
+ }
14146
+ function isUnknownRecord(value) {
14147
+ return typeof value === "object" && value !== null && !Array.isArray(value);
14148
+ }
14149
+ function isUnknownArray(value) {
14150
+ return Array.isArray(value);
14151
+ }
13828
14152
  buttonSizeNameSchema.options;
13829
14153
  //#endregion
13830
14154
  //#region ../theme-core/src/buttons/personalities/types.ts
@@ -13851,7 +14175,7 @@ function defineButtonPersonality(input) {
13851
14175
  name: input.name,
13852
14176
  description: input.description,
13853
14177
  tags: input.tags,
13854
- buttonSystem: input.buttonSystem
14178
+ buttonSystem: buttonSystemSchema.parse(input.buttonSystem)
13855
14179
  };
13856
14180
  }
13857
14181
  //#endregion
@@ -13904,19 +14228,15 @@ const brushedWash = defineButtonPersonality({
13904
14228
  background: {
13905
14229
  type: "gradient",
13906
14230
  stops: ["primary", "accent"],
13907
- direction: "to-r"
14231
+ direction: "to-r",
14232
+ foregroundToken: "primaryForeground"
13908
14233
  },
13909
- textColorToken: "primaryForeground",
13910
14234
  borderRadius: "rounded-lg",
13911
14235
  shadow: {
13912
14236
  elevation: "low",
13913
14237
  softness: "soft",
13914
14238
  position: "bottom"
13915
- },
13916
- effects: { hover: [{
13917
- effectId: "opacity-reduce",
13918
- options: { reduction: -15 }
13919
- }] }
14239
+ }
13920
14240
  },
13921
14241
  {
13922
14242
  id: "secondary",
@@ -13926,32 +14246,27 @@ const brushedWash = defineButtonPersonality({
13926
14246
  background: {
13927
14247
  type: "gradient",
13928
14248
  stops: ["secondary", "accent"],
13929
- direction: "to-br"
14249
+ direction: "to-br",
14250
+ foregroundToken: "primaryForeground"
13930
14251
  },
13931
- textColorToken: "primaryForeground",
13932
14252
  borderRadius: "rounded-lg",
13933
14253
  shadow: {
13934
14254
  elevation: "low",
13935
14255
  softness: "soft",
13936
14256
  position: "bottom"
13937
- },
13938
- effects: { hover: [{
13939
- effectId: "opacity-reduce",
13940
- options: { reduction: -15 }
13941
- }] }
14257
+ }
13942
14258
  },
13943
14259
  {
13944
14260
  id: "outline",
13945
14261
  name: "Outline",
13946
14262
  enabled: true,
13947
14263
  priority: 3,
13948
- background: { type: "transparent" },
13949
- textColorToken: "primary",
13950
- borderRadius: "rounded-lg",
13951
- border: {
13952
- widthClass: "border",
13953
- colorToken: "primary"
14264
+ background: {
14265
+ type: "surface",
14266
+ role: "link"
13954
14267
  },
14268
+ borderRadius: "rounded-lg",
14269
+ border: { widthClass: "border" },
13955
14270
  effects: { hover: [{
13956
14271
  effectId: "background-on-hover",
13957
14272
  options: { colorToken: "surface" }
@@ -13962,8 +14277,10 @@ const brushedWash = defineButtonPersonality({
13962
14277
  name: "Ghost",
13963
14278
  enabled: true,
13964
14279
  priority: 3,
13965
- background: { type: "transparent" },
13966
- textColorToken: "text",
14280
+ background: {
14281
+ type: "surface",
14282
+ role: "link"
14283
+ },
13967
14284
  borderRadius: "rounded-lg",
13968
14285
  effects: { hover: [{
13969
14286
  effectId: "background-on-hover",
@@ -14009,7 +14326,6 @@ const confidentChip = defineButtonPersonality({
14009
14326
  type: "solid",
14010
14327
  colorToken: "primary"
14011
14328
  },
14012
- textColorToken: "primaryForeground",
14013
14329
  borderRadius: "rounded-md",
14014
14330
  shadow: {
14015
14331
  elevation: "medium",
@@ -14019,7 +14335,7 @@ const confidentChip = defineButtonPersonality({
14019
14335
  effects: {
14020
14336
  hover: [{
14021
14337
  effectId: "darken-background",
14022
- options: { amount: 60 }
14338
+ options: { amount: 100 }
14023
14339
  }],
14024
14340
  active: [{
14025
14341
  effectId: "scale-down",
@@ -14036,12 +14352,8 @@ const confidentChip = defineButtonPersonality({
14036
14352
  type: "solid",
14037
14353
  colorToken: "surface"
14038
14354
  },
14039
- textColorToken: "text",
14040
14355
  borderRadius: "rounded-md",
14041
- border: {
14042
- widthClass: "border",
14043
- colorToken: "border"
14044
- },
14356
+ border: { widthClass: "border" },
14045
14357
  effects: { hover: [{
14046
14358
  effectId: "background-on-hover",
14047
14359
  options: { colorToken: "background" }
@@ -14052,13 +14364,12 @@ const confidentChip = defineButtonPersonality({
14052
14364
  name: "Outline",
14053
14365
  enabled: true,
14054
14366
  priority: 3,
14055
- background: { type: "transparent" },
14056
- textColorToken: "primary",
14057
- borderRadius: "rounded-md",
14058
- border: {
14059
- widthClass: "border",
14060
- colorToken: "primary"
14367
+ background: {
14368
+ type: "surface",
14369
+ role: "link"
14061
14370
  },
14371
+ borderRadius: "rounded-md",
14372
+ border: { widthClass: "border" },
14062
14373
  effects: { hover: [{
14063
14374
  effectId: "background-on-hover",
14064
14375
  options: { colorToken: "surface" }
@@ -14069,8 +14380,10 @@ const confidentChip = defineButtonPersonality({
14069
14380
  name: "Ghost",
14070
14381
  enabled: true,
14071
14382
  priority: 3,
14072
- background: { type: "transparent" },
14073
- textColorToken: "primary",
14383
+ background: {
14384
+ type: "surface",
14385
+ role: "link"
14386
+ },
14074
14387
  borderRadius: "rounded-md",
14075
14388
  effects: { hover: [{
14076
14389
  effectId: "background-on-hover",
@@ -14133,7 +14446,6 @@ const earthPill = defineButtonPersonality({
14133
14446
  type: "solid",
14134
14447
  colorToken: "primary"
14135
14448
  },
14136
- textColorToken: "primaryForeground",
14137
14449
  borderRadius: "rounded-full",
14138
14450
  shadow: {
14139
14451
  elevation: "low",
@@ -14159,13 +14471,12 @@ const earthPill = defineButtonPersonality({
14159
14471
  name: "Secondary",
14160
14472
  enabled: true,
14161
14473
  priority: 2,
14162
- background: { type: "transparent" },
14163
- textColorToken: "primary",
14164
- borderRadius: "rounded-full",
14165
- border: {
14166
- widthClass: "border",
14167
- colorToken: "primary"
14474
+ background: {
14475
+ type: "surface",
14476
+ role: "link"
14168
14477
  },
14478
+ borderRadius: "rounded-full",
14479
+ border: { widthClass: "border" },
14169
14480
  effects: { hover: [{
14170
14481
  effectId: "background-on-hover",
14171
14482
  options: { colorToken: "muted" }
@@ -14176,13 +14487,12 @@ const earthPill = defineButtonPersonality({
14176
14487
  name: "Outline",
14177
14488
  enabled: true,
14178
14489
  priority: 3,
14179
- background: { type: "transparent" },
14180
- textColorToken: "text",
14181
- borderRadius: "rounded-full",
14182
- border: {
14183
- widthClass: "border",
14184
- colorToken: "border"
14490
+ background: {
14491
+ type: "surface",
14492
+ role: "link"
14185
14493
  },
14494
+ borderRadius: "rounded-full",
14495
+ border: { widthClass: "border" },
14186
14496
  effects: { hover: [{
14187
14497
  effectId: "background-on-hover",
14188
14498
  options: { colorToken: "surfaceAlt" }
@@ -14193,8 +14503,10 @@ const earthPill = defineButtonPersonality({
14193
14503
  name: "Ghost",
14194
14504
  enabled: true,
14195
14505
  priority: 3,
14196
- background: { type: "transparent" },
14197
- textColorToken: "primary",
14506
+ background: {
14507
+ type: "surface",
14508
+ role: "link"
14509
+ },
14198
14510
  borderRadius: "rounded-full",
14199
14511
  shadow: {
14200
14512
  elevation: "none",
@@ -14215,11 +14527,7 @@ const earthPill = defineButtonPersonality({
14215
14527
  padding: "0.625rem 0",
14216
14528
  fontSize: "text-xl"
14217
14529
  }
14218
- },
14219
- effects: { hover: [{
14220
- effectId: "opacity-reduce",
14221
- options: { reduction: 25 }
14222
- }] }
14530
+ }
14223
14531
  }
14224
14532
  ]
14225
14533
  }
@@ -14255,8 +14563,10 @@ const editorialLink = defineButtonPersonality({
14255
14563
  name: "Primary",
14256
14564
  enabled: true,
14257
14565
  priority: 1,
14258
- background: { type: "transparent" },
14259
- textColorToken: "text",
14566
+ background: {
14567
+ type: "surface",
14568
+ role: "link"
14569
+ },
14260
14570
  borderRadius: "rounded-none",
14261
14571
  sizes: {
14262
14572
  sm: { padding: "0.25rem 0" },
@@ -14278,8 +14588,10 @@ const editorialLink = defineButtonPersonality({
14278
14588
  name: "Secondary",
14279
14589
  enabled: true,
14280
14590
  priority: 2,
14281
- background: { type: "transparent" },
14282
- textColorToken: "mutedText",
14591
+ background: {
14592
+ type: "surface",
14593
+ role: "link"
14594
+ },
14283
14595
  borderRadius: "rounded-none",
14284
14596
  sizes: {
14285
14597
  sm: { padding: "0.25rem 0" },
@@ -14301,8 +14613,10 @@ const editorialLink = defineButtonPersonality({
14301
14613
  name: "Outline",
14302
14614
  enabled: true,
14303
14615
  priority: 3,
14304
- background: { type: "transparent" },
14305
- textColorToken: "accent",
14616
+ background: {
14617
+ type: "surface",
14618
+ role: "link"
14619
+ },
14306
14620
  borderRadius: "rounded-none",
14307
14621
  sizes: {
14308
14622
  sm: { padding: "0.25rem 0" },
@@ -14324,19 +14638,17 @@ const editorialLink = defineButtonPersonality({
14324
14638
  name: "Ghost",
14325
14639
  enabled: true,
14326
14640
  priority: 3,
14327
- background: { type: "transparent" },
14328
- textColorToken: "mutedText",
14641
+ background: {
14642
+ type: "surface",
14643
+ role: "link"
14644
+ },
14329
14645
  borderRadius: "rounded-none",
14330
14646
  sizes: {
14331
14647
  sm: { padding: "0.25rem 0" },
14332
14648
  md: { padding: "0.5rem 0" },
14333
14649
  lg: { padding: "0.625rem 0" },
14334
14650
  xl: { padding: "0.75rem 0" }
14335
- },
14336
- effects: { hover: [{
14337
- effectId: "opacity-reduce",
14338
- options: { reduction: -20 }
14339
- }] }
14651
+ }
14340
14652
  }
14341
14653
  ]
14342
14654
  }
@@ -14398,12 +14710,8 @@ const flatInk = defineButtonPersonality({
14398
14710
  type: "solid",
14399
14711
  colorToken: "primary"
14400
14712
  },
14401
- textColorToken: "primaryForeground",
14402
14713
  borderRadius: "rounded-lg",
14403
- affordance: {
14404
- iconId: "ArrowRight",
14405
- colorToken: "accent"
14406
- },
14714
+ affordance: { iconId: "ArrowRight" },
14407
14715
  effects: { hover: [{
14408
14716
  effectId: "lift",
14409
14717
  options: { translateY: "-2px" }
@@ -14417,13 +14725,12 @@ const flatInk = defineButtonPersonality({
14417
14725
  name: "Secondary",
14418
14726
  enabled: true,
14419
14727
  priority: 2,
14420
- background: { type: "transparent" },
14421
- textColorToken: "primary",
14422
- borderRadius: "rounded-lg",
14423
- border: {
14424
- widthClass: "border",
14425
- colorToken: "border"
14728
+ background: {
14729
+ type: "surface",
14730
+ role: "link"
14426
14731
  },
14732
+ borderRadius: "rounded-lg",
14733
+ border: { widthClass: "border" },
14427
14734
  effects: { hover: [{
14428
14735
  effectId: "lift",
14429
14736
  options: { translateY: "-2px" }
@@ -14441,12 +14748,8 @@ const flatInk = defineButtonPersonality({
14441
14748
  type: "solid",
14442
14749
  colorToken: "accent"
14443
14750
  },
14444
- textColorToken: "accentForeground",
14445
14751
  borderRadius: "rounded-lg",
14446
- affordance: {
14447
- iconId: "ArrowRight",
14448
- colorToken: "accentForeground"
14449
- },
14752
+ affordance: { iconId: "ArrowRight" },
14450
14753
  effects: { hover: [{
14451
14754
  effectId: "lift",
14452
14755
  options: { translateY: "-2px" }
@@ -14509,7 +14812,6 @@ const inkStamp = defineButtonPersonality({
14509
14812
  type: "solid",
14510
14813
  colorToken: "primary"
14511
14814
  },
14512
- textColorToken: "primaryForeground",
14513
14815
  borderRadius: "rounded-md",
14514
14816
  effects: {
14515
14817
  hover: [{
@@ -14530,13 +14832,12 @@ const inkStamp = defineButtonPersonality({
14530
14832
  name: "Secondary",
14531
14833
  enabled: true,
14532
14834
  priority: 2,
14533
- background: { type: "transparent" },
14534
- textColorToken: "primary",
14535
- borderRadius: "rounded-md",
14536
- border: {
14537
- widthClass: "border-2",
14538
- colorToken: "primary"
14835
+ background: {
14836
+ type: "surface",
14837
+ role: "link"
14539
14838
  },
14839
+ borderRadius: "rounded-md",
14840
+ border: { widthClass: "border-2" },
14540
14841
  effects: { hover: [{
14541
14842
  effectId: "background-on-hover",
14542
14843
  options: { colorToken: "surface" }
@@ -14547,13 +14848,12 @@ const inkStamp = defineButtonPersonality({
14547
14848
  name: "Outline",
14548
14849
  enabled: true,
14549
14850
  priority: 3,
14550
- background: { type: "transparent" },
14551
- textColorToken: "text",
14552
- borderRadius: "rounded-md",
14553
- border: {
14554
- widthClass: "border-2",
14555
- colorToken: "border"
14851
+ background: {
14852
+ type: "surface",
14853
+ role: "link"
14556
14854
  },
14855
+ borderRadius: "rounded-md",
14856
+ border: { widthClass: "border-2" },
14557
14857
  effects: { hover: [{
14558
14858
  effectId: "background-on-hover",
14559
14859
  options: { colorToken: "surface" }
@@ -14564,8 +14864,10 @@ const inkStamp = defineButtonPersonality({
14564
14864
  name: "Ghost",
14565
14865
  enabled: true,
14566
14866
  priority: 3,
14567
- background: { type: "transparent" },
14568
- textColorToken: "accent",
14867
+ background: {
14868
+ type: "surface",
14869
+ role: "link"
14870
+ },
14569
14871
  borderRadius: "rounded-none",
14570
14872
  sizes: {
14571
14873
  sm: {
@@ -14658,7 +14960,6 @@ const joyStamp = defineButtonPersonality({
14658
14960
  type: "solid",
14659
14961
  colorToken: "primary"
14660
14962
  },
14661
- textColorToken: "primaryForeground",
14662
14963
  borderRadius: "rounded-full",
14663
14964
  shadow: {
14664
14965
  elevation: "high",
@@ -14672,13 +14973,12 @@ const joyStamp = defineButtonPersonality({
14672
14973
  name: "Secondary",
14673
14974
  enabled: true,
14674
14975
  priority: 2,
14675
- background: { type: "transparent" },
14676
- textColorToken: "text",
14677
- borderRadius: "rounded-full",
14678
- border: {
14679
- widthClass: "border-2",
14680
- colorToken: "text"
14976
+ background: {
14977
+ type: "surface",
14978
+ role: "link"
14681
14979
  },
14980
+ borderRadius: "rounded-full",
14981
+ border: { widthClass: "border-2" },
14682
14982
  shadow: {
14683
14983
  elevation: "high",
14684
14984
  softness: "hard",
@@ -14743,12 +15043,8 @@ const ornateRitual = defineButtonPersonality({
14743
15043
  type: "solid",
14744
15044
  colorToken: "primary"
14745
15045
  },
14746
- textColorToken: "primaryForeground",
14747
15046
  borderRadius: "rounded-md",
14748
- border: {
14749
- widthClass: "border",
14750
- colorToken: "primary"
14751
- },
15047
+ border: { widthClass: "border" },
14752
15048
  effects: {
14753
15049
  hover: [{
14754
15050
  effectId: "background-on-hover",
@@ -14769,12 +15065,8 @@ const ornateRitual = defineButtonPersonality({
14769
15065
  type: "solid",
14770
15066
  colorToken: "secondary"
14771
15067
  },
14772
- textColorToken: "primaryForeground",
14773
15068
  borderRadius: "rounded-md",
14774
- border: {
14775
- widthClass: "border",
14776
- colorToken: "primary"
14777
- },
15069
+ border: { widthClass: "border" },
14778
15070
  effects: { hover: [{
14779
15071
  effectId: "background-on-hover",
14780
15072
  options: { colorToken: "surface" }
@@ -14785,13 +15077,12 @@ const ornateRitual = defineButtonPersonality({
14785
15077
  name: "Outline",
14786
15078
  enabled: true,
14787
15079
  priority: 3,
14788
- background: { type: "transparent" },
14789
- textColorToken: "primary",
14790
- borderRadius: "rounded-md",
14791
- border: {
14792
- widthClass: "border",
14793
- colorToken: "primary"
15080
+ background: {
15081
+ type: "surface",
15082
+ role: "link"
14794
15083
  },
15084
+ borderRadius: "rounded-md",
15085
+ border: { widthClass: "border" },
14795
15086
  effects: { hover: [{
14796
15087
  effectId: "background-on-hover",
14797
15088
  options: { colorToken: "muted" }
@@ -14802,8 +15093,10 @@ const ornateRitual = defineButtonPersonality({
14802
15093
  name: "Ghost",
14803
15094
  enabled: true,
14804
15095
  priority: 3,
14805
- background: { type: "transparent" },
14806
- textColorToken: "accent",
15096
+ background: {
15097
+ type: "surface",
15098
+ role: "link"
15099
+ },
14807
15100
  borderRadius: "rounded-none",
14808
15101
  sizes: {
14809
15102
  sm: {
@@ -14885,14 +15178,10 @@ const pebble = defineButtonPersonality({
14885
15178
  type: "solid",
14886
15179
  colorToken: "primary"
14887
15180
  },
14888
- textColorToken: "primaryForeground",
14889
15181
  borderRadius: "rounded-full",
14890
15182
  effects: { hover: [{
14891
- effectId: "background-on-hover-alpha",
14892
- options: {
14893
- colorToken: "primary",
14894
- opacity: 88
14895
- }
15183
+ effectId: "darken-background",
15184
+ options: { amount: 100 }
14896
15185
  }] }
14897
15186
  },
14898
15187
  {
@@ -14900,13 +15189,12 @@ const pebble = defineButtonPersonality({
14900
15189
  name: "Secondary",
14901
15190
  enabled: true,
14902
15191
  priority: 2,
14903
- background: { type: "transparent" },
14904
- textColorToken: "primary",
14905
- borderRadius: "rounded-full",
14906
- border: {
14907
- widthClass: "border-2",
14908
- colorToken: "accent"
15192
+ background: {
15193
+ type: "surface",
15194
+ role: "link"
14909
15195
  },
15196
+ borderRadius: "rounded-full",
15197
+ border: { widthClass: "border-2" },
14910
15198
  effects: { hover: [{
14911
15199
  effectId: "background-on-hover",
14912
15200
  options: { colorToken: "accent" }
@@ -14917,13 +15205,12 @@ const pebble = defineButtonPersonality({
14917
15205
  name: "Outline",
14918
15206
  enabled: true,
14919
15207
  priority: 3,
14920
- background: { type: "transparent" },
14921
- textColorToken: "text",
14922
- borderRadius: "rounded-full",
14923
- border: {
14924
- widthClass: "border",
14925
- colorToken: "border"
15208
+ background: {
15209
+ type: "surface",
15210
+ role: "link"
14926
15211
  },
15212
+ borderRadius: "rounded-full",
15213
+ border: { widthClass: "border" },
14927
15214
  effects: { hover: [{
14928
15215
  effectId: "background-on-hover",
14929
15216
  options: { colorToken: "surface" }
@@ -14934,8 +15221,10 @@ const pebble = defineButtonPersonality({
14934
15221
  name: "Ghost",
14935
15222
  enabled: true,
14936
15223
  priority: 3,
14937
- background: { type: "transparent" },
14938
- textColorToken: "primary",
15224
+ background: {
15225
+ type: "surface",
15226
+ role: "link"
15227
+ },
14939
15228
  borderRadius: "rounded-full",
14940
15229
  sizes: {
14941
15230
  sm: {
@@ -14951,11 +15240,7 @@ const pebble = defineButtonPersonality({
14951
15240
  padding: "0.75rem 1.5rem",
14952
15241
  fontSize: "text-xl"
14953
15242
  }
14954
- },
14955
- effects: { hover: [{
14956
- effectId: "opacity-reduce",
14957
- options: { reduction: 30 }
14958
- }] }
15243
+ }
14959
15244
  }
14960
15245
  ]
14961
15246
  }
@@ -15017,15 +15302,11 @@ const quietArrow = defineButtonPersonality({
15017
15302
  type: "solid",
15018
15303
  colorToken: "primary"
15019
15304
  },
15020
- textColorToken: "primaryForeground",
15021
15305
  borderRadius: "rounded-xl",
15022
15306
  affordance: { iconId: "ArrowRight" },
15023
15307
  effects: { hover: [{
15024
- effectId: "background-on-hover-alpha",
15025
- options: {
15026
- colorToken: "primary",
15027
- opacity: 90
15028
- }
15308
+ effectId: "darken-background",
15309
+ options: { amount: 100 }
15029
15310
  }] }
15030
15311
  },
15031
15312
  {
@@ -15033,13 +15314,12 @@ const quietArrow = defineButtonPersonality({
15033
15314
  name: "Secondary",
15034
15315
  enabled: true,
15035
15316
  priority: 2,
15036
- background: { type: "transparent" },
15037
- textColorToken: "primary",
15038
- borderRadius: "rounded-xl",
15039
- border: {
15040
- widthClass: "border",
15041
- colorToken: "primary"
15317
+ background: {
15318
+ type: "surface",
15319
+ role: "link"
15042
15320
  },
15321
+ borderRadius: "rounded-xl",
15322
+ border: { widthClass: "border" },
15043
15323
  affordance: { iconId: "ArrowRight" },
15044
15324
  effects: { hover: [{
15045
15325
  effectId: "background-on-hover",
@@ -15051,21 +15331,22 @@ const quietArrow = defineButtonPersonality({
15051
15331
  name: "Outline",
15052
15332
  enabled: true,
15053
15333
  priority: 3,
15054
- background: { type: "transparent" },
15055
- textColorToken: "primary",
15334
+ background: {
15335
+ type: "surface",
15336
+ role: "link"
15337
+ },
15056
15338
  borderRadius: "rounded-xl",
15057
- border: {
15058
- widthClass: "border",
15059
- colorToken: "primary"
15060
- }
15339
+ border: { widthClass: "border" }
15061
15340
  },
15062
15341
  {
15063
15342
  id: "ghost",
15064
15343
  name: "Ghost",
15065
15344
  enabled: true,
15066
15345
  priority: 3,
15067
- background: { type: "transparent" },
15068
- textColorToken: "primary",
15346
+ background: {
15347
+ type: "surface",
15348
+ role: "link"
15349
+ },
15069
15350
  borderRadius: "rounded-xl"
15070
15351
  }
15071
15352
  ]
@@ -15129,7 +15410,6 @@ const showtimePill = defineButtonPersonality({
15129
15410
  type: "solid",
15130
15411
  colorToken: "primary"
15131
15412
  },
15132
- textColorToken: "background",
15133
15413
  borderRadius: "rounded-full",
15134
15414
  effects: { hover: [{ effectId: "pop" }] }
15135
15415
  },
@@ -15138,13 +15418,12 @@ const showtimePill = defineButtonPersonality({
15138
15418
  name: "Secondary",
15139
15419
  enabled: true,
15140
15420
  priority: 2,
15141
- background: { type: "transparent" },
15142
- textColorToken: "primary",
15143
- borderRadius: "rounded-full",
15144
- border: {
15145
- widthClass: "border-2",
15146
- colorToken: "primary"
15421
+ background: {
15422
+ type: "surface",
15423
+ role: "link"
15147
15424
  },
15425
+ borderRadius: "rounded-full",
15426
+ border: { widthClass: "border-2" },
15148
15427
  effects: { hover: [{ effectId: "pop" }] }
15149
15428
  },
15150
15429
  {
@@ -15156,7 +15435,6 @@ const showtimePill = defineButtonPersonality({
15156
15435
  type: "solid",
15157
15436
  colorToken: "secondary"
15158
15437
  },
15159
- textColorToken: "primary",
15160
15438
  borderRadius: "rounded-full",
15161
15439
  effects: { hover: [{ effectId: "pop" }] }
15162
15440
  },
@@ -15169,12 +15447,8 @@ const showtimePill = defineButtonPersonality({
15169
15447
  type: "solid",
15170
15448
  colorToken: "background"
15171
15449
  },
15172
- textColorToken: "primary",
15173
15450
  borderRadius: "rounded-full",
15174
- border: {
15175
- widthClass: "border-2",
15176
- colorToken: "primary"
15177
- },
15451
+ border: { widthClass: "border-2" },
15178
15452
  effects: { hover: [{
15179
15453
  effectId: "background-on-hover",
15180
15454
  options: { colorToken: "surface" }
@@ -15185,13 +15459,12 @@ const showtimePill = defineButtonPersonality({
15185
15459
  name: "Outline",
15186
15460
  enabled: true,
15187
15461
  priority: 3,
15188
- background: { type: "transparent" },
15189
- textColorToken: "primary",
15190
- borderRadius: "rounded-full",
15191
- border: {
15192
- widthClass: "border-2",
15193
- colorToken: "primary"
15462
+ background: {
15463
+ type: "surface",
15464
+ role: "link"
15194
15465
  },
15466
+ borderRadius: "rounded-full",
15467
+ border: { widthClass: "border-2" },
15195
15468
  effects: { hover: [{
15196
15469
  effectId: "background-on-hover",
15197
15470
  options: { colorToken: "background" }
@@ -15202,8 +15475,10 @@ const showtimePill = defineButtonPersonality({
15202
15475
  name: "Ghost",
15203
15476
  enabled: true,
15204
15477
  priority: 3,
15205
- background: { type: "transparent" },
15206
- textColorToken: "primary",
15478
+ background: {
15479
+ type: "surface",
15480
+ role: "link"
15481
+ },
15207
15482
  borderRadius: "rounded-full",
15208
15483
  effects: { hover: [{
15209
15484
  effectId: "background-on-hover",
@@ -15249,7 +15524,6 @@ const softPill = defineButtonPersonality({
15249
15524
  type: "solid",
15250
15525
  colorToken: "primary"
15251
15526
  },
15252
- textColorToken: "primaryForeground",
15253
15527
  borderRadius: "rounded-full",
15254
15528
  shadow: {
15255
15529
  elevation: "low",
@@ -15272,13 +15546,12 @@ const softPill = defineButtonPersonality({
15272
15546
  name: "Secondary",
15273
15547
  enabled: true,
15274
15548
  priority: 2,
15275
- background: { type: "transparent" },
15276
- textColorToken: "primary",
15277
- borderRadius: "rounded-full",
15278
- border: {
15279
- widthClass: "border-2",
15280
- colorToken: "primary"
15549
+ background: {
15550
+ type: "surface",
15551
+ role: "link"
15281
15552
  },
15553
+ borderRadius: "rounded-full",
15554
+ border: { widthClass: "border-2" },
15282
15555
  effects: { hover: [{
15283
15556
  effectId: "background-on-hover",
15284
15557
  options: { colorToken: "surface" }
@@ -15289,13 +15562,12 @@ const softPill = defineButtonPersonality({
15289
15562
  name: "Outline",
15290
15563
  enabled: true,
15291
15564
  priority: 3,
15292
- background: { type: "transparent" },
15293
- textColorToken: "text",
15294
- borderRadius: "rounded-full",
15295
- border: {
15296
- widthClass: "border",
15297
- colorToken: "border"
15565
+ background: {
15566
+ type: "surface",
15567
+ role: "link"
15298
15568
  },
15569
+ borderRadius: "rounded-full",
15570
+ border: { widthClass: "border" },
15299
15571
  effects: { hover: [{
15300
15572
  effectId: "background-on-hover",
15301
15573
  options: { colorToken: "surface" }
@@ -15306,8 +15578,10 @@ const softPill = defineButtonPersonality({
15306
15578
  name: "Ghost",
15307
15579
  enabled: true,
15308
15580
  priority: 3,
15309
- background: { type: "transparent" },
15310
- textColorToken: "text",
15581
+ background: {
15582
+ type: "surface",
15583
+ role: "link"
15584
+ },
15311
15585
  borderRadius: "rounded-full",
15312
15586
  effects: { hover: [{
15313
15587
  effectId: "background-on-hover",
@@ -15326,9 +15600,8 @@ const solidSecondary = {
15326
15600
  priority: 2,
15327
15601
  background: {
15328
15602
  type: "solid",
15329
- colorToken: "secondary"
15603
+ colorToken: unsafeAsOpaqueButtonColourToken("secondary")
15330
15604
  },
15331
- textColorToken: "onSecondary",
15332
15605
  borderRadius: "rounded-full",
15333
15606
  shadow: {
15334
15607
  elevation: "none",
@@ -15376,6 +15649,27 @@ const buttonPersonalities = [
15376
15649
  quietArrow
15377
15650
  ];
15378
15651
  new Map(buttonPersonalities.map((p) => [p.id, p]));
15652
+ buttonPersonalities.map((personality) => ({
15653
+ id: personality.id,
15654
+ name: personality.name,
15655
+ description: personality.description,
15656
+ category: presetCategory(personality),
15657
+ buttonSystem: personality.buttonSystem,
15658
+ compatibility: {
15659
+ ...personality.tags.tone ? { tones: [personality.tags.tone] } : {},
15660
+ ...personality.tags.energy ? { energies: [personality.tags.energy] } : {}
15661
+ }
15662
+ }));
15663
+ function presetCategory(personality) {
15664
+ switch (personality.tags.era) {
15665
+ case "retro": return "retro";
15666
+ case "editorial": return "minimal";
15667
+ case "organic": return "artistic";
15668
+ case "modern": return personality.tags.tone === "bold" ? "modern" : "technical";
15669
+ case "technical": return "technical";
15670
+ case void 0: return "modern";
15671
+ }
15672
+ }
15379
15673
  //#endregion
15380
15674
  //#region ../theme-core/src/cards/types.ts
15381
15675
  const cardVariantRoleValues = ["default", "alternative"];
@@ -18853,6 +19147,241 @@ const originalJoyCardSystem = { variants: [{
18853
19147
  const serifDisplayQuote = { style: "serif-display" };
18854
19148
  /** Punchy quotation mark in the secondary accent colour. Bold / accent styles. */
18855
19149
  const accentGlyphQuote = { style: "accent-glyph" };
19150
+ /**
19151
+ * Curated library of gradient presets.
19152
+ * All gradients use theme color tokens, so they adapt to the site's palette.
19153
+ */
19154
+ const GRADIENT_PRESETS = [
19155
+ {
19156
+ id: "primary-secondary",
19157
+ name: "Primary to Secondary",
19158
+ description: "Blend your primary and secondary brand colors",
19159
+ type: "linear",
19160
+ angle: 135,
19161
+ stops: [{
19162
+ color: "primary-500",
19163
+ position: 0
19164
+ }, {
19165
+ color: "secondary-500",
19166
+ position: 100
19167
+ }]
19168
+ },
19169
+ {
19170
+ id: "primary-accent",
19171
+ name: "Primary to Accent",
19172
+ description: "Energetic gradient from primary to accent",
19173
+ type: "linear",
19174
+ angle: 135,
19175
+ stops: [{
19176
+ color: "primary-500",
19177
+ position: 0
19178
+ }, {
19179
+ color: "accent-500",
19180
+ position: 100
19181
+ }]
19182
+ },
19183
+ {
19184
+ id: "secondary-accent",
19185
+ name: "Secondary to Accent",
19186
+ description: "Vibrant secondary to accent blend",
19187
+ type: "linear",
19188
+ angle: 135,
19189
+ stops: [{
19190
+ color: "secondary-500",
19191
+ position: 0
19192
+ }, {
19193
+ color: "accent-500",
19194
+ position: 100
19195
+ }]
19196
+ },
19197
+ {
19198
+ id: "primary-light-dark",
19199
+ name: "Primary Light to Dark",
19200
+ description: "Subtle primary color fade",
19201
+ type: "linear",
19202
+ angle: 180,
19203
+ stops: [{
19204
+ color: "primary-500",
19205
+ position: 0
19206
+ }, {
19207
+ color: "primary-900",
19208
+ position: 100
19209
+ }]
19210
+ },
19211
+ {
19212
+ id: "primary-dark-light",
19213
+ name: "Primary Dark to Light",
19214
+ description: "Reverse primary fade",
19215
+ type: "linear",
19216
+ angle: 180,
19217
+ stops: [{
19218
+ color: "primary-900",
19219
+ position: 0
19220
+ }, {
19221
+ color: "primary-50",
19222
+ position: 100
19223
+ }]
19224
+ },
19225
+ {
19226
+ id: "secondary-light-dark",
19227
+ name: "Secondary Light to Dark",
19228
+ description: "Subtle secondary color fade",
19229
+ type: "linear",
19230
+ angle: 180,
19231
+ stops: [{
19232
+ color: "secondary-500",
19233
+ position: 0
19234
+ }, {
19235
+ color: "secondary-900",
19236
+ position: 100
19237
+ }]
19238
+ },
19239
+ {
19240
+ id: "accent-light-dark",
19241
+ name: "Accent Light to Dark",
19242
+ description: "Accent color depth fade",
19243
+ type: "linear",
19244
+ angle: 180,
19245
+ stops: [{
19246
+ color: "accent-500",
19247
+ position: 0
19248
+ }, {
19249
+ color: "accent-900",
19250
+ position: 100
19251
+ }]
19252
+ },
19253
+ {
19254
+ id: "background-surface",
19255
+ name: "Background to Surface",
19256
+ description: "Subtle depth using base colors",
19257
+ type: "linear",
19258
+ angle: 180,
19259
+ stops: [{
19260
+ color: "background",
19261
+ position: 0
19262
+ }, {
19263
+ color: "surface",
19264
+ position: 100
19265
+ }]
19266
+ },
19267
+ {
19268
+ id: "neutral-fade",
19269
+ name: "Neutral Gradient",
19270
+ description: "Elegant neutral color fade",
19271
+ type: "linear",
19272
+ angle: 180,
19273
+ stops: [{
19274
+ color: "neutral-900",
19275
+ position: 0
19276
+ }, {
19277
+ color: "neutral-50",
19278
+ position: 100
19279
+ }]
19280
+ },
19281
+ {
19282
+ id: "primary-glow",
19283
+ name: "Primary glow",
19284
+ description: "A soft top-centred glow using your primary palette",
19285
+ type: "radial",
19286
+ shape: "ellipse",
19287
+ position: "top center",
19288
+ stops: [{
19289
+ color: "primary-900",
19290
+ position: 0
19291
+ }, {
19292
+ color: "primary-950",
19293
+ position: 100
19294
+ }],
19295
+ foreground: {
19296
+ textColor: "onPrimary900",
19297
+ headingColor: "onPrimary900",
19298
+ linkColor: "onPrimary900",
19299
+ supportingColor: "onPrimary900"
19300
+ }
19301
+ },
19302
+ {
19303
+ id: "accent-glow",
19304
+ name: "Accent glow",
19305
+ description: "A soft top-centred glow using your accent palette",
19306
+ type: "radial",
19307
+ shape: "ellipse",
19308
+ position: "top center",
19309
+ stops: [{
19310
+ color: "accent-900",
19311
+ position: 0
19312
+ }, {
19313
+ color: "accent-950",
19314
+ position: 100
19315
+ }],
19316
+ foreground: {
19317
+ textColor: "onAccent900",
19318
+ headingColor: "onAccent900",
19319
+ linkColor: "onAccent900",
19320
+ supportingColor: "onAccent900"
19321
+ }
19322
+ },
19323
+ {
19324
+ id: "primary-secondary-accent",
19325
+ name: "Brand Trio",
19326
+ description: "All three brand colors in harmony",
19327
+ type: "linear",
19328
+ angle: 135,
19329
+ stops: [
19330
+ {
19331
+ color: "primary-500",
19332
+ position: 0
19333
+ },
19334
+ {
19335
+ color: "secondary-500",
19336
+ position: 50
19337
+ },
19338
+ {
19339
+ color: "accent-500",
19340
+ position: 100
19341
+ }
19342
+ ]
19343
+ }
19344
+ ].map((preset) => ({
19345
+ ...preset,
19346
+ id: preset.id,
19347
+ stops: preset.stops
19348
+ }));
19349
+ const GRADIENT_PRESET_IDS = GRADIENT_PRESETS.map((preset) => preset.id);
19350
+ const gradientPresetIdSet = new Set(GRADIENT_PRESET_IDS);
19351
+ const gradientPresetById = Object.fromEntries(GRADIENT_PRESETS.map((preset) => [preset.id, preset]));
19352
+ function parseGradientPresetId(value) {
19353
+ if (typeof value !== "string") return null;
19354
+ const normalized = value.trim();
19355
+ if (!gradientPresetIdSet.has(normalized)) return null;
19356
+ return normalized;
19357
+ }
19358
+ function getGradientPreset(id) {
19359
+ return gradientPresetById[id];
19360
+ }
19361
+ //#endregion
19362
+ //#region ../theme-core/src/gradients/utils.ts
19363
+ /**
19364
+ * Convert a GradientConfig to a CSS gradient string
19365
+ *
19366
+ * @param config - The gradient configuration using theme tokens
19367
+ * @param tokens - Map of theme color tokens to hex values
19368
+ * @returns CSS gradient string (e.g., "linear-gradient(180deg, #3b82f6 0%, #f59e0b 100%)")
19369
+ */
19370
+ function gradientToCss(config, tokens) {
19371
+ const stops = config.stops.map((stop) => {
19372
+ return `${tokens[stop.color] ?? "#000000"} ${stop.position}%`;
19373
+ }).join(", ");
19374
+ const type = config.type ?? "linear";
19375
+ if (type === "radial") {
19376
+ const position = config.position ?? "center";
19377
+ return `radial-gradient(${config.shape ?? "circle"} at ${position}, ${stops})`;
19378
+ }
19379
+ if (type === "conic") {
19380
+ const position = config.position ?? "center";
19381
+ return `conic-gradient(from ${config.angle ?? 0}deg at ${position}, ${stops})`;
19382
+ }
19383
+ return `linear-gradient(${config.angle ?? 180}deg, ${stops})`;
19384
+ }
18856
19385
  //#endregion
18857
19386
  //#region ../theme-core/src/site-styles/headerLooks.ts
18858
19387
  function asHeaderLookId(value) {
@@ -20896,6 +21425,19 @@ z$1.object({
20896
21425
  }).strict();
20897
21426
  //#endregion
20898
21427
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
21428
+ function defineSectionForegroundRuntimeTokens(input) {
21429
+ return {
21430
+ textColor: requireThemeColorToken(input.textColor),
21431
+ headingColor: requireThemeColorToken(input.headingColor),
21432
+ linkColor: requireThemeColorToken(input.linkColor),
21433
+ supportingColor: requireThemeColorToken(input.supportingColor)
21434
+ };
21435
+ }
21436
+ function requireThemeColorToken(value) {
21437
+ const token = parseThemeColorToken(value);
21438
+ if (!token) throw new Error(`Invalid section foreground Theme color token: ${String(value)}`);
21439
+ return token;
21440
+ }
20899
21441
  function defineDesignRuntimeRules(rules) {
20900
21442
  return rules;
20901
21443
  }
@@ -21166,24 +21708,24 @@ const kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
21166
21708
  type: "color",
21167
21709
  color: "muted"
21168
21710
  },
21169
- foreground: {
21711
+ foreground: defineSectionForegroundRuntimeTokens({
21170
21712
  textColor: "text",
21171
21713
  headingColor: "primary",
21172
21714
  linkColor: "primary",
21173
21715
  supportingColor: "text"
21174
- }
21716
+ })
21175
21717
  },
21176
21718
  "brand-depth-band": {
21177
21719
  background: {
21178
21720
  type: "color",
21179
21721
  color: "primary-800"
21180
21722
  },
21181
- foreground: {
21723
+ foreground: defineSectionForegroundRuntimeTokens({
21182
21724
  textColor: "text",
21183
21725
  headingColor: "primary",
21184
21726
  linkColor: "primary",
21185
21727
  supportingColor: "text"
21186
- }
21728
+ })
21187
21729
  },
21188
21730
  "hero-image": {
21189
21731
  background: {
@@ -21191,12 +21733,32 @@ const kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
21191
21733
  opacity: 1,
21192
21734
  position: "center center"
21193
21735
  },
21194
- foreground: {
21736
+ foreground: defineSectionForegroundRuntimeTokens({
21195
21737
  textColor: "text",
21196
21738
  headingColor: "primary",
21197
21739
  linkColor: "primary",
21198
21740
  supportingColor: "text"
21199
- }
21741
+ })
21742
+ }
21743
+ }
21744
+ });
21745
+ const primaryGlowGradientPresetId = parseGradientPresetId("primary-glow");
21746
+ if (!primaryGlowGradientPresetId) throw new Error("Expected primary-glow in the Theme Core gradient catalog");
21747
+ const fulcrumDesignRuntimeRules = defineDesignRuntimeRules({
21748
+ ...defaultDesignRuntimeRules,
21749
+ sectionSurfaces: {
21750
+ ...defaultDesignRuntimeRules.sectionSurfaces,
21751
+ "accent-band": {
21752
+ background: {
21753
+ type: "gradient",
21754
+ gradientPresetId: primaryGlowGradientPresetId
21755
+ },
21756
+ foreground: defineSectionForegroundRuntimeTokens({
21757
+ textColor: "primaryForeground",
21758
+ headingColor: "primaryForeground",
21759
+ linkColor: "primaryForeground",
21760
+ supportingColor: "primaryForeground"
21761
+ })
21200
21762
  }
21201
21763
  }
21202
21764
  });
@@ -22584,6 +23146,8 @@ const curatedSiteStyles = [
22584
23146
  },
22585
23147
  compositionBudget: quietBudget,
22586
23148
  typography: fulcrumTypography,
23149
+ designRuntimeRules: fulcrumDesignRuntimeRules,
23150
+ recommendedAppearancePresetIds: ["cta-accent-band"],
22587
23151
  themeOverrides: {
22588
23152
  shadow: { colorToken: "primary" },
22589
23153
  accordions: {
@@ -22956,213 +23520,6 @@ z$1.object({
22956
23520
  spacing: z$1.enum(themeTokenRecipeOptions.spacing),
22957
23521
  motion: z$1.enum(themeTokenRecipeOptions.motion)
22958
23522
  });
22959
- //#endregion
22960
- //#region ../theme-core/src/gradients/presets.ts
22961
- /**
22962
- * Curated library of gradient presets
22963
- * All gradients use theme color tokens, so they adapt to the site's palette
22964
- */
22965
- const GRADIENT_PRESETS = [
22966
- {
22967
- id: "primary-secondary",
22968
- name: "Primary to Secondary",
22969
- description: "Blend your primary and secondary brand colors",
22970
- type: "linear",
22971
- angle: 135,
22972
- stops: [{
22973
- color: "primary-500",
22974
- position: 0
22975
- }, {
22976
- color: "secondary-500",
22977
- position: 100
22978
- }]
22979
- },
22980
- {
22981
- id: "primary-accent",
22982
- name: "Primary to Accent",
22983
- description: "Energetic gradient from primary to accent",
22984
- type: "linear",
22985
- angle: 135,
22986
- stops: [{
22987
- color: "primary-500",
22988
- position: 0
22989
- }, {
22990
- color: "accent-500",
22991
- position: 100
22992
- }]
22993
- },
22994
- {
22995
- id: "secondary-accent",
22996
- name: "Secondary to Accent",
22997
- description: "Vibrant secondary to accent blend",
22998
- type: "linear",
22999
- angle: 135,
23000
- stops: [{
23001
- color: "secondary-500",
23002
- position: 0
23003
- }, {
23004
- color: "accent-500",
23005
- position: 100
23006
- }]
23007
- },
23008
- {
23009
- id: "primary-light-dark",
23010
- name: "Primary Light to Dark",
23011
- description: "Subtle primary color fade",
23012
- type: "linear",
23013
- angle: 180,
23014
- stops: [{
23015
- color: "primary-500",
23016
- position: 0
23017
- }, {
23018
- color: "primary-900",
23019
- position: 100
23020
- }]
23021
- },
23022
- {
23023
- id: "primary-dark-light",
23024
- name: "Primary Dark to Light",
23025
- description: "Reverse primary fade",
23026
- type: "linear",
23027
- angle: 180,
23028
- stops: [{
23029
- color: "primary-900",
23030
- position: 0
23031
- }, {
23032
- color: "primary-50",
23033
- position: 100
23034
- }]
23035
- },
23036
- {
23037
- id: "secondary-light-dark",
23038
- name: "Secondary Light to Dark",
23039
- description: "Subtle secondary color fade",
23040
- type: "linear",
23041
- angle: 180,
23042
- stops: [{
23043
- color: "secondary-500",
23044
- position: 0
23045
- }, {
23046
- color: "secondary-900",
23047
- position: 100
23048
- }]
23049
- },
23050
- {
23051
- id: "accent-light-dark",
23052
- name: "Accent Light to Dark",
23053
- description: "Accent color depth fade",
23054
- type: "linear",
23055
- angle: 180,
23056
- stops: [{
23057
- color: "accent-500",
23058
- position: 0
23059
- }, {
23060
- color: "accent-900",
23061
- position: 100
23062
- }]
23063
- },
23064
- {
23065
- id: "background-surface",
23066
- name: "Background to Surface",
23067
- description: "Subtle depth using base colors",
23068
- type: "linear",
23069
- angle: 180,
23070
- stops: [{
23071
- color: "background",
23072
- position: 0
23073
- }, {
23074
- color: "surface",
23075
- position: 100
23076
- }]
23077
- },
23078
- {
23079
- id: "neutral-fade",
23080
- name: "Neutral Gradient",
23081
- description: "Elegant neutral color fade",
23082
- type: "linear",
23083
- angle: 180,
23084
- stops: [{
23085
- color: "neutral-900",
23086
- position: 0
23087
- }, {
23088
- color: "neutral-50",
23089
- position: 100
23090
- }]
23091
- },
23092
- {
23093
- id: "primary-radial",
23094
- name: "Primary Spotlight",
23095
- description: "Radial primary gradient from center",
23096
- type: "radial",
23097
- position: "center",
23098
- stops: [{
23099
- color: "primary-500",
23100
- position: 0
23101
- }, {
23102
- color: "primary-900",
23103
- position: 100
23104
- }]
23105
- },
23106
- {
23107
- id: "accent-radial",
23108
- name: "Accent Spotlight",
23109
- description: "Radial accent gradient from center",
23110
- type: "radial",
23111
- position: "center",
23112
- stops: [{
23113
- color: "accent-500",
23114
- position: 0
23115
- }, {
23116
- color: "accent-900",
23117
- position: 100
23118
- }]
23119
- },
23120
- {
23121
- id: "primary-secondary-accent",
23122
- name: "Brand Trio",
23123
- description: "All three brand colors in harmony",
23124
- type: "linear",
23125
- angle: 135,
23126
- stops: [
23127
- {
23128
- color: "primary-500",
23129
- position: 0
23130
- },
23131
- {
23132
- color: "secondary-500",
23133
- position: 50
23134
- },
23135
- {
23136
- color: "accent-500",
23137
- position: 100
23138
- }
23139
- ]
23140
- }
23141
- ];
23142
- //#endregion
23143
- //#region ../theme-core/src/gradients/utils.ts
23144
- /**
23145
- * Convert a GradientConfig to a CSS gradient string
23146
- *
23147
- * @param config - The gradient configuration using theme tokens
23148
- * @param tokens - Map of theme color tokens to hex values
23149
- * @returns CSS gradient string (e.g., "linear-gradient(180deg, #3b82f6 0%, #f59e0b 100%)")
23150
- */
23151
- function gradientToCss(config, tokens) {
23152
- const stops = config.stops.map((stop) => {
23153
- return `${tokens[stop.color] ?? "#000000"} ${stop.position}%`;
23154
- }).join(", ");
23155
- const type = config.type ?? "linear";
23156
- if (type === "radial") {
23157
- const position = config.position ?? "center";
23158
- return `radial-gradient(${config.shape ?? "circle"} at ${position}, ${stops})`;
23159
- }
23160
- if (type === "conic") {
23161
- const position = config.position ?? "center";
23162
- return `conic-gradient(from ${config.angle ?? 0}deg at ${position}, ${stops})`;
23163
- }
23164
- return `linear-gradient(${config.angle ?? 180}deg, ${stops})`;
23165
- }
23166
23523
  const BREAKPOINT_LG = 1024;
23167
23524
  const BREAKPOINT_XL = 1280;
23168
23525
  const BREAKPOINT_LG_DOWN = BREAKPOINT_LG - 1;
@@ -24129,6 +24486,20 @@ const blockCategoryEnum = z$1.enum([
24129
24486
  "layout",
24130
24487
  "interactive"
24131
24488
  ]);
24489
+ const blockContentSourceSchema = z$1.object({
24490
+ kind: z$1.enum([
24491
+ "inline",
24492
+ "entries",
24493
+ "mixed"
24494
+ ]),
24495
+ contentType: z$1.string().min(1).optional()
24496
+ }).superRefine((value, ctx) => {
24497
+ if (value.kind === "inline" && value.contentType) ctx.addIssue({
24498
+ code: z$1.ZodIssueCode.custom,
24499
+ path: ["contentType"],
24500
+ message: "contentType is not allowed when contentSource.kind is \"inline\""
24501
+ });
24502
+ });
24132
24503
  z$1.object({
24133
24504
  name: z$1.string().min(1),
24134
24505
  version: z$1.string().min(1),
@@ -24159,6 +24530,12 @@ z$1.object({
24159
24530
  }).optional()).optional(),
24160
24531
  category: blockCategoryEnum.optional(),
24161
24532
  contentTypes: z$1.array(z$1.string()).optional(),
24533
+ /**
24534
+ * Explicit content-source classification (inline / entries / mixed). Optional at the
24535
+ * schema level for backward compatibility with SDK-defined custom blocks, but every
24536
+ * registered SYSTEM block must declare it (enforced by a registry-wide test).
24537
+ */
24538
+ contentSource: blockContentSourceSchema.optional(),
24162
24539
  tags: z$1.array(z$1.string()).optional(),
24163
24540
  icon: z$1.string().optional()
24164
24541
  });
@@ -27281,9 +27658,15 @@ function createButtonGroup(options = {}) {
27281
27658
  //#endregion
27282
27659
  //#region ../blocks/src/system/fields/ctas.ts
27283
27660
  function createCtasRepeater(options = {}) {
27284
- const { id = "ctas", label = "Calls to action", itemLabel = "CTA", minItems = 0, maxItems, button } = options;
27661
+ const { id = "ctas", label = "Calls to action", itemLabel = "CTA", minItems = 0, maxItems, button, defaultValue } = options;
27662
+ const fieldId = id;
27663
+ const buttonField = createButtonGroup({
27664
+ showGroupLabel: false,
27665
+ ...button ?? {},
27666
+ flattenInRepeater: true
27667
+ });
27285
27668
  return {
27286
- id,
27669
+ id: fieldId,
27287
27670
  type: "repeater",
27288
27671
  label,
27289
27672
  itemLabel,
@@ -27292,11 +27675,8 @@ function createCtasRepeater(options = {}) {
27292
27675
  maxItems,
27293
27676
  required: false,
27294
27677
  allowConversion: true,
27295
- schema: { fields: [createButtonGroup({
27296
- showGroupLabel: false,
27297
- ...button ?? {},
27298
- flattenInRepeater: true
27299
- })] }
27678
+ ...defaultValue !== void 0 ? { defaultValue: [...defaultValue] } : {},
27679
+ schema: { fields: [buttonField] }
27300
27680
  };
27301
27681
  }
27302
27682
  //#endregion
@@ -27346,6 +27726,7 @@ const heroCtaRowFragment = defineFragment({
27346
27726
  label: "Calls to action",
27347
27727
  itemLabel: "CTA",
27348
27728
  maxItems: 3,
27729
+ defaultValue: [],
27349
27730
  button: {
27350
27731
  variants: [
27351
27732
  {
@@ -27413,7 +27794,7 @@ const ctaCopyFragment = defineFragment({
27413
27794
  eyebrowPath: "content.eyebrow",
27414
27795
  titlePath: "content.title",
27415
27796
  className: "cta-heading"
27416
- }), richText({ className: "cta-content rb-prose rb-mx-auto rb-max-w-none" }, when("content.content"), bind("content.content"))]
27797
+ }), richText({ className: "cta-content rb-prose rb-mx-auto rb-max-w-none" }, when("content"), bind("content"))]
27417
27798
  });
27418
27799
  //#endregion
27419
27800
  //#region ../blocks/src/system/fragments/library/testimonialsHeading.ts
@@ -29145,6 +29526,7 @@ function createBlockManifest(config) {
29145
29526
  previewCustomize: config.previewCustomize,
29146
29527
  category: config.category,
29147
29528
  contentTypes: config.contentTypes ? [...config.contentTypes] : void 0,
29529
+ contentSource: config.contentSource,
29148
29530
  tags: config.tags ? [...config.tags] : [],
29149
29531
  icon: config.icon ?? "Box",
29150
29532
  layout,
@@ -29290,6 +29672,7 @@ const heroBlockDefinition = { manifest: createBlockManifest({
29290
29672
  title: "Hero",
29291
29673
  titleSource: "headline",
29292
29674
  category: "layout",
29675
+ contentSource: { kind: "inline" },
29293
29676
  includeContainerStyles: true,
29294
29677
  promotedFields: ["_sectionStyles.background.image"],
29295
29678
  fragments: [
@@ -29563,6 +29946,7 @@ const introBlockDefinition = { manifest: createBlockManifest({
29563
29946
  id: "block.intro",
29564
29947
  title: "Intro",
29565
29948
  category: "layout",
29949
+ contentSource: { kind: "inline" },
29566
29950
  includeContainerStyles: true,
29567
29951
  titleSource: "title",
29568
29952
  previewCustomize: { quickFieldPriority: [
@@ -29748,6 +30132,7 @@ const bodyTextBlockDefinition = { manifest: createBlockManifest({
29748
30132
  title: "Body Text",
29749
30133
  titleSource: "heading",
29750
30134
  category: "content",
30135
+ contentSource: { kind: "inline" },
29751
30136
  fragments: [{
29752
30137
  fragment: bodyCopyFragment,
29753
30138
  fieldPriority: 0
@@ -29804,6 +30189,10 @@ const blogPostBlockDefinition = {
29804
30189
  description: "Highlights a single blog post with title, image, and excerpt.",
29805
30190
  category: "blog",
29806
30191
  contentTypes: ["post"],
30192
+ contentSource: {
30193
+ kind: "entries",
30194
+ contentType: "post"
30195
+ },
29807
30196
  tags: [
29808
30197
  "blog",
29809
30198
  "post",
@@ -30101,6 +30490,10 @@ const blogListingManifest = createBlockManifest({
30101
30490
  ],
30102
30491
  description: "Display a collection of blog posts in grid or stack layout.",
30103
30492
  contentTypes: ["post"],
30493
+ contentSource: {
30494
+ kind: "entries",
30495
+ contentType: "post"
30496
+ },
30104
30497
  tags: [
30105
30498
  "blog",
30106
30499
  "posts",
@@ -30143,6 +30536,7 @@ const ctaFullBlockDefinition = { manifest: createBlockManifest({
30143
30536
  id: "block.cta-full",
30144
30537
  title: "Full-width CTA",
30145
30538
  category: "marketing",
30539
+ contentSource: { kind: "inline" },
30146
30540
  fragments: [{
30147
30541
  fragment: ctaCopyFragment,
30148
30542
  fieldPriority: 0
@@ -30176,6 +30570,7 @@ const singleButtonBlockDefinition = { manifest: createBlockManifest({
30176
30570
  id: "block.single-button",
30177
30571
  title: "Single Button",
30178
30572
  category: "marketing",
30573
+ contentSource: { kind: "inline" },
30179
30574
  fragments: [{
30180
30575
  fragment: singleButtonFragment,
30181
30576
  fieldPriority: 0
@@ -30436,6 +30831,7 @@ const formManifest = createBlockManifest({
30436
30831
  paletteHidden: false
30437
30832
  },
30438
30833
  category: "interactive",
30834
+ contentSource: { kind: "inline" },
30439
30835
  tags: [
30440
30836
  "form",
30441
30837
  "contact",
@@ -30498,6 +30894,7 @@ const contactNewsletterBlockDefinition = {
30498
30894
  titleSource: "contactTitle",
30499
30895
  description: "Two-column newsletter signup and contact form section.",
30500
30896
  category: "interactive",
30897
+ contentSource: { kind: "inline" },
30501
30898
  layout: contactNewsletterLayout,
30502
30899
  defaultVariant: "default",
30503
30900
  variants: { default: contactNewsletterLayout },
@@ -30701,6 +31098,7 @@ const faqBlockDefinition = { manifest: createBlockManifest({
30701
31098
  title: "FAQ",
30702
31099
  titleSource: "title",
30703
31100
  category: "content",
31101
+ contentSource: { kind: "inline" },
30704
31102
  includeContainerStyles: true,
30705
31103
  fragments: [{
30706
31104
  fragment: faqHeadingFragment,
@@ -32344,6 +32742,7 @@ const siteHeaderBlockDefinition = { manifest: createBlockManifest({
32344
32742
  id: "block.site-header",
32345
32743
  title: "Site Header",
32346
32744
  category: "layout",
32745
+ contentSource: { kind: "inline" },
32347
32746
  additionalFields: [{
32348
32747
  id: "mode",
32349
32748
  type: "select",
@@ -32548,6 +32947,7 @@ const siteFooterBlockDefinition = { manifest: createBlockManifest({
32548
32947
  id: "block.site-footer",
32549
32948
  title: "Site Footer",
32550
32949
  category: "layout",
32950
+ contentSource: { kind: "inline" },
32551
32951
  skipSectionStyles: true,
32552
32952
  layout: section({
32553
32953
  background: "background",
@@ -32697,6 +33097,7 @@ const testimonialsBlockDefinition = {
32697
33097
  id: "block.testimonials",
32698
33098
  title: "Testimonials",
32699
33099
  category: "marketing",
33100
+ contentSource: { kind: "inline" },
32700
33101
  includeContainerStyles: true,
32701
33102
  previewCustomize: { quickFieldPriority: [
32702
33103
  "avatarLayout",
@@ -32855,6 +33256,7 @@ const columnsBlockDefinition = { manifest: createBlockManifest({
32855
33256
  id: "block.columns",
32856
33257
  title: "Columns",
32857
33258
  category: "layout",
33259
+ contentSource: { kind: "inline" },
32858
33260
  additionalFields: [
32859
33261
  parseFieldDefinition({
32860
33262
  id: "equalHeight",
@@ -33088,6 +33490,7 @@ const collectionBlockDefinition = { manifest: createBlockManifest({
33088
33490
  id: "block.collection",
33089
33491
  title: "Collection",
33090
33492
  category: "layout",
33493
+ contentSource: { kind: "inline" },
33091
33494
  additionalFields: [
33092
33495
  parseFieldDefinition({
33093
33496
  id: "layout",
@@ -33324,6 +33727,7 @@ const featureCardsBlockDefinition = { manifest: createBlockManifest({
33324
33727
  id: "block.feature-cards",
33325
33728
  title: "Feature Cards",
33326
33729
  category: "layout",
33730
+ contentSource: { kind: "inline" },
33327
33731
  includeContainerStyles: true,
33328
33732
  titleSource: "title",
33329
33733
  additionalFields: [
@@ -33707,6 +34111,7 @@ const mediaTextBlockDefinition = { manifest: createBlockManifest({
33707
34111
  id: "block.media-text",
33708
34112
  title: "Media and Text",
33709
34113
  category: "layout",
34114
+ contentSource: { kind: "inline" },
33710
34115
  includeContainerStyles: true,
33711
34116
  titleSource: "title",
33712
34117
  previewCustomize: { quickFieldPriority: [
@@ -34107,6 +34512,7 @@ const appointmentBookingBlockDefinition = {
34107
34512
  paletteHidden: false
34108
34513
  },
34109
34514
  category: "interactive",
34515
+ contentSource: { kind: "inline" },
34110
34516
  tags: [
34111
34517
  "booking",
34112
34518
  "appointment",
@@ -34271,6 +34677,7 @@ const weeklySlotAvailabilityManifest = createBlockManifest({
34271
34677
  paletteHidden: false
34272
34678
  },
34273
34679
  category: "interactive",
34680
+ contentSource: { kind: "inline" },
34274
34681
  tags: [
34275
34682
  "booking",
34276
34683
  "appointment",
@@ -35863,6 +36270,7 @@ const eventRegistrationBlockDefinition = {
35863
36270
  titleSource: "heading",
35864
36271
  description: "Multi-step event registration form",
35865
36272
  category: "interactive",
36273
+ contentSource: { kind: "inline" },
35866
36274
  tags: [
35867
36275
  "events",
35868
36276
  "registration",
@@ -35969,15 +36377,9 @@ const eventRegistrationBlockDefinition = {
35969
36377
  defaultValue: "Complete Registration",
35970
36378
  maxLength: 40
35971
36379
  },
35972
- {
35973
- id: "buttonVariant",
35974
- type: "select",
35975
- label: "Button style",
36380
+ createButtonVariantField({
35976
36381
  description: "Choose a button style from your theme",
35977
- required: false,
35978
- multiple: false,
35979
- defaultValue: "primary",
35980
- options: [
36382
+ variants: [
35981
36383
  {
35982
36384
  value: "primary",
35983
36385
  label: "Primary"
@@ -35990,9 +36392,8 @@ const eventRegistrationBlockDefinition = {
35990
36392
  value: "outline",
35991
36393
  label: "Outline"
35992
36394
  }
35993
- ],
35994
- ui: { intent: "style" }
35995
- }
36395
+ ]
36396
+ })
35996
36397
  ],
35997
36398
  layout: [styledSection({
35998
36399
  baseClass: "",
@@ -36185,6 +36586,7 @@ const courseRegistrationBlockDefinition = {
36185
36586
  titleSource: "heading",
36186
36587
  description: "Enrollment form for multi-session courses",
36187
36588
  category: "interactive",
36589
+ contentSource: { kind: "inline" },
36188
36590
  tags: [
36189
36591
  "courses",
36190
36592
  "enrollment",
@@ -36298,15 +36700,9 @@ const courseRegistrationBlockDefinition = {
36298
36700
  defaultValue: "Sign up",
36299
36701
  maxLength: 40
36300
36702
  },
36301
- {
36302
- id: "buttonVariant",
36303
- type: "select",
36304
- label: "Button style",
36703
+ createButtonVariantField({
36305
36704
  description: "Choose a button style from your theme",
36306
- required: false,
36307
- multiple: false,
36308
- defaultValue: "primary",
36309
- options: [
36705
+ variants: [
36310
36706
  {
36311
36707
  value: "primary",
36312
36708
  label: "Primary"
@@ -36319,9 +36715,8 @@ const courseRegistrationBlockDefinition = {
36319
36715
  value: "outline",
36320
36716
  label: "Outline"
36321
36717
  }
36322
- ],
36323
- ui: { intent: "style" }
36324
- }
36718
+ ]
36719
+ })
36325
36720
  ],
36326
36721
  layout: [styledSection({
36327
36722
  baseClass: "",
@@ -36401,6 +36796,7 @@ const eventDetailsManifest = createBlockManifest({
36401
36796
  titleSource: "heading",
36402
36797
  description: "Date/time, venue, map, and other dates for an event",
36403
36798
  category: "content",
36799
+ contentSource: { kind: "entries" },
36404
36800
  tags: [
36405
36801
  "events",
36406
36802
  "venue",
@@ -36606,6 +37002,7 @@ const courseDetailsBlockDefinition = {
36606
37002
  titleSource: "heading",
36607
37003
  description: "Schedule, venue, price, and enrollment status for a course",
36608
37004
  category: "content",
37005
+ contentSource: { kind: "entries" },
36609
37006
  tags: [
36610
37007
  "courses",
36611
37008
  "schedule",
@@ -36897,6 +37294,7 @@ const eventSpotlightBlockDefinition = {
36897
37294
  paletteHidden: false
36898
37295
  },
36899
37296
  category: "content",
37297
+ contentSource: { kind: "entries" },
36900
37298
  tags: [
36901
37299
  "events",
36902
37300
  "featured",
@@ -37443,6 +37841,7 @@ const eventListingBlockDefinition = {
37443
37841
  paletteHidden: true
37444
37842
  },
37445
37843
  category: "interactive",
37844
+ contentSource: { kind: "entries" },
37446
37845
  tags: [
37447
37846
  "events",
37448
37847
  "listing",
@@ -38615,6 +39014,7 @@ const eventCalendarBlockDefinition = {
38615
39014
  paletteHidden: false
38616
39015
  },
38617
39016
  category: "interactive",
39017
+ contentSource: { kind: "entries" },
38618
39018
  tags: [
38619
39019
  "events",
38620
39020
  "calendar",
@@ -39012,6 +39412,7 @@ const recurringScheduleBlockDefinition = {
39012
39412
  titleSource: "heading",
39013
39413
  description: "A compact weekly schedule with one row per recurring series.",
39014
39414
  category: "interactive",
39415
+ contentSource: { kind: "entries" },
39015
39416
  icon: "CalendarDays",
39016
39417
  tags: [
39017
39418
  "schedule",
@@ -39429,7 +39830,10 @@ const offeringsPreviewFields = [
39429
39830
  label: "Link"
39430
39831
  }
39431
39832
  ],
39432
- ui: { intent: "display" }
39833
+ ui: {
39834
+ intent: "display",
39835
+ widget: "buttonVariant"
39836
+ }
39433
39837
  },
39434
39838
  {
39435
39839
  id: "buttonText",
@@ -39482,6 +39886,7 @@ const offeringsPreviewManifest = createBlockManifest({
39482
39886
  paletteHidden: false
39483
39887
  },
39484
39888
  category: "content",
39889
+ contentSource: { kind: "mixed" },
39485
39890
  tags: [
39486
39891
  "offerings",
39487
39892
  "events",
@@ -39650,6 +40055,7 @@ const embedManifest = createBlockManifest({
39650
40055
  id: "block.embed",
39651
40056
  title: "Embed Content",
39652
40057
  category: "content",
40058
+ contentSource: { kind: "entries" },
39653
40059
  titleSource: "heading",
39654
40060
  additionalFields: [
39655
40061
  parseFieldDefinition({
@@ -40137,6 +40543,7 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
40137
40543
  id: "block.image-gallery",
40138
40544
  title: "Image Gallery",
40139
40545
  category: "content",
40546
+ contentSource: { kind: "inline" },
40140
40547
  previewCustomize: { quickFieldPriority: [
40141
40548
  "aspectRatio",
40142
40549
  "slidesToShow",
@@ -40789,6 +41196,7 @@ const videoGridBlockDefinition = { manifest: createBlockManifest({
40789
41196
  id: "block.video-grid",
40790
41197
  title: "Video Grid",
40791
41198
  category: "media",
41199
+ contentSource: { kind: "inline" },
40792
41200
  skipSectionStyles: true,
40793
41201
  additionalFields: parseFieldDefinitions([
40794
41202
  {
@@ -40959,6 +41367,7 @@ const audioPlayerBlockDefinition = { manifest: createBlockManifest({
40959
41367
  title: "Audio Player",
40960
41368
  titleSource: "title",
40961
41369
  category: "media",
41370
+ contentSource: { kind: "inline" },
40962
41371
  description: "Add a branded audio player for a single track.",
40963
41372
  tags: [
40964
41373
  "audio",
@@ -41070,6 +41479,7 @@ const fileDownloadBlockDefinition = { manifest: createBlockManifest({
41070
41479
  title: "File Download",
41071
41480
  titleSource: ["title", "file.filename"],
41072
41481
  category: "media",
41482
+ contentSource: { kind: "inline" },
41073
41483
  description: "Add a simple public download link for a document, ZIP, or audio file.",
41074
41484
  tags: [
41075
41485
  "file",
@@ -42014,6 +42424,7 @@ const shopBlockDefinition = {
42014
42424
  paletteHidden: false
42015
42425
  },
42016
42426
  category: "interactive",
42427
+ contentSource: { kind: "entries" },
42017
42428
  tags: [
42018
42429
  "shop",
42019
42430
  "passes",
@@ -42213,6 +42624,7 @@ const productListBlockDefinition = {
42213
42624
  paletteHidden: false
42214
42625
  },
42215
42626
  category: "interactive",
42627
+ contentSource: { kind: "entries" },
42216
42628
  tags: [
42217
42629
  "shop",
42218
42630
  "products",
@@ -42354,6 +42766,7 @@ const productDetailBlockDefinition = {
42354
42766
  paletteHidden: false
42355
42767
  },
42356
42768
  category: "interactive",
42769
+ contentSource: { kind: "entries" },
42357
42770
  tags: [
42358
42771
  "shop",
42359
42772
  "product",
@@ -42470,6 +42883,7 @@ const cartBlockDefinition = {
42470
42883
  paletteHidden: false
42471
42884
  },
42472
42885
  category: "interactive",
42886
+ contentSource: { kind: "inline" },
42473
42887
  tags: [
42474
42888
  "shop",
42475
42889
  "cart",
@@ -42552,6 +42966,7 @@ const checkoutBlockDefinition = {
42552
42966
  paletteHidden: false
42553
42967
  },
42554
42968
  category: "interactive",
42969
+ contentSource: { kind: "inline" },
42555
42970
  tags: [
42556
42971
  "shop",
42557
42972
  "checkout",
@@ -42755,6 +43170,7 @@ const giftingBlockDefinition = {
42755
43170
  paletteHidden: false
42756
43171
  },
42757
43172
  category: "interactive",
43173
+ contentSource: { kind: "entries" },
42758
43174
  tags: [
42759
43175
  "gifting",
42760
43176
  "gift cards",
@@ -43118,6 +43534,7 @@ const newsletterSignupBlockDefinition = {
43118
43534
  titleSource: "title",
43119
43535
  description: "Newsletter subscription form with configurable field presets.",
43120
43536
  category: "interactive",
43537
+ contentSource: { kind: "inline" },
43121
43538
  fragments: [{
43122
43539
  fragment: newsletterCopyFragment,
43123
43540
  fieldPriority: 0
@@ -43299,6 +43716,7 @@ const teamMembersBlockDefinition = {
43299
43716
  id: "block.team-members",
43300
43717
  title: "Team Members",
43301
43718
  category: "content",
43719
+ contentSource: { kind: "mixed" },
43302
43720
  titleSource: "heading",
43303
43721
  additionalFields: [
43304
43722
  parseFieldDefinition({
@@ -43719,6 +44137,7 @@ const locationMapBlockDefinition = {
43719
44137
  titleSource: "heading",
43720
44138
  description: "Show a business location with an interactive map and directions link.",
43721
44139
  category: "content",
44140
+ contentSource: { kind: "inline" },
43722
44141
  tags: [
43723
44142
  "map",
43724
44143
  "location",
@@ -44834,9 +45253,9 @@ function appendBackgroundMediaClasses(baseClassName, input) {
44834
45253
  ].filter(Boolean).join(" ");
44835
45254
  }
44836
45255
  function gradientPresetCss(value) {
44837
- if (!isString(value)) return null;
44838
- const preset = GRADIENT_PRESETS.find((candidate) => candidate.id === value.trim());
44839
- if (!preset) return null;
45256
+ const presetId = parseGradientPresetId(value);
45257
+ if (!presetId) return null;
45258
+ const preset = getGradientPreset(presetId);
44840
45259
  return gradientToCss(preset, Object.fromEntries(preset.stops.map((stop) => [stop.color, `rgb(var(--tb-${stop.color}))`])));
44841
45260
  }
44842
45261
  const backgroundTransforms = [
@@ -45953,6 +46372,7 @@ const CANONICAL_REFUND_PLANNER_ERROR_CODES = [
45953
46372
  "already_refunded",
45954
46373
  "idempotency_amount_mismatch",
45955
46374
  "idempotency_method_mismatch",
46375
+ "idempotency_receipt_mismatch",
45956
46376
  "refund_in_progress"
45957
46377
  ],
45958
46378
  "invalid_amount",
@@ -45965,7 +46385,12 @@ const CANONICAL_ADMIN_REFUND_FAILURE_CODES = [
45965
46385
  "payment_intent_not_found",
45966
46386
  "stripe_error",
45967
46387
  "stale_pending_missing_context",
45968
- "non_refundable_deposit_remaining"
46388
+ "non_refundable_deposit_remaining",
46389
+ "deposit_refund_override_required",
46390
+ "refund_revoke_requires_full_line_refund",
46391
+ "payment_receipt_not_found",
46392
+ "payment_receipt_not_refundable",
46393
+ "payment_receipt_attribution_required"
45969
46394
  ];
45970
46395
  [...CANONICAL_REFUND_PLANNER_ERROR_CODES];
45971
46396
  //#endregion
@@ -45978,7 +46403,10 @@ const STANDARD_LINE_ITEM_REFUND_INVALID_CODES = [
45978
46403
  "missing_credit_customer",
45979
46404
  "deposit_refund_override_required",
45980
46405
  "refund_revoke_requires_full_line_refund",
45981
- "unified_order_link_required"
46406
+ "unified_order_link_required",
46407
+ "payment_receipt_not_found",
46408
+ "payment_receipt_not_refundable",
46409
+ "payment_receipt_attribution_required"
45982
46410
  ];
45983
46411
  const EVENT_ATTENDEE_REFUND_INVALID_CODES = ["manual_booking_not_refundable", ...STANDARD_LINE_ITEM_REFUND_INVALID_CODES];
45984
46412
  [...CANONICAL_ADMIN_REFUND_FAILURE_CODES];