@riverbankcms/sdk 0.144.0 → 0.145.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 (162) hide show
  1. package/dist/{PreviewEditorSidebar-CQZNnFiM.mjs → PreviewEditorSidebar-O-V6Pl5a.mjs} +4 -4
  2. package/dist/{PreviewEditorUI-DCNxnmI0.mjs → PreviewEditorUI-1UlX_9cw.mjs} +3 -3
  3. package/dist/{PreviewQueryProvider-BCYICImX.mjs → PreviewQueryProvider-BxGwdOCV.mjs} +1 -1
  4. package/dist/{SdkPreviewModeRuntime-BJolUbr1.mjs → SdkPreviewModeRuntime-DYbA_4iv.mjs} +419 -348
  5. package/dist/{SiteChromeCustomizeContext-CKgEpoxi.mjs → SiteChromeCustomizeContext-CNTKQ9nx.mjs} +2081 -1313
  6. package/dist/_dts/ai/src/contracts/proposals.d.ts +4719 -66
  7. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +429 -6
  8. package/dist/_dts/api/src/appointmentEndpointDefinitions.d.ts +49 -0
  9. package/dist/_dts/api/src/appointmentServiceCategoryEndpoints.d.ts +75 -0
  10. package/dist/_dts/api/src/appointmentServiceContracts.d.ts +80 -0
  11. package/dist/_dts/api/src/appointmentSetup.d.ts +8 -1
  12. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +2 -12
  13. package/dist/_dts/api/src/communications.d.ts +14 -22
  14. package/dist/_dts/api/src/contentRuntime.d.ts +2 -0
  15. package/dist/_dts/api/src/endpoints.d.ts +105 -58
  16. package/dist/_dts/api/src/indexExtendedTypes.d.ts +1 -1
  17. package/dist/_dts/api/src/launchReadiness.d.ts +2 -0
  18. package/dist/_dts/api/src/newsletterEndpointDefinitions.d.ts +0 -23
  19. package/dist/_dts/api/src/onboarding/confirmationResend.d.ts +3 -0
  20. package/dist/_dts/api/src/publicBookingService.d.ts +35 -1
  21. package/dist/_dts/api/src/publicExperience/newsletterEndpoints.d.ts +13 -0
  22. package/dist/_dts/api/src/publicNewsletterEndpointDefinitions.d.ts +58 -0
  23. package/dist/_dts/api/src/schemas/admin-observability-logs.d.ts +3 -3
  24. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +2 -6
  25. package/dist/_dts/api/src/types.d.ts +2 -1
  26. package/dist/_dts/blocks/src/PageRenderer.d.ts +4 -4
  27. package/dist/_dts/blocks/src/bindings/index.d.ts +2 -2
  28. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +24 -0
  29. package/dist/_dts/blocks/src/index.d.ts +1 -1
  30. package/dist/_dts/blocks/src/pageRenderJoins.d.ts +68 -0
  31. package/dist/_dts/blocks/src/pageRenderPlan.d.ts +8 -27
  32. package/dist/_dts/blocks/src/pageRenderPreparation.d.ts +7 -4
  33. package/dist/_dts/blocks/src/pageRendererBoundaries.d.ts +40 -23
  34. package/dist/_dts/blocks/src/server.d.ts +1 -1
  35. package/dist/_dts/blocks/src/system/blocks/appointment-services.d.ts +2 -0
  36. package/dist/_dts/blocks/src/system/blocks/events/eventSelectionFields.d.ts +2 -2
  37. package/dist/_dts/blocks/src/system/blocks/events/shared/calendarWindow.d.ts +1 -1
  38. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +2 -2
  39. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +47 -47
  40. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +29 -3
  41. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.d.ts +8 -1
  42. package/dist/_dts/blocks/src/system/runtime/nodes/appointment-services.d.ts +22 -2
  43. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +3 -1
  44. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.interactive.d.ts +57 -2
  45. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.service-categories.d.ts +29 -0
  46. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.service-choices.d.ts +13 -0
  47. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.state.d.ts +3 -3
  48. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +13 -1
  49. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.d.ts +1 -1
  50. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +3 -3
  51. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.submission.d.ts +20 -1
  52. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +2 -0
  53. package/dist/_dts/content-model/src/content-types/schema.d.ts +1 -1
  54. package/dist/_dts/core/src/appointment-service-categories.d.ts +108 -0
  55. package/dist/_dts/core/src/editor-state.d.ts +6 -0
  56. package/dist/_dts/core/src/index.d.ts +1 -0
  57. package/dist/_dts/core/src/public-profile.d.ts +9 -0
  58. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +663 -241
  59. package/dist/_dts/editor-blocks/src/block-editor/types.d.ts +6 -0
  60. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/loaders.d.ts +16 -1
  61. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/types.d.ts +13 -0
  62. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/utils.d.ts +29 -0
  63. package/dist/_dts/preview-next/src/client/blocks/BoundaryControl.d.ts +7 -2
  64. package/dist/_dts/preview-next/src/client/blocks/composer/mergeDrafts.d.ts +1 -1
  65. package/dist/_dts/preview-next/src/client/blocks/composer/types.d.ts +1 -0
  66. package/dist/_dts/preview-next/src/client/blocks/previewProjection/applyPreviewProjections.d.ts +1 -3
  67. package/dist/_dts/preview-next/src/client/blocks/previewProjection/runtimeContentDecoration.d.ts +2 -2
  68. package/dist/_dts/preview-next/src/client/blocks/previewProjection/types.d.ts +2 -2
  69. package/dist/_dts/preview-next/src/client/preview/PreviewEntryControllerProvider.d.ts +1 -0
  70. package/dist/_dts/sdk/src/client/runtimeCacheKeys.d.ts +8 -0
  71. package/dist/_dts/sdk/src/client/types.d.ts +1 -1
  72. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  73. package/dist/_dts/sdk/src/contracts/page.d.ts +7 -2
  74. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +5 -0
  75. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +2 -2
  76. package/dist/_dts/sdk/src/public-api/contracts.d.ts +6 -8
  77. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -2
  78. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +2 -2
  79. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +1 -1
  80. package/dist/_dts/sdk/src/rendering/hooks/useContent.d.ts +1 -1
  81. package/dist/_dts/sdk/src/version.d.ts +1 -1
  82. package/dist/_dts/surfaces/src/index.d.ts +1 -0
  83. package/dist/_dts/theme-core/src/layout/boundaryCss.d.ts +3 -0
  84. package/dist/_dts/theme-core/src/site-styles/compositionBudget.d.ts +8 -0
  85. package/dist/_dts/theme-core/src/site-styles/contentTemplateRuntimeCompiler.d.ts +3 -2
  86. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +1 -3
  87. package/dist/_dts/theme-core/src/site-styles/generatedDesignPipeline.d.ts +3 -0
  88. package/dist/_dts/theme-core/src/site-styles/index.d.ts +3 -0
  89. package/dist/_dts/theme-core/src/site-styles/joinTreatment.d.ts +132 -0
  90. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorBoundaries.d.ts +31 -0
  91. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +33 -29
  92. package/dist/_dts/theme-core/src/site-styles/pageDesignIntent.d.ts +4 -4
  93. package/dist/_dts/theme-core/src/site-styles/pageFlowPresets.d.ts +36 -0
  94. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +4 -10
  95. package/dist/_dts/theme-core/src/site-styles/rawStyleFields.d.ts +17 -4
  96. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +20 -74
  97. package/dist/_dts/theme-core/src/site-styles/sectionBoundaryComposition.d.ts +95 -0
  98. package/dist/_dts/theme-core/src/site-styles/sectionTransitions.d.ts +80 -518
  99. package/dist/_dts/theme-core/src/site-styles/siteStyleBlockPolicies.d.ts +9 -4
  100. package/dist/_dts/theme-core/src/site-styles/transitionCatalogue.d.ts +320 -0
  101. package/dist/_dts/theme-core/src/site-styles/types.d.ts +3 -18
  102. package/dist/client/{BookingConsentAgreement-DoAILrkN.mjs → BookingConsentAgreement-DlVOmpW4.mjs} +2 -2
  103. package/dist/client/{DiscountCodeDisclosure-X528hUTf.mjs → DiscountCodeDisclosure-T9q623PQ.mjs} +1 -1
  104. package/dist/client/{EventCombined.client-DSBVwq5m.mjs → EventCombined.client-DnsUeONl.mjs} +6 -6
  105. package/dist/client/{EventListing.client-DmFAX7Vb.mjs → EventListing.client-CNBFqJS4.mjs} +2 -2
  106. package/dist/client/{LeafletStaticMap-BAqXdfhq.mjs → LeafletStaticMap-C7higg52.mjs} +1 -1
  107. package/dist/client/{ThemedButton-BwNFVwi4.mjs → ThemedButton-LAJTNrS8.mjs} +1 -1
  108. package/dist/client/{accordion-DRhMdkbd.mjs → accordion-BcNF9TjX.mjs} +1 -1
  109. package/dist/client/{bookingForm-iJ_nCsNF.mjs → bookingForm-BUaQ3S03.mjs} +142 -50
  110. package/dist/client/bookings.mjs +191 -64
  111. package/dist/client/{carousel-D8zuffZr.mjs → carousel-CTdF6e0V.mjs} +1 -1
  112. package/dist/client/{cart-DeMGJViN.mjs → cart-pGtyf_XU.mjs} +3 -3
  113. package/dist/client/{checkout-DXc06Km2.mjs → checkout-Da9WSn7Y.mjs} +3 -3
  114. package/dist/client/client.mjs +1630 -816
  115. package/dist/client/{context-CDLCfDep.mjs → context-BFeY_Wbm.mjs} +1 -1
  116. package/dist/client/{dates-ClFx7Epy.mjs → dates-BhwVSxDg.mjs} +2 -2
  117. package/dist/client/{eventCalendar-BaGpnOGN.mjs → eventCalendar-BAtdnR4s.mjs} +9 -9
  118. package/dist/client/{eventCombined-ywONOx2m.mjs → eventCombined-RksA3tRC.mjs} +4 -4
  119. package/dist/client/{eventDetails-B2LlOTYY.mjs → eventDetails-BB9hB4wR.mjs} +4 -4
  120. package/dist/client/{eventListing-CMgxWpqP.mjs → eventListing-BpJBkviM.mjs} +4 -4
  121. package/dist/client/{eventRegistration-BarLDNHR.mjs → eventRegistration-B18jFq_o.mjs} +8 -8
  122. package/dist/client/{form-BjqKaBJ7.mjs → form-Dodt8Y8t.mjs} +3 -3
  123. package/dist/client/{headerSection-CP4XDwz1.mjs → headerSection-B0qj9ttg.mjs} +3 -3
  124. package/dist/client/hooks.mjs +550 -99
  125. package/dist/client/{locationMap-C5gW-d-w.mjs → locationMap-gn-iMk7a.mjs} +3 -3
  126. package/dist/client/{newsletterForm-afXlVSA0.mjs → newsletterForm-oByLdFkr.mjs} +26 -5
  127. package/dist/client/{pricing-Bl1CAl28.mjs → pricing-BOU0_Hai.mjs} +1 -1
  128. package/dist/client/{productDetail-CvQ3jWQe.mjs → productDetail-D9v1zH2j.mjs} +3 -3
  129. package/dist/client/{productList-U874PGO7.mjs → productList-D-mItx1n.mjs} +3 -3
  130. package/dist/client/{propsDecoder-DPXtCZWP.mjs → propsDecoder-C3TP_z4x.mjs} +72 -33
  131. package/dist/client/rendering/client.mjs +900 -266
  132. package/dist/client/rendering/islands.mjs +17 -17
  133. package/dist/client/rendering.mjs +1637 -788
  134. package/dist/client/{routeIslandApiConfig-NGYiUWXu.mjs → routeIslandApiConfig-DzN1W0sq.mjs} +1 -1
  135. package/dist/client/{scrollToBlock-0-C3DVhK.mjs → scrollToBlock-CWs8EIdo.mjs} +1 -1
  136. package/dist/client/{shop-BXjXhM9P.mjs → shop-Dufw7N7o.mjs} +7 -7
  137. package/dist/client/{shop-commerce-BZ6UlWJ7.mjs → shop-commerce-gklw_hLF.mjs} +6 -6
  138. package/dist/client/{shop-commerce-store-DlSBXb3D.mjs → shop-commerce-store-Sf1eyTaZ.mjs} +1 -1
  139. package/dist/client/{shopShared-kkEOiLPA.mjs → shopShared-B5nyA41S.mjs} +4 -4
  140. package/dist/client/{useEventFilters-zvnnE1ro.mjs → useEventFilters-CLL829vy.mjs} +6 -6
  141. package/dist/preview-next/before-render.mjs +147 -77
  142. package/dist/preview-next/client/runtime.mjs +4 -4
  143. package/dist/preview-next/keepAlive.mjs +147 -77
  144. package/dist/preview-next/middleware.mjs +147 -77
  145. package/dist/{previewAuthStore-JA6-I_sL.mjs → previewAuthStore-BxAFlu-j.mjs} +147 -77
  146. package/dist/{sdk-runtime-DFJlQt3q.mjs → sdk-runtime-D0uZFev7.mjs} +2 -2
  147. package/dist/{separator-o8GHb1xh.mjs → separator-EvdCAn4V.mjs} +1 -1
  148. package/dist/server/components.mjs +1727 -991
  149. package/dist/server/config-validation.mjs +537 -97
  150. package/dist/server/config.mjs +537 -97
  151. package/dist/server/data.mjs +549 -98
  152. package/dist/server/index.mjs +159 -81
  153. package/dist/server/next.mjs +1460 -748
  154. package/dist/server/page-converter.mjs +384 -54
  155. package/dist/server/prebuild.mjs +1 -1
  156. package/dist/server/rendering/server.mjs +1712 -973
  157. package/dist/server/rendering.mjs +1748 -1001
  158. package/dist/server/routing.mjs +624 -131
  159. package/dist/server/server.mjs +554 -138
  160. package/dist/server/theme-bridge.mjs +1192 -27
  161. package/dist/server/theme.mjs +6 -4
  162. package/package.json +2 -1
