@riverbankcms/sdk 0.140.0 → 0.141.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 (112) hide show
  1. package/dist/{PreviewEditorSidebar-CUyTzd5z.mjs → PreviewEditorSidebar-Q-fy9GYw.mjs} +3 -3
  2. package/dist/{PreviewEditorUI-Agkw4v5i.mjs → PreviewEditorUI-LYGzgk85.mjs} +2 -2
  3. package/dist/{SdkPreviewModeRuntime-DdbeAdS8.mjs → SdkPreviewModeRuntime-CoPYI5Jq.mjs} +72 -46
  4. package/dist/{SiteChromeCustomizeContext-CqGOz-Kv.mjs → SiteChromeCustomizeContext-D8LePX8x.mjs} +681 -196
  5. package/dist/_dts/api/src/contentRuntime.d.ts +12 -31
  6. package/dist/_dts/api/src/domainConnection.d.ts +4 -0
  7. package/dist/_dts/api/src/footerCompositionContracts.d.ts +25 -0
  8. package/dist/_dts/api/src/index.d.ts +1 -1
  9. package/dist/_dts/api/src/launchReadiness.d.ts +1 -0
  10. package/dist/_dts/api/src/navigation/dashboardSiteNav.d.ts +2 -1
  11. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +3 -26
  12. package/dist/_dts/api/src/siteOnboarding.d.ts +7 -0
  13. package/dist/_dts/billing/src/site-arrangements.d.ts +12 -3
  14. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -0
  15. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +2 -0
  16. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +2 -0
  17. package/dist/_dts/blocks/src/system/blocks/events/eventSelectionFields.d.ts +122 -0
  18. package/dist/_dts/blocks/src/system/blocks/events/shared/calendarWindow.d.ts +2 -1
  19. package/dist/_dts/blocks/src/system/blocks/events/shared/eventSelection.d.ts +11 -0
  20. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +2 -2
  21. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +47 -47
  22. package/dist/_dts/blocks/src/system/data/prefetchBlockData.d.ts +5 -0
  23. package/dist/_dts/blocks/src/system/data/utils.d.ts +1 -1
  24. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +27 -1
  25. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +12 -180
  26. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +6 -90
  27. package/dist/_dts/blocks/src/system/runtime/hooks/useEventFilters.d.ts +2 -1
  28. package/dist/_dts/blocks/src/system/runtime/nodes/appointment-services.d.ts +5 -1
  29. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.d.ts +4 -0
  30. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.state.d.ts +5 -0
  31. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.d.ts +3 -0
  32. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.state.d.ts +10 -3
  33. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventCheckoutHandoffRestore.d.ts +9 -0
  34. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +4 -5
  35. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useSettledCommerceView.d.ts +37 -0
  36. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +4 -3
  37. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +3 -0
  38. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +11 -101
  39. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +7 -2
  40. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/listOptions.d.ts +2 -0
  41. package/dist/_dts/blocks/src/system/transforms/registry/eventCalendar.d.ts +12 -0
  42. package/dist/_dts/commerce/src/purchase/bookingInstalmentSchedule.d.ts +4 -0
  43. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +3 -0
  44. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/loaders.d.ts +27 -1
  45. package/dist/_dts/sdk/src/public-api/contracts.d.ts +1 -1
  46. package/dist/_dts/sdk/src/version.d.ts +1 -1
  47. package/dist/_dts/theme-core/src/ThemeFontLoader.d.ts +17 -1
  48. package/dist/_dts/theme-core/src/buttons/affordanceSuppression.d.ts +17 -0
  49. package/dist/_dts/theme-core/src/buttons/buttonColourContract.d.ts +1 -1
  50. package/dist/_dts/theme-core/src/buttons/classNames.d.ts +16 -0
  51. package/dist/_dts/theme-core/src/buttons/generateButtonCss.d.ts +0 -6
  52. package/dist/_dts/theme-core/src/buttons/resolvedButtonCss.d.ts +4 -4
  53. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  54. package/dist/_dts/theme-core/src/hosted-booking-appearance.d.ts +54 -12
  55. package/dist/_dts/theme-core/src/index.d.ts +1 -1
  56. package/dist/client/{BookingConsentAgreement-CuKa82V4.mjs → BookingConsentAgreement-xJeYNdnb.mjs} +2 -2
  57. package/dist/client/{DiscountCodeDisclosure-BbYieKWB.mjs → DiscountCodeDisclosure-DdT6uzl9.mjs} +1 -1
  58. package/dist/client/{EventCombined.client-LTfR1Aby.mjs → EventCombined.client-Cp28uYuM.mjs} +11 -15
  59. package/dist/client/{EventListing.client-DUHpYSuo.mjs → EventListing.client-CD6AJsMr.mjs} +4 -17
  60. package/dist/client/{LeafletStaticMap-CHRupL6m.mjs → LeafletStaticMap-DBsAi9-e.mjs} +1 -1
  61. package/dist/client/{accordion-6HiIFxNL.mjs → accordion-6dwbOKYR.mjs} +1 -1
  62. package/dist/client/{bookingForm-Dlmid43H.mjs → bookingForm-CZE9_qPQ.mjs} +5 -5
  63. package/dist/client/bookings.mjs +175 -93
  64. package/dist/client/{carousel-DmkZRRq_.mjs → carousel-7VHGQARz.mjs} +1 -1
  65. package/dist/client/{cart-CIC24330.mjs → cart-Qg_mvQhh.mjs} +3 -3
  66. package/dist/client/{checkout-D1Zw9imo.mjs → checkout-D84rpgdr.mjs} +3 -3
  67. package/dist/client/client.mjs +602 -139
  68. package/dist/client/{context-Cy1OayHx.mjs → context-Ctp3T0Wr.mjs} +1 -1
  69. package/dist/client/{dates-aDcfoLHr.mjs → dates-DJKFcI_N.mjs} +2 -2
  70. package/dist/client/{eventCalendar-FQxMPAjf.mjs → eventCalendar-CK31z3vs.mjs} +11 -7
  71. package/dist/client/{eventCombined-Dr3ac6Hb.mjs → eventCombined-DiXd-ewn.mjs} +3 -3
  72. package/dist/client/{eventDetails-D-AzUHFQ.mjs → eventDetails-CTRgt2DK.mjs} +4 -4
  73. package/dist/client/{eventListing-B3XxBf3i.mjs → eventListing-Dy9vi_j_.mjs} +3 -3
  74. package/dist/client/{eventRegistration-I6EaokFD.mjs → eventRegistration-CnalYMr2.mjs} +124 -31
  75. package/dist/client/{form-BbWckVWY.mjs → form-eUiMveTT.mjs} +2 -2
  76. package/dist/client/{headerSection-C9qU4Y7x.mjs → headerSection-Dy9kQpB1.mjs} +2 -2
  77. package/dist/client/hooks.mjs +247 -32
  78. package/dist/client/{locationMap-CLCShvlG.mjs → locationMap-DalCmWU0.mjs} +2 -2
  79. package/dist/client/{newsletterForm-Briukxzi.mjs → newsletterForm-SDDPvhS0.mjs} +23 -10
  80. package/dist/client/{pricing-Copadu-2.mjs → pricing-OcMz4SnX.mjs} +1 -1
  81. package/dist/client/{productDetail-oujlRd-r.mjs → productDetail-BQrgHElM.mjs} +3 -3
  82. package/dist/client/{productList-BRiIRUcd.mjs → productList-OnPn_UJj.mjs} +3 -3
  83. package/dist/client/{propsDecoder-CB2KS_ko.mjs → propsDecoder-zBdsnS-N.mjs} +38 -8
  84. package/dist/client/rendering/client.mjs +446 -121
  85. package/dist/client/rendering/islands.mjs +17 -17
  86. package/dist/client/rendering.mjs +601 -138
  87. package/dist/client/{scrollToBlock-B1IS1_ua.mjs → scrollToBlock-BNM4Ob2Y.mjs} +28 -11
  88. package/dist/client/{shop-Vn6yNFED.mjs → shop-Bv1fPTwQ.mjs} +6 -6
  89. package/dist/client/{shop-commerce-BVTqipYp.mjs → shop-commerce-D4KNGaW8.mjs} +5 -5
  90. package/dist/client/{shop-commerce-store-BVnJVy7v.mjs → shop-commerce-store-2N5EV0Rc.mjs} +1 -1
  91. package/dist/client/{shopShared-COIeK77T.mjs → shopShared-DvJGdHTV.mjs} +3 -3
  92. package/dist/client/{useEventFilters-DzIUcS9n.mjs → useEventFilters-BBBvGDHQ.mjs} +17 -11
  93. package/dist/preview-next/client/runtime.mjs +3 -3
  94. package/dist/preview-next/editor-chrome.css +4 -8
  95. package/dist/{sdk-runtime-CnCLvZRv.mjs → sdk-runtime-Defnbfzw.mjs} +1 -1
  96. package/dist/{separator-DKDRJ1oH.mjs → separator-CZXO3Sb0.mjs} +1 -1
  97. package/dist/server/components.mjs +384 -62
  98. package/dist/server/config-validation.mjs +232 -26
  99. package/dist/server/config.mjs +232 -26
  100. package/dist/server/data.mjs +247 -32
  101. package/dist/server/index.mjs +1 -1
  102. package/dist/server/next.mjs +400 -69
  103. package/dist/server/page-converter.mjs +189 -25
  104. package/dist/server/prebuild.mjs +1 -1
  105. package/dist/server/rendering/server.mjs +399 -68
  106. package/dist/server/rendering.mjs +399 -68
  107. package/dist/server/routing.mjs +261 -33
  108. package/dist/server/server.mjs +248 -33
  109. package/dist/server/theme-bridge.mjs +47 -15
  110. package/dist/server/theme.mjs +1 -1
  111. package/dist/styles/index.css +28 -2
  112. package/package.json +1 -1
