@riverbankcms/sdk 0.140.0 → 0.141.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/dist/{PreviewEditorSidebar-CUyTzd5z.mjs → PreviewEditorSidebar-Q-fy9GYw.mjs} +3 -3
  2. package/dist/{PreviewEditorUI-Agkw4v5i.mjs → PreviewEditorUI-LYGzgk85.mjs} +2 -2
  3. package/dist/{SdkPreviewModeRuntime-DdbeAdS8.mjs → SdkPreviewModeRuntime-CoPYI5Jq.mjs} +72 -46
  4. package/dist/{SiteChromeCustomizeContext-CqGOz-Kv.mjs → SiteChromeCustomizeContext-D8LePX8x.mjs} +681 -196
  5. package/dist/_dts/api/src/contentRuntime.d.ts +12 -31
  6. package/dist/_dts/api/src/domainConnection.d.ts +4 -0
  7. package/dist/_dts/api/src/footerCompositionContracts.d.ts +25 -0
  8. package/dist/_dts/api/src/index.d.ts +1 -1
  9. package/dist/_dts/api/src/launchReadiness.d.ts +1 -0
  10. package/dist/_dts/api/src/navigation/dashboardSiteNav.d.ts +2 -1
  11. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +3 -26
  12. package/dist/_dts/api/src/siteOnboarding.d.ts +7 -0
  13. package/dist/_dts/billing/src/site-arrangements.d.ts +12 -3
  14. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -0
  15. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +2 -0
  16. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +2 -0
  17. package/dist/_dts/blocks/src/system/blocks/events/eventSelectionFields.d.ts +122 -0
  18. package/dist/_dts/blocks/src/system/blocks/events/shared/calendarWindow.d.ts +2 -1
  19. package/dist/_dts/blocks/src/system/blocks/events/shared/eventSelection.d.ts +11 -0
  20. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +2 -2
  21. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +47 -47
  22. package/dist/_dts/blocks/src/system/data/prefetchBlockData.d.ts +5 -0
  23. package/dist/_dts/blocks/src/system/data/utils.d.ts +1 -1
  24. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +27 -1
  25. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +12 -180
  26. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +6 -90
  27. package/dist/_dts/blocks/src/system/runtime/hooks/useEventFilters.d.ts +2 -1
  28. package/dist/_dts/blocks/src/system/runtime/nodes/appointment-services.d.ts +5 -1
  29. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.d.ts +4 -0
  30. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.state.d.ts +5 -0
  31. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.d.ts +3 -0
  32. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.state.d.ts +10 -3
  33. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventCheckoutHandoffRestore.d.ts +9 -0
  34. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +4 -5
  35. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useSettledCommerceView.d.ts +37 -0
  36. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +4 -3
  37. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +3 -0
  38. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +11 -101
  39. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +7 -2
  40. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/listOptions.d.ts +2 -0
  41. package/dist/_dts/blocks/src/system/transforms/registry/eventCalendar.d.ts +12 -0
  42. package/dist/_dts/commerce/src/purchase/bookingInstalmentSchedule.d.ts +4 -0
  43. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +3 -0
  44. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/loaders.d.ts +27 -1
  45. package/dist/_dts/sdk/src/public-api/contracts.d.ts +1 -1
  46. package/dist/_dts/sdk/src/version.d.ts +1 -1
  47. package/dist/_dts/theme-core/src/ThemeFontLoader.d.ts +17 -1
  48. package/dist/_dts/theme-core/src/buttons/affordanceSuppression.d.ts +17 -0
  49. package/dist/_dts/theme-core/src/buttons/buttonColourContract.d.ts +1 -1
  50. package/dist/_dts/theme-core/src/buttons/classNames.d.ts +16 -0
  51. package/dist/_dts/theme-core/src/buttons/generateButtonCss.d.ts +0 -6
  52. package/dist/_dts/theme-core/src/buttons/resolvedButtonCss.d.ts +4 -4
  53. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  54. package/dist/_dts/theme-core/src/hosted-booking-appearance.d.ts +54 -12
  55. package/dist/_dts/theme-core/src/index.d.ts +1 -1
  56. package/dist/client/{BookingConsentAgreement-CuKa82V4.mjs → BookingConsentAgreement-xJeYNdnb.mjs} +2 -2
  57. package/dist/client/{DiscountCodeDisclosure-BbYieKWB.mjs → DiscountCodeDisclosure-DdT6uzl9.mjs} +1 -1
  58. package/dist/client/{EventCombined.client-LTfR1Aby.mjs → EventCombined.client-Cp28uYuM.mjs} +11 -15
  59. package/dist/client/{EventListing.client-DUHpYSuo.mjs → EventListing.client-CD6AJsMr.mjs} +4 -17
  60. package/dist/client/{LeafletStaticMap-CHRupL6m.mjs → LeafletStaticMap-DBsAi9-e.mjs} +1 -1
  61. package/dist/client/{accordion-6HiIFxNL.mjs → accordion-6dwbOKYR.mjs} +1 -1
  62. package/dist/client/{bookingForm-Dlmid43H.mjs → bookingForm-CZE9_qPQ.mjs} +5 -5
  63. package/dist/client/bookings.mjs +175 -93
  64. package/dist/client/{carousel-DmkZRRq_.mjs → carousel-7VHGQARz.mjs} +1 -1
  65. package/dist/client/{cart-CIC24330.mjs → cart-Qg_mvQhh.mjs} +3 -3
  66. package/dist/client/{checkout-D1Zw9imo.mjs → checkout-D84rpgdr.mjs} +3 -3
  67. package/dist/client/client.mjs +602 -139
  68. package/dist/client/{context-Cy1OayHx.mjs → context-Ctp3T0Wr.mjs} +1 -1
  69. package/dist/client/{dates-aDcfoLHr.mjs → dates-DJKFcI_N.mjs} +2 -2
  70. package/dist/client/{eventCalendar-FQxMPAjf.mjs → eventCalendar-CK31z3vs.mjs} +11 -7
  71. package/dist/client/{eventCombined-Dr3ac6Hb.mjs → eventCombined-DiXd-ewn.mjs} +3 -3
  72. package/dist/client/{eventDetails-D-AzUHFQ.mjs → eventDetails-CTRgt2DK.mjs} +4 -4
  73. package/dist/client/{eventListing-B3XxBf3i.mjs → eventListing-Dy9vi_j_.mjs} +3 -3
  74. package/dist/client/{eventRegistration-I6EaokFD.mjs → eventRegistration-CnalYMr2.mjs} +124 -31
  75. package/dist/client/{form-BbWckVWY.mjs → form-eUiMveTT.mjs} +2 -2
  76. package/dist/client/{headerSection-C9qU4Y7x.mjs → headerSection-Dy9kQpB1.mjs} +2 -2
  77. package/dist/client/hooks.mjs +247 -32
  78. package/dist/client/{locationMap-CLCShvlG.mjs → locationMap-DalCmWU0.mjs} +2 -2
  79. package/dist/client/{newsletterForm-Briukxzi.mjs → newsletterForm-SDDPvhS0.mjs} +23 -10
  80. package/dist/client/{pricing-Copadu-2.mjs → pricing-OcMz4SnX.mjs} +1 -1
  81. package/dist/client/{productDetail-oujlRd-r.mjs → productDetail-BQrgHElM.mjs} +3 -3
  82. package/dist/client/{productList-BRiIRUcd.mjs → productList-OnPn_UJj.mjs} +3 -3
  83. package/dist/client/{propsDecoder-CB2KS_ko.mjs → propsDecoder-zBdsnS-N.mjs} +38 -8
  84. package/dist/client/rendering/client.mjs +446 -121
  85. package/dist/client/rendering/islands.mjs +17 -17
  86. package/dist/client/rendering.mjs +601 -138
  87. package/dist/client/{scrollToBlock-B1IS1_ua.mjs → scrollToBlock-BNM4Ob2Y.mjs} +28 -11
  88. package/dist/client/{shop-Vn6yNFED.mjs → shop-Bv1fPTwQ.mjs} +6 -6
  89. package/dist/client/{shop-commerce-BVTqipYp.mjs → shop-commerce-D4KNGaW8.mjs} +5 -5
  90. package/dist/client/{shop-commerce-store-BVnJVy7v.mjs → shop-commerce-store-2N5EV0Rc.mjs} +1 -1
  91. package/dist/client/{shopShared-COIeK77T.mjs → shopShared-DvJGdHTV.mjs} +3 -3
  92. package/dist/client/{useEventFilters-DzIUcS9n.mjs → useEventFilters-BBBvGDHQ.mjs} +17 -11
  93. package/dist/preview-next/client/runtime.mjs +3 -3
  94. package/dist/preview-next/editor-chrome.css +4 -8
  95. package/dist/{sdk-runtime-CnCLvZRv.mjs → sdk-runtime-Defnbfzw.mjs} +1 -1
  96. package/dist/{separator-DKDRJ1oH.mjs → separator-CZXO3Sb0.mjs} +1 -1
  97. package/dist/server/components.mjs +384 -62
  98. package/dist/server/config-validation.mjs +232 -26
  99. package/dist/server/config.mjs +232 -26
  100. package/dist/server/data.mjs +247 -32
  101. package/dist/server/index.mjs +1 -1
  102. package/dist/server/next.mjs +400 -69
  103. package/dist/server/page-converter.mjs +189 -25
  104. package/dist/server/prebuild.mjs +1 -1
  105. package/dist/server/rendering/server.mjs +399 -68
  106. package/dist/server/rendering.mjs +399 -68
  107. package/dist/server/routing.mjs +261 -33
  108. package/dist/server/server.mjs +248 -33
  109. package/dist/server/theme-bridge.mjs +47 -15
  110. package/dist/server/theme.mjs +1 -1
  111. package/dist/styles/index.css +28 -2
  112. package/package.json +1 -1
@@ -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";
@@ -80669,7 +80680,7 @@ const BUTTON_CONTRAST_POLICY = {
80669
80680
  nonTextMinimumRatio: 3,
80670
80681
  gradientSamplesPerSegment: 20,
80671
80682
  alphaBackgrounds: "reject-without-known-surface",
80672
- disabled: "retain-full-colour-contract"
80683
+ disabled: "validated-colour-pair-with-muted-control-opacity"
80673
80684
  };
