@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
@@ -1578,30 +1578,30 @@ function parseMailingListPlacementTargeting(value) {
1578
1578
  }
1579
1579
  }
1580
1580
  function parseMailingListVisitorSelection(value) {
1581
- if (!isRecord$37(value)) return visitorSelectionError("shape");
1581
+ if (!isRecord$37(value)) return visitorSelectionError$1("shape");
1582
1582
  switch (value.provider) {
1583
1583
  case "native": {
1584
1584
  const topicIds = parseVisitorIds(value.topicIds, parseNewsletterListId);
1585
- return topicIds === null ? visitorSelectionError("targets") : ok$2({
1585
+ return topicIds === null ? visitorSelectionError$1("targets") : ok$2({
1586
1586
  provider: "native",
1587
1587
  topicIds
1588
1588
  });
1589
1589
  }
1590
1590
  case "brevo": {
1591
1591
  const listIds = parseVisitorIds(value.listIds, parseBrevoListId);
1592
- return listIds === null ? visitorSelectionError("targets") : ok$2({
1592
+ return listIds === null ? visitorSelectionError$1("targets") : ok$2({
1593
1593
  provider: "brevo",
1594
1594
  listIds
1595
1595
  });
1596
1596
  }
1597
1597
  case "mailchimp": {
1598
1598
  const interestIds = parseVisitorIds(value.interestIds, parseMailchimpInterestId);
1599
- return interestIds === null ? visitorSelectionError("targets") : ok$2({
1599
+ return interestIds === null ? visitorSelectionError$1("targets") : ok$2({
1600
1600
  provider: "mailchimp",
1601
1601
  interestIds
1602
1602
  });
1603
1603
  }
1604
- default: return visitorSelectionError("provider");
1604
+ default: return visitorSelectionError$1("provider");
1605
1605
  }
1606
1606
  }
1607
1607
  function parseNativeTargeting(selection) {
@@ -1720,7 +1720,7 @@ function targetingError(field) {
1720
1720
  field
1721
1721
  });
1722
1722
  }
1723
- function visitorSelectionError(field) {
1723
+ function visitorSelectionError$1(field) {
1724
1724
  return err$2({
1725
1725
  tag: "invalid_mailing_list_visitor_selection",
1726
1726
  field
@@ -3503,7 +3503,10 @@ var init_contentMediaSnapshotAudit = __esmMin((() => {
3503
3503
  init_contentMediaAudit();
3504
3504
  init_contentMediaAuditFieldAdapter();
3505
3505
  init_identifiers();
3506
- })), init_src$1 = __esmMin((() => {
3506
+ }));
3507
+ //#endregion
3508
+ //#region ../media-core/src/index.ts
3509
+ var init_src$1 = __esmMin((() => {
3507
3510
  init_types$15();
3508
3511
  init_fileDomain();
3509
3512
  init_fileStorage();
@@ -3554,6 +3557,14 @@ var init_contentMediaSnapshotAudit = __esmMin((() => {
3554
3557
  init_contentMediaAudit();
3555
3558
  init_contentMediaAuditFieldAdapter();
3556
3559
  init_contentMediaSnapshotAudit();
3560
+ }));
3561
+ var footerModeSchema, init_mode = __esmMin((() => {
3562
+ footerModeSchema = z$1.enum([
3563
+ "default",
3564
+ "blocks",
3565
+ "default+blocks",
3566
+ "none"
3567
+ ]);
3557
3568
  })), hotspotSchema, rotationSchema, rectSchema, aspectCropSchema, transformSchema, mediaPosterSchema, mediaBaseSchema, mediaIdentifierSchema, imageMediaSchema, videoMediaSchema, audioMediaSchema, documentMediaSchema, spreadsheetMediaSchema, archiveMediaSchema, mediaSchema, persistableMediaBaseSchema;
3558
3569
  var init_media$2 = __esmMin((() => {
3559
3570
  hotspotSchema = z$1.object({
@@ -5078,7 +5089,7 @@ var init_buttonColourContract = __esmMin((() => {
5078
5089
  nonTextMinimumRatio: 3,
5079
5090
  gradientSamplesPerSegment: 20,
5080
5091
  alphaBackgrounds: "reject-without-known-surface",
5081
- disabled: "retain-full-colour-contract"
5092
+ disabled: "validated-colour-pair-with-muted-control-opacity"
5082
5093
  };
5083
5094
  }));
5084
5095
  //#endregion
@@ -5650,6 +5661,12 @@ var init_parseThemeForPersistence = __esmMin((() => {
5650
5661
  init_types$14();
5651
5662
  }));
5652
5663
  //#endregion
5664
+ //#region ../theme-core/src/buttons/affordanceSuppression.ts
5665
+ var AFFORDANCE_SUPPRESS_CLASS;
5666
+ var init_affordanceSuppression = __esmMin((() => {
5667
+ AFFORDANCE_SUPPRESS_CLASS = "rb-affordance-off";
5668
+ }));
5669
+ //#endregion
5653
5670
  //#region ../theme-core/src/buttons/classNames.ts
5654
5671
  /**
5655
5672
  * Parse content/runtime variant identifiers into the closed theme-button class
@@ -5682,7 +5699,29 @@ function themeButtonClassName(spec) {
5682
5699
  spec.extraClassName
5683
5700
  ].filter(Boolean).join(" ");
5684
5701
  }
5702
+ /**
5703
+ * Button classes for an authored button that renders its own trailing icon.
5704
+ *
5705
+ * A separate function rather than a flag on `themeButtonClassName`, because
5706
+ * there is exactly one caller and it should stay visible in a diff. The name
5707
+ * states what the caller knows to be true of its own markup — that it renders a
5708
+ * trailing icon — rather than what the theme does about it. The consequence is
5709
+ * the theme's to decide and to change; a caller naming the consequence would be
5710
+ * asserting a policy it does not own, and would quietly become a lie the moment
5711
+ * that policy moved.
5712
+ *
5713
+ * Do not reach for this to remove an arrow you simply do not want. A trailing
5714
+ * affordance is declared by the button style, and a block overriding that is the
5715
+ * defect this replaced.
5716
+ */
5717
+ function themeButtonClassNameWithTrailingIcon(spec) {
5718
+ return themeButtonClassName({
5719
+ ...spec,
5720
+ extraClassName: [spec.extraClassName, AFFORDANCE_SUPPRESS_CLASS].filter(Boolean).join(" ")
5721
+ });
5722
+ }
5685
5723
  var init_classNames = __esmMin((() => {
5724
+ init_affordanceSuppression();
5686
5725
  init_types$14();
5687
5726
  }));
5688
5727
  //#endregion
@@ -8222,8 +8261,7 @@ var init_resolvedButtonCss = __esmMin((() => {
8222
8261
  ["cursor", "not-allowed"],
8223
8262
  ["transform", "none"],
8224
8263
  ["box-shadow", "none"],
8225
- ["outline", "2px dashed currentColor"],
8226
- ["outline-offset", "-4px"]
8264
+ ["opacity", "0.55"]
8227
8265
  ];
8228
8266
  }));
8229
8267
  //#endregion
@@ -8561,7 +8599,7 @@ function resolveBoxShadow(variant, global, theme, tokens) {
8561
8599
  const color = shadowConfig.colorToken ? tokens.getColor(shadowConfig.colorToken) : void 0;
8562
8600
  return generateShadowValue$1(shadowConfig.elevation, shadowConfig.softness, shadowConfig.position ?? "bottom", color);
8563
8601
  }
8564
- var AFFORDANCE_SUPPRESS_CLASS, BUTTON_SIZE_NAMES, LETTER_SPACING_MAP, STRUCTURAL_DECLARATIONS;
8602
+ var BUTTON_SIZE_NAMES, LETTER_SPACING_MAP, STRUCTURAL_DECLARATIONS;
8565
8603
  var init_generateButtonCss = __esmMin((() => {
8566
8604
  init_types$14();
8567
8605
  init_classNames();
@@ -8576,7 +8614,7 @@ var init_generateButtonCss = __esmMin((() => {
8576
8614
  init_resolveButtonColourStates();
8577
8615
  init_resolvedButtonCss();
8578
8616
  init_buttonSurfaceContext();
8579
- AFFORDANCE_SUPPRESS_CLASS = "rb-affordance-off";
8617
+ init_affordanceSuppression();
8580
8618
  BUTTON_SIZE_NAMES = buttonSizeNameSchema.options;
8581
8619
  LETTER_SPACING_MAP = {
8582
8620
  tight: "-0.025em",
@@ -11043,14 +11081,12 @@ function generateVariantCSS(variant, themeId, cardClasses, tokens, theme) {
11043
11081
  const shadowValue = generateShadowValue(shadow);
11044
11082
  rules.push(`box-shadow: ${shadowValue}`);
11045
11083
  }
11046
- rules.push(`display: flex`);
11047
- rules.push(`flex-direction: column`);
11048
- rules.push(`position: relative`);
11049
- rules.push(`overflow: visible`);
11084
+ const structureSelector = cardClasses.map((cardClass) => `:where([data-theme-scope="${themeId}"]) :where(.${cardClass})`).join(",\n");
11050
11085
  const mediaRadius = MEDIA_CORNER_MAP[corners];
11051
11086
  const mediaRules = [`border-top-left-radius: ${mediaRadius}`, `border-top-right-radius: ${mediaRadius}`];
11052
11087
  const contentRules = [`padding: ${resolveContentPadding(variant)}`];
11053
11088
  return [
11089
+ `${structureSelector} {\n display: flex;\n flex-direction: column;\n position: relative;\n overflow: visible;\n}`,
11054
11090
  `${containerSelector} {\n ${rules.join(";\n ")};\n}`,
11055
11091
  ...cardDecorationPseudoRules(containerSelectors, variant.decorations, resolveColor),
11056
11092
  `${fallbackBackgroundSelector} {\n background: transparent;\n}`,
@@ -12394,8 +12430,9 @@ var init_boxBackgroundSchema = __esmMin((() => {
12394
12430
  showVideoOnMobile: z$1.boolean().nullable().optional()
12395
12431
  })
12396
12432
  ]);
12397
- })), axesSchema, typographyStyleSchema, bodyTypographyStyleSchema, headingSizeSchema, headingTypographyOverridesSchema, headingTypographyStyleSchema, proseLinkUnderlineStyleSchema, proseLinkUnderlineThicknessSchema, proseLinkUnderlineOffsetSchema, proseLinkStyleSchema, semanticSpacingSchema, boxRoundedSchema, noHeadingDecorationSchema, visibleHeadingDecorationSchema, headingDecorationSchema, headingDecorationOverrideSchema, accordionIconTreatmentSchema, sectionStylesOverrideSchema, containerStylesOverrideSchema, cardBorderOverrideSchema, cardStylesOverrideSchema, blockStyleOverridesSchema, blockThemeOverrideSchema, typographyScaleSchema, eyebrowTypographyStyleSchema, typographySchema, spaceSchema, corners, shadow, border, motion, inputStyle, headerPositioningValues, headerPositioning, headerNavStyle, navFontWeight, headerMaxWidth, headerBorderSchema, logoStyleSchema, headerLogoTextSchema, dropdownStyleSchema, headerCtaGapSchema, headerCtaTreatmentSchema, navContainerSchema, headerBackgroundSchema, headerSchema, footerVariant, footerMaxWidth, footerMode, footerNavLayoutMode, footerNavLayoutAlign, footerSpacing, footerLogoPlacement, footerLogoSize, footerLogoMaxHeight, footerBottomTextLinkStyleSchema, footerBottomBarSchema, footerNavLayoutSchema, footerLogoSchema, footerSchema, containerPaddingPresetSchema, layoutSchema, heroTypographySizeSchema, heroTypographyLineHeightSchema, heroResponsiveTypographySchema, heroTypographySchema, heroSchema, bodyTextIntroTypographySizeSchema, bodyTextSchema, testimonialQuoteTreatmentSchema, themeSchema;
12433
+ })), axesSchema, typographyStyleSchema, bodyTypographyStyleSchema, headingSizeSchema, headingTypographyOverridesSchema, headingTypographyStyleSchema, proseLinkUnderlineStyleSchema, proseLinkUnderlineThicknessSchema, proseLinkUnderlineOffsetSchema, proseLinkStyleSchema, semanticSpacingSchema, boxRoundedSchema, noHeadingDecorationSchema, visibleHeadingDecorationSchema, headingDecorationSchema, headingDecorationOverrideSchema, accordionIconTreatmentSchema, sectionStylesOverrideSchema, containerStylesOverrideSchema, cardBorderOverrideSchema, cardStylesOverrideSchema, blockStyleOverridesSchema, blockThemeOverrideSchema, typographyScaleSchema, eyebrowTypographyStyleSchema, typographySchema, spaceSchema, corners, shadow, border, motion, inputStyle, headerPositioningValues, headerPositioning, headerNavStyle, navFontWeight, headerMaxWidth, headerBorderSchema, logoStyleSchema, headerLogoTextSchema, dropdownStyleSchema, headerCtaGapSchema, headerCtaTreatmentSchema, navContainerSchema, headerBackgroundSchema, headerSchema, footerVariant, footerMaxWidth, footerNavLayoutMode, footerNavLayoutAlign, footerSpacing, footerLogoPlacement, footerLogoSize, footerLogoMaxHeight, footerBottomTextLinkStyleSchema, footerBottomBarSchema, footerNavLayoutSchema, footerLogoSchema, footerSchema, containerPaddingPresetSchema, layoutSchema, heroTypographySizeSchema, heroTypographyLineHeightSchema, heroResponsiveTypographySchema, heroTypographySchema, heroSchema, bodyTextIntroTypographySizeSchema, bodyTextSchema, testimonialQuoteTreatmentSchema, themeSchema;
12398
12434
  var init_schema$2 = __esmMin((() => {
12435
+ init_mode();
12399
12436
  init_media$2();
12400
12437
  init_schema$3();
12401
12438
  init_buttons();
@@ -12894,12 +12931,6 @@ var init_schema$2 = __esmMin((() => {
12894
12931
  "split"
12895
12932
  ]);
12896
12933
  footerMaxWidth = z$1.enum(["container", "full"]);
12897
- footerMode = z$1.enum([
12898
- "default",
12899
- "blocks",
12900
- "default+blocks",
12901
- "none"
12902
- ]);
12903
12934
  footerNavLayoutMode = z$1.enum([
12904
12935
  "stack",
12905
12936
  "inline",
@@ -12988,9 +13019,9 @@ var init_schema$2 = __esmMin((() => {
12988
13019
  /**
12989
13020
  * SDK-only footer rendering mode.
12990
13021
  *
12991
- * Backwards compatible: missing/undefined behaves as 'default'.
13022
+ * Historical persisted field; SDK rendering mode now lives in layout.footerMode.
12992
13023
  */
12993
- mode: footerMode.optional(),
13024
+ mode: footerModeSchema.optional(),
12994
13025
  variant: footerVariant,
12995
13026
  maxWidth: footerMaxWidth,
12996
13027
  showLogoText: z$1.boolean().optional(),
@@ -13580,6 +13611,15 @@ var init_schemas = __esmMin((() => {
13580
13611
  timeZone: z$1.string(),
13581
13612
  pricing: publicEventPricingSchema,
13582
13613
  paymentTerms: blockBookingPaymentTermsSchema,
13614
+ cancellationPolicy: z$1.object({ refunds: z$1.object({
13615
+ mode: z$1.enum([
13616
+ "never",
13617
+ "always",
13618
+ "cutoff"
13619
+ ]),
13620
+ cutoffHours: z$1.number(),
13621
+ method: z$1.enum(["original_payment_method", "site_credit"])
13622
+ }) }),
13583
13623
  consent: blockBookingConsentSchema.nullable(),
13584
13624
  accessRestriction: accessRestrictionSchema,
13585
13625
  allowedCategoryIds: z$1.array(z$1.string()),
@@ -13745,6 +13785,7 @@ function calendarQueryKey(siteId, stage, filters) {
13745
13785
  filters.eventSurface ?? "all",
13746
13786
  normalizedCsv(filters.eventPresets),
13747
13787
  filters.scheduleScope ?? "any",
13788
+ ...filters.seriesIds === void 0 ? [] : [normalizedCsv(filters.seriesIds)],
13748
13789
  normalizedCsv(filters.categoryIds),
13749
13790
  normalizeCalendarFilterId(filters.venueId) ?? "",
13750
13791
  normalizeCalendarFilterId(filters.staffMemberId) ?? "",
@@ -13822,6 +13863,7 @@ var init_calendarWindow = __esmMin((() => {
13822
13863
  eventSurface: z$1.enum(eventSurfaceScopeValues).optional(),
13823
13864
  eventPresets: z$1.string().optional(),
13824
13865
  scheduleScope: z$1.enum(eventScheduleScopeValues).optional(),
13866
+ seriesIds: z$1.string().optional(),
13825
13867
  categoryIds: z$1.string().optional(),
13826
13868
  venueId: z$1.string().transform(normalizeCalendarFilterId).optional(),
13827
13869
  staffMemberId: z$1.string().transform(normalizeCalendarFilterId).optional()
@@ -21362,6 +21404,10 @@ var init_headerOpeningForeground = __esmMin((() => {
21362
21404
  init_colorTokenParts();
21363
21405
  init_types$8();
21364
21406
  }));
21407
+ var init_effectivePageDesign = __esmMin((() => {
21408
+ init_pageDesignIntent();
21409
+ init_siteStyleBlockPolicies();
21410
+ }));
21365
21411
  function validateBlockSequence(snapshots, ctx) {
21366
21412
  for (const issue of collectBlockSequenceIssues(snapshots)) ctx.addIssue(issue);
21367
21413
  }
@@ -21638,6 +21684,7 @@ var init_site_styles = __esmMin((() => {
21638
21684
  init_lookResolution();
21639
21685
  init_lookOptionGroups();
21640
21686
  init_logoBranding();
21687
+ init_effectivePageDesign();
21641
21688
  init_pageDesignAuthority();
21642
21689
  init_pageDesignEditorErrors();
21643
21690
  init_pageDesignEditorCapabilities();
@@ -23936,6 +23983,7 @@ var init_schema = __esmMin((() => {
23936
23983
  ];
23937
23984
  siteOptionSources = [
23938
23985
  "eventCategories",
23986
+ "eventSeries",
23939
23987
  "venues",
23940
23988
  "staffMembers"
23941
23989
  ];
@@ -28883,6 +28931,38 @@ var init_booking_form_interactive = __esmMin((() => {
28883
28931
  });
28884
28932
  }));
28885
28933
  //#endregion
28934
+ //#region ../blocks/src/system/blocks/events/shared/eventSelection.ts
28935
+ /** Invalid saved selections fail closed rather than widening discovery. */
28936
+ function resolveEventSelection(mode, value) {
28937
+ if (mode !== "selected") return { kind: "matching" };
28938
+ const candidates = Array.isArray(value) ? value : typeof value === "string" ? value.split(",").filter(Boolean) : [];
28939
+ const ids = [];
28940
+ for (const candidate of candidates) {
28941
+ if (typeof candidate !== "string") return {
28942
+ kind: "selected",
28943
+ seriesIds: []
28944
+ };
28945
+ const parsed = parseEventSeriesId(candidate.trim());
28946
+ if (!parsed.ok) return {
28947
+ kind: "selected",
28948
+ seriesIds: []
28949
+ };
28950
+ ids.push(parsed.value);
28951
+ }
28952
+ return {
28953
+ kind: "selected",
28954
+ seriesIds: [...new Set(ids)].sort()
28955
+ };
28956
+ }
28957
+ /** Undefined means discovery; an empty string is an explicitly empty selection. */
28958
+ function eventSeriesScopeCsv(value) {
28959
+ if (value == null) return void 0;
28960
+ return typeof value === "string" ? value : value.join(",");
28961
+ }
28962
+ var init_eventSelection = __esmMin((() => {
28963
+ init_src$2();
28964
+ }));
28965
+ //#endregion
28886
28966
  //#region ../blocks/src/system/runtime/nodes/events/domain/capacity.ts
28887
28967
  /**
28888
28968
  * Compute remaining spots for an event from `availableSpots` with a fallback
@@ -31542,12 +31622,12 @@ var init_EventCompactRow = __esmMin((() => {
31542
31622
  }), cta.hidden ? /* @__PURE__ */ jsx("span", {
31543
31623
  className: "event-compact-row-status",
31544
31624
  children: cta.label
31545
- }) : /* @__PURE__ */ jsxs("a", {
31625
+ }) : /* @__PURE__ */ jsx("a", {
31546
31626
  href: cta.href,
31547
31627
  target: cta.external ? "_blank" : void 0,
31548
31628
  rel: cta.external ? "noopener noreferrer" : void 0,
31549
31629
  className: `${buttonClass} event-compact-row-cta`,
31550
- children: [/* @__PURE__ */ jsx("span", { children: cta.label }), /* @__PURE__ */ jsx(ArrowRightIcon, { "aria-hidden": "true" })]
31630
+ children: /* @__PURE__ */ jsx("span", { children: cta.label })
31551
31631
  })]
31552
31632
  })]
31553
31633
  })]
@@ -31852,6 +31932,7 @@ function normalizeFilterId(value) {
31852
31932
  return id === "all" ? void 0 : id;
31853
31933
  }
31854
31934
  function buildEventRuntimeFilters(input) {
31935
+ if (input.seriesIds != null) return { seriesIds: input.seriesIds };
31855
31936
  const params = {};
31856
31937
  if (input.eventSurface && input.eventSurface !== "all") params.eventSurface = input.eventSurface;
31857
31938
  const eventPresets = normalizeCsvString(input.filterEventPresets);
@@ -31867,6 +31948,7 @@ function buildEventRuntimeFilters(input) {
31867
31948
  }
31868
31949
  function getEventRuntimeFiltersKey(filters) {
31869
31950
  return JSON.stringify({
31951
+ seriesIds: filters?.seriesIds == null ? null : [...new Set(filters.seriesIds.split(",").filter(Boolean))].sort().join(","),
31870
31952
  categoryIds: normalizeCsvString(filters?.categoryIds),
31871
31953
  staffMemberId: normalizeOptionalId(filters?.staffMemberId),
31872
31954
  venueId: normalizeOptionalId(filters?.venueId),
@@ -31927,11 +32009,15 @@ function buildEventCollectionDisplay(source) {
31927
32009
  };
31928
32010
  }
31929
32011
  function buildEventCollectionFilterDisplay(source) {
31930
- return {
31931
- showFilters: source.showFilters ?? true,
31932
- showCategoryFilter: source.showCategoryFilter ?? "auto",
31933
- showVenueFilter: source.showVenueFilter ?? false,
31934
- showStaffFilter: source.showStaffFilter ?? true,
32012
+ const selected = source.seriesIds != null;
32013
+ const matchingFilters = selected ? {
32014
+ eventSurface: "all",
32015
+ filterEventPresets: null,
32016
+ scheduleScope: "any",
32017
+ filterCategoryIds: null,
32018
+ filterStaffMemberId: null,
32019
+ filterVenueId: null
32020
+ } : {
31935
32021
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
31936
32022
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
31937
32023
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
@@ -31939,6 +32025,14 @@ function buildEventCollectionFilterDisplay(source) {
31939
32025
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
31940
32026
  filterVenueId: normalizeEventVenueId(source.filterVenueId)
31941
32027
  };
32028
+ return {
32029
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
32030
+ showFilters: selected ? false : source.showFilters ?? true,
32031
+ showCategoryFilter: source.showCategoryFilter ?? "auto",
32032
+ showVenueFilter: source.showVenueFilter ?? false,
32033
+ showStaffFilter: source.showStaffFilter ?? true,
32034
+ ...matchingFilters
32035
+ };
31942
32036
  }
31943
32037
  function buildEventCollectionPresentationDisplay(source) {
31944
32038
  return {
@@ -31953,14 +32047,15 @@ function buildEventCollectionPresentationDisplay(source) {
31953
32047
  }
31954
32048
  function buildEventCollectionHydration(source, now = /* @__PURE__ */ new Date()) {
31955
32049
  const timeZone = source.calendarWindow?.scope.timeZone ?? toBookingTimeZone(source.bookingTimeZone);
32050
+ const selected = source.seriesIds != null;
31956
32051
  return {
31957
32052
  calendarWindow: source.calendarWindow ?? void 0,
31958
32053
  siteId: source.siteId,
31959
32054
  stage: source.stage,
31960
32055
  prefetchedEvents: source.events != null,
31961
- eventSurface: normalizeEventSurfaceScope(source.eventSurface),
31962
- filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
31963
- scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
32056
+ eventSurface: selected ? "all" : normalizeEventSurfaceScope(source.eventSurface),
32057
+ filterEventPresets: selected ? null : normalizeEventSurfacePresetsCsv(source.filterEventPresets),
32058
+ scheduleScope: selected ? "any" : normalizeEventScheduleScope(source.scheduleScope),
31964
32059
  calendarContext: {
31965
32060
  timeZone,
31966
32061
  initialToday: source.calendarWindow?.initialToday ?? getLocalScheduleDate(now, timeZone)
@@ -31989,6 +32084,7 @@ function buildEventCollectionListingDisplay(display, prefetchedEvents, className
31989
32084
  }
31990
32085
  var eventSurfaceScopeSchema$1, eventScheduleScopeSchema$1, eventCollectionFilterSourceSchemaShape, eventCollectionSourceSchemaShape, eventCollectionDisplaySchemaShape, eventCollectionHydrationSchema;
31991
32086
  var init_eventCollectionContract = __esmMin((() => {
32087
+ init_eventSelection();
31992
32088
  init_calendarWindow();
31993
32089
  init_cards();
31994
32090
  init_src$2();
@@ -32007,6 +32103,7 @@ var init_eventCollectionContract = __esmMin((() => {
32007
32103
  eventSurface: eventSurfaceScopeSchema$1.nullable().optional(),
32008
32104
  filterEventPresets: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
32009
32105
  scheduleScope: eventScheduleScopeSchema$1.nullable().optional(),
32106
+ seriesIds: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
32010
32107
  filterCategoryIds: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
32011
32108
  filterStaffMemberId: z$1.string().nullable().optional(),
32012
32109
  filterVenueId: z$1.string().nullable().optional()
@@ -32053,6 +32150,7 @@ var init_eventCollectionContract = __esmMin((() => {
32053
32150
  eventSurface: eventSurfaceScopeSchema$1,
32054
32151
  filterEventPresets: z$1.string().nullable(),
32055
32152
  scheduleScope: eventScheduleScopeSchema$1,
32153
+ seriesIds: z$1.string().nullable().optional(),
32056
32154
  filterCategoryIds: z$1.string().nullable(),
32057
32155
  filterStaffMemberId: z$1.string().nullable(),
32058
32156
  filterVenueId: z$1.string().nullable(),
@@ -32098,6 +32196,7 @@ function buildEventListingInteractiveIslandProps(props) {
32098
32196
  }
32099
32197
  var cardOrientationSchema, eventSurfaceScopeSchema, eventScheduleScopeSchema, eventListingSourceSchema, eventListingDisplaySchema, eventListingHydrationSchema, eventListingRenderSchema, eventListingIslandMetaCodec, eventListingBlockRuntime, eventListingIslandMetaKeys, eventListingInteractiveIslandPropsCodec;
32100
32198
  var init_EventListing_interactive = __esmMin((() => {
32199
+ init_eventSelection();
32101
32200
  init_cards();
32102
32201
  init_schemas();
32103
32202
  init_shared$3();
@@ -32164,6 +32263,7 @@ var init_EventListing_interactive = __esmMin((() => {
32164
32263
  eventSurface: eventSurfaceScopeSchema,
32165
32264
  filterEventPresets: z$1.string().nullable(),
32166
32265
  scheduleScope: eventScheduleScopeSchema,
32266
+ seriesIds: z$1.string().nullable().optional(),
32167
32267
  filterCategoryIds: z$1.string().nullable().optional(),
32168
32268
  filterStaffMemberId: z$1.string().nullable().optional(),
32169
32269
  filterVenueId: z$1.string().nullable().optional(),
@@ -32224,6 +32324,7 @@ var init_EventListing_interactive = __esmMin((() => {
32224
32324
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
32225
32325
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
32226
32326
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
32327
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
32227
32328
  filterCategoryIds: normalizeEventCategoryIdsCsv(source.filterCategoryIds),
32228
32329
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
32229
32330
  filterVenueId: normalizeEventVenueId(source.filterVenueId),
@@ -32297,6 +32398,7 @@ function buildEventCalendarListingRender(render, className = render.display.clas
32297
32398
  eventSurface: display.eventSurface,
32298
32399
  filterEventPresets: display.filterEventPresets,
32299
32400
  scheduleScope: display.scheduleScope,
32401
+ seriesIds: display.seriesIds,
32300
32402
  filterCategoryIds: display.filterCategoryIds,
32301
32403
  filterStaffMemberId: display.filterStaffMemberId,
32302
32404
  filterVenueId: display.filterVenueId,
@@ -41302,13 +41404,6 @@ const API_ENDPOINTS$1 = {
41302
41404
  auth: "service",
41303
41405
  responseKind: "json"
41304
41406
  },
41305
- sdkCatalogTheme: {
41306
- path: "/sdk/{siteId}/catalog/theme",
41307
- method: "GET",
41308
- errors: ["server:internal_error"],
41309
- auth: "service",
41310
- responseKind: "json"
41311
- },
41312
41407
  sdkCatalogBlocks: {
41313
41408
  path: "/sdk/{siteId}/catalog/blocks",
41314
41409
  method: "GET",
@@ -41369,12 +41464,6 @@ const API_ENDPOINTS$1 = {
41369
41464
  auth: "service",
41370
41465
  responseKind: "json"
41371
41466
  },
41372
- sdkPullTheme: {
41373
- path: "/sdk/{siteId}/pull/theme",
41374
- method: "GET",
41375
- auth: "service",
41376
- responseKind: "json"
41377
- },
41378
41467
  sdkPullFooter: {
41379
41468
  path: "/sdk/{siteId}/pull/footer",
41380
41469
  method: "GET",
@@ -41481,30 +41570,6 @@ const API_ENDPOINTS$1 = {
41481
41570
  auth: "service",
41482
41571
  responseKind: "json"
41483
41572
  },
41484
- sdkUpsertTheme: {
41485
- path: "/sdk/{siteId}/theme",
41486
- method: "POST",
41487
- auth: "service",
41488
- responseKind: "json",
41489
- errors: [
41490
- "validation:invalid_input",
41491
- "resource:not_found",
41492
- "resource:conflict",
41493
- "server:internal_error"
41494
- ]
41495
- },
41496
- sdkApplySiteStyleSelection: {
41497
- path: "/sdk/{siteId}/theme/style-selection/apply",
41498
- method: "POST",
41499
- auth: "service",
41500
- responseKind: "json",
41501
- errors: [
41502
- "validation:invalid_input",
41503
- "resource:not_found",
41504
- "resource:conflict",
41505
- "server:internal_error"
41506
- ]
41507
- },
41508
41573
  sdkUpsertFooter: {
41509
41574
  path: "/sdk/{siteId}/footer",
41510
41575
  method: "POST",
@@ -44583,6 +44648,27 @@ const headerRuntimeTransforms = [{
44583
44648
  init_events$2();
44584
44649
  init_core$1();
44585
44650
  init_calendarWindow();
44651
+ init_eventSelection();
44652
+ const eventCalendarSelectionParam = {
44653
+ id: "events.calendarSelectionParam",
44654
+ kind: "formatter",
44655
+ summary: "Resolve selected events instead of discovery filters",
44656
+ schema: z$1.object({ key: z$1.enum([
44657
+ "seriesIds",
44658
+ "eventSurface",
44659
+ "filterEventPresets",
44660
+ "scheduleScope",
44661
+ "filterCategoryIds",
44662
+ "filterStaffMemberId",
44663
+ "filterVenueId"
44664
+ ]) }),
44665
+ run(value, { key }) {
44666
+ const content = asPartialObject(value) ?? {};
44667
+ const selection = resolveEventSelection(content.eventSelection, content.selectedEventSeriesIds);
44668
+ if (selection.kind === "selected") return key === "seriesIds" ? selection.seriesIds : void 0;
44669
+ return key === "seriesIds" ? void 0 : content[key];
44670
+ }
44671
+ };
44586
44672
  const readJobSchema = z$1.object({ job: z$1.enum(["list", "calendar"]) });
44587
44673
  const eventCalendarReadProfile = {
44588
44674
  id: "events.calendarReadProfile",
@@ -44608,6 +44694,7 @@ init_core$1();
44608
44694
  init_boxStyles$1();
44609
44695
  init_boxStyleClassNames();
44610
44696
  const defaultTransforms = createTransformRegistry([
44697
+ eventCalendarSelectionParam,
44611
44698
  eventCalendarReadEnabled,
44612
44699
  eventCalendarReadProfile,
44613
44700
  ...formattingTransforms,
@@ -45868,17 +45955,16 @@ const ButtonNode = ({ value, children, href, variantId = "primary", size = "md",
45868
45955
  console.warn("[ButtonNode] Missing href for link-required button");
45869
45956
  return null;
45870
45957
  }
45871
- const extraClassName = affordanceIcon ? [className, AFFORDANCE_SUPPRESS_CLASS].filter(Boolean).join(" ") : className;
45872
45958
  const resolvedVariantId = parseThemeButtonVariantId(variantId);
45873
45959
  if (variantId && !resolvedVariantId) {
45874
45960
  console.error("[ButtonNode] Invalid button variant", { variantId });
45875
45961
  return null;
45876
45962
  }
45877
- const combinedClassName = resolvedVariantId ? themeButtonClassName({
45963
+ const combinedClassName = resolvedVariantId ? (affordanceIcon ? themeButtonClassNameWithTrailingIcon : themeButtonClassName)({
45878
45964
  variant: resolvedVariantId,
45879
45965
  size,
45880
- extraClassName
45881
- }) : extraClassName;
45966
+ extraClassName: className
45967
+ }) : className;
45882
45968
  if (resolvedHref) return /* @__PURE__ */ jsxs("a", {
45883
45969
  href: resolvedHref,
45884
45970
  target,
@@ -47100,6 +47186,7 @@ const publicPricingSchema = z$1.object({
47100
47186
  });
47101
47187
  const publicAppointmentServiceSchema = z$1.object({
47102
47188
  id: z$1.string().min(1),
47189
+ slug: z$1.string().min(1).optional(),
47103
47190
  title: z$1.string(),
47104
47191
  description: z$1.string().nullable().optional(),
47105
47192
  durationMinutes: z$1.number().int().positive(),
@@ -47176,7 +47263,7 @@ function formatAmountOrFree(amount, currency) {
47176
47263
  currency
47177
47264
  }, { decimals: "auto" });
47178
47265
  }
47179
- function buildRows(services, pathname) {
47266
+ function buildRows(services, pathname, servicePathPrefix) {
47180
47267
  return services.map((service) => ({
47181
47268
  id: service.id,
47182
47269
  title: service.title,
@@ -47187,7 +47274,8 @@ function buildRows(services, pathname) {
47187
47274
  href: resolveDedicatedBookingHref(pathname, {
47188
47275
  kind: "appointment_service",
47189
47276
  serviceId: service.id
47190
- })
47277
+ }),
47278
+ detailsHref: servicePathPrefix && service.slug ? `${servicePathPrefix.replace(/\/$/, "")}/${encodeURIComponent(service.slug)}` : null
47191
47279
  }));
47192
47280
  }
47193
47281
  function buildAppointmentServicesView(input) {
@@ -47206,13 +47294,14 @@ function buildAppointmentServicesView(input) {
47206
47294
  };
47207
47295
  return {
47208
47296
  kind: "items",
47209
- rows: buildRows(parsed.services, input.pathname)
47297
+ rows: buildRows(parsed.services, input.pathname, input.servicePathPrefix ?? null)
47210
47298
  };
47211
47299
  }
47212
- function AppointmentServicesNode({ sectionHeading, services, pathname, className }) {
47300
+ function AppointmentServicesNode({ sectionHeading, services, pathname, servicePathPrefix, className }) {
47213
47301
  const view = buildAppointmentServicesView({
47214
47302
  services,
47215
- pathname: typeof pathname === "string" ? pathname : void 0
47303
+ pathname: typeof pathname === "string" ? pathname : void 0,
47304
+ servicePathPrefix: typeof servicePathPrefix === "string" ? servicePathPrefix : null
47216
47305
  });
47217
47306
  const rootClassName = `appointment-services ${className ?? ""}`.trim();
47218
47307
  const RowTitle = sectionHeading ? "h3" : "h2";
@@ -47243,7 +47332,10 @@ function AppointmentServicesNode({ sectionHeading, services, pathname, className
47243
47332
  children: [
47244
47333
  /* @__PURE__ */ jsx(RowTitle, {
47245
47334
  className: "appointment-services-row-title rb-text-lg rb-font-medium rb-leading-tight",
47246
- children: row.title
47335
+ children: row.detailsHref ? /* @__PURE__ */ jsx("a", {
47336
+ href: row.detailsHref,
47337
+ children: row.title
47338
+ }) : row.title
47247
47339
  }),
47248
47340
  row.description ? /* @__PURE__ */ jsx("p", {
47249
47341
  className: "appointment-services-row-description rb-text-sm rb-leading-6 status-muted",
@@ -48776,7 +48868,6 @@ function OfferingsCatalogue(props) {
48776
48868
  //#endregion
48777
48869
  //#region ../blocks/src/system/runtime/nodes/offerings-preview-content.tsx
48778
48870
  init_buttons();
48779
- init_svg();
48780
48871
  init_shared$2();
48781
48872
  function OfferingsPreviewContent(props) {
48782
48873
  const groupLinkClass = themeButtonClassName({
@@ -48823,13 +48914,10 @@ function OfferingsPreviewContent(props) {
48823
48914
  }),
48824
48915
  groupCta ? /* @__PURE__ */ jsx("footer", {
48825
48916
  className: "offerings-preview-card-footer rb-mt-auto rb-flex",
48826
- children: /* @__PURE__ */ jsxs("a", {
48917
+ children: /* @__PURE__ */ jsx("a", {
48827
48918
  className: groupLinkClass,
48828
48919
  href: groupCta.href,
48829
- children: [/* @__PURE__ */ jsx("span", { children: groupCta.label }), /* @__PURE__ */ jsx(ArrowRightIcon, {
48830
- "aria-hidden": "true",
48831
- className: "offerings-preview-link-icon rb-h-4 rb-w-4"
48832
- })]
48920
+ children: /* @__PURE__ */ jsx("span", { children: groupCta.label })
48833
48921
  })
48834
48922
  }) : null
48835
48923
  ]
@@ -50246,23 +50334,123 @@ const formBlockDefinition = {
50246
50334
  runtime: formBlockRuntime
50247
50335
  };
50248
50336
  //#endregion
50337
+ //#region ../blocks/src/system/blocks/events/eventSelectionFields.ts
50338
+ init_schema();
50339
+ const eventSelectionFields = [{
50340
+ id: "eventSelection",
50341
+ type: "select",
50342
+ label: "Events to show",
50343
+ required: false,
50344
+ multiple: false,
50345
+ defaultValue: "matching",
50346
+ options: [{
50347
+ value: "matching",
50348
+ label: "All matching events"
50349
+ }, {
50350
+ value: "selected",
50351
+ label: "Selected events"
50352
+ }],
50353
+ ui: { intent: "behavior" }
50354
+ }, createSiteOptionSelectField({
50355
+ id: "selectedEventSeriesIds",
50356
+ label: "Selected events",
50357
+ description: "Show upcoming dates for these events. Other event filters do not apply.",
50358
+ required: false,
50359
+ multiple: true,
50360
+ defaultValue: [],
50361
+ optionSource: "eventSeries",
50362
+ ui: {
50363
+ intent: "behavior",
50364
+ searchThreshold: 1,
50365
+ visibleWhen: {
50366
+ field: "eventSelection",
50367
+ equals: "selected"
50368
+ }
50369
+ }
50370
+ })];
50371
+ function withEventSelectionVisibility(field) {
50372
+ if (![
50373
+ "eventSurface",
50374
+ "filterEventPresets",
50375
+ "scheduleScope",
50376
+ "filterCategoryIds",
50377
+ "filterStaffMemberId",
50378
+ "filterVenueId",
50379
+ "showFilters",
50380
+ "showCategoryFilter",
50381
+ "showVenueFilter",
50382
+ "showStaffFilter"
50383
+ ].includes(field.id)) return field;
50384
+ const visibleWhen = field.ui?.visibleWhen;
50385
+ return {
50386
+ ...field,
50387
+ ui: {
50388
+ ...field.ui,
50389
+ visibleWhen: { allOf: [{
50390
+ field: "eventSelection",
50391
+ notEquals: "selected"
50392
+ }, ...visibleWhen ? [visibleWhen] : []] }
50393
+ }
50394
+ };
50395
+ }
50396
+ //#endregion
50249
50397
  //#region ../blocks/src/system/blocks/events/eventCalendarDataLoaders.ts
50250
50398
  init_calendarWindow();
50251
50399
  const scopeParams = {
50252
50400
  siteId: { $bind: { from: "$root.siteId" } },
50401
+ seriesIds: { $bind: {
50402
+ from: "content",
50403
+ transforms: [{
50404
+ id: "events.calendarSelectionParam",
50405
+ options: { key: "seriesIds" }
50406
+ }]
50407
+ } },
50253
50408
  stage: { $bind: {
50254
50409
  from: "$root.previewStage",
50255
50410
  fallback: "published"
50256
50411
  } },
50257
- eventSurface: { $bind: { from: "content.eventSurface" } },
50412
+ eventSurface: { $bind: {
50413
+ from: "content",
50414
+ transforms: [{
50415
+ id: "events.calendarSelectionParam",
50416
+ options: { key: "eventSurface" }
50417
+ }, { id: "value.csv" }]
50418
+ } },
50258
50419
  eventPresets: { $bind: {
50259
- from: "content.filterEventPresets",
50260
- transforms: [{ id: "value.csv" }]
50420
+ from: "content",
50421
+ transforms: [{
50422
+ id: "events.calendarSelectionParam",
50423
+ options: { key: "filterEventPresets" }
50424
+ }, { id: "value.csv" }]
50261
50425
  } },
50262
- scheduleScope: { $bind: { from: "content.scheduleScope" } },
50263
- categoryIds: { $bind: { from: "content.filterCategoryIds" } },
50264
- staffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
50265
- venueId: { $bind: { from: "content.filterVenueId" } }
50426
+ scheduleScope: { $bind: {
50427
+ from: "content",
50428
+ transforms: [{
50429
+ id: "events.calendarSelectionParam",
50430
+ options: { key: "scheduleScope" }
50431
+ }, { id: "value.csv" }]
50432
+ } },
50433
+ categoryIds: { $bind: {
50434
+ from: "content",
50435
+ transforms: [{
50436
+ id: "events.calendarSelectionParam",
50437
+ options: { key: "filterCategoryIds" }
50438
+ }, { id: "value.csv" }]
50439
+ } },
50440
+ staffMemberId: { $bind: {
50441
+ from: "content",
50442
+ transforms: [{
50443
+ id: "events.calendarSelectionParam",
50444
+ options: { key: "filterStaffMemberId" }
50445
+ }, { id: "value.csv" }]
50446
+ } },
50447
+ venueId: { $bind: {
50448
+ from: "content",
50449
+ transforms: [{
50450
+ id: "events.calendarSelectionParam",
50451
+ options: { key: "filterVenueId" }
50452
+ }, { id: "value.csv" }]
50453
+ } }
50266
50454
  };
50267
50455
  /** Combined renders two jobs; calendar-only variants never pay for the list seed. */
50268
50456
  const eventCalendarDataLoaders = {
@@ -50403,6 +50591,13 @@ const eventCalendarLayout = [styledSection({
50403
50591
  from: "content.defaultCalendarView",
50404
50592
  fallback: "month"
50405
50593
  } },
50594
+ seriesIds: { $bind: {
50595
+ from: "content",
50596
+ transforms: [{
50597
+ id: "events.calendarSelectionParam",
50598
+ options: { key: "seriesIds" }
50599
+ }]
50600
+ } },
50406
50601
  showFilters: { $bind: {
50407
50602
  from: "content.showFilters",
50408
50603
  fallback: true
@@ -50424,17 +50619,47 @@ const eventCalendarLayout = [styledSection({
50424
50619
  fallback: true
50425
50620
  } },
50426
50621
  eventSurface: { $bind: {
50427
- from: "content.eventSurface",
50428
- fallback: "all"
50622
+ from: "content",
50623
+ transforms: [{
50624
+ id: "events.calendarSelectionParam",
50625
+ options: { key: "eventSurface" }
50626
+ }]
50627
+ } },
50628
+ filterEventPresets: { $bind: {
50629
+ from: "content",
50630
+ transforms: [{
50631
+ id: "events.calendarSelectionParam",
50632
+ options: { key: "filterEventPresets" }
50633
+ }]
50429
50634
  } },
50430
- filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
50431
50635
  scheduleScope: { $bind: {
50432
- from: "content.scheduleScope",
50433
- fallback: "any"
50636
+ from: "content",
50637
+ transforms: [{
50638
+ id: "events.calendarSelectionParam",
50639
+ options: { key: "scheduleScope" }
50640
+ }]
50641
+ } },
50642
+ filterCategoryIds: { $bind: {
50643
+ from: "content",
50644
+ transforms: [{
50645
+ id: "events.calendarSelectionParam",
50646
+ options: { key: "filterCategoryIds" }
50647
+ }]
50648
+ } },
50649
+ filterStaffMemberId: { $bind: {
50650
+ from: "content",
50651
+ transforms: [{
50652
+ id: "events.calendarSelectionParam",
50653
+ options: { key: "filterStaffMemberId" }
50654
+ }]
50655
+ } },
50656
+ filterVenueId: { $bind: {
50657
+ from: "content",
50658
+ transforms: [{
50659
+ id: "events.calendarSelectionParam",
50660
+ options: { key: "filterVenueId" }
50661
+ }]
50434
50662
  } },
50435
- filterCategoryIds: { $bind: { from: "content.filterCategoryIds" } },
50436
- filterStaffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
50437
- filterVenueId: { $bind: { from: "content.filterVenueId" } },
50438
50663
  cardRole: { $bind: {
50439
50664
  from: "content._cardStyles.role",
50440
50665
  fallback: "default"
@@ -50938,6 +51163,7 @@ const eventCalendarAdditionalFields = [
50938
51163
  }
50939
51164
  }
50940
51165
  },
51166
+ ...eventSelectionFields,
50941
51167
  {
50942
51168
  id: "eventSurface",
50943
51169
  type: "select",
@@ -51147,7 +51373,7 @@ const eventCalendarBlockDefinition = {
51147
51373
  titleSource: "heading",
51148
51374
  description: "Display events with calendar, list, or combined views with filtering",
51149
51375
  skipSectionStyles: true,
51150
- additionalFields: eventCalendarAdditionalFields,
51376
+ additionalFields: eventCalendarAdditionalFields.map(withEventSelectionVisibility),
51151
51377
  styleTokens: {
51152
51378
  background: "surface",
51153
51379
  typography: "body",
@@ -56291,9 +56517,56 @@ function generateNavLinkCSS(options) {
56291
56517
  if (baseRules.length > 0) cssChunks.unshift(`\n${selector} {\n ${baseRules.join("\n ")}\n}\n`);
56292
56518
  if (hoverRules.length > 0) cssChunks.push(`\n${hoverSelector} {\n ${hoverRules.join("\n ")}\n}\n`);
56293
56519
  if (activeRules.length > 0) cssChunks.push(`\n${activeSelector} {\n ${activeRules.join("\n ")}\n}\n`);
56520
+ cssChunks.push(navLinkFocusVisibleCss(selector, style, theme, tokens));
56294
56521
  cssChunks.push(generateInteractiveChildInheritanceCSS(selector));
56295
56522
  return cssChunks.join("");
56296
56523
  }
56524
+ /**
56525
+ * Keyboard focus indicator for nav links, in the header, the footer and header
56526
+ * dropdown menus — the three surfaces `generateNavLinkCSS` serves.
56527
+ *
56528
+ * Emitted unconditionally rather than as an effect, because focus visibility is
56529
+ * a floor rather than a style choice. Only the interaction-palette pill ever
56530
+ * wrote an `effects.focus` group, so every other nav — every `quiet` palette,
56531
+ * every footer, every dropdown — previously fell back to whatever outline the
56532
+ * browser drew.
56533
+ *
56534
+ * The outline takes the link's own resolved colour, so on a header that adapts
56535
+ * to the section it floats over it moves with the adaptation instead of
56536
+ * asserting a brand colour against an unknown backdrop.
56537
+ *
56538
+ * Where the style asks for `soft-glow`, the same halo goes on the outline. That
56539
+ * treatment exists because the theme has already conceded the resolved colour
56540
+ * alone is not reliable over an unpredictable backdrop — a hero photograph with
56541
+ * mixed luminance. Without it the text would stay legible by its halo while the
56542
+ * focus ring, which is the part with a contrast requirement of its own, would
56543
+ * not.
56544
+ *
56545
+ * A style that also paints a focus pill keeps it: this adds an outline around
56546
+ * that pill rather than replacing it.
56547
+ */
56548
+ function navLinkFocusVisibleCss(selector, style, theme, tokens) {
56549
+ const color = tokens.getColor(style.colorToken);
56550
+ const halo = buildTextContrastShadow({
56551
+ theme,
56552
+ colorToken: style.colorToken,
56553
+ treatment: style.contrastTreatment
56554
+ });
56555
+ return `
56556
+ ${selector}:focus-visible {
56557
+ outline: 2px solid ${color};
56558
+ outline-offset: ${focusOutlineOffset(selector)};${halo ? `\n box-shadow: ${halo};` : ""}
56559
+ }
56560
+ `;
56561
+ }
56562
+ /**
56563
+ * Dropdown items are full-width inside a panel with no horizontal padding, so
56564
+ * an outset outline would paint over and past the panel's own border. Keeping
56565
+ * it flush is the only way it reads as belonging to the item.
56566
+ */
56567
+ function focusOutlineOffset(selector) {
56568
+ return selector.includes("nav-dropdown-link") ? "-2px" : "3px";
56569
+ }
56297
56570
  function buildTextContrastShadow(input) {
56298
56571
  if (input.treatment !== "soft-glow") return null;
56299
56572
  return isLikelyLightColorToken(input.theme, input.colorToken) ? "0 1px 3px rgb(0 0 0 / 0.55), 0 0 18px rgb(0 0 0 / 0.38)" : "0 1px 3px rgb(255 255 255 / 0.72), 0 0 18px rgb(255 255 255 / 0.5)";
@@ -59459,7 +59732,7 @@ function pageBlockPosition(index, blockCount) {
59459
59732
  //#endregion
59460
59733
  //#region ../blocks/src/pageRendererContracts.ts
59461
59734
  function buildPageRendererRootRuntime(dataContext) {
59462
- const { siteId = null, pageId = null, pathname = null, bookingTimeZone, previewStage = "published", apiBaseUrl = null, portalToken = null, bookingOfferingPresets = [], mailingList = { tag: "not_configured" }, eventRegistrationOverlayEnabled = false, loaderFailures = {} } = dataContext ?? {};
59735
+ const { siteId = null, pageId = null, pathname = null, bookingTimeZone, previewStage = "published", apiBaseUrl = null, portalToken = null, bookingOfferingPresets = [], appointmentServicePathPrefix = null, mailingList = { tag: "not_configured" }, eventRegistrationOverlayEnabled = false, loaderFailures = {} } = dataContext ?? {};
59463
59736
  return {
59464
59737
  siteId,
59465
59738
  pageId,
@@ -59469,6 +59742,7 @@ function buildPageRendererRootRuntime(dataContext) {
59469
59742
  apiBaseUrl,
59470
59743
  portalToken,
59471
59744
  bookingOfferingPresets,
59745
+ appointmentServicePathPrefix,
59472
59746
  mailingList,
59473
59747
  eventRegistrationOverlayEnabled,
59474
59748
  loaderFailures
@@ -64280,7 +64554,8 @@ const appointmentServicesBlockDefinition = {
64280
64554
  el("appointment-services", {
64281
64555
  sectionHeading: { $bind: { from: "content.heading" } },
64282
64556
  services: { $bind: { from: "data.services" } },
64283
- pathname: { $bind: { from: "$root.pathname" } }
64557
+ pathname: { $bind: { from: "$root.pathname" } },
64558
+ servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
64284
64559
  })
64285
64560
  ], { gap: "lg" })
64286
64561
  })]
@@ -71904,10 +72179,19 @@ const containerResponsiveThemeCss = `/*
71904
72179
  padding-top: 2.5rem;
71905
72180
  padding-bottom: 2.5rem;
71906
72181
  }
72182
+ /* Clearance for a surface that is not an authored block page.
72183
+ An authored page gets this through its opening block's container (see the
72184
+ overlay-clearance rule in styles.css). A reserved surface or a system
72185
+ destination page has no such block, so it consumes the same variable here.
72186
+ Marked with one class rather than per-surface selectors, because the last
72187
+ two additions to this family were both missed and shipped overlapping. */
71907
72188
  :where(.theme-scope)
71908
72189
  [data-site-document-layout-mode="header-overlay"]
71909
- [data-rb-reserved-surface].rb-reserved-surface-main {
71910
- padding-top: calc(var(--rb-reserved-surface-header-offset, 5.5rem) + 2.5rem);
72190
+ .rb-overlay-clearance-surface {
72191
+ padding-top: calc(
72192
+ var(--site-overlay-header-clearance, 5.5rem) +
72193
+ var(--site-overlay-opening-content-extra-pad, clamp(1rem, 2vw, 1.75rem))
72194
+ );
71911
72195
  }
71912
72196
  .rb-preview-editor-offset {
71913
72197
  padding-bottom: calc(
@@ -82264,6 +82548,23 @@ const containerResponsiveThemeCss = `/*
82264
82548
  gap: 0.5rem;
82265
82549
  }
82266
82550
 
82551
+ /* Error panel and field notes. The form block scopes these to its own
82552
+ data-block, so the newsletter form (which also renders in the footer)
82553
+ needs its own copy of the treatment. */
82554
+ :where(.theme-scope) .newsletter-form .fb-error:not([data-field-validation-message]) {
82555
+ background-color: var(--fb-error-bg);
82556
+ color: var(--fb-error-text);
82557
+ border: 1px solid var(--fb-error-border);
82558
+ border-radius: var(--rb-block-radius);
82559
+ padding: 1rem;
82560
+ font-size: 0.875rem;
82561
+ }
82562
+
82563
+ :where(.theme-scope) .newsletter-form [data-field-validation-message] {
82564
+ font-size: 0.875rem;
82565
+ color: var(--fb-error-text);
82566
+ }
82567
+
82267
82568
  /* Required indicator */
82268
82569
  :where(.theme-scope) .newsletter-required {
82269
82570
  color: rgb(var(--tb-primary));
@@ -84761,12 +85062,12 @@ function normalizeContent(block) {
84761
85062
  }
84762
85063
  /**
84763
85064
  * Normalize params for API calls.
84764
- * Converts all values to strings.
85065
+ * Converts supplied values to strings, preserving absent versus explicitly empty params.
84765
85066
  */
84766
85067
  function normalizeParams(input) {
84767
85068
  if (!input || typeof input !== "object") return {};
84768
85069
  const output = {};
84769
- for (const [key, value] of Object.entries(input)) output[key] = coerceToString(value);
85070
+ for (const [key, value] of Object.entries(input)) if (value !== void 0 && value !== null) output[key] = coerceToString(value);
84770
85071
  return output;
84771
85072
  }
84772
85073
  function isNonArrayObject(value) {
@@ -84830,6 +85131,14 @@ function coercePayload(payload) {
84830
85131
  * - Frontend: provide internal API client
84831
85132
  * - SDK: provide SDK client with endpoint mapping
84832
85133
  */
85134
+ function projectDataLoaders(loaders, shouldLoad, blockId, blockKind) {
85135
+ if (!shouldLoad) return [...loaders];
85136
+ return loaders.filter(({ key }) => shouldLoad({
85137
+ blockId,
85138
+ blockKind,
85139
+ loaderKey: key
85140
+ }));
85141
+ }
84833
85142
  function shouldSkipResolvedLoader(input) {
84834
85143
  if (input.loader.requiredParams?.some((param) => !input.params[param]?.trim())) return true;
84835
85144
  return Boolean(input.isValidEndpoint && !input.isValidEndpoint(input.endpoint));
@@ -84858,7 +85167,7 @@ async function prefetchBlockData$1(page, context, options) {
84858
85167
  return (await prefetchBlockDataWithFailures(page, context, options)).resolvedData;
84859
85168
  }
84860
85169
  async function prefetchBlockDataWithFailures(page, context, options) {
84861
- const { apiClient, isValidEndpoint, onError, getCustomBlockLoaders, getBlockDefinition: getBlockDefinition$1 = getBlockDefinition, resolveParamsBindings: resolveParamsBindings$1 = resolveParamsBindings } = options;
85170
+ const { apiClient, isValidEndpoint, onError, getCustomBlockLoaders, getBlockDefinition: getBlockDefinition$1 = getBlockDefinition, resolveParamsBindings: resolveParamsBindings$1 = resolveParamsBindings, shouldLoad } = options;
84862
85171
  const results = {};
84863
85172
  const loaderFailures = {};
84864
85173
  const tasks = [];
@@ -84875,6 +85184,7 @@ async function prefetchBlockDataWithFailures(page, context, options) {
84875
85184
  loader
84876
85185
  })) : [];
84877
85186
  } else loaders = [];
85187
+ loaders = projectDataLoaders(loaders, shouldLoad, blockId, block.kind);
84878
85188
  if (loaders.length === 0) continue;
84879
85189
  const root = {
84880
85190
  ...context.root ?? {},
@@ -84979,8 +85289,8 @@ function toStringParams(value) {
84979
85289
  for (const [k, v] of Object.entries(value)) if (typeof v === "string") out[k] = v;
84980
85290
  return out;
84981
85291
  }
84982
- function stripEmptyStringValues(params) {
84983
- for (const [key, value] of Object.entries(params)) if (value === "") delete params[key];
85292
+ function stripEmptyStringValues(params, endpoint) {
85293
+ for (const [key, value] of Object.entries(params)) if (value === "" && !(key === "seriesIds" && (endpoint === "listPublicEvents" || endpoint === "listPublicEventCalendarWindow"))) delete params[key];
84984
85294
  }
84985
85295
  function ensureSiteId(params, context) {
84986
85296
  if (!params.siteId && typeof context.siteId === "string" && context.siteId) params.siteId = context.siteId;
@@ -84993,7 +85303,7 @@ function ensureSiteId(params, context) {
84993
85303
  */
84994
85304
  function normalizeLoaderParams(endpoint, params, context) {
84995
85305
  const out = toStringParams(params);
84996
- stripEmptyStringValues(out);
85306
+ stripEmptyStringValues(out, endpoint);
84997
85307
  if (endpoint === "getPublicFormById") {
84998
85308
  ensureSiteId(out, context);
84999
85309
  if (!out.formId && out.formSlug) {
@@ -85121,6 +85431,7 @@ init_buttons();
85121
85431
  init_cards();
85122
85432
  init_tokens();
85123
85433
  init_gradients();
85434
+ init_mode();
85124
85435
  init_richTextSchema();
85125
85436
  init_media();
85126
85437
  init_media$1();
@@ -85133,6 +85444,7 @@ init_events$2();
85133
85444
  init_colorStyles();
85134
85445
  //#endregion
85135
85446
  //#region ../api/src/sdkConfig/contracts.ts
85447
+ init_mode();
85136
85448
  init_src$2();
85137
85449
  /**
85138
85450
  * Canonical SDK config Zod contracts.
@@ -85305,11 +85617,14 @@ const sdkSiteStyleConfigSchema = z$1.object({
85305
85617
  sectionOptions: sdkSectionOptionsConfigSchema.optional(),
85306
85618
  containerOptions: sdkContainerOptionsConfigSchema.optional()
85307
85619
  });
85308
- const sdkSiteLayoutConfigSchema = z$1.object({ footerBlocks: z$1.array(z$1.object({
85309
- id: z$1.string().min(1).optional(),
85310
- kind: z$1.string().min(1),
85311
- content: z$1.record(z$1.string(), z$1.unknown()).optional()
85312
- })).optional() });
85620
+ const sdkSiteLayoutConfigSchema = z$1.object({
85621
+ footerMode: footerModeSchema.optional(),
85622
+ footerBlocks: z$1.array(z$1.object({
85623
+ id: z$1.string().min(1).optional(),
85624
+ kind: z$1.string().min(1),
85625
+ content: z$1.record(z$1.string(), z$1.unknown()).optional()
85626
+ })).optional()
85627
+ });
85313
85628
  const sdkFieldSelectOptionSchema = z$1.object({
85314
85629
  value: z$1.string(),
85315
85630
  label: z$1.string()
@@ -87099,6 +87414,7 @@ init_src$2();
87099
87414
  //#endregion
87100
87415
  //#region ../blocks/src/rendering/server.ts
87101
87416
  init_schema();
87417
+ init_mode();
87102
87418
  //#endregion
87103
87419
  //#region src/rendering/helpers/siteCustomBlocks.ts
87104
87420
  /**
@@ -149820,10 +150136,14 @@ function buildDiscountAvailabilityRequestPlan(options) {
149820
150136
  }
149821
150137
  };
149822
150138
  }
149823
- function discountAvailabilityStateFromResponse(response) {
149824
- if (!discountAvailabilityHasDiscounts(response)) return { tag: "unavailable" };
150139
+ function discountAvailabilityStateFromResponse(requestKey, response) {
150140
+ if (!discountAvailabilityHasDiscounts(response)) return {
150141
+ tag: "unavailable",
150142
+ requestKey
150143
+ };
149825
150144
  return {
149826
150145
  tag: "available",
150146
+ requestKey,
149827
150147
  manualCodeEntryAllowed: discountAvailabilityAllowsManualEntry(response),
149828
150148
  autoAppliedDiscount: getAutoAppliedDiscountPreview(response)
149829
150149
  };
@@ -149833,10 +150153,13 @@ function discountCodeUiReducer(state, event) {
149833
150153
  case "availability-disabled": return initialDiscountCodeUiState;
149834
150154
  case "availability-loading": return {
149835
150155
  ...state,
149836
- availability: { tag: "loading" }
150156
+ availability: {
150157
+ tag: "loading",
150158
+ previous: state.availability.tag === "available" || state.availability.tag === "unavailable" ? state.availability : state.availability.tag === "loading" ? state.availability.previous : null
150159
+ }
149837
150160
  };
149838
150161
  case "availability-loaded": {
149839
- const availability = discountAvailabilityStateFromResponse(event.response);
150162
+ const availability = discountAvailabilityStateFromResponse(event.requestKey, event.response);
149840
150163
  if (availability.tag !== "available" || !availability.manualCodeEntryAllowed) return {
149841
150164
  ...state,
149842
150165
  discountUiOpen: false,
@@ -149852,7 +150175,10 @@ function discountCodeUiReducer(state, event) {
149852
150175
  ...state,
149853
150176
  discountUiOpen: false,
149854
150177
  discountCode: "",
149855
- availability: { tag: "error" }
150178
+ availability: {
150179
+ tag: "error",
150180
+ requestKey: event.requestKey
150181
+ }
149856
150182
  };
149857
150183
  case "discount-code-changed": return {
149858
150184
  ...state,
@@ -149897,11 +150223,15 @@ function useDiscountCodeUi(options) {
149897
150223
  if (cancelled) return;
149898
150224
  dispatch({
149899
150225
  type: "availability-loaded",
150226
+ requestKey: requestPlan.key,
149900
150227
  response: res
149901
150228
  });
149902
150229
  } catch {
149903
150230
  if (cancelled) return;
149904
- dispatch({ type: "availability-failed" });
150231
+ dispatch({
150232
+ type: "availability-failed",
150233
+ requestKey: requestPlan.key
150234
+ });
149905
150235
  }
149906
150236
  }
149907
150237
  checkDiscountAvailability();
@@ -149910,8 +150240,9 @@ function useDiscountCodeUi(options) {
149910
150240
  };
149911
150241
  }, [options.api, requestPlan]);
149912
150242
  const availability = state.availability;
149913
- const isAvailable = availability.tag === "available";
149914
- const manualCodeEntryAllowed = isAvailable ? availability.manualCodeEntryAllowed : false;
150243
+ const settledAvailability = availability.tag === "loading" ? availability.previous : availability.tag === "available" || availability.tag === "unavailable" ? availability : null;
150244
+ const isAvailable = settledAvailability?.tag === "available";
150245
+ const manualCodeEntryAllowed = isAvailable ? settledAvailability.manualCodeEntryAllowed : false;
149915
150246
  return {
149916
150247
  discountUiOpen: state.discountUiOpen,
149917
150248
  setDiscountUiOpen: (isOpen) => dispatch({
@@ -149925,8 +150256,10 @@ function useDiscountCodeUi(options) {
149925
150256
  }),
149926
150257
  discountsAvailable: isAvailable,
149927
150258
  manualCodeEntryAllowed,
149928
- autoAppliedDiscount: isAvailable ? availability.autoAppliedDiscount : null,
149929
- discountsAvailableLoading: availability.tag === "loading"
150259
+ autoAppliedDiscount: isAvailable ? settledAvailability.autoAppliedDiscount : null,
150260
+ discountsAvailableLoading: availability.tag === "loading",
150261
+ discountAvailabilityRequestKey: requestPlan.key,
150262
+ settledDiscountAvailabilityRequestKey: availability.tag === "error" ? availability.requestKey : settledAvailability?.requestKey ?? null
149930
150263
  };
149931
150264
  }
149932
150265
  var init_useDiscountCodeUi = __esmMin((() => {
@@ -154451,16 +154784,19 @@ function eligibilityLookupReducer(state, action) {
154451
154784
  case "loading-started": return {
154452
154785
  tag: "loading",
154453
154786
  eligibility: state.eligibility,
154787
+ settledRequestKey: state.settledRequestKey,
154454
154788
  error: null
154455
154789
  };
154456
154790
  case "resolved": return {
154457
154791
  tag: "resolved",
154458
154792
  eligibility: action.eligibility,
154793
+ settledRequestKey: action.requestKey,
154459
154794
  error: null
154460
154795
  };
154461
154796
  case "failed": return {
154462
154797
  tag: "failed",
154463
154798
  eligibility: null,
154799
+ settledRequestKey: null,
154464
154800
  error: action.message
154465
154801
  };
154466
154802
  default: return assertNever$11(action);
@@ -154486,6 +154822,7 @@ var init_hooks_state = __esmMin((() => {
154486
154822
  initialEligibilityLookupState = {
154487
154823
  tag: "idle",
154488
154824
  eligibility: null,
154825
+ settledRequestKey: null,
154489
154826
  error: null
154490
154827
  };
154491
154828
  initialExistingRegistrationLookupState = {
@@ -154565,9 +154902,23 @@ function toRegistrationOptionsSubject(subject, attendanceMode) {
154565
154902
  function useEligibility(params) {
154566
154903
  return useEligibilityWithDeps(params, eventRegistrationHooksDeps);
154567
154904
  }
154905
+ function eligibilityRequestKey(params) {
154906
+ return JSON.stringify({
154907
+ enabled: params.enabled,
154908
+ refreshKey: params.refreshKey ?? 0,
154909
+ subject: params.subject,
154910
+ attendanceMode: params.attendanceMode ?? null,
154911
+ ticketSelections: params.ticketSelectionsKey,
154912
+ selectedSlidingAmount: params.selectedSlidingAmount ?? null
154913
+ });
154914
+ }
154568
154915
  function useEligibilityWithDeps(params, deps) {
154569
154916
  const api = deps.useBlockApi();
154570
154917
  const ticketSelectionsKey = JSON.stringify(normalizeTicketSelectionLines(params.ticketSelections));
154918
+ const requestKey = eligibilityRequestKey({
154919
+ ...params,
154920
+ ticketSelectionsKey
154921
+ });
154571
154922
  const [state, dispatch] = useReducer(eligibilityLookupReducer, initialEligibilityLookupState);
154572
154923
  const requestIdRef = useRef(0);
154573
154924
  useEffect(() => {
@@ -154600,7 +154951,8 @@ function useEligibilityWithDeps(params, deps) {
154600
154951
  if (cancelled || requestIdRef.current !== requestId) return;
154601
154952
  dispatch({
154602
154953
  type: "resolved",
154603
- eligibility: transformRegistrationOptionsResponse(result)
154954
+ eligibility: transformRegistrationOptionsResponse(result),
154955
+ requestKey
154604
154956
  });
154605
154957
  } catch {
154606
154958
  if (cancelled || requestIdRef.current !== requestId) return;
@@ -154629,6 +154981,8 @@ function useEligibilityWithDeps(params, deps) {
154629
154981
  return {
154630
154982
  state,
154631
154983
  eligibility: state.eligibility,
154984
+ settledRequestKey: state.settledRequestKey,
154985
+ requestKey,
154632
154986
  isLoading: state.tag === "loading",
154633
154987
  error: state.error,
154634
154988
  creditState
@@ -155050,7 +155404,6 @@ var init_stripeCommissionMetadata = __esmMin((() => {
155050
155404
  "no_commission_plan",
155051
155405
  "billing_evidence_invalid",
155052
155406
  "fee_rounds_to_zero",
155053
- "non_commissionable_scope",
155054
155407
  "payment_not_stripe"
155055
155408
  ];
155056
155409
  historicalContext = {
@@ -156223,6 +156576,71 @@ var init_useEventRegistrationSubmit = __esmMin((() => {
156223
156576
  };
156224
156577
  }));
156225
156578
  //#endregion
156579
+ //#region ../blocks/src/system/runtime/nodes/event-registration/useSettledCommerceView.ts
156580
+ function buildCandidate(input) {
156581
+ if (!input.eligibilityIsSettled || !input.eligibility || !input.currentEvent) return null;
156582
+ return {
156583
+ eventSelectionId: input.currentEvent.selectionId,
156584
+ discountContext: resolveDiscountContext({
156585
+ paymentSelection: input.paymentSelection,
156586
+ event: input.currentEvent,
156587
+ eventRequiresPayment: input.eventRequiresPayment,
156588
+ ticketsCount: input.ticketsCount
156589
+ }),
156590
+ subtotalCents: input.eligibility.price,
156591
+ summaryLines: input.eligibility.ticketLines.map((line) => ({
156592
+ pricingOptionId: line.pricingOptionId,
156593
+ label: line.label,
156594
+ quantity: line.quantity,
156595
+ unitPriceCents: line.unitPriceCents,
156596
+ subtotalCents: line.subtotalCents
156597
+ }))
156598
+ };
156599
+ }
156600
+ function eligibilityIsSettled(result) {
156601
+ return result.settledRequestKey === result.requestKey;
156602
+ }
156603
+ function viewIsStale(view, currentEvent, eligibilityState) {
156604
+ return view.eventSelectionId !== currentEvent?.selectionId || eligibilityState?.tag === "failed" || eligibilityState?.tag === "idle";
156605
+ }
156606
+ function requestIsSettled(discountUi) {
156607
+ return discountUi.discountAvailabilityRequestKey === "disabled" || discountUi.settledDiscountAvailabilityRequestKey === discountUi.discountAvailabilityRequestKey;
156608
+ }
156609
+ function discountRequest(view) {
156610
+ const discountContext = view?.discountContext ?? null;
156611
+ return {
156612
+ discountContext,
156613
+ subtotalCents: discountContext?.type === "event" && view?.subtotalCents !== null ? view?.subtotalCents : void 0
156614
+ };
156615
+ }
156616
+ function useSettledCommerceView(input) {
156617
+ const candidate = buildCandidate({
156618
+ eligibilityIsSettled: eligibilityIsSettled(input.eligibilityResult),
156619
+ eligibility: input.eligibility,
156620
+ currentEvent: input.currentEvent,
156621
+ paymentSelection: input.paymentSelection,
156622
+ eventRequiresPayment: input.eventRequiresPayment,
156623
+ ticketsCount: input.ticketsCount
156624
+ });
156625
+ const settledRef = useRef(candidate);
156626
+ if (settledRef.current && viewIsStale(settledRef.current, input.currentEvent, input.eligibilityResult.state)) settledRef.current = null;
156627
+ const requestView = candidate ?? settledRef.current;
156628
+ const discountUi = input.useDiscountCodeUi({
156629
+ api: input.api,
156630
+ ...discountRequest(requestView)
156631
+ });
156632
+ if (candidate && requestIsSettled(discountUi)) settledRef.current = candidate;
156633
+ return {
156634
+ discountUi,
156635
+ discountContext: settledRef.current?.discountContext ?? null,
156636
+ ticketSelectionSubtotalCents: settledRef.current?.subtotalCents ?? null,
156637
+ ticketSelectionSummaryLines: settledRef.current?.summaryLines ?? []
156638
+ };
156639
+ }
156640
+ var init_useSettledCommerceView = __esmMin((() => {
156641
+ init_registrationDerivations();
156642
+ }));
156643
+ //#endregion
156226
156644
  //#region ../blocks/src/system/runtime/nodes/event-registration/registrationWizardContext.ts
156227
156645
  function getEventSelectionDefaults(event) {
156228
156646
  const suggestedAmount = getSlidingScaleForEvent(event)?.suggestedAmount;
@@ -156385,10 +156803,6 @@ function isSoldOutWithoutWaitlist(input) {
156385
156803
  var init_registrationCompletion = __esmMin((() => {}));
156386
156804
  //#endregion
156387
156805
  //#region ../blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.ts
156388
- function resolveDiscountSubtotalCents(context, subtotalCents) {
156389
- if (context?.type !== "event" || subtotalCents === null) return void 0;
156390
- return subtotalCents;
156391
- }
156392
156806
  function usesTieredPricing(event) {
156393
156807
  return event !== null && event !== void 0 ? publicEventPricingStrategy(event.pricing) === "tiered" : false;
156394
156808
  }
@@ -156831,30 +157245,15 @@ function useEventRegistrationWizardWithDeps(options, deps) {
156831
157245
  }
156832
157246
  setStep("select-tickets");
156833
157247
  };
156834
- const discountContext = useMemo(() => resolveDiscountContext({
156835
- paymentSelection,
156836
- event: currentEvent,
156837
- eventRequiresPayment,
156838
- ticketsCount
156839
- }), [
157248
+ const { discountUi, discountContext, ticketSelectionSubtotalCents, ticketSelectionSummaryLines } = useSettledCommerceView({
157249
+ api,
157250
+ useDiscountCodeUi: deps.useDiscountCodeUi,
157251
+ eligibilityResult,
157252
+ eligibility,
156840
157253
  currentEvent,
156841
157254
  eventRequiresPayment,
156842
157255
  paymentSelection,
156843
157256
  ticketsCount
156844
- ]);
156845
- const ticketSelectionSubtotalCents = eligibility?.price ?? null;
156846
- const ticketSelectionSummaryLines = useMemo(() => eligibility?.ticketLines.map((line) => ({
156847
- pricingOptionId: line.pricingOptionId,
156848
- label: line.label,
156849
- quantity: line.quantity,
156850
- unitPriceCents: line.unitPriceCents,
156851
- subtotalCents: line.subtotalCents
156852
- })) ?? [], [eligibility]);
156853
- const discountSubtotalCents = resolveDiscountSubtotalCents(discountContext, ticketSelectionSubtotalCents);
156854
- const discountUi = deps.useDiscountCodeUi({
156855
- api,
156856
- discountContext,
156857
- subtotalCents: discountSubtotalCents
156858
157257
  });
156859
157258
  const selectionMethod = paymentSelection.method;
156860
157259
  const shouldShowDiscountToggle = discountContext !== null && discountUi.manualCodeEntryAllowed && (selectionMethod === "stripe" || selectionMethod === "pass_bundle" || selectionMethod === "membership_bundle");
@@ -157033,6 +157432,7 @@ var init_useEventRegistrationWizard = __esmMin((() => {
157033
157432
  init_useEventRegistrationStripeReturn();
157034
157433
  init_useEventRegistrationSubmit();
157035
157434
  init_useDiscountCodeUi();
157435
+ init_useSettledCommerceView();
157036
157436
  init_utils();
157037
157437
  init_ticketSelectionLines();
157038
157438
  init_registrationStateMachine();
@@ -157055,6 +157455,38 @@ var init_useEventRegistrationWizard = __esmMin((() => {
157055
157455
  };
157056
157456
  }));
157057
157457
  //#endregion
157458
+ //#region ../blocks/src/system/runtime/nodes/event-registration/useEventCheckoutHandoffRestore.ts
157459
+ function eventRegistrationReloadTarget(location) {
157460
+ return `${location.pathname}${location.search}#${EVENT_REGISTRATION_ANCHOR_ID}`;
157461
+ }
157462
+ function reloadAtEventRegistration() {
157463
+ const target = eventRegistrationReloadTarget(window.location);
157464
+ window.history.replaceState(window.history.state, "", target);
157465
+ window.location.reload();
157466
+ }
157467
+ function useEventCheckoutHandoffRestore(active) {
157468
+ useEventCheckoutHandoffRestoreWithDeps(active, browserCheckoutHandoffRestoreDeps);
157469
+ }
157470
+ function useEventCheckoutHandoffRestoreWithDeps(active, deps) {
157471
+ useEffect(() => {
157472
+ if (!active) return;
157473
+ const handlePageShow = (event) => {
157474
+ if (event.persisted) deps.reloadAtRegistration();
157475
+ };
157476
+ deps.addPageShowListener(handlePageShow);
157477
+ return () => deps.removePageShowListener(handlePageShow);
157478
+ }, [active, deps]);
157479
+ }
157480
+ var browserCheckoutHandoffRestoreDeps;
157481
+ var init_useEventCheckoutHandoffRestore = __esmMin((() => {
157482
+ init_constants();
157483
+ browserCheckoutHandoffRestoreDeps = {
157484
+ addPageShowListener: (listener) => window.addEventListener("pageshow", listener),
157485
+ removePageShowListener: (listener) => window.removeEventListener("pageshow", listener),
157486
+ reloadAtRegistration: reloadAtEventRegistration
157487
+ };
157488
+ }));
157489
+ //#endregion
157058
157490
  //#region ../blocks/src/system/runtime/nodes/shared/MagicLinkForm.state.ts
157059
157491
  function magicLinkSubmissionReducer(state, action) {
157060
157492
  switch (action.type) {
@@ -159715,6 +160147,7 @@ function EventRegistrationWizard(props) {
159715
160147
  events: events ?? [],
159716
160148
  maxTicketsNum
159717
160149
  });
160150
+ useEventCheckoutHandoffRestore(wizard.step === "redirecting");
159718
160151
  const [bookingOverlayOpen, setBookingOverlayOpen] = useState(false);
159719
160152
  const [floatingPortalRoot, setFloatingPortalRoot] = useState(null);
159720
160153
  useEffect(() => {
@@ -159847,6 +160280,7 @@ var init_EventRegistrationWizard = __esmMin((() => {
159847
160280
  init_themePortalRoot();
159848
160281
  init_buttons();
159849
160282
  init_constants();
160283
+ init_useEventCheckoutHandoffRestore();
159850
160284
  init_EventRegistrationSurface();
159851
160285
  init_EventRegistrationBookingLayer();
159852
160286
  EVENT_PORTAL_AUTH_COPY = {
@@ -160653,6 +161087,7 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
160653
161087
  const eventSurface = filters?.eventSurface;
160654
161088
  const eventPresets = normalizeCsvString(filters?.eventPresets);
160655
161089
  const scheduleScope = filters?.scheduleScope;
161090
+ const seriesIds = filters?.seriesIds;
160656
161091
  const eventsRef = useRef(events);
160657
161092
  const loadingRef = useRef(loading);
160658
161093
  const hasMoreRef = useRef(hasMore);
@@ -160680,6 +161115,7 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
160680
161115
  const currentEvents = eventsRef.current;
160681
161116
  const lastEvent = options.reset ? void 0 : currentEvents[currentEvents.length - 1];
160682
161117
  const newEvents = await getPublicEvents({
161118
+ seriesIds,
160683
161119
  afterStartsAt: lastEvent ? lastEvent.startsAt : void 0,
160684
161120
  afterId: lastEvent ? lastEvent.occurrenceId : void 0,
160685
161121
  limit: pageSize,
@@ -160718,6 +161154,7 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
160718
161154
  eventSurface,
160719
161155
  eventPresets,
160720
161156
  scheduleScope,
161157
+ seriesIds,
160721
161158
  normalizedCategoryIds,
160722
161159
  normalizedStaffMemberId,
160723
161160
  normalizedVenueId
@@ -160727,7 +161164,7 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
160727
161164
  }, [fetchPage]);
160728
161165
  const initialFetchAttemptKeyRef = useRef(null);
160729
161166
  useEffect(() => {
160730
- if (!fetchInitialOnMount) return;
161167
+ if (!fetchInitialOnMount || seriesIds === "") return;
160731
161168
  if (!filtersMatchInitial) return;
160732
161169
  if (initialEventsRef.current.length > 0) return;
160733
161170
  if (eventsRef.current.length > 0) return;
@@ -160741,7 +161178,8 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
160741
161178
  fetchPage,
160742
161179
  filtersKey,
160743
161180
  filtersMatchInitial,
160744
- stage
161181
+ stage,
161182
+ seriesIds
160745
161183
  ]);
160746
161184
  const prevFiltersMatchInitialRef = useRef(filtersMatchInitial);
160747
161185
  const prevInitialEventsKeyRef = useRef(initialEventsKey);
@@ -160876,7 +161314,7 @@ var init_useEventFilters_state = __esmMin((() => {
160876
161314
  * const events = await api.getPublicEvents(params);
160877
161315
  * ```
160878
161316
  */
160879
- function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false, showStaffFilter = false, preFilterCategoryIds, preFilterStaffMemberId, preFilterVenueId, preFilterEventSurface, preFilterEventPresets, preFilterScheduleScope } = {}) {
161317
+ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false, showStaffFilter = false, preFilterSeriesIds, preFilterCategoryIds, preFilterStaffMemberId, preFilterVenueId, preFilterEventSurface, preFilterEventPresets, preFilterScheduleScope } = {}) {
160880
161318
  const api = useBlockApi();
160881
161319
  const [loadState, dispatchLoadState] = useReducer(eventFiltersLoadReducer, void 0, createInitialEventFiltersLoadState);
160882
161320
  const filters = getEventFiltersData(loadState);
@@ -161025,6 +161463,7 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
161025
161463
  setSelectedVenueId("all");
161026
161464
  }, []),
161027
161465
  getFilterParams: useCallback(() => {
161466
+ if (preFilterSeriesIds != null) return { seriesIds: preFilterSeriesIds };
161028
161467
  const params = {};
161029
161468
  if (fixedEventSurface) params.eventSurface = fixedEventSurface;
161030
161469
  if (fixedEventPresets) params.eventPresets = fixedEventPresets;
@@ -161038,6 +161477,7 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
161038
161477
  params.staffMemberId = fixedStaffMemberId ?? (selectedStaffMemberId !== "all" ? selectedStaffMemberId : void 0);
161039
161478
  return params;
161040
161479
  }, [
161480
+ preFilterSeriesIds,
161041
161481
  allowedCategoryIds,
161042
161482
  allowedCategorySet,
161043
161483
  fixedEventPresets,
@@ -161073,25 +161513,12 @@ var init_EventListing_client = __esmMin((() => {
161073
161513
  const hydration = render.hydration;
161074
161514
  const filtersIdBase = useId();
161075
161515
  const initialListEvents = useMemo(() => [...display.events], [display.events]);
161076
- const initialListFilters = useMemo(() => buildEventRuntimeFilters({
161077
- eventSurface: hydration.eventSurface,
161078
- filterEventPresets: hydration.filterEventPresets,
161079
- scheduleScope: hydration.scheduleScope,
161080
- filterCategoryIds: hydration.filterCategoryIds,
161081
- filterStaffMemberId: hydration.filterStaffMemberId,
161082
- filterVenueId: hydration.filterVenueId
161083
- }), [
161084
- hydration.eventSurface,
161085
- hydration.filterEventPresets,
161086
- hydration.scheduleScope,
161087
- hydration.filterCategoryIds,
161088
- hydration.filterStaffMemberId,
161089
- hydration.filterVenueId
161090
- ]);
161516
+ const initialListFilters = buildEventRuntimeFilters(hydration);
161091
161517
  const { categories, venues, staffMembers, selectedCategoryId, selectedStaffMemberId, selectedVenueId, loading: filtersLoading, shouldShowCategoryFilter, shouldShowVenueFilter, shouldShowStaffFilter, hasActiveFilters, setSelectedCategoryId, setSelectedStaffMemberId, setSelectedVenueId, resetFilters, getFilterParams } = useEventFilters({
161092
161518
  showCategoryFilter: hydration.showFilters ? hydration.showCategoryFilter : "never",
161093
161519
  showVenueFilter: hydration.showFilters ? hydration.showVenueFilter : false,
161094
161520
  showStaffFilter: hydration.showFilters ? hydration.showStaffFilter : false,
161521
+ preFilterSeriesIds: hydration.seriesIds,
161095
161522
  preFilterCategoryIds: hydration.filterCategoryIds ?? void 0,
161096
161523
  preFilterStaffMemberId: hydration.filterStaffMemberId ?? void 0,
161097
161524
  preFilterVenueId: hydration.filterVenueId ?? void 0,
@@ -161908,6 +162335,7 @@ function toEventCombinedControllerProps(props) {
161908
162335
  eventSurface: props.render.display.eventSurface,
161909
162336
  filterEventPresets: props.render.display.filterEventPresets,
161910
162337
  scheduleScope: props.render.display.scheduleScope,
162338
+ seriesIds: props.render.display.seriesIds,
161911
162339
  filterCategoryIds: props.render.display.filterCategoryIds,
161912
162340
  filterStaffMemberId: props.render.display.filterStaffMemberId,
161913
162341
  filterVenueId: props.render.display.filterVenueId,
@@ -162043,7 +162471,7 @@ var init_EventCombined_client = __esmMin((() => {
162043
162471
  EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout = "stack", listColumns = "3", eventsPerPage = 12, paginationAction = {
162044
162472
  kind: "loadMore",
162045
162473
  label: "Load more events"
162046
- }, startOfWeek = "monday", calendarTabViews = "both", defaultCalendarView, showFilters, showCategoryFilter = "auto", showVenueFilter, showStaffFilter, eventSurface, filterEventPresets, scheduleScope, filterCategoryIds, filterStaffMemberId, filterVenueId, showVenue, showMap, showCapacity, cardRole, buttonVariant = "primary", buttonText = "Book", emptyMessage = "No upcoming events scheduled.", className, calendarContext, calendarWindow }) => {
162474
+ }, startOfWeek = "monday", calendarTabViews = "both", defaultCalendarView, showFilters, showCategoryFilter = "auto", showVenueFilter, showStaffFilter, eventSurface, filterEventPresets, scheduleScope, seriesIds, filterCategoryIds, filterStaffMemberId, filterVenueId, showVenue, showMap, showCapacity, cardRole, buttonVariant = "primary", buttonText = "Book", emptyMessage = "No upcoming events scheduled.", className, calendarContext, calendarWindow }) => {
162047
162475
  const hydrationReady = useHydrationReady();
162048
162476
  const fetchInitialEventsOnMount = initialEvents == null;
162049
162477
  const resolvedShowFilters = showFilters ?? true;
@@ -162069,6 +162497,7 @@ var init_EventCombined_client = __esmMin((() => {
162069
162497
  showCategoryFilter: resolvedShowFilters ? showCategoryFilter : "never",
162070
162498
  showVenueFilter: resolvedShowFilters ? resolvedShowVenueFilter : false,
162071
162499
  showStaffFilter: resolvedShowFilters ? resolvedShowStaffFilter : false,
162500
+ preFilterSeriesIds: seriesIds,
162072
162501
  preFilterCategoryIds: filterCategoryIds,
162073
162502
  preFilterStaffMemberId: filterStaffMemberId,
162074
162503
  preFilterVenueId: filterVenueId,
@@ -162076,21 +162505,15 @@ var init_EventCombined_client = __esmMin((() => {
162076
162505
  preFilterEventPresets: filterEventPresets,
162077
162506
  preFilterScheduleScope: resolvedScheduleScope
162078
162507
  });
162079
- const initialListFilters = useMemo(() => buildEventRuntimeFilters({
162508
+ const initialListFilters = buildEventRuntimeFilters({
162080
162509
  eventSurface: resolvedEventSurface,
162081
162510
  filterEventPresets,
162082
162511
  scheduleScope: resolvedScheduleScope,
162512
+ seriesIds,
162083
162513
  filterCategoryIds,
162084
162514
  filterStaffMemberId,
162085
162515
  filterVenueId
162086
- }), [
162087
- resolvedEventSurface,
162088
- filterCategoryIds,
162089
- filterEventPresets,
162090
- filterStaffMemberId,
162091
- filterVenueId,
162092
- resolvedScheduleScope
162093
- ]);
162516
+ });
162094
162517
  const listFilters = useMemo(() => getFilterParams(), [getFilterParams]);
162095
162518
  const pageSize = eventsPerPage;
162096
162519
  const { events: paginatedEvents, loading: eventsLoading, error: eventsError, hasMore, loadMore } = useEventPagination({
@@ -162359,6 +162782,7 @@ function useEventCalendarFilterState(display) {
162359
162782
  showCategoryFilter: display.showFilters ? display.showCategoryFilter : "never",
162360
162783
  showVenueFilter: display.showFilters ? display.showVenueFilter : false,
162361
162784
  showStaffFilter: display.showFilters ? display.showStaffFilter : false,
162785
+ preFilterSeriesIds: display.seriesIds,
162362
162786
  preFilterCategoryIds: display.filterCategoryIds,
162363
162787
  preFilterStaffMemberId: display.filterStaffMemberId,
162364
162788
  preFilterVenueId: display.filterVenueId,
@@ -162392,6 +162816,7 @@ function buildDisplayFilterParams(display) {
162392
162816
  eventSurface: display.eventSurface,
162393
162817
  filterEventPresets: display.filterEventPresets,
162394
162818
  scheduleScope: display.scheduleScope,
162819
+ seriesIds: display.seriesIds,
162395
162820
  filterCategoryIds: display.filterCategoryIds,
162396
162821
  filterStaffMemberId: display.filterStaffMemberId,
162397
162822
  filterVenueId: display.filterVenueId
@@ -162438,6 +162863,7 @@ var init_EventCalendar_client = __esmMin((() => {
162438
162863
  eventSurface: display.eventSurface,
162439
162864
  filterEventPresets: display.filterEventPresets,
162440
162865
  scheduleScope: display.scheduleScope,
162866
+ seriesIds: display.seriesIds,
162441
162867
  filterCategoryIds: display.filterCategoryIds,
162442
162868
  filterStaffMemberId: display.filterStaffMemberId,
162443
162869
  filterVenueId: display.filterVenueId,
@@ -162461,6 +162887,7 @@ var init_EventCalendar_client = __esmMin((() => {
162461
162887
  const { display, hydration } = render;
162462
162888
  const filters = useMemo(() => buildDisplayFilterParams(display), [
162463
162889
  display.eventSurface,
162890
+ display.seriesIds,
162464
162891
  display.filterCategoryIds,
162465
162892
  display.filterEventPresets,
162466
162893
  display.filterStaffMemberId,
@@ -164537,7 +164964,7 @@ function NewsletterFormClient({ render }) {
164537
164964
  if (submitTarget.tag === "unavailable") {
164538
164965
  dispatchSubmission({
164539
164966
  type: "failed",
164540
- error: newsletterFormError("Newsletter list is not configured")
164967
+ error: newsletterFormError(SIGNUPS_PAUSED_MESSAGE)
164541
164968
  });
164542
164969
  return;
164543
164970
  }
@@ -164548,14 +164975,16 @@ function NewsletterFormClient({ render }) {
164548
164975
  });
164549
164976
  return;
164550
164977
  }
164551
- const visitorSelection = readVisitorSelection(formData, render.hydration);
164552
- if (visitorSelection === null) {
164978
+ const selection = readVisitorSelection(formData, render.hydration);
164979
+ const selectionError = visitorSelectionError(selection);
164980
+ if (selectionError) {
164553
164981
  dispatchSubmission({
164554
164982
  type: "failed",
164555
- error: newsletterFieldError(TOPIC_CHOICE_FIELD_ID, "Choose at least one email topic.")
164983
+ error: selectionError
164556
164984
  });
164557
164985
  return;
164558
164986
  }
164987
+ const visitorSelection = selection.tag === "chosen" ? selection.value : void 0;
164559
164988
  dispatchSubmission({ type: "submitted" });
164560
164989
  try {
164561
164990
  const result = await api.subscribeNewsletter({
@@ -164749,10 +165178,18 @@ function transportFailureMessage(err) {
164749
165178
  }
164750
165179
  return RETRY_SHORTLY_MESSAGE;
164751
165180
  }
165181
+ function visitorSelectionError(selection) {
165182
+ switch (selection.tag) {
165183
+ case "nothing_chosen": return newsletterFieldError(TOPIC_CHOICE_FIELD_ID, "Choose at least one email topic.");
165184
+ case "unusable": return newsletterFormError(SIGNUPS_PAUSED_MESSAGE);
165185
+ case "not_offered":
165186
+ case "chosen": return null;
165187
+ }
165188
+ }
164752
165189
  function readVisitorSelection(formData, hydration) {
164753
- if (hydration.choicePresentation !== "visitor_choice") return void 0;
165190
+ if (hydration.choicePresentation !== "visitor_choice") return { tag: "not_offered" };
164754
165191
  const ids = formData.getAll(TOPIC_CHOICE_FIELD_ID).flatMap((value) => typeof value === "string" ? [value] : []);
164755
- if (ids.length === 0) return null;
165192
+ if (ids.length === 0) return { tag: "nothing_chosen" };
164756
165193
  const raw = hydration.choiceProvider === "native" ? {
164757
165194
  provider: "native",
164758
165195
  topicIds: ids
@@ -164763,9 +165200,12 @@ function readVisitorSelection(formData, hydration) {
164763
165200
  provider: "mailchimp",
164764
165201
  interestIds: ids
164765
165202
  } : null;
164766
- if (raw === null) return null;
165203
+ if (raw === null) return { tag: "unusable" };
164767
165204
  const parsed = parseMailingListVisitorSelection(raw);
164768
- return parsed.ok ? parsed.value : null;
165205
+ return parsed.ok ? {
165206
+ tag: "chosen",
165207
+ value: parsed.value
165208
+ } : { tag: "unusable" };
164769
165209
  }
164770
165210
  function publicSignupError(outcome) {
164771
165211
  switch (outcome.tag) {
@@ -165091,9 +165531,20 @@ function BlocksIslandsHydrator(props = {}) {
165091
165531
  }
165092
165532
  //#endregion
165093
165533
  //#region ../theme-core/src/hosted-booking-appearance.ts
165534
+ init_schema$2();
165094
165535
  init_colors();
165095
165536
  init_expandPalette();
165096
165537
  init_tokens();
165538
+ init_modern_minimal();
165539
+ z$1.object({
165540
+ palette: paletteColorsSchema,
165541
+ paletteMode: paletteModeSchema,
165542
+ typography: z$1.object({
165543
+ headingFamily: z$1.string().trim().min(1),
165544
+ bodyFamily: z$1.string().trim().min(1)
165545
+ }).strict(),
165546
+ corners
165547
+ }).strict();
165097
165548
  //#endregion
165098
165549
  //#region ../theme-core/src/index.ts
165099
165550
  init_schema$2();
@@ -165459,7 +165910,7 @@ var SimpleCache = class {
165459
165910
  * 1. This constant
165460
165911
  * 2. The "version" field in package.json
165461
165912
  */
165462
- const SDK_VERSION = "0.140.0";
165913
+ const SDK_VERSION = "0.142.0";
165463
165914
  //#endregion
165464
165915
  //#region src/client/error.ts
165465
165916
  let _Symbol$for;