@@ -2524,7 +2524,7 @@ const BUTTON_CONTRAST_POLICY = {
2524
2524
  nonTextMinimumRatio: 3,
2525
2525
  gradientSamplesPerSegment: 20,
2526
2526
  alphaBackgrounds: "reject-without-known-surface",
2527
- disabled: "retain-full-colour-contract"
2527
+ disabled: "validated-colour-pair-with-muted-control-opacity"
2528
2528
  };
2529
2529
  function validateButtonSurfaceContrast(input) {
2530
2530
  const ratio = contrastRatio(input.buttonPaint, input.surfaceHex);
@@ -8349,6 +8349,7 @@ const calendarWindowQuerySchema = z.object({
8349
8349
  eventSurface: z.enum(eventSurfaceScopeValues).optional(),
8350
8350
  eventPresets: z.string().optional(),
8351
8351
  scheduleScope: z.enum(eventScheduleScopeValues).optional(),
8352
+ seriesIds: z.string().optional(),
8352
8353
  categoryIds: z.string().optional(),
8353
8354
  venueId: z.string().transform(normalizeCalendarFilterId).optional(),
8354
8355
  staffMemberId: z.string().transform(normalizeCalendarFilterId).optional()
@@ -17016,6 +17017,7 @@ function isDisplayMediaKind(kind) {
17016
17017
  }
17017
17018
  const siteOptionSources = [
17018
17019
  "eventCategories",
17020
+ "eventSeries",
17019
17021
  "venues",
17020
17022
  "staffMembers"
17021
17023
  ];
@@ -29712,7 +29714,8 @@ const appointmentServicesBlockDefinition = {
29712
29714
  el("appointment-services", {
29713
29715
  sectionHeading: { $bind: { from: "content.heading" } },
29714
29716
  services: { $bind: { from: "data.services" } },
29715
- pathname: { $bind: { from: "$root.pathname" } }
29717
+ pathname: { $bind: { from: "$root.pathname" } },
29718
+ servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
29716
29719
  })
29717
29720
  ], { gap: "lg" })
29718
29721
  })]