@@ -4809,12 +4809,23 @@ function defineExactCatalog() {
4809
4809
  function asDesignBlockId(value) {
4810
4810
  return brandNonEmptyString(value, "DesignBlockId");
4811
4811
  }
4812
+ function asDesignBoundaryId(value) {
4813
+ const boundaryId = brandNonEmptyString(value, "DesignBoundaryId");
4814
+ if (!boundaryId.startsWith("boundary:")) throw new Error(`DesignBoundaryId must start with "boundary:". Received: ${value}`);
4815
+ return boundaryId;
4816
+ }
4817
+ function asLayoutVariantKey(value) {
4818
+ return brandNonEmptyString(value, "LayoutVariantKey");
4819
+ }
4812
4820
  function asAppearancePresetId(value) {
4813
4821
  return brandNonEmptyString(value, "AppearancePresetId");
4814
4822
  }
4815
4823
  function asBoundaryOptionId(value) {
4816
4824
  return brandNonEmptyString(value, "BoundaryOptionId");
4817
4825
  }
4826
+ function asPageFlowPresetId(value) {
4827
+ return brandNonEmptyString(value, "PageFlowPresetId");
4828
+ }
4818
4829
  function asSiteStyleId(value) {
4819
4830
  const siteStyleId = brandNonEmptyString(value, "SiteStyleId");
4820
4831
  if (!siteStyleId.startsWith("site-style:")) throw new Error(`SiteStyleId must start with "site-style:". Received: ${value}`);
@@ -4823,6 +4834,18 @@ function asSiteStyleId(value) {
4823
4834
  function asDesignSystemTemplateId(value) {
4824
4835
  return brandNonEmptyString(value, "DesignSystemTemplateId");
4825
4836
  }
4837
+ function toNonEmptyReadonlyArray(values) {
4838
+ const [first, ...rest] = values;
4839
+ return first === void 0 ? null : [first, ...rest];
4840
+ }
4841
+ function requireNonEmptyReadonlyArray(values, message = "Expected a non-empty array.") {
4842
+ const result = toNonEmptyReadonlyArray(values);
4843
+ if (!result) throw new Error(message);
4844
+ return result;
4845
+ }
4846
+ function makeBoundaryId(previousBlockId, nextBlockId) {
4847
+ return asDesignBoundaryId(`boundary:${encodeURIComponent(previousBlockId)}:${encodeURIComponent(nextBlockId)}`);
4848
+ }
4826
4849
  function brandNonEmptyString(value, label) {
4827
4850
  if (value.length === 0) throw new Error(`${label} must be a non-empty string.`);
4828
4851
  return value;
@@ -4987,16 +5010,18 @@ const themeV2RuntimeStyleFieldNames = [
4987
5010
  "_frameStyles",
4988
5011
  "_sectionStyles",
4989
5012
  "_containerStyles",
4990
- "_cardStyles",
4991
- "_transitionStyles",
4992
- "styleGroup"
5013
+ "_cardStyles"
4993
5014
  ];
4994
5015
  const themeV2BlockSpecificRawStyleFieldNames = [
4995
5016
  "_contentCardStyles",
4996
5017
  "_heroLayoutStyles",
4997
5018
  "_textCardStyles"
4998
5019
  ];
4999
- const themeV2NormalEditorRawStyleFieldNames = [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
5020
+ const themeV2NormalEditorRawStyleFieldNames = [
5021
+ ...themeV2RuntimeStyleFieldNames,
5022
+ ...themeV2BlockSpecificRawStyleFieldNames,
5023
+ "styleGroup"
5024
+ ];
5000
5025
  new Set(themeV2NormalEditorRawStyleFieldNames);
5001
5026
  [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
5002
5027
  const pageDesignEditorBackgroundOverrideOwner = "page-design-editor";
@@ -8941,6 +8966,261 @@ z.object({
8941
8966
  authority: styleAuthoritySchema
8942
8967
  }).strict();
8943
8968
  //#endregion
8969
+ //#region ../theme-core/src/site-styles/transitionCatalogue.ts
8970
+ /**
8971
+ * Family order for pickers. Entries below are listed family by family in this
8972
+ * same order, so the flat option list and the grouped families agree.
8973
+ */
8974
+ const transitionCatalogueFamilies = [
8975
+ {
8976
+ id: "gradient",
8977
+ label: "Gradient"
8978
+ },
8979
+ {
8980
+ id: "wave",
8981
+ label: "Wave"
8982
+ },
8983
+ {
8984
+ id: "angle",
8985
+ label: "Angle"
8986
+ }
8987
+ ];
8988
+ const mediumHeight = "6rem + 2px";
8989
+ const compactHeight = "4.5rem + 2px";
8990
+ const largeHeight = "7rem + 2px";
8991
+ /**
8992
+ * The single source of transition vocabulary. Order is significant: it is the
8993
+ * order of `boundaryOptions` (after `none`) and of each family's variants,
8994
+ * which persisted pins, page-flow presets and the editor picker all rely on.
8995
+ *
8996
+ * Shapes match what `generateLayoutCss` draws today. Structured
8997
+ * amplitude/frequency treatments (issue 826) extend this list later.
8998
+ */
8999
+ const transitionCatalogueEntries = defineExactCatalog()([
9000
+ {
9001
+ intent: "soft-fade-short",
9002
+ optionId: asBoundaryOptionId("break:soft"),
9003
+ family: "gradient",
9004
+ variantId: "soft",
9005
+ label: "Soft",
9006
+ variantLabel: "Soft",
9007
+ treatment: {
9008
+ kind: "soft-fade",
9009
+ height: "medium",
9010
+ curve: "soft"
9011
+ },
9012
+ size: "medium",
9013
+ heightExpression: mediumHeight,
9014
+ shape: { kind: "fade" }
9015
+ },
9016
+ {
9017
+ intent: "soft-fade-long",
9018
+ optionId: asBoundaryOptionId("break:spacious"),
9019
+ family: "gradient",
9020
+ variantId: "spacious",
9021
+ label: "Spacious",
9022
+ variantLabel: "Spacious",
9023
+ treatment: {
9024
+ kind: "soft-fade",
9025
+ height: "large",
9026
+ curve: "spacious"
9027
+ },
9028
+ size: "spacious",
9029
+ heightExpression: "10rem",
9030
+ shape: { kind: "fade" }
9031
+ },
9032
+ {
9033
+ intent: "soft-fade-expansive",
9034
+ optionId: asBoundaryOptionId("break:expansive"),
9035
+ family: "gradient",
9036
+ variantId: "expansive",
9037
+ label: "Expansive",
9038
+ variantLabel: "Expansive",
9039
+ treatment: {
9040
+ kind: "soft-fade",
9041
+ height: "expansive",
9042
+ curve: "expansive"
9043
+ },
9044
+ size: "expansive",
9045
+ heightExpression: "14rem",
9046
+ shape: { kind: "fade" }
9047
+ },
9048
+ {
9049
+ intent: "wave-edge-balanced",
9050
+ optionId: asBoundaryOptionId("break:wave-balanced"),
9051
+ family: "wave",
9052
+ variantId: "balanced",
9053
+ label: "Balanced wave",
9054
+ variantLabel: "Balanced",
9055
+ treatment: {
9056
+ kind: "wave-edge",
9057
+ height: "medium",
9058
+ amplitude: "balanced",
9059
+ rhythm: "double",
9060
+ symmetry: "symmetrical"
9061
+ },
9062
+ size: "medium",
9063
+ heightExpression: mediumHeight,
9064
+ shape: {
9065
+ kind: "wave",
9066
+ mask: "balanced"
9067
+ }
9068
+ },
9069
+ {
9070
+ intent: "wave-edge",
9071
+ optionId: asBoundaryOptionId("break:wave"),
9072
+ family: "wave",
9073
+ variantId: "classic",
9074
+ label: "Classic wave",
9075
+ variantLabel: "Classic",
9076
+ treatment: {
9077
+ kind: "wave-edge",
9078
+ height: "medium",
9079
+ amplitude: "balanced",
9080
+ rhythm: "double",
9081
+ symmetry: "asymmetrical"
9082
+ },
9083
+ size: "medium",
9084
+ heightExpression: mediumHeight,
9085
+ shape: {
9086
+ kind: "wave",
9087
+ mask: "classic"
9088
+ }
9089
+ },
9090
+ {
9091
+ intent: "wave-edge-gentle",
9092
+ optionId: asBoundaryOptionId("break:wave-gentle"),
9093
+ family: "wave",
9094
+ variantId: "gentle",
9095
+ label: "Gentle wave",
9096
+ variantLabel: "Gentle",
9097
+ treatment: {
9098
+ kind: "wave-edge",
9099
+ height: "compact",
9100
+ amplitude: "subtle",
9101
+ rhythm: "single",
9102
+ symmetry: "symmetrical"
9103
+ },
9104
+ size: "compact",
9105
+ heightExpression: compactHeight,
9106
+ shape: {
9107
+ kind: "wave",
9108
+ mask: "gentle"
9109
+ }
9110
+ },
9111
+ {
9112
+ intent: "wave-edge-bold",
9113
+ optionId: asBoundaryOptionId("break:wave-bold"),
9114
+ family: "wave",
9115
+ variantId: "bold",
9116
+ label: "Bold wave",
9117
+ variantLabel: "Bold",
9118
+ treatment: {
9119
+ kind: "wave-edge",
9120
+ height: "large",
9121
+ amplitude: "bold",
9122
+ rhythm: "double",
9123
+ symmetry: "symmetrical"
9124
+ },
9125
+ size: "large",
9126
+ heightExpression: largeHeight,
9127
+ shape: {
9128
+ kind: "wave",
9129
+ mask: "bold"
9130
+ }
9131
+ },
9132
+ {
9133
+ intent: "wave-edge-drift",
9134
+ optionId: asBoundaryOptionId("break:wave-drift"),
9135
+ family: "wave",
9136
+ variantId: "drift",
9137
+ label: "Drift wave",
9138
+ variantLabel: "Drift",
9139
+ treatment: {
9140
+ kind: "wave-edge",
9141
+ height: "medium",
9142
+ amplitude: "balanced",
9143
+ rhythm: "double",
9144
+ symmetry: "drift"
9145
+ },
9146
+ size: "medium",
9147
+ heightExpression: mediumHeight,
9148
+ shape: {
9149
+ kind: "wave",
9150
+ mask: "drift"
9151
+ }
9152
+ },
9153
+ {
9154
+ intent: "angle-edge-subtle",
9155
+ optionId: asBoundaryOptionId("break:angle-subtle"),
9156
+ family: "angle",
9157
+ variantId: "subtle",
9158
+ label: "Subtle angle",
9159
+ variantLabel: "Subtle",
9160
+ treatment: {
9161
+ kind: "angle-edge",
9162
+ height: "compact",
9163
+ slope: "subtle",
9164
+ direction: "forward"
9165
+ },
9166
+ size: "compact",
9167
+ heightExpression: compactHeight,
9168
+ shape: {
9169
+ kind: "angle",
9170
+ polygon: {
9171
+ startTopPercent: 34,
9172
+ endTopPercent: 18
9173
+ }
9174
+ }
9175
+ },
9176
+ {
9177
+ intent: "angle-edge",
9178
+ optionId: asBoundaryOptionId("break:angle-balanced"),
9179
+ family: "angle",
9180
+ variantId: "balanced",
9181
+ label: "Balanced angle",
9182
+ variantLabel: "Balanced",
9183
+ treatment: {
9184
+ kind: "angle-edge",
9185
+ height: "medium",
9186
+ slope: "balanced",
9187
+ direction: "forward"
9188
+ },
9189
+ size: "medium",
9190
+ heightExpression: mediumHeight,
9191
+ shape: {
9192
+ kind: "angle",
9193
+ polygon: {
9194
+ startTopPercent: 42,
9195
+ endTopPercent: 8
9196
+ }
9197
+ }
9198
+ },
9199
+ {
9200
+ intent: "angle-edge-steep",
9201
+ optionId: asBoundaryOptionId("break:angle-steep"),
9202
+ family: "angle",
9203
+ variantId: "steep",
9204
+ label: "Steep angle",
9205
+ variantLabel: "Steep",
9206
+ treatment: {
9207
+ kind: "angle-edge",
9208
+ height: "large",
9209
+ slope: "steep",
9210
+ direction: "forward"
9211
+ },
9212
+ size: "large",
9213
+ heightExpression: largeHeight,
9214
+ shape: {
9215
+ kind: "angle",
9216
+ polygon: {
9217
+ startTopPercent: 54,
9218
+ endTopPercent: 0
9219
+ }
9220
+ }
9221
+ }
9222
+ ]);
9223
+ //#endregion
8944
9224
  //#region ../theme-core/src/site-styles/sectionTransitions.ts
8945
9225
  function boundaryRuntimeMetrics(family, size, heightExpression) {
8946
9226
  return {
@@ -8950,19 +9230,913 @@ function boundaryRuntimeMetrics(family, size, heightExpression) {
8950
9230
  reserveCss: `calc((${heightExpression}) / 2)`
8951
9231
  };
8952
9232
  }
8953
- boundaryRuntimeMetrics("gradient", "medium", "6rem + 2px"), boundaryRuntimeMetrics("gradient", "spacious", "10rem"), boundaryRuntimeMetrics("gradient", "expansive", "14rem"), boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"), boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"), boundaryRuntimeMetrics("wave", "compact", "4.5rem + 2px"), boundaryRuntimeMetrics("wave", "large", "7rem + 2px"), boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"), boundaryRuntimeMetrics("angle", "medium", "6rem + 2px"), boundaryRuntimeMetrics("angle", "compact", "4.5rem + 2px"), boundaryRuntimeMetrics("angle", "large", "7rem + 2px");
8954
- asBoundaryOptionId("break:none");
8955
- asBoundaryOptionId("break:soft");
8956
- asBoundaryOptionId("break:spacious");
8957
- asBoundaryOptionId("break:expansive");
9233
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, entry]));
9234
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, boundaryRuntimeMetrics(entry.family, entry.size, entry.heightExpression)]));
9235
+ /**
9236
+ * The catalogue's compile-time coverage check guarantees an entry per
9237
+ * decorative intent, so a miss here is a broken invariant, not bad input.
9238
+ */
9239
+ function requireCatalogueValue(values, intent) {
9240
+ const value = values.get(intent);
9241
+ if (value === void 0) throw new Error(`Transition catalogue has no entry for ${intent}`);
9242
+ return value;
9243
+ }
9244
+ const noneBoundaryOption = {
9245
+ id: asBoundaryOptionId("break:none"),
9246
+ label: "None",
9247
+ transitionAfter: "none",
9248
+ treatment: { kind: "none" }
9249
+ };
9250
+ const boundaryOptionByIntent = new Map(transitionCatalogueEntries.map((entry) => [entry.intent, {
9251
+ id: entry.optionId,
9252
+ label: entry.label,
9253
+ transitionAfter: entry.intent,
9254
+ treatment: entry.treatment
9255
+ }]));
9256
+ function boundaryOptionForTransitionIntent(intent) {
9257
+ return requireCatalogueValue(boundaryOptionByIntent, intent);
9258
+ }
9259
+ const softBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-short");
9260
+ const spaciousBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-long");
9261
+ boundaryOptionForTransitionIntent("soft-fade-expansive");
9262
+ boundaryOptionForTransitionIntent("wave-edge");
9263
+ boundaryOptionForTransitionIntent("wave-edge-balanced");
9264
+ boundaryOptionForTransitionIntent("wave-edge-gentle");
9265
+ boundaryOptionForTransitionIntent("wave-edge-bold");
9266
+ boundaryOptionForTransitionIntent("wave-edge-drift");
9267
+ boundaryOptionForTransitionIntent("angle-edge-subtle");
9268
+ boundaryOptionForTransitionIntent("angle-edge");
9269
+ boundaryOptionForTransitionIntent("angle-edge-steep");
9270
+ /**
9271
+ * Must remain non-empty; downstream code indexes `[0]` as the documented default.
9272
+ */
9273
+ const boundaryOptions = [noneBoundaryOption, ...transitionCatalogueEntries.map((entry) => boundaryOptionForTransitionIntent(entry.intent))];
9274
+ const noneTransitionVariant = {
9275
+ familyId: "none",
9276
+ variantId: "none",
9277
+ label: "None",
9278
+ boundaryOption: noneBoundaryOption
9279
+ };
9280
+ function transitionVariantForEntry(entry) {
9281
+ return {
9282
+ familyId: entry.family,
9283
+ variantId: entry.variantId,
9284
+ label: entry.variantLabel,
9285
+ boundaryOption: boundaryOptionForTransitionIntent(entry.intent)
9286
+ };
9287
+ }
9288
+ const sectionTransitionFamilies = [{
9289
+ id: "none",
9290
+ label: "None",
9291
+ variants: [noneTransitionVariant]
9292
+ }, ...transitionCatalogueFamilies.map((family) => ({
9293
+ id: family.id,
9294
+ label: family.label,
9295
+ variants: requireNonEmptyReadonlyArray(transitionCatalogueEntries.filter((entry) => entry.family === family.id).map(transitionVariantForEntry), `Transition family ${family.id} has no catalogue entries.`)
9296
+ }))];
9297
+ new Map(boundaryOptions.map((option) => [option.id, option]));
9298
+ new Map(boundaryOptions.map((option) => [stableTreatmentKey(option.treatment), option]));
9299
+ new Map(sectionTransitionFamilies.flatMap((family) => family.variants.map((variant) => [variant.boundaryOption.id, variant])));
9300
+ new Map(sectionTransitionFamilies.map((family) => [family.id, family]));
9301
+ function stableTreatmentKey(treatment) {
9302
+ switch (treatment.kind) {
9303
+ case "none": return "none";
9304
+ case "soft-fade": return `${treatment.kind}:${treatment.height}:${treatment.curve}`;
9305
+ case "wave-edge": return [
9306
+ treatment.kind,
9307
+ treatment.height,
9308
+ treatment.amplitude,
9309
+ treatment.rhythm,
9310
+ treatment.symmetry
9311
+ ].join(":");
9312
+ case "angle-edge": return [
9313
+ treatment.kind,
9314
+ treatment.height,
9315
+ treatment.slope,
9316
+ treatment.direction
9317
+ ].join(":");
9318
+ case "legacy-unsupported": return `${treatment.kind}:${treatment.boundaryOptionId}`;
9319
+ }
9320
+ }
9321
+ asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
9322
+ asBoundaryOptionId("break:unknown");
9323
+ const pageDesignUserPinnedAppearanceChoiceSchema = z.object({
9324
+ kind: z.literal("user-pinned"),
9325
+ value: z.string().min(1).transform(asAppearancePresetId)
9326
+ }).strict();
9327
+ const pageDesignUserPinnedBoundaryChoiceSchema = z.object({
9328
+ kind: z.literal("user-pinned"),
9329
+ value: z.string().min(1).transform(asBoundaryOptionId)
9330
+ }).strict();
9331
+ const pageDesignBoundaryTreatmentSchema = z.discriminatedUnion("kind", [
9332
+ z.object({ kind: z.literal("none") }).strict(),
9333
+ z.object({
9334
+ kind: z.literal("soft-fade"),
9335
+ height: z.enum([
9336
+ "compact",
9337
+ "medium",
9338
+ "large",
9339
+ "expansive"
9340
+ ]),
9341
+ curve: z.enum([
9342
+ "soft",
9343
+ "spacious",
9344
+ "expansive"
9345
+ ])
9346
+ }).strict(),
9347
+ z.object({
9348
+ kind: z.literal("wave-edge"),
9349
+ height: z.enum([
9350
+ "compact",
9351
+ "medium",
9352
+ "large"
9353
+ ]),
9354
+ amplitude: z.enum([
9355
+ "subtle",
9356
+ "balanced",
9357
+ "bold"
9358
+ ]),
9359
+ rhythm: z.enum(["single", "double"]),
9360
+ symmetry: z.enum([
9361
+ "symmetrical",
9362
+ "asymmetrical",
9363
+ "drift"
9364
+ ])
9365
+ }).strict(),
9366
+ z.object({
9367
+ kind: z.literal("angle-edge"),
9368
+ height: z.enum([
9369
+ "compact",
9370
+ "medium",
9371
+ "large"
9372
+ ]),
9373
+ slope: z.enum([
9374
+ "subtle",
9375
+ "balanced",
9376
+ "steep"
9377
+ ]),
9378
+ direction: z.enum(["forward", "reverse"])
9379
+ }).strict(),
9380
+ z.object({
9381
+ kind: z.literal("legacy-unsupported"),
9382
+ boundaryOptionId: z.string().min(1).transform(asBoundaryOptionId)
9383
+ }).strict()
9384
+ ]);
9385
+ const pageDesignUserPinnedBoundaryTreatmentChoiceSchema = z.object({
9386
+ kind: z.literal("user-pinned"),
9387
+ value: pageDesignBoundaryTreatmentSchema
9388
+ }).strict();
9389
+ const pageDesignBlockLookPinSchema = z.object({
9390
+ blockId: z.string().min(1).transform(asDesignBlockId),
9391
+ blockKind: z.string().min(1),
9392
+ choice: pageDesignUserPinnedAppearanceChoiceSchema
9393
+ }).strict();
9394
+ const pageDesignBoundaryPinSchema = z.object({
9395
+ boundaryId: z.string().min(1).transform(asDesignBoundaryId),
9396
+ previousBlockId: z.string().min(1).transform(asDesignBlockId),
9397
+ nextBlockId: z.string().min(1).transform(asDesignBlockId),
9398
+ choice: pageDesignUserPinnedBoundaryTreatmentChoiceSchema
9399
+ }).strict().superRefine(validateBoundaryPinIdMatchesBlocks);
9400
+ const legacyPageDesignBoundaryPinSchema = z.object({
9401
+ boundaryId: z.string().min(1).transform(asDesignBoundaryId),
9402
+ previousBlockId: z.string().min(1).transform(asDesignBlockId),
9403
+ nextBlockId: z.string().min(1).transform(asDesignBlockId),
9404
+ choice: pageDesignUserPinnedBoundaryChoiceSchema
9405
+ }).strict().superRefine(validateBoundaryPinIdMatchesBlocks);
9406
+ z.object({
9407
+ schemaVersion: z.literal(1),
9408
+ siteStyleId: z.string().min(1).transform(asSiteStyleId),
9409
+ pageFlowPresetId: z.string().min(1).transform(asPageFlowPresetId),
9410
+ blockLookPins: z.array(pageDesignBlockLookPinSchema),
9411
+ boundaryPins: z.array(legacyPageDesignBoundaryPinSchema)
9412
+ }).strict().superRefine(validateUniquePageDesignPins);
9413
+ z.object({
9414
+ schemaVersion: z.literal(2),
9415
+ siteStyleId: z.string().min(1).transform(asSiteStyleId),
9416
+ pageFlowPresetId: z.string().min(1).transform(asPageFlowPresetId),
9417
+ blockLookPins: z.array(pageDesignBlockLookPinSchema),
9418
+ boundaryPins: z.array(pageDesignBoundaryPinSchema)
9419
+ }).strict().superRefine(validateUniquePageDesignPins);
9420
+ function addDuplicateStringIssues(ctx, input) {
9421
+ const seen = /* @__PURE__ */ new Set();
9422
+ const duplicates = /* @__PURE__ */ new Set();
9423
+ for (const value of input.values) {
9424
+ if (seen.has(value)) duplicates.add(value);
9425
+ seen.add(value);
9426
+ }
9427
+ for (const duplicate of duplicates) ctx.addIssue({
9428
+ code: z.ZodIssueCode.custom,
9429
+ path: [...input.path],
9430
+ message: `Duplicate ${input.label}: ${duplicate}.`
9431
+ });
9432
+ }
9433
+ function validateBoundaryPinIdMatchesBlocks(pin, ctx) {
9434
+ const expectedBoundaryId = makeBoundaryId(pin.previousBlockId, pin.nextBlockId);
9435
+ if (pin.boundaryId !== expectedBoundaryId) ctx.addIssue({
9436
+ code: z.ZodIssueCode.custom,
9437
+ path: ["boundaryId"],
9438
+ message: `Boundary id must match previousBlockId and nextBlockId. Expected ${expectedBoundaryId}.`
9439
+ });
9440
+ }
9441
+ function validateUniquePageDesignPins(intent, ctx) {
9442
+ addDuplicateStringIssues(ctx, {
9443
+ values: intent.blockLookPins.map((pin) => pin.blockId),
9444
+ path: ["blockLookPins"],
9445
+ label: "block Look pin"
9446
+ });
9447
+ addDuplicateStringIssues(ctx, {
9448
+ values: intent.boundaryPins.map((pin) => makeBoundaryId(pin.previousBlockId, pin.nextBlockId)),
9449
+ path: ["boundaryPins"],
9450
+ label: "boundary pin"
9451
+ });
9452
+ }
9453
+ //#endregion
9454
+ //#region ../theme-core/src/site-styles/appearancePresetResolution.ts
9455
+ function assertValidOptionGroups(preset) {
9456
+ preset.optionGroups?.forEach((group) => {
9457
+ defineLookOptionGroup(group);
9458
+ });
9459
+ }
9460
+ /**
9461
+ * Every Look carries a card role. A Look that says nothing about cards renders
9462
+ * none, which is the overwhelming majority of them; the card-bearing ones name
9463
+ * the role they want and the site style owns how it looks.
9464
+ */
9465
+ function defineBlockAppearancePreset(preset) {
9466
+ assertValidOptionGroups(preset);
9467
+ return {
9468
+ ...preset,
9469
+ design: {
9470
+ ...preset.design,
9471
+ cardRole: preset.design.cardRole ?? "none"
9472
+ }
9473
+ };
9474
+ }
9475
+ //#endregion
9476
+ //#region ../theme-core/src/site-styles/blockAppearancePresets.ts
9477
+ /**
9478
+ * A Look is a composition: which section surface, which content frame, and —
9479
+ * where it wants one — which *card role* it asks the site style for. It never
9480
+ * states how a card looks; that is the site style's identity.
9481
+ *
9482
+ * A Look with no `cardRole` asks the site style for no card at all
9483
+ * (`defineBlockAppearancePreset` defaults it to `none`) — the block's own
9484
+ * composition still governs how its items look. The per-Look rationale for the card-bearing ones lives
9485
+ * in `.project/plans/1297-card-role-contract-site-styles-own-card-surfaces/mapping-table.md`.
9486
+ */
9487
+ const brandScrimOptionGroups = [{
9488
+ id: "image-surface-treatment",
9489
+ label: "Treatment",
9490
+ defaultOptionId: "brand-scrim-primary",
9491
+ options: [{
9492
+ id: "brand-scrim-primary",
9493
+ label: "Brand scrim",
9494
+ designPatch: { imageSurfaceTreatment: {
9495
+ kind: "brand-scrim",
9496
+ token: "primary"
9497
+ } }
9498
+ }, {
9499
+ id: "neutral-scrim",
9500
+ label: "Neutral scrim",
9501
+ designPatch: { imageSurfaceTreatment: { kind: "neutral-scrim" } }
9502
+ }]
9503
+ }];
9504
+ const microBannerLayoutPatches = [{
9505
+ constraints: { layoutVariantKeys: ["micro"] },
9506
+ designPatch: { sectionHeight: "banner" }
9507
+ }];
9508
+ defineBlockAppearancePreset({
9509
+ id: "hero-immersive-image",
9510
+ target: "hero",
9511
+ label: "Immersive image hero",
9512
+ blockKinds: ["block.hero"],
9513
+ constraints: { layoutFamilies: ["centered", "compact"] },
9514
+ layoutPatches: [{
9515
+ constraints: { layoutVariantKeys: ["micro"] },
9516
+ designPatch: {
9517
+ sectionHeight: "banner",
9518
+ heroTypographyScale: "display"
9519
+ }
9520
+ }],
9521
+ design: {
9522
+ sectionSurface: "hero-image",
9523
+ contentFrame: plainFrame,
9524
+ sectionHeight: "hero",
9525
+ heroComposition: "center",
9526
+ heroTypographyScale: "display",
9527
+ imageSurfaceTreatment: { kind: "neutral-wash" }
9528
+ }
9529
+ }), defineBlockAppearancePreset({
9530
+ id: "hero-bottom-left-panel",
9531
+ target: "hero",
9532
+ label: "Bottom-left panel hero",
9533
+ blockKinds: ["block.hero"],
9534
+ constraints: { layoutFamilies: ["centered", "compact"] },
9535
+ optionGroups: [{
9536
+ id: "image-surface-treatment",
9537
+ label: "Treatment",
9538
+ defaultOptionId: "neutral-scrim",
9539
+ options: [{
9540
+ id: "neutral-scrim",
9541
+ label: "Neutral scrim",
9542
+ designPatch: { imageSurfaceTreatment: {
9543
+ kind: "neutral-scrim",
9544
+ intensity: "balanced"
9545
+ } }
9546
+ }, {
9547
+ id: "brand-scrim-primary",
9548
+ label: "Brand scrim",
9549
+ designPatch: { imageSurfaceTreatment: {
9550
+ kind: "brand-scrim",
9551
+ token: "primary",
9552
+ intensity: "balanced"
9553
+ } }
9554
+ }]
9555
+ }],
9556
+ layoutPatches: [{
9557
+ constraints: { layoutVariantKeys: ["micro"] },
9558
+ designPatch: {
9559
+ sectionHeight: "banner",
9560
+ heroTypographyScale: "editorial"
9561
+ }
9562
+ }],
9563
+ design: {
9564
+ sectionSurface: "hero-image",
9565
+ contentFrame: panelFrame("raised"),
9566
+ sectionHeight: "immersive",
9567
+ heroComposition: "bottom-left",
9568
+ heroTypographyScale: "display",
9569
+ imageSurfaceTreatment: {
9570
+ kind: "neutral-scrim",
9571
+ intensity: "balanced"
9572
+ }
9573
+ }
9574
+ }), defineBlockAppearancePreset({
9575
+ id: "hero-poster-image",
9576
+ target: "hero",
9577
+ label: "Poster image hero",
9578
+ blockKinds: ["block.hero"],
9579
+ constraints: { layoutFamilies: ["centered", "compact"] },
9580
+ layoutPatches: [{
9581
+ constraints: { layoutVariantKeys: ["micro"] },
9582
+ designPatch: {
9583
+ sectionHeight: "banner",
9584
+ heroTypographyScale: "display"
9585
+ }
9586
+ }],
9587
+ design: {
9588
+ sectionSurface: "hero-image",
9589
+ contentFrame: plainFrame,
9590
+ sectionHeight: "immersive",
9591
+ heroComposition: "center",
9592
+ heroTypographyScale: "poster",
9593
+ imageSurfaceTreatment: {
9594
+ kind: "brand-scrim",
9595
+ token: "primary",
9596
+ intensity: "strong"
9597
+ }
9598
+ }
9599
+ }), defineBlockAppearancePreset({
9600
+ id: "hero-brand-scrim",
9601
+ target: "hero",
9602
+ label: "Brand scrim image hero",
9603
+ blockKinds: ["block.hero"],
9604
+ constraints: { layoutFamilies: ["centered", "compact"] },
9605
+ optionGroups: brandScrimOptionGroups,
9606
+ layoutPatches: microBannerLayoutPatches,
9607
+ design: {
9608
+ sectionSurface: "hero-image",
9609
+ contentFrame: plainFrame,
9610
+ sectionHeight: "immersive",
9611
+ heroComposition: "center",
9612
+ heroTypographyScale: "display",
9613
+ imageSurfaceTreatment: {
9614
+ kind: "brand-scrim",
9615
+ token: "primary"
9616
+ }
9617
+ }
9618
+ }), defineBlockAppearancePreset({
9619
+ id: "hero-brand-scrim-fixed-frame",
9620
+ target: "hero",
9621
+ label: "Fixed-frame brand scrim hero",
9622
+ blockKinds: ["block.hero"],
9623
+ constraints: { layoutFamilies: ["centered", "compact"] },
9624
+ optionGroups: brandScrimOptionGroups,
9625
+ layoutPatches: microBannerLayoutPatches,
9626
+ design: {
9627
+ sectionSurface: "hero-image",
9628
+ contentFrame: plainFrame,
9629
+ sectionHeight: "immersive",
9630
+ heroComposition: "center",
9631
+ heroTypographyScale: "display",
9632
+ imageSurfaceTreatment: {
9633
+ kind: "brand-scrim",
9634
+ token: "primary"
9635
+ },
9636
+ imageSurfaceMotion: "fixed-frame",
9637
+ eyebrowTreatment: "accent-pill-bounce"
9638
+ }
9639
+ }), defineBlockAppearancePreset({
9640
+ id: "hero-brand-depth-expressive",
9641
+ target: "hero",
9642
+ label: "Expressive brand-depth hero",
9643
+ blockKinds: ["block.hero"],
9644
+ constraints: { layoutFamilies: ["centered", "compact"] },
9645
+ design: {
9646
+ sectionSurface: "brand-depth-band",
9647
+ contentFrame: plainFrame,
9648
+ heroComposition: "center",
9649
+ heroTypographyScale: "editorial",
9650
+ eyebrowTreatment: "accent-pill-bounce"
9651
+ }
9652
+ }), defineBlockAppearancePreset({
9653
+ id: "hero-contained-intro",
9654
+ target: "hero",
9655
+ label: "Contained intro hero",
9656
+ blockKinds: ["block.hero"],
9657
+ design: {
9658
+ sectionSurface: "muted-band",
9659
+ contentFrame: panelFrame("inset"),
9660
+ heroComposition: "center",
9661
+ heroTypographyScale: "editorial"
9662
+ }
9663
+ }), defineBlockAppearancePreset({
9664
+ id: "hero-split-editorial",
9665
+ target: "hero",
9666
+ label: "Editorial split hero",
9667
+ blockKinds: ["block.hero"],
9668
+ constraints: { layoutFamilies: ["split"] },
9669
+ design: {
9670
+ sectionSurface: "base",
9671
+ contentFrame: plainFrame,
9672
+ heroTypographyScale: "editorial"
9673
+ }
9674
+ }), defineBlockAppearancePreset({
9675
+ id: "hero-split-brand",
9676
+ target: "hero",
9677
+ label: "Brand split hero",
9678
+ blockKinds: ["block.hero"],
9679
+ constraints: { layoutFamilies: ["split"] },
9680
+ design: {
9681
+ sectionSurface: "brand-depth-band",
9682
+ contentFrame: plainFrame,
9683
+ heroTypographyScale: "display",
9684
+ eyebrowTreatment: "accent-pill-bounce"
9685
+ }
9686
+ }), defineBlockAppearancePreset({
9687
+ id: "hero-split-soft-panel",
9688
+ target: "hero",
9689
+ label: "Soft panel split hero",
9690
+ blockKinds: ["block.hero"],
9691
+ constraints: { layoutFamilies: ["split"] },
9692
+ design: {
9693
+ sectionSurface: "muted-band",
9694
+ contentFrame: panelFrame("raised"),
9695
+ heroTypographyScale: "editorial"
9696
+ }
9697
+ }), defineBlockAppearancePreset({
9698
+ id: "hero-split-accent",
9699
+ target: "hero",
9700
+ label: "Accent split hero",
9701
+ blockKinds: ["block.hero"],
9702
+ constraints: { layoutFamilies: ["split"] },
9703
+ design: {
9704
+ sectionSurface: "accent-band",
9705
+ contentFrame: panelFrame("raised"),
9706
+ heroTypographyScale: "display"
9707
+ }
9708
+ }), defineBlockAppearancePreset({
9709
+ id: "intro-editorial-statement",
9710
+ target: "intro",
9711
+ label: "Editorial intro statement",
9712
+ blockKinds: ["block.intro"],
9713
+ constraints: { layoutVariantKeys: ["centered-copy", "statement-copy"] },
9714
+ design: {
9715
+ sectionSurface: "base",
9716
+ contentFrame: plainFrame,
9717
+ composition: {
9718
+ kind: "intro",
9719
+ treatment: "editorial-statement"
9720
+ }
9721
+ }
9722
+ }), defineBlockAppearancePreset({
9723
+ id: "intro-portrait-bio",
9724
+ target: "intro",
9725
+ label: "Portrait and bio",
9726
+ blockKinds: ["block.intro"],
9727
+ constraints: { layoutVariantKeys: ["media-copy"] },
9728
+ design: {
9729
+ sectionSurface: "base",
9730
+ contentFrame: plainFrame,
9731
+ composition: {
9732
+ kind: "intro",
9733
+ treatment: "portrait-bio"
9734
+ }
9735
+ }
9736
+ }), defineBlockAppearancePreset({
9737
+ id: "offerings-preview-default-cards",
9738
+ target: "offerings",
9739
+ label: "Default offering cards",
9740
+ blockKinds: ["block.offerings-preview"],
9741
+ design: {
9742
+ sectionSurface: "base",
9743
+ contentFrame: plainFrame,
9744
+ cardRole: "default"
9745
+ }
9746
+ }), defineBlockAppearancePreset({
9747
+ id: "offerings-preview-secondary-cards",
9748
+ target: "offerings",
9749
+ label: "Secondary offering cards",
9750
+ blockKinds: ["block.offerings-preview"],
9751
+ design: {
9752
+ sectionSurface: "muted-band",
9753
+ contentFrame: plainFrame,
9754
+ cardRole: "alternative"
9755
+ }
9756
+ }), defineBlockAppearancePreset({
9757
+ id: "offerings-preview-non-carded",
9758
+ target: "offerings",
9759
+ label: "Non-carded offerings",
9760
+ blockKinds: ["block.offerings-preview"],
9761
+ design: {
9762
+ sectionSurface: "muted-band",
9763
+ contentFrame: plainFrame,
9764
+ cardRole: "open"
9765
+ }
9766
+ }), defineBlockAppearancePreset({
9767
+ id: "offerings-preview-paired-feature-cards",
9768
+ target: "offerings",
9769
+ label: "Paired feature cards",
9770
+ blockKinds: ["block.offerings-preview"],
9771
+ constraints: { layoutVariantKeys: ["cards"] },
9772
+ design: {
9773
+ sectionSurface: "base",
9774
+ contentFrame: plainFrame,
9775
+ cardRole: "alternative",
9776
+ composition: {
9777
+ kind: "offerings-preview",
9778
+ treatment: "paired-feature-cards"
9779
+ }
9780
+ }
9781
+ }), defineBlockAppearancePreset({
9782
+ id: "offerings-preview-open-editorial-columns",
9783
+ target: "offerings",
9784
+ label: "Open editorial columns",
9785
+ blockKinds: ["block.offerings-preview"],
9786
+ constraints: { layoutVariantKeys: ["cards"] },
9787
+ design: {
9788
+ sectionSurface: "base",
9789
+ contentFrame: plainFrame,
9790
+ cardRole: "open",
9791
+ composition: {
9792
+ kind: "offerings-preview",
9793
+ treatment: "open-editorial-columns"
9794
+ }
9795
+ }
9796
+ }), defineBlockAppearancePreset({
9797
+ id: "offerings-preview-joined-programme-panel",
9798
+ target: "offerings",
9799
+ label: "Joined programme panel",
9800
+ blockKinds: ["block.offerings-preview"],
9801
+ constraints: { layoutVariantKeys: ["cards"] },
9802
+ design: {
9803
+ sectionSurface: "base",
9804
+ contentFrame: plainFrame,
9805
+ cardRole: "default",
9806
+ composition: {
9807
+ kind: "offerings-preview",
9808
+ treatment: "joined-programme-panel"
9809
+ }
9810
+ }
9811
+ }), defineBlockAppearancePreset({
9812
+ id: "feature-cards-raised-rule",
9813
+ target: "feature-cards",
9814
+ label: "Raised cards with rule",
9815
+ blockKinds: ["block.feature-cards"],
9816
+ design: {
9817
+ sectionSurface: "base",
9818
+ contentFrame: plainFrame,
9819
+ cardRole: "default"
9820
+ }
9821
+ }), defineBlockAppearancePreset({
9822
+ id: "feature-cards-bold-colors",
9823
+ target: "feature-cards",
9824
+ label: "Bold colour-blocked cards",
9825
+ blockKinds: ["block.feature-cards"],
9826
+ design: {
9827
+ sectionSurface: "base",
9828
+ contentFrame: plainFrame,
9829
+ cardRole: "alternative"
9830
+ }
9831
+ }), defineBlockAppearancePreset({
9832
+ id: "feature-cards-editorial-columns",
9833
+ target: "feature-cards",
9834
+ label: "Editorial open columns",
9835
+ blockKinds: ["block.feature-cards"],
9836
+ design: {
9837
+ sectionSurface: "muted-band",
9838
+ contentFrame: plainFrame,
9839
+ cardRole: "open"
9840
+ }
9841
+ }), defineBlockAppearancePreset({
9842
+ id: "feature-cards-asymmetric-emphasis",
9843
+ target: "feature-cards",
9844
+ label: "Asymmetric emphasis pair",
9845
+ blockKinds: ["block.feature-cards"],
9846
+ constraints: { layoutFamilies: ["grid"] },
9847
+ design: {
9848
+ sectionSurface: "base",
9849
+ contentFrame: plainFrame,
9850
+ composition: {
9851
+ kind: "feature-cards",
9852
+ treatment: "asymmetric-emphasis"
9853
+ }
9854
+ }
9855
+ }), defineBlockAppearancePreset({
9856
+ id: "feature-cards-framed-programme",
9857
+ target: "feature-cards",
9858
+ label: "Framed programme cards",
9859
+ blockKinds: ["block.feature-cards"],
9860
+ constraints: { layoutFamilies: ["grid"] },
9861
+ design: {
9862
+ sectionSurface: "brand-depth-band",
9863
+ contentFrame: plainFrame,
9864
+ cardRole: "alternative",
9865
+ composition: {
9866
+ kind: "feature-cards",
9867
+ treatment: "framed-programme"
9868
+ }
9869
+ }
9870
+ }), defineBlockAppearancePreset({
9871
+ id: "feature-cards-soft-panels",
9872
+ target: "feature-cards",
9873
+ label: "Soft tinted panels",
9874
+ blockKinds: ["block.feature-cards"],
9875
+ design: {
9876
+ sectionSurface: "base",
9877
+ contentFrame: plainFrame,
9878
+ cardRole: "alternative"
9879
+ }
9880
+ }), defineBlockAppearancePreset({
9881
+ id: "feature-cards-editorial-diptych",
9882
+ target: "feature-cards",
9883
+ label: "Editorial diptych",
9884
+ blockKinds: ["block.feature-cards"],
9885
+ constraints: { layoutVariantKeys: ["editorial-diptych"] },
9886
+ design: {
9887
+ sectionSurface: "base",
9888
+ contentFrame: plainFrame,
9889
+ cardRole: "default"
9890
+ }
9891
+ }), defineBlockAppearancePreset({
9892
+ id: "feature-cards-editorial-pathways",
9893
+ target: "feature-cards",
9894
+ label: "Editorial pathways",
9895
+ blockKinds: ["block.feature-cards"],
9896
+ constraints: { layoutVariantKeys: ["editorial-pathways"] },
9897
+ design: {
9898
+ sectionSurface: "base",
9899
+ contentFrame: plainFrame,
9900
+ cardRole: "default"
9901
+ }
9902
+ }), defineBlockAppearancePreset({
9903
+ id: "feature-cards-photo-tiles",
9904
+ target: "feature-cards",
9905
+ label: "Photo tiles",
9906
+ blockKinds: ["block.feature-cards"],
9907
+ design: {
9908
+ sectionSurface: "base",
9909
+ contentFrame: plainFrame,
9910
+ cardRole: "default"
9911
+ }
9912
+ }), defineBlockAppearancePreset({
9913
+ id: "events-lined-panel",
9914
+ target: "events",
9915
+ label: "Raised event panel",
9916
+ blockKinds: ["block.event-calendar", "block.event-listing"],
9917
+ design: {
9918
+ sectionSurface: "base",
9919
+ contentFrame: panelFrame("raised")
9920
+ }
9921
+ }), defineBlockAppearancePreset({
9922
+ id: "events-ruled-register",
9923
+ target: "events",
9924
+ label: "Ruled event register",
9925
+ blockKinds: ["block.event-calendar", "block.event-listing"],
9926
+ design: {
9927
+ sectionSurface: "brand-depth-band",
9928
+ contentFrame: plainFrame,
9929
+ eventListTreatment: "ruled-register"
9930
+ }
9931
+ }), defineBlockAppearancePreset({
9932
+ id: "events-editorial-register",
9933
+ target: "events",
9934
+ label: "Editorial event register",
9935
+ blockKinds: ["block.event-calendar", "block.event-listing"],
9936
+ design: {
9937
+ sectionSurface: "base",
9938
+ contentFrame: plainFrame,
9939
+ eventListTreatment: "editorial-register"
9940
+ }
9941
+ }), defineBlockAppearancePreset({
9942
+ id: "events-dense-index",
9943
+ target: "events",
9944
+ label: "Dense event index",
9945
+ blockKinds: ["block.event-calendar", "block.event-listing"],
9946
+ design: {
9947
+ sectionSurface: "accent-band",
9948
+ contentFrame: plainFrame,
9949
+ eventListTreatment: "dense-index"
9950
+ }
9951
+ }), defineBlockAppearancePreset({
9952
+ id: "schedule-details-brand-depth",
9953
+ target: "events",
9954
+ label: "Brand-depth schedule details",
9955
+ blockKinds: ["block.event-details"],
9956
+ design: {
9957
+ sectionSurface: "brand-depth-band",
9958
+ contentFrame: plainFrame,
9959
+ tileTreatment: "brand-depth"
9960
+ }
9961
+ }), defineBlockAppearancePreset({
9962
+ id: "media-text-flush-feature",
9963
+ target: "media-text",
9964
+ label: "Flush media feature",
9965
+ blockKinds: ["block.media-text"],
9966
+ design: {
9967
+ sectionSurface: "muted-band",
9968
+ contentFrame: flushPanelFrame({ bleed: "start" })
9969
+ }
9970
+ }), defineBlockAppearancePreset({
9971
+ id: "testimonials-simple-cards",
9972
+ target: "testimonials",
9973
+ label: "Simple testimonial cards",
9974
+ blockKinds: ["block.testimonials"],
9975
+ design: {
9976
+ sectionSurface: "base",
9977
+ contentFrame: plainFrame,
9978
+ cardRole: "default"
9979
+ }
9980
+ }), defineBlockAppearancePreset({
9981
+ id: "testimonials-raised-panel",
9982
+ target: "testimonials",
9983
+ label: "Raised testimonial panel",
9984
+ blockKinds: ["block.testimonials"],
9985
+ design: {
9986
+ sectionSurface: "muted-band",
9987
+ contentFrame: panelFrame("raised"),
9988
+ cardRole: "default"
9989
+ }
9990
+ }), defineBlockAppearancePreset({
9991
+ id: "testimonials-accent-panel",
9992
+ target: "testimonials",
9993
+ label: "Accent testimonial panel",
9994
+ blockKinds: ["block.testimonials"],
9995
+ design: {
9996
+ sectionSurface: "accent-band",
9997
+ contentFrame: panelFrame("raised"),
9998
+ cardRole: "default"
9999
+ }
10000
+ }), defineBlockAppearancePreset({
10001
+ id: "testimonials-default-cards",
10002
+ target: "testimonials",
10003
+ label: "Default cards",
10004
+ blockKinds: ["block.testimonials"],
10005
+ design: {
10006
+ sectionSurface: "base",
10007
+ contentFrame: plainFrame,
10008
+ cardRole: "default"
10009
+ }
10010
+ }), defineBlockAppearancePreset({
10011
+ id: "testimonials-statement-cards",
10012
+ target: "testimonials",
10013
+ label: "Statement cards",
10014
+ blockKinds: ["block.testimonials"],
10015
+ design: {
10016
+ sectionSurface: "accent-band",
10017
+ contentFrame: plainFrame,
10018
+ cardRole: "alternative"
10019
+ }
10020
+ }), defineBlockAppearancePreset({
10021
+ id: "testimonials-brand-statement-cards",
10022
+ target: "testimonials",
10023
+ label: "Brand statement cards",
10024
+ blockKinds: ["block.testimonials"],
10025
+ design: {
10026
+ sectionSurface: "brand-depth-band",
10027
+ contentFrame: plainFrame,
10028
+ cardRole: "alternative"
10029
+ }
10030
+ }), defineBlockAppearancePreset({
10031
+ id: "testimonials-non-carded",
10032
+ target: "testimonials",
10033
+ label: "Non-carded",
10034
+ blockKinds: ["block.testimonials"],
10035
+ design: {
10036
+ sectionSurface: "muted-band",
10037
+ contentFrame: plainFrame,
10038
+ composition: {
10039
+ kind: "testimonials",
10040
+ treatment: "open-editorial"
10041
+ }
10042
+ }
10043
+ }), defineBlockAppearancePreset({
10044
+ id: "testimonials-evergreen-lead",
10045
+ target: "testimonials",
10046
+ label: "Evergreen lead",
10047
+ blockKinds: ["block.testimonials"],
10048
+ constraints: { layoutVariantKeys: ["featured-editorial"] },
10049
+ design: {
10050
+ sectionSurface: "base",
10051
+ contentFrame: plainFrame,
10052
+ composition: {
10053
+ kind: "testimonials",
10054
+ treatment: "evergreen-lead"
10055
+ }
10056
+ }
10057
+ }), defineBlockAppearancePreset({
10058
+ id: "testimonials-room-and-response",
10059
+ target: "testimonials",
10060
+ label: "Room and response",
10061
+ blockKinds: ["block.testimonials"],
10062
+ constraints: { layoutVariantKeys: ["featured-editorial"] },
10063
+ design: {
10064
+ sectionSurface: "base",
10065
+ contentFrame: plainFrame,
10066
+ composition: {
10067
+ kind: "testimonials",
10068
+ treatment: "room-and-response"
10069
+ }
10070
+ }
10071
+ }), defineBlockAppearancePreset({
10072
+ id: "testimonials-open-floor",
10073
+ target: "testimonials",
10074
+ label: "Open floor",
10075
+ blockKinds: ["block.testimonials"],
10076
+ constraints: { layoutVariantKeys: ["featured-editorial"] },
10077
+ design: {
10078
+ sectionSurface: "base",
10079
+ contentFrame: plainFrame,
10080
+ composition: {
10081
+ kind: "testimonials",
10082
+ treatment: "open-floor"
10083
+ }
10084
+ }
10085
+ }), defineBlockAppearancePreset({
10086
+ id: "faq-base-accordion",
10087
+ target: "faq",
10088
+ label: "Base accordion FAQ",
10089
+ blockKinds: ["block.faq"],
10090
+ design: {
10091
+ sectionSurface: "base",
10092
+ contentFrame: plainFrame,
10093
+ cardRole: "default"
10094
+ }
10095
+ }), defineBlockAppearancePreset({
10096
+ id: "faq-contained-help",
10097
+ target: "faq",
10098
+ label: "Contained help panel",
10099
+ blockKinds: ["block.faq"],
10100
+ design: {
10101
+ sectionSurface: "muted-band",
10102
+ contentFrame: panelFrame("inset"),
10103
+ cardRole: "default"
10104
+ }
10105
+ }), defineBlockAppearancePreset({
10106
+ id: "contact-form-panel",
10107
+ target: "contact-form",
10108
+ label: "Raised form panel",
10109
+ blockKinds: ["block.form"],
10110
+ design: {
10111
+ sectionSurface: "muted-band",
10112
+ contentFrame: panelFrame("raised")
10113
+ }
10114
+ }), defineBlockAppearancePreset({
10115
+ id: "booking-brand-band",
10116
+ target: "contact-form",
10117
+ label: "Brand band booking",
10118
+ blockKinds: ["block.appointment-booking"],
10119
+ design: {
10120
+ sectionSurface: "brand-depth-band",
10121
+ contentFrame: plainFrame
10122
+ }
10123
+ }), defineBlockAppearancePreset({
10124
+ id: "cta-accent-band",
10125
+ target: "cta",
10126
+ label: "Accent CTA band",
10127
+ blockKinds: ["block.cta-full"],
10128
+ design: {
10129
+ sectionSurface: "accent-band",
10130
+ contentFrame: plainFrame,
10131
+ eyebrowTreatment: "accent"
10132
+ }
10133
+ });
10134
+ asPageFlowPresetId("generated-default");
10135
+ asSiteStyleId("site-style:south-west-twerk-school");
10136
+ asAppearancePresetId("hero-brand-scrim-fixed-frame");
10137
+ asLayoutVariantKey("classic");
10138
+ asLayoutVariantKey("micro");
8958
10139
  asBoundaryOptionId("break:wave");
