@riverbankcms/sdk 0.140.0 → 0.142.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/dist/{PreviewEditorSidebar-CUyTzd5z.mjs → PreviewEditorSidebar-Dk6Dt11f.mjs} +24 -15
  2. package/dist/{PreviewEditorUI-Agkw4v5i.mjs → PreviewEditorUI-D6EQTsCA.mjs} +3 -3
  3. package/dist/{PreviewQueryProvider-CN0ewic5.mjs → PreviewQueryProvider-CC-EPkyQ.mjs} +1 -1
  4. package/dist/{SdkPreviewModeRuntime-DdbeAdS8.mjs → SdkPreviewModeRuntime-DH1n4ytY.mjs} +85 -54
  5. package/dist/{SiteChromeCustomizeContext-CqGOz-Kv.mjs → SiteChromeCustomizeContext-DunIzY0K.mjs} +797 -216
  6. package/dist/_dts/api/src/billing.d.ts +6 -1
  7. package/dist/_dts/api/src/bookingConfig.d.ts +1 -1
  8. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +2 -2
  9. package/dist/_dts/api/src/contentRuntime.d.ts +12 -31
  10. package/dist/_dts/api/src/domainConnection.d.ts +4 -0
  11. package/dist/_dts/api/src/endpoints.d.ts +0 -27
  12. package/dist/_dts/api/src/footerCompositionContracts.d.ts +25 -0
  13. package/dist/_dts/api/src/index.d.ts +2 -2
  14. package/dist/_dts/api/src/launchReadiness.d.ts +1 -0
  15. package/dist/_dts/api/src/navigation/dashboardSiteNav.d.ts +2 -1
  16. package/dist/_dts/api/src/publicBookingService.d.ts +1 -0
  17. package/dist/_dts/api/src/sdkConfig/layout.d.ts +13 -0
  18. package/dist/_dts/api/src/sdkContracts.d.ts +3 -8
  19. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +3 -26
  20. package/dist/_dts/api/src/siteOnboarding.d.ts +7 -0
  21. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +1 -31
  22. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +6 -1
  23. package/dist/_dts/billing/src/site-arrangements.d.ts +18 -5
  24. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -0
  25. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +2 -0
  26. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +2 -0
  27. package/dist/_dts/blocks/src/system/blocks/events/eventSelectionFields.d.ts +122 -0
  28. package/dist/_dts/blocks/src/system/blocks/events/shared/calendarWindow.d.ts +2 -1
  29. package/dist/_dts/blocks/src/system/blocks/events/shared/eventSelection.d.ts +11 -0
  30. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +56 -0
  31. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +8 -0
  32. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +2 -2
  33. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +47 -47
  34. package/dist/_dts/blocks/src/system/data/prefetchBlockData.d.ts +5 -0
  35. package/dist/_dts/blocks/src/system/data/utils.d.ts +1 -1
  36. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +27 -1
  37. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +12 -180
  38. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +6 -90
  39. package/dist/_dts/blocks/src/system/runtime/hooks/useEventFilters.d.ts +2 -1
  40. package/dist/_dts/blocks/src/system/runtime/nodes/appointment-services.d.ts +5 -1
  41. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.d.ts +4 -0
  42. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.state.d.ts +5 -0
  43. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.d.ts +3 -0
  44. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.state.d.ts +10 -3
  45. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventCheckoutHandoffRestore.d.ts +9 -0
  46. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +4 -5
  47. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useSettledCommerceView.d.ts +37 -0
  48. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +4 -3
  49. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +3 -0
  50. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +11 -101
  51. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +63 -2
  52. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/listOptions.d.ts +2 -0
  53. package/dist/_dts/blocks/src/system/transforms/registry/eventCalendar.d.ts +12 -0
  54. package/dist/_dts/commerce/src/purchase/bookingInstalmentSchedule.d.ts +4 -0
  55. package/dist/_dts/commerce/src/purchase/stripeCommissionMetadata.d.ts +1 -2
  56. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +3102 -3122
  57. package/dist/_dts/editor-blocks/src/block-editor/ColourFieldOptionsProvider.d.ts +7 -0
  58. package/dist/_dts/editor-blocks/src/block-editor/colourFieldVisibility.d.ts +7 -0
  59. package/dist/_dts/editor-blocks/src/block-editor/preparedManifest.d.ts +2 -0
  60. package/dist/_dts/editor-blocks/src/index.d.ts +1 -0
  61. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/loaders.d.ts +27 -1
  62. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +2 -2
  63. package/dist/_dts/preview-next/src/client/preview/PreviewFooterEditorPanel.d.ts +3 -6
  64. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +2 -2
  65. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +2 -2
  66. package/dist/_dts/preview-next/src/client/preview/footerInspection.d.ts +16 -0
  67. package/dist/_dts/preview-next/src/client/preview/sdkConfig.d.ts +6 -0
  68. package/dist/_dts/sdk/src/config/types.d.ts +2 -18
  69. package/dist/_dts/sdk/src/config/validation.d.ts +6 -0
  70. package/dist/_dts/sdk/src/public-api/contracts.d.ts +4 -1
  71. package/dist/_dts/sdk/src/version.d.ts +1 -1
  72. package/dist/_dts/theme-core/src/ThemeFontLoader.d.ts +17 -1
  73. package/dist/_dts/theme-core/src/buttons/affordanceSuppression.d.ts +17 -0
  74. package/dist/_dts/theme-core/src/buttons/buttonColourContract.d.ts +1 -1
  75. package/dist/_dts/theme-core/src/buttons/classNames.d.ts +16 -0
  76. package/dist/_dts/theme-core/src/buttons/generateButtonCss.d.ts +0 -6
  77. package/dist/_dts/theme-core/src/buttons/resolvedButtonCss.d.ts +4 -4
  78. package/dist/_dts/theme-core/src/footer/mode.d.ts +10 -1
  79. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  80. package/dist/_dts/theme-core/src/hosted-booking-appearance.d.ts +54 -12
  81. package/dist/_dts/theme-core/src/index.d.ts +1 -1
  82. package/dist/_dts/theme-core/src/schema.d.ts +1 -7
  83. package/dist/_dts/theme-core/src/site-styles/effectivePageDesign.d.ts +32 -0
  84. package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
  85. package/dist/client/{BookingConsentAgreement-CuKa82V4.mjs → BookingConsentAgreement-CnJeq3_r.mjs} +2 -2
  86. package/dist/client/{DiscountCodeDisclosure-BbYieKWB.mjs → DiscountCodeDisclosure-BINEO6J9.mjs} +1 -1
  87. package/dist/client/{EventCombined.client-LTfR1Aby.mjs → EventCombined.client-srxNQ6sZ.mjs} +11 -15
  88. package/dist/client/{EventListing.client-DUHpYSuo.mjs → EventListing.client-DbyVyGkX.mjs} +4 -17
  89. package/dist/client/{LeafletStaticMap-CHRupL6m.mjs → LeafletStaticMap-B-wpijzL.mjs} +1 -1
  90. package/dist/client/{accordion-6HiIFxNL.mjs → accordion-B-iUXU7n.mjs} +1 -1
  91. package/dist/client/{bookingForm-Dlmid43H.mjs → bookingForm-BXYPke5q.mjs} +5 -5
  92. package/dist/client/bookings.mjs +194 -102
  93. package/dist/client/{carousel-DmkZRRq_.mjs → carousel-Cr4aj63H.mjs} +1 -1
  94. package/dist/client/{cart-CIC24330.mjs → cart-DibP9WWa.mjs} +3 -3
  95. package/dist/client/{checkout-D1Zw9imo.mjs → checkout-CrSBVnL8.mjs} +3 -3
  96. package/dist/client/client.mjs +643 -192
  97. package/dist/client/{context-Cy1OayHx.mjs → context-Ces-AgdR.mjs} +1 -1
  98. package/dist/client/{dates-aDcfoLHr.mjs → dates-BXyNeNhB.mjs} +2 -2
  99. package/dist/client/{eventCalendar-FQxMPAjf.mjs → eventCalendar-HwpPeqrH.mjs} +11 -7
  100. package/dist/client/{eventCombined-Dr3ac6Hb.mjs → eventCombined-BpFUkuEI.mjs} +3 -3
  101. package/dist/client/{eventDetails-D-AzUHFQ.mjs → eventDetails-DK_agiWy.mjs} +4 -4
  102. package/dist/client/{eventListing-B3XxBf3i.mjs → eventListing-DhzHqP1c.mjs} +3 -3
  103. package/dist/client/{eventRegistration-I6EaokFD.mjs → eventRegistration-BdQ_Dn2d.mjs} +124 -32
  104. package/dist/client/{form-BbWckVWY.mjs → form-B1frcuzy.mjs} +2 -2
  105. package/dist/client/{headerSection-C9qU4Y7x.mjs → headerSection-CT5z460s.mjs} +2 -2
  106. package/dist/client/hooks.mjs +274 -45
  107. package/dist/client/{locationMap-CLCShvlG.mjs → locationMap-CIQXB9i2.mjs} +2 -2
  108. package/dist/client/{newsletterForm-Briukxzi.mjs → newsletterForm-BYNYZSes.mjs} +23 -10
  109. package/dist/client/{pricing-Copadu-2.mjs → pricing-CbTlAsmt.mjs} +1 -1
  110. package/dist/client/{productDetail-oujlRd-r.mjs → productDetail-CR7Z3yjS.mjs} +3 -3
  111. package/dist/client/{productList-BRiIRUcd.mjs → productList-DXj00vzR.mjs} +3 -3
  112. package/dist/client/{propsDecoder-CB2KS_ko.mjs → propsDecoder-DiLiBdek.mjs} +57 -16
  113. package/dist/client/rendering/client.mjs +476 -132
  114. package/dist/client/rendering/islands.mjs +17 -17
  115. package/dist/client/rendering.mjs +686 -195
  116. package/dist/client/{scrollToBlock-B1IS1_ua.mjs → scrollToBlock-CrcbBf0h.mjs} +28 -11
  117. package/dist/client/{shop-Vn6yNFED.mjs → shop-DgqiB_1b.mjs} +6 -6
  118. package/dist/client/{shop-commerce-BVTqipYp.mjs → shop-commerce-D_J781in.mjs} +5 -5
  119. package/dist/client/{shop-commerce-store-BVnJVy7v.mjs → shop-commerce-store-PGUbDwqe.mjs} +1 -1
  120. package/dist/client/{shopShared-COIeK77T.mjs → shopShared-C_Bb2zwG.mjs} +3 -3
  121. package/dist/client/{useEventFilters-DzIUcS9n.mjs → useEventFilters-CM17Xpr1.mjs} +17 -11
  122. package/dist/preview-next/before-render.mjs +0 -37
  123. package/dist/preview-next/client/runtime.mjs +4 -4
  124. package/dist/preview-next/editor-chrome.css +4 -8
  125. package/dist/preview-next/keepAlive.mjs +0 -37
  126. package/dist/preview-next/middleware.mjs +0 -37
  127. package/dist/{previewAuthStore-Gjb6r6vz.mjs → previewAuthStore-oVttoRDO.mjs} +0 -37
  128. package/dist/{sdk-runtime-CnCLvZRv.mjs → sdk-runtime-DhmuRhIX.mjs} +2 -2
  129. package/dist/{separator-DKDRJ1oH.mjs → separator-C3hlg9LH.mjs} +1 -1
  130. package/dist/server/components.mjs +452 -111
  131. package/dist/server/config-validation.mjs +263 -40
  132. package/dist/server/config.mjs +263 -40
  133. package/dist/server/data.mjs +274 -45
  134. package/dist/server/index.mjs +1 -38
  135. package/dist/server/next.mjs +427 -119
  136. package/dist/server/page-converter.mjs +208 -33
  137. package/dist/server/prebuild.mjs +1 -1
  138. package/dist/server/rendering/server.mjs +467 -119
  139. package/dist/server/rendering.mjs +467 -117
  140. package/dist/server/routing.mjs +301 -50
  141. package/dist/server/server.mjs +275 -83
  142. package/dist/server/theme-bridge.mjs +57 -23
  143. package/dist/server/theme.mjs +11 -9
  144. package/dist/styles/index.css +28 -2
  145. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { d as unwrapResponse, l as ApiEnvelopeError, s as ApiRequestError, u as extractApiEnvelopeErrorDetails } from "./previewAuthStore-Gjb6r6vz.mjs";
2
+ import { d as unwrapResponse, l as ApiEnvelopeError, s as ApiRequestError, u as extractApiEnvelopeErrorDetails } from "./previewAuthStore-oVttoRDO.mjs";
3
3
  import * as React$1 from "react";
4
4
  import React, { Component, Fragment, cloneElement, createContext, createElement, createRef, forwardRef, isValidElement, memo, startTransition, useCallback, useContext, useDebugValue, useEffect, useId, useImperativeHandle, useLayoutEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore } from "react";
5
5
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -1513,30 +1513,30 @@ function parseMailingListPlacementTargeting(value) {
1513
1513
  }
1514
1514
  }