@@ -31253,6 +31256,35 @@ const eventSpotlightBlockDefinition = {
31253
31256
  } }
31254
31257
  };
31255
31258
  //#endregion
31259
+ //#region ../blocks/src/system/blocks/events/shared/eventSelection.ts
31260
+ /** Invalid saved selections fail closed rather than widening discovery. */
31261
+ function resolveEventSelection(mode, value) {
31262
+ if (mode !== "selected") return { kind: "matching" };
31263
+ const candidates = Array.isArray(value) ? value : typeof value === "string" ? value.split(",").filter(Boolean) : [];
31264
+ const ids = [];
31265
+ for (const candidate of candidates) {
31266
+ if (typeof candidate !== "string") return {
31267
+ kind: "selected",
31268
+ seriesIds: []
31269
+ };
31270
+ const parsed = parseEventSeriesId(candidate.trim());
31271
+ if (!parsed.ok) return {
31272
+ kind: "selected",
31273
+ seriesIds: []
31274
+ };
31275
+ ids.push(parsed.value);
31276
+ }
31277
+ return {
31278
+ kind: "selected",
31279
+ seriesIds: [...new Set(ids)].sort()
31280
+ };
31281
+ }
31282
+ /** Undefined means discovery; an empty string is an explicitly empty selection. */
31283
+ function eventSeriesScopeCsv(value) {
31284
+ if (value == null) return void 0;
31285
+ return typeof value === "string" ? value : value.join(",");
31286
+ }
31287
+ //#endregion
31256
31288
  //#region ../blocks/src/system/runtime/nodes/events/shared/listingLayout.ts
