@riverbankcms/sdk 0.126.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 (126) hide show
  1. package/dist/{PreviewEditorSidebar-DcYJxTgc.mjs → PreviewEditorSidebar-BXtfF7tp.mjs} +58 -38
  2. package/dist/{PreviewEditorUI-Ctt1yTJr.mjs → PreviewEditorUI-Dou73Q0K.mjs} +2 -2
  3. package/dist/{SdkPreviewModeRuntime-CvW1vdQ4.mjs → SdkPreviewModeRuntime-B0HPXr-l.mjs} +119 -41
  4. package/dist/{SiteChromeCustomizeContext-C87qlKWw.mjs → SiteChromeCustomizeContext-DZiDBAYu.mjs} +9961 -9583
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +198 -0
  6. package/dist/_dts/api/src/contentRuntime.d.ts +1 -5
  7. package/dist/_dts/block-form/src/backend/store-backend.d.ts +2 -1
  8. package/dist/_dts/block-form/src/blockDraftSaveability.d.ts +1 -0
  9. package/dist/_dts/blocks/src/index.d.ts +3 -2
  10. package/dist/_dts/blocks/src/lib/media.d.ts +267 -0
  11. package/dist/_dts/blocks/src/system/constants/buttonRoles.d.ts +0 -13
  12. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +4 -4
  13. package/dist/_dts/blocks/src/system/runtime/nodes/mergeResolveImageUrlContexts.d.ts +7 -0
  14. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +2 -2
  15. package/dist/_dts/content-editor/src/ui/blockValidationManifestRegistry.d.ts +17 -0
  16. package/dist/_dts/content-editor/src/ui/blockValidationView.d.ts +1 -1
  17. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +4 -0
  18. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +143 -155
  19. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +4 -0
  20. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockValidationManifests.d.ts +26 -0
  21. package/dist/_dts/editor-blocks/src/widgets/rich-text/imageInsert.d.ts +3 -3
  22. package/dist/_dts/media-editor/src/MediaEditor.d.ts +2 -2
  23. package/dist/_dts/media-editor/src/context.d.ts +1 -2
  24. package/dist/_dts/media-editor/src/index.d.ts +3 -1
  25. package/dist/_dts/media-editor/src/mediaSelection.d.ts +32 -0
  26. package/dist/_dts/media-editor/src/types.d.ts +3 -1
  27. package/dist/_dts/media-editor/src/useMediaSelection.d.ts +26 -0
  28. package/dist/_dts/preview-next/src/client/index.d.ts +2 -0
  29. package/dist/_dts/preview-next/src/client/preview/HeaderMenuControls.d.ts +12 -0
  30. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +12 -1
  31. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +7 -1
  32. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +4 -49
  33. package/dist/_dts/preview-next/src/client/preview/headerInteractionPaletteSurfaceState.d.ts +8 -0
  34. package/dist/_dts/preview-next/src/client/preview/previewThemeRoles.d.ts +15 -0
  35. package/dist/_dts/preview-next/src/client/preview/siteChromeCustomizeTypes.d.ts +54 -0
  36. package/dist/_dts/preview-next/src/client/preview/siteChromeLookRows.d.ts +13 -3
  37. package/dist/_dts/preview-next/src/client/preview/siteChromeNavQuickControlHistory.d.ts +3 -0
  38. package/dist/_dts/preview-next/src/client/preview/siteChromeQuickControlHistoryState.d.ts +6 -3
  39. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +2 -2
  40. package/dist/_dts/sdk/src/version.d.ts +1 -1
  41. package/dist/_dts/theme-core/src/buttons/effects/presets/background.d.ts +1 -1
  42. package/dist/_dts/theme-core/src/buttons/styles/registry.d.ts +0 -18
  43. package/dist/_dts/theme-core/src/buttons/types.d.ts +1 -3
  44. package/dist/_dts/theme-core/src/header/containerSchema.d.ts +20 -0
  45. package/dist/_dts/theme-core/src/header/generateHeaderCss.d.ts +1 -1
  46. package/dist/_dts/theme-core/src/header/interactionPalette.d.ts +14 -0
  47. package/dist/_dts/theme-core/src/header/legacyNavLinkStyle.d.ts +3 -0
  48. package/dist/_dts/theme-core/src/header/paintTargets.d.ts +25 -0
  49. package/dist/_dts/theme-core/src/header/scrollTreatment.d.ts +11 -0
  50. package/dist/_dts/theme-core/src/header/surfaceRules.d.ts +9 -0
  51. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +15 -0
  52. package/dist/_dts/theme-core/src/palette/colors.d.ts +1 -1
  53. package/dist/_dts/theme-core/src/schema.d.ts +67 -19
  54. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +3 -51
  55. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +4 -11
  56. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +3 -51
  57. package/dist/_dts/theme-core/src/site-styles/headerInteractionPalette.d.ts +32 -0
  58. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +19 -106
  59. package/dist/_dts/theme-core/src/site-styles/headerOpeningForeground.d.ts +22 -0
  60. package/dist/_dts/theme-core/src/site-styles/headerOpeningSection.d.ts +2 -0
  61. package/dist/_dts/theme-core/src/site-styles/headerStyleParts.d.ts +4 -0
  62. package/dist/_dts/theme-core/src/site-styles/index.d.ts +3 -0
  63. package/dist/_dts/theme-core/src/site-styles/lookOptionGroups.d.ts +24 -0
  64. package/dist/_dts/theme-core/src/site-styles/lookResolution.d.ts +1 -2
  65. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +4 -22
  66. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorOptions.d.ts +21 -0
  67. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +1 -1
  68. package/dist/_dts/theme-core/src/site-styles/siteChromeNavPreferences.d.ts +4 -1
  69. package/dist/cli/index.mjs +973 -1081
  70. package/dist/client/{DiscountCodeDisclosure-DS0AuFWW.mjs → DiscountCodeDisclosure-BDFRp8Y7.mjs} +1 -1
  71. package/dist/client/{EventCombined.client-DtMxLr7q.mjs → EventCombined.client-DJgF1_lf.mjs} +2 -2
  72. package/dist/client/{EventListing.client-BdLSRNg1.mjs → EventListing.client-CnWGNjOr.mjs} +2 -2
  73. package/dist/client/{LeafletStaticMap-BrpC6vsT.mjs → LeafletStaticMap-BISs9Bl7.mjs} +1 -1
  74. package/dist/client/{MagicLinkForm-Bt3IuLMy.mjs → MagicLinkForm-b5E_HoG9.mjs} +1 -1
  75. package/dist/client/{StepIndicator-CBYPFVoy.mjs → StepIndicator-D8gVYkK-.mjs} +2 -2
  76. package/dist/client/{accordion-BqqwPJWM.mjs → accordion-DFDajgDz.mjs} +1 -1
  77. package/dist/client/{bookingForm-SneP3yxC.mjs → bookingForm-Bdqj9-52.mjs} +5 -5
  78. package/dist/client/bookings.mjs +126 -23
  79. package/dist/client/{carousel-BTIR9L3I.mjs → carousel-Cvqf-kN8.mjs} +1 -1
  80. package/dist/client/{cart-bqiqd8SX.mjs → cart-CuH2TJXP.mjs} +3 -3
  81. package/dist/client/{checkout-WbTFV5v4.mjs → checkout-CMNPpejZ.mjs} +3 -3
  82. package/dist/client/client.mjs +1227 -1209
  83. package/dist/client/{courseRegistration-BcemLAdN.mjs → courseRegistration-DTEYWL6Z.mjs} +6 -6
  84. package/dist/client/{eventCalendar-CsxIw0V_.mjs → eventCalendar-BW-XoxZ0.mjs} +4 -4
  85. package/dist/client/{eventCombined-B6XMoHfa.mjs → eventCombined-Bpn7s0y9.mjs} +2 -2
  86. package/dist/client/{eventDetails-BJaoPPfo.mjs → eventDetails-D2uUSTMH.mjs} +3 -3
  87. package/dist/client/{eventListing-DgwdYHRT.mjs → eventListing-CVr1c094.mjs} +2 -2
  88. package/dist/client/{eventRegistration-C0O3folu.mjs → eventRegistration-Dv4AvkMw.mjs} +6 -6
  89. package/dist/client/{form-Bk9txGFt.mjs → form-DxdKf9fs.mjs} +1 -1
  90. package/dist/client/{headerSection-yIBt0yTv.mjs → headerSection-BaXI5Sro.mjs} +2 -2
  91. package/dist/client/hooks.mjs +801 -874
  92. package/dist/client/{locationMap-C-3KIpv-.mjs → locationMap-BEtW2fKz.mjs} +2 -2
  93. package/dist/client/{newsletterForm-CzB8g8h2.mjs → newsletterForm-BKKs0S4R.mjs} +1 -1
  94. package/dist/client/{pricing-C1QeDes_.mjs → pricing-ClkqcElA.mjs} +1 -1
  95. package/dist/client/{productDetail-w7SBp5uc.mjs → productDetail-H-ru8dyy.mjs} +3 -3
  96. package/dist/client/{productList-D0tGKHGf.mjs → productList-Buyi5c0C.mjs} +3 -3
  97. package/dist/client/{propsDecoder-Bcin2DB3.mjs → propsDecoder-BF7i6Ijg.mjs} +127 -55
  98. package/dist/client/rendering/client.mjs +928 -916
  99. package/dist/client/rendering/islands.mjs +18 -18
  100. package/dist/client/rendering.mjs +1130 -1114
  101. package/dist/client/{scrollToBlock-h-o_STf_.mjs → scrollToBlock-D_7t8yWb.mjs} +1 -1
  102. package/dist/client/{shop-BGzmL8O_.mjs → shop-CF7SZQNX.mjs} +5 -5
  103. package/dist/client/{shop-commerce-lX8QxjX-.mjs → shop-commerce-DA7_Rq5p.mjs} +4 -4
  104. package/dist/client/{shop-commerce-store-CEurARtu.mjs → shop-commerce-store-BmLqW7Gh.mjs} +1 -1
  105. package/dist/client/{shopShared-DXxH8xxw.mjs → shopShared-WL-E1znM.mjs} +2 -2
  106. package/dist/client/{useEventFilters-B591g9vd.mjs → useEventFilters-rc8VLeLV.mjs} +2 -2
  107. package/dist/client/{usePolling-BvnChV4m.mjs → usePolling-1ncrfd4S.mjs} +2 -2
  108. package/dist/preview-next/client/runtime.mjs +3 -3
  109. package/dist/{sdk-runtime-M__i3Jce.mjs → sdk-runtime-BnrCCFJq.mjs} +1 -1
  110. package/dist/{separator-VSlnI9bc.mjs → separator-CFvBx2yl.mjs} +1 -1
  111. package/dist/server/components.mjs +1302 -1350
  112. package/dist/server/config-validation.mjs +801 -874
  113. package/dist/server/config.mjs +801 -874
  114. package/dist/server/data.mjs +801 -874
  115. package/dist/server/index.mjs +1 -1
  116. package/dist/server/next.mjs +1303 -1351
  117. package/dist/server/page-converter.mjs +801 -874
  118. package/dist/server/prebuild.mjs +1 -1
  119. package/dist/server/rendering/server.mjs +1296 -1344
  120. package/dist/server/rendering.mjs +1302 -1350
  121. package/dist/server/routing.mjs +869 -895
  122. package/dist/server/server.mjs +802 -875
  123. package/dist/server/theme-bridge.mjs +151 -118
  124. package/dist/server/theme.mjs +111 -23
  125. package/package.json +1 -1
  126. package/dist/_dts/editor-blocks/src/widgets/rich-text/ensureRichTextImageAssetIdentifier.d.ts +0 -8
@@ -11774,6 +11774,99 @@ function createRichTextDoc(paragraphs) {
11774
11774
  } : { type: "paragraph" })
11775
11775
  };
11776
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
+ ]);
11777
11870
  //#endregion