80674
80685
  function formatButtonColourContractError(error) {
80675
80686
  switch (error.tag) {
@@ -81257,6 +81268,25 @@ function parseThemeForPersistence(value) {
81257
81268
  };
81258
81269
  }
81259
81270
  //#endregion
81271
+ //#region ../theme-core/src/buttons/affordanceSuppression.ts
81272
+ /**
81273
+ * Internal: the opt-out the generated affordance rule is written against.
81274
+ *
81275
+ * A button style may declare a trailing `affordance`, which the theme renders as
81276
+ * a CSS `::after` on every button of that variant. An authored button that
81277
+ * renders its own trailing icon must not also receive the theme's, or it shows
81278
+ * two.
81279
+ *
81280
+ * Deliberately not exported from `./index`. This used to be public, and two
81281
+ * block components reached past the theme to draw arrows of their own — one of
81282
+ * them doubling up on the styles that declare an affordance, both of them
81283
+ * overriding the twelve styles that deliberately declare none. Whether a button
81284
+ * carries a trailing affordance is the style's decision; the only caller that
81285
+ * legitimately opts out is the authored-button renderer, which reaches it
81286
+ * through `themeButtonClassNameWithTrailingIcon`.
81287
+ */
81288
+ const AFFORDANCE_SUPPRESS_CLASS = "rb-affordance-off";
81289
+ //#endregion
81260
81290
  //#region ../theme-core/src/buttons/classNames.ts
81261
81291
  /**
81262
81292
  * Parse content/runtime variant identifiers into the closed theme-button class
@@ -81289,6 +81319,27 @@ function themeButtonClassName(spec) {
81289
81319
  spec.extraClassName
81290
81320
  ].filter(Boolean).join(" ");
81291
81321
  }
81322
+ /**
81323
+ * Button classes for an authored button that renders its own trailing icon.
81324
+ *
81325
+ * A separate function rather than a flag on `themeButtonClassName`, because
81326
+ * there is exactly one caller and it should stay visible in a diff. The name
81327
+ * states what the caller knows to be true of its own markup — that it renders a
81328
+ * trailing icon — rather than what the theme does about it. The consequence is
81329
+ * the theme's to decide and to change; a caller naming the consequence would be
81330
+ * asserting a policy it does not own, and would quietly become a lie the moment
81331
+ * that policy moved.
81332
+ *
81333
+ * Do not reach for this to remove an arrow you simply do not want. A trailing
81334
+ * affordance is declared by the button style, and a block overriding that is the
81335
+ * defect this replaced.
81336
+ */
81337
+ function themeButtonClassNameWithTrailingIcon(spec) {
81338
+ return themeButtonClassName({
81339
+ ...spec,
81340
+ extraClassName: [spec.extraClassName, AFFORDANCE_SUPPRESS_CLASS].filter(Boolean).join(" ")
81341
+ });
81342
+ }
81292
81343
  //#endregion
81293
81344
  //#region ../theme-core/src/tokens/tokens.ts
81294
81345
  const defaultThemeTokens = {
@@ -83708,26 +83759,19 @@ function resolvedButtonFocusDeclarations(indicator, role) {
83708
83759
  ] : [["outline", value("outline", `3px solid ${indicator.colorCss}`)], ["outline-offset", value("outline-offset", "3px")]];
83709
83760
  }
83710
83761
  /**
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.
83762
+ * Disabled buttons are deliberately muted as unavailable controls. Native
83763
+ * disabled controls are exempt from active-control contrast requirements;
83764
+ * opacity distinguishes the state without introducing a focus-like outline.
83765
+ * Retaining pointer events lets the not-allowed cursor remain observable.
83715
83766
  */
83716
83767
  const RESOLVED_BUTTON_DISABLED_DECLARATIONS = [
83717
83768
  ["cursor", "not-allowed"],
83718
83769
  ["transform", "none"],
83719
83770
  ["box-shadow", "none"],
83720
- ["outline", "2px dashed currentColor"],
83721
- ["outline-offset", "-4px"]
83771
+ ["opacity", "0.55"]
83722
83772
  ];
83723
83773
  //#endregion
83724
83774
  //#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
83775
  const BUTTON_SIZE_NAMES = buttonSizeNameSchema.options;
83732
83776
  /**
83733
83777
  * Letter spacing token → CSS value.
@@ -86579,14 +86623,12 @@ function generateVariantCSS(variant, themeId, cardClasses, tokens, theme) {
86579
86623
  const shadowValue = generateShadowValue(shadow);
86580
86624
  rules.push(`box-shadow: ${shadowValue}`);
86581
86625
  }
86582
- rules.push(`display: flex`);
86583
- rules.push(`flex-direction: column`);
86584
- rules.push(`position: relative`);
86585
- rules.push(`overflow: visible`);
86626
+ const structureSelector = cardClasses.map((cardClass) => `:where([data-theme-scope="${themeId}"]) :where(.${cardClass})`).join(",\n");
86586
86627
  const mediaRadius = MEDIA_CORNER_MAP[corners];
86587
86628
  const mediaRules = [`border-top-left-radius: ${mediaRadius}`, `border-top-right-radius: ${mediaRadius}`];
86588
86629
  const contentRules = [`padding: ${resolveContentPadding(variant)}`];
86589
86630
  return [
86631
+ `${structureSelector} {\n display: flex;\n flex-direction: column;\n position: relative;\n overflow: visible;\n}`,
86590
86632
  `${containerSelector} {\n ${rules.join(";\n ")};\n}`,
86591
86633
  ...cardDecorationPseudoRules(containerSelectors, variant.decorations, resolveColor),
86592
86634
  `${fallbackBackgroundSelector} {\n background: transparent;\n}`,
@@ -89614,6 +89656,7 @@ const calendarWindowQuerySchema = z.object({
89614
89656
  eventSurface: z.enum(eventSurfaceScopeValues).optional(),
89615
89657
  eventPresets: z.string().optional(),
89616
89658
  scheduleScope: z.enum(eventScheduleScopeValues).optional(),
89659
+ seriesIds: z.string().optional(),
89617
89660
  categoryIds: z.string().optional(),
89618
89661
  venueId: z.string().transform(normalizeCalendarFilterId).optional(),
89619
89662
  staffMemberId: z.string().transform(normalizeCalendarFilterId).optional()
@@ -89646,6 +89689,7 @@ function calendarQueryKey(siteId, stage, filters) {
89646
89689
  filters.eventSurface ?? "all",
89647
89690
  normalizedCsv(filters.eventPresets),
89648
89691
  filters.scheduleScope ?? "any",
89692
+ ...filters.seriesIds === void 0 ? [] : [normalizedCsv(filters.seriesIds)],
89649
89693
  normalizedCsv(filters.categoryIds),
89650
89694
  normalizeCalendarFilterId(filters.venueId) ?? "",
89651
89695
  normalizeCalendarFilterId(filters.staffMemberId) ?? "",
@@ -93845,17 +93889,16 @@ const ButtonNode = ({ value, children, href, variantId = "primary", size = "md",
93845
93889
  console.warn("[ButtonNode] Missing href for link-required button");
93846
93890
  return null;
93847
93891
  }
93848
- const extraClassName = affordanceIcon ? [className, AFFORDANCE_SUPPRESS_CLASS].filter(Boolean).join(" ") : className;
93849
93892
  const resolvedVariantId = parseThemeButtonVariantId(variantId);
93850
93893
  if (variantId && !resolvedVariantId) {
93851
93894
  console.error("[ButtonNode] Invalid button variant", { variantId });
93852
93895
  return null;
93853
93896
  }
93854
- const combinedClassName = resolvedVariantId ? themeButtonClassName({
93897
+ const combinedClassName = resolvedVariantId ? (affordanceIcon ? themeButtonClassNameWithTrailingIcon : themeButtonClassName)({
93855
93898
  variant: resolvedVariantId,
93856
93899
  size,
93857
- extraClassName
93858
- }) : extraClassName;
93900
+ extraClassName: className
93901
+ }) : className;
93859
93902
  if (resolvedHref) return /* @__PURE__ */ jsxs("a", {
93860
93903
  href: resolvedHref,
93861
93904
  target,
@@ -95633,6 +95676,7 @@ const publicPricingSchema = z.object({
95633
95676
  });
95634
95677
  const publicAppointmentServiceSchema = z.object({
95635
95678
  id: z.string().min(1),
95679
+ slug: z.string().min(1).optional(),
95636
95680
  title: z.string(),
95637
95681
  description: z.string().nullable().optional(),
95638
95682
  durationMinutes: z.number().int().positive(),
@@ -95709,7 +95753,7 @@ function formatAmountOrFree(amount, currency) {
95709
95753
  currency
95710
95754
  }, { decimals: "auto" });
95711
95755
  }
95712
- function buildRows(services, pathname) {
95756
+ function buildRows(services, pathname, servicePathPrefix) {
95713
95757
  return services.map((service) => ({
95714
95758
  id: service.id,
95715
95759
  title: service.title,
@@ -95720,7 +95764,8 @@ function buildRows(services, pathname) {
95720
95764
  href: resolveDedicatedBookingHref(pathname, {
95721
95765
  kind: "appointment_service",
95722
95766
  serviceId: service.id
95723
- })
95767
+ }),
95768
+ detailsHref: servicePathPrefix && service.slug ? `${servicePathPrefix.replace(/\/$/, "")}/${encodeURIComponent(service.slug)}` : null
95724
95769
  }));
95725
95770
  }
95726
95771
  function buildAppointmentServicesView(input) {
@@ -95739,13 +95784,14 @@ function buildAppointmentServicesView(input) {
95739
95784
  };
95740
95785
  return {
95741
95786
  kind: "items",
95742
- rows: buildRows(parsed.services, input.pathname)
95787
+ rows: buildRows(parsed.services, input.pathname, input.servicePathPrefix ?? null)
95743
95788
  };
95744
95789
  }
95745
- function AppointmentServicesNode({ sectionHeading, services, pathname, className }) {
95790
+ function AppointmentServicesNode({ sectionHeading, services, pathname, servicePathPrefix, className }) {
95746
95791
  const view = buildAppointmentServicesView({
95747
95792
  services,
95748
- pathname: typeof pathname === "string" ? pathname : void 0
95793
+ pathname: typeof pathname === "string" ? pathname : void 0,
95794
+ servicePathPrefix: typeof servicePathPrefix === "string" ? servicePathPrefix : null
95749
95795
  });
95750
95796
  const rootClassName = `appointment-services ${className ?? ""}`.trim();
95751
95797
  const RowTitle = sectionHeading ? "h3" : "h2";
@@ -95776,7 +95822,10 @@ function AppointmentServicesNode({ sectionHeading, services, pathname, className
95776
95822
  children: [
95777
95823
  /* @__PURE__ */ jsx(RowTitle, {
95778
95824
  className: "appointment-services-row-title rb-text-lg rb-font-medium rb-leading-tight",
95779
- children: row.title
95825
+ children: row.detailsHref ? /* @__PURE__ */ jsx("a", {
95826
+ href: row.detailsHref,
95827
+ children: row.title
95828
+ }) : row.title
95780
95829
  }),
95781
95830
  row.description ? /* @__PURE__ */ jsx("p", {
95782
95831
  className: "appointment-services-row-description rb-text-sm rb-leading-6 status-muted",
@@ -98687,12 +98736,12 @@ const EventCompactRow = ({ event, buttonVariant = "primary", buttonText }) => {
98687
98736
  }), cta.hidden ? /* @__PURE__ */ jsx("span", {
98688
98737
  className: "event-compact-row-status",
98689
98738
  children: cta.label
98690
- }) : /* @__PURE__ */ jsxs("a", {
98739
+ }) : /* @__PURE__ */ jsx("a", {
98691
98740
  href: cta.href,
98692
98741
  target: cta.external ? "_blank" : void 0,
98693
98742
  rel: cta.external ? "noopener noreferrer" : void 0,
98694
98743
  className: `${buttonClass} event-compact-row-cta`,
98695
- children: [/* @__PURE__ */ jsx("span", { children: cta.label }), /* @__PURE__ */ jsx(ArrowRightIcon, { "aria-hidden": "true" })]
98744
+ children: /* @__PURE__ */ jsx("span", { children: cta.label })
98696
98745
  })]
98697
98746
  })]
98698
98747
  })]
@@ -98891,6 +98940,35 @@ const calendarTabViewsSchema = z.enum([
98891
98940
  "week"
98892
98941
  ]);
98893
98942
  //#endregion
98943
+ //#region ../blocks/src/system/blocks/events/shared/eventSelection.ts
98944
+ /** Invalid saved selections fail closed rather than widening discovery. */
98945
+ function resolveEventSelection(mode, value) {
98946
+ if (mode !== "selected") return { kind: "matching" };
98947
+ const candidates = Array.isArray(value) ? value : typeof value === "string" ? value.split(",").filter(Boolean) : [];
98948
+ const ids = [];
98949
+ for (const candidate of candidates) {
98950
+ if (typeof candidate !== "string") return {
98951
+ kind: "selected",
98952
+ seriesIds: []
98953
+ };
98954
+ const parsed = parseEventSeriesId(candidate.trim());
98955
+ if (!parsed.ok) return {
98956
+ kind: "selected",
98957
+ seriesIds: []
98958
+ };
98959
+ ids.push(parsed.value);
98960
+ }
98961
+ return {
98962
+ kind: "selected",
98963
+ seriesIds: [...new Set(ids)].sort()
98964
+ };
98965
+ }
98966
+ /** Undefined means discovery; an empty string is an explicitly empty selection. */
98967
+ function eventSeriesScopeCsv(value) {
98968
+ if (value == null) return void 0;
98969
+ return typeof value === "string" ? value : value.join(",");
98970
+ }
98971
+ //#endregion
98894
98972
  //#region ../blocks/src/system/blocks/events/shared/runGrouping.ts
98895
98973
  function isWholeSeriesPublicEvent(event) {
98896
98974
  return event.bookingScope === "whole_series";
@@ -100251,6 +100329,7 @@ function normalizeFilterId(value) {
100251
100329
  return id === "all" ? void 0 : id;
100252
100330
  }
100253
100331
  function buildEventRuntimeFilters(input) {
100332
+ if (input.seriesIds != null) return { seriesIds: input.seriesIds };
100254
100333
  const params = {};
100255
100334
  if (input.eventSurface && input.eventSurface !== "all") params.eventSurface = input.eventSurface;
100256
100335
  const eventPresets = normalizeCsvString(input.filterEventPresets);
@@ -100266,6 +100345,7 @@ function buildEventRuntimeFilters(input) {
100266
100345
  }
100267
100346
  function getEventRuntimeFiltersKey(filters) {
100268
100347
  return JSON.stringify({
100348
+ seriesIds: filters?.seriesIds == null ? null : [...new Set(filters.seriesIds.split(",").filter(Boolean))].sort().join(","),
100269
100349
  categoryIds: normalizeCsvString(filters?.categoryIds),
100270
100350
  staffMemberId: normalizeOptionalId(filters?.staffMemberId),
100271
100351
  venueId: normalizeOptionalId(filters?.venueId),
@@ -100286,6 +100366,7 @@ const eventCollectionFilterSourceSchemaShape = {
100286
100366
  eventSurface: eventSurfaceScopeSchema$1.nullable().optional(),
100287
100367
  filterEventPresets: z.union([z.string(), z.array(z.string())]).nullable().optional(),
100288
100368
  scheduleScope: eventScheduleScopeSchema$1.nullable().optional(),
100369
+ seriesIds: z.union([z.string(), z.array(z.string())]).nullable().optional(),
100289
100370
  filterCategoryIds: z.union([z.string(), z.array(z.string())]).nullable().optional(),
100290
100371
  filterStaffMemberId: z.string().nullable().optional(),
100291
100372
  filterVenueId: z.string().nullable().optional()
@@ -100332,6 +100413,7 @@ const eventCollectionDisplaySchemaShape = {
100332
100413
  eventSurface: eventSurfaceScopeSchema$1,
100333
100414
  filterEventPresets: z.string().nullable(),
100334
100415
  scheduleScope: eventScheduleScopeSchema$1,
100416
+ seriesIds: z.string().nullable().optional(),
100335
100417
  filterCategoryIds: z.string().nullable(),
100336
100418
  filterStaffMemberId: z.string().nullable(),
100337
100419
  filterVenueId: z.string().nullable(),
@@ -100379,11 +100461,15 @@ function buildEventCollectionDisplay(source) {
100379
100461
  };
100380
100462
  }
100381
100463
  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,
100464
+ const selected = source.seriesIds != null;
100465
+ const matchingFilters = selected ? {
100466
+ eventSurface: "all",
100467
+ filterEventPresets: null,
100468
+ scheduleScope: "any",
100469
+ filterCategoryIds: null,
100470
+ filterStaffMemberId: null,
100471
+ filterVenueId: null
100472
+ } : {
100387
100473
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
100388
100474
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
100389
100475
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
@@ -100391,6 +100477,14 @@ function buildEventCollectionFilterDisplay(source) {
100391
100477
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
100392
100478
  filterVenueId: normalizeEventVenueId(source.filterVenueId)
100393
100479
  };
100480
+ return {
100481
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
100482
+ showFilters: selected ? false : source.showFilters ?? true,
100483
+ showCategoryFilter: source.showCategoryFilter ?? "auto",
100484
+ showVenueFilter: source.showVenueFilter ?? false,
100485
+ showStaffFilter: source.showStaffFilter ?? true,
100486
+ ...matchingFilters
100487
+ };
100394
100488
  }
100395
100489
  function buildEventCollectionPresentationDisplay(source) {
100396
100490
  return {
@@ -100405,14 +100499,15 @@ function buildEventCollectionPresentationDisplay(source) {
100405
100499
  }
100406
100500
  function buildEventCollectionHydration(source, now = /* @__PURE__ */ new Date()) {
100407
100501
  const timeZone = source.calendarWindow?.scope.timeZone ?? toBookingTimeZone(source.bookingTimeZone);
100502
+ const selected = source.seriesIds != null;
100408
100503
  return {
100409
100504
  calendarWindow: source.calendarWindow ?? void 0,
100410
100505
  siteId: source.siteId,
100411
100506
  stage: source.stage,
100412
100507
  prefetchedEvents: source.events != null,
100413
- eventSurface: normalizeEventSurfaceScope(source.eventSurface),
100414
- filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
100415
- scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
100508
+ eventSurface: selected ? "all" : normalizeEventSurfaceScope(source.eventSurface),
100509
+ filterEventPresets: selected ? null : normalizeEventSurfacePresetsCsv(source.filterEventPresets),
100510
+ scheduleScope: selected ? "any" : normalizeEventScheduleScope(source.scheduleScope),
100416
100511
  calendarContext: {
100417
100512
  timeZone,
100418
100513
  initialToday: source.calendarWindow?.initialToday ?? getLocalScheduleDate(now, timeZone)
@@ -100982,13 +101077,10 @@ function OfferingsPreviewContent(props) {
100982
101077
  }),
100983
101078
  groupCta ? /* @__PURE__ */ jsx("footer", {
100984
101079
  className: "offerings-preview-card-footer rb-mt-auto rb-flex",
100985
- children: /* @__PURE__ */ jsxs("a", {
101080
+ children: /* @__PURE__ */ jsx("a", {
100986
101081
  className: groupLinkClass,
100987
101082
  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
- })]
101083
+ children: /* @__PURE__ */ jsx("span", { children: groupCta.label })
100992
101084
  })
100993
101085
  }) : null
100994
101086
  ]
@@ -114276,6 +114368,7 @@ function isDisplayMediaKind(kind) {
114276
114368
  }
114277
114369
  const siteOptionSources = [
114278
114370
  "eventCategories",
114371
+ "eventSeries",
114279
114372
  "venues",
114280
114373
  "staffMembers"
114281
114374
  ];
@@ -119653,6 +119746,65 @@ const formBlockDefinition = {
119653
119746
  runtime: formBlockRuntime
119654
119747
  };
119655
119748
  //#endregion
119749
+ //#region ../blocks/src/system/blocks/events/eventSelectionFields.ts
119750
+ const eventSelectionFields = [{
119751
+ id: "eventSelection",
119752
+ type: "select",
119753
+ label: "Events to show",
119754
+ required: false,
119755
+ multiple: false,
119756
+ defaultValue: "matching",
119757
+ options: [{
119758
+ value: "matching",
119759
+ label: "All matching events"
119760
+ }, {
119761
+ value: "selected",
119762
+ label: "Selected events"
119763
+ }],
119764
+ ui: { intent: "behavior" }
119765
+ }, createSiteOptionSelectField({
119766
+ id: "selectedEventSeriesIds",
119767
+ label: "Selected events",
119768
+ description: "Show upcoming dates for these events. Other event filters do not apply.",
119769
+ required: false,
119770
+ multiple: true,
119771
+ defaultValue: [],
119772
+ optionSource: "eventSeries",
119773
+ ui: {
119774
+ intent: "behavior",
119775
+ searchThreshold: 1,
119776
+ visibleWhen: {
119777
+ field: "eventSelection",
119778
+ equals: "selected"
119779
+ }
119780
+ }
119781
+ })];
119782
+ function withEventSelectionVisibility(field) {
119783
+ if (![
119784
+ "eventSurface",
119785
+ "filterEventPresets",
119786
+ "scheduleScope",
119787
+ "filterCategoryIds",
119788
+ "filterStaffMemberId",
119789
+ "filterVenueId",
119790
+ "showFilters",
119791
+ "showCategoryFilter",
119792
+ "showVenueFilter",
119793
+ "showStaffFilter"
119794
+ ].includes(field.id)) return field;
119795
+ const visibleWhen = field.ui?.visibleWhen;
119796
+ return {
119797
+ ...field,
119798
+ ui: {
119799
+ ...field.ui,
119800
+ visibleWhen: { allOf: [{
119801
+ field: "eventSelection",
119802
+ notEquals: "selected"
119803
+ }, ...visibleWhen ? [visibleWhen] : []] }
119804
+ }
119805
+ };
119806
+ }
119807
+ //#endregion
119656
119808
  //#region ../blocks/src/system/runtime/nodes/events/EventCalendar.interactive.ts
119657
119809
  const eventCalendarSourceSchema = z.object({
119658
119810
  ...eventCollectionSourceSchemaShape,
@@ -119737,6 +119889,7 @@ function buildEventCalendarListingRender(render, className = render.display.clas
119737
119889
  eventSurface: display.eventSurface,
119738
119890
  filterEventPresets: display.filterEventPresets,
119739
119891
  scheduleScope: display.scheduleScope,
119892
+ seriesIds: display.seriesIds,
119740
119893
  filterCategoryIds: display.filterCategoryIds,
119741
119894
  filterStaffMemberId: display.filterStaffMemberId,
119742
119895
  filterVenueId: display.filterVenueId,
@@ -119774,19 +119927,59 @@ function buildEventCalendarInteractiveIslandProps(props) {
119774
119927
  //#region ../blocks/src/system/blocks/events/eventCalendarDataLoaders.ts
119775
119928
  const scopeParams = {
119776
119929
  siteId: { $bind: { from: "$root.siteId" } },
119930
+ seriesIds: { $bind: {
119931
+ from: "content",
119932
+ transforms: [{
119933
+ id: "events.calendarSelectionParam",
119934
+ options: { key: "seriesIds" }
119935
+ }]
119936
+ } },
119777
119937
  stage: { $bind: {
119778
119938
  from: "$root.previewStage",
119779
119939
  fallback: "published"
119780
119940
  } },
119781
- eventSurface: { $bind: { from: "content.eventSurface" } },
119941
+ eventSurface: { $bind: {
119942
+ from: "content",
119943
+ transforms: [{
119944
+ id: "events.calendarSelectionParam",
119945
+ options: { key: "eventSurface" }
119946
+ }, { id: "value.csv" }]
119947
+ } },
119782
119948
  eventPresets: { $bind: {
119783
- from: "content.filterEventPresets",
119784
- transforms: [{ id: "value.csv" }]
119949
+ from: "content",
119950
+ transforms: [{
119951
+ id: "events.calendarSelectionParam",
119952
+ options: { key: "filterEventPresets" }
119953
+ }, { id: "value.csv" }]
119954
+ } },
119955
+ scheduleScope: { $bind: {
119956
+ from: "content",
119957
+ transforms: [{
119958
+ id: "events.calendarSelectionParam",
119959
+ options: { key: "scheduleScope" }
119960
+ }, { id: "value.csv" }]
119785
119961
  } },
119786
- scheduleScope: { $bind: { from: "content.scheduleScope" } },
119787
- categoryIds: { $bind: { from: "content.filterCategoryIds" } },
119788
- staffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
119789
- venueId: { $bind: { from: "content.filterVenueId" } }
119962
+ categoryIds: { $bind: {
119963
+ from: "content",
119964
+ transforms: [{
119965
+ id: "events.calendarSelectionParam",
119966
+ options: { key: "filterCategoryIds" }
119967
+ }, { id: "value.csv" }]
119968
+ } },
119969
+ staffMemberId: { $bind: {
119970
+ from: "content",
119971
+ transforms: [{
119972
+ id: "events.calendarSelectionParam",
119973
+ options: { key: "filterStaffMemberId" }
119974
+ }, { id: "value.csv" }]
119975
+ } },
119976
+ venueId: { $bind: {
119977
+ from: "content",
119978
+ transforms: [{
119979
+ id: "events.calendarSelectionParam",
119980
+ options: { key: "filterVenueId" }
119981
+ }, { id: "value.csv" }]
119982
+ } }
119790
119983
  };
119791
119984
  /** Combined renders two jobs; calendar-only variants never pay for the list seed. */
119792
119985
  const eventCalendarDataLoaders = {
@@ -119916,6 +120109,13 @@ const eventCalendarLayout = [styledSection({
119916
120109
  from: "content.defaultCalendarView",
119917
120110
  fallback: "month"
119918
120111
  } },
120112
+ seriesIds: { $bind: {
120113
+ from: "content",
120114
+ transforms: [{
120115
+ id: "events.calendarSelectionParam",
120116
+ options: { key: "seriesIds" }
120117
+ }]
120118
+ } },
119919
120119
  showFilters: { $bind: {
119920
120120
  from: "content.showFilters",
119921
120121
  fallback: true
@@ -119937,17 +120137,47 @@ const eventCalendarLayout = [styledSection({
119937
120137
  fallback: true
119938
120138
  } },
119939
120139
  eventSurface: { $bind: {
119940
- from: "content.eventSurface",
119941
- fallback: "all"
120140
+ from: "content",
120141
+ transforms: [{
120142
+ id: "events.calendarSelectionParam",
120143
+ options: { key: "eventSurface" }
120144
+ }]
120145
+ } },
120146
+ filterEventPresets: { $bind: {
120147
+ from: "content",
120148
+ transforms: [{
120149
+ id: "events.calendarSelectionParam",
120150
+ options: { key: "filterEventPresets" }
120151
+ }]
119942
120152
  } },
119943
- filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
119944
120153
  scheduleScope: { $bind: {
119945
- from: "content.scheduleScope",
119946
- fallback: "any"
120154
+ from: "content",
120155
+ transforms: [{
120156
+ id: "events.calendarSelectionParam",
120157
+ options: { key: "scheduleScope" }
120158
+ }]
120159
+ } },
120160
+ filterCategoryIds: { $bind: {
120161
+ from: "content",
120162
+ transforms: [{
120163
+ id: "events.calendarSelectionParam",
120164
+ options: { key: "filterCategoryIds" }
120165
+ }]
120166
+ } },
120167
+ filterStaffMemberId: { $bind: {
120168
+ from: "content",
120169
+ transforms: [{
120170
+ id: "events.calendarSelectionParam",
120171
+ options: { key: "filterStaffMemberId" }
120172
+ }]
120173
+ } },
120174
+ filterVenueId: { $bind: {
120175
+ from: "content",
120176
+ transforms: [{
120177
+ id: "events.calendarSelectionParam",
120178
+ options: { key: "filterVenueId" }
120179
+ }]
119947
120180
  } },
119948
- filterCategoryIds: { $bind: { from: "content.filterCategoryIds" } },
119949
- filterStaffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
119950
- filterVenueId: { $bind: { from: "content.filterVenueId" } },
119951
120181
  cardRole: { $bind: {
119952
120182
  from: "content._cardStyles.role",
119953
120183
  fallback: "default"
@@ -120451,6 +120681,7 @@ const eventCalendarAdditionalFields = [
120451
120681
  }
120452
120682
  }
120453
120683
  },
120684
+ ...eventSelectionFields,
120454
120685
  {
120455
120686
  id: "eventSurface",
120456
120687
  type: "select",
@@ -120660,7 +120891,7 @@ const eventCalendarBlockDefinition = {
120660
120891
  titleSource: "heading",
120661
120892
  description: "Display events with calendar, list, or combined views with filtering",
120662
120893
  skipSectionStyles: true,
120663
- additionalFields: eventCalendarAdditionalFields,
120894
+ additionalFields: eventCalendarAdditionalFields.map(withEventSelectionVisibility),
120664
120895
  styleTokens: {
120665
120896
  background: "surface",
120666
120897
  typography: "body",
@@ -120769,6 +121000,7 @@ const eventListingHydrationSchema = z.object({
120769
121000
  eventSurface: eventSurfaceScopeSchema,
120770
121001
  filterEventPresets: z.string().nullable(),
120771
121002
  scheduleScope: eventScheduleScopeSchema,
121003
+ seriesIds: z.string().nullable().optional(),
120772
121004
  filterCategoryIds: z.string().nullable().optional(),
120773
121005
  filterStaffMemberId: z.string().nullable().optional(),
120774
121006
  filterVenueId: z.string().nullable().optional(),
@@ -120829,6 +121061,7 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
120829
121061
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
120830
121062
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
120831
121063
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
121064
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
120832
121065
  filterCategoryIds: normalizeEventCategoryIdsCsv(source.filterCategoryIds),
120833
121066
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
120834
121067
  filterVenueId: normalizeEventVenueId(source.filterVenueId),
@@ -125325,10 +125558,14 @@ function buildDiscountAvailabilityRequestPlan(options) {
125325
125558
  }
125326
125559
  };
125327
125560
  }
125328
- function discountAvailabilityStateFromResponse(response) {
125329
- if (!discountAvailabilityHasDiscounts(response)) return { tag: "unavailable" };
125561
+ function discountAvailabilityStateFromResponse(requestKey, response) {
125562
+ if (!discountAvailabilityHasDiscounts(response)) return {
125563
+ tag: "unavailable",
125564
+ requestKey
125565
+ };
125330
125566
  return {
125331
125567
  tag: "available",
125568
+ requestKey,
125332
125569
  manualCodeEntryAllowed: discountAvailabilityAllowsManualEntry(response),
125333
125570
  autoAppliedDiscount: getAutoAppliedDiscountPreview(response)
125334
125571
  };
@@ -125338,10 +125575,13 @@ function discountCodeUiReducer(state, event) {
125338
125575
  case "availability-disabled": return initialDiscountCodeUiState;
125339
125576
  case "availability-loading": return {
125340
125577
  ...state,
125341
- availability: { tag: "loading" }
125578
+ availability: {
125579
+ tag: "loading",
125580
+ previous: state.availability.tag === "available" || state.availability.tag === "unavailable" ? state.availability : state.availability.tag === "loading" ? state.availability.previous : null
125581
+ }
125342
125582
  };
125343
125583
  case "availability-loaded": {
125344
- const availability = discountAvailabilityStateFromResponse(event.response);
125584
+ const availability = discountAvailabilityStateFromResponse(event.requestKey, event.response);
125345
125585
  if (availability.tag !== "available" || !availability.manualCodeEntryAllowed) return {
125346
125586
  ...state,
125347
125587
  discountUiOpen: false,
@@ -125357,7 +125597,10 @@ function discountCodeUiReducer(state, event) {
125357
125597
  ...state,
125358
125598
  discountUiOpen: false,
125359
125599
  discountCode: "",
125360
- availability: { tag: "error" }
125600
+ availability: {
125601
+ tag: "error",
125602
+ requestKey: event.requestKey
125603
+ }
125361
125604
  };
125362
125605
  case "discount-code-changed": return {
125363
125606
  ...state,
@@ -125393,11 +125636,15 @@ function useDiscountCodeUi(options) {
125393
125636
  if (cancelled) return;
125394
125637
  dispatch({
125395
125638
  type: "availability-loaded",
125639
+ requestKey: requestPlan.key,
125396
125640
  response: res
125397
125641
  });
125398
125642
  } catch {
125399
125643
  if (cancelled) return;
125400
- dispatch({ type: "availability-failed" });
125644
+ dispatch({
125645
+ type: "availability-failed",
125646
+ requestKey: requestPlan.key
125647
+ });
125401
125648
  }
125402
125649
  }
125403
125650
  checkDiscountAvailability();
@@ -125406,8 +125653,9 @@ function useDiscountCodeUi(options) {
125406
125653
  };
125407
125654
  }, [options.api, requestPlan]);
125408
125655
  const availability = state.availability;
125409
- const isAvailable = availability.tag === "available";
125410
- const manualCodeEntryAllowed = isAvailable ? availability.manualCodeEntryAllowed : false;
125656
+ const settledAvailability = availability.tag === "loading" ? availability.previous : availability.tag === "available" || availability.tag === "unavailable" ? availability : null;
125657
+ const isAvailable = settledAvailability?.tag === "available";
125658
+ const manualCodeEntryAllowed = isAvailable ? settledAvailability.manualCodeEntryAllowed : false;
125411
125659
  return {
125412
125660
  discountUiOpen: state.discountUiOpen,
125413
125661
  setDiscountUiOpen: (isOpen) => dispatch({
@@ -125421,8 +125669,10 @@ function useDiscountCodeUi(options) {
125421
125669
  }),
125422
125670
  discountsAvailable: isAvailable,
125423
125671
  manualCodeEntryAllowed,
125424
- autoAppliedDiscount: isAvailable ? availability.autoAppliedDiscount : null,
125425
- discountsAvailableLoading: availability.tag === "loading"
125672
+ autoAppliedDiscount: isAvailable ? settledAvailability.autoAppliedDiscount : null,
125673
+ discountsAvailableLoading: availability.tag === "loading",
125674
+ discountAvailabilityRequestKey: requestPlan.key,
125675
+ settledDiscountAvailabilityRequestKey: availability.tag === "error" ? availability.requestKey : settledAvailability?.requestKey ?? null
125426
125676
  };
125427
125677
  }
125428
125678
  //#endregion
@@ -129611,6 +129861,7 @@ function getTicketTypeLineMax(input) {
129611
129861
  const initialEligibilityLookupState = {
129612
129862
  tag: "idle",
129613
129863
  eligibility: null,
129864
+ settledRequestKey: null,
129614
129865
  error: null
129615
129866
  };
129616
129867
  function eligibilityLookupReducer(state, action) {
@@ -129619,16 +129870,19 @@ function eligibilityLookupReducer(state, action) {
129619
129870
  case "loading-started": return {
129620
129871
  tag: "loading",
129621
129872
  eligibility: state.eligibility,
129873
+ settledRequestKey: state.settledRequestKey,
129622
129874
  error: null
129623
129875
  };
129624
129876
  case "resolved": return {
129625
129877
  tag: "resolved",
129626
129878
  eligibility: action.eligibility,
129879
+ settledRequestKey: action.requestKey,
129627
129880
  error: null
129628
129881
  };
129629
129882
  case "failed": return {
129630
129883
  tag: "failed",
129631
129884
  eligibility: null,
129885
+ settledRequestKey: null,
129632
129886
  error: action.message
129633
129887
  };
129634
129888
  default: return assertNever$5(action);
@@ -129734,9 +129988,23 @@ function toRegistrationOptionsSubject(subject, attendanceMode) {
129734
129988
  function useEligibility(params) {
129735
129989
  return useEligibilityWithDeps(params, eventRegistrationHooksDeps);
129736
129990
  }
129991
+ function eligibilityRequestKey(params) {
129992
+ return JSON.stringify({
129993
+ enabled: params.enabled,
129994
+ refreshKey: params.refreshKey ?? 0,
129995
+ subject: params.subject,
129996
+ attendanceMode: params.attendanceMode ?? null,
129997
+ ticketSelections: params.ticketSelectionsKey,
129998
+ selectedSlidingAmount: params.selectedSlidingAmount ?? null
129999
+ });
130000
+ }
129737
130001
  function useEligibilityWithDeps(params, deps) {
129738
130002
  const api = deps.useBlockApi();
129739
130003
  const ticketSelectionsKey = JSON.stringify(normalizeTicketSelectionLines(params.ticketSelections));
130004
+ const requestKey = eligibilityRequestKey({
130005
+ ...params,
130006
+ ticketSelectionsKey
130007
+ });
129740
130008
  const [state, dispatch] = useReducer(eligibilityLookupReducer, initialEligibilityLookupState);
129741
130009
  const requestIdRef = useRef(0);
129742
130010
  useEffect(() => {
@@ -129769,7 +130037,8 @@ function useEligibilityWithDeps(params, deps) {
129769
130037
  if (cancelled || requestIdRef.current !== requestId) return;
129770
130038
  dispatch({
129771
130039
  type: "resolved",
129772
- eligibility: transformRegistrationOptionsResponse(result)
130040
+ eligibility: transformRegistrationOptionsResponse(result),
130041
+ requestKey
129773
130042
  });
129774
130043
  } catch {
129775
130044
  if (cancelled || requestIdRef.current !== requestId) return;
@@ -129798,6 +130067,8 @@ function useEligibilityWithDeps(params, deps) {
129798
130067
  return {
129799
130068
  state,
129800
130069
  eligibility: state.eligibility,
130070
+ settledRequestKey: state.settledRequestKey,
130071
+ requestKey,
129801
130072
  isLoading: state.tag === "loading",
129802
130073
  error: state.error,
129803
130074
  creditState
@@ -131057,6 +131328,68 @@ function buildOccurrenceRegistrationRequest(options, prepared, method, passId, m
131057
131328
  };
131058
131329
  }
131059
131330
  //#endregion
131331
+ //#region ../blocks/src/system/runtime/nodes/event-registration/useSettledCommerceView.ts
131332
+ function buildCandidate(input) {
131333
+ if (!input.eligibilityIsSettled || !input.eligibility || !input.currentEvent) return null;
131334
+ return {
131335
+ eventSelectionId: input.currentEvent.selectionId,
131336
+ discountContext: resolveDiscountContext({
131337
+ paymentSelection: input.paymentSelection,
131338
+ event: input.currentEvent,
131339
+ eventRequiresPayment: input.eventRequiresPayment,
131340
+ ticketsCount: input.ticketsCount
131341
+ }),
131342
+ subtotalCents: input.eligibility.price,
131343
+ summaryLines: input.eligibility.ticketLines.map((line) => ({
131344
+ pricingOptionId: line.pricingOptionId,
131345
+ label: line.label,
131346
+ quantity: line.quantity,
131347
+ unitPriceCents: line.unitPriceCents,
131348
+ subtotalCents: line.subtotalCents
131349
+ }))
131350
+ };
131351
+ }
131352
+ function eligibilityIsSettled(result) {
131353
+ return result.settledRequestKey === result.requestKey;
131354
+ }
131355
+ function viewIsStale(view, currentEvent, eligibilityState) {
131356
+ return view.eventSelectionId !== currentEvent?.selectionId || eligibilityState?.tag === "failed" || eligibilityState?.tag === "idle";
131357
+ }
131358
+ function requestIsSettled(discountUi) {
131359
+ return discountUi.discountAvailabilityRequestKey === "disabled" || discountUi.settledDiscountAvailabilityRequestKey === discountUi.discountAvailabilityRequestKey;
131360
+ }
131361
+ function discountRequest(view) {
131362
+ const discountContext = view?.discountContext ?? null;
131363
+ return {
131364
+ discountContext,
131365
+ subtotalCents: discountContext?.type === "event" && view?.subtotalCents !== null ? view?.subtotalCents : void 0
131366
+ };
131367
+ }
131368
+ function useSettledCommerceView(input) {
131369
+ const candidate = buildCandidate({
131370
+ eligibilityIsSettled: eligibilityIsSettled(input.eligibilityResult),
131371
+ eligibility: input.eligibility,
131372
+ currentEvent: input.currentEvent,
131373
+ paymentSelection: input.paymentSelection,
131374
+ eventRequiresPayment: input.eventRequiresPayment,
131375
+ ticketsCount: input.ticketsCount
131376
+ });
131377
+ const settledRef = useRef(candidate);
131378
+ if (settledRef.current && viewIsStale(settledRef.current, input.currentEvent, input.eligibilityResult.state)) settledRef.current = null;
131379
+ const requestView = candidate ?? settledRef.current;
131380
+ const discountUi = input.useDiscountCodeUi({
131381
+ api: input.api,
131382
+ ...discountRequest(requestView)
131383
+ });
131384
+ if (candidate && requestIsSettled(discountUi)) settledRef.current = candidate;
131385
+ return {
131386
+ discountUi,
131387
+ discountContext: settledRef.current?.discountContext ?? null,
131388
+ ticketSelectionSubtotalCents: settledRef.current?.subtotalCents ?? null,
131389
+ ticketSelectionSummaryLines: settledRef.current?.summaryLines ?? []
131390
+ };
131391
+ }
131392
+ //#endregion
131060
131393
  //#region ../blocks/src/system/runtime/nodes/event-registration/registrationWizardContext.ts
131061
131394
  function getEventSelectionDefaults(event) {
131062
131395
  const suggestedAmount = getSlidingScaleForEvent(event)?.suggestedAmount;
@@ -131210,10 +131543,6 @@ function isSoldOutWithoutWaitlist(input) {
131210
131543
  }
131211
131544
  //#endregion
131212
131545
  //#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
131546
  function usesTieredPricing(event) {
131218
131547
  return event !== null && event !== void 0 ? publicEventPricingStrategy(event.pricing) === "tiered" : false;
131219
131548
  }
@@ -131665,30 +131994,15 @@ function useEventRegistrationWizardWithDeps(options, deps) {
131665
131994
  }
131666
131995
  setStep("select-tickets");
131667
131996
  };
131668
- const discountContext = useMemo(() => resolveDiscountContext({
131669
- paymentSelection,
131670
- event: currentEvent,
131671
- eventRequiresPayment,
131672
- ticketsCount
131673
- }), [
131997
+ const { discountUi, discountContext, ticketSelectionSubtotalCents, ticketSelectionSummaryLines } = useSettledCommerceView({
131998
+ api,
131999
+ useDiscountCodeUi: deps.useDiscountCodeUi,
132000
+ eligibilityResult,
132001
+ eligibility,
131674
132002
  currentEvent,
131675
132003
  eventRequiresPayment,
131676
132004
  paymentSelection,
131677
132005
  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
132006
  });
131693
132007
  const selectionMethod = paymentSelection.method;
131694
132008
  const shouldShowDiscountToggle = discountContext !== null && discountUi.manualCodeEntryAllowed && (selectionMethod === "stripe" || selectionMethod === "pass_bundle" || selectionMethod === "membership_bundle");
@@ -131853,6 +132167,34 @@ function useEventRegistrationWizardWithDeps(options, deps) {
131853
132167
  };
131854
132168
  }
131855
132169
  //#endregion
132170
+ //#region ../blocks/src/system/runtime/nodes/event-registration/useEventCheckoutHandoffRestore.ts
132171
+ function eventRegistrationReloadTarget(location) {
132172
+ return `${location.pathname}${location.search}#${EVENT_REGISTRATION_ANCHOR_ID}`;
132173
+ }
132174
+ function reloadAtEventRegistration() {
132175
+ const target = eventRegistrationReloadTarget(window.location);
132176
+ window.history.replaceState(window.history.state, "", target);
132177
+ window.location.reload();
132178
+ }
132179
+ const browserCheckoutHandoffRestoreDeps = {
132180
+ addPageShowListener: (listener) => window.addEventListener("pageshow", listener),
132181
+ removePageShowListener: (listener) => window.removeEventListener("pageshow", listener),
132182
+ reloadAtRegistration: reloadAtEventRegistration
132183
+ };
132184
+ function useEventCheckoutHandoffRestore(active) {
132185
+ useEventCheckoutHandoffRestoreWithDeps(active, browserCheckoutHandoffRestoreDeps);
132186
+ }
132187
+ function useEventCheckoutHandoffRestoreWithDeps(active, deps) {
132188
+ useEffect(() => {
132189
+ if (!active) return;
132190
+ const handlePageShow = (event) => {
132191
+ if (event.persisted) deps.reloadAtRegistration();
132192
+ };
132193
+ deps.addPageShowListener(handlePageShow);
132194
+ return () => deps.removePageShowListener(handlePageShow);
132195
+ }, [active, deps]);
132196
+ }
132197
+ //#endregion
131856
132198
  //#region ../blocks/src/system/runtime/nodes/shared/MagicLinkForm.state.ts
131857
132199
  const initialMagicLinkSubmissionState = Object.freeze({ tag: "idle" });
131858
132200
  function magicLinkSubmissionReducer(state, action) {
@@ -134568,6 +134910,7 @@ function EventRegistrationWizard(props) {
134568
134910
  events: events ?? [],
134569
134911
  maxTicketsNum
134570
134912
  });
134913
+ useEventCheckoutHandoffRestore(wizard.step === "redirecting");
134571
134914
  const [bookingOverlayOpen, setBookingOverlayOpen] = useState(false);
134572
134915
  const [floatingPortalRoot, setFloatingPortalRoot] = useState(null);
134573
134916
  useEffect(() => {
@@ -140327,6 +140670,7 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
140327
140670
  const eventSurface = filters?.eventSurface;
140328
140671
  const eventPresets = normalizeCsvString(filters?.eventPresets);
140329
140672
  const scheduleScope = filters?.scheduleScope;
140673
+ const seriesIds = filters?.seriesIds;
140330
140674
  const eventsRef = useRef(events);
140331
140675
  const loadingRef = useRef(loading);
140332
140676
  const hasMoreRef = useRef(hasMore);
@@ -140354,6 +140698,7 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
140354
140698
  const currentEvents = eventsRef.current;
140355
140699
  const lastEvent = options.reset ? void 0 : currentEvents[currentEvents.length - 1];
140356
140700
  const newEvents = await getPublicEvents({
140701
+ seriesIds,
140357
140702
  afterStartsAt: lastEvent ? lastEvent.startsAt : void 0,
140358
140703
  afterId: lastEvent ? lastEvent.occurrenceId : void 0,
140359
140704
  limit: pageSize,
@@ -140392,6 +140737,7 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
140392
140737
  eventSurface,
140393
140738
  eventPresets,
140394
140739
  scheduleScope,
140740
+ seriesIds,
140395
140741
  normalizedCategoryIds,
140396
140742
  normalizedStaffMemberId,
140397
140743
  normalizedVenueId
@@ -140401,7 +140747,7 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
140401
140747
  }, [fetchPage]);
140402
140748
  const initialFetchAttemptKeyRef = useRef(null);
140403
140749
  useEffect(() => {
140404
- if (!fetchInitialOnMount) return;
140750
+ if (!fetchInitialOnMount || seriesIds === "") return;
140405
140751
  if (!filtersMatchInitial) return;
140406
140752
  if (initialEventsRef.current.length > 0) return;
140407
140753
  if (eventsRef.current.length > 0) return;
@@ -140415,7 +140761,8 @@ function useEventPagination({ siteId: _siteId, initialEvents = [], fetchInitialO
140415
140761
  fetchPage,
140416
140762
  filtersKey,
140417
140763
  filtersMatchInitial,
140418
- stage
140764
+ stage,
140765
+ seriesIds
140419
140766
  ]);
140420
140767
  const prevFiltersMatchInitialRef = useRef(filtersMatchInitial);
140421
140768
  const prevInitialEventsKeyRef = useRef(initialEventsKey);
@@ -140539,7 +140886,7 @@ function getEventFiltersError(state) {
140539
140886
  * const events = await api.getPublicEvents(params);
140540
140887
  * ```
140541
140888
  */
140542
- function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false, showStaffFilter = false, preFilterCategoryIds, preFilterStaffMemberId, preFilterVenueId, preFilterEventSurface, preFilterEventPresets, preFilterScheduleScope } = {}) {
140889
+ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false, showStaffFilter = false, preFilterSeriesIds, preFilterCategoryIds, preFilterStaffMemberId, preFilterVenueId, preFilterEventSurface, preFilterEventPresets, preFilterScheduleScope } = {}) {
140543
140890
  const api = useBlockApi();
140544
140891
  const [loadState, dispatchLoadState] = useReducer(eventFiltersLoadReducer, void 0, createInitialEventFiltersLoadState);
140545
140892
  const filters = getEventFiltersData(loadState);
@@ -140688,6 +141035,7 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
140688
141035
  setSelectedVenueId("all");
140689
141036
  }, []),
140690
141037
  getFilterParams: useCallback(() => {
141038
+ if (preFilterSeriesIds != null) return { seriesIds: preFilterSeriesIds };
140691
141039
  const params = {};
140692
141040
  if (fixedEventSurface) params.eventSurface = fixedEventSurface;
140693
141041
  if (fixedEventPresets) params.eventPresets = fixedEventPresets;
@@ -140701,6 +141049,7 @@ function useEventFilters({ showCategoryFilter = "auto", showVenueFilter = false,
140701
141049
  params.staffMemberId = fixedStaffMemberId ?? (selectedStaffMemberId !== "all" ? selectedStaffMemberId : void 0);
140702
141050
  return params;
140703
141051
  }, [
141052
+ preFilterSeriesIds,
140704
141053
  allowedCategoryIds,
140705
141054
  allowedCategorySet,
140706
141055
  fixedEventPresets,
@@ -140724,25 +141073,12 @@ const EventListingController = ({ render }) => {
140724
141073
  const hydration = render.hydration;
140725
141074
  const filtersIdBase = useId();
140726
141075
  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
- ]);
141076
+ const initialListFilters = buildEventRuntimeFilters(hydration);
140742
141077
  const { categories, venues, staffMembers, selectedCategoryId, selectedStaffMemberId, selectedVenueId, loading: filtersLoading, shouldShowCategoryFilter, shouldShowVenueFilter, shouldShowStaffFilter, hasActiveFilters, setSelectedCategoryId, setSelectedStaffMemberId, setSelectedVenueId, resetFilters, getFilterParams } = useEventFilters({
140743
141078
  showCategoryFilter: hydration.showFilters ? hydration.showCategoryFilter : "never",
140744
141079
  showVenueFilter: hydration.showFilters ? hydration.showVenueFilter : false,
140745
141080
  showStaffFilter: hydration.showFilters ? hydration.showStaffFilter : false,
141081
+ preFilterSeriesIds: hydration.seriesIds,
140746
141082
  preFilterCategoryIds: hydration.filterCategoryIds ?? void 0,
140747
141083
  preFilterStaffMemberId: hydration.filterStaffMemberId ?? void 0,
140748
141084
  preFilterVenueId: hydration.filterVenueId ?? void 0,
@@ -141577,6 +141913,7 @@ function toEventCombinedControllerProps(props) {
141577
141913
  eventSurface: props.render.display.eventSurface,
141578
141914
  filterEventPresets: props.render.display.filterEventPresets,
141579
141915
  scheduleScope: props.render.display.scheduleScope,
141916
+ seriesIds: props.render.display.seriesIds,
141580
141917
  filterCategoryIds: props.render.display.filterCategoryIds,
141581
141918
  filterStaffMemberId: props.render.display.filterStaffMemberId,
141582
141919
  filterVenueId: props.render.display.filterVenueId,
@@ -141698,7 +142035,7 @@ const EventCombinedCalendarTab = ({ calendarTabViews, calendarView, calendarView
141698
142035
  const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout = "stack", listColumns = "3", eventsPerPage = 12, paginationAction = {
141699
142036
  kind: "loadMore",
141700
142037
  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 }) => {
142038
+ }, 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
142039
  const hydrationReady = useHydrationReady();
141703
142040
  const fetchInitialEventsOnMount = initialEvents == null;
141704
142041
  const resolvedShowFilters = showFilters ?? true;
@@ -141724,6 +142061,7 @@ const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout
141724
142061
  showCategoryFilter: resolvedShowFilters ? showCategoryFilter : "never",
141725
142062
  showVenueFilter: resolvedShowFilters ? resolvedShowVenueFilter : false,
141726
142063
  showStaffFilter: resolvedShowFilters ? resolvedShowStaffFilter : false,
142064
+ preFilterSeriesIds: seriesIds,
141727
142065
  preFilterCategoryIds: filterCategoryIds,
141728
142066
  preFilterStaffMemberId: filterStaffMemberId,
141729
142067
  preFilterVenueId: filterVenueId,
@@ -141731,21 +142069,15 @@ const EventCombinedClient = ({ events: initialEvents, siteId, stage, listLayout
141731
142069
  preFilterEventPresets: filterEventPresets,
141732
142070
  preFilterScheduleScope: resolvedScheduleScope
141733
142071
  });
141734
- const initialListFilters = useMemo(() => buildEventRuntimeFilters({
142072
+ const initialListFilters = buildEventRuntimeFilters({
141735
142073
  eventSurface: resolvedEventSurface,
141736
142074
  filterEventPresets,
141737
142075
  scheduleScope: resolvedScheduleScope,
142076
+ seriesIds,
141738
142077
  filterCategoryIds,
141739
142078
  filterStaffMemberId,
141740
142079
  filterVenueId
141741
- }), [
141742
- resolvedEventSurface,
141743
- filterCategoryIds,
141744
- filterEventPresets,
141745
- filterStaffMemberId,
141746
- filterVenueId,
141747
- resolvedScheduleScope
141748
- ]);
142080
+ });
141749
142081
  const listFilters = useMemo(() => getFilterParams(), [getFilterParams]);
141750
142082
  const pageSize = eventsPerPage;
141751
142083
  const { events: paginatedEvents, loading: eventsLoading, error: eventsError, hasMore, loadMore } = useEventPagination({
@@ -142022,6 +142354,7 @@ const EventCalendarClient = ({ render }) => {
142022
142354
  eventSurface: display.eventSurface,
142023
142355
  filterEventPresets: display.filterEventPresets,
142024
142356
  scheduleScope: display.scheduleScope,
142357
+ seriesIds: display.seriesIds,
142025
142358
  filterCategoryIds: display.filterCategoryIds,
142026
142359
  filterStaffMemberId: display.filterStaffMemberId,
142027
142360
  filterVenueId: display.filterVenueId,
@@ -142045,6 +142378,7 @@ const EventCalendarWeekBoardClient = ({ render }) => {
142045
142378
  const { display, hydration } = render;
142046
142379
  const filters = useMemo(() => buildDisplayFilterParams(display), [
142047
142380
  display.eventSurface,
142381
+ display.seriesIds,
142048
142382
  display.filterCategoryIds,
142049
142383
  display.filterEventPresets,
142050
142384
  display.filterStaffMemberId,
@@ -142206,6 +142540,7 @@ function useEventCalendarFilterState(display) {
142206
142540
  showCategoryFilter: display.showFilters ? display.showCategoryFilter : "never",
142207
142541
  showVenueFilter: display.showFilters ? display.showVenueFilter : false,
142208
142542
  showStaffFilter: display.showFilters ? display.showStaffFilter : false,
142543
+ preFilterSeriesIds: display.seriesIds,
142209
142544
  preFilterCategoryIds: display.filterCategoryIds,
142210
142545
  preFilterStaffMemberId: display.filterStaffMemberId,
142211
142546
  preFilterVenueId: display.filterVenueId,
@@ -142239,6 +142574,7 @@ function buildDisplayFilterParams(display) {
142239
142574
  eventSurface: display.eventSurface,
142240
142575
  filterEventPresets: display.filterEventPresets,
142241
142576
  scheduleScope: display.scheduleScope,
142577
+ seriesIds: display.seriesIds,
142242
142578
  filterCategoryIds: display.filterCategoryIds,
142243
142579
  filterStaffMemberId: display.filterStaffMemberId,
142244
142580
  filterVenueId: display.filterVenueId
@@ -142838,7 +143174,7 @@ function NewsletterFormClient({ render }) {
142838
143174
  if (submitTarget.tag === "unavailable") {
142839
143175
  dispatchSubmission({
142840
143176
  type: "failed",
142841
- error: newsletterFormError("Newsletter list is not configured")
143177
+ error: newsletterFormError(SIGNUPS_PAUSED_MESSAGE)
142842
143178
  });
142843
143179
  return;
142844
143180
  }
@@ -142849,14 +143185,16 @@ function NewsletterFormClient({ render }) {
142849
143185
  });
142850
143186
  return;
142851
143187
  }
142852
- const visitorSelection = readVisitorSelection(formData, render.hydration);
142853
- if (visitorSelection === null) {
143188
+ const selection = readVisitorSelection(formData, render.hydration);
143189
+ const selectionError = visitorSelectionError(selection);
143190
+ if (selectionError) {
142854
143191
  dispatchSubmission({
142855
143192
  type: "failed",
142856
- error: newsletterFieldError(TOPIC_CHOICE_FIELD_ID, "Choose at least one email topic.")
143193
+ error: selectionError
142857
143194
  });
142858
143195
  return;
142859
143196
  }
143197
+ const visitorSelection = selection.tag === "chosen" ? selection.value : void 0;
142860
143198
  dispatchSubmission({ type: "submitted" });
142861
143199
  try {
142862
143200
  const result = await api.subscribeNewsletter({
@@ -143056,10 +143394,18 @@ function transportFailureMessage(err) {
143056
143394
  }
143057
143395
  return RETRY_SHORTLY_MESSAGE;
143058
143396
  }
143397
+ function visitorSelectionError(selection) {
143398
+ switch (selection.tag) {
143399
+ case "nothing_chosen": return newsletterFieldError(TOPIC_CHOICE_FIELD_ID, "Choose at least one email topic.");
143400
+ case "unusable": return newsletterFormError(SIGNUPS_PAUSED_MESSAGE);
143401
+ case "not_offered":
143402
+ case "chosen": return null;
143403
+ }
143404
+ }
143059
143405
  function readVisitorSelection(formData, hydration) {
143060
- if (hydration.choicePresentation !== "visitor_choice") return void 0;
143406
+ if (hydration.choicePresentation !== "visitor_choice") return { tag: "not_offered" };
143061
143407
  const ids = formData.getAll(TOPIC_CHOICE_FIELD_ID).flatMap((value) => typeof value === "string" ? [value] : []);
143062
- if (ids.length === 0) return null;
143408
+ if (ids.length === 0) return { tag: "nothing_chosen" };
143063
143409
  const raw = hydration.choiceProvider === "native" ? {
143064
143410
  provider: "native",
143065
143411
  topicIds: ids
@@ -143070,9 +143416,12 @@ function readVisitorSelection(formData, hydration) {
143070
143416
  provider: "mailchimp",
143071
143417
  interestIds: ids
143072
143418
  } : null;
143073
- if (raw === null) return null;
143419
+ if (raw === null) return { tag: "unusable" };
143074
143420
  const parsed = parseMailingListVisitorSelection(raw);
143075
- return parsed.ok ? parsed.value : null;
143421
+ return parsed.ok ? {
143422
+ tag: "chosen",
143423
+ value: parsed.value
143424
+ } : { tag: "unusable" };
143076
143425
  }
143077
143426
  function publicSignupError(outcome) {
143078
143427
  switch (outcome.tag) {
@@ -146493,6 +146842,26 @@ const headerRuntimeTransforms = [{
146493
146842
  run: resolveHeaderChromeRuntimeContract
146494
146843
  }];
146495
146844
  const defaultTransforms = createTransformRegistry([
146845
+ {
146846
+ id: "events.calendarSelectionParam",
146847
+ kind: "formatter",
146848
+ summary: "Resolve selected events instead of discovery filters",
146849
+ schema: z.object({ key: z.enum([
146850
+ "seriesIds",
146851
+ "eventSurface",
146852
+ "filterEventPresets",
146853
+ "scheduleScope",
146854
+ "filterCategoryIds",
146855
+ "filterStaffMemberId",
146856
+ "filterVenueId"
146857
+ ]) }),
146858
+ run(value, { key }) {
146859
+ const content = asPartialObject(value) ?? {};
146860
+ const selection = resolveEventSelection(content.eventSelection, content.selectedEventSeriesIds);
146861
+ if (selection.kind === "selected") return key === "seriesIds" ? selection.seriesIds : void 0;
146862
+ return key === "seriesIds" ? void 0 : content[key];
146863
+ }
146864
+ },
146496
146865
  {
146497
146866
  id: "events.calendarReadEnabled",
146498
146867
  kind: "formatter",
@@ -148242,9 +148611,56 @@ function generateNavLinkCSS(options) {
148242
148611
  if (baseRules.length > 0) cssChunks.unshift(`\n${selector} {\n ${baseRules.join("\n ")}\n}\n`);
148243
148612
  if (hoverRules.length > 0) cssChunks.push(`\n${hoverSelector} {\n ${hoverRules.join("\n ")}\n}\n`);
148244
148613
  if (activeRules.length > 0) cssChunks.push(`\n${activeSelector} {\n ${activeRules.join("\n ")}\n}\n`);
148614
+ cssChunks.push(navLinkFocusVisibleCss(selector, style, theme, tokens));
148245
148615
  cssChunks.push(generateInteractiveChildInheritanceCSS(selector));
148246
148616
  return cssChunks.join("");
148247
148617
  }
148618
+ /**
148619
+ * Keyboard focus indicator for nav links, in the header, the footer and header
148620
+ * dropdown menus — the three surfaces `generateNavLinkCSS` serves.
148621
+ *
148622
+ * Emitted unconditionally rather than as an effect, because focus visibility is
148623
+ * a floor rather than a style choice. Only the interaction-palette pill ever
148624
+ * wrote an `effects.focus` group, so every other nav — every `quiet` palette,
148625
+ * every footer, every dropdown — previously fell back to whatever outline the
148626
+ * browser drew.
148627
+ *
148628
+ * The outline takes the link's own resolved colour, so on a header that adapts
148629
+ * to the section it floats over it moves with the adaptation instead of
148630
+ * asserting a brand colour against an unknown backdrop.
148631
+ *
148632
+ * Where the style asks for `soft-glow`, the same halo goes on the outline. That
148633
+ * treatment exists because the theme has already conceded the resolved colour
148634
+ * alone is not reliable over an unpredictable backdrop — a hero photograph with
148635
+ * mixed luminance. Without it the text would stay legible by its halo while the
148636
+ * focus ring, which is the part with a contrast requirement of its own, would
148637
+ * not.
148638
+ *
148639
+ * A style that also paints a focus pill keeps it: this adds an outline around
148640
+ * that pill rather than replacing it.
148641
+ */
148642
+ function navLinkFocusVisibleCss(selector, style, theme, tokens) {
148643
+ const color = tokens.getColor(style.colorToken);
148644
+ const halo = buildTextContrastShadow({
148645
+ theme,
148646
+ colorToken: style.colorToken,
148647
+ treatment: style.contrastTreatment
148648
+ });
148649
+ return `
148650
+ ${selector}:focus-visible {
148651
+ outline: 2px solid ${color};
148652
+ outline-offset: ${focusOutlineOffset(selector)};${halo ? `\n box-shadow: ${halo};` : ""}
148653
+ }
148654
+ `;
148655
+ }
148656
+ /**
148657
+ * Dropdown items are full-width inside a panel with no horizontal padding, so
148658
+ * an outset outline would paint over and past the panel's own border. Keeping
148659
+ * it flush is the only way it reads as belonging to the item.
148660
+ */
148661
+ function focusOutlineOffset(selector) {
148662
+ return selector.includes("nav-dropdown-link") ? "-2px" : "3px";
148663
+ }
148248
148664
  function buildTextContrastShadow(input) {
148249
148665
  if (input.treatment !== "soft-glow") return null;
148250
148666
  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 +155398,8 @@ const appointmentServicesBlockDefinition = {
154982
155398
  el("appointment-services", {
154983
155399
  sectionHeading: { $bind: { from: "content.heading" } },
154984
155400
  services: { $bind: { from: "data.services" } },
154985
- pathname: { $bind: { from: "$root.pathname" } }
155401
+ pathname: { $bind: { from: "$root.pathname" } },
155402
+ servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
154986
155403
  })
154987
155404
  ], { gap: "lg" })
154988
155405
  })]
@@ -161649,10 +162066,19 @@ const containerResponsiveThemeCss = `/*
161649
162066
  padding-top: 2.5rem;
161650
162067
  padding-bottom: 2.5rem;
161651
162068
  }
162069
+ /* Clearance for a surface that is not an authored block page.
162070
+ An authored page gets this through its opening block's container (see the
162071
+ overlay-clearance rule in styles.css). A reserved surface or a system
162072
+ destination page has no such block, so it consumes the same variable here.
162073
+ Marked with one class rather than per-surface selectors, because the last
162074
+ two additions to this family were both missed and shipped overlapping. */
161652
162075
  :where(.theme-scope)
161653
162076
  [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);
162077
+ .rb-overlay-clearance-surface {
162078
+ padding-top: calc(
162079
+ var(--site-overlay-header-clearance, 5.5rem) +
162080
+ var(--site-overlay-opening-content-extra-pad, clamp(1rem, 2vw, 1.75rem))
162081
+ );
161656
162082
  }
161657
162083
  .rb-preview-editor-offset {
161658
162084
  padding-bottom: calc(
@@ -172009,6 +172435,23 @@ const containerResponsiveThemeCss = `/*
172009
172435
  gap: 0.5rem;
172010
172436
  }
172011
172437
 
172438
+ /* Error panel and field notes. The form block scopes these to its own
172439
+ data-block, so the newsletter form (which also renders in the footer)
172440
+ needs its own copy of the treatment. */
172441
+ :where(.theme-scope) .newsletter-form .fb-error:not([data-field-validation-message]) {
172442
+ background-color: var(--fb-error-bg);
172443
+ color: var(--fb-error-text);
172444
+ border: 1px solid var(--fb-error-border);
172445
+ border-radius: var(--rb-block-radius);
172446
+ padding: 1rem;
172447
+ font-size: 0.875rem;
172448
+ }
172449
+
172450
+ :where(.theme-scope) .newsletter-form [data-field-validation-message] {
172451
+ font-size: 0.875rem;
172452
+ color: var(--fb-error-text);
172453
+ }
172454
+
172012
172455
  /* Required indicator */
172013
172456
  :where(.theme-scope) .newsletter-required {
172014
172457
  color: rgb(var(--tb-primary));
@@ -186224,6 +186667,30 @@ function buildGoLiveDecision(requirements) {
186224
186667
  function findLaunchOverride(overrides, requirementId) {
186225
186668
  return overrides.find((override) => override.requirementId === requirementId) ?? null;
186226
186669
  }
186670
+ function deriveLaunchDomainRequirement(siteId, domainState) {
186671
+ const [title, description] = {
186672
+ connected: ["Domain connected", "A domain is already connected."],
186673
+ pending_setup: ["Connect a domain", "You can connect a domain later when you are ready to launch."],
186674
+ pending_verification: ["Domain added — connection pending", "Your domain has been added. Open Domains to check its connection and any remaining DNS steps."],
186675
+ partially_connected: ["Partially connected", "One or both addresses still need attention. Open Domains to see the DNS and secure connection checks."],
186676
+ check_unavailable: ["Domain connection check unavailable", "We couldn’t check your domain connection. Open Domains to check again."]
186677
+ }[domainState.kind];
186678
+ const state = domainState.kind === "connected" ? "complete" : "pending";
186679
+ return requirement({
186680
+ id: "connect_custom_domain",
186681
+ packId: "domain",
186682
+ priority: "optional",
186683
+ owner: "admin",
186684
+ state,
186685
+ title,
186686
+ description,
186687
+ 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"),
186688
+ evidence: domainState.kind !== "pending_setup" && domainState.domainIds.length > 0 ? {
186689
+ kind: "domain_connection",
186690
+ domainIds: domainState.domainIds
186691
+ } : evidenceFromDerivedState(state)
186692
+ });
186693
+ }
186227
186694
  function deriveLaunchReadiness(input) {
186228
186695
  const siteId = input.siteId ?? null;
186229
186696
  const overrides = input.overrides ?? [];
@@ -186327,17 +186794,7 @@ function deriveLaunchReadiness(input) {
186327
186794
  action: openDashboardPathAction(siteId, "/money/settings", "Connect payments"),
186328
186795
  evidence: evidenceFromDerivedState(input.payments.kind === "ready" ? "complete" : "pending")
186329
186796
  }));
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
- }));
186797
+ requirements.push(deriveLaunchDomainRequirement(siteId, input.customDomain));
186341
186798
  const goLiveDecision = buildGoLiveDecision(requirements);
186342
186799
  return {
186343
186800
  requirements,
@@ -198324,8 +198781,10 @@ function useBlockFormFocus({ enabled, focusSignal, formRootRef, onFocusHandled }
198324
198781
  block: "center"
198325
198782
  });
198326
198783
  } catch {}
198327
- target.setAttribute("data-editor-field-highlight", "true");
198328
- window.setTimeout(() => target.removeAttribute("data-editor-field-highlight"), 1500);
198784
+ if (path) {
198785
+ target.setAttribute("data-editor-field-highlight", "true");
198786
+ window.setTimeout(() => target.removeAttribute("data-editor-field-highlight"), 1500);
198787
+ }
198329
198788
  onFocusHandled?.(focusSignal.requestId);
198330
198789
  }, 0);
198331
198790
  return () => window.clearTimeout(timer);
@@ -199829,7 +200288,7 @@ function menuActionLabel(action) {
199829
200288
  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
200289
  const contentId = block.id ? `builder-block-content-${block.id}` : void 0;
199831
200290
  return /* @__PURE__ */ jsx(Card, {
199832
- className: cn$2("w-full p-0 transition-shadow", highlighted ? "builder-editor-block-highlight" : ""),
200291
+ className: "builder-editor-block-card w-full p-0 transition-colors",
199833
200292
  "data-block-id": block.id ?? void 0,
199834
200293
  "data-editor-block-highlight": highlighted ? "true" : void 0,
199835
200294
  children: /* @__PURE__ */ jsxs(Collapsible, {
@@ -224661,7 +225120,7 @@ function SiteOptionPickerField({ path, backend, config }) {
224661
225120
  label: config.label,
224662
225121
  description: config.description,
224663
225122
  error: error?.message,
224664
- hint: helperText ?? labels.emptySelection,
225123
+ hint: helperText,
224665
225124
  children: () => /* @__PURE__ */ jsxs("div", {
224666
225125
  className: "space-y-2",
224667
225126
  children: [/* @__PURE__ */ jsx(CommandMultiSelect, {
@@ -224725,6 +225184,12 @@ function SiteOptionPickerField({ path, backend, config }) {
224725
225184
  //#endregion
224726
225185
  //#region ../editor-blocks/src/widgets/site-option-picker/loaders.ts
224727
225186
  const siteOptionWidgetLabels = {
225187
+ eventSeries: {
225188
+ loading: "Loading events...",
225189
+ select: "Choose events",
225190
+ empty: "No events available. Create an event in Bookings first.",
225191
+ emptySelection: "Choose at least one event to show in this block."
225192
+ },
224728
225193
  eventCategories: {
224729
225194
  loading: "Loading categories...",
224730
225195
  select: "Select categories",
@@ -224751,6 +225216,17 @@ function mapEventCategoriesToSiteOptionItems(payload) {
224751
225216
  subtitle: category.identifier
224752
225217
  }));
224753
225218
  }
225219
+ function mapEventsToSiteOptionItems(events) {
225220
+ return events.flatMap((event) => event.schedules.kind === "ordinary" ? [{
225221
+ value: event.schedules.schedule.id,
225222
+ label: event.title,
225223
+ subtitle: event.slug
225224
+ }] : event.schedules.runs.filter((run) => (run.status === void 0 || run.status === "active") && (run.visibility === void 0 || run.visibility === "public")).map((run) => ({
225225
+ value: run.id,
225226
+ label: `${event.title} — ${run.title}`,
225227
+ subtitle: run.slug
225228
+ })));
225229
+ }
224754
225230
  function mapVenuesToSiteOptionItems(payload) {
224755
225231
  return payload.map((venue) => ({
224756
225232
  value: venue.id,
@@ -224766,6 +225242,14 @@ function mapStaffMembersToSiteOptionItems(payload) {
224766
225242
  }
224767
225243
  async function loadSiteOptionItemsFromApi({ apiClient, siteId, source }) {
224768
225244
  switch (source) {
225245
+ case "eventSeries": return mapEventsToSiteOptionItems(unwrapResponse(await apiClient({
225246
+ endpoint: "listEvents",
225247
+ params: {
225248
+ siteId,
225249
+ status: "active",
225250
+ visibility: "public"
225251
+ }
225252
+ })));
224769
225253
  case "eventCategories": return mapEventCategoriesToSiteOptionItems(unwrapResponse(await apiClient({
224770
225254
  endpoint: "listEventCategories",
224771
225255
  params: { siteId }
@@ -224789,6 +225273,7 @@ function createSiteOptionApiLoader(apiClient) {
224789
225273
  }
224790
225274
  function createSiteOptionWidgetAdapters({ loadItems, mapLoadError, renderManageLink }) {
224791
225275
  return {
225276
+ eventSeries: createSiteOptionWidgetAdapter("eventSeries", loadItems, mapLoadError, renderManageLink),
224792
225277
  eventCategories: createSiteOptionWidgetAdapter("eventCategories", loadItems, mapLoadError, renderManageLink),
224793
225278
  venues: createSiteOptionWidgetAdapter("venues", loadItems, mapLoadError, renderManageLink),
224794
225279
  staffMembers: createSiteOptionWidgetAdapter("staffMembers", loadItems, mapLoadError, renderManageLink)
@@ -231307,4 +231792,4 @@ function useSiteChromeCustomizeOptional() {
231307
231792
  return useContext(SiteChromeCustomizeContext);
231308
231793
  }
231309
231794
  //#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 };
231795
+ export { FooterComposerPanel as $, PenLine as $a, mapOptionValueForSelect as $i, coerceLinkedContentEntriesPayload as $n, runTransforms as $r, useMultiAutosave as $t, markApplySaving as A, CollapsibleTrigger as Aa, buttonStyleHoverPreferenceValue as Ai, containerResponsiveThemeCss as An, compileTransitionRuntime as Ar, RichTextField as At, setPaletteColors as B, cva as Ba, parseThemeForPersistence as Bi, compileManifestContentContract as Bn, curatedPalettes as Br, getBlockManifestFromSdkConfig as Bt, cancelPreview as C, DialogContent as Ca, isRecord$17 as Ci, deriveLaunchReadiness as Cn, retargetCompiledRuntimeFieldsForContentAdjacency as Cr, ButtonVariantField as Ct, isPreviewingChange as D, DialogTitle as Da, asDesignBlockId as Di, useApiMediaUploader as Dn, curatedSiteStyles as Dr, ReferenceField as Dt, dismissWarnings as E, DialogHeader as Ea, pageDesignEditorBackgroundOverrideOwner as Ei, useMediaEditorOptional as En, componentRuntimeRulesForTheme as Er, MediaField as Et, previewFooterLook as F, DropdownMenuLabel as Fa, updateButtonStyleSelectionChoice as Fi, SITE_CHROME_VISIBLE_HEADER_SELECTOR as Fn, gradientToCss as Fr, LinkWidgetProvider as Ft, confirmAutosaveBatch as G, TriangleAlert as Ga, paletteModeSchema as Gi, escapeStyleContent as Gn, backgroundAppearanceColorTokenNames as Gr, canRedoHistory as Gt, syncStyleConfiguratorState as H, X as Ha, VARIANT_ROLES as Hi, buildThemeRuntime as Hn, sectionTransitionFamilies as Hr, useEditorUiStore as Ht, previewHeaderLayout as I, DropdownMenuSeparator as Ia, buttonStyleSelectionKey as Ii, SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR as In, GRADIENT_PRESETS as Ir, BlockEditor as It, idleEditorTransactionQueueState as J, Smartphone as Ja, isHeaderField as Ji, defaultTransforms as Jn, ctaButton as Jr, pushHistoryEntry as Jt, deriveTransactionCapabilities as K, Tablet as Ka, attachRenderableMediaAssetFields as Ki, readBlockComposition as Kn, backgroundAppearanceQuickColorTokenNames as Kr, canUndoHistory as Kt, previewHeaderStyle as L, DropdownMenuTrigger as La, textColorStyle as Li, planSiteOverlayHeaderClearance as Ln, GRADIENT_PRESET_IDS as Lr, hideThemeV2RawStyleFields as Lt, palettePreviewProjection as M, DropdownMenu as Ma, findButtonStyleRecipe as Mi, makeDefaultBlockComponent as Mn, findFooterLook as Mr, EditorProvider as Mt, previewButtonStyle as N, DropdownMenuContent as Na, resolveButtonStyleSelection as Ni, getBlockDefinition as Nn, getHeaderLayout as Nr, useEditor$1 as Nt, markApplyFailed as O, Collapsible as Oa, assertNever$7 as Oi, isSupportedLoaderEndpoint as On, designRuntimeRulesForTheme as Or, ReferenceWidgetProvider as Ot, previewCuratedPalette as P, DropdownMenuItem as Pa, updateButtonStyleHoverPreference as Pi, projectRecurringSchedule as Pn, getHeaderStyle as Pr, LinkField as Pt, resolvePreviewSidebarTab as Q, Pencil as Qa, mapCurrentValueForSelect as Qi, LINKED_CONTENT_ENTRY_META_KEY as Qn, parseBackgroundContent as Qr, recordsEqual as Qt, previewSiteStyle as R, Primitive as Ra, defaultThemeTokens as Ri, visibleHeaderClearancePx as Rn, getGradientPreset as Rr, prepareBlockEditorManifest as Rt, applyTypographyDraftPatch as S, Dialog as Sa, isObjectRecord$1 as Si, DEFAULT_LAUNCH_READINESS_INPUT as Sn, retargetCompiledBoundaryRuntimeForContentAdjacency as Sr, EntryPickerWidgetProvider as St, deriveStyleConfiguratorCapabilities as T, DialogFooter as Ta, isThemeV2NormalEditorRawStyleFieldName as Ti, MediaEditorContextProvider as Tn, planPageDesignLayoutLookCompatibility as Tr, FileField as Tt, toggleRow as U, Upload as Ua, paletteColorEntries as Ui, DEFAULT_THEME_RESPONSIVE_MODE as Un, sectionTransitionFamilyForBoundaryOptionId as Ur, useEditorUiStoreInstance as Ut, styleConfiguratorHistoryEntryForPersistedSelection as V, cn$2 as Va, ORDINARY_TEXT_MIN_CONTRAST_RATIO as Vi, validateManifestDraft as Vn, defaultSectionTransitionVariantForFamily as Vr, classifyHistoryShortcut as Vt, beginAutosaveBatch as W, Undo2 as Wa, paletteColorsSchema as Wi, getResponsiveScopeSpec as Wn, sectionTransitionVariantForBoundaryOptionId as Wr, useOptionalEditorUiStoreInstance as Wt, resolveStyleConfiguratorInitialSnapshot as X, RotateCcw as Xa, useSdkConfig as Xi, resolvePageRouteTarget as Xn, EDITABLE_SURFACE_FORWARDING_PROP as Xr, undoHistory as Xt, rejectAutosaveBatch as Y, SlidersHorizontal as Ya, SdkConfigProvider as Yi, resolveEntryRouteTarget as Yn, bindingSchema as Yr, redoHistory as Yt, createOptimisticActionRunner as Z, Redo2 as Za, hasEmptyOption as Zi, resolveRouteTarget as Zn, planSiteChromePlacement as Zr, unsafeAsLinkedContentEntryId as Zt, reportPreviewDesignError as _, Input as _a, BlockApiProvider as _i, MediaEditor as _n, parseMediaAssetId as _o, heroCopyFragment as _r, loadMailingListAuthoringContext as _t, previewDesignHistoryDomainForCommand as a, TooltipTrigger as aa, coerceInlineTextWithFallback as ai, parseReferenceKind as an, GripVertical as ao, cardFragment as ar, useUISelector as at, planSiteChromeSelection as b, TabsList as ba, eventCalendarListLayoutOptions as bi, listEntryPageContentSlots as bn, applyCompiledRuntimeFieldsToContent as br, IconPickerField as bt, selectionSnapshotFromApplySiteStyleSelectionResponse as c, SelectItem as ca, Text$2 as ci, resolveContentTitle as cn, ChevronRight as co, blogFeaturedPostFragment as cr, useEntryController as ct, PreviewDesignCoordinatorProvider as d, Callout as da, getCurrentResolveImageUrlContext as di, ManifestForm as dn, Check as do, formCopyFragment as dr, createSiteOptionWidgetAdapters as dt, unmapValueFromSelect as ea, parseBlockIconValue as ei, useDebouncedLatestSave as en, Palette as eo, getLinkedContentEntryMeta as er, renderSiteChromeBlock as et, usePreviewDesignCoordinator as f, CalloutDescription as fa, resolveImageUrlWithContext as fi, createManifestFormAdapter as fn, parseFooterModuleId as fo, testimonialsCarouselFragment as fr, SiteOptionPickerField as ft, PREVIEW_DESIGN_SAVE_ERROR_MESSAGE as g, PopoverTrigger as ga, siblingPath$1 as gi, createStoreBackend as gn, expectParsedBrandedId as go, ctaRowFragment as gr, MailingListTargetingField as gt, PREVIEW_DESIGN_LOAD_ERROR_MESSAGE as h, PopoverContent as ha, getAtPath as hi, evaluateVisibility as hn, assertNever$10 as ho, heroCtaRowFragment as hr, OfferingsPreviewWidgetProvider as ht, usePreviewDesignHistoryOrder as i, TooltipContent as ia, logger$1 as ii, isAdapterReferenceKind as in, Image as io, headingFragment as ir, ContentFieldsForm as it, openRow as j, Surface as ja, buttonStyleSelectionParameterValue as ji, createCustomBlockRegistry as jn, surfaceResolutionContextFromTheme as jr, RichTextWidgetProvider as jt, markApplySaved as k, CollapsibleContent as ka, makeBoundaryId as ki, ThemeScope as kn, getCuratedSiteStyle as kr, useRichTextImagePicker as kt, deriveSiteStylePreviewUpdate as l, SelectTrigger as la, RichText as li, PaletteProvider as ln, ChevronLeft as lo, singleButtonFragment as lr, useEntryEditorController as lt, usePreviewThemeOverlay as m, Popover as ma, SECTION_BACKGROUND_MIN_SOURCE_WIDTH as mi, FormRenderer as mn, unsafeAsEditorBlockValues as mo, ctaCopyFragment as mr, OfferingsPreviewGroupOrderField as mt, useSiteChromeCustomizeOptional as n, useField as na, parseGeneratedIconSetId as ni, createSnapshotFromPageRecord as nn, Maximize2 as no, ImageResolveContextProvider as nr, PreviewInlineTextEditor as nt, selectPreviewDesignHistoryDomain as o, Select$1 as oa, inlineTextToPlainText as oi, deriveRouteMetadataPresentation as on, Eye as oo, faqAccordionFragment as or, EditableBlockProvider as ot, PreviewThemeOverlayProvider as p, SearchInput as pa, setContextResolveImageUrlContext as pi, createManifestValidation as pn, unsafeAsEditorBlockId as po, testimonialsHeadingFragment as pr, SiteOptionWidgetProvider as pt, enqueueTransaction as q, Sparkles as qa, getFieldIntent as qi, getDefaultComponentRegistry as qn, parseBackgroundAppearanceColorToken as qr, createHistoryState as qt, PreviewDesignHistoryOrderProvider as r, Tooltip as ra, renderInlineText as ri, BUILT_IN_REFERENCE_KINDS as rn, LoaderCircle as ro, richTextFragment as rr, PreviewTextEditor as rt, buildApplySiteStyleSelectionBody as s, SelectContent as sa, isInlineTextEmpty as si, resolvePageRouteSlug as sn, EllipsisVertical as so, faqHeadingFragment as sr, EntryControllerProvider as st, SiteChromeCustomizeProvider as t, FieldFrame as ta, parseGeneratedIconAssetId as ti, createRoutingHelpers as tn, Monitor as to, clientComponentRegistry as tr, PreviewRichTextEditor as tt, planConfiguratorPreview as u, SelectValue as ua, buildResolveImageUrlContext as ui, usePalette as un, ChevronDown as uo, formEmbedFragment as ur, createSiteOptionApiLoader as ut, buildSiteChromeSelectionModels as v, Tabs as va, calendarWindowQuerySchema as vi, applyPageDesignEditorAction as vn, parseSiteId as vo, bodyCopyFragment as vr, MailingListTargetingProvider as vt, createStyleConfiguratorState as w, DialogDescription as wa, corners as wi, AMBIENT_BACKGROUND_ROLES as wn, formatSiteChromeBackgroundTokenLabel as wr, ButtonWidgetProvider as wt, applyResolvedSelections as x, TabsTrigger as xa, bookingConsentCarrierSchema as xi, decodePublicProductCategorySelectorQuery as xn, compileEditorModelRuntime as xr, EntryPickerField as xt, cycleSiteChromeSelectionId as y, TabsContent as ya, eventCalendarListLayoutCompatibleDisplayModeValues as yi, getPageDesignEditorState as yn, __exportAll as yo, defineFragment as yr, InlineTextField as yt, resetTypographyToSaved as z, Button$1 as za, themeButtonClassName as zi, resolveVariantKey as zn, parseGradientPresetId as zr, stripTopLevelRoutingUi as zt };