@riverbankcms/sdk 0.140.0 → 0.142.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 (145) hide show
  1. package/dist/{PreviewEditorSidebar-CUyTzd5z.mjs → PreviewEditorSidebar-Dk6Dt11f.mjs} +24 -15
  2. package/dist/{PreviewEditorUI-Agkw4v5i.mjs → PreviewEditorUI-D6EQTsCA.mjs} +3 -3
  3. package/dist/{PreviewQueryProvider-CN0ewic5.mjs → PreviewQueryProvider-CC-EPkyQ.mjs} +1 -1
  4. package/dist/{SdkPreviewModeRuntime-DdbeAdS8.mjs → SdkPreviewModeRuntime-DH1n4ytY.mjs} +85 -54
  5. package/dist/{SiteChromeCustomizeContext-CqGOz-Kv.mjs → SiteChromeCustomizeContext-DunIzY0K.mjs} +797 -216
  6. package/dist/_dts/api/src/billing.d.ts +6 -1
  7. package/dist/_dts/api/src/bookingConfig.d.ts +1 -1
  8. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +2 -2
  9. package/dist/_dts/api/src/contentRuntime.d.ts +12 -31
  10. package/dist/_dts/api/src/domainConnection.d.ts +4 -0
  11. package/dist/_dts/api/src/endpoints.d.ts +0 -27
  12. package/dist/_dts/api/src/footerCompositionContracts.d.ts +25 -0
  13. package/dist/_dts/api/src/index.d.ts +2 -2
  14. package/dist/_dts/api/src/launchReadiness.d.ts +1 -0
  15. package/dist/_dts/api/src/navigation/dashboardSiteNav.d.ts +2 -1
  16. package/dist/_dts/api/src/publicBookingService.d.ts +1 -0
  17. package/dist/_dts/api/src/sdkConfig/layout.d.ts +13 -0
  18. package/dist/_dts/api/src/sdkContracts.d.ts +3 -8
  19. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +3 -26
  20. package/dist/_dts/api/src/siteOnboarding.d.ts +7 -0
  21. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +1 -31
  22. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +6 -1
  23. package/dist/_dts/billing/src/site-arrangements.d.ts +18 -5
  24. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -0
  25. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +2 -0
  26. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +2 -0
  27. package/dist/_dts/blocks/src/system/blocks/events/eventSelectionFields.d.ts +122 -0
  28. package/dist/_dts/blocks/src/system/blocks/events/shared/calendarWindow.d.ts +2 -1
  29. package/dist/_dts/blocks/src/system/blocks/events/shared/eventSelection.d.ts +11 -0
  30. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +56 -0
  31. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +8 -0
  32. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +2 -2
  33. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +47 -47
  34. package/dist/_dts/blocks/src/system/data/prefetchBlockData.d.ts +5 -0
  35. package/dist/_dts/blocks/src/system/data/utils.d.ts +1 -1
  36. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +27 -1
  37. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +12 -180
  38. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +6 -90
  39. package/dist/_dts/blocks/src/system/runtime/hooks/useEventFilters.d.ts +2 -1
  40. package/dist/_dts/blocks/src/system/runtime/nodes/appointment-services.d.ts +5 -1
  41. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.d.ts +4 -0
  42. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.state.d.ts +5 -0
  43. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.d.ts +3 -0
  44. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.state.d.ts +10 -3
  45. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventCheckoutHandoffRestore.d.ts +9 -0
  46. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +4 -5
  47. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useSettledCommerceView.d.ts +37 -0
  48. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +4 -3
  49. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +3 -0
  50. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +11 -101
  51. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +63 -2
  52. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/listOptions.d.ts +2 -0
  53. package/dist/_dts/blocks/src/system/transforms/registry/eventCalendar.d.ts +12 -0
  54. package/dist/_dts/commerce/src/purchase/bookingInstalmentSchedule.d.ts +4 -0
  55. package/dist/_dts/commerce/src/purchase/stripeCommissionMetadata.d.ts +1 -2
  56. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +3102 -3122
  57. package/dist/_dts/editor-blocks/src/block-editor/ColourFieldOptionsProvider.d.ts +7 -0
  58. package/dist/_dts/editor-blocks/src/block-editor/colourFieldVisibility.d.ts +7 -0
  59. package/dist/_dts/editor-blocks/src/block-editor/preparedManifest.d.ts +2 -0
  60. package/dist/_dts/editor-blocks/src/index.d.ts +1 -0
  61. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/loaders.d.ts +27 -1
  62. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +2 -2
  63. package/dist/_dts/preview-next/src/client/preview/PreviewFooterEditorPanel.d.ts +3 -6
  64. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +2 -2
  65. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +2 -2
  66. package/dist/_dts/preview-next/src/client/preview/footerInspection.d.ts +16 -0
  67. package/dist/_dts/preview-next/src/client/preview/sdkConfig.d.ts +6 -0
  68. package/dist/_dts/sdk/src/config/types.d.ts +2 -18
  69. package/dist/_dts/sdk/src/config/validation.d.ts +6 -0
  70. package/dist/_dts/sdk/src/public-api/contracts.d.ts +4 -1
  71. package/dist/_dts/sdk/src/version.d.ts +1 -1
  72. package/dist/_dts/theme-core/src/ThemeFontLoader.d.ts +17 -1
  73. package/dist/_dts/theme-core/src/buttons/affordanceSuppression.d.ts +17 -0
  74. package/dist/_dts/theme-core/src/buttons/buttonColourContract.d.ts +1 -1
  75. package/dist/_dts/theme-core/src/buttons/classNames.d.ts +16 -0
  76. package/dist/_dts/theme-core/src/buttons/generateButtonCss.d.ts +0 -6
  77. package/dist/_dts/theme-core/src/buttons/resolvedButtonCss.d.ts +4 -4
  78. package/dist/_dts/theme-core/src/footer/mode.d.ts +10 -1
  79. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  80. package/dist/_dts/theme-core/src/hosted-booking-appearance.d.ts +54 -12
  81. package/dist/_dts/theme-core/src/index.d.ts +1 -1
  82. package/dist/_dts/theme-core/src/schema.d.ts +1 -7
  83. package/dist/_dts/theme-core/src/site-styles/effectivePageDesign.d.ts +32 -0
  84. package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
  85. package/dist/client/{BookingConsentAgreement-CuKa82V4.mjs → BookingConsentAgreement-CnJeq3_r.mjs} +2 -2
  86. package/dist/client/{DiscountCodeDisclosure-BbYieKWB.mjs → DiscountCodeDisclosure-BINEO6J9.mjs} +1 -1
  87. package/dist/client/{EventCombined.client-LTfR1Aby.mjs → EventCombined.client-srxNQ6sZ.mjs} +11 -15
  88. package/dist/client/{EventListing.client-DUHpYSuo.mjs → EventListing.client-DbyVyGkX.mjs} +4 -17
  89. package/dist/client/{LeafletStaticMap-CHRupL6m.mjs → LeafletStaticMap-B-wpijzL.mjs} +1 -1
  90. package/dist/client/{accordion-6HiIFxNL.mjs → accordion-B-iUXU7n.mjs} +1 -1
  91. package/dist/client/{bookingForm-Dlmid43H.mjs → bookingForm-BXYPke5q.mjs} +5 -5
  92. package/dist/client/bookings.mjs +194 -102
  93. package/dist/client/{carousel-DmkZRRq_.mjs → carousel-Cr4aj63H.mjs} +1 -1
  94. package/dist/client/{cart-CIC24330.mjs → cart-DibP9WWa.mjs} +3 -3
  95. package/dist/client/{checkout-D1Zw9imo.mjs → checkout-CrSBVnL8.mjs} +3 -3
  96. package/dist/client/client.mjs +643 -192
  97. package/dist/client/{context-Cy1OayHx.mjs → context-Ces-AgdR.mjs} +1 -1
  98. package/dist/client/{dates-aDcfoLHr.mjs → dates-BXyNeNhB.mjs} +2 -2
  99. package/dist/client/{eventCalendar-FQxMPAjf.mjs → eventCalendar-HwpPeqrH.mjs} +11 -7
  100. package/dist/client/{eventCombined-Dr3ac6Hb.mjs → eventCombined-BpFUkuEI.mjs} +3 -3
  101. package/dist/client/{eventDetails-D-AzUHFQ.mjs → eventDetails-DK_agiWy.mjs} +4 -4
  102. package/dist/client/{eventListing-B3XxBf3i.mjs → eventListing-DhzHqP1c.mjs} +3 -3
  103. package/dist/client/{eventRegistration-I6EaokFD.mjs → eventRegistration-BdQ_Dn2d.mjs} +124 -32
  104. package/dist/client/{form-BbWckVWY.mjs → form-B1frcuzy.mjs} +2 -2
  105. package/dist/client/{headerSection-C9qU4Y7x.mjs → headerSection-CT5z460s.mjs} +2 -2
  106. package/dist/client/hooks.mjs +274 -45
  107. package/dist/client/{locationMap-CLCShvlG.mjs → locationMap-CIQXB9i2.mjs} +2 -2
  108. package/dist/client/{newsletterForm-Briukxzi.mjs → newsletterForm-BYNYZSes.mjs} +23 -10
  109. package/dist/client/{pricing-Copadu-2.mjs → pricing-CbTlAsmt.mjs} +1 -1
  110. package/dist/client/{productDetail-oujlRd-r.mjs → productDetail-CR7Z3yjS.mjs} +3 -3
  111. package/dist/client/{productList-BRiIRUcd.mjs → productList-DXj00vzR.mjs} +3 -3
  112. package/dist/client/{propsDecoder-CB2KS_ko.mjs → propsDecoder-DiLiBdek.mjs} +57 -16
  113. package/dist/client/rendering/client.mjs +476 -132
  114. package/dist/client/rendering/islands.mjs +17 -17
  115. package/dist/client/rendering.mjs +686 -195
  116. package/dist/client/{scrollToBlock-B1IS1_ua.mjs → scrollToBlock-CrcbBf0h.mjs} +28 -11
  117. package/dist/client/{shop-Vn6yNFED.mjs → shop-DgqiB_1b.mjs} +6 -6
  118. package/dist/client/{shop-commerce-BVTqipYp.mjs → shop-commerce-D_J781in.mjs} +5 -5
  119. package/dist/client/{shop-commerce-store-BVnJVy7v.mjs → shop-commerce-store-PGUbDwqe.mjs} +1 -1
  120. package/dist/client/{shopShared-COIeK77T.mjs → shopShared-C_Bb2zwG.mjs} +3 -3
  121. package/dist/client/{useEventFilters-DzIUcS9n.mjs → useEventFilters-CM17Xpr1.mjs} +17 -11
  122. package/dist/preview-next/before-render.mjs +0 -37
  123. package/dist/preview-next/client/runtime.mjs +4 -4
  124. package/dist/preview-next/editor-chrome.css +4 -8
  125. package/dist/preview-next/keepAlive.mjs +0 -37
  126. package/dist/preview-next/middleware.mjs +0 -37
  127. package/dist/{previewAuthStore-Gjb6r6vz.mjs → previewAuthStore-oVttoRDO.mjs} +0 -37
  128. package/dist/{sdk-runtime-CnCLvZRv.mjs → sdk-runtime-DhmuRhIX.mjs} +2 -2
  129. package/dist/{separator-DKDRJ1oH.mjs → separator-C3hlg9LH.mjs} +1 -1
  130. package/dist/server/components.mjs +452 -111
  131. package/dist/server/config-validation.mjs +263 -40
  132. package/dist/server/config.mjs +263 -40
  133. package/dist/server/data.mjs +274 -45
  134. package/dist/server/index.mjs +1 -38
  135. package/dist/server/next.mjs +427 -119
  136. package/dist/server/page-converter.mjs +208 -33
  137. package/dist/server/prebuild.mjs +1 -1
  138. package/dist/server/rendering/server.mjs +467 -119
  139. package/dist/server/rendering.mjs +467 -117
  140. package/dist/server/routing.mjs +301 -50
  141. package/dist/server/server.mjs +275 -83
  142. package/dist/server/theme-bridge.mjs +57 -23
  143. package/dist/server/theme.mjs +11 -9
  144. package/dist/styles/index.css +28 -2
  145. package/package.json +1 -1
