@riverbankcms/sdk 0.125.0 → 0.127.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 (177) hide show
  1. package/README.md +3 -1
  2. package/dist/{PreviewEditorSidebar-BezDOtQ7.mjs → PreviewEditorSidebar-BXtfF7tp.mjs} +122 -301
  3. package/dist/{PreviewEditorUI-CgSqmfo2.mjs → PreviewEditorUI-Dou73Q0K.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-BH-3-jSj.mjs → PreviewQueryProvider-DgFDIwvK.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-Co3AHfj0.mjs → SdkPreviewModeRuntime-B0HPXr-l.mjs} +141 -63
  6. package/dist/{SiteChromeCustomizeContext-BHF-KANn.mjs → SiteChromeCustomizeContext-DZiDBAYu.mjs} +5330 -5841
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +1552 -202
  8. package/dist/_dts/api/src/common/envelope.d.ts +1 -1
  9. package/dist/_dts/api/src/contentRuntime.d.ts +1 -7
  10. package/dist/_dts/api/src/endpoints.d.ts +0 -7
  11. package/dist/_dts/api/src/sdk-event-upsert.d.ts +42 -0
  12. package/dist/_dts/api/src/sdkContracts.d.ts +11 -9
  13. package/dist/_dts/api/src/siteOperations.d.ts +18 -1
  14. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +1 -14
  15. package/dist/_dts/block-form/src/backend/store-backend.d.ts +2 -1
  16. package/dist/_dts/block-form/src/blockDraftSaveability.d.ts +1 -0
  17. package/dist/_dts/blocks/src/index.d.ts +3 -2
  18. package/dist/_dts/blocks/src/lib/media.d.ts +267 -0
  19. package/dist/_dts/blocks/src/system/constants/buttonRoles.d.ts +0 -13
  20. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationStripeReturn.d.ts +15 -2
  21. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +4 -4
  22. package/dist/_dts/blocks/src/system/runtime/nodes/mergeResolveImageUrlContexts.d.ts +7 -0
  23. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +2 -2
  24. package/dist/_dts/content-editor/src/ui/blockValidationManifestRegistry.d.ts +17 -0
  25. package/dist/_dts/content-editor/src/ui/blockValidationView.d.ts +1 -1
  26. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +4 -0
  27. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +322 -171
  28. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +4 -0
  29. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockValidationManifests.d.ts +26 -0
  30. package/dist/_dts/editor-blocks/src/widgets/rich-text/imageInsert.d.ts +3 -3
  31. package/dist/_dts/media-editor/src/MediaEditor.d.ts +2 -2
  32. package/dist/_dts/media-editor/src/context.d.ts +1 -2
  33. package/dist/_dts/media-editor/src/index.d.ts +3 -1
  34. package/dist/_dts/media-editor/src/mediaSelection.d.ts +32 -0
  35. package/dist/_dts/media-editor/src/types.d.ts +3 -1
  36. package/dist/_dts/media-editor/src/useMediaSelection.d.ts +26 -0
  37. package/dist/_dts/preview-next/src/client/index.d.ts +2 -0
  38. package/dist/_dts/preview-next/src/client/preview/HeaderMenuControls.d.ts +12 -0
  39. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +1 -2
  40. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +13 -3
  41. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +7 -2
  42. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +6 -60
  43. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.d.ts +3 -13
  44. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +8 -100
  45. package/dist/_dts/preview-next/src/client/preview/headerInteractionPaletteSurfaceState.d.ts +8 -0
  46. package/dist/_dts/preview-next/src/client/preview/previewThemeRoles.d.ts +15 -0
  47. package/dist/_dts/preview-next/src/client/preview/siteChromeCustomizeTypes.d.ts +54 -0
  48. package/dist/_dts/preview-next/src/client/preview/siteChromeLookRows.d.ts +13 -3
  49. package/dist/_dts/preview-next/src/client/preview/siteChromeNavQuickControlHistory.d.ts +3 -0
  50. package/dist/_dts/preview-next/src/client/preview/siteChromeQuickControlHistoryState.d.ts +6 -3
  51. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +1 -4
  52. package/dist/_dts/preview-next/src/client/preview/styleConfiguratorApplyPayload.d.ts +1 -15
  53. package/dist/_dts/preview-next/src/client/preview/styleConfiguratorSnapshot.d.ts +11 -21
  54. package/dist/_dts/sdk/src/cli/commands/event.d.ts +2 -2
  55. package/dist/_dts/sdk/src/cli/commands/eventOccurrenceSchedule.d.ts +12 -0
  56. package/dist/_dts/sdk/src/cli/commands/push/pushAllExtras.d.ts +6 -0
  57. package/dist/_dts/sdk/src/cli/commands/style.d.ts +1 -1
  58. package/dist/_dts/sdk/src/cli/content/legacyEventScheduleShapeError.d.ts +5 -0
  59. package/dist/_dts/sdk/src/cli/content/localEventSchedule.d.ts +17 -0
  60. package/dist/_dts/sdk/src/cli/content/reader.d.ts +5 -10
  61. package/dist/_dts/sdk/src/cli/migrations/events.d.ts +1 -1
  62. package/dist/_dts/sdk/src/cli/site-commands/eventScheduleCompiler.d.ts +24 -0
  63. package/dist/_dts/sdk/src/client/management/http.d.ts +1 -1
  64. package/dist/_dts/sdk/src/client/management/types.d.ts +3 -28
  65. package/dist/_dts/sdk/src/config/index.d.ts +1 -1
  66. package/dist/_dts/sdk/src/public-api/contracts.d.ts +5 -20
  67. package/dist/_dts/sdk/src/rendering/index.d.ts +1 -1
  68. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +2 -2
  69. package/dist/_dts/sdk/src/version.d.ts +1 -1
  70. package/dist/_dts/site-commands/src/commandContract.d.ts +33 -5
  71. package/dist/_dts/site-commands/src/commandDomain.d.ts +2 -2
  72. package/dist/_dts/site-commands/src/commands.d.ts +38 -9
  73. package/dist/_dts/site-commands/src/siteStyleCommandSchema.d.ts +28 -1
  74. package/dist/_dts/site-commands/src/siteStyleSelectionSchemaBuilder.d.ts +4 -4
  75. package/dist/_dts/theme-core/src/buttons/effects/presets/background.d.ts +1 -1
  76. package/dist/_dts/theme-core/src/buttons/styles/registry.d.ts +0 -18
  77. package/dist/_dts/theme-core/src/buttons/types.d.ts +1 -3
  78. package/dist/_dts/theme-core/src/header/containerSchema.d.ts +20 -0
  79. package/dist/_dts/theme-core/src/header/generateHeaderCss.d.ts +1 -1
  80. package/dist/_dts/theme-core/src/header/interactionPalette.d.ts +14 -0
  81. package/dist/_dts/theme-core/src/header/legacyNavLinkStyle.d.ts +3 -0
  82. package/dist/_dts/theme-core/src/header/paintTargets.d.ts +25 -0
  83. package/dist/_dts/theme-core/src/header/scrollTreatment.d.ts +11 -0
  84. package/dist/_dts/theme-core/src/header/surfaceRules.d.ts +9 -0
  85. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +15 -0
  86. package/dist/_dts/theme-core/src/palette/colors.d.ts +1 -1
  87. package/dist/_dts/theme-core/src/palette/concretePalette.d.ts +20 -0
  88. package/dist/_dts/theme-core/src/palette/curated/index.d.ts +2 -17
  89. package/dist/_dts/theme-core/src/palette/index.d.ts +1 -6
  90. package/dist/_dts/theme-core/src/palette/schema.d.ts +39 -0
  91. package/dist/_dts/theme-core/src/schema.d.ts +105 -45
  92. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +3 -51
  93. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +4 -11
  94. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +3 -51
  95. package/dist/_dts/theme-core/src/site-styles/headerInteractionPalette.d.ts +32 -0
  96. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +19 -106
  97. package/dist/_dts/theme-core/src/site-styles/headerOpeningForeground.d.ts +22 -0
  98. package/dist/_dts/theme-core/src/site-styles/headerOpeningSection.d.ts +2 -0
  99. package/dist/_dts/theme-core/src/site-styles/headerStyleParts.d.ts +4 -0
  100. package/dist/_dts/theme-core/src/site-styles/index.d.ts +3 -0
  101. package/dist/_dts/theme-core/src/site-styles/lookOptionGroups.d.ts +24 -0
  102. package/dist/_dts/theme-core/src/site-styles/lookResolution.d.ts +1 -2
  103. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +4 -22
  104. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorOptions.d.ts +21 -0
  105. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +5 -7
  106. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +5 -6
  107. package/dist/_dts/theme-core/src/site-styles/siteChromeNavPreferences.d.ts +4 -1
  108. package/dist/cli/index.mjs +1583 -1601
  109. package/dist/cli/init-docs/content/cli-reference.md +6 -3
  110. package/dist/cli/init-docs/content/content-management.md +24 -13
  111. package/dist/client/{DiscountCodeDisclosure-CyPpekBp.mjs → DiscountCodeDisclosure-BDFRp8Y7.mjs} +1 -1
  112. package/dist/client/{EventCombined.client-zywit-60.mjs → EventCombined.client-DJgF1_lf.mjs} +2 -2
  113. package/dist/client/{EventListing.client-J2nLhkKT.mjs → EventListing.client-CnWGNjOr.mjs} +2 -2
  114. package/dist/client/{LeafletStaticMap-CSubXWt6.mjs → LeafletStaticMap-BISs9Bl7.mjs} +1 -1
  115. package/dist/client/{MagicLinkForm-DDLIfiq9.mjs → MagicLinkForm-b5E_HoG9.mjs} +1 -1
  116. package/dist/client/{StepIndicator-DE8EvHIp.mjs → StepIndicator-D8gVYkK-.mjs} +2 -2
  117. package/dist/client/{accordion-Ct5T5NiA.mjs → accordion-DFDajgDz.mjs} +1 -1
  118. package/dist/client/{bookingForm-DMxtLPxw.mjs → bookingForm-Bdqj9-52.mjs} +5 -6
  119. package/dist/client/bookings.mjs +315 -46
  120. package/dist/client/{carousel--FMqgvob.mjs → carousel-Cvqf-kN8.mjs} +1 -1
  121. package/dist/client/{cart-BKX1bWiU.mjs → cart-CuH2TJXP.mjs} +3 -3
  122. package/dist/client/{checkout-B_jxi4WW.mjs → checkout-CMNPpejZ.mjs} +3 -3
  123. package/dist/client/client.mjs +1381 -1427
  124. package/dist/client/{courseRegistration-DH4MlkRD.mjs → courseRegistration-DTEYWL6Z.mjs} +6 -7
  125. package/dist/client/{eventCalendar-BQILwAcL.mjs → eventCalendar-BW-XoxZ0.mjs} +4 -4
  126. package/dist/client/{eventCombined-DFFW_Vmo.mjs → eventCombined-Bpn7s0y9.mjs} +2 -2
  127. package/dist/client/{eventDetails-B045CTSJ.mjs → eventDetails-D2uUSTMH.mjs} +3 -3
  128. package/dist/client/{eventListing-BDMYNVzS.mjs → eventListing-CVr1c094.mjs} +2 -2
  129. package/dist/client/{eventRegistration-CQ2-BSnB.mjs → eventRegistration-Dv4AvkMw.mjs} +30 -22
  130. package/dist/client/{form-DJKuyZgN.mjs → form-DxdKf9fs.mjs} +1 -1
  131. package/dist/client/{headerSection-DeTjfiDo.mjs → headerSection-BaXI5Sro.mjs} +2 -2
  132. package/dist/client/hooks.mjs +851 -976
  133. package/dist/client/{locationMap-i2wDA8gB.mjs → locationMap-BEtW2fKz.mjs} +2 -2
  134. package/dist/client/{newsletterForm-DKiueauk.mjs → newsletterForm-BKKs0S4R.mjs} +1 -1
  135. package/dist/client/{pricing-C01J3Epx.mjs → pricing-ClkqcElA.mjs} +1 -1
  136. package/dist/client/{productDetail-Dfc1sZaX.mjs → productDetail-H-ru8dyy.mjs} +3 -3
  137. package/dist/client/{productList-BXbvXWTF.mjs → productList-Buyi5c0C.mjs} +3 -3
  138. package/dist/client/{propsDecoder-CIR5DQ1l.mjs → propsDecoder-BF7i6Ijg.mjs} +293 -65
  139. package/dist/client/rendering/client.mjs +1145 -1190
  140. package/dist/client/rendering/islands.mjs +18 -18
  141. package/dist/client/rendering.mjs +1257 -1298
  142. package/dist/client/{useDiscountCodeUi-Bcyh4508.mjs → scrollToBlock-D_7t8yWb.mjs} +18 -2
  143. package/dist/client/{shop-BbNwPKM-.mjs → shop-CF7SZQNX.mjs} +5 -6
  144. package/dist/client/{shop-commerce-XO-XMFEt.mjs → shop-commerce-DA7_Rq5p.mjs} +4 -4
  145. package/dist/client/{shop-commerce-store-Byh6OUGK.mjs → shop-commerce-store-BmLqW7Gh.mjs} +1 -1
  146. package/dist/client/{shopShared-Bbq39mwr.mjs → shopShared-WL-E1znM.mjs} +2 -2
  147. package/dist/client/{useEventFilters-C8OOJ3el.mjs → useEventFilters-rc8VLeLV.mjs} +2 -2
  148. package/dist/client/{usePolling-CyJVo9kF.mjs → usePolling-1ncrfd4S.mjs} +2 -2
  149. package/dist/preview-next/before-render.mjs +0 -7
  150. package/dist/preview-next/client/runtime.mjs +4 -4
  151. package/dist/preview-next/middleware.mjs +0 -7
  152. package/dist/{previewAuthStore-CJX21dGi.mjs → previewAuthStore-Dev9CdG9.mjs} +0 -7
  153. package/dist/{sdk-runtime-BGhyuE-E.mjs → sdk-runtime-BnrCCFJq.mjs} +2 -2
  154. package/dist/{separator-BFs-Kmv5.mjs → separator-CFvBx2yl.mjs} +1 -1
  155. package/dist/server/components.mjs +1389 -1489
  156. package/dist/server/config-validation.mjs +851 -976
  157. package/dist/server/config.mjs +851 -976
  158. package/dist/server/data.mjs +851 -976
  159. package/dist/server/index.mjs +1 -8
  160. package/dist/server/next.mjs +1393 -1500
  161. package/dist/server/page-converter.mjs +851 -976
  162. package/dist/server/prebuild.mjs +1 -1
  163. package/dist/server/rendering/server.mjs +1346 -1446
  164. package/dist/server/rendering.mjs +1390 -1490
  165. package/dist/server/routing.mjs +939 -1041
  166. package/dist/server/server.mjs +852 -984
  167. package/dist/server/theme-bridge.mjs +322 -279
  168. package/dist/server/theme.mjs +277 -33
  169. package/package.json +1 -1
  170. package/dist/_dts/editor-blocks/src/widgets/rich-text/ensureRichTextImageAssetIdentifier.d.ts +0 -8
  171. package/dist/_dts/theme-core/src/palette/editorState.d.ts +0 -75
  172. package/dist/_dts/theme-core/src/palette/libraryModel.d.ts +0 -64
  173. package/dist/_dts/theme-core/src/palette/persistenceReadSource.d.ts +0 -81
  174. package/dist/_dts/theme-core/src/palette/resolveSelection.d.ts +0 -75
  175. package/dist/_dts/theme-core/src/palette/selection.d.ts +0 -74
  176. package/dist/_dts/theme-core/src/palette/sitePalettePersistence.d.ts +0 -34
  177. package/dist/client/scrollToBlock-C86BYkyV.mjs +0 -17
@@ -950,7 +950,7 @@ var init_demo_runtime = __esmMin((() => {}));
950
950
  var init_collections = __esmMin((() => {}));
951
951
  //#endregion
952
952
  //#region ../core/src/assert-never.ts
953
- function assertNever$25(value, message = "Unexpected variant") {
953
+ function assertNever$24(value, message = "Unexpected variant") {
954
954
  throw new Error(`${message}: ${String(value)}`);
955
955
  }
956
956
  var init_assert_never = __esmMin((() => {}));
@@ -1062,7 +1062,7 @@ function formatCoursePriceDisplayLabel(display, options) {
1062
1062
  case "exact": return `Course (${formatCurrencyAmount(display.amount, display.currency, options)})`;
1063
1063
  case "from": return `Course (From ${formatCurrencyAmount(display.amount, display.currency, options)})`;
1064
1064
  case "range": return `Course (${formatCurrencyAmount(display.minAmount, display.currency, options)} - ${formatCurrencyAmount(display.maxAmount, display.currency, options)})`;
1065
- default: return assertNever$25(display);
1065
+ default: return assertNever$24(display);
1066
1066
  }
1067
1067
  }
1068
1068
  /**
@@ -1082,7 +1082,7 @@ function formatBookingPriceDisplay(display, options = {}) {
1082
1082
  case "unavailable": return "Pricing unavailable";
1083
1083
  case "external": return display.label;
1084
1084
  case "course": return formatCoursePriceDisplayLabel(display.display, options);
1085
- default: return assertNever$25(display);
1085
+ default: return assertNever$24(display);
1086
1086
  }
1087
1087
  }
1088
1088
  /** Render an event's price directly from its pricing value. */
@@ -1161,10 +1161,10 @@ function resolveFlexibleBalanceDueAt(input) {
1161
1161
  switch (input.dueDateRule.kind) {
1162
1162
  case "relative_to_start_date": return subtractDaysFromIso(input.bookingStartAt, input.dueDateRule.daysBeforeStart);
1163
1163
  case "fixed_calendar_date": return input.dueDateRule.dueAt;
1164
- default: return assertNever$24(input.dueDateRule);
1164
+ default: return assertNever$23(input.dueDateRule);
1165
1165
  }
1166
1166
  }
