@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
@@ -159,7 +159,7 @@ function defineOwnDataProperty(target, key, value) {
159
159
  }
160
160
  //#endregion
161
161
  //#region src/data/dataLoaderContext.ts
162
- function assertNever$26(value) {
162
+ function assertNever$25(value) {
163
163
  throw new Error(`Unhandled data loader render target: ${String(value)}`);
164
164
  }
165
165
  function getDataLoaderOwnerPageId(target) {
@@ -167,7 +167,7 @@ function getDataLoaderOwnerPageId(target) {
167
167
  case "page": return target.pageId;
168
168
  case "entry-template":
169
169
  case "page-surface-template": return target.templateId;
170
- default: return assertNever$26(target);
170
+ default: return assertNever$25(target);
171
171
  }
172
172
  }
173
173
  function normalizeDataLoaderSearchParams(input) {
@@ -6764,13 +6764,6 @@ const API_ENDPOINTS$1 = {
6764
6764
  auth: "user",
6765
6765
  responseKind: "json"
6766
6766
  },
6767
- listSiteThemePalettes: {
6768
- path: "/sites/{siteId}/theme/palettes",
6769
- method: "GET",
6770
- auth: "user",
6771
- errors: [],
6772
- responseKind: "json"
6773
- },
6774
6767
  createSiteFontUploadUrl: {
6775
6768
  path: "/sites/{siteId}/fonts/upload-url",
6776
6769
  method: "POST",
@@ -8011,7 +8004,7 @@ const parseEventOfferingId = (value) => parseUuidBrand$1(value, unsafeAsEventOff
8011
8004
  const parseEventSeriesId = (value) => parseUuidBrand$1(value, unsafeAsEventSeriesId);
8012
8005
  //#endregion
8013
8006
  //#region ../core/src/assert-never.ts
8014
- function assertNever$25(value, message = "Unexpected variant") {
8007
+ function assertNever$24(value, message = "Unexpected variant") {
8015
8008
  throw new Error(`${message}: ${String(value)}`);
8016
8009
  }
8017
8010
  const CURRENCY_LOCALE_BY_CODE = {
@@ -8102,7 +8095,7 @@ function formatCoursePriceDisplayLabel(display, options) {
8102
8095
  case "exact": return `Course (${formatCurrencyAmount(display.amount, display.currency, options)})`;
8103
8096
  case "from": return `Course (From ${formatCurrencyAmount(display.amount, display.currency, options)})`;
8104
8097
  case "range": return `Course (${formatCurrencyAmount(display.minAmount, display.currency, options)} - ${formatCurrencyAmount(display.maxAmount, display.currency, options)})`;
8105
- default: return assertNever$25(display);
8098
+ default: return assertNever$24(display);
8106
8099
  }
8107
8100
  }
8108
8101
  /**
@@ -8122,7 +8115,7 @@ function formatBookingPriceDisplay(display, options = {}) {
8122
8115
  case "unavailable": return "Pricing unavailable";
8123
8116
  case "external": return display.label;
8124
8117
  case "course": return formatCoursePriceDisplayLabel(display.display, options);
8125
- default: return assertNever$25(display);
8118
+ default: return assertNever$24(display);
8126
8119
  }
8127
8120
  }
8128
8121
  /** Render an event's price directly from its pricing value. */
@@ -8625,7 +8618,7 @@ function navigationAuthoringLinkToCommandLink(link) {
8625
8618
  badge: link.badge,
8626
8619
  label: link.label
8627
8620
  };
8628
- default: return assertNever$25(link);
8621
+ default: return assertNever$24(link);
8629
8622
  }
8630
8623
  }
8631
8624
  function portalLabelsForCommand(labels) {
@@ -8668,7 +8661,7 @@ function navigationReadLinkToLocalLink(item) {
8668
8661
  badge: link.badge,
8669
8662
  label: link.label
8670
8663
  };
8671
- default: return assertNever$25(link);
8664
+ default: return assertNever$24(link);
8672
8665
  }
8673
8666
  }
8674
8667
  function internalNavigationLinkToLocalLink(item) {
@@ -11781,6 +11774,99 @@ function createRichTextDoc(paragraphs) {
11781
11774
  } : { type: "paragraph" })
11782
11775
  };
11783
11776
  }
11777
+ const PUBLIC_DOWNLOAD_MEDIA_TYPES = [
11778
+ "document",
11779
+ "spreadsheet",
11780
+ "archive",
11781
+ "audio"
11782
+ ];
11783
+ const hotspotSchema$1 = z.object({
11784
+ x: z.number().min(0).max(1),
11785
+ y: z.number().min(0).max(1),
11786
+ radius: z.number().optional()
11787
+ });
11788
+ const rotationSchema$1 = z.union([
11789
+ z.literal(0),
11790
+ z.literal(90),
11791
+ z.literal(180),
11792
+ z.literal(270)
11793
+ ]);
11794
+ const rectSchema$1 = z.tuple([
11795
+ z.number(),
11796
+ z.number(),
11797
+ z.number(),
11798
+ z.number()
11799
+ ]);
11800
+ const aspectCropSchema$1 = z.object({
11801
+ aspect: z.preprocess((value) => value == null ? void 0 : value, z.string().optional()),
11802
+ rect: z.preprocess((value) => value == null ? void 0 : value, rectSchema$1.optional()),
11803
+ hotspot: z.preprocess((value) => value == null ? void 0 : value, hotspotSchema$1.optional()),
11804
+ rotation: z.preprocess((value) => value == null ? void 0 : value, rotationSchema$1.optional())
11805
+ });
11806
+ const transformSchema$1 = z.object({
11807
+ aspectCrops: z.preprocess((value) => {
11808
+ if (!value || typeof value !== "object" || Array.isArray(value)) return;
11809
+ return value;
11810
+ }, z.record(z.string(), aspectCropSchema$1.catch({}))).optional(),
11811
+ rect: rectSchema$1.optional(),
11812
+ hotspot: hotspotSchema$1.optional(),
11813
+ rotation: rotationSchema$1.optional()
11814
+ });
11815
+ const mediaPosterSchema = z.discriminatedUnion("tag", [z.object({
11816
+ tag: z.literal("storage"),
11817
+ assetId: z.string().optional(),
11818
+ storageBucket: z.string().min(1),
11819
+ storagePath: z.string().min(1)
11820
+ }), z.object({
11821
+ tag: z.literal("external-src"),
11822
+ assetId: z.string().optional(),
11823
+ src: z.string().url()
11824
+ })]);
11825
+ const mediaBaseSchema = z.object({
11826
+ purpose: z.string().optional(),
11827
+ placeholder: z.boolean().default(true).optional(),
11828
+ assetId: z.string().optional(),
11829
+ identifier: z.string().optional(),
11830
+ src: z.string().optional(),
11831
+ alt: z.string().optional(),
11832
+ filename: z.string().optional(),
11833
+ mimeType: z.string().optional(),
11834
+ width: z.number().optional(),
11835
+ height: z.number().optional(),
11836
+ storageBucket: z.string().optional(),
11837
+ storagePath: z.string().optional(),
11838
+ poster: mediaPosterSchema.optional(),
11839
+ transform: transformSchema$1.optional()
11840
+ });
11841
+ /**
11842
+ * Canonical identifier carried by media values that are safe to persist.
11843
+ * Parsing trims boundary input so downstream writers cannot retain whitespace-only
11844
+ * identifiers or independently disagree about normalization.
11845
+ */
11846
+ const mediaIdentifierSchema = z.string().trim().min(1).brand();
11847
+ const imageMediaSchema = mediaBaseSchema.extend({ type: z.literal("image") });
11848
+ const videoMediaSchema = mediaBaseSchema.extend({ type: z.literal("video") });
11849
+ const audioMediaSchema = mediaBaseSchema.extend({ type: z.literal("audio") });
11850
+ const documentMediaSchema = mediaBaseSchema.extend({ type: z.literal("document") });
11851
+ const spreadsheetMediaSchema = mediaBaseSchema.extend({ type: z.literal("spreadsheet") });
11852
+ const archiveMediaSchema = mediaBaseSchema.extend({ type: z.literal("archive") });
11853
+ const mediaSchema$1 = z.discriminatedUnion("type", [
11854
+ imageMediaSchema,
11855
+ videoMediaSchema,
11856
+ audioMediaSchema,
11857
+ documentMediaSchema,
11858
+ spreadsheetMediaSchema,
11859
+ archiveMediaSchema
11860
+ ]);
11861
+ const persistableMediaBaseSchema = mediaBaseSchema.extend({ identifier: mediaIdentifierSchema });
11862
+ z.discriminatedUnion("type", [
11863
+ persistableMediaBaseSchema.extend({ type: z.literal("image") }),
11864
+ persistableMediaBaseSchema.extend({ type: z.literal("video") }),
11865
+ persistableMediaBaseSchema.extend({ type: z.literal("audio") }),
11866
+ persistableMediaBaseSchema.extend({ type: z.literal("document") }),
11867
+ persistableMediaBaseSchema.extend({ type: z.literal("spreadsheet") }),
11868
+ persistableMediaBaseSchema.extend({ type: z.literal("archive") })
11869
+ ]);
11784
11870
  //#endregion
11785
11871
  //#region ../blocks/src/system/manifest/fieldValidation/index.ts
11786
11872
  const TEL_RE = /^[+()0-9\s-]{3,}$/;
@@ -11789,7 +11875,7 @@ const ALLOWED_URL_PROTOCOLS = ["http:", "https:"];
11789
11875
  const DATE_PATTERN = /^(?<year>[1-9]\d{3})-(?<month>\d{2})-(?<day>\d{2})$/;
11790
11876
  const TIME_PATTERN = /^(?<hours>[01]\d|2[0-3]):(?<minutes>[0-5]\d)$/;
11791
11877
  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)$/;
11792
- function assertNever$17(value) {
11878
+ function assertNever$16(value) {
11793
11879
  throw new Error(`Unhandled field validation variant: ${JSON.stringify(value)}`);
11794
11880
  }
11795
11881
  function validationContext(options = {}) {
@@ -11842,7 +11928,7 @@ function fieldIssueToMessage(issue) {
11842
11928
  case "invalidMedia": return `${issue.label} must be a media object with an identifier`;
11843
11929
  case "invalidLink": return `${issue.label} must be a valid link`;
11844
11930
  case "invalidReference": return `${issue.label} must reference a valid item`;
11845
- default: return assertNever$17(issue);
11931
+ default: return assertNever$16(issue);
11846
11932
  }
11847
11933
  }
11848
11934
  function pluralize(label, count) {
@@ -11962,7 +12048,7 @@ function deriveFieldValidationPlan(field, path = [field.id]) {
11962
12048
  case "presetOrCustom":
11963
12049
  case "contentTypeSelect":
11964
12050
  case "entryPicker": return makePlan("passthrough", "unknown", field, path, false, []);
11965
- default: return assertNever$17(field);
12051
+ default: return assertNever$16(field);
11966
12052
  }
11967
12053
  }
11968
12054
  function deriveFieldValidationPlans(fields, parentPath = []) {
@@ -12037,7 +12123,7 @@ function resolveSelectConstraintSource(field) {
12037
12123
  kind: "runtime",
12038
12124
  source: source.kind
12039
12125
  };
12040
- default: return assertNever$17(source);
12126
+ default: return assertNever$16(source);
12041
12127
  }
12042
12128
  }
12043
12129
  function normalizeStoredContentValues(plans, content, options = {}) {
@@ -12056,7 +12142,7 @@ function allGroupChildPlans(plan) {
12056
12142
  switch (plan.childSelection.kind) {
12057
12143
  case "all": return plan.childSelection.fields;
12058
12144
  case "discriminatedTabs": return plan.childSelection.tabs.flatMap((tab) => tab.fields);
12059
- default: return assertNever$17(plan.childSelection);
12145
+ default: return assertNever$16(plan.childSelection);
12060
12146
  }
12061
12147
  }
12062
12148
  function selectedGroupChildPlans(plan, value) {
@@ -12070,7 +12156,7 @@ function canonicalizeFieldValueForWrite(plan, value) {
12070
12156
  case "media": {
12071
12157
  if (!isPlainObject$5(value)) return value;
12072
12158
  const canonical = { ...value };
12073
- if (typeof canonical.identifier === "string" && canonical.identifier.trim().length > 0) deleteEnvSpecificKeys(canonical);
12159
+ if (mediaIdentifierSchema.safeParse(canonical.identifier).success) deleteEnvSpecificKeys(canonical);
12074
12160
  return canonical;
12075
12161
  }
12076
12162
  case "group": return canonicalizeObjectForWrite(selectedGroupChildPlans(plan, value), value);
@@ -12089,7 +12175,7 @@ function canonicalizeFieldValueForWrite(plan, value) {
12089
12175
  case "link":
12090
12176
  case "select":
12091
12177
  case "passthrough": return value;
12092
- default: return assertNever$17(plan);
12178
+ default: return assertNever$16(plan);
12093
12179
  }
12094
12180
  }
12095
12181
  function canonicalizeObjectForWrite(plans, value) {
@@ -12115,7 +12201,7 @@ function normalizeStoredFieldValueWithContext(plan, value, ctx) {
12115
12201
  case "link":
12116
12202
  case "select":
12117
12203
  case "passthrough": return normalizeFieldValue(plan, value, ctx);
12118
- default: return assertNever$17(plan);
12204
+ default: return assertNever$16(plan);
12119
12205
  }
12120
12206
  }
12121
12207
  function normalizeStoredObjectChildren(children, value, ctx) {
@@ -12152,7 +12238,7 @@ function normalizeFieldValue(plan, value, ctx) {
12152
12238
  case "select":
12153
12239
  case "passthrough": return value;
12154
12240
  case "media": return value;
12155
- default: return assertNever$17(plan);
12241
+ default: return assertNever$16(plan);
12156
12242
  }
12157
12243
  }
12158
12244
  function normalizeObjectChildren(children, value, ctx) {
@@ -12165,7 +12251,7 @@ function normalizeObjectChildren(children, value, ctx) {
12165
12251
  function normalizeInlineTextFallbacks(plans, values, ctx) {
12166
12252
  for (const plan of plans) {
12167
12253
  if (plan.kind !== "inlineText" || !plan.plainTextFallbackPath) continue;
12168
- if (!isMissingForPlan(plan, values[plan.fieldId])) continue;
12254
+ if (!isMissingForPlan(plan, values[plan.fieldId]) && !(ctx.allowIncomplete && !parseInlineTextFromUnknown(values[plan.fieldId]).ok)) continue;
12169
12255
  const fallback = getAtFieldPath(values, plan.plainTextFallbackPath);
12170
12256
  if (typeof fallback !== "string" || fallback.trim().length === 0) continue;
12171
12257
  values[plan.fieldId] = normalizeFieldValue(plan, plainTextToInlineText(fallback), ctx);
@@ -12206,12 +12292,12 @@ function validateNormalizedFieldValue(plan, value, ctx) {
12206
12292
  case "select": return validateSelectPlan(plan, value);
12207
12293
  case "richText": return isValidRichTextDoc(value) ? [] : [issue(plan, "invalidRichText")];
12208
12294
  case "inlineText": return validateInlineTextPlan(plan, value);
12209
- case "media": return isPlainObject$5(value) && typeof value.identifier === "string" && value.identifier.trim().length > 0 && (value.type === void 0 || typeof value.type === "string" && plan.allowedMediaTypes.includes(value.type)) ? [] : [issue(plan, "invalidMedia")];
12295
+ case "media": return isPlainObject$5(value) && mediaIdentifierSchema.safeParse(value.identifier).success && (value.type === void 0 || typeof value.type === "string" && plan.allowedMediaTypes.includes(value.type)) ? [] : [issue(plan, "invalidMedia")];
12210
12296
  case "link": return linkSchema.safeParse(value).success ? [] : [issue(plan, "invalidLink")];
12211
12297
  case "repeater": return validateRepeaterPlan(plan, value, ctx);
12212
12298
  case "group": return validateGroupPlan(plan, value, ctx);
12213
12299
  case "passthrough": return [];
12214
- default: return assertNever$17(plan);
12300
+ default: return assertNever$16(plan);
12215
12301
  }
12216
12302
  }
12217
12303
  function shouldRequireValue(plan, value, ctx) {
@@ -12253,7 +12339,7 @@ function validateStringConstraint(plan, constraint, value) {
12253
12339
  case "timeFormat": return typeof value === "string" && isValidTimeString(value) ? [] : [issue(plan, "invalidTime")];
12254
12340
  case "datetimeFormat": return typeof value === "string" && isValidDateTimeInstantString(value) ? [] : [issue(plan, "invalidDateTime")];
12255
12341
  case "slugFormat": return typeof value === "string" && SLUG_PATTERN.test(value) ? [] : [issue(plan, "invalidSlug")];
12256
- default: return assertNever$17(constraint);
12342
+ default: return assertNever$16(constraint);
12257
12343
  }
12258
12344
  }
12259
12345
  function isValidIconPickerValue(value) {
@@ -12272,7 +12358,7 @@ function validateNumberConstraint(plan, constraint, value) {
12272
12358
  case "numberType": return [];
12273
12359
  case "numberMin": return value < constraint.minimum ? [issue(plan, "tooSmall", { minimum: constraint.minimum })] : [];
12274
12360
  case "numberMax": return value > constraint.maximum ? [issue(plan, "tooLarge", { maximum: constraint.maximum })] : [];
12275
- default: return assertNever$17(constraint);
12361
+ default: return assertNever$16(constraint);
12276
12362
  }
12277
12363
  }
12278
12364
  function validateSelectPlan(plan, value) {
@@ -12294,7 +12380,7 @@ function validateRepeaterPlan(plan, value, ctx) {
12294
12380
  maximum: constraint.maximum,
12295
12381
  itemLabel: "item"
12296
12382
  })] : [];
12297
- default: return assertNever$17(constraint);
12383
+ default: return assertNever$16(constraint);
12298
12384
  }
12299
12385
  }), ...value.flatMap((item, index) => validateRepeaterItem(plan, item, index, ctx))];
12300
12386
  }
@@ -12385,7 +12471,7 @@ function rebaseFieldPlanPath(plan, fromPrefix, toPrefix) {
12385
12471
  ...plan,
12386
12472
  path
12387
12473
  };
12388
- default: return assertNever$17(plan);
12474
+ default: return assertNever$16(plan);
12389
12475
  }
12390
12476
  }
12391
12477
  function validateInlineTextPlan(plan, value) {
@@ -12432,7 +12518,7 @@ function fieldPlanToObjectPropertyZod(plan, options = {}) {
12432
12518
  switch (presence.kind) {
12433
12519
  case "required": return schema;
12434
12520
  case "optional": return schema.optional();
12435
- default: return assertNever$17(presence);
12521
+ default: return assertNever$16(presence);
12436
12522
  }
12437
12523
  }
12438
12524
  function addFieldIssueToZodContext(zodCtx, validationIssue, rootPath) {
@@ -12502,7 +12588,7 @@ function addFieldIssueToZodContext(zodCtx, validationIssue, rootPath) {
12502
12588
  message
12503
12589
  });
12504
12590
  return;
12505
- default: assertNever$17(validationIssue);
12591
+ default: assertNever$16(validationIssue);
12506
12592
  }
12507
12593
  }
12508
12594
  function relativeZodIssuePath(path, rootPath) {
@@ -12533,7 +12619,7 @@ function findNestedFieldValidationPlan(plan, path) {
12533
12619
  case "link":
12534
12620
  case "select":
12535
12621
  case "passthrough": return null;
12536
- default: return assertNever$17(plan);
12622
+ default: return assertNever$16(plan);
12537
12623
  }
12538
12624
  }
12539
12625
  function sameFieldPath(left, right) {
@@ -12557,7 +12643,7 @@ function validateExplicitNullForPushPlan(plan, value, ctx) {
12557
12643
  case "link":
12558
12644
  case "select":
12559
12645
  case "passthrough": return [];
12560
- default: return assertNever$17(plan);
12646
+ default: return assertNever$16(plan);
12561
12647
  }
12562
12648
  }