@@ -46,6 +46,14 @@ function fallbackBinding(...sources) {
46
46
  };
47
47
  }
48
48
  //#endregion
49
+ //#region ../theme-core/src/footer/mode.ts
50
+ const footerModeSchema = z.enum([
51
+ "default",
52
+ "blocks",
53
+ "default+blocks",
54
+ "none"
55
+ ]);
56
+ //#endregion
49
57
  //#region ../api/src/apiEndpointTypes.ts
50
58
  function allowedDemoMutationPolicy() {
51
59
  return {
@@ -6074,7 +6082,7 @@ const BUTTON_CONTRAST_POLICY = {
6074
6082
  nonTextMinimumRatio: 3,
6075
6083
  gradientSamplesPerSegment: 20,
6076
6084
  alphaBackgrounds: "reject-without-known-surface",
6077
- disabled: "retain-full-colour-contract"
6085
+ disabled: "validated-colour-pair-with-muted-control-opacity"
6078
6086
  };
6079
6087
  function validateButtonSurfaceContrast(input) {
6080
6088
  const ratio = contrastRatio(input.buttonPaint, input.surfaceHex);
@@ -10929,12 +10937,6 @@ const footerVariant = z.enum([
10929
10937
  "split"
10930
10938
  ]);
10931
10939
  const footerMaxWidth = z.enum(["container", "full"]);
10932
- const footerMode = z.enum([
10933
- "default",
10934
- "blocks",
10935
- "default+blocks",
10936
- "none"
10937
- ]);
10938
10940
  const footerNavLayoutMode = z.enum([
10939
10941
  "stack",
10940
10942
  "inline",
@@ -11023,9 +11025,9 @@ const footerSchema = z.object({
11023
11025
  /**
11024
11026
  * SDK-only footer rendering mode.
11025
11027
  *
11026
- * Backwards compatible: missing/undefined behaves as 'default'.
11028
+ * Historical persisted field; SDK rendering mode now lives in layout.footerMode.
11027
11029
  */
11028
- mode: footerMode.optional(),
11030
+ mode: footerModeSchema.optional(),
11029
11031
  variant: footerVariant,
11030
11032
  maxWidth: footerMaxWidth,
11031
11033
  showLogoText: z.boolean().optional(),
@@ -16416,6 +16418,7 @@ function isDisplayMediaKind(kind) {
16416
16418
  }
16417
16419
  const siteOptionSources = [
16418
16420
  "eventCategories",
16421
+ "eventSeries",
16419
16422
  "venues",
16420
16423
  "staffMembers"
16421
16424
  ];
@@ -27286,7 +27289,8 @@ const appointmentServicesBlockDefinition = {
27286
27289
  el("appointment-services", {
27287
27290
  sectionHeading: { $bind: { from: "content.heading" } },
27288
27291
  services: { $bind: { from: "data.services" } },
27289
- pathname: { $bind: { from: "$root.pathname" } }
27292
+ pathname: { $bind: { from: "$root.pathname" } },
27293
+ servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
27290
27294
  })
27291
27295
  ], { gap: "lg" })
27292
27296
  })]
@@ -27924,6 +27928,15 @@ const publicEventBaseSchema = z.object({
27924
27928
  timeZone: z.string(),
27925
27929
  pricing: publicEventPricingSchema,
27926
27930
  paymentTerms: blockBookingPaymentTermsSchema,
27931
+ cancellationPolicy: z.object({ refunds: z.object({
27932
+ mode: z.enum([
27933
+ "never",
27934
+ "always",
27935
+ "cutoff"
27936
+ ]),
27937
+ cutoffHours: z.number(),
27938
+ method: z.enum(["original_payment_method", "site_credit"])
27939
+ }) }),
27927
27940
  consent: blockBookingConsentSchema.nullable(),
27928
27941
  accessRestriction: accessRestrictionSchema,
27929
27942
  allowedCategoryIds: z.array(z.string()),
@@ -29375,6 +29388,35 @@ const eventSpotlightBlockDefinition = {
29375
29388
  } }
29376
29389
  };
29377
29390
  //#endregion
29391
+ //#region ../blocks/src/system/blocks/events/shared/eventSelection.ts
29392
+ /** Invalid saved selections fail closed rather than widening discovery. */
29393
+ function resolveEventSelection(mode, value) {
29394
+ if (mode !== "selected") return { kind: "matching" };
29395
+ const candidates = Array.isArray(value) ? value : typeof value === "string" ? value.split(",").filter(Boolean) : [];
29396
+ const ids = [];
29397
+ for (const candidate of candidates) {
29398
+ if (typeof candidate !== "string") return {
29399
+ kind: "selected",
29400
+ seriesIds: []
29401
+ };
29402
+ const parsed = parseEventSeriesId(candidate.trim());
29403
+ if (!parsed.ok) return {
29404
+ kind: "selected",
29405
+ seriesIds: []
29406
+ };
29407
+ ids.push(parsed.value);
29408
+ }
29409
+ return {
29410
+ kind: "selected",
29411
+ seriesIds: [...new Set(ids)].sort()
29412
+ };
29413
+ }
29414
+ /** Undefined means discovery; an empty string is an explicitly empty selection. */
29415
+ function eventSeriesScopeCsv(value) {
29416
+ if (value == null) return void 0;
29417
+ return typeof value === "string" ? value : value.join(",");
29418
+ }
29419
+ //#endregion
29378
29420
  //#region ../blocks/src/system/runtime/nodes/events/shared/listingLayout.ts
29379
29421
  /**
29380
29422
  * Layout classes for event listing containers and cards. Presentation
@@ -29503,6 +29545,7 @@ z.object({
29503
29545
  eventSurface: z.enum(eventSurfaceScopeValues).optional(),
29504
29546
  eventPresets: z.string().optional(),
29505
29547
  scheduleScope: z.enum(eventScheduleScopeValues).optional(),
29548
+ seriesIds: z.string().optional(),
29506
29549
  categoryIds: z.string().optional(),
29507
29550
  venueId: z.string().transform(normalizeCalendarFilterId).optional(),
29508
29551
  staffMemberId: z.string().transform(normalizeCalendarFilterId).optional()
@@ -29565,6 +29608,7 @@ const eventCollectionFilterSourceSchemaShape = {
29565
29608
  eventSurface: eventSurfaceScopeSchema$1.nullable().optional(),
29566
29609
  filterEventPresets: z.union([z.string(), z.array(z.string())]).nullable().optional(),
29567
29610
  scheduleScope: eventScheduleScopeSchema$1.nullable().optional(),
29611
+ seriesIds: z.union([z.string(), z.array(z.string())]).nullable().optional(),
29568
29612
  filterCategoryIds: z.union([z.string(), z.array(z.string())]).nullable().optional(),
29569
29613
  filterStaffMemberId: z.string().nullable().optional(),
29570
29614
  filterVenueId: z.string().nullable().optional()
@@ -29611,6 +29655,7 @@ const eventCollectionDisplaySchemaShape = {
29611
29655
  eventSurface: eventSurfaceScopeSchema$1,
29612
29656
  filterEventPresets: z.string().nullable(),
29613
29657
  scheduleScope: eventScheduleScopeSchema$1,
29658
+ seriesIds: z.string().nullable().optional(),
29614
29659
  filterCategoryIds: z.string().nullable(),
29615
29660
  filterStaffMemberId: z.string().nullable(),
29616
29661
  filterVenueId: z.string().nullable(),
@@ -29658,11 +29703,15 @@ function buildEventCollectionDisplay(source) {
29658
29703
  };
29659
29704
  }
29660
29705
  function buildEventCollectionFilterDisplay(source) {
29661
- return {
29662
- showFilters: source.showFilters ?? true,
29663
- showCategoryFilter: source.showCategoryFilter ?? "auto",
29664
- showVenueFilter: source.showVenueFilter ?? false,
29665
- showStaffFilter: source.showStaffFilter ?? true,
29706
+ const selected = source.seriesIds != null;
29707
+ const matchingFilters = selected ? {
29708
+ eventSurface: "all",
29709
+ filterEventPresets: null,
29710
+ scheduleScope: "any",
29711
+ filterCategoryIds: null,
29712
+ filterStaffMemberId: null,
29713
+ filterVenueId: null
29714
+ } : {
29666
29715
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
29667
29716
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
29668
29717
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
@@ -29670,6 +29719,14 @@ function buildEventCollectionFilterDisplay(source) {
29670
29719
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
29671
29720
  filterVenueId: normalizeEventVenueId(source.filterVenueId)
29672
29721
  };
29722
+ return {
29723
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
29724
+ showFilters: selected ? false : source.showFilters ?? true,
29725
+ showCategoryFilter: source.showCategoryFilter ?? "auto",
29726
+ showVenueFilter: source.showVenueFilter ?? false,
29727
+ showStaffFilter: source.showStaffFilter ?? true,
29728
+ ...matchingFilters
29729
+ };
29673
29730
  }
29674
29731
  function buildEventCollectionPresentationDisplay(source) {
29675
29732
  return {
@@ -29684,14 +29741,15 @@ function buildEventCollectionPresentationDisplay(source) {
29684
29741
  }
29685
29742
  function buildEventCollectionHydration(source, now = /* @__PURE__ */ new Date()) {
29686
29743
  const timeZone = source.calendarWindow?.scope.timeZone ?? toBookingTimeZone(source.bookingTimeZone);
29744
+ const selected = source.seriesIds != null;
29687
29745
  return {
29688
29746
  calendarWindow: source.calendarWindow ?? void 0,
29689
29747
  siteId: source.siteId,
29690
29748
  stage: source.stage,
29691
29749
  prefetchedEvents: source.events != null,
29692
- eventSurface: normalizeEventSurfaceScope(source.eventSurface),
29693
- filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
29694
- scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
29750
+ eventSurface: selected ? "all" : normalizeEventSurfaceScope(source.eventSurface),
29751
+ filterEventPresets: selected ? null : normalizeEventSurfacePresetsCsv(source.filterEventPresets),
29752
+ scheduleScope: selected ? "any" : normalizeEventScheduleScope(source.scheduleScope),
29695
29753
  calendarContext: {
29696
29754
  timeZone,
29697
29755
  initialToday: source.calendarWindow?.initialToday ?? getLocalScheduleDate(now, timeZone)
@@ -29757,6 +29815,7 @@ const eventListingHydrationSchema = z.object({
29757
29815
  eventSurface: eventSurfaceScopeSchema,
29758
29816
  filterEventPresets: z.string().nullable(),
29759
29817
  scheduleScope: eventScheduleScopeSchema,
29818
+ seriesIds: z.string().nullable().optional(),
29760
29819
  filterCategoryIds: z.string().nullable().optional(),
29761
29820
  filterStaffMemberId: z.string().nullable().optional(),
29762
29821
  filterVenueId: z.string().nullable().optional(),
@@ -29817,6 +29876,7 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
29817
29876
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
29818
29877
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
29819
29878
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
29879
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
29820
29880
  filterCategoryIds: normalizeEventCategoryIdsCsv(source.filterCategoryIds),
29821
29881
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
29822
29882
  filterVenueId: normalizeEventVenueId(source.filterVenueId),
@@ -30190,6 +30250,65 @@ const eventListingBlockDefinition = {
30190
30250
  } }
30191
30251
  };
30192
30252
  //#endregion
30253
+ //#region ../blocks/src/system/blocks/events/eventSelectionFields.ts
30254
+ const eventSelectionFields = [{
30255
+ id: "eventSelection",
30256
+ type: "select",
30257
+ label: "Events to show",
30258
+ required: false,
30259
+ multiple: false,
30260
+ defaultValue: "matching",
30261
+ options: [{
30262
+ value: "matching",
30263
+ label: "All matching events"
30264
+ }, {
30265
+ value: "selected",
30266
+ label: "Selected events"
30267
+ }],
30268
+ ui: { intent: "behavior" }
30269
+ }, createSiteOptionSelectField({
30270
+ id: "selectedEventSeriesIds",
30271
+ label: "Selected events",
30272
+ description: "Show upcoming dates for these events. Other event filters do not apply.",
30273
+ required: false,
30274
+ multiple: true,
30275
+ defaultValue: [],
30276
+ optionSource: "eventSeries",
30277
+ ui: {
30278
+ intent: "behavior",
30279
+ searchThreshold: 1,
30280
+ visibleWhen: {
30281
+ field: "eventSelection",
30282
+ equals: "selected"
30283
+ }
30284
+ }
30285
+ })];
30286
+ function withEventSelectionVisibility(field) {
30287
+ if (![
30288
+ "eventSurface",
30289
+ "filterEventPresets",
30290
+ "scheduleScope",
30291
+ "filterCategoryIds",
30292
+ "filterStaffMemberId",
30293
+ "filterVenueId",
30294
+ "showFilters",
30295
+ "showCategoryFilter",
30296
+ "showVenueFilter",
30297
+ "showStaffFilter"
30298
+ ].includes(field.id)) return field;
30299
+ const visibleWhen = field.ui?.visibleWhen;
30300
+ return {
30301
+ ...field,
30302
+ ui: {
30303
+ ...field.ui,
30304
+ visibleWhen: { allOf: [{
30305
+ field: "eventSelection",
30306
+ notEquals: "selected"
30307
+ }, ...visibleWhen ? [visibleWhen] : []] }
30308
+ }
30309
+ };
30310
+ }
30311
+ //#endregion
30193
30312
  //#region ../blocks/src/system/runtime/nodes/events/EventCalendar.interactive.ts
30194
30313
  const eventCalendarSourceSchema = z.object({
30195
30314
  ...eventCollectionSourceSchemaShape,
@@ -30272,19 +30391,59 @@ const eventCalendarBlockRuntime = defineProgressiveBlockRuntime({
30272
30391
  //#region ../blocks/src/system/blocks/events/eventCalendarDataLoaders.ts
30273
30392
  const scopeParams = {
30274
30393
  siteId: { $bind: { from: "$root.siteId" } },
30394
+ seriesIds: { $bind: {
30395
+ from: "content",
30396
+ transforms: [{
30397
+ id: "events.calendarSelectionParam",
30398
+ options: { key: "seriesIds" }
30399
+ }]
30400
+ } },
30275
30401
  stage: { $bind: {
30276
30402
  from: "$root.previewStage",
30277
30403
  fallback: "published"
30278
30404
  } },
30279
- eventSurface: { $bind: { from: "content.eventSurface" } },
30405
+ eventSurface: { $bind: {
30406
+ from: "content",
30407
+ transforms: [{
30408
+ id: "events.calendarSelectionParam",
30409
+ options: { key: "eventSurface" }
30410
+ }, { id: "value.csv" }]
30411
+ } },
30280
30412
  eventPresets: { $bind: {
30281
- from: "content.filterEventPresets",
30282
- transforms: [{ id: "value.csv" }]
30413
+ from: "content",
30414
+ transforms: [{
30415
+ id: "events.calendarSelectionParam",
30416
+ options: { key: "filterEventPresets" }
30417
+ }, { id: "value.csv" }]
30418
+ } },
30419
+ scheduleScope: { $bind: {
30420
+ from: "content",
30421
+ transforms: [{
30422
+ id: "events.calendarSelectionParam",
30423
+ options: { key: "scheduleScope" }
30424
+ }, { id: "value.csv" }]
30283
30425
  } },
30284
- scheduleScope: { $bind: { from: "content.scheduleScope" } },
30285
- categoryIds: { $bind: { from: "content.filterCategoryIds" } },
30286
- staffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
30287
- venueId: { $bind: { from: "content.filterVenueId" } }
30426
+ categoryIds: { $bind: {
30427
+ from: "content",
30428
+ transforms: [{
30429
+ id: "events.calendarSelectionParam",
30430
+ options: { key: "filterCategoryIds" }
30431
+ }, { id: "value.csv" }]
30432
+ } },
30433
+ staffMemberId: { $bind: {
30434
+ from: "content",
30435
+ transforms: [{
30436
+ id: "events.calendarSelectionParam",
30437
+ options: { key: "filterStaffMemberId" }
30438
+ }, { id: "value.csv" }]
30439
+ } },
30440
+ venueId: { $bind: {
30441
+ from: "content",
30442
+ transforms: [{
30443
+ id: "events.calendarSelectionParam",
30444
+ options: { key: "filterVenueId" }
30445
+ }, { id: "value.csv" }]
30446
+ } }
30288
30447
  };
30289
30448
  /** Combined renders two jobs; calendar-only variants never pay for the list seed. */
30290
30449
  const eventCalendarDataLoaders = {
@@ -30414,6 +30573,13 @@ const eventCalendarLayout = [styledSection({
30414
30573
  from: "content.defaultCalendarView",
30415
30574
  fallback: "month"
30416
30575
  } },
30576
+ seriesIds: { $bind: {
30577
+ from: "content",
30578
+ transforms: [{
30579
+ id: "events.calendarSelectionParam",
30580
+ options: { key: "seriesIds" }
30581
+ }]
30582
+ } },
30417
30583
  showFilters: { $bind: {
30418
30584
  from: "content.showFilters",
30419
30585
  fallback: true
@@ -30435,17 +30601,47 @@ const eventCalendarLayout = [styledSection({
30435
30601
  fallback: true
30436
30602
  } },
30437
30603
  eventSurface: { $bind: {
30438
- from: "content.eventSurface",
30439
- fallback: "all"
30604
+ from: "content",
30605
+ transforms: [{
30606
+ id: "events.calendarSelectionParam",
30607
+ options: { key: "eventSurface" }
30608
+ }]
30609
+ } },
30610
+ filterEventPresets: { $bind: {
30611
+ from: "content",
30612
+ transforms: [{
30613
+ id: "events.calendarSelectionParam",
30614
+ options: { key: "filterEventPresets" }
30615
+ }]
30440
30616
  } },
30441
- filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
30442
30617
  scheduleScope: { $bind: {
30443
- from: "content.scheduleScope",
30444
- fallback: "any"
30618
+ from: "content",
30619
+ transforms: [{
30620
+ id: "events.calendarSelectionParam",
30621
+ options: { key: "scheduleScope" }
30622
+ }]
30623
+ } },
30624
+ filterCategoryIds: { $bind: {
30625
+ from: "content",
30626
+ transforms: [{
30627
+ id: "events.calendarSelectionParam",
30628
+ options: { key: "filterCategoryIds" }
30629
+ }]
30630
+ } },
30631
+ filterStaffMemberId: { $bind: {
30632
+ from: "content",
30633
+ transforms: [{
30634
+ id: "events.calendarSelectionParam",
30635
+ options: { key: "filterStaffMemberId" }
30636
+ }]
30637
+ } },
30638
+ filterVenueId: { $bind: {
30639
+ from: "content",
30640
+ transforms: [{
30641
+ id: "events.calendarSelectionParam",
30642
+ options: { key: "filterVenueId" }
30643
+ }]
30445
30644
  } },
30446
- filterCategoryIds: { $bind: { from: "content.filterCategoryIds" } },
30447
- filterStaffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
30448
- filterVenueId: { $bind: { from: "content.filterVenueId" } },
30449
30645
  cardRole: { $bind: {
30450
30646
  from: "content._cardStyles.role",
30451
30647
  fallback: "default"
@@ -30949,6 +31145,7 @@ const eventCalendarAdditionalFields = [
30949
31145
  }
30950
31146
  }
30951
31147
  },
31148
+ ...eventSelectionFields,
30952
31149
  {
30953
31150
  id: "eventSurface",
30954
31151
  type: "select",
@@ -31158,7 +31355,7 @@ const eventCalendarBlockDefinition = {
31158
31355
  titleSource: "heading",
31159
31356
  description: "Display events with calendar, list, or combined views with filtering",
31160
31357
  skipSectionStyles: true,
31161
- additionalFields: eventCalendarAdditionalFields,
31358
+ additionalFields: eventCalendarAdditionalFields.map(withEventSelectionVisibility),
31162
31359
  styleTokens: {
31163
31360
  background: "surface",
31164
31361
  typography: "body",
@@ -37581,6 +37778,26 @@ const linksTransforms = [{
37581
37778
  //#endregion
37582
37779
  //#region ../blocks/src/system/transforms/registry/index.ts
37583
37780
  const builtinTransformDefinitions = [
37781
+ {
37782
+ id: "events.calendarSelectionParam",
37783
+ kind: "formatter",
37784
+ summary: "Resolve selected events instead of discovery filters",
37785
+ schema: z.object({ key: z.enum([
37786
+ "seriesIds",
37787
+ "eventSurface",
37788
+ "filterEventPresets",
37789
+ "scheduleScope",
37790
+ "filterCategoryIds",
37791
+ "filterStaffMemberId",
37792
+ "filterVenueId"
37793
+ ]) }),
37794
+ run(value, { key }) {
37795
+ const content = asPartialObject(value) ?? {};
37796
+ const selection = resolveEventSelection(content.eventSelection, content.selectedEventSeriesIds);
37797
+ if (selection.kind === "selected") return key === "seriesIds" ? selection.seriesIds : void 0;
37798
+ return key === "seriesIds" ? void 0 : content[key];
37799
+ }
37800
+ },
37584
37801
  {
37585
37802
  id: "events.calendarReadEnabled",
37586
37803
  kind: "formatter",
@@ -37847,11 +38064,14 @@ const sdkSiteStyleConfigSchema = z.object({
37847
38064
  sectionOptions: sdkSectionOptionsConfigSchema.optional(),
37848
38065
  containerOptions: sdkContainerOptionsConfigSchema.optional()
37849
38066
  });
37850
- const sdkSiteLayoutConfigSchema = z.object({ footerBlocks: z.array(z.object({
37851
- id: z.string().min(1).optional(),
37852
- kind: z.string().min(1),
37853
- content: z.record(z.string(), z.unknown()).optional()
37854
- })).optional() });
38067
+ const sdkSiteLayoutConfigSchema = z.object({
38068
+ footerMode: footerModeSchema.optional(),
38069
+ footerBlocks: z.array(z.object({
38070
+ id: z.string().min(1).optional(),
38071
+ kind: z.string().min(1),
38072
+ content: z.record(z.string(), z.unknown()).optional()
38073
+ })).optional()
38074
+ });
37855
38075
  const sdkFieldSelectOptionSchema = z.object({
37856
38076
  value: z.string(),
37857
38077
  label: z.string()
@@ -39701,7 +39921,10 @@ const layoutFooterBlockSchema = z.object({
39701
39921
  kind: layoutBlockKindSchema,
39702
39922
  content: z.record(z.string(), z.unknown()).optional()
39703
39923
  }).strict();
39704
- const layoutConfigSchema = z.object({ footerBlocks: z.array(layoutFooterBlockSchema).optional() }).strict();
39924
+ const layoutConfigSchema = z.object({
39925
+ footerMode: footerModeSchema.optional(),
39926
+ footerBlocks: z.array(layoutFooterBlockSchema).optional()
39927
+ }).strict();
39705
39928
  const sdkWorkflowIdSchema = z.string().min(1).max(120).regex(SDK_WORKFLOW_ID_PATTERN, { message: "Workflow ID must start with a lowercase letter and use lowercase letters, numbers, dots, underscores, or hyphens" });
39706
39929
  const sdkWorkflowEndpointSchema = z.string().min(1).max(500).regex(SDK_WORKFLOW_ENDPOINT_PATTERN, { message: "Workflow endpoint must be a site-relative path starting with \"/\"" });
39707
39930
  const sdkWorkflowTriggerSchema = z.discriminatedUnion("type", [z.object({ type: z.literal("manual") }).strict()]);