1167
- function assertNever$24(value) {
1167
+ function assertNever$23(value) {
1168
1168
  throw new Error(`Unexpected value: ${String(value)}`);
1169
1169
  }
1170
1170
  var init_booking_flexible_balance = __esmMin((() => {
@@ -1178,7 +1178,7 @@ function isDepositBearingBookingInstalmentPlan(plan) {
1178
1178
  case "deposit_plus_one_remainder":
1179
1179
  case "deposit_plus_scheduled_instalments": return true;
1180
1180
  case "equal_scheduled_instalments": return false;
1181
- default: return assertNever$23(plan);
1181
+ default: return assertNever$22(plan);
1182
1182
  }
1183
1183
  }
1184
1184
  function getBookingInstalmentDepositRefundability(plan) {
@@ -1204,7 +1204,7 @@ function addIntervalPreservingMonthAnchor(isoString, intervalCount, intervalUnit
1204
1204
  date.setUTCDate(date.getUTCDate() + intervalCount * 7);
1205
1205
  return date.toISOString();
1206
1206
  case "month": return addMonthsPreservingAnchorDay(date, intervalCount).toISOString();
1207
- default: return assertNever$23(intervalUnit);
1207
+ default: return assertNever$22(intervalUnit);
1208
1208
  }
1209
1209
  }
1210
1210
  function getBookingInstalmentPlanIntervalCount(plan) {
@@ -1212,7 +1212,7 @@ function getBookingInstalmentPlanIntervalCount(plan) {
1212
1212
  case "deposit_plus_one_remainder": return plan.remainderDueCount;
1213
1213
  case "deposit_plus_scheduled_instalments":
1214
1214
  case "equal_scheduled_instalments": return plan.intervalCount;
1215
- default: return assertNever$23(plan);
1215
+ default: return assertNever$22(plan);
1216
1216
  }
1217
1217
  }
1218
1218
  function omitZeroAmountFutureRows(rows) {
@@ -1228,7 +1228,7 @@ function addMonthsPreservingAnchorDay(date, intervalCount) {
1228
1228
  nextMonth.setUTCDate(Math.min(anchorDay, lastDayOfTargetMonth));
1229
1229
  return nextMonth;
1230
1230
  }
1231
- function assertNever$23(value) {
1231
+ function assertNever$22(value) {
1232
1232
  throw new Error(`Unexpected value: ${String(value)}`);
1233
1233
  }
1234
1234
  var init_booking_instalments = __esmMin((() => {}));
@@ -1472,9 +1472,20 @@ function getLocalScheduleDate(date, timeZone) {
1472
1472
  day: parts.day
1473
1473
  };
1474
1474
  }
1475
+ function getLocalScheduleTime(date, timeZone) {
1476
+ const parts = getZonedDateTimeParts(date, getSafeTimeZone(timeZone));
1477
+ return {
1478
+ hour: parts.hour,
1479
+ minute: parts.minute,
1480
+ second: parts.second
1481
+ };
1482
+ }
1475
1483
  function formatLocalScheduleDate(date) {
1476
1484
  return formatDateKey$1(date);
1477
1485
  }
1486
+ function formatLocalScheduleTime(time) {
1487
+ return `${String(time.hour).padStart(2, "0")}:${String(time.minute).padStart(2, "0")}`;
1488
+ }
1478
1489
  function addLocalScheduleDays(date, days) {
1479
1490
  const utcDate = new Date(Date.UTC(date.year, date.month - 1, date.day + days, 12, 0, 0));
1480
1491
  return {
@@ -8887,13 +8898,6 @@ const API_ENDPOINTS$1 = {
8887
8898
  auth: "user",
8888
8899
  responseKind: "json"
8889
8900
  },
8890
- listSiteThemePalettes: {
8891
- path: "/sites/{siteId}/theme/palettes",
8892
- method: "GET",
8893
- auth: "user",
8894
- errors: [],
8895
- responseKind: "json"
8896
- },
8897
8901
  createSiteFontUploadUrl: {
8898
8902
  path: "/sites/{siteId}/fonts/upload-url",
8899
8903
  method: "POST",
@@ -10251,7 +10255,7 @@ function navigationAuthoringLinkToCommandLink(link) {
10251
10255
  badge: link.badge,
10252
10256
  label: link.label
10253
10257
  };
10254
- default: return assertNever$25(link);
10258
+ default: return assertNever$24(link);
10255
10259
  }
10256
10260
  }
10257
10261
  function portalLabelsForCommand(labels) {
@@ -10294,7 +10298,7 @@ function navigationReadLinkToLocalLink(item) {
10294
10298
  badge: link.badge,
10295
10299
  label: link.label
10296
10300
  };
10297
- default: return assertNever$25(link);
10301
+ default: return assertNever$24(link);
10298
10302
  }
10299
10303
  }
10300
10304
  function internalNavigationLinkToLocalLink(item) {
@@ -11379,7 +11383,7 @@ const linkSchema = z$1.union([
11379
11383
  //#endregion
11380
11384
  //#region ../blocks/src/system/node/schema.ts
11381
11385
  var transformStepSchema, bindingPathSchema, bindingSchema, repeatSchema, conditionalAuthoringPresenceSchema, conditionSchema, dataScopeSchema, nodePropsSchema, nodeSchema, nodeTreeSchema, NodeSchema, NodeTreeSchema;
11382
- var init_schema$2 = __esmMin((() => {
11386
+ var init_schema$3 = __esmMin((() => {
11383
11387
  transformStepSchema = z$1.object({
11384
11388
  id: z$1.string().min(1, "Transform requires an identifier"),
11385
11389
  options: z$1.record(z$1.string(), z$1.unknown()).optional()
@@ -11584,7 +11588,7 @@ var init_validation_constants = __esmMin((() => {
11584
11588
  //#endregion
11585
11589
  //#region ../blocks/src/system/node/index.ts
11586
11590
  var init_node = __esmMin((() => {
11587
- init_schema$2();
11591
+ init_schema$3();
11588
11592
  init_typeBasedLayout();
11589
11593
  init_validation_constants();
11590
11594
  }));
@@ -11735,7 +11739,7 @@ function createSdkSelectField(input) {
11735
11739
  }));
11736
11740
  }
11737
11741
  var visibilityLevels, MEDIA_KINDS, DISPLAY_MEDIA_KINDS$2, DEFAULT_MEDIA_FIELD_KINDS, PUBLIC_FILE_FIELD_KINDS, siteOptionSources, mediaDeliverySchema, selectOptionSchema, selectSourceSchema, visibleWhenPredicateSchema, visibleWhenSchema, uiSchema, baseFieldSchema, textFieldSchema, richTextFieldSchema, inlineTextFieldSchema, mediaFieldSchema, fileFieldSchema, booleanFieldSchema, dateFieldSchema, timeFieldSchema, dateTimeFieldSchema, slugFieldSchema, urlFieldSchema, linkFieldSchema, selectFieldSchema, referenceFieldSchema, itemTypeSchema, repeaterFieldSchema$1, groupFieldSchema$1, modalFieldSchema, numberFieldSchema, tabDefinitionSchema, tabGroupFieldSchema, presetOptionSchema, presetOrCustomFieldSchema, contentTypeSelectFieldSchema, entryPickerFieldSchema, _fieldSchemaInternal, fieldSchema, slotSchema, typographyTokens$1, colorTokens$1, spacingTokens$1, radiusTokens$1, styleTokenSchema, behaviourSchema, quickFieldPrioritySchema, previewCustomizeManifestCurationSchema, blockCategoryEnum$1, blockContentSourceKinds, blockContentSourceSchema;
11738
- var init_schema$1 = __esmMin((() => {
11742
+ var init_schema$2 = __esmMin((() => {
11739
11743
  init_node();
11740
11744
  init_repeaterGrid();
11741
11745
  init_presets$2();
@@ -12322,7 +12326,7 @@ var init_schema$1 = __esmMin((() => {
12322
12326
  }));
12323
12327
  //#endregion
12324
12328
  //#region ../blocks/src/system/inlineText.ts
12325
- init_schema$1();
12329
+ init_schema$2();
12326
12330
  const inlineTextMarkSchema = z$1.discriminatedUnion("kind", [
12327
12331
  z$1.object({ kind: z$1.literal("strong") }),
12328
12332
  z$1.object({ kind: z$1.literal("emphasis") }),
@@ -13712,8 +13716,7 @@ function createRichTextDocFromMarkdown(markdown) {
13712
13716
  })
13713
13717
  };
13714
13718
  }
13715
- var TipTapMarkSchema, TipTapNodeSchema, RichTextDocSchema;
13716
- var init_richTextSchema = __esmMin((() => {
13719
+ var TipTapMarkSchema, TipTapNodeSchema, RichTextDocSchema, init_richTextSchema = __esmMin((() => {
13717
13720
  init_typeGuards();
13718
13721
  TipTapMarkSchema = z$1.object({
13719
13722
  type: z$1.string().min(1),
@@ -13754,18 +13757,110 @@ var init_richTextSchema = __esmMin((() => {
13754
13757
  type: z$1.literal("doc"),
13755
13758
  content: z$1.array(TipTapNodeSchema)
13756
13759
  }).strict();
13760
+ })), PUBLIC_DOWNLOAD_MEDIA_TYPES, hotspotSchema$1, rotationSchema$1, rectSchema$1, aspectCropSchema$1, transformSchema$1, mediaPosterSchema, mediaBaseSchema, mediaIdentifierSchema, imageMediaSchema, videoMediaSchema, audioMediaSchema, documentMediaSchema, spreadsheetMediaSchema, archiveMediaSchema, mediaSchema$1, persistableMediaBaseSchema;
13761
+ var init_media$2 = __esmMin((() => {
13762
+ init_src$2();
13763
+ PUBLIC_DOWNLOAD_MEDIA_TYPES = [
13764
+ "document",
13765
+ "spreadsheet",
13766
+ "archive",
13767
+ "audio"
13768
+ ];
13769
+ hotspotSchema$1 = z.object({
13770
+ x: z.number().min(0).max(1),
13771
+ y: z.number().min(0).max(1),
13772
+ radius: z.number().optional()
13773
+ });
13774
+ rotationSchema$1 = z.union([
13775
+ z.literal(0),
13776
+ z.literal(90),
13777
+ z.literal(180),
13778
+ z.literal(270)
13779
+ ]);
13780
+ rectSchema$1 = z.tuple([
13781
+ z.number(),
13782
+ z.number(),
13783
+ z.number(),
13784
+ z.number()
13785
+ ]);
13786
+ aspectCropSchema$1 = z.object({
13787
+ aspect: z.preprocess((value) => value == null ? void 0 : value, z.string().optional()),
13788
+ rect: z.preprocess((value) => value == null ? void 0 : value, rectSchema$1.optional()),
13789
+ hotspot: z.preprocess((value) => value == null ? void 0 : value, hotspotSchema$1.optional()),
13790
+ rotation: z.preprocess((value) => value == null ? void 0 : value, rotationSchema$1.optional())
13791
+ });
13792
+ transformSchema$1 = z.object({
13793
+ aspectCrops: z.preprocess((value) => {
13794
+ if (!value || typeof value !== "object" || Array.isArray(value)) return;
13795
+ return value;
13796
+ }, z.record(z.string(), aspectCropSchema$1.catch({}))).optional(),
13797
+ rect: rectSchema$1.optional(),
13798
+ hotspot: hotspotSchema$1.optional(),
13799
+ rotation: rotationSchema$1.optional()
13800
+ });
13801
+ mediaPosterSchema = z.discriminatedUnion("tag", [z.object({
13802
+ tag: z.literal("storage"),
13803
+ assetId: z.string().optional(),
13804
+ storageBucket: z.string().min(1),
13805
+ storagePath: z.string().min(1)
13806
+ }), z.object({
13807
+ tag: z.literal("external-src"),
13808
+ assetId: z.string().optional(),
13809
+ src: z.string().url()
13810
+ })]);
13811
+ mediaBaseSchema = z.object({
13812
+ purpose: z.string().optional(),
13813
+ placeholder: z.boolean().default(true).optional(),
13814
+ assetId: z.string().optional(),
13815
+ identifier: z.string().optional(),
13816
+ src: z.string().optional(),
13817
+ alt: z.string().optional(),
13818
+ filename: z.string().optional(),
13819
+ mimeType: z.string().optional(),
13820
+ width: z.number().optional(),
13821
+ height: z.number().optional(),
13822
+ storageBucket: z.string().optional(),
13823
+ storagePath: z.string().optional(),
13824
+ poster: mediaPosterSchema.optional(),
13825
+ transform: transformSchema$1.optional()
13826
+ });
13827
+ mediaIdentifierSchema = z.string().trim().min(1).brand();
13828
+ imageMediaSchema = mediaBaseSchema.extend({ type: z.literal("image") });
13829
+ videoMediaSchema = mediaBaseSchema.extend({ type: z.literal("video") });
13830
+ audioMediaSchema = mediaBaseSchema.extend({ type: z.literal("audio") });
13831
+ documentMediaSchema = mediaBaseSchema.extend({ type: z.literal("document") });
13832
+ spreadsheetMediaSchema = mediaBaseSchema.extend({ type: z.literal("spreadsheet") });
13833
+ archiveMediaSchema = mediaBaseSchema.extend({ type: z.literal("archive") });
13834
+ mediaSchema$1 = z.discriminatedUnion("type", [
13835
+ imageMediaSchema,
13836
+ videoMediaSchema,
13837
+ audioMediaSchema,
13838
+ documentMediaSchema,
13839
+ spreadsheetMediaSchema,
13840
+ archiveMediaSchema
13841
+ ]);
13842
+ persistableMediaBaseSchema = mediaBaseSchema.extend({ identifier: mediaIdentifierSchema });
13843
+ z.discriminatedUnion("type", [
13844
+ persistableMediaBaseSchema.extend({ type: z.literal("image") }),
13845
+ persistableMediaBaseSchema.extend({ type: z.literal("video") }),
13846
+ persistableMediaBaseSchema.extend({ type: z.literal("audio") }),
13847
+ persistableMediaBaseSchema.extend({ type: z.literal("document") }),
13848
+ persistableMediaBaseSchema.extend({ type: z.literal("spreadsheet") }),
13849
+ persistableMediaBaseSchema.extend({ type: z.literal("archive") })
13850
+ ]);
13757
13851
  }));
13758
13852
  //#endregion
13759
13853
  //#region ../blocks/src/system/manifest/fieldValidation/index.ts
13760
13854
  init_src$2();
13761
13855
  init_richTextSchema();
13856
+ init_media$2();
13762
13857
  const TEL_RE = /^[+()0-9\s-]{3,}$/;
13763
13858
  const SLUG_PATTERN = /^(?:[a-z0-9]+(?:-[a-z0-9]+)*)(?:\/(?:[a-z0-9]+(?:-[a-z0-9]+)*))*$/;
13764
13859
  const ALLOWED_URL_PROTOCOLS = ["http:", "https:"];
13765
13860
  const DATE_PATTERN = /^(?<year>[1-9]\d{3})-(?<month>\d{2})-(?<day>\d{2})$/;
13766
13861
  const TIME_PATTERN = /^(?<hours>[01]\d|2[0-3]):(?<minutes>[0-5]\d)$/;
13767
13862
  const DATETIME_PATTERN = /^(?<date>[1-9]\d{3}-\d{2}-\d{2})T(?<time>(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d)(?:\.\d+)?(?<offset>Z|[+-](?:[01]\d|2[0-3]):[0-5]\d)$/;
13768
- function assertNever$17(value) {
13863
+ function assertNever$16(value) {
13769
13864
  throw new Error(`Unhandled field validation variant: ${JSON.stringify(value)}`);
13770
13865
  }
13771
13866
  function validationContext(options = {}) {
@@ -13818,7 +13913,7 @@ function fieldIssueToMessage(issue) {
13818
13913
  case "invalidMedia": return `${issue.label} must be a media object with an identifier`;
13819
13914
  case "invalidLink": return `${issue.label} must be a valid link`;
13820
13915
  case "invalidReference": return `${issue.label} must reference a valid item`;
13821
- default: return assertNever$17(issue);
13916
+ default: return assertNever$16(issue);
13822
13917
  }
13823
13918
  }
13824
13919
  function pluralize(label, count) {
@@ -13938,7 +14033,7 @@ function deriveFieldValidationPlan(field, path = [field.id]) {
13938
14033
  case "presetOrCustom":
13939
14034
  case "contentTypeSelect":
13940
14035
  case "entryPicker": return makePlan("passthrough", "unknown", field, path, false, []);
13941
- default: return assertNever$17(field);
14036
+ default: return assertNever$16(field);
13942
14037
  }
13943
14038
  }
13944
14039
  function deriveFieldValidationPlans(fields, parentPath = []) {
@@ -14013,7 +14108,7 @@ function resolveSelectConstraintSource(field) {
14013
14108
  kind: "runtime",
14014
14109
  source: source.kind
14015
14110
  };
14016
- default: return assertNever$17(source);
14111
+ default: return assertNever$16(source);
14017
14112
  }
14018
14113
  }
14019
14114
  function normalizeStoredContentValues(plans, content, options = {}) {
@@ -14032,7 +14127,7 @@ function allGroupChildPlans(plan) {
14032
14127
  switch (plan.childSelection.kind) {
14033
14128
  case "all": return plan.childSelection.fields;
14034
14129
  case "discriminatedTabs": return plan.childSelection.tabs.flatMap((tab) => tab.fields);
14035
- default: return assertNever$17(plan.childSelection);
14130
+ default: return assertNever$16(plan.childSelection);
14036
14131
  }
14037
14132
  }
14038
14133
  function selectedGroupChildPlans(plan, value) {
@@ -14046,7 +14141,7 @@ function canonicalizeFieldValueForWrite(plan, value) {
14046
14141
  case "media": {
14047
14142
  if (!isPlainObject$6(value)) return value;
14048
14143
  const canonical = { ...value };
14049
- if (typeof canonical.identifier === "string" && canonical.identifier.trim().length > 0) deleteEnvSpecificKeys(canonical);
14144
+ if (mediaIdentifierSchema.safeParse(canonical.identifier).success) deleteEnvSpecificKeys(canonical);
14050
14145
  return canonical;
14051
14146
  }
14052
14147
  case "group": return canonicalizeObjectForWrite(selectedGroupChildPlans(plan, value), value);
@@ -14065,7 +14160,7 @@ function canonicalizeFieldValueForWrite(plan, value) {
14065
14160
  case "link":
14066
14161
  case "select":
14067
14162
  case "passthrough": return value;
14068
- default: return assertNever$17(plan);
14163
+ default: return assertNever$16(plan);
14069
14164
  }
14070
14165
  }
14071
14166
  function canonicalizeObjectForWrite(plans, value) {
@@ -14091,7 +14186,7 @@ function normalizeStoredFieldValueWithContext(plan, value, ctx) {
14091
14186
  case "link":
14092
14187
  case "select":
14093
14188
  case "passthrough": return normalizeFieldValue(plan, value, ctx);
14094
- default: return assertNever$17(plan);
14189
+ default: return assertNever$16(plan);
14095
14190
  }
14096
14191
  }
14097
14192
  function normalizeStoredObjectChildren(children, value, ctx) {
@@ -14128,7 +14223,7 @@ function normalizeFieldValue(plan, value, ctx) {
14128
14223
  case "select":
14129
14224
  case "passthrough": return value;
14130
14225
  case "media": return value;
14131
- default: return assertNever$17(plan);
14226
+ default: return assertNever$16(plan);
14132
14227
  }
14133
14228
  }
14134
14229
  function normalizeObjectChildren(children, value, ctx) {
@@ -14141,7 +14236,7 @@ function normalizeObjectChildren(children, value, ctx) {
14141
14236
  function normalizeInlineTextFallbacks(plans, values, ctx) {
14142
14237
  for (const plan of plans) {
14143
14238
  if (plan.kind !== "inlineText" || !plan.plainTextFallbackPath) continue;
14144
- if (!isMissingForPlan(plan, values[plan.fieldId])) continue;
14239
+ if (!isMissingForPlan(plan, values[plan.fieldId]) && !(ctx.allowIncomplete && !parseInlineTextFromUnknown(values[plan.fieldId]).ok)) continue;
14145
14240
  const fallback = getAtFieldPath(values, plan.plainTextFallbackPath);
14146
14241
  if (typeof fallback !== "string" || fallback.trim().length === 0) continue;
14147
14242
  values[plan.fieldId] = normalizeFieldValue(plan, plainTextToInlineText(fallback), ctx);
@@ -14182,12 +14277,12 @@ function validateNormalizedFieldValue(plan, value, ctx) {
14182
14277
  case "select": return validateSelectPlan(plan, value);
14183
14278
  case "richText": return isValidRichTextDoc(value) ? [] : [issue$3(plan, "invalidRichText")];
14184
14279
  case "inlineText": return validateInlineTextPlan(plan, value);
14185
- case "media": return isPlainObject$6(value) && typeof value.identifier === "string" && value.identifier.trim().length > 0 && (value.type === void 0 || typeof value.type === "string" && plan.allowedMediaTypes.includes(value.type)) ? [] : [issue$3(plan, "invalidMedia")];
14280
+ case "media": return isPlainObject$6(value) && mediaIdentifierSchema.safeParse(value.identifier).success && (value.type === void 0 || typeof value.type === "string" && plan.allowedMediaTypes.includes(value.type)) ? [] : [issue$3(plan, "invalidMedia")];
14186
14281
  case "link": return linkSchema.safeParse(value).success ? [] : [issue$3(plan, "invalidLink")];
14187
14282
  case "repeater": return validateRepeaterPlan(plan, value, ctx);
14188
14283
  case "group": return validateGroupPlan(plan, value, ctx);
14189
14284
  case "passthrough": return [];
14190
- default: return assertNever$17(plan);
14285
+ default: return assertNever$16(plan);
14191
14286
  }
14192
14287
  }
14193
14288
  function shouldRequireValue(plan, value, ctx) {
@@ -14229,7 +14324,7 @@ function validateStringConstraint(plan, constraint, value) {
14229
14324
  case "timeFormat": return typeof value === "string" && isValidTimeString(value) ? [] : [issue$3(plan, "invalidTime")];
14230
14325
  case "datetimeFormat": return typeof value === "string" && isValidDateTimeInstantString(value) ? [] : [issue$3(plan, "invalidDateTime")];
14231
14326
  case "slugFormat": return typeof value === "string" && SLUG_PATTERN.test(value) ? [] : [issue$3(plan, "invalidSlug")];
14232
- default: return assertNever$17(constraint);
14327
+ default: return assertNever$16(constraint);
14233
14328
  }
14234
14329
  }
14235
14330
  function isValidIconPickerValue(value) {
@@ -14248,7 +14343,7 @@ function validateNumberConstraint(plan, constraint, value) {
14248
14343
  case "numberType": return [];
14249
14344
  case "numberMin": return value < constraint.minimum ? [issue$3(plan, "tooSmall", { minimum: constraint.minimum })] : [];
14250
14345
  case "numberMax": return value > constraint.maximum ? [issue$3(plan, "tooLarge", { maximum: constraint.maximum })] : [];
14251
- default: return assertNever$17(constraint);
14346
+ default: return assertNever$16(constraint);
14252
14347
  }
14253
14348
  }
14254
14349
  function validateSelectPlan(plan, value) {
@@ -14270,7 +14365,7 @@ function validateRepeaterPlan(plan, value, ctx) {
14270
14365
  maximum: constraint.maximum,
14271
14366
  itemLabel: "item"
14272
14367
  })] : [];
14273
- default: return assertNever$17(constraint);
14368
+ default: return assertNever$16(constraint);
14274
14369
  }
14275
14370
  }), ...value.flatMap((item, index) => validateRepeaterItem(plan, item, index, ctx))];
14276
14371
  }
@@ -14361,7 +14456,7 @@ function rebaseFieldPlanPath(plan, fromPrefix, toPrefix) {
14361
14456
  ...plan,
14362
14457
  path
14363
14458
  };
14364
- default: return assertNever$17(plan);
14459
+ default: return assertNever$16(plan);
14365
14460
  }
14366
14461
  }
14367
14462
  function validateInlineTextPlan(plan, value) {
@@ -14408,7 +14503,7 @@ function fieldPlanToObjectPropertyZod(plan, options = {}) {
14408
14503
  switch (presence.kind) {
14409
14504
  case "required": return schema;
14410
14505
  case "optional": return schema.optional();
14411
- default: return assertNever$17(presence);
14506
+ default: return assertNever$16(presence);
14412
14507
  }
14413
14508
  }
14414
14509
  function addFieldIssueToZodContext(zodCtx, validationIssue, rootPath) {
@@ -14478,7 +14573,7 @@ function addFieldIssueToZodContext(zodCtx, validationIssue, rootPath) {
14478
14573
  message
14479
14574
  });
14480
14575
  return;
14481
- default: assertNever$17(validationIssue);
14576
+ default: assertNever$16(validationIssue);
14482
14577
  }
14483
14578
  }
14484
14579
  function relativeZodIssuePath(path, rootPath) {
@@ -14509,7 +14604,7 @@ function findNestedFieldValidationPlan(plan, path) {
14509
14604
  case "link":
14510
14605
  case "select":
14511
14606
  case "passthrough": return null;
14512
- default: return assertNever$17(plan);
14607
+ default: return assertNever$16(plan);
14513
14608
  }
14514
14609
  }
14515
14610
  function sameFieldPath(left, right) {
@@ -14550,7 +14645,7 @@ function validateExplicitNullForPushPlan(plan, value, ctx) {
14550
14645
  case "link":
14551
14646
  case "select":
14552
14647
  case "passthrough": return [];
14553
- default: return assertNever$17(plan);
14648
+ default: return assertNever$16(plan);
14554
14649
  }
14555
14650
  }
14556
14651
  function validateExplicitNullsForPushRepeater(plan, value, ctx) {
@@ -14742,7 +14837,7 @@ function resolveVariantKey(manifest, content) {
14742
14837
  //#endregion
14743
14838
  //#region ../blocks/src/system/manifest/index.ts
14744
14839
  init_augmentManifest();
14745
- init_schema$1();
14840
+ init_schema$2();
14746
14841
  //#endregion
14747
14842
  //#region ../theme-core/src/palette/utils/colorConversion.ts
14748
14843
  function hexToRgb$1(hex) {
@@ -14955,6 +15050,18 @@ var init_accessibleSurfaces = __esmMin((() => {
14955
15050
  init_onColor();
14956
15051
  }));
14957
15052
  //#endregion
15053
+ //#region ../theme-core/src/site-styles/lookOptionGroups.ts
15054
+ function defineLookOptionGroup(group) {
15055
+ defaultOption(group);
15056
+ return group;
15057
+ }
15058
+ function defaultOption(group) {
15059
+ const option = group.options.find((candidate) => candidate.id === group.defaultOptionId);
15060
+ if (option) return option;
15061
+ throw new Error(`Look option group "${group.id}" defaults to missing option "${group.defaultOptionId}".`);
15062
+ }
15063
+ var init_lookOptionGroups = __esmMin((() => {}));
15064
+ //#endregion
14958
15065
  //#region ../theme-core/src/site-styles/types.ts
14959
15066
  /**
14960
15067
  * Defines a literal-preserving catalog while rejecting top-level extra keys on
@@ -15007,7 +15114,7 @@ function asDesignSystemTemplateId(value) {
15007
15114
  function makeBoundaryId(previousBlockId, nextBlockId) {
15008
15115
  return asDesignBoundaryId(`boundary:${encodeURIComponent(previousBlockId)}:${encodeURIComponent(nextBlockId)}`);
15009
15116
  }
15010
- function assertNever$16(value, message = "Unhandled Theme V2 variant") {
15117
+ function assertNever$15(value, message = "Unhandled Theme V2 variant") {
15011
15118
  throw new Error(`${message}: ${String(value)}`);
15012
15119
  }
15013
15120
  function brandNonEmptyString(value, label) {
@@ -15103,7 +15210,7 @@ var init_types$15 = __esmMin((() => {
15103
15210
  //#region ../theme-core/src/site-styles/appearancePresetResolution.ts
15104
15211
  function assertValidOptionGroups(preset) {
15105
15212
  preset.optionGroups?.forEach((group) => {
15106
- if (!group.options.find((option) => option.id === group.selectedOptionId)) throw new Error(`Appearance preset "${preset.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`);
15213
+ defineLookOptionGroup(group);
15107
15214
  });
15108
15215
  }
15109
15216
  function defineBlockAppearancePreset(preset) {
@@ -15111,772 +15218,655 @@ function defineBlockAppearancePreset(preset) {
15111
15218
  return preset;
15112
15219
  }
15113
15220
  var init_appearancePresetResolution = __esmMin((() => {
15221
+ init_lookOptionGroups();
15114
15222
  init_types$15();
15115
- }));
15116
- //#endregion
15117
- //#region ../theme-core/src/site-styles/blockAppearancePresets.ts
15118
- var blockAppearancePresets;
15223
+ })), brandScrimOptionGroups, microBannerLayoutPatches;
15119
15224
  var init_blockAppearancePresets = __esmMin((() => {
15120
15225
  init_appearancePresetResolution();
15121
15226
  init_types$15();
15122
- blockAppearancePresets = [
15123
- defineBlockAppearancePreset({
15124
- kind: "block-design",
15125
- id: "hero-immersive-image",
15126
- target: "hero",
15127
- label: "Immersive image hero",
15128
- blockKinds: ["block.hero"],
15129
- constraints: { layoutFamilies: ["centered", "compact"] },
15130
- layoutPatches: [{
15131
- constraints: { layoutVariantKeys: ["micro"] },
15132
- designPatch: {
15133
- sectionHeight: "banner",
15134
- heroTypographyScale: "display"
15135
- }
15136
- }],
15137
- design: {
15138
- sectionSurface: "hero-image",
15139
- contentFrame: plainFrame,
15140
- itemSurface: "none",
15141
- sectionHeight: "hero",
15142
- heroComposition: "center",
15143
- heroTypographyScale: "display",
15144
- imageSurfaceTreatment: { kind: "neutral-wash" }
15227
+ brandScrimOptionGroups = [{
15228
+ id: "image-surface-treatment",
15229
+ label: "Treatment",
15230
+ defaultOptionId: "brand-scrim-primary",
15231
+ options: [{
15232
+ id: "brand-scrim-primary",
15233
+ label: "Brand scrim",
15234
+ designPatch: { imageSurfaceTreatment: {
15235
+ kind: "brand-scrim",
15236
+ token: "primary"
15237
+ } }
15238
+ }, {
15239
+ id: "neutral-scrim",
15240
+ label: "Neutral scrim",
15241
+ designPatch: { imageSurfaceTreatment: { kind: "neutral-scrim" } }
15242
+ }]
15243
+ }];
15244
+ microBannerLayoutPatches = [{
15245
+ constraints: { layoutVariantKeys: ["micro"] },
15246
+ designPatch: { sectionHeight: "banner" }
15247
+ }];
15248
+ defineBlockAppearancePreset({
15249
+ id: "hero-immersive-image",
15250
+ target: "hero",
15251
+ label: "Immersive image hero",
15252
+ blockKinds: ["block.hero"],
15253
+ constraints: { layoutFamilies: ["centered", "compact"] },
15254
+ layoutPatches: [{
15255
+ constraints: { layoutVariantKeys: ["micro"] },
15256
+ designPatch: {
15257
+ sectionHeight: "banner",
15258
+ heroTypographyScale: "display"
15145
15259
  }
15146
- }),
15147
- defineBlockAppearancePreset({
15148
- kind: "block-design",
15149
- id: "hero-bottom-left-panel",
15150
- target: "hero",
15151
- label: "Bottom-left panel hero",
15152
- blockKinds: ["block.hero"],
15153
- constraints: { layoutFamilies: ["centered", "compact"] },
15154
- optionGroups: [{
15155
- id: "image-surface-treatment",
15156
- label: "Treatment",
15157
- selectedOptionId: "neutral-scrim",
15158
- options: [{
15159
- id: "neutral-scrim",
15160
- label: "Neutral scrim",
15161
- designPatch: { imageSurfaceTreatment: {
15162
- kind: "neutral-scrim",
15163
- intensity: "balanced"
15164
- } }
15165
- }, {
15166
- id: "brand-scrim-primary",
15167
- label: "Brand scrim",
15168
- designPatch: { imageSurfaceTreatment: {
15169
- kind: "brand-scrim",
15170
- token: "primary",
15171
- intensity: "balanced"
15172
- } }
15173
- }]
15174
- }],
15175
- layoutPatches: [{
15176
- constraints: { layoutVariantKeys: ["micro"] },
15177
- designPatch: {
15178
- sectionHeight: "banner",
15179
- heroTypographyScale: "editorial"
15180
- }
15181
- }],
15182
- design: {
15183
- sectionSurface: "hero-image",
15184
- contentFrame: panelFrame("raised"),
15185
- itemSurface: "none",
15186
- sectionHeight: "immersive",
15187
- heroComposition: "bottom-left",
15188
- heroTypographyScale: "display",
15189
- imageSurfaceTreatment: {
15260
+ }],
15261
+ design: {
15262
+ sectionSurface: "hero-image",
15263
+ contentFrame: plainFrame,
15264
+ itemSurface: "none",
15265
+ sectionHeight: "hero",
15266
+ heroComposition: "center",
15267
+ heroTypographyScale: "display",
15268
+ imageSurfaceTreatment: { kind: "neutral-wash" }
15269
+ }
15270
+ }), defineBlockAppearancePreset({
15271
+ id: "hero-bottom-left-panel",
15272
+ target: "hero",
15273
+ label: "Bottom-left panel hero",
15274
+ blockKinds: ["block.hero"],
15275
+ constraints: { layoutFamilies: ["centered", "compact"] },
15276
+ optionGroups: [{
15277
+ id: "image-surface-treatment",
15278
+ label: "Treatment",
15279
+ defaultOptionId: "neutral-scrim",
15280
+ options: [{
15281
+ id: "neutral-scrim",
15282
+ label: "Neutral scrim",
15283
+ designPatch: { imageSurfaceTreatment: {
15190
15284
  kind: "neutral-scrim",
15191
15285
  intensity: "balanced"
15192
- }
15193
- }
15194
- }),
15195
- defineBlockAppearancePreset({
15196
- kind: "block-design",
15197
- id: "hero-poster-image",
15198
- target: "hero",
15199
- label: "Poster image hero",
15200
- blockKinds: ["block.hero"],
15201
- constraints: { layoutFamilies: ["centered", "compact"] },
15202
- layoutPatches: [{
15203
- constraints: { layoutVariantKeys: ["micro"] },
15204
- designPatch: {
15205
- sectionHeight: "banner",
15206
- heroTypographyScale: "display"
15207
- }
15208
- }],
15209
- design: {
15210
- sectionSurface: "hero-image",
15211
- contentFrame: plainFrame,
15212
- itemSurface: "none",
15213
- sectionHeight: "immersive",
15214
- heroComposition: "center",
15215
- heroTypographyScale: "poster",
15216
- imageSurfaceTreatment: {
15286
+ } }
15287
+ }, {
15288
+ id: "brand-scrim-primary",
15289
+ label: "Brand scrim",
15290
+ designPatch: { imageSurfaceTreatment: {
15217
15291
  kind: "brand-scrim",
15218
15292
  token: "primary",
15219
- intensity: "strong"
15220
- }
15221
- }
15222
- }),
15223
- defineBlockAppearancePreset({
15224
- kind: "block-design",
15225
- id: "hero-brand-scrim",
15226
- target: "hero",
15227
- label: "Brand scrim image hero",
15228
- blockKinds: ["block.hero"],
15229
- constraints: { layoutFamilies: ["centered", "compact"] },
15230
- optionGroups: [{
15231
- id: "image-surface-treatment",
15232
- label: "Treatment",
15233
- selectedOptionId: "brand-scrim-primary",
15234
- options: [{
15235
- id: "brand-scrim-primary",
15236
- label: "Brand scrim",
15237
- designPatch: { imageSurfaceTreatment: {
15238
- kind: "brand-scrim",
15239
- token: "primary"
15240
- } }
15241
- }, {
15242
- id: "neutral-scrim",
15243
- label: "Neutral scrim",
15244
- designPatch: { imageSurfaceTreatment: { kind: "neutral-scrim" } }
15245
- }]
15246
- }],
15247
- layoutPatches: [{
15248
- constraints: { layoutVariantKeys: ["micro"] },
15249
- designPatch: { sectionHeight: "banner" }
15250
- }],
15251
- design: {
15252
- sectionSurface: "hero-image",
15253
- contentFrame: plainFrame,
15254
- itemSurface: "none",
15255
- sectionHeight: "immersive",
15256
- heroComposition: "center",
15257
- heroTypographyScale: "display",
15258
- imageSurfaceTreatment: {
15259
- kind: "brand-scrim",
15260
- token: "primary"
15261
- }
15262
- }
15263
- }),
15264
- defineBlockAppearancePreset({
15265
- kind: "block-design",
15266
- id: "hero-brand-scrim-fixed-frame",
15267
- target: "hero",
15268
- label: "Fixed-frame brand scrim hero",
15269
- blockKinds: ["block.hero"],
15270
- constraints: { layoutFamilies: ["centered", "compact"] },
15271
- optionGroups: [{
15272
- id: "image-surface-treatment",
15273
- label: "Treatment",
15274
- selectedOptionId: "brand-scrim-primary",
15275
- options: [{
15276
- id: "brand-scrim-primary",
15277
- label: "Brand scrim",
15278
- designPatch: { imageSurfaceTreatment: {
15279
- kind: "brand-scrim",
15280
- token: "primary"
15281
- } }
15282
- }, {
15283
- id: "neutral-scrim",
15284
- label: "Neutral scrim",
15285
- designPatch: { imageSurfaceTreatment: { kind: "neutral-scrim" } }
15286
- }]
15287
- }],
15288
- layoutPatches: [{
15289
- constraints: { layoutVariantKeys: ["micro"] },
15290
- designPatch: { sectionHeight: "banner" }
15291
- }],
15292
- design: {
15293
- sectionSurface: "hero-image",
15294
- contentFrame: plainFrame,
15295
- itemSurface: "none",
15296
- sectionHeight: "immersive",
15297
- heroComposition: "center",
15298
- heroTypographyScale: "display",
15299
- imageSurfaceTreatment: {
15300
- kind: "brand-scrim",
15301
- token: "primary"
15302
- },
15303
- imageSurfaceMotion: "fixed-frame",
15304
- eyebrowTreatment: "accent-pill-bounce"
15305
- }
15306
- }),
15307
- defineBlockAppearancePreset({
15308
- kind: "block-design",
15309
- id: "hero-brand-depth-expressive",
15310
- target: "hero",
15311
- label: "Expressive brand-depth hero",
15312
- blockKinds: ["block.hero"],
15313
- constraints: { layoutFamilies: ["centered", "compact"] },
15314
- design: {
15315
- sectionSurface: "brand-depth-band",
15316
- contentFrame: plainFrame,
15317
- itemSurface: "none",
15318
- heroComposition: "center",
15319
- heroTypographyScale: "editorial",
15320
- eyebrowTreatment: "accent-pill-bounce"
15321
- }
15322
- }),
15323
- defineBlockAppearancePreset({
15324
- kind: "block-design",
15325
- id: "hero-contained-intro",
15326
- target: "hero",
15327
- label: "Contained intro hero",
15328
- blockKinds: ["block.hero"],
15329
- design: {
15330
- sectionSurface: "muted-band",
15331
- contentFrame: panelFrame("inset"),
15332
- itemSurface: "none",
15333
- heroComposition: "center",
15334
- heroTypographyScale: "editorial"
15335
- }
15336
- }),
15337
- defineBlockAppearancePreset({
15338
- kind: "block-design",
15339
- id: "hero-split-editorial",
15340
- target: "hero",
15341
- label: "Editorial split hero",
15342
- blockKinds: ["block.hero"],
15343
- constraints: { layoutFamilies: ["split"] },
15344
- design: {
15345
- sectionSurface: "base",
15346
- contentFrame: plainFrame,
15347
- itemSurface: "none",
15348
- heroTypographyScale: "editorial"
15349
- }
15350
- }),
15351
- defineBlockAppearancePreset({
15352
- kind: "block-design",
15353
- id: "hero-split-brand",
15354
- target: "hero",
15355
- label: "Brand split hero",
15356
- blockKinds: ["block.hero"],
15357
- constraints: { layoutFamilies: ["split"] },
15358
- design: {
15359
- sectionSurface: "brand-depth-band",
15360
- contentFrame: plainFrame,
15361
- itemSurface: "none",
15362
- heroTypographyScale: "display",
15363
- eyebrowTreatment: "accent-pill-bounce"
15364
- }
15365
- }),
15366
- defineBlockAppearancePreset({
15367
- kind: "block-design",
15368
- id: "hero-split-soft-panel",
15369
- target: "hero",
15370
- label: "Soft panel split hero",
15371
- blockKinds: ["block.hero"],
15372
- constraints: { layoutFamilies: ["split"] },
15373
- design: {
15374
- sectionSurface: "muted-band",
15375
- contentFrame: panelFrame("raised"),
15376
- itemSurface: "none",
15293
+ intensity: "balanced"
15294
+ } }
15295
+ }]
15296
+ }],
15297
+ layoutPatches: [{
15298
+ constraints: { layoutVariantKeys: ["micro"] },
15299
+ designPatch: {
15300
+ sectionHeight: "banner",
15377
15301
  heroTypographyScale: "editorial"
15378
15302
  }
15379
- }),
15380
- defineBlockAppearancePreset({
15381
- kind: "block-design",
15382
- id: "hero-split-accent",
15383
- target: "hero",
15384
- label: "Accent split hero",
15385
- blockKinds: ["block.hero"],
15386
- constraints: { layoutFamilies: ["split"] },
15387
- design: {
15388
- sectionSurface: "accent-band",
15389
- contentFrame: panelFrame("raised"),
15390
- itemSurface: "none",
15303
+ }],
15304
+ design: {
15305
+ sectionSurface: "hero-image",
15306
+ contentFrame: panelFrame("raised"),
15307
+ itemSurface: "none",
15308
+ sectionHeight: "immersive",
15309
+ heroComposition: "bottom-left",
15310
+ heroTypographyScale: "display",
15311
+ imageSurfaceTreatment: {
15312
+ kind: "neutral-scrim",
15313
+ intensity: "balanced"
15314
+ }
15315
+ }
15316
+ }), defineBlockAppearancePreset({
15317
+ id: "hero-poster-image",
15318
+ target: "hero",
15319
+ label: "Poster image hero",
15320
+ blockKinds: ["block.hero"],
15321
+ constraints: { layoutFamilies: ["centered", "compact"] },
15322
+ layoutPatches: [{
15323
+ constraints: { layoutVariantKeys: ["micro"] },
15324
+ designPatch: {
15325
+ sectionHeight: "banner",
15391
15326
  heroTypographyScale: "display"
15392
15327
  }
15393
- }),
15394
- defineBlockAppearancePreset({
15395
- kind: "block-design",
15396
- id: "intro-editorial-statement",
15397
- target: "intro",
15398
- label: "Editorial intro statement",
15399
- blockKinds: ["block.intro"],
15400
- constraints: { layoutVariantKeys: ["centered-copy", "statement-copy"] },
15401
- design: {
15402
- sectionSurface: "base",
15403
- contentFrame: plainFrame,
15404
- itemSurface: "none",
15405
- composition: {
15406
- kind: "intro",
15407
- treatment: "editorial-statement"
15408
- }
15409
- }
15410
- }),
15411
- defineBlockAppearancePreset({
15412
- kind: "block-design",
15413
- id: "intro-portrait-bio",
15414
- target: "intro",
15415
- label: "Portrait and bio",
15416
- blockKinds: ["block.intro"],
15417
- constraints: { layoutVariantKeys: ["media-copy"] },
15418
- design: {
15419
- sectionSurface: "base",
15420
- contentFrame: plainFrame,
15421
- itemSurface: "none",
15422
- composition: {
15423
- kind: "intro",
15424
- treatment: "portrait-bio"
15425
- }
15426
- }
15427
- }),
15428
- defineBlockAppearancePreset({
15429
- kind: "block-design",
15430
- id: "offerings-preview-default-cards",
15431
- target: "offerings",
15432
- label: "Default offering cards",
15433
- blockKinds: ["block.offerings-preview"],
15434
- design: {
15435
- sectionSurface: "base",
15436
- contentFrame: plainFrame,
15437
- itemSurface: "default"
15438
- }
15439
- }),
15440
- defineBlockAppearancePreset({
15441
- kind: "block-design",
15442
- id: "offerings-preview-secondary-cards",
15443
- target: "offerings",
15444
- label: "Secondary offering cards",
15445
- blockKinds: ["block.offerings-preview"],
15446
- design: {
15447
- sectionSurface: "muted-band",
15448
- contentFrame: plainFrame,
15449
- itemSurface: "inset"
15450
- }
15451
- }),
15452
- defineBlockAppearancePreset({
15453
- kind: "block-design",
15454
- id: "offerings-preview-non-carded",
15455
- target: "offerings",
15456
- label: "Non-carded offerings",
15457
- blockKinds: ["block.offerings-preview"],
15458
- design: {
15459
- sectionSurface: "muted-band",
15460
- contentFrame: plainFrame,
15461
- itemSurface: "editorial"
15462
- }
15463
- }),
15464
- defineBlockAppearancePreset({
15465
- kind: "block-design",
15466
- id: "offerings-preview-paired-feature-cards",
15467
- target: "offerings",
15468
- label: "Paired feature cards",
15469
- blockKinds: ["block.offerings-preview"],
15470
- constraints: { layoutVariantKeys: ["cards"] },
15471
- design: {
15472
- sectionSurface: "base",
15473
- contentFrame: plainFrame,
15474
- itemSurface: "none"
15475
- }
15476
- }),
15477
- defineBlockAppearancePreset({
15478
- kind: "block-design",
15479
- id: "offerings-preview-open-editorial-columns",
15480
- target: "offerings",
15481
- label: "Open editorial columns",
15482
- blockKinds: ["block.offerings-preview"],
15483
- constraints: { layoutVariantKeys: ["cards"] },
15484
- design: {
15485
- sectionSurface: "base",
15486
- contentFrame: plainFrame,
15487
- itemSurface: "none"
15488
- }
15489
- }),
15490
- defineBlockAppearancePreset({
15491
- kind: "block-design",
15492
- id: "offerings-preview-joined-programme-panel",
15493
- target: "offerings",
15494
- label: "Joined programme panel",
15495
- blockKinds: ["block.offerings-preview"],
15496
- constraints: { layoutVariantKeys: ["cards"] },
15497
- design: {
15498
- sectionSurface: "base",
15499
- contentFrame: plainFrame,
15500
- itemSurface: "none"
15501
- }
15502
- }),
15503
- defineBlockAppearancePreset({
15504
- kind: "block-design",
15505
- id: "feature-cards-raised-rule",
15506
- target: "feature-cards",
15507
- label: "Raised cards with rule",
15508
- blockKinds: ["block.feature-cards"],
15509
- design: {
15510
- sectionSurface: "base",
15511
- contentFrame: plainFrame,
15512
- itemSurface: "raised"
15513
- }
15514
- }),
15515
- defineBlockAppearancePreset({
15516
- kind: "block-design",
15517
- id: "feature-cards-bold-colors",
15518
- target: "feature-cards",
15519
- label: "Bold colour-blocked cards",
15520
- blockKinds: ["block.feature-cards"],
15521
- design: {
15522
- sectionSurface: "base",
15523
- contentFrame: plainFrame,
15524
- itemSurface: "color-blocked"
15525
- }
15526
- }),
15527
- defineBlockAppearancePreset({
15528
- kind: "block-design",
15529
- id: "feature-cards-editorial-columns",
15530
- target: "feature-cards",
15531
- label: "Editorial open columns",
15532
- blockKinds: ["block.feature-cards"],
15533
- design: {
15534
- sectionSurface: "base",
15535
- contentFrame: plainFrame,
15536
- itemSurface: "editorial"
15537
- }
15538
- }),
15539
- defineBlockAppearancePreset({
15540
- kind: "block-design",
15541
- id: "feature-cards-asymmetric-emphasis",
15542
- target: "feature-cards",
15543
- label: "Asymmetric emphasis pair",
15544
- blockKinds: ["block.feature-cards"],
15545
- constraints: { layoutFamilies: ["grid"] },
15546
- design: {
15547
- sectionSurface: "base",
15548
- contentFrame: plainFrame,
15549
- itemSurface: "none",
15550
- composition: {
15551
- kind: "feature-cards",
15552
- treatment: "asymmetric-emphasis"
15553
- }
15554
- }
15555
- }),
15556
- defineBlockAppearancePreset({
15557
- kind: "block-design",
15558
- id: "feature-cards-framed-programme",
15559
- target: "feature-cards",
15560
- label: "Framed programme cards",
15561
- blockKinds: ["block.feature-cards"],
15562
- constraints: { layoutFamilies: ["grid"] },
15563
- design: {
15564
- sectionSurface: "brand-depth-band",
15565
- contentFrame: plainFrame,
15566
- itemSurface: "inset",
15567
- composition: {
15568
- kind: "feature-cards",
15569
- treatment: "framed-programme"
15570
- }
15571
- }
15572
- }),
15573
- defineBlockAppearancePreset({
15574
- kind: "block-design",
15575
- id: "feature-cards-soft-panels",
15576
- target: "feature-cards",
15577
- label: "Soft tinted panels",
15578
- blockKinds: ["block.feature-cards"],
15579
- design: {
15580
- sectionSurface: "base",
15581
- contentFrame: plainFrame,
15582
- itemSurface: "inset"
15583
- }
15584
- }),
15585
- defineBlockAppearancePreset({
15586
- kind: "block-design",
15587
- id: "feature-cards-editorial-diptych",
15588
- target: "feature-cards",
15589
- label: "Editorial diptych",
15590
- blockKinds: ["block.feature-cards"],
15591
- constraints: { layoutVariantKeys: ["editorial-diptych"] },
15592
- design: {
15593
- sectionSurface: "base",
15594
- contentFrame: plainFrame,
15595
- itemSurface: "flat"
15596
- }
15597
- }),
15598
- defineBlockAppearancePreset({
15599
- kind: "block-design",
15600
- id: "feature-cards-editorial-pathways",
15601
- target: "feature-cards",
15602
- label: "Editorial pathways",
15603
- blockKinds: ["block.feature-cards"],
15604
- constraints: { layoutVariantKeys: ["editorial-pathways"] },
15605
- design: {
15606
- sectionSurface: "base",
15607
- contentFrame: plainFrame,
15608
- itemSurface: "flat"
15609
- }
15610
- }),
15611
- defineBlockAppearancePreset({
15612
- kind: "block-design",
15613
- id: "feature-cards-photo-tiles",
15614
- target: "feature-cards",
15615
- label: "Photo tiles",
15616
- blockKinds: ["block.feature-cards"],
15617
- design: {
15618
- sectionSurface: "base",
15619
- contentFrame: plainFrame,
15620
- itemSurface: "raised"
15621
- }
15622
- }),
15623
- defineBlockAppearancePreset({
15624
- kind: "block-design",
15625
- id: "events-lined-panel",
15626
- target: "events",
15627
- label: "Raised event panel",
15628
- blockKinds: ["block.event-calendar", "block.event-listing"],
15629
- design: {
15630
- sectionSurface: "base",
15631
- contentFrame: panelFrame("raised"),
15632
- itemSurface: "none"
15633
- }
15634
- }),
15635
- defineBlockAppearancePreset({
15636
- kind: "block-design",
15637
- id: "events-ruled-register",
15638
- target: "events",
15639
- label: "Ruled event register",
15640
- blockKinds: ["block.event-calendar", "block.event-listing"],
15641
- design: {
15642
- sectionSurface: "brand-depth-band",
15643
- contentFrame: plainFrame,
15644
- itemSurface: "none",
15645
- eventListTreatment: "ruled-register"
15646
- }
15647
- }),
15648
- defineBlockAppearancePreset({
15649
- kind: "block-design",
15650
- id: "events-editorial-register",
15651
- target: "events",
15652
- label: "Editorial event register",
15653
- blockKinds: ["block.event-calendar", "block.event-listing"],
15654
- design: {
15655
- sectionSurface: "base",
15656
- contentFrame: plainFrame,
15657
- itemSurface: "none",
15658
- eventListTreatment: "editorial-register"
15659
- }
15660
- }),
15661
- defineBlockAppearancePreset({
15662
- kind: "block-design",
15663
- id: "events-dense-index",
15664
- target: "events",
15665
- label: "Dense event index",
15666
- blockKinds: ["block.event-calendar", "block.event-listing"],
15667
- design: {
15668
- sectionSurface: "accent-band",
15669
- contentFrame: plainFrame,
15670
- itemSurface: "none",
15671
- eventListTreatment: "dense-index"
15672
- }
15673
- }),
15674
- defineBlockAppearancePreset({
15675
- kind: "block-design",
15676
- id: "schedule-details-brand-depth",
15677
- target: "events",
15678
- label: "Brand-depth schedule details",
15679
- blockKinds: ["block.event-details", "block.course-details"],
15680
- design: {
15681
- sectionSurface: "brand-depth-band",
15682
- contentFrame: plainFrame,
15683
- itemSurface: "none",
15684
- tileTreatment: "brand-depth"
15685
- }
15686
- }),
15687
- defineBlockAppearancePreset({
15688
- kind: "block-design",
15689
- id: "media-text-flush-feature",
15690
- target: "media-text",
15691
- label: "Flush media feature",
15692
- blockKinds: ["block.media-text"],
15693
- design: {
15694
- sectionSurface: "muted-band",
15695
- contentFrame: flushPanelFrame({ bleed: "start" }),
15696
- itemSurface: "none"
15697
- }
15698
- }),
15699
- defineBlockAppearancePreset({
15700
- kind: "block-design",
15701
- id: "testimonials-simple-cards",
15702
- target: "testimonials",
15703
- label: "Simple testimonial cards",
15704
- blockKinds: ["block.testimonials"],
15705
- design: {
15706
- sectionSurface: "base",
15707
- contentFrame: plainFrame,
15708
- itemSurface: "default"
15709
- }
15710
- }),
15711
- defineBlockAppearancePreset({
15712
- kind: "block-design",
15713
- id: "testimonials-raised-panel",
15714
- target: "testimonials",
15715
- label: "Raised testimonial panel",
15716
- blockKinds: ["block.testimonials"],
15717
- design: {
15718
- sectionSurface: "muted-band",
15719
- contentFrame: panelFrame("raised"),
15720
- itemSurface: "raised"
15721
- }
15722
- }),
15723
- defineBlockAppearancePreset({
15724
- kind: "block-design",
15725
- id: "testimonials-accent-panel",
15726
- target: "testimonials",
15727
- label: "Accent testimonial panel",
15728
- blockKinds: ["block.testimonials"],
15729
- design: {
15730
- sectionSurface: "accent-band",
15731
- contentFrame: panelFrame("raised"),
15732
- itemSurface: "raised"
15733
- }
15734
- }),
15735
- defineBlockAppearancePreset({
15736
- kind: "block-design",
15737
- id: "testimonials-default-cards",
15738
- target: "testimonials",
15739
- label: "Default cards",
15740
- blockKinds: ["block.testimonials"],
15741
- design: {
15742
- sectionSurface: "base",
15743
- contentFrame: plainFrame,
15744
- itemSurface: "none",
15745
- testimonialCardTreatment: "default"
15746
- }
15747
- }),
15748
- defineBlockAppearancePreset({
15749
- kind: "block-design",
15750
- id: "testimonials-statement-cards",
15751
- target: "testimonials",
15752
- label: "Statement cards",
15753
- blockKinds: ["block.testimonials"],
15754
- design: {
15755
- sectionSurface: "accent-band",
15756
- contentFrame: plainFrame,
15757
- itemSurface: "raised",
15758
- testimonialCardTreatment: "statement"
15759
- }
15760
- }),
15761
- defineBlockAppearancePreset({
15762
- kind: "block-design",
15763
- id: "testimonials-brand-statement-cards",
15764
- target: "testimonials",
15765
- label: "Brand statement cards",
15766
- blockKinds: ["block.testimonials"],
15767
- design: {
15768
- sectionSurface: "brand-depth-band",
15769
- contentFrame: plainFrame,
15770
- itemSurface: "raised",
15771
- testimonialCardTreatment: "statement"
15772
- }
15773
- }),
15774
- defineBlockAppearancePreset({
15775
- kind: "block-design",
15776
- id: "testimonials-non-carded",
15777
- target: "testimonials",
15778
- label: "Non-carded",
15779
- blockKinds: ["block.testimonials"],
15780
- design: {
15781
- sectionSurface: "muted-band",
15782
- contentFrame: plainFrame,
15783
- itemSurface: "none",
15784
- testimonialCardTreatment: "non-carded"
15785
- }
15786
- }),
15787
- defineBlockAppearancePreset({
15788
- kind: "block-design",
15789
- id: "testimonials-evergreen-lead",
15790
- target: "testimonials",
15791
- label: "Evergreen lead",
15792
- blockKinds: ["block.testimonials"],
15793
- constraints: { layoutVariantKeys: ["featured-editorial"] },
15794
- design: {
15795
- sectionSurface: "base",
15796
- contentFrame: plainFrame,
15797
- itemSurface: "none"
15798
- }
15799
- }),
15800
- defineBlockAppearancePreset({
15801
- kind: "block-design",
15802
- id: "testimonials-room-and-response",
15803
- target: "testimonials",
15804
- label: "Room and response",
15805
- blockKinds: ["block.testimonials"],
15806
- constraints: { layoutVariantKeys: ["featured-editorial"] },
15807
- design: {
15808
- sectionSurface: "base",
15809
- contentFrame: plainFrame,
15810
- itemSurface: "none"
15811
- }
15812
- }),
15813
- defineBlockAppearancePreset({
15814
- kind: "block-design",
15815
- id: "testimonials-open-floor",
15816
- target: "testimonials",
15817
- label: "Open floor",
15818
- blockKinds: ["block.testimonials"],
15819
- constraints: { layoutVariantKeys: ["featured-editorial"] },
15820
- design: {
15821
- sectionSurface: "base",
15822
- contentFrame: plainFrame,
15823
- itemSurface: "none"
15824
- }
15825
- }),
15826
- defineBlockAppearancePreset({
15827
- kind: "block-design",
15828
- id: "faq-base-accordion",
15829
- target: "faq",
15830
- label: "Base accordion FAQ",
15831
- blockKinds: ["block.faq"],
15832
- design: {
15833
- sectionSurface: "base",
15834
- contentFrame: plainFrame,
15835
- itemSurface: "default"
15836
- }
15837
- }),
15838
- defineBlockAppearancePreset({
15839
- kind: "block-design",
15840
- id: "faq-contained-help",
15841
- target: "faq",
15842
- label: "Contained help panel",
15843
- blockKinds: ["block.faq"],
15844
- design: {
15845
- sectionSurface: "muted-band",
15846
- contentFrame: panelFrame("inset"),
15847
- itemSurface: "default"
15848
- }
15849
- }),
15850
- defineBlockAppearancePreset({
15851
- kind: "block-design",
15852
- id: "contact-form-panel",
15853
- target: "contact-form",
15854
- label: "Raised form panel",
15855
- blockKinds: ["block.form"],
15856
- design: {
15857
- sectionSurface: "muted-band",
15858
- contentFrame: panelFrame("raised"),
15859
- itemSurface: "none"
15860
- }
15861
- }),
15862
- defineBlockAppearancePreset({
15863
- kind: "block-design",
15864
- id: "cta-accent-band",
15865
- target: "cta",
15866
- label: "Accent CTA band",
15867
- blockKinds: ["block.cta-full"],
15868
- design: {
15869
- sectionSurface: "accent-band",
15870
- contentFrame: plainFrame,
15871
- itemSurface: "none",
15872
- eyebrowTreatment: "accent"
15873
- }
15874
- })
15875
- ];
15328
+ }],
15329
+ design: {
15330
+ sectionSurface: "hero-image",
15331
+ contentFrame: plainFrame,
15332
+ itemSurface: "none",
15333
+ sectionHeight: "immersive",
15334
+ heroComposition: "center",
15335
+ heroTypographyScale: "poster",
15336
+ imageSurfaceTreatment: {
15337
+ kind: "brand-scrim",
15338
+ token: "primary",
15339
+ intensity: "strong"
15340
+ }
15341
+ }
15342
+ }), defineBlockAppearancePreset({
15343
+ id: "hero-brand-scrim",
15344
+ target: "hero",
15345
+ label: "Brand scrim image hero",
15346
+ blockKinds: ["block.hero"],
15347
+ constraints: { layoutFamilies: ["centered", "compact"] },
15348
+ optionGroups: brandScrimOptionGroups,
15349
+ layoutPatches: microBannerLayoutPatches,
15350
+ design: {
15351
+ sectionSurface: "hero-image",
15352
+ contentFrame: plainFrame,
15353
+ itemSurface: "none",
15354
+ sectionHeight: "immersive",
15355
+ heroComposition: "center",
15356
+ heroTypographyScale: "display",
15357
+ imageSurfaceTreatment: {
15358
+ kind: "brand-scrim",
15359
+ token: "primary"
15360
+ }
15361
+ }
15362
+ }), defineBlockAppearancePreset({
15363
+ id: "hero-brand-scrim-fixed-frame",
15364
+ target: "hero",
15365
+ label: "Fixed-frame brand scrim hero",
15366
+ blockKinds: ["block.hero"],
15367
+ constraints: { layoutFamilies: ["centered", "compact"] },
15368
+ optionGroups: brandScrimOptionGroups,
15369
+ layoutPatches: microBannerLayoutPatches,
15370
+ design: {
15371
+ sectionSurface: "hero-image",
15372
+ contentFrame: plainFrame,
15373
+ itemSurface: "none",
15374
+ sectionHeight: "immersive",
15375
+ heroComposition: "center",
15376
+ heroTypographyScale: "display",
15377
+ imageSurfaceTreatment: {
15378
+ kind: "brand-scrim",
15379
+ token: "primary"
15380
+ },
15381
+ imageSurfaceMotion: "fixed-frame",
15382
+ eyebrowTreatment: "accent-pill-bounce"
15383
+ }
15384
+ }), defineBlockAppearancePreset({
15385
+ id: "hero-brand-depth-expressive",
15386
+ target: "hero",
15387
+ label: "Expressive brand-depth hero",
15388
+ blockKinds: ["block.hero"],
15389
+ constraints: { layoutFamilies: ["centered", "compact"] },
15390
+ design: {
15391
+ sectionSurface: "brand-depth-band",
15392
+ contentFrame: plainFrame,
15393
+ itemSurface: "none",
15394
+ heroComposition: "center",
15395
+ heroTypographyScale: "editorial",
15396
+ eyebrowTreatment: "accent-pill-bounce"
15397
+ }
15398
+ }), defineBlockAppearancePreset({
15399
+ id: "hero-contained-intro",
15400
+ target: "hero",
15401
+ label: "Contained intro hero",
15402
+ blockKinds: ["block.hero"],
15403
+ design: {
15404
+ sectionSurface: "muted-band",
15405
+ contentFrame: panelFrame("inset"),
15406
+ itemSurface: "none",
15407
+ heroComposition: "center",
15408
+ heroTypographyScale: "editorial"
15409
+ }
15410
+ }), defineBlockAppearancePreset({
15411
+ id: "hero-split-editorial",
15412
+ target: "hero",
15413
+ label: "Editorial split hero",
15414
+ blockKinds: ["block.hero"],
15415
+ constraints: { layoutFamilies: ["split"] },
15416
+ design: {
15417
+ sectionSurface: "base",
15418
+ contentFrame: plainFrame,
15419
+ itemSurface: "none",
15420
+ heroTypographyScale: "editorial"
15421
+ }
15422
+ }), defineBlockAppearancePreset({
15423
+ id: "hero-split-brand",
15424
+ target: "hero",
15425
+ label: "Brand split hero",
15426
+ blockKinds: ["block.hero"],
15427
+ constraints: { layoutFamilies: ["split"] },
15428
+ design: {
15429
+ sectionSurface: "brand-depth-band",
15430
+ contentFrame: plainFrame,
15431
+ itemSurface: "none",
15432
+ heroTypographyScale: "display",
15433
+ eyebrowTreatment: "accent-pill-bounce"
15434
+ }
15435
+ }), defineBlockAppearancePreset({
15436
+ id: "hero-split-soft-panel",
15437
+ target: "hero",
15438
+ label: "Soft panel split hero",
15439
+ blockKinds: ["block.hero"],
15440
+ constraints: { layoutFamilies: ["split"] },
15441
+ design: {
15442
+ sectionSurface: "muted-band",
15443
+ contentFrame: panelFrame("raised"),
15444
+ itemSurface: "none",
15445
+ heroTypographyScale: "editorial"
15446
+ }
15447
+ }), defineBlockAppearancePreset({
15448
+ id: "hero-split-accent",
15449
+ target: "hero",
15450
+ label: "Accent split hero",
15451
+ blockKinds: ["block.hero"],
15452
+ constraints: { layoutFamilies: ["split"] },
15453
+ design: {
15454
+ sectionSurface: "accent-band",
15455
+ contentFrame: panelFrame("raised"),
15456
+ itemSurface: "none",
15457
+ heroTypographyScale: "display"
15458
+ }
15459
+ }), defineBlockAppearancePreset({
15460
+ id: "intro-editorial-statement",
15461
+ target: "intro",
15462
+ label: "Editorial intro statement",
15463
+ blockKinds: ["block.intro"],
15464
+ constraints: { layoutVariantKeys: ["centered-copy", "statement-copy"] },
15465
+ design: {
15466
+ sectionSurface: "base",
15467
+ contentFrame: plainFrame,
15468
+ itemSurface: "none",
15469
+ composition: {
15470
+ kind: "intro",
15471
+ treatment: "editorial-statement"
15472
+ }
15473
+ }
15474
+ }), defineBlockAppearancePreset({
15475
+ id: "intro-portrait-bio",
15476
+ target: "intro",
15477
+ label: "Portrait and bio",
15478
+ blockKinds: ["block.intro"],
15479
+ constraints: { layoutVariantKeys: ["media-copy"] },
15480
+ design: {
15481
+ sectionSurface: "base",
15482
+ contentFrame: plainFrame,
15483
+ itemSurface: "none",
15484
+ composition: {
15485
+ kind: "intro",
15486
+ treatment: "portrait-bio"
15487
+ }
15488
+ }
15489
+ }), defineBlockAppearancePreset({
15490
+ id: "offerings-preview-default-cards",
15491
+ target: "offerings",
15492
+ label: "Default offering cards",
15493
+ blockKinds: ["block.offerings-preview"],
15494
+ design: {
15495
+ sectionSurface: "base",
15496
+ contentFrame: plainFrame,
15497
+ itemSurface: "default"
15498
+ }
15499
+ }), defineBlockAppearancePreset({
15500
+ id: "offerings-preview-secondary-cards",
15501
+ target: "offerings",
15502
+ label: "Secondary offering cards",
15503
+ blockKinds: ["block.offerings-preview"],
15504
+ design: {
15505
+ sectionSurface: "muted-band",
15506
+ contentFrame: plainFrame,
15507
+ itemSurface: "inset"
15508
+ }
15509
+ }), defineBlockAppearancePreset({
15510
+ id: "offerings-preview-non-carded",
15511
+ target: "offerings",
15512
+ label: "Non-carded offerings",
15513
+ blockKinds: ["block.offerings-preview"],
15514
+ design: {
15515
+ sectionSurface: "muted-band",
15516
+ contentFrame: plainFrame,
15517
+ itemSurface: "editorial"
15518
+ }
15519
+ }), defineBlockAppearancePreset({
15520
+ id: "offerings-preview-paired-feature-cards",
15521
+ target: "offerings",
15522
+ label: "Paired feature cards",
15523
+ blockKinds: ["block.offerings-preview"],
15524
+ constraints: { layoutVariantKeys: ["cards"] },
15525
+ design: {
15526
+ sectionSurface: "base",
15527
+ contentFrame: plainFrame,
15528
+ itemSurface: "none"
15529
+ }
15530
+ }), defineBlockAppearancePreset({
15531
+ id: "offerings-preview-open-editorial-columns",
15532
+ target: "offerings",
15533
+ label: "Open editorial columns",
15534
+ blockKinds: ["block.offerings-preview"],
15535
+ constraints: { layoutVariantKeys: ["cards"] },
15536
+ design: {
15537
+ sectionSurface: "base",
15538
+ contentFrame: plainFrame,
15539
+ itemSurface: "none"
15540
+ }
15541
+ }), defineBlockAppearancePreset({
15542
+ id: "offerings-preview-joined-programme-panel",
15543
+ target: "offerings",
15544
+ label: "Joined programme panel",
15545
+ blockKinds: ["block.offerings-preview"],
15546
+ constraints: { layoutVariantKeys: ["cards"] },
15547
+ design: {
15548
+ sectionSurface: "base",
15549
+ contentFrame: plainFrame,
15550
+ itemSurface: "none"
15551
+ }
15552
+ }), defineBlockAppearancePreset({
15553
+ id: "feature-cards-raised-rule",
15554
+ target: "feature-cards",
15555
+ label: "Raised cards with rule",
15556
+ blockKinds: ["block.feature-cards"],
15557
+ design: {
15558
+ sectionSurface: "base",
15559
+ contentFrame: plainFrame,
15560
+ itemSurface: "raised"
15561
+ }
15562
+ }), defineBlockAppearancePreset({
15563
+ id: "feature-cards-bold-colors",
15564
+ target: "feature-cards",
15565
+ label: "Bold colour-blocked cards",
15566
+ blockKinds: ["block.feature-cards"],
15567
+ design: {
15568
+ sectionSurface: "base",
15569
+ contentFrame: plainFrame,
15570
+ itemSurface: "color-blocked"
15571
+ }
15572
+ }), defineBlockAppearancePreset({
15573
+ id: "feature-cards-editorial-columns",
15574
+ target: "feature-cards",
15575
+ label: "Editorial open columns",
15576
+ blockKinds: ["block.feature-cards"],
15577
+ design: {
15578
+ sectionSurface: "base",
15579
+ contentFrame: plainFrame,
15580
+ itemSurface: "editorial"
15581
+ }
15582
+ }), defineBlockAppearancePreset({
15583
+ id: "feature-cards-asymmetric-emphasis",
15584
+ target: "feature-cards",
15585
+ label: "Asymmetric emphasis pair",
15586
+ blockKinds: ["block.feature-cards"],
15587
+ constraints: { layoutFamilies: ["grid"] },
15588
+ design: {
15589
+ sectionSurface: "base",
15590
+ contentFrame: plainFrame,
15591
+ itemSurface: "none",
15592
+ composition: {
15593
+ kind: "feature-cards",
15594
+ treatment: "asymmetric-emphasis"
15595
+ }
15596
+ }
15597
+ }), defineBlockAppearancePreset({
15598
+ id: "feature-cards-framed-programme",
15599
+ target: "feature-cards",
15600
+ label: "Framed programme cards",
15601
+ blockKinds: ["block.feature-cards"],
15602
+ constraints: { layoutFamilies: ["grid"] },
15603
+ design: {
15604
+ sectionSurface: "brand-depth-band",
15605
+ contentFrame: plainFrame,
15606
+ itemSurface: "inset",
15607
+ composition: {
15608
+ kind: "feature-cards",
15609
+ treatment: "framed-programme"
15610
+ }
15611
+ }
15612
+ }), defineBlockAppearancePreset({
15613
+ id: "feature-cards-soft-panels",
15614
+ target: "feature-cards",
15615
+ label: "Soft tinted panels",
15616
+ blockKinds: ["block.feature-cards"],
15617
+ design: {
15618
+ sectionSurface: "base",
15619
+ contentFrame: plainFrame,
15620
+ itemSurface: "inset"
15621
+ }
15622
+ }), defineBlockAppearancePreset({
15623
+ id: "feature-cards-editorial-diptych",
15624
+ target: "feature-cards",
15625
+ label: "Editorial diptych",
15626
+ blockKinds: ["block.feature-cards"],
15627
+ constraints: { layoutVariantKeys: ["editorial-diptych"] },
15628
+ design: {
15629
+ sectionSurface: "base",
15630
+ contentFrame: plainFrame,
15631
+ itemSurface: "flat"
15632
+ }
15633
+ }), defineBlockAppearancePreset({
15634
+ id: "feature-cards-editorial-pathways",
15635
+ target: "feature-cards",
15636
+ label: "Editorial pathways",
15637
+ blockKinds: ["block.feature-cards"],
15638
+ constraints: { layoutVariantKeys: ["editorial-pathways"] },
15639
+ design: {
15640
+ sectionSurface: "base",
15641
+ contentFrame: plainFrame,
15642
+ itemSurface: "flat"
15643
+ }
15644
+ }), defineBlockAppearancePreset({
15645
+ id: "feature-cards-photo-tiles",
15646
+ target: "feature-cards",
15647
+ label: "Photo tiles",
15648
+ blockKinds: ["block.feature-cards"],
15649
+ design: {
15650
+ sectionSurface: "base",
15651
+ contentFrame: plainFrame,
15652
+ itemSurface: "raised"
15653
+ }
15654
+ }), defineBlockAppearancePreset({
15655
+ id: "events-lined-panel",
15656
+ target: "events",
15657
+ label: "Raised event panel",
15658
+ blockKinds: ["block.event-calendar", "block.event-listing"],
15659
+ design: {
15660
+ sectionSurface: "base",
15661
+ contentFrame: panelFrame("raised"),
15662
+ itemSurface: "none"
15663
+ }
15664
+ }), defineBlockAppearancePreset({
15665
+ id: "events-ruled-register",
15666
+ target: "events",
15667
+ label: "Ruled event register",
15668
+ blockKinds: ["block.event-calendar", "block.event-listing"],
15669
+ design: {
15670
+ sectionSurface: "brand-depth-band",
15671
+ contentFrame: plainFrame,
15672
+ itemSurface: "none",
15673
+ eventListTreatment: "ruled-register"
15674
+ }
15675
+ }), defineBlockAppearancePreset({
15676
+ id: "events-editorial-register",
15677
+ target: "events",
15678
+ label: "Editorial event register",
15679
+ blockKinds: ["block.event-calendar", "block.event-listing"],
15680
+ design: {
15681
+ sectionSurface: "base",
15682
+ contentFrame: plainFrame,
15683
+ itemSurface: "none",
15684
+ eventListTreatment: "editorial-register"
15685
+ }
15686
+ }), defineBlockAppearancePreset({
15687
+ id: "events-dense-index",
15688
+ target: "events",
15689
+ label: "Dense event index",
15690
+ blockKinds: ["block.event-calendar", "block.event-listing"],
15691
+ design: {
15692
+ sectionSurface: "accent-band",
15693
+ contentFrame: plainFrame,
15694
+ itemSurface: "none",
15695
+ eventListTreatment: "dense-index"
15696
+ }
15697
+ }), defineBlockAppearancePreset({
15698
+ id: "schedule-details-brand-depth",
15699
+ target: "events",
15700
+ label: "Brand-depth schedule details",
15701
+ blockKinds: ["block.event-details", "block.course-details"],
15702
+ design: {
15703
+ sectionSurface: "brand-depth-band",
15704
+ contentFrame: plainFrame,
15705
+ itemSurface: "none",
15706
+ tileTreatment: "brand-depth"
15707
+ }
15708
+ }), defineBlockAppearancePreset({
15709
+ id: "media-text-flush-feature",
15710
+ target: "media-text",
15711
+ label: "Flush media feature",
15712
+ blockKinds: ["block.media-text"],
15713
+ design: {
15714
+ sectionSurface: "muted-band",
15715
+ contentFrame: flushPanelFrame({ bleed: "start" }),
15716
+ itemSurface: "none"
15717
+ }
15718
+ }), defineBlockAppearancePreset({
15719
+ id: "testimonials-simple-cards",
15720
+ target: "testimonials",
15721
+ label: "Simple testimonial cards",
15722
+ blockKinds: ["block.testimonials"],
15723
+ design: {
15724
+ sectionSurface: "base",
15725
+ contentFrame: plainFrame,
15726
+ itemSurface: "default"
15727
+ }
15728
+ }), defineBlockAppearancePreset({
15729
+ id: "testimonials-raised-panel",
15730
+ target: "testimonials",
15731
+ label: "Raised testimonial panel",
15732
+ blockKinds: ["block.testimonials"],
15733
+ design: {
15734
+ sectionSurface: "muted-band",
15735
+ contentFrame: panelFrame("raised"),
15736
+ itemSurface: "raised"
15737
+ }
15738
+ }), defineBlockAppearancePreset({
15739
+ id: "testimonials-accent-panel",
15740
+ target: "testimonials",
15741
+ label: "Accent testimonial panel",
15742
+ blockKinds: ["block.testimonials"],
15743
+ design: {
15744
+ sectionSurface: "accent-band",
15745
+ contentFrame: panelFrame("raised"),
15746
+ itemSurface: "raised"
15747
+ }
15748
+ }), defineBlockAppearancePreset({
15749
+ id: "testimonials-default-cards",
15750
+ target: "testimonials",
15751
+ label: "Default cards",
15752
+ blockKinds: ["block.testimonials"],
15753
+ design: {
15754
+ sectionSurface: "base",
15755
+ contentFrame: plainFrame,
15756
+ itemSurface: "none",
15757
+ testimonialCardTreatment: "default"
15758
+ }
15759
+ }), defineBlockAppearancePreset({
15760
+ id: "testimonials-statement-cards",
15761
+ target: "testimonials",
15762
+ label: "Statement cards",
15763
+ blockKinds: ["block.testimonials"],
15764
+ design: {
15765
+ sectionSurface: "accent-band",
15766
+ contentFrame: plainFrame,
15767
+ itemSurface: "raised",
15768
+ testimonialCardTreatment: "statement"
15769
+ }
15770
+ }), defineBlockAppearancePreset({
15771
+ id: "testimonials-brand-statement-cards",
15772
+ target: "testimonials",
15773
+ label: "Brand statement cards",
15774
+ blockKinds: ["block.testimonials"],
15775
+ design: {
15776
+ sectionSurface: "brand-depth-band",
15777
+ contentFrame: plainFrame,
15778
+ itemSurface: "raised",
15779
+ testimonialCardTreatment: "statement"
15780
+ }
15781
+ }), defineBlockAppearancePreset({
15782
+ id: "testimonials-non-carded",
15783
+ target: "testimonials",
15784
+ label: "Non-carded",
15785
+ blockKinds: ["block.testimonials"],
15786
+ design: {
15787
+ sectionSurface: "muted-band",
15788
+ contentFrame: plainFrame,
15789
+ itemSurface: "none",
15790
+ testimonialCardTreatment: "non-carded"
15791
+ }
15792
+ }), defineBlockAppearancePreset({
15793
+ id: "testimonials-evergreen-lead",
15794
+ target: "testimonials",
15795
+ label: "Evergreen lead",
15796
+ blockKinds: ["block.testimonials"],
15797
+ constraints: { layoutVariantKeys: ["featured-editorial"] },
15798
+ design: {
15799
+ sectionSurface: "base",
15800
+ contentFrame: plainFrame,
15801
+ itemSurface: "none"
15802
+ }
15803
+ }), defineBlockAppearancePreset({
15804
+ id: "testimonials-room-and-response",
15805
+ target: "testimonials",
15806
+ label: "Room and response",
15807
+ blockKinds: ["block.testimonials"],
15808
+ constraints: { layoutVariantKeys: ["featured-editorial"] },
15809
+ design: {
15810
+ sectionSurface: "base",
15811
+ contentFrame: plainFrame,
15812
+ itemSurface: "none"
15813
+ }
15814
+ }), defineBlockAppearancePreset({
15815
+ id: "testimonials-open-floor",
15816
+ target: "testimonials",
15817
+ label: "Open floor",
15818
+ blockKinds: ["block.testimonials"],
15819
+ constraints: { layoutVariantKeys: ["featured-editorial"] },
15820
+ design: {
15821
+ sectionSurface: "base",
15822
+ contentFrame: plainFrame,
15823
+ itemSurface: "none"
15824
+ }
15825
+ }), defineBlockAppearancePreset({
15826
+ id: "faq-base-accordion",
15827
+ target: "faq",
15828
+ label: "Base accordion FAQ",
15829
+ blockKinds: ["block.faq"],
15830
+ design: {
15831
+ sectionSurface: "base",
15832
+ contentFrame: plainFrame,
15833
+ itemSurface: "default"
15834
+ }
15835
+ }), defineBlockAppearancePreset({
15836
+ id: "faq-contained-help",
15837
+ target: "faq",
15838
+ label: "Contained help panel",
15839
+ blockKinds: ["block.faq"],
15840
+ design: {
15841
+ sectionSurface: "muted-band",
15842
+ contentFrame: panelFrame("inset"),
15843
+ itemSurface: "default"
15844
+ }
15845
+ }), defineBlockAppearancePreset({
15846
+ id: "contact-form-panel",
15847
+ target: "contact-form",
15848
+ label: "Raised form panel",
15849
+ blockKinds: ["block.form"],
15850
+ design: {
15851
+ sectionSurface: "muted-band",
15852
+ contentFrame: panelFrame("raised"),
15853
+ itemSurface: "none"
15854
+ }
15855
+ }), defineBlockAppearancePreset({
15856
+ id: "cta-accent-band",
15857
+ target: "cta",
15858
+ label: "Accent CTA band",
15859
+ blockKinds: ["block.cta-full"],
15860
+ design: {
15861
+ sectionSurface: "accent-band",
15862
+ contentFrame: plainFrame,
15863
+ itemSurface: "none",
15864
+ eyebrowTreatment: "accent"
15865
+ }
15866
+ });
15876
15867
  }));
15877
15868
  var init_appearancePresetCatalog = __esmMin((() => {
15878
15869
  init_blockAppearancePresets();
15879
- [...blockAppearancePresets];
15880
15870
  }));
15881
15871
  var init_appearancePresetTypes = __esmMin((() => {}));
15882
15872
  //#endregion
@@ -17578,6 +17568,12 @@ function requirePaletteColorsFromEntries(entries) {
17578
17568
  if (result.ok) return result.colors;
17579
17569
  throw new Error(`Invalid complete palette: ${result.error.kind}`);
17580
17570
  }
17571
+ function paletteColorEntries(colors) {
17572
+ return THEME_PALETTE_COLOR_ORDER.map((name) => ({
17573
+ name,
17574
+ hex: colors[name]
17575
+ }));
17576
+ }
17581
17577
  function paletteColorFingerprint(colors) {
17582
17578
  return PALETTE_TOKEN_NAMES.map((name) => `${name}:${colors[name]}`).join("|");
17583
17579
  }
@@ -17585,7 +17581,7 @@ function canonicalPaletteHashInput(colors, mode) {
17585
17581
  return `${mode}|${paletteColorFingerprint(colors)}`;
17586
17582
  }
17587
17583
  /**
17588
- * The shared TypeScript/SQL protocol. Do not reorder roles: the order comes
17584
+ * Stable curated-catalogue identity. Do not reorder roles: the order comes
17589
17585
  * from PALETTE_TOKEN_NAMES through canonicalPaletteHashInput.
17590
17586
  */
17591
17587
  function paletteValueKey(colors, mode) {
@@ -17610,11 +17606,26 @@ function parsePaletteValueKey(value) {
17610
17606
  if (!colors.ok || paletteValueKey(colors.colors, mode.data) !== value) return null;
17611
17607
  return value;
17612
17608
  }
17613
- var HEX_COLOR_REGEX, NORMALIZABLE_HEX_REGEX, hexColorSchema, paletteModeSchema, PALETTE_VALUE_KEY_PREFIX, paletteColorsSchema, paletteValueKeySchema;
17609
+ var HEX_COLOR_REGEX, NORMALIZABLE_HEX_REGEX, THEME_PALETTE_COLOR_ORDER, hexColorSchema, paletteModeSchema, PALETTE_VALUE_KEY_PREFIX, paletteColorsSchema, paletteValueKeySchema;
17614
17610
  var init_colors = __esmMin((() => {
17615
17611
  init_themeColorTokens();
17616
17612
  HEX_COLOR_REGEX = /^#[0-9a-f]{6}$/;
17617
17613
  NORMALIZABLE_HEX_REGEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;
17614
+ THEME_PALETTE_COLOR_ORDER = [
17615
+ "primary",
17616
+ "secondary",
17617
+ "accent",
17618
+ "success",
17619
+ "warning",
17620
+ "destructive",
17621
+ "background",
17622
+ "surface",
17623
+ "surfaceAlt",
17624
+ "muted",
17625
+ "text",
17626
+ "primaryForeground",
17627
+ "border"
17628
+ ];
17618
17629
  hexColorSchema = z$1.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
17619
17630
  paletteModeSchema = z$1.enum(["light", "dark"]);
17620
17631
  PALETTE_VALUE_KEY_PREFIX = "palette-value:v1|";
@@ -17644,8 +17655,18 @@ var init_colors = __esmMin((() => {
17644
17655
  return z$1.NEVER;
17645
17656
  });
17646
17657
  }));
17647
- var init_editorState = __esmMin((() => {}));
17648
- var init_libraryModel = __esmMin((() => {}));
17658
+ function concretePaletteToTheme(palette) {
17659
+ return {
17660
+ colors: paletteColorEntries(palette.colors),
17661
+ meta: { mode: palette.mode }
17662
+ };
17663
+ }
17664
+ var init_concretePalette = __esmMin((() => {
17665
+ init_colors();
17666
+ }));
17667
+ var init_fromVibrant = __esmMin((() => {
17668
+ init_utils$6();
17669
+ }));
17649
17670
  //#endregion
17650
17671
  //#region ../theme-core/src/site-styles/styleTags.ts
17651
17672
  var STYLE_AXIS_VALUES, styleTagsSchema;
@@ -18935,13 +18956,6 @@ var init_warm_dark = __esmMin((() => {
18935
18956
  }));
18936
18957
  //#endregion
18937
18958
  //#region ../theme-core/src/palette/curated/index.ts
18938
- /**
18939
- * Curated palette library.
18940
- *
18941
- * Authoring keys are readable source aliases. Value keys are derived from the
18942
- * complete mode and semantic colours and are the only curated identity used at
18943
- * persistence and runtime boundaries.
18944
- */
18945
18959
  function admitCuratedPaletteDefinition(definition) {
18946
18960
  return {
18947
18961
  ...definition,
@@ -18959,9 +18973,8 @@ function requireCuratedPaletteValueKey(authoringKey) {
18959
18973
  if (!palette) throw new Error(`Unknown curated palette authoring key "${authoringKey}"`);
18960
18974
  return palette.valueKey;
18961
18975
  }
18962
- var curatedPalettes, curatedPalettesByValueKey, curatedPalettesByAuthoringKey, knownCuratedPaletteValueKeySchema;
18976
+ var curatedPalettes, curatedPalettesByValueKey, curatedPalettesByAuthoringKey;
18963
18977
  var init_curated = __esmMin((() => {
18964
- init_colors();
18965
18978
  init_brand_led();
18966
18979
  init_high_contrast();
18967
18980
  init_soft_natural();
@@ -18990,105 +19003,6 @@ var init_curated = __esmMin((() => {
18990
19003
  ];
18991
19004
  curatedPalettesByValueKey = new Map(curatedPalettes.map((palette) => [palette.valueKey, palette]));
18992
19005
  curatedPalettesByAuthoringKey = new Map(curatedPalettes.map((palette) => [palette.authoringKey, palette]));
18993
- knownCuratedPaletteValueKeySchema = z$1.string().transform((value, ctx) => {
18994
- const valueKey = parsePaletteValueKey(value);
18995
- if (!valueKey) {
18996
- ctx.addIssue({
18997
- code: "custom",
18998
- message: "Invalid canonical palette value key"
18999
- });
19000
- return z$1.NEVER;
19001
- }
19002
- const palette = findCuratedPalette(valueKey);
19003
- if (!palette) {
19004
- ctx.addIssue({
19005
- code: "custom",
19006
- message: "Unknown curated palette value key"
19007
- });
19008
- return z$1.NEVER;
19009
- }
19010
- return palette.valueKey;
19011
- });
19012
- }));
19013
- var init_resolveSelection = __esmMin((() => {
19014
- init_curated();
19015
- })), sitePaletteIdSchema, sitePaletteVersionSchema, paletteSelectionSchema, onboardingPaletteOriginSchema, curatedForkPaletteOriginSchema, manualPaletteOriginSchema, legacyCustomizedPaletteOriginSchema, sitePaletteOriginSchema, editorSitePaletteOriginSchema, paletteCommandSchema;
19016
- var init_selection$1 = __esmMin((() => {
19017
- init_colors();
19018
- init_curated();
19019
- sitePaletteIdSchema = z$1.string().uuid().transform((value) => value);
19020
- sitePaletteVersionSchema = z$1.number().int().nonnegative().transform((value) => value);
19021
- paletteSelectionSchema = z$1.discriminatedUnion("kind", [z$1.object({
19022
- kind: z$1.literal("curated"),
19023
- valueKey: knownCuratedPaletteValueKeySchema
19024
- }), z$1.object({
19025
- kind: z$1.literal("site"),
19026
- paletteId: sitePaletteIdSchema
19027
- })]);
19028
- onboardingPaletteOriginSchema = z$1.object({
19029
- kind: z$1.literal("onboarding"),
19030
- sourceKey: z$1.string().min(1).nullable()
19031
- });
19032
- curatedForkPaletteOriginSchema = z$1.object({
19033
- kind: z$1.literal("curated-fork"),
19034
- sourceValueKey: paletteValueKeySchema
19035
- });
19036
- manualPaletteOriginSchema = z$1.object({ kind: z$1.literal("manual") });
19037
- legacyCustomizedPaletteOriginSchema = z$1.object({
19038
- kind: z$1.literal("legacy-customized"),
19039
- sourceKey: z$1.string().min(1).nullable()
19040
- });
19041
- sitePaletteOriginSchema = z$1.discriminatedUnion("kind", [
19042
- onboardingPaletteOriginSchema,
19043
- curatedForkPaletteOriginSchema,
19044
- manualPaletteOriginSchema,
19045
- legacyCustomizedPaletteOriginSchema
19046
- ]);
19047
- editorSitePaletteOriginSchema = z$1.discriminatedUnion("kind", [z$1.object({
19048
- kind: z$1.literal("curated-fork"),
19049
- sourceValueKey: knownCuratedPaletteValueKeySchema
19050
- }), manualPaletteOriginSchema]);
19051
- z$1.object({
19052
- id: sitePaletteIdSchema,
19053
- colors: paletteColorsSchema,
19054
- mode: paletteModeSchema,
19055
- origin: sitePaletteOriginSchema,
19056
- version: sitePaletteVersionSchema
19057
- });
19058
- paletteCommandSchema = z$1.discriminatedUnion("kind", [
19059
- z$1.object({ kind: z$1.literal("preserve") }),
19060
- z$1.object({
19061
- kind: z$1.literal("select"),
19062
- selection: paletteSelectionSchema
19063
- }),
19064
- z$1.object({
19065
- kind: z$1.literal("create-site"),
19066
- colors: paletteColorsSchema,
19067
- mode: paletteModeSchema,
19068
- origin: editorSitePaletteOriginSchema
19069
- }),
19070
- z$1.object({
19071
- kind: z$1.literal("update-site"),
19072
- paletteId: sitePaletteIdSchema,
19073
- expectedVersion: sitePaletteVersionSchema,
19074
- colors: paletteColorsSchema,
19075
- mode: paletteModeSchema
19076
- })
19077
- ]);
19078
- }));
19079
- var init_persistenceReadSource = __esmMin((() => {
19080
- init_curated();
19081
- init_colors();
19082
- init_resolveSelection();
19083
- init_selection$1();
19084
- }));
19085
- var init_sitePalettePersistence = __esmMin((() => {
19086
- init_curated();
19087
- init_colors();
19088
- init_selection$1();
19089
- }));
19090
- var init_fromVibrant = __esmMin((() => {
19091
- init_utils$6();
19092
19006
  }));
19093
19007
  //#endregion
19094
19008
  //#region ../theme-core/src/palette/index.ts
@@ -19104,12 +19018,7 @@ var init_palette = __esmMin((() => {
19104
19018
  init_paletteAccess();
19105
19019
  init_extractPalette();
19106
19020
  init_colors();
19107
- init_editorState();
19108
- init_libraryModel();
19109
- init_persistenceReadSource();
19110
- init_resolveSelection();
19111
- init_selection$1();
19112
- init_sitePalettePersistence();
19021
+ init_concretePalette();
19113
19022
  init_fromVibrant();
19114
19023
  init_suggestRecipes();
19115
19024
  init_allRecipes();
@@ -19274,6 +19183,47 @@ var init_backgroundAppearance = __esmMin((() => {
19274
19183
  var init_compositionBudget = __esmMin((() => {
19275
19184
  init_types$15();
19276
19185
  }));
19186
+ var init_headerStyleParts = __esmMin((() => {}));
19187
+ var headerInteractionPaletteValues, headerInteractionPaletteSchema;
19188
+ var init_interactionPalette = __esmMin((() => {
19189
+ headerInteractionPaletteValues = [
19190
+ "primary",
19191
+ "secondary",
19192
+ "accent"
19193
+ ];
19194
+ headerInteractionPaletteSchema = z$1.enum(headerInteractionPaletteValues);
19195
+ }));
19196
+ var clearSplitInteractionPalette;
19197
+ var init_headerInteractionPalette = __esmMin((() => {
19198
+ init_interactionPalette();
19199
+ init_lookOptionGroups();
19200
+ clearSplitInteractionPalette = defineLookOptionGroup({
19201
+ id: "interaction-palette",
19202
+ label: "Hover colour",
19203
+ defaultOptionId: "accent",
19204
+ options: [
19205
+ {
19206
+ id: "accent",
19207
+ label: "Accent"
19208
+ },
19209
+ {
19210
+ id: "primary",
19211
+ label: "Primary"
19212
+ },
19213
+ {
19214
+ id: "secondary",
19215
+ label: "Secondary"
19216
+ }
19217
+ ]
19218
+ });
19219
+ }));
19220
+ var init_headerOpeningForeground = __esmMin((() => {
19221
+ init_expandPalette();
19222
+ init_colorConversion();
19223
+ init_tokens();
19224
+ init_colorTokenParts();
19225
+ init_types$15();
19226
+ }));
19277
19227
  var init_customizableSurfaces = __esmMin((() => {
19278
19228
  init_types$15();
19279
19229
  })), logoTextConfidenceValues, logoAssetShapeValues, logoKindValues, logoDensityValues, logoContainsTextSchema, logoAnalysisSourceSchema, brandDisplayModeValues, logoAccommodationPatternValues, logoSizePolicyValues;
@@ -19384,7 +19334,7 @@ function asHeaderStyleId(value) {
19384
19334
  * optional nested styling fields that would otherwise leak from another Look.
19385
19335
  */
19386
19336
  function baseHeader(theme) {
19387
- const { navLinkStyle: _navLinkStyle, navFontRole: _navFontRole, navTypography: _navTypography, navTextSize: _navTextSize, dropdownStyle: _dropdownStyle, ctaVariant: _ctaVariant, navContainer: _navContainer, container: _container, shadow: _shadow, logo: _logo, logoText: _logoText, border: _border, ...header } = theme.header;
19337
+ const { navLinkStyle: _navLinkStyle, navFontRole: _navFontRole, navTypography: _navTypography, navTextSize: _navTextSize, interactionPalette: _interactionPalette, dropdownStyle: _dropdownStyle, ctaVariant: _ctaVariant, navContainer: _navContainer, container: _container, shadow: _shadow, logo: _logo, logoText: _logoText, border: _border, ...header } = theme.header;
19388
19338
  return {
19389
19339
  ...header,
19390
19340
  navContainer: {
@@ -19446,7 +19396,7 @@ function applyNavTypography(style, typography) {
19446
19396
  textSize: "sm",
19447
19397
  letterSpacing: "wider"
19448
19398
  };
19449
- default: return assertNever$16(typography, "Unhandled header nav typography");
19399
+ default: return assertNever$15(typography, "Unhandled header nav typography");
19450
19400
  }
19451
19401
  }
19452
19402
  function underlineNavLinkStyle(colorToken, underlineColorToken, typography = "plain") {
@@ -19475,7 +19425,7 @@ function themedHeaderShadow(theme) {
19475
19425
  case "low": return { elevation: "sm" };
19476
19426
  case "medium": return { elevation: "md" };
19477
19427
  case "high": return { elevation: "lg" };
19478
- default: return assertNever$16(theme.shadow.elevation, "Unhandled theme shadow elevation");
19428
+ default: return assertNever$15(theme.shadow.elevation, "Unhandled theme shadow elevation");
19479
19429
  }
19480
19430
  }
19481
19431
  function solidBrandHeader(theme) {
@@ -19749,15 +19699,15 @@ function floatingGlassHeader(theme) {
19749
19699
  }
19750
19700
  };
19751
19701
  }
19752
- function headerConfigurationKey(configuration) {
19753
- return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
19754
- }
19755
19702
  function findHeaderLook(id) {
19756
19703
  return headerLooksById.get(id);
19757
19704
  }
19758
19705
  var titleOnlyLogoAccommodation, inlineWordmarkLogoAccommodation, inlineMarkWithTitleLogoAccommodation, logoPlateAccommodation, centeredBadgeAccommodation, popoutBadgeAccommodation, centeredMastheadAccommodation, unbackedOverlayLogoAccommodation, inlineClassicLogoAccommodations, centeredLogoAccommodations, overlayLogoAccommodations, headerLayoutCatalog, headerStyleCatalog, headerLayoutsById, headerStylesById, headerStyleCompatibilityOrder, legacyHeaderLookAliases, legacyHeaderLookAliasesById, headerLookCatalog, guaranteedFallbackHeaderLayoutId, guaranteedFallbackHeaderStyleId, headerLooksById;
19759
19706
  var init_headerLooks = __esmMin((() => {
19760
19707
  init_headerCtaVariants();
19708
+ init_headerStyleParts();
19709
+ init_headerInteractionPalette();
19710
+ init_headerOpeningForeground();
19761
19711
  init_customizableSurfaces();
19762
19712
  init_logoBranding();
19763
19713
  init_types$15();
@@ -19884,7 +19834,6 @@ var init_headerLooks = __esmMin((() => {
19884
19834
  id: asHeaderLayoutId("classic"),
19885
19835
  label: "Classic",
19886
19836
  description: "Logo and navigation in one practical horizontal row.",
19887
- structure: "inline-classic",
19888
19837
  variant: "classic",
19889
19838
  defaultPositioning: "sticky",
19890
19839
  shrinkOnScroll: false
@@ -19893,7 +19842,6 @@ var init_headerLooks = __esmMin((() => {
19893
19842
  id: asHeaderLayoutId("centered"),
19894
19843
  label: "Centered",
19895
19844
  description: "Logo centered above a balanced navigation row.",
19896
- structure: "centered-stack",
19897
19845
  variant: "centered",
19898
19846
  defaultPositioning: "static",
19899
19847
  shrinkOnScroll: false,
@@ -19909,7 +19857,6 @@ var init_headerLooks = __esmMin((() => {
19909
19857
  id: asHeaderLayoutId("floating"),
19910
19858
  label: "Floating",
19911
19859
  description: "Detached header chrome that sits over the opening section.",
19912
- structure: "floating-shell",
19913
19860
  variant: "floating",
19914
19861
  defaultPositioning: "sticky",
19915
19862
  shrinkOnScroll: true,
@@ -20068,10 +20015,13 @@ var init_headerLooks = __esmMin((() => {
20068
20015
  label: "Clear Split",
20069
20016
  description: "Floating logo with transparent navigation and no shared shell.",
20070
20017
  supportedLayoutIds: supportedLayouts(["floating"]),
20071
- navInteraction: "color-change",
20018
+ navInteraction: "pill-background",
20072
20019
  surface: "floating",
20073
- defaultDepth: "none",
20020
+ defaultDepth: "line",
20074
20021
  navTypography: "plain",
20022
+ openingForegroundTarget: "all",
20023
+ scrollTreatment: "contrast-glass",
20024
+ interactionPalette: clearSplitInteractionPalette,
20075
20025
  moods: ["editorial", "calm"]
20076
20026
  },
20077
20027
  {
@@ -20094,6 +20044,7 @@ var init_headerLooks = __esmMin((() => {
20094
20044
  surface: "floating",
20095
20045
  defaultDepth: "shadow",
20096
20046
  navTypography: "quiet-caps",
20047
+ openingForegroundTarget: "brand-only",
20097
20048
  moods: ["expressive"]
20098
20049
  },
20099
20050
  {
@@ -20105,6 +20056,7 @@ var init_headerLooks = __esmMin((() => {
20105
20056
  surface: "floating",
20106
20057
  defaultDepth: "shadow",
20107
20058
  navTypography: "heading",
20059
+ openingForegroundTarget: "brand-only",
20108
20060
  moods: ["calm", "editorial"]
20109
20061
  }
20110
20062
  ]);
@@ -20260,13 +20212,6 @@ var init_headerLooks = __esmMin((() => {
20260
20212
  {
20261
20213
  id: asHeaderLookId("clean-base"),
20262
20214
  label: "Clean base",
20263
- visualTreatment: "solid-neutral",
20264
- layoutBehavior: "sticky",
20265
- configuration: {
20266
- structure: "inline-classic",
20267
- treatment: "solid-neutral",
20268
- behavior: "sticky"
20269
- },
20270
20215
  openingRequirement: "none",
20271
20216
  logoAccommodations: inlineClassicLogoAccommodations,
20272
20217
  compile: cleanBaseHeader
@@ -20274,13 +20219,6 @@ var init_headerLooks = __esmMin((() => {
20274
20219
  {
20275
20220
  id: asHeaderLookId("classic-centered-nav"),
20276
20221
  label: "Centered nav",
20277
- visualTreatment: "solid-neutral",
20278
- layoutBehavior: "sticky",
20279
- configuration: {
20280
- structure: "inline-classic",
20281
- treatment: "solid-neutral",
20282
- behavior: "sticky"
20283
- },
20284
20222
  openingRequirement: "none",
20285
20223
  maxRecommendedNavItems: 6,
20286
20224
  logoAccommodations: inlineClassicLogoAccommodations,
@@ -20289,13 +20227,6 @@ var init_headerLooks = __esmMin((() => {
20289
20227
  {
20290
20228
  id: asHeaderLookId("brand-solid"),
20291
20229
  label: "Brand solid",
20292
- visualTreatment: "solid-brand",
20293
- layoutBehavior: "sticky-shrink",
20294
- configuration: {
20295
- structure: "inline-classic",
20296
- treatment: "solid-brand",
20297
- behavior: "sticky-shrink"
20298
- },
20299
20230
  openingRequirement: "none",
20300
20231
  logoAccommodations: inlineClassicLogoAccommodations,
20301
20232
  compile: solidBrandHeader
@@ -20303,13 +20234,6 @@ var init_headerLooks = __esmMin((() => {
20303
20234
  {
20304
20235
  id: asHeaderLookId("serif-line"),
20305
20236
  label: "Serif line",
20306
- visualTreatment: "light-serif",
20307
- layoutBehavior: "sticky",
20308
- configuration: {
20309
- structure: "centered-stack",
20310
- treatment: "light-serif",
20311
- behavior: "sticky"
20312
- },
20313
20237
  openingRequirement: "none",
20314
20238
  maxRecommendedNavItems: 6,
20315
20239
  logoAccommodations: centeredLogoAccommodations,
@@ -20318,13 +20242,6 @@ var init_headerLooks = __esmMin((() => {
20318
20242
  {
20319
20243
  id: asHeaderLookId("centered-calm"),
20320
20244
  label: "Centered calm",
20321
- visualTreatment: "light-serif",
20322
- layoutBehavior: "normal-flow",
20323
- configuration: {
20324
- structure: "centered-stack",
20325
- treatment: "light-serif",
20326
- behavior: "normal-flow"
20327
- },
20328
20245
  openingRequirement: "none",
20329
20246
  maxRecommendedNavItems: 5,
20330
20247
  logoAccommodations: centeredLogoAccommodations,
@@ -20333,13 +20250,6 @@ var init_headerLooks = __esmMin((() => {
20333
20250
  {
20334
20251
  id: asHeaderLookId("practical-utility"),
20335
20252
  label: "Practical utility",
20336
- visualTreatment: "solid-neutral",
20337
- layoutBehavior: "sticky-shrink",
20338
- configuration: {
20339
- structure: "inline-classic",
20340
- treatment: "solid-neutral",
20341
- behavior: "sticky-shrink"
20342
- },
20343
20253
  openingRequirement: "none",
20344
20254
  requiresProminentCta: true,
20345
20255
  logoAccommodations: inlineClassicLogoAccommodations,
@@ -20348,13 +20258,6 @@ var init_headerLooks = __esmMin((() => {
20348
20258
  {
20349
20259
  id: asHeaderLookId("minimal-transparent"),
20350
20260
  label: "Minimal transparent",
20351
- visualTreatment: "minimal-transparent",
20352
- layoutBehavior: "normal-flow",
20353
- configuration: {
20354
- structure: "inline-classic",
20355
- treatment: "minimal-transparent",
20356
- behavior: "normal-flow"
20357
- },
20358
20261
  openingRequirement: "reserved-space-ok",
20359
20262
  logoAccommodations: inlineClassicLogoAccommodations,
20360
20263
  compile: minimalTransparentHeader
@@ -20362,13 +20265,6 @@ var init_headerLooks = __esmMin((() => {
20362
20265
  {
20363
20266
  id: asHeaderLookId("transparent-overlay"),
20364
20267
  label: "Transparent overlay",
20365
- visualTreatment: "transparent-overlay",
20366
- layoutBehavior: "fixed-overlay",
20367
- configuration: {
20368
- structure: "inline-classic",
20369
- treatment: "transparent-overlay",
20370
- behavior: "fixed-overlay"
20371
- },
20372
20268
  openingRequirement: "requires-image-hero-with-contrast-overlay",
20373
20269
  maxRecommendedNavItems: 5,
20374
20270
  logoAccommodations: overlayLogoAccommodations,
@@ -20377,13 +20273,6 @@ var init_headerLooks = __esmMin((() => {
20377
20273
  {
20378
20274
  id: asHeaderLookId("floating-glass"),
20379
20275
  label: "Floating glass",
20380
- visualTreatment: "floating-glass",
20381
- layoutBehavior: "fixed-floating",
20382
- configuration: {
20383
- structure: "floating-shell",
20384
- treatment: "floating-glass",
20385
- behavior: "fixed-floating"
20386
- },
20387
20276
  openingRequirement: "requires-image-hero-with-contrast-overlay",
20388
20277
  maxRecommendedNavItems: 5,
20389
20278
  logoAccommodations: overlayLogoAccommodations,
@@ -20392,7 +20281,6 @@ var init_headerLooks = __esmMin((() => {
20392
20281
  ]);
20393
20282
  guaranteedFallbackHeaderLayoutId = asHeaderLayoutId("classic");
20394
20283
  guaranteedFallbackHeaderStyleId = asHeaderStyleId("minimal");
20395
- new Set(headerLookCatalog.map((look) => headerConfigurationKey(look.configuration)));
20396
20284
  headerLooksById = new Map(headerLookCatalog.map((look) => [look.id, look]));
20397
20285
  }));
20398
20286
  var init_compilationPlan = __esmMin((() => {
@@ -20622,11 +20510,9 @@ var init_types$12 = __esmMin((() => {
20622
20510
  "secondary",
20623
20511
  "outline",
20624
20512
  "ghost",
20625
- "link",
20626
- "tertiary",
20627
20513
  "accent"
20628
20514
  ];
20629
- buttonVariantIdSchema = z$1.string().min(1).max(50).regex(/^[a-z0-9-]+$/, "Button variant IDs may contain lowercase letters, numbers, and hyphens only");
20515
+ buttonVariantIdSchema = z$1.string().min(1).max(50).regex(/^[a-z0-9-]+$/, "Button variant IDs may contain lowercase letters, numbers, and hyphens only").refine((value) => value !== "link" && value !== "tertiary", { message: "Retired button role IDs are not valid variant IDs" });
20630
20516
  DEFAULT_VARIANT_ALIAS_ID = "default";
20631
20517
  opaqueButtonColourTokenSchema = themeColorTokenSchema.refine((value) => parseOpaqueButtonColourToken(value) !== null, "Button colour tokens must be opaque").transform((value) => {
20632
20518
  const token = parseOpaqueButtonColourToken(value);
@@ -23762,41 +23648,41 @@ var init_siteStyleTypography = __esmMin((() => {
23762
23648
  }));
23763
23649
  //#endregion
23764
23650
  //#region ../theme-core/src/lib/media.ts
23765
- var hotspotSchema$1, rotationSchema$1, rectSchema$1, aspectCropSchema$1, transformSchema$1, mediaSchema$1;
23766
- var init_media$2 = __esmMin((() => {
23767
- hotspotSchema$1 = z.object({
23651
+ var hotspotSchema, rotationSchema, rectSchema, aspectCropSchema, transformSchema, mediaSchema;
23652
+ var init_media$1 = __esmMin((() => {
23653
+ hotspotSchema = z.object({
23768
23654
  x: z.number().min(0).max(1),
23769
23655
  y: z.number().min(0).max(1),
23770
23656
  radius: z.number().optional()
23771
23657
  });
23772
- rotationSchema$1 = z.union([
23658
+ rotationSchema = z.union([
23773
23659
  z.literal(0),
23774
23660
  z.literal(90),
23775
23661
  z.literal(180),
23776
23662
  z.literal(270)
23777
23663
  ]);
23778
- rectSchema$1 = z.tuple([
23664
+ rectSchema = z.tuple([
23779
23665
  z.number(),
23780
23666
  z.number(),
23781
23667
  z.number(),
23782
23668
  z.number()
23783
23669
  ]);
23784
- aspectCropSchema$1 = z.object({
23670
+ aspectCropSchema = z.object({
23785
23671
  aspect: z.preprocess((value) => value == null ? void 0 : value, z.string().optional()),
23786
- rect: z.preprocess((value) => value == null ? void 0 : value, rectSchema$1.optional()),
23787
- hotspot: z.preprocess((value) => value == null ? void 0 : value, hotspotSchema$1.optional()),
23788
- rotation: z.preprocess((value) => value == null ? void 0 : value, rotationSchema$1.optional())
23672
+ rect: z.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
23673
+ hotspot: z.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
23674
+ rotation: z.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
23789
23675
  });
23790
- transformSchema$1 = z.object({
23676
+ transformSchema = z.object({
23791
23677
  aspectCrops: z.preprocess((value) => {
23792
23678
  if (!value || typeof value !== "object" || Array.isArray(value)) return;
23793
23679
  return value;
23794
- }, z.record(z.string(), aspectCropSchema$1.catch({}))).optional(),
23795
- rect: rectSchema$1.optional(),
23796
- hotspot: hotspotSchema$1.optional(),
23797
- rotation: rotationSchema$1.optional()
23680
+ }, z.record(z.string(), aspectCropSchema.catch({}))).optional(),
23681
+ rect: rectSchema.optional(),
23682
+ hotspot: hotspotSchema.optional(),
23683
+ rotation: rotationSchema.optional()
23798
23684
  });
23799
- mediaSchema$1 = z.object({
23685
+ mediaSchema = z.object({
23800
23686
  type: z.enum([
23801
23687
  "image",
23802
23688
  "video",
@@ -23817,7 +23703,39 @@ var init_media$2 = __esmMin((() => {
23817
23703
  height: z.number().optional(),
23818
23704
  storageBucket: z.string().optional(),
23819
23705
  storagePath: z.string().optional(),
23820
- transform: transformSchema$1.optional()
23706
+ transform: transformSchema.optional()
23707
+ });
23708
+ }));
23709
+ //#endregion
23710
+ //#region ../theme-core/src/palette/schema.ts
23711
+ var colourHexString, paletteColorSchema, paletteMetaSchema, paletteSchema;
23712
+ var init_schema$1 = __esmMin((() => {
23713
+ init_colors();
23714
+ colourHexString = z$1.string().regex(/^#([0-9A-Fa-f]{3}){1,2}$/);
23715
+ paletteColorSchema = z$1.object({
23716
+ name: z$1.string().min(1),
23717
+ hex: colourHexString
23718
+ });
23719
+ paletteMetaSchema = z$1.object({ mode: z$1.enum(["light", "dark"]) });
23720
+ paletteSchema = z$1.object({
23721
+ colors: z$1.array(paletteColorSchema),
23722
+ meta: paletteMetaSchema
23723
+ }).transform((palette, ctx) => {
23724
+ const colors = paletteColorsFromEntries(palette.colors);
23725
+ if (!colors.ok) {
23726
+ ctx.addIssue({
23727
+ code: "custom",
23728
+ message: `Invalid complete palette: ${colors.error.kind}`
23729
+ });
23730
+ return z$1.NEVER;
23731
+ }
23732
+ return {
23733
+ colors: paletteColorEntries(colors.colors).map(({ name, hex }) => ({
23734
+ name: String(name),
23735
+ hex: String(hex)
23736
+ })),
23737
+ meta: palette.meta
23738
+ };
23821
23739
  });
23822
23740
  }));
23823
23741
  var init_foregroundRoles = __esmMin((() => {}));
@@ -24453,20 +24371,61 @@ var init_classNames = __esmMin((() => {
24453
24371
  }));
24454
24372
  var init_generateBaseCSS = __esmMin((() => {}));
24455
24373
  //#endregion
24374
+ //#region ../theme-core/src/buttons/effects/cssUtils.ts
24375
+ /**
24376
+ * Generate CSS selector for a state with dual support for hover
24377
+ *
24378
+ * @param themeId - Theme scope ID
24379
+ * @param variantId - Variant class name
24380
+ * @param state - State group (hover, active, focus, base)
24381
+ * @returns CSS selector string
24382
+ */
24383
+ function getStateSelector(themeId, variantId, state) {
24384
+ const stateSelector = STATE_SELECTORS[state];
24385
+ if (state === "base") return `:where([data-theme-scope="${themeId}"]) .${variantId}`;
24386
+ if (state === "hover") return `:where([data-theme-scope="${themeId}"]) .${variantId}:hover,
24387
+ :where([data-theme-scope="${themeId}"]) .${variantId}[data-force-hover="true"]`;
24388
+ return `:where([data-theme-scope="${themeId}"]) .${variantId}${stateSelector}`;
24389
+ }
24390
+ /**
24391
+ * Generate CSS rule block for a state
24392
+ *
24393
+ * @param themeId - Theme scope ID
24394
+ * @param variantId - Variant class name
24395
+ * @param state - State group
24396
+ * @param cssProperties - CSS properties string (e.g., "transform: scale(1.05);")
24397
+ * @returns Complete CSS rule block
24398
+ */
24399
+ function generateStateCSS(themeId, variantId, state, cssProperties) {
24400
+ return `
24401
+ ${getStateSelector(themeId, variantId, state)} {
24402
+ ${cssProperties}
24403
+ }
24404
+ `;
24405
+ }
24406
+ var STATE_SELECTORS;
24407
+ var init_cssUtils = __esmMin((() => {
24408
+ STATE_SELECTORS = {
24409
+ hover: ":hover, [data-force-hover=\"true\"]",
24410
+ active: ":active",
24411
+ focus: ":focus-visible",
24412
+ base: ""
24413
+ };
24414
+ }));
24415
+ //#endregion
24456
24416
  //#region ../theme-core/src/buttons/effects/presets/background.ts
24457
- var darkenBackgroundEffect, lightenBackgroundEffect, fadeBackgroundEffect, opacityReduceEffect, animatedGradientEffect, backgroundOnHoverEffect, backgroundOnHoverAlphaEffect;
24458
- var init_background$2 = __esmMin((() => {
24459
- darkenBackgroundEffect = {
24460
- id: "darken-background",
24461
- name: "Darken on Hover",
24462
- description: "Darkens the background color on hover",
24417
+ function shadeBackgroundEffect(config) {
24418
+ return {
24419
+ id: config.id,
24420
+ name: config.name,
24421
+ description: config.description,
24463
24422
  category: "background",
24464
24423
  pseudoElement: "none",
24465
24424
  applicableTo: ["button"],
24466
24425
  customizableOption: {
24467
24426
  name: "amount",
24468
24427
  type: "select",
24469
- label: "Darken Amount (shade step)",
24428
+ label: config.label,
24470
24429
  default: 100,
24471
24430
  options: [
24472
24431
  0,
@@ -24481,63 +24440,36 @@ var init_background$2 = __esmMin((() => {
24481
24440
  900
24482
24441
  ]
24483
24442
  },
24484
- isApplicable: (buttonConfig) => {
24485
- return buttonConfig.background.type === "solid";
24486
- },
24487
- generateCSS: (ctx) => {
24488
- const { themeId, variantId, options, tokens, buttonConfig } = ctx;
24443
+ isApplicable: (buttonConfig) => buttonConfig.background.type === "solid",
24444
+ generateCSS: ({ themeId, variantId, options, tokens, buttonConfig }) => {
24489
24445
  if (buttonConfig.background.type !== "solid") return "";
24490
- const amount = options.amount || 100;
24446
+ const amount = (options.amount || 100) * config.shadeDirection;
24491
24447
  const baseToken = buttonConfig.background.colorToken ?? "primary-500";
24492
- const darkerToken = tokens.adjustShade(baseToken, amount);
24493
24448
  return `
24494
24449
  :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
24495
- background-color: ${tokens.getColor(darkerToken)};
24450
+ background-color: ${tokens.getColor(tokens.adjustShade(baseToken, amount))};
24496
24451
  }
24497
24452
  `;
24498
24453
  }
24499
24454
  };
24500
- lightenBackgroundEffect = {
24455
+ }
24456
+ var darkenBackgroundEffect, lightenBackgroundEffect, fadeBackgroundEffect, opacityReduceEffect, animatedGradientEffect, backgroundOnHoverEffect, backgroundOnHoverAlphaEffect;
24457
+ var init_background$2 = __esmMin((() => {
24458
+ init_cssUtils();
24459
+ darkenBackgroundEffect = shadeBackgroundEffect({
24460
+ id: "darken-background",
24461
+ name: "Darken on Hover",
24462
+ description: "Darkens the background color on hover",
24463
+ label: "Darken Amount (shade step)",
24464
+ shadeDirection: 1
24465
+ });
24466
+ lightenBackgroundEffect = shadeBackgroundEffect({
24501
24467
  id: "lighten-background",
24502
24468
  name: "Lighten on Hover",
24503
24469
  description: "Lightens the background color on hover",
24504
- category: "background",
24505
- pseudoElement: "none",
24506
- applicableTo: ["button"],
24507
- customizableOption: {
24508
- name: "amount",
24509
- type: "select",
24510
- label: "Lighten Amount (shade step)",
24511
- default: 100,
24512
- options: [
24513
- 0,
24514
- 100,
24515
- 200,
24516
- 300,
24517
- 400,
24518
- 500,
24519
- 600,
24520
- 700,
24521
- 800,
24522
- 900
24523
- ]
24524
- },
24525
- isApplicable: (buttonConfig) => {
24526
- return buttonConfig.background.type === "solid";
24527
- },
24528
- generateCSS: (ctx) => {
24529
- const { themeId, variantId, options, tokens, buttonConfig } = ctx;
24530
- if (buttonConfig.background.type !== "solid") return "";
24531
- const amount = options.amount || 100;
24532
- const baseToken = buttonConfig.background.colorToken ?? "primary-500";
24533
- const lighterToken = tokens.adjustShade(baseToken, -amount);
24534
- return `
24535
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
24536
- background-color: ${tokens.getColor(lighterToken)};
24537
- }
24538
- `;
24539
- }
24540
- };
24470
+ label: "Lighten Amount (shade step)",
24471
+ shadeDirection: -1
24472
+ });
24541
24473
  fadeBackgroundEffect = {
24542
24474
  id: "fade-background",
24543
24475
  name: "Fade on Hover",
@@ -24638,12 +24570,14 @@ var init_background$2 = __esmMin((() => {
24638
24570
  ]
24639
24571
  },
24640
24572
  generateCSS: (ctx) => {
24641
- const { themeId, variantId, options, tokens, buttonConfig } = ctx;
24573
+ const { themeId, variantId, stateGroup, options, tokens, buttonConfig } = ctx;
24642
24574
  const colorToken = options.colorToken || "neutral-800";
24575
+ const color = tokens.getColor(colorToken);
24576
+ const navForeground = "textColorToken" in buttonConfig && typeof options.textColorToken === "string" ? `\n color: ${tokens.getColor(options.textColorToken)};` : "";
24643
24577
  return `
24644
24578
  /* Add background on hover */
24645
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
24646
- background-color: ${tokens.getColor(colorToken)};${"textColorToken" in buttonConfig && typeof options.textColorToken === "string" ? `\n color: ${tokens.getColor(options.textColorToken)};` : ""}
24579
+ ${getStateSelector(themeId, variantId, stateGroup)} {
24580
+ background-color: ${color};${navForeground}
24647
24581
  }
24648
24582
  `;
24649
24583
  }
@@ -24676,48 +24610,6 @@ var init_background$2 = __esmMin((() => {
24676
24610
  };
24677
24611
  }));
24678
24612
  //#endregion
24679
- //#region ../theme-core/src/buttons/effects/cssUtils.ts
24680
- /**
24681
- * Generate CSS selector for a state with dual support for hover
24682
- *
24683
- * @param themeId - Theme scope ID
24684
- * @param variantId - Variant class name
24685
- * @param state - State group (hover, active, focus, base)
24686
- * @returns CSS selector string
24687
- */
24688
- function getStateSelector(themeId, variantId, state) {
24689
- const stateSelector = STATE_SELECTORS[state];
24690
- if (state === "base") return `:where([data-theme-scope="${themeId}"]) .${variantId}`;
24691
- if (state === "hover") return `:where([data-theme-scope="${themeId}"]) .${variantId}:hover,
24692
- :where([data-theme-scope="${themeId}"]) .${variantId}[data-force-hover="true"]`;
24693
- return `:where([data-theme-scope="${themeId}"]) .${variantId}${stateSelector}`;
24694
- }
24695
- /**
24696
- * Generate CSS rule block for a state
24697
- *
24698
- * @param themeId - Theme scope ID
24699
- * @param variantId - Variant class name
24700
- * @param state - State group
24701
- * @param cssProperties - CSS properties string (e.g., "transform: scale(1.05);")
24702
- * @returns Complete CSS rule block
24703
- */
24704
- function generateStateCSS(themeId, variantId, state, cssProperties) {
24705
- return `
24706
- ${getStateSelector(themeId, variantId, state)} {
24707
- ${cssProperties}
24708
- }
24709
- `;
24710
- }
24711
- var STATE_SELECTORS;
24712
- var init_cssUtils = __esmMin((() => {
24713
- STATE_SELECTORS = {
24714
- hover: ":hover, [data-force-hover=\"true\"]",
24715
- active: ":active",
24716
- focus: ":focus-visible",
24717
- base: ""
24718
- };
24719
- }));
24720
- //#endregion
24721
24613
  //#region ../theme-core/src/buttons/effects/presets/shadow.ts
24722
24614
  var borderGlowEffect, dropShadowEffect, innerShadowEffect, neumorphicShadowEffect, outerGlowEffect, retro3DShadowEffect;
24723
24615
  var init_shadow = __esmMin((() => {
@@ -26665,6 +26557,41 @@ var init_tokenOrColor = __esmMin((() => {
26665
26557
  "yellow"
26666
26558
  ]);
26667
26559
  }));
26560
+ var init_paintTargets = __esmMin((() => {
26561
+ init_breakpoints();
26562
+ }));
26563
+ var headerScrollTreatmentSchema;
26564
+ var init_scrollTreatment = __esmMin((() => {
26565
+ init_paintTargets();
26566
+ headerScrollTreatmentSchema = z$1.discriminatedUnion("kind", [z$1.object({
26567
+ kind: z$1.literal("contrast-glass"),
26568
+ backgroundTone: z$1.enum(["light", "dark"])
26569
+ })]).optional();
26570
+ }));
26571
+ //#endregion
26572
+ //#region ../theme-core/src/header/containerSchema.ts
26573
+ var headerContainerSchema;
26574
+ var init_containerSchema = __esmMin((() => {
26575
+ headerContainerSchema = z$1.object({
26576
+ rounded: z$1.enum([
26577
+ "none",
26578
+ "sm",
26579
+ "md",
26580
+ "lg",
26581
+ "xl",
26582
+ "2xl"
26583
+ ]).default("xl"),
26584
+ border: z$1.boolean().default(true),
26585
+ shadow: z$1.boolean().default(true),
26586
+ padding: z$1.enum([
26587
+ "sm",
26588
+ "md",
26589
+ "lg"
26590
+ ]).default("md"),
26591
+ tint: z$1.string().nullable().optional(),
26592
+ opacity: z$1.number().min(0).max(1).default(.12)
26593
+ }).optional();
26594
+ }));
26668
26595
  //#endregion
26669
26596
  //#region ../theme-core/src/schema.ts
26670
26597
  /**
@@ -26681,9 +26608,10 @@ function normaliseHeaderNavFontRole(header) {
26681
26608
  navFontRole: navTypography
26682
26609
  } : rest;
26683
26610
  }
26684
- var axesSchema, colourHexString, paletteColorSchema, paletteMetaSchema, paletteSchema, typographyStyleSchema, bodyTypographyStyleSchema, headingSizeSchema, headingTypographyOverridesSchema, headingTypographyStyleSchema, proseLinkUnderlineStyleSchema, proseLinkUnderlineThicknessSchema, proseLinkUnderlineOffsetSchema, proseLinkStyleSchema, semanticSpacingSchema, boxRoundedSchema, boxBackgroundOverlaySchema, boxBackgroundSchema, noHeadingDecorationSchema, visibleHeadingDecorationSchema, headingDecorationSchema, headingDecorationOverrideSchema, accordionIconTreatmentSchema, sectionStylesOverrideSchema, containerStylesOverrideSchema, cardBorderOverrideSchema, cardStylesOverrideSchema, blockStyleOverridesSchema, blockThemeOverrideSchema, typographyScaleSchema, eyebrowTypographyStyleSchema, typographySchema, spaceSchema, corners, shadow, border, motion, inputStyle, headerVariant, headerPositioning, headerNavStyle, navFontWeight, headerMaxWidth, headerBarFrame, headerContainerSchema, headerBorderSchema, logoStyleSchema, headerLogoTextSchema, navEffectsSchema, dropdownStyleSchema, headerCtaGapSchema, headerCtaTreatmentSchema, navContainerSchema, headerBackgroundSchema, headerSchema, footerVariant, footerMaxWidth, footerMode, footerNavLayoutMode, footerNavLayoutAlign, footerSpacing, footerLogoPlacement, footerLogoSize, footerLogoMaxHeight, footerBottomTextLinkStyleSchema, footerBottomBarSchema, footerNavLayoutSchema, footerLogoSchema, footerSchema, containerPaddingPresetSchema, layoutSchema, heroTypographySizeSchema, heroTypographyLineHeightSchema, heroResponsiveTypographySchema, heroTypographySchema, heroSchema, bodyTextIntroTypographySizeSchema, bodyTextSchema, gradientsSchema, testimonialQuoteTreatmentSchema, themeSchema;
26611
+ var axesSchema, typographyStyleSchema, bodyTypographyStyleSchema, headingSizeSchema, headingTypographyOverridesSchema, headingTypographyStyleSchema, proseLinkUnderlineStyleSchema, proseLinkUnderlineThicknessSchema, proseLinkUnderlineOffsetSchema, proseLinkStyleSchema, semanticSpacingSchema, boxRoundedSchema, boxBackgroundOverlaySchema, boxBackgroundSchema, noHeadingDecorationSchema, visibleHeadingDecorationSchema, headingDecorationSchema, headingDecorationOverrideSchema, accordionIconTreatmentSchema, sectionStylesOverrideSchema, containerStylesOverrideSchema, cardBorderOverrideSchema, cardStylesOverrideSchema, blockStyleOverridesSchema, blockThemeOverrideSchema, typographyScaleSchema, eyebrowTypographyStyleSchema, typographySchema, spaceSchema, corners, shadow, border, motion, inputStyle, headerVariant, headerPositioning, headerNavStyle, navFontWeight, headerMaxWidth, headerBarFrame, headerBorderSchema, logoStyleSchema, headerLogoTextSchema, navEffectsSchema, dropdownStyleSchema, headerCtaGapSchema, headerCtaTreatmentSchema, navContainerSchema, headerBackgroundSchema, headerSchema, footerVariant, footerMaxWidth, footerMode, footerNavLayoutMode, footerNavLayoutAlign, footerSpacing, footerLogoPlacement, footerLogoSize, footerLogoMaxHeight, footerBottomTextLinkStyleSchema, footerBottomBarSchema, footerNavLayoutSchema, footerLogoSchema, footerSchema, containerPaddingPresetSchema, layoutSchema, heroTypographySizeSchema, heroTypographyLineHeightSchema, heroResponsiveTypographySchema, heroTypographySchema, heroSchema, bodyTextIntroTypographySizeSchema, bodyTextSchema, gradientsSchema, testimonialQuoteTreatmentSchema, themeSchema;
26685
26612
  var init_schema = __esmMin((() => {
26686
- init_media$2();
26613
+ init_media$1();
26614
+ init_schema$1();
26687
26615
  init_buttons();
26688
26616
  init_cards();
26689
26617
  init_types$9();
@@ -26698,6 +26626,9 @@ var init_schema = __esmMin((() => {
26698
26626
  init_rawStyleFields();
26699
26627
  init_themeColorTokens();
26700
26628
  init_tokenOrColor();
26629
+ init_scrollTreatment();
26630
+ init_containerSchema();
26631
+ init_interactionPalette();
26701
26632
  axesSchema = z$1.object({
26702
26633
  tone: z$1.enum([
26703
26634
  "minimal",
@@ -26726,16 +26657,6 @@ var init_schema = __esmMin((() => {
26726
26657
  "expressive"
26727
26658
  ])
26728
26659
  });
26729
- colourHexString = z$1.string().regex(/^#([0-9A-Fa-f]{3}){1,2}$/);
26730
- paletteColorSchema = z$1.object({
26731
- name: z$1.string().min(1),
26732
- hex: colourHexString
26733
- });
26734
- paletteMetaSchema = z$1.object({ mode: z$1.enum(["light", "dark"]) });
26735
- paletteSchema = z$1.object({
26736
- colors: z$1.array(paletteColorSchema),
26737
- meta: paletteMetaSchema
26738
- });
26739
26660
  typographyStyleSchema = z$1.object({
26740
26661
  family: z$1.string().min(1),
26741
26662
  weight: z$1.enum([
@@ -26867,7 +26788,7 @@ var init_schema = __esmMin((() => {
26867
26788
  color: tokenOrCssColorValueSchema.nullable().optional(),
26868
26789
  gradient: z$1.string().nullable().optional(),
26869
26790
  gradientPresetId: z$1.string().min(1).nullable().optional(),
26870
- image: mediaSchema$1.nullable().optional(),
26791
+ image: mediaSchema.nullable().optional(),
26871
26792
  objectFit: z$1.enum([
26872
26793
  "fill",
26873
26794
  "fit",
@@ -27115,25 +27036,6 @@ var init_schema = __esmMin((() => {
27115
27036
  ]);
27116
27037
  headerMaxWidth = z$1.enum(["container", "full"]);
27117
27038
  headerBarFrame = z$1.enum(["full-bleed", "inset-shell"]);
27118
- headerContainerSchema = z$1.object({
27119
- rounded: z$1.enum([
27120
- "none",
27121
- "sm",
27122
- "md",
27123
- "lg",
27124
- "xl",
27125
- "2xl"
27126
- ]).default("xl"),
27127
- border: z$1.boolean().default(true),
27128
- shadow: z$1.boolean().default(true),
27129
- padding: z$1.enum([
27130
- "sm",
27131
- "md",
27132
- "lg"
27133
- ]).default("md"),
27134
- tint: z$1.string().nullable().optional(),
27135
- opacity: z$1.number().min(0).max(1).default(.12)
27136
- }).optional();
27137
27039
  headerBorderSchema = componentBorderSchema.extend({ position: z$1.enum([
27138
27040
  "bottom",
27139
27041
  "top",
@@ -27247,7 +27149,7 @@ var init_schema = __esmMin((() => {
27247
27149
  contentOwner: z$1.literal(siteChromeBackgroundOverrideOwner).optional(),
27248
27150
  color: tokenOrCssColorValueSchema.nullable().optional(),
27249
27151
  gradient: gradientConfigSchema.nullable().optional(),
27250
- image: mediaSchema$1.nullable().optional(),
27152
+ image: mediaSchema.nullable().optional(),
27251
27153
  textColor: tokenOrCssColorValueSchema.nullable().optional()
27252
27154
  });
27253
27155
  headerSchema = z$1.object({
@@ -27256,7 +27158,8 @@ var init_schema = __esmMin((() => {
27256
27158
  shrinkOnScroll: z$1.boolean(),
27257
27159
  maxWidth: headerMaxWidth,
27258
27160
  barFrame: headerBarFrame.optional(),
27259
- logoOverride: mediaSchema$1.nullable().optional(),
27161
+ scrollTreatment: headerScrollTreatmentSchema,
27162
+ logoOverride: mediaSchema.nullable().optional(),
27260
27163
  background: headerBackgroundSchema.default({
27261
27164
  type: "color",
27262
27165
  color: "surface"
@@ -27268,6 +27171,7 @@ var init_schema = __esmMin((() => {
27268
27171
  navFontRole: z$1.enum(["body", "heading"]).optional(),
27269
27172
  navTypography: z$1.enum(["body", "heading"]).optional(),
27270
27173
  navTextSize: navLinkStyleSchema.shape.textSize,
27174
+ interactionPalette: headerInteractionPaletteSchema.optional(),
27271
27175
  navPlacement: z$1.enum(["end", "center"]).optional(),
27272
27176
  container: headerContainerSchema,
27273
27177
  border: headerBorderSchema,
@@ -27728,7 +27632,6 @@ var init_runtimeCompiler = __esmMin((() => {
27728
27632
  init_modern_minimal();
27729
27633
  init_expandPalette();
27730
27634
  init_styles();
27731
- init_colors();
27732
27635
  init_designState();
27733
27636
  init_types$15();
27734
27637
  init_accessibleSurfaces();
@@ -29604,7 +29507,7 @@ var init_siteStyleThemeCompiler = __esmMin((() => {
29604
29507
  init_curatedSiteStyles();
29605
29508
  init_runtimeCompiler();
29606
29509
  init_curated();
29607
- init_resolveSelection();
29510
+ init_concretePalette();
29608
29511
  }));
29609
29512
  var init_previewCustomization = __esmMin((() => {
29610
29513
  init_types$15();
@@ -29614,7 +29517,7 @@ var init_previewCompiler = __esmMin((() => {
29614
29517
  init_onColor();
29615
29518
  init_tokens();
29616
29519
  init_curated();
29617
- init_resolveSelection();
29520
+ init_concretePalette();
29618
29521
  init_curatedSiteStyles();
29619
29522
  init_resolver();
29620
29523
  init_types$15();
@@ -29713,6 +29616,7 @@ var init_records = __esmMin((() => {}));
29713
29616
  var init_headerOpeningSection = __esmMin((() => {
29714
29617
  init_headerLooks();
29715
29618
  init_records();
29619
+ init_tokens();
29716
29620
  }));
29717
29621
  var init_generatedDesignPipeline = __esmMin((() => {
29718
29622
  init_compositionBudget();
@@ -30008,8 +29912,11 @@ var init_site_styles = __esmMin((() => {
30008
29912
  init_generatedSchemas();
30009
29913
  init_generatedDesignPipeline();
30010
29914
  init_headerLooks();
29915
+ init_headerInteractionPalette();
29916
+ init_headerOpeningForeground();
30011
29917
  init_headerOpeningSection();
30012
29918
  init_lookResolution();
29919
+ init_lookOptionGroups();
30013
29920
  init_logoBranding();
30014
29921
  init_pageDesignAuthority();
30015
29922
  init_pageDesignEditorErrors();
@@ -30976,7 +30883,7 @@ function devValidate(node) {
30976
30883
  }
30977
30884
  var section$1, headerSection, stack, inline, accordion, accordionItem, carousel, text, richText, icon, media, fileDownload, videoEmbed, spinner, button, link, form, bookingForm, eventRegistration, shop, productList, productDetail, cart, checkout$1, gifting, courseRegistration;
30978
30885
  var init_builder$1 = __esmMin((() => {
30979
- init_schema$2();
30886
+ init_schema$3();
30980
30887
  init_types$6();
30981
30888
  init_env();
30982
30889
  section$1 = (props, children, ...mods) => el("section", props, children, ...mods);
@@ -32614,7 +32521,7 @@ function scopeContentPath(path, scope) {
32614
32521
  }
32615
32522
  var FRAGMENT_ID_PATTERN, FIELD_ID_PATTERN, dataLoaderSchema, fragmentDataSchema, fragmentConfigSchema, FragmentConfigError;
32616
32523
  var init_types$5 = __esmMin((() => {
32617
- init_schema$1();
32524
+ init_schema$2();
32618
32525
  init_node();
32619
32526
  FRAGMENT_ID_PATTERN = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/i;
32620
32527
  FIELD_ID_PATTERN = /^[a-z][a-zA-Z0-9_-]*$/;
@@ -32868,23 +32775,14 @@ var init_heroCopy = __esmMin((() => {
32868
32775
  }));
32869
32776
  //#endregion
32870
32777
  //#region ../blocks/src/system/constants/buttonRoles.ts
32871
- /**
32872
- * Temporary rollout boundary for persisted content written before issue #1220.
32873
- * Authoring remains strict through `blockButtonRoleSchema`; this parser exists
32874
- * only until the post-deploy role rewrite has been audited in production.
32875
- */
32876
- function canonicalizePersistedBlockButtonRole(value) {
32877
- return value === "link" || value === "tertiary" ? "ghost" : value;
32878
- }
32879
32778
  function isBlockButtonRole(value) {
32880
32779
  return blockButtonRoleSchema.safeParse(value).success;
32881
32780
  }
32882
- var BLOCK_BUTTON_ROLES, blockButtonRoleSchema, persistedBlockButtonRoleSchema, BLOCK_BUTTON_ROLE_LABELS, BLOCK_BUTTON_ROLE_OPTIONS;
32781
+ var BLOCK_BUTTON_ROLES, blockButtonRoleSchema, BLOCK_BUTTON_ROLE_LABELS, BLOCK_BUTTON_ROLE_OPTIONS;
32883
32782
  var init_buttonRoles = __esmMin((() => {
32884
32783
  init_buttons();
32885
32784
  BLOCK_BUTTON_ROLES = PUBLIC_BUTTON_ROLES;
32886
32785
  blockButtonRoleSchema = z$1.enum(BLOCK_BUTTON_ROLES);
32887
- persistedBlockButtonRoleSchema = z$1.preprocess((value) => typeof value === "string" ? canonicalizePersistedBlockButtonRole(value) : value, blockButtonRoleSchema);
32888
32786
  BLOCK_BUTTON_ROLE_LABELS = {
32889
32787
  primary: "Primary",
32890
32788
  secondary: "Secondary",
@@ -35548,7 +35446,7 @@ function deriveComponentName(id) {
35548
35446
  return `${id.replace(/^block\./, "").replace(/-/g, ".").replace(/([a-z])([A-Z])/g, "$1.$2").toLowerCase()}.default`;
35549
35447
  }
35550
35448
  var init_defineBlock = __esmMin((() => {
35551
- init_schema$1();
35449
+ init_schema$2();
35552
35450
  init_fragments();
35553
35451
  init_augmentManifest();
35554
35452
  }));
@@ -36244,7 +36142,7 @@ const blogPostBlockDefinition = {
36244
36142
  //#region ../blocks/src/system/blocks/blog-listing.ts
36245
36143
  init_defineBlock();
36246
36144
  init_boxStyles$1();
36247
- init_schema$1();
36145
+ init_schema$2();
36248
36146
  init_builder$1();
36249
36147
  init_fragments$1();
36250
36148
  init_colorStyles();
@@ -37993,7 +37891,7 @@ function planSiteChromePlacement(positioning) {
37993
37891
  headerRootClassName: "rb-fixed rb-top-0 rb-left-0 rb-right-0",
37994
37892
  standaloneShellClassName: "fixed left-0 right-0 top-0 z-40 w-full"
37995
37893
  };
37996
- default: return assertNever$16(positioning);
37894
+ default: return assertNever$15(positioning);
37997
37895
  }
37998
37896
  }
37999
37897
  function splitSiteChromePlacementClasses(className) {
@@ -39216,7 +39114,7 @@ const siteFooterBlockDefinition = { manifest: createBlockManifest({
39216
39114
  }) };
39217
39115
  //#endregion
39218
39116
  //#region ../blocks/src/system/blocks/testimonials.tsx
39219
- init_schema$1();
39117
+ init_schema$2();
39220
39118
  init_fragments$1();
39221
39119
  init_styledSection();
39222
39120
  init_boxStyles$1();
@@ -39427,7 +39325,7 @@ const testimonialsBlockDefinition = {
39427
39325
  //#endregion
39428
39326
  //#region ../blocks/src/system/blocks/columns.ts
39429
39327
  init_fragments();
39430
- init_schema$1();
39328
+ init_schema$2();
39431
39329
  init_defineBlock();
39432
39330
  init_node();
39433
39331
  init_builder$1();
@@ -39685,7 +39583,7 @@ function repeaterFragmentLayout(args) {
39685
39583
  //#endregion
39686
39584
  //#region ../blocks/src/system/blocks/collection.ts
39687
39585
  init_fragments();
39688
- init_schema$1();
39586
+ init_schema$2();
39689
39587
  init_defineBlock();
39690
39588
  init_builder$1();
39691
39589
  init_fragments$1();
@@ -41094,88 +40992,7 @@ const weeklySlotAvailabilityBlockDefinition = {
41094
40992
  };
41095
40993
  //#endregion
41096
40994
  //#region ../blocks/src/system/blocks/events/shared/types.ts
41097
- var init_types$4 = __esmMin((() => {})), PUBLIC_DOWNLOAD_MEDIA_TYPES, hotspotSchema, rotationSchema, rectSchema, aspectCropSchema, transformSchema, mediaPosterSchema, mediaBaseSchema, imageMediaSchema, videoMediaSchema, audioMediaSchema, documentMediaSchema, spreadsheetMediaSchema, archiveMediaSchema, mediaSchema;
41098
- var init_media$1 = __esmMin((() => {
41099
- init_src$2();
41100
- PUBLIC_DOWNLOAD_MEDIA_TYPES = [
41101
- "document",
41102
- "spreadsheet",
41103
- "archive",
41104
- "audio"
41105
- ];
41106
- hotspotSchema = z.object({
41107
- x: z.number().min(0).max(1),
41108
- y: z.number().min(0).max(1),
41109
- radius: z.number().optional()
41110
- });
41111
- rotationSchema = z.union([
41112
- z.literal(0),
41113
- z.literal(90),
41114
- z.literal(180),
41115
- z.literal(270)
41116
- ]);
41117
- rectSchema = z.tuple([
41118
- z.number(),
41119
- z.number(),
41120
- z.number(),
41121
- z.number()
41122
- ]);
41123
- aspectCropSchema = z.object({
41124
- aspect: z.preprocess((value) => value == null ? void 0 : value, z.string().optional()),
41125
- rect: z.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
41126
- hotspot: z.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
41127
- rotation: z.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
41128
- });
41129
- transformSchema = z.object({
41130
- aspectCrops: z.preprocess((value) => {
41131
- if (!value || typeof value !== "object" || Array.isArray(value)) return;
41132
- return value;
41133
- }, z.record(z.string(), aspectCropSchema.catch({}))).optional(),
41134
- rect: rectSchema.optional(),
41135
- hotspot: hotspotSchema.optional(),
41136
- rotation: rotationSchema.optional()
41137
- });
41138
- mediaPosterSchema = z.discriminatedUnion("tag", [z.object({
41139
- tag: z.literal("storage"),
41140
- assetId: z.string().optional(),
41141
- storageBucket: z.string().min(1),
41142
- storagePath: z.string().min(1)
41143
- }), z.object({
41144
- tag: z.literal("external-src"),
41145
- assetId: z.string().optional(),
41146
- src: z.string().url()
41147
- })]);
41148
- mediaBaseSchema = z.object({
41149
- purpose: z.string().optional(),
41150
- placeholder: z.boolean().default(true).optional(),
41151
- assetId: z.string().optional(),
41152
- identifier: z.string().optional(),
41153
- src: z.string().optional(),
41154
- alt: z.string().optional(),
41155
- filename: z.string().optional(),
41156
- mimeType: z.string().optional(),
41157
- width: z.number().optional(),
41158
- height: z.number().optional(),
41159
- storageBucket: z.string().optional(),
41160
- storagePath: z.string().optional(),
41161
- poster: mediaPosterSchema.optional(),
41162
- transform: transformSchema.optional()
41163
- });
41164
- imageMediaSchema = mediaBaseSchema.extend({ type: z.literal("image") });
41165
- videoMediaSchema = mediaBaseSchema.extend({ type: z.literal("video") });
41166
- audioMediaSchema = mediaBaseSchema.extend({ type: z.literal("audio") });
41167
- documentMediaSchema = mediaBaseSchema.extend({ type: z.literal("document") });
41168
- spreadsheetMediaSchema = mediaBaseSchema.extend({ type: z.literal("spreadsheet") });
41169
- archiveMediaSchema = mediaBaseSchema.extend({ type: z.literal("archive") });
41170
- mediaSchema = z.discriminatedUnion("type", [
41171
- imageMediaSchema,
41172
- videoMediaSchema,
41173
- audioMediaSchema,
41174
- documentMediaSchema,
41175
- spreadsheetMediaSchema,
41176
- archiveMediaSchema
41177
- ]);
41178
- }));
40995
+ var init_types$4 = __esmMin((() => {}));
41179
40996
  //#endregion
41180
40997
  //#region ../blocks/src/system/blocks/shared/bookingPaymentTerms.ts
41181
40998
  var bookingDepositRefundPolicySchema, bookingInstalmentPlanSchema, bookingFlexibleBalanceDueDateRuleSchema, bookingFlexibleBalanceConfigSchema, blockBookingPaymentCollectionOptionSchema, blockBookingPaymentTermsSchema;
@@ -41328,7 +41145,7 @@ var init_schemas$1 = __esmMin((() => {
41328
41145
  publicCoursesArraySchema = publicWholeSeriesOfferingsArraySchema;
41329
41146
  })), eventPresetSchema, eventScheduleScopeSchema$2, publicEventRecurrenceSchema, eventDestinationModeSchema$1, publicEventDestinationSchema, eventVenueSchema, eventCategorySchema, accessRestrictionSchema, publicCoursePriceDisplaySchema, publicEventTicketTypePriceDisplaySchema, publicEventAttendanceModeSchema, publicEventAttendanceModeAvailabilitySchema, publicEventTicketTypeAvailabilitySchema, publicEventTicketTypeSchema, publicEventPricingSchema, publicTeamMemberSummarySchema, publicEventSchema, publicEventsArraySchema;
41330
41147
  var init_schemas = __esmMin((() => {
41331
- init_media$1();
41148
+ init_media$2();
41332
41149
  init_richTextSchema();
41333
41150
  init_bookingPaymentTerms();
41334
41151
  init_schemas$1();
@@ -41604,7 +41421,7 @@ var init_schemas = __esmMin((() => {
41604
41421
  presentation: z$1.object({
41605
41422
  cardTitleOverride: z$1.string().nullable().optional(),
41606
41423
  summary: z$1.string().nullable().optional(),
41607
- image: mediaSchema.nullable().optional()
41424
+ image: mediaSchema$1.nullable().optional()
41608
41425
  }).optional(),
41609
41426
  slug: z$1.string(),
41610
41427
  path: z$1.string().nullable(),
@@ -42252,7 +42069,7 @@ var init_contract_schemas = __esmMin((() => {
42252
42069
  init_buttonRoles();
42253
42070
  previewStageSchema = z$1.enum(["preview", "published"]);
42254
42071
  registrationButtonVariantSchema = blockButtonRoleSchema;
42255
- eventButtonVariantSchema = persistedBlockButtonRoleSchema;
42072
+ eventButtonVariantSchema = blockButtonRoleSchema;
42256
42073
  eventLayoutSchema = z$1.enum(eventCalendarListLayoutValues);
42257
42074
  eventCalendarDisplayModeSchema = z$1.enum(eventCalendarDisplayModeValues);
42258
42075
  eventCalendarDefaultViewSchema = z$1.enum(eventCalendarDefaultViewValues);
@@ -47085,7 +46902,7 @@ var init_EventCalendar_interactive = __esmMin((() => {
47085
46902
  }));
47086
46903
  //#endregion
47087
46904
  //#region ../blocks/src/system/blocks/events/event-calendar.ts
47088
- init_schema$1();
46905
+ init_schema$2();
47089
46906
  init_builder$1();
47090
46907
  init_styledSection();
47091
46908
  init_fragments$1();
@@ -48518,10 +48335,10 @@ function preferredPathsForSource(source) {
48518
48335
  case "workshop": return ["/workshops", "/workshop"];
48519
48336
  case "retreat": return ["/retreats", "/retreat"];
48520
48337
  case "performance": return ["/performances", "/performance"];
48521
- default: return assertNever$25(source.preset, "Unhandled offerings preview event preset");
48338
+ default: return assertNever$24(source.preset, "Unhandled offerings preview event preset");
48522
48339
  }
48523
48340
  case "course": return ["/courses", "/course"];
48524
- default: return assertNever$25(source, "Unhandled offerings preview source");
48341
+ default: return assertNever$24(source, "Unhandled offerings preview source");
48525
48342
  }
48526
48343
  }
48527
48344
  function normalizeRoutePath(value) {
@@ -48948,7 +48765,7 @@ function isRecord$36(value) {
48948
48765
  }
48949
48766
  //#endregion
48950
48767
  //#region ../blocks/src/system/blocks/embed.ts
48951
- init_schema$1();
48768
+ init_schema$2();
48952
48769
  init_builder$1();
48953
48770
  init_fragments$1();
48954
48771
  init_defineBlock();
@@ -49219,7 +49036,7 @@ const embedBlockDefinition = {
49219
49036
  };
49220
49037
  //#endregion
49221
49038
  //#region ../blocks/src/system/blocks/image-gallery.ts
49222
- init_schema$1();
49039
+ init_schema$2();
49223
49040
  init_builder$1();
49224
49041
  init_colorStyles();
49225
49042
  init_defineBlock();
@@ -50012,7 +49829,7 @@ const imageGalleryBlockDefinition = { manifest: createBlockManifest({
50012
49829
  }) };
50013
49830
  //#endregion
50014
49831
  //#region ../blocks/src/system/blocks/video-grid.ts
50015
- init_schema$1();
49832
+ init_schema$2();
50016
49833
  init_builder$1();
50017
49834
  init_fragments$1();
50018
49835
  init_colorStyles();
@@ -50374,7 +50191,7 @@ const audioPlayerBlockDefinition = { manifest: createBlockManifest({
50374
50191
  }) };
50375
50192
  //#endregion
50376
50193
  //#region ../blocks/src/system/blocks/file-download.ts
50377
- init_media$1();
50194
+ init_media$2();
50378
50195
  init_defineBlock();
50379
50196
  init_button();
50380
50197
  init_builder$1();
@@ -52869,13 +52686,13 @@ const newsletterSignupBlockDefinition = {
52869
52686
  //#endregion
52870
52687
  //#region ../blocks/src/system/blocks/team-members.ts
52871
52688
  init_fragments();
52872
- init_schema$1();
52689
+ init_schema$2();
52873
52690
  init_defineBlock();
52874
52691
  init_builder$1();
52875
52692
  init_fragments$1();
52876
- init_media$1();
52693
+ init_media$2();
52877
52694
  const ITEM_NAME = "member";
52878
- const teamMemberPhotoSchema = mediaSchema.refine((media) => media.type === "image", { message: "Team member photos must be image media" }).nullable();
52695
+ const teamMemberPhotoSchema = mediaSchema$1.refine((media) => media.type === "image", { message: "Team member photos must be image media" }).nullable();
52879
52696
  const teamMemberDataSchema = z$1.object({
52880
52697
  _type: z$1.literal("teamMember"),
52881
52698
  id: z$1.string(),
@@ -53412,7 +53229,7 @@ var init_location_map_shared = __esmMin((() => {
53412
53229
  }));
53413
53230
  //#endregion
53414
53231
  //#region ../blocks/src/system/blocks/location-map.ts
53415
- init_schema$1();
53232
+ init_schema$2();
53416
53233
  init_builder$1();
53417
53234
  init_fragments$1();
53418
53235
  init_defineBlock();
@@ -54467,9 +54284,9 @@ function listBlockDefinitions() {
54467
54284
  init_tokens();
54468
54285
  //#endregion
54469
54286
  //#region ../blocks/src/system/helpers/backgroundMedia.ts
54470
- init_media$1();
54287
+ init_media$2();
54471
54288
  function resolveBackgroundMedia(input) {
54472
- const parsedMedia = mediaSchema.safeParse(input.image);
54289
+ const parsedMedia = mediaSchema$1.safeParse(input.image);
54473
54290
  if (!parsedMedia.success) return null;
54474
54291
  switch (parsedMedia.data.type) {
54475
54292
  case "image":
@@ -55705,7 +55522,6 @@ function renderMark(mark, key, child) {
55705
55522
  //#endregion
55706
55523
  //#region ../blocks/src/system/runtime/nodes/basic.tsx
55707
55524
  init_buttons();
55708
- init_buttonRoles();
55709
55525
  const TextNode = ({ value, children, blockId: _blockId, blockKind: _blockKind, blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, inlineTextFallbackPath, ...rest }) => {
55710
55526
  const inlineText = parseInlineTextFromUnknown(value);
55711
55527
  if (inlineText.ok && !isInlineTextEmpty(inlineText.value)) return /* @__PURE__ */ jsx(Text$2, {
@@ -55745,6 +55561,9 @@ function renderTrailingAffordanceIcon(affordance) {
55745
55561
  className: "rb-ml-2 rb-h-4 rb-w-4 rb-inline-block"
55746
55562
  });
55747
55563
  }
55564
+ function isMissingRequiredLink(linkRequired, resolvedHref) {
55565
+ return linkRequired && resolvedHref.length === 0;
55566
+ }
55748
55567
  const ButtonNode = ({ value, children, href, variantId = "primary", size = "md", disabled, type = "button", target, rel, linkRequired = false, trailingIcon, blockId: _blockId, blockKind: _blockKind, blockContent: _blockContent, fragmentRegistry: _fragmentRegistry, pathBase: _pathBase, className, ...rest }) => {
55749
55568
  const content = value ?? children;
55750
55569
  if (!content) {
@@ -55753,12 +55572,16 @@ const ButtonNode = ({ value, children, href, variantId = "primary", size = "md",
55753
55572
  }
55754
55573
  const affordanceIcon = renderTrailingAffordanceIcon(resolveButtonAffordance({ trailingIcon }));
55755
55574
  const resolvedHref = typeof href === "string" ? href.trim() : "";
55756
- if (linkRequired && resolvedHref.length === 0) {
55575
+ if (isMissingRequiredLink(linkRequired, resolvedHref)) {
55757
55576
  if (process.env.NODE_ENV === "development") console.warn("[ButtonNode] Missing href for link-required button");
55758
55577
  return null;
55759
55578
  }
55760
55579
  const extraClassName = affordanceIcon ? [className, AFFORDANCE_SUPPRESS_CLASS].filter(Boolean).join(" ") : className;
55761
- const resolvedVariantId = parseThemeButtonVariantId(canonicalizePersistedBlockButtonRole(variantId));
55580
+ const resolvedVariantId = parseThemeButtonVariantId(variantId);
55581
+ if (variantId && !resolvedVariantId) {
55582
+ console.error("[ButtonNode] Invalid button variant", { variantId });
55583
+ return null;
55584
+ }
55762
55585
  const combinedClassName = resolvedVariantId ? themeButtonClassName({
55763
55586
  variant: resolvedVariantId,
55764
55587
  size,
@@ -55863,7 +55686,7 @@ const FeatureCardIconNode = ({ value, treatment, generatedIconSizePx, className,
55863
55686
  //#region ../blocks/src/system/runtime/nodes/file-download.tsx
55864
55687
  init_svg();
55865
55688
  init_colorStyles();
55866
- init_media$1();
55689
+ init_media$2();
55867
55690
  init_buttons();
55868
55691
  init_media();
55869
55692
  init_buttonRoles();
@@ -55897,8 +55720,9 @@ function iconForMediaType(type) {
55897
55720
  });
55898
55721
  }
55899
55722
  }
55900
- function normalizeButtonVariant(value) {
55901
- return isBlockButtonRole(value) ? value : "primary";
55723
+ function parseButtonVariant(value) {
55724
+ if (value === null || value === void 0) return "primary";
55725
+ return isBlockButtonRole(value) ? value : null;
55902
55726
  }
55903
55727
  function FileDownloadNode({ value, title, description, buttonLabel, buttonVariant, className }) {
55904
55728
  if (!value || !isDownloadableMediaType(value.type)) return null;
@@ -55908,7 +55732,11 @@ function FileDownloadNode({ value, title, description, buttonLabel, buttonVarian
55908
55732
  const heading = title?.trim() || filename;
55909
55733
  const body = description?.trim();
55910
55734
  const label = buttonLabel?.trim() || "Download";
55911
- const variant = normalizeButtonVariant(buttonVariant);
55735
+ const variant = parseButtonVariant(buttonVariant);
55736
+ if (!variant) {
55737
+ console.error("[FileDownloadNode] Invalid button variant", { buttonVariant });
55738
+ return null;
55739
+ }
55912
55740
  return /* @__PURE__ */ jsx("div", {
55913
55741
  className,
55914
55742
  children: /* @__PURE__ */ jsxs("div", {
@@ -58029,7 +57857,7 @@ function eventSeriesIdsForSubject(subject) {
58029
57857
  switch (subject.kind) {
58030
57858
  case "eventSeries": return [subject.eventSeriesId];
58031
57859
  case "eventOffering": return subject.availableEventSeriesIds;
58032
- default: return assertNever$25(subject);
57860
+ default: return assertNever$24(subject);
58033
57861
  }
58034
57862
  }
58035
57863
  var init_course_page_surface_scope = __esmMin((() => {
@@ -58789,7 +58617,7 @@ function renderOfferingGroupItems(presentation, items, options) {
58789
58617
  children: items.map((item) => renderOfferingCompactItem(item, options))
58790
58618
  })
58791
58619
  });
58792
- default: return assertNever$25(presentation, "Unhandled offerings preview presentation");
58620
+ default: return assertNever$24(presentation, "Unhandled offerings preview presentation");
58793
58621
  }
58794
58622
  }
58795
58623
  function compareCoursesByNextSession(left, right) {
@@ -58834,7 +58662,7 @@ function featuredSummaryDetails(item) {
58834
58662
  const summary = deriveCourseScheduleSummary(item.course);
58835
58663
  return summary ? formatFeaturedSummary(summary, item.course.venue?.name ?? null) : null;
58836
58664
  }
58837
- default: return assertNever$25(item, "Unhandled offerings preview item");
58665
+ default: return assertNever$24(item, "Unhandled offerings preview item");
58838
58666
  }
58839
58667
  }
58840
58668
  function formatFeaturedSummary(summary, venue) {
@@ -58843,7 +58671,7 @@ function formatFeaturedSummary(summary, venue) {
58843
58671
  case "multi-day-span": return detailsFromOccurrences(summary.occurrence, summary.occurrence, venue, null, null, true);
58844
58672
  case "fixed-recurring-run": return detailsFromOccurrences(summary.first, summary.last, venue, summary.recurrenceLabel, null);
58845
58673
  case "irregular-multi-session-run": return detailsFromOccurrences(summary.first, summary.last, venue, null, `${summary.sessionCount} dates`);
58846
- default: return assertNever$25(summary, "Unhandled offerings preview schedule summary");
58674
+ default: return assertNever$24(summary, "Unhandled offerings preview schedule summary");
58847
58675
  }
58848
58676
  }
58849
58677
  function detailsFromOccurrences(first, last, venue, recurrence, sessionCount, spanUsesEndDate = false) {
@@ -59242,7 +59070,7 @@ function bookingActionContent(input) {
59242
59070
  children: input.buttonText
59243
59071
  });
59244
59072
  case "unavailable": return null;
59245
- default: return assertNever$25(input.booking);
59073
+ default: return assertNever$24(input.booking);
59246
59074
  }
59247
59075
  }
59248
59076
  function RecurringSchedule({ schedule, buttonText = "Book", buttonVariant = "primary", showVenue = true, emptyMessage = "Regular schedule details will be added shortly." }) {
@@ -61462,7 +61290,7 @@ function previewEditableTargetToPath(target) {
61462
61290
  case "current-entry-field":
61463
61291
  case "current-entry-metadata": return target.path;
61464
61292
  case "read-only": return;
61465
- default: return assertNever$25(target);
61293
+ default: return assertNever$24(target);
61466
61294
  }
61467
61295
  }
61468
61296
  function previewEditableTargetToFieldKey(target) {
@@ -62515,7 +62343,7 @@ function collectNestedPreviewFieldConstraintEntries(field, path) {
62515
62343
  case "text":
62516
62344
  case "time":
62517
62345
  case "url": return [];
62518
- default: return assertNever$25(field);
62346
+ default: return assertNever$24(field);
62519
62347
  }
62520
62348
  }
62521
62349
  function makeDefaultBlockComponent(args) {
@@ -62734,12 +62562,18 @@ var init_navDropdownSizing = __esmMin((() => {
62734
62562
  `${NAV_DROPDOWN_MAX_WIDTH_CSS}`, `${NAV_DROPDOWN_SHIFT_PROPERTY}`;
62735
62563
  }));
62736
62564
  //#endregion
62565
+ //#region ../theme-core/src/header/surfaceRules.ts
62566
+ init_navDropdownSizing();
62567
+ init_shared$5();
62568
+ init_colorStyles();
62569
+ //#endregion
62737
62570
  //#region ../theme-core/src/header/generateHeaderCss.ts
62738
62571
  init_resolver$1();
62739
62572
  init_siteChromeNavPreferences();
62740
62573
  init_shared$5();
62741
62574
  init_breakpoints();
62742
- init_navDropdownSizing();
62575
+ init_scrollTreatment();
62576
+ init_paintTargets();
62743
62577
  //#endregion
62744
62578
  //#region ../theme-core/src/footer/generateFooterCss.ts
62745
62579
  init_resolver$1();
@@ -63665,7 +63499,7 @@ function sourceLabel(source) {
63665
63499
  case "managed-database": return "DB";
63666
63500
  case "sdk-synced": return "SDK-synced DB";
63667
63501
  case "sdk-config": return "SDK config";
63668
- default: return assertNever$25(source);
63502
+ default: return assertNever$24(source);
63669
63503
  }
63670
63504
  }
63671
63505
  //#endregion
@@ -64266,6 +64100,9 @@ init_typeGuards();
64266
64100
  //#region ../blocks/src/primitives/content/primitives.tsx
64267
64101
  init_RichText();
64268
64102
  //#endregion
64103
+ //#region ../blocks/src/system/runtime/nodes/mergeResolveImageUrlContexts.ts
64104
+ init_src$2();
64105
+ //#endregion
64269
64106
  //#region ../blocks/src/system/helpers/resolveBackground.tsx
64270
64107
  /**
64271
64108
  * Helper utilities for resolving background data in custom block components.
@@ -64340,7 +64177,7 @@ init_tokens();
64340
64177
  init_gradients();
64341
64178
  init_richTextSchema();
64342
64179
  init_media();
64343
- init_media$1();
64180
+ init_media$2();
64344
64181
  init_slotContracts();
64345
64182
  init_typeGuards();
64346
64183
  init_booking_form_reserved_fields();
@@ -70702,6 +70539,47 @@ async function writeMediaManifest(contentDir, manifest) {
70702
70539
  return manifestPath;
70703
70540
  }
70704
70541
  //#endregion
70542
+ //#region src/cli/content/legacyEventScheduleShapeError.ts
70543
+ var LegacyEventScheduleShapeError = class extends Error {
70544
+ constructor(filePath) {
70545
+ super(`${filePath}: legacy event "schedule" is no longer supported. Preserve local edits, run "riverbankcms pull events", then reapply those edits to preset, bookingScope, and occurrences.`);
70546
+ this.filePath = filePath;
70547
+ this.code = "legacy_event_schedule_shape";
70548
+ this.name = "LegacyEventScheduleShapeError";
70549
+ }
70550
+ };
70551
+ //#endregion
70552
+ //#region src/cli/content/localEventSchedule.ts
70553
+ const localEventScheduleIdentitySchema = z$1.object({
70554
+ preset: z$1.enum([
70555
+ "event",
70556
+ "class",
70557
+ "course",
70558
+ "workshop",
70559
+ "retreat",
70560
+ "performance"
70561
+ ]),
70562
+ bookingScope: z$1.enum(["single_occurrence", "whole_series"]),
70563
+ occurrences: z$1.array(z$1.object({
70564
+ startsAt: z$1.string().datetime({ offset: true }),
70565
+ endsAt: z$1.string().datetime({ offset: true }),
70566
+ timeZone: z$1.string().min(1)
70567
+ }))
70568
+ });
70569
+ var InvalidLocalEventScheduleIdentityError = class extends Error {
70570
+ constructor(filePath, details) {
70571
+ super(`${filePath}: invalid event schedule identity: ${details}`);
70572
+ this.filePath = filePath;
70573
+ this.code = "invalid_local_event_schedule_identity";
70574
+ this.name = "InvalidLocalEventScheduleIdentityError";
70575
+ }
70576
+ };
70577
+ function parseLocalEventScheduleIdentity(value, filePath) {
70578
+ const parsed = localEventScheduleIdentitySchema.safeParse(value);
70579
+ if (!parsed.success) throw new InvalidLocalEventScheduleIdentityError(filePath, parsed.error.issues.map((issue) => `${issue.path.join(".")}: ${issue.message}`).join("; "));
70580
+ return parsed.data;
70581
+ }
70582
+ //#endregion
70705
70583
  //#region src/cli/content/reader.ts
70706
70584
  /**
70707
70585
  * Content File Reader
@@ -70953,12 +70831,17 @@ async function readEventsWithFilePaths(contentDir) {
70953
70831
  const events = [];
70954
70832
  const files = await listFiles(eventsDir, ".json");
70955
70833
  for (const filePath of files) try {
70956
- const event = await readJsonFile(filePath);
70834
+ const raw = await readJsonFile(filePath);
70835
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) throw new InvalidLocalEventScheduleIdentityError(filePath, "expected an object");
70836
+ if ("schedule" in raw) throw new LegacyEventScheduleShapeError(filePath);
70837
+ const scheduleIdentity = parseLocalEventScheduleIdentity(raw, filePath);
70957
70838
  events.push({
70958
- ...event,
70839
+ ...raw,
70840
+ ...scheduleIdentity,
70959
70841
  filePath
70960
70842
  });
70961
70843
  } catch (error) {
70844
+ if (error instanceof LegacyEventScheduleShapeError || error instanceof InvalidLocalEventScheduleIdentityError) throw error;
70962
70845
  console.warn(`Warning: Could not parse ${filePath}:`, error);
70963
70846
  }
70964
70847
  return events;
@@ -74737,7 +74620,9 @@ function mapEventToComparable(e) {
74737
74620
  slug: e.slug,
74738
74621
  status: e.status,
74739
74622
  visibility: e.visibility,
74740
- schedule: e.schedule,
74623
+ preset: e.preset,
74624
+ bookingScope: e.bookingScope,
74625
+ occurrences: e.occurrences,
74741
74626
  capacity: e.capacity,
74742
74627
  pricing: e.pricing,
74743
74628
  paymentTerms: e.paymentTerms,
@@ -76530,6 +76415,14 @@ function normalizeEventPaymentTermsForCompare(paymentTerms) {
76530
76415
  const result = classifySdkEventPaymentTerms(paymentTerms);
76531
76416
  if (result.ok) return result.paymentTerms;
76532
76417
  }
76418
+ var IncompatibleEventPullContractError = class extends Error {
76419
+ constructor(identifier, cause) {
76420
+ super(`Remote event "${identifier}" does not expose the canonical preset, bookingScope, and occurrences contract. Deploy the matching Riverbank API before using this SDK. ${cause.message}`);
76421
+ this.identifier = identifier;
76422
+ this.code = "incompatible_event_pull_contract";
76423
+ this.name = "IncompatibleEventPullContractError";
76424
+ }
76425
+ };
76533
76426
  function normalizeVenueAddress(value) {
76534
76427
  const obj = isRecord$9(value) ? value : {};
76535
76428
  return {
@@ -76577,19 +76470,23 @@ function normalizeEventCategoryForCompare(category) {
76577
76470
  }
76578
76471
  function normalizeRemoteEventForCompare(event) {
76579
76472
  const obj = isRecord$9(event) ? event : {};
76580
- const schedule = isRecord$9(obj.schedule) ? obj.schedule : {};
76473
+ const identifier = stringValue(obj.identifier, "<unknown>");
76474
+ let scheduleIdentity;
76475
+ try {
76476
+ scheduleIdentity = parseLocalEventScheduleIdentity(obj, `remote event "${identifier}"`);
76477
+ } catch (error) {
76478
+ if (error instanceof InvalidLocalEventScheduleIdentityError) throw new IncompatibleEventPullContractError(identifier, error);
76479
+ throw error;
76480
+ }
76581
76481
  return {
76582
- identifier: String(obj.identifier),
76482
+ identifier,
76583
76483
  title: String(obj.title),
76584
76484
  slug: String(obj.slug),
76585
76485
  status: obj.status === "active" || obj.status === "draft" || obj.status === "archived" || obj.status === "cancelled" || obj.status === "completed" ? obj.status : "draft",
76586
76486
  visibility: obj.visibility === "public" || obj.visibility === "private" || obj.visibility === "unlisted" ? obj.visibility : "private",
76587
- schedule: {
76588
- recurrenceRule: nullishToNull(schedule.recurrenceRule),
76589
- startDate: nullishToNull(schedule.startDate),
76590
- defaultStartTime: stringValue(schedule.defaultStartTime, "09:00:00"),
76591
- durationMinutes: typeof schedule.durationMinutes === "number" ? schedule.durationMinutes : 60
76592
- },
76487
+ preset: scheduleIdentity.preset,
76488
+ bookingScope: scheduleIdentity.bookingScope,
76489
+ occurrences: [...scheduleIdentity.occurrences],
76593
76490
  capacity: nullishToNull(typeof obj.capacity === "number" ? obj.capacity : void 0),
76594
76491
  pricing: normalizeEventPricingForCompare(obj.pricing),
76595
76492
  paymentTerms: normalizeEventPaymentTermsForCompare(obj.paymentTerms),
@@ -76603,14 +76500,16 @@ function normalizeRemoteEventForCompare(event) {
76603
76500
  };
76604
76501
  }
76605
76502
  function normalizeLocalEventAgainstRemoteForCompare(localEvent, remoteEvent) {
76606
- const local = isRecord$9(localEvent) ? localEvent : {};
76503
+ const local = localEvent;
76607
76504
  const base = remoteEvent ? normalizeRemoteEventForCompare(remoteEvent) : normalizeRemoteEventForCompare({
76608
76505
  identifier: local.identifier,
76609
76506
  title: local.title,
76610
76507
  slug: local.slug,
76611
76508
  status: local.status ?? "draft",
76612
76509
  visibility: local.visibility ?? "private",
76613
- schedule: local.schedule ?? {},
76510
+ preset: local.preset,
76511
+ bookingScope: local.bookingScope,
76512
+ occurrences: local.occurrences,
76614
76513
  pricing: local.pricing ?? {},
76615
76514
  paymentTerms: local.paymentTerms,
76616
76515
  capacity: local.capacity ?? null,
@@ -76622,7 +76521,6 @@ function normalizeLocalEventAgainstRemoteForCompare(localEvent, remoteEvent) {
76622
76521
  presentation: local.presentation ?? null,
76623
76522
  tags: local.tags ?? []
76624
76523
  });
76625
- const schedule = isRecord$9(local.schedule) ? local.schedule : {};
76626
76524
  return {
76627
76525
  ...base,
76628
76526
  identifier: stringValue(local.identifier, base.identifier),
@@ -76630,12 +76528,9 @@ function normalizeLocalEventAgainstRemoteForCompare(localEvent, remoteEvent) {
76630
76528
  slug: stringValue(local.slug, base.slug),
76631
76529
  status: local.status === void 0 ? base.status : local.status === "active" || local.status === "draft" || local.status === "archived" || local.status === "cancelled" || local.status === "completed" ? local.status : "draft",
76632
76530
  visibility: local.visibility === void 0 ? base.visibility : local.visibility === "public" || local.visibility === "private" || local.visibility === "unlisted" ? local.visibility : "private",
76633
- schedule: {
76634
- recurrenceRule: schedule.recurrenceRule === void 0 ? base.schedule.recurrenceRule : nullishToNull(schedule.recurrenceRule),
76635
- startDate: schedule.startDate === void 0 ? base.schedule.startDate : nullishToNull(schedule.startDate),
76636
- defaultStartTime: schedule.defaultStartTime === void 0 ? base.schedule.defaultStartTime : stringValue(schedule.defaultStartTime, base.schedule.defaultStartTime),
76637
- durationMinutes: schedule.durationMinutes === void 0 ? base.schedule.durationMinutes : typeof schedule.durationMinutes === "number" ? schedule.durationMinutes : base.schedule.durationMinutes
76638
- },
76531
+ preset: local.preset,
76532
+ bookingScope: local.bookingScope,
76533
+ occurrences: [...local.occurrences],
76639
76534
  capacity: local.capacity === void 0 ? base.capacity : nullishToNull(typeof local.capacity === "number" ? local.capacity : void 0),
76640
76535
  pricing: local.pricing === void 0 ? base.pricing : normalizeEventPricingForCompare(local.pricing),
76641
76536
  paymentTerms: local.paymentTerms === void 0 ? base.paymentTerms : normalizeEventPaymentTermsForCompare(local.paymentTerms),
@@ -77206,12 +77101,13 @@ const navigationMenuRoles = [
77206
77101
  "footer",
77207
77102
  "legal-policy"
77208
77103
  ];
77209
- const offeringArchetypes = [
77104
+ const eventPresets = [
77105
+ "event",
77210
77106
  "class",
77107
+ "course",
77211
77108
  "workshop",
77212
77109
  "retreat",
77213
- "performance",
77214
- "custom"
77110
+ "performance"
77215
77111
  ];
77216
77112
  const offeringVisibilities = [
77217
77113
  "draft",
@@ -77295,7 +77191,7 @@ function createSiteStyleSelectionChangeSchema(parts) {
77295
77191
  }).strict(),
77296
77192
  z$1.object({
77297
77193
  kind: z$1.literal("set-palette"),
77298
- command: parts.paletteCommand
77194
+ palette: parts.palette
77299
77195
  }).strict(),
77300
77196
  z$1.object({
77301
77197
  kind: z$1.literal("set-typography"),
@@ -77329,13 +77225,12 @@ function validateUniqueSiteStyleSelectionChanges(input, ctx) {
77329
77225
  //#endregion
77330
77226
  //#region ../site-commands/src/siteStyleCommandSchema.ts
77331
77227
  init_buttons();
77332
- init_palette();
77333
77228
  const siteStyleRefSchema = z$1.string().regex(/^site-style:[a-z0-9][a-z0-9-]*$/u).transform((value) => value);
77334
77229
  const catalogIdSchema = z$1.string().trim().min(1);
77335
77230
  const selectionChangeSchema = createSiteStyleSelectionChangeSchema({
77336
77231
  siteStyleId: siteStyleRefSchema,
77337
77232
  buttonStyleSelection: buttonStyleSelectionSchema,
77338
- paletteCommand: paletteCommandSchema,
77233
+ palette: paletteSchema,
77339
77234
  typography: typographySchema,
77340
77235
  headerLookId: catalogIdSchema,
77341
77236
  headerLayoutId: catalogIdSchema,
@@ -77959,8 +77854,8 @@ const upsertEventSeriesCommandSchema = z$1.object({
77959
77854
  slug: z$1.string().min(1),
77960
77855
  path: z$1.string().startsWith("/").nullable().optional(),
77961
77856
  title: z$1.string().min(1),
77962
- archetype: z$1.enum(offeringArchetypes),
77963
- bookingScope: z$1.enum(["single_occurrence", "whole_series"]).optional(),
77857
+ preset: z$1.enum(eventPresets),
77858
+ bookingScope: z$1.enum(["single_occurrence", "whole_series"]),
77964
77859
  status: z$1.enum([
77965
77860
  "draft",
77966
77861
  "active",
@@ -79556,7 +79451,7 @@ function commandRefContributions(command) {
79556
79451
  field: "input.contentEntryRef"
79557
79452
  }] : []
79558
79453
  };
79559
- default: return assertNever$25(command);
79454
+ default: return assertNever$24(command);
79560
79455
  }
79561
79456
  }
79562
79457
  function passRedemptionSubjectRefContribution(subject) {
@@ -79569,7 +79464,7 @@ function passRedemptionSubjectRefContribution(subject) {
79569
79464
  ref: subject.eventRegistrationRef,
79570
79465
  field: "input.subject.eventRegistrationRef"
79571
79466
  };
79572
- default: return assertNever$25(subject);
79467
+ default: return assertNever$24(subject);
79573
79468
  }
79574
79469
  }
79575
79470
  function portalOrderSubjectRefContribution(subject) {
@@ -79582,7 +79477,7 @@ function portalOrderSubjectRefContribution(subject) {
79582
79477
  ref: subject.courseEnrollmentRef,
79583
79478
  field: "input.subject.courseEnrollmentRef"
79584
79479
  };
79585
- default: return assertNever$25(subject);
79480
+ default: return assertNever$24(subject);
79586
79481
  }
79587
79482
  }
79588
79483
  function collectOfferingRequires(input, intervals, intervalPath) {
@@ -80236,7 +80131,7 @@ function stableStringify(value) {
80236
80131
  case "object":
80237
80132
  case "string": return JSON.stringify(sorted);
80238
80133
  }
80239
- return assertNever$25(sorted);
80134
+ return assertNever$24(sorted);
80240
80135
  }
80241
80136
  function sortValue(value) {
80242
80137
  if (Array.isArray(value)) return value.map(sortValue);
@@ -80475,7 +80370,7 @@ function appliedSubjectFromOutcome(outcome) {
80475
80370
  case "skipped_by_stop_policy":
80476
80371
  case "compile_failed":
80477
80372
  case "preflight_failed": return [];
80478
- default: assertNever$25(outcome);
80373
+ default: assertNever$24(outcome);
80479
80374
  }
80480
80375
  }
80481
80376
  function failureFromOutcome(outcome) {
@@ -80494,7 +80389,7 @@ function failureFromOutcome(outcome) {
80494
80389
  };
80495
80390
  case "applied":
80496
80391
  case "skipped_by_stop_policy": return null;
80497
- default: assertNever$25(outcome);
80392
+ default: assertNever$24(outcome);
80498
80393
  }
80499
80394
  }
80500
80395
  function appliedCommand(command) {
@@ -80510,154 +80405,61 @@ function reportSubjectForCommandRef(subjectsByCommandRef, commandRef) {
80510
80405
  throw new Error(`Internal command planning error: missing report subject for ${commandRef}.`);
80511
80406
  }
80512
80407
  //#endregion
80513
- //#region ../api/src/sdk-event-schedule.ts
80514
- const timeRegex = /^([01]\d|2[0-3]):([0-5]\d)(:([0-5]\d))?$/;
80515
- const explicitOffsetDateTimeRegex = /^(\d{4})-(\d{2})-(\d{2})T([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d))?(\.\d{1,3})?(Z|[+-]([01]\d|2[0-3]):[0-5]\d)$/;
80516
- const localDateTimeRegex = /^(\d{4})-(\d{2})-(\d{2})T([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d))?(\.\d{1,3})?$/;
80517
- function issue(path, message) {
80518
- return {
80519
- path,
80520
- message
80521
- };
80522
- }
80523
- function isValidDateParts(year, month, day) {
80524
- const date = new Date(Date.UTC(year, month - 1, day));
80525
- return date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day;
80526
- }
80527
- function isZeroFraction(fraction) {
80528
- return fraction === void 0 || /^\.0+$/.test(fraction);
80529
- }
80530
- function datePart(year, month, day) {
80531
- return `${year}-${month}-${day}`;
80532
- }
80533
- function timePart(hours, minutes, seconds = "00") {
80534
- return `${hours}:${minutes}:${seconds}`;
80535
- }
80536
- function parseSdkEventDateTime(value) {
80537
- const explicitMatch = explicitOffsetDateTimeRegex.exec(value);
80538
- if (explicitMatch) {
80539
- const [, yearRaw, monthRaw, dayRaw, hours, minutes, seconds = "00", fraction] = explicitMatch;
80540
- if (!yearRaw || !monthRaw || !dayRaw || !hours || !minutes) return null;
80541
- if (!isValidDateParts(Number(yearRaw), Number(monthRaw), Number(dayRaw)) || !isZeroFraction(fraction)) return null;
80542
- const epochMs = Date.parse(value);
80543
- if (!Number.isFinite(epochMs)) return null;
80544
- return {
80545
- epochMs,
80546
- date: datePart(yearRaw, monthRaw, dayRaw),
80547
- time: timePart(hours, minutes, seconds),
80548
- iso: new Date(epochMs).toISOString()
80549
- };
80408
+ //#region src/cli/site-commands/eventScheduleCompiler.ts
80409
+ init_src$3();
80410
+ function compileExplicitEventSchedule(event) {
80411
+ if (event.occurrences.length === 0) return unsupported$1(event, `Event ${event.identifier} has no occurrences; event pushes require at least one explicit occurrence.`);
80412
+ const timeZone = event.occurrences[0]?.timeZone;
80413
+ if (!timeZone || event.occurrences.some((occurrence) => occurrence.timeZone !== timeZone)) return unsupported$1(event, `Event ${event.identifier} contains mixed occurrence timezones; one event series must use one IANA timezone.`);
80414
+ if (!isIanaTimeZone(timeZone)) return unsupported$1(event, `Event ${event.identifier} uses invalid IANA timezone "${timeZone}".`);
80415
+ const occurrences = [];
80416
+ const seenStartsAt = /* @__PURE__ */ new Set();
80417
+ for (const occurrence of event.occurrences) {
80418
+ const start = parseUtcIsoDateTimeString(occurrence.startsAt);
80419
+ const end = parseUtcIsoDateTimeString(occurrence.endsAt);
80420
+ if (!start.ok || !end.ok || Date.parse(end.value) <= Date.parse(start.value)) return unsupported$1(event, `Event ${event.identifier} contains an invalid occurrence; startsAt and endsAt must be offset-aware ISO datetimes with endsAt after startsAt.`);
80421
+ if (seenStartsAt.has(start.value)) return unsupported$1(event, `Event ${event.identifier} contains duplicate occurrence startsAt values; each session must start at a unique instant.`);
80422
+ seenStartsAt.add(start.value);
80423
+ occurrences.push({
80424
+ startAt: start.value,
80425
+ endAt: end.value
80426
+ });
80550
80427
  }
80551
- const localMatch = localDateTimeRegex.exec(value);
80552
- if (!localMatch) return null;
80553
- const [, yearRaw, monthRaw, dayRaw, hours, minutes, seconds = "00", fraction] = localMatch;
80554
- if (!yearRaw || !monthRaw || !dayRaw || !hours || !minutes) return null;
80555
- const year = Number(yearRaw);
80556
- const month = Number(monthRaw);
80557
- const day = Number(dayRaw);
80558
- if (!isValidDateParts(year, month, day) || !isZeroFraction(fraction)) return null;
80559
- const epochMs = Date.UTC(year, month - 1, day, Number(hours), Number(minutes), Number(seconds));
80560
- return {
80561
- epochMs,
80562
- date: datePart(yearRaw, monthRaw, dayRaw),
80563
- time: timePart(hours, minutes, seconds),
80564
- iso: new Date(epochMs).toISOString()
80565
- };
80566
- }
80567
- function durationMinutesBetween(startsAt, endsAt) {
80568
- if (endsAt.epochMs <= startsAt.epochMs) return null;
80569
- const durationMs = endsAt.epochMs - startsAt.epochMs;
80570
- if (durationMs % 6e4 !== 0) return null;
80571
- return durationMs / 6e4;
80572
- }
80573
- function exceedsMaxDuration(durationMinutes, options) {
80574
- return options.maxDurationMinutes !== void 0 && durationMinutes > options.maxDurationMinutes;
80428
+ return ok$3({
80429
+ timeZone,
80430
+ occurrences
80431
+ });
80575
80432
  }
80576
- function maxDurationMessage(options) {
80577
- return options.maxDurationDays === void 0 ? "Duration is above the allowed maximum" : `Duration must be ${options.maxDurationDays} days or less`;
80433
+ function scheduleFromExplicitEventOccurrence(occurrence) {
80434
+ return scheduleFromCommandOccurrence({
80435
+ startAt: occurrence.startsAt,
80436
+ endAt: occurrence.endsAt
80437
+ }, occurrence.timeZone);
80578
80438
  }
80579
- function classifyCanonicalSchedule(input, options) {
80580
- const issues = [];
80581
- if (options.requireCanonicalFields && input.recurrenceRule === void 0) issues.push(issue(["recurrenceRule"], "recurrenceRule is required"));
80582
- if (input.defaultStartTime !== void 0 && input.defaultStartTime !== null && !timeRegex.test(input.defaultStartTime)) issues.push(issue(["defaultStartTime"], "Invalid time format (HH:MM or HH:MM:SS)"));
80583
- if (options.requireCanonicalFields && !input.defaultStartTime) issues.push(issue(["defaultStartTime"], "defaultStartTime is required"));
80584
- if (options.requireCanonicalFields && input.durationMinutes === void 0) issues.push(issue(["durationMinutes"], "durationMinutes is required"));
80585
- if (input.durationMinutes !== void 0 && input.durationMinutes !== null) {
80586
- if (input.durationMinutes < 1) issues.push(issue(["durationMinutes"], "durationMinutes must be at least 1"));
80587
- else if (exceedsMaxDuration(input.durationMinutes, options)) issues.push(issue(["durationMinutes"], maxDurationMessage(options)));
80439
+ function isIanaTimeZone(value) {
80440
+ try {
80441
+ new Intl.DateTimeFormat("en-GB", { timeZone: value });
80442
+ return true;
80443
+ } catch {
80444
+ return false;
80588
80445
  }
80589
- if (issues.length > 0) return {
80590
- ok: false,
80591
- issues
80592
- };
80593
- return {
80594
- ok: true,
80595
- kind: "canonical",
80596
- canonical: {
80597
- recurrenceRule: input.recurrenceRule ?? null,
80598
- startDate: input.startDate,
80599
- defaultStartTime: input.defaultStartTime ?? "09:00:00",
80600
- durationMinutes: input.durationMinutes ?? 60
80601
- }
80602
- };
80603
80446
  }
80604
- function classifySdkEventSchedule(input, options = {}) {
80605
- const issues = [];
80606
- const hasStartsAt = input.startsAt !== void 0 && input.startsAt !== null;
80607
- const hasEndsAt = input.endsAt !== void 0 && input.endsAt !== null;
80608
- const hasDateTimeDuration = hasStartsAt && input.durationMinutes !== void 0 && input.durationMinutes !== null;
80609
- const hasCanonicalStart = input.startDate !== void 0 || input.defaultStartTime !== void 0;
80610
- if (!hasStartsAt && !hasEndsAt) return classifyCanonicalSchedule(input, options);
80611
- if (hasStartsAt && hasCanonicalStart) issues.push(issue(["startsAt"], "Use either startsAt or startDate/defaultStartTime, not both"));
80612
- if (input.recurrenceRule) issues.push(issue(["recurrenceRule"], "startsAt schedules are only supported for one-off events"));
80613
- if (!hasStartsAt) issues.push(issue(["startsAt"], "startsAt is required when endsAt is provided"));
80614
- if (!hasEndsAt && !hasDateTimeDuration) issues.push(issue(["endsAt"], "Provide either endsAt or durationMinutes with startsAt"));
80615
- if (hasEndsAt && hasDateTimeDuration) issues.push(issue(["endsAt"], "Use either endsAt or durationMinutes with startsAt, not both"));
80616
- const startsAt = typeof input.startsAt === "string" ? parseSdkEventDateTime(input.startsAt) : null;
80617
- const endsAt = typeof input.endsAt === "string" ? parseSdkEventDateTime(input.endsAt) : null;
80618
- if (hasStartsAt && !startsAt) issues.push(issue(["startsAt"], "Invalid datetime format. Use ISO datetime format, e.g. 2026-06-01T10:00:00Z"));
80619
- if (hasEndsAt && !endsAt) issues.push(issue(["endsAt"], "Invalid datetime format. Use ISO datetime format, e.g. 2026-06-07T10:00:00Z"));
80620
- if (startsAt && endsAt) {
80621
- const durationMinutes = durationMinutesBetween(startsAt, endsAt);
80622
- if (durationMinutes === null) issues.push(issue(["endsAt"], "endsAt must be after startsAt and align to a whole minute"));
80623
- else if (exceedsMaxDuration(durationMinutes, options)) issues.push(issue(["endsAt"], maxDurationMessage(options)));
80624
- if (issues.length === 0 && durationMinutes !== null) return {
80625
- ok: true,
80626
- kind: "start-end",
80627
- canonical: {
80628
- recurrenceRule: null,
80629
- startDate: startsAt.date,
80630
- defaultStartTime: startsAt.time,
80631
- durationMinutes
80632
- },
80633
- startsAtIso: startsAt.iso,
80634
- endsAtIso: endsAt.iso
80635
- };
80636
- }
80637
- if (startsAt && hasDateTimeDuration && input.durationMinutes !== void 0 && input.durationMinutes !== null) {
80638
- if (input.durationMinutes < 1) issues.push(issue(["durationMinutes"], "durationMinutes must be at least 1"));
80639
- else if (exceedsMaxDuration(input.durationMinutes, options)) issues.push(issue(["durationMinutes"], maxDurationMessage(options)));
80640
- if (issues.length === 0) {
80641
- const endsAtMs = startsAt.epochMs + input.durationMinutes * 6e4;
80642
- return {
80643
- ok: true,
80644
- kind: "start-duration",
80645
- canonical: {
80646
- recurrenceRule: null,
80647
- startDate: startsAt.date,
80648
- defaultStartTime: startsAt.time,
80649
- durationMinutes: input.durationMinutes
80650
- },
80651
- startsAtIso: startsAt.iso,
80652
- endsAtIso: new Date(endsAtMs).toISOString()
80653
- };
80654
- }
80655
- }
80447
+ function scheduleFromCommandOccurrence(occurrence, timeZone) {
80448
+ const start = new Date(occurrence.startAt);
80656
80449
  return {
80657
- ok: false,
80658
- issues
80450
+ recurrenceRule: null,
80451
+ startDate: formatLocalScheduleDate(getLocalScheduleDate(start, timeZone)),
80452
+ defaultStartTime: formatLocalScheduleTime(getLocalScheduleTime(start, timeZone)),
80453
+ durationMinutes: Math.round((Date.parse(occurrence.endAt) - Date.parse(occurrence.startAt)) / 6e4)
80659
80454
  };
80660
80455
  }
80456
+ function unsupported$1(event, message) {
80457
+ return err$3({
80458
+ code: "unsupported_local_shape",
80459
+ identifier: event.identifier,
80460
+ message
80461
+ });
80462
+ }
80661
80463
  //#endregion
80662
80464
  //#region src/cli/site-commands/datedOfferingCommands.ts
80663
80465
  init_src$3();
@@ -80824,9 +80626,8 @@ function eventCategoryCommand(category) {
80824
80626
  }
80825
80627
  function eventSeriesCommand(event) {
80826
80628
  if (event.identifier !== event.slug) return unsupported(event.identifier, `Event identifier "${event.identifier}" must match slug "${event.slug}".`);
80827
- if (event.schedule?.recurrenceRule) return unsupported(event.identifier, `Event ${event.identifier} uses recurrenceRule; command-backed SDK pushes currently support one-off events only.`);
80828
- const occurrence = eventOccurrence(event);
80829
- if (!occurrence.ok) return occurrence;
80629
+ const schedule = compileExplicitEventSchedule(event);
80630
+ if (!schedule.ok) return schedule;
80830
80631
  const pricing = eventPricing(event);
80831
80632
  if (!pricing.ok) return pricing;
80832
80633
  const content = event.content ? {
@@ -80845,11 +80646,11 @@ function eventSeriesCommand(event) {
80845
80646
  slug: event.slug,
80846
80647
  path: event.path,
80847
80648
  title: event.title,
80848
- archetype: "custom",
80849
- bookingScope: "single_occurrence",
80649
+ preset: event.preset,
80650
+ bookingScope: event.bookingScope,
80850
80651
  status: event.status === "completed" ? void 0 : event.status,
80851
80652
  visibility: offeringVisibility(event.visibility, event.status),
80852
- timezone: "UTC",
80653
+ timezone: schedule.value.timeZone,
80853
80654
  venueIdentifier: event.venueRef ?? void 0,
80854
80655
  categoryIdentifier: event.categoryRef ?? void 0,
80855
80656
  formIdentifier: event.formRef ?? void 0,
@@ -80858,7 +80659,7 @@ function eventSeriesCommand(event) {
80858
80659
  priceDisplay: pricing.value.priceDisplay ?? void 0,
80859
80660
  acceptsPasses: pricing.value.acceptsPasses,
80860
80661
  acceptsMemberships: pricing.value.acceptsMemberships,
80861
- occurrences: [occurrence.value],
80662
+ occurrences: schedule.value.occurrences,
80862
80663
  content,
80863
80664
  settings: event.settings,
80864
80665
  paymentTerms: event.paymentTerms,
@@ -80868,23 +80669,6 @@ function eventSeriesCommand(event) {
80868
80669
  }
80869
80670
  });
80870
80671
  }
80871
- function eventOccurrence(event) {
80872
- const scheduleClassification = classifySdkEventSchedule(event.schedule ?? {});
80873
- if (!scheduleClassification.ok) return unsupported(event.identifier, `Event ${event.identifier} has an invalid schedule: ${scheduleClassification.issues.map((validationIssue) => validationIssue.message).join("; ")}`);
80874
- if (scheduleClassification.kind === "start-end" || scheduleClassification.kind === "start-duration") return ok$3({
80875
- startAt: scheduleClassification.startsAtIso,
80876
- endAt: scheduleClassification.endsAtIso
80877
- });
80878
- const startDate = event.schedule?.startDate;
80879
- if (!startDate) return unsupported(event.identifier, `Event ${event.identifier} is missing schedule.startDate; command-backed event pushes require a concrete occurrence.`);
80880
- const startTime = event.schedule?.defaultStartTime ?? "09:00:00";
80881
- const durationMinutes = event.schedule?.durationMinutes ?? 60;
80882
- const startAt = toUtcIso(startDate, startTime);
80883
- return ok$3({
80884
- startAt,
80885
- endAt: new Date(Date.parse(startAt) + durationMinutes * 6e4).toISOString()
80886
- });
80887
- }
80888
80672
  function eventPricing(event) {
80889
80673
  const pricing = classifySdkEventPricing(event.pricing);
80890
80674
  if (!pricing.ok) return unsupported(event.identifier, `Event ${event.identifier} has invalid pricing: ${pricing.issues[0]?.message ?? "invalid pricing"}.`);
@@ -80917,7 +80701,7 @@ function eventPricing(event) {
80917
80701
  acceptsPasses: pricing.pricing.acceptsPasses,
80918
80702
  acceptsMemberships: pricing.pricing.acceptsMemberships
80919
80703
  });
80920
- default: return assertNever$25(pricing.pricing);
80704
+ default: return assertNever$24(pricing.pricing);
80921
80705
  }
80922
80706
  }
80923
80707
  function venueUpsertInput(command) {
@@ -80930,10 +80714,17 @@ function eventSeriesUpsertInput(command) {
80930
80714
  identifier: command.input.slug,
80931
80715
  title: command.input.title,
80932
80716
  slug: command.input.slug,
80717
+ preset: command.input.preset,
80718
+ bookingScope: command.input.bookingScope,
80719
+ occurrences: command.input.occurrences.map((item) => ({
80720
+ startsAt: item.startAt,
80721
+ endsAt: item.endAt,
80722
+ timeZone: command.input.timezone
80723
+ })),
80933
80724
  path: command.input.path,
80934
80725
  status: command.input.status,
80935
80726
  visibility: managementVisibility(command.input.visibility),
80936
- schedule: scheduleFromOccurrence(occurrence),
80727
+ schedule: scheduleFromCommandOccurrence(occurrence, command.input.timezone),
80937
80728
  capacity: capacityLimit(command.input.capacity),
80938
80729
  pricing: eventPricingInput(command.input),
80939
80730
  ...command.input.paymentTerms === void 0 ? {} : { paymentTerms: command.input.paymentTerms },
@@ -80978,7 +80769,7 @@ function eventPricingInput(input) {
80978
80769
  };
80979
80770
  case "manual_payment":
80980
80771
  case "external": throw new Error(`Unsupported event pricing mode reached SDK mapper: ${input.pricing.kind}`);
80981
- default: return assertNever$25(input.pricing);
80772
+ default: return assertNever$24(input.pricing);
80982
80773
  }
80983
80774
  }
80984
80775
  function increment(result, counter) {
@@ -80992,7 +80783,7 @@ function increment(result, counter) {
80992
80783
  case "deleted":
80993
80784
  result.deleted++;
80994
80785
  return;
80995
- default: assertNever$25(counter);
80786
+ default: assertNever$24(counter);
80996
80787
  }
80997
80788
  }
80998
80789
  async function applyDatedOfferingCommand(client, command) {
@@ -81021,7 +80812,7 @@ async function applyDatedOfferingCommand(client, command) {
81021
80812
  case "deleteEventSeries":
81022
80813
  await client.events.delete(command.input.identifier);
81023
80814
  return;
81024
- default: assertNever$25(command);
80815
+ default: assertNever$24(command);
81025
80816
  }
81026
80817
  }
81027
80818
  function capacity(value) {
@@ -81045,21 +80836,9 @@ function managementVisibility(visibility) {
81045
80836
  case "unlisted": return "unlisted";
81046
80837
  case "listed":
81047
80838
  case "published": return "public";
81048
- default: return assertNever$25(visibility);
80839
+ default: return assertNever$24(visibility);
81049
80840
  }
81050
80841
  }
81051
- function scheduleFromOccurrence(occurrence) {
81052
- return {
81053
- recurrenceRule: null,
81054
- startDate: occurrence.startAt.slice(0, 10),
81055
- defaultStartTime: occurrence.startAt.slice(11, 19),
81056
- durationMinutes: Math.round((Date.parse(occurrence.endAt) - Date.parse(occurrence.startAt)) / 6e4)
81057
- };
81058
- }
81059
- function toUtcIso(date, time) {
81060
- const normalizedTime = time.length === 5 ? `${time}:00` : time;
81061
- return (/* @__PURE__ */ new Date(`${date}T${normalizedTime}Z`)).toISOString();
81062
- }
81063
80842
  function unsupported(identifier, message) {
81064
80843
  return err$3({
81065
80844
  code: "unsupported_local_shape",
@@ -81090,7 +80869,7 @@ function commandReportToSyncResult(input) {
81090
80869
  input.recordFailure(result, outcome.identifier, outcome.message, outcome.subject);
81091
80870
  break;
81092
80871
  case "skipped_by_stop_policy": break;
81093
- default: assertNever$25(outcome);
80872
+ default: assertNever$24(outcome);
81094
80873
  }
81095
80874
  result.warnings.push(...input.report.warnings);
81096
80875
  return result;
@@ -81162,7 +80941,7 @@ async function executeEntryCommandPlan(input) {
81162
80941
  case "deleteContentEntry":
81163
80942
  await input.client.entries.delete(command.input.contentTypeKey, entryIdentifierForCommand(command));
81164
80943
  return;
81165
- default: assertNever$25(command);
80944
+ default: assertNever$24(command);
81166
80945
  }
81167
80946
  }
81168
80947
  });
@@ -81322,7 +81101,7 @@ function incrementEntrySuccess(result, subject) {
81322
81101
  case "deleted":
81323
81102
  result.entries.deleted++;
81324
81103
  return;
81325
- default: assertNever$25(subject.counter);
81104
+ default: assertNever$24(subject.counter);
81326
81105
  }
81327
81106
  }
81328
81107
  function reportSubject(input) {
@@ -81385,7 +81164,7 @@ async function executeFormCommandPlan(input) {
81385
81164
  settings: command.input.settings ?? {}
81386
81165
  });
81387
81166
  return;
81388
- default: assertNever$25(commandType);
81167
+ default: assertNever$24(commandType);
81389
81168
  }
81390
81169
  }
81391
81170
  });
@@ -81464,7 +81243,7 @@ function incrementFormSuccess(result, subject) {
81464
81243
  case "updated":
81465
81244
  result.forms.updated++;
81466
81245
  return;
81467
- default: assertNever$25(subject.counter);
81246
+ default: assertNever$24(subject.counter);
81468
81247
  }
81469
81248
  }
81470
81249
  function recordFormFailure(result, identifier, message) {
@@ -81509,7 +81288,7 @@ async function executeFooterCommandPlan(input) {
81509
81288
  if (command.input.bottomText !== void 0 && command.input.bottomText !== null && !isRichTextDoc(command.input.bottomText)) throw new Error("Footer bottomText must be a canonical TipTap document");
81510
81289
  await input.client.footer.upsert({ bottomText: command.input.bottomText });
81511
81290
  return;
81512
- default: assertNever$25(commandType);
81291
+ default: assertNever$24(commandType);
81513
81292
  }
81514
81293
  }
81515
81294
  });
@@ -81632,7 +81411,7 @@ async function executeNavigationCommandPlan(input) {
81632
81411
  });
81633
81412
  return;
81634
81413
  }
81635
- default: assertNever$25(commandType);
81414
+ default: assertNever$24(commandType);
81636
81415
  }
81637
81416
  }
81638
81417
  });
@@ -81659,7 +81438,7 @@ function navigationCompileErrorIdentifier(error) {
81659
81438
  case "missing_local_navigation_menu": return error.name;
81660
81439
  case "duplicate_navigation_identity": return error.identity;
81661
81440
  case "command_validation_failed": return "command-validation";
81662
- default: return assertNever$25(error);
81441
+ default: return assertNever$24(error);
81663
81442
  }
81664
81443
  }
81665
81444
  function navigationCommandExecutionToReport(input) {
@@ -81704,7 +81483,7 @@ function navigationCommandRole$1(command) {
81704
81483
  case "header": return "primary";
81705
81484
  case "footer": return "footer";
81706
81485
  case void 0: return;
81707
- default: return assertNever$25(command.input.location);
81486
+ default: return assertNever$24(command.input.location);
81708
81487
  }
81709
81488
  }
81710
81489
  function incrementNavigationSuccess(result, subject) {
@@ -81715,7 +81494,7 @@ function incrementNavigationSuccess(result, subject) {
81715
81494
  case "updated":
81716
81495
  result.navigation.updated++;
81717
81496
  return;
81718
- default: assertNever$25(subject.counter);
81497
+ default: assertNever$24(subject.counter);
81719
81498
  }
81720
81499
  }
81721
81500
  function recordNavigationFailure(result, identifier, message) {
@@ -81994,7 +81773,7 @@ async function executePageCommandPlan(input) {
81994
81773
  case "unpublishPage":
81995
81774
  await input.client.pages.unpublish(pageIdentifierForCommand(command));
81996
81775
  return;
81997
- default: assertNever$25(command);
81776
+ default: assertNever$24(command);
81998
81777
  }
81999
81778
  }
82000
81779
  });
@@ -82096,7 +81875,7 @@ function preflightFailureFromPageCompileError(input) {
82096
81875
  },
82097
81876
  warnings: []
82098
81877
  };
82099
- default: assertNever$25(input.error);
81878
+ default: assertNever$24(input.error);
82100
81879
  }
82101
81880
  }
82102
81881
  function pageCommandReportToSyncResult(report) {
@@ -82311,7 +82090,7 @@ function validateLocalBlock(input) {
82311
82090
  case "builtin_found":
82312
82091
  case "custom_found":
82313
82092
  case "extension_only_custom_found": break;
82314
- default: assertNever$25(resolution);
82093
+ default: assertNever$24(resolution);
82315
82094
  }
82316
82095
  const validation = validateBlockData(input.data, resolution.manifest, resolution.kind === "builtin_found" || resolution.kind === "custom_found" ? [...resolution.extensionFields] : void 0);
82317
82096
  const warnings = formatValidationResult(input.pageIdentifier, input.blockIdentifier, input.kind, validation);
@@ -82338,7 +82117,7 @@ function incrementPageSuccess(result, subject) {
82338
82117
  case "block":
82339
82118
  incrementBlockCounter(result, subject.counter);
82340
82119
  return;
82341
- default: assertNever$25(subject);
82120
+ default: assertNever$24(subject);
82342
82121
  }
82343
82122
  }
82344
82123
  function pageCommandDisplayIdentifier(command) {
@@ -82349,7 +82128,7 @@ function pageCommandDisplayIdentifier(command) {
82349
82128
  case "upsertPageBlock":
82350
82129
  case "deletePageBlock": return [pageIdentifierForBlockCommand(command), blockIdentifierForCommand(command)].join("/");
82351
82130
  case "reorderPageBlocks": return `${pageIdentifierForBlockCommand(command)}/blocks`;
82352
- default: assertNever$25(command);
82131
+ default: assertNever$24(command);
82353
82132
  }
82354
82133
  }
82355
82134
  function recordPageFailure(result, identifier, message, subject) {
@@ -82383,7 +82162,7 @@ function incrementPageCounter(result, counter) {
82383
82162
  case "unpublished":
82384
82163
  result.pages.unpublished++;
82385
82164
  return;
82386
- default: assertNever$25(counter);
82165
+ default: assertNever$24(counter);
82387
82166
  }
82388
82167
  }
82389
82168
  function incrementBlockCounter(result, counter) {
@@ -82398,7 +82177,7 @@ function incrementBlockCounter(result, counter) {
82398
82177
  result.blocks.deleted++;
82399
82178
  return;
82400
82179
  case "reordered": return;
82401
- default: assertNever$25(counter);
82180
+ default: assertNever$24(counter);
82402
82181
  }
82403
82182
  }
82404
82183
  function pageReportSubject(input) {
@@ -82440,7 +82219,7 @@ function compileContentPushExecutionPlan(plan, input, dependencies = {}) {
82440
82219
  });
82441
82220
  break;
82442
82221
  }
82443
- default: assertNever$25(step);
82222
+ default: assertNever$24(step);
82444
82223
  }
82445
82224
  return ok$3({
82446
82225
  kind: "compiled-sync-steps",
@@ -82494,7 +82273,7 @@ async function executeCommandSurfaceAsReport(surface, input) {
82494
82273
  onBeforeExecute: input.onNavigationCommandCount
82495
82274
  })
82496
82275
  };
82497
- default: assertNever$25(surface);
82276
+ default: assertNever$24(surface);
82498
82277
  }
82499
82278
  }
82500
82279
  function preflightCommandSurfaceAsReport(surface, input) {
@@ -82519,7 +82298,7 @@ function preflightCommandSurfaceAsReport(surface, input) {
82519
82298
  surface: "navigation",
82520
82299
  report: reportFromOutcomes({ outcomes: [] })
82521
82300
  };
82522
- default: assertNever$25(surface);
82301
+ default: assertNever$24(surface);
82523
82302
  }
82524
82303
  }
82525
82304
  function skippedRemainingCommandReports(steps) {
@@ -82531,7 +82310,7 @@ function commandSurfaceReportToSyncResult(report) {
82531
82310
  case "page": return pageCommandReportToSyncResult(report.report);
82532
82311
  case "form": return formCommandReportToSyncResult(report.report);
82533
82312
  case "navigation": return navigationCommandReportToSyncResult(report.report);
82534
- default: assertNever$25(report);
82313
+ default: assertNever$24(report);
82535
82314
  }
82536
82315
  }
82537
82316
  function commandSurfaceReportHasFailures(report) {
@@ -82581,7 +82360,7 @@ function compileCommandSurface(surface, input) {
82581
82360
  local: input.local
82582
82361
  })
82583
82362
  };
82584
- default: assertNever$25(surface);
82363
+ default: assertNever$24(surface);
82585
82364
  }
82586
82365
  }
82587
82366
  function commandSurfaceCompileSuccess(surface) {
@@ -82614,7 +82393,7 @@ function commandSurfaceCompileSuccess(surface) {
82614
82393
  surface: "navigation",
82615
82394
  report: navigationCommandCompileErrorToReport(surface.compileResult.error)
82616
82395
  }));
82617
- default: assertNever$25(surface);
82396
+ default: assertNever$24(surface);
82618
82397
  }
82619
82398
  }
82620
82399
  function contentPushReportWithCommandReport(commandReport) {
@@ -82644,7 +82423,7 @@ function skippedCommandSurfaceReport(surface) {
82644
82423
  surface: "navigation",
82645
82424
  report: reportFromOutcomes({ outcomes: skippedOutcomes(surface.compileValue.reportedCommands, navigationSkippedIdentifier) })
82646
82425
  };
82647
- default: assertNever$25(surface);
82426
+ default: assertNever$24(surface);
82648
82427
  }
82649
82428
  }
82650
82429
  function skippedOutcomes(reportedCommands, identifierForSubject) {
@@ -82663,7 +82442,7 @@ function pageSkippedIdentifier(subject) {
82663
82442
  switch (subject.resource) {
82664
82443
  case "page": return subject.identifier;
82665
82444
  case "block": return `${subject.pageIdentifier}/${subject.identifier}`;
82666
- default: assertNever$25(subject);
82445
+ default: assertNever$24(subject);
82667
82446
  }
82668
82447
  }
82669
82448
  function formSkippedIdentifier(subject) {
@@ -82798,7 +82577,7 @@ function planContentPushExecution(input) {
82798
82577
  case "pages": return pageCommandRouting(input.diff).kind === "command_backed" ? syncPlanWithSteps([commandSurfaceStep("page", "continue")]) : syncPlanWithResidualOnly(input);
82799
82578
  case "settings": return syncPlanWithResidualOnly(input);
82800
82579
  case "all": return pushAllExecutionPlan(input);
82801
- default: assertNever$25(input.pushScope);
82580
+ default: assertNever$24(input.pushScope);
82802
82581
  }
82803
82582
  }
82804
82583
  function pushAllExecutionPlan(input) {
@@ -82934,7 +82713,7 @@ async function executePushExecutionSteps(steps, input, dependencies) {
82934
82713
  }
82935
82714
  break;
82936
82715
  }
82937
- default: assertNever$25(step);
82716
+ default: assertNever$24(step);
82938
82717
  }
82939
82718
  return {
82940
82719
  commandReports,
@@ -84648,7 +84427,7 @@ function entryDiffForDecision(decision, remoteEntries) {
84648
84427
  case "conflict":
84649
84428
  case "preserve_remote":
84650
84429
  case "unchanged": return null;
84651
- default: assertNever$25(decision);
84430
+ default: assertNever$24(decision);
84652
84431
  }
84653
84432
  }
84654
84433
  function remoteEntryForDecision(decision, remoteEntries) {
@@ -86708,7 +86487,7 @@ async function applyOneOffEntryCommand(command, client) {
86708
86487
  case "deleteContentEntry":
86709
86488
  await client.entries.delete(command.input.contentTypeKey, entryIdentifierForCommand(command));
86710
86489
  return;
86711
- default: assertNever$25(command);
86490
+ default: assertNever$24(command);
86712
86491
  }
86713
86492
  }
86714
86493
  async function applyOneOffEntryCommandReturningEntry(command, client) {
@@ -86742,7 +86521,7 @@ async function applyOneOffPageCommand(command, client) {
86742
86521
  case "deletePageBlock":
86743
86522
  await client.blocks.delete(pageIdentifierForBlockCommand(command), blockIdentifierForCommand(command));
86744
86523
  return;
86745
- default: assertNever$25(command);
86524
+ default: assertNever$24(command);
86746
86525
  }
86747
86526
  }
86748
86527
  async function applyOneOffPageCommandReturningPage(command, client) {
@@ -86821,7 +86600,7 @@ function oneOffEntryCommandBinding(mutation) {
86821
86600
  counter: "unpublished"
86822
86601
  }
86823
86602
  };
86824
- default: assertNever$25(mutation);
86603
+ default: assertNever$24(mutation);
86825
86604
  }
86826
86605
  }
86827
86606
  function oneOffPageCommandBinding(mutation) {
@@ -86870,7 +86649,7 @@ function oneOffPageCommandBinding(mutation) {
86870
86649
  counter: "unpublished"
86871
86650
  }
86872
86651
  };
86873
- default: assertNever$25(mutation);
86652
+ default: assertNever$24(mutation);
86874
86653
  }
86875
86654
  }
86876
86655
  function oneOffBlockCommandBinding(mutation) {
@@ -86919,7 +86698,7 @@ function oneOffBlockCommandBinding(mutation) {
86919
86698
  }
86920
86699
  };
86921
86700
  }
86922
- default: assertNever$25(mutation);
86701
+ default: assertNever$24(mutation);
86923
86702
  }
86924
86703
  }
86925
86704
  function oneOffNavigationCommandBinding(mutation) {
@@ -86958,7 +86737,7 @@ function navigationCommandRole(command) {
86958
86737
  case "header": return "primary";
86959
86738
  case "footer": return "footer";
86960
86739
  case void 0: return;
86961
- default: return assertNever$25(command.input.location);
86740
+ default: return assertNever$24(command.input.location);
86962
86741
  }
86963
86742
  }
86964
86743
  function isManagementPage(value) {
@@ -144811,15 +144590,20 @@ var init_usePaymentVerification = __esmMin((() => {
144811
144590
  //#endregion
144812
144591
  //#region ../blocks/src/system/runtime/nodes/event-registration/useEventRegistrationStripeReturn.ts
144813
144592
  function useEventRegistrationStripeReturn(options) {
144593
+ return useEventRegistrationStripeReturnWithDeps(options, eventRegistrationStripeReturnDeps);
144594
+ }
144595
+ function useEventRegistrationStripeReturnWithDeps(options, deps) {
144814
144596
  const { api, events, occurrenceId, pendingAttendeeId, setErrorMessage, setFormData, setPaymentSelection, setPendingAttendeeId, setRegistrationResult, setSelectedEvent, setSelectedAttendanceMode, setTicketSelections, setStep, setTicketsCount, step } = options;
144815
- const verification = usePaymentVerification(useMemo(() => step === "verifying-payment" && pendingAttendeeId ? { transactionId: pendingAttendeeId } : null, [step, pendingAttendeeId]));
144597
+ const verificationConfig = useMemo(() => step === "verifying-payment" && pendingAttendeeId ? { transactionId: pendingAttendeeId } : null, [step, pendingAttendeeId]);
144598
+ const verification = deps.usePaymentVerification(verificationConfig);
144816
144599
  useEffect(() => {
144817
- cleanupStaleRegistrations();
144818
- const registrationStatus = consumeSearchParam("registration");
144819
- if (!registrationStatus) return;
144600
+ deps.cleanupStaleRegistrations();
144601
+ const registrationStatus = deps.consumeSearchParam("registration");
144602
+ if (registrationStatus !== "cancelled" && registrationStatus !== "success") return;
144603
+ deps.scrollToBlock(EVENT_REGISTRATION_ANCHOR_ID);
144820
144604
  const siteId = api.config.siteId;
144821
144605
  if (!siteId) return;
144822
- const pending = getPendingRegistration(siteId, occurrenceId || void 0);
144606
+ const pending = deps.getPendingRegistration(siteId, occurrenceId || void 0);
144823
144607
  if (!pending) return;
144824
144608
  setFormData(pending.formData);
144825
144609
  setTicketSelections(pending.ticketSelections);
@@ -144839,7 +144623,7 @@ function useEventRegistrationStripeReturn(options) {
144839
144623
  useEffect(() => {
144840
144624
  if (verification.status === "completed") {
144841
144625
  const siteId = api.config.siteId;
144842
- if (siteId && occurrenceId) clearPendingRegistration(siteId, occurrenceId);
144626
+ if (siteId && occurrenceId) deps.clearPendingRegistration(siteId, occurrenceId);
144843
144627
  setRegistrationResult({ status: "confirmed" });
144844
144628
  setStep("success");
144845
144629
  } else if (verification.status === "failed") {
@@ -144859,11 +144643,21 @@ function useEventRegistrationStripeReturn(options) {
144859
144643
  ]);
144860
144644
  return verification;
144861
144645
  }
144646
+ var eventRegistrationStripeReturnDeps;
144862
144647
  var init_useEventRegistrationStripeReturn = __esmMin((() => {
144863
144648
  init_usePaymentVerification();
144864
144649
  init_shared();
144650
+ init_constants();
144865
144651
  init_sessionStorage();
144866
144652
  init_ticketSelectionLines();
144653
+ eventRegistrationStripeReturnDeps = {
144654
+ usePaymentVerification,
144655
+ consumeSearchParam,
144656
+ scrollToBlock,
144657
+ cleanupStaleRegistrations,
144658
+ clearPendingRegistration,
144659
+ getPendingRegistration
144660
+ };
144867
144661
  }));
144868
144662
  //#endregion
144869
144663
  //#region ../blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.ts
@@ -144955,13 +144749,7 @@ function useEventRegistrationSubmitWithDeps(options, deps) {
144955
144749
  if (!result.alreadyRegistered && result.status === "confirmed" && result.pendingPayment && (method === "stripe" || method === "pass_bundle" || method === "membership_bundle")) {
144956
144750
  options.setPendingAttendeeId(result.attendeeId);
144957
144751
  options.setStep("redirecting");
144958
- const currentUrl = new URL(window.location.href);
144959
- const successParams = new URLSearchParams(currentUrl.search);
144960
- successParams.set("registration", "success");
144961
- const successUrl = `${currentUrl.origin}${currentUrl.pathname}?${successParams.toString()}${currentUrl.hash}`;
144962
- const cancelParams = new URLSearchParams(currentUrl.search);
144963
- cancelParams.set("registration", "cancelled");
144964
- const cancelUrl = `${currentUrl.origin}${currentUrl.pathname}?${cancelParams.toString()}${currentUrl.hash}`;
144752
+ const { successUrl, cancelUrl } = buildCheckoutReturnUrls("registration", EVENT_REGISTRATION_ANCHOR_ID);
144965
144753
  const checkoutType = method === "pass_bundle" ? "pass_bundle" : method === "membership_bundle" ? "membership_bundle" : "event";
144966
144754
  const checkoutResult = await options.api.createEventCheckout({
144967
144755
  attendeeId: result.attendeeId,
@@ -145026,6 +144814,8 @@ function useEventRegistrationSubmitWithDeps(options, deps) {
145026
144814
  }
145027
144815
  var eventRegistrationSubmitDeps;
145028
144816
  var init_useEventRegistrationSubmit = __esmMin((() => {
144817
+ init_shared();
144818
+ init_constants();
145029
144819
  init_sessionStorage();
145030
144820
  init_ticketSelectionLines();
145031
144821
  eventRegistrationSubmitDeps = { savePendingRegistration };
@@ -151967,7 +151757,7 @@ function PassesMembershipsController({ render }) {
151967
151757
  case "redirect":
151968
151758
  window.location.href = result.checkoutUrl;
151969
151759
  return;
151970
- default: return assertNever$25(result);
151760
+ default: return assertNever$24(result);
151971
151761
  }
151972
151762
  } catch (submitError) {
151973
151763
  dispatch({
@@ -152846,7 +152636,7 @@ init_media();
152846
152636
  init_src$3();
152847
152637
  //#endregion
152848
152638
  //#region ../blocks/src/rendering/server.ts
152849
- init_schema$1();
152639
+ init_schema$2();
152850
152640
  //#endregion
152851
152641
  //#region ../theme-core/src/index.ts
152852
152642
  init_schema();
@@ -152973,7 +152763,7 @@ var SimpleCache = class {
152973
152763
  * 1. This constant
152974
152764
  * 2. The "version" field in package.json
152975
152765
  */
152976
- const SDK_VERSION = "0.125.0";
152766
+ const SDK_VERSION = "0.127.0";
152977
152767
  //#endregion
152978
152768
  //#region src/client/error.ts
152979
152769
  /**
@@ -159930,6 +159720,211 @@ const envStatusCommand = new Command("status").description("Show which environme
159930
159720
  }));
159931
159721
  const envCommand = new Command("env").description("Environment configuration and status").addCommand(envStatusCommand);
159932
159722
  //#endregion
159723
+ //#region ../api/src/sdk-event-schedule.ts
159724
+ const timeRegex = /^([01]\d|2[0-3]):([0-5]\d)(:([0-5]\d))?$/;
159725
+ const explicitOffsetDateTimeRegex = /^(\d{4})-(\d{2})-(\d{2})T([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d))?(\.\d{1,3})?(Z|[+-]([01]\d|2[0-3]):[0-5]\d)$/;
159726
+ const localDateTimeRegex = /^(\d{4})-(\d{2})-(\d{2})T([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d))?(\.\d{1,3})?$/;
159727
+ function issue(path, message) {
159728
+ return {
159729
+ path,
159730
+ message
159731
+ };
159732
+ }
159733
+ function isValidDateParts(year, month, day) {
159734
+ const date = new Date(Date.UTC(year, month - 1, day));
159735
+ return date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day;
159736
+ }
159737
+ function isZeroFraction(fraction) {
159738
+ return fraction === void 0 || /^\.0+$/.test(fraction);
159739
+ }
159740
+ function datePart(year, month, day) {
159741
+ return `${year}-${month}-${day}`;
159742
+ }
159743
+ function timePart(hours, minutes, seconds = "00") {
159744
+ return `${hours}:${minutes}:${seconds}`;
159745
+ }
159746
+ function parseSdkEventDateTime(value) {
159747
+ const explicitMatch = explicitOffsetDateTimeRegex.exec(value);
159748
+ if (explicitMatch) {
159749
+ const [, yearRaw, monthRaw, dayRaw, hours, minutes, seconds = "00", fraction] = explicitMatch;
159750
+ if (!yearRaw || !monthRaw || !dayRaw || !hours || !minutes) return null;
159751
+ if (!isValidDateParts(Number(yearRaw), Number(monthRaw), Number(dayRaw)) || !isZeroFraction(fraction)) return null;
159752
+ const epochMs = Date.parse(value);
159753
+ if (!Number.isFinite(epochMs)) return null;
159754
+ return {
159755
+ epochMs,
159756
+ date: datePart(yearRaw, monthRaw, dayRaw),
159757
+ time: timePart(hours, minutes, seconds),
159758
+ iso: new Date(epochMs).toISOString()
159759
+ };
159760
+ }
159761
+ const localMatch = localDateTimeRegex.exec(value);
159762
+ if (!localMatch) return null;
159763
+ const [, yearRaw, monthRaw, dayRaw, hours, minutes, seconds = "00", fraction] = localMatch;
159764
+ if (!yearRaw || !monthRaw || !dayRaw || !hours || !minutes) return null;
159765
+ const year = Number(yearRaw);
159766
+ const month = Number(monthRaw);
159767
+ const day = Number(dayRaw);
159768
+ if (!isValidDateParts(year, month, day) || !isZeroFraction(fraction)) return null;
159769
+ const epochMs = Date.UTC(year, month - 1, day, Number(hours), Number(minutes), Number(seconds));
159770
+ return {
159771
+ epochMs,
159772
+ date: datePart(yearRaw, monthRaw, dayRaw),
159773
+ time: timePart(hours, minutes, seconds),
159774
+ iso: new Date(epochMs).toISOString()
159775
+ };
159776
+ }
159777
+ function durationMinutesBetween(startsAt, endsAt) {
159778
+ if (endsAt.epochMs <= startsAt.epochMs) return null;
159779
+ const durationMs = endsAt.epochMs - startsAt.epochMs;
159780
+ if (durationMs % 6e4 !== 0) return null;
159781
+ return durationMs / 6e4;
159782
+ }
159783
+ function exceedsMaxDuration(durationMinutes, options) {
159784
+ return options.maxDurationMinutes !== void 0 && durationMinutes > options.maxDurationMinutes;
159785
+ }
159786
+ function maxDurationMessage(options) {
159787
+ return options.maxDurationDays === void 0 ? "Duration is above the allowed maximum" : `Duration must be ${options.maxDurationDays} days or less`;
159788
+ }
159789
+ function classifyCanonicalSchedule(input, options) {
159790
+ const issues = [];
159791
+ if (options.requireCanonicalFields && input.recurrenceRule === void 0) issues.push(issue(["recurrenceRule"], "recurrenceRule is required"));
159792
+ if (input.defaultStartTime !== void 0 && input.defaultStartTime !== null && !timeRegex.test(input.defaultStartTime)) issues.push(issue(["defaultStartTime"], "Invalid time format (HH:MM or HH:MM:SS)"));
159793
+ if (options.requireCanonicalFields && !input.defaultStartTime) issues.push(issue(["defaultStartTime"], "defaultStartTime is required"));
159794
+ if (options.requireCanonicalFields && input.durationMinutes === void 0) issues.push(issue(["durationMinutes"], "durationMinutes is required"));
159795
+ if (input.durationMinutes !== void 0 && input.durationMinutes !== null) {
159796
+ if (input.durationMinutes < 1) issues.push(issue(["durationMinutes"], "durationMinutes must be at least 1"));
159797
+ else if (exceedsMaxDuration(input.durationMinutes, options)) issues.push(issue(["durationMinutes"], maxDurationMessage(options)));
159798
+ }
159799
+ if (issues.length > 0) return {
159800
+ ok: false,
159801
+ issues
159802
+ };
159803
+ return {
159804
+ ok: true,
159805
+ kind: "canonical",
159806
+ canonical: {
159807
+ recurrenceRule: input.recurrenceRule ?? null,
159808
+ startDate: input.startDate,
159809
+ defaultStartTime: input.defaultStartTime ?? "09:00:00",
159810
+ durationMinutes: input.durationMinutes ?? 60
159811
+ }
159812
+ };
159813
+ }
159814
+ function classifySdkEventSchedule(input, options = {}) {
159815
+ const issues = [];
159816
+ const hasStartsAt = input.startsAt !== void 0 && input.startsAt !== null;
159817
+ const hasEndsAt = input.endsAt !== void 0 && input.endsAt !== null;
159818
+ const hasDateTimeDuration = hasStartsAt && input.durationMinutes !== void 0 && input.durationMinutes !== null;
159819
+ const hasCanonicalStart = input.startDate !== void 0 || input.defaultStartTime !== void 0;
159820
+ if (!hasStartsAt && !hasEndsAt) return classifyCanonicalSchedule(input, options);
159821
+ if (hasStartsAt && hasCanonicalStart) issues.push(issue(["startsAt"], "Use either startsAt or startDate/defaultStartTime, not both"));
159822
+ if (input.recurrenceRule) issues.push(issue(["recurrenceRule"], "startsAt schedules are only supported for one-off events"));
159823
+ if (!hasStartsAt) issues.push(issue(["startsAt"], "startsAt is required when endsAt is provided"));
159824
+ if (!hasEndsAt && !hasDateTimeDuration) issues.push(issue(["endsAt"], "Provide either endsAt or durationMinutes with startsAt"));
159825
+ if (hasEndsAt && hasDateTimeDuration) issues.push(issue(["endsAt"], "Use either endsAt or durationMinutes with startsAt, not both"));
159826
+ const startsAt = typeof input.startsAt === "string" ? parseSdkEventDateTime(input.startsAt) : null;
159827
+ const endsAt = typeof input.endsAt === "string" ? parseSdkEventDateTime(input.endsAt) : null;
159828
+ if (hasStartsAt && !startsAt) issues.push(issue(["startsAt"], "Invalid datetime format. Use ISO datetime format, e.g. 2026-06-01T10:00:00Z"));
159829
+ if (hasEndsAt && !endsAt) issues.push(issue(["endsAt"], "Invalid datetime format. Use ISO datetime format, e.g. 2026-06-07T10:00:00Z"));
159830
+ if (startsAt && endsAt) {
159831
+ const durationMinutes = durationMinutesBetween(startsAt, endsAt);
159832
+ if (durationMinutes === null) issues.push(issue(["endsAt"], "endsAt must be after startsAt and align to a whole minute"));
159833
+ else if (exceedsMaxDuration(durationMinutes, options)) issues.push(issue(["endsAt"], maxDurationMessage(options)));
159834
+ if (issues.length === 0 && durationMinutes !== null) return {
159835
+ ok: true,
159836
+ kind: "start-end",
159837
+ canonical: {
159838
+ recurrenceRule: null,
159839
+ startDate: startsAt.date,
159840
+ defaultStartTime: startsAt.time,
159841
+ durationMinutes
159842
+ },
159843
+ startsAtIso: startsAt.iso,
159844
+ endsAtIso: endsAt.iso
159845
+ };
159846
+ }
159847
+ if (startsAt && hasDateTimeDuration && input.durationMinutes !== void 0 && input.durationMinutes !== null) {
159848
+ if (input.durationMinutes < 1) issues.push(issue(["durationMinutes"], "durationMinutes must be at least 1"));
159849
+ else if (exceedsMaxDuration(input.durationMinutes, options)) issues.push(issue(["durationMinutes"], maxDurationMessage(options)));
159850
+ if (issues.length === 0) {
159851
+ const endsAtMs = startsAt.epochMs + input.durationMinutes * 6e4;
159852
+ return {
159853
+ ok: true,
159854
+ kind: "start-duration",
159855
+ canonical: {
159856
+ recurrenceRule: null,
159857
+ startDate: startsAt.date,
159858
+ defaultStartTime: startsAt.time,
159859
+ durationMinutes: input.durationMinutes
159860
+ },
159861
+ startsAtIso: startsAt.iso,
159862
+ endsAtIso: new Date(endsAtMs).toISOString()
159863
+ };
159864
+ }
159865
+ }
159866
+ return {
159867
+ ok: false,
159868
+ issues
159869
+ };
159870
+ }
159871
+ //#endregion
159872
+ //#region ../api/src/sdk-event-upsert.ts
159873
+ const sdkEventOccurrenceInputSchema = z$1.object({
159874
+ startsAt: z$1.string().datetime({ offset: true }),
159875
+ endsAt: z$1.string().datetime({ offset: true }),
159876
+ timeZone: z$1.string().min(1).refine((value) => {
159877
+ try {
159878
+ new Intl.DateTimeFormat("en", { timeZone: value });
159879
+ return true;
159880
+ } catch {
159881
+ return false;
159882
+ }
159883
+ }, "Invalid IANA timezone")
159884
+ }).refine(({ startsAt, endsAt }) => Date.parse(endsAt) > Date.parse(startsAt), {
159885
+ path: ["endsAt"],
159886
+ message: "endsAt must be after startsAt"
159887
+ });
159888
+ const sdkEventUpsertOptionalFieldSchemas = {
159889
+ path: z$1.string().startsWith("/", "path must start with /").nullable().optional(),
159890
+ status: z$1.enum([
159891
+ "draft",
159892
+ "active",
159893
+ "archived",
159894
+ "cancelled",
159895
+ "completed"
159896
+ ]).optional(),
159897
+ visibility: z$1.enum([
159898
+ "private",
159899
+ "public",
159900
+ "unlisted"
159901
+ ]).optional(),
159902
+ preset: z$1.enum([
159903
+ "event",
159904
+ "class",
159905
+ "course",
159906
+ "workshop",
159907
+ "retreat",
159908
+ "performance"
159909
+ ]).optional(),
159910
+ bookingScope: z$1.enum(["single_occurrence", "whole_series"]).optional(),
159911
+ occurrences: z$1.array(sdkEventOccurrenceInputSchema).min(1).optional(),
159912
+ capacity: z$1.number().int().positive().nullable().optional()
159913
+ };
159914
+ //#endregion
159915
+ //#region src/cli/commands/eventOccurrenceSchedule.ts
159916
+ function portableEventScheduleOutput(event) {
159917
+ return {
159918
+ schedule: event.schedule,
159919
+ preset: event.preset,
159920
+ bookingScope: event.bookingScope,
159921
+ occurrences: event.occurrences
159922
+ };
159923
+ }
159924
+ function canCancelEventStatus(status) {
159925
+ return status === "draft" || status === "active";
159926
+ }
159927
+ //#endregion
159933
159928
  //#region src/cli/commands/event.ts
159934
159929
  const eventScheduleInputSchema = z$1.object({
159935
159930
  recurrenceRule: z$1.string().nullable().optional(),
@@ -160000,21 +159995,8 @@ const eventUpsertInputSchema = z$1.object({
160000
159995
  identifier: z$1.string().min(1).optional(),
160001
159996
  title: z$1.string().min(1, "title is required"),
160002
159997
  slug: z$1.string().min(1).optional(),
160003
- path: z$1.string().startsWith("/", "path must start with /").nullable().optional(),
160004
- status: z$1.enum([
160005
- "draft",
160006
- "active",
160007
- "archived",
160008
- "cancelled",
160009
- "completed"
160010
- ]).optional(),
160011
- visibility: z$1.enum([
160012
- "private",
160013
- "public",
160014
- "unlisted"
160015
- ]).optional(),
160016
- schedule: eventScheduleInputSchema,
160017
- capacity: z$1.number().int().positive().nullable().optional(),
159998
+ ...sdkEventUpsertOptionalFieldSchemas,
159999
+ schedule: eventScheduleInputSchema.optional(),
160018
160000
  pricing: eventPricingInputSchema.optional(),
160019
160001
  paymentTerms: eventPaymentTermsInputSchema.optional(),
160020
160002
  venueRef: z$1.string().nullable().optional(),
@@ -160025,6 +160007,17 @@ const eventUpsertInputSchema = z$1.object({
160025
160007
  presentation: z$1.record(z$1.string(), z$1.unknown()).nullable().optional(),
160026
160008
  tags: z$1.array(z$1.string()).optional(),
160027
160009
  blocks: sdkEntrySlotBlocksInputSchema.optional()
160010
+ }).superRefine((input, ctx) => {
160011
+ if (input.occurrences && !input.bookingScope) ctx.addIssue({
160012
+ code: "custom",
160013
+ path: ["bookingScope"],
160014
+ message: "bookingScope is required when occurrences are provided"
160015
+ });
160016
+ if (new Set(input.occurrences?.map((occurrence) => occurrence.timeZone)).size > 1) ctx.addIssue({
160017
+ code: "custom",
160018
+ path: ["occurrences"],
160019
+ message: "all occurrences must use the same timeZone"
160020
+ });
160028
160021
  });
160029
160022
  const formatEventRow = (event) => [
160030
160023
  event.identifier,
@@ -160038,23 +160031,25 @@ function toEventUpsertInput(identifier, raw) {
160038
160031
  if (parsedIdentifier && parsedIdentifier !== identifier) throw new Error(`Identifier mismatch: argument "${identifier}" does not match payload identifier "${parsedIdentifier}".`);
160039
160032
  const parsedStatus = parsed.status;
160040
160033
  const status = parsedStatus === "completed" ? void 0 : parsedStatus;
160034
+ const firstOccurrence = parsed.occurrences?.[0];
160035
+ const schedule = parsed.schedule ?? (firstOccurrence ? scheduleFromExplicitEventOccurrence(firstOccurrence) : null);
160036
+ if (!schedule) throw new Error("schedule is required when no explicit occurrences are provided");
160041
160037
  return {
160042
160038
  ...parsed,
160043
160039
  identifier,
160044
160040
  slug: parsed.slug ?? identifier,
160045
- status
160041
+ status,
160042
+ schedule
160046
160043
  };
160047
160044
  }
160048
160045
  function buildCancelledEventUpsertInput(current) {
160049
- const { id: _id, createdAt: _createdAt, updatedAt: _updatedAt, contentUpdatedAt: _contentUpdatedAt, ...rest } = current;
160046
+ const { id: _id, createdAt: _createdAt, updatedAt: _updatedAt, contentUpdatedAt: _contentUpdatedAt, occurrences, ...rest } = current;
160050
160047
  return {
160051
160048
  ...rest,
160049
+ ...occurrences.length > 0 ? { occurrences } : {},
160052
160050
  status: "cancelled"
160053
160051
  };
160054
160052
  }
160055
- function canCancelEventStatus(status) {
160056
- return status === "draft" || status === "active";
160057
- }
160058
160053
  const upsertCommand = new Command("upsert").description("Create or update an event series").argument("<identifier>", "Event identifier").option("--data <json>", "Event payload as JSON string").option("--file <path>", "Path to JSON file with event payload").action(withErrorHandling(async (identifier, options, command) => {
160059
160054
  const { output, client } = createCommandContext(command);
160060
160055
  const raw = await parseJsonData(options);
@@ -160079,7 +160074,7 @@ const getCommand = createGetCommand({
160079
160074
  slug: event.slug,
160080
160075
  status: event.status,
160081
160076
  visibility: event.visibility,
160082
- schedule: event.schedule,
160077
+ ...portableEventScheduleOutput(event),
160083
160078
  capacity: event.capacity,
160084
160079
  pricing: event.pricing,
160085
160080
  paymentTerms: event.paymentTerms,
@@ -160526,17 +160521,10 @@ async function readLegacyEventEntries(contentDir) {
160526
160521
  return entries;
160527
160522
  }
160528
160523
  async function readCanonicalEventsWithPaths(contentDir) {
160529
- const files = await listFiles(path.join(contentDir, "events"), ".json");
160530
- files.sort();
160531
- const events = [];
160532
- for (const filePath of files) {
160533
- const event = await readJsonFile(filePath);
160534
- events.push({
160535
- event,
160536
- filePath
160537
- });
160538
- }
160539
- return events;
160524
+ return (await readEventsWithFilePaths(contentDir)).map(({ filePath, ...event }) => ({
160525
+ event,
160526
+ filePath
160527
+ }));
160540
160528
  }
160541
160529
  function findCandidateEvents(legacy, eventsByIdentifier, eventsBySlug) {
160542
160530
  const byIdentifier = eventsByIdentifier.get(legacy.entry.identifier);
@@ -161099,15 +161087,19 @@ function buildStyleSelectionApplyInputFromOptions(options) {
161099
161087
  headerLayoutId: siteStyle?.defaultHeaderSelection.layoutId ?? guaranteedFallbackHeaderLayoutId,
161100
161088
  headerStyleId: siteStyle?.defaultHeaderSelection.styleId ?? guaranteedFallbackHeaderStyleId,
161101
161089
  footerLookId: null
161102
- }, parsePaletteCommand(options.paletteCommand), baseSelectionVersion, options.selectionId ?? null);
161090
+ }, parsePalette(options.palette), baseSelectionVersion, options.selectionId ?? null);
161103
161091
  }
161104
161092
  /** Builds the complete first-theme command without reading current selection state. */
161105
161093
  function buildStyleSelectionInitializeCommandFromOptions(options) {
161106
161094
  const siteStyle = getCuratedSiteStyle(asSiteStyleId(options.siteStyleId));
161107
161095
  if (!siteStyle) throw new Error(`Unknown curated site style: ${options.siteStyleId}`);
161108
- return buildApplySiteStyleSelectionCommand(buildStyleSelectionInputFromOptions(options, styleSelectionInitializationDefaults(siteStyle), parseInitializationPaletteCommand(options.paletteCommand, siteStyle), 0, null));
161096
+ return buildApplySiteStyleSelectionCommand(buildStyleSelectionInputFromOptions(options, styleSelectionInitializationDefaults(siteStyle), parseInitializationPalette(options.palette, siteStyle), 0, null));
161109
161097
  }
161110
- function buildStyleSelectionInputFromOptions(options, defaults, paletteCommand, baseSelectionVersion, selectionId) {
161098
+ function buildStyleSelectionInputFromOptions(options, defaults, palette, baseSelectionVersion, selectionId) {
161099
+ const paletteChange = palette ? [{
161100
+ kind: "set-palette",
161101
+ palette
161102
+ }] : [];
161111
161103
  return {
161112
161104
  siteStyleRef: options.siteStyleId,
161113
161105
  changes: [
@@ -161119,10 +161111,7 @@ function buildStyleSelectionInputFromOptions(options, defaults, paletteCommand,
161119
161111
  kind: "set-button-style",
161120
161112
  buttonStyleSelection: parseButtonStyleSelection(options, defaults)
161121
161113
  },
161122
- {
161123
- kind: "set-palette",
161124
- command: paletteCommand
161125
- },
161114
+ ...paletteChange,
161126
161115
  {
161127
161116
  kind: "set-typography",
161128
161117
  typography: parseTypography(options.typography, defaults.typography)
@@ -161185,24 +161174,17 @@ function parseTypography(value, fallback) {
161185
161174
  }
161186
161175
  return typographySchema.parse(parsed);
161187
161176
  }
161188
- function parsePaletteCommand(value) {
161189
- if (value === void 0 || value.trim() === "") return paletteCommandSchema.parse({ kind: "preserve" });
161190
- return paletteCommandSchema.parse(JSON.parse(value));
161177
+ function parsePalette(value) {
161178
+ if (value === void 0 || value.trim() === "") return null;
161179
+ return paletteSchema.parse(JSON.parse(value));
161191
161180
  }
161192
- function parseInitializationPaletteCommand(value, siteStyle) {
161181
+ function parseInitializationPalette(value, siteStyle) {
161193
161182
  if (value === void 0 || value.trim() === "") {
161194
161183
  const palette = findCuratedPalette(defaultPaletteForSiteStyle(siteStyle));
161195
161184
  if (!palette) throw new Error(`Missing default palette for curated site style: ${siteStyle.id}`);
161196
- return {
161197
- kind: "create-site",
161198
- colors: palette.colors,
161199
- mode: palette.mode,
161200
- origin: { kind: "manual" }
161201
- };
161185
+ return concretePaletteToTheme(palette);
161202
161186
  }
161203
- const command = parsePaletteCommand(value);
161204
- if (command.kind !== "create-site" || command.origin.kind !== "manual") throw new Error("--palette-command for style init must be a complete manual create-site command");
161205
- return command;
161187
+ return paletteSchema.parse(JSON.parse(value));
161206
161188
  }
161207
161189
  function buildStyleCatalogListRows(styles = curatedSiteStyles, options = {}) {
161208
161190
  return (options.siteStyleId ? styles.filter((style) => String(style.id) === options.siteStyleId) : styles).map((style) => ({
@@ -161300,7 +161282,7 @@ const listCommand = new Command("list").description("List curated site styles an
161300
161282
  "Footer Looks"
161301
161283
  ], rows.map(formatStyleCatalogListRow));
161302
161284
  }));
161303
- const applyCommand = new Command("apply").description("Apply a curated site-style selection").requiredOption("--site-style-id <id>", "Site style ID, e.g. site-style:calm-studio").requiredOption("--base-selection-version <version>", "Current style selection version").option("--selection-id <id>", "Current style selection row ID").option("--button-style-id <id>", "Button style ID").option("--button-style-parameters <json>", "Button style parameter object as JSON").option("--palette-command <json>", "Palette command JSON").option("--typography <json>", "Complete typography JSON (defaults to the site style typography)").option("--header-look-id <id>", "Legacy header look bridge ID").option("--header-layout-id <id>", "Header layout ID").option("--header-style-id <id>", "Header style ID").option("--footer-look-id <id>", "Footer look ID").action(withErrorHandling(async (options, command) => {
161285
+ const applyCommand = new Command("apply").description("Apply a curated site-style selection").requiredOption("--site-style-id <id>", "Site style ID, e.g. site-style:calm-studio").requiredOption("--base-selection-version <version>", "Current style selection version").option("--selection-id <id>", "Current style selection row ID").option("--button-style-id <id>", "Button style ID").option("--button-style-parameters <json>", "Button style parameter object as JSON").option("--palette <json>", "Complete theme palette JSON").option("--typography <json>", "Complete typography JSON (defaults to the site style typography)").option("--header-look-id <id>", "Legacy header look bridge ID").option("--header-layout-id <id>", "Header layout ID").option("--header-style-id <id>", "Header style ID").option("--footer-look-id <id>", "Footer look ID").action(withErrorHandling(async (options, command) => {
161304
161286
  const { output, client } = createCommandContext(command);
161305
161287
  const input = buildStyleSelectionApplyInputFromOptions(options);
161306
161288
  const commandIr = buildApplySiteStyleSelectionCommand(input);
@@ -161314,12 +161296,12 @@ const applyCommand = new Command("apply").description("Apply a curated site-styl
161314
161296
  savedAt: result.savedAt
161315
161297
  });
161316
161298
  }));
161317
- const initCommand = new Command("init").description("Initialize a fresh SDK site with a curated site style").requiredOption("--site-style-id <id>", "Site style ID, e.g. site-style:calm-studio").option("--button-style-id <id>", "Button style ID").option("--button-style-parameters <json>", "Button style parameter object as JSON").option("--palette-command <json>", "Complete manual create-site palette command JSON").option("--typography <json>", "Complete typography JSON (defaults to the site style typography)").option("--header-look-id <id>", "Legacy header look bridge ID").option("--header-layout-id <id>", "Header layout ID").option("--header-style-id <id>", "Header style ID").option("--footer-look-id <id>", "Footer look ID").action(withErrorHandling(executeStyleInit));
161299
+ const initCommand = new Command("init").description("Initialize a fresh SDK site with a curated site style").requiredOption("--site-style-id <id>", "Site style ID, e.g. site-style:calm-studio").option("--button-style-id <id>", "Button style ID").option("--button-style-parameters <json>", "Button style parameter object as JSON").option("--palette <json>", "Complete theme palette JSON").option("--typography <json>", "Complete typography JSON (defaults to the site style typography)").option("--header-look-id <id>", "Legacy header look bridge ID").option("--header-layout-id <id>", "Header layout ID").option("--header-style-id <id>", "Header style ID").option("--footer-look-id <id>", "Footer look ID").action(withErrorHandling(executeStyleInit));
161318
161300
  const styleCommand = new Command("style").description("Manage curated site styles").addHelpText("after", `
161319
161301
  Examples:
161320
161302
  $ riverbankcms style init --site-style-id site-style:calm-studio
161321
161303
  $ riverbankcms style apply --site-style-id site-style:calm-studio --base-selection-version 3
161322
- $ riverbankcms style apply --site-style-id site-style:calm-studio --base-selection-version 3 --palette-command '{"kind":"select","selection":{"kind":"curated","valueKey":"<palette-value-key>"}}'
161304
+ $ riverbankcms style apply --site-style-id site-style:calm-studio --base-selection-version 3 --palette '{"colors":[...],"meta":{"mode":"light"}}'
161323
161305
  `).addCommand(listCommand).addCommand(initCommand).addCommand(applyCommand);
161324
161306
  //#endregion
161325
161307
  //#region src/cli/commands/webhooks.ts
@@ -161387,7 +161369,7 @@ function envPatchLabel(tag) {
161387
161369
  case "append-key": return "added RIVERBANK_WEBHOOK_SECRET to .env.local";
161388
161370
  case "replace-key": return "updated RIVERBANK_WEBHOOK_SECRET in .env.local";
161389
161371
  case "unchanged": return "left .env.local unchanged";
161390
- default: return assertNever$25(tag);
161372
+ default: return assertNever$24(tag);
161391
161373
  }
161392
161374
  }
161393
161375
  function planHumanResultOutput(input) {
@@ -162062,7 +162044,7 @@ function formatAuthority(authority) {
162062
162044
  case "dashboard_admin": return "dashboard admin";
162063
162045
  case "cms_repo_script": return "CMS repo script";
162064
162046
  case "sdk_management_key": return "SDK management key";
162065
- default: return assertNever$25(authority);
162047
+ default: return assertNever$24(authority);
162066
162048
  }
162067
162049
  }
162068
162050
  function formatOperation(operation) {
@@ -162083,7 +162065,7 @@ function formatStep(step, index) {
162083
162065
  lines.push(" Commands:");
162084
162066
  step.commands.forEach((command) => lines.push(` ${command}`));
162085
162067
  return lines;
162086
- default: return assertNever$25(step);
162068
+ default: return assertNever$24(step);
162087
162069
  }
162088
162070
  }
162089
162071
  function formatSdkSetupPlan(plan) {