8959
- asBoundaryOptionId("break:wave-balanced");
8960
- asBoundaryOptionId("break:wave-gentle");
8961
- asBoundaryOptionId("break:wave-bold");
8962
- asBoundaryOptionId("break:wave-drift");
8963
- asBoundaryOptionId("break:angle-subtle");
8964
- asBoundaryOptionId("break:angle-balanced");
8965
- asBoundaryOptionId("break:angle-steep");
8966
10140
  //#endregion
8967
10141
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
8968
10142
  function defineSectionForegroundRuntimeTokens(input) {
@@ -8986,7 +10160,7 @@ function defineComponentRuntimeRules(rules) {
8986
10160
  }
8987
10161
  /**
8988
10162
  * Default design rules translate semantic page-level choices into the current
8989
- * runtime's section background and transition style-group vocabulary.
10163
+ * runtime's section background vocabulary.
8990
10164
  */
8991
10165
  const defaultDesignRuntimeRules = defineDesignRuntimeRules({
8992
10166
  sectionSurfaces: {
@@ -9021,8 +10195,7 @@ const defaultDesignRuntimeRules = defineDesignRuntimeRules({
9021
10195
  color: "surface",
9022
10196
  opacity: .88
9023
10197
  }
9024
- },
9025
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
10198
+ }
9026
10199
  });
9027
10200
  /**
9028
10201
  * Default component rules translate frame and item-surface semantics into the
@@ -10737,14 +11910,6 @@ const curatedSiteStyles = [
10737
11910
  })
10738
11911
  ];
10739
11912
  new Map(curatedSiteStyles.map((style) => [style.id, style]));
10740
- svgDataUrl("<svg viewBox='0 0 1440 72' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='none'><path d='M0 72V46C130 55 260 24 420 30C590 36 690 62 860 42C1035 21 1160 47 1305 36C1365 31 1415 33 1440 38V72H0Z' fill='white'/></svg>");
10741
- svgDataUrl("<svg viewBox='0 0 1440 72' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='none'><path d='M0 72V42C120 24 240 24 360 42C480 60 600 60 720 42C840 24 960 24 1080 42C1200 60 1320 60 1440 42V72H0Z' fill='white'/></svg>");
10742
- svgDataUrl("<svg viewBox='0 0 1440 72' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='none'><path d='M0 72V43C180 32 300 32 480 43C660 54 780 54 960 43C1140 32 1260 32 1440 43V72H0Z' fill='white'/></svg>");
10743
- svgDataUrl("<svg viewBox='0 0 1440 72' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='none'><path d='M0 72V44C90 14 270 14 360 44C450 74 630 74 720 44C810 14 990 14 1080 44C1170 74 1350 74 1440 44V72H0Z' fill='white'/></svg>");
10744
- svgDataUrl("<svg viewBox='0 0 1440 72' xmlns='http://www.w3.org/2000/svg' preserveAspectRatio='none'><path d='M0 72V39C115 31 205 54 340 48C505 41 610 16 760 33C920 51 1015 64 1160 44C1280 27 1375 35 1440 50V72H0Z' fill='white'/></svg>");
10745
- function svgDataUrl(svg) {
10746
- return `data:image/svg+xml,${encodeURIComponent(svg)}`;
10747
- }
10748
11913
  //#endregion
10749
11914
  //#region ../theme-core/src/status/generateStatusCss.ts
10750
11915
  /**