11778
11871
  //#region ../blocks/src/system/manifest/fieldValidation/index.ts
11779
11872
  const TEL_RE = /^[+()0-9\s-]{3,}$/;
@@ -12063,7 +12156,7 @@ function canonicalizeFieldValueForWrite(plan, value) {
12063
12156
  case "media": {
12064
12157
  if (!isPlainObject$5(value)) return value;
12065
12158
  const canonical = { ...value };
12066
- if (typeof canonical.identifier === "string" && canonical.identifier.trim().length > 0) deleteEnvSpecificKeys(canonical);
12159
+ if (mediaIdentifierSchema.safeParse(canonical.identifier).success) deleteEnvSpecificKeys(canonical);
12067
12160
  return canonical;
12068
12161
  }
12069
12162
  case "group": return canonicalizeObjectForWrite(selectedGroupChildPlans(plan, value), value);
@@ -12158,7 +12251,7 @@ function normalizeObjectChildren(children, value, ctx) {
12158
12251
  function normalizeInlineTextFallbacks(plans, values, ctx) {
12159
12252
  for (const plan of plans) {
12160
12253
  if (plan.kind !== "inlineText" || !plan.plainTextFallbackPath) continue;
12161
- if (!isMissingForPlan(plan, values[plan.fieldId])) continue;
12254
+ if (!isMissingForPlan(plan, values[plan.fieldId]) && !(ctx.allowIncomplete && !parseInlineTextFromUnknown(values[plan.fieldId]).ok)) continue;
12162
12255
  const fallback = getAtFieldPath(values, plan.plainTextFallbackPath);
12163
12256
  if (typeof fallback !== "string" || fallback.trim().length === 0) continue;
12164
12257
  values[plan.fieldId] = normalizeFieldValue(plan, plainTextToInlineText(fallback), ctx);
@@ -12199,7 +12292,7 @@ function validateNormalizedFieldValue(plan, value, ctx) {
12199
12292
  case "select": return validateSelectPlan(plan, value);
12200
12293
  case "richText": return isValidRichTextDoc(value) ? [] : [issue(plan, "invalidRichText")];
12201
12294
  case "inlineText": return validateInlineTextPlan(plan, value);
12202
- 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")];
12203
12296
  case "link": return linkSchema.safeParse(value).success ? [] : [issue(plan, "invalidLink")];
12204
12297
  case "repeater": return validateRepeaterPlan(plan, value, ctx);
12205
12298
  case "group": return validateGroupPlan(plan, value, ctx);
@@ -12918,6 +13011,17 @@ function asAccessibleSurfaceToken(token) {
12918
13011
  return token;
12919
13012
  }
12920
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
12921
13025
  //#region ../theme-core/src/site-styles/types.ts
12922
13026
  /**
12923
13027
  * Defines a literal-preserving catalog while rejecting top-level extra keys on
@@ -13063,767 +13167,655 @@ function defineBlockDesignCapability(capability) {
13063
13167
  //#region ../theme-core/src/site-styles/appearancePresetResolution.ts
13064
13168
  function assertValidOptionGroups(preset) {
13065
13169
  preset.optionGroups?.forEach((group) => {
13066
- 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);
13067
13171
  });
13068
13172
  }
13069
13173
  function defineBlockAppearancePreset(preset) {
13070
13174
  assertValidOptionGroups(preset);
13071
13175
  return preset;
13072
13176
  }
13073
- [...[
13074
- defineBlockAppearancePreset({
13075
- kind: "block-design",
13076
- id: "hero-immersive-image",
13077
- target: "hero",
13078
- label: "Immersive image hero",
13079
- blockKinds: ["block.hero"],
13080
- constraints: { layoutFamilies: ["centered", "compact"] },
13081
- layoutPatches: [{
13082
- constraints: { layoutVariantKeys: ["micro"] },
13083
- designPatch: {
13084
- sectionHeight: "banner",
13085
- heroTypographyScale: "display"
13086
- }
13087
- }],
13088
- design: {
13089
- sectionSurface: "hero-image",
13090
- contentFrame: plainFrame,
13091
- itemSurface: "none",
13092
- sectionHeight: "hero",
13093
- heroComposition: "center",
13094
- heroTypographyScale: "display",
13095
- 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"
13096
13211
  }
13097
- }),
13098
- defineBlockAppearancePreset({
13099
- kind: "block-design",
13100
- id: "hero-bottom-left-panel",
13101
- target: "hero",
13102
- label: "Bottom-left panel hero",
13103
- blockKinds: ["block.hero"],
13104
- constraints: { layoutFamilies: ["centered", "compact"] },
13105
- optionGroups: [{
13106
- id: "image-surface-treatment",
13107
- label: "Treatment",
13108
- selectedOptionId: "neutral-scrim",
13109
- options: [{
13110
- id: "neutral-scrim",
13111
- label: "Neutral scrim",
13112
- designPatch: { imageSurfaceTreatment: {
13113
- kind: "neutral-scrim",
13114
- intensity: "balanced"
13115
- } }
13116
- }, {
13117
- id: "brand-scrim-primary",
13118
- label: "Brand scrim",
13119
- designPatch: { imageSurfaceTreatment: {
13120
- kind: "brand-scrim",
13121
- token: "primary",
13122
- intensity: "balanced"
13123
- } }
13124
- }]
13125
- }],
13126
- layoutPatches: [{
13127
- constraints: { layoutVariantKeys: ["micro"] },
13128
- designPatch: {
13129
- sectionHeight: "banner",
13130
- heroTypographyScale: "editorial"
13131
- }
13132
- }],
13133
- design: {
13134
- sectionSurface: "hero-image",
13135
- contentFrame: panelFrame("raised"),
13136
- itemSurface: "none",
13137
- sectionHeight: "immersive",
13138
- heroComposition: "bottom-left",
13139
- heroTypographyScale: "display",
13140
- 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: {
13141
13236
  kind: "neutral-scrim",
13142
13237
  intensity: "balanced"
13143
- }
13144
- }
13145
- }),
13146
- defineBlockAppearancePreset({
13147
- kind: "block-design",
13148
- id: "hero-poster-image",
13149
- target: "hero",
13150
- label: "Poster image hero",
13151
- blockKinds: ["block.hero"],
13152
- constraints: { layoutFamilies: ["centered", "compact"] },
13153
- layoutPatches: [{
13154
- constraints: { layoutVariantKeys: ["micro"] },
13155
- designPatch: {
13156
- sectionHeight: "banner",
13157
- heroTypographyScale: "display"
13158
- }
13159
- }],
13160
- design: {
13161
- sectionSurface: "hero-image",
13162
- contentFrame: plainFrame,
13163
- itemSurface: "none",
13164
- sectionHeight: "immersive",
13165
- heroComposition: "center",
13166
- heroTypographyScale: "poster",
13167
- imageSurfaceTreatment: {
13238
+ } }
13239
+ }, {
13240
+ id: "brand-scrim-primary",
13241
+ label: "Brand scrim",
13242
+ designPatch: { imageSurfaceTreatment: {
13168
13243
  kind: "brand-scrim",
13169
13244
  token: "primary",
13170
- intensity: "strong"
13171
- }
13172
- }
13173
- }),
13174
- defineBlockAppearancePreset({
13175
- kind: "block-design",
13176
- id: "hero-brand-scrim",
13177
- target: "hero",
13178
- label: "Brand scrim image hero",
13179
- blockKinds: ["block.hero"],
13180
- constraints: { layoutFamilies: ["centered", "compact"] },
13181
- optionGroups: [{
13182
- id: "image-surface-treatment",
13183
- label: "Treatment",
13184
- selectedOptionId: "brand-scrim-primary",
13185
- options: [{
13186
- id: "brand-scrim-primary",
13187
- label: "Brand scrim",
13188
- designPatch: { imageSurfaceTreatment: {
13189
- kind: "brand-scrim",
13190
- token: "primary"
13191
- } }
13192
- }, {
13193
- id: "neutral-scrim",
13194
- label: "Neutral scrim",
13195
- designPatch: { imageSurfaceTreatment: { kind: "neutral-scrim" } }
13196
- }]
13197
- }],
13198
- layoutPatches: [{
13199
- constraints: { layoutVariantKeys: ["micro"] },
13200
- designPatch: { sectionHeight: "banner" }
13201
- }],
13202
- design: {
13203
- sectionSurface: "hero-image",
13204
- contentFrame: plainFrame,
13205
- itemSurface: "none",
13206
- sectionHeight: "immersive",
13207
- heroComposition: "center",
13208
- heroTypographyScale: "display",
13209
- imageSurfaceTreatment: {
13210
- kind: "brand-scrim",
13211
- token: "primary"
13212
- }
13213
- }
13214
- }),
13215
- defineBlockAppearancePreset({
13216
- kind: "block-design",
13217
- id: "hero-brand-scrim-fixed-frame",
13218
- target: "hero",
13219
- label: "Fixed-frame brand scrim hero",
13220
- blockKinds: ["block.hero"],
13221
- constraints: { layoutFamilies: ["centered", "compact"] },
13222
- optionGroups: [{
13223
- id: "image-surface-treatment",
13224
- label: "Treatment",
13225
- selectedOptionId: "brand-scrim-primary",
13226
- options: [{
13227
- id: "brand-scrim-primary",
13228
- label: "Brand scrim",
13229
- designPatch: { imageSurfaceTreatment: {
13230
- kind: "brand-scrim",
13231
- token: "primary"
13232
- } }
13233
- }, {
13234
- id: "neutral-scrim",
13235
- label: "Neutral scrim",
13236
- designPatch: { imageSurfaceTreatment: { kind: "neutral-scrim" } }
13237
- }]
13238
- }],
13239
- layoutPatches: [{
13240
- constraints: { layoutVariantKeys: ["micro"] },
13241
- designPatch: { sectionHeight: "banner" }
13242
- }],
13243
- design: {
13244
- sectionSurface: "hero-image",
13245
- contentFrame: plainFrame,
13246
- itemSurface: "none",
13247
- sectionHeight: "immersive",
13248
- heroComposition: "center",
13249
- heroTypographyScale: "display",
13250
- imageSurfaceTreatment: {
13251
- kind: "brand-scrim",
13252
- token: "primary"
13253
- },
13254
- imageSurfaceMotion: "fixed-frame",
13255
- eyebrowTreatment: "accent-pill-bounce"
13256
- }
13257
- }),
13258
- defineBlockAppearancePreset({
13259
- kind: "block-design",
13260
- id: "hero-brand-depth-expressive",
13261
- target: "hero",
13262
- label: "Expressive brand-depth hero",
13263
- blockKinds: ["block.hero"],
13264
- constraints: { layoutFamilies: ["centered", "compact"] },
13265
- design: {
13266
- sectionSurface: "brand-depth-band",
13267
- contentFrame: plainFrame,
13268
- itemSurface: "none",
13269
- heroComposition: "center",
13270
- heroTypographyScale: "editorial",
13271
- eyebrowTreatment: "accent-pill-bounce"
13272
- }
13273
- }),
13274
- defineBlockAppearancePreset({
13275
- kind: "block-design",
13276
- id: "hero-contained-intro",
13277
- target: "hero",
13278
- label: "Contained intro hero",
13279
- blockKinds: ["block.hero"],
13280
- design: {
13281
- sectionSurface: "muted-band",
13282
- contentFrame: panelFrame("inset"),
13283
- itemSurface: "none",
13284
- heroComposition: "center",
13285
- heroTypographyScale: "editorial"
13286
- }
13287
- }),
13288
- defineBlockAppearancePreset({
13289
- kind: "block-design",
13290
- id: "hero-split-editorial",
13291
- target: "hero",
13292
- label: "Editorial split hero",
13293
- blockKinds: ["block.hero"],
13294
- constraints: { layoutFamilies: ["split"] },
13295
- design: {
13296
- sectionSurface: "base",
13297
- contentFrame: plainFrame,
13298
- itemSurface: "none",
13299
- heroTypographyScale: "editorial"
13300
- }
13301
- }),
13302
- defineBlockAppearancePreset({
13303
- kind: "block-design",
13304
- id: "hero-split-brand",
13305
- target: "hero",
13306
- label: "Brand split hero",
13307
- blockKinds: ["block.hero"],
13308
- constraints: { layoutFamilies: ["split"] },
13309
- design: {
13310
- sectionSurface: "brand-depth-band",
13311
- contentFrame: plainFrame,
13312
- itemSurface: "none",
13313
- heroTypographyScale: "display",
13314
- eyebrowTreatment: "accent-pill-bounce"
13315
- }
13316
- }),
13317
- defineBlockAppearancePreset({
13318
- kind: "block-design",
13319
- id: "hero-split-soft-panel",
13320
- target: "hero",
13321
- label: "Soft panel split hero",
13322
- blockKinds: ["block.hero"],
13323
- constraints: { layoutFamilies: ["split"] },
13324
- design: {
13325
- sectionSurface: "muted-band",
13326
- contentFrame: panelFrame("raised"),
13327
- itemSurface: "none",
13245
+ intensity: "balanced"
13246
+ } }
13247
+ }]
13248
+ }],
13249
+ layoutPatches: [{
13250
+ constraints: { layoutVariantKeys: ["micro"] },
13251
+ designPatch: {
13252
+ sectionHeight: "banner",
13328
13253
  heroTypographyScale: "editorial"
13329
13254
  }
13330
- }),
13331
- defineBlockAppearancePreset({
13332
- kind: "block-design",
13333
- id: "hero-split-accent",
13334
- target: "hero",
13335
- label: "Accent split hero",
13336
- blockKinds: ["block.hero"],
13337
- constraints: { layoutFamilies: ["split"] },
13338
- design: {
13339
- sectionSurface: "accent-band",
13340
- contentFrame: panelFrame("raised"),
13341
- 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",
13342
13278
  heroTypographyScale: "display"
13343
13279
  }
13344
- }),
13345
- defineBlockAppearancePreset({
13346
- kind: "block-design",
13347
- id: "intro-editorial-statement",
13348
- target: "intro",
13349
- label: "Editorial intro statement",
13350
- blockKinds: ["block.intro"],
13351
- constraints: { layoutVariantKeys: ["centered-copy", "statement-copy"] },
13352
- design: {
13353
- sectionSurface: "base",
13354
- contentFrame: plainFrame,
13355
- itemSurface: "none",
13356
- composition: {
13357
- kind: "intro",
13358
- treatment: "editorial-statement"
13359
- }
13360
- }
13361
- }),
13362
- defineBlockAppearancePreset({
13363
- kind: "block-design",
13364
- id: "intro-portrait-bio",
13365
- target: "intro",
13366
- label: "Portrait and bio",
13367
- blockKinds: ["block.intro"],
13368
- constraints: { layoutVariantKeys: ["media-copy"] },
13369
- design: {
13370
- sectionSurface: "base",
13371
- contentFrame: plainFrame,
13372
- itemSurface: "none",
13373
- composition: {
13374
- kind: "intro",
13375
- treatment: "portrait-bio"
13376
- }
13377
- }
13378
- }),
13379
- defineBlockAppearancePreset({
13380
- kind: "block-design",
13381
- id: "offerings-preview-default-cards",
13382
- target: "offerings",
13383
- label: "Default offering cards",
13384
- blockKinds: ["block.offerings-preview"],
13385
- design: {
13386
- sectionSurface: "base",
13387
- contentFrame: plainFrame,
13388
- itemSurface: "default"
13389
- }
13390
- }),
13391
- defineBlockAppearancePreset({
13392
- kind: "block-design",
13393
- id: "offerings-preview-secondary-cards",
13394
- target: "offerings",
13395
- label: "Secondary offering cards",
13396
- blockKinds: ["block.offerings-preview"],
13397
- design: {
13398
- sectionSurface: "muted-band",
13399
- contentFrame: plainFrame,
13400
- itemSurface: "inset"
13401
- }
13402
- }),
13403
- defineBlockAppearancePreset({
13404
- kind: "block-design",
13405
- id: "offerings-preview-non-carded",
13406
- target: "offerings",
13407
- label: "Non-carded offerings",
13408
- blockKinds: ["block.offerings-preview"],
13409
- design: {
13410
- sectionSurface: "muted-band",
13411
- contentFrame: plainFrame,
13412
- itemSurface: "editorial"
13413
- }
13414
- }),
13415
- defineBlockAppearancePreset({
13416
- kind: "block-design",
13417
- id: "offerings-preview-paired-feature-cards",
13418
- target: "offerings",
13419
- label: "Paired feature cards",
13420
- blockKinds: ["block.offerings-preview"],
13421
- constraints: { layoutVariantKeys: ["cards"] },
13422
- design: {
13423
- sectionSurface: "base",
13424
- contentFrame: plainFrame,
13425
- itemSurface: "none"
13426
- }
13427
- }),
13428
- defineBlockAppearancePreset({
13429
- kind: "block-design",
13430
- id: "offerings-preview-open-editorial-columns",
13431
- target: "offerings",
13432
- label: "Open editorial columns",
13433
- blockKinds: ["block.offerings-preview"],
13434
- constraints: { layoutVariantKeys: ["cards"] },
13435
- design: {
13436
- sectionSurface: "base",
13437
- contentFrame: plainFrame,
13438
- itemSurface: "none"
13439
- }
13440
- }),
13441
- defineBlockAppearancePreset({
13442
- kind: "block-design",
13443
- id: "offerings-preview-joined-programme-panel",
13444
- target: "offerings",
13445
- label: "Joined programme panel",
13446
- blockKinds: ["block.offerings-preview"],
13447
- constraints: { layoutVariantKeys: ["cards"] },
13448
- design: {
13449
- sectionSurface: "base",
13450
- contentFrame: plainFrame,
13451
- itemSurface: "none"
13452
- }
13453
- }),
13454
- defineBlockAppearancePreset({
13455
- kind: "block-design",
13456
- id: "feature-cards-raised-rule",
13457
- target: "feature-cards",
13458
- label: "Raised cards with rule",
13459
- blockKinds: ["block.feature-cards"],
13460
- design: {
13461
- sectionSurface: "base",
13462
- contentFrame: plainFrame,
13463
- itemSurface: "raised"
13464
- }
13465
- }),
13466
- defineBlockAppearancePreset({
13467
- kind: "block-design",
13468
- id: "feature-cards-bold-colors",
13469
- target: "feature-cards",
13470
- label: "Bold colour-blocked cards",
13471
- blockKinds: ["block.feature-cards"],
13472
- design: {
13473
- sectionSurface: "base",
13474
- contentFrame: plainFrame,
13475
- itemSurface: "color-blocked"
13476
- }
13477
- }),
13478
- defineBlockAppearancePreset({
13479
- kind: "block-design",
13480
- id: "feature-cards-editorial-columns",
13481
- target: "feature-cards",
13482
- label: "Editorial open columns",
13483
- blockKinds: ["block.feature-cards"],
13484
- design: {
13485
- sectionSurface: "base",
13486
- contentFrame: plainFrame,
13487
- itemSurface: "editorial"
13488
- }
13489
- }),
13490
- defineBlockAppearancePreset({
13491
- kind: "block-design",
13492
- id: "feature-cards-asymmetric-emphasis",
13493
- target: "feature-cards",
13494
- label: "Asymmetric emphasis pair",
13495
- blockKinds: ["block.feature-cards"],
13496
- constraints: { layoutFamilies: ["grid"] },
13497
- design: {
13498
- sectionSurface: "base",
13499
- contentFrame: plainFrame,
13500
- itemSurface: "none",
13501
- composition: {
13502
- kind: "feature-cards",
13503
- treatment: "asymmetric-emphasis"
13504
- }
13505
- }
13506
- }),
13507
- defineBlockAppearancePreset({
13508
- kind: "block-design",
13509
- id: "feature-cards-framed-programme",
13510
- target: "feature-cards",
13511
- label: "Framed programme cards",
13512
- blockKinds: ["block.feature-cards"],
13513
- constraints: { layoutFamilies: ["grid"] },
13514
- design: {
13515
- sectionSurface: "brand-depth-band",
13516
- contentFrame: plainFrame,
13517
- itemSurface: "inset",
13518
- composition: {
13519
- kind: "feature-cards",
13520
- treatment: "framed-programme"
13521
- }
13522
- }
13523
- }),
13524
- defineBlockAppearancePreset({
13525
- kind: "block-design",
13526
- id: "feature-cards-soft-panels",
13527
- target: "feature-cards",
13528
- label: "Soft tinted panels",
13529
- blockKinds: ["block.feature-cards"],
13530
- design: {
13531
- sectionSurface: "base",
13532
- contentFrame: plainFrame,
13533
- itemSurface: "inset"
13534
- }
13535
- }),
13536
- defineBlockAppearancePreset({
13537
- kind: "block-design",
13538
- id: "feature-cards-editorial-diptych",
13539
- target: "feature-cards",
13540
- label: "Editorial diptych",
13541
- blockKinds: ["block.feature-cards"],
13542
- constraints: { layoutVariantKeys: ["editorial-diptych"] },
13543
- design: {
13544
- sectionSurface: "base",
13545
- contentFrame: plainFrame,
13546
- itemSurface: "flat"
13547
- }
13548
- }),
13549
- defineBlockAppearancePreset({
13550
- kind: "block-design",
13551
- id: "feature-cards-editorial-pathways",
13552
- target: "feature-cards",
13553
- label: "Editorial pathways",
13554
- blockKinds: ["block.feature-cards"],
13555
- constraints: { layoutVariantKeys: ["editorial-pathways"] },
13556
- design: {
13557
- sectionSurface: "base",
13558
- contentFrame: plainFrame,
13559
- itemSurface: "flat"
13560
- }
13561
- }),
13562
- defineBlockAppearancePreset({
13563
- kind: "block-design",
13564
- id: "feature-cards-photo-tiles",
13565
- target: "feature-cards",
13566
- label: "Photo tiles",
13567
- blockKinds: ["block.feature-cards"],
13568
- design: {
13569
- sectionSurface: "base",
13570
- contentFrame: plainFrame,
13571
- itemSurface: "raised"
13572
- }
13573
- }),
13574
- defineBlockAppearancePreset({
13575
- kind: "block-design",
13576
- id: "events-lined-panel",
13577
- target: "events",
13578
- label: "Raised event panel",
13579
- blockKinds: ["block.event-calendar", "block.event-listing"],
13580
- design: {
13581
- sectionSurface: "base",
13582
- contentFrame: panelFrame("raised"),
13583
- itemSurface: "none"
13584
- }
13585
- }),
13586
- defineBlockAppearancePreset({
13587
- kind: "block-design",
13588
- id: "events-ruled-register",
13589
- target: "events",
13590
- label: "Ruled event register",
13591
- blockKinds: ["block.event-calendar", "block.event-listing"],
13592
- design: {
13593
- sectionSurface: "brand-depth-band",
13594
- contentFrame: plainFrame,
13595
- itemSurface: "none",
13596
- eventListTreatment: "ruled-register"
13597
- }
13598
- }),
13599
- defineBlockAppearancePreset({
13600
- kind: "block-design",
13601
- id: "events-editorial-register",
13602
- target: "events",
13603
- label: "Editorial event register",
13604
- blockKinds: ["block.event-calendar", "block.event-listing"],
13605
- design: {
13606
- sectionSurface: "base",
13607
- contentFrame: plainFrame,
13608
- itemSurface: "none",
13609
- eventListTreatment: "editorial-register"
13610
- }
13611
- }),
13612
- defineBlockAppearancePreset({
13613
- kind: "block-design",
13614
- id: "events-dense-index",
13615
- target: "events",
13616
- label: "Dense event index",
13617
- blockKinds: ["block.event-calendar", "block.event-listing"],
13618
- design: {
13619
- sectionSurface: "accent-band",
13620
- contentFrame: plainFrame,
13621
- itemSurface: "none",
13622
- eventListTreatment: "dense-index"
13623
- }
13624
- }),
13625
- defineBlockAppearancePreset({
13626
- kind: "block-design",
13627
- id: "schedule-details-brand-depth",
13628
- target: "events",
13629
- label: "Brand-depth schedule details",
13630
- blockKinds: ["block.event-details", "block.course-details"],
13631
- design: {
13632
- sectionSurface: "brand-depth-band",
13633
- contentFrame: plainFrame,
13634
- itemSurface: "none",
13635
- tileTreatment: "brand-depth"
13636
- }
13637
- }),
13638
- defineBlockAppearancePreset({
13639
- kind: "block-design",
13640
- id: "media-text-flush-feature",
13641
- target: "media-text",
13642
- label: "Flush media feature",
13643
- blockKinds: ["block.media-text"],
13644
- design: {
13645
- sectionSurface: "muted-band",
13646
- contentFrame: flushPanelFrame({ bleed: "start" }),
13647
- itemSurface: "none"
13648
- }
13649
- }),
13650
- defineBlockAppearancePreset({
13651
- kind: "block-design",
13652
- id: "testimonials-simple-cards",
13653
- target: "testimonials",
13654
- label: "Simple testimonial cards",
13655
- blockKinds: ["block.testimonials"],
13656
- design: {
13657
- sectionSurface: "base",
13658
- contentFrame: plainFrame,
13659
- itemSurface: "default"
13660
- }
13661
- }),
13662
- defineBlockAppearancePreset({
13663
- kind: "block-design",
13664
- id: "testimonials-raised-panel",
13665
- target: "testimonials",
13666
- label: "Raised testimonial panel",
13667
- blockKinds: ["block.testimonials"],
13668
- design: {
13669
- sectionSurface: "muted-band",
13670
- contentFrame: panelFrame("raised"),
13671
- itemSurface: "raised"
13672
- }
13673
- }),
13674
- defineBlockAppearancePreset({
13675
- kind: "block-design",
13676
- id: "testimonials-accent-panel",
13677
- target: "testimonials",
13678
- label: "Accent testimonial panel",
13679
- blockKinds: ["block.testimonials"],
13680
- design: {
13681
- sectionSurface: "accent-band",
13682
- contentFrame: panelFrame("raised"),
13683
- itemSurface: "raised"
13684
- }
13685
- }),
13686
- defineBlockAppearancePreset({
13687
- kind: "block-design",
13688
- id: "testimonials-default-cards",
13689
- target: "testimonials",
13690
- label: "Default cards",
13691
- blockKinds: ["block.testimonials"],
13692
- design: {
13693
- sectionSurface: "base",
13694
- contentFrame: plainFrame,
13695
- itemSurface: "none",
13696
- testimonialCardTreatment: "default"
13697
- }
13698
- }),
13699
- defineBlockAppearancePreset({
13700
- kind: "block-design",
13701
- id: "testimonials-statement-cards",
13702
- target: "testimonials",
13703
- label: "Statement cards",
13704
- blockKinds: ["block.testimonials"],
13705
- design: {
13706
- sectionSurface: "accent-band",
13707
- contentFrame: plainFrame,
13708
- itemSurface: "raised",
13709
- testimonialCardTreatment: "statement"
13710
- }
13711
- }),
13712
- defineBlockAppearancePreset({
13713
- kind: "block-design",
13714
- id: "testimonials-brand-statement-cards",
13715
- target: "testimonials",
13716
- label: "Brand statement cards",
13717
- blockKinds: ["block.testimonials"],
13718
- design: {
13719
- sectionSurface: "brand-depth-band",
13720
- contentFrame: plainFrame,
13721
- itemSurface: "raised",
13722
- testimonialCardTreatment: "statement"
13723
- }
13724
- }),
13725
- defineBlockAppearancePreset({
13726
- kind: "block-design",
13727
- id: "testimonials-non-carded",
13728
- target: "testimonials",
13729
- label: "Non-carded",
13730
- blockKinds: ["block.testimonials"],
13731
- design: {
13732
- sectionSurface: "muted-band",
13733
- contentFrame: plainFrame,
13734
- itemSurface: "none",
13735
- testimonialCardTreatment: "non-carded"
13736
- }
13737
- }),
13738
- defineBlockAppearancePreset({
13739
- kind: "block-design",
13740
- id: "testimonials-evergreen-lead",
13741
- target: "testimonials",
13742
- label: "Evergreen lead",
13743
- blockKinds: ["block.testimonials"],
13744
- constraints: { layoutVariantKeys: ["featured-editorial"] },
13745
- design: {
13746
- sectionSurface: "base",
13747
- contentFrame: plainFrame,
13748
- itemSurface: "none"
13749
- }
13750
- }),
13751
- defineBlockAppearancePreset({
13752
- kind: "block-design",
13753
- id: "testimonials-room-and-response",
13754
- target: "testimonials",
13755
- label: "Room and response",
13756
- blockKinds: ["block.testimonials"],
13757
- constraints: { layoutVariantKeys: ["featured-editorial"] },
13758
- design: {
13759
- sectionSurface: "base",
13760
- contentFrame: plainFrame,
13761
- itemSurface: "none"
13762
- }
13763
- }),
13764
- defineBlockAppearancePreset({
13765
- kind: "block-design",
13766
- id: "testimonials-open-floor",
13767
- target: "testimonials",
13768
- label: "Open floor",
13769
- blockKinds: ["block.testimonials"],
13770
- constraints: { layoutVariantKeys: ["featured-editorial"] },
13771
- design: {
13772
- sectionSurface: "base",
13773
- contentFrame: plainFrame,
13774
- itemSurface: "none"
13775
- }
13776
- }),
13777
- defineBlockAppearancePreset({
13778
- kind: "block-design",
13779
- id: "faq-base-accordion",
13780
- target: "faq",
13781
- label: "Base accordion FAQ",
13782
- blockKinds: ["block.faq"],
13783
- design: {
13784
- sectionSurface: "base",
13785
- contentFrame: plainFrame,
13786
- itemSurface: "default"
13787
- }
13788
- }),
13789
- defineBlockAppearancePreset({
13790
- kind: "block-design",
13791
- id: "faq-contained-help",
13792
- target: "faq",
13793
- label: "Contained help panel",
13794
- blockKinds: ["block.faq"],
13795
- design: {
13796
- sectionSurface: "muted-band",
13797
- contentFrame: panelFrame("inset"),
13798
- itemSurface: "default"
13799
- }
13800
- }),
13801
- defineBlockAppearancePreset({
13802
- kind: "block-design",
13803
- id: "contact-form-panel",
13804
- target: "contact-form",
13805
- label: "Raised form panel",
13806
- blockKinds: ["block.form"],
13807
- design: {
13808
- sectionSurface: "muted-band",
13809
- contentFrame: panelFrame("raised"),
13810
- itemSurface: "none"
13811
- }
13812
- }),
13813
- defineBlockAppearancePreset({
13814
- kind: "block-design",
13815
- id: "cta-accent-band",
13816
- target: "cta",
13817
- label: "Accent CTA band",
13818
- blockKinds: ["block.cta-full"],
13819
- design: {
13820
- sectionSurface: "accent-band",
13821
- contentFrame: plainFrame,
13822
- itemSurface: "none",
13823
- eyebrowTreatment: "accent"
13824
- }
13825
- })
13826
- ]];
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
+ });
13827
13819
  //#endregion
13828
13820
  //#region ../theme-core/src/site-styles/headerCtaVariants.ts
13829
13821
  function hasButtonVariant(theme, variantId) {
@@ -15337,7 +15329,7 @@ function canonicalPaletteHashInput(colors, mode) {
15337
15329
  return `${mode}|${paletteColorFingerprint(colors)}`;
15338
15330
  }
15339
15331
  /**
15340
- * The shared TypeScript/SQL protocol. Do not reorder roles: the order comes
15332
+ * Stable curated-catalogue identity. Do not reorder roles: the order comes
15341
15333
  * from PALETTE_TOKEN_NAMES through canonicalPaletteHashInput.
15342
15334
  */
15343
15335
  function paletteValueKey(colors, mode) {
@@ -16907,6 +16899,32 @@ function parseBackgroundAppearanceColorToken(value) {
16907
16899
  function uniqueStrings(values) {
16908
16900
  return Array.from(new Set(values));
16909
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
+ });
16910
16928
  //#endregion
16911
16929
  //#region ../theme-core/src/site-styles/logoBranding.ts
16912
16930
  const logoTextConfidenceValues = [
@@ -17129,7 +17147,7 @@ const overlayLogoAccommodations = [
17129
17147
  * optional nested styling fields that would otherwise leak from another Look.
17130
17148
  */
17131
17149
  function baseHeader(theme) {
17132
- 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;
17133
17151
  return {
17134
17152
  ...header,
17135
17153
  navContainer: {
@@ -17144,7 +17162,6 @@ const headerLayoutCatalog = defineExactCatalog()([
17144
17162
  id: asHeaderLayoutId("classic"),
17145
17163
  label: "Classic",
17146
17164
  description: "Logo and navigation in one practical horizontal row.",
17147
- structure: "inline-classic",
17148
17165
  variant: "classic",
17149
17166
  defaultPositioning: "sticky",
17150
17167
  shrinkOnScroll: false
@@ -17153,7 +17170,6 @@ const headerLayoutCatalog = defineExactCatalog()([
17153
17170
  id: asHeaderLayoutId("centered"),
17154
17171
  label: "Centered",
17155
17172
  description: "Logo centered above a balanced navigation row.",
17156
- structure: "centered-stack",
17157
17173
  variant: "centered",
17158
17174
  defaultPositioning: "static",
17159
17175
  shrinkOnScroll: false,
@@ -17169,7 +17185,6 @@ const headerLayoutCatalog = defineExactCatalog()([
17169
17185
  id: asHeaderLayoutId("floating"),
17170
17186
  label: "Floating",
17171
17187
  description: "Detached header chrome that sits over the opening section.",
17172
- structure: "floating-shell",
17173
17188
  variant: "floating",
17174
17189
  defaultPositioning: "sticky",
17175
17190
  shrinkOnScroll: true,
@@ -17331,10 +17346,13 @@ const headerStyleCatalog = defineExactCatalog()([
17331
17346
  label: "Clear Split",
17332
17347
  description: "Floating logo with transparent navigation and no shared shell.",
17333
17348
  supportedLayoutIds: supportedLayouts(["floating"]),
17334
- navInteraction: "color-change",
17349
+ navInteraction: "pill-background",
17335
17350
  surface: "floating",
17336
- defaultDepth: "none",
17351
+ defaultDepth: "line",
17337
17352
  navTypography: "plain",
17353
+ openingForegroundTarget: "all",
17354
+ scrollTreatment: "contrast-glass",
17355
+ interactionPalette: clearSplitInteractionPalette,
17338
17356
  moods: ["editorial", "calm"]
17339
17357
  },
17340
17358
  {
@@ -17357,6 +17375,7 @@ const headerStyleCatalog = defineExactCatalog()([
17357
17375
  surface: "floating",
17358
17376
  defaultDepth: "shadow",
17359
17377
  navTypography: "quiet-caps",
17378
+ openingForegroundTarget: "brand-only",
17360
17379
  moods: ["expressive"]
17361
17380
  },
17362
17381
  {
@@ -17368,6 +17387,7 @@ const headerStyleCatalog = defineExactCatalog()([
17368
17387
  surface: "floating",
17369
17388
  defaultDepth: "shadow",
17370
17389
  navTypography: "heading",
17390
+ openingForegroundTarget: "brand-only",
17371
17391
  moods: ["calm", "editorial"]
17372
17392
  }
17373
17393
  ]);
@@ -17869,13 +17889,6 @@ const headerLookCatalog = defineExactCatalog()([
17869
17889
  {
17870
17890
  id: asHeaderLookId("clean-base"),
17871
17891
  label: "Clean base",
17872
- visualTreatment: "solid-neutral",
17873
- layoutBehavior: "sticky",
17874
- configuration: {
17875
- structure: "inline-classic",
17876
- treatment: "solid-neutral",
17877
- behavior: "sticky"
17878
- },
17879
17892
  openingRequirement: "none",
17880
17893
  logoAccommodations: inlineClassicLogoAccommodations,
17881
17894
  compile: cleanBaseHeader
@@ -17883,13 +17896,6 @@ const headerLookCatalog = defineExactCatalog()([
17883
17896
  {
17884
17897
  id: asHeaderLookId("classic-centered-nav"),
17885
17898
  label: "Centered nav",
17886
- visualTreatment: "solid-neutral",
17887
- layoutBehavior: "sticky",
17888
- configuration: {
17889
- structure: "inline-classic",
17890
- treatment: "solid-neutral",
17891
- behavior: "sticky"
17892
- },
17893
17899
  openingRequirement: "none",
17894
17900
  maxRecommendedNavItems: 6,
17895
17901
  logoAccommodations: inlineClassicLogoAccommodations,
@@ -17898,13 +17904,6 @@ const headerLookCatalog = defineExactCatalog()([
17898
17904
  {
17899
17905
  id: asHeaderLookId("brand-solid"),
17900
17906
  label: "Brand solid",
17901
- visualTreatment: "solid-brand",
17902
- layoutBehavior: "sticky-shrink",
17903
- configuration: {
17904
- structure: "inline-classic",
17905
- treatment: "solid-brand",
17906
- behavior: "sticky-shrink"
17907
- },
17908
17907
  openingRequirement: "none",
17909
17908
  logoAccommodations: inlineClassicLogoAccommodations,
17910
17909
  compile: solidBrandHeader
@@ -17912,13 +17911,6 @@ const headerLookCatalog = defineExactCatalog()([
17912
17911
  {
17913
17912
  id: asHeaderLookId("serif-line"),
17914
17913
  label: "Serif line",
17915
- visualTreatment: "light-serif",
17916
- layoutBehavior: "sticky",
17917
- configuration: {
17918
- structure: "centered-stack",
17919
- treatment: "light-serif",
17920
- behavior: "sticky"
17921
- },
17922
17914
  openingRequirement: "none",
17923
17915
  maxRecommendedNavItems: 6,
17924
17916
  logoAccommodations: centeredLogoAccommodations,
@@ -17927,13 +17919,6 @@ const headerLookCatalog = defineExactCatalog()([
17927
17919
  {
17928
17920
  id: asHeaderLookId("centered-calm"),
17929
17921
  label: "Centered calm",
17930
- visualTreatment: "light-serif",
17931
- layoutBehavior: "normal-flow",
17932
- configuration: {
17933
- structure: "centered-stack",
17934
- treatment: "light-serif",
17935
- behavior: "normal-flow"
17936
- },
17937
17922
  openingRequirement: "none",
17938
17923
  maxRecommendedNavItems: 5,
17939
17924
  logoAccommodations: centeredLogoAccommodations,
@@ -17942,13 +17927,6 @@ const headerLookCatalog = defineExactCatalog()([
17942
17927
  {
17943
17928
  id: asHeaderLookId("practical-utility"),
17944
17929
  label: "Practical utility",
17945
- visualTreatment: "solid-neutral",
17946
- layoutBehavior: "sticky-shrink",
17947
- configuration: {
17948
- structure: "inline-classic",
17949
- treatment: "solid-neutral",
17950
- behavior: "sticky-shrink"
17951
- },
17952
17930
  openingRequirement: "none",
17953
17931
  requiresProminentCta: true,
17954
17932
  logoAccommodations: inlineClassicLogoAccommodations,
@@ -17957,13 +17935,6 @@ const headerLookCatalog = defineExactCatalog()([
17957
17935
  {
17958
17936
  id: asHeaderLookId("minimal-transparent"),
17959
17937
  label: "Minimal transparent",
17960
- visualTreatment: "minimal-transparent",
17961
- layoutBehavior: "normal-flow",
17962
- configuration: {
17963
- structure: "inline-classic",
17964
- treatment: "minimal-transparent",
17965
- behavior: "normal-flow"
17966
- },
17967
17938
  openingRequirement: "reserved-space-ok",
17968
17939
  logoAccommodations: inlineClassicLogoAccommodations,
17969
17940
  compile: minimalTransparentHeader
@@ -17971,13 +17942,6 @@ const headerLookCatalog = defineExactCatalog()([
17971
17942
  {
17972
17943
  id: asHeaderLookId("transparent-overlay"),
17973
17944
  label: "Transparent overlay",
17974
- visualTreatment: "transparent-overlay",
17975
- layoutBehavior: "fixed-overlay",
17976
- configuration: {
17977
- structure: "inline-classic",
17978
- treatment: "transparent-overlay",
17979
- behavior: "fixed-overlay"
17980
- },
17981
17945
  openingRequirement: "requires-image-hero-with-contrast-overlay",
17982
17946
  maxRecommendedNavItems: 5,
17983
17947
  logoAccommodations: overlayLogoAccommodations,
@@ -17986,24 +17950,13 @@ const headerLookCatalog = defineExactCatalog()([
17986
17950
  {
17987
17951
  id: asHeaderLookId("floating-glass"),
17988
17952
  label: "Floating glass",
17989
- visualTreatment: "floating-glass",
17990
- layoutBehavior: "fixed-floating",
17991
- configuration: {
17992
- structure: "floating-shell",
17993
- treatment: "floating-glass",
17994
- behavior: "fixed-floating"
17995
- },
17996
17953
  openingRequirement: "requires-image-hero-with-contrast-overlay",
17997
17954
  maxRecommendedNavItems: 5,
17998
17955
  logoAccommodations: overlayLogoAccommodations,
17999
17956
  compile: floatingGlassHeader
18000
17957
  }
18001
17958
  ]);
18002
- new Set(headerLookCatalog.map((look) => headerConfigurationKey(look.configuration)));
18003
17959
  new Map(headerLookCatalog.map((look) => [look.id, look]));
18004
- function headerConfigurationKey(configuration) {
18005
- return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
18006
- }
18007
17960
  //#endregion
18008
17961
  //#region ../theme-core/src/site-styles/sectionTransitions.ts
18009
17962
  function boundaryRuntimeMetrics(family, size, heightExpression) {
@@ -18207,8 +18160,6 @@ const VARIANT_ROLES = [
18207
18160
  "secondary",
18208
18161
  "outline",
18209
18162
  "ghost",
18210
- "link",
18211
- "tertiary",
18212
18163
  "accent"
18213
18164
  ];
18214
18165
  function isVariantRole(value) {
@@ -18220,7 +18171,7 @@ function isVariantRole(value) {
18220
18171
  * IDs become class selectors, so keep the contract deliberately narrower than
18221
18172
  * an arbitrary string and shared with every authoring/runtime boundary.
18222
18173
  */
18223
- 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" });
18224
18175
  function asSpecialVariantId(value) {
18225
18176
  const parsed = buttonVariantIdSchema.safeParse(value);
18226
18177
  if (!parsed.success) throw new Error("SpecialVariantId must be a CSS-safe button variant ID");
@@ -21411,39 +21362,39 @@ function defaultTypographyForRecipe(recipe) {
21411
21362
  }
21412
21363
  //#endregion
21413
21364
  //#region ../theme-core/src/lib/media.ts
21414
- const hotspotSchema$1 = z.object({
21365
+ const hotspotSchema = z.object({
21415
21366
  x: z.number().min(0).max(1),
21416
21367
  y: z.number().min(0).max(1),
21417
21368
  radius: z.number().optional()
21418
21369
  });
21419
- const rotationSchema$1 = z.union([
21370
+ const rotationSchema = z.union([
21420
21371
  z.literal(0),
21421
21372
  z.literal(90),
21422
21373
  z.literal(180),
21423
21374
  z.literal(270)
21424
21375
  ]);
21425
- const rectSchema$1 = z.tuple([
21376
+ const rectSchema = z.tuple([
21426
21377
  z.number(),
21427
21378
  z.number(),
21428
21379
  z.number(),
21429
21380
  z.number()
21430
21381
  ]);
21431
- const aspectCropSchema$1 = z.object({
21382
+ const aspectCropSchema = z.object({
21432
21383
  aspect: z.preprocess((value) => value == null ? void 0 : value, z.string().optional()),
21433
- rect: z.preprocess((value) => value == null ? void 0 : value, rectSchema$1.optional()),
21434
- hotspot: z.preprocess((value) => value == null ? void 0 : value, hotspotSchema$1.optional()),
21435
- 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())
21436
21387
  });
21437
- const transformSchema$1 = z.object({
21388
+ const transformSchema = z.object({
21438
21389
  aspectCrops: z.preprocess((value) => {
21439
21390
  if (!value || typeof value !== "object" || Array.isArray(value)) return;
21440
21391
  return value;
21441
- }, z.record(z.string(), aspectCropSchema$1.catch({}))).optional(),
21442
- rect: rectSchema$1.optional(),
21443
- hotspot: hotspotSchema$1.optional(),
21444
- rotation: rotationSchema$1.optional()
21392
+ }, z.record(z.string(), aspectCropSchema.catch({}))).optional(),
21393
+ rect: rectSchema.optional(),
21394
+ hotspot: hotspotSchema.optional(),
21395
+ rotation: rotationSchema.optional()
21445
21396
  });
21446
- const mediaSchema$1 = z.object({
21397
+ const mediaSchema = z.object({
21447
21398
  type: z.enum([
21448
21399
  "image",
21449
21400
  "video",
@@ -21464,7 +21415,7 @@ const mediaSchema$1 = z.object({
21464
21415
  height: z.number().optional(),
21465
21416
  storageBucket: z.string().optional(),
21466
21417
  storagePath: z.string().optional(),
21467
- transform: transformSchema$1.optional()
21418
+ transform: transformSchema.optional()
21468
21419
  });
21469
21420
  //#endregion
21470
21421
  //#region ../theme-core/src/palette/schema.ts
@@ -22297,264 +22248,6 @@ function generateInteractiveChildInheritanceCSS(selector) {
22297
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`;
22298
22249
  }
22299
22250
  //#endregion
22300
- //#region ../theme-core/src/buttons/effects/presets/background.ts
22301
- /**
22302
- * Darken background on hover
22303
- *
22304
- * Works with solid backgrounds only. Darkens the background color by adjusting the shade.
22305
- */
22306
- const darkenBackgroundEffect = {
22307
- id: "darken-background",
22308
- name: "Darken on Hover",
22309
- description: "Darkens the background color on hover",
22310
- category: "background",
22311
- pseudoElement: "none",
22312
- applicableTo: ["button"],
22313
- customizableOption: {
22314
- name: "amount",
22315
- type: "select",
22316
- label: "Darken Amount (shade step)",
22317
- default: 100,
22318
- options: [
22319
- 0,
22320
- 100,
22321
- 200,
22322
- 300,
22323
- 400,
22324
- 500,
22325
- 600,
22326
- 700,
22327
- 800,
22328
- 900
22329
- ]
22330
- },
22331
- isApplicable: (buttonConfig) => {
22332
- return buttonConfig.background.type === "solid";
22333
- },
22334
- generateCSS: (ctx) => {
22335
- const { themeId, variantId, options, tokens, buttonConfig } = ctx;
22336
- if (buttonConfig.background.type !== "solid") return "";
22337
- const amount = options.amount || 100;
22338
- const baseToken = buttonConfig.background.colorToken ?? "primary-500";
22339
- const darkerToken = tokens.adjustShade(baseToken, amount);
22340
- return `
22341
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
22342
- background-color: ${tokens.getColor(darkerToken)};
22343
- }
22344
- `;
22345
- }
22346
- };
22347
- /**
22348
- * Lighten background on hover
22349
- *
22350
- * Works with solid backgrounds only. Lightens the background color by adjusting the shade.
22351
- */
22352
- const lightenBackgroundEffect = {
22353
- id: "lighten-background",
22354
- name: "Lighten on Hover",
22355
- description: "Lightens the background color on hover",
22356
- category: "background",
22357
- pseudoElement: "none",
22358
- applicableTo: ["button"],
22359
- customizableOption: {
22360
- name: "amount",
22361
- type: "select",
22362
- label: "Lighten Amount (shade step)",
22363
- default: 100,
22364
- options: [
22365
- 0,
22366
- 100,
22367
- 200,
22368
- 300,
22369
- 400,
22370
- 500,
22371
- 600,
22372
- 700,
22373
- 800,
22374
- 900
22375
- ]
22376
- },
22377
- isApplicable: (buttonConfig) => {
22378
- return buttonConfig.background.type === "solid";
22379
- },
22380
- generateCSS: (ctx) => {
22381
- const { themeId, variantId, options, tokens, buttonConfig } = ctx;
22382
- if (buttonConfig.background.type !== "solid") return "";
22383
- const amount = options.amount || 100;
22384
- const baseToken = buttonConfig.background.colorToken ?? "primary-500";
22385
- const lighterToken = tokens.adjustShade(baseToken, -amount);
22386
- return `
22387
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
22388
- background-color: ${tokens.getColor(lighterToken)};
22389
- }
22390
- `;
22391
- }
22392
- };
22393
- /**
22394
- * Fade background on hover (reduce opacity)
22395
- *
22396
- * Works with all background types.
22397
- */
22398
- const fadeBackgroundEffect = {
22399
- id: "fade-background",
22400
- name: "Fade on Hover",
22401
- description: "Reduces background opacity on hover",
22402
- category: "background",
22403
- pseudoElement: "none",
22404
- applicableTo: ["nav-link"],
22405
- customizableOption: {
22406
- name: "opacity",
22407
- type: "percentage",
22408
- label: "Hover Opacity",
22409
- default: 80
22410
- },
22411
- generateCSS: (ctx) => {
22412
- const { themeId, variantId, options } = ctx;
22413
- return `
22414
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
22415
- opacity: ${(options.opacity || 80) / 100};
22416
- }
22417
- `;
22418
- }
22419
- };
22420
- /**
22421
- * Reduce opacity on hover (simple opacity reduction)
22422
- *
22423
- * Navigation-link effect that reduces opacity by a percentage (default 15%).
22424
- */
22425
- const opacityReduceEffect = {
22426
- id: "opacity-reduce",
22427
- name: "Reduce Opacity",
22428
- description: "Reduces navigation-link opacity on hover by a percentage",
22429
- category: "background",
22430
- pseudoElement: "none",
22431
- applicableTo: ["nav-link"],
22432
- customizableOption: {
22433
- name: "reduction",
22434
- type: "percentage",
22435
- label: "Opacity Reduction",
22436
- default: 15
22437
- },
22438
- generateCSS: (ctx) => {
22439
- const { themeId, variantId, options } = ctx;
22440
- return `
22441
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
22442
- opacity: ${1 - (options.reduction || 15) / 100};
22443
- }
22444
- `;
22445
- }
22446
- };
22447
- /**
22448
- * Animated gradient background
22449
- *
22450
- * Animates a gradient background by shifting its position on hover.
22451
- * Works with gradient backgrounds only.
22452
- *
22453
- * Sets background-size to 200% and animates background-position from left to right.
22454
- */
22455
- const animatedGradientEffect = {
22456
- id: "animated-gradient",
22457
- name: "Animated Gradient",
22458
- description: "Animates gradient position on hover",
22459
- category: "background",
22460
- pseudoElement: "none",
22461
- applicableTo: ["button"],
22462
- customizableOption: {
22463
- name: "direction",
22464
- type: "select",
22465
- label: "Animation Direction",
22466
- default: "horizontal",
22467
- options: ["horizontal", "vertical"]
22468
- },
22469
- isApplicable: (buttonConfig) => {
22470
- return buttonConfig.background.type === "gradient";
22471
- },
22472
- generateCSS: (ctx) => {
22473
- const { themeId, variantId, options, buttonConfig } = ctx;
22474
- if (buttonConfig.background.type !== "gradient") return "";
22475
- const direction = options.direction || "horizontal";
22476
- return `
22477
- /* Setup animated gradient */
22478
- :where([data-theme-scope="${themeId}"]) .${variantId} {
22479
- background-size: ${direction === "horizontal" ? "200% auto" : "auto 200%"};
22480
- background-position: left center;
22481
- transition: background-position 0.3s ease;
22482
- }
22483
-
22484
- /* Animate gradient on hover */
22485
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
22486
- background-position: ${direction === "horizontal" ? "right center" : "center bottom"};
22487
- }
22488
- `;
22489
- }
22490
- };
22491
- /**
22492
- * Add background color on hover
22493
- *
22494
- * Works best with transparent backgrounds. Adds a solid background color on hover.
22495
- */
22496
- const backgroundOnHoverEffect = {
22497
- id: "background-on-hover",
22498
- name: "Background on Hover",
22499
- description: "Adds background color on hover",
22500
- category: "background",
22501
- pseudoElement: "none",
22502
- applicableTo: ["button", "nav-link"],
22503
- customizableOption: {
22504
- name: "colorToken",
22505
- type: "select",
22506
- label: "Background Color",
22507
- default: "neutral-800",
22508
- options: [
22509
- "neutral-700",
22510
- "neutral-800",
22511
- "neutral-900",
22512
- "primary"
22513
- ]
22514
- },
22515
- generateCSS: (ctx) => {
22516
- const { themeId, variantId, options, tokens, buttonConfig } = ctx;
22517
- const colorToken = options.colorToken || "neutral-800";
22518
- return `
22519
- /* Add background on hover */
22520
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
22521
- background-color: ${tokens.getColor(colorToken)};${"textColorToken" in buttonConfig && typeof options.textColorToken === "string" ? `\n color: ${tokens.getColor(options.textColorToken)};` : ""}
22522
- }
22523
- `;
22524
- }
22525
- };
22526
- /**
22527
- * Add semi-transparent background color on hover
22528
- *
22529
- * Adds a background with opacity/alpha channel. Perfect for retro/arcade styles.
22530
- */
22531
- const backgroundOnHoverAlphaEffect = {
22532
- id: "background-on-hover-alpha",
22533
- name: "Background on Hover (Transparent)",
22534
- description: "Adds semi-transparent background on hover",
22535
- category: "background",
22536
- pseudoElement: "none",
22537
- applicableTo: ["nav-link"],
22538
- customizableOption: {
22539
- name: "opacity",
22540
- type: "percentage",
22541
- label: "Opacity",
22542
- default: 50
22543
- },
22544
- generateCSS: (ctx) => {
22545
- const { themeId, variantId, stateGroup, options } = ctx;
22546
- const rawOpacity = options.opacity;
22547
- const clampedOpacity = Math.max(0, Math.min(100, typeof rawOpacity === "number" && !Number.isNaN(rawOpacity) ? rawOpacity : 50));
22548
- const cssVar = `var(--tb-${options.colorToken || "neutral-800"})`;
22549
- return `
22550
- /* Add semi-transparent background (${stateGroup}) */
22551
- :where([data-theme-scope="${themeId}"]) .${variantId}${stateGroup === "base" ? "" : `:${stateGroup}`} {
22552
- background-color: rgb(${cssVar} / ${clampedOpacity}%);
22553
- }
22554
- `;
22555
- }
22556
- };
22557
- //#endregion
22558
22251
  //#region ../theme-core/src/buttons/effects/cssUtils.ts
22559
22252
  /**
22560
22253
  * CSS Utilities for Effect Presets
@@ -22606,6 +22299,71 @@ function generateStateCSS(themeId, variantId, state, cssProperties) {
22606
22299
  `;
22607
22300
  }
22608
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
22609
22367
  //#region ../theme-core/src/buttons/effects/registry.ts
22610
22368
  /**
22611
22369
  * Registry of all available effect presets
@@ -22613,11 +22371,144 @@ function generateStateCSS(themeId, variantId, state, cssProperties) {
22613
22371
  const EFFECT_PRESETS = [
22614
22372
  darkenBackgroundEffect,
22615
22373
  lightenBackgroundEffect,
22616
- fadeBackgroundEffect,
22617
- opacityReduceEffect,
22618
- animatedGradientEffect,
22619
- backgroundOnHoverEffect,
22620
- 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
+ },
22621
22512
  {
22622
22513
  id: "border-glow",
22623
22514
  name: "Border Glow",
@@ -25556,6 +25447,147 @@ function resolveOnColorForThemeToken(token) {
25556
25447
  return shade <= 400 ? "#000000" : "#FFFFFF";
25557
25448
  }
25558
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
25559
25591
  //#region ../theme-core/src/schema.ts
25560
25592
  const axesSchema = z$1.object({
25561
25593
  tone: z$1.enum([
@@ -25716,7 +25748,7 @@ const boxBackgroundSchema = z$1.object({
25716
25748
  color: tokenOrCssColorValueSchema.nullable().optional(),
25717
25749
  gradient: z$1.string().nullable().optional(),
25718
25750
  gradientPresetId: z$1.string().min(1).nullable().optional(),
25719
- image: mediaSchema$1.nullable().optional(),
25751
+ image: mediaSchema.nullable().optional(),
25720
25752
  objectFit: z$1.enum([
25721
25753
  "fill",
25722
25754
  "fit",
@@ -25964,25 +25996,6 @@ const navFontWeight = z$1.enum([
25964
25996
  ]);
25965
25997
  const headerMaxWidth = z$1.enum(["container", "full"]);
25966
25998
  const headerBarFrame = z$1.enum(["full-bleed", "inset-shell"]);
25967
- const headerContainerSchema = z$1.object({
25968
- rounded: z$1.enum([
25969
- "none",
25970
- "sm",
25971
- "md",
25972
- "lg",
25973
- "xl",
25974
- "2xl"
25975
- ]).default("xl"),
25976
- border: z$1.boolean().default(true),
25977
- shadow: z$1.boolean().default(true),
25978
- padding: z$1.enum([
25979
- "sm",
25980
- "md",
25981
- "lg"
25982
- ]).default("md"),
25983
- tint: z$1.string().nullable().optional(),
25984
- opacity: z$1.number().min(0).max(1).default(.12)
25985
- }).optional();
25986
25999
  const headerBorderSchema = componentBorderSchema.extend({ position: z$1.enum([
25987
26000
  "bottom",
25988
26001
  "top",
@@ -26100,7 +26113,7 @@ const headerBackgroundSchema = z$1.object({
26100
26113
  contentOwner: z$1.literal(siteChromeBackgroundOverrideOwner).optional(),
26101
26114
  color: tokenOrCssColorValueSchema.nullable().optional(),
26102
26115
  gradient: gradientConfigSchema.nullable().optional(),
26103
- image: mediaSchema$1.nullable().optional(),
26116
+ image: mediaSchema.nullable().optional(),
26104
26117
  textColor: tokenOrCssColorValueSchema.nullable().optional()
26105
26118
  });
26106
26119
  const headerSchema = z$1.object({
@@ -26109,7 +26122,8 @@ const headerSchema = z$1.object({
26109
26122
  shrinkOnScroll: z$1.boolean(),
26110
26123
  maxWidth: headerMaxWidth,
26111
26124
  barFrame: headerBarFrame.optional(),
26112
- logoOverride: mediaSchema$1.nullable().optional(),
26125
+ scrollTreatment: headerScrollTreatmentSchema,
26126
+ logoOverride: mediaSchema.nullable().optional(),
26113
26127
  background: headerBackgroundSchema.default({
26114
26128
  type: "color",
26115
26129
  color: "surface"
@@ -26121,6 +26135,7 @@ const headerSchema = z$1.object({
26121
26135
  navFontRole: z$1.enum(["body", "heading"]).optional(),
26122
26136
  navTypography: z$1.enum(["body", "heading"]).optional(),
26123
26137
  navTextSize: navLinkStyleSchema.shape.textSize,
26138
+ interactionPalette: headerInteractionPaletteSchema.optional(),
26124
26139
  navPlacement: z$1.enum(["end", "center"]).optional(),
26125
26140
  container: headerContainerSchema,
26126
26141
  border: headerBorderSchema,
@@ -31597,15 +31612,6 @@ const heroCopyFragment = defineFragment({
31597
31612
  */
31598
31613
  const BLOCK_BUTTON_ROLES = PUBLIC_BUTTON_ROLES;
31599
31614
  const blockButtonRoleSchema = z$1.enum(BLOCK_BUTTON_ROLES);
31600
- /**
31601
- * Temporary rollout boundary for persisted content written before issue #1220.
31602
- * Authoring remains strict through `blockButtonRoleSchema`; this parser exists
31603
- * only until the post-deploy role rewrite has been audited in production.
31604
- */
31605
- function canonicalizePersistedBlockButtonRole(value) {
31606
- return value === "link" || value === "tertiary" ? "ghost" : value;
31607
- }
31608
- const persistedBlockButtonRoleSchema = z$1.preprocess((value) => typeof value === "string" ? canonicalizePersistedBlockButtonRole(value) : value, blockButtonRoleSchema);
31609
31615
  const BLOCK_BUTTON_ROLE_LABELS = {
31610
31616
  primary: "Primary",
31611
31617
  secondary: "Secondary",
@@ -39377,84 +39383,6 @@ const weeklySlotAvailabilityBlockDefinition = {
39377
39383
  mode: "server"
39378
39384
  } }
39379
39385
  };
39380
- const PUBLIC_DOWNLOAD_MEDIA_TYPES = [
39381
- "document",
39382
- "spreadsheet",
39383
- "archive",
39384
- "audio"
39385
- ];
39386
- const hotspotSchema = z.object({
39387
- x: z.number().min(0).max(1),
39388
- y: z.number().min(0).max(1),
39389
- radius: z.number().optional()
39390
- });
39391
- const rotationSchema = z.union([
39392
- z.literal(0),
39393
- z.literal(90),
39394
- z.literal(180),
39395
- z.literal(270)
39396
- ]);
39397
- const rectSchema = z.tuple([
39398
- z.number(),
39399
- z.number(),
39400
- z.number(),
39401
- z.number()
39402
- ]);
39403
- const aspectCropSchema = z.object({
39404
- aspect: z.preprocess((value) => value == null ? void 0 : value, z.string().optional()),
39405
- rect: z.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
39406
- hotspot: z.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
39407
- rotation: z.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
39408
- });
39409
- const transformSchema = z.object({
39410
- aspectCrops: z.preprocess((value) => {
39411
- if (!value || typeof value !== "object" || Array.isArray(value)) return;
39412
- return value;
39413
- }, z.record(z.string(), aspectCropSchema.catch({}))).optional(),
39414
- rect: rectSchema.optional(),
39415
- hotspot: hotspotSchema.optional(),
39416
- rotation: rotationSchema.optional()
39417
- });
39418
- const mediaPosterSchema = z.discriminatedUnion("tag", [z.object({
39419
- tag: z.literal("storage"),
39420
- assetId: z.string().optional(),
39421
- storageBucket: z.string().min(1),
39422
- storagePath: z.string().min(1)
39423
- }), z.object({
39424
- tag: z.literal("external-src"),
39425
- assetId: z.string().optional(),
39426
- src: z.string().url()
39427
- })]);
39428
- const mediaBaseSchema = z.object({
39429
- purpose: z.string().optional(),
39430
- placeholder: z.boolean().default(true).optional(),
39431
- assetId: z.string().optional(),
39432
- identifier: z.string().optional(),
39433
- src: z.string().optional(),
39434
- alt: z.string().optional(),
39435
- filename: z.string().optional(),
39436
- mimeType: z.string().optional(),
39437
- width: z.number().optional(),
39438
- height: z.number().optional(),
39439
- storageBucket: z.string().optional(),
39440
- storagePath: z.string().optional(),
39441
- poster: mediaPosterSchema.optional(),
39442
- transform: transformSchema.optional()
39443
- });
39444
- const imageMediaSchema = mediaBaseSchema.extend({ type: z.literal("image") });
39445
- const videoMediaSchema = mediaBaseSchema.extend({ type: z.literal("video") });
39446
- const audioMediaSchema = mediaBaseSchema.extend({ type: z.literal("audio") });
39447
- const documentMediaSchema = mediaBaseSchema.extend({ type: z.literal("document") });
39448
- const spreadsheetMediaSchema = mediaBaseSchema.extend({ type: z.literal("spreadsheet") });
39449
- const archiveMediaSchema = mediaBaseSchema.extend({ type: z.literal("archive") });
39450
- const mediaSchema = z.discriminatedUnion("type", [
39451
- imageMediaSchema,
39452
- videoMediaSchema,
39453
- audioMediaSchema,
39454
- documentMediaSchema,
39455
- spreadsheetMediaSchema,
39456
- archiveMediaSchema
39457
- ]);
39458
39386
  //#endregion
39459
39387
  //#region ../blocks/src/system/blocks/shared/bookingPaymentTerms.ts
39460
39388
  const bookingDepositRefundPolicySchema = z$1.enum(["refundable", "non_refundable"]);
@@ -39894,7 +39822,7 @@ const publicEventSchema = z$1.object({
39894
39822
  presentation: z$1.object({
39895
39823
  cardTitleOverride: z$1.string().nullable().optional(),
39896
39824
  summary: z$1.string().nullable().optional(),
39897
- image: mediaSchema.nullable().optional()
39825
+ image: mediaSchema$1.nullable().optional()
39898
39826
  }).optional(),
39899
39827
  slug: z$1.string(),
39900
39828
  path: z$1.string().nullable(),
@@ -40520,7 +40448,7 @@ function isEventCalendarListLayout(value) {
40520
40448
  //#region ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
40521
40449
  const previewStageSchema = z$1.enum(["preview", "published"]);
40522
40450
  const registrationButtonVariantSchema = blockButtonRoleSchema;
40523
- const eventButtonVariantSchema = persistedBlockButtonRoleSchema;
40451
+ const eventButtonVariantSchema = blockButtonRoleSchema;
40524
40452
  const eventLayoutSchema = z$1.enum(eventCalendarListLayoutValues);
40525
40453
  const eventCalendarDisplayModeSchema = z$1.enum(eventCalendarDisplayModeValues);
40526
40454
  const eventCalendarDefaultViewSchema = z$1.enum(eventCalendarDefaultViewValues);
@@ -50732,7 +50660,7 @@ const newsletterSignupBlockDefinition = {
50732
50660
  //#endregion
50733
50661
  //#region ../blocks/src/system/blocks/team-members.ts
50734
50662
  const ITEM_NAME = "member";
50735
- 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();
50736
50664
  const teamMemberDataSchema = z$1.object({
50737
50665
  _type: z$1.literal("teamMember"),
50738
50666
  id: z$1.string(),
@@ -52307,7 +52235,7 @@ function getBlockDefinition(name) {
52307
52235
  //#endregion
52308
52236
  //#region ../blocks/src/system/helpers/backgroundMedia.ts
52309
52237
  function resolveBackgroundMedia(input) {
52310
- const parsedMedia = mediaSchema.safeParse(input.image);
52238
+ const parsedMedia = mediaSchema$1.safeParse(input.image);
52311
52239
  if (!parsedMedia.success) return null;
52312
52240
  switch (parsedMedia.data.type) {
52313
52241
  case "image":
@@ -53602,6 +53530,9 @@ function renderTrailingAffordanceIcon(affordance) {
53602
53530
  className: "rb-ml-2 rb-h-4 rb-w-4 rb-inline-block"
53603
53531
  });
53604
53532
  }
53533
+ function isMissingRequiredLink(linkRequired, resolvedHref) {
53534
+ return linkRequired && resolvedHref.length === 0;
53535
+ }
53605
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 }) => {
53606
53537
  const content = value ?? children;
53607
53538
  if (!content) {
@@ -53610,12 +53541,16 @@ const ButtonNode = ({ value, children, href, variantId = "primary", size = "md",
53610
53541
  }
53611
53542
  const affordanceIcon = renderTrailingAffordanceIcon(resolveButtonAffordance({ trailingIcon }));
53612
53543
  const resolvedHref = typeof href === "string" ? href.trim() : "";
53613
- if (linkRequired && resolvedHref.length === 0) {
53544
+ if (isMissingRequiredLink(linkRequired, resolvedHref)) {
53614
53545
  if (process.env.NODE_ENV === "development") console.warn("[ButtonNode] Missing href for link-required button");
53615
53546
  return null;
53616
53547
  }
53617
53548
  const extraClassName = affordanceIcon ? [className, AFFORDANCE_SUPPRESS_CLASS].filter(Boolean).join(" ") : className;
53618
- 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
+ }
53619
53554
  const combinedClassName = resolvedVariantId ? themeButtonClassName({
53620
53555
  variant: resolvedVariantId,
53621
53556
  size,
@@ -53744,8 +53679,9 @@ function iconForMediaType(type) {
53744
53679
  });
53745
53680
  }
53746
53681
  }
53747
- function normalizeButtonVariant(value) {
53748
- return isBlockButtonRole(value) ? value : "primary";
53682
+ function parseButtonVariant(value) {
53683
+ if (value === null || value === void 0) return "primary";
53684
+ return isBlockButtonRole(value) ? value : null;
53749
53685
  }
53750
53686
  function FileDownloadNode({ value, title, description, buttonLabel, buttonVariant, className }) {
53751
53687
  if (!value || !isDownloadableMediaType(value.type)) return null;
@@ -53755,7 +53691,11 @@ function FileDownloadNode({ value, title, description, buttonLabel, buttonVarian
53755
53691
  const heading = title?.trim() || filename;
53756
53692
  const body = description?.trim();
53757
53693
  const label = buttonLabel?.trim() || "Download";
53758
- const variant = normalizeButtonVariant(buttonVariant);
53694
+ const variant = parseButtonVariant(buttonVariant);
53695
+ if (!variant) {
53696
+ console.error("[FileDownloadNode] Invalid button variant", { buttonVariant });
53697
+ return null;
53698
+ }
53759
53699
  return /* @__PURE__ */ jsx("div", {
53760
53700
  className,
53761
53701
  children: /* @__PURE__ */ jsxs("div", {
@@ -60637,6 +60577,41 @@ function resolveColorTokenHex(theme, colorToken) {
60637
60577
  if (colorToken === "transparent") return null;
60638
60578
  return expandPalette(theme.palette)[colorToken] ?? null;
60639
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
+ }
60640
60615
  //#endregion
60641
60616
  //#region ../theme-core/src/navigation/presets.ts
60642
60617
  /**
@@ -60798,12 +60773,71 @@ function getNavLinkPreset(presetId) {
60798
60773
  return NAV_LINK_PRESETS[presetId];
60799
60774
  }
60800
60775
  Object.keys(NAV_LINK_PRESETS);
60801
- const NAV_DROPDOWN_CONTAINER_RAIL_CSS_RULES = [
60802
- `min-width: 12rem;`,
60803
- `width: max-content;`,
60804
- `max-width: min(22rem, calc(100vw - 2rem));`,
60805
- `transform: translateX(var(--nav-dropdown-shift-x, 0px));`
60806
- ];
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
+ }
60807
60841
  //#endregion
60808
60842
  //#region ../theme-core/src/header/generateHeaderCss.ts
60809
60843
  const HEADER_BLUR = "blur(12px)";
@@ -60833,8 +60867,8 @@ function generateHeaderCss(options) {
60833
60867
  const cssChunks = [];
60834
60868
  const headerContrastTreatment = resolveHeaderContrastTreatment(header);
60835
60869
  const headerNavTextSize = resolveHeaderNavTextSize(header);
60836
- cssChunks.push(generateHeaderRootStyles(header, themeId, tokens, theme));
60837
- cssChunks.push(generateMobileOverlayBackdropFilterFix(themeId));
60870
+ cssChunks.push(generateHeaderRootStyles(header, themeId, tokens));
60871
+ cssChunks.push(generateMobileOverlayBackdropFilterFix(themeId, header.variant));
60838
60872
  cssChunks.push(generateLogoStyles({
60839
60873
  logo: header.logo,
60840
60874
  themeId,
@@ -60872,56 +60906,34 @@ function isClearSplitHeaderShape(header) {
60872
60906
  function isDetachedFloatingHeaderShape(header) {
60873
60907
  return header.variant === "floating" && !header.container;
60874
60908
  }
60875
- function generateMobileOverlayBackdropFilterFix(themeId) {
60876
- 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`;
60877
- }
60878
60909
  /**
60879
60910
  * Generate root header container styles
60880
60911
  */
60881
- function generateHeaderRootStyles(header, themeId, tokens, _theme) {
60912
+ function generateHeaderRootStyles(header, themeId, tokens) {
60882
60913
  const selector = `:where([data-theme-scope="${themeId}"]) .header-root`;
60883
- const backgroundSelector = `:where([data-theme-scope="${themeId}"]) .header-root::before`;
60884
60914
  const rules = [];
60885
- const backgroundRules = [];
60886
60915
  const navContainerType = header.navContainer?.type ?? "none";
60887
60916
  const isContainedNav = navContainerType === "pill" || navContainerType === "glass";
60888
60917
  rules.push("position: relative;");
60889
60918
  rules.push("isolation: isolate;");
60890
- if (!isContainedNav) {
60891
- const bg = header.background;
60892
- if (bg.type === "color") {
60893
- const bgColor = tokens.getColor(bg.color || "surface");
60894
- backgroundRules.push(`background-color: ${bgColor};`);
60895
- } else if (bg.type === "gradient" && bg.gradient) {
60896
- const stops = bg.gradient.stops.map((s) => tokens.getColor(s.color)).join(", ");
60897
- const angle = bg.gradient.angle ?? 180;
60898
- backgroundRules.push(`background-image: linear-gradient(${angle}deg, ${stops});`);
60899
- }
60900
- backgroundRules.push(`backdrop-filter: ${HEADER_BLUR};`);
60901
- backgroundRules.push(`-webkit-backdrop-filter: ${HEADER_BLUR};`);
60902
- if (header.border) {
60903
- const borderWidth = getComponentBorderWidthPx(header.border.width);
60904
- if (borderWidth !== "0") {
60905
- const borderToken = header.border?.colorToken?.trim() || "border";
60906
- const borderColor = tokens.getColor(borderToken);
60907
- const borderStyle = header.border.style === "dashed" ? "dashed" : "solid";
60908
- if (header.border.position === "bottom") rules.push(`border-bottom: ${borderWidth} ${borderStyle} ${borderColor};`);
60909
- else if (header.border.position === "top") rules.push(`border-top: ${borderWidth} ${borderStyle} ${borderColor};`);
60910
- else if (header.border.position === "both") {
60911
- rules.push(`border-top: ${borderWidth} ${borderStyle} ${borderColor};`);
60912
- rules.push(`border-bottom: ${borderWidth} ${borderStyle} ${borderColor};`);
60913
- }
60914
- }
60915
- }
60916
- }
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;
60917
60928
  if (header.positioning === "sticky" || header.positioning === "fixed") {
60918
60929
  const shadowVar = getComponentShadowVar(header.shadow?.elevation ?? "none");
60919
60930
  if (shadowVar) rules.push(`box-shadow: ${shadowVar};`);
60920
60931
  }
60921
60932
  const baseBlock = `\n${selector} {\n ${rules.join("\n ")}\n}\n`;
60922
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`;
60923
- if (isContainedNav || backgroundRules.length === 0) return `${baseBlock}\n${overlayFix}`;
60924
- 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}`;
60925
60937
  }
60926
60938
  /**
60927
60939
  * Reshapes the full-bleed header paint layer into a contained brand capsule at
@@ -60966,10 +60978,10 @@ function generateLogoStyles(input) {
60966
60978
  else rules.push(`font-family: var(--font-heading);`);
60967
60979
  if (logo) {
60968
60980
  if (logo.letterSpacing && logo.letterSpacing !== "normal") rules.push(`letter-spacing: ${{
60969
- "normal": "0em",
60970
- "wide": "0.05em",
60971
- "wider": "0.1em",
60972
- "widest": "0.15em"
60981
+ normal: "0em",
60982
+ wide: "0.05em",
60983
+ wider: "0.1em",
60984
+ widest: "0.15em"
60973
60985
  }[logo.letterSpacing]};`);
60974
60986
  if (logo.gradient) {
60975
60987
  rules.push(`background: linear-gradient(to right, ${primaryColor}, ${accentColor});`);
@@ -61042,71 +61054,11 @@ function generateNavLinkStyles(header, themeId, tokens, theme, contrastTreatment
61042
61054
  } : header.navLinkStyle, navPreferences),
61043
61055
  className: "header-nav-link"
61044
61056
  });
61045
- const navStyle = header.navStyle ?? "minimal";
61046
- const basePreset = getNavLinkPreset(navStyle);
61047
- if (!basePreset) {
61048
- 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}`);
61049
61060
  return "";
61050
61061
  }
61051
- const mergedStyle = {
61052
- ...basePreset,
61053
- fontWeight: header.navWeight ?? basePreset.fontWeight,
61054
- colorToken: (header.navColor ?? header.textColor)?.trim() || basePreset.colorToken,
61055
- ...contrastTreatment ? { contrastTreatment } : {},
61056
- ...navTextSize ? { textSize: navTextSize } : {}
61057
- };
61058
- if (header.navWeight === "bold" && navStyle === "solid") mergedStyle.textTransform = "uppercase";
61059
- if (header.navEffects) {
61060
- const effects = mergedStyle.effects = {
61061
- ...mergedStyle.effects,
61062
- hover: [...mergedStyle.effects?.hover || []],
61063
- active: [...mergedStyle.effects?.active || []]
61064
- };
61065
- if (header.navEffects.glow) effects.hover.push({
61066
- effectId: "outer-glow",
61067
- options: { spread: 5 }
61068
- });
61069
- if (header.navEffects.neumorphic) {
61070
- effects.hover.push({
61071
- effectId: "neumorphic-shadow",
61072
- options: { mode: "pressed" }
61073
- });
61074
- effects.hover.push({
61075
- effectId: "text-color-change",
61076
- options: { hoverColorToken: "primary" }
61077
- });
61078
- }
61079
- if (header.navEffects.underlineGradient) effects.hover.push({
61080
- effectId: "border-bottom-grow",
61081
- options: { origin: "center" }
61082
- });
61083
- }
61084
- if ((header.navContainer?.type ?? "none") === "glass" && navStyle === "minimal") {
61085
- mergedStyle.borderRadius = "full";
61086
- mergedStyle.effects = {
61087
- ...mergedStyle.effects,
61088
- hover: [{
61089
- effectId: "background-on-hover-alpha",
61090
- options: {
61091
- colorToken: "neutral-50",
61092
- opacity: 10
61093
- }
61094
- }, {
61095
- effectId: "text-color-change",
61096
- options: { hoverColorToken: "neutral-50" }
61097
- }],
61098
- active: [{
61099
- effectId: "background-on-hover-alpha",
61100
- options: {
61101
- colorToken: "neutral-50",
61102
- opacity: 18
61103
- }
61104
- }, {
61105
- effectId: "text-color-change",
61106
- options: { hoverColorToken: "neutral-50" }
61107
- }]
61108
- };
61109
- }
61110
61062
  return generateNavLinkCSS({
61111
61063
  themeId,
61112
61064
  tokens,
@@ -61134,10 +61086,10 @@ function generateDropdownContainerStyles(header, themeId, tokens) {
61134
61086
  if (shadowVar) rules.push(`box-shadow: ${shadowVar};`);
61135
61087
  const borderRadius = dropdownStyle?.borderRadius ?? "md";
61136
61088
  rules.push(`border-radius: ${{
61137
- "none": "0",
61138
- "sm": "0.25rem",
61139
- "md": "0.5rem",
61140
- "lg": "0.75rem"
61089
+ none: "0",
61090
+ sm: "0.25rem",
61091
+ md: "0.5rem",
61092
+ lg: "0.75rem"
61141
61093
  }[borderRadius]};`);
61142
61094
  rules.push(`padding: 0.5rem 0;`);
61143
61095
  return `\n${selector} {\n ${rules.join("\n ")}\n}\n`;
@@ -61192,16 +61144,16 @@ function generateDropdownLinkStyles(header, themeId, tokens, theme) {
61192
61144
  const additionalRules = [];
61193
61145
  const letterSpacing = configuredDropdownStyle?.letterSpacing ?? "normal";
61194
61146
  if (letterSpacing !== "normal") additionalRules.push(`letter-spacing: ${{
61195
- "normal": "0em",
61196
- "wide": "0.05em",
61197
- "wider": "0.1em"
61147
+ normal: "0em",
61148
+ wide: "0.05em",
61149
+ wider: "0.1em"
61198
61150
  }[letterSpacing]};`);
61199
61151
  const textSize = configuredDropdownStyle?.textSize ?? "sm";
61200
61152
  additionalRules.push(`font-size: ${{
61201
- "xs": "0.75rem",
61202
- "sm": "0.875rem",
61203
- "base": "1rem",
61204
- "lg": "1.125rem"
61153
+ xs: "0.75rem",
61154
+ sm: "0.875rem",
61155
+ base: "1rem",
61156
+ lg: "1.125rem"
61205
61157
  }[textSize]};`);
61206
61158
  if (additionalRules.length > 0) return baseCSS + `\n${`:where([data-theme-scope="${themeId}"]) .nav-dropdown-link`} {\n ${additionalRules.join("\n ")}\n}\n`;
61207
61159
  return baseCSS;
@@ -61297,18 +61249,18 @@ function generateFloatingContainerStyles(header, themeId, tokens) {
61297
61249
  rules.push(`-webkit-backdrop-filter: ${FLOATING_BLUR};`);
61298
61250
  if (container.border) rules.push(`border: 1px solid rgb(255 255 255 / 0.2);`);
61299
61251
  rules.push(`border-radius: ${{
61300
- "none": "0",
61301
- "sm": "0.375rem",
61302
- "md": "0.5rem",
61303
- "lg": "0.75rem",
61304
- "xl": "1rem",
61252
+ none: "0",
61253
+ sm: "0.375rem",
61254
+ md: "0.5rem",
61255
+ lg: "0.75rem",
61256
+ xl: "1rem",
61305
61257
  "2xl": "1.5rem"
61306
61258
  }[container.rounded]};`);
61307
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);`);
61308
61260
  rules.push(`padding: ${{
61309
- "sm": "1rem 1.5rem",
61310
- "md": "1.5rem 2rem",
61311
- "lg": "2rem 2.5rem"
61261
+ sm: "1rem 1.5rem",
61262
+ md: "1.5rem 2rem",
61263
+ lg: "2rem 2.5rem"
61312
61264
  }[container.padding]};`);
61313
61265
  return `\n${selector} {\n ${rules.join("\n ")}\n}\n`;
61314
61266
  }
@@ -84172,7 +84124,7 @@ var CircuitOpenError = class extends Error {
84172
84124
  * 1. This constant
84173
84125
  * 2. The "version" field in package.json
84174
84126
  */
84175
- const SDK_VERSION = "0.126.0";
84127
+ const SDK_VERSION = "0.127.0";
84176
84128
  //#endregion
84177
84129
  //#region src/next/content-load-failure.ts
84178
84130
  const SdkContentLoadError = RiverbankContentLoadError;