31257
31289
  /**
31258
31290
  * Layout classes for event listing containers and cards. Presentation
@@ -31352,6 +31384,7 @@ const eventCollectionFilterSourceSchemaShape = {
31352
31384
  eventSurface: eventSurfaceScopeSchema$1.nullable().optional(),
31353
31385
  filterEventPresets: z.union([z.string(), z.array(z.string())]).nullable().optional(),
31354
31386
  scheduleScope: eventScheduleScopeSchema$1.nullable().optional(),
31387
+ seriesIds: z.union([z.string(), z.array(z.string())]).nullable().optional(),
31355
31388
  filterCategoryIds: z.union([z.string(), z.array(z.string())]).nullable().optional(),
31356
31389
  filterStaffMemberId: z.string().nullable().optional(),
31357
31390
  filterVenueId: z.string().nullable().optional()
@@ -31398,6 +31431,7 @@ const eventCollectionDisplaySchemaShape = {
31398
31431
  eventSurface: eventSurfaceScopeSchema$1,
31399
31432
  filterEventPresets: z.string().nullable(),
31400
31433
  scheduleScope: eventScheduleScopeSchema$1,
31434
+ seriesIds: z.string().nullable().optional(),
31401
31435
  filterCategoryIds: z.string().nullable(),
31402
31436
  filterStaffMemberId: z.string().nullable(),
31403
31437
  filterVenueId: z.string().nullable(),
@@ -31445,11 +31479,15 @@ function buildEventCollectionDisplay(source) {
31445
31479
  };
31446
31480
  }
31447
31481
  function buildEventCollectionFilterDisplay(source) {
31448
- return {
31449
- showFilters: source.showFilters ?? true,
31450
- showCategoryFilter: source.showCategoryFilter ?? "auto",
31451
- showVenueFilter: source.showVenueFilter ?? false,
31452
- showStaffFilter: source.showStaffFilter ?? true,
31482
+ const selected = source.seriesIds != null;
31483
+ const matchingFilters = selected ? {
31484
+ eventSurface: "all",
31485
+ filterEventPresets: null,
31486
+ scheduleScope: "any",
31487
+ filterCategoryIds: null,
31488
+ filterStaffMemberId: null,
31489
+ filterVenueId: null
31490
+ } : {
31453
31491
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
31454
31492
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
31455
31493
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
@@ -31457,6 +31495,14 @@ function buildEventCollectionFilterDisplay(source) {
31457
31495
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
31458
31496
  filterVenueId: normalizeEventVenueId(source.filterVenueId)
31459
31497
  };
31498
+ return {
31499
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
31500
+ showFilters: selected ? false : source.showFilters ?? true,
31501
+ showCategoryFilter: source.showCategoryFilter ?? "auto",
31502
+ showVenueFilter: source.showVenueFilter ?? false,
31503
+ showStaffFilter: source.showStaffFilter ?? true,
31504
+ ...matchingFilters
31505
+ };
31460
31506
  }
31461
31507
  function buildEventCollectionPresentationDisplay(source) {
31462
31508
  return {
@@ -31471,14 +31517,15 @@ function buildEventCollectionPresentationDisplay(source) {
31471
31517
  }
31472
31518
  function buildEventCollectionHydration(source, now = /* @__PURE__ */ new Date()) {
31473
31519
  const timeZone = source.calendarWindow?.scope.timeZone ?? toBookingTimeZone(source.bookingTimeZone);
31520
+ const selected = source.seriesIds != null;
31474
31521
  return {
31475
31522
  calendarWindow: source.calendarWindow ?? void 0,
31476
31523
  siteId: source.siteId,
31477
31524
  stage: source.stage,
31478
31525
  prefetchedEvents: source.events != null,
31479
- eventSurface: normalizeEventSurfaceScope(source.eventSurface),
31480
- filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
31481
- scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
31526
+ eventSurface: selected ? "all" : normalizeEventSurfaceScope(source.eventSurface),
31527
+ filterEventPresets: selected ? null : normalizeEventSurfacePresetsCsv(source.filterEventPresets),
31528
+ scheduleScope: selected ? "any" : normalizeEventScheduleScope(source.scheduleScope),
31482
31529
  calendarContext: {
31483
31530
  timeZone,
31484
31531
  initialToday: source.calendarWindow?.initialToday ?? getLocalScheduleDate(now, timeZone)
@@ -31544,6 +31591,7 @@ const eventListingHydrationSchema = z.object({
31544
31591
  eventSurface: eventSurfaceScopeSchema,
31545
31592
  filterEventPresets: z.string().nullable(),
31546
31593
  scheduleScope: eventScheduleScopeSchema,
31594
+ seriesIds: z.string().nullable().optional(),
31547
31595
  filterCategoryIds: z.string().nullable().optional(),
31548
31596
  filterStaffMemberId: z.string().nullable().optional(),
31549
31597
  filterVenueId: z.string().nullable().optional(),
@@ -31604,6 +31652,7 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
31604
31652
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
31605
31653
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
31606
31654
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
31655
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
31607
31656
  filterCategoryIds: normalizeEventCategoryIdsCsv(source.filterCategoryIds),
31608
31657
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
31609
31658
  filterVenueId: normalizeEventVenueId(source.filterVenueId),
@@ -31977,6 +32026,65 @@ const eventListingBlockDefinition = {
31977
32026
  } }
31978
32027
  };
31979
32028
  //#endregion
32029
+ //#region ../blocks/src/system/blocks/events/eventSelectionFields.ts
32030
+ const eventSelectionFields = [{
32031
+ id: "eventSelection",
32032
+ type: "select",
32033
+ label: "Events to show",
32034
+ required: false,
32035
+ multiple: false,
32036
+ defaultValue: "matching",
32037
+ options: [{
32038
+ value: "matching",
32039
+ label: "All matching events"
32040
+ }, {
32041
+ value: "selected",
32042
+ label: "Selected events"
32043
+ }],
32044
+ ui: { intent: "behavior" }
32045
+ }, createSiteOptionSelectField({
32046
+ id: "selectedEventSeriesIds",
32047
+ label: "Selected events",
32048
+ description: "Show upcoming dates for these events. Other event filters do not apply.",
32049
+ required: false,
32050
+ multiple: true,
32051
+ defaultValue: [],
32052
+ optionSource: "eventSeries",
32053
+ ui: {
32054
+ intent: "behavior",
32055
+ searchThreshold: 1,
32056
+ visibleWhen: {
32057
+ field: "eventSelection",
32058
+ equals: "selected"
32059
+ }
32060
+ }
32061
+ })];
32062
+ function withEventSelectionVisibility(field) {
32063
+ if (![
32064
+ "eventSurface",
32065
+ "filterEventPresets",
32066
+ "scheduleScope",
32067
+ "filterCategoryIds",
32068
+ "filterStaffMemberId",
32069
+ "filterVenueId",
32070
+ "showFilters",
32071
+ "showCategoryFilter",
32072
+ "showVenueFilter",
32073
+ "showStaffFilter"
32074
+ ].includes(field.id)) return field;
32075
+ const visibleWhen = field.ui?.visibleWhen;
32076
+ return {
32077
+ ...field,
32078
+ ui: {
32079
+ ...field.ui,
32080
+ visibleWhen: { allOf: [{
32081
+ field: "eventSelection",
32082
+ notEquals: "selected"
32083
+ }, ...visibleWhen ? [visibleWhen] : []] }
32084
+ }
32085
+ };
32086
+ }
32087
+ //#endregion
31980
32088
  //#region ../blocks/src/system/runtime/nodes/events/EventCalendar.interactive.ts
31981
32089
  const eventCalendarSourceSchema = z.object({
31982
32090
  ...eventCollectionSourceSchemaShape,
@@ -32059,19 +32167,59 @@ const eventCalendarBlockRuntime = defineProgressiveBlockRuntime({
32059
32167
  //#region ../blocks/src/system/blocks/events/eventCalendarDataLoaders.ts
32060
32168
  const scopeParams = {
32061
32169
  siteId: { $bind: { from: "$root.siteId" } },
32170
+ seriesIds: { $bind: {
32171
+ from: "content",
32172
+ transforms: [{
32173
+ id: "events.calendarSelectionParam",
32174
+ options: { key: "seriesIds" }
32175
+ }]
32176
+ } },
32062
32177
  stage: { $bind: {
32063
32178
  from: "$root.previewStage",
32064
32179
  fallback: "published"
32065
32180
  } },
32066
- eventSurface: { $bind: { from: "content.eventSurface" } },
32181
+ eventSurface: { $bind: {
32182
+ from: "content",
32183
+ transforms: [{
32184
+ id: "events.calendarSelectionParam",
32185
+ options: { key: "eventSurface" }
32186
+ }, { id: "value.csv" }]
32187
+ } },
32067
32188
  eventPresets: { $bind: {
32068
- from: "content.filterEventPresets",
32069
- transforms: [{ id: "value.csv" }]
32189
+ from: "content",
32190
+ transforms: [{
32191
+ id: "events.calendarSelectionParam",
32192
+ options: { key: "filterEventPresets" }
32193
+ }, { id: "value.csv" }]
32194
+ } },
32195
+ scheduleScope: { $bind: {
32196
+ from: "content",
32197
+ transforms: [{
32198
+ id: "events.calendarSelectionParam",
32199
+ options: { key: "scheduleScope" }
32200
+ }, { id: "value.csv" }]
32201
+ } },
32202
+ categoryIds: { $bind: {
32203
+ from: "content",
32204
+ transforms: [{
32205
+ id: "events.calendarSelectionParam",
32206
+ options: { key: "filterCategoryIds" }
32207
+ }, { id: "value.csv" }]
32070
32208
  } },
32071
- scheduleScope: { $bind: { from: "content.scheduleScope" } },
32072
- categoryIds: { $bind: { from: "content.filterCategoryIds" } },
32073
- staffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
32074
- venueId: { $bind: { from: "content.filterVenueId" } }
32209
+ staffMemberId: { $bind: {
32210
+ from: "content",
32211
+ transforms: [{
32212
+ id: "events.calendarSelectionParam",
32213
+ options: { key: "filterStaffMemberId" }
32214
+ }, { id: "value.csv" }]
32215
+ } },
32216
+ venueId: { $bind: {
32217
+ from: "content",
32218
+ transforms: [{
32219
+ id: "events.calendarSelectionParam",
32220
+ options: { key: "filterVenueId" }
32221
+ }, { id: "value.csv" }]
32222
+ } }
32075
32223
  };
32076
32224
  /** Combined renders two jobs; calendar-only variants never pay for the list seed. */
32077
32225
  const eventCalendarDataLoaders = {
@@ -32201,6 +32349,13 @@ const eventCalendarLayout = [styledSection({
32201
32349
  from: "content.defaultCalendarView",
32202
32350
  fallback: "month"
32203
32351
  } },
32352
+ seriesIds: { $bind: {
32353
+ from: "content",
32354
+ transforms: [{
32355
+ id: "events.calendarSelectionParam",
32356
+ options: { key: "seriesIds" }
32357
+ }]
32358
+ } },
32204
32359
  showFilters: { $bind: {
32205
32360
  from: "content.showFilters",
32206
32361
  fallback: true
@@ -32222,17 +32377,47 @@ const eventCalendarLayout = [styledSection({
32222
32377
  fallback: true
32223
32378
  } },
32224
32379
  eventSurface: { $bind: {
32225
- from: "content.eventSurface",
32226
- fallback: "all"
32380
+ from: "content",
32381
+ transforms: [{
32382
+ id: "events.calendarSelectionParam",
32383
+ options: { key: "eventSurface" }
32384
+ }]
32385
+ } },
32386
+ filterEventPresets: { $bind: {
32387
+ from: "content",
32388
+ transforms: [{
32389
+ id: "events.calendarSelectionParam",
32390
+ options: { key: "filterEventPresets" }
32391
+ }]
32227
32392
  } },
32228
- filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
32229
32393
  scheduleScope: { $bind: {
32230
- from: "content.scheduleScope",
32231
- fallback: "any"
32394
+ from: "content",
32395
+ transforms: [{
32396
+ id: "events.calendarSelectionParam",
32397
+ options: { key: "scheduleScope" }
32398
+ }]
32399
+ } },
32400
+ filterCategoryIds: { $bind: {
32401
+ from: "content",
32402
+ transforms: [{
32403
+ id: "events.calendarSelectionParam",
32404
+ options: { key: "filterCategoryIds" }
32405
+ }]
32406
+ } },
32407
+ filterStaffMemberId: { $bind: {
32408
+ from: "content",
32409
+ transforms: [{
32410
+ id: "events.calendarSelectionParam",
32411
+ options: { key: "filterStaffMemberId" }
32412
+ }]
32413
+ } },
32414
+ filterVenueId: { $bind: {
32415
+ from: "content",
32416
+ transforms: [{
32417
+ id: "events.calendarSelectionParam",
32418
+ options: { key: "filterVenueId" }
32419
+ }]
32232
32420
  } },
32233
- filterCategoryIds: { $bind: { from: "content.filterCategoryIds" } },
32234
- filterStaffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
32235
- filterVenueId: { $bind: { from: "content.filterVenueId" } },
32236
32421
  cardRole: { $bind: {
32237
32422
  from: "content._cardStyles.role",
32238
32423
  fallback: "default"
@@ -32736,6 +32921,7 @@ const eventCalendarAdditionalFields = [
32736
32921
  }
32737
32922
  }
32738
32923
  },
32924
+ ...eventSelectionFields,
32739
32925
  {
32740
32926
  id: "eventSurface",
32741
32927
  type: "select",
@@ -32945,7 +33131,7 @@ const eventCalendarBlockDefinition = {
32945
33131
  titleSource: "heading",
32946
33132
  description: "Display events with calendar, list, or combined views with filtering",
32947
33133
  skipSectionStyles: true,
32948
- additionalFields: eventCalendarAdditionalFields,
33134
+ additionalFields: eventCalendarAdditionalFields.map(withEventSelectionVisibility),
32949
33135
  styleTokens: {
32950
33136
  background: "surface",
32951
33137
  typography: "body",
@@ -39604,6 +39790,26 @@ const linksTransforms = [{
39604
39790
  }
39605
39791
  }];
39606
39792
  const defaultTransforms = createTransformRegistry([
39793
+ {
39794
+ id: "events.calendarSelectionParam",
39795
+ kind: "formatter",
39796
+ summary: "Resolve selected events instead of discovery filters",
39797
+ schema: z.object({ key: z.enum([
39798
+ "seriesIds",
39799
+ "eventSurface",
39800
+ "filterEventPresets",
39801
+ "scheduleScope",
39802
+ "filterCategoryIds",
39803
+ "filterStaffMemberId",
39804
+ "filterVenueId"
39805
+ ]) }),
39806
+ run(value, { key }) {
39807
+ const content = asPartialObject(value) ?? {};
39808
+ const selection = resolveEventSelection(content.eventSelection, content.selectedEventSeriesIds);
39809
+ if (selection.kind === "selected") return key === "seriesIds" ? selection.seriesIds : void 0;
39810
+ return key === "seriesIds" ? void 0 : content[key];
39811
+ }
39812
+ },
39607
39813
  {
39608
39814
  id: "events.calendarReadEnabled",
39609
39815
  kind: "formatter",
@@ -39918,12 +40124,12 @@ function normalizeContent(block) {
39918
40124
  }
39919
40125
  /**
39920
40126
  * Normalize params for API calls.
39921
- * Converts all values to strings.
40127
+ * Converts supplied values to strings, preserving absent versus explicitly empty params.
39922
40128
  */
39923
40129
  function normalizeParams(input) {
39924
40130
  if (!input || typeof input !== "object") return {};
39925
40131
  const output = {};
39926
- for (const [key, value] of Object.entries(input)) output[key] = coerceToString(value);
40132
+ for (const [key, value] of Object.entries(input)) if (value !== void 0 && value !== null) output[key] = coerceToString(value);
39927
40133
  return output;
39928
40134
  }
39929
40135
  function isNonArrayObject(value) {
@@ -39987,6 +40193,14 @@ function coercePayload(payload) {
39987
40193
  * - Frontend: provide internal API client
39988
40194
  * - SDK: provide SDK client with endpoint mapping
39989
40195
  */
40196
+ function projectDataLoaders(loaders, shouldLoad, blockId, blockKind) {
40197
+ if (!shouldLoad) return [...loaders];
40198
+ return loaders.filter(({ key }) => shouldLoad({
40199
+ blockId,
40200
+ blockKind,
40201
+ loaderKey: key
40202
+ }));
40203
+ }
39990
40204
  function shouldSkipResolvedLoader(input) {
39991
40205
  if (input.loader.requiredParams?.some((param) => !input.params[param]?.trim())) return true;
39992
40206
  return Boolean(input.isValidEndpoint && !input.isValidEndpoint(input.endpoint));
@@ -40015,7 +40229,7 @@ async function prefetchBlockData$1(page, context, options) {
40015
40229
  return (await prefetchBlockDataWithFailures(page, context, options)).resolvedData;
40016
40230
  }
40017
40231
  async function prefetchBlockDataWithFailures(page, context, options) {
40018
- const { apiClient, isValidEndpoint, onError, getCustomBlockLoaders, getBlockDefinition: getBlockDefinition$1 = getBlockDefinition, resolveParamsBindings: resolveParamsBindings$1 = resolveParamsBindings } = options;
40232
+ const { apiClient, isValidEndpoint, onError, getCustomBlockLoaders, getBlockDefinition: getBlockDefinition$1 = getBlockDefinition, resolveParamsBindings: resolveParamsBindings$1 = resolveParamsBindings, shouldLoad } = options;
40019
40233
  const results = {};
40020
40234
  const loaderFailures = {};
40021
40235
  const tasks = [];
@@ -40032,6 +40246,7 @@ async function prefetchBlockDataWithFailures(page, context, options) {
40032
40246
  loader
40033
40247
  })) : [];
40034
40248
  } else loaders = [];
40249
+ loaders = projectDataLoaders(loaders, shouldLoad, blockId, block.kind);
40035
40250
  if (loaders.length === 0) continue;
40036
40251
  const root = {
40037
40252
  ...context.root ?? {},
@@ -40110,8 +40325,8 @@ function toStringParams(value) {
40110
40325
  for (const [k, v] of Object.entries(value)) if (typeof v === "string") out[k] = v;
40111
40326
  return out;
40112
40327
  }
40113
- function stripEmptyStringValues(params) {
40114
- for (const [key, value] of Object.entries(params)) if (value === "") delete params[key];
40328
+ function stripEmptyStringValues(params, endpoint) {
40329
+ for (const [key, value] of Object.entries(params)) if (value === "" && !(key === "seriesIds" && (endpoint === "listPublicEvents" || endpoint === "listPublicEventCalendarWindow"))) delete params[key];
40115
40330
  }
40116
40331
  function ensureSiteId(params, context) {
40117
40332
  if (!params.siteId && typeof context.siteId === "string" && context.siteId) params.siteId = context.siteId;
@@ -40124,7 +40339,7 @@ function ensureSiteId(params, context) {
40124
40339
  */
40125
40340
  function normalizeLoaderParams(endpoint, params, context) {
40126
40341
  const out = toStringParams(params);
40127
- stripEmptyStringValues(out);
40342
+ stripEmptyStringValues(out, endpoint);
40128
40343
  if (endpoint === "getPublicFormById") {
40129
40344
  ensureSiteId(out, context);
40130
40345
  if (!out.formId && out.formSlug) {
@@ -1,7 +1,7 @@
1
1
  import { i as textColorStyle } from "./colorStyles-3013aRAY.mjs";
2
- import { dt as themeButtonClassName, t as defineIslandPropsDecoder } from "./propsDecoder-CB2KS_ko.mjs";
2
+ import { dt as themeButtonClassName, t as defineIslandPropsDecoder } from "./propsDecoder-zBdsnS-N.mjs";
3
3
  import { t as mountReactIsland } from "./reactMount-SY8AVRof.mjs";
4
- import { t as LeafletStaticMap } from "./LeafletStaticMap-CHRupL6m.mjs";
4
+ import { t as LeafletStaticMap } from "./LeafletStaticMap-DBsAi9-e.mjs";
5
5
  import "react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  //#region ../core/src/location.ts
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { O as clsx } from "./colorStyles-3013aRAY.mjs";
3
- import { Pt as assertNever, Ut as parseMailingListVisitorSelection, dt as themeButtonClassName, mn as assertNever$1, t as defineIslandPropsDecoder } from "./propsDecoder-CB2KS_ko.mjs";
4
- import { n as useBlockApi, r as BlockApiError, t as BlockApiProvider } from "./context-Cy1OayHx.mjs";
3
+ import { Pt as assertNever, Ut as parseMailingListVisitorSelection, dt as themeButtonClassName, mn as assertNever$1, t as defineIslandPropsDecoder } from "./propsDecoder-zBdsnS-N.mjs";
4
+ import { n as useBlockApi, r as BlockApiError, t as BlockApiProvider } from "./context-Ctp3T0Wr.mjs";
5
5
  import { n as isSpamProtectionEnabled, r as AltchaWidget, t as getChallengeUrl } from "./src-B833rYRr.mjs";
6
6
  import { t as FeedbackMessage } from "./FeedbackMessage-CtLvvS_d.mjs";
7
7
  import { n as getFieldValidationControlProps, t as FieldValidationMessage } from "./FieldValidationMessage-AYanWFb-.mjs";
@@ -145,7 +145,7 @@ function NewsletterFormClient({ render }) {
145
145
  if (submitTarget.tag === "unavailable") {
146
146
  dispatchSubmission({
147
147
  type: "failed",
148
- error: newsletterFormError("Newsletter list is not configured")
148
+ error: newsletterFormError(SIGNUPS_PAUSED_MESSAGE)
149
149
  });
150
150
  return;
151
151
  }
@@ -156,14 +156,16 @@ function NewsletterFormClient({ render }) {
156
156
  });
157
157
  return;
158
158
  }
159
- const visitorSelection = readVisitorSelection(formData, render.hydration);
160
- if (visitorSelection === null) {
159
+ const selection = readVisitorSelection(formData, render.hydration);
160
+ const selectionError = visitorSelectionError(selection);
161
+ if (selectionError) {
161
162
  dispatchSubmission({
162
163
  type: "failed",
163
- error: newsletterFieldError(TOPIC_CHOICE_FIELD_ID, "Choose at least one email topic.")
164
+ error: selectionError
164
165
  });
165
166
  return;
166
167
  }
168
+ const visitorSelection = selection.tag === "chosen" ? selection.value : void 0;
167
169
  dispatchSubmission({ type: "submitted" });
168
170
  try {
169
171
  const result = await api.subscribeNewsletter({
@@ -363,10 +365,18 @@ function transportFailureMessage(err) {
363
365
  }
364
366
  return RETRY_SHORTLY_MESSAGE;
365
367
  }
368
+ function visitorSelectionError(selection) {
369
+ switch (selection.tag) {
370
+ case "nothing_chosen": return newsletterFieldError(TOPIC_CHOICE_FIELD_ID, "Choose at least one email topic.");
371
+ case "unusable": return newsletterFormError(SIGNUPS_PAUSED_MESSAGE);
372
+ case "not_offered":
373
+ case "chosen": return null;
374
+ }
375
+ }
366
376
  function readVisitorSelection(formData, hydration) {
367
- if (hydration.choicePresentation !== "visitor_choice") return void 0;
377
+ if (hydration.choicePresentation !== "visitor_choice") return { tag: "not_offered" };
368
378
  const ids = formData.getAll(TOPIC_CHOICE_FIELD_ID).flatMap((value) => typeof value === "string" ? [value] : []);
369
- if (ids.length === 0) return null;
379
+ if (ids.length === 0) return { tag: "nothing_chosen" };
370
380
  const raw = hydration.choiceProvider === "native" ? {
371
381
  provider: "native",
372
382
  topicIds: ids
@@ -377,9 +387,12 @@ function readVisitorSelection(formData, hydration) {
377
387
  provider: "mailchimp",
378
388
  interestIds: ids
379
389
  } : null;
380
- if (raw === null) return null;
390
+ if (raw === null) return { tag: "unusable" };
381
391
  const parsed = parseMailingListVisitorSelection(raw);
382
- return parsed.ok ? parsed.value : null;
392
+ return parsed.ok ? {
393
+ tag: "chosen",
394
+ value: parsed.value
395
+ } : { tag: "unusable" };
383
396
  }
384
397
  function publicSignupError(outcome) {
385
398
  switch (outcome.tag) {
@@ -1,4 +1,4 @@
1
- import { an as formatEventPricing, cn as publicEventPricingDisplay, in as formatBookingPriceDisplay } from "./propsDecoder-CB2KS_ko.mjs";
1
+ import { an as formatEventPricing, cn as publicEventPricingDisplay, in as formatBookingPriceDisplay } from "./propsDecoder-zBdsnS-N.mjs";
2
2
  //#region ../blocks/src/system/runtime/nodes/events/domain/capacity.ts
3
3
  /**
4
4
  * Compute remaining spots for an event from `availableSpots` with a fallback
@@ -1,6 +1,6 @@
1
- import { t as defineIslandPropsDecoder } from "./propsDecoder-CB2KS_ko.mjs";
2
- import { r as ProductDetailController } from "./shop-commerce-BVTqipYp.mjs";
3
- import { t as mountShopBlockIsland } from "./shopShared-COIeK77T.mjs";
1
+ import { t as defineIslandPropsDecoder } from "./propsDecoder-zBdsnS-N.mjs";
2
+ import { r as ProductDetailController } from "./shop-commerce-D4KNGaW8.mjs";
3
+ import { t as mountShopBlockIsland } from "./shopShared-DvJGdHTV.mjs";
4
4
  import "react";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region ../blocks/src/system/runtime/nodes/product-detail.client.tsx
@@ -1,6 +1,6 @@
1
- import { t as defineIslandPropsDecoder } from "./propsDecoder-CB2KS_ko.mjs";
2
- import { i as ProductListController } from "./shop-commerce-BVTqipYp.mjs";
3
- import { t as mountShopBlockIsland } from "./shopShared-COIeK77T.mjs";
1
+ import { t as defineIslandPropsDecoder } from "./propsDecoder-zBdsnS-N.mjs";
2
+ import { i as ProductListController } from "./shop-commerce-D4KNGaW8.mjs";
3
+ import { t as mountShopBlockIsland } from "./shopShared-DvJGdHTV.mjs";
4
4
  import "react";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region ../blocks/src/system/runtime/nodes/product-list.client.tsx