@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
@@ -1,6 +1,14 @@
1
1
  import { z } from "zod";
2
2
  import "react/jsx-runtime";
3
3
  import "react";
4
+ //#region ../theme-core/src/footer/mode.ts
5
+ const footerModeSchema = z.enum([
6
+ "default",
7
+ "blocks",
8
+ "default+blocks",
9
+ "none"
10
+ ]);
11
+ //#endregion
4
12
  //#region ../api/src/apiEndpointTypes.ts
5
13
  function allowedDemoMutationPolicy() {
6
14
  return {
@@ -5997,7 +6005,7 @@ const BUTTON_CONTRAST_POLICY = {
5997
6005
  nonTextMinimumRatio: 3,
5998
6006
  gradientSamplesPerSegment: 20,
5999
6007
  alphaBackgrounds: "reject-without-known-surface",
6000
- disabled: "retain-full-colour-contract"
6008
+ disabled: "validated-colour-pair-with-muted-control-opacity"
6001
6009
  };
6002
6010
  function validateButtonSurfaceContrast(input) {
6003
6011
  const ratio = contrastRatio(input.buttonPaint, input.surfaceHex);
@@ -10852,12 +10860,6 @@ const footerVariant = z.enum([
10852
10860
  "split"
10853
10861
  ]);
10854
10862
  const footerMaxWidth = z.enum(["container", "full"]);
10855
- const footerMode = z.enum([
10856
- "default",
10857
- "blocks",
10858
- "default+blocks",
10859
- "none"
10860
- ]);
10861
10863
  const footerNavLayoutMode = z.enum([
10862
10864
  "stack",
10863
10865
  "inline",
@@ -10946,9 +10948,9 @@ const footerSchema = z.object({
10946
10948
  /**
10947
10949
  * SDK-only footer rendering mode.
10948
10950
  *
10949
- * Backwards compatible: missing/undefined behaves as 'default'.
10951
+ * Historical persisted field; SDK rendering mode now lives in layout.footerMode.
10950
10952
  */
10951
- mode: footerMode.optional(),
10953
+ mode: footerModeSchema.optional(),
10952
10954
  variant: footerVariant,
10953
10955
  maxWidth: footerMaxWidth,
10954
10956
  showLogoText: z.boolean().optional(),
@@ -16339,6 +16341,7 @@ function isDisplayMediaKind(kind) {
16339
16341
  }
16340
16342
  const siteOptionSources = [
16341
16343
  "eventCategories",
16344
+ "eventSeries",
16342
16345
  "venues",
16343
16346
  "staffMembers"
16344
16347
  ];
@@ -27209,7 +27212,8 @@ const appointmentServicesBlockDefinition = {
27209
27212
  el("appointment-services", {
27210
27213
  sectionHeading: { $bind: { from: "content.heading" } },
27211
27214
  services: { $bind: { from: "data.services" } },
27212
- pathname: { $bind: { from: "$root.pathname" } }
27215
+ pathname: { $bind: { from: "$root.pathname" } },
27216
+ servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
27213
27217
  })
27214
27218
  ], { gap: "lg" })
27215
27219
  })]
@@ -27847,6 +27851,15 @@ const publicEventBaseSchema = z.object({
27847
27851
  timeZone: z.string(),
27848
27852
  pricing: publicEventPricingSchema,
27849
27853
  paymentTerms: blockBookingPaymentTermsSchema,
27854
+ cancellationPolicy: z.object({ refunds: z.object({
27855
+ mode: z.enum([
27856
+ "never",
27857
+ "always",
27858
+ "cutoff"
27859
+ ]),
27860
+ cutoffHours: z.number(),
27861
+ method: z.enum(["original_payment_method", "site_credit"])
27862
+ }) }),
27850
27863
  consent: blockBookingConsentSchema.nullable(),
27851
27864
  accessRestriction: accessRestrictionSchema,
27852
27865
  allowedCategoryIds: z.array(z.string()),
@@ -29298,6 +29311,35 @@ const eventSpotlightBlockDefinition = {
29298
29311
  } }
29299
29312
  };
29300
29313
  //#endregion
29314
+ //#region ../blocks/src/system/blocks/events/shared/eventSelection.ts
29315
+ /** Invalid saved selections fail closed rather than widening discovery. */
29316
+ function resolveEventSelection(mode, value) {
29317
+ if (mode !== "selected") return { kind: "matching" };
29318
+ const candidates = Array.isArray(value) ? value : typeof value === "string" ? value.split(",").filter(Boolean) : [];
29319
+ const ids = [];
29320
+ for (const candidate of candidates) {
29321
+ if (typeof candidate !== "string") return {
29322
+ kind: "selected",
29323
+ seriesIds: []
29324
+ };
29325
+ const parsed = parseEventSeriesId(candidate.trim());
29326
+ if (!parsed.ok) return {
29327
+ kind: "selected",
29328
+ seriesIds: []
29329
+ };
29330
+ ids.push(parsed.value);
29331
+ }
29332
+ return {
29333
+ kind: "selected",
29334
+ seriesIds: [...new Set(ids)].sort()
29335
+ };
29336
+ }
29337
+ /** Undefined means discovery; an empty string is an explicitly empty selection. */
29338
+ function eventSeriesScopeCsv(value) {
29339
+ if (value == null) return void 0;
29340
+ return typeof value === "string" ? value : value.join(",");
29341
+ }
29342
+ //#endregion
29301
29343
  //#region ../blocks/src/system/runtime/nodes/events/shared/listingLayout.ts
29302
29344
  /**
29303
29345
  * Layout classes for event listing containers and cards. Presentation
@@ -29426,6 +29468,7 @@ z.object({
29426
29468
  eventSurface: z.enum(eventSurfaceScopeValues).optional(),
29427
29469
  eventPresets: z.string().optional(),
29428
29470
  scheduleScope: z.enum(eventScheduleScopeValues).optional(),
29471
+ seriesIds: z.string().optional(),
29429
29472
  categoryIds: z.string().optional(),
29430
29473
  venueId: z.string().transform(normalizeCalendarFilterId).optional(),
29431
29474
  staffMemberId: z.string().transform(normalizeCalendarFilterId).optional()
@@ -29488,6 +29531,7 @@ const eventCollectionFilterSourceSchemaShape = {
29488
29531
  eventSurface: eventSurfaceScopeSchema$1.nullable().optional(),
29489
29532
  filterEventPresets: z.union([z.string(), z.array(z.string())]).nullable().optional(),
29490
29533
  scheduleScope: eventScheduleScopeSchema$1.nullable().optional(),
29534
+ seriesIds: z.union([z.string(), z.array(z.string())]).nullable().optional(),
29491
29535
  filterCategoryIds: z.union([z.string(), z.array(z.string())]).nullable().optional(),
29492
29536
  filterStaffMemberId: z.string().nullable().optional(),
29493
29537
  filterVenueId: z.string().nullable().optional()
@@ -29534,6 +29578,7 @@ const eventCollectionDisplaySchemaShape = {
29534
29578
  eventSurface: eventSurfaceScopeSchema$1,
29535
29579
  filterEventPresets: z.string().nullable(),
29536
29580
  scheduleScope: eventScheduleScopeSchema$1,
29581
+ seriesIds: z.string().nullable().optional(),
29537
29582
  filterCategoryIds: z.string().nullable(),
29538
29583
  filterStaffMemberId: z.string().nullable(),
29539
29584
  filterVenueId: z.string().nullable(),
@@ -29581,11 +29626,15 @@ function buildEventCollectionDisplay(source) {
29581
29626
  };
29582
29627
  }
29583
29628
  function buildEventCollectionFilterDisplay(source) {
29584
- return {
29585
- showFilters: source.showFilters ?? true,
29586
- showCategoryFilter: source.showCategoryFilter ?? "auto",
29587
- showVenueFilter: source.showVenueFilter ?? false,
29588
- showStaffFilter: source.showStaffFilter ?? true,
29629
+ const selected = source.seriesIds != null;
29630
+ const matchingFilters = selected ? {
29631
+ eventSurface: "all",
29632
+ filterEventPresets: null,
29633
+ scheduleScope: "any",
29634
+ filterCategoryIds: null,
29635
+ filterStaffMemberId: null,
29636
+ filterVenueId: null
29637
+ } : {
29589
29638
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
29590
29639
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
29591
29640
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
@@ -29593,6 +29642,14 @@ function buildEventCollectionFilterDisplay(source) {
29593
29642
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
29594
29643
  filterVenueId: normalizeEventVenueId(source.filterVenueId)
29595
29644
  };
29645
+ return {
29646
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
29647
+ showFilters: selected ? false : source.showFilters ?? true,
29648
+ showCategoryFilter: source.showCategoryFilter ?? "auto",
29649
+ showVenueFilter: source.showVenueFilter ?? false,
29650
+ showStaffFilter: source.showStaffFilter ?? true,
29651
+ ...matchingFilters
29652
+ };
29596
29653
  }
29597
29654
  function buildEventCollectionPresentationDisplay(source) {
29598
29655
  return {
@@ -29607,14 +29664,15 @@ function buildEventCollectionPresentationDisplay(source) {
29607
29664
  }
29608
29665
  function buildEventCollectionHydration(source, now = /* @__PURE__ */ new Date()) {
29609
29666
  const timeZone = source.calendarWindow?.scope.timeZone ?? toBookingTimeZone(source.bookingTimeZone);
29667
+ const selected = source.seriesIds != null;
29610
29668
  return {
29611
29669
  calendarWindow: source.calendarWindow ?? void 0,
29612
29670
  siteId: source.siteId,
29613
29671
  stage: source.stage,
29614
29672
  prefetchedEvents: source.events != null,
29615
- eventSurface: normalizeEventSurfaceScope(source.eventSurface),
29616
- filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
29617
- scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
29673
+ eventSurface: selected ? "all" : normalizeEventSurfaceScope(source.eventSurface),
29674
+ filterEventPresets: selected ? null : normalizeEventSurfacePresetsCsv(source.filterEventPresets),
29675
+ scheduleScope: selected ? "any" : normalizeEventScheduleScope(source.scheduleScope),
29618
29676
  calendarContext: {
29619
29677
  timeZone,
29620
29678
  initialToday: source.calendarWindow?.initialToday ?? getLocalScheduleDate(now, timeZone)
@@ -29680,6 +29738,7 @@ const eventListingHydrationSchema = z.object({
29680
29738
  eventSurface: eventSurfaceScopeSchema,
29681
29739
  filterEventPresets: z.string().nullable(),
29682
29740
  scheduleScope: eventScheduleScopeSchema,
29741
+ seriesIds: z.string().nullable().optional(),
29683
29742
  filterCategoryIds: z.string().nullable().optional(),
29684
29743
  filterStaffMemberId: z.string().nullable().optional(),
29685
29744
  filterVenueId: z.string().nullable().optional(),
@@ -29740,6 +29799,7 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
29740
29799
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
29741
29800
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
29742
29801
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
29802
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
29743
29803
  filterCategoryIds: normalizeEventCategoryIdsCsv(source.filterCategoryIds),
29744
29804
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
29745
29805
  filterVenueId: normalizeEventVenueId(source.filterVenueId),
@@ -30113,6 +30173,65 @@ const eventListingBlockDefinition = {
30113
30173
  } }
30114
30174
  };
30115
30175
  //#endregion
30176
+ //#region ../blocks/src/system/blocks/events/eventSelectionFields.ts
30177
+ const eventSelectionFields = [{
30178
+ id: "eventSelection",
30179
+ type: "select",
30180
+ label: "Events to show",
30181
+ required: false,
30182
+ multiple: false,
30183
+ defaultValue: "matching",
30184
+ options: [{
30185
+ value: "matching",
30186
+ label: "All matching events"
30187
+ }, {
30188
+ value: "selected",
30189
+ label: "Selected events"
30190
+ }],
30191
+ ui: { intent: "behavior" }
30192
+ }, createSiteOptionSelectField({
30193
+ id: "selectedEventSeriesIds",
30194
+ label: "Selected events",
30195
+ description: "Show upcoming dates for these events. Other event filters do not apply.",
30196
+ required: false,
30197
+ multiple: true,
30198
+ defaultValue: [],
30199
+ optionSource: "eventSeries",
30200
+ ui: {
30201
+ intent: "behavior",
30202
+ searchThreshold: 1,
30203
+ visibleWhen: {
30204
+ field: "eventSelection",
30205
+ equals: "selected"
30206
+ }
30207
+ }
30208
+ })];
30209
+ function withEventSelectionVisibility(field) {
30210
+ if (![
30211
+ "eventSurface",
30212
+ "filterEventPresets",
30213
+ "scheduleScope",
30214
+ "filterCategoryIds",
30215
+ "filterStaffMemberId",
30216
+ "filterVenueId",
30217
+ "showFilters",
30218
+ "showCategoryFilter",
30219
+ "showVenueFilter",
30220
+ "showStaffFilter"
30221
+ ].includes(field.id)) return field;
30222
+ const visibleWhen = field.ui?.visibleWhen;
30223
+ return {
30224
+ ...field,
30225
+ ui: {
30226
+ ...field.ui,
30227
+ visibleWhen: { allOf: [{
30228
+ field: "eventSelection",
30229
+ notEquals: "selected"
30230
+ }, ...visibleWhen ? [visibleWhen] : []] }
30231
+ }
30232
+ };
30233
+ }
30234
+ //#endregion
30116
30235
  //#region ../blocks/src/system/runtime/nodes/events/EventCalendar.interactive.ts
30117
30236
  const eventCalendarSourceSchema = z.object({
30118
30237
  ...eventCollectionSourceSchemaShape,
@@ -30195,19 +30314,59 @@ const eventCalendarBlockRuntime = defineProgressiveBlockRuntime({
30195
30314
  //#region ../blocks/src/system/blocks/events/eventCalendarDataLoaders.ts
30196
30315
  const scopeParams = {
30197
30316
  siteId: { $bind: { from: "$root.siteId" } },
30317
+ seriesIds: { $bind: {
30318
+ from: "content",
30319
+ transforms: [{
30320
+ id: "events.calendarSelectionParam",
30321
+ options: { key: "seriesIds" }
30322
+ }]
30323
+ } },
30198
30324
  stage: { $bind: {
30199
30325
  from: "$root.previewStage",
30200
30326
  fallback: "published"
30201
30327
  } },
30202
- eventSurface: { $bind: { from: "content.eventSurface" } },
30328
+ eventSurface: { $bind: {
30329
+ from: "content",
30330
+ transforms: [{
30331
+ id: "events.calendarSelectionParam",
30332
+ options: { key: "eventSurface" }
30333
+ }, { id: "value.csv" }]
30334
+ } },
30203
30335
  eventPresets: { $bind: {
30204
- from: "content.filterEventPresets",
30205
- transforms: [{ id: "value.csv" }]
30336
+ from: "content",
30337
+ transforms: [{
30338
+ id: "events.calendarSelectionParam",
30339
+ options: { key: "filterEventPresets" }
30340
+ }, { id: "value.csv" }]
30341
+ } },
30342
+ scheduleScope: { $bind: {
30343
+ from: "content",
30344
+ transforms: [{
30345
+ id: "events.calendarSelectionParam",
30346
+ options: { key: "scheduleScope" }
30347
+ }, { id: "value.csv" }]
30206
30348
  } },
30207
- scheduleScope: { $bind: { from: "content.scheduleScope" } },
30208
- categoryIds: { $bind: { from: "content.filterCategoryIds" } },
30209
- staffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
30210
- venueId: { $bind: { from: "content.filterVenueId" } }
30349
+ categoryIds: { $bind: {
30350
+ from: "content",
30351
+ transforms: [{
30352
+ id: "events.calendarSelectionParam",
30353
+ options: { key: "filterCategoryIds" }
30354
+ }, { id: "value.csv" }]
30355
+ } },
30356
+ staffMemberId: { $bind: {
30357
+ from: "content",
30358
+ transforms: [{
30359
+ id: "events.calendarSelectionParam",
30360
+ options: { key: "filterStaffMemberId" }
30361
+ }, { id: "value.csv" }]
30362
+ } },
30363
+ venueId: { $bind: {
30364
+ from: "content",
30365
+ transforms: [{
30366
+ id: "events.calendarSelectionParam",
30367
+ options: { key: "filterVenueId" }
30368
+ }, { id: "value.csv" }]
30369
+ } }
30211
30370
  };
30212
30371
  /** Combined renders two jobs; calendar-only variants never pay for the list seed. */
30213
30372
  const eventCalendarDataLoaders = {
@@ -30337,6 +30496,13 @@ const eventCalendarLayout = [styledSection({
30337
30496
  from: "content.defaultCalendarView",
30338
30497
  fallback: "month"
30339
30498
  } },
30499
+ seriesIds: { $bind: {
30500
+ from: "content",
30501
+ transforms: [{
30502
+ id: "events.calendarSelectionParam",
30503
+ options: { key: "seriesIds" }
30504
+ }]
30505
+ } },
30340
30506
  showFilters: { $bind: {
30341
30507
  from: "content.showFilters",
30342
30508
  fallback: true
@@ -30358,17 +30524,47 @@ const eventCalendarLayout = [styledSection({
30358
30524
  fallback: true
30359
30525
  } },
30360
30526
  eventSurface: { $bind: {
30361
- from: "content.eventSurface",
30362
- fallback: "all"
30527
+ from: "content",
30528
+ transforms: [{
30529
+ id: "events.calendarSelectionParam",
30530
+ options: { key: "eventSurface" }
30531
+ }]
30532
+ } },
30533
+ filterEventPresets: { $bind: {
30534
+ from: "content",
30535
+ transforms: [{
30536
+ id: "events.calendarSelectionParam",
30537
+ options: { key: "filterEventPresets" }
30538
+ }]
30363
30539
  } },
30364
- filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
30365
30540
  scheduleScope: { $bind: {
30366
- from: "content.scheduleScope",
30367
- fallback: "any"
30541
+ from: "content",
30542
+ transforms: [{
30543
+ id: "events.calendarSelectionParam",
30544
+ options: { key: "scheduleScope" }
30545
+ }]
30546
+ } },
30547
+ filterCategoryIds: { $bind: {
30548
+ from: "content",
30549
+ transforms: [{
30550
+ id: "events.calendarSelectionParam",
30551
+ options: { key: "filterCategoryIds" }
30552
+ }]
30553
+ } },
30554
+ filterStaffMemberId: { $bind: {
30555
+ from: "content",
30556
+ transforms: [{
30557
+ id: "events.calendarSelectionParam",
30558
+ options: { key: "filterStaffMemberId" }
30559
+ }]
30560
+ } },
30561
+ filterVenueId: { $bind: {
30562
+ from: "content",
30563
+ transforms: [{
30564
+ id: "events.calendarSelectionParam",
30565
+ options: { key: "filterVenueId" }
30566
+ }]
30368
30567
  } },
30369
- filterCategoryIds: { $bind: { from: "content.filterCategoryIds" } },
30370
- filterStaffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
30371
- filterVenueId: { $bind: { from: "content.filterVenueId" } },
30372
30568
  cardRole: { $bind: {
30373
30569
  from: "content._cardStyles.role",
30374
30570
  fallback: "default"
@@ -30872,6 +31068,7 @@ const eventCalendarAdditionalFields = [
30872
31068
  }
30873
31069
  }
30874
31070
  },
31071
+ ...eventSelectionFields,
30875
31072
  {
30876
31073
  id: "eventSurface",
30877
31074
  type: "select",
@@ -31081,7 +31278,7 @@ const eventCalendarBlockDefinition = {
31081
31278
  titleSource: "heading",
31082
31279
  description: "Display events with calendar, list, or combined views with filtering",
31083
31280
  skipSectionStyles: true,
31084
- additionalFields: eventCalendarAdditionalFields,
31281
+ additionalFields: eventCalendarAdditionalFields.map(withEventSelectionVisibility),
31085
31282
  styleTokens: {
31086
31283
  background: "surface",
31087
31284
  typography: "body",
@@ -37504,6 +37701,26 @@ const linksTransforms = [{
37504
37701
  //#endregion
37505
37702
  //#region ../blocks/src/system/transforms/registry/index.ts
37506
37703
  const builtinTransformDefinitions = [
37704
+ {
37705
+ id: "events.calendarSelectionParam",
37706
+ kind: "formatter",
37707
+ summary: "Resolve selected events instead of discovery filters",
37708
+ schema: z.object({ key: z.enum([
37709
+ "seriesIds",
37710
+ "eventSurface",
37711
+ "filterEventPresets",
37712
+ "scheduleScope",
37713
+ "filterCategoryIds",
37714
+ "filterStaffMemberId",
37715
+ "filterVenueId"
37716
+ ]) }),
37717
+ run(value, { key }) {
37718
+ const content = asPartialObject(value) ?? {};
37719
+ const selection = resolveEventSelection(content.eventSelection, content.selectedEventSeriesIds);
37720
+ if (selection.kind === "selected") return key === "seriesIds" ? selection.seriesIds : void 0;
37721
+ return key === "seriesIds" ? void 0 : content[key];
37722
+ }
37723
+ },
37507
37724
  {
37508
37725
  id: "events.calendarReadEnabled",
37509
37726
  kind: "formatter",
@@ -37770,11 +37987,14 @@ const sdkSiteStyleConfigSchema = z.object({
37770
37987
  sectionOptions: sdkSectionOptionsConfigSchema.optional(),
37771
37988
  containerOptions: sdkContainerOptionsConfigSchema.optional()
37772
37989
  });
37773
- const sdkSiteLayoutConfigSchema = z.object({ footerBlocks: z.array(z.object({
37774
- id: z.string().min(1).optional(),
37775
- kind: z.string().min(1),
37776
- content: z.record(z.string(), z.unknown()).optional()
37777
- })).optional() });
37990
+ const sdkSiteLayoutConfigSchema = z.object({
37991
+ footerMode: footerModeSchema.optional(),
37992
+ footerBlocks: z.array(z.object({
37993
+ id: z.string().min(1).optional(),
37994
+ kind: z.string().min(1),
37995
+ content: z.record(z.string(), z.unknown()).optional()
37996
+ })).optional()
37997
+ });
37778
37998
  const sdkFieldSelectOptionSchema = z.object({
37779
37999
  value: z.string(),
37780
38000
  label: z.string()
@@ -39684,7 +39904,10 @@ const layoutFooterBlockSchema = z.object({
39684
39904
  kind: layoutBlockKindSchema,
39685
39905
  content: z.record(z.string(), z.unknown()).optional()
39686
39906
  }).strict();
39687
- const layoutConfigSchema = z.object({ footerBlocks: z.array(layoutFooterBlockSchema).optional() }).strict();
39907
+ const layoutConfigSchema = z.object({
39908
+ footerMode: footerModeSchema.optional(),
39909
+ footerBlocks: z.array(layoutFooterBlockSchema).optional()
39910
+ }).strict();
39688
39911
  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" });
39689
39912
  const sdkWorkflowEndpointSchema = z.string().min(1).max(500).regex(SDK_WORKFLOW_ENDPOINT_PATTERN, { message: "Workflow endpoint must be a site-relative path starting with \"/\"" });
39690
39913
  const sdkWorkflowTriggerSchema = z.discriminatedUnion("type", [z.object({ type: z.literal("manual") }).strict()]);