@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
@@ -3594,6 +3594,99 @@ function createRichTextDoc(paragraphs) {
3594
3594
  } : { type: "paragraph" })
3595
3595
  };
3596
3596
  }
3597
+ const PUBLIC_DOWNLOAD_MEDIA_TYPES = [
3598
+ "document",
3599
+ "spreadsheet",
3600
+ "archive",
3601
+ "audio"
3602
+ ];
3603
+ const hotspotSchema$1 = z.object({
3604
+ x: z.number().min(0).max(1),
3605
+ y: z.number().min(0).max(1),
3606
+ radius: z.number().optional()
3607
+ });
3608
+ const rotationSchema$1 = z.union([
3609
+ z.literal(0),
3610
+ z.literal(90),
3611
+ z.literal(180),
3612
+ z.literal(270)
3613
+ ]);
3614
+ const rectSchema$1 = z.tuple([
3615
+ z.number(),
3616
+ z.number(),
3617
+ z.number(),
3618
+ z.number()
3619
+ ]);
3620
+ const aspectCropSchema$1 = z.object({
3621
+ aspect: z.preprocess((value) => value == null ? void 0 : value, z.string().optional()),
3622
+ rect: z.preprocess((value) => value == null ? void 0 : value, rectSchema$1.optional()),
3623
+ hotspot: z.preprocess((value) => value == null ? void 0 : value, hotspotSchema$1.optional()),
3624
+ rotation: z.preprocess((value) => value == null ? void 0 : value, rotationSchema$1.optional())
3625
+ });
3626
+ const transformSchema$1 = z.object({
3627
+ aspectCrops: z.preprocess((value) => {
3628
+ if (!value || typeof value !== "object" || Array.isArray(value)) return;
3629
+ return value;
3630
+ }, z.record(z.string(), aspectCropSchema$1.catch({}))).optional(),
3631
+ rect: rectSchema$1.optional(),
3632
+ hotspot: hotspotSchema$1.optional(),
3633
+ rotation: rotationSchema$1.optional()
3634
+ });
3635
+ const mediaPosterSchema = z.discriminatedUnion("tag", [z.object({
3636
+ tag: z.literal("storage"),
3637
+ assetId: z.string().optional(),
3638
+ storageBucket: z.string().min(1),
3639
+ storagePath: z.string().min(1)
3640
+ }), z.object({
3641
+ tag: z.literal("external-src"),
3642
+ assetId: z.string().optional(),
3643
+ src: z.string().url()
3644
+ })]);
3645
+ const mediaBaseSchema = z.object({
3646
+ purpose: z.string().optional(),
3647
+ placeholder: z.boolean().default(true).optional(),
3648
+ assetId: z.string().optional(),
3649
+ identifier: z.string().optional(),
3650
+ src: z.string().optional(),
3651
+ alt: z.string().optional(),
3652
+ filename: z.string().optional(),
3653
+ mimeType: z.string().optional(),
3654
+ width: z.number().optional(),
3655
+ height: z.number().optional(),
3656
+ storageBucket: z.string().optional(),
3657
+ storagePath: z.string().optional(),
3658
+ poster: mediaPosterSchema.optional(),
3659
+ transform: transformSchema$1.optional()
3660
+ });
3661
+ /**
3662
+ * Canonical identifier carried by media values that are safe to persist.
3663
+ * Parsing trims boundary input so downstream writers cannot retain whitespace-only
3664
+ * identifiers or independently disagree about normalization.
3665
+ */
3666
+ const mediaIdentifierSchema = z.string().trim().min(1).brand();
3667
+ const imageMediaSchema = mediaBaseSchema.extend({ type: z.literal("image") });
3668
+ const videoMediaSchema = mediaBaseSchema.extend({ type: z.literal("video") });
3669
+ const audioMediaSchema = mediaBaseSchema.extend({ type: z.literal("audio") });
3670
+ const documentMediaSchema = mediaBaseSchema.extend({ type: z.literal("document") });
3671
+ const spreadsheetMediaSchema = mediaBaseSchema.extend({ type: z.literal("spreadsheet") });
3672
+ const archiveMediaSchema = mediaBaseSchema.extend({ type: z.literal("archive") });
3673
+ const mediaSchema$1 = z.discriminatedUnion("type", [
3674
+ imageMediaSchema,
3675
+ videoMediaSchema,
3676
+ audioMediaSchema,
3677
+ documentMediaSchema,
3678
+ spreadsheetMediaSchema,
3679
+ archiveMediaSchema
3680
+ ]);
3681
+ const persistableMediaBaseSchema = mediaBaseSchema.extend({ identifier: mediaIdentifierSchema });
3682
+ z.discriminatedUnion("type", [
3683
+ persistableMediaBaseSchema.extend({ type: z.literal("image") }),
3684
+ persistableMediaBaseSchema.extend({ type: z.literal("video") }),
3685
+ persistableMediaBaseSchema.extend({ type: z.literal("audio") }),
3686
+ persistableMediaBaseSchema.extend({ type: z.literal("document") }),
3687
+ persistableMediaBaseSchema.extend({ type: z.literal("spreadsheet") }),
3688
+ persistableMediaBaseSchema.extend({ type: z.literal("archive") })
3689
+ ]);
3597
3690
  //#endregion
3598
3691
  //#region ../blocks/src/system/manifest/fieldValidation/index.ts
3599
3692
  const TEL_RE = /^[+()0-9\s-]{3,}$/;