12563
12649
  function validateExplicitNullsForPushRepeater(plan, value, ctx) {
@@ -12925,6 +13011,17 @@ function asAccessibleSurfaceToken(token) {
12925
13011
  return token;
12926
13012
  }
12927
13013
  //#endregion
13014
+ //#region ../theme-core/src/site-styles/lookOptionGroups.ts
13015
+ function defineLookOptionGroup(group) {
13016
+ defaultOption(group);
13017
+ return group;
13018
+ }
13019
+ function defaultOption(group) {
13020
+ const option = group.options.find((candidate) => candidate.id === group.defaultOptionId);
13021
+ if (option) return option;
13022
+ throw new Error(`Look option group "${group.id}" defaults to missing option "${group.defaultOptionId}".`);
13023
+ }
13024
+ //#endregion
12928
13025
  //#region ../theme-core/src/site-styles/types.ts
12929
13026
  /**
12930
13027
  * Defines a literal-preserving catalog while rejecting top-level extra keys on
@@ -12977,7 +13074,7 @@ function asDesignSystemTemplateId(value) {
12977
13074
  function makeBoundaryId(previousBlockId, nextBlockId) {
12978
13075
  return asDesignBoundaryId(`boundary:${encodeURIComponent(previousBlockId)}:${encodeURIComponent(nextBlockId)}`);
12979
13076
  }
12980
- function assertNever$16(value, message = "Unhandled Theme V2 variant") {
13077
+ function assertNever$15(value, message = "Unhandled Theme V2 variant") {
12981
13078
  throw new Error(`${message}: ${String(value)}`);
12982
13079
  }
12983
13080
  function brandNonEmptyString(value, label) {
@@ -13070,767 +13167,655 @@ function defineBlockDesignCapability(capability) {
13070
13167
  //#region ../theme-core/src/site-styles/appearancePresetResolution.ts
13071
13168
  function assertValidOptionGroups(preset) {
13072
13169
  preset.optionGroups?.forEach((group) => {
13073
- 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}".`);
13170
+ defineLookOptionGroup(group);
13074
13171
  });
13075
13172
  }
13076
13173
  function defineBlockAppearancePreset(preset) {
13077
13174
  assertValidOptionGroups(preset);
13078
13175
  return preset;
13079
13176
  }
13080
- [...[
13081
- defineBlockAppearancePreset({
13082
- kind: "block-design",
13083
- id: "hero-immersive-image",
13084
- target: "hero",
13085
- label: "Immersive image hero",
13086
- blockKinds: ["block.hero"],
13087
- constraints: { layoutFamilies: ["centered", "compact"] },
13088
- layoutPatches: [{
13089
- constraints: { layoutVariantKeys: ["micro"] },
13090
- designPatch: {
13091
- sectionHeight: "banner",
13092
- heroTypographyScale: "display"
13093
- }
13094
- }],
13095
- design: {
13096
- sectionSurface: "hero-image",
13097
- contentFrame: plainFrame,
13098
- itemSurface: "none",
13099
- sectionHeight: "hero",
13100
- heroComposition: "center",
13101
- heroTypographyScale: "display",
13102
- imageSurfaceTreatment: { kind: "neutral-wash" }
13177
+ //#endregion
13178
+ //#region ../theme-core/src/site-styles/blockAppearancePresets.ts
13179
+ const brandScrimOptionGroups = [{
13180
+ id: "image-surface-treatment",
13181
+ label: "Treatment",
13182
+ defaultOptionId: "brand-scrim-primary",
13183
+ options: [{
13184
+ id: "brand-scrim-primary",
13185
+ label: "Brand scrim",
13186
+ designPatch: { imageSurfaceTreatment: {
13187
+ kind: "brand-scrim",
13188
+ token: "primary"
13189
+ } }
13190
+ }, {
13191
+ id: "neutral-scrim",
13192
+ label: "Neutral scrim",
13193
+ designPatch: { imageSurfaceTreatment: { kind: "neutral-scrim" } }
13194
+ }]
13195
+ }];
13196
+ const microBannerLayoutPatches = [{
13197
+ constraints: { layoutVariantKeys: ["micro"] },
13198
+ designPatch: { sectionHeight: "banner" }
13199
+ }];
13200
+ defineBlockAppearancePreset({
13201
+ id: "hero-immersive-image",
13202
+ target: "hero",
13203
+ label: "Immersive image hero",
13204
+ blockKinds: ["block.hero"],
13205
+ constraints: { layoutFamilies: ["centered", "compact"] },
13206
+ layoutPatches: [{
13207
+ constraints: { layoutVariantKeys: ["micro"] },
13208
+ designPatch: {
13209
+ sectionHeight: "banner",
13210
+ heroTypographyScale: "display"
13103
13211
  }
13104
- }),
13105
- defineBlockAppearancePreset({
13106
- kind: "block-design",
13107
- id: "hero-bottom-left-panel",
13108
- target: "hero",
13109
- label: "Bottom-left panel hero",
13110
- blockKinds: ["block.hero"],
13111
- constraints: { layoutFamilies: ["centered", "compact"] },
13112
- optionGroups: [{
13113
- id: "image-surface-treatment",
13114
- label: "Treatment",
13115
- selectedOptionId: "neutral-scrim",
13116
- options: [{
13117
- id: "neutral-scrim",
13118
- label: "Neutral scrim",
13119
- designPatch: { imageSurfaceTreatment: {
13120
- kind: "neutral-scrim",
13121
- intensity: "balanced"
13122
- } }
13123
- }, {
13124
- id: "brand-scrim-primary",
13125
- label: "Brand scrim",
13126
- designPatch: { imageSurfaceTreatment: {
13127
- kind: "brand-scrim",
13128
- token: "primary",
13129
- intensity: "balanced"
13130
- } }
13131
- }]
13132
- }],
13133
- layoutPatches: [{
13134
- constraints: { layoutVariantKeys: ["micro"] },
13135
- designPatch: {
13136
- sectionHeight: "banner",
13137
- heroTypographyScale: "editorial"
13138
- }
13139
- }],
13140
- design: {
13141
- sectionSurface: "hero-image",
13142
- contentFrame: panelFrame("raised"),
13143
- itemSurface: "none",
13144
- sectionHeight: "immersive",
13145
- heroComposition: "bottom-left",
13146
- heroTypographyScale: "display",
13147
- imageSurfaceTreatment: {
13212
+ }],
13213
+ design: {
13214
+ sectionSurface: "hero-image",
13215
+ contentFrame: plainFrame,
13216
+ itemSurface: "none",
13217
+ sectionHeight: "hero",
13218
+ heroComposition: "center",
13219
+ heroTypographyScale: "display",
13220
+ imageSurfaceTreatment: { kind: "neutral-wash" }
13221
+ }
13222
+ }), defineBlockAppearancePreset({
13223
+ id: "hero-bottom-left-panel",
13224
+ target: "hero",
13225
+ label: "Bottom-left panel hero",
13226
+ blockKinds: ["block.hero"],
13227
+ constraints: { layoutFamilies: ["centered", "compact"] },
13228
+ optionGroups: [{
13229
+ id: "image-surface-treatment",
13230
+ label: "Treatment",
13231
+ defaultOptionId: "neutral-scrim",
13232
+ options: [{
13233
+ id: "neutral-scrim",
13234
+ label: "Neutral scrim",
13235
+ designPatch: { imageSurfaceTreatment: {
13148
13236
  kind: "neutral-scrim",
13149
13237
  intensity: "balanced"
13150
- }
13151
- }
13152
- }),
13153
- defineBlockAppearancePreset({
13154
- kind: "block-design",
13155
- id: "hero-poster-image",
13156
- target: "hero",
13157
- label: "Poster image hero",
13158
- blockKinds: ["block.hero"],
13159
- constraints: { layoutFamilies: ["centered", "compact"] },
13160
- layoutPatches: [{
13161
- constraints: { layoutVariantKeys: ["micro"] },
13162
- designPatch: {
13163
- sectionHeight: "banner",
13164
- heroTypographyScale: "display"
13165
- }
13166
- }],
13167
- design: {
13168
- sectionSurface: "hero-image",
13169
- contentFrame: plainFrame,
13170
- itemSurface: "none",
13171
- sectionHeight: "immersive",
13172
- heroComposition: "center",
13173
- heroTypographyScale: "poster",
13174
- imageSurfaceTreatment: {
13238
+ } }
13239
+ }, {
13240
+ id: "brand-scrim-primary",
13241
+ label: "Brand scrim",
13242
+ designPatch: { imageSurfaceTreatment: {
13175
13243
  kind: "brand-scrim",
13176
13244
  token: "primary",
13177
- intensity: "strong"
13178
- }
13179
- }
13180
- }),
13181
- defineBlockAppearancePreset({
13182
- kind: "block-design",
13183
- id: "hero-brand-scrim",
13184
- target: "hero",
13185
- label: "Brand scrim image hero",
13186
- blockKinds: ["block.hero"],
13187
- constraints: { layoutFamilies: ["centered", "compact"] },
13188
- optionGroups: [{
13189
- id: "image-surface-treatment",
13190
- label: "Treatment",
13191
- selectedOptionId: "brand-scrim-primary",
13192
- options: [{
13193
- id: "brand-scrim-primary",
13194
- label: "Brand scrim",
13195
- designPatch: { imageSurfaceTreatment: {
13196
- kind: "brand-scrim",
13197
- token: "primary"
13198
- } }
13199
- }, {
13200
- id: "neutral-scrim",
13201
- label: "Neutral scrim",
13202
- designPatch: { imageSurfaceTreatment: { kind: "neutral-scrim" } }
13203
- }]
13204
- }],
13205
- layoutPatches: [{
13206
- constraints: { layoutVariantKeys: ["micro"] },
13207
- designPatch: { sectionHeight: "banner" }
13208
- }],
13209
- design: {
13210
- sectionSurface: "hero-image",
13211
- contentFrame: plainFrame,
13212
- itemSurface: "none",
13213
- sectionHeight: "immersive",
13214
- heroComposition: "center",
13215
- heroTypographyScale: "display",
13216
- imageSurfaceTreatment: {
13217
- kind: "brand-scrim",
13218
- token: "primary"
13219
- }
13220
- }
13221
- }),
13222
- defineBlockAppearancePreset({
13223
- kind: "block-design",
13224
- id: "hero-brand-scrim-fixed-frame",
13225
- target: "hero",
13226
- label: "Fixed-frame brand scrim hero",
13227
- blockKinds: ["block.hero"],
13228
- constraints: { layoutFamilies: ["centered", "compact"] },
13229
- optionGroups: [{
13230
- id: "image-surface-treatment",
13231
- label: "Treatment",
13232
- selectedOptionId: "brand-scrim-primary",
13233
- options: [{
13234
- id: "brand-scrim-primary",
13235
- label: "Brand scrim",
13236
- designPatch: { imageSurfaceTreatment: {
13237
- kind: "brand-scrim",
13238
- token: "primary"
13239
- } }
13240
- }, {
13241
- id: "neutral-scrim",
13242
- label: "Neutral scrim",
13243
- designPatch: { imageSurfaceTreatment: { kind: "neutral-scrim" } }
13244
- }]
13245
- }],
13246
- layoutPatches: [{
13247
- constraints: { layoutVariantKeys: ["micro"] },
13248
- designPatch: { sectionHeight: "banner" }
13249
- }],
13250
- design: {
13251
- sectionSurface: "hero-image",
13252
- contentFrame: plainFrame,
13253
- itemSurface: "none",
13254
- sectionHeight: "immersive",
13255
- heroComposition: "center",
13256
- heroTypographyScale: "display",
13257
- imageSurfaceTreatment: {
13258
- kind: "brand-scrim",
13259
- token: "primary"
13260
- },
13261
- imageSurfaceMotion: "fixed-frame",
13262
- eyebrowTreatment: "accent-pill-bounce"
13263
- }
13264
- }),
13265
- defineBlockAppearancePreset({
13266
- kind: "block-design",
13267
- id: "hero-brand-depth-expressive",
13268
- target: "hero",
13269
- label: "Expressive brand-depth hero",
13270
- blockKinds: ["block.hero"],
13271
- constraints: { layoutFamilies: ["centered", "compact"] },
13272
- design: {
13273
- sectionSurface: "brand-depth-band",
13274
- contentFrame: plainFrame,
13275
- itemSurface: "none",
13276
- heroComposition: "center",
13277
- heroTypographyScale: "editorial",
13278
- eyebrowTreatment: "accent-pill-bounce"
13279
- }
13280
- }),
13281
- defineBlockAppearancePreset({
13282
- kind: "block-design",
13283
- id: "hero-contained-intro",
13284
- target: "hero",
13285
- label: "Contained intro hero",
13286
- blockKinds: ["block.hero"],
13287
- design: {
13288
- sectionSurface: "muted-band",
13289
- contentFrame: panelFrame("inset"),
13290
- itemSurface: "none",
13291
- heroComposition: "center",
13292
- heroTypographyScale: "editorial"
13293
- }
13294
- }),
13295
- defineBlockAppearancePreset({
13296
- kind: "block-design",
13297
- id: "hero-split-editorial",
13298
- target: "hero",
13299
- label: "Editorial split hero",
13300
- blockKinds: ["block.hero"],
13301
- constraints: { layoutFamilies: ["split"] },
13302
- design: {
13303
- sectionSurface: "base",
13304
- contentFrame: plainFrame,
13305
- itemSurface: "none",
13306
- heroTypographyScale: "editorial"
13307
- }
13308
- }),
13309
- defineBlockAppearancePreset({
13310
- kind: "block-design",
13311
- id: "hero-split-brand",
13312
- target: "hero",
13313
- label: "Brand split hero",
13314
- blockKinds: ["block.hero"],
13315
- constraints: { layoutFamilies: ["split"] },
13316
- design: {
13317
- sectionSurface: "brand-depth-band",
13318
- contentFrame: plainFrame,
13319
- itemSurface: "none",
13320
- heroTypographyScale: "display",
13321
- eyebrowTreatment: "accent-pill-bounce"
13322
- }
13323
- }),
13324
- defineBlockAppearancePreset({
13325
- kind: "block-design",
13326
- id: "hero-split-soft-panel",
13327
- target: "hero",
13328
- label: "Soft panel split hero",
13329
- blockKinds: ["block.hero"],
13330
- constraints: { layoutFamilies: ["split"] },
13331
- design: {
13332
- sectionSurface: "muted-band",
13333
- contentFrame: panelFrame("raised"),
13334
- itemSurface: "none",
13245
+ intensity: "balanced"
13246
+ } }
13247
+ }]
13248
+ }],
13249
+ layoutPatches: [{
13250
+ constraints: { layoutVariantKeys: ["micro"] },
13251
+ designPatch: {
13252
+ sectionHeight: "banner",
13335
13253
  heroTypographyScale: "editorial"
13336
13254
  }
13337
- }),
13338
- defineBlockAppearancePreset({
13339
- kind: "block-design",
13340
- id: "hero-split-accent",
13341
- target: "hero",
13342
- label: "Accent split hero",
13343
- blockKinds: ["block.hero"],
13344
- constraints: { layoutFamilies: ["split"] },
13345
- design: {
13346
- sectionSurface: "accent-band",
13347
- contentFrame: panelFrame("raised"),
13348
- itemSurface: "none",
13255
+ }],
13256
+ design: {
13257
+ sectionSurface: "hero-image",
13258
+ contentFrame: panelFrame("raised"),
13259
+ itemSurface: "none",
13260
+ sectionHeight: "immersive",
13261
+ heroComposition: "bottom-left",
13262
+ heroTypographyScale: "display",
13263
+ imageSurfaceTreatment: {
13264
+ kind: "neutral-scrim",
13265
+ intensity: "balanced"
13266
+ }
13267
+ }
13268
+ }), defineBlockAppearancePreset({
13269
+ id: "hero-poster-image",
13270
+ target: "hero",
13271
+ label: "Poster image hero",
13272
+ blockKinds: ["block.hero"],
13273
+ constraints: { layoutFamilies: ["centered", "compact"] },
13274
+ layoutPatches: [{
13275
+ constraints: { layoutVariantKeys: ["micro"] },
13276
+ designPatch: {
13277
+ sectionHeight: "banner",
13349
13278
  heroTypographyScale: "display"
13350
13279
  }
13351
- }),
13352
- defineBlockAppearancePreset({
13353
- kind: "block-design",
13354
- id: "intro-editorial-statement",
13355
- target: "intro",
13356
- label: "Editorial intro statement",
13357
- blockKinds: ["block.intro"],
13358
- constraints: { layoutVariantKeys: ["centered-copy", "statement-copy"] },
13359
- design: {
13360
- sectionSurface: "base",
13361
- contentFrame: plainFrame,
13362
- itemSurface: "none",
13363
- composition: {
13364
- kind: "intro",
13365
- treatment: "editorial-statement"
13366
- }
13367
- }
13368
- }),
13369
- defineBlockAppearancePreset({
13370
- kind: "block-design",
13371
- id: "intro-portrait-bio",
13372
- target: "intro",
13373
- label: "Portrait and bio",
13374
- blockKinds: ["block.intro"],
13375
- constraints: { layoutVariantKeys: ["media-copy"] },
13376
- design: {
13377
- sectionSurface: "base",
13378
- contentFrame: plainFrame,
13379
- itemSurface: "none",
13380
- composition: {
13381
- kind: "intro",
13382
- treatment: "portrait-bio"
13383
- }
13384
- }
13385
- }),
13386
- defineBlockAppearancePreset({
13387
- kind: "block-design",
13388
- id: "offerings-preview-default-cards",
13389
- target: "offerings",
13390
- label: "Default offering cards",
13391
- blockKinds: ["block.offerings-preview"],
13392
- design: {
13393
- sectionSurface: "base",
13394
- contentFrame: plainFrame,
13395
- itemSurface: "default"
13396
- }
13397
- }),
13398
- defineBlockAppearancePreset({
13399
- kind: "block-design",
13400
- id: "offerings-preview-secondary-cards",
13401
- target: "offerings",
13402
- label: "Secondary offering cards",
13403
- blockKinds: ["block.offerings-preview"],
13404
- design: {
13405
- sectionSurface: "muted-band",
13406
- contentFrame: plainFrame,
13407
- itemSurface: "inset"
13408
- }
13409
- }),
13410
- defineBlockAppearancePreset({
13411
- kind: "block-design",
13412
- id: "offerings-preview-non-carded",
13413
- target: "offerings",
13414
- label: "Non-carded offerings",
13415
- blockKinds: ["block.offerings-preview"],
13416
- design: {
13417
- sectionSurface: "muted-band",
13418
- contentFrame: plainFrame,
13419
- itemSurface: "editorial"
13420
- }
13421
- }),
13422
- defineBlockAppearancePreset({
13423
- kind: "block-design",
13424
- id: "offerings-preview-paired-feature-cards",
13425
- target: "offerings",
13426
- label: "Paired feature cards",
13427
- blockKinds: ["block.offerings-preview"],
13428
- constraints: { layoutVariantKeys: ["cards"] },
13429
- design: {
13430
- sectionSurface: "base",
13431
- contentFrame: plainFrame,
13432
- itemSurface: "none"
13433
- }
13434
- }),
13435
- defineBlockAppearancePreset({
13436
- kind: "block-design",
13437
- id: "offerings-preview-open-editorial-columns",
13438
- target: "offerings",
13439
- label: "Open editorial columns",
13440
- blockKinds: ["block.offerings-preview"],
13441
- constraints: { layoutVariantKeys: ["cards"] },
13442
- design: {
13443
- sectionSurface: "base",
13444
- contentFrame: plainFrame,
13445
- itemSurface: "none"
13446
- }
13447
- }),
13448
- defineBlockAppearancePreset({
13449
- kind: "block-design",
13450
- id: "offerings-preview-joined-programme-panel",
13451
- target: "offerings",
13452
- label: "Joined programme panel",
13453
- blockKinds: ["block.offerings-preview"],
13454
- constraints: { layoutVariantKeys: ["cards"] },
13455
- design: {
13456
- sectionSurface: "base",
13457
- contentFrame: plainFrame,
13458
- itemSurface: "none"
13459
- }
13460
- }),
13461
- defineBlockAppearancePreset({
13462
- kind: "block-design",
13463
- id: "feature-cards-raised-rule",
13464
- target: "feature-cards",
13465
- label: "Raised cards with rule",
13466
- blockKinds: ["block.feature-cards"],
13467
- design: {
13468
- sectionSurface: "base",
13469
- contentFrame: plainFrame,
13470
- itemSurface: "raised"
13471
- }
13472
- }),
13473
- defineBlockAppearancePreset({
13474
- kind: "block-design",
13475
- id: "feature-cards-bold-colors",
13476
- target: "feature-cards",
13477
- label: "Bold colour-blocked cards",
13478
- blockKinds: ["block.feature-cards"],
13479
- design: {
13480
- sectionSurface: "base",
13481
- contentFrame: plainFrame,
13482
- itemSurface: "color-blocked"
13483
- }
13484
- }),
13485
- defineBlockAppearancePreset({
13486
- kind: "block-design",
13487
- id: "feature-cards-editorial-columns",
13488
- target: "feature-cards",
13489
- label: "Editorial open columns",
13490
- blockKinds: ["block.feature-cards"],
13491
- design: {
13492
- sectionSurface: "base",
13493
- contentFrame: plainFrame,
13494
- itemSurface: "editorial"
13495
- }
13496
- }),
13497
- defineBlockAppearancePreset({
13498
- kind: "block-design",
13499
- id: "feature-cards-asymmetric-emphasis",
13500
- target: "feature-cards",
13501
- label: "Asymmetric emphasis pair",
13502
- blockKinds: ["block.feature-cards"],
13503
- constraints: { layoutFamilies: ["grid"] },
13504
- design: {
13505
- sectionSurface: "base",
13506
- contentFrame: plainFrame,
13507
- itemSurface: "none",
13508
- composition: {
13509
- kind: "feature-cards",
13510
- treatment: "asymmetric-emphasis"
13511
- }
13512
- }
13513
- }),
13514
- defineBlockAppearancePreset({
13515
- kind: "block-design",
13516
- id: "feature-cards-framed-programme",
13517
- target: "feature-cards",
13518
- label: "Framed programme cards",
13519
- blockKinds: ["block.feature-cards"],
13520
- constraints: { layoutFamilies: ["grid"] },
13521
- design: {
13522
- sectionSurface: "brand-depth-band",
13523
- contentFrame: plainFrame,
13524
- itemSurface: "inset",
13525
- composition: {
13526
- kind: "feature-cards",
13527
- treatment: "framed-programme"
13528
- }
13529
- }
13530
- }),
13531
- defineBlockAppearancePreset({
13532
- kind: "block-design",
13533
- id: "feature-cards-soft-panels",
13534
- target: "feature-cards",
13535
- label: "Soft tinted panels",
13536
- blockKinds: ["block.feature-cards"],
13537
- design: {
13538
- sectionSurface: "base",
13539
- contentFrame: plainFrame,
13540
- itemSurface: "inset"
13541
- }
13542
- }),
13543
- defineBlockAppearancePreset({
13544
- kind: "block-design",
13545
- id: "feature-cards-editorial-diptych",
13546
- target: "feature-cards",
13547
- label: "Editorial diptych",
13548
- blockKinds: ["block.feature-cards"],
13549
- constraints: { layoutVariantKeys: ["editorial-diptych"] },
13550
- design: {
13551
- sectionSurface: "base",
13552
- contentFrame: plainFrame,
13553
- itemSurface: "flat"
13554
- }
13555
- }),
13556
- defineBlockAppearancePreset({
13557
- kind: "block-design",
13558
- id: "feature-cards-editorial-pathways",
13559
- target: "feature-cards",
13560
- label: "Editorial pathways",
13561
- blockKinds: ["block.feature-cards"],
13562
- constraints: { layoutVariantKeys: ["editorial-pathways"] },
13563
- design: {
13564
- sectionSurface: "base",
13565
- contentFrame: plainFrame,
13566
- itemSurface: "flat"
13567
- }
13568
- }),
13569
- defineBlockAppearancePreset({
13570
- kind: "block-design",
13571
- id: "feature-cards-photo-tiles",
13572
- target: "feature-cards",
13573
- label: "Photo tiles",
13574
- blockKinds: ["block.feature-cards"],
13575
- design: {
13576
- sectionSurface: "base",
13577
- contentFrame: plainFrame,
13578
- itemSurface: "raised"
13579
- }
13580
- }),
13581
- defineBlockAppearancePreset({
13582
- kind: "block-design",
13583
- id: "events-lined-panel",
13584
- target: "events",
13585
- label: "Raised event panel",
13586
- blockKinds: ["block.event-calendar", "block.event-listing"],
13587
- design: {
13588
- sectionSurface: "base",
13589
- contentFrame: panelFrame("raised"),
13590
- itemSurface: "none"
13591
- }
13592
- }),
13593
- defineBlockAppearancePreset({
13594
- kind: "block-design",
13595
- id: "events-ruled-register",
13596
- target: "events",
13597
- label: "Ruled event register",
13598
- blockKinds: ["block.event-calendar", "block.event-listing"],
13599
- design: {
13600
- sectionSurface: "brand-depth-band",
13601
- contentFrame: plainFrame,
13602
- itemSurface: "none",
13603
- eventListTreatment: "ruled-register"
13604
- }
13605
- }),
13606
- defineBlockAppearancePreset({
13607
- kind: "block-design",
13608
- id: "events-editorial-register",
13609
- target: "events",
13610
- label: "Editorial event register",
13611
- blockKinds: ["block.event-calendar", "block.event-listing"],
13612
- design: {
13613
- sectionSurface: "base",
13614
- contentFrame: plainFrame,
13615
- itemSurface: "none",
13616
- eventListTreatment: "editorial-register"
13617
- }
13618
- }),
13619
- defineBlockAppearancePreset({
13620
- kind: "block-design",
13621
- id: "events-dense-index",
13622
- target: "events",
13623
- label: "Dense event index",
13624
- blockKinds: ["block.event-calendar", "block.event-listing"],
13625
- design: {
13626
- sectionSurface: "accent-band",
13627
- contentFrame: plainFrame,
13628
- itemSurface: "none",
13629
- eventListTreatment: "dense-index"
13630
- }
13631
- }),
13632
- defineBlockAppearancePreset({
13633
- kind: "block-design",
13634
- id: "schedule-details-brand-depth",
13635
- target: "events",
13636
- label: "Brand-depth schedule details",
13637
- blockKinds: ["block.event-details", "block.course-details"],
13638
- design: {
13639
- sectionSurface: "brand-depth-band",
13640
- contentFrame: plainFrame,
13641
- itemSurface: "none",
13642
- tileTreatment: "brand-depth"
13643
- }
13644
- }),
13645
- defineBlockAppearancePreset({
13646
- kind: "block-design",
13647
- id: "media-text-flush-feature",
13648
- target: "media-text",
13649
- label: "Flush media feature",
13650
- blockKinds: ["block.media-text"],
13651
- design: {
13652
- sectionSurface: "muted-band",
13653
- contentFrame: flushPanelFrame({ bleed: "start" }),
13654
- itemSurface: "none"
13655
- }
13656
- }),
13657
- defineBlockAppearancePreset({
13658
- kind: "block-design",
13659
- id: "testimonials-simple-cards",
13660
- target: "testimonials",
13661
- label: "Simple testimonial cards",
13662
- blockKinds: ["block.testimonials"],
13663
- design: {
13664
- sectionSurface: "base",
13665
- contentFrame: plainFrame,
13666
- itemSurface: "default"
13667
- }
13668
- }),
13669
- defineBlockAppearancePreset({
13670
- kind: "block-design",
13671
- id: "testimonials-raised-panel",
13672
- target: "testimonials",
13673
- label: "Raised testimonial panel",
13674
- blockKinds: ["block.testimonials"],
13675
- design: {
13676
- sectionSurface: "muted-band",
13677
- contentFrame: panelFrame("raised"),
13678
- itemSurface: "raised"
13679
- }
13680
- }),
13681
- defineBlockAppearancePreset({
13682
- kind: "block-design",
13683
- id: "testimonials-accent-panel",
13684
- target: "testimonials",
13685
- label: "Accent testimonial panel",
13686
- blockKinds: ["block.testimonials"],
13687
- design: {
13688
- sectionSurface: "accent-band",
13689
- contentFrame: panelFrame("raised"),
13690
- itemSurface: "raised"
13691
- }
13692
- }),
13693
- defineBlockAppearancePreset({
13694
- kind: "block-design",
13695
- id: "testimonials-default-cards",
13696
- target: "testimonials",
13697
- label: "Default cards",
13698
- blockKinds: ["block.testimonials"],
13699
- design: {
13700
- sectionSurface: "base",
13701
- contentFrame: plainFrame,
13702
- itemSurface: "none",
13703
- testimonialCardTreatment: "default"
13704
- }
13705
- }),
13706
- defineBlockAppearancePreset({
13707
- kind: "block-design",
13708
- id: "testimonials-statement-cards",
13709
- target: "testimonials",
13710
- label: "Statement cards",
13711
- blockKinds: ["block.testimonials"],
13712
- design: {
13713
- sectionSurface: "accent-band",
13714
- contentFrame: plainFrame,
13715
- itemSurface: "raised",
13716
- testimonialCardTreatment: "statement"
13717
- }
13718
- }),
13719
- defineBlockAppearancePreset({
13720
- kind: "block-design",
13721
- id: "testimonials-brand-statement-cards",
13722
- target: "testimonials",
13723
- label: "Brand statement cards",
13724
- blockKinds: ["block.testimonials"],
13725
- design: {
13726
- sectionSurface: "brand-depth-band",
13727
- contentFrame: plainFrame,
13728
- itemSurface: "raised",
13729
- testimonialCardTreatment: "statement"
13730
- }
13731
- }),
13732
- defineBlockAppearancePreset({
13733
- kind: "block-design",
13734
- id: "testimonials-non-carded",
13735
- target: "testimonials",
13736
- label: "Non-carded",
13737
- blockKinds: ["block.testimonials"],
13738
- design: {
13739
- sectionSurface: "muted-band",
13740
- contentFrame: plainFrame,
13741
- itemSurface: "none",
13742
- testimonialCardTreatment: "non-carded"
13743
- }
13744
- }),
13745
- defineBlockAppearancePreset({
13746
- kind: "block-design",
13747
- id: "testimonials-evergreen-lead",
13748
- target: "testimonials",
13749
- label: "Evergreen lead",
13750
- blockKinds: ["block.testimonials"],
13751
- constraints: { layoutVariantKeys: ["featured-editorial"] },
13752
- design: {
13753
- sectionSurface: "base",
13754
- contentFrame: plainFrame,
13755
- itemSurface: "none"
13756
- }
13757
- }),
13758
- defineBlockAppearancePreset({
13759
- kind: "block-design",
13760
- id: "testimonials-room-and-response",
13761
- target: "testimonials",
13762
- label: "Room and response",
13763
- blockKinds: ["block.testimonials"],
13764
- constraints: { layoutVariantKeys: ["featured-editorial"] },
13765
- design: {
13766
- sectionSurface: "base",
13767
- contentFrame: plainFrame,
13768
- itemSurface: "none"
13769
- }
13770
- }),
13771
- defineBlockAppearancePreset({
13772
- kind: "block-design",
13773
- id: "testimonials-open-floor",
13774
- target: "testimonials",
13775
- label: "Open floor",
13776
- blockKinds: ["block.testimonials"],
13777
- constraints: { layoutVariantKeys: ["featured-editorial"] },
13778
- design: {
13779
- sectionSurface: "base",
13780
- contentFrame: plainFrame,
13781
- itemSurface: "none"
13782
- }
13783
- }),
13784
- defineBlockAppearancePreset({
13785
- kind: "block-design",
13786
- id: "faq-base-accordion",
13787
- target: "faq",
13788
- label: "Base accordion FAQ",
13789
- blockKinds: ["block.faq"],
13790
- design: {
13791
- sectionSurface: "base",
13792
- contentFrame: plainFrame,
13793
- itemSurface: "default"
13794
- }
13795
- }),
13796
- defineBlockAppearancePreset({
13797
- kind: "block-design",
13798
- id: "faq-contained-help",
13799
- target: "faq",
13800
- label: "Contained help panel",
13801
- blockKinds: ["block.faq"],
13802
- design: {
13803
- sectionSurface: "muted-band",
13804
- contentFrame: panelFrame("inset"),
13805
- itemSurface: "default"
13806
- }
13807
- }),
13808
- defineBlockAppearancePreset({
13809
- kind: "block-design",
13810
- id: "contact-form-panel",
13811
- target: "contact-form",
13812
- label: "Raised form panel",
13813
- blockKinds: ["block.form"],
13814
- design: {
13815
- sectionSurface: "muted-band",
13816
- contentFrame: panelFrame("raised"),
13817
- itemSurface: "none"
13818
- }
13819
- }),
13820
- defineBlockAppearancePreset({
13821
- kind: "block-design",
13822
- id: "cta-accent-band",
13823
- target: "cta",
13824
- label: "Accent CTA band",
13825
- blockKinds: ["block.cta-full"],
13826
- design: {
13827
- sectionSurface: "accent-band",
13828
- contentFrame: plainFrame,
13829
- itemSurface: "none",
13830
- eyebrowTreatment: "accent"
13831
- }
13832
- })
13833
- ]];
13280
+ }],
13281
+ design: {
13282
+ sectionSurface: "hero-image",
13283
+ contentFrame: plainFrame,
13284
+ itemSurface: "none",
13285
+ sectionHeight: "immersive",
13286
+ heroComposition: "center",
13287
+ heroTypographyScale: "poster",
13288
+ imageSurfaceTreatment: {
13289
+ kind: "brand-scrim",
13290
+ token: "primary",
13291
+ intensity: "strong"
13292
+ }
13293
+ }
13294
+ }), defineBlockAppearancePreset({
13295
+ id: "hero-brand-scrim",
13296
+ target: "hero",
13297
+ label: "Brand scrim image hero",
13298
+ blockKinds: ["block.hero"],
13299
+ constraints: { layoutFamilies: ["centered", "compact"] },
13300
+ optionGroups: brandScrimOptionGroups,
13301
+ layoutPatches: microBannerLayoutPatches,
13302
+ design: {
13303
+ sectionSurface: "hero-image",
13304
+ contentFrame: plainFrame,
13305
+ itemSurface: "none",
13306
+ sectionHeight: "immersive",
13307
+ heroComposition: "center",
13308
+ heroTypographyScale: "display",
13309
+ imageSurfaceTreatment: {
13310
+ kind: "brand-scrim",
13311
+ token: "primary"
13312
+ }
13313
+ }
13314
+ }), defineBlockAppearancePreset({
13315
+ id: "hero-brand-scrim-fixed-frame",
13316
+ target: "hero",
13317
+ label: "Fixed-frame brand scrim hero",
13318
+ blockKinds: ["block.hero"],
13319
+ constraints: { layoutFamilies: ["centered", "compact"] },
13320
+ optionGroups: brandScrimOptionGroups,
13321
+ layoutPatches: microBannerLayoutPatches,
13322
+ design: {
13323
+ sectionSurface: "hero-image",
13324
+ contentFrame: plainFrame,
13325
+ itemSurface: "none",
13326
+ sectionHeight: "immersive",
13327
+ heroComposition: "center",
13328
+ heroTypographyScale: "display",
13329
+ imageSurfaceTreatment: {
13330
+ kind: "brand-scrim",
13331
+ token: "primary"
13332
+ },
13333
+ imageSurfaceMotion: "fixed-frame",
13334
+ eyebrowTreatment: "accent-pill-bounce"
13335
+ }
13336
+ }), defineBlockAppearancePreset({
13337
+ id: "hero-brand-depth-expressive",
13338
+ target: "hero",
13339
+ label: "Expressive brand-depth hero",
13340
+ blockKinds: ["block.hero"],
13341
+ constraints: { layoutFamilies: ["centered", "compact"] },
13342
+ design: {
13343
+ sectionSurface: "brand-depth-band",
13344
+ contentFrame: plainFrame,
13345
+ itemSurface: "none",
13346
+ heroComposition: "center",
13347
+ heroTypographyScale: "editorial",
13348
+ eyebrowTreatment: "accent-pill-bounce"
13349
+ }
13350
+ }), defineBlockAppearancePreset({
13351
+ id: "hero-contained-intro",
13352
+ target: "hero",
13353
+ label: "Contained intro hero",
13354
+ blockKinds: ["block.hero"],
13355
+ design: {
13356
+ sectionSurface: "muted-band",
13357
+ contentFrame: panelFrame("inset"),
13358
+ itemSurface: "none",
13359
+ heroComposition: "center",
13360
+ heroTypographyScale: "editorial"
13361
+ }
13362
+ }), defineBlockAppearancePreset({
13363
+ id: "hero-split-editorial",
13364
+ target: "hero",
13365
+ label: "Editorial split hero",
13366
+ blockKinds: ["block.hero"],
13367
+ constraints: { layoutFamilies: ["split"] },
13368
+ design: {
13369
+ sectionSurface: "base",
13370
+ contentFrame: plainFrame,
13371
+ itemSurface: "none",
13372
+ heroTypographyScale: "editorial"
13373
+ }
13374
+ }), defineBlockAppearancePreset({
13375
+ id: "hero-split-brand",
13376
+ target: "hero",
13377
+ label: "Brand split hero",
13378
+ blockKinds: ["block.hero"],
13379
+ constraints: { layoutFamilies: ["split"] },
13380
+ design: {
13381
+ sectionSurface: "brand-depth-band",
13382
+ contentFrame: plainFrame,
13383
+ itemSurface: "none",
13384
+ heroTypographyScale: "display",
13385
+ eyebrowTreatment: "accent-pill-bounce"
13386
+ }
13387
+ }), defineBlockAppearancePreset({
13388
+ id: "hero-split-soft-panel",
13389
+ target: "hero",
13390
+ label: "Soft panel split hero",
13391
+ blockKinds: ["block.hero"],
13392
+ constraints: { layoutFamilies: ["split"] },
13393
+ design: {
13394
+ sectionSurface: "muted-band",
13395
+ contentFrame: panelFrame("raised"),
13396
+ itemSurface: "none",
13397
+ heroTypographyScale: "editorial"
13398
+ }
13399
+ }), defineBlockAppearancePreset({
13400
+ id: "hero-split-accent",
13401
+ target: "hero",
13402
+ label: "Accent split hero",
13403
+ blockKinds: ["block.hero"],
13404
+ constraints: { layoutFamilies: ["split"] },
13405
+ design: {
13406
+ sectionSurface: "accent-band",
13407
+ contentFrame: panelFrame("raised"),
13408
+ itemSurface: "none",
13409
+ heroTypographyScale: "display"
13410
+ }
13411
+ }), defineBlockAppearancePreset({
13412
+ id: "intro-editorial-statement",
13413
+ target: "intro",
13414
+ label: "Editorial intro statement",
13415
+ blockKinds: ["block.intro"],
13416
+ constraints: { layoutVariantKeys: ["centered-copy", "statement-copy"] },
13417
+ design: {
13418
+ sectionSurface: "base",
13419
+ contentFrame: plainFrame,
13420
+ itemSurface: "none",
13421
+ composition: {
13422
+ kind: "intro",
13423
+ treatment: "editorial-statement"
13424
+ }
13425
+ }
13426
+ }), defineBlockAppearancePreset({
13427
+ id: "intro-portrait-bio",
13428
+ target: "intro",
13429
+ label: "Portrait and bio",
13430
+ blockKinds: ["block.intro"],
13431
+ constraints: { layoutVariantKeys: ["media-copy"] },
13432
+ design: {
13433
+ sectionSurface: "base",
13434
+ contentFrame: plainFrame,
13435
+ itemSurface: "none",
13436
+ composition: {
13437
+ kind: "intro",
13438
+ treatment: "portrait-bio"
13439
+ }
13440
+ }
13441
+ }), defineBlockAppearancePreset({
13442
+ id: "offerings-preview-default-cards",
13443
+ target: "offerings",
13444
+ label: "Default offering cards",
13445
+ blockKinds: ["block.offerings-preview"],
13446
+ design: {
13447
+ sectionSurface: "base",
13448
+ contentFrame: plainFrame,
13449
+ itemSurface: "default"
13450
+ }
13451
+ }), defineBlockAppearancePreset({
13452
+ id: "offerings-preview-secondary-cards",
13453
+ target: "offerings",
13454
+ label: "Secondary offering cards",
13455
+ blockKinds: ["block.offerings-preview"],
13456
+ design: {
13457
+ sectionSurface: "muted-band",
13458
+ contentFrame: plainFrame,
13459
+ itemSurface: "inset"
13460
+ }
13461
+ }), defineBlockAppearancePreset({
13462
+ id: "offerings-preview-non-carded",
13463
+ target: "offerings",
13464
+ label: "Non-carded offerings",
13465
+ blockKinds: ["block.offerings-preview"],
13466
+ design: {
13467
+ sectionSurface: "muted-band",
13468
+ contentFrame: plainFrame,
13469
+ itemSurface: "editorial"
13470
+ }
13471
+ }), defineBlockAppearancePreset({
13472
+ id: "offerings-preview-paired-feature-cards",
13473
+ target: "offerings",
13474
+ label: "Paired feature cards",
13475
+ blockKinds: ["block.offerings-preview"],
13476
+ constraints: { layoutVariantKeys: ["cards"] },
13477
+ design: {
13478
+ sectionSurface: "base",
13479
+ contentFrame: plainFrame,
13480
+ itemSurface: "none"
13481
+ }
13482
+ }), defineBlockAppearancePreset({
13483
+ id: "offerings-preview-open-editorial-columns",
13484
+ target: "offerings",
13485
+ label: "Open editorial columns",
13486
+ blockKinds: ["block.offerings-preview"],
13487
+ constraints: { layoutVariantKeys: ["cards"] },
13488
+ design: {
13489
+ sectionSurface: "base",
13490
+ contentFrame: plainFrame,
13491
+ itemSurface: "none"
13492
+ }
13493
+ }), defineBlockAppearancePreset({
13494
+ id: "offerings-preview-joined-programme-panel",
13495
+ target: "offerings",
13496
+ label: "Joined programme panel",
13497
+ blockKinds: ["block.offerings-preview"],
13498
+ constraints: { layoutVariantKeys: ["cards"] },
13499
+ design: {
13500
+ sectionSurface: "base",
13501
+ contentFrame: plainFrame,
13502
+ itemSurface: "none"
13503
+ }
13504
+ }), defineBlockAppearancePreset({
13505
+ id: "feature-cards-raised-rule",
13506
+ target: "feature-cards",
13507
+ label: "Raised cards with rule",
13508
+ blockKinds: ["block.feature-cards"],
13509
+ design: {
13510
+ sectionSurface: "base",
13511
+ contentFrame: plainFrame,
13512
+ itemSurface: "raised"
13513
+ }
13514
+ }), defineBlockAppearancePreset({
13515
+ id: "feature-cards-bold-colors",
13516
+ target: "feature-cards",
13517
+ label: "Bold colour-blocked cards",
13518
+ blockKinds: ["block.feature-cards"],
13519
+ design: {
13520
+ sectionSurface: "base",
13521
+ contentFrame: plainFrame,
13522
+ itemSurface: "color-blocked"
13523
+ }
13524
+ }), defineBlockAppearancePreset({
13525
+ id: "feature-cards-editorial-columns",
13526
+ target: "feature-cards",
13527
+ label: "Editorial open columns",
13528
+ blockKinds: ["block.feature-cards"],
13529
+ design: {
13530
+ sectionSurface: "base",
13531
+ contentFrame: plainFrame,
13532
+ itemSurface: "editorial"
13533
+ }
13534
+ }), defineBlockAppearancePreset({
13535
+ id: "feature-cards-asymmetric-emphasis",
13536
+ target: "feature-cards",
13537
+ label: "Asymmetric emphasis pair",
13538
+ blockKinds: ["block.feature-cards"],
13539
+ constraints: { layoutFamilies: ["grid"] },
13540
+ design: {
13541
+ sectionSurface: "base",
13542
+ contentFrame: plainFrame,
13543
+ itemSurface: "none",
13544
+ composition: {
13545
+ kind: "feature-cards",
13546
+ treatment: "asymmetric-emphasis"
13547
+ }
13548
+ }
13549
+ }), defineBlockAppearancePreset({
13550
+ id: "feature-cards-framed-programme",
13551
+ target: "feature-cards",
13552
+ label: "Framed programme cards",
13553
+ blockKinds: ["block.feature-cards"],
13554
+ constraints: { layoutFamilies: ["grid"] },
13555
+ design: {
13556
+ sectionSurface: "brand-depth-band",
13557
+ contentFrame: plainFrame,
13558
+ itemSurface: "inset",
13559
+ composition: {
13560
+ kind: "feature-cards",
13561
+ treatment: "framed-programme"
13562
+ }
13563
+ }
13564
+ }), defineBlockAppearancePreset({
13565
+ id: "feature-cards-soft-panels",
13566
+ target: "feature-cards",
13567
+ label: "Soft tinted panels",
13568
+ blockKinds: ["block.feature-cards"],
13569
+ design: {
13570
+ sectionSurface: "base",
13571
+ contentFrame: plainFrame,
13572
+ itemSurface: "inset"
13573
+ }
13574
+ }), defineBlockAppearancePreset({
13575
+ id: "feature-cards-editorial-diptych",
13576
+ target: "feature-cards",
13577
+ label: "Editorial diptych",
13578
+ blockKinds: ["block.feature-cards"],
13579
+ constraints: { layoutVariantKeys: ["editorial-diptych"] },
13580
+ design: {
13581
+ sectionSurface: "base",
13582
+ contentFrame: plainFrame,
13583
+ itemSurface: "flat"
13584
+ }
13585
+ }), defineBlockAppearancePreset({
13586
+ id: "feature-cards-editorial-pathways",
13587
+ target: "feature-cards",
13588
+ label: "Editorial pathways",
13589
+ blockKinds: ["block.feature-cards"],
13590
+ constraints: { layoutVariantKeys: ["editorial-pathways"] },
13591
+ design: {
13592
+ sectionSurface: "base",
13593
+ contentFrame: plainFrame,
13594
+ itemSurface: "flat"
13595
+ }
13596
+ }), defineBlockAppearancePreset({
13597
+ id: "feature-cards-photo-tiles",
13598
+ target: "feature-cards",
13599
+ label: "Photo tiles",
13600
+ blockKinds: ["block.feature-cards"],
13601
+ design: {
13602
+ sectionSurface: "base",
13603
+ contentFrame: plainFrame,
13604
+ itemSurface: "raised"
13605
+ }
13606
+ }), defineBlockAppearancePreset({
13607
+ id: "events-lined-panel",
13608
+ target: "events",
13609
+ label: "Raised event panel",
13610
+ blockKinds: ["block.event-calendar", "block.event-listing"],
13611
+ design: {
13612
+ sectionSurface: "base",
13613
+ contentFrame: panelFrame("raised"),
13614
+ itemSurface: "none"
13615
+ }
13616
+ }), defineBlockAppearancePreset({
13617
+ id: "events-ruled-register",
13618
+ target: "events",
13619
+ label: "Ruled event register",
13620
+ blockKinds: ["block.event-calendar", "block.event-listing"],
13621
+ design: {
13622
+ sectionSurface: "brand-depth-band",
13623
+ contentFrame: plainFrame,
13624
+ itemSurface: "none",
13625
+ eventListTreatment: "ruled-register"
13626
+ }
13627
+ }), defineBlockAppearancePreset({
13628
+ id: "events-editorial-register",
13629
+ target: "events",
13630
+ label: "Editorial event register",
13631
+ blockKinds: ["block.event-calendar", "block.event-listing"],
13632
+ design: {
13633
+ sectionSurface: "base",
13634
+ contentFrame: plainFrame,
13635
+ itemSurface: "none",
13636
+ eventListTreatment: "editorial-register"
13637
+ }
13638
+ }), defineBlockAppearancePreset({
13639
+ id: "events-dense-index",
13640
+ target: "events",
13641
+ label: "Dense event index",
13642
+ blockKinds: ["block.event-calendar", "block.event-listing"],
13643
+ design: {
13644
+ sectionSurface: "accent-band",
13645
+ contentFrame: plainFrame,
13646
+ itemSurface: "none",
13647
+ eventListTreatment: "dense-index"
13648
+ }
13649
+ }), defineBlockAppearancePreset({
13650
+ id: "schedule-details-brand-depth",
13651
+ target: "events",
13652
+ label: "Brand-depth schedule details",
13653
+ blockKinds: ["block.event-details", "block.course-details"],
13654
+ design: {
13655
+ sectionSurface: "brand-depth-band",
13656
+ contentFrame: plainFrame,
13657
+ itemSurface: "none",
13658
+ tileTreatment: "brand-depth"
13659
+ }
13660
+ }), defineBlockAppearancePreset({
13661
+ id: "media-text-flush-feature",
13662
+ target: "media-text",
13663
+ label: "Flush media feature",
13664
+ blockKinds: ["block.media-text"],
13665
+ design: {
13666
+ sectionSurface: "muted-band",
13667
+ contentFrame: flushPanelFrame({ bleed: "start" }),
13668
+ itemSurface: "none"
13669
+ }
13670
+ }), defineBlockAppearancePreset({
13671
+ id: "testimonials-simple-cards",
13672
+ target: "testimonials",
13673
+ label: "Simple testimonial cards",
13674
+ blockKinds: ["block.testimonials"],
13675
+ design: {
13676
+ sectionSurface: "base",
13677
+ contentFrame: plainFrame,
13678
+ itemSurface: "default"
13679
+ }
13680
+ }), defineBlockAppearancePreset({
13681
+ id: "testimonials-raised-panel",
13682
+ target: "testimonials",
13683
+ label: "Raised testimonial panel",
13684
+ blockKinds: ["block.testimonials"],
13685
+ design: {
13686
+ sectionSurface: "muted-band",
13687
+ contentFrame: panelFrame("raised"),
13688
+ itemSurface: "raised"
13689
+ }
13690
+ }), defineBlockAppearancePreset({
13691
+ id: "testimonials-accent-panel",
13692
+ target: "testimonials",
13693
+ label: "Accent testimonial panel",
13694
+ blockKinds: ["block.testimonials"],
13695
+ design: {
13696
+ sectionSurface: "accent-band",
13697
+ contentFrame: panelFrame("raised"),
13698
+ itemSurface: "raised"
13699
+ }
13700
+ }), defineBlockAppearancePreset({
13701
+ id: "testimonials-default-cards",
13702
+ target: "testimonials",
13703
+ label: "Default cards",
13704
+ blockKinds: ["block.testimonials"],
13705
+ design: {
13706
+ sectionSurface: "base",
13707
+ contentFrame: plainFrame,
13708
+ itemSurface: "none",
13709
+ testimonialCardTreatment: "default"
13710
+ }
13711
+ }), defineBlockAppearancePreset({
13712
+ id: "testimonials-statement-cards",
13713
+ target: "testimonials",
13714
+ label: "Statement cards",
13715
+ blockKinds: ["block.testimonials"],
13716
+ design: {
13717
+ sectionSurface: "accent-band",
13718
+ contentFrame: plainFrame,
13719
+ itemSurface: "raised",
13720
+ testimonialCardTreatment: "statement"
13721
+ }
13722
+ }), defineBlockAppearancePreset({
13723
+ id: "testimonials-brand-statement-cards",
13724
+ target: "testimonials",
13725
+ label: "Brand statement cards",
13726
+ blockKinds: ["block.testimonials"],
13727
+ design: {
13728
+ sectionSurface: "brand-depth-band",
13729
+ contentFrame: plainFrame,
13730
+ itemSurface: "raised",
13731
+ testimonialCardTreatment: "statement"
13732
+ }
13733
+ }), defineBlockAppearancePreset({
13734
+ id: "testimonials-non-carded",
13735
+ target: "testimonials",
13736
+ label: "Non-carded",
13737
+ blockKinds: ["block.testimonials"],
13738
+ design: {
13739
+ sectionSurface: "muted-band",
13740
+ contentFrame: plainFrame,
13741
+ itemSurface: "none",
13742
+ testimonialCardTreatment: "non-carded"
13743
+ }
13744
+ }), defineBlockAppearancePreset({
13745
+ id: "testimonials-evergreen-lead",
13746
+ target: "testimonials",
13747
+ label: "Evergreen lead",
13748
+ blockKinds: ["block.testimonials"],
13749
+ constraints: { layoutVariantKeys: ["featured-editorial"] },
13750
+ design: {
13751
+ sectionSurface: "base",
13752
+ contentFrame: plainFrame,
13753
+ itemSurface: "none"
13754
+ }
13755
+ }), defineBlockAppearancePreset({
13756
+ id: "testimonials-room-and-response",
13757
+ target: "testimonials",
13758
+ label: "Room and response",
13759
+ blockKinds: ["block.testimonials"],
13760
+ constraints: { layoutVariantKeys: ["featured-editorial"] },
13761
+ design: {
13762
+ sectionSurface: "base",
13763
+ contentFrame: plainFrame,
13764
+ itemSurface: "none"
13765
+ }
13766
+ }), defineBlockAppearancePreset({
13767
+ id: "testimonials-open-floor",
13768
+ target: "testimonials",
13769
+ label: "Open floor",
13770
+ blockKinds: ["block.testimonials"],
13771
+ constraints: { layoutVariantKeys: ["featured-editorial"] },
13772
+ design: {
13773
+ sectionSurface: "base",
13774
+ contentFrame: plainFrame,
13775
+ itemSurface: "none"
13776
+ }
13777
+ }), defineBlockAppearancePreset({
13778
+ id: "faq-base-accordion",
13779
+ target: "faq",
13780
+ label: "Base accordion FAQ",
13781
+ blockKinds: ["block.faq"],
13782
+ design: {
13783
+ sectionSurface: "base",
13784
+ contentFrame: plainFrame,
13785
+ itemSurface: "default"
13786
+ }
13787
+ }), defineBlockAppearancePreset({
13788
+ id: "faq-contained-help",
13789
+ target: "faq",
13790
+ label: "Contained help panel",
13791
+ blockKinds: ["block.faq"],
13792
+ design: {
13793
+ sectionSurface: "muted-band",
13794
+ contentFrame: panelFrame("inset"),
13795
+ itemSurface: "default"
13796
+ }
13797
+ }), defineBlockAppearancePreset({
13798
+ id: "contact-form-panel",
13799
+ target: "contact-form",
13800
+ label: "Raised form panel",
13801
+ blockKinds: ["block.form"],
13802
+ design: {
13803
+ sectionSurface: "muted-band",
13804
+ contentFrame: panelFrame("raised"),
13805
+ itemSurface: "none"
13806
+ }
13807
+ }), defineBlockAppearancePreset({
13808
+ id: "cta-accent-band",
13809
+ target: "cta",
13810
+ label: "Accent CTA band",
13811
+ blockKinds: ["block.cta-full"],
13812
+ design: {
13813
+ sectionSurface: "accent-band",
13814
+ contentFrame: plainFrame,
13815
+ itemSurface: "none",
13816
+ eyebrowTreatment: "accent"
13817
+ }
13818
+ });
13834
13819
  //#endregion
13835
13820
  //#region ../theme-core/src/site-styles/headerCtaVariants.ts
13836
13821
  function hasButtonVariant(theme, variantId) {
@@ -15239,6 +15224,21 @@ const themeColorTokenSchema = z$1.string().min(1).refine((value) => Boolean(isTh
15239
15224
  //#region ../theme-core/src/palette/colors.ts
15240
15225
  const HEX_COLOR_REGEX = /^#[0-9a-f]{6}$/;
15241
15226
  const NORMALIZABLE_HEX_REGEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;
15227
+ const THEME_PALETTE_COLOR_ORDER = [
15228
+ "primary",
15229
+ "secondary",
15230
+ "accent",
15231
+ "success",
15232
+ "warning",
15233
+ "destructive",
15234
+ "background",
15235
+ "surface",
15236
+ "surfaceAlt",
15237
+ "muted",
15238
+ "text",
15239
+ "primaryForeground",
15240
+ "border"
15241
+ ];
15242
15242
  const hexColorSchema = z$1.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
15243
15243
  const paletteModeSchema = z$1.enum(["light", "dark"]);
15244
15244
  const PALETTE_VALUE_KEY_PREFIX = "palette-value:v1|";
@@ -15316,6 +15316,12 @@ function requirePaletteColorsFromEntries(entries) {
15316
15316
  if (result.ok) return result.colors;
15317
15317
  throw new Error(`Invalid complete palette: ${result.error.kind}`);
15318
15318
  }
15319
+ function paletteColorEntries(colors) {
15320
+ return THEME_PALETTE_COLOR_ORDER.map((name) => ({
15321
+ name,
15322
+ hex: colors[name]
15323
+ }));
15324
+ }
15319
15325
  function paletteColorFingerprint(colors) {
15320
15326
  return PALETTE_TOKEN_NAMES.map((name) => `${name}:${colors[name]}`).join("|");
15321
15327
  }
@@ -15323,7 +15329,7 @@ function canonicalPaletteHashInput(colors, mode) {
15323
15329
  return `${mode}|${paletteColorFingerprint(colors)}`;
15324
15330
  }
15325
15331
  /**
15326
- * The shared TypeScript/SQL protocol. Do not reorder roles: the order comes
15332
+ * Stable curated-catalogue identity. Do not reorder roles: the order comes
15327
15333
  * from PALETTE_TOKEN_NAMES through canonicalPaletteHashInput.
15328
15334
  */
15329
15335
  function paletteValueKey(colors, mode) {
@@ -16649,13 +16655,6 @@ const warmDarkKirtanGold = defineCuratedPalette({
16649
16655
  });
16650
16656
  //#endregion
16651
16657
  //#region ../theme-core/src/palette/curated/index.ts
16652
- /**
16653
- * Curated palette library.
16654
- *
16655
- * Authoring keys are readable source aliases. Value keys are derived from the
16656
- * complete mode and semantic colours and are the only curated identity used at
16657
- * persistence and runtime boundaries.
16658
- */
16659
16658
  function admitCuratedPaletteDefinition(definition) {
16660
16659
  return {
16661
16660
  ...definition,
@@ -16682,11 +16681,8 @@ const curatedPalettes = [
16682
16681
  admitCuratedPaletteDefinition(warmDarkEmber),
16683
16682
  admitCuratedPaletteDefinition(warmDarkKirtanGold)
16684
16683
  ];
16685
- const curatedPalettesByValueKey = new Map(curatedPalettes.map((palette) => [palette.valueKey, palette]));
16684
+ new Map(curatedPalettes.map((palette) => [palette.valueKey, palette]));
16686
16685
  const curatedPalettesByAuthoringKey = new Map(curatedPalettes.map((palette) => [palette.authoringKey, palette]));
16687
- function findCuratedPalette(valueKey) {
16688
- return curatedPalettesByValueKey.get(valueKey);
16689
- }
16690
16686
  function findCuratedPaletteByAuthoringKey(authoringKey) {
16691
16687
  return curatedPalettesByAuthoringKey.get(authoringKey);
16692
16688
  }
@@ -16695,87 +16691,6 @@ function requireCuratedPaletteValueKey(authoringKey) {
16695
16691
  if (!palette) throw new Error(`Unknown curated palette authoring key "${authoringKey}"`);
16696
16692
  return palette.valueKey;
16697
16693
  }
16698
- /** Parses a raw persisted key into catalogue-proven curated membership. */
16699
- const knownCuratedPaletteValueKeySchema = z$1.string().transform((value, ctx) => {
16700
- const valueKey = parsePaletteValueKey(value);
16701
- if (!valueKey) {
16702
- ctx.addIssue({
16703
- code: "custom",
16704
- message: "Invalid canonical palette value key"
16705
- });
16706
- return z$1.NEVER;
16707
- }
16708
- const palette = findCuratedPalette(valueKey);
16709
- if (!palette) {
16710
- ctx.addIssue({
16711
- code: "custom",
16712
- message: "Unknown curated palette value key"
16713
- });
16714
- return z$1.NEVER;
16715
- }
16716
- return palette.valueKey;
16717
- });
16718
- //#endregion
16719
- //#region ../theme-core/src/palette/selection.ts
16720
- const sitePaletteIdSchema = z$1.string().uuid().transform((value) => value);
16721
- const sitePaletteVersionSchema = z$1.number().int().nonnegative().transform((value) => value);
16722
- const paletteSelectionSchema = z$1.discriminatedUnion("kind", [z$1.object({
16723
- kind: z$1.literal("curated"),
16724
- valueKey: knownCuratedPaletteValueKeySchema
16725
- }), z$1.object({
16726
- kind: z$1.literal("site"),
16727
- paletteId: sitePaletteIdSchema
16728
- })]);
16729
- const onboardingPaletteOriginSchema = z$1.object({
16730
- kind: z$1.literal("onboarding"),
16731
- sourceKey: z$1.string().min(1).nullable()
16732
- });
16733
- const curatedForkPaletteOriginSchema = z$1.object({
16734
- kind: z$1.literal("curated-fork"),
16735
- sourceValueKey: paletteValueKeySchema
16736
- });
16737
- const manualPaletteOriginSchema = z$1.object({ kind: z$1.literal("manual") });
16738
- const legacyCustomizedPaletteOriginSchema = z$1.object({
16739
- kind: z$1.literal("legacy-customized"),
16740
- sourceKey: z$1.string().min(1).nullable()
16741
- });
16742
- const sitePaletteOriginSchema = z$1.discriminatedUnion("kind", [
16743
- onboardingPaletteOriginSchema,
16744
- curatedForkPaletteOriginSchema,
16745
- manualPaletteOriginSchema,
16746
- legacyCustomizedPaletteOriginSchema
16747
- ]);
16748
- const editorSitePaletteOriginSchema = z$1.discriminatedUnion("kind", [z$1.object({
16749
- kind: z$1.literal("curated-fork"),
16750
- sourceValueKey: knownCuratedPaletteValueKeySchema
16751
- }), manualPaletteOriginSchema]);
16752
- z$1.object({
16753
- id: sitePaletteIdSchema,
16754
- colors: paletteColorsSchema,
16755
- mode: paletteModeSchema,
16756
- origin: sitePaletteOriginSchema,
16757
- version: sitePaletteVersionSchema
16758
- });
16759
- z$1.discriminatedUnion("kind", [
16760
- z$1.object({ kind: z$1.literal("preserve") }),
16761
- z$1.object({
16762
- kind: z$1.literal("select"),
16763
- selection: paletteSelectionSchema
16764
- }),
16765
- z$1.object({
16766
- kind: z$1.literal("create-site"),
16767
- colors: paletteColorsSchema,
16768
- mode: paletteModeSchema,
16769
- origin: editorSitePaletteOriginSchema
16770
- }),
16771
- z$1.object({
16772
- kind: z$1.literal("update-site"),
16773
- paletteId: sitePaletteIdSchema,
16774
- expectedVersion: sitePaletteVersionSchema,
16775
- colors: paletteColorsSchema,
16776
- mode: paletteModeSchema
16777
- })
16778
- ]);
16779
16694
  const defaultThemeTokens = {
16780
16695
  color: {
16781
16696
  "background/base": "#ffffff",
@@ -16984,6 +16899,32 @@ function parseBackgroundAppearanceColorToken(value) {
16984
16899
  function uniqueStrings(values) {
16985
16900
  return Array.from(new Set(values));
16986
16901
  }
16902
+ const headerInteractionPaletteSchema = z$1.enum([
16903
+ "primary",
16904
+ "secondary",
16905
+ "accent"
16906
+ ]);
16907
+ //#endregion
16908
+ //#region ../theme-core/src/site-styles/headerInteractionPalette.ts
16909
+ const clearSplitInteractionPalette = defineLookOptionGroup({
16910
+ id: "interaction-palette",
16911
+ label: "Hover colour",
16912
+ defaultOptionId: "accent",
16913
+ options: [
16914
+ {
16915
+ id: "accent",
16916
+ label: "Accent"
16917
+ },
16918
+ {
16919
+ id: "primary",
16920
+ label: "Primary"
16921
+ },
16922
+ {
16923
+ id: "secondary",
16924
+ label: "Secondary"
16925
+ }
16926
+ ]
16927
+ });
16987
16928
  //#endregion
16988
16929
  //#region ../theme-core/src/site-styles/logoBranding.ts
16989
16930
  const logoTextConfidenceValues = [
@@ -17206,7 +17147,7 @@ const overlayLogoAccommodations = [
17206
17147
  * optional nested styling fields that would otherwise leak from another Look.
17207
17148
  */
17208
17149
  function baseHeader(theme) {
17209
- 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;
17150
+ 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;
17210
17151
  return {
17211
17152
  ...header,
17212
17153
  navContainer: {
@@ -17221,7 +17162,6 @@ const headerLayoutCatalog = defineExactCatalog()([
17221
17162
  id: asHeaderLayoutId("classic"),
17222
17163
  label: "Classic",
17223
17164
  description: "Logo and navigation in one practical horizontal row.",
17224
- structure: "inline-classic",
17225
17165
  variant: "classic",
17226
17166
  defaultPositioning: "sticky",
17227
17167
  shrinkOnScroll: false
@@ -17230,7 +17170,6 @@ const headerLayoutCatalog = defineExactCatalog()([
17230
17170
  id: asHeaderLayoutId("centered"),
17231
17171
  label: "Centered",
17232
17172
  description: "Logo centered above a balanced navigation row.",
17233
- structure: "centered-stack",
17234
17173
  variant: "centered",
17235
17174
  defaultPositioning: "static",
17236
17175
  shrinkOnScroll: false,
@@ -17246,7 +17185,6 @@ const headerLayoutCatalog = defineExactCatalog()([
17246
17185
  id: asHeaderLayoutId("floating"),
17247
17186
  label: "Floating",
17248
17187
  description: "Detached header chrome that sits over the opening section.",
17249
- structure: "floating-shell",
17250
17188
  variant: "floating",
17251
17189
  defaultPositioning: "sticky",
17252
17190
  shrinkOnScroll: true,
@@ -17408,10 +17346,13 @@ const headerStyleCatalog = defineExactCatalog()([
17408
17346
  label: "Clear Split",
17409
17347
  description: "Floating logo with transparent navigation and no shared shell.",
17410
17348
  supportedLayoutIds: supportedLayouts(["floating"]),
17411
- navInteraction: "color-change",
17349
+ navInteraction: "pill-background",
17412
17350
  surface: "floating",
17413
- defaultDepth: "none",
17351
+ defaultDepth: "line",
17414
17352
  navTypography: "plain",
17353
+ openingForegroundTarget: "all",
17354
+ scrollTreatment: "contrast-glass",
17355
+ interactionPalette: clearSplitInteractionPalette,
17415
17356
  moods: ["editorial", "calm"]
17416
17357
  },
17417
17358
  {
@@ -17434,6 +17375,7 @@ const headerStyleCatalog = defineExactCatalog()([
17434
17375
  surface: "floating",
17435
17376
  defaultDepth: "shadow",
17436
17377
  navTypography: "quiet-caps",
17378
+ openingForegroundTarget: "brand-only",
17437
17379
  moods: ["expressive"]
17438
17380
  },
17439
17381
  {
@@ -17445,6 +17387,7 @@ const headerStyleCatalog = defineExactCatalog()([
17445
17387
  surface: "floating",
17446
17388
  defaultDepth: "shadow",
17447
17389
  navTypography: "heading",
17390
+ openingForegroundTarget: "brand-only",
17448
17391
  moods: ["calm", "editorial"]
17449
17392
  }
17450
17393
  ]);
@@ -17639,7 +17582,7 @@ function applyNavTypography(style, typography) {
17639
17582
  textSize: "sm",
17640
17583
  letterSpacing: "wider"
17641
17584
  };
17642
- default: return assertNever$16(typography, "Unhandled header nav typography");
17585
+ default: return assertNever$15(typography, "Unhandled header nav typography");
17643
17586
  }
17644
17587
  }
17645
17588
  function underlineNavLinkStyle(colorToken, underlineColorToken, typography = "plain") {
@@ -17668,7 +17611,7 @@ function themedHeaderShadow(theme) {
17668
17611
  case "low": return { elevation: "sm" };
17669
17612
  case "medium": return { elevation: "md" };
17670
17613
  case "high": return { elevation: "lg" };
17671
- default: return assertNever$16(theme.shadow.elevation, "Unhandled theme shadow elevation");
17614
+ default: return assertNever$15(theme.shadow.elevation, "Unhandled theme shadow elevation");
17672
17615
  }
17673
17616
  }
17674
17617
  function solidBrandHeader(theme) {
@@ -17946,13 +17889,6 @@ const headerLookCatalog = defineExactCatalog()([
17946
17889
  {
17947
17890
  id: asHeaderLookId("clean-base"),
17948
17891
  label: "Clean base",
17949
- visualTreatment: "solid-neutral",
17950
- layoutBehavior: "sticky",
17951
- configuration: {
17952
- structure: "inline-classic",
17953
- treatment: "solid-neutral",
17954
- behavior: "sticky"
17955
- },
17956
17892
  openingRequirement: "none",
17957
17893
  logoAccommodations: inlineClassicLogoAccommodations,
17958
17894
  compile: cleanBaseHeader
@@ -17960,13 +17896,6 @@ const headerLookCatalog = defineExactCatalog()([
17960
17896
  {
17961
17897
  id: asHeaderLookId("classic-centered-nav"),
17962
17898
  label: "Centered nav",
17963
- visualTreatment: "solid-neutral",
17964
- layoutBehavior: "sticky",
17965
- configuration: {
17966
- structure: "inline-classic",
17967
- treatment: "solid-neutral",
17968
- behavior: "sticky"
17969
- },
17970
17899
  openingRequirement: "none",
17971
17900
  maxRecommendedNavItems: 6,
17972
17901
  logoAccommodations: inlineClassicLogoAccommodations,
@@ -17975,13 +17904,6 @@ const headerLookCatalog = defineExactCatalog()([
17975
17904
  {
17976
17905
  id: asHeaderLookId("brand-solid"),
17977
17906
  label: "Brand solid",
17978
- visualTreatment: "solid-brand",
17979
- layoutBehavior: "sticky-shrink",
17980
- configuration: {
17981
- structure: "inline-classic",
17982
- treatment: "solid-brand",
17983
- behavior: "sticky-shrink"
17984
- },
17985
17907
  openingRequirement: "none",
17986
17908
  logoAccommodations: inlineClassicLogoAccommodations,
17987
17909
  compile: solidBrandHeader
@@ -17989,13 +17911,6 @@ const headerLookCatalog = defineExactCatalog()([
17989
17911
  {
17990
17912
  id: asHeaderLookId("serif-line"),
17991
17913
  label: "Serif line",
17992
- visualTreatment: "light-serif",
17993
- layoutBehavior: "sticky",
17994
- configuration: {
17995
- structure: "centered-stack",
17996
- treatment: "light-serif",
17997
- behavior: "sticky"
17998
- },
17999
17914
  openingRequirement: "none",
18000
17915
  maxRecommendedNavItems: 6,
18001
17916
  logoAccommodations: centeredLogoAccommodations,
@@ -18004,13 +17919,6 @@ const headerLookCatalog = defineExactCatalog()([
18004
17919
  {
18005
17920
  id: asHeaderLookId("centered-calm"),
18006
17921
  label: "Centered calm",
18007
- visualTreatment: "light-serif",
18008
- layoutBehavior: "normal-flow",
18009
- configuration: {
18010
- structure: "centered-stack",
18011
- treatment: "light-serif",
18012
- behavior: "normal-flow"
18013
- },
18014
17922
  openingRequirement: "none",
18015
17923
  maxRecommendedNavItems: 5,
18016
17924
  logoAccommodations: centeredLogoAccommodations,
@@ -18019,13 +17927,6 @@ const headerLookCatalog = defineExactCatalog()([
18019
17927
  {
18020
17928
  id: asHeaderLookId("practical-utility"),
18021
17929
  label: "Practical utility",
18022
- visualTreatment: "solid-neutral",
18023
- layoutBehavior: "sticky-shrink",
18024
- configuration: {
18025
- structure: "inline-classic",
18026
- treatment: "solid-neutral",
18027
- behavior: "sticky-shrink"
18028
- },
18029
17930
  openingRequirement: "none",
18030
17931
  requiresProminentCta: true,
18031
17932
  logoAccommodations: inlineClassicLogoAccommodations,
@@ -18034,13 +17935,6 @@ const headerLookCatalog = defineExactCatalog()([
18034
17935
  {
18035
17936
  id: asHeaderLookId("minimal-transparent"),
18036
17937
  label: "Minimal transparent",
18037
- visualTreatment: "minimal-transparent",
18038
- layoutBehavior: "normal-flow",
18039
- configuration: {
18040
- structure: "inline-classic",
18041
- treatment: "minimal-transparent",
18042
- behavior: "normal-flow"
18043
- },
18044
17938
  openingRequirement: "reserved-space-ok",
18045
17939
  logoAccommodations: inlineClassicLogoAccommodations,
18046
17940
  compile: minimalTransparentHeader
@@ -18048,13 +17942,6 @@ const headerLookCatalog = defineExactCatalog()([
18048
17942
  {
18049
17943
  id: asHeaderLookId("transparent-overlay"),
18050
17944
  label: "Transparent overlay",
18051
- visualTreatment: "transparent-overlay",
18052
- layoutBehavior: "fixed-overlay",
18053
- configuration: {
18054
- structure: "inline-classic",
18055
- treatment: "transparent-overlay",
18056
- behavior: "fixed-overlay"
18057
- },
18058
17945
  openingRequirement: "requires-image-hero-with-contrast-overlay",
18059
17946
  maxRecommendedNavItems: 5,
18060
17947
  logoAccommodations: overlayLogoAccommodations,
@@ -18063,24 +17950,13 @@ const headerLookCatalog = defineExactCatalog()([
18063
17950
  {
18064
17951
  id: asHeaderLookId("floating-glass"),
18065
17952
  label: "Floating glass",
18066
- visualTreatment: "floating-glass",
18067
- layoutBehavior: "fixed-floating",
18068
- configuration: {
18069
- structure: "floating-shell",
18070
- treatment: "floating-glass",
18071
- behavior: "fixed-floating"
18072
- },
18073
17953
  openingRequirement: "requires-image-hero-with-contrast-overlay",
18074
17954
  maxRecommendedNavItems: 5,
18075
17955
  logoAccommodations: overlayLogoAccommodations,
18076
17956
  compile: floatingGlassHeader
18077
17957
  }
18078
17958
  ]);
18079
- new Set(headerLookCatalog.map((look) => headerConfigurationKey(look.configuration)));
18080
17959
  new Map(headerLookCatalog.map((look) => [look.id, look]));
18081
- function headerConfigurationKey(configuration) {
18082
- return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
18083
- }
18084
17960
  //#endregion
18085
17961
  //#region ../theme-core/src/site-styles/sectionTransitions.ts
18086
17962
  function boundaryRuntimeMetrics(family, size, heightExpression) {
@@ -18284,8 +18160,6 @@ const VARIANT_ROLES = [
18284
18160
  "secondary",
18285
18161
  "outline",
18286
18162
  "ghost",
18287
- "link",
18288
- "tertiary",
18289
18163
  "accent"
18290
18164
  ];
18291
18165
  function isVariantRole(value) {
@@ -18297,7 +18171,7 @@ function isVariantRole(value) {
18297
18171
  * IDs become class selectors, so keep the contract deliberately narrower than
18298
18172
  * an arbitrary string and shared with every authoring/runtime boundary.
18299
18173
  */
18300
- const buttonVariantIdSchema = z$1.string().min(1).max(50).regex(/^[a-z0-9-]+$/, "Button variant IDs may contain lowercase letters, numbers, and hyphens only");
18174
+ const 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" });
18301
18175
  function asSpecialVariantId(value) {
18302
18176
  const parsed = buttonVariantIdSchema.safeParse(value);
18303
18177
  if (!parsed.success) throw new Error("SpecialVariantId must be a CSS-safe button variant ID");
@@ -21488,39 +21362,39 @@ function defaultTypographyForRecipe(recipe) {
21488
21362
  }
21489
21363
  //#endregion
21490
21364
  //#region ../theme-core/src/lib/media.ts
21491
- const hotspotSchema$1 = z.object({
21365
+ const hotspotSchema = z.object({
21492
21366
  x: z.number().min(0).max(1),
21493
21367
  y: z.number().min(0).max(1),
21494
21368
  radius: z.number().optional()
21495
21369
  });
21496
- const rotationSchema$1 = z.union([
21370
+ const rotationSchema = z.union([
21497
21371
  z.literal(0),
21498
21372
  z.literal(90),
21499
21373
  z.literal(180),
21500
21374
  z.literal(270)
21501
21375
  ]);
21502
- const rectSchema$1 = z.tuple([
21376
+ const rectSchema = z.tuple([
21503
21377
  z.number(),
21504
21378
  z.number(),
21505
21379
  z.number(),
21506
21380
  z.number()
21507
21381
  ]);
21508
- const aspectCropSchema$1 = z.object({
21382
+ const aspectCropSchema = z.object({
21509
21383
  aspect: z.preprocess((value) => value == null ? void 0 : value, z.string().optional()),
21510
- rect: z.preprocess((value) => value == null ? void 0 : value, rectSchema$1.optional()),
21511
- hotspot: z.preprocess((value) => value == null ? void 0 : value, hotspotSchema$1.optional()),
21512
- rotation: z.preprocess((value) => value == null ? void 0 : value, rotationSchema$1.optional())
21384
+ rect: z.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
21385
+ hotspot: z.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
21386
+ rotation: z.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
21513
21387
  });
21514
- const transformSchema$1 = z.object({
21388
+ const transformSchema = z.object({
21515
21389
  aspectCrops: z.preprocess((value) => {
21516
21390
  if (!value || typeof value !== "object" || Array.isArray(value)) return;
21517
21391
  return value;
21518
- }, z.record(z.string(), aspectCropSchema$1.catch({}))).optional(),
21519
- rect: rectSchema$1.optional(),
21520
- hotspot: hotspotSchema$1.optional(),
21521
- rotation: rotationSchema$1.optional()
21392
+ }, z.record(z.string(), aspectCropSchema.catch({}))).optional(),
21393
+ rect: rectSchema.optional(),
21394
+ hotspot: hotspotSchema.optional(),
21395
+ rotation: rotationSchema.optional()
21522
21396
  });
21523
- const mediaSchema$1 = z.object({
21397
+ const mediaSchema = z.object({
21524
21398
  type: z.enum([
21525
21399
  "image",
21526
21400
  "video",
@@ -21541,7 +21415,35 @@ const mediaSchema$1 = z.object({
21541
21415
  height: z.number().optional(),
21542
21416
  storageBucket: z.string().optional(),
21543
21417
  storagePath: z.string().optional(),
21544
- transform: transformSchema$1.optional()
21418
+ transform: transformSchema.optional()
21419
+ });
21420
+ //#endregion
21421
+ //#region ../theme-core/src/palette/schema.ts
21422
+ const colourHexString = z$1.string().regex(/^#([0-9A-Fa-f]{3}){1,2}$/);
21423
+ const paletteColorSchema = z$1.object({
21424
+ name: z$1.string().min(1),
21425
+ hex: colourHexString
21426
+ });
21427
+ const paletteMetaSchema = z$1.object({ mode: z$1.enum(["light", "dark"]) });
21428
+ const paletteSchema = z$1.object({
21429
+ colors: z$1.array(paletteColorSchema),
21430
+ meta: paletteMetaSchema
21431
+ }).transform((palette, ctx) => {
21432
+ const colors = paletteColorsFromEntries(palette.colors);
21433
+ if (!colors.ok) {
21434
+ ctx.addIssue({
21435
+ code: "custom",
21436
+ message: `Invalid complete palette: ${colors.error.kind}`
21437
+ });
21438
+ return z$1.NEVER;
21439
+ }
21440
+ return {
21441
+ colors: paletteColorEntries(colors.colors).map(({ name, hex }) => ({
21442
+ name: String(name),
21443
+ hex: String(hex)
21444
+ })),
21445
+ meta: palette.meta
21446
+ };
21545
21447
  });
21546
21448
  //#endregion
21547
21449
  //#region ../theme-core/src/surfaces/foregroundRoles.ts
@@ -22346,264 +22248,6 @@ function generateInteractiveChildInheritanceCSS(selector) {
22346
22248
  return `\n${selector} * {\n font-family: inherit;\n font-weight: inherit;\n font-style: inherit;\n letter-spacing: inherit;\n text-transform: inherit;\n color: inherit;\n}\n`;
22347
22249
  }
22348
22250
  //#endregion
22349
- //#region ../theme-core/src/buttons/effects/presets/background.ts
22350
- /**
22351
- * Darken background on hover
22352
- *
22353
- * Works with solid backgrounds only. Darkens the background color by adjusting the shade.
22354
- */
22355
- const darkenBackgroundEffect = {
22356
- id: "darken-background",
22357
- name: "Darken on Hover",
22358
- description: "Darkens the background color on hover",
22359
- category: "background",
22360
- pseudoElement: "none",
22361
- applicableTo: ["button"],
22362
- customizableOption: {
22363
- name: "amount",
22364
- type: "select",
22365
- label: "Darken Amount (shade step)",
22366
- default: 100,
22367
- options: [
22368
- 0,
22369
- 100,
22370
- 200,
22371
- 300,
22372
- 400,
22373
- 500,
22374
- 600,
22375
- 700,
22376
- 800,
22377
- 900
22378
- ]
22379
- },
22380
- isApplicable: (buttonConfig) => {
22381
- return buttonConfig.background.type === "solid";
22382
- },
22383
- generateCSS: (ctx) => {
22384
- const { themeId, variantId, options, tokens, buttonConfig } = ctx;
22385
- if (buttonConfig.background.type !== "solid") return "";
22386
- const amount = options.amount || 100;
22387
- const baseToken = buttonConfig.background.colorToken ?? "primary-500";
22388
- const darkerToken = tokens.adjustShade(baseToken, amount);
22389
- return `
22390
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
22391
- background-color: ${tokens.getColor(darkerToken)};
22392
- }
22393
- `;
22394
- }
22395
- };
22396
- /**
22397
- * Lighten background on hover
22398
- *
22399
- * Works with solid backgrounds only. Lightens the background color by adjusting the shade.
22400
- */
22401
- const lightenBackgroundEffect = {
22402
- id: "lighten-background",
22403
- name: "Lighten on Hover",
22404
- description: "Lightens the background color on hover",
22405
- category: "background",
22406
- pseudoElement: "none",
22407
- applicableTo: ["button"],
22408
- customizableOption: {
22409
- name: "amount",
22410
- type: "select",
22411
- label: "Lighten Amount (shade step)",
22412
- default: 100,
22413
- options: [
22414
- 0,
22415
- 100,
22416
- 200,
22417
- 300,
22418
- 400,
22419
- 500,
22420
- 600,
22421
- 700,
22422
- 800,
22423
- 900
22424
- ]
22425
- },
22426
- isApplicable: (buttonConfig) => {
22427
- return buttonConfig.background.type === "solid";
22428
- },
22429
- generateCSS: (ctx) => {
22430
- const { themeId, variantId, options, tokens, buttonConfig } = ctx;
22431
- if (buttonConfig.background.type !== "solid") return "";
22432
- const amount = options.amount || 100;
22433
- const baseToken = buttonConfig.background.colorToken ?? "primary-500";
22434
- const lighterToken = tokens.adjustShade(baseToken, -amount);
22435
- return `
22436
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
22437
- background-color: ${tokens.getColor(lighterToken)};
22438
- }
22439
- `;
22440
- }
22441
- };
22442
- /**
22443
- * Fade background on hover (reduce opacity)
22444
- *
22445
- * Works with all background types.
22446
- */
22447
- const fadeBackgroundEffect = {
22448
- id: "fade-background",
22449
- name: "Fade on Hover",
22450
- description: "Reduces background opacity on hover",
22451
- category: "background",
22452
- pseudoElement: "none",
22453
- applicableTo: ["nav-link"],
22454
- customizableOption: {
22455
- name: "opacity",
22456
- type: "percentage",
22457
- label: "Hover Opacity",
22458
- default: 80
22459
- },
22460
- generateCSS: (ctx) => {
22461
- const { themeId, variantId, options } = ctx;
22462
- return `
22463
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
22464
- opacity: ${(options.opacity || 80) / 100};
22465
- }
22466
- `;
22467
- }
22468
- };
22469
- /**
22470
- * Reduce opacity on hover (simple opacity reduction)
22471
- *
22472
- * Navigation-link effect that reduces opacity by a percentage (default 15%).
22473
- */
22474
- const opacityReduceEffect = {
22475
- id: "opacity-reduce",
22476
- name: "Reduce Opacity",
22477
- description: "Reduces navigation-link opacity on hover by a percentage",
22478
- category: "background",
22479
- pseudoElement: "none",
22480
- applicableTo: ["nav-link"],
22481
- customizableOption: {
22482
- name: "reduction",
22483
- type: "percentage",
22484
- label: "Opacity Reduction",
22485
- default: 15
22486
- },
22487
- generateCSS: (ctx) => {
22488
- const { themeId, variantId, options } = ctx;
22489
- return `
22490
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
22491
- opacity: ${1 - (options.reduction || 15) / 100};
22492
- }
22493
- `;
22494
- }
22495
- };
22496
- /**
22497
- * Animated gradient background
22498
- *
22499
- * Animates a gradient background by shifting its position on hover.
22500
- * Works with gradient backgrounds only.
22501
- *
22502
- * Sets background-size to 200% and animates background-position from left to right.
22503
- */
22504
- const animatedGradientEffect = {
22505
- id: "animated-gradient",
22506
- name: "Animated Gradient",
22507
- description: "Animates gradient position on hover",
22508
- category: "background",
22509
- pseudoElement: "none",
22510
- applicableTo: ["button"],
22511
- customizableOption: {
22512
- name: "direction",
22513
- type: "select",
22514
- label: "Animation Direction",
22515
- default: "horizontal",
22516
- options: ["horizontal", "vertical"]
22517
- },
22518
- isApplicable: (buttonConfig) => {
22519
- return buttonConfig.background.type === "gradient";
22520
- },
22521
- generateCSS: (ctx) => {
22522
- const { themeId, variantId, options, buttonConfig } = ctx;
22523
- if (buttonConfig.background.type !== "gradient") return "";
22524
- const direction = options.direction || "horizontal";
22525
- return `
22526
- /* Setup animated gradient */
22527
- :where([data-theme-scope="${themeId}"]) .${variantId} {
22528
- background-size: ${direction === "horizontal" ? "200% auto" : "auto 200%"};
22529
- background-position: left center;
22530
- transition: background-position 0.3s ease;
22531
- }
22532
-
22533
- /* Animate gradient on hover */
22534
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
22535
- background-position: ${direction === "horizontal" ? "right center" : "center bottom"};
22536
- }
22537
- `;
22538
- }
22539
- };
22540
- /**
22541
- * Add background color on hover
22542
- *
22543
- * Works best with transparent backgrounds. Adds a solid background color on hover.
22544
- */
22545
- const backgroundOnHoverEffect = {
22546
- id: "background-on-hover",
22547
- name: "Background on Hover",
22548
- description: "Adds background color on hover",
22549
- category: "background",
22550
- pseudoElement: "none",
22551
- applicableTo: ["button", "nav-link"],
22552
- customizableOption: {
22553
- name: "colorToken",
22554
- type: "select",
22555
- label: "Background Color",
22556
- default: "neutral-800",
22557
- options: [
22558
- "neutral-700",
22559
- "neutral-800",
22560
- "neutral-900",
22561
- "primary"
22562
- ]
22563
- },
22564
- generateCSS: (ctx) => {
22565
- const { themeId, variantId, options, tokens, buttonConfig } = ctx;
22566
- const colorToken = options.colorToken || "neutral-800";
22567
- return `
22568
- /* Add background on hover */
22569
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
22570
- background-color: ${tokens.getColor(colorToken)};${"textColorToken" in buttonConfig && typeof options.textColorToken === "string" ? `\n color: ${tokens.getColor(options.textColorToken)};` : ""}
22571
- }
22572
- `;
22573
- }
22574
- };
22575
- /**
22576
- * Add semi-transparent background color on hover
22577
- *
22578
- * Adds a background with opacity/alpha channel. Perfect for retro/arcade styles.
22579
- */
22580
- const backgroundOnHoverAlphaEffect = {
22581
- id: "background-on-hover-alpha",
22582
- name: "Background on Hover (Transparent)",
22583
- description: "Adds semi-transparent background on hover",
22584
- category: "background",
22585
- pseudoElement: "none",
22586
- applicableTo: ["nav-link"],
22587
- customizableOption: {
22588
- name: "opacity",
22589
- type: "percentage",
22590
- label: "Opacity",
22591
- default: 50
22592
- },
22593
- generateCSS: (ctx) => {
22594
- const { themeId, variantId, stateGroup, options } = ctx;
22595
- const rawOpacity = options.opacity;
22596
- const clampedOpacity = Math.max(0, Math.min(100, typeof rawOpacity === "number" && !Number.isNaN(rawOpacity) ? rawOpacity : 50));
22597
- const cssVar = `var(--tb-${options.colorToken || "neutral-800"})`;
22598
- return `
22599
- /* Add semi-transparent background (${stateGroup}) */
22600
- :where([data-theme-scope="${themeId}"]) .${variantId}${stateGroup === "base" ? "" : `:${stateGroup}`} {
22601
- background-color: rgb(${cssVar} / ${clampedOpacity}%);
22602
- }
22603
- `;
22604
- }
22605
- };
22606
- //#endregion
22607
22251
  //#region ../theme-core/src/buttons/effects/cssUtils.ts
22608
22252
  /**
22609
22253
  * CSS Utilities for Effect Presets
@@ -22655,6 +22299,71 @@ function generateStateCSS(themeId, variantId, state, cssProperties) {
22655
22299
  `;
22656
22300
  }
22657
22301
  //#endregion
22302
+ //#region ../theme-core/src/buttons/effects/presets/background.ts
22303
+ /**
22304
+ * Darken background on hover
22305
+ *
22306
+ * Works with solid backgrounds only. Darkens the background color by adjusting the shade.
22307
+ */
22308
+ const darkenBackgroundEffect = shadeBackgroundEffect({
22309
+ id: "darken-background",
22310
+ name: "Darken on Hover",
22311
+ description: "Darkens the background color on hover",
22312
+ label: "Darken Amount (shade step)",
22313
+ shadeDirection: 1
22314
+ });
22315
+ /**
22316
+ * Lighten background on hover
22317
+ *
22318
+ * Works with solid backgrounds only. Lightens the background color by adjusting the shade.
22319
+ */
22320
+ const lightenBackgroundEffect = shadeBackgroundEffect({
22321
+ id: "lighten-background",
22322
+ name: "Lighten on Hover",
22323
+ description: "Lightens the background color on hover",
22324
+ label: "Lighten Amount (shade step)",
22325
+ shadeDirection: -1
22326
+ });
22327
+ function shadeBackgroundEffect(config) {
22328
+ return {
22329
+ id: config.id,
22330
+ name: config.name,
22331
+ description: config.description,
22332
+ category: "background",
22333
+ pseudoElement: "none",
22334
+ applicableTo: ["button"],
22335
+ customizableOption: {
22336
+ name: "amount",
22337
+ type: "select",
22338
+ label: config.label,
22339
+ default: 100,
22340
+ options: [
22341
+ 0,
22342
+ 100,
22343
+ 200,
22344
+ 300,
22345
+ 400,
22346
+ 500,
22347
+ 600,
22348
+ 700,
22349
+ 800,
22350
+ 900
22351
+ ]
22352
+ },
22353
+ isApplicable: (buttonConfig) => buttonConfig.background.type === "solid",
22354
+ generateCSS: ({ themeId, variantId, options, tokens, buttonConfig }) => {
22355
+ if (buttonConfig.background.type !== "solid") return "";
22356
+ const amount = (options.amount || 100) * config.shadeDirection;
22357
+ const baseToken = buttonConfig.background.colorToken ?? "primary-500";
22358
+ return `
22359
+ :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
22360
+ background-color: ${tokens.getColor(tokens.adjustShade(baseToken, amount))};
22361
+ }
22362
+ `;
22363
+ }
22364
+ };
22365
+ }
22366
+ //#endregion
22658
22367
  //#region ../theme-core/src/buttons/effects/registry.ts
22659
22368
  /**
22660
22369
  * Registry of all available effect presets
@@ -22662,11 +22371,144 @@ function generateStateCSS(themeId, variantId, state, cssProperties) {
22662
22371
  const EFFECT_PRESETS = [
22663
22372
  darkenBackgroundEffect,
22664
22373
  lightenBackgroundEffect,
22665
- fadeBackgroundEffect,
22666
- opacityReduceEffect,
22667
- animatedGradientEffect,
22668
- backgroundOnHoverEffect,
22669
- backgroundOnHoverAlphaEffect,
22374
+ {
22375
+ id: "fade-background",
22376
+ name: "Fade on Hover",
22377
+ description: "Reduces background opacity on hover",
22378
+ category: "background",
22379
+ pseudoElement: "none",
22380
+ applicableTo: ["nav-link"],
22381
+ customizableOption: {
22382
+ name: "opacity",
22383
+ type: "percentage",
22384
+ label: "Hover Opacity",
22385
+ default: 80
22386
+ },
22387
+ generateCSS: (ctx) => {
22388
+ const { themeId, variantId, options } = ctx;
22389
+ return `
22390
+ :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
22391
+ opacity: ${(options.opacity || 80) / 100};
22392
+ }
22393
+ `;
22394
+ }
22395
+ },
22396
+ {
22397
+ id: "opacity-reduce",
22398
+ name: "Reduce Opacity",
22399
+ description: "Reduces navigation-link opacity on hover by a percentage",
22400
+ category: "background",
22401
+ pseudoElement: "none",
22402
+ applicableTo: ["nav-link"],
22403
+ customizableOption: {
22404
+ name: "reduction",
22405
+ type: "percentage",
22406
+ label: "Opacity Reduction",
22407
+ default: 15
22408
+ },
22409
+ generateCSS: (ctx) => {
22410
+ const { themeId, variantId, options } = ctx;
22411
+ return `
22412
+ :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
22413
+ opacity: ${1 - (options.reduction || 15) / 100};
22414
+ }
22415
+ `;
22416
+ }
22417
+ },
22418
+ {
22419
+ id: "animated-gradient",
22420
+ name: "Animated Gradient",
22421
+ description: "Animates gradient position on hover",
22422
+ category: "background",
22423
+ pseudoElement: "none",
22424
+ applicableTo: ["button"],
22425
+ customizableOption: {
22426
+ name: "direction",
22427
+ type: "select",
22428
+ label: "Animation Direction",
22429
+ default: "horizontal",
22430
+ options: ["horizontal", "vertical"]
22431
+ },
22432
+ isApplicable: (buttonConfig) => {
22433
+ return buttonConfig.background.type === "gradient";
22434
+ },
22435
+ generateCSS: (ctx) => {
22436
+ const { themeId, variantId, options, buttonConfig } = ctx;
22437
+ if (buttonConfig.background.type !== "gradient") return "";
22438
+ const direction = options.direction || "horizontal";
22439
+ return `
22440
+ /* Setup animated gradient */
22441
+ :where([data-theme-scope="${themeId}"]) .${variantId} {
22442
+ background-size: ${direction === "horizontal" ? "200% auto" : "auto 200%"};
22443
+ background-position: left center;
22444
+ transition: background-position 0.3s ease;
22445
+ }
22446
+
22447
+ /* Animate gradient on hover */
22448
+ :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
22449
+ background-position: ${direction === "horizontal" ? "right center" : "center bottom"};
22450
+ }
22451
+ `;
22452
+ }
22453
+ },
22454
+ {
22455
+ id: "background-on-hover",
22456
+ name: "Background on Hover",
22457
+ description: "Adds background color on hover",
22458
+ category: "background",
22459
+ pseudoElement: "none",
22460
+ applicableTo: ["button", "nav-link"],
22461
+ customizableOption: {
22462
+ name: "colorToken",
22463
+ type: "select",
22464
+ label: "Background Color",
22465
+ default: "neutral-800",
22466
+ options: [
22467
+ "neutral-700",
22468
+ "neutral-800",
22469
+ "neutral-900",
22470
+ "primary"
22471
+ ]
22472
+ },
22473
+ generateCSS: (ctx) => {
22474
+ const { themeId, variantId, stateGroup, options, tokens, buttonConfig } = ctx;
22475
+ const colorToken = options.colorToken || "neutral-800";
22476
+ const color = tokens.getColor(colorToken);
22477
+ const navForeground = "textColorToken" in buttonConfig && typeof options.textColorToken === "string" ? `\n color: ${tokens.getColor(options.textColorToken)};` : "";
22478
+ return `
22479
+ /* Add background on hover */
22480
+ ${getStateSelector(themeId, variantId, stateGroup)} {
22481
+ background-color: ${color};${navForeground}
22482
+ }
22483
+ `;
22484
+ }
22485
+ },
22486
+ {
22487
+ id: "background-on-hover-alpha",
22488
+ name: "Background on Hover (Transparent)",
22489
+ description: "Adds semi-transparent background on hover",
22490
+ category: "background",
22491
+ pseudoElement: "none",
22492
+ applicableTo: ["nav-link"],
22493
+ customizableOption: {
22494
+ name: "opacity",
22495
+ type: "percentage",
22496
+ label: "Opacity",
22497
+ default: 50
22498
+ },
22499
+ generateCSS: (ctx) => {
22500
+ const { themeId, variantId, stateGroup, options } = ctx;
22501
+ const rawOpacity = options.opacity;
22502
+ const clampedOpacity = Math.max(0, Math.min(100, typeof rawOpacity === "number" && !Number.isNaN(rawOpacity) ? rawOpacity : 50));
22503
+ const cssVar = `var(--tb-${options.colorToken || "neutral-800"})`;
22504
+ return `
22505
+ /* Add semi-transparent background (${stateGroup}) */
22506
+ :where([data-theme-scope="${themeId}"]) .${variantId}${stateGroup === "base" ? "" : `:${stateGroup}`} {
22507
+ background-color: rgb(${cssVar} / ${clampedOpacity}%);
22508
+ }
22509
+ `;
22510
+ }
22511
+ },
22670
22512
  {
22671
22513
  id: "border-glow",
22672
22514
  name: "Border Glow",
@@ -25605,6 +25447,147 @@ function resolveOnColorForThemeToken(token) {
25605
25447
  return shade <= 400 ? "#000000" : "#FFFFFF";
25606
25448
  }
25607
25449
  //#endregion
25450
+ //#region ../theme-core/src/header/paintTargets.ts
25451
+ /** Resolve the element that owns the visible header surface for each layout. */
25452
+ function getHeaderPaintTargets(variant, themeId, state = "base") {
25453
+ const scope = `:where([data-theme-scope="${themeId}"])`;
25454
+ const scrolledRoot = state === "scrolled" ? ".header-root.header-scrolled " : "";
25455
+ if (variant === "floating") {
25456
+ if (state === "scrolled") {
25457
+ const desktopOwner = `${scope} ${scrolledRoot}.header-floating-container`;
25458
+ const mobileOwner = `${scope} ${scrolledRoot}.header-mobile-bar`;
25459
+ return [{
25460
+ kind: "viewport-band",
25461
+ clipSelector: `${scope}:has(.header-root.header-scrolled)`,
25462
+ ownerSelector: desktopOwner,
25463
+ selector: `${desktopOwner}::before`,
25464
+ mediaQuery: MQ_MD_UP,
25465
+ topExtension: {
25466
+ customProperty: "--rb-header-floating-top-gap",
25467
+ value: "1rem",
25468
+ ownerProperty: "top"
25469
+ },
25470
+ ownerNeedsPositioning: false
25471
+ }, {
25472
+ kind: "viewport-band",
25473
+ clipSelector: `${scope}:has(.header-root.header-scrolled)`,
25474
+ ownerSelector: mobileOwner,
25475
+ selector: `${mobileOwner}::before`,
25476
+ mediaQuery: MQ_MD_DOWN,
25477
+ topExtension: {
25478
+ customProperty: "--rb-header-floating-top-gap",
25479
+ value: "0.75rem",
25480
+ ownerProperty: "margin-top"
25481
+ },
25482
+ ownerNeedsPositioning: true
25483
+ }];
25484
+ }
25485
+ return [{
25486
+ kind: "element-box",
25487
+ selector: `${scope} ${scrolledRoot}.header-floating-container`,
25488
+ mediaQuery: MQ_MD_UP
25489
+ }, {
25490
+ kind: "element-box",
25491
+ selector: `${scope} ${scrolledRoot}.header-mobile-bar`,
25492
+ mediaQuery: MQ_MD_DOWN
25493
+ }];
25494
+ }
25495
+ return [{
25496
+ kind: "element-box",
25497
+ selector: `${scope} .header-root${state === "scrolled" ? ".header-scrolled" : ""}::before`,
25498
+ pseudoElement: "inset"
25499
+ }];
25500
+ }
25501
+ function renderHeaderPaintTargetRules(targets, rules) {
25502
+ return targets.map((target) => {
25503
+ const block = renderHeaderPaintTargetRule(target, rules);
25504
+ return target.mediaQuery ? `@media ${target.mediaQuery} {\n${block}\n}` : block;
25505
+ }).join("\n");
25506
+ }
25507
+ function renderHeaderPaintTargetRule(target, rules) {
25508
+ switch (target.kind) {
25509
+ case "element-box": {
25510
+ const pseudoElementSetup = target.pseudoElement === "inset" ? [
25511
+ "content: \"\";",
25512
+ "position: absolute;",
25513
+ "inset: 0;",
25514
+ "pointer-events: none;",
25515
+ "border-radius: inherit;",
25516
+ "z-index: -1;"
25517
+ ] : [];
25518
+ return `${target.selector} {\n ${[...pseudoElementSetup, ...rules].join("\n ")}\n}`;
25519
+ }
25520
+ case "viewport-band": {
25521
+ const gap = target.topExtension;
25522
+ const ownerRules = [
25523
+ `${gap.customProperty}: ${gap.value};`,
25524
+ `${gap.ownerProperty}: var(${gap.customProperty});`,
25525
+ ...target.ownerNeedsPositioning ? ["position: relative;"] : [],
25526
+ "isolation: isolate;",
25527
+ "background: none;",
25528
+ "backdrop-filter: none;",
25529
+ "-webkit-backdrop-filter: none;",
25530
+ "border: 0;",
25531
+ "box-shadow: none;"
25532
+ ];
25533
+ const bandRules = [
25534
+ "content: \"\";",
25535
+ "position: absolute;",
25536
+ `top: calc(-1 * var(${gap.customProperty}));`,
25537
+ "bottom: 0;",
25538
+ "left: 50%;",
25539
+ "width: 100vw;",
25540
+ "transform: translateX(-50%);",
25541
+ "pointer-events: none;",
25542
+ "border-radius: 0;",
25543
+ "z-index: -1;",
25544
+ ...rules
25545
+ ];
25546
+ return `${target.clipSelector} {\n overflow-x: clip;\n}\n${target.ownerSelector} {\n ${ownerRules.join("\n ")}\n}\n${target.selector} {\n ${bandRules.join("\n ")}\n}`;
25547
+ }
25548
+ }
25549
+ }
25550
+ //#endregion
25551
+ //#region ../theme-core/src/header/scrollTreatment.ts
25552
+ const headerScrollTreatmentSchema = z$1.discriminatedUnion("kind", [z$1.object({
25553
+ kind: z$1.literal("contrast-glass"),
25554
+ backgroundTone: z$1.enum(["light", "dark"])
25555
+ })]).optional();
25556
+ function generateMobileOverlayBackdropFilterFix(themeId, variant) {
25557
+ const root = `:where([data-theme-scope="${themeId}"]) .header-root:has([data-nav-mobile-overlay][aria-hidden="false"])`;
25558
+ return `\n${(variant === "floating" ? [`${root} .header-mobile-bar`, `${root} .header-mobile-bar::before`] : [`${root}::before`]).join(",\n")} {\n backdrop-filter: none !important;\n -webkit-backdrop-filter: none !important;\n}\n`;
25559
+ }
25560
+ function generateHeaderScrollTreatmentStyles(treatment, themeId, variant, surfaceRules = []) {
25561
+ if (!treatment) return "";
25562
+ switch (treatment.kind) {
25563
+ case "contrast-glass": {
25564
+ const backgroundChannels = treatment.backgroundTone === "dark" ? "0 0 0" : "255 255 255";
25565
+ return renderHeaderPaintTargetRules(getHeaderPaintTargets(variant, themeId, "scrolled"), [`background-color: rgb(${backgroundChannels} / 0.60);`, ...surfaceRules]);
25566
+ }
25567
+ }
25568
+ }
25569
+ //#endregion
25570
+ //#region ../theme-core/src/header/containerSchema.ts
25571
+ const headerContainerSchema = z$1.object({
25572
+ rounded: z$1.enum([
25573
+ "none",
25574
+ "sm",
25575
+ "md",
25576
+ "lg",
25577
+ "xl",
25578
+ "2xl"
25579
+ ]).default("xl"),
25580
+ border: z$1.boolean().default(true),
25581
+ shadow: z$1.boolean().default(true),
25582
+ padding: z$1.enum([
25583
+ "sm",
25584
+ "md",
25585
+ "lg"
25586
+ ]).default("md"),
25587
+ tint: z$1.string().nullable().optional(),
25588
+ opacity: z$1.number().min(0).max(1).default(.12)
25589
+ }).optional();
25590
+ //#endregion
25608
25591
  //#region ../theme-core/src/schema.ts
25609
25592
  const axesSchema = z$1.object({
25610
25593
  tone: z$1.enum([
@@ -25634,16 +25617,6 @@ const axesSchema = z$1.object({
25634
25617
  "expressive"
25635
25618
  ])
25636
25619
  });
25637
- const colourHexString = z$1.string().regex(/^#([0-9A-Fa-f]{3}){1,2}$/);
25638
- const paletteColorSchema = z$1.object({
25639
- name: z$1.string().min(1),
25640
- hex: colourHexString
25641
- });
25642
- const paletteMetaSchema = z$1.object({ mode: z$1.enum(["light", "dark"]) });
25643
- const paletteSchema = z$1.object({
25644
- colors: z$1.array(paletteColorSchema),
25645
- meta: paletteMetaSchema
25646
- });
25647
25620
  const typographyStyleSchema = z$1.object({
25648
25621
  family: z$1.string().min(1),
25649
25622
  weight: z$1.enum([
@@ -25775,7 +25748,7 @@ const boxBackgroundSchema = z$1.object({
25775
25748
  color: tokenOrCssColorValueSchema.nullable().optional(),
25776
25749
  gradient: z$1.string().nullable().optional(),
25777
25750
  gradientPresetId: z$1.string().min(1).nullable().optional(),
25778
- image: mediaSchema$1.nullable().optional(),
25751
+ image: mediaSchema.nullable().optional(),
25779
25752
  objectFit: z$1.enum([
25780
25753
  "fill",
25781
25754
  "fit",
@@ -26023,25 +25996,6 @@ const navFontWeight = z$1.enum([
26023
25996
  ]);
26024
25997
  const headerMaxWidth = z$1.enum(["container", "full"]);
26025
25998
  const headerBarFrame = z$1.enum(["full-bleed", "inset-shell"]);
26026
- const headerContainerSchema = z$1.object({
26027
- rounded: z$1.enum([
26028
- "none",
26029
- "sm",
26030
- "md",
26031
- "lg",
26032
- "xl",
26033
- "2xl"
26034
- ]).default("xl"),
26035
- border: z$1.boolean().default(true),
26036
- shadow: z$1.boolean().default(true),
26037
- padding: z$1.enum([
26038
- "sm",
26039
- "md",
26040
- "lg"
26041
- ]).default("md"),
26042
- tint: z$1.string().nullable().optional(),
26043
- opacity: z$1.number().min(0).max(1).default(.12)
26044
- }).optional();
26045
25999
  const headerBorderSchema = componentBorderSchema.extend({ position: z$1.enum([
26046
26000
  "bottom",
26047
26001
  "top",
@@ -26159,7 +26113,7 @@ const headerBackgroundSchema = z$1.object({
26159
26113
  contentOwner: z$1.literal(siteChromeBackgroundOverrideOwner).optional(),
26160
26114
  color: tokenOrCssColorValueSchema.nullable().optional(),
26161
26115
  gradient: gradientConfigSchema.nullable().optional(),
26162
- image: mediaSchema$1.nullable().optional(),
26116
+ image: mediaSchema.nullable().optional(),
26163
26117
  textColor: tokenOrCssColorValueSchema.nullable().optional()
26164
26118
  });
26165
26119
  const headerSchema = z$1.object({
@@ -26168,7 +26122,8 @@ const headerSchema = z$1.object({
26168
26122
  shrinkOnScroll: z$1.boolean(),
26169
26123
  maxWidth: headerMaxWidth,
26170
26124
  barFrame: headerBarFrame.optional(),
26171
- logoOverride: mediaSchema$1.nullable().optional(),
26125
+ scrollTreatment: headerScrollTreatmentSchema,
26126
+ logoOverride: mediaSchema.nullable().optional(),
26172
26127
  background: headerBackgroundSchema.default({
26173
26128
  type: "color",
26174
26129
  color: "surface"
@@ -26180,6 +26135,7 @@ const headerSchema = z$1.object({
26180
26135
  navFontRole: z$1.enum(["body", "heading"]).optional(),
26181
26136
  navTypography: z$1.enum(["body", "heading"]).optional(),
26182
26137
  navTextSize: navLinkStyleSchema.shape.textSize,
26138
+ interactionPalette: headerInteractionPaletteSchema.optional(),
26183
26139
  navPlacement: z$1.enum(["end", "center"]).optional(),
26184
26140
  container: headerContainerSchema,
26185
26141
  border: headerBorderSchema,
@@ -31656,15 +31612,6 @@ const heroCopyFragment = defineFragment({
31656
31612
  */
31657
31613
  const BLOCK_BUTTON_ROLES = PUBLIC_BUTTON_ROLES;
31658
31614
  const blockButtonRoleSchema = z$1.enum(BLOCK_BUTTON_ROLES);
31659
- /**
31660
- * Temporary rollout boundary for persisted content written before issue #1220.
31661
- * Authoring remains strict through `blockButtonRoleSchema`; this parser exists
31662
- * only until the post-deploy role rewrite has been audited in production.
31663
- */
31664
- function canonicalizePersistedBlockButtonRole(value) {
31665
- return value === "link" || value === "tertiary" ? "ghost" : value;
31666
- }
31667
- const persistedBlockButtonRoleSchema = z$1.preprocess((value) => typeof value === "string" ? canonicalizePersistedBlockButtonRole(value) : value, blockButtonRoleSchema);
31668
31615
  const BLOCK_BUTTON_ROLE_LABELS = {
31669
31616
  primary: "Primary",
31670
31617
  secondary: "Secondary",
@@ -36410,7 +36357,7 @@ function planSiteChromePlacement(positioning) {
36410
36357
  headerRootClassName: "rb-fixed rb-top-0 rb-left-0 rb-right-0",
36411
36358
  standaloneShellClassName: "fixed left-0 right-0 top-0 z-40 w-full"
36412
36359
  };
36413
- default: return assertNever$16(positioning);
36360
+ default: return assertNever$15(positioning);
36414
36361
  }
36415
36362
  }
36416
36363
  function splitSiteChromePlacementClasses(className) {
@@ -39436,84 +39383,6 @@ const weeklySlotAvailabilityBlockDefinition = {
39436
39383
  mode: "server"
39437
39384
  } }
39438
39385
  };
39439
- const PUBLIC_DOWNLOAD_MEDIA_TYPES = [
39440
- "document",
39441
- "spreadsheet",
39442
- "archive",
39443
- "audio"
39444
- ];
39445
- const hotspotSchema = z.object({
39446
- x: z.number().min(0).max(1),
39447
- y: z.number().min(0).max(1),
39448
- radius: z.number().optional()
39449
- });
39450
- const rotationSchema = z.union([
39451
- z.literal(0),
39452
- z.literal(90),
39453
- z.literal(180),
39454
- z.literal(270)
39455
- ]);
39456
- const rectSchema = z.tuple([
39457
- z.number(),
39458
- z.number(),
39459
- z.number(),
39460
- z.number()
39461
- ]);
39462
- const aspectCropSchema = z.object({
39463
- aspect: z.preprocess((value) => value == null ? void 0 : value, z.string().optional()),
39464
- rect: z.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
39465
- hotspot: z.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
39466
- rotation: z.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
39467
- });
39468
- const transformSchema = z.object({
39469
- aspectCrops: z.preprocess((value) => {
39470
- if (!value || typeof value !== "object" || Array.isArray(value)) return;
39471
- return value;
39472
- }, z.record(z.string(), aspectCropSchema.catch({}))).optional(),
39473
- rect: rectSchema.optional(),
39474
- hotspot: hotspotSchema.optional(),
39475
- rotation: rotationSchema.optional()
39476
- });
39477
- const mediaPosterSchema = z.discriminatedUnion("tag", [z.object({
39478
- tag: z.literal("storage"),
39479
- assetId: z.string().optional(),
39480
- storageBucket: z.string().min(1),
39481
- storagePath: z.string().min(1)
39482
- }), z.object({
39483
- tag: z.literal("external-src"),
39484
- assetId: z.string().optional(),
39485
- src: z.string().url()
39486
- })]);
39487
- const mediaBaseSchema = z.object({
39488
- purpose: z.string().optional(),
39489
- placeholder: z.boolean().default(true).optional(),
39490
- assetId: z.string().optional(),
39491
- identifier: z.string().optional(),
39492
- src: z.string().optional(),
39493
- alt: z.string().optional(),
39494
- filename: z.string().optional(),
39495
- mimeType: z.string().optional(),
39496
- width: z.number().optional(),
39497
- height: z.number().optional(),
39498
- storageBucket: z.string().optional(),
39499
- storagePath: z.string().optional(),
39500
- poster: mediaPosterSchema.optional(),
39501
- transform: transformSchema.optional()
39502
- });
39503
- const imageMediaSchema = mediaBaseSchema.extend({ type: z.literal("image") });
39504
- const videoMediaSchema = mediaBaseSchema.extend({ type: z.literal("video") });
39505
- const audioMediaSchema = mediaBaseSchema.extend({ type: z.literal("audio") });
39506
- const documentMediaSchema = mediaBaseSchema.extend({ type: z.literal("document") });
39507
- const spreadsheetMediaSchema = mediaBaseSchema.extend({ type: z.literal("spreadsheet") });
39508
- const archiveMediaSchema = mediaBaseSchema.extend({ type: z.literal("archive") });
39509
- const mediaSchema = z.discriminatedUnion("type", [
39510
- imageMediaSchema,
39511
- videoMediaSchema,
39512
- audioMediaSchema,
39513
- documentMediaSchema,
39514
- spreadsheetMediaSchema,
39515
- archiveMediaSchema
39516
- ]);
39517
39386
  //#endregion
39518
39387
  //#region ../blocks/src/system/blocks/shared/bookingPaymentTerms.ts
39519
39388
  const bookingDepositRefundPolicySchema = z$1.enum(["refundable", "non_refundable"]);
@@ -39953,7 +39822,7 @@ const publicEventSchema = z$1.object({
39953
39822
  presentation: z$1.object({
39954
39823
  cardTitleOverride: z$1.string().nullable().optional(),
39955
39824
  summary: z$1.string().nullable().optional(),
39956
- image: mediaSchema.nullable().optional()
39825
+ image: mediaSchema$1.nullable().optional()
39957
39826
  }).optional(),
39958
39827
  slug: z$1.string(),
39959
39828
  path: z$1.string().nullable(),
@@ -40579,7 +40448,7 @@ function isEventCalendarListLayout(value) {
40579
40448
  //#region ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
40580
40449
  const previewStageSchema = z$1.enum(["preview", "published"]);
40581
40450
  const registrationButtonVariantSchema = blockButtonRoleSchema;
40582
- const eventButtonVariantSchema = persistedBlockButtonRoleSchema;
40451
+ const eventButtonVariantSchema = blockButtonRoleSchema;
40583
40452
  const eventLayoutSchema = z$1.enum(eventCalendarListLayoutValues);
40584
40453
  const eventCalendarDisplayModeSchema = z$1.enum(eventCalendarDisplayModeValues);
40585
40454
  const eventCalendarDefaultViewSchema = z$1.enum(eventCalendarDefaultViewValues);
@@ -46751,10 +46620,10 @@ function preferredPathsForSource(source) {
46751
46620
  case "workshop": return ["/workshops", "/workshop"];
46752
46621
  case "retreat": return ["/retreats", "/retreat"];
46753
46622
  case "performance": return ["/performances", "/performance"];
46754
- default: return assertNever$25(source.preset, "Unhandled offerings preview event preset");
46623
+ default: return assertNever$24(source.preset, "Unhandled offerings preview event preset");
46755
46624
  }
46756
46625
  case "course": return ["/courses", "/course"];
46757
- default: return assertNever$25(source, "Unhandled offerings preview source");
46626
+ default: return assertNever$24(source, "Unhandled offerings preview source");
46758
46627
  }
46759
46628
  }
46760
46629
  function normalizeRoutePath(value) {
@@ -50791,7 +50660,7 @@ const newsletterSignupBlockDefinition = {
50791
50660
  //#endregion
50792
50661
  //#region ../blocks/src/system/blocks/team-members.ts
50793
50662
  const ITEM_NAME = "member";
50794
- const teamMemberPhotoSchema = mediaSchema.refine((media) => media.type === "image", { message: "Team member photos must be image media" }).nullable();
50663
+ const teamMemberPhotoSchema = mediaSchema$1.refine((media) => media.type === "image", { message: "Team member photos must be image media" }).nullable();
50795
50664
  const teamMemberDataSchema = z$1.object({
50796
50665
  _type: z$1.literal("teamMember"),
50797
50666
  id: z$1.string(),
@@ -52366,7 +52235,7 @@ function getBlockDefinition(name) {
52366
52235
  //#endregion
52367
52236
  //#region ../blocks/src/system/helpers/backgroundMedia.ts
52368
52237
  function resolveBackgroundMedia(input) {
52369
- const parsedMedia = mediaSchema.safeParse(input.image);
52238
+ const parsedMedia = mediaSchema$1.safeParse(input.image);
52370
52239
  if (!parsedMedia.success) return null;
52371
52240
  switch (parsedMedia.data.type) {
52372
52241
  case "image":
@@ -52901,7 +52770,7 @@ function resolveLinkedContentEditSupport(contentType) {
52901
52770
  kind: "unsupported-domain-backed",
52902
52771
  reason: metadata.reason
52903
52772
  };
52904
- default: return assertNever$25(metadata);
52773
+ default: return assertNever$24(metadata);
52905
52774
  }
52906
52775
  }
52907
52776
  function contentTypeKeyToLabel(key) {
@@ -53661,6 +53530,9 @@ function renderTrailingAffordanceIcon(affordance) {
53661
53530
  className: "rb-ml-2 rb-h-4 rb-w-4 rb-inline-block"
53662
53531
  });
53663
53532
  }
53533
+ function isMissingRequiredLink(linkRequired, resolvedHref) {
53534
+ return linkRequired && resolvedHref.length === 0;
53535
+ }
53664
53536
  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 }) => {
53665
53537
  const content = value ?? children;
53666
53538
  if (!content) {
@@ -53669,12 +53541,16 @@ const ButtonNode = ({ value, children, href, variantId = "primary", size = "md",
53669
53541
  }
53670
53542
  const affordanceIcon = renderTrailingAffordanceIcon(resolveButtonAffordance({ trailingIcon }));
53671
53543
  const resolvedHref = typeof href === "string" ? href.trim() : "";
53672
- if (linkRequired && resolvedHref.length === 0) {
53544
+ if (isMissingRequiredLink(linkRequired, resolvedHref)) {
53673
53545
  if (process.env.NODE_ENV === "development") console.warn("[ButtonNode] Missing href for link-required button");
53674
53546
  return null;
53675
53547
  }
53676
53548
  const extraClassName = affordanceIcon ? [className, AFFORDANCE_SUPPRESS_CLASS].filter(Boolean).join(" ") : className;
53677
- const resolvedVariantId = parseThemeButtonVariantId(canonicalizePersistedBlockButtonRole(variantId));
53549
+ const resolvedVariantId = parseThemeButtonVariantId(variantId);
53550
+ if (variantId && !resolvedVariantId) {
53551
+ console.error("[ButtonNode] Invalid button variant", { variantId });
53552
+ return null;
53553
+ }
53678
53554
  const combinedClassName = resolvedVariantId ? themeButtonClassName({
53679
53555
  variant: resolvedVariantId,
53680
53556
  size,
@@ -53803,8 +53679,9 @@ function iconForMediaType(type) {
53803
53679
  });
53804
53680
  }
53805
53681
  }
53806
- function normalizeButtonVariant(value) {
53807
- return isBlockButtonRole(value) ? value : "primary";
53682
+ function parseButtonVariant(value) {
53683
+ if (value === null || value === void 0) return "primary";
53684
+ return isBlockButtonRole(value) ? value : null;
53808
53685
  }
53809
53686
  function FileDownloadNode({ value, title, description, buttonLabel, buttonVariant, className }) {
53810
53687
  if (!value || !isDownloadableMediaType(value.type)) return null;
@@ -53814,7 +53691,11 @@ function FileDownloadNode({ value, title, description, buttonLabel, buttonVarian
53814
53691
  const heading = title?.trim() || filename;
53815
53692
  const body = description?.trim();
53816
53693
  const label = buttonLabel?.trim() || "Download";
53817
- const variant = normalizeButtonVariant(buttonVariant);
53694
+ const variant = parseButtonVariant(buttonVariant);
53695
+ if (!variant) {
53696
+ console.error("[FileDownloadNode] Invalid button variant", { buttonVariant });
53697
+ return null;
53698
+ }
53818
53699
  return /* @__PURE__ */ jsx("div", {
53819
53700
  className,
53820
53701
  children: /* @__PURE__ */ jsxs("div", {
@@ -55428,7 +55309,7 @@ function eventSeriesIdsForSubject(subject) {
55428
55309
  switch (subject.kind) {
55429
55310
  case "eventSeries": return [subject.eventSeriesId];
55430
55311
  case "eventOffering": return subject.availableEventSeriesIds;
55431
- default: return assertNever$25(subject);
55312
+ default: return assertNever$24(subject);
55432
55313
  }
55433
55314
  }
55434
55315
  //#endregion
@@ -56145,7 +56026,7 @@ function renderOfferingGroupItems(presentation, items, options) {
56145
56026
  children: items.map((item) => renderOfferingCompactItem(item, options))
56146
56027
  })
56147
56028
  });
56148
- default: return assertNever$25(presentation, "Unhandled offerings preview presentation");
56029
+ default: return assertNever$24(presentation, "Unhandled offerings preview presentation");
56149
56030
  }
56150
56031
  }
56151
56032
  function compareCoursesByNextSession(left, right) {
@@ -56190,7 +56071,7 @@ function featuredSummaryDetails(item) {
56190
56071
  const summary = deriveCourseScheduleSummary(item.course);
56191
56072
  return summary ? formatFeaturedSummary(summary, item.course.venue?.name ?? null) : null;
56192
56073
  }
56193
- default: return assertNever$25(item, "Unhandled offerings preview item");
56074
+ default: return assertNever$24(item, "Unhandled offerings preview item");
56194
56075
  }
56195
56076
  }
56196
56077
  function formatFeaturedSummary(summary, venue) {
@@ -56199,7 +56080,7 @@ function formatFeaturedSummary(summary, venue) {
56199
56080
  case "multi-day-span": return detailsFromOccurrences(summary.occurrence, summary.occurrence, venue, null, null, true);
56200
56081
  case "fixed-recurring-run": return detailsFromOccurrences(summary.first, summary.last, venue, summary.recurrenceLabel, null);
56201
56082
  case "irregular-multi-session-run": return detailsFromOccurrences(summary.first, summary.last, venue, null, `${summary.sessionCount} dates`);
56202
- default: return assertNever$25(summary, "Unhandled offerings preview schedule summary");
56083
+ default: return assertNever$24(summary, "Unhandled offerings preview schedule summary");
56203
56084
  }
56204
56085
  }
56205
56086
  function detailsFromOccurrences(first, last, venue, recurrence, sessionCount, spanUsesEndDate = false) {
@@ -56596,7 +56477,7 @@ function bookingActionContent(input) {
56596
56477
  children: input.buttonText
56597
56478
  });
56598
56479
  case "unavailable": return null;
56599
- default: return assertNever$25(input.booking);
56480
+ default: return assertNever$24(input.booking);
56600
56481
  }
56601
56482
  }
56602
56483
  function RecurringSchedule({ schedule, buttonText = "Book", buttonVariant = "primary", showVenue = true, emptyMessage = "Regular schedule details will be added shortly." }) {
@@ -58774,7 +58655,7 @@ function previewEditableTargetToPath(target) {
58774
58655
  case "current-entry-field":
58775
58656
  case "current-entry-metadata": return target.path;
58776
58657
  case "read-only": return;
58777
- default: return assertNever$25(target);
58658
+ default: return assertNever$24(target);
58778
58659
  }
58779
58660
  }
58780
58661
  function previewEditableTargetToFieldKey(target) {
@@ -59849,7 +59730,7 @@ function collectNestedPreviewFieldConstraintEntries(field, path) {
59849
59730
  case "text":
59850
59731
  case "time":
59851
59732
  case "url": return [];
59852
- default: return assertNever$25(field);
59733
+ default: return assertNever$24(field);
59853
59734
  }
59854
59735
  }
59855
59736
  function makeDefaultBlockComponent(args) {
@@ -60696,6 +60577,41 @@ function resolveColorTokenHex(theme, colorToken) {
60696
60577
  if (colorToken === "transparent") return null;
60697
60578
  return expandPalette(theme.palette)[colorToken] ?? null;
60698
60579
  }
60580
+ const NAV_DROPDOWN_CONTAINER_RAIL_CSS_RULES = [
60581
+ `min-width: 12rem;`,
60582
+ `width: max-content;`,
60583
+ `max-width: min(22rem, calc(100vw - 2rem));`,
60584
+ `transform: translateX(var(--nav-dropdown-shift-x, 0px));`
60585
+ ];
60586
+ //#endregion
60587
+ //#region ../theme-core/src/header/surfaceRules.ts
60588
+ /** Compile the visual surface declarations independently of paint geometry. */
60589
+ function buildHeaderSurfaceRules(header, tokens, blur) {
60590
+ const base = [];
60591
+ const scrolled = [];
60592
+ const background = header.background;
60593
+ if (background.type === "color") base.push(`background-color: ${tokens.getColor(background.color || "surface")};`);
60594
+ else if (background.type === "gradient" && background.gradient) {
60595
+ const stops = background.gradient.stops.map((stop) => tokens.getColor(stop.color)).join(", ");
60596
+ base.push(`background-image: linear-gradient(${background.gradient.angle ?? 180}deg, ${stops});`);
60597
+ }
60598
+ const blurRules = [`backdrop-filter: ${blur};`, `-webkit-backdrop-filter: ${blur};`];
60599
+ base.push(...blurRules);
60600
+ scrolled.push(...blurRules);
60601
+ const borderWidth = getComponentBorderWidthPx(header.border?.width ?? "none");
60602
+ if (!header.border || borderWidth === "0") return {
60603
+ base,
60604
+ scrolled,
60605
+ border: []
60606
+ };
60607
+ const color = rgbColorValue(header.border.colorToken?.trim() || "border");
60608
+ const style = header.border.style === "dashed" ? "dashed" : "solid";
60609
+ return {
60610
+ base,
60611
+ scrolled,
60612
+ border: header.border.position === "both" ? [`border-top: ${borderWidth} ${style} ${color};`, `border-bottom: ${borderWidth} ${style} ${color};`] : [`border-${header.border.position}: ${borderWidth} ${style} ${color};`]
60613
+ };
60614
+ }
60699
60615
  //#endregion
60700
60616
  //#region ../theme-core/src/navigation/presets.ts
60701
60617
  /**
@@ -60857,12 +60773,71 @@ function getNavLinkPreset(presetId) {
60857
60773
  return NAV_LINK_PRESETS[presetId];
60858
60774
  }
60859
60775
  Object.keys(NAV_LINK_PRESETS);
60860
- const NAV_DROPDOWN_CONTAINER_RAIL_CSS_RULES = [
60861
- `min-width: 12rem;`,
60862
- `width: max-content;`,
60863
- `max-width: min(22rem, calc(100vw - 2rem));`,
60864
- `transform: translateX(var(--nav-dropdown-shift-x, 0px));`
60865
- ];
60776
+ //#endregion
60777
+ //#region ../theme-core/src/header/legacyNavLinkStyle.ts
60778
+ function buildLegacyHeaderNavLinkStyle(header, contrastTreatment, navTextSize) {
60779
+ const navStyle = header.navStyle ?? "minimal";
60780
+ const basePreset = getNavLinkPreset(navStyle);
60781
+ if (!basePreset) return null;
60782
+ const style = {
60783
+ ...basePreset,
60784
+ fontWeight: header.navWeight ?? basePreset.fontWeight,
60785
+ colorToken: (header.navColor ?? header.textColor)?.trim() || basePreset.colorToken,
60786
+ ...contrastTreatment ? { contrastTreatment } : {},
60787
+ ...navTextSize ? { textSize: navTextSize } : {}
60788
+ };
60789
+ if (header.navWeight === "bold" && navStyle === "solid") style.textTransform = "uppercase";
60790
+ applyLegacyNavEffects(style, header);
60791
+ applyLegacyGlassTreatment(style, header, navStyle);
60792
+ return style;
60793
+ }
60794
+ function applyLegacyNavEffects(style, header) {
60795
+ if (!header.navEffects) return;
60796
+ const effects = style.effects = {
60797
+ ...style.effects,
60798
+ hover: [...style.effects?.hover ?? []],
60799
+ active: [...style.effects?.active ?? []]
60800
+ };
60801
+ if (header.navEffects.glow) effects.hover.push({
60802
+ effectId: "outer-glow",
60803
+ options: { spread: 5 }
60804
+ });
60805
+ if (header.navEffects.neumorphic) {
60806
+ effects.hover.push({
60807
+ effectId: "neumorphic-shadow",
60808
+ options: { mode: "pressed" }
60809
+ });
60810
+ effects.hover.push({
60811
+ effectId: "text-color-change",
60812
+ options: { hoverColorToken: "primary" }
60813
+ });
60814
+ }
60815
+ if (header.navEffects.underlineGradient) effects.hover.push({
60816
+ effectId: "border-bottom-grow",
60817
+ options: { origin: "center" }
60818
+ });
60819
+ }
60820
+ function applyLegacyGlassTreatment(style, header, navStyle) {
60821
+ if (header.navContainer?.type !== "glass" || navStyle !== "minimal") return;
60822
+ style.borderRadius = "full";
60823
+ style.effects = {
60824
+ ...style.effects,
60825
+ hover: glassStateEffects(10),
60826
+ active: glassStateEffects(18)
60827
+ };
60828
+ }
60829
+ function glassStateEffects(opacity) {
60830
+ return [{
60831
+ effectId: "background-on-hover-alpha",
60832
+ options: {
60833
+ colorToken: "neutral-50",
60834
+ opacity
60835
+ }
60836
+ }, {
60837
+ effectId: "text-color-change",
60838
+ options: { hoverColorToken: "neutral-50" }
60839
+ }];
60840
+ }
60866
60841
  //#endregion
60867
60842
  //#region ../theme-core/src/header/generateHeaderCss.ts
60868
60843
  const HEADER_BLUR = "blur(12px)";
@@ -60892,8 +60867,8 @@ function generateHeaderCss(options) {
60892
60867
  const cssChunks = [];
60893
60868
  const headerContrastTreatment = resolveHeaderContrastTreatment(header);
60894
60869
  const headerNavTextSize = resolveHeaderNavTextSize(header);
60895
- cssChunks.push(generateHeaderRootStyles(header, themeId, tokens, theme));
60896
- cssChunks.push(generateMobileOverlayBackdropFilterFix(themeId));
60870
+ cssChunks.push(generateHeaderRootStyles(header, themeId, tokens));
60871
+ cssChunks.push(generateMobileOverlayBackdropFilterFix(themeId, header.variant));
60897
60872
  cssChunks.push(generateLogoStyles({
60898
60873
  logo: header.logo,
60899
60874
  themeId,
@@ -60931,56 +60906,34 @@ function isClearSplitHeaderShape(header) {
60931
60906
  function isDetachedFloatingHeaderShape(header) {
60932
60907
  return header.variant === "floating" && !header.container;
60933
60908
  }
60934
- function generateMobileOverlayBackdropFilterFix(themeId) {
60935
- return `\n${`:where([data-theme-scope="${themeId}"]) .header-root:has([data-nav-mobile-overlay][aria-hidden="false"])::before`} {\n backdrop-filter: none !important;\n -webkit-backdrop-filter: none !important;\n}\n`;
60936
- }
60937
60909
  /**
60938
60910
  * Generate root header container styles
60939
60911
  */
60940
- function generateHeaderRootStyles(header, themeId, tokens, _theme) {
60912
+ function generateHeaderRootStyles(header, themeId, tokens) {
60941
60913
  const selector = `:where([data-theme-scope="${themeId}"]) .header-root`;
60942
- const backgroundSelector = `:where([data-theme-scope="${themeId}"]) .header-root::before`;
60943
60914
  const rules = [];
60944
- const backgroundRules = [];
60945
60915
  const navContainerType = header.navContainer?.type ?? "none";
60946
60916
  const isContainedNav = navContainerType === "pill" || navContainerType === "glass";
60947
60917
  rules.push("position: relative;");
60948
60918
  rules.push("isolation: isolate;");
60949
- if (!isContainedNav) {
60950
- const bg = header.background;
60951
- if (bg.type === "color") {
60952
- const bgColor = tokens.getColor(bg.color || "surface");
60953
- backgroundRules.push(`background-color: ${bgColor};`);
60954
- } else if (bg.type === "gradient" && bg.gradient) {
60955
- const stops = bg.gradient.stops.map((s) => tokens.getColor(s.color)).join(", ");
60956
- const angle = bg.gradient.angle ?? 180;
60957
- backgroundRules.push(`background-image: linear-gradient(${angle}deg, ${stops});`);
60958
- }
60959
- backgroundRules.push(`backdrop-filter: ${HEADER_BLUR};`);
60960
- backgroundRules.push(`-webkit-backdrop-filter: ${HEADER_BLUR};`);
60961
- if (header.border) {
60962
- const borderWidth = getComponentBorderWidthPx(header.border.width);
60963
- if (borderWidth !== "0") {
60964
- const borderToken = header.border?.colorToken?.trim() || "border";
60965
- const borderColor = tokens.getColor(borderToken);
60966
- const borderStyle = header.border.style === "dashed" ? "dashed" : "solid";
60967
- if (header.border.position === "bottom") rules.push(`border-bottom: ${borderWidth} ${borderStyle} ${borderColor};`);
60968
- else if (header.border.position === "top") rules.push(`border-top: ${borderWidth} ${borderStyle} ${borderColor};`);
60969
- else if (header.border.position === "both") {
60970
- rules.push(`border-top: ${borderWidth} ${borderStyle} ${borderColor};`);
60971
- rules.push(`border-bottom: ${borderWidth} ${borderStyle} ${borderColor};`);
60972
- }
60973
- }
60974
- }
60975
- }
60919
+ const surfaceRules = isContainedNav ? {
60920
+ base: [],
60921
+ scrolled: [],
60922
+ border: []
60923
+ } : buildHeaderSurfaceRules(header, tokens, HEADER_BLUR);
60924
+ const floatingSurfaceBorder = header.variant === "floating";
60925
+ if (!floatingSurfaceBorder) rules.push(...surfaceRules.border);
60926
+ const basePaintRules = floatingSurfaceBorder ? [...surfaceRules.base, ...surfaceRules.border] : surfaceRules.base;
60927
+ const scrolledPaintRules = floatingSurfaceBorder ? [...surfaceRules.scrolled, ...surfaceRules.border] : surfaceRules.scrolled;
60976
60928
  if (header.positioning === "sticky" || header.positioning === "fixed") {
60977
60929
  const shadowVar = getComponentShadowVar(header.shadow?.elevation ?? "none");
60978
60930
  if (shadowVar) rules.push(`box-shadow: ${shadowVar};`);
60979
60931
  }
60980
60932
  const baseBlock = `\n${selector} {\n ${rules.join("\n ")}\n}\n`;
60981
60933
  const overlayFix = `\n${`${selector}:has([data-nav-mobile-overlay][aria-hidden="false"])`} {\n backdrop-filter: none !important;\n -webkit-backdrop-filter: none !important;\n}\n`;
60982
- if (isContainedNav || backgroundRules.length === 0) return `${baseBlock}\n${overlayFix}`;
60983
- return `${baseBlock}\n${`\n${backgroundSelector} {\n content: \"\";\n position: absolute;\n inset: 0;\n pointer-events: none;\n border-radius: inherit;\n z-index: -1;\n ${backgroundRules.join("\n ")}\n}\n`}\n${overlayFix}${usesInsetShell(header) ? generateInsetShellStyles(header, themeId) : ""}`;
60934
+ const scrollTreatmentStyles = generateHeaderScrollTreatmentStyles(header.scrollTreatment, themeId, header.variant, scrolledPaintRules);
60935
+ if (isContainedNav || basePaintRules.length === 0) return `${baseBlock}\n${overlayFix}${scrollTreatmentStyles}`;
60936
+ return `${baseBlock}\n${renderHeaderPaintTargetRules(getHeaderPaintTargets(header.variant, themeId), basePaintRules)}\n${overlayFix}${usesInsetShell(header) ? generateInsetShellStyles(header, themeId) : ""}${scrollTreatmentStyles}`;
60984
60937
  }
60985
60938
  /**
60986
60939
  * Reshapes the full-bleed header paint layer into a contained brand capsule at
@@ -61025,10 +60978,10 @@ function generateLogoStyles(input) {
61025
60978
  else rules.push(`font-family: var(--font-heading);`);
61026
60979
  if (logo) {
61027
60980
  if (logo.letterSpacing && logo.letterSpacing !== "normal") rules.push(`letter-spacing: ${{
61028
- "normal": "0em",
61029
- "wide": "0.05em",
61030
- "wider": "0.1em",
61031
- "widest": "0.15em"
60981
+ normal: "0em",
60982
+ wide: "0.05em",
60983
+ wider: "0.1em",
60984
+ widest: "0.15em"
61032
60985
  }[logo.letterSpacing]};`);
61033
60986
  if (logo.gradient) {
61034
60987
  rules.push(`background: linear-gradient(to right, ${primaryColor}, ${accentColor});`);
@@ -61101,71 +61054,11 @@ function generateNavLinkStyles(header, themeId, tokens, theme, contrastTreatment
61101
61054
  } : header.navLinkStyle, navPreferences),
61102
61055
  className: "header-nav-link"
61103
61056
  });
61104
- const navStyle = header.navStyle ?? "minimal";
61105
- const basePreset = getNavLinkPreset(navStyle);
61106
- if (!basePreset) {
61107
- console.warn(`[generateHeaderCss] Nav link preset not found: ${navStyle}`);
61057
+ const mergedStyle = buildLegacyHeaderNavLinkStyle(header, contrastTreatment, navTextSize);
61058
+ if (!mergedStyle) {
61059
+ console.warn(`[generateHeaderCss] Nav link preset not found: ${header.navStyle}`);
61108
61060
  return "";
61109
61061
  }
61110
- const mergedStyle = {
61111
- ...basePreset,
61112
- fontWeight: header.navWeight ?? basePreset.fontWeight,
61113
- colorToken: (header.navColor ?? header.textColor)?.trim() || basePreset.colorToken,
61114
- ...contrastTreatment ? { contrastTreatment } : {},
61115
- ...navTextSize ? { textSize: navTextSize } : {}
61116
- };
61117
- if (header.navWeight === "bold" && navStyle === "solid") mergedStyle.textTransform = "uppercase";
61118
- if (header.navEffects) {
61119
- const effects = mergedStyle.effects = {
61120
- ...mergedStyle.effects,
61121
- hover: [...mergedStyle.effects?.hover || []],
61122
- active: [...mergedStyle.effects?.active || []]
61123
- };
61124
- if (header.navEffects.glow) effects.hover.push({
61125
- effectId: "outer-glow",
61126
- options: { spread: 5 }
61127
- });
61128
- if (header.navEffects.neumorphic) {
61129
- effects.hover.push({
61130
- effectId: "neumorphic-shadow",
61131
- options: { mode: "pressed" }
61132
- });
61133
- effects.hover.push({
61134
- effectId: "text-color-change",
61135
- options: { hoverColorToken: "primary" }
61136
- });
61137
- }
61138
- if (header.navEffects.underlineGradient) effects.hover.push({
61139
- effectId: "border-bottom-grow",
61140
- options: { origin: "center" }
61141
- });
61142
- }
61143
- if ((header.navContainer?.type ?? "none") === "glass" && navStyle === "minimal") {
61144
- mergedStyle.borderRadius = "full";
61145
- mergedStyle.effects = {
61146
- ...mergedStyle.effects,
61147
- hover: [{
61148
- effectId: "background-on-hover-alpha",
61149
- options: {
61150
- colorToken: "neutral-50",
61151
- opacity: 10
61152
- }
61153
- }, {
61154
- effectId: "text-color-change",
61155
- options: { hoverColorToken: "neutral-50" }
61156
- }],
61157
- active: [{
61158
- effectId: "background-on-hover-alpha",
61159
- options: {
61160
- colorToken: "neutral-50",
61161
- opacity: 18
61162
- }
61163
- }, {
61164
- effectId: "text-color-change",
61165
- options: { hoverColorToken: "neutral-50" }
61166
- }]
61167
- };
61168
- }
61169
61062
  return generateNavLinkCSS({
61170
61063
  themeId,
61171
61064
  tokens,
@@ -61193,10 +61086,10 @@ function generateDropdownContainerStyles(header, themeId, tokens) {
61193
61086
  if (shadowVar) rules.push(`box-shadow: ${shadowVar};`);
61194
61087
  const borderRadius = dropdownStyle?.borderRadius ?? "md";
61195
61088
  rules.push(`border-radius: ${{
61196
- "none": "0",
61197
- "sm": "0.25rem",
61198
- "md": "0.5rem",
61199
- "lg": "0.75rem"
61089
+ none: "0",
61090
+ sm: "0.25rem",
61091
+ md: "0.5rem",
61092
+ lg: "0.75rem"
61200
61093
  }[borderRadius]};`);
61201
61094
  rules.push(`padding: 0.5rem 0;`);
61202
61095
  return `\n${selector} {\n ${rules.join("\n ")}\n}\n`;
@@ -61251,16 +61144,16 @@ function generateDropdownLinkStyles(header, themeId, tokens, theme) {
61251
61144
  const additionalRules = [];
61252
61145
  const letterSpacing = configuredDropdownStyle?.letterSpacing ?? "normal";
61253
61146
  if (letterSpacing !== "normal") additionalRules.push(`letter-spacing: ${{
61254
- "normal": "0em",
61255
- "wide": "0.05em",
61256
- "wider": "0.1em"
61147
+ normal: "0em",
61148
+ wide: "0.05em",
61149
+ wider: "0.1em"
61257
61150
  }[letterSpacing]};`);
61258
61151
  const textSize = configuredDropdownStyle?.textSize ?? "sm";
61259
61152
  additionalRules.push(`font-size: ${{
61260
- "xs": "0.75rem",
61261
- "sm": "0.875rem",
61262
- "base": "1rem",
61263
- "lg": "1.125rem"
61153
+ xs: "0.75rem",
61154
+ sm: "0.875rem",
61155
+ base: "1rem",
61156
+ lg: "1.125rem"
61264
61157
  }[textSize]};`);
61265
61158
  if (additionalRules.length > 0) return baseCSS + `\n${`:where([data-theme-scope="${themeId}"]) .nav-dropdown-link`} {\n ${additionalRules.join("\n ")}\n}\n`;
61266
61159
  return baseCSS;
@@ -61356,18 +61249,18 @@ function generateFloatingContainerStyles(header, themeId, tokens) {
61356
61249
  rules.push(`-webkit-backdrop-filter: ${FLOATING_BLUR};`);
61357
61250
  if (container.border) rules.push(`border: 1px solid rgb(255 255 255 / 0.2);`);
61358
61251
  rules.push(`border-radius: ${{
61359
- "none": "0",
61360
- "sm": "0.375rem",
61361
- "md": "0.5rem",
61362
- "lg": "0.75rem",
61363
- "xl": "1rem",
61252
+ none: "0",
61253
+ sm: "0.375rem",
61254
+ md: "0.5rem",
61255
+ lg: "0.75rem",
61256
+ xl: "1rem",
61364
61257
  "2xl": "1.5rem"
61365
61258
  }[container.rounded]};`);
61366
61259
  if (container.shadow) rules.push(`box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);`);
61367
61260
  rules.push(`padding: ${{
61368
- "sm": "1rem 1.5rem",
61369
- "md": "1.5rem 2rem",
61370
- "lg": "2rem 2.5rem"
61261
+ sm: "1rem 1.5rem",
61262
+ md: "1.5rem 2rem",
61263
+ lg: "2rem 2.5rem"
61371
61264
  }[container.padding]};`);
61372
61265
  return `\n${selector} {\n ${rules.join("\n ")}\n}\n`;
61373
61266
  }
@@ -63965,7 +63858,7 @@ function sourceLabel(source) {
63965
63858
  case "managed-database": return "DB";
63966
63859
  case "sdk-synced": return "SDK-synced DB";
63967
63860
  case "sdk-config": return "SDK config";
63968
- default: return assertNever$25(source);
63861
+ default: return assertNever$24(source);
63969
63862
  }
63970
63863
  }
63971
63864
  //#endregion
@@ -83003,7 +82896,7 @@ function renderWithSdkThemeRuntime({ themeRuntime, theme, children }) {
83003
82896
  children
83004
82897
  });
83005
82898
  case "none": return /* @__PURE__ */ jsx(Fragment, { children });
83006
- default: return assertNever$25(themeRuntime);
82899
+ default: return assertNever$24(themeRuntime);
83007
82900
  }
83008
82901
  }
83009
82902
  //#endregion
@@ -84231,7 +84124,7 @@ var CircuitOpenError = class extends Error {
84231
84124
  * 1. This constant
84232
84125
  * 2. The "version" field in package.json
84233
84126
  */
84234
- const SDK_VERSION = "0.125.0";
84127
+ const SDK_VERSION = "0.127.0";
84235
84128
  //#endregion
84236
84129
  //#region src/next/content-load-failure.ts
84237
84130
  const SdkContentLoadError = RiverbankContentLoadError;