1515
1515
  function parseMailingListVisitorSelection(value) {
1516
- if (!isRecord$26(value)) return visitorSelectionError("shape");
1516
+ if (!isRecord$26(value)) return visitorSelectionError$1("shape");
1517
1517
  switch (value.provider) {
1518
1518
  case "native": {
1519
1519
  const topicIds = parseVisitorIds(value.topicIds, parseNewsletterListId);
1520
- return topicIds === null ? visitorSelectionError("targets") : ok$2({
1520
+ return topicIds === null ? visitorSelectionError$1("targets") : ok$2({
1521
1521
  provider: "native",
1522
1522
  topicIds
1523
1523
  });
1524
1524
  }
1525
1525
  case "brevo": {
1526
1526
  const listIds = parseVisitorIds(value.listIds, parseBrevoListId);
1527
- return listIds === null ? visitorSelectionError("targets") : ok$2({
1527
+ return listIds === null ? visitorSelectionError$1("targets") : ok$2({
1528
1528
  provider: "brevo",
1529
1529
  listIds
1530
1530
  });
1531
1531
  }
1532
1532
  case "mailchimp": {
1533
1533
  const interestIds = parseVisitorIds(value.interestIds, parseMailchimpInterestId);
1534
- return interestIds === null ? visitorSelectionError("targets") : ok$2({
1534
+ return interestIds === null ? visitorSelectionError$1("targets") : ok$2({
1535
1535
  provider: "mailchimp",
1536
1536
  interestIds
1537
1537
  });
1538
1538
  }
1539
- default: return visitorSelectionError("provider");
1539
+ default: return visitorSelectionError$1("provider");
1540
1540
  }
1541
1541
  }
1542
1542
  function parseNativeTargeting(selection) {
@@ -1655,7 +1655,7 @@ function targetingError(field) {
1655
1655
  field
1656
1656
  });
1657
1657
  }
1658
- function visitorSelectionError(field) {
1658
+ function visitorSelectionError$1(field) {
1659
1659
  return err$1({
1660
1660
  tag: "invalid_mailing_list_visitor_selection",
1661
1661
  field
@@ -64664,13 +64664,9 @@ function matchesQuery(item, query) {
64664
64664
  }
64665
64665
  function CommandMultiSelect({ items, values, onValuesChange, placeholder, "aria-describedby": ariaDescribedBy, disabled, emptyLabel, isLoading, loadingLabel = "Loading…", error, emptySelectionLabel, selectedSummary, showBadges = true, helpText, className, triggerClassName, popoverContentClassName, showSearch = true, searchPlaceholder = "Search...", searchInputAriaLabel = "Search options" }) {
64666
64666
  const [open, setOpen] = useState(false);
64667
- const [query, setQuery] = useState("");
64667
+ const triggerRef = useRef(null);
64668
+ const [portalContainer, setPortalContainer] = useState(null);
64668
64669
  const selectedItems = useMemo(() => items.filter((item) => values.includes(item.id)), [items, values]);
64669
- const filteredItems = useMemo(() => showSearch ? items.filter((item) => matchesQuery(item, query)) : items, [
64670
- items,
64671
- query,
64672
- showSearch
64673
- ]);
64674
64670
  const toggle = (id) => {
64675
64671
  onValuesChange(values.includes(id) ? values.filter((value) => value !== id) : [...values, id]);
64676
64672
  };
@@ -64689,8 +64685,8 @@ function CommandMultiSelect({ items, values, onValuesChange, placeholder, "aria-
64689
64685
  const isDisabled = Boolean(disabled || isLoading || error);
64690
64686
  const handleOpenChange = (nextOpen) => {
64691
64687
  if (isDisabled) return;
64688
+ if (nextOpen) setPortalContainer(triggerRef.current?.closest("[role=\"dialog\"]") ?? null);
64692
64689
  setOpen(nextOpen);
64693
- if (!nextOpen && query) setQuery("");
64694
64690
  };
64695
64691
  return /* @__PURE__ */ jsxs("div", {
64696
64692
  className: cn$2("max-w-xl space-y-2", className),
@@ -64707,6 +64703,7 @@ function CommandMultiSelect({ items, values, onValuesChange, placeholder, "aria-
64707
64703
  children: [/* @__PURE__ */ jsx(PopoverTrigger, {
64708
64704
  asChild: true,
64709
64705
  children: /* @__PURE__ */ jsx(Button$1, {
64706
+ ref: triggerRef,
64710
64707
  variant: "outline",
64711
64708
  role: "combobox",
64712
64709
  "aria-expanded": open,
@@ -64721,43 +64718,19 @@ function CommandMultiSelect({ items, values, onValuesChange, placeholder, "aria-
64721
64718
  children: buttonLabel
64722
64719
  })
64723
64720
  })
64724
- }), /* @__PURE__ */ jsxs(PopoverContent, {
64721
+ }), /* @__PURE__ */ jsx(PopoverContent, {
64722
+ container: portalContainer,
64725
64723
  className: cn$2("w-[--radix-popover-trigger-width] max-w-[min(90vw,36rem)] p-0", popoverContentClassName),
64726
64724
  align: "start",
64727
- children: [showSearch ? /* @__PURE__ */ jsx("div", {
64728
- className: "sticky top-0 z-10 bg-popover p-2",
64729
- children: /* @__PURE__ */ jsx(Input, {
64730
- autoFocus: true,
64731
- "aria-label": searchInputAriaLabel,
64732
- placeholder: searchPlaceholder,
64733
- value: query,
64734
- onChange: (event) => setQuery(event.target.value)
64735
- })
64736
- }) : null, /* @__PURE__ */ jsx("div", {
64737
- role: "listbox",
64738
- "aria-multiselectable": "true",
64739
- className: "max-h-64 overflow-auto py-1",
64740
- children: filteredItems.length > 0 ? filteredItems.map((item) => {
64741
- const isSelected = values.includes(item.id);
64742
- return /* @__PURE__ */ jsxs("button", {
64743
- type: "button",
64744
- role: "option",
64745
- "aria-selected": isSelected,
64746
- className: "group flex w-full items-center gap-2 px-3 py-2 text-left text-sm hover:bg-muted",
64747
- onClick: () => toggle(item.id),
64748
- children: [/* @__PURE__ */ jsx(Check, { className: cn$2("h-4 w-4 shrink-0", isSelected ? "opacity-100" : "opacity-0") }), /* @__PURE__ */ jsxs("div", {
64749
- className: "flex min-w-0 flex-col",
64750
- children: [/* @__PURE__ */ jsx("span", { children: item.label }), item.subtitle ? /* @__PURE__ */ jsx("span", {
64751
- className: "text-xs text-muted-foreground",
64752
- children: item.subtitle
64753
- }) : null]
64754
- })]
64755
- }, item.id);
64756
- }) : /* @__PURE__ */ jsx("p", {
64757
- className: "px-3 py-6 text-sm text-muted-foreground",
64758
- children: emptyLabel ?? "No results."
64759
- })
64760
- })]
64725
+ children: /* @__PURE__ */ jsx(MultiSelectOptions, {
64726
+ items,
64727
+ values,
64728
+ onToggle: toggle,
64729
+ showSearch,
64730
+ searchPlaceholder,
64731
+ searchInputAriaLabel,
64732
+ emptyLabel
64733
+ })
64761
64734
  })]
64762
64735
  }),
64763
64736
  showBadges && selectedItems.length > 0 ? /* @__PURE__ */ jsx("div", {
@@ -64782,6 +64755,44 @@ function CommandMultiSelect({ items, values, onValuesChange, placeholder, "aria-
64782
64755
  ]
64783
64756
  });
64784
64757
  }
64758
+ function MultiSelectOptions({ items, values, onToggle, showSearch, searchPlaceholder, searchInputAriaLabel, emptyLabel }) {
64759
+ const [query, setQuery] = useState("");
64760
+ const filteredItems = showSearch ? items.filter((item) => matchesQuery(item, query)) : items;
64761
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [showSearch ? /* @__PURE__ */ jsx("div", {
64762
+ className: "sticky top-0 z-10 bg-popover p-2",
64763
+ children: /* @__PURE__ */ jsx(Input, {
64764
+ autoFocus: true,
64765
+ "aria-label": searchInputAriaLabel,
64766
+ placeholder: searchPlaceholder,
64767
+ value: query,
64768
+ onChange: (event) => setQuery(event.target.value)
64769
+ })
64770
+ }) : null, /* @__PURE__ */ jsx("div", {
64771
+ role: "listbox",
64772
+ "aria-multiselectable": "true",
64773
+ className: "max-h-64 overflow-auto overscroll-contain py-1",
64774
+ children: filteredItems.length > 0 ? filteredItems.map((item) => {
64775
+ const isSelected = values.includes(item.id);
64776
+ return /* @__PURE__ */ jsxs("button", {
64777
+ type: "button",
64778
+ role: "option",
64779
+ "aria-selected": isSelected,
64780
+ className: "group flex w-full items-center gap-2 px-3 py-2 text-left text-sm hover:bg-muted",
64781
+ onClick: () => onToggle(item.id),
64782
+ children: [/* @__PURE__ */ jsx(Check, { className: cn$2("h-4 w-4 shrink-0", isSelected ? "opacity-100" : "opacity-0") }), /* @__PURE__ */ jsxs("div", {
64783
+ className: "flex min-w-0 flex-col",
64784
+ children: [/* @__PURE__ */ jsx("span", { children: item.label }), item.subtitle ? /* @__PURE__ */ jsx("span", {
64785
+ className: "text-xs text-muted-foreground",
64786
+ children: item.subtitle
64787
+ }) : null]
64788
+ })]
64789
+ }, item.id);
64790
+ }) : /* @__PURE__ */ jsx("p", {
64791
+ className: "px-3 py-6 text-sm text-muted-foreground",
64792
+ children: emptyLabel ?? "No results."
64793
+ })
64794
+ })] });
64795
+ }
64785
64796
  //#endregion
64786
64797
  //#region ../../node_modules/.pnpm/@radix-ui+react-label@2.1.10_@types+react-dom@19.2.3_@types+react@19.2.17__@types+react_007bc5785938acc144f10abac23fbe91/node_modules/@radix-ui/react-label/dist/index.mjs
64787
64798
  var NAME$1 = "Label";
@@ -79161,6 +79172,19 @@ function mediaIdentifierOrFallback(current, fallback) {
79161
79172
  return fallback ?? (typeof current === "string" ? current : void 0);
79162
79173
  }
79163
79174
  //#endregion
79175
+ //#region ../theme-core/src/footer/mode.ts
79176
+ const footerModeSchema = z.enum([
79177
+ "default",
79178
+ "blocks",
79179
+ "default+blocks",
79180
+ "none"
79181
+ ]);
79182
+ /** Reads only SDK footer intent; unrelated config and theme fields are not authorities. */
79183
+ function resolveSdkFooterMode(config) {
79184
+ const parsed = z.object({ layout: z.object({ footerMode: footerModeSchema.optional() }).optional() }).safeParse(config);
79185
+ return parsed.success ? parsed.data.layout?.footerMode ?? "default" : "default";
79186
+ }
79187
+ //#endregion
79164
79188
  //#region ../theme-core/src/lib/media.ts
79165
79189
  const hotspotSchema = z.object({
79166
79190
  x: z.number().min(0).max(1),
@@ -80669,7 +80693,7 @@ const BUTTON_CONTRAST_POLICY = {
80669
80693
  nonTextMinimumRatio: 3,
80670
80694
  gradientSamplesPerSegment: 20,
80671
80695
  alphaBackgrounds: "reject-without-known-surface",
80672
- disabled: "retain-full-colour-contract"
80696
+ disabled: "validated-colour-pair-with-muted-control-opacity"
80673
80697
  };
80674
80698
  function formatButtonColourContractError(error) {
80675
80699
  switch (error.tag) {
@@ -81257,6 +81281,25 @@ function parseThemeForPersistence(value) {
81257
81281
  };
81258
81282
  }
81259
81283
  //#endregion
81284
+ //#region ../theme-core/src/buttons/affordanceSuppression.ts
81285
+ /**
81286
+ * Internal: the opt-out the generated affordance rule is written against.
81287
+ *
81288
+ * A button style may declare a trailing `affordance`, which the theme renders as
81289
+ * a CSS `::after` on every button of that variant. An authored button that
81290
+ * renders its own trailing icon must not also receive the theme's, or it shows
81291
+ * two.
81292
+ *
81293
+ * Deliberately not exported from `./index`. This used to be public, and two
81294
+ * block components reached past the theme to draw arrows of their own — one of
81295
+ * them doubling up on the styles that declare an affordance, both of them
81296
+ * overriding the twelve styles that deliberately declare none. Whether a button
81297
+ * carries a trailing affordance is the style's decision; the only caller that
81298
+ * legitimately opts out is the authored-button renderer, which reaches it
81299
+ * through `themeButtonClassNameWithTrailingIcon`.
81300
+ */
81301
+ const AFFORDANCE_SUPPRESS_CLASS = "rb-affordance-off";
81302
+ //#endregion
81260
81303
  //#region ../theme-core/src/buttons/classNames.ts
81261
81304
  /**
81262
81305
  * Parse content/runtime variant identifiers into the closed theme-button class
@@ -81289,6 +81332,27 @@ function themeButtonClassName(spec) {
81289
81332
  spec.extraClassName
81290
81333
  ].filter(Boolean).join(" ");
81291
81334
  }
81335
+ /**
81336
+ * Button classes for an authored button that renders its own trailing icon.
81337
+ *
81338
+ * A separate function rather than a flag on `themeButtonClassName`, because
81339
+ * there is exactly one caller and it should stay visible in a diff. The name
81340
+ * states what the caller knows to be true of its own markup — that it renders a
81341
+ * trailing icon — rather than what the theme does about it. The consequence is
81342
+ * the theme's to decide and to change; a caller naming the consequence would be
81343
+ * asserting a policy it does not own, and would quietly become a lie the moment
81344
+ * that policy moved.
81345
+ *
81346
+ * Do not reach for this to remove an arrow you simply do not want. A trailing
81347
+ * affordance is declared by the button style, and a block overriding that is the
81348
+ * defect this replaced.
81349
+ */
81350
+ function themeButtonClassNameWithTrailingIcon(spec) {
81351
+ return themeButtonClassName({
81352
+ ...spec,
81353
+ extraClassName: [spec.extraClassName, AFFORDANCE_SUPPRESS_CLASS].filter(Boolean).join(" ")
81354
+ });
81355
+ }
81292
81356
  //#endregion
81293
81357
  //#region ../theme-core/src/tokens/tokens.ts
81294
81358
  const defaultThemeTokens = {
@@ -83708,26 +83772,19 @@ function resolvedButtonFocusDeclarations(indicator, role) {
83708
83772
  ] : [["outline", value("outline", `3px solid ${indicator.colorCss}`)], ["outline-offset", value("outline-offset", "3px")]];
83709
83773
  }
83710
83774
  /**
83711
- * Disabled buttons retain their validated colour pair and add a non-layout
83712
- * visual affordance. `currentColor` keeps the cue inside the same contrast
83713
- * relationship, while retaining pointer events lets the not-allowed cursor
83714
- * remain observable.
83775
+ * Disabled buttons are deliberately muted as unavailable controls. Native
83776
+ * disabled controls are exempt from active-control contrast requirements;
83777
+ * opacity distinguishes the state without introducing a focus-like outline.
83778
+ * Retaining pointer events lets the not-allowed cursor remain observable.
83715
83779
  */
83716
83780
  const RESOLVED_BUTTON_DISABLED_DECLARATIONS = [
83717
83781
  ["cursor", "not-allowed"],
83718
83782
  ["transform", "none"],
83719
83783
  ["box-shadow", "none"],
83720
- ["outline", "2px dashed currentColor"],
83721
- ["outline-offset", "-4px"]
83784
+ ["opacity", "0.55"]
83722
83785
  ];
83723
83786
  //#endregion
83724
83787
  //#region ../theme-core/src/buttons/generateButtonCss.ts
83725
- /**
83726
- * Class the `button` runtime node adds when it renders its own trailing icon,
83727
- * so a node-level icon suppresses the theme's CSS `::after` affordance.
83728
- * Shared so generator and renderer can't drift.
83729
- */
83730
- const AFFORDANCE_SUPPRESS_CLASS = "rb-affordance-off";
83731
83788
  const BUTTON_SIZE_NAMES = buttonSizeNameSchema.options;
83732
83789
  /**
83733
83790
  * Letter spacing token → CSS value.
@@ -86579,14 +86636,12 @@ function generateVariantCSS(variant, themeId, cardClasses, tokens, theme) {
86579
86636
  const shadowValue = generateShadowValue(shadow);
86580
86637
  rules.push(`box-shadow: ${shadowValue}`);
86581
86638
  }
86582
- rules.push(`display: flex`);
86583
- rules.push(`flex-direction: column`);
86584
- rules.push(`position: relative`);
86585
- rules.push(`overflow: visible`);
86639
+ const structureSelector = cardClasses.map((cardClass) => `:where([data-theme-scope="${themeId}"]) :where(.${cardClass})`).join(",\n");
86586
86640
  const mediaRadius = MEDIA_CORNER_MAP[corners];
86587
86641
  const mediaRules = [`border-top-left-radius: ${mediaRadius}`, `border-top-right-radius: ${mediaRadius}`];
86588
86642
  const contentRules = [`padding: ${resolveContentPadding(variant)}`];
86589
86643
  return [
86644
+ `${structureSelector} {\n display: flex;\n flex-direction: column;\n position: relative;\n overflow: visible;\n}`,
86590
86645
  `${containerSelector} {\n ${rules.join(";\n ")};\n}`,
86591
86646
  ...cardDecorationPseudoRules(containerSelectors, variant.decorations, resolveColor),
86592
86647
  `${fallbackBackgroundSelector} {\n background: transparent;\n}`,
@@ -88684,12 +88739,6 @@ const footerVariant = z.enum([
88684
88739
  "split"
88685
88740
  ]);
88686
88741
  const footerMaxWidth = z.enum(["container", "full"]);
88687
- const footerMode = z.enum([
88688
- "default",
88689
- "blocks",
88690
- "default+blocks",
88691
- "none"
88692
- ]);
88693
88742
  const footerNavLayoutMode = z.enum([
88694
88743
  "stack",
88695
88744
  "inline",
@@ -88778,9 +88827,9 @@ const footerSchema = z.object({
88778
88827
  /**
88779
88828
  * SDK-only footer rendering mode.
88780
88829
  *
88781
- * Backwards compatible: missing/undefined behaves as 'default'.
88830
+ * Historical persisted field; SDK rendering mode now lives in layout.footerMode.
88782
88831
  */
88783
- mode: footerMode.optional(),
88832
+ mode: footerModeSchema.optional(),
88784
88833
  variant: footerVariant,
88785
88834
  maxWidth: footerMaxWidth,
88786
88835
  showLogoText: z.boolean().optional(),
@@ -89438,6 +89487,15 @@ const publicEventBaseSchema = z.object({
89438
89487
  timeZone: z.string(),
89439
89488
  pricing: publicEventPricingSchema,
89440
89489
  paymentTerms: blockBookingPaymentTermsSchema,
89490
+ cancellationPolicy: z.object({ refunds: z.object({
89491
+ mode: z.enum([
89492
+ "never",
89493
+ "always",
89494
+ "cutoff"
89495
+ ]),
89496
+ cutoffHours: z.number(),
89497
+ method: z.enum(["original_payment_method", "site_credit"])
89498
+ }) }),
89441
89499
  consent: blockBookingConsentSchema.nullable(),
89442
89500
  accessRestriction: accessRestrictionSchema,
89443
89501
  allowedCategoryIds: z.array(z.string()),
@@ -89614,6 +89672,7 @@ const calendarWindowQuerySchema = z.object({
89614
89672
  eventSurface: z.enum(eventSurfaceScopeValues).optional(),
89615
89673
  eventPresets: z.string().optional(),
89616
89674
  scheduleScope: z.enum(eventScheduleScopeValues).optional(),
89675
+ seriesIds: z.string().optional(),
89617
89676
  categoryIds: z.string().optional(),
89618
89677
  venueId: z.string().transform(normalizeCalendarFilterId).optional(),
89619
89678
  staffMemberId: z.string().transform(normalizeCalendarFilterId).optional()
@@ -89646,6 +89705,7 @@ function calendarQueryKey(siteId, stage, filters) {
89646
89705
  filters.eventSurface ?? "all",
89647
89706
  normalizedCsv(filters.eventPresets),
89648
89707
  filters.scheduleScope ?? "any",
89708
+ ...filters.seriesIds === void 0 ? [] : [normalizedCsv(filters.seriesIds)],
89649
89709
  normalizedCsv(filters.categoryIds),
89650
89710
  normalizeCalendarFilterId(filters.venueId) ?? "",
89651
89711
  normalizeCalendarFilterId(filters.staffMemberId) ?? "",
@@ -93845,17 +93905,16 @@ const ButtonNode = ({ value, children, href, variantId = "primary", size = "md",
93845
93905
  console.warn("[ButtonNode] Missing href for link-required button");
93846
93906
  return null;
93847
93907
  }
93848
- const extraClassName = affordanceIcon ? [className, AFFORDANCE_SUPPRESS_CLASS].filter(Boolean).join(" ") : className;
93849
93908
  const resolvedVariantId = parseThemeButtonVariantId(variantId);
93850
93909
  if (variantId && !resolvedVariantId) {
93851
93910
  console.error("[ButtonNode] Invalid button variant", { variantId });
93852
93911
  return null;
93853
93912
  }
93854
- const combinedClassName = resolvedVariantId ? themeButtonClassName({
93913
+ const combinedClassName = resolvedVariantId ? (affordanceIcon ? themeButtonClassNameWithTrailingIcon : themeButtonClassName)({
93855
93914
  variant: resolvedVariantId,
93856
93915
  size,
93857
- extraClassName
93858
- }) : extraClassName;
93916
+ extraClassName: className
93917
+ }) : className;
93859
93918
  if (resolvedHref) return /* @__PURE__ */ jsxs("a", {
93860
93919
  href: resolvedHref,
93861
93920
  target,
@@ -95633,6 +95692,7 @@ const publicPricingSchema = z.object({
95633
95692
  });
95634
95693
  const publicAppointmentServiceSchema = z.object({
95635
95694
  id: z.string().min(1),
95695
+ slug: z.string().min(1).optional(),
95636
95696
  title: z.string(),
95637
95697
  description: z.string().nullable().optional(),
95638
95698
  durationMinutes: z.number().int().positive(),
@@ -95709,7 +95769,7 @@ function formatAmountOrFree(amount, currency) {
95709
95769
  currency
95710
95770
  }, { decimals: "auto" });
95711
95771
  }
95712
- function buildRows(services, pathname) {
95772
+ function buildRows(services, pathname, servicePathPrefix) {
95713
95773
  return services.map((service) => ({
95714
95774
  id: service.id,
95715
95775
  title: service.title,
@@ -95720,7 +95780,8 @@ function buildRows(services, pathname) {
95720
95780
  href: resolveDedicatedBookingHref(pathname, {
95721
95781
  kind: "appointment_service",
95722
95782
  serviceId: service.id
95723
- })
95783
+ }),
95784
+ detailsHref: servicePathPrefix && service.slug ? `${servicePathPrefix.replace(/\/$/, "")}/${encodeURIComponent(service.slug)}` : null
95724
95785
  }));
95725
95786
  }
95726
95787
  function buildAppointmentServicesView(input) {
@@ -95739,13 +95800,14 @@ function buildAppointmentServicesView(input) {
95739
95800
  };
95740
95801
  return {
95741
95802
  kind: "items",
95742
- rows: buildRows(parsed.services, input.pathname)
95803
+ rows: buildRows(parsed.services, input.pathname, input.servicePathPrefix ?? null)
95743
95804
  };
95744
95805
  }
95745
- function AppointmentServicesNode({ sectionHeading, services, pathname, className }) {
95806
+ function AppointmentServicesNode({ sectionHeading, services, pathname, servicePathPrefix, className }) {
95746
95807
  const view = buildAppointmentServicesView({
95747
95808
  services,
95748
- pathname: typeof pathname === "string" ? pathname : void 0
95809
+ pathname: typeof pathname === "string" ? pathname : void 0,
95810
+ servicePathPrefix: typeof servicePathPrefix === "string" ? servicePathPrefix : null
95749
95811
  });
95750
95812
  const rootClassName = `appointment-services ${className ?? ""}`.trim();
95751
95813
  const RowTitle = sectionHeading ? "h3" : "h2";
@@ -95776,7 +95838,10 @@ function AppointmentServicesNode({ sectionHeading, services, pathname, className
95776
95838
  children: [
95777
95839
  /* @__PURE__ */ jsx(RowTitle, {
95778
95840
  className: "appointment-services-row-title rb-text-lg rb-font-medium rb-leading-tight",
95779
- children: row.title
95841
+ children: row.detailsHref ? /* @__PURE__ */ jsx("a", {
95842
+ href: row.detailsHref,
95843
+ children: row.title
95844
+ }) : row.title
95780
95845
  }),
95781
95846
  row.description ? /* @__PURE__ */ jsx("p", {
95782
95847
  className: "appointment-services-row-description rb-text-sm rb-leading-6 status-muted",
@@ -98687,12 +98752,12 @@ const EventCompactRow = ({ event, buttonVariant = "primary", buttonText }) => {
98687
98752
  }), cta.hidden ? /* @__PURE__ */ jsx("span", {
98688
98753
  className: "event-compact-row-status",
98689
98754
  children: cta.label
98690
- }) : /* @__PURE__ */ jsxs("a", {
98755
+ }) : /* @__PURE__ */ jsx("a", {
98691
98756
  href: cta.href,
98692
98757
  target: cta.external ? "_blank" : void 0,
98693
98758
  rel: cta.external ? "noopener noreferrer" : void 0,
98694
98759
  className: `${buttonClass} event-compact-row-cta`,
98695
- children: [/* @__PURE__ */ jsx("span", { children: cta.label }), /* @__PURE__ */ jsx(ArrowRightIcon, { "aria-hidden": "true" })]
98760
+ children: /* @__PURE__ */ jsx("span", { children: cta.label })
98696
98761
  })]
98697
98762
  })]
98698
98763
  })]
@@ -98891,6 +98956,35 @@ const calendarTabViewsSchema = z.enum([
98891
98956
  "week"
98892
98957
  ]);
98893
98958
  //#endregion
98959
+ //#region ../blocks/src/system/blocks/events/shared/eventSelection.ts
98960
+ /** Invalid saved selections fail closed rather than widening discovery. */
98961
+ function resolveEventSelection(mode, value) {
98962
+ if (mode !== "selected") return { kind: "matching" };
98963
+ const candidates = Array.isArray(value) ? value : typeof value === "string" ? value.split(",").filter(Boolean) : [];
98964
+ const ids = [];
98965
+ for (const candidate of candidates) {
98966
+ if (typeof candidate !== "string") return {
98967
+ kind: "selected",
98968
+ seriesIds: []
98969
+ };
98970
+ const parsed = parseEventSeriesId(candidate.trim());
98971
+ if (!parsed.ok) return {
98972
+ kind: "selected",
98973
+ seriesIds: []
98974
+ };
98975
+ ids.push(parsed.value);
98976
+ }
98977
+ return {
98978
+ kind: "selected",
98979
+ seriesIds: [...new Set(ids)].sort()
98980
+ };
98981
+ }
98982
+ /** Undefined means discovery; an empty string is an explicitly empty selection. */
98983
+ function eventSeriesScopeCsv(value) {
98984
+ if (value == null) return void 0;
98985
+ return typeof value === "string" ? value : value.join(",");
98986
+ }
98987
+ //#endregion
98894
98988
  //#region ../blocks/src/system/blocks/events/shared/runGrouping.ts
98895
98989
  function isWholeSeriesPublicEvent(event) {
98896
98990
  return event.bookingScope === "whole_series";
@@ -100251,6 +100345,7 @@ function normalizeFilterId(value) {
100251
100345
  return id === "all" ? void 0 : id;
100252
100346
  }
100253
100347
  function buildEventRuntimeFilters(input) {
100348
+ if (input.seriesIds != null) return { seriesIds: input.seriesIds };
100254
100349
  const params = {};
100255
100350
  if (input.eventSurface && input.eventSurface !== "all") params.eventSurface = input.eventSurface;
100256
100351
  const eventPresets = normalizeCsvString(input.filterEventPresets);
@@ -100266,6 +100361,7 @@ function buildEventRuntimeFilters(input) {
100266
100361
  }
100267
100362
  function getEventRuntimeFiltersKey(filters) {
100268
100363
  return JSON.stringify({
100364
+ seriesIds: filters?.seriesIds == null ? null : [...new Set(filters.seriesIds.split(",").filter(Boolean))].sort().join(","),
100269
100365
  categoryIds: normalizeCsvString(filters?.categoryIds),
100270
100366
  staffMemberId: normalizeOptionalId(filters?.staffMemberId),
100271
100367
  venueId: normalizeOptionalId(filters?.venueId),
@@ -100286,6 +100382,7 @@ const eventCollectionFilterSourceSchemaShape = {
100286
100382
  eventSurface: eventSurfaceScopeSchema$1.nullable().optional(),
100287
100383
  filterEventPresets: z.union([z.string(), z.array(z.string())]).nullable().optional(),
100288
100384
  scheduleScope: eventScheduleScopeSchema$1.nullable().optional(),
100385
+ seriesIds: z.union([z.string(), z.array(z.string())]).nullable().optional(),
100289
100386
  filterCategoryIds: z.union([z.string(), z.array(z.string())]).nullable().optional(),
100290
100387
  filterStaffMemberId: z.string().nullable().optional(),
100291
100388
  filterVenueId: z.string().nullable().optional()
@@ -100332,6 +100429,7 @@ const eventCollectionDisplaySchemaShape = {
100332
100429
  eventSurface: eventSurfaceScopeSchema$1,
100333
100430
  filterEventPresets: z.string().nullable(),
100334
100431
  scheduleScope: eventScheduleScopeSchema$1,
100432
+ seriesIds: z.string().nullable().optional(),
100335
100433
  filterCategoryIds: z.string().nullable(),
100336
100434
  filterStaffMemberId: z.string().nullable(),
100337
100435
  filterVenueId: z.string().nullable(),
@@ -100379,11 +100477,15 @@ function buildEventCollectionDisplay(source) {
100379
100477
  };
100380
100478
  }
100381
100479
  function buildEventCollectionFilterDisplay(source) {
100382
- return {
100383
- showFilters: source.showFilters ?? true,
100384
- showCategoryFilter: source.showCategoryFilter ?? "auto",
100385
- showVenueFilter: source.showVenueFilter ?? false,
100386
- showStaffFilter: source.showStaffFilter ?? true,
100480
+ const selected = source.seriesIds != null;
100481
+ const matchingFilters = selected ? {
100482
+ eventSurface: "all",
100483
+ filterEventPresets: null,
100484
+ scheduleScope: "any",
100485
+ filterCategoryIds: null,
100486
+ filterStaffMemberId: null,
100487
+ filterVenueId: null
100488
+ } : {
100387
100489
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
100388
100490
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
100389
100491
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
@@ -100391,6 +100493,14 @@ function buildEventCollectionFilterDisplay(source) {
100391
100493
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
100392
100494
  filterVenueId: normalizeEventVenueId(source.filterVenueId)
100393
100495
  };
100496
+ return {
100497
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
100498
+ showFilters: selected ? false : source.showFilters ?? true,
100499
+ showCategoryFilter: source.showCategoryFilter ?? "auto",
100500
+ showVenueFilter: source.showVenueFilter ?? false,
100501
+ showStaffFilter: source.showStaffFilter ?? true,
100502
+ ...matchingFilters
100503
+ };
100394
100504
  }
100395
100505
  function buildEventCollectionPresentationDisplay(source) {
100396
100506
  return {
@@ -100405,14 +100515,15 @@ function buildEventCollectionPresentationDisplay(source) {
100405
100515
  }
100406
100516
  function buildEventCollectionHydration(source, now = /* @__PURE__ */ new Date()) {
100407
100517
  const timeZone = source.calendarWindow?.scope.timeZone ?? toBookingTimeZone(source.bookingTimeZone);
100518
+ const selected = source.seriesIds != null;
100408
100519
  return {
100409
100520
  calendarWindow: source.calendarWindow ?? void 0,
100410
100521
  siteId: source.siteId,
100411
100522
  stage: source.stage,
100412
100523
  prefetchedEvents: source.events != null,
100413
- eventSurface: normalizeEventSurfaceScope(source.eventSurface),
100414
- filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
100415
- scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
100524
+ eventSurface: selected ? "all" : normalizeEventSurfaceScope(source.eventSurface),
100525
+ filterEventPresets: selected ? null : normalizeEventSurfacePresetsCsv(source.filterEventPresets),
100526
+ scheduleScope: selected ? "any" : normalizeEventScheduleScope(source.scheduleScope),
100416
100527
  calendarContext: {
100417
100528
  timeZone,
100418
100529
  initialToday: source.calendarWindow?.initialToday ?? getLocalScheduleDate(now, timeZone)
@@ -100982,13 +101093,10 @@ function OfferingsPreviewContent(props) {
100982
101093
  }),
100983
101094
  groupCta ? /* @__PURE__ */ jsx("footer", {
100984
101095
  className: "offerings-preview-card-footer rb-mt-auto rb-flex",
100985
- children: /* @__PURE__ */ jsxs("a", {
101096
+ children: /* @__PURE__ */ jsx("a", {
100986
101097
  className: groupLinkClass,
100987
101098
  href: groupCta.href,
100988
- children: [/* @__PURE__ */ jsx("span", { children: groupCta.label }), /* @__PURE__ */ jsx(ArrowRightIcon, {
100989
- "aria-hidden": "true",
100990
- className: "offerings-preview-link-icon rb-h-4 rb-w-4"
100991
- })]
101099
+ children: /* @__PURE__ */ jsx("span", { children: groupCta.label })
100992
101100
  })
100993
101101
  }) : null
100994
101102
  ]
@@ -114276,6 +114384,7 @@ function isDisplayMediaKind(kind) {
114276
114384
  }
114277
114385
  const siteOptionSources = [
114278
114386
  "eventCategories",
114387
+ "eventSeries",
114279
114388
  "venues",
114280
114389
  "staffMembers"
114281
114390
  ];
@@ -119653,6 +119762,65 @@ const formBlockDefinition = {
119653
119762
  runtime: formBlockRuntime
119654
119763
  };
119655
119764
  //#endregion
119765
+ //#region ../blocks/src/system/blocks/events/eventSelectionFields.ts
119766
+ const eventSelectionFields = [{
119767
+ id: "eventSelection",
119768
+ type: "select",
119769
+ label: "Events to show",
119770
+ required: false,
119771
+ multiple: false,
119772
+ defaultValue: "matching",
119773
+ options: [{
119774
+ value: "matching",
119775
+ label: "All matching events"
119776
+ }, {
119777
+ value: "selected",
119778
+ label: "Selected events"
119779
+ }],
119780
+ ui: { intent: "behavior" }
119781
+ }, createSiteOptionSelectField({
119782
+ id: "selectedEventSeriesIds",
119783
+ label: "Selected events",
119784
+ description: "Show upcoming dates for these events. Other event filters do not apply.",
119785
+ required: false,
119786
+ multiple: true,
119787
+ defaultValue: [],
119788
+ optionSource: "eventSeries",
119789
+ ui: {
119790
+ intent: "behavior",
119791
+ searchThreshold: 1,
119792
+ visibleWhen: {
119793
+ field: "eventSelection",
119794
+ equals: "selected"
119795
+ }
119796
+ }
119797
+ })];
119798
+ function withEventSelectionVisibility(field) {
119799
+ if (![
119800
+ "eventSurface",
119801
+ "filterEventPresets",
119802
+ "scheduleScope",
119803
+ "filterCategoryIds",
119804
+ "filterStaffMemberId",
119805
+ "filterVenueId",
119806
+ "showFilters",
119807
+ "showCategoryFilter",
119808
+ "showVenueFilter",
119809
+ "showStaffFilter"
119810
+ ].includes(field.id)) return field;
119811
+ const visibleWhen = field.ui?.visibleWhen;
119812
+ return {
119813
+ ...field,
119814
+ ui: {
119815
+ ...field.ui,
119816
+ visibleWhen: { allOf: [{
119817
+ field: "eventSelection",
119818
+ notEquals: "selected"
119819
+ }, ...visibleWhen ? [visibleWhen] : []] }
119820
+ }
119821
+ };
119822
+ }
119823
+ //#endregion
119656
119824
  //#region ../blocks/src/system/runtime/nodes/events/EventCalendar.interactive.ts
119657
119825
  const eventCalendarSourceSchema = z.object({
119658
119826
  ...eventCollectionSourceSchemaShape,
@@ -119737,6 +119905,7 @@ function buildEventCalendarListingRender(render, className = render.display.clas
119737
119905
  eventSurface: display.eventSurface,
119738
119906
  filterEventPresets: display.filterEventPresets,
119739
119907
  scheduleScope: display.scheduleScope,
119908
+ seriesIds: display.seriesIds,
119740
119909
  filterCategoryIds: display.filterCategoryIds,
119741
119910
  filterStaffMemberId: display.filterStaffMemberId,
119742
119911
  filterVenueId: display.filterVenueId,
@@ -119774,19 +119943,59 @@ function buildEventCalendarInteractiveIslandProps(props) {
119774
119943
  //#region ../blocks/src/system/blocks/events/eventCalendarDataLoaders.ts
119775
119944
  const scopeParams = {
119776
119945
  siteId: { $bind: { from: "$root.siteId" } },
119946
+ seriesIds: { $bind: {
119947
+ from: "content",
119948
+ transforms: [{
119949
+ id: "events.calendarSelectionParam",
119950
+ options: { key: "seriesIds" }
119951
+ }]
119952
+ } },
119777
119953
  stage: { $bind: {
119778
119954
  from: "$root.previewStage",
119779
119955
  fallback: "published"
119780
119956
  } },
119781
- eventSurface: { $bind: { from: "content.eventSurface" } },
119957
+ eventSurface: { $bind: {
119958
+ from: "content",
119959
+ transforms: [{
119960
+ id: "events.calendarSelectionParam",
119961
+ options: { key: "eventSurface" }
119962
+ }, { id: "value.csv" }]
119963
+ } },
119782
119964
  eventPresets: { $bind: {
119783
- from: "content.filterEventPresets",
119784
- transforms: [{ id: "value.csv" }]
119965
+ from: "content",
119966
+ transforms: [{
119967
+ id: "events.calendarSelectionParam",
119968
+ options: { key: "filterEventPresets" }
119969
+ }, { id: "value.csv" }]
119970
+ } },
119971
+ scheduleScope: { $bind: {
119972
+ from: "content",
119973
+ transforms: [{
119974
+ id: "events.calendarSelectionParam",
119975
+ options: { key: "scheduleScope" }
119976
+ }, { id: "value.csv" }]
119977
+ } },
119978
+ categoryIds: { $bind: {
119979
+ from: "content",
119980
+ transforms: [{
119981
+ id: "events.calendarSelectionParam",
119982
+ options: { key: "filterCategoryIds" }
119983
+ }, { id: "value.csv" }]
119785
119984
  } },
119786
- scheduleScope: { $bind: { from: "content.scheduleScope" } },
119787
- categoryIds: { $bind: { from: "content.filterCategoryIds" } },
119788
- staffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
119789
- venueId: { $bind: { from: "content.filterVenueId" } }
119985
+ staffMemberId: { $bind: {
119986
+ from: "content",
119987
+ transforms: [{
119988
+ id: "events.calendarSelectionParam",
119989
+ options: { key: "filterStaffMemberId" }
119990
+ }, { id: "value.csv" }]
119991
+ } },
119992
+ venueId: { $bind: {
119993
+ from: "content",
119994
+ transforms: [{
119995
+ id: "events.calendarSelectionParam",
119996
+ options: { key: "filterVenueId" }
119997
+ }, { id: "value.csv" }]
119998
+ } }
119790
119999
  };
119791
120000
  /** Combined renders two jobs; calendar-only variants never pay for the list seed. */
119792
120001
  const eventCalendarDataLoaders = {
@@ -119916,6 +120125,13 @@ const eventCalendarLayout = [styledSection({
119916
120125
  from: "content.defaultCalendarView",
119917
120126
  fallback: "month"
119918
120127
  } },
120128
+ seriesIds: { $bind: {
120129
+ from: "content",
120130
+ transforms: [{
120131
+ id: "events.calendarSelectionParam",
120132
+ options: { key: "seriesIds" }
120133
+ }]
120134
+ } },
119919
120135
  showFilters: { $bind: {
119920
120136
  from: "content.showFilters",
119921
120137
  fallback: true
@@ -119937,17 +120153,47 @@ const eventCalendarLayout = [styledSection({
119937
120153
  fallback: true
119938
120154
  } },
119939
120155
  eventSurface: { $bind: {
119940
- from: "content.eventSurface",
119941
- fallback: "all"
120156
+ from: "content",
120157
+ transforms: [{
120158
+ id: "events.calendarSelectionParam",
120159
+ options: { key: "eventSurface" }
120160
+ }]
120161
+ } },
120162
+ filterEventPresets: { $bind: {
120163
+ from: "content",
120164
+ transforms: [{
120165
+ id: "events.calendarSelectionParam",
120166
+ options: { key: "filterEventPresets" }
120167
+ }]
119942
120168
  } },
119943
- filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
119944
120169
  scheduleScope: { $bind: {
119945
- from: "content.scheduleScope",
119946
- fallback: "any"
120170
+ from: "content",
120171
+ transforms: [{
120172
+ id: "events.calendarSelectionParam",
120173
+ options: { key: "scheduleScope" }
120174
+ }]
120175
+ } },
120176
+ filterCategoryIds: { $bind: {
120177
+ from: "content",
120178
+ transforms: [{
120179
+ id: "events.calendarSelectionParam",
120180
+ options: { key: "filterCategoryIds" }
120181
+ }]
120182
+ } },
120183
+ filterStaffMemberId: { $bind: {
120184
+ from: "content",
120185
+ transforms: [{
120186
+ id: "events.calendarSelectionParam",
120187
+ options: { key: "filterStaffMemberId" }
120188
+ }]
120189
+ } },
120190
+ filterVenueId: { $bind: {
120191
+ from: "content",
120192
+ transforms: [{
120193
+ id: "events.calendarSelectionParam",
120194
+ options: { key: "filterVenueId" }
120195
+ }]
119947
120196
  } },
119948
- filterCategoryIds: { $bind: { from: "content.filterCategoryIds" } },
119949
- filterStaffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
119950
- filterVenueId: { $bind: { from: "content.filterVenueId" } },
119951
120197
  cardRole: { $bind: {
119952
120198
  from: "content._cardStyles.role",
119953
120199
  fallback: "default"
@@ -120451,6 +120697,7 @@ const eventCalendarAdditionalFields = [
120451
120697
  }
120452
120698
  }
120453
120699
  },
120700
+ ...eventSelectionFields,
120454
120701
  {
120455
120702
  id: "eventSurface",
120456
120703
  type: "select",
@@ -120660,7 +120907,7 @@ const eventCalendarBlockDefinition = {
120660
120907
  titleSource: "heading",
120661
120908
  description: "Display events with calendar, list, or combined views with filtering",
120662
120909
  skipSectionStyles: true,
120663
- additionalFields: eventCalendarAdditionalFields,
120910
+ additionalFields: eventCalendarAdditionalFields.map(withEventSelectionVisibility),
120664
120911
  styleTokens: {
120665
120912
  background: "surface",
120666
120913
  typography: "body",
@@ -120769,6 +121016,7 @@ const eventListingHydrationSchema = z.object({
120769
121016
  eventSurface: eventSurfaceScopeSchema,
120770
121017
  filterEventPresets: z.string().nullable(),
120771
121018
  scheduleScope: eventScheduleScopeSchema,
121019
+ seriesIds: z.string().nullable().optional(),
120772
121020
  filterCategoryIds: z.string().nullable().optional(),
120773
121021
  filterStaffMemberId: z.string().nullable().optional(),
120774
121022
  filterVenueId: z.string().nullable().optional(),
@@ -120829,6 +121077,7 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
120829
121077
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
120830
121078
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
120831
121079
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
121080
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
120832
121081
  filterCategoryIds: normalizeEventCategoryIdsCsv(source.filterCategoryIds),
120833
121082
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
120834
121083
  filterVenueId: normalizeEventVenueId(source.filterVenueId),
@@ -125325,10 +125574,14 @@ function buildDiscountAvailabilityRequestPlan(options) {
125325
125574
  }
125326
125575
  };
125327
125576
  }
125328
- function discountAvailabilityStateFromResponse(response) {
125329
- if (!discountAvailabilityHasDiscounts(response)) return { tag: "unavailable" };
125577
+ function discountAvailabilityStateFromResponse(requestKey, response) {
125578
+ if (!discountAvailabilityHasDiscounts(response)) return {
125579
+ tag: "unavailable",
125580
+ requestKey
125581
+ };
125330
125582
  return {
125331
125583
  tag: "available",
125584
+ requestKey,
125332
125585
  manualCodeEntryAllowed: discountAvailabilityAllowsManualEntry(response),
125333
125586
  autoAppliedDiscount: getAutoAppliedDiscountPreview(response)
125334
125587
  };
@@ -125338,10 +125591,13 @@ function discountCodeUiReducer(state, event) {
125338
125591
  case "availability-disabled": return initialDiscountCodeUiState;
125339
125592
  case "availability-loading": return {
125340
125593
  ...state,
125341
- availability: { tag: "loading" }
125594
+ availability: {
125595
+ tag: "loading",
125596
+ previous: state.availability.tag === "available" || state.availability.tag === "unavailable" ? state.availability : state.availability.tag === "loading" ? state.availability.previous : null
125597
+ }
125342
125598
  };
125343
125599
  case "availability-loaded": {
125344
- const availability = discountAvailabilityStateFromResponse(event.response);
125600
+ const availability = discountAvailabilityStateFromResponse(event.requestKey, event.response);
125345
125601
  if (availability.tag !== "available" || !availability.manualCodeEntryAllowed) return {
125346
125602
  ...state,
125347
125603
  discountUiOpen: false,
@@ -125357,7 +125613,10 @@ function discountCodeUiReducer(state, event) {
125357
125613
  ...state,
125358
125614
  discountUiOpen: false,
125359
125615
  discountCode: "",
125360
- availability: { tag: "error" }
125616
+ availability: {
125617
+ tag: "error",
125618
+ requestKey: event.requestKey
125619
+ }
125361
125620
  };
125362
125621
  case "discount-code-changed": return {
125363
125622
  ...state,
@@ -125393,11 +125652,15 @@ function useDiscountCodeUi(options) {
125393
125652
  if (cancelled) return;
125394
125653
  dispatch({
125395
125654
  type: "availability-loaded",
125655
+ requestKey: requestPlan.key,
125396
125656
  response: res
125397
125657
  });
125398
125658
  } catch {
125399
125659
  if (cancelled) return;
125400
- dispatch({ type: "availability-failed" });
125660
+ dispatch({
125661
+ type: "availability-failed",
125662
+ requestKey: requestPlan.key
125663
+ });
125401
125664
  }
125402
125665
  }
125403
125666
  checkDiscountAvailability();
@@ -125406,8 +125669,9 @@ function useDiscountCodeUi(options) {
125406
125669
  };
125407
125670
  }, [options.api, requestPlan]);
125408
125671
  const availability = state.availability;
125409
- const isAvailable = availability.tag === "available";
125410
- const manualCodeEntryAllowed = isAvailable ? availability.manualCodeEntryAllowed : false;
125672
+ const settledAvailability = availability.tag === "loading" ? availability.previous : availability.tag === "available" || availability.tag === "unavailable" ? availability : null;
125673
+ const isAvailable = settledAvailability?.tag === "available";
125674
+ const manualCodeEntryAllowed = isAvailable ? settledAvailability.manualCodeEntryAllowed : false;
125411
125675
  return {
125412
125676
  discountUiOpen: state.discountUiOpen,
125413
125677
  setDiscountUiOpen: (isOpen) => dispatch({
@@ -125421,8 +125685,10 @@ function useDiscountCodeUi(options) {
125421
125685
  }),
125422
125686
  discountsAvailable: isAvailable,
125423
125687
  manualCodeEntryAllowed,
125424
- autoAppliedDiscount: isAvailable ? availability.autoAppliedDiscount : null,
125425
- discountsAvailableLoading: availability.tag === "loading"
125688
+ autoAppliedDiscount: isAvailable ? settledAvailability.autoAppliedDiscount : null,
125689
+ discountsAvailableLoading: availability.tag === "loading",
125690
+ discountAvailabilityRequestKey: requestPlan.key,
125691
+ settledDiscountAvailabilityRequestKey: availability.tag === "error" ? availability.requestKey : settledAvailability?.requestKey ?? null
125426
125692
  };
125427
125693
  }
125428
125694
  //#endregion
@@ -129611,6 +129877,7 @@ function getTicketTypeLineMax(input) {
129611
129877
  const initialEligibilityLookupState = {
129612
129878
  tag: "idle",
129613
129879
  eligibility: null,
129880
+ settledRequestKey: null,
129614
129881
  error: null
129615
129882
  };
129616
129883
  function eligibilityLookupReducer(state, action) {
@@ -129619,16 +129886,19 @@ function eligibilityLookupReducer(state, action) {
129619
129886
  case "loading-started": return {
129620
129887
  tag: "loading",
129621
129888
  eligibility: state.eligibility,
129889
+ settledRequestKey: state.settledRequestKey,
129622
129890
  error: null
129623
129891
  };
129624
129892
  case "resolved": return {
129625
129893
  tag: "resolved",
129626
129894
  eligibility: action.eligibility,
129895
+ settledRequestKey: action.requestKey,
129627
129896
  error: null
129628
129897
  };
129629
129898
  case "failed": return {
129630
129899
  tag: "failed",
129631
129900
  eligibility: null,
129901
+ settledRequestKey: null,
129632
129902
  error: action.message
129633
129903
  };
129634
129904
  default: return assertNever$5(action);
@@ -129734,9 +130004,23 @@ function toRegistrationOptionsSubject(subject, attendanceMode) {
129734
130004
  function useEligibility(params) {
129735
130005
  return useEligibilityWithDeps(params, eventRegistrationHooksDeps);
129736
130006
  }
130007
+ function eligibilityRequestKey(params) {
130008
+ return JSON.stringify({
130009
+ enabled: params.enabled,
130010
+ refreshKey: params.refreshKey ?? 0,
130011
+ subject: params.subject,
130012
+ attendanceMode: params.attendanceMode ?? null,
130013
+ ticketSelections: params.ticketSelectionsKey,
130014
+ selectedSlidingAmount: params.selectedSlidingAmount ?? null
130015
+ });
130016
+ }
129737
130017
  function useEligibilityWithDeps(params, deps) {
129738
130018
  const api = deps.useBlockApi();
129739
130019
  const ticketSelectionsKey = JSON.stringify(normalizeTicketSelectionLines(params.ticketSelections));
130020
+ const requestKey = eligibilityRequestKey({
130021
+ ...params,
130022
+ ticketSelectionsKey
130023
+ });
129740
130024
  const [state, dispatch] = useReducer(eligibilityLookupReducer, initialEligibilityLookupState);
129741
130025
  const requestIdRef = useRef(0);
129742
130026
  useEffect(() => {
@@ -129769,7 +130053,8 @@ function useEligibilityWithDeps(params, deps) {
129769
130053
  if (cancelled || requestIdRef.current !== requestId) return;
129770
130054
  dispatch({
129771
130055
  type: "resolved",
129772
- eligibility: transformRegistrationOptionsResponse(result)
130056
+ eligibility: transformRegistrationOptionsResponse(result),
130057
+ requestKey
129773
130058
  });
129774
130059
  } catch {
129775
130060
  if (cancelled || requestIdRef.current !== requestId) return;
@@ -129798,6 +130083,8 @@ function useEligibilityWithDeps(params, deps) {
129798
130083
  return {
129799
130084
  state,
129800
130085
  eligibility: state.eligibility,
130086
+ settledRequestKey: state.settledRequestKey,
130087
+ requestKey,
129801
130088
  isLoading: state.tag === "loading",
129802
130089
  error: state.error,
129803
130090
  creditState
@@ -130044,7 +130331,6 @@ const STRIPE_COMMISSION_FREE_REASONS = [
130044
130331
  "no_commission_plan",
130045
130332
  "billing_evidence_invalid",
130046
130333
  "fee_rounds_to_zero",
130047
- "non_commissionable_scope",
130048
130334
  "payment_not_stripe"
130049
130335
  ];
130050
130336
  const historicalContext = {
@@ -131057,6 +131343,68 @@ function buildOccurrenceRegistrationRequest(options, prepared, method, passId, m
131057
131343
  };
131058
131344
  }
131059
131345
  //#endregion
131346
+ //#region ../blocks/src/system/runtime/nodes/event-registration/useSettledCommerceView.ts
131347
+ function buildCandidate(input) {
131348
+ if (!input.eligibilityIsSettled || !input.eligibility || !input.currentEvent) return null;
131349
+ return {
131350
+ eventSelectionId: input.currentEvent.selectionId,
131351
+ discountContext: resolveDiscountContext({
131352
+ paymentSelection: input.paymentSelection,
131353
+ event: input.currentEvent,
131354
+ eventRequiresPayment: input.eventRequiresPayment,
131355
+ ticketsCount: input.ticketsCount
131356
+ }),
131357
+ subtotalCents: input.eligibility.price,
131358
+ summaryLines: input.eligibility.ticketLines.map((line) => ({
131359
+ pricingOptionId: line.pricingOptionId,
131360
+ label: line.label,
131361
+ quantity: line.quantity,
131362
+ unitPriceCents: line.unitPriceCents,
131363
+ subtotalCents: line.subtotalCents
131364
+ }))
131365
+ };
131366
+ }
131367
+ function eligibilityIsSettled(result) {
131368
+ return result.settledRequestKey === result.requestKey;
131369
+ }
131370
+ function viewIsStale(view, currentEvent, eligibilityState) {
131371
+ return view.eventSelectionId !== currentEvent?.selectionId || eligibilityState?.tag === "failed" || eligibilityState?.tag === "idle";
131372
+ }
131373
+ function requestIsSettled(discountUi) {
131374
+ return discountUi.discountAvailabilityRequestKey === "disabled" || discountUi.settledDiscountAvailabilityRequestKey === discountUi.discountAvailabilityRequestKey;
131375
+ }
131376
+ function discountRequest(view) {
131377
+ const discountContext = view?.discountContext ?? null;
131378
+ return {
131379
+ discountContext,
131380
+ subtotalCents: discountContext?.type === "event" && view?.subtotalCents !== null ? view?.subtotalCents : void 0
131381
+ };
131382
+ }
131383
+ function useSettledCommerceView(input) {
131384
+ const candidate = buildCandidate({
131385
+ eligibilityIsSettled: eligibilityIsSettled(input.eligibilityResult),
131386
+ eligibility: input.eligibility,
131387
+ currentEvent: input.currentEvent,
131388
+ paymentSelection: input.paymentSelection,
131389
+ eventRequiresPayment: input.eventRequiresPayment,
131390
+ ticketsCount: input.ticketsCount
131391
+ });
131392
+ const settledRef = useRef(candidate);
131393
+ if (settledRef.current && viewIsStale(settledRef.current, input.currentEvent, input.eligibilityResult.state)) settledRef.current = null;
131394
+ const requestView = candidate ?? settledRef.current;
131395
+ const discountUi = input.useDiscountCodeUi({
131396
+ api: input.api,
131397
+ ...discountRequest(requestView)
131398
+ });
131399
+ if (candidate && requestIsSettled(discountUi)) settledRef.current = candidate;
131400
+ return {
131401
+ discountUi,
131402
+ discountContext: settledRef.current?.discountContext ?? null,
131403
+ ticketSelectionSubtotalCents: settledRef.current?.subtotalCents ?? null,
131404
+ ticketSelectionSummaryLines: settledRef.current?.summaryLines ?? []
131405
+ };
131406
+ }
131407
+ //#endregion
131060
131408
  //#region ../blocks/src/system/runtime/nodes/event-registration/registrationWizardContext.ts
131061
131409
  function getEventSelectionDefaults(event) {
131062
131410
  const suggestedAmount = getSlidingScaleForEvent(event)?.suggestedAmount;
@@ -131210,10 +131558,6 @@ function isSoldOutWithoutWaitlist(input) {
131210
131558
  }
131211
131559
  //#endregion
131212
131560
  //#region ../blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.ts
131213
- function resolveDiscountSubtotalCents(context, subtotalCents) {
131214
- if (context?.type !== "event" || subtotalCents === null) return void 0;
131215
- return subtotalCents;
131216
- }
131217
131561
  function usesTieredPricing(event) {
131218
131562
  return event !== null && event !== void 0 ? publicEventPricingStrategy(event.pricing) === "tiered" : false;
131219
131563
  }
@@ -131665,30 +132009,15 @@ function useEventRegistrationWizardWithDeps(options, deps) {
131665
132009
  }
131666
132010
  setStep("select-tickets");
131667
132011
  };
131668
- const discountContext = useMemo(() => resolveDiscountContext({
131669
- paymentSelection,
131670
- event: currentEvent,
131671
- eventRequiresPayment,
131672
- ticketsCount
131673
- }), [
132012
+ const { discountUi, discountContext, ticketSelectionSubtotalCents, ticketSelectionSummaryLines } = useSettledCommerceView({
132013
+ api,
132014
+ useDiscountCodeUi: deps.useDiscountCodeUi,
132015
+ eligibilityResult,
132016
+ eligibility,
131674
132017
  currentEvent,
131675
132018
  eventRequiresPayment,
131676
132019
  paymentSelection,
131677
132020
  ticketsCount
131678
- ]);
131679
- const ticketSelectionSubtotalCents = eligibility?.price ?? null;
131680
- const ticketSelectionSummaryLines = useMemo(() => eligibility?.ticketLines.map((line) => ({
131681
- pricingOptionId: line.pricingOptionId,
131682
- label: line.label,
131683
- quantity: line.quantity,
131684
- unitPriceCents: line.unitPriceCents,
131685
- subtotalCents: line.subtotalCents
131686
- })) ?? [], [eligibility]);
131687
- const discountSubtotalCents = resolveDiscountSubtotalCents(discountContext, ticketSelectionSubtotalCents);
131688
- const discountUi = deps.useDiscountCodeUi({
131689
- api,
131690
- discountContext,
131691
- subtotalCents: discountSubtotalCents
131692
132021
  });
131693
132022
  const selectionMethod = paymentSelection.method;
131694
132023
  const shouldShowDiscountToggle = discountContext !== null && discountUi.manualCodeEntryAllowed && (selectionMethod === "stripe" || selectionMethod === "pass_bundle" || selectionMethod === "membership_bundle");
@@ -131853,6 +132182,34 @@ function useEventRegistrationWizardWithDeps(options, deps) {
131853
132182
  };
131854
132183
  }
131855
132184
  //#endregion
132185
+ //#region ../blocks/src/system/runtime/nodes/event-registration/useEventCheckoutHandoffRestore.ts
132186
+ function eventRegistrationReloadTarget(location) {
132187
+ return `${location.pathname}${location.search}#${EVENT_REGISTRATION_ANCHOR_ID}`;
132188
+ }
132189
+ function reloadAtEventRegistration() {
132190
+ const target = eventRegistrationReloadTarget(window.location);
132191
+ window.history.replaceState(window.history.state, "", target);
132192
+ window.location.reload();
132193
+ }
132194
+ const browserCheckoutHandoffRestoreDeps = {
132195
+ addPageShowListener: (listener) => window.addEventListener("pageshow", listener),
132196
+ removePageShowListener: (listener) => window.removeEventListener("pageshow", listener),
132197
+ reloadAtRegistration: reloadAtEventRegistration
132198
+ };
132199
+ function useEventCheckoutHandoffRestore(active) {
132200
+ useEventCheckoutHandoffRestoreWithDeps(active, browserCheckoutHandoffRestoreDeps);
132201
+ }
132202
+ function useEventCheckoutHandoffRestoreWithDeps(active, deps) {
132203
+ useEffect(() => {
132204
+ if (!active) return;
132205
+ const handlePageShow = (event) => {
132206
+ if (event.persisted) deps.reloadAtRegistration();
132207
+ };
132208
+ deps.addPageShowListener(handlePageShow);
132209
+ return () => deps.removePageShowListener(handlePageShow);
132210
+ }, [active, deps]);
132211
+ }
132212
+ //#endregion
131856
132213
  //#region ../blocks/src/system/runtime/nodes/shared/MagicLinkForm.state.ts
131857
132214
  const initialMagicLinkSubmissionState = Object.freeze({ tag: "idle" });
131858
132215
  function magicLinkSubmissionReducer(state, action) {
@@ -134568,6 +134925,7 @@ function EventRegistrationWizard(props) {
134568
134925
  events: events ?? [],
134569
134926
  maxTicketsNum
134570
134927
  });
134928
+ useEventCheckoutHandoffRestore(wizard.step === "redirecting");
134571
134929
  const [bookingOverlayOpen, setBookingOverlayOpen] = useState(false);
134572
134930
  const [floatingPortalRoot, setFloatingPortalRoot] = useState(null);
134573
134931
  useEffect(() => {
@@ -140327,6 +140685,7 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
140327
140685
  const eventSurface = filters?.eventSurface;
140328
140686
  const eventPresets = normalizeCsvString(filters?.eventPresets);
140329
140687
  const scheduleScope = filters?.scheduleScope;
140688
+ const seriesIds = filters?.seriesIds;
140330
140689
  const eventsRef = useRef(events);
140331
140690
  const loadingRef = useRef(loading);
140332
140691
  const hasMoreRef = useRef(hasMore);
@@ -140354,6 +140713,7 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
140354
140713
  const currentEvents = eventsRef.current;
140355
140714
  const lastEvent = options.reset ? void 0 : currentEvents[currentEvents.length - 1];
140356
140715
  const newEvents = await getPublicEvents({
140716
+ seriesIds,
140357
140717
  afterStartsAt: lastEvent ? lastEvent.startsAt : void 0,
140358
140718
  afterId: lastEvent ? lastEvent.occurrenceId : void 0,
140359
140719
  limit: pageSize,
@@ -140392,6 +140752,7 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
140392
140752
  eventSurface,
140393
140753
  eventPresets,
140394
140754
  scheduleScope,
140755
+ seriesIds,
140395
140756
  normalizedCategoryIds,
140396
140757
  normalizedStaffMemberId,
140397
140758
  normalizedVenueId
@@ -140401,7 +140762,7 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
140401
140762
  }, [fetchPage]);
140402
140763
  const initialFetchAttemptKeyRef = useRef(null);
140403
140764
  useEffect(() => {
140404
- if (!fetchInitialOnMount) return;
140765
+ if (!fetchInitialOnMount || seriesIds === "") return;
140405
140766
  if (!filtersMatchInitial) return;
140406
140767
  if (initialEventsRef.current.length > 0) return;
140407
140768
  if (eventsRef.current.length > 0) return;
@@ -140415,7 +140776,8 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
140415
140776
  fetchPage,
140416
140777
  filtersKey,
140417
140778
  filtersMatchInitial,
140418
- stage
140779
+ stage,
140780
+ seriesIds
140419
140781
  ]);
140420
140782
  const prevFiltersMatchInitialRef = useRef(filtersMatchInitial);
140421
140783
  const prevInitialEventsKeyRef = useRef(initialEventsKey);
@@ -140539,7 +140901,7 @@ function getEventFiltersError(state) {
140539
140901
  * const events = await api.getPublicEvents(params);
140540
140902
  * ```
140541
140903
  */
140542
- function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false, showStaffFilter = false, preFilterCategoryIds, preFilterStaffMemberId, preFilterVenueId, preFilterEventSurface, preFilterEventPresets, preFilterScheduleScope } = {}) {
140904
+ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false, showStaffFilter = false, preFilterSeriesIds, preFilterCategoryIds, preFilterStaffMemberId, preFilterVenueId, preFilterEventSurface, preFilterEventPresets, preFilterScheduleScope } = {}) {
140543
140905
  const api = useBlockApi();
140544
140906
  const [loadState, dispatchLoadState] = useReducer(eventFiltersLoadReducer, void 0, createInitialEventFiltersLoadState);
140545
140907
  const filters = getEventFiltersData(loadState);
@@ -140688,6 +141050,7 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
140688
141050
  setSelectedVenueId("all");
140689
141051
  }, []),
140690
141052
  getFilterParams: useCallback(() => {
141053
+ if (preFilterSeriesIds != null) return { seriesIds: preFilterSeriesIds };
140691
141054
  const params = {};
140692
141055
  if (fixedEventSurface) params.eventSurface = fixedEventSurface;
140693
141056
  if (fixedEventPresets) params.eventPresets = fixedEventPresets;
@@ -140701,6 +141064,7 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
140701
141064
  params.staffMemberId = fixedStaffMemberId ?? (selectedStaffMemberId !== "all" ? selectedStaffMemberId : void 0);
140702
141065
  return params;
140703
141066
  }, [
141067
+ preFilterSeriesIds,
140704
141068
  allowedCategoryIds,
140705
141069
  allowedCategorySet,
140706
141070
  fixedEventPresets,
@@ -140724,25 +141088,12 @@ const EventListingController = ({ render }) => {
140724
141088
  const hydration = render.hydration;
140725
141089
  const filtersIdBase = useId();
140726
141090
  const initialListEvents = useMemo(() => [...display.events], [display.events]);
140727
- const initialListFilters = useMemo(() => buildEventRuntimeFilters({
140728
- eventSurface: hydration.eventSurface,
140729
- filterEventPresets: hydration.filterEventPresets,
140730
- scheduleScope: hydration.scheduleScope,
140731
- filterCategoryIds: hydration.filterCategoryIds,
140732
- filterStaffMemberId: hydration.filterStaffMemberId,
140733
- filterVenueId: hydration.filterVenueId
140734
- }), [
140735
- hydration.eventSurface,
140736
- hydration.filterEventPresets,
140737
- hydration.scheduleScope,
140738
- hydration.filterCategoryIds,
140739
- hydration.filterStaffMemberId,
140740
- hydration.filterVenueId
140741
- ]);
141091
+ const initialListFilters = buildEventRuntimeFilters(hydration);
140742
141092
  const { categories, venues, staffMembers, selectedCategoryId, selectedStaffMemberId, selectedVenueId, loading: filtersLoading, shouldShowCategoryFilter, shouldShowVenueFilter, shouldShowStaffFilter, hasActiveFilters, setSelectedCategoryId, setSelectedStaffMemberId, setSelectedVenueId, resetFilters, getFilterParams } = useEventFilters({
140743
141093
  showCategoryFilter: hydration.showFilters ? hydration.showCategoryFilter : "never",
140744
141094
  showVenueFilter: hydration.showFilters ? hydration.showVenueFilter : false,
140745
141095
  showStaffFilter: hydration.showFilters ? hydration.showStaffFilter : false,
141096
+ preFilterSeriesIds: hydration.seriesIds,
140746
141097
  preFilterCategoryIds: hydration.filterCategoryIds ?? void 0,
140747
141098
  preFilterStaffMemberId: hydration.filterStaffMemberId ?? void 0,
140748
141099
  preFilterVenueId: hydration.filterVenueId ?? void 0,
@@ -141577,6 +141928,7 @@ function toEventCombinedControllerProps(props) {
141577
141928
  eventSurface: props.render.display.eventSurface,
141578
141929
  filterEventPresets: props.render.display.filterEventPresets,
141579
141930
  scheduleScope: props.render.display.scheduleScope,
141931
+ seriesIds: props.render.display.seriesIds,
141580
141932
  filterCategoryIds: props.render.display.filterCategoryIds,
141581
141933
  filterStaffMemberId: props.render.display.filterStaffMemberId,
141582
141934
  filterVenueId: props.render.display.filterVenueId,
@@ -141698,7 +142050,7 @@ const EventCombinedCalendarTab = ({ calendarTabViews, calendarView, calendarView
141698
142050
  const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout = "stack", listColumns = "3", eventsPerPage = 12, paginationAction = {
141699
142051
  kind: "loadMore",
141700
142052
  label: "Load more events"
141701
- }, 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 }) => {
142053
+ }, 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 }) => {
141702
142054
  const hydrationReady = useHydrationReady();
141703
142055
  const fetchInitialEventsOnMount = initialEvents == null;
141704
142056
  const resolvedShowFilters = showFilters ?? true;
@@ -141724,6 +142076,7 @@ const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout
141724
142076
  showCategoryFilter: resolvedShowFilters ? showCategoryFilter : "never",
141725
142077
  showVenueFilter: resolvedShowFilters ? resolvedShowVenueFilter : false,
141726
142078
  showStaffFilter: resolvedShowFilters ? resolvedShowStaffFilter : false,
142079
+ preFilterSeriesIds: seriesIds,
141727
142080
  preFilterCategoryIds: filterCategoryIds,
141728
142081
  preFilterStaffMemberId: filterStaffMemberId,
141729
142082
  preFilterVenueId: filterVenueId,
@@ -141731,21 +142084,15 @@ const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout
141731
142084
  preFilterEventPresets: filterEventPresets,
141732
142085
  preFilterScheduleScope: resolvedScheduleScope
141733
142086
  });
141734
- const initialListFilters = useMemo(() => buildEventRuntimeFilters({
142087
+ const initialListFilters = buildEventRuntimeFilters({
141735
142088
  eventSurface: resolvedEventSurface,
141736
142089
  filterEventPresets,
141737
142090
  scheduleScope: resolvedScheduleScope,
142091
+ seriesIds,
141738
142092
  filterCategoryIds,
141739
142093
  filterStaffMemberId,
141740
142094
  filterVenueId
141741
- }), [
141742
- resolvedEventSurface,
141743
- filterCategoryIds,
141744
- filterEventPresets,
141745
- filterStaffMemberId,
141746
- filterVenueId,
141747
- resolvedScheduleScope
141748
- ]);
142095
+ });
141749
142096
  const listFilters = useMemo(() => getFilterParams(), [getFilterParams]);
141750
142097
  const pageSize = eventsPerPage;
141751
142098
  const { events: paginatedEvents, loading: eventsLoading, error: eventsError, hasMore, loadMore } = useEventPagination({
@@ -142022,6 +142369,7 @@ const EventCalendarClient = ({ render }) => {
142022
142369
  eventSurface: display.eventSurface,
142023
142370
  filterEventPresets: display.filterEventPresets,
142024
142371
  scheduleScope: display.scheduleScope,
142372
+ seriesIds: display.seriesIds,
142025
142373
  filterCategoryIds: display.filterCategoryIds,
142026
142374
  filterStaffMemberId: display.filterStaffMemberId,
142027
142375
  filterVenueId: display.filterVenueId,
@@ -142045,6 +142393,7 @@ const EventCalendarWeekBoardClient = ({ render }) => {
142045
142393
  const { display, hydration } = render;
142046
142394
  const filters = useMemo(() => buildDisplayFilterParams(display), [
142047
142395
  display.eventSurface,
142396
+ display.seriesIds,
142048
142397
  display.filterCategoryIds,
142049
142398
  display.filterEventPresets,
142050
142399
  display.filterStaffMemberId,
@@ -142206,6 +142555,7 @@ function useEventCalendarFilterState(display) {
142206
142555
  showCategoryFilter: display.showFilters ? display.showCategoryFilter : "never",
142207
142556
  showVenueFilter: display.showFilters ? display.showVenueFilter : false,
142208
142557
  showStaffFilter: display.showFilters ? display.showStaffFilter : false,
142558
+ preFilterSeriesIds: display.seriesIds,
142209
142559
  preFilterCategoryIds: display.filterCategoryIds,
142210
142560
  preFilterStaffMemberId: display.filterStaffMemberId,
142211
142561
  preFilterVenueId: display.filterVenueId,
@@ -142239,6 +142589,7 @@ function buildDisplayFilterParams(display) {
142239
142589
  eventSurface: display.eventSurface,
142240
142590
  filterEventPresets: display.filterEventPresets,
142241
142591
  scheduleScope: display.scheduleScope,
142592
+ seriesIds: display.seriesIds,
142242
142593
  filterCategoryIds: display.filterCategoryIds,
142243
142594
  filterStaffMemberId: display.filterStaffMemberId,
142244
142595
  filterVenueId: display.filterVenueId
@@ -142838,7 +143189,7 @@ function NewsletterFormClient({ render }) {
142838
143189
  if (submitTarget.tag === "unavailable") {
142839
143190
  dispatchSubmission({
142840
143191
  type: "failed",
142841
- error: newsletterFormError("Newsletter list is not configured")
143192
+ error: newsletterFormError(SIGNUPS_PAUSED_MESSAGE)
142842
143193
  });
142843
143194
  return;
142844
143195
  }
@@ -142849,14 +143200,16 @@ function NewsletterFormClient({ render }) {
142849
143200
  });
142850
143201
  return;
142851
143202
  }
142852
- const visitorSelection = readVisitorSelection(formData, render.hydration);
142853
- if (visitorSelection === null) {
143203
+ const selection = readVisitorSelection(formData, render.hydration);
143204
+ const selectionError = visitorSelectionError(selection);
143205
+ if (selectionError) {
142854
143206
  dispatchSubmission({
142855
143207
  type: "failed",
142856
- error: newsletterFieldError(TOPIC_CHOICE_FIELD_ID, "Choose at least one email topic.")
143208
+ error: selectionError
142857
143209
  });
142858
143210
  return;
142859
143211
  }
143212
+ const visitorSelection = selection.tag === "chosen" ? selection.value : void 0;
142860
143213
  dispatchSubmission({ type: "submitted" });
142861
143214
  try {
142862
143215
  const result = await api.subscribeNewsletter({
@@ -143056,10 +143409,18 @@ function transportFailureMessage(err) {
143056
143409
  }
143057
143410
  return RETRY_SHORTLY_MESSAGE;
143058
143411
  }
143412
+ function visitorSelectionError(selection) {
143413
+ switch (selection.tag) {
143414
+ case "nothing_chosen": return newsletterFieldError(TOPIC_CHOICE_FIELD_ID, "Choose at least one email topic.");
143415
+ case "unusable": return newsletterFormError(SIGNUPS_PAUSED_MESSAGE);
143416
+ case "not_offered":
143417
+ case "chosen": return null;
143418
+ }
143419
+ }
143059
143420
  function readVisitorSelection(formData, hydration) {
143060
- if (hydration.choicePresentation !== "visitor_choice") return void 0;
143421
+ if (hydration.choicePresentation !== "visitor_choice") return { tag: "not_offered" };
143061
143422
  const ids = formData.getAll(TOPIC_CHOICE_FIELD_ID).flatMap((value) => typeof value === "string" ? [value] : []);
143062
- if (ids.length === 0) return null;
143423
+ if (ids.length === 0) return { tag: "nothing_chosen" };
143063
143424
  const raw = hydration.choiceProvider === "native" ? {
143064
143425
  provider: "native",
143065
143426
  topicIds: ids
@@ -143070,9 +143431,12 @@ function readVisitorSelection(formData, hydration) {
143070
143431
  provider: "mailchimp",
143071
143432
  interestIds: ids
143072
143433
  } : null;
143073
- if (raw === null) return null;
143434
+ if (raw === null) return { tag: "unusable" };
143074
143435
  const parsed = parseMailingListVisitorSelection(raw);
143075
- return parsed.ok ? parsed.value : null;
143436
+ return parsed.ok ? {
143437
+ tag: "chosen",
143438
+ value: parsed.value
143439
+ } : { tag: "unusable" };
143076
143440
  }
143077
143441
  function publicSignupError(outcome) {
143078
143442
  switch (outcome.tag) {
@@ -146493,6 +146857,26 @@ const headerRuntimeTransforms = [{
146493
146857
  run: resolveHeaderChromeRuntimeContract
146494
146858
  }];
146495
146859
  const defaultTransforms = createTransformRegistry([
146860
+ {
146861
+ id: "events.calendarSelectionParam",
146862
+ kind: "formatter",
146863
+ summary: "Resolve selected events instead of discovery filters",
146864
+ schema: z.object({ key: z.enum([
146865
+ "seriesIds",
146866
+ "eventSurface",
146867
+ "filterEventPresets",
146868
+ "scheduleScope",
146869
+ "filterCategoryIds",
146870
+ "filterStaffMemberId",
146871
+ "filterVenueId"
146872
+ ]) }),
146873
+ run(value, { key }) {
146874
+ const content = asPartialObject(value) ?? {};
146875
+ const selection = resolveEventSelection(content.eventSelection, content.selectedEventSeriesIds);
146876
+ if (selection.kind === "selected") return key === "seriesIds" ? selection.seriesIds : void 0;
146877
+ return key === "seriesIds" ? void 0 : content[key];
146878
+ }
146879
+ },
146496
146880
  {
146497
146881
  id: "events.calendarReadEnabled",
146498
146882
  kind: "formatter",
@@ -148242,9 +148626,56 @@ function generateNavLinkCSS(options) {
148242
148626
  if (baseRules.length > 0) cssChunks.unshift(`\n${selector} {\n ${baseRules.join("\n ")}\n}\n`);
148243
148627
  if (hoverRules.length > 0) cssChunks.push(`\n${hoverSelector} {\n ${hoverRules.join("\n ")}\n}\n`);
148244
148628
  if (activeRules.length > 0) cssChunks.push(`\n${activeSelector} {\n ${activeRules.join("\n ")}\n}\n`);
148629
+ cssChunks.push(navLinkFocusVisibleCss(selector, style, theme, tokens));
148245
148630
  cssChunks.push(generateInteractiveChildInheritanceCSS(selector));
148246
148631
  return cssChunks.join("");
148247
148632
  }
148633
+ /**
148634
+ * Keyboard focus indicator for nav links, in the header, the footer and header
148635
+ * dropdown menus — the three surfaces `generateNavLinkCSS` serves.
148636
+ *
148637
+ * Emitted unconditionally rather than as an effect, because focus visibility is
148638
+ * a floor rather than a style choice. Only the interaction-palette pill ever
148639
+ * wrote an `effects.focus` group, so every other nav — every `quiet` palette,
148640
+ * every footer, every dropdown — previously fell back to whatever outline the
148641
+ * browser drew.
148642
+ *
148643
+ * The outline takes the link's own resolved colour, so on a header that adapts
148644
+ * to the section it floats over it moves with the adaptation instead of
148645
+ * asserting a brand colour against an unknown backdrop.
148646
+ *
148647
+ * Where the style asks for `soft-glow`, the same halo goes on the outline. That
148648
+ * treatment exists because the theme has already conceded the resolved colour
148649
+ * alone is not reliable over an unpredictable backdrop — a hero photograph with
148650
+ * mixed luminance. Without it the text would stay legible by its halo while the
148651
+ * focus ring, which is the part with a contrast requirement of its own, would
148652
+ * not.
148653
+ *
148654
+ * A style that also paints a focus pill keeps it: this adds an outline around
148655
+ * that pill rather than replacing it.
148656
+ */
148657
+ function navLinkFocusVisibleCss(selector, style, theme, tokens) {
148658
+ const color = tokens.getColor(style.colorToken);
148659
+ const halo = buildTextContrastShadow({
148660
+ theme,
148661
+ colorToken: style.colorToken,
148662
+ treatment: style.contrastTreatment
148663
+ });
148664
+ return `
148665
+ ${selector}:focus-visible {
148666
+ outline: 2px solid ${color};
148667
+ outline-offset: ${focusOutlineOffset(selector)};${halo ? `\n box-shadow: ${halo};` : ""}
148668
+ }
148669
+ `;
148670
+ }
148671
+ /**
148672
+ * Dropdown items are full-width inside a panel with no horizontal padding, so
148673
+ * an outset outline would paint over and past the panel's own border. Keeping
148674
+ * it flush is the only way it reads as belonging to the item.
148675
+ */
148676
+ function focusOutlineOffset(selector) {
148677
+ return selector.includes("nav-dropdown-link") ? "-2px" : "3px";
148678
+ }
148248
148679
  function buildTextContrastShadow(input) {
148249
148680
  if (input.treatment !== "soft-glow") return null;
148250
148681
  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)";
@@ -154982,7 +155413,8 @@ const appointmentServicesBlockDefinition = {
154982
155413
  el("appointment-services", {
154983
155414
  sectionHeading: { $bind: { from: "content.heading" } },
154984
155415
  services: { $bind: { from: "data.services" } },
154985
- pathname: { $bind: { from: "$root.pathname" } }
155416
+ pathname: { $bind: { from: "$root.pathname" } },
155417
+ servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
154986
155418
  })
154987
155419
  ], { gap: "lg" })
154988
155420
  })]
@@ -161649,10 +162081,19 @@ const containerResponsiveThemeCss = `/*
161649
162081
  padding-top: 2.5rem;
161650
162082
  padding-bottom: 2.5rem;
161651
162083
  }
162084
+ /* Clearance for a surface that is not an authored block page.
162085
+ An authored page gets this through its opening block's container (see the
162086
+ overlay-clearance rule in styles.css). A reserved surface or a system
162087
+ destination page has no such block, so it consumes the same variable here.
162088
+ Marked with one class rather than per-surface selectors, because the last
162089
+ two additions to this family were both missed and shipped overlapping. */
161652
162090
  :where(.theme-scope)
161653
162091
  [data-site-document-layout-mode="header-overlay"]
161654
- [data-rb-reserved-surface].rb-reserved-surface-main {
161655
- padding-top: calc(var(--rb-reserved-surface-header-offset, 5.5rem) + 2.5rem);
162092
+ .rb-overlay-clearance-surface {
162093
+ padding-top: calc(
162094
+ var(--site-overlay-header-clearance, 5.5rem) +
162095
+ var(--site-overlay-opening-content-extra-pad, clamp(1rem, 2vw, 1.75rem))
162096
+ );
161656
162097
  }
161657
162098
  .rb-preview-editor-offset {
161658
162099
  padding-bottom: calc(
@@ -172009,6 +172450,23 @@ const containerResponsiveThemeCss = `/*
172009
172450
  gap: 0.5rem;
172010
172451
  }
172011
172452
 
172453
+ /* Error panel and field notes. The form block scopes these to its own
172454
+ data-block, so the newsletter form (which also renders in the footer)
172455
+ needs its own copy of the treatment. */
172456
+ :where(.theme-scope) .newsletter-form .fb-error:not([data-field-validation-message]) {
172457
+ background-color: var(--fb-error-bg);
172458
+ color: var(--fb-error-text);
172459
+ border: 1px solid var(--fb-error-border);
172460
+ border-radius: var(--rb-block-radius);
172461
+ padding: 1rem;
172462
+ font-size: 0.875rem;
172463
+ }
172464
+
172465
+ :where(.theme-scope) .newsletter-form [data-field-validation-message] {
172466
+ font-size: 0.875rem;
172467
+ color: var(--fb-error-text);
172468
+ }
172469
+
172012
172470
  /* Required indicator */
172013
172471
  :where(.theme-scope) .newsletter-required {
172014
172472
  color: rgb(var(--tb-primary));
@@ -186028,11 +186486,14 @@ const sdkSiteStyleConfigSchema = z.object({
186028
186486
  sectionOptions: sdkSectionOptionsConfigSchema.optional(),
186029
186487
  containerOptions: sdkContainerOptionsConfigSchema.optional()
186030
186488
  });
186031
- const sdkSiteLayoutConfigSchema = z.object({ footerBlocks: z.array(z.object({
186032
- id: z.string().min(1).optional(),
186033
- kind: z.string().min(1),
186034
- content: z.record(z.string(), z.unknown()).optional()
186035
- })).optional() });
186489
+ const sdkSiteLayoutConfigSchema = z.object({
186490
+ footerMode: footerModeSchema.optional(),
186491
+ footerBlocks: z.array(z.object({
186492
+ id: z.string().min(1).optional(),
186493
+ kind: z.string().min(1),
186494
+ content: z.record(z.string(), z.unknown()).optional()
186495
+ })).optional()
186496
+ });
186036
186497
  const sdkFieldSelectOptionSchema = z.object({
186037
186498
  value: z.string(),
186038
186499
  label: z.string()
@@ -186224,6 +186685,30 @@ function buildGoLiveDecision(requirements) {
186224
186685
  function findLaunchOverride(overrides, requirementId) {
186225
186686
  return overrides.find((override) => override.requirementId === requirementId) ?? null;
186226
186687
  }
186688
+ function deriveLaunchDomainRequirement(siteId, domainState) {
186689
+ const [title, description] = {
186690
+ connected: ["Domain connected", "A domain is already connected."],
186691
+ pending_setup: ["Connect a domain", "You can connect a domain later when you are ready to launch."],
186692
+ pending_verification: ["Domain added — connection pending", "Your domain has been added. Open Domains to check its connection and any remaining DNS steps."],
186693
+ partially_connected: ["Partially connected", "One or both addresses still need attention. Open Domains to see the DNS and secure connection checks."],
186694
+ check_unavailable: ["Domain connection check unavailable", "We couldn’t check your domain connection. Open Domains to check again."]
186695
+ }[domainState.kind];
186696
+ const state = domainState.kind === "connected" ? "complete" : "pending";
186697
+ return requirement({
186698
+ id: "connect_custom_domain",
186699
+ packId: "domain",
186700
+ priority: "optional",
186701
+ owner: "admin",
186702
+ state,
186703
+ title,
186704
+ description,
186705
+ action: domainState.kind === "pending_setup" ? openDashboardPathAction(siteId, "/settings/domains?setup=domain", "Set up domain") : openDashboardPathAction(siteId, "/settings/domains", domainState.kind === "connected" ? "Manage domains" : "Check domain connection"),
186706
+ evidence: domainState.kind !== "pending_setup" && domainState.domainIds.length > 0 ? {
186707
+ kind: "domain_connection",
186708
+ domainIds: domainState.domainIds
186709
+ } : evidenceFromDerivedState(state)
186710
+ });
186711
+ }
186227
186712
  function deriveLaunchReadiness(input) {
186228
186713
  const siteId = input.siteId ?? null;
186229
186714
  const overrides = input.overrides ?? [];
@@ -186327,17 +186812,7 @@ function deriveLaunchReadiness(input) {
186327
186812
  action: openDashboardPathAction(siteId, "/money/settings", "Connect payments"),
186328
186813
  evidence: evidenceFromDerivedState(input.payments.kind === "ready" ? "complete" : "pending")
186329
186814
  }));
186330
- requirements.push(requirement({
186331
- id: "connect_custom_domain",
186332
- packId: "domain",
186333
- priority: "optional",
186334
- state: input.customDomain.kind === "connected" ? "complete" : "pending",
186335
- owner: "admin",
186336
- title: "Connect a domain",
186337
- description: input.customDomain.kind === "connected" ? "A domain is already connected." : "You can connect a domain later when you are ready to launch.",
186338
- action: openDashboardPathAction(siteId, "/settings/domains?setup=domain", "Set up domain"),
186339
- evidence: evidenceFromDerivedState(input.customDomain.kind === "connected" ? "complete" : "pending")
186340
- }));
186815
+ requirements.push(deriveLaunchDomainRequirement(siteId, input.customDomain));
186341
186816
  const goLiveDecision = buildGoLiveDecision(requirements);
186342
186817
  return {
186343
186818
  requirements,
@@ -198032,6 +198507,71 @@ function useBlockReorder({ allowReordering, apiClient, siteId, owner, blockList,
198032
198507
  };
198033
198508
  }
198034
198509
  //#endregion
198510
+ //#region ../editor-blocks/src/block-editor/colourFieldVisibility.ts
198511
+ /** Only changes form presentation; the validation manifest and saved data stay intact. */
198512
+ function hideUnavailableColourFields(manifest, options) {
198513
+ if (options.colour && options.gradient) return manifest;
198514
+ const hiddenPaths = [];
198515
+ const visit = (fields, parent) => fields.flatMap((field) => {
198516
+ const path = parent ? `${parent}.${field.id}` : field.id;
198517
+ const widget = field.ui?.widget;
198518
+ if (widget === "backgroundColor" && !options.colour || widget === "backgroundGradient" && !options.gradient) {
198519
+ hiddenPaths.push(path);
198520
+ return [];
198521
+ }
198522
+ if (field.type === "group" || field.type === "modal") {
198523
+ const children = visit(field.schema.fields, path);
198524
+ if (!children.length) {
198525
+ hiddenPaths.push(path);
198526
+ return [];
198527
+ }
198528
+ return [{
198529
+ ...field,
198530
+ schema: {
198531
+ ...field.schema,
198532
+ fields: children
198533
+ }
198534
+ }];
198535
+ }
198536
+ if (field.type === "repeater") return [{
198537
+ ...field,
198538
+ ...field.schema ? { schema: {
198539
+ ...field.schema,
198540
+ fields: visit(field.schema.fields, path)
198541
+ } } : {},
198542
+ ...field.itemTypes ? { itemTypes: Object.fromEntries(Object.entries(field.itemTypes).map(([id, item]) => [id, {
198543
+ ...item,
198544
+ fields: visit(item.fields, path)
198545
+ }])) } : {}
198546
+ }];
198547
+ if (field.type === "tabGroup") {
198548
+ const tabs = field.tabs.flatMap((tab) => {
198549
+ const children = visit(tab.fields, path);
198550
+ const unavailableTab = tab.sdkSectionOption === "backgroundColor" && !options.colour || tab.sdkSectionOption === "backgroundGradient" && !options.gradient;
198551
+ return children.length && !unavailableTab ? [{
198552
+ ...tab,
198553
+ fields: children
198554
+ }] : [];
198555
+ });
198556
+ if (!tabs.length) {
198557
+ hiddenPaths.push(path);
198558
+ return [];
198559
+ }
198560
+ return [{
198561
+ ...field,
198562
+ tabs
198563
+ }];
198564
+ }
198565
+ return [field];
198566
+ });
198567
+ const fields = visit(manifest.fields, "");
198568
+ return {
198569
+ ...manifest,
198570
+ fields,
198571
+ promotedFields: manifest.promotedFields?.filter((path) => !hiddenPaths.some((hidden) => path === hidden || path.startsWith(`${hidden}.`)))
198572
+ };
198573
+ }
198574
+ //#endregion
198035
198575
  //#region ../editor-blocks/src/block-editor/settingsIntent.ts
198036
198576
  function isSectionStylesField(field) {
198037
198577
  return field.type === "modal" && field.id === "_sectionStyles";
@@ -198123,13 +198663,14 @@ function prepareBlockEditorManifest(input) {
198123
198663
  const mergedManifest = mergeManifestWithSdkOptions(input.manifest, input.blockKind, input.blockFieldOptions, input.blockFieldExtensions);
198124
198664
  const validationManifest = augmentManifestWithStyleGroups(mergedManifest, input.styleGroups, input.blockKind);
198125
198665
  const renderManifestBase = input.visibilityPolicy.kind === "hide-theme-v2-raw-style-fields" ? mergedManifest : validationManifest;
198666
+ const renderManifest = input.visibilityPolicy.kind === "hide-theme-v2-raw-style-fields" ? {
198667
+ ...renderManifestBase,
198668
+ fields: renderManifestBase.fields ? hideThemeV2NormalEditorRawStyleFieldsInRenderFields(renderManifestBase.fields) : renderManifestBase.fields,
198669
+ promotedFields: filterThemeV2NormalEditorRawPromotedFields(renderManifestBase.promotedFields, input.allowedPromotedFieldPaths)
198670
+ } : validationManifest;
198126
198671
  return {
198127
198672
  validationManifest,
198128
- renderManifest: hideEditorOwnedFields(input.visibilityPolicy.kind === "hide-theme-v2-raw-style-fields" ? {
198129
- ...renderManifestBase,
198130
- fields: renderManifestBase.fields ? hideThemeV2NormalEditorRawStyleFieldsInRenderFields(renderManifestBase.fields) : renderManifestBase.fields,
198131
- promotedFields: filterThemeV2NormalEditorRawPromotedFields(renderManifestBase.promotedFields, input.allowedPromotedFieldPaths)
198132
- } : validationManifest, input.blockKind)
198673
+ renderManifest: hideEditorOwnedFields(input.colourFieldOptions ? hideUnavailableColourFields(renderManifest, input.colourFieldOptions) : renderManifest, input.blockKind)
198133
198674
  };
198134
198675
  }
198135
198676
  //#endregion
@@ -198176,6 +198717,12 @@ function shouldShowMoveButtons(mode) {
198176
198717
  return mode === "full";
198177
198718
  }
198178
198719
  //#endregion
198720
+ //#region ../editor-blocks/src/block-editor/ColourFieldOptionsProvider.tsx
198721
+ const ColourFieldOptionsContext = createContext(void 0);
198722
+ function useColourFieldOptions() {
198723
+ return useContext(ColourFieldOptionsContext);
198724
+ }
198725
+ //#endregion
198179
198726
  //#region ../editor-blocks/src/BlockForm.tsx
198180
198727
  function focusPathForSignal(signal) {
198181
198728
  return signal && signal.kind !== "block" ? normalizeFocusPath(signal.fieldPath) : null;
@@ -198200,10 +198747,12 @@ function BlockForm({ siteId: _siteId, block, manifest, uiStore, hasRecoveryConfl
198200
198747
  manifest.promotedFields,
198201
198748
  pageDesignBlock
198202
198749
  ]);
198750
+ const colourFieldOptions = useColourFieldOptions();
198203
198751
  const preparedManifest = useMemo(() => prepareBlockEditorManifest({
198204
198752
  manifest,
198205
198753
  blockKind: block.kind,
198206
198754
  styleGroups: theme?.styleGroups,
198755
+ colourFieldOptions,
198207
198756
  blockFieldOptions,
198208
198757
  blockFieldExtensions,
198209
198758
  visibilityPolicy: hideThemeV2RawStyleFields$2 ? hideThemeV2RawStyleFields : showRawStyleFields,
@@ -198213,6 +198762,7 @@ function BlockForm({ siteId: _siteId, block, manifest, uiStore, hasRecoveryConfl
198213
198762
  manifest,
198214
198763
  block.kind,
198215
198764
  theme?.styleGroups,
198765
+ colourFieldOptions,
198216
198766
  blockFieldOptions,
198217
198767
  blockFieldExtensions,
198218
198768
  hideThemeV2RawStyleFields$2
@@ -198324,8 +198874,10 @@ function useBlockFormFocus({ enabled, focusSignal, formRootRef, onFocusHandled }
198324
198874
  block: "center"
198325
198875
  });
198326
198876
  } catch {}
198327
- target.setAttribute("data-editor-field-highlight", "true");
198328
- window.setTimeout(() => target.removeAttribute("data-editor-field-highlight"), 1500);
198877
+ if (path) {
198878
+ target.setAttribute("data-editor-field-highlight", "true");
198879
+ window.setTimeout(() => target.removeAttribute("data-editor-field-highlight"), 1500);
198880
+ }
198329
198881
  onFocusHandled?.(focusSignal.requestId);
198330
198882
  }, 0);
198331
198883
  return () => window.clearTimeout(timer);
@@ -199318,10 +199870,12 @@ function BlockSettingsModal({ block, manifest, uiStore, widgetOverrides, theme,
199318
199870
  const focusPath = settingsFocusPath(focusSignal, blockId);
199319
199871
  const hasDraftSnapshot = useStoreSelector(uiStore, (state) => blockId ? state.drafts.getBlockSnapshot(blockId) !== null : false);
199320
199872
  const { blockFieldOptions, blockFieldExtensions } = useSdkConfig();
199873
+ const colourFieldOptions = useColourFieldOptions();
199321
199874
  const preparedManifest = useMemo(() => prepareBlockEditorManifest({
199322
199875
  manifest,
199323
199876
  blockKind: block.kind,
199324
199877
  styleGroups: theme?.styleGroups,
199878
+ colourFieldOptions,
199325
199879
  blockFieldOptions,
199326
199880
  blockFieldExtensions,
199327
199881
  visibilityPolicy: hideThemeV2RawStyleFields$1 ? hideThemeV2RawStyleFields : showRawStyleFields
@@ -199329,6 +199883,7 @@ function BlockSettingsModal({ block, manifest, uiStore, widgetOverrides, theme,
199329
199883
  manifest,
199330
199884
  block.kind,
199331
199885
  theme?.styleGroups,
199886
+ colourFieldOptions,
199332
199887
  blockFieldOptions,
199333
199888
  blockFieldExtensions,
199334
199889
  hideThemeV2RawStyleFields$1
@@ -199829,7 +200384,7 @@ function menuActionLabel(action) {
199829
200384
  function BlockCard({ interactionReady, siteId, block, manifest, isFirst, isLast, isMoving, onMove, onDuplicate, onDelete, dragListeners, canReorder, collapsed, onCollapsedChange, highlighted, hasRecoveryConflict, focusSignal, onFocusHandled, onBlockSave, theme, widgetOverrides, uiStore, hideThemeV2RawStyleFields = false, pageDesignBlock = null, reorderControlMode = DEFAULT_REORDER_CONTROL_MODE, actionPresentation = DEFAULT_BLOCK_ACTION_PRESENTATION, currentStyleGuideVersionId, iconStyleGuideSummary, iconStyleGuideEditHref, onGenerateIconSet }) {
199830
200385
  const contentId = block.id ? `builder-block-content-${block.id}` : void 0;
199831
200386
  return /* @__PURE__ */ jsx(Card, {
199832
- className: cn$2("w-full p-0 transition-shadow", highlighted ? "builder-editor-block-highlight" : ""),
200387
+ className: "builder-editor-block-card w-full p-0 transition-colors",
199833
200388
  "data-block-id": block.id ?? void 0,
199834
200389
  "data-editor-block-highlight": highlighted ? "true" : void 0,
199835
200390
  children: /* @__PURE__ */ jsxs(Collapsible, {
@@ -224661,7 +225216,7 @@ function SiteOptionPickerField({ path, backend, config }) {
224661
225216
  label: config.label,
224662
225217
  description: config.description,
224663
225218
  error: error?.message,
224664
- hint: helperText ?? labels.emptySelection,
225219
+ hint: helperText,
224665
225220
  children: () => /* @__PURE__ */ jsxs("div", {
224666
225221
  className: "space-y-2",
224667
225222
  children: [/* @__PURE__ */ jsx(CommandMultiSelect, {
@@ -224725,6 +225280,12 @@ function SiteOptionPickerField({ path, backend, config }) {
224725
225280
  //#endregion
224726
225281
  //#region ../editor-blocks/src/widgets/site-option-picker/loaders.ts
224727
225282
  const siteOptionWidgetLabels = {
225283
+ eventSeries: {
225284
+ loading: "Loading events...",
225285
+ select: "Choose events",
225286
+ empty: "No events available. Create an event in Bookings first.",
225287
+ emptySelection: "Choose at least one event to show in this block."
225288
+ },
224728
225289
  eventCategories: {
224729
225290
  loading: "Loading categories...",
224730
225291
  select: "Select categories",
@@ -224751,6 +225312,17 @@ function mapEventCategoriesToSiteOptionItems(payload) {
224751
225312
  subtitle: category.identifier
224752
225313
  }));
224753
225314
  }
225315
+ function mapEventsToSiteOptionItems(events) {
225316
+ return events.flatMap((event) => event.schedules.kind === "ordinary" ? [{
225317
+ value: event.schedules.schedule.id,
225318
+ label: event.title,
225319
+ subtitle: event.slug
225320
+ }] : event.schedules.runs.filter((run) => (run.status === void 0 || run.status === "active") && (run.visibility === void 0 || run.visibility === "public")).map((run) => ({
225321
+ value: run.id,
225322
+ label: `${event.title} — ${run.title}`,
225323
+ subtitle: run.slug
225324
+ })));
225325
+ }
224754
225326
  function mapVenuesToSiteOptionItems(payload) {
224755
225327
  return payload.map((venue) => ({
224756
225328
  value: venue.id,
@@ -224766,6 +225338,14 @@ function mapStaffMembersToSiteOptionItems(payload) {
224766
225338
  }
224767
225339
  async function loadSiteOptionItemsFromApi({ apiClient, siteId, source }) {
224768
225340
  switch (source) {
225341
+ case "eventSeries": return mapEventsToSiteOptionItems(unwrapResponse(await apiClient({
225342
+ endpoint: "listEvents",
225343
+ params: {
225344
+ siteId,
225345
+ status: "active",
225346
+ visibility: "public"
225347
+ }
225348
+ })));
224769
225349
  case "eventCategories": return mapEventCategoriesToSiteOptionItems(unwrapResponse(await apiClient({
224770
225350
  endpoint: "listEventCategories",
224771
225351
  params: { siteId }
@@ -224789,6 +225369,7 @@ function createSiteOptionApiLoader(apiClient) {
224789
225369
  }
224790
225370
  function createSiteOptionWidgetAdapters({ loadItems, mapLoadError, renderManageLink }) {
224791
225371
  return {
225372
+ eventSeries: createSiteOptionWidgetAdapter("eventSeries", loadItems, mapLoadError, renderManageLink),
224792
225373
  eventCategories: createSiteOptionWidgetAdapter("eventCategories", loadItems, mapLoadError, renderManageLink),
224793
225374
  venues: createSiteOptionWidgetAdapter("venues", loadItems, mapLoadError, renderManageLink),
224794
225375
  staffMembers: createSiteOptionWidgetAdapter("staffMembers", loadItems, mapLoadError, renderManageLink)
@@ -231307,4 +231888,4 @@ function useSiteChromeCustomizeOptional() {
231307
231888
  return useContext(SiteChromeCustomizeContext);
231308
231889
  }
231309
231890
  //#endregion
231310
- export { FooterComposerPanel as $, Monitor as $a, FieldFrame as $i, coerceLinkedContentEntriesPayload as $n, runTransforms as $r, useMultiAutosave as $t, markApplySaving as A, DropdownMenu as Aa, buttonStyleSelectionParameterValue as Ai, containerResponsiveThemeCss as An, compileTransitionRuntime as Ar, RichTextField as At, setPaletteColors as B, X as Ba, ORDINARY_TEXT_MIN_CONTRAST_RATIO as Bi, compileManifestContentContract as Bn, curatedPalettes as Br, getBlockManifestFromSdkConfig as Bt, cancelPreview as C, DialogFooter as Ca, isRecord$17 as Ci, deriveLaunchReadiness as Cn, retargetCompiledRuntimeFieldsForContentAdjacency as Cr, ButtonVariantField as Ct, isPreviewingChange as D, CollapsibleContent as Da, assertNever$7 as Di, useApiMediaUploader as Dn, curatedSiteStyles as Dr, ReferenceField as Dt, dismissWarnings as E, Collapsible as Ea, asDesignBlockId as Ei, useMediaEditorOptional as En, componentRuntimeRulesForTheme as Er, MediaField as Et, previewFooterLook as F, DropdownMenuTrigger as Fa, buttonStyleSelectionKey as Fi, SITE_CHROME_VISIBLE_HEADER_SELECTOR as Fn, gradientToCss as Fr, LinkWidgetProvider as Ft, confirmAutosaveBatch as G, Sparkles as Ga, getFieldIntent as Gi, escapeStyleContent as Gn, backgroundAppearanceColorTokenNames as Gr, canRedoHistory as Gt, syncStyleConfiguratorState as H, Undo2 as Ha, paletteColorEntries as Hi, buildThemeRuntime as Hn, sectionTransitionFamilies as Hr, useEditorUiStore as Ht, previewHeaderLayout as I, Primitive as Ia, textColorStyle as Ii, SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR as In, GRADIENT_PRESETS as Ir, BlockEditor as It, idleEditorTransactionQueueState as J, RotateCcw as Ja, useSdkConfig as Ji, defaultTransforms as Jn, ctaButton as Jr, pushHistoryEntry as Jt, deriveTransactionCapabilities as K, Smartphone as Ka, isHeaderField as Ki, readBlockComposition as Kn, backgroundAppearanceQuickColorTokenNames as Kr, canUndoHistory as Kt, previewHeaderStyle as L, Button$1 as La, defaultThemeTokens as Li, planSiteOverlayHeaderClearance as Ln, GRADIENT_PRESET_IDS as Lr, hideThemeV2RawStyleFields as Lt, palettePreviewProjection as M, DropdownMenuItem as Ma, resolveButtonStyleSelection as Mi, makeDefaultBlockComponent as Mn, findFooterLook as Mr, EditorProvider as Mt, previewButtonStyle as N, DropdownMenuLabel as Na, updateButtonStyleHoverPreference as Ni, getBlockDefinition as Nn, getHeaderLayout as Nr, useEditor$1 as Nt, markApplyFailed as O, CollapsibleTrigger as Oa, makeBoundaryId as Oi, isSupportedLoaderEndpoint as On, designRuntimeRulesForTheme as Or, ReferenceWidgetProvider as Ot, previewCuratedPalette as P, DropdownMenuSeparator as Pa, updateButtonStyleSelectionChoice as Pi, projectRecurringSchedule as Pn, getHeaderStyle as Pr, LinkField as Pt, resolvePreviewSidebarTab as Q, Palette as Qa, unmapValueFromSelect as Qi, LINKED_CONTENT_ENTRY_META_KEY as Qn, parseBackgroundContent as Qr, recordsEqual as Qt, previewSiteStyle as R, cva as Ra, themeButtonClassName as Ri, visibleHeaderClearancePx as Rn, getGradientPreset as Rr, prepareBlockEditorManifest as Rt, applyTypographyDraftPatch as S, DialogDescription as Sa, isObjectRecord$1 as Si, DEFAULT_LAUNCH_READINESS_INPUT as Sn, retargetCompiledBoundaryRuntimeForContentAdjacency as Sr, EntryPickerWidgetProvider as St, deriveStyleConfiguratorCapabilities as T, DialogTitle as Ta, pageDesignEditorBackgroundOverrideOwner as Ti, MediaEditorContextProvider as Tn, planPageDesignLayoutLookCompatibility as Tr, FileField as Tt, toggleRow as U, TriangleAlert as Ua, paletteColorsSchema as Ui, DEFAULT_THEME_RESPONSIVE_MODE as Un, sectionTransitionFamilyForBoundaryOptionId as Ur, useEditorUiStoreInstance as Ut, styleConfiguratorHistoryEntryForPersistedSelection as V, Upload as Va, VARIANT_ROLES as Vi, validateManifestDraft as Vn, defaultSectionTransitionVariantForFamily as Vr, classifyHistoryShortcut as Vt, beginAutosaveBatch as W, Tablet as Wa, attachRenderableMediaAssetFields as Wi, getResponsiveScopeSpec as Wn, sectionTransitionVariantForBoundaryOptionId as Wr, useOptionalEditorUiStoreInstance as Wt, resolveStyleConfiguratorInitialSnapshot as X, Pencil as Xa, mapCurrentValueForSelect as Xi, resolvePageRouteTarget as Xn, EDITABLE_SURFACE_FORWARDING_PROP as Xr, undoHistory as Xt, rejectAutosaveBatch as Y, Redo2 as Ya, hasEmptyOption as Yi, resolveEntryRouteTarget as Yn, bindingSchema as Yr, redoHistory as Yt, createOptimisticActionRunner as Z, PenLine as Za, mapOptionValueForSelect as Zi, resolveRouteTarget as Zn, planSiteChromePlacement as Zr, unsafeAsLinkedContentEntryId as Zt, reportPreviewDesignError as _, TabsContent as _a, BlockApiProvider as _i, MediaEditor as _n, __exportAll as _o, heroCopyFragment as _r, loadMailingListAuthoringContext as _t, previewDesignHistoryDomainForCommand as a, SelectContent as aa, coerceInlineTextWithFallback as ai, parseReferenceKind as an, EllipsisVertical as ao, cardFragment as ar, useUISelector as at, planSiteChromeSelection as b, Dialog as ba, eventCalendarListLayoutOptions as bi, listEntryPageContentSlots as bn, applyCompiledRuntimeFieldsToContent as br, IconPickerField as bt, selectionSnapshotFromApplySiteStyleSelectionResponse as c, SelectValue as ca, Text$2 as ci, resolveContentTitle as cn, ChevronDown as co, blogFeaturedPostFragment as cr, useEntryController as ct, PreviewDesignCoordinatorProvider as d, SearchInput as da, getCurrentResolveImageUrlContext as di, ManifestForm as dn, unsafeAsEditorBlockId as do, formCopyFragment as dr, createSiteOptionWidgetAdapters as dt, useField as ea, parseBlockIconValue as ei, useDebouncedLatestSave as en, Maximize2 as eo, getLinkedContentEntryMeta as er, renderSiteChromeBlock as et, usePreviewDesignCoordinator as f, Popover as fa, resolveImageUrlWithContext as fi, createManifestFormAdapter as fn, unsafeAsEditorBlockValues as fo, testimonialsCarouselFragment as fr, SiteOptionPickerField as ft, PREVIEW_DESIGN_SAVE_ERROR_MESSAGE as g, Tabs as ga, siblingPath$1 as gi, createStoreBackend as gn, parseSiteId as go, ctaRowFragment as gr, MailingListTargetingField as gt, PREVIEW_DESIGN_LOAD_ERROR_MESSAGE as h, Input as ha, getAtPath as hi, evaluateVisibility as hn, parseMediaAssetId as ho, heroCtaRowFragment as hr, OfferingsPreviewWidgetProvider as ht, usePreviewDesignHistoryOrder as i, Select$1 as ia, logger$1 as ii, isAdapterReferenceKind as in, Eye as io, headingFragment as ir, ContentFieldsForm as it, openRow as j, DropdownMenuContent as ja, findButtonStyleRecipe as ji, createCustomBlockRegistry as jn, surfaceResolutionContextFromTheme as jr, RichTextWidgetProvider as jt, markApplySaved as k, Surface as ka, buttonStyleHoverPreferenceValue as ki, ThemeScope as kn, getCuratedSiteStyle as kr, useRichTextImagePicker as kt, deriveSiteStylePreviewUpdate as l, Callout as la, RichText as li, PaletteProvider as ln, Check as lo, singleButtonFragment as lr, useEntryEditorController as lt, usePreviewThemeOverlay as m, PopoverTrigger as ma, SECTION_BACKGROUND_MIN_SOURCE_WIDTH as mi, FormRenderer as mn, expectParsedBrandedId as mo, ctaCopyFragment as mr, OfferingsPreviewGroupOrderField as mt, useSiteChromeCustomizeOptional as n, TooltipContent as na, parseGeneratedIconSetId as ni, createSnapshotFromPageRecord as nn, Image as no, ImageResolveContextProvider as nr, PreviewInlineTextEditor as nt, selectPreviewDesignHistoryDomain as o, SelectItem as oa, inlineTextToPlainText as oi, deriveRouteMetadataPresentation as on, ChevronRight as oo, faqAccordionFragment as or, EditableBlockProvider as ot, PreviewThemeOverlayProvider as p, PopoverContent as pa, setContextResolveImageUrlContext as pi, createManifestValidation as pn, assertNever$10 as po, testimonialsHeadingFragment as pr, SiteOptionWidgetProvider as pt, enqueueTransaction as q, SlidersHorizontal as qa, SdkConfigProvider as qi, getDefaultComponentRegistry as qn, parseBackgroundAppearanceColorToken as qr, createHistoryState as qt, PreviewDesignHistoryOrderProvider as r, TooltipTrigger as ra, renderInlineText as ri, BUILT_IN_REFERENCE_KINDS as rn, GripVertical as ro, richTextFragment as rr, PreviewTextEditor as rt, buildApplySiteStyleSelectionBody as s, SelectTrigger as sa, isInlineTextEmpty as si, resolvePageRouteSlug as sn, ChevronLeft as so, faqHeadingFragment as sr, EntryControllerProvider as st, SiteChromeCustomizeProvider as t, Tooltip as ta, parseGeneratedIconAssetId as ti, createRoutingHelpers as tn, LoaderCircle as to, clientComponentRegistry as tr, PreviewRichTextEditor as tt, planConfiguratorPreview as u, CalloutDescription as ua, buildResolveImageUrlContext as ui, usePalette as un, parseFooterModuleId as uo, formEmbedFragment as ur, createSiteOptionApiLoader as ut, buildSiteChromeSelectionModels as v, TabsList as va, calendarWindowQuerySchema as vi, applyPageDesignEditorAction as vn, bodyCopyFragment as vr, MailingListTargetingProvider as vt, createStyleConfiguratorState as w, DialogHeader as wa, isThemeV2NormalEditorRawStyleFieldName as wi, AMBIENT_BACKGROUND_ROLES as wn, formatSiteChromeBackgroundTokenLabel as wr, ButtonWidgetProvider as wt, applyResolvedSelections as x, DialogContent as xa, bookingConsentCarrierSchema as xi, decodePublicProductCategorySelectorQuery as xn, compileEditorModelRuntime as xr, EntryPickerField as xt, cycleSiteChromeSelectionId as y, TabsTrigger as ya, eventCalendarListLayoutCompatibleDisplayModeValues as yi, getPageDesignEditorState as yn, defineFragment as yr, InlineTextField as yt, resetTypographyToSaved as z, cn$2 as za, parseThemeForPersistence as zi, resolveVariantKey as zn, parseGradientPresetId as zr, stripTopLevelRoutingUi as zt };
231891
+ export { FooterComposerPanel as $, Pencil as $a, mapCurrentValueForSelect as $i, coerceLinkedContentEntriesPayload as $n, runTransforms as $r, useMultiAutosave as $t, markApplySaving as A, CollapsibleContent as Aa, buttonStyleHoverPreferenceValue as Ai, containerResponsiveThemeCss as An, compileTransitionRuntime as Ar, RichTextField as At, setPaletteColors as B, Button$1 as Ba, parseThemeForPersistence as Bi, compileManifestContentContract as Bn, curatedPalettes as Br, getBlockManifestFromSdkConfig as Bt, cancelPreview as C, Dialog as Ca, isRecord$17 as Ci, deriveLaunchReadiness as Cn, retargetCompiledRuntimeFieldsForContentAdjacency as Cr, ButtonVariantField as Ct, isPreviewingChange as D, DialogHeader as Da, asDesignBlockId as Di, useApiMediaUploader as Dn, curatedSiteStyles as Dr, ReferenceField as Dt, dismissWarnings as E, DialogFooter as Ea, pageDesignEditorBackgroundOverrideOwner as Ei, useMediaEditorOptional as En, componentRuntimeRulesForTheme as Er, MediaField as Et, previewFooterLook as F, DropdownMenuItem as Fa, updateButtonStyleSelectionChoice as Fi, SITE_CHROME_VISIBLE_HEADER_SELECTOR as Fn, gradientToCss as Fr, LinkWidgetProvider as Ft, confirmAutosaveBatch as G, Undo2 as Ga, paletteModeSchema as Gi, escapeStyleContent as Gn, backgroundAppearanceColorTokenNames as Gr, canRedoHistory as Gt, syncStyleConfiguratorState as H, cn$2 as Ha, VARIANT_ROLES as Hi, buildThemeRuntime as Hn, sectionTransitionFamilies as Hr, useEditorUiStore as Ht, previewHeaderLayout as I, DropdownMenuLabel as Ia, buttonStyleSelectionKey as Ii, SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR as In, GRADIENT_PRESETS as Ir, BlockEditor as It, idleEditorTransactionQueueState as J, Sparkles as Ja, getFieldIntent as Ji, defaultTransforms as Jn, ctaButton as Jr, pushHistoryEntry as Jt, deriveTransactionCapabilities as K, TriangleAlert as Ka, resolveSdkFooterMode as Ki, readBlockComposition as Kn, backgroundAppearanceQuickColorTokenNames as Kr, canUndoHistory as Kt, previewHeaderStyle as L, DropdownMenuSeparator as La, textColorStyle as Li, planSiteOverlayHeaderClearance as Ln, GRADIENT_PRESET_IDS as Lr, hideThemeV2RawStyleFields as Lt, palettePreviewProjection as M, Surface as Ma, findButtonStyleRecipe as Mi, makeDefaultBlockComponent as Mn, findFooterLook as Mr, EditorProvider as Mt, previewButtonStyle as N, DropdownMenu as Na, resolveButtonStyleSelection as Ni, getBlockDefinition as Nn, getHeaderLayout as Nr, useEditor$1 as Nt, markApplyFailed as O, DialogTitle as Oa, assertNever$7 as Oi, isSupportedLoaderEndpoint as On, designRuntimeRulesForTheme as Or, ReferenceWidgetProvider as Ot, previewCuratedPalette as P, DropdownMenuContent as Pa, updateButtonStyleHoverPreference as Pi, projectRecurringSchedule as Pn, getHeaderStyle as Pr, LinkField as Pt, resolvePreviewSidebarTab as Q, Redo2 as Qa, hasEmptyOption as Qi, LINKED_CONTENT_ENTRY_META_KEY as Qn, parseBackgroundContent as Qr, recordsEqual as Qt, previewSiteStyle as R, DropdownMenuTrigger as Ra, defaultThemeTokens as Ri, visibleHeaderClearancePx as Rn, getGradientPreset as Rr, prepareBlockEditorManifest as Rt, applyTypographyDraftPatch as S, TabsTrigger as Sa, isObjectRecord$1 as Si, DEFAULT_LAUNCH_READINESS_INPUT as Sn, retargetCompiledBoundaryRuntimeForContentAdjacency as Sr, EntryPickerWidgetProvider as St, deriveStyleConfiguratorCapabilities as T, DialogDescription as Ta, isThemeV2NormalEditorRawStyleFieldName as Ti, MediaEditorContextProvider as Tn, planPageDesignLayoutLookCompatibility as Tr, FileField as Tt, toggleRow as U, X as Ua, paletteColorEntries as Ui, DEFAULT_THEME_RESPONSIVE_MODE as Un, sectionTransitionFamilyForBoundaryOptionId as Ur, useEditorUiStoreInstance as Ut, styleConfiguratorHistoryEntryForPersistedSelection as V, cva as Va, ORDINARY_TEXT_MIN_CONTRAST_RATIO as Vi, validateManifestDraft as Vn, defaultSectionTransitionVariantForFamily as Vr, classifyHistoryShortcut as Vt, beginAutosaveBatch as W, Upload as Wa, paletteColorsSchema as Wi, getResponsiveScopeSpec as Wn, sectionTransitionVariantForBoundaryOptionId as Wr, useOptionalEditorUiStoreInstance as Wt, resolveStyleConfiguratorInitialSnapshot as X, SlidersHorizontal as Xa, SdkConfigProvider as Xi, resolvePageRouteTarget as Xn, EDITABLE_SURFACE_FORWARDING_PROP as Xr, undoHistory as Xt, rejectAutosaveBatch as Y, Smartphone as Ya, isHeaderField as Yi, resolveEntryRouteTarget as Yn, bindingSchema as Yr, redoHistory as Yt, createOptimisticActionRunner as Z, RotateCcw as Za, useSdkConfig as Zi, resolveRouteTarget as Zn, planSiteChromePlacement as Zr, unsafeAsLinkedContentEntryId as Zt, reportPreviewDesignError as _, PopoverTrigger as _a, BlockApiProvider as _i, MediaEditor as _n, expectParsedBrandedId as _o, heroCopyFragment as _r, loadMailingListAuthoringContext as _t, previewDesignHistoryDomainForCommand as a, TooltipContent as aa, coerceInlineTextWithFallback as ai, parseReferenceKind as an, Image as ao, cardFragment as ar, useUISelector as at, planSiteChromeSelection as b, TabsContent as ba, eventCalendarListLayoutOptions as bi, listEntryPageContentSlots as bn, __exportAll as bo, applyCompiledRuntimeFieldsToContent as br, IconPickerField as bt, selectionSnapshotFromApplySiteStyleSelectionResponse as c, SelectContent as ca, Text$2 as ci, resolveContentTitle as cn, EllipsisVertical as co, blogFeaturedPostFragment as cr, useEntryController as ct, PreviewDesignCoordinatorProvider as d, SelectValue as da, getCurrentResolveImageUrlContext as di, ManifestForm as dn, ChevronDown as do, formCopyFragment as dr, createSiteOptionWidgetAdapters as dt, mapOptionValueForSelect as ea, parseBlockIconValue as ei, useDebouncedLatestSave as en, PenLine as eo, getLinkedContentEntryMeta as er, renderSiteChromeBlock as et, usePreviewDesignCoordinator as f, Callout as fa, resolveImageUrlWithContext as fi, createManifestFormAdapter as fn, Check as fo, testimonialsCarouselFragment as fr, SiteOptionPickerField as ft, PREVIEW_DESIGN_SAVE_ERROR_MESSAGE as g, PopoverContent as ga, siblingPath$1 as gi, createStoreBackend as gn, assertNever$10 as go, ctaRowFragment as gr, MailingListTargetingField as gt, PREVIEW_DESIGN_LOAD_ERROR_MESSAGE as h, Popover as ha, getAtPath as hi, evaluateVisibility as hn, unsafeAsEditorBlockValues as ho, heroCtaRowFragment as hr, OfferingsPreviewWidgetProvider as ht, usePreviewDesignHistoryOrder as i, Tooltip as ia, logger$1 as ii, isAdapterReferenceKind as in, LoaderCircle as io, headingFragment as ir, ContentFieldsForm as it, openRow as j, CollapsibleTrigger as ja, buttonStyleSelectionParameterValue as ji, createCustomBlockRegistry as jn, surfaceResolutionContextFromTheme as jr, RichTextWidgetProvider as jt, markApplySaved as k, Collapsible as ka, makeBoundaryId as ki, ThemeScope as kn, getCuratedSiteStyle as kr, useRichTextImagePicker as kt, deriveSiteStylePreviewUpdate as l, SelectItem as la, RichText as li, PaletteProvider as ln, ChevronRight as lo, singleButtonFragment as lr, useEntryEditorController as lt, usePreviewThemeOverlay as m, SearchInput as ma, SECTION_BACKGROUND_MIN_SOURCE_WIDTH as mi, FormRenderer as mn, unsafeAsEditorBlockId as mo, ctaCopyFragment as mr, OfferingsPreviewGroupOrderField as mt, useSiteChromeCustomizeOptional as n, FieldFrame as na, parseGeneratedIconSetId as ni, createSnapshotFromPageRecord as nn, Monitor as no, ImageResolveContextProvider as nr, PreviewInlineTextEditor as nt, selectPreviewDesignHistoryDomain as o, TooltipTrigger as oa, inlineTextToPlainText as oi, deriveRouteMetadataPresentation as on, GripVertical as oo, faqAccordionFragment as or, EditableBlockProvider as ot, PreviewThemeOverlayProvider as p, CalloutDescription as pa, setContextResolveImageUrlContext as pi, createManifestValidation as pn, parseFooterModuleId as po, testimonialsHeadingFragment as pr, SiteOptionWidgetProvider as pt, enqueueTransaction as q, Tablet as qa, attachRenderableMediaAssetFields as qi, getDefaultComponentRegistry as qn, parseBackgroundAppearanceColorToken as qr, createHistoryState as qt, PreviewDesignHistoryOrderProvider as r, useField as ra, renderInlineText as ri, BUILT_IN_REFERENCE_KINDS as rn, Maximize2 as ro, richTextFragment as rr, PreviewTextEditor as rt, buildApplySiteStyleSelectionBody as s, Select$1 as sa, isInlineTextEmpty as si, resolvePageRouteSlug as sn, Eye as so, faqHeadingFragment as sr, EntryControllerProvider as st, SiteChromeCustomizeProvider as t, unmapValueFromSelect as ta, parseGeneratedIconAssetId as ti, createRoutingHelpers as tn, Palette as to, clientComponentRegistry as tr, PreviewRichTextEditor as tt, planConfiguratorPreview as u, SelectTrigger as ua, buildResolveImageUrlContext as ui, usePalette as un, ChevronLeft as uo, formEmbedFragment as ur, createSiteOptionApiLoader as ut, buildSiteChromeSelectionModels as v, Input as va, calendarWindowQuerySchema as vi, applyPageDesignEditorAction as vn, parseMediaAssetId as vo, bodyCopyFragment as vr, MailingListTargetingProvider as vt, createStyleConfiguratorState as w, DialogContent as wa, corners as wi, AMBIENT_BACKGROUND_ROLES as wn, formatSiteChromeBackgroundTokenLabel as wr, ButtonWidgetProvider as wt, applyResolvedSelections as x, TabsList as xa, bookingConsentCarrierSchema as xi, decodePublicProductCategorySelectorQuery as xn, compileEditorModelRuntime as xr, EntryPickerField as xt, cycleSiteChromeSelectionId as y, Tabs as ya, eventCalendarListLayoutCompatibleDisplayModeValues as yi, getPageDesignEditorState as yn, parseSiteId as yo, defineFragment as yr, InlineTextField as yt, resetTypographyToSaved as z, Primitive as za, themeButtonClassName as zi, resolveVariantKey as zn, parseGradientPresetId as zr, stripTopLevelRoutingUi as zt };