@@ -3883,7 +3976,7 @@ function canonicalizeFieldValueForWrite(plan, value) {
3883
3976
  case "media": {
3884
3977
  if (!isPlainObject$5(value)) return value;
3885
3978
  const canonical = { ...value };
3886
- if (typeof canonical.identifier === "string" && canonical.identifier.trim().length > 0) deleteEnvSpecificKeys(canonical);
3979
+ if (mediaIdentifierSchema.safeParse(canonical.identifier).success) deleteEnvSpecificKeys(canonical);
3887
3980
  return canonical;
3888
3981
  }
3889
3982
  case "group": return canonicalizeObjectForWrite(selectedGroupChildPlans(plan, value), value);
@@ -3978,7 +4071,7 @@ function normalizeObjectChildren(children, value, ctx) {
3978
4071
  function normalizeInlineTextFallbacks(plans, values, ctx) {
3979
4072
  for (const plan of plans) {
3980
4073
  if (plan.kind !== "inlineText" || !plan.plainTextFallbackPath) continue;
3981
- if (!isMissingForPlan(plan, values[plan.fieldId])) continue;
4074
+ if (!isMissingForPlan(plan, values[plan.fieldId]) && !(ctx.allowIncomplete && !parseInlineTextFromUnknown(values[plan.fieldId]).ok)) continue;
3982
4075
  const fallback = getAtFieldPath(values, plan.plainTextFallbackPath);
3983
4076
  if (typeof fallback !== "string" || fallback.trim().length === 0) continue;
3984
4077
  values[plan.fieldId] = normalizeFieldValue(plan, plainTextToInlineText(fallback), ctx);
@@ -4019,7 +4112,7 @@ function validateNormalizedFieldValue(plan, value, ctx) {
4019
4112
  case "select": return validateSelectPlan(plan, value);
4020
4113
  case "richText": return isValidRichTextDoc(value) ? [] : [issue(plan, "invalidRichText")];
4021
4114
  case "inlineText": return validateInlineTextPlan(plan, value);
4022
- 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")];
4115
+ 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")];
4023
4116
  case "link": return linkSchema.safeParse(value).success ? [] : [issue(plan, "invalidLink")];
4024
4117
  case "repeater": return validateRepeaterPlan(plan, value, ctx);
4025
4118
  case "group": return validateGroupPlan(plan, value, ctx);
@@ -4738,6 +4831,17 @@ function asAccessibleSurfaceToken(token) {
4738
4831
  return token;
4739
4832
  }
4740
4833
  //#endregion
4834
+ //#region ../theme-core/src/site-styles/lookOptionGroups.ts
4835
+ function defineLookOptionGroup(group) {
4836
+ defaultOption(group);
4837
+ return group;
4838
+ }
4839
+ function defaultOption(group) {
4840
+ const option = group.options.find((candidate) => candidate.id === group.defaultOptionId);
4841
+ if (option) return option;
4842
+ throw new Error(`Look option group "${group.id}" defaults to missing option "${group.defaultOptionId}".`);
4843
+ }
4844
+ //#endregion
4741
4845
  //#region ../theme-core/src/site-styles/types.ts
4742
4846
  /**
4743
4847
  * Defines a literal-preserving catalog while rejecting top-level extra keys on
@@ -4883,767 +4987,655 @@ function defineBlockDesignCapability(capability) {
4883
4987
  //#region ../theme-core/src/site-styles/appearancePresetResolution.ts
4884
4988
  function assertValidOptionGroups(preset) {
4885
4989
  preset.optionGroups?.forEach((group) => {
4886
- 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}".`);
4990
+ defineLookOptionGroup(group);
4887
4991
  });
4888
4992
  }
4889
4993
  function defineBlockAppearancePreset(preset) {
4890
4994
  assertValidOptionGroups(preset);
4891
4995
  return preset;
4892
4996
  }
4893
- [...[
4894
- defineBlockAppearancePreset({
4895
- kind: "block-design",
4896
- id: "hero-immersive-image",
4897
- target: "hero",
4898
- label: "Immersive image hero",
4899
- blockKinds: ["block.hero"],
4900
- constraints: { layoutFamilies: ["centered", "compact"] },
4901
- layoutPatches: [{
4902
- constraints: { layoutVariantKeys: ["micro"] },
4903
- designPatch: {
4904
- sectionHeight: "banner",
4905
- heroTypographyScale: "display"
4906
- }
4907
- }],
4908
- design: {
4909
- sectionSurface: "hero-image",
4910
- contentFrame: plainFrame,
4911
- itemSurface: "none",
4912
- sectionHeight: "hero",
4913
- heroComposition: "center",
4914
- heroTypographyScale: "display",
4915
- imageSurfaceTreatment: { kind: "neutral-wash" }
4997
+ //#endregion
4998
+ //#region ../theme-core/src/site-styles/blockAppearancePresets.ts
4999
+ const brandScrimOptionGroups = [{
5000
+ id: "image-surface-treatment",
5001
+ label: "Treatment",
5002
+ defaultOptionId: "brand-scrim-primary",
5003
+ options: [{
5004
+ id: "brand-scrim-primary",
5005
+ label: "Brand scrim",
5006
+ designPatch: { imageSurfaceTreatment: {
5007
+ kind: "brand-scrim",
5008
+ token: "primary"
5009
+ } }
5010
+ }, {
5011
+ id: "neutral-scrim",
5012
+ label: "Neutral scrim",
5013
+ designPatch: { imageSurfaceTreatment: { kind: "neutral-scrim" } }
5014
+ }]
5015
+ }];
5016
+ const microBannerLayoutPatches = [{
5017
+ constraints: { layoutVariantKeys: ["micro"] },
5018
+ designPatch: { sectionHeight: "banner" }
5019
+ }];
5020
+ defineBlockAppearancePreset({
5021
+ id: "hero-immersive-image",
5022
+ target: "hero",
5023
+ label: "Immersive image hero",
5024
+ blockKinds: ["block.hero"],
5025
+ constraints: { layoutFamilies: ["centered", "compact"] },
5026
+ layoutPatches: [{
5027
+ constraints: { layoutVariantKeys: ["micro"] },
5028
+ designPatch: {
5029
+ sectionHeight: "banner",
5030
+ heroTypographyScale: "display"
4916
5031
  }
4917
- }),
4918
- defineBlockAppearancePreset({
4919
- kind: "block-design",
4920
- id: "hero-bottom-left-panel",
4921
- target: "hero",
4922
- label: "Bottom-left panel hero",
4923
- blockKinds: ["block.hero"],
4924
- constraints: { layoutFamilies: ["centered", "compact"] },
4925
- optionGroups: [{
4926
- id: "image-surface-treatment",
4927
- label: "Treatment",
4928
- selectedOptionId: "neutral-scrim",
4929
- options: [{
4930
- id: "neutral-scrim",
4931
- label: "Neutral scrim",
4932
- designPatch: { imageSurfaceTreatment: {
4933
- kind: "neutral-scrim",
4934
- intensity: "balanced"
4935
- } }
4936
- }, {
4937
- id: "brand-scrim-primary",
4938
- label: "Brand scrim",
4939
- designPatch: { imageSurfaceTreatment: {
4940
- kind: "brand-scrim",
4941
- token: "primary",
4942
- intensity: "balanced"
4943
- } }
4944
- }]
4945
- }],
4946
- layoutPatches: [{
4947
- constraints: { layoutVariantKeys: ["micro"] },
4948
- designPatch: {
4949
- sectionHeight: "banner",
4950
- heroTypographyScale: "editorial"
4951
- }
4952
- }],
4953
- design: {
4954
- sectionSurface: "hero-image",
4955
- contentFrame: panelFrame("raised"),
4956
- itemSurface: "none",
4957
- sectionHeight: "immersive",
4958
- heroComposition: "bottom-left",
4959
- heroTypographyScale: "display",
4960
- imageSurfaceTreatment: {
5032
+ }],
5033
+ design: {
5034
+ sectionSurface: "hero-image",
5035
+ contentFrame: plainFrame,
5036
+ itemSurface: "none",
5037
+ sectionHeight: "hero",
5038
+ heroComposition: "center",
5039
+ heroTypographyScale: "display",
5040
+ imageSurfaceTreatment: { kind: "neutral-wash" }
5041
+ }
5042
+ }), defineBlockAppearancePreset({
5043
+ id: "hero-bottom-left-panel",
5044
+ target: "hero",
5045
+ label: "Bottom-left panel hero",
5046
+ blockKinds: ["block.hero"],
5047
+ constraints: { layoutFamilies: ["centered", "compact"] },
5048
+ optionGroups: [{
5049
+ id: "image-surface-treatment",
5050
+ label: "Treatment",
5051
+ defaultOptionId: "neutral-scrim",
5052
+ options: [{
5053
+ id: "neutral-scrim",
5054
+ label: "Neutral scrim",
5055
+ designPatch: { imageSurfaceTreatment: {
4961
5056
  kind: "neutral-scrim",
4962
5057
  intensity: "balanced"
4963
- }
4964
- }
4965
- }),
4966
- defineBlockAppearancePreset({
4967
- kind: "block-design",
4968
- id: "hero-poster-image",
4969
- target: "hero",
4970
- label: "Poster image hero",
4971
- blockKinds: ["block.hero"],
4972
- constraints: { layoutFamilies: ["centered", "compact"] },
4973
- layoutPatches: [{
4974
- constraints: { layoutVariantKeys: ["micro"] },
4975
- designPatch: {
4976
- sectionHeight: "banner",
4977
- heroTypographyScale: "display"
4978
- }
4979
- }],
4980
- design: {
4981
- sectionSurface: "hero-image",
4982
- contentFrame: plainFrame,
4983
- itemSurface: "none",
4984
- sectionHeight: "immersive",
4985
- heroComposition: "center",
4986
- heroTypographyScale: "poster",
4987
- imageSurfaceTreatment: {
5058
+ } }
5059
+ }, {
5060
+ id: "brand-scrim-primary",
5061
+ label: "Brand scrim",
5062
+ designPatch: { imageSurfaceTreatment: {
4988
5063
  kind: "brand-scrim",
4989
5064
  token: "primary",
4990
- intensity: "strong"
4991
- }
4992
- }
4993
- }),
4994
- defineBlockAppearancePreset({
4995
- kind: "block-design",
4996
- id: "hero-brand-scrim",
4997
- target: "hero",
4998
- label: "Brand scrim image hero",
4999
- blockKinds: ["block.hero"],
5000
- constraints: { layoutFamilies: ["centered", "compact"] },
5001
- optionGroups: [{
5002
- id: "image-surface-treatment",
5003
- label: "Treatment",
5004
- selectedOptionId: "brand-scrim-primary",
5005
- options: [{
5006
- id: "brand-scrim-primary",
5007
- label: "Brand scrim",
5008
- designPatch: { imageSurfaceTreatment: {
5009
- kind: "brand-scrim",
5010
- token: "primary"
5011
- } }
5012
- }, {
5013
- id: "neutral-scrim",
5014
- label: "Neutral scrim",
5015
- designPatch: { imageSurfaceTreatment: { kind: "neutral-scrim" } }
5016
- }]
5017
- }],
5018
- layoutPatches: [{
5019
- constraints: { layoutVariantKeys: ["micro"] },
5020
- designPatch: { sectionHeight: "banner" }
5021
- }],
5022
- design: {
5023
- sectionSurface: "hero-image",
5024
- contentFrame: plainFrame,
5025
- itemSurface: "none",
5026
- sectionHeight: "immersive",
5027
- heroComposition: "center",
5028
- heroTypographyScale: "display",
5029
- imageSurfaceTreatment: {
5030
- kind: "brand-scrim",
5031
- token: "primary"
5032
- }
5033
- }
5034
- }),
5035
- defineBlockAppearancePreset({
5036
- kind: "block-design",
5037
- id: "hero-brand-scrim-fixed-frame",
5038
- target: "hero",
5039
- label: "Fixed-frame brand scrim hero",
5040
- blockKinds: ["block.hero"],
5041
- constraints: { layoutFamilies: ["centered", "compact"] },
5042
- optionGroups: [{
5043
- id: "image-surface-treatment",
5044
- label: "Treatment",
5045
- selectedOptionId: "brand-scrim-primary",
5046
- options: [{
5047
- id: "brand-scrim-primary",
5048
- label: "Brand scrim",
5049
- designPatch: { imageSurfaceTreatment: {
5050
- kind: "brand-scrim",
5051
- token: "primary"
5052
- } }
5053
- }, {
5054
- id: "neutral-scrim",
5055
- label: "Neutral scrim",
5056
- designPatch: { imageSurfaceTreatment: { kind: "neutral-scrim" } }
5057
- }]
5058
- }],
5059
- layoutPatches: [{
5060
- constraints: { layoutVariantKeys: ["micro"] },
5061
- designPatch: { sectionHeight: "banner" }
5062
- }],
5063
- design: {
5064
- sectionSurface: "hero-image",
5065
- contentFrame: plainFrame,
5066
- itemSurface: "none",
5067
- sectionHeight: "immersive",
5068
- heroComposition: "center",
5069
- heroTypographyScale: "display",
5070
- imageSurfaceTreatment: {
5071
- kind: "brand-scrim",
5072
- token: "primary"
5073
- },
5074
- imageSurfaceMotion: "fixed-frame",
5075
- eyebrowTreatment: "accent-pill-bounce"
5076
- }
5077
- }),
5078
- defineBlockAppearancePreset({
5079
- kind: "block-design",
5080
- id: "hero-brand-depth-expressive",
5081
- target: "hero",
5082
- label: "Expressive brand-depth hero",
5083
- blockKinds: ["block.hero"],
5084
- constraints: { layoutFamilies: ["centered", "compact"] },
5085
- design: {
5086
- sectionSurface: "brand-depth-band",
5087
- contentFrame: plainFrame,
5088
- itemSurface: "none",
5089
- heroComposition: "center",
5090
- heroTypographyScale: "editorial",
5091
- eyebrowTreatment: "accent-pill-bounce"
5092
- }
5093
- }),
5094
- defineBlockAppearancePreset({
5095
- kind: "block-design",
5096
- id: "hero-contained-intro",
5097
- target: "hero",
5098
- label: "Contained intro hero",
5099
- blockKinds: ["block.hero"],
5100
- design: {
5101
- sectionSurface: "muted-band",
5102
- contentFrame: panelFrame("inset"),
5103
- itemSurface: "none",
5104
- heroComposition: "center",
5105
- heroTypographyScale: "editorial"
5106
- }
5107
- }),
5108
- defineBlockAppearancePreset({
5109
- kind: "block-design",
5110
- id: "hero-split-editorial",
5111
- target: "hero",
5112
- label: "Editorial split hero",
5113
- blockKinds: ["block.hero"],
5114
- constraints: { layoutFamilies: ["split"] },
5115
- design: {
5116
- sectionSurface: "base",
5117
- contentFrame: plainFrame,
5118
- itemSurface: "none",
5119
- heroTypographyScale: "editorial"
5120
- }
5121
- }),
5122
- defineBlockAppearancePreset({
5123
- kind: "block-design",
5124
- id: "hero-split-brand",
5125
- target: "hero",
5126
- label: "Brand split hero",
5127
- blockKinds: ["block.hero"],
5128
- constraints: { layoutFamilies: ["split"] },
5129
- design: {
5130
- sectionSurface: "brand-depth-band",
5131
- contentFrame: plainFrame,
5132
- itemSurface: "none",
5133
- heroTypographyScale: "display",
5134
- eyebrowTreatment: "accent-pill-bounce"
5135
- }
5136
- }),
5137
- defineBlockAppearancePreset({
5138
- kind: "block-design",
5139
- id: "hero-split-soft-panel",
5140
- target: "hero",
5141
- label: "Soft panel split hero",
5142
- blockKinds: ["block.hero"],
5143
- constraints: { layoutFamilies: ["split"] },
5144
- design: {
5145
- sectionSurface: "muted-band",
5146
- contentFrame: panelFrame("raised"),
5147
- itemSurface: "none",
5065
+ intensity: "balanced"
5066
+ } }
5067
+ }]
5068
+ }],
5069
+ layoutPatches: [{
5070
+ constraints: { layoutVariantKeys: ["micro"] },
5071
+ designPatch: {
5072
+ sectionHeight: "banner",
5148
5073
  heroTypographyScale: "editorial"
5149
5074
  }
5150
- }),
5151
- defineBlockAppearancePreset({
5152
- kind: "block-design",
5153
- id: "hero-split-accent",
5154
- target: "hero",
5155
- label: "Accent split hero",
5156
- blockKinds: ["block.hero"],
5157
- constraints: { layoutFamilies: ["split"] },
5158
- design: {
5159
- sectionSurface: "accent-band",
5160
- contentFrame: panelFrame("raised"),
5161
- itemSurface: "none",
5075
+ }],
5076
+ design: {
5077
+ sectionSurface: "hero-image",
5078
+ contentFrame: panelFrame("raised"),
5079
+ itemSurface: "none",
5080
+ sectionHeight: "immersive",
5081
+ heroComposition: "bottom-left",
5082
+ heroTypographyScale: "display",
5083
+ imageSurfaceTreatment: {
5084
+ kind: "neutral-scrim",
5085
+ intensity: "balanced"
5086
+ }
5087
+ }
5088
+ }), defineBlockAppearancePreset({
5089
+ id: "hero-poster-image",
5090
+ target: "hero",
5091
+ label: "Poster image hero",
5092
+ blockKinds: ["block.hero"],
5093
+ constraints: { layoutFamilies: ["centered", "compact"] },
5094
+ layoutPatches: [{
5095
+ constraints: { layoutVariantKeys: ["micro"] },
5096
+ designPatch: {
5097
+ sectionHeight: "banner",
5162
5098
  heroTypographyScale: "display"
5163
5099
  }
5164
- }),
5165
- defineBlockAppearancePreset({
5166
- kind: "block-design",
5167
- id: "intro-editorial-statement",
5168
- target: "intro",
5169
- label: "Editorial intro statement",
5170
- blockKinds: ["block.intro"],
5171
- constraints: { layoutVariantKeys: ["centered-copy", "statement-copy"] },
5172
- design: {
5173
- sectionSurface: "base",
5174
- contentFrame: plainFrame,
5175
- itemSurface: "none",
5176
- composition: {
5177
- kind: "intro",
5178
- treatment: "editorial-statement"
5179
- }
5180
- }
5181
- }),
5182
- defineBlockAppearancePreset({
5183
- kind: "block-design",
5184
- id: "intro-portrait-bio",
5185
- target: "intro",
5186
- label: "Portrait and bio",
5187
- blockKinds: ["block.intro"],
5188
- constraints: { layoutVariantKeys: ["media-copy"] },
5189
- design: {
5190
- sectionSurface: "base",
5191
- contentFrame: plainFrame,
5192
- itemSurface: "none",
5193
- composition: {
5194
- kind: "intro",
5195
- treatment: "portrait-bio"
5196
- }
5197
- }
5198
- }),
5199
- defineBlockAppearancePreset({
5200
- kind: "block-design",
5201
- id: "offerings-preview-default-cards",
5202
- target: "offerings",
5203
- label: "Default offering cards",
5204
- blockKinds: ["block.offerings-preview"],
5205
- design: {
5206
- sectionSurface: "base",
5207
- contentFrame: plainFrame,
5208
- itemSurface: "default"
5209
- }
5210
- }),
5211
- defineBlockAppearancePreset({
5212
- kind: "block-design",
5213
- id: "offerings-preview-secondary-cards",
5214
- target: "offerings",
5215
- label: "Secondary offering cards",
5216
- blockKinds: ["block.offerings-preview"],
5217
- design: {
5218
- sectionSurface: "muted-band",
5219
- contentFrame: plainFrame,
5220
- itemSurface: "inset"
5221
- }
5222
- }),
5223
- defineBlockAppearancePreset({
5224
- kind: "block-design",
5225
- id: "offerings-preview-non-carded",
5226
- target: "offerings",
5227
- label: "Non-carded offerings",
5228
- blockKinds: ["block.offerings-preview"],
5229
- design: {
5230
- sectionSurface: "muted-band",
5231
- contentFrame: plainFrame,
5232
- itemSurface: "editorial"
5233
- }
5234
- }),
5235
- defineBlockAppearancePreset({
5236
- kind: "block-design",
5237
- id: "offerings-preview-paired-feature-cards",
5238
- target: "offerings",
5239
- label: "Paired feature cards",
5240
- blockKinds: ["block.offerings-preview"],
5241
- constraints: { layoutVariantKeys: ["cards"] },
5242
- design: {
5243
- sectionSurface: "base",
5244
- contentFrame: plainFrame,
5245
- itemSurface: "none"
5246
- }
5247
- }),
5248
- defineBlockAppearancePreset({
5249
- kind: "block-design",
5250
- id: "offerings-preview-open-editorial-columns",
5251
- target: "offerings",
5252
- label: "Open editorial columns",
5253
- blockKinds: ["block.offerings-preview"],
5254
- constraints: { layoutVariantKeys: ["cards"] },
5255
- design: {
5256
- sectionSurface: "base",
5257
- contentFrame: plainFrame,
5258
- itemSurface: "none"
5259
- }
5260
- }),
5261
- defineBlockAppearancePreset({
5262
- kind: "block-design",
5263
- id: "offerings-preview-joined-programme-panel",
5264
- target: "offerings",
5265
- label: "Joined programme panel",
5266
- blockKinds: ["block.offerings-preview"],
5267
- constraints: { layoutVariantKeys: ["cards"] },
5268
- design: {
5269
- sectionSurface: "base",
5270
- contentFrame: plainFrame,
5271
- itemSurface: "none"
5272
- }
5273
- }),
5274
- defineBlockAppearancePreset({
5275
- kind: "block-design",
5276
- id: "feature-cards-raised-rule",
5277
- target: "feature-cards",
5278
- label: "Raised cards with rule",
5279
- blockKinds: ["block.feature-cards"],
5280
- design: {
5281
- sectionSurface: "base",
5282
- contentFrame: plainFrame,
5283
- itemSurface: "raised"
5284
- }
5285
- }),
5286
- defineBlockAppearancePreset({
5287
- kind: "block-design",
5288
- id: "feature-cards-bold-colors",
5289
- target: "feature-cards",
5290
- label: "Bold colour-blocked cards",
5291
- blockKinds: ["block.feature-cards"],
5292
- design: {
5293
- sectionSurface: "base",
5294
- contentFrame: plainFrame,
5295
- itemSurface: "color-blocked"
5296
- }
5297
- }),
5298
- defineBlockAppearancePreset({
5299
- kind: "block-design",
5300
- id: "feature-cards-editorial-columns",
5301
- target: "feature-cards",
5302
- label: "Editorial open columns",
5303
- blockKinds: ["block.feature-cards"],
5304
- design: {
5305
- sectionSurface: "base",
5306
- contentFrame: plainFrame,
5307
- itemSurface: "editorial"
5308
- }
5309
- }),
5310
- defineBlockAppearancePreset({
5311
- kind: "block-design",
5312
- id: "feature-cards-asymmetric-emphasis",
5313
- target: "feature-cards",
5314
- label: "Asymmetric emphasis pair",
5315
- blockKinds: ["block.feature-cards"],
5316
- constraints: { layoutFamilies: ["grid"] },
5317
- design: {
5318
- sectionSurface: "base",
5319
- contentFrame: plainFrame,
5320
- itemSurface: "none",
5321
- composition: {
5322
- kind: "feature-cards",
5323
- treatment: "asymmetric-emphasis"
5324
- }
5325
- }
5326
- }),
5327
- defineBlockAppearancePreset({
5328
- kind: "block-design",
5329
- id: "feature-cards-framed-programme",
5330
- target: "feature-cards",
5331
- label: "Framed programme cards",
5332
- blockKinds: ["block.feature-cards"],
5333
- constraints: { layoutFamilies: ["grid"] },
5334
- design: {
5335
- sectionSurface: "brand-depth-band",
5336
- contentFrame: plainFrame,
5337
- itemSurface: "inset",
5338
- composition: {
5339
- kind: "feature-cards",
5340
- treatment: "framed-programme"
5341
- }
5342
- }
5343
- }),
5344
- defineBlockAppearancePreset({
5345
- kind: "block-design",
5346
- id: "feature-cards-soft-panels",
5347
- target: "feature-cards",
5348
- label: "Soft tinted panels",
5349
- blockKinds: ["block.feature-cards"],
5350
- design: {
5351
- sectionSurface: "base",
5352
- contentFrame: plainFrame,
5353
- itemSurface: "inset"
5354
- }
5355
- }),
5356
- defineBlockAppearancePreset({
5357
- kind: "block-design",
5358
- id: "feature-cards-editorial-diptych",
5359
- target: "feature-cards",
5360
- label: "Editorial diptych",
5361
- blockKinds: ["block.feature-cards"],
5362
- constraints: { layoutVariantKeys: ["editorial-diptych"] },
5363
- design: {
5364
- sectionSurface: "base",
5365
- contentFrame: plainFrame,
5366
- itemSurface: "flat"
5367
- }
5368
- }),
5369
- defineBlockAppearancePreset({
5370
- kind: "block-design",
5371
- id: "feature-cards-editorial-pathways",
5372
- target: "feature-cards",
5373
- label: "Editorial pathways",
5374
- blockKinds: ["block.feature-cards"],
5375
- constraints: { layoutVariantKeys: ["editorial-pathways"] },
5376
- design: {
5377
- sectionSurface: "base",
5378
- contentFrame: plainFrame,
5379
- itemSurface: "flat"
5380
- }
5381
- }),
5382
- defineBlockAppearancePreset({
5383
- kind: "block-design",
5384
- id: "feature-cards-photo-tiles",
5385
- target: "feature-cards",
5386
- label: "Photo tiles",
5387
- blockKinds: ["block.feature-cards"],
5388
- design: {
5389
- sectionSurface: "base",
5390
- contentFrame: plainFrame,
5391
- itemSurface: "raised"
5392
- }
5393
- }),
5394
- defineBlockAppearancePreset({
5395
- kind: "block-design",
5396
- id: "events-lined-panel",
5397
- target: "events",
5398
- label: "Raised event panel",
5399
- blockKinds: ["block.event-calendar", "block.event-listing"],
5400
- design: {
5401
- sectionSurface: "base",
5402
- contentFrame: panelFrame("raised"),
5403
- itemSurface: "none"
5404
- }
5405
- }),
5406
- defineBlockAppearancePreset({
5407
- kind: "block-design",
5408
- id: "events-ruled-register",
5409
- target: "events",
5410
- label: "Ruled event register",
5411
- blockKinds: ["block.event-calendar", "block.event-listing"],
5412
- design: {
5413
- sectionSurface: "brand-depth-band",
5414
- contentFrame: plainFrame,
5415
- itemSurface: "none",
5416
- eventListTreatment: "ruled-register"
5417
- }
5418
- }),
5419
- defineBlockAppearancePreset({
5420
- kind: "block-design",
5421
- id: "events-editorial-register",
5422
- target: "events",
5423
- label: "Editorial event register",
5424
- blockKinds: ["block.event-calendar", "block.event-listing"],
5425
- design: {
5426
- sectionSurface: "base",
5427
- contentFrame: plainFrame,
5428
- itemSurface: "none",
5429
- eventListTreatment: "editorial-register"
5430
- }
5431
- }),
5432
- defineBlockAppearancePreset({
5433
- kind: "block-design",
5434
- id: "events-dense-index",
5435
- target: "events",
5436
- label: "Dense event index",
5437
- blockKinds: ["block.event-calendar", "block.event-listing"],
5438
- design: {
5439
- sectionSurface: "accent-band",
5440
- contentFrame: plainFrame,
5441
- itemSurface: "none",
5442
- eventListTreatment: "dense-index"
5443
- }
5444
- }),
5445
- defineBlockAppearancePreset({
5446
- kind: "block-design",
5447
- id: "schedule-details-brand-depth",
5448
- target: "events",
5449
- label: "Brand-depth schedule details",
5450
- blockKinds: ["block.event-details", "block.course-details"],
5451
- design: {
5452
- sectionSurface: "brand-depth-band",
5453
- contentFrame: plainFrame,
5454
- itemSurface: "none",
5455
- tileTreatment: "brand-depth"
5456
- }
5457
- }),
5458
- defineBlockAppearancePreset({
5459
- kind: "block-design",
5460
- id: "media-text-flush-feature",
5461
- target: "media-text",
5462
- label: "Flush media feature",
5463
- blockKinds: ["block.media-text"],
5464
- design: {
5465
- sectionSurface: "muted-band",
5466
- contentFrame: flushPanelFrame({ bleed: "start" }),
5467
- itemSurface: "none"
5468
- }
5469
- }),
5470
- defineBlockAppearancePreset({
5471
- kind: "block-design",
5472
- id: "testimonials-simple-cards",
5473
- target: "testimonials",
5474
- label: "Simple testimonial cards",
5475
- blockKinds: ["block.testimonials"],
5476
- design: {
5477
- sectionSurface: "base",
5478
- contentFrame: plainFrame,
5479
- itemSurface: "default"
5480
- }
5481
- }),
5482
- defineBlockAppearancePreset({
5483
- kind: "block-design",
5484
- id: "testimonials-raised-panel",
5485
- target: "testimonials",
5486
- label: "Raised testimonial panel",
5487
- blockKinds: ["block.testimonials"],
5488
- design: {
5489
- sectionSurface: "muted-band",
5490
- contentFrame: panelFrame("raised"),
5491
- itemSurface: "raised"
5492
- }
5493
- }),
5494
- defineBlockAppearancePreset({
5495
- kind: "block-design",
5496
- id: "testimonials-accent-panel",
5497
- target: "testimonials",
5498
- label: "Accent testimonial panel",
5499
- blockKinds: ["block.testimonials"],
5500
- design: {
5501
- sectionSurface: "accent-band",
5502
- contentFrame: panelFrame("raised"),
5503
- itemSurface: "raised"
5504
- }
5505
- }),
5506
- defineBlockAppearancePreset({
5507
- kind: "block-design",
5508
- id: "testimonials-default-cards",
5509
- target: "testimonials",
5510
- label: "Default cards",
5511
- blockKinds: ["block.testimonials"],
5512
- design: {
5513
- sectionSurface: "base",
5514
- contentFrame: plainFrame,
5515
- itemSurface: "none",
5516
- testimonialCardTreatment: "default"
5517
- }
5518
- }),
5519
- defineBlockAppearancePreset({
5520
- kind: "block-design",
5521
- id: "testimonials-statement-cards",
5522
- target: "testimonials",
5523
- label: "Statement cards",
5524
- blockKinds: ["block.testimonials"],
5525
- design: {
5526
- sectionSurface: "accent-band",
5527
- contentFrame: plainFrame,
5528
- itemSurface: "raised",
5529
- testimonialCardTreatment: "statement"
5530
- }
5531
- }),
5532
- defineBlockAppearancePreset({
5533
- kind: "block-design",
5534
- id: "testimonials-brand-statement-cards",
5535
- target: "testimonials",
5536
- label: "Brand statement cards",
5537
- blockKinds: ["block.testimonials"],
5538
- design: {
5539
- sectionSurface: "brand-depth-band",
5540
- contentFrame: plainFrame,
5541
- itemSurface: "raised",
5542
- testimonialCardTreatment: "statement"
5543
- }
5544
- }),
5545
- defineBlockAppearancePreset({
5546
- kind: "block-design",
5547
- id: "testimonials-non-carded",
5548
- target: "testimonials",
5549
- label: "Non-carded",
5550
- blockKinds: ["block.testimonials"],
5551
- design: {
5552
- sectionSurface: "muted-band",
5553
- contentFrame: plainFrame,
5554
- itemSurface: "none",
5555
- testimonialCardTreatment: "non-carded"
5556
- }
5557
- }),
5558
- defineBlockAppearancePreset({
5559
- kind: "block-design",
5560
- id: "testimonials-evergreen-lead",
5561
- target: "testimonials",
5562
- label: "Evergreen lead",
5563
- blockKinds: ["block.testimonials"],
5564
- constraints: { layoutVariantKeys: ["featured-editorial"] },
5565
- design: {
5566
- sectionSurface: "base",
5567
- contentFrame: plainFrame,
5568
- itemSurface: "none"
5569
- }
5570
- }),
5571
- defineBlockAppearancePreset({
5572
- kind: "block-design",
5573
- id: "testimonials-room-and-response",
5574
- target: "testimonials",
5575
- label: "Room and response",
5576
- blockKinds: ["block.testimonials"],
5577
- constraints: { layoutVariantKeys: ["featured-editorial"] },
5578
- design: {
5579
- sectionSurface: "base",
5580
- contentFrame: plainFrame,
5581
- itemSurface: "none"
5582
- }
5583
- }),
5584
- defineBlockAppearancePreset({
5585
- kind: "block-design",
5586
- id: "testimonials-open-floor",
5587
- target: "testimonials",
5588
- label: "Open floor",
5589
- blockKinds: ["block.testimonials"],
5590
- constraints: { layoutVariantKeys: ["featured-editorial"] },
5591
- design: {
5592
- sectionSurface: "base",
5593
- contentFrame: plainFrame,
5594
- itemSurface: "none"
5595
- }
5596
- }),
5597
- defineBlockAppearancePreset({
5598
- kind: "block-design",
5599
- id: "faq-base-accordion",
5600
- target: "faq",
5601
- label: "Base accordion FAQ",
5602
- blockKinds: ["block.faq"],
5603
- design: {
5604
- sectionSurface: "base",
5605
- contentFrame: plainFrame,
5606
- itemSurface: "default"
5607
- }
5608
- }),
5609
- defineBlockAppearancePreset({
5610
- kind: "block-design",
5611
- id: "faq-contained-help",
5612
- target: "faq",
5613
- label: "Contained help panel",
5614
- blockKinds: ["block.faq"],
5615
- design: {
5616
- sectionSurface: "muted-band",
5617
- contentFrame: panelFrame("inset"),
5618
- itemSurface: "default"
5619
- }
5620
- }),
5621
- defineBlockAppearancePreset({
5622
- kind: "block-design",
5623
- id: "contact-form-panel",
5624
- target: "contact-form",
5625
- label: "Raised form panel",
5626
- blockKinds: ["block.form"],
5627
- design: {
5628
- sectionSurface: "muted-band",
5629
- contentFrame: panelFrame("raised"),
5630
- itemSurface: "none"
5631
- }
5632
- }),
5633
- defineBlockAppearancePreset({
5634
- kind: "block-design",
5635
- id: "cta-accent-band",
5636
- target: "cta",
5637
- label: "Accent CTA band",
5638
- blockKinds: ["block.cta-full"],
5639
- design: {
5640
- sectionSurface: "accent-band",
5641
- contentFrame: plainFrame,
5642
- itemSurface: "none",
5643
- eyebrowTreatment: "accent"
5644
- }
5645
- })
5646
- ]];
5100
+ }],
5101
+ design: {
5102
+ sectionSurface: "hero-image",
5103
+ contentFrame: plainFrame,
5104
+ itemSurface: "none",
5105
+ sectionHeight: "immersive",
5106
+ heroComposition: "center",
5107
+ heroTypographyScale: "poster",
5108
+ imageSurfaceTreatment: {
5109
+ kind: "brand-scrim",
5110
+ token: "primary",
5111
+ intensity: "strong"
5112
+ }
5113
+ }
5114
+ }), defineBlockAppearancePreset({
5115
+ id: "hero-brand-scrim",
5116
+ target: "hero",
5117
+ label: "Brand scrim image hero",
5118
+ blockKinds: ["block.hero"],
5119
+ constraints: { layoutFamilies: ["centered", "compact"] },
5120
+ optionGroups: brandScrimOptionGroups,
5121
+ layoutPatches: microBannerLayoutPatches,
5122
+ design: {
5123
+ sectionSurface: "hero-image",
5124
+ contentFrame: plainFrame,
5125
+ itemSurface: "none",
5126
+ sectionHeight: "immersive",
5127
+ heroComposition: "center",
5128
+ heroTypographyScale: "display",
5129
+ imageSurfaceTreatment: {
5130
+ kind: "brand-scrim",
5131
+ token: "primary"
5132
+ }
5133
+ }
5134
+ }), defineBlockAppearancePreset({
5135
+ id: "hero-brand-scrim-fixed-frame",
5136
+ target: "hero",
5137
+ label: "Fixed-frame brand scrim hero",
5138
+ blockKinds: ["block.hero"],
5139
+ constraints: { layoutFamilies: ["centered", "compact"] },
5140
+ optionGroups: brandScrimOptionGroups,
5141
+ layoutPatches: microBannerLayoutPatches,
5142
+ design: {
5143
+ sectionSurface: "hero-image",
5144
+ contentFrame: plainFrame,
5145
+ itemSurface: "none",
5146
+ sectionHeight: "immersive",
5147
+ heroComposition: "center",
5148
+ heroTypographyScale: "display",
5149
+ imageSurfaceTreatment: {
5150
+ kind: "brand-scrim",
5151
+ token: "primary"
5152
+ },
5153
+ imageSurfaceMotion: "fixed-frame",
5154
+ eyebrowTreatment: "accent-pill-bounce"
5155
+ }
5156
+ }), defineBlockAppearancePreset({
5157
+ id: "hero-brand-depth-expressive",
5158
+ target: "hero",
5159
+ label: "Expressive brand-depth hero",
5160
+ blockKinds: ["block.hero"],
5161
+ constraints: { layoutFamilies: ["centered", "compact"] },
5162
+ design: {
5163
+ sectionSurface: "brand-depth-band",
5164
+ contentFrame: plainFrame,
5165
+ itemSurface: "none",
5166
+ heroComposition: "center",
5167
+ heroTypographyScale: "editorial",
5168
+ eyebrowTreatment: "accent-pill-bounce"
5169
+ }
5170
+ }), defineBlockAppearancePreset({
5171
+ id: "hero-contained-intro",
5172
+ target: "hero",
5173
+ label: "Contained intro hero",
5174
+ blockKinds: ["block.hero"],
5175
+ design: {
5176
+ sectionSurface: "muted-band",
5177
+ contentFrame: panelFrame("inset"),
5178
+ itemSurface: "none",
5179
+ heroComposition: "center",
5180
+ heroTypographyScale: "editorial"
5181
+ }
5182
+ }), defineBlockAppearancePreset({
5183
+ id: "hero-split-editorial",
5184
+ target: "hero",
5185
+ label: "Editorial split hero",
5186
+ blockKinds: ["block.hero"],
5187
+ constraints: { layoutFamilies: ["split"] },
5188
+ design: {
5189
+ sectionSurface: "base",
5190
+ contentFrame: plainFrame,
5191
+ itemSurface: "none",
5192
+ heroTypographyScale: "editorial"
5193
+ }
5194
+ }), defineBlockAppearancePreset({
5195
+ id: "hero-split-brand",
5196
+ target: "hero",
5197
+ label: "Brand split hero",
5198
+ blockKinds: ["block.hero"],
5199
+ constraints: { layoutFamilies: ["split"] },
5200
+ design: {
5201
+ sectionSurface: "brand-depth-band",
5202
+ contentFrame: plainFrame,
5203
+ itemSurface: "none",
5204
+ heroTypographyScale: "display",
5205
+ eyebrowTreatment: "accent-pill-bounce"
5206
+ }
5207
+ }), defineBlockAppearancePreset({
5208
+ id: "hero-split-soft-panel",
5209
+ target: "hero",
5210
+ label: "Soft panel split hero",
5211
+ blockKinds: ["block.hero"],
5212
+ constraints: { layoutFamilies: ["split"] },
5213
+ design: {
5214
+ sectionSurface: "muted-band",
5215
+ contentFrame: panelFrame("raised"),
5216
+ itemSurface: "none",
5217
+ heroTypographyScale: "editorial"
5218
+ }
5219
+ }), defineBlockAppearancePreset({
5220
+ id: "hero-split-accent",
5221
+ target: "hero",
5222
+ label: "Accent split hero",
5223
+ blockKinds: ["block.hero"],
5224
+ constraints: { layoutFamilies: ["split"] },
5225
+ design: {
5226
+ sectionSurface: "accent-band",
5227
+ contentFrame: panelFrame("raised"),
5228
+ itemSurface: "none",
5229
+ heroTypographyScale: "display"
5230
+ }
5231
+ }), defineBlockAppearancePreset({
5232
+ id: "intro-editorial-statement",
5233
+ target: "intro",
5234
+ label: "Editorial intro statement",
5235
+ blockKinds: ["block.intro"],
5236
+ constraints: { layoutVariantKeys: ["centered-copy", "statement-copy"] },
5237
+ design: {
5238
+ sectionSurface: "base",
5239
+ contentFrame: plainFrame,
5240
+ itemSurface: "none",
5241
+ composition: {
5242
+ kind: "intro",
5243
+ treatment: "editorial-statement"
5244
+ }
5245
+ }
5246
+ }), defineBlockAppearancePreset({
5247
+ id: "intro-portrait-bio",
5248
+ target: "intro",
5249
+ label: "Portrait and bio",
5250
+ blockKinds: ["block.intro"],
5251
+ constraints: { layoutVariantKeys: ["media-copy"] },
5252
+ design: {
5253
+ sectionSurface: "base",
5254
+ contentFrame: plainFrame,
5255
+ itemSurface: "none",
5256
+ composition: {
5257
+ kind: "intro",
5258
+ treatment: "portrait-bio"
5259
+ }
5260
+ }
5261
+ }), defineBlockAppearancePreset({
5262
+ id: "offerings-preview-default-cards",
5263
+ target: "offerings",
5264
+ label: "Default offering cards",
5265
+ blockKinds: ["block.offerings-preview"],
5266
+ design: {
5267
+ sectionSurface: "base",
5268
+ contentFrame: plainFrame,
5269
+ itemSurface: "default"
5270
+ }
5271
+ }), defineBlockAppearancePreset({
5272
+ id: "offerings-preview-secondary-cards",
5273
+ target: "offerings",
5274
+ label: "Secondary offering cards",
5275
+ blockKinds: ["block.offerings-preview"],
5276
+ design: {
5277
+ sectionSurface: "muted-band",
5278
+ contentFrame: plainFrame,
5279
+ itemSurface: "inset"
5280
+ }
5281
+ }), defineBlockAppearancePreset({
5282
+ id: "offerings-preview-non-carded",
5283
+ target: "offerings",
5284
+ label: "Non-carded offerings",
5285
+ blockKinds: ["block.offerings-preview"],
5286
+ design: {
5287
+ sectionSurface: "muted-band",
5288
+ contentFrame: plainFrame,
5289
+ itemSurface: "editorial"
5290
+ }
5291
+ }), defineBlockAppearancePreset({
5292
+ id: "offerings-preview-paired-feature-cards",
5293
+ target: "offerings",
5294
+ label: "Paired feature cards",
5295
+ blockKinds: ["block.offerings-preview"],
5296
+ constraints: { layoutVariantKeys: ["cards"] },
5297
+ design: {
5298
+ sectionSurface: "base",
5299
+ contentFrame: plainFrame,
5300
+ itemSurface: "none"
5301
+ }
5302
+ }), defineBlockAppearancePreset({
5303
+ id: "offerings-preview-open-editorial-columns",
5304
+ target: "offerings",
5305
+ label: "Open editorial columns",
5306
+ blockKinds: ["block.offerings-preview"],
5307
+ constraints: { layoutVariantKeys: ["cards"] },
5308
+ design: {
5309
+ sectionSurface: "base",
5310
+ contentFrame: plainFrame,
5311
+ itemSurface: "none"
5312
+ }
5313
+ }), defineBlockAppearancePreset({
5314
+ id: "offerings-preview-joined-programme-panel",
5315
+ target: "offerings",
5316
+ label: "Joined programme panel",
5317
+ blockKinds: ["block.offerings-preview"],
5318
+ constraints: { layoutVariantKeys: ["cards"] },
5319
+ design: {
5320
+ sectionSurface: "base",
5321
+ contentFrame: plainFrame,
5322
+ itemSurface: "none"
5323
+ }
5324
+ }), defineBlockAppearancePreset({
5325
+ id: "feature-cards-raised-rule",
5326
+ target: "feature-cards",
5327
+ label: "Raised cards with rule",
5328
+ blockKinds: ["block.feature-cards"],
5329
+ design: {
5330
+ sectionSurface: "base",
5331
+ contentFrame: plainFrame,
5332
+ itemSurface: "raised"
5333
+ }
5334
+ }), defineBlockAppearancePreset({
5335
+ id: "feature-cards-bold-colors",
5336
+ target: "feature-cards",
5337
+ label: "Bold colour-blocked cards",
5338
+ blockKinds: ["block.feature-cards"],
5339
+ design: {
5340
+ sectionSurface: "base",
5341
+ contentFrame: plainFrame,
5342
+ itemSurface: "color-blocked"
5343
+ }
5344
+ }), defineBlockAppearancePreset({
5345
+ id: "feature-cards-editorial-columns",
5346
+ target: "feature-cards",
5347
+ label: "Editorial open columns",
5348
+ blockKinds: ["block.feature-cards"],
5349
+ design: {
5350
+ sectionSurface: "base",
5351
+ contentFrame: plainFrame,
5352
+ itemSurface: "editorial"
5353
+ }
5354
+ }), defineBlockAppearancePreset({
5355
+ id: "feature-cards-asymmetric-emphasis",
5356
+ target: "feature-cards",
5357
+ label: "Asymmetric emphasis pair",
5358
+ blockKinds: ["block.feature-cards"],
5359
+ constraints: { layoutFamilies: ["grid"] },
5360
+ design: {
5361
+ sectionSurface: "base",
5362
+ contentFrame: plainFrame,
5363
+ itemSurface: "none",
5364
+ composition: {
5365
+ kind: "feature-cards",
5366
+ treatment: "asymmetric-emphasis"
5367
+ }
5368
+ }
5369
+ }), defineBlockAppearancePreset({
5370
+ id: "feature-cards-framed-programme",
5371
+ target: "feature-cards",
5372
+ label: "Framed programme cards",
5373
+ blockKinds: ["block.feature-cards"],
5374
+ constraints: { layoutFamilies: ["grid"] },
5375
+ design: {
5376
+ sectionSurface: "brand-depth-band",
5377
+ contentFrame: plainFrame,
5378
+ itemSurface: "inset",
5379
+ composition: {
5380
+ kind: "feature-cards",
5381
+ treatment: "framed-programme"
5382
+ }
5383
+ }
5384
+ }), defineBlockAppearancePreset({
5385
+ id: "feature-cards-soft-panels",
5386
+ target: "feature-cards",
5387
+ label: "Soft tinted panels",
5388
+ blockKinds: ["block.feature-cards"],
5389
+ design: {
5390
+ sectionSurface: "base",
5391
+ contentFrame: plainFrame,
5392
+ itemSurface: "inset"
5393
+ }
5394
+ }), defineBlockAppearancePreset({
5395
+ id: "feature-cards-editorial-diptych",
5396
+ target: "feature-cards",
5397
+ label: "Editorial diptych",
5398
+ blockKinds: ["block.feature-cards"],
5399
+ constraints: { layoutVariantKeys: ["editorial-diptych"] },
5400
+ design: {
5401
+ sectionSurface: "base",
5402
+ contentFrame: plainFrame,
5403
+ itemSurface: "flat"
5404
+ }
5405
+ }), defineBlockAppearancePreset({
5406
+ id: "feature-cards-editorial-pathways",
5407
+ target: "feature-cards",
5408
+ label: "Editorial pathways",
5409
+ blockKinds: ["block.feature-cards"],
5410
+ constraints: { layoutVariantKeys: ["editorial-pathways"] },
5411
+ design: {
5412
+ sectionSurface: "base",
5413
+ contentFrame: plainFrame,
5414
+ itemSurface: "flat"
5415
+ }
5416
+ }), defineBlockAppearancePreset({
5417
+ id: "feature-cards-photo-tiles",
5418
+ target: "feature-cards",
5419
+ label: "Photo tiles",
5420
+ blockKinds: ["block.feature-cards"],
5421
+ design: {
5422
+ sectionSurface: "base",
5423
+ contentFrame: plainFrame,
5424
+ itemSurface: "raised"
5425
+ }
5426
+ }), defineBlockAppearancePreset({
5427
+ id: "events-lined-panel",
5428
+ target: "events",
5429
+ label: "Raised event panel",
5430
+ blockKinds: ["block.event-calendar", "block.event-listing"],
5431
+ design: {
5432
+ sectionSurface: "base",
5433
+ contentFrame: panelFrame("raised"),
5434
+ itemSurface: "none"
5435
+ }
5436
+ }), defineBlockAppearancePreset({
5437
+ id: "events-ruled-register",
5438
+ target: "events",
5439
+ label: "Ruled event register",
5440
+ blockKinds: ["block.event-calendar", "block.event-listing"],
5441
+ design: {
5442
+ sectionSurface: "brand-depth-band",
5443
+ contentFrame: plainFrame,
5444
+ itemSurface: "none",
5445
+ eventListTreatment: "ruled-register"
5446
+ }
5447
+ }), defineBlockAppearancePreset({
5448
+ id: "events-editorial-register",
5449
+ target: "events",
5450
+ label: "Editorial event register",
5451
+ blockKinds: ["block.event-calendar", "block.event-listing"],
5452
+ design: {
5453
+ sectionSurface: "base",
5454
+ contentFrame: plainFrame,
5455
+ itemSurface: "none",
5456
+ eventListTreatment: "editorial-register"
5457
+ }
5458
+ }), defineBlockAppearancePreset({
5459
+ id: "events-dense-index",
5460
+ target: "events",
5461
+ label: "Dense event index",
5462
+ blockKinds: ["block.event-calendar", "block.event-listing"],
5463
+ design: {
5464
+ sectionSurface: "accent-band",
5465
+ contentFrame: plainFrame,
5466
+ itemSurface: "none",
5467
+ eventListTreatment: "dense-index"
5468
+ }
5469
+ }), defineBlockAppearancePreset({
5470
+ id: "schedule-details-brand-depth",
5471
+ target: "events",
5472
+ label: "Brand-depth schedule details",
5473
+ blockKinds: ["block.event-details", "block.course-details"],
5474
+ design: {
5475
+ sectionSurface: "brand-depth-band",
5476
+ contentFrame: plainFrame,
5477
+ itemSurface: "none",
5478
+ tileTreatment: "brand-depth"
5479
+ }
5480
+ }), defineBlockAppearancePreset({
5481
+ id: "media-text-flush-feature",
5482
+ target: "media-text",
5483
+ label: "Flush media feature",
5484
+ blockKinds: ["block.media-text"],
5485
+ design: {
5486
+ sectionSurface: "muted-band",
5487
+ contentFrame: flushPanelFrame({ bleed: "start" }),
5488
+ itemSurface: "none"
5489
+ }
5490
+ }), defineBlockAppearancePreset({
5491
+ id: "testimonials-simple-cards",
5492
+ target: "testimonials",
5493
+ label: "Simple testimonial cards",
5494
+ blockKinds: ["block.testimonials"],
5495
+ design: {
5496
+ sectionSurface: "base",
5497
+ contentFrame: plainFrame,
5498
+ itemSurface: "default"
5499
+ }
5500
+ }), defineBlockAppearancePreset({
5501
+ id: "testimonials-raised-panel",
5502
+ target: "testimonials",
5503
+ label: "Raised testimonial panel",
5504
+ blockKinds: ["block.testimonials"],
5505
+ design: {
5506
+ sectionSurface: "muted-band",
5507
+ contentFrame: panelFrame("raised"),
5508
+ itemSurface: "raised"
5509
+ }
5510
+ }), defineBlockAppearancePreset({
5511
+ id: "testimonials-accent-panel",
5512
+ target: "testimonials",
5513
+ label: "Accent testimonial panel",
5514
+ blockKinds: ["block.testimonials"],
5515
+ design: {
5516
+ sectionSurface: "accent-band",
5517
+ contentFrame: panelFrame("raised"),
5518
+ itemSurface: "raised"
5519
+ }
5520
+ }), defineBlockAppearancePreset({
5521
+ id: "testimonials-default-cards",
5522
+ target: "testimonials",
5523
+ label: "Default cards",
5524
+ blockKinds: ["block.testimonials"],
5525
+ design: {
5526
+ sectionSurface: "base",
5527
+ contentFrame: plainFrame,
5528
+ itemSurface: "none",
5529
+ testimonialCardTreatment: "default"
5530
+ }
5531
+ }), defineBlockAppearancePreset({
5532
+ id: "testimonials-statement-cards",
5533
+ target: "testimonials",
5534
+ label: "Statement cards",
5535
+ blockKinds: ["block.testimonials"],
5536
+ design: {
5537
+ sectionSurface: "accent-band",
5538
+ contentFrame: plainFrame,
5539
+ itemSurface: "raised",
5540
+ testimonialCardTreatment: "statement"
5541
+ }
5542
+ }), defineBlockAppearancePreset({
5543
+ id: "testimonials-brand-statement-cards",
5544
+ target: "testimonials",
5545
+ label: "Brand statement cards",
5546
+ blockKinds: ["block.testimonials"],
5547
+ design: {
5548
+ sectionSurface: "brand-depth-band",
5549
+ contentFrame: plainFrame,
5550
+ itemSurface: "raised",
5551
+ testimonialCardTreatment: "statement"
5552
+ }
5553
+ }), defineBlockAppearancePreset({
5554
+ id: "testimonials-non-carded",
5555
+ target: "testimonials",
5556
+ label: "Non-carded",
5557
+ blockKinds: ["block.testimonials"],
5558
+ design: {
5559
+ sectionSurface: "muted-band",
5560
+ contentFrame: plainFrame,
5561
+ itemSurface: "none",
5562
+ testimonialCardTreatment: "non-carded"
5563
+ }
5564
+ }), defineBlockAppearancePreset({
5565
+ id: "testimonials-evergreen-lead",
5566
+ target: "testimonials",
5567
+ label: "Evergreen lead",
5568
+ blockKinds: ["block.testimonials"],
5569
+ constraints: { layoutVariantKeys: ["featured-editorial"] },
5570
+ design: {
5571
+ sectionSurface: "base",
5572
+ contentFrame: plainFrame,
5573
+ itemSurface: "none"
5574
+ }
5575
+ }), defineBlockAppearancePreset({
5576
+ id: "testimonials-room-and-response",
5577
+ target: "testimonials",
5578
+ label: "Room and response",
5579
+ blockKinds: ["block.testimonials"],
5580
+ constraints: { layoutVariantKeys: ["featured-editorial"] },
5581
+ design: {
5582
+ sectionSurface: "base",
5583
+ contentFrame: plainFrame,
5584
+ itemSurface: "none"
5585
+ }
5586
+ }), defineBlockAppearancePreset({
5587
+ id: "testimonials-open-floor",
5588
+ target: "testimonials",
5589
+ label: "Open floor",
5590
+ blockKinds: ["block.testimonials"],
5591
+ constraints: { layoutVariantKeys: ["featured-editorial"] },
5592
+ design: {
5593
+ sectionSurface: "base",
5594
+ contentFrame: plainFrame,
5595
+ itemSurface: "none"
5596
+ }
5597
+ }), defineBlockAppearancePreset({
5598
+ id: "faq-base-accordion",
5599
+ target: "faq",
5600
+ label: "Base accordion FAQ",
5601
+ blockKinds: ["block.faq"],
5602
+ design: {
5603
+ sectionSurface: "base",
5604
+ contentFrame: plainFrame,
5605
+ itemSurface: "default"
5606
+ }
5607
+ }), defineBlockAppearancePreset({
5608
+ id: "faq-contained-help",
5609
+ target: "faq",
5610
+ label: "Contained help panel",
5611
+ blockKinds: ["block.faq"],
5612
+ design: {
5613
+ sectionSurface: "muted-band",
5614
+ contentFrame: panelFrame("inset"),
5615
+ itemSurface: "default"
5616
+ }
5617
+ }), defineBlockAppearancePreset({
5618
+ id: "contact-form-panel",
5619
+ target: "contact-form",
5620
+ label: "Raised form panel",
5621
+ blockKinds: ["block.form"],
5622
+ design: {
5623
+ sectionSurface: "muted-band",
5624
+ contentFrame: panelFrame("raised"),
5625
+ itemSurface: "none"
5626
+ }
5627
+ }), defineBlockAppearancePreset({
5628
+ id: "cta-accent-band",
5629
+ target: "cta",
5630
+ label: "Accent CTA band",
5631
+ blockKinds: ["block.cta-full"],
5632
+ design: {
5633
+ sectionSurface: "accent-band",
5634
+ contentFrame: plainFrame,
5635
+ itemSurface: "none",
5636
+ eyebrowTreatment: "accent"
5637
+ }
5638
+ });
5647
5639
  //#endregion
5648
5640
  //#region ../theme-core/src/site-styles/headerCtaVariants.ts
5649
5641
  function hasButtonVariant(theme, variantId) {
@@ -7157,7 +7149,7 @@ function canonicalPaletteHashInput(colors, mode) {
7157
7149
  return `${mode}|${paletteColorFingerprint(colors)}`;
7158
7150
  }
7159
7151
  /**
7160
- * The shared TypeScript/SQL protocol. Do not reorder roles: the order comes
7152
+ * Stable curated-catalogue identity. Do not reorder roles: the order comes
7161
7153
  * from PALETTE_TOKEN_NAMES through canonicalPaletteHashInput.
7162
7154
  */
7163
7155
  function paletteValueKey(colors, mode) {
@@ -8727,6 +8719,32 @@ function parseBackgroundAppearanceColorToken(value) {
8727
8719
  function uniqueStrings(values) {
8728
8720
  return Array.from(new Set(values));
8729
8721
  }
8722
+ const headerInteractionPaletteSchema = z$1.enum([
8723
+ "primary",
8724
+ "secondary",
8725
+ "accent"
8726
+ ]);
8727
+ //#endregion
8728
+ //#region ../theme-core/src/site-styles/headerInteractionPalette.ts
8729
+ const clearSplitInteractionPalette = defineLookOptionGroup({
8730
+ id: "interaction-palette",
8731
+ label: "Hover colour",
8732
+ defaultOptionId: "accent",
8733
+ options: [
8734
+ {
8735
+ id: "accent",
8736
+ label: "Accent"
8737
+ },
8738
+ {
8739
+ id: "primary",
8740
+ label: "Primary"
8741
+ },
8742
+ {
8743
+ id: "secondary",
8744
+ label: "Secondary"
8745
+ }
8746
+ ]
8747
+ });
8730
8748
  //#endregion
8731
8749
  //#region ../theme-core/src/site-styles/logoBranding.ts
8732
8750
  const logoTextConfidenceValues = [
@@ -8949,7 +8967,7 @@ const overlayLogoAccommodations = [
8949
8967
  * optional nested styling fields that would otherwise leak from another Look.
8950
8968
  */
8951
8969
  function baseHeader(theme) {
8952
- 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;
8970
+ 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;
8953
8971
  return {
8954
8972
  ...header,
8955
8973
  navContainer: {
@@ -8964,7 +8982,6 @@ const headerLayoutCatalog = defineExactCatalog()([
8964
8982
  id: asHeaderLayoutId("classic"),
8965
8983
  label: "Classic",
8966
8984
  description: "Logo and navigation in one practical horizontal row.",
8967
- structure: "inline-classic",
8968
8985
  variant: "classic",
8969
8986
  defaultPositioning: "sticky",
8970
8987
  shrinkOnScroll: false
@@ -8973,7 +8990,6 @@ const headerLayoutCatalog = defineExactCatalog()([
8973
8990
  id: asHeaderLayoutId("centered"),
8974
8991
  label: "Centered",
8975
8992
  description: "Logo centered above a balanced navigation row.",
8976
- structure: "centered-stack",
8977
8993
  variant: "centered",
8978
8994
  defaultPositioning: "static",
8979
8995
  shrinkOnScroll: false,
@@ -8989,7 +9005,6 @@ const headerLayoutCatalog = defineExactCatalog()([
8989
9005
  id: asHeaderLayoutId("floating"),
8990
9006
  label: "Floating",
8991
9007
  description: "Detached header chrome that sits over the opening section.",
8992
- structure: "floating-shell",
8993
9008
  variant: "floating",
8994
9009
  defaultPositioning: "sticky",
8995
9010
  shrinkOnScroll: true,
@@ -9151,10 +9166,13 @@ const headerStyleCatalog = defineExactCatalog()([
9151
9166
  label: "Clear Split",
9152
9167
  description: "Floating logo with transparent navigation and no shared shell.",
9153
9168
  supportedLayoutIds: supportedLayouts(["floating"]),
9154
- navInteraction: "color-change",
9169
+ navInteraction: "pill-background",
9155
9170
  surface: "floating",
9156
- defaultDepth: "none",
9171
+ defaultDepth: "line",
9157
9172
  navTypography: "plain",
9173
+ openingForegroundTarget: "all",
9174
+ scrollTreatment: "contrast-glass",
9175
+ interactionPalette: clearSplitInteractionPalette,
9158
9176
  moods: ["editorial", "calm"]
9159
9177
  },
9160
9178
  {
@@ -9177,6 +9195,7 @@ const headerStyleCatalog = defineExactCatalog()([
9177
9195
  surface: "floating",
9178
9196
  defaultDepth: "shadow",
9179
9197
  navTypography: "quiet-caps",
9198
+ openingForegroundTarget: "brand-only",
9180
9199
  moods: ["expressive"]
9181
9200
  },
9182
9201
  {
@@ -9188,6 +9207,7 @@ const headerStyleCatalog = defineExactCatalog()([
9188
9207
  surface: "floating",
9189
9208
  defaultDepth: "shadow",
9190
9209
  navTypography: "heading",
9210
+ openingForegroundTarget: "brand-only",
9191
9211
  moods: ["calm", "editorial"]
9192
9212
  }
9193
9213
  ]);
@@ -9689,13 +9709,6 @@ const headerLookCatalog = defineExactCatalog()([
9689
9709
  {
9690
9710
  id: asHeaderLookId("clean-base"),
9691
9711
  label: "Clean base",
9692
- visualTreatment: "solid-neutral",
9693
- layoutBehavior: "sticky",
9694
- configuration: {
9695
- structure: "inline-classic",
9696
- treatment: "solid-neutral",
9697
- behavior: "sticky"
9698
- },
9699
9712
  openingRequirement: "none",
9700
9713
  logoAccommodations: inlineClassicLogoAccommodations,
9701
9714
  compile: cleanBaseHeader
@@ -9703,13 +9716,6 @@ const headerLookCatalog = defineExactCatalog()([
9703
9716
  {
9704
9717
  id: asHeaderLookId("classic-centered-nav"),
9705
9718
  label: "Centered nav",
9706
- visualTreatment: "solid-neutral",
9707
- layoutBehavior: "sticky",
9708
- configuration: {
9709
- structure: "inline-classic",
9710
- treatment: "solid-neutral",
9711
- behavior: "sticky"
9712
- },
9713
9719
  openingRequirement: "none",
9714
9720
  maxRecommendedNavItems: 6,
9715
9721
  logoAccommodations: inlineClassicLogoAccommodations,
@@ -9718,13 +9724,6 @@ const headerLookCatalog = defineExactCatalog()([
9718
9724
  {
9719
9725
  id: asHeaderLookId("brand-solid"),
9720
9726
  label: "Brand solid",
9721
- visualTreatment: "solid-brand",
9722
- layoutBehavior: "sticky-shrink",
9723
- configuration: {
9724
- structure: "inline-classic",
9725
- treatment: "solid-brand",
9726
- behavior: "sticky-shrink"
9727
- },
9728
9727
  openingRequirement: "none",
9729
9728
  logoAccommodations: inlineClassicLogoAccommodations,
9730
9729
  compile: solidBrandHeader
@@ -9732,13 +9731,6 @@ const headerLookCatalog = defineExactCatalog()([
9732
9731
  {
9733
9732
  id: asHeaderLookId("serif-line"),
9734
9733
  label: "Serif line",
9735
- visualTreatment: "light-serif",
9736
- layoutBehavior: "sticky",
9737
- configuration: {
9738
- structure: "centered-stack",
9739
- treatment: "light-serif",
9740
- behavior: "sticky"
9741
- },
9742
9734
  openingRequirement: "none",
9743
9735
  maxRecommendedNavItems: 6,
9744
9736
  logoAccommodations: centeredLogoAccommodations,
@@ -9747,13 +9739,6 @@ const headerLookCatalog = defineExactCatalog()([
9747
9739
  {
9748
9740
  id: asHeaderLookId("centered-calm"),
9749
9741
  label: "Centered calm",
9750
- visualTreatment: "light-serif",
9751
- layoutBehavior: "normal-flow",
9752
- configuration: {
9753
- structure: "centered-stack",
9754
- treatment: "light-serif",
9755
- behavior: "normal-flow"
9756
- },
9757
9742
  openingRequirement: "none",
9758
9743
  maxRecommendedNavItems: 5,
9759
9744
  logoAccommodations: centeredLogoAccommodations,
@@ -9762,13 +9747,6 @@ const headerLookCatalog = defineExactCatalog()([
9762
9747
  {
9763
9748
  id: asHeaderLookId("practical-utility"),
9764
9749
  label: "Practical utility",
9765
- visualTreatment: "solid-neutral",
9766
- layoutBehavior: "sticky-shrink",
9767
- configuration: {
9768
- structure: "inline-classic",
9769
- treatment: "solid-neutral",
9770
- behavior: "sticky-shrink"
9771
- },
9772
9750
  openingRequirement: "none",
9773
9751
  requiresProminentCta: true,
9774
9752
  logoAccommodations: inlineClassicLogoAccommodations,
@@ -9777,13 +9755,6 @@ const headerLookCatalog = defineExactCatalog()([
9777
9755
  {
9778
9756
  id: asHeaderLookId("minimal-transparent"),
9779
9757
  label: "Minimal transparent",
9780
- visualTreatment: "minimal-transparent",
9781
- layoutBehavior: "normal-flow",
9782
- configuration: {
9783
- structure: "inline-classic",
9784
- treatment: "minimal-transparent",
9785
- behavior: "normal-flow"
9786
- },
9787
9758
  openingRequirement: "reserved-space-ok",
9788
9759
  logoAccommodations: inlineClassicLogoAccommodations,
9789
9760
  compile: minimalTransparentHeader
@@ -9791,13 +9762,6 @@ const headerLookCatalog = defineExactCatalog()([
9791
9762
  {
9792
9763
  id: asHeaderLookId("transparent-overlay"),
9793
9764
  label: "Transparent overlay",
9794
- visualTreatment: "transparent-overlay",
9795
- layoutBehavior: "fixed-overlay",
9796
- configuration: {
9797
- structure: "inline-classic",
9798
- treatment: "transparent-overlay",
9799
- behavior: "fixed-overlay"
9800
- },
9801
9765
  openingRequirement: "requires-image-hero-with-contrast-overlay",
9802
9766
  maxRecommendedNavItems: 5,
9803
9767
  logoAccommodations: overlayLogoAccommodations,
@@ -9806,24 +9770,13 @@ const headerLookCatalog = defineExactCatalog()([
9806
9770
  {
9807
9771
  id: asHeaderLookId("floating-glass"),
9808
9772
  label: "Floating glass",
9809
- visualTreatment: "floating-glass",
9810
- layoutBehavior: "fixed-floating",
9811
- configuration: {
9812
- structure: "floating-shell",
9813
- treatment: "floating-glass",
9814
- behavior: "fixed-floating"
9815
- },
9816
9773
  openingRequirement: "requires-image-hero-with-contrast-overlay",
9817
9774
  maxRecommendedNavItems: 5,
9818
9775
  logoAccommodations: overlayLogoAccommodations,
9819
9776
  compile: floatingGlassHeader
9820
9777
  }
9821
9778
  ]);
9822
- new Set(headerLookCatalog.map((look) => headerConfigurationKey(look.configuration)));
9823
9779
  new Map(headerLookCatalog.map((look) => [look.id, look]));
9824
- function headerConfigurationKey(configuration) {
9825
- return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
9826
- }
9827
9780
  //#endregion
9828
9781
  //#region ../theme-core/src/site-styles/sectionTransitions.ts
9829
9782
  function boundaryRuntimeMetrics(family, size, heightExpression) {
@@ -10027,8 +9980,6 @@ const VARIANT_ROLES = [
10027
9980
  "secondary",
10028
9981
  "outline",
10029
9982
  "ghost",
10030
- "link",
10031
- "tertiary",
10032
9983
  "accent"
10033
9984
  ];
10034
9985
  function isVariantRole(value) {
@@ -10040,7 +9991,7 @@ function isVariantRole(value) {
10040
9991
  * IDs become class selectors, so keep the contract deliberately narrower than
10041
9992
  * an arbitrary string and shared with every authoring/runtime boundary.
10042
9993
  */
10043
- const buttonVariantIdSchema = z$1.string().min(1).max(50).regex(/^[a-z0-9-]+$/, "Button variant IDs may contain lowercase letters, numbers, and hyphens only");
9994
+ 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" });
10044
9995
  function asSpecialVariantId(value) {
10045
9996
  const parsed = buttonVariantIdSchema.safeParse(value);
10046
9997
  if (!parsed.success) throw new Error("SpecialVariantId must be a CSS-safe button variant ID");
@@ -13231,39 +13182,39 @@ function defaultTypographyForRecipe(recipe) {
13231
13182
  }
13232
13183
  //#endregion
13233
13184
  //#region ../theme-core/src/lib/media.ts
13234
- const hotspotSchema$1 = z.object({
13185
+ const hotspotSchema = z.object({
13235
13186
  x: z.number().min(0).max(1),
13236
13187
  y: z.number().min(0).max(1),
13237
13188
  radius: z.number().optional()
13238
13189
  });
13239
- const rotationSchema$1 = z.union([
13190
+ const rotationSchema = z.union([
13240
13191
  z.literal(0),
13241
13192
  z.literal(90),
13242
13193
  z.literal(180),
13243
13194
  z.literal(270)
13244
13195
  ]);
13245
- const rectSchema$1 = z.tuple([
13196
+ const rectSchema = z.tuple([
13246
13197
  z.number(),
13247
13198
  z.number(),
13248
13199
  z.number(),
13249
13200
  z.number()
13250
13201
  ]);
13251
- const aspectCropSchema$1 = z.object({
13202
+ const aspectCropSchema = z.object({
13252
13203
  aspect: z.preprocess((value) => value == null ? void 0 : value, z.string().optional()),
13253
- rect: z.preprocess((value) => value == null ? void 0 : value, rectSchema$1.optional()),
13254
- hotspot: z.preprocess((value) => value == null ? void 0 : value, hotspotSchema$1.optional()),
13255
- rotation: z.preprocess((value) => value == null ? void 0 : value, rotationSchema$1.optional())
13204
+ rect: z.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
13205
+ hotspot: z.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
13206
+ rotation: z.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
13256
13207
  });
13257
- const transformSchema$1 = z.object({
13208
+ const transformSchema = z.object({
13258
13209
  aspectCrops: z.preprocess((value) => {
13259
13210
  if (!value || typeof value !== "object" || Array.isArray(value)) return;
13260
13211
  return value;
13261
- }, z.record(z.string(), aspectCropSchema$1.catch({}))).optional(),
13262
- rect: rectSchema$1.optional(),
13263
- hotspot: hotspotSchema$1.optional(),
13264
- rotation: rotationSchema$1.optional()
13212
+ }, z.record(z.string(), aspectCropSchema.catch({}))).optional(),
13213
+ rect: rectSchema.optional(),
13214
+ hotspot: hotspotSchema.optional(),
13215
+ rotation: rotationSchema.optional()
13265
13216
  });
13266
- const mediaSchema$1 = z.object({
13217
+ const mediaSchema = z.object({
13267
13218
  type: z.enum([
13268
13219
  "image",
13269
13220
  "video",
@@ -13284,7 +13235,7 @@ const mediaSchema$1 = z.object({
13284
13235
  height: z.number().optional(),
13285
13236
  storageBucket: z.string().optional(),
13286
13237
  storagePath: z.string().optional(),
13287
- transform: transformSchema$1.optional()
13238
+ transform: transformSchema.optional()
13288
13239
  });
13289
13240
  //#endregion
13290
13241
  //#region ../theme-core/src/palette/schema.ts
@@ -14117,264 +14068,6 @@ function generateInteractiveChildInheritanceCSS(selector) {
14117
14068
  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`;
14118
14069
  }
14119
14070
  //#endregion
14120
- //#region ../theme-core/src/buttons/effects/presets/background.ts
14121
- /**
14122
- * Darken background on hover
14123
- *
14124
- * Works with solid backgrounds only. Darkens the background color by adjusting the shade.
14125
- */
14126
- const darkenBackgroundEffect = {
14127
- id: "darken-background",
14128
- name: "Darken on Hover",
14129
- description: "Darkens the background color on hover",
14130
- category: "background",
14131
- pseudoElement: "none",
14132
- applicableTo: ["button"],
14133
- customizableOption: {
14134
- name: "amount",
14135
- type: "select",
14136
- label: "Darken Amount (shade step)",
14137
- default: 100,
14138
- options: [
14139
- 0,
14140
- 100,
14141
- 200,
14142
- 300,
14143
- 400,
14144
- 500,
14145
- 600,
14146
- 700,
14147
- 800,
14148
- 900
14149
- ]
14150
- },
14151
- isApplicable: (buttonConfig) => {
14152
- return buttonConfig.background.type === "solid";
14153
- },
14154
- generateCSS: (ctx) => {
14155
- const { themeId, variantId, options, tokens, buttonConfig } = ctx;
14156
- if (buttonConfig.background.type !== "solid") return "";
14157
- const amount = options.amount || 100;
14158
- const baseToken = buttonConfig.background.colorToken ?? "primary-500";
14159
- const darkerToken = tokens.adjustShade(baseToken, amount);
14160
- return `
14161
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
14162
- background-color: ${tokens.getColor(darkerToken)};
14163
- }
14164
- `;
14165
- }
14166
- };
14167
- /**
14168
- * Lighten background on hover
14169
- *
14170
- * Works with solid backgrounds only. Lightens the background color by adjusting the shade.
14171
- */
14172
- const lightenBackgroundEffect = {
14173
- id: "lighten-background",
14174
- name: "Lighten on Hover",
14175
- description: "Lightens the background color on hover",
14176
- category: "background",
14177
- pseudoElement: "none",
14178
- applicableTo: ["button"],
14179
- customizableOption: {
14180
- name: "amount",
14181
- type: "select",
14182
- label: "Lighten Amount (shade step)",
14183
- default: 100,
14184
- options: [
14185
- 0,
14186
- 100,
14187
- 200,
14188
- 300,
14189
- 400,
14190
- 500,
14191
- 600,
14192
- 700,
14193
- 800,
14194
- 900
14195
- ]
14196
- },
14197
- isApplicable: (buttonConfig) => {
14198
- return buttonConfig.background.type === "solid";
14199
- },
14200
- generateCSS: (ctx) => {
14201
- const { themeId, variantId, options, tokens, buttonConfig } = ctx;
14202
- if (buttonConfig.background.type !== "solid") return "";
14203
- const amount = options.amount || 100;
14204
- const baseToken = buttonConfig.background.colorToken ?? "primary-500";
14205
- const lighterToken = tokens.adjustShade(baseToken, -amount);
14206
- return `
14207
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
14208
- background-color: ${tokens.getColor(lighterToken)};
14209
- }
14210
- `;
14211
- }
14212
- };
14213
- /**
14214
- * Fade background on hover (reduce opacity)
14215
- *
14216
- * Works with all background types.
14217
- */
14218
- const fadeBackgroundEffect = {
14219
- id: "fade-background",
14220
- name: "Fade on Hover",
14221
- description: "Reduces background opacity on hover",
14222
- category: "background",
14223
- pseudoElement: "none",
14224
- applicableTo: ["nav-link"],
14225
- customizableOption: {
14226
- name: "opacity",
14227
- type: "percentage",
14228
- label: "Hover Opacity",
14229
- default: 80
14230
- },
14231
- generateCSS: (ctx) => {
14232
- const { themeId, variantId, options } = ctx;
14233
- return `
14234
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
14235
- opacity: ${(options.opacity || 80) / 100};
14236
- }
14237
- `;
14238
- }
14239
- };
14240
- /**
14241
- * Reduce opacity on hover (simple opacity reduction)
14242
- *
14243
- * Navigation-link effect that reduces opacity by a percentage (default 15%).
14244
- */
14245
- const opacityReduceEffect = {
14246
- id: "opacity-reduce",
14247
- name: "Reduce Opacity",
14248
- description: "Reduces navigation-link opacity on hover by a percentage",
14249
- category: "background",
14250
- pseudoElement: "none",
14251
- applicableTo: ["nav-link"],
14252
- customizableOption: {
14253
- name: "reduction",
14254
- type: "percentage",
14255
- label: "Opacity Reduction",
14256
- default: 15
14257
- },
14258
- generateCSS: (ctx) => {
14259
- const { themeId, variantId, options } = ctx;
14260
- return `
14261
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
14262
- opacity: ${1 - (options.reduction || 15) / 100};
14263
- }
14264
- `;
14265
- }
14266
- };
14267
- /**
14268
- * Animated gradient background
14269
- *
14270
- * Animates a gradient background by shifting its position on hover.
14271
- * Works with gradient backgrounds only.
14272
- *
14273
- * Sets background-size to 200% and animates background-position from left to right.
14274
- */
14275
- const animatedGradientEffect = {
14276
- id: "animated-gradient",
14277
- name: "Animated Gradient",
14278
- description: "Animates gradient position on hover",
14279
- category: "background",
14280
- pseudoElement: "none",
14281
- applicableTo: ["button"],
14282
- customizableOption: {
14283
- name: "direction",
14284
- type: "select",
14285
- label: "Animation Direction",
14286
- default: "horizontal",
14287
- options: ["horizontal", "vertical"]
14288
- },
14289
- isApplicable: (buttonConfig) => {
14290
- return buttonConfig.background.type === "gradient";
14291
- },
14292
- generateCSS: (ctx) => {
14293
- const { themeId, variantId, options, buttonConfig } = ctx;
14294
- if (buttonConfig.background.type !== "gradient") return "";
14295
- const direction = options.direction || "horizontal";
14296
- return `
14297
- /* Setup animated gradient */
14298
- :where([data-theme-scope="${themeId}"]) .${variantId} {
14299
- background-size: ${direction === "horizontal" ? "200% auto" : "auto 200%"};
14300
- background-position: left center;
14301
- transition: background-position 0.3s ease;
14302
- }
14303
-
14304
- /* Animate gradient on hover */
14305
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
14306
- background-position: ${direction === "horizontal" ? "right center" : "center bottom"};
14307
- }
14308
- `;
14309
- }
14310
- };
14311
- /**
14312
- * Add background color on hover
14313
- *
14314
- * Works best with transparent backgrounds. Adds a solid background color on hover.
14315
- */
14316
- const backgroundOnHoverEffect = {
14317
- id: "background-on-hover",
14318
- name: "Background on Hover",
14319
- description: "Adds background color on hover",
14320
- category: "background",
14321
- pseudoElement: "none",
14322
- applicableTo: ["button", "nav-link"],
14323
- customizableOption: {
14324
- name: "colorToken",
14325
- type: "select",
14326
- label: "Background Color",
14327
- default: "neutral-800",
14328
- options: [
14329
- "neutral-700",
14330
- "neutral-800",
14331
- "neutral-900",
14332
- "primary"
14333
- ]
14334
- },
14335
- generateCSS: (ctx) => {
14336
- const { themeId, variantId, options, tokens, buttonConfig } = ctx;
14337
- const colorToken = options.colorToken || "neutral-800";
14338
- return `
14339
- /* Add background on hover */
14340
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
14341
- background-color: ${tokens.getColor(colorToken)};${"textColorToken" in buttonConfig && typeof options.textColorToken === "string" ? `\n color: ${tokens.getColor(options.textColorToken)};` : ""}
14342
- }
14343
- `;
14344
- }
14345
- };
14346
- /**
14347
- * Add semi-transparent background color on hover
14348
- *
14349
- * Adds a background with opacity/alpha channel. Perfect for retro/arcade styles.
14350
- */
14351
- const backgroundOnHoverAlphaEffect = {
14352
- id: "background-on-hover-alpha",
14353
- name: "Background on Hover (Transparent)",
14354
- description: "Adds semi-transparent background on hover",
14355
- category: "background",
14356
- pseudoElement: "none",
14357
- applicableTo: ["nav-link"],
14358
- customizableOption: {
14359
- name: "opacity",
14360
- type: "percentage",
14361
- label: "Opacity",
14362
- default: 50
14363
- },
14364
- generateCSS: (ctx) => {
14365
- const { themeId, variantId, stateGroup, options } = ctx;
14366
- const rawOpacity = options.opacity;
14367
- const clampedOpacity = Math.max(0, Math.min(100, typeof rawOpacity === "number" && !Number.isNaN(rawOpacity) ? rawOpacity : 50));
14368
- const cssVar = `var(--tb-${options.colorToken || "neutral-800"})`;
14369
- return `
14370
- /* Add semi-transparent background (${stateGroup}) */
14371
- :where([data-theme-scope="${themeId}"]) .${variantId}${stateGroup === "base" ? "" : `:${stateGroup}`} {
14372
- background-color: rgb(${cssVar} / ${clampedOpacity}%);
14373
- }
14374
- `;
14375
- }
14376
- };
14377
- //#endregion
14378
14071
  //#region ../theme-core/src/buttons/effects/cssUtils.ts
14379
14072
  /**
14380
14073
  * CSS Utilities for Effect Presets
@@ -14426,6 +14119,71 @@ function generateStateCSS(themeId, variantId, state, cssProperties) {
14426
14119
  `;
14427
14120
  }
14428
14121
  //#endregion
14122
+ //#region ../theme-core/src/buttons/effects/presets/background.ts
14123
+ /**
14124
+ * Darken background on hover
14125
+ *
14126
+ * Works with solid backgrounds only. Darkens the background color by adjusting the shade.
14127
+ */
14128
+ const darkenBackgroundEffect = shadeBackgroundEffect({
14129
+ id: "darken-background",
14130
+ name: "Darken on Hover",
14131
+ description: "Darkens the background color on hover",
14132
+ label: "Darken Amount (shade step)",
14133
+ shadeDirection: 1
14134
+ });
14135
+ /**
14136
+ * Lighten background on hover
14137
+ *
14138
+ * Works with solid backgrounds only. Lightens the background color by adjusting the shade.
14139
+ */
14140
+ const lightenBackgroundEffect = shadeBackgroundEffect({
14141
+ id: "lighten-background",
14142
+ name: "Lighten on Hover",
14143
+ description: "Lightens the background color on hover",
14144
+ label: "Lighten Amount (shade step)",
14145
+ shadeDirection: -1
14146
+ });
14147
+ function shadeBackgroundEffect(config) {
14148
+ return {
14149
+ id: config.id,
14150
+ name: config.name,
14151
+ description: config.description,
14152
+ category: "background",
14153
+ pseudoElement: "none",
14154
+ applicableTo: ["button"],
14155
+ customizableOption: {
14156
+ name: "amount",
14157
+ type: "select",
14158
+ label: config.label,
14159
+ default: 100,
14160
+ options: [
14161
+ 0,
14162
+ 100,
14163
+ 200,
14164
+ 300,
14165
+ 400,
14166
+ 500,
14167
+ 600,
14168
+ 700,
14169
+ 800,
14170
+ 900
14171
+ ]
14172
+ },
14173
+ isApplicable: (buttonConfig) => buttonConfig.background.type === "solid",
14174
+ generateCSS: ({ themeId, variantId, options, tokens, buttonConfig }) => {
14175
+ if (buttonConfig.background.type !== "solid") return "";
14176
+ const amount = (options.amount || 100) * config.shadeDirection;
14177
+ const baseToken = buttonConfig.background.colorToken ?? "primary-500";
14178
+ return `
14179
+ :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
14180
+ background-color: ${tokens.getColor(tokens.adjustShade(baseToken, amount))};
14181
+ }
14182
+ `;
14183
+ }
14184
+ };
14185
+ }
14186
+ //#endregion
14429
14187
  //#region ../theme-core/src/buttons/effects/registry.ts
14430
14188
  /**
14431
14189
  * Registry of all available effect presets
@@ -14433,11 +14191,144 @@ function generateStateCSS(themeId, variantId, state, cssProperties) {
14433
14191
  const EFFECT_PRESETS = [
14434
14192
  darkenBackgroundEffect,
14435
14193
  lightenBackgroundEffect,
14436
- fadeBackgroundEffect,
14437
- opacityReduceEffect,
14438
- animatedGradientEffect,
14439
- backgroundOnHoverEffect,
14440
- backgroundOnHoverAlphaEffect,
14194
+ {
14195
+ id: "fade-background",
14196
+ name: "Fade on Hover",
14197
+ description: "Reduces background opacity on hover",
14198
+ category: "background",
14199
+ pseudoElement: "none",
14200
+ applicableTo: ["nav-link"],
14201
+ customizableOption: {
14202
+ name: "opacity",
14203
+ type: "percentage",
14204
+ label: "Hover Opacity",
14205
+ default: 80
14206
+ },
14207
+ generateCSS: (ctx) => {
14208
+ const { themeId, variantId, options } = ctx;
14209
+ return `
14210
+ :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
14211
+ opacity: ${(options.opacity || 80) / 100};
14212
+ }
14213
+ `;
14214
+ }
14215
+ },
14216
+ {
14217
+ id: "opacity-reduce",
14218
+ name: "Reduce Opacity",
14219
+ description: "Reduces navigation-link opacity on hover by a percentage",
14220
+ category: "background",
14221
+ pseudoElement: "none",
14222
+ applicableTo: ["nav-link"],
14223
+ customizableOption: {
14224
+ name: "reduction",
14225
+ type: "percentage",
14226
+ label: "Opacity Reduction",
14227
+ default: 15
14228
+ },
14229
+ generateCSS: (ctx) => {
14230
+ const { themeId, variantId, options } = ctx;
14231
+ return `
14232
+ :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
14233
+ opacity: ${1 - (options.reduction || 15) / 100};
14234
+ }
14235
+ `;
14236
+ }
14237
+ },
14238
+ {
14239
+ id: "animated-gradient",
14240
+ name: "Animated Gradient",
14241
+ description: "Animates gradient position on hover",
14242
+ category: "background",
14243
+ pseudoElement: "none",
14244
+ applicableTo: ["button"],
14245
+ customizableOption: {
14246
+ name: "direction",
14247
+ type: "select",
14248
+ label: "Animation Direction",
14249
+ default: "horizontal",
14250
+ options: ["horizontal", "vertical"]
14251
+ },
14252
+ isApplicable: (buttonConfig) => {
14253
+ return buttonConfig.background.type === "gradient";
14254
+ },
14255
+ generateCSS: (ctx) => {
14256
+ const { themeId, variantId, options, buttonConfig } = ctx;
14257
+ if (buttonConfig.background.type !== "gradient") return "";
14258
+ const direction = options.direction || "horizontal";
14259
+ return `
14260
+ /* Setup animated gradient */
14261
+ :where([data-theme-scope="${themeId}"]) .${variantId} {
14262
+ background-size: ${direction === "horizontal" ? "200% auto" : "auto 200%"};
14263
+ background-position: left center;
14264
+ transition: background-position 0.3s ease;
14265
+ }
14266
+
14267
+ /* Animate gradient on hover */
14268
+ :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
14269
+ background-position: ${direction === "horizontal" ? "right center" : "center bottom"};
14270
+ }
14271
+ `;
14272
+ }
14273
+ },
14274
+ {
14275
+ id: "background-on-hover",
14276
+ name: "Background on Hover",
14277
+ description: "Adds background color on hover",
14278
+ category: "background",
14279
+ pseudoElement: "none",
14280
+ applicableTo: ["button", "nav-link"],
14281
+ customizableOption: {
14282
+ name: "colorToken",
14283
+ type: "select",
14284
+ label: "Background Color",
14285
+ default: "neutral-800",
14286
+ options: [
14287
+ "neutral-700",
14288
+ "neutral-800",
14289
+ "neutral-900",
14290
+ "primary"
14291
+ ]
14292
+ },
14293
+ generateCSS: (ctx) => {
14294
+ const { themeId, variantId, stateGroup, options, tokens, buttonConfig } = ctx;
14295
+ const colorToken = options.colorToken || "neutral-800";
14296
+ const color = tokens.getColor(colorToken);
14297
+ const navForeground = "textColorToken" in buttonConfig && typeof options.textColorToken === "string" ? `\n color: ${tokens.getColor(options.textColorToken)};` : "";
14298
+ return `
14299
+ /* Add background on hover */
14300
+ ${getStateSelector(themeId, variantId, stateGroup)} {
14301
+ background-color: ${color};${navForeground}
14302
+ }
14303
+ `;
14304
+ }
14305
+ },
14306
+ {
14307
+ id: "background-on-hover-alpha",
14308
+ name: "Background on Hover (Transparent)",
14309
+ description: "Adds semi-transparent background on hover",
14310
+ category: "background",
14311
+ pseudoElement: "none",
14312
+ applicableTo: ["nav-link"],
14313
+ customizableOption: {
14314
+ name: "opacity",
14315
+ type: "percentage",
14316
+ label: "Opacity",
14317
+ default: 50
14318
+ },
14319
+ generateCSS: (ctx) => {
14320
+ const { themeId, variantId, stateGroup, options } = ctx;
14321
+ const rawOpacity = options.opacity;
14322
+ const clampedOpacity = Math.max(0, Math.min(100, typeof rawOpacity === "number" && !Number.isNaN(rawOpacity) ? rawOpacity : 50));
14323
+ const cssVar = `var(--tb-${options.colorToken || "neutral-800"})`;
14324
+ return `
14325
+ /* Add semi-transparent background (${stateGroup}) */
14326
+ :where([data-theme-scope="${themeId}"]) .${variantId}${stateGroup === "base" ? "" : `:${stateGroup}`} {
14327
+ background-color: rgb(${cssVar} / ${clampedOpacity}%);
14328
+ }
14329
+ `;
14330
+ }
14331
+ },
14441
14332
  {
14442
14333
  id: "border-glow",
14443
14334
  name: "Border Glow",
@@ -17376,6 +17267,147 @@ function resolveOnColorForThemeToken(token) {
17376
17267
  return shade <= 400 ? "#000000" : "#FFFFFF";
17377
17268
  }
17378
17269
  //#endregion
17270
+ //#region ../theme-core/src/header/paintTargets.ts
17271
+ /** Resolve the element that owns the visible header surface for each layout. */
17272
+ function getHeaderPaintTargets(variant, themeId, state = "base") {
17273
+ const scope = `:where([data-theme-scope="${themeId}"])`;
17274
+ const scrolledRoot = state === "scrolled" ? ".header-root.header-scrolled " : "";
17275
+ if (variant === "floating") {
17276
+ if (state === "scrolled") {
17277
+ const desktopOwner = `${scope} ${scrolledRoot}.header-floating-container`;
17278
+ const mobileOwner = `${scope} ${scrolledRoot}.header-mobile-bar`;
17279
+ return [{
17280
+ kind: "viewport-band",
17281
+ clipSelector: `${scope}:has(.header-root.header-scrolled)`,
17282
+ ownerSelector: desktopOwner,
17283
+ selector: `${desktopOwner}::before`,
17284
+ mediaQuery: MQ_MD_UP,
17285
+ topExtension: {
17286
+ customProperty: "--rb-header-floating-top-gap",
17287
+ value: "1rem",
17288
+ ownerProperty: "top"
17289
+ },
17290
+ ownerNeedsPositioning: false
17291
+ }, {
17292
+ kind: "viewport-band",
17293
+ clipSelector: `${scope}:has(.header-root.header-scrolled)`,
17294
+ ownerSelector: mobileOwner,
17295
+ selector: `${mobileOwner}::before`,
17296
+ mediaQuery: MQ_MD_DOWN,
17297
+ topExtension: {
17298
+ customProperty: "--rb-header-floating-top-gap",
17299
+ value: "0.75rem",
17300
+ ownerProperty: "margin-top"
17301
+ },
17302
+ ownerNeedsPositioning: true
17303
+ }];
17304
+ }
17305
+ return [{
17306
+ kind: "element-box",
17307
+ selector: `${scope} ${scrolledRoot}.header-floating-container`,
17308
+ mediaQuery: MQ_MD_UP
17309
+ }, {
17310
+ kind: "element-box",
17311
+ selector: `${scope} ${scrolledRoot}.header-mobile-bar`,
17312
+ mediaQuery: MQ_MD_DOWN
17313
+ }];
17314
+ }
17315
+ return [{
17316
+ kind: "element-box",
17317
+ selector: `${scope} .header-root${state === "scrolled" ? ".header-scrolled" : ""}::before`,
17318
+ pseudoElement: "inset"
17319
+ }];
17320
+ }
17321
+ function renderHeaderPaintTargetRules(targets, rules) {
17322
+ return targets.map((target) => {
17323
+ const block = renderHeaderPaintTargetRule(target, rules);
17324
+ return target.mediaQuery ? `@media ${target.mediaQuery} {\n${block}\n}` : block;
17325
+ }).join("\n");
17326
+ }
17327
+ function renderHeaderPaintTargetRule(target, rules) {
17328
+ switch (target.kind) {
17329
+ case "element-box": {
17330
+ const pseudoElementSetup = target.pseudoElement === "inset" ? [
17331
+ "content: \"\";",
17332
+ "position: absolute;",
17333
+ "inset: 0;",
17334
+ "pointer-events: none;",
17335
+ "border-radius: inherit;",
17336
+ "z-index: -1;"
17337
+ ] : [];
17338
+ return `${target.selector} {\n ${[...pseudoElementSetup, ...rules].join("\n ")}\n}`;
17339
+ }
17340
+ case "viewport-band": {
17341
+ const gap = target.topExtension;
17342
+ const ownerRules = [
17343
+ `${gap.customProperty}: ${gap.value};`,
17344
+ `${gap.ownerProperty}: var(${gap.customProperty});`,
17345
+ ...target.ownerNeedsPositioning ? ["position: relative;"] : [],
17346
+ "isolation: isolate;",
17347
+ "background: none;",
17348
+ "backdrop-filter: none;",
17349
+ "-webkit-backdrop-filter: none;",
17350
+ "border: 0;",
17351
+ "box-shadow: none;"
17352
+ ];
17353
+ const bandRules = [
17354
+ "content: \"\";",
17355
+ "position: absolute;",
17356
+ `top: calc(-1 * var(${gap.customProperty}));`,
17357
+ "bottom: 0;",
17358
+ "left: 50%;",
17359
+ "width: 100vw;",
17360
+ "transform: translateX(-50%);",
17361
+ "pointer-events: none;",
17362
+ "border-radius: 0;",
17363
+ "z-index: -1;",
17364
+ ...rules
17365
+ ];
17366
+ return `${target.clipSelector} {\n overflow-x: clip;\n}\n${target.ownerSelector} {\n ${ownerRules.join("\n ")}\n}\n${target.selector} {\n ${bandRules.join("\n ")}\n}`;
17367
+ }
17368
+ }
17369
+ }
17370
+ //#endregion
17371
+ //#region ../theme-core/src/header/scrollTreatment.ts
17372
+ const headerScrollTreatmentSchema = z$1.discriminatedUnion("kind", [z$1.object({
17373
+ kind: z$1.literal("contrast-glass"),
17374
+ backgroundTone: z$1.enum(["light", "dark"])
17375
+ })]).optional();
17376
+ function generateMobileOverlayBackdropFilterFix(themeId, variant) {
17377
+ const root = `:where([data-theme-scope="${themeId}"]) .header-root:has([data-nav-mobile-overlay][aria-hidden="false"])`;
17378
+ 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`;
17379
+ }
17380
+ function generateHeaderScrollTreatmentStyles(treatment, themeId, variant, surfaceRules = []) {
17381
+ if (!treatment) return "";
17382
+ switch (treatment.kind) {
17383
+ case "contrast-glass": {
17384
+ const backgroundChannels = treatment.backgroundTone === "dark" ? "0 0 0" : "255 255 255";
17385
+ return renderHeaderPaintTargetRules(getHeaderPaintTargets(variant, themeId, "scrolled"), [`background-color: rgb(${backgroundChannels} / 0.60);`, ...surfaceRules]);
17386
+ }
17387
+ }
17388
+ }
17389
+ //#endregion
17390
+ //#region ../theme-core/src/header/containerSchema.ts
17391
+ const headerContainerSchema = z$1.object({
17392
+ rounded: z$1.enum([
17393
+ "none",
17394
+ "sm",
17395
+ "md",
17396
+ "lg",
17397
+ "xl",
17398
+ "2xl"
17399
+ ]).default("xl"),
17400
+ border: z$1.boolean().default(true),
17401
+ shadow: z$1.boolean().default(true),
17402
+ padding: z$1.enum([
17403
+ "sm",
17404
+ "md",
17405
+ "lg"
17406
+ ]).default("md"),
17407
+ tint: z$1.string().nullable().optional(),
17408
+ opacity: z$1.number().min(0).max(1).default(.12)
17409
+ }).optional();
17410
+ //#endregion
17379
17411
  //#region ../theme-core/src/schema.ts
17380
17412
  const axesSchema = z$1.object({
17381
17413
  tone: z$1.enum([
@@ -17536,7 +17568,7 @@ const boxBackgroundSchema = z$1.object({
17536
17568
  color: tokenOrCssColorValueSchema.nullable().optional(),
17537
17569
  gradient: z$1.string().nullable().optional(),
17538
17570
  gradientPresetId: z$1.string().min(1).nullable().optional(),
17539
- image: mediaSchema$1.nullable().optional(),
17571
+ image: mediaSchema.nullable().optional(),
17540
17572
  objectFit: z$1.enum([
17541
17573
  "fill",
17542
17574
  "fit",
@@ -17784,25 +17816,6 @@ const navFontWeight = z$1.enum([
17784
17816
  ]);
17785
17817
  const headerMaxWidth = z$1.enum(["container", "full"]);
17786
17818
  const headerBarFrame = z$1.enum(["full-bleed", "inset-shell"]);
17787
- const headerContainerSchema = z$1.object({
17788
- rounded: z$1.enum([
17789
- "none",
17790
- "sm",
17791
- "md",
17792
- "lg",
17793
- "xl",
17794
- "2xl"
17795
- ]).default("xl"),
17796
- border: z$1.boolean().default(true),
17797
- shadow: z$1.boolean().default(true),
17798
- padding: z$1.enum([
17799
- "sm",
17800
- "md",
17801
- "lg"
17802
- ]).default("md"),
17803
- tint: z$1.string().nullable().optional(),
17804
- opacity: z$1.number().min(0).max(1).default(.12)
17805
- }).optional();
17806
17819
  const headerBorderSchema = componentBorderSchema.extend({ position: z$1.enum([
17807
17820
  "bottom",
17808
17821
  "top",
@@ -17920,7 +17933,7 @@ const headerBackgroundSchema = z$1.object({
17920
17933
  contentOwner: z$1.literal(siteChromeBackgroundOverrideOwner).optional(),
17921
17934
  color: tokenOrCssColorValueSchema.nullable().optional(),
17922
17935
  gradient: gradientConfigSchema.nullable().optional(),
17923
- image: mediaSchema$1.nullable().optional(),
17936
+ image: mediaSchema.nullable().optional(),
17924
17937
  textColor: tokenOrCssColorValueSchema.nullable().optional()
17925
17938
  });
17926
17939
  const headerSchema = z$1.object({
@@ -17929,7 +17942,8 @@ const headerSchema = z$1.object({
17929
17942
  shrinkOnScroll: z$1.boolean(),
17930
17943
  maxWidth: headerMaxWidth,
17931
17944
  barFrame: headerBarFrame.optional(),
17932
- logoOverride: mediaSchema$1.nullable().optional(),
17945
+ scrollTreatment: headerScrollTreatmentSchema,
17946
+ logoOverride: mediaSchema.nullable().optional(),
17933
17947
  background: headerBackgroundSchema.default({
17934
17948
  type: "color",
17935
17949
  color: "surface"
@@ -17941,6 +17955,7 @@ const headerSchema = z$1.object({
17941
17955
  navFontRole: z$1.enum(["body", "heading"]).optional(),
17942
17956
  navTypography: z$1.enum(["body", "heading"]).optional(),
17943
17957
  navTextSize: navLinkStyleSchema.shape.textSize,
17958
+ interactionPalette: headerInteractionPaletteSchema.optional(),
17944
17959
  navPlacement: z$1.enum(["end", "center"]).optional(),
17945
17960
  container: headerContainerSchema,
17946
17961
  border: headerBorderSchema,
@@ -23417,15 +23432,6 @@ const heroCopyFragment = defineFragment({
23417
23432
  */
23418
23433
  const BLOCK_BUTTON_ROLES = PUBLIC_BUTTON_ROLES;
23419
23434
  const blockButtonRoleSchema = z$1.enum(BLOCK_BUTTON_ROLES);
23420
- /**
23421
- * Temporary rollout boundary for persisted content written before issue #1220.
23422
- * Authoring remains strict through `blockButtonRoleSchema`; this parser exists
23423
- * only until the post-deploy role rewrite has been audited in production.
23424
- */
23425
- function canonicalizePersistedBlockButtonRole(value) {
23426
- return value === "link" || value === "tertiary" ? "ghost" : value;
23427
- }
23428
- const persistedBlockButtonRoleSchema = z$1.preprocess((value) => typeof value === "string" ? canonicalizePersistedBlockButtonRole(value) : value, blockButtonRoleSchema);
23429
23435
  const BLOCK_BUTTON_ROLE_LABELS = {
23430
23436
  primary: "Primary",
23431
23437
  secondary: "Secondary",
@@ -31199,84 +31205,6 @@ const weeklySlotAvailabilityBlockDefinition = {
31199
31205
  mode: "server"
31200
31206
  } }
31201
31207
  };
31202
- const PUBLIC_DOWNLOAD_MEDIA_TYPES = [
31203
- "document",
31204
- "spreadsheet",
31205
- "archive",
31206
- "audio"
31207
- ];
31208
- const hotspotSchema = z.object({
31209
- x: z.number().min(0).max(1),
31210
- y: z.number().min(0).max(1),
31211
- radius: z.number().optional()
31212
- });
31213
- const rotationSchema = z.union([
31214
- z.literal(0),
31215
- z.literal(90),
31216
- z.literal(180),
31217
- z.literal(270)
31218
- ]);
31219
- const rectSchema = z.tuple([
31220
- z.number(),
31221
- z.number(),
31222
- z.number(),
31223
- z.number()
31224
- ]);
31225
- const aspectCropSchema = z.object({
31226
- aspect: z.preprocess((value) => value == null ? void 0 : value, z.string().optional()),
31227
- rect: z.preprocess((value) => value == null ? void 0 : value, rectSchema.optional()),
31228
- hotspot: z.preprocess((value) => value == null ? void 0 : value, hotspotSchema.optional()),
31229
- rotation: z.preprocess((value) => value == null ? void 0 : value, rotationSchema.optional())
31230
- });
31231
- const transformSchema = z.object({
31232
- aspectCrops: z.preprocess((value) => {
31233
- if (!value || typeof value !== "object" || Array.isArray(value)) return;
31234
- return value;
31235
- }, z.record(z.string(), aspectCropSchema.catch({}))).optional(),
31236
- rect: rectSchema.optional(),
31237
- hotspot: hotspotSchema.optional(),
31238
- rotation: rotationSchema.optional()
31239
- });
31240
- const mediaPosterSchema = z.discriminatedUnion("tag", [z.object({
31241
- tag: z.literal("storage"),
31242
- assetId: z.string().optional(),
31243
- storageBucket: z.string().min(1),
31244
- storagePath: z.string().min(1)
31245
- }), z.object({
31246
- tag: z.literal("external-src"),
31247
- assetId: z.string().optional(),
31248
- src: z.string().url()
31249
- })]);
31250
- const mediaBaseSchema = z.object({
31251
- purpose: z.string().optional(),
31252
- placeholder: z.boolean().default(true).optional(),
31253
- assetId: z.string().optional(),
31254
- identifier: z.string().optional(),
31255
- src: z.string().optional(),
31256
- alt: z.string().optional(),
31257
- filename: z.string().optional(),
31258
- mimeType: z.string().optional(),
31259
- width: z.number().optional(),
31260
- height: z.number().optional(),
31261
- storageBucket: z.string().optional(),
31262
- storagePath: z.string().optional(),
31263
- poster: mediaPosterSchema.optional(),
31264
- transform: transformSchema.optional()
31265
- });
31266
- const imageMediaSchema = mediaBaseSchema.extend({ type: z.literal("image") });
31267
- const videoMediaSchema = mediaBaseSchema.extend({ type: z.literal("video") });
31268
- const audioMediaSchema = mediaBaseSchema.extend({ type: z.literal("audio") });
31269
- const documentMediaSchema = mediaBaseSchema.extend({ type: z.literal("document") });
31270
- const spreadsheetMediaSchema = mediaBaseSchema.extend({ type: z.literal("spreadsheet") });
31271
- const archiveMediaSchema = mediaBaseSchema.extend({ type: z.literal("archive") });
31272
- const mediaSchema = z.discriminatedUnion("type", [
31273
- imageMediaSchema,
31274
- videoMediaSchema,
31275
- audioMediaSchema,
31276
- documentMediaSchema,
31277
- spreadsheetMediaSchema,
31278
- archiveMediaSchema
31279
- ]);
31280
31208
  //#endregion
31281
31209
  //#region ../blocks/src/system/blocks/shared/bookingPaymentTerms.ts
31282
31210
  const bookingDepositRefundPolicySchema = z$1.enum(["refundable", "non_refundable"]);
@@ -31716,7 +31644,7 @@ const publicEventSchema = z$1.object({
31716
31644
  presentation: z$1.object({
31717
31645
  cardTitleOverride: z$1.string().nullable().optional(),
31718
31646
  summary: z$1.string().nullable().optional(),
31719
- image: mediaSchema.nullable().optional()
31647
+ image: mediaSchema$1.nullable().optional()
31720
31648
  }).optional(),
31721
31649
  slug: z$1.string(),
31722
31650
  path: z$1.string().nullable(),
@@ -32342,7 +32270,7 @@ function isEventCalendarListLayout(value) {
32342
32270
  //#region ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
32343
32271
  const previewStageSchema = z$1.enum(["preview", "published"]);
32344
32272
  const registrationButtonVariantSchema = blockButtonRoleSchema;
32345
- const eventButtonVariantSchema = persistedBlockButtonRoleSchema;
32273
+ const eventButtonVariantSchema = blockButtonRoleSchema;
32346
32274
  const eventLayoutSchema = z$1.enum(eventCalendarListLayoutValues);
32347
32275
  const eventCalendarDisplayModeSchema = z$1.enum(eventCalendarDisplayModeValues);
32348
32276
  const eventCalendarDefaultViewSchema = z$1.enum(eventCalendarDefaultViewValues);
@@ -42336,7 +42264,7 @@ const newsletterSignupBlockDefinition = {
42336
42264
  //#endregion
42337
42265
  //#region ../blocks/src/system/blocks/team-members.ts
42338
42266
  const ITEM_NAME = "member";
42339
- const teamMemberPhotoSchema = mediaSchema.refine((media) => media.type === "image", { message: "Team member photos must be image media" }).nullable();
42267
+ const teamMemberPhotoSchema = mediaSchema$1.refine((media) => media.type === "image", { message: "Team member photos must be image media" }).nullable();
42340
42268
  const teamMemberDataSchema = z$1.object({
42341
42269
  _type: z$1.literal("teamMember"),
42342
42270
  id: z$1.string(),
@@ -43911,7 +43839,7 @@ function getBlockDefinition(name) {
43911
43839
  //#endregion
43912
43840
  //#region ../blocks/src/system/helpers/backgroundMedia.ts
43913
43841
  function resolveBackgroundMedia(input) {
43914
- const parsedMedia = mediaSchema.safeParse(input.image);
43842
+ const parsedMedia = mediaSchema$1.safeParse(input.image);
43915
43843
  if (!parsedMedia.success) return null;
43916
43844
  switch (parsedMedia.data.type) {
43917
43845
  case "image":
@@ -45142,6 +45070,9 @@ function renderTrailingAffordanceIcon(affordance) {
45142
45070
  className: "rb-ml-2 rb-h-4 rb-w-4 rb-inline-block"
45143
45071
  });
45144
45072
  }
45073
+ function isMissingRequiredLink(linkRequired, resolvedHref) {
45074
+ return linkRequired && resolvedHref.length === 0;
45075
+ }
45145
45076
  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 }) => {
45146
45077
  const content = value ?? children;
45147
45078
  if (!content) {
@@ -45150,12 +45081,16 @@ const ButtonNode = ({ value, children, href, variantId = "primary", size = "md",
45150
45081
  }
45151
45082
  const affordanceIcon = renderTrailingAffordanceIcon(resolveButtonAffordance({ trailingIcon }));
45152
45083
  const resolvedHref = typeof href === "string" ? href.trim() : "";
45153
- if (linkRequired && resolvedHref.length === 0) {
45084
+ if (isMissingRequiredLink(linkRequired, resolvedHref)) {
45154
45085
  if (process.env.NODE_ENV === "development") console.warn("[ButtonNode] Missing href for link-required button");
45155
45086
  return null;
45156
45087
  }
45157
45088
  const extraClassName = affordanceIcon ? [className, AFFORDANCE_SUPPRESS_CLASS].filter(Boolean).join(" ") : className;
45158
- const resolvedVariantId = parseThemeButtonVariantId(canonicalizePersistedBlockButtonRole(variantId));
45089
+ const resolvedVariantId = parseThemeButtonVariantId(variantId);
45090
+ if (variantId && !resolvedVariantId) {
45091
+ console.error("[ButtonNode] Invalid button variant", { variantId });
45092
+ return null;
45093
+ }
45159
45094
  const combinedClassName = resolvedVariantId ? themeButtonClassName({
45160
45095
  variant: resolvedVariantId,
45161
45096
  size,
@@ -45284,8 +45219,9 @@ function iconForMediaType(type) {
45284
45219
  });
45285
45220
  }
45286
45221
  }
45287
- function normalizeButtonVariant(value) {
45288
- return isBlockButtonRole(value) ? value : "primary";
45222
+ function parseButtonVariant(value) {
45223
+ if (value === null || value === void 0) return "primary";
45224
+ return isBlockButtonRole(value) ? value : null;
45289
45225
  }
45290
45226
  function FileDownloadNode({ value, title, description, buttonLabel, buttonVariant, className }) {
45291
45227
  if (!value || !isDownloadableMediaType(value.type)) return null;
@@ -45295,7 +45231,11 @@ function FileDownloadNode({ value, title, description, buttonLabel, buttonVarian
45295
45231
  const heading = title?.trim() || filename;
45296
45232
  const body = description?.trim();
45297
45233
  const label = buttonLabel?.trim() || "Download";
45298
- const variant = normalizeButtonVariant(buttonVariant);
45234
+ const variant = parseButtonVariant(buttonVariant);
45235
+ if (!variant) {
45236
+ console.error("[FileDownloadNode] Invalid button variant", { buttonVariant });
45237
+ return null;
45238
+ }
45299
45239
  return /* @__PURE__ */ jsx("div", {
45300
45240
  className,
45301
45241
  children: /* @__PURE__ */ jsxs("div", {
@@ -52216,6 +52156,41 @@ function resolveColorTokenHex(theme, colorToken) {
52216
52156
  if (colorToken === "transparent") return null;
52217
52157
  return expandPalette(theme.palette)[colorToken] ?? null;
52218
52158
  }
52159
+ const NAV_DROPDOWN_CONTAINER_RAIL_CSS_RULES = [
52160
+ `min-width: 12rem;`,
52161
+ `width: max-content;`,
52162
+ `max-width: min(22rem, calc(100vw - 2rem));`,
52163
+ `transform: translateX(var(--nav-dropdown-shift-x, 0px));`
52164
+ ];
52165
+ //#endregion
52166
+ //#region ../theme-core/src/header/surfaceRules.ts
52167
+ /** Compile the visual surface declarations independently of paint geometry. */
52168
+ function buildHeaderSurfaceRules(header, tokens, blur) {
52169
+ const base = [];
52170
+ const scrolled = [];
52171
+ const background = header.background;
52172
+ if (background.type === "color") base.push(`background-color: ${tokens.getColor(background.color || "surface")};`);
52173
+ else if (background.type === "gradient" && background.gradient) {
52174
+ const stops = background.gradient.stops.map((stop) => tokens.getColor(stop.color)).join(", ");
52175
+ base.push(`background-image: linear-gradient(${background.gradient.angle ?? 180}deg, ${stops});`);
52176
+ }
52177
+ const blurRules = [`backdrop-filter: ${blur};`, `-webkit-backdrop-filter: ${blur};`];
52178
+ base.push(...blurRules);
52179
+ scrolled.push(...blurRules);
52180
+ const borderWidth = getComponentBorderWidthPx(header.border?.width ?? "none");
52181
+ if (!header.border || borderWidth === "0") return {
52182
+ base,
52183
+ scrolled,
52184
+ border: []
52185
+ };
52186
+ const color = rgbColorValue(header.border.colorToken?.trim() || "border");
52187
+ const style = header.border.style === "dashed" ? "dashed" : "solid";
52188
+ return {
52189
+ base,
52190
+ scrolled,
52191
+ border: header.border.position === "both" ? [`border-top: ${borderWidth} ${style} ${color};`, `border-bottom: ${borderWidth} ${style} ${color};`] : [`border-${header.border.position}: ${borderWidth} ${style} ${color};`]
52192
+ };
52193
+ }
52219
52194
  //#endregion
52220
52195
  //#region ../theme-core/src/navigation/presets.ts
52221
52196
  /**
@@ -52377,12 +52352,71 @@ function getNavLinkPreset(presetId) {
52377
52352
  return NAV_LINK_PRESETS[presetId];
52378
52353
  }
52379
52354
  Object.keys(NAV_LINK_PRESETS);
52380
- const NAV_DROPDOWN_CONTAINER_RAIL_CSS_RULES = [
52381
- `min-width: 12rem;`,
52382
- `width: max-content;`,
52383
- `max-width: min(22rem, calc(100vw - 2rem));`,
52384
- `transform: translateX(var(--nav-dropdown-shift-x, 0px));`
52385
- ];
52355
+ //#endregion
52356
+ //#region ../theme-core/src/header/legacyNavLinkStyle.ts
52357
+ function buildLegacyHeaderNavLinkStyle(header, contrastTreatment, navTextSize) {
52358
+ const navStyle = header.navStyle ?? "minimal";
52359
+ const basePreset = getNavLinkPreset(navStyle);
52360
+ if (!basePreset) return null;
52361
+ const style = {
52362
+ ...basePreset,
52363
+ fontWeight: header.navWeight ?? basePreset.fontWeight,
52364
+ colorToken: (header.navColor ?? header.textColor)?.trim() || basePreset.colorToken,
52365
+ ...contrastTreatment ? { contrastTreatment } : {},
52366
+ ...navTextSize ? { textSize: navTextSize } : {}
52367
+ };
52368
+ if (header.navWeight === "bold" && navStyle === "solid") style.textTransform = "uppercase";
52369
+ applyLegacyNavEffects(style, header);
52370
+ applyLegacyGlassTreatment(style, header, navStyle);
52371
+ return style;
52372
+ }
52373
+ function applyLegacyNavEffects(style, header) {
52374
+ if (!header.navEffects) return;
52375
+ const effects = style.effects = {
52376
+ ...style.effects,
52377
+ hover: [...style.effects?.hover ?? []],
52378
+ active: [...style.effects?.active ?? []]
52379
+ };
52380
+ if (header.navEffects.glow) effects.hover.push({
52381
+ effectId: "outer-glow",
52382
+ options: { spread: 5 }
52383
+ });
52384
+ if (header.navEffects.neumorphic) {
52385
+ effects.hover.push({
52386
+ effectId: "neumorphic-shadow",
52387
+ options: { mode: "pressed" }
52388
+ });
52389
+ effects.hover.push({
52390
+ effectId: "text-color-change",
52391
+ options: { hoverColorToken: "primary" }
52392
+ });
52393
+ }
52394
+ if (header.navEffects.underlineGradient) effects.hover.push({
52395
+ effectId: "border-bottom-grow",
52396
+ options: { origin: "center" }
52397
+ });
52398
+ }
52399
+ function applyLegacyGlassTreatment(style, header, navStyle) {
52400
+ if (header.navContainer?.type !== "glass" || navStyle !== "minimal") return;
52401
+ style.borderRadius = "full";
52402
+ style.effects = {
52403
+ ...style.effects,
52404
+ hover: glassStateEffects(10),
52405
+ active: glassStateEffects(18)
52406
+ };
52407
+ }
52408
+ function glassStateEffects(opacity) {
52409
+ return [{
52410
+ effectId: "background-on-hover-alpha",
52411
+ options: {
52412
+ colorToken: "neutral-50",
52413
+ opacity
52414
+ }
52415
+ }, {
52416
+ effectId: "text-color-change",
52417
+ options: { hoverColorToken: "neutral-50" }
52418
+ }];
52419
+ }
52386
52420
  //#endregion
52387
52421
  //#region ../theme-core/src/header/generateHeaderCss.ts
52388
52422
  const HEADER_BLUR = "blur(12px)";
@@ -52412,8 +52446,8 @@ function generateHeaderCss(options) {
52412
52446
  const cssChunks = [];
52413
52447
  const headerContrastTreatment = resolveHeaderContrastTreatment(header);
52414
52448
  const headerNavTextSize = resolveHeaderNavTextSize(header);
52415
- cssChunks.push(generateHeaderRootStyles(header, themeId, tokens, theme));
52416
- cssChunks.push(generateMobileOverlayBackdropFilterFix(themeId));
52449
+ cssChunks.push(generateHeaderRootStyles(header, themeId, tokens));
52450
+ cssChunks.push(generateMobileOverlayBackdropFilterFix(themeId, header.variant));
52417
52451
  cssChunks.push(generateLogoStyles({
52418
52452
  logo: header.logo,
52419
52453
  themeId,
@@ -52451,56 +52485,34 @@ function isClearSplitHeaderShape(header) {
52451
52485
  function isDetachedFloatingHeaderShape(header) {
52452
52486
  return header.variant === "floating" && !header.container;
52453
52487
  }
52454
- function generateMobileOverlayBackdropFilterFix(themeId) {
52455
- 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`;
52456
- }
52457
52488
  /**
52458
52489
  * Generate root header container styles
52459
52490
  */
52460
- function generateHeaderRootStyles(header, themeId, tokens, _theme) {
52491
+ function generateHeaderRootStyles(header, themeId, tokens) {
52461
52492
  const selector = `:where([data-theme-scope="${themeId}"]) .header-root`;
52462
- const backgroundSelector = `:where([data-theme-scope="${themeId}"]) .header-root::before`;
52463
52493
  const rules = [];
52464
- const backgroundRules = [];
52465
52494
  const navContainerType = header.navContainer?.type ?? "none";
52466
52495
  const isContainedNav = navContainerType === "pill" || navContainerType === "glass";
52467
52496
  rules.push("position: relative;");
52468
52497
  rules.push("isolation: isolate;");
52469
- if (!isContainedNav) {
52470
- const bg = header.background;
52471
- if (bg.type === "color") {
52472
- const bgColor = tokens.getColor(bg.color || "surface");
52473
- backgroundRules.push(`background-color: ${bgColor};`);
52474
- } else if (bg.type === "gradient" && bg.gradient) {
52475
- const stops = bg.gradient.stops.map((s) => tokens.getColor(s.color)).join(", ");
52476
- const angle = bg.gradient.angle ?? 180;
52477
- backgroundRules.push(`background-image: linear-gradient(${angle}deg, ${stops});`);
52478
- }
52479
- backgroundRules.push(`backdrop-filter: ${HEADER_BLUR};`);
52480
- backgroundRules.push(`-webkit-backdrop-filter: ${HEADER_BLUR};`);
52481
- if (header.border) {
52482
- const borderWidth = getComponentBorderWidthPx(header.border.width);
52483
- if (borderWidth !== "0") {
52484
- const borderToken = header.border?.colorToken?.trim() || "border";
52485
- const borderColor = tokens.getColor(borderToken);
52486
- const borderStyle = header.border.style === "dashed" ? "dashed" : "solid";
52487
- if (header.border.position === "bottom") rules.push(`border-bottom: ${borderWidth} ${borderStyle} ${borderColor};`);
52488
- else if (header.border.position === "top") rules.push(`border-top: ${borderWidth} ${borderStyle} ${borderColor};`);
52489
- else if (header.border.position === "both") {
52490
- rules.push(`border-top: ${borderWidth} ${borderStyle} ${borderColor};`);
52491
- rules.push(`border-bottom: ${borderWidth} ${borderStyle} ${borderColor};`);
52492
- }
52493
- }
52494
- }
52495
- }
52498
+ const surfaceRules = isContainedNav ? {
52499
+ base: [],
52500
+ scrolled: [],
52501
+ border: []
52502
+ } : buildHeaderSurfaceRules(header, tokens, HEADER_BLUR);
52503
+ const floatingSurfaceBorder = header.variant === "floating";
52504
+ if (!floatingSurfaceBorder) rules.push(...surfaceRules.border);
52505
+ const basePaintRules = floatingSurfaceBorder ? [...surfaceRules.base, ...surfaceRules.border] : surfaceRules.base;
52506
+ const scrolledPaintRules = floatingSurfaceBorder ? [...surfaceRules.scrolled, ...surfaceRules.border] : surfaceRules.scrolled;
52496
52507
  if (header.positioning === "sticky" || header.positioning === "fixed") {
52497
52508
  const shadowVar = getComponentShadowVar(header.shadow?.elevation ?? "none");
52498
52509
  if (shadowVar) rules.push(`box-shadow: ${shadowVar};`);
52499
52510
  }
52500
52511
  const baseBlock = `\n${selector} {\n ${rules.join("\n ")}\n}\n`;
52501
52512
  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`;
52502
- if (isContainedNav || backgroundRules.length === 0) return `${baseBlock}\n${overlayFix}`;
52503
- 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) : ""}`;
52513
+ const scrollTreatmentStyles = generateHeaderScrollTreatmentStyles(header.scrollTreatment, themeId, header.variant, scrolledPaintRules);
52514
+ if (isContainedNav || basePaintRules.length === 0) return `${baseBlock}\n${overlayFix}${scrollTreatmentStyles}`;
52515
+ return `${baseBlock}\n${renderHeaderPaintTargetRules(getHeaderPaintTargets(header.variant, themeId), basePaintRules)}\n${overlayFix}${usesInsetShell(header) ? generateInsetShellStyles(header, themeId) : ""}${scrollTreatmentStyles}`;
52504
52516
  }
52505
52517
  /**
52506
52518
  * Reshapes the full-bleed header paint layer into a contained brand capsule at
@@ -52545,10 +52557,10 @@ function generateLogoStyles(input) {
52545
52557
  else rules.push(`font-family: var(--font-heading);`);
52546
52558
  if (logo) {
52547
52559
  if (logo.letterSpacing && logo.letterSpacing !== "normal") rules.push(`letter-spacing: ${{
52548
- "normal": "0em",
52549
- "wide": "0.05em",
52550
- "wider": "0.1em",
52551
- "widest": "0.15em"
52560
+ normal: "0em",
52561
+ wide: "0.05em",
52562
+ wider: "0.1em",
52563
+ widest: "0.15em"
52552
52564
  }[logo.letterSpacing]};`);
52553
52565
  if (logo.gradient) {
52554
52566
  rules.push(`background: linear-gradient(to right, ${primaryColor}, ${accentColor});`);
@@ -52621,71 +52633,11 @@ function generateNavLinkStyles(header, themeId, tokens, theme, contrastTreatment
52621
52633
  } : header.navLinkStyle, navPreferences),
52622
52634
  className: "header-nav-link"
52623
52635
  });
52624
- const navStyle = header.navStyle ?? "minimal";
52625
- const basePreset = getNavLinkPreset(navStyle);
52626
- if (!basePreset) {
52627
- console.warn(`[generateHeaderCss] Nav link preset not found: ${navStyle}`);
52636
+ const mergedStyle = buildLegacyHeaderNavLinkStyle(header, contrastTreatment, navTextSize);
52637
+ if (!mergedStyle) {
52638
+ console.warn(`[generateHeaderCss] Nav link preset not found: ${header.navStyle}`);
52628
52639
  return "";
52629
52640
  }
52630
- const mergedStyle = {
52631
- ...basePreset,
52632
- fontWeight: header.navWeight ?? basePreset.fontWeight,
52633
- colorToken: (header.navColor ?? header.textColor)?.trim() || basePreset.colorToken,
52634
- ...contrastTreatment ? { contrastTreatment } : {},
52635
- ...navTextSize ? { textSize: navTextSize } : {}
52636
- };
52637
- if (header.navWeight === "bold" && navStyle === "solid") mergedStyle.textTransform = "uppercase";
52638
- if (header.navEffects) {
52639
- const effects = mergedStyle.effects = {
52640
- ...mergedStyle.effects,
52641
- hover: [...mergedStyle.effects?.hover || []],
52642
- active: [...mergedStyle.effects?.active || []]
52643
- };
52644
- if (header.navEffects.glow) effects.hover.push({
52645
- effectId: "outer-glow",
52646
- options: { spread: 5 }
52647
- });
52648
- if (header.navEffects.neumorphic) {
52649
- effects.hover.push({
52650
- effectId: "neumorphic-shadow",
52651
- options: { mode: "pressed" }
52652
- });
52653
- effects.hover.push({
52654
- effectId: "text-color-change",
52655
- options: { hoverColorToken: "primary" }
52656
- });
52657
- }
52658
- if (header.navEffects.underlineGradient) effects.hover.push({
52659
- effectId: "border-bottom-grow",
52660
- options: { origin: "center" }
52661
- });
52662
- }
52663
- if ((header.navContainer?.type ?? "none") === "glass" && navStyle === "minimal") {
52664
- mergedStyle.borderRadius = "full";
52665
- mergedStyle.effects = {
52666
- ...mergedStyle.effects,
52667
- hover: [{
52668
- effectId: "background-on-hover-alpha",
52669
- options: {
52670
- colorToken: "neutral-50",
52671
- opacity: 10
52672
- }
52673
- }, {
52674
- effectId: "text-color-change",
52675
- options: { hoverColorToken: "neutral-50" }
52676
- }],
52677
- active: [{
52678
- effectId: "background-on-hover-alpha",
52679
- options: {
52680
- colorToken: "neutral-50",
52681
- opacity: 18
52682
- }
52683
- }, {
52684
- effectId: "text-color-change",
52685
- options: { hoverColorToken: "neutral-50" }
52686
- }]
52687
- };
52688
- }
52689
52641
  return generateNavLinkCSS({
52690
52642
  themeId,
52691
52643
  tokens,
@@ -52713,10 +52665,10 @@ function generateDropdownContainerStyles(header, themeId, tokens) {
52713
52665
  if (shadowVar) rules.push(`box-shadow: ${shadowVar};`);
52714
52666
  const borderRadius = dropdownStyle?.borderRadius ?? "md";
52715
52667
  rules.push(`border-radius: ${{
52716
- "none": "0",
52717
- "sm": "0.25rem",
52718
- "md": "0.5rem",
52719
- "lg": "0.75rem"
52668
+ none: "0",
52669
+ sm: "0.25rem",
52670
+ md: "0.5rem",
52671
+ lg: "0.75rem"
52720
52672
  }[borderRadius]};`);
52721
52673
  rules.push(`padding: 0.5rem 0;`);
52722
52674
  return `\n${selector} {\n ${rules.join("\n ")}\n}\n`;
@@ -52771,16 +52723,16 @@ function generateDropdownLinkStyles(header, themeId, tokens, theme) {
52771
52723
  const additionalRules = [];
52772
52724
  const letterSpacing = configuredDropdownStyle?.letterSpacing ?? "normal";
52773
52725
  if (letterSpacing !== "normal") additionalRules.push(`letter-spacing: ${{
52774
- "normal": "0em",
52775
- "wide": "0.05em",
52776
- "wider": "0.1em"
52726
+ normal: "0em",
52727
+ wide: "0.05em",
52728
+ wider: "0.1em"
52777
52729
  }[letterSpacing]};`);
52778
52730
  const textSize = configuredDropdownStyle?.textSize ?? "sm";
52779
52731
  additionalRules.push(`font-size: ${{
52780
- "xs": "0.75rem",
52781
- "sm": "0.875rem",
52782
- "base": "1rem",
52783
- "lg": "1.125rem"
52732
+ xs: "0.75rem",
52733
+ sm: "0.875rem",
52734
+ base: "1rem",
52735
+ lg: "1.125rem"
52784
52736
  }[textSize]};`);
52785
52737
  if (additionalRules.length > 0) return baseCSS + `\n${`:where([data-theme-scope="${themeId}"]) .nav-dropdown-link`} {\n ${additionalRules.join("\n ")}\n}\n`;
52786
52738
  return baseCSS;
@@ -52876,18 +52828,18 @@ function generateFloatingContainerStyles(header, themeId, tokens) {
52876
52828
  rules.push(`-webkit-backdrop-filter: ${FLOATING_BLUR};`);
52877
52829
  if (container.border) rules.push(`border: 1px solid rgb(255 255 255 / 0.2);`);
52878
52830
  rules.push(`border-radius: ${{
52879
- "none": "0",
52880
- "sm": "0.375rem",
52881
- "md": "0.5rem",
52882
- "lg": "0.75rem",
52883
- "xl": "1rem",
52831
+ none: "0",
52832
+ sm: "0.375rem",
52833
+ md: "0.5rem",
52834
+ lg: "0.75rem",
52835
+ xl: "1rem",
52884
52836
  "2xl": "1.5rem"
52885
52837
  }[container.rounded]};`);
52886
52838
  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);`);
52887
52839
  rules.push(`padding: ${{
52888
- "sm": "1rem 1.5rem",
52889
- "md": "1.5rem 2rem",
52890
- "lg": "2rem 2.5rem"
52840
+ sm: "1rem 1.5rem",
52841
+ md: "1.5rem 2rem",
52842
+ lg: "2rem 2.5rem"
52891
52843
  }[container.padding]};`);
52892
52844
  return `\n${selector} {\n ${rules.join("\n ")}\n}\n`;
52893
52845
  }