@riverbankcms/sdk 0.132.0 → 0.134.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 (159) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/{PreviewEditorSidebar-DKQ5eFK9.mjs → PreviewEditorSidebar-DfRhJPFQ.mjs} +3 -3
  3. package/dist/{PreviewEditorUI-CNTcOjCC.mjs → PreviewEditorUI-Dppxcr_g.mjs} +2 -2
  4. package/dist/{SdkPreviewModeRuntime-DJu3qu33.mjs → SdkPreviewModeRuntime-8CyGCXir.mjs} +46 -15
  5. package/dist/{SiteChromeCustomizeContext-2TzT3vbj.mjs → SiteChromeCustomizeContext-DVMTMvqA.mjs} +497 -169
  6. package/dist/_dts/ai/src/contracts/proposals.d.ts +384 -384
  7. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +219 -219
  8. package/dist/_dts/api/src/accountApi.d.ts +5 -5
  9. package/dist/_dts/api/src/appointmentEndpointDefinitions.d.ts +1 -1
  10. package/dist/_dts/api/src/bookingOperations.d.ts +2 -14
  11. package/dist/_dts/api/src/bookings.d.ts +2 -2
  12. package/dist/_dts/api/src/contentRuntime.d.ts +1 -1
  13. package/dist/_dts/api/src/courseEndpointDefinitions.d.ts +2 -2
  14. package/dist/_dts/api/src/endpoints.d.ts +3 -3
  15. package/dist/_dts/api/src/indexCoreTypes.d.ts +1 -1
  16. package/dist/_dts/api/src/navigation/contracts.d.ts +9 -6
  17. package/dist/_dts/api/src/navigation/linkResolver.d.ts +6 -2
  18. package/dist/_dts/api/src/navigation/types.d.ts +23 -6
  19. package/dist/_dts/api/src/navigation.d.ts +1 -1
  20. package/dist/_dts/api/src/publicBookingService.d.ts +15 -0
  21. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +3 -1
  22. package/dist/_dts/api/src/publicExperience/wholeSeriesEndpoints.d.ts +2 -0
  23. package/dist/_dts/api/src/sdk-event-upsert.d.ts +1 -1
  24. package/dist/_dts/api/src/sdkThemeWire.d.ts +50 -50
  25. package/dist/_dts/api/src/siteBanner.d.ts +4 -2
  26. package/dist/_dts/api/src/types.d.ts +1 -1
  27. package/dist/_dts/api/src/webhooks.d.ts +12 -12
  28. package/dist/_dts/blocks/src/client.d.ts +1 -1
  29. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +28 -72
  30. package/dist/_dts/blocks/src/index.d.ts +3 -2
  31. package/dist/_dts/blocks/src/primitives/content/components/RichText.d.ts +2 -2
  32. package/dist/_dts/blocks/src/primitives/content/primitives.d.ts +1 -0
  33. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +36 -14
  34. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +3 -0
  35. package/dist/_dts/blocks/src/system/blocks/events/whole-series/schemas.d.ts +3 -3
  36. package/dist/_dts/blocks/src/system/blocks/events/whole-series/types.d.ts +3 -0
  37. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +4 -4
  38. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +148 -148
  39. package/dist/_dts/blocks/src/system/blocks/offerings-preview/model.d.ts +2 -1
  40. package/dist/_dts/blocks/src/system/blocks/shared/bookingConsent.d.ts +36 -0
  41. package/dist/_dts/blocks/src/system/manifest/hydrateLinks.d.ts +9 -2
  42. package/dist/_dts/blocks/src/system/manifest/resolveBlockData.d.ts +8 -0
  43. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +79 -79
  44. package/dist/_dts/blocks/src/system/runtime/api/types/appointments.d.ts +2 -11
  45. package/dist/_dts/blocks/src/system/runtime/api/types/courses.d.ts +2 -0
  46. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +1 -0
  47. package/dist/_dts/blocks/src/system/runtime/components/multi-step/DynamicFormFields.d.ts +3 -19
  48. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +1 -1
  49. package/dist/_dts/blocks/src/system/runtime/hooks/useSelectedAppointmentConsentForm.d.ts +2 -0
  50. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.consent.d.ts +10 -0
  51. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.field-values.d.ts +4 -0
  52. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.fields.d.ts +21 -0
  53. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +2 -1
  54. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.interactive.d.ts +38 -144
  55. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.state.d.ts +5 -19
  56. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +3 -2
  57. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/AttendeeDetailsStep.d.ts +2 -0
  58. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationSurface.d.ts +18 -1
  59. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +4 -4
  60. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/validation.d.ts +2 -1
  61. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/components.d.ts +2 -1
  62. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/whole-series/whole-series-registration.headless.contract.d.ts +2 -0
  63. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +34 -12
  64. package/dist/_dts/blocks/src/system/runtime/shared/components/BookingConsentAgreement.d.ts +7 -0
  65. package/dist/_dts/blocks/src/system/runtime/shared/types.d.ts +1 -0
  66. package/dist/_dts/blocks/src/system/types/link.d.ts +7 -1
  67. package/dist/_dts/content-model/src/content-types/schema.d.ts +4 -4
  68. package/dist/_dts/core/src/booking-consent.d.ts +8 -0
  69. package/dist/_dts/core/src/index.d.ts +1 -0
  70. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +9 -3
  71. package/dist/_dts/db/src/schemas/forms.d.ts +21 -21
  72. package/dist/_dts/db/src/types/jsonb.d.ts +1 -1
  73. package/dist/_dts/editor/src/primitives/rich-text/RichTextEditorSurface.d.ts +2 -1
  74. package/dist/_dts/editor/src/primitives/rich-text/config.d.ts +2 -1
  75. package/dist/_dts/editor/src/primitives/rich-text/toolbar/linkPopoverUtils.d.ts +3 -2
  76. package/dist/_dts/editor/src/primitives/rich-text/useRichTextEditor.d.ts +3 -4
  77. package/dist/_dts/media-core/src/usageScanner.d.ts +1 -1
  78. package/dist/_dts/sdk/src/bookings/types.d.ts +7 -89
  79. package/dist/_dts/sdk/src/config/validation.d.ts +30 -30
  80. package/dist/_dts/sdk/src/contracts/content.d.ts +10 -36
  81. package/dist/_dts/sdk/src/contracts/rendering.d.ts +1 -1
  82. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +9 -9
  83. package/dist/_dts/sdk/src/public-api/contracts.d.ts +6 -19
  84. package/dist/_dts/sdk/src/version.d.ts +1 -1
  85. package/dist/_dts/theme-core/src/accordions/types.d.ts +2 -2
  86. package/dist/_dts/theme-core/src/buttons/types.d.ts +12 -12
  87. package/dist/_dts/theme-core/src/cards/types.d.ts +5 -5
  88. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +72 -72
  89. package/dist/_dts/theme-core/src/navigation/types.d.ts +4 -4
  90. package/dist/_dts/theme-core/src/palette/colors.d.ts +1 -1
  91. package/dist/_dts/theme-core/src/palette/curated/types.d.ts +2 -2
  92. package/dist/_dts/theme-core/src/schema.d.ts +82 -82
  93. package/dist/_dts/theme-core/src/site-styles/cardRoleVocabulary.d.ts +1 -1
  94. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +2 -2
  95. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -4
  96. package/dist/_dts/theme-core/src/site-styles/logoBranding.d.ts +4 -4
  97. package/dist/_dts/theme-core/src/tokens/themeColorTokens.d.ts +1 -1
  98. package/dist/_dts/ui/src/badge.d.ts +1 -1
  99. package/dist/_dts/ui/src/button.d.ts +1 -1
  100. package/dist/_dts/ui/src/callout.d.ts +1 -1
  101. package/dist/_dts/ui/src/card.d.ts +1 -1
  102. package/dist/client/{StepIndicator-CGixP_LW.mjs → BookingConsentAgreement-BxgpGEFD.mjs} +26 -4
  103. package/dist/client/{DiscountCodeDisclosure-DO7llLxm.mjs → DiscountCodeDisclosure-CfuPOHD0.mjs} +1 -1
  104. package/dist/client/{EventCombined.client-xID7zN__.mjs → EventCombined.client-DB8Qfzi-.mjs} +3 -3
  105. package/dist/client/{EventListing.client-CriBslp0.mjs → EventListing.client-DD4X8hp4.mjs} +2 -2
  106. package/dist/client/{LeafletStaticMap-DYmHnM8g.mjs → LeafletStaticMap-QhgIBQbv.mjs} +1 -1
  107. package/dist/client/{WholeSeriesRegistrationWizard-BEjzSiOA.mjs → WholeSeriesRegistrationWizard-DwtC7bCs.mjs} +72 -22
  108. package/dist/client/{accordion-CgFbnnnQ.mjs → accordion-DFXpLvwg.mjs} +1 -1
  109. package/dist/client/{bookingForm-dUyGpbxc.mjs → bookingForm-sI05d3lk.mjs} +73 -47
  110. package/dist/client/bookings.mjs +989 -140
  111. package/dist/client/{carousel-BvBwkUzx.mjs → carousel-wjyWTZCh.mjs} +1 -1
  112. package/dist/client/{cart-DiZENT2E.mjs → cart-DCwdpA4i.mjs} +3 -3
  113. package/dist/client/{checkout-Dq13KIgR.mjs → checkout-DTDW3l0R.mjs} +3 -3
  114. package/dist/client/checkoutUrls-DQYC_Br-.mjs +187 -0
  115. package/dist/client/client.mjs +556 -237
  116. package/dist/client/{context-B83PiNzm.mjs → context-TSK1CGx8.mjs} +1 -14
  117. package/dist/client/{courseRegistration-CKC5NmyH.mjs → courseRegistration-A-Tg7qw_.mjs} +3 -3
  118. package/dist/client/{eventCalendar-BF0Jatfw.mjs → eventCalendar-B0Zg-i_w.mjs} +5 -5
  119. package/dist/client/{eventCombined-BuoCF8je.mjs → eventCombined-B8Y2wizd.mjs} +3 -3
  120. package/dist/client/{eventDetails-CKwh0S9s.mjs → eventDetails-DPDOwURJ.mjs} +3 -3
  121. package/dist/client/{eventListing-eUxaWFaB.mjs → eventListing-CjBcmSLn.mjs} +3 -3
  122. package/dist/client/{eventRegistration-CfkNOkPb.mjs → eventRegistration-CK30HsAq.mjs} +111 -64
  123. package/dist/client/{form-C17H1c_H.mjs → form-CUXfsABE.mjs} +2 -2
  124. package/dist/client/{headerSection-DEwUmrtt.mjs → headerSection-N-mN3rjr.mjs} +2 -2
  125. package/dist/client/hooks.mjs +106 -3
  126. package/dist/client/{locationMap-Pf2QwuvW.mjs → locationMap-oiIDQMBt.mjs} +2 -2
  127. package/dist/client/{newsletterForm-BWQAH5Sv.mjs → newsletterForm-CkQ2tTrM.mjs} +2 -2
  128. package/dist/client/{pricing-CVdvbopJ.mjs → pricing-Caa0QWzh.mjs} +1 -1
  129. package/dist/client/{productDetail-BZi1Fa_G.mjs → productDetail-CnidyrsN.mjs} +3 -3
  130. package/dist/client/{productList-qq-55DNk.mjs → productList-CttYcS_S.mjs} +3 -3
  131. package/dist/client/{propsDecoder-BxmqPKdP.mjs → propsDecoder-CeUMxI9a.mjs} +211 -100
  132. package/dist/client/rendering/client.mjs +428 -151
  133. package/dist/client/rendering/islands.mjs +18 -18
  134. package/dist/client/rendering.mjs +643 -324
  135. package/dist/client/{scrollToBlock-B3CcKdtG.mjs → scrollToBlock-lPr1oqxB.mjs} +1 -1
  136. package/dist/client/{shop-DNWJPut5.mjs → shop-DXQtMo2O.mjs} +6 -6
  137. package/dist/client/{shop-commerce-BhvQCosS.mjs → shop-commerce-quDL411J.mjs} +7 -164
  138. package/dist/client/{shop-commerce-store-B04sCNnW.mjs → shop-commerce-store-Dnu-8Iub.mjs} +1 -1
  139. package/dist/client/{shopShared-DNNgZlmW.mjs → shopShared-BWPUURvG.mjs} +3 -3
  140. package/dist/client/{useEventFilters-CUmhE24_.mjs → useEventFilters-DRhWp2_5.mjs} +3 -3
  141. package/dist/client/{usePolling-M5jG675x.mjs → usePolling-UN4WKnaM.mjs} +2 -2
  142. package/dist/preview-next/client/runtime.mjs +3 -3
  143. package/dist/{sdk-runtime-BEXb1wqo.mjs → sdk-runtime-Ca5RD78X.mjs} +1 -1
  144. package/dist/{separator-DGMuip1D.mjs → separator-CMhj6BTi.mjs} +1 -1
  145. package/dist/server/components.mjs +117 -37
  146. package/dist/server/config-validation.mjs +106 -3
  147. package/dist/server/config.mjs +106 -3
  148. package/dist/server/data.mjs +106 -3
  149. package/dist/server/index.mjs +1 -1
  150. package/dist/server/next.mjs +186 -106
  151. package/dist/server/page-converter.mjs +105 -2
  152. package/dist/server/prebuild.mjs +1 -1
  153. package/dist/server/rendering/server.mjs +119 -37
  154. package/dist/server/rendering.mjs +117 -37
  155. package/dist/server/routing.mjs +132 -73
  156. package/dist/server/server.mjs +107 -4
  157. package/dist/server/theme-bridge.mjs +4 -4
  158. package/package.json +2 -2
  159. package/dist/client/checkoutUrls-Ct8Mxna3.mjs +0 -26
@@ -77974,20 +77974,7 @@ function createBlockApi(config) {
77974
77974
  const path = buildPath(WHOLE_SERIES.checkout.path, { siteId: sid });
77975
77975
  return request(WHOLE_SERIES.checkout, {
77976
77976
  path,
77977
- body: {
77978
- eventSeriesId: data.eventSeriesId,
77979
- ...data.pricingOptionId ? { pricingOptionId: data.pricingOptionId } : {},
77980
- ...data.selectedSlidingAmount !== void 0 ? { selectedSlidingAmount: data.selectedSlidingAmount } : {},
77981
- email: data.email,
77982
- name: data.name,
77983
- phone: data.phone,
77984
- formData: data.formData,
77985
- altchaSolution: data.altchaSolution,
77986
- discountCode: data.discountCode,
77987
- successUrl: data.successUrl,
77988
- cancelUrl: data.cancelUrl,
77989
- claimToken: data.claimToken
77990
- }
77977
+ body: data
77991
77978
  });
77992
77979
  },
77993
77980
  async getWholeSeriesRegistrationStatus(params) {
@@ -90031,7 +90018,7 @@ function normalizeRel(target, rel) {
90031
90018
  tokens.add("noreferrer");
90032
90019
  return Array.from(tokens).join(" ");
90033
90020
  }
90034
- function renderMarks(text, marks, key) {
90021
+ function renderMarks(text, marks, key, linkTarget) {
90035
90022
  if (!marks || marks.length === 0) return text;
90036
90023
  return marks.reduce((acc, mark) => {
90037
90024
  switch (mark.type) {
@@ -90044,7 +90031,8 @@ function renderMarks(text, marks, key) {
90044
90031
  const attrs = mark.attrs ?? {};
90045
90032
  const href = sanitizeHref(attrs.href);
90046
90033
  if (!href) return acc;
90047
- const target = typeof attrs.target === "string" && attrs.target.trim().length > 0 ? attrs.target.trim() : void 0;
90034
+ const storedTarget = typeof attrs.target === "string" && attrs.target.trim().length > 0 ? attrs.target.trim() : void 0;
90035
+ const target = linkTarget === "new-tab" ? "_blank" : storedTarget;
90048
90036
  return /* @__PURE__ */ jsx("a", {
90049
90037
  href,
90050
90038
  target,
@@ -90056,14 +90044,14 @@ function renderMarks(text, marks, key) {
90056
90044
  }
90057
90045
  }, text);
90058
90046
  }
90059
- function renderDoc(node, key, imageResolveContext) {
90047
+ function renderDoc(node, key, imageResolveContext, linkTarget) {
90060
90048
  if (!node || !node.type) return null;
90061
- const children = node.content?.map((child, index) => renderDoc(child, `${key}-${index}`, imageResolveContext));
90049
+ const children = node.content?.map((child, index) => renderDoc(child, `${key}-${index}`, imageResolveContext, linkTarget));
90062
90050
  switch (node.type) {
90063
90051
  case "doc": return /* @__PURE__ */ jsx(Fragment$1, { children });
90064
90052
  case "paragraph":
90065
90053
  if (!children && !node.text) return /* @__PURE__ */ jsx("p", {}, key);
90066
- return /* @__PURE__ */ jsx("p", { children: children ?? renderMarks(node.text ?? "", node.marks, key) }, key);
90054
+ return /* @__PURE__ */ jsx("p", { children: children ?? renderMarks(node.text ?? "", node.marks, key, linkTarget) }, key);
90067
90055
  case "heading": {
90068
90056
  const headingTag = `h${Math.min(Math.max(node.attrs?.level ?? 2, 1), 6)}`;
90069
90057
  return React.createElement(headingTag, { key }, children);
@@ -90105,14 +90093,14 @@ function renderDoc(node, key, imageResolveContext) {
90105
90093
  decoding: "async"
90106
90094
  }, key);
90107
90095
  }
90108
- case "text": return renderMarks(node.text ?? "", node.marks, key);
90096
+ case "text": return renderMarks(node.text ?? "", node.marks, key, linkTarget);
90109
90097
  default: return null;
90110
90098
  }
90111
90099
  }
90112
90100
  const DEFAULT_RICH_TEXT_CLASS = "rb-prose rb-max-w-none";
90113
- function RichText({ as: Comp = "div", className, doc, path }) {
90101
+ function RichText({ as: Comp = "div", className, doc, path, linkTarget = "stored" }) {
90114
90102
  const imageResolveContext = getCurrentResolveImageUrlContext() ?? null;
90115
- const content = doc ? renderDoc(doc, "doc", imageResolveContext) : null;
90103
+ const content = doc ? renderDoc(doc, "doc", imageResolveContext, linkTarget) : null;
90116
90104
  const dataAttributes = path ? { "data-builder-richtext": path } : void 0;
90117
90105
  return /* @__PURE__ */ jsx(Comp, {
90118
90106
  className: className?.trim() || DEFAULT_RICH_TEXT_CLASS,
@@ -93549,6 +93537,41 @@ function err(error) {
93549
93537
  function assertNever$5(value, message) {
93550
93538
  throw new Error(message ?? `Unexpected value: ${String(value)}`);
93551
93539
  }
93540
+ //#endregion
93541
+ //#region ../blocks/src/system/blocks/shared/bookingConsent.ts
93542
+ const BOOKING_REQUIREMENT_CONSENT_FIELD_PREFIX = "booking_requirement_consent_";
93543
+ function toBookingRequirementConsentFieldId(requirementId) {
93544
+ return `${BOOKING_REQUIREMENT_CONSENT_FIELD_PREFIX}${requirementId}`;
93545
+ }
93546
+ function isBookingRequirementConsentFieldId(value) {
93547
+ return value.startsWith(BOOKING_REQUIREMENT_CONSENT_FIELD_PREFIX);
93548
+ }
93549
+ function toBookingRequirementConsentField(consent) {
93550
+ return {
93551
+ id: toBookingRequirementConsentFieldId(consent.requirementId),
93552
+ label: consent.title,
93553
+ type: "booking_requirement_consent",
93554
+ required: true,
93555
+ agreement: consent.agreement,
93556
+ checkboxLabel: consent.checkboxLabel
93557
+ };
93558
+ }
93559
+ const blockBookingConsentSchema = z.object({
93560
+ requirementId: z.string(),
93561
+ title: z.string(),
93562
+ agreement: RichTextDocSchema,
93563
+ checkboxLabel: z.string()
93564
+ });
93565
+ const bookingRequirementConsentFieldSchema = z.object({
93566
+ id: z.string(),
93567
+ label: z.string(),
93568
+ type: z.literal("booking_requirement_consent"),
93569
+ required: z.literal(true),
93570
+ agreement: RichTextDocSchema,
93571
+ checkboxLabel: z.string().min(1)
93572
+ });
93573
+ /** The two live public carriers for consent copy: Event data and appointment fields. */
93574
+ const bookingConsentCarrierSchema = z.union([blockBookingConsentSchema, bookingRequirementConsentFieldSchema]);
93552
93575
  const BOOKING_FORM_DATA_RESERVED_KEYS = /* @__PURE__ */ new Set([
93553
93576
  "serviceId",
93554
93577
  "resourceId",
@@ -93560,6 +93583,28 @@ const BOOKING_FORM_DATA_RESERVED_KEYS = /* @__PURE__ */ new Set([
93560
93583
  "selectedAppointmentPackageId"
93561
93584
  ]);
93562
93585
  //#endregion
93586
+ //#region ../blocks/src/system/runtime/nodes/booking-form.consent.ts
93587
+ function resolveSelectedAppointmentConsent(service) {
93588
+ return service?.consent ? {
93589
+ kind: "required-for-selected-service",
93590
+ field: toBookingRequirementConsentField(service.consent)
93591
+ } : { kind: "not-applicable" };
93592
+ }
93593
+ function projectSelectedAppointmentConsentIntoForm(form, selectedConsent) {
93594
+ if (!form) return null;
93595
+ const sourceFields = form.schema?.fields ?? [];
93596
+ const baseFields = sourceFields.filter((field) => field.type !== "booking_requirement_consent");
93597
+ const fields = selectedConsent.kind === "required-for-selected-service" ? [...baseFields, selectedConsent.field] : baseFields;
93598
+ if (selectedConsent.kind === "not-applicable" && baseFields.length === sourceFields.length) return form;
93599
+ return {
93600
+ ...form,
93601
+ schema: {
93602
+ ...form.schema,
93603
+ fields
93604
+ }
93605
+ };
93606
+ }
93607
+ //#endregion
93563
93608
  //#region ../blocks/src/system/runtime/nodes/booking-form.state.ts
93564
93609
  function toTrimmedString(value) {
93565
93610
  const trimmed = value?.trim();
@@ -93742,7 +93787,6 @@ function readBookingFieldType(value) {
93742
93787
  case "select":
93743
93788
  case "radio":
93744
93789
  case "checkbox":
93745
- case "booking_requirement_consent":
93746
93790
  case "tel":
93747
93791
  case "url":
93748
93792
  case "number":
@@ -93777,7 +93821,7 @@ function normalizeBookingSettings(value) {
93777
93821
  };
93778
93822
  }
93779
93823
  function isBookingFormService(value) {
93780
- return isRecord$13(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
93824
+ return isRecord$13(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string" && (value.consent === void 0 || blockBookingConsentSchema.safeParse(value.consent).success);
93781
93825
  }
93782
93826
  function collectBookingCustomFields(data) {
93783
93827
  const customFields = {};
@@ -94026,6 +94070,15 @@ const bookingFieldOptionSchema = z.object({
94026
94070
  value: z.string(),
94027
94071
  label: z.string()
94028
94072
  });
94073
+ const standardBookingFieldRules = {
94074
+ options: z.array(bookingFieldOptionSchema).optional(),
94075
+ multiple: z.boolean().optional(),
94076
+ minLength: z.number().optional(),
94077
+ maxLength: z.number().optional(),
94078
+ pattern: z.string().optional(),
94079
+ min: z.number().optional(),
94080
+ max: z.number().optional()
94081
+ };
94029
94082
  const bookingFieldSchema = z.object({
94030
94083
  id: z.string(),
94031
94084
  label: z.string(),
@@ -94036,7 +94089,6 @@ const bookingFieldSchema = z.object({
94036
94089
  "select",
94037
94090
  "radio",
94038
94091
  "checkbox",
94039
- "booking_requirement_consent",
94040
94092
  "tel",
94041
94093
  "url",
94042
94094
  "number",
@@ -94046,13 +94098,7 @@ const bookingFieldSchema = z.object({
94046
94098
  required: z.boolean().optional(),
94047
94099
  placeholder: z.string().optional(),
94048
94100
  helpText: z.string().optional(),
94049
- options: z.array(bookingFieldOptionSchema).optional(),
94050
- multiple: z.boolean().optional(),
94051
- minLength: z.number().optional(),
94052
- maxLength: z.number().optional(),
94053
- pattern: z.string().optional(),
94054
- min: z.number().optional(),
94055
- max: z.number().optional()
94101
+ ...standardBookingFieldRules
94056
94102
  });
94057
94103
  const bookingSettingsSchema = z.object({
94058
94104
  type: z.literal("booking"),
@@ -94158,7 +94204,8 @@ const bookingServiceSchema = z.object({
94158
94204
  priceAmount: z.number().nullable().optional(),
94159
94205
  priceCurrency: z.string().nullable().optional(),
94160
94206
  paymentTerms: blockBookingPaymentTermsSchema.optional(),
94161
- paymentTermsAvailability: blockBookingPaymentTermsAvailabilitySchema.optional()
94207
+ paymentTermsAvailability: blockBookingPaymentTermsAvailabilitySchema.optional(),
94208
+ consent: blockBookingConsentSchema.optional()
94162
94209
  });
94163
94210
  const bookingServicesSourceSchema = z.union([
94164
94211
  z.array(bookingServiceSchema),
@@ -94729,6 +94776,7 @@ const publicWholeSeriesOfferingSchema = z.object({
94729
94776
  pricing: wholeSeriesPricingSchema,
94730
94777
  currency: z.string(),
94731
94778
  paymentTerms: blockBookingPaymentTermsSchema,
94779
+ consent: blockBookingConsentSchema.nullable(),
94732
94780
  enrollmentCapacity: z.number().nullable(),
94733
94781
  acceptsMemberships: z.boolean(),
94734
94782
  status: z.enum([
@@ -97677,6 +97725,7 @@ const publicEventSchema = z.object({
97677
97725
  timeZone: z.string(),
97678
97726
  pricing: publicEventPricingSchema,
97679
97727
  paymentTerms: blockBookingPaymentTermsSchema,
97728
+ consent: blockBookingConsentSchema.nullable(),
97680
97729
  accessRestriction: accessRestrictionSchema,
97681
97730
  allowedCategoryIds: z.array(z.string()),
97682
97731
  requireGuestDetails: z.boolean().optional(),
@@ -99626,6 +99675,7 @@ function normalizeGroupPresentation(value) {
99626
99675
  function resolveAutoCtaPath(source, routes) {
99627
99676
  const routeByNormalizedPath = /* @__PURE__ */ new Map();
99628
99677
  for (const route of routes ?? []) {
99678
+ if (route.kind === "pageSurface") continue;
99629
99679
  const normalized = normalizeRoutePath(route.path);
99630
99680
  if (normalized && !routeByNormalizedPath.has(normalized)) routeByNormalizedPath.set(normalized, route.path);
99631
99681
  }
@@ -116841,6 +116891,54 @@ const occurrenceContextSchema = z.object({
116841
116891
  overrides: z.record(z.string(), z.unknown()).nullable().optional()
116842
116892
  }).nullable();
116843
116893
  //#endregion
116894
+ //#region ../blocks/src/system/runtime/nodes/event-registration/registrationSurface.ts
116895
+ function planEventRegistrationScope(input) {
116896
+ const subject = input.subject;
116897
+ const selectedRunOffering = input.wholeSeriesOffering;
116898
+ if (subject?.kind !== "eventOffering" || !selectedRunOffering) return {
116899
+ kind: "context",
116900
+ events: resolveEventRegistrationScopedEvents(input.events, {
116901
+ occurrenceContext: input.occurrenceContext,
116902
+ subject
116903
+ })
116904
+ };
116905
+ if (!(selectedRunOffering.eventOfferingId === subject.eventOfferingId && subject.availableEventSeriesIds.some((seriesId) => seriesId === selectedRunOffering.eventSeriesId))) return { kind: "invalidSelectedRun" };
116906
+ return {
116907
+ kind: "selectedRun",
116908
+ events: input.events.filter((event) => event.seriesId === selectedRunOffering.eventSeriesId),
116909
+ offering: selectedRunOffering
116910
+ };
116911
+ }
116912
+ function planEventRegistrationSurface(input) {
116913
+ const scope = planEventRegistrationScope(input);
116914
+ if (scope.kind === "invalidSelectedRun") return { kind: "unavailableWholeSeries" };
116915
+ const scopedEvents = scope.events;
116916
+ const bookingScopes = new Set(scopedEvents.map((event) => event.bookingScope));
116917
+ if (scope.kind === "selectedRun") {
116918
+ if (bookingScopes.size !== 1 || !bookingScopes.has("whole_series")) return { kind: "unavailableWholeSeries" };
116919
+ return {
116920
+ kind: "wholeSeries",
116921
+ offerings: [scope.offering]
116922
+ };
116923
+ }
116924
+ if (!input.occurrenceContext && !input.subject && bookingScopes.has("single_occurrence")) return {
116925
+ kind: "occurrence",
116926
+ events: scopedEvents.filter((event) => event.bookingScope === "single_occurrence")
116927
+ };
116928
+ if (bookingScopes.size === 0 || bookingScopes.has("single_occurrence")) return bookingScopes.has("whole_series") ? { kind: "mixedBookingScopes" } : {
116929
+ kind: "occurrence",
116930
+ events: scopedEvents
116931
+ };
116932
+ const requiredSeriesIds = new Set(scopedEvents.map((event) => event.seriesId));
116933
+ const wholeSeriesOffering = input.wholeSeriesOffering;
116934
+ const offerings = (wholeSeriesOffering ? [wholeSeriesOffering, ...input.wholeSeriesOfferings.filter((offering) => offering.eventSeriesId !== wholeSeriesOffering.eventSeriesId)] : input.wholeSeriesOfferings).filter((offering) => requiredSeriesIds.has(offering.eventSeriesId));
116935
+ const loadedSeriesIds = new Set(offerings.map((offering) => offering.eventSeriesId));
116936
+ return [...requiredSeriesIds].every((seriesId) => loadedSeriesIds.has(seriesId)) && offerings.length > 0 ? {
116937
+ kind: "wholeSeries",
116938
+ offerings
116939
+ } : { kind: "unavailableWholeSeries" };
116940
+ }
116941
+ //#endregion
116844
116942
  //#region ../blocks/src/system/runtime/nodes/event-registration/wizardSteps.ts
116845
116943
  /**
116846
116944
  * Steps that are part of the main wizard and should show the step indicator
@@ -117054,10 +117152,13 @@ function buildEventRegistrationShellStepLabels(source) {
117054
117152
  }) : false).map((step) => shellLabelForRegistrationStep(step, scopedEvents));
117055
117153
  }
117056
117154
  function scopeEventRegistrationEvents(source) {
117057
- return resolveEventRegistrationScopedEvents(toRegistrationEvents(source.events ?? []), {
117155
+ const scope = planEventRegistrationScope({
117156
+ events: toRegistrationEvents(source.events ?? []),
117157
+ wholeSeriesOffering: source.wholeSeriesOffering,
117058
117158
  occurrenceContext: source.occurrenceContext,
117059
117159
  subject: source.subject
117060
117160
  });
117161
+ return scope.kind === "invalidSelectedRun" ? [] : scope.events;
117061
117162
  }
117062
117163
  function shellLabelForRegistrationStep(step, events) {
117063
117164
  switch (step) {
@@ -122408,6 +122509,11 @@ function getChallengeUrl() {
122408
122509
  return `${getCmsApiUrl()}/public/challenge`;
122409
122510
  }
122410
122511
  //#endregion
122512
+ //#region ../blocks/src/system/runtime/hooks/useSelectedAppointmentConsentForm.ts
122513
+ function useSelectedAppointmentConsentForm(form, selectedService) {
122514
+ return useMemo(() => projectSelectedAppointmentConsentIntoForm(form, resolveSelectedAppointmentConsent(selectedService)), [form, selectedService]);
122515
+ }
122516
+ //#endregion
122411
122517
  //#region ../blocks/src/utils/date-formatting.ts
122412
122518
  /**
122413
122519
  * Resolve the browser/runtime timezone for booking surfaces.
@@ -123472,6 +123578,19 @@ function clearBookingFieldError(errors, fieldId) {
123472
123578
  };
123473
123579
  }
123474
123580
  //#endregion
123581
+ //#region ../blocks/src/system/runtime/nodes/booking-form.field-values.ts
123582
+ function collectInitialBookingFieldValues(initialData) {
123583
+ const values = {};
123584
+ for (const [key, value] of Object.entries(initialData)) if (!BOOKING_FORM_DATA_RESERVED_KEYS.has(key) && !isBookingRequirementConsentFieldId(key) && isBookingFieldValue(value)) values[key] = value;
123585
+ return values;
123586
+ }
123587
+ function omitBookingConsentEntries(record) {
123588
+ return Object.fromEntries(Object.entries(record).filter(([key]) => !isBookingRequirementConsentFieldId(key)));
123589
+ }
123590
+ function isBookingFieldValue(value) {
123591
+ return value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean" || Array.isArray(value) && value.every((item) => typeof item === "string");
123592
+ }
123593
+ //#endregion
123475
123594
  //#region ../blocks/src/system/runtime/nodes/booking-form.headless.state.ts
123476
123595
  const unsafeAsBookingFieldId = (id) => id;
123477
123596
  function createInitialBookingFlowReducerState(input) {
@@ -123483,7 +123602,7 @@ function createInitialBookingFlowReducerState(input) {
123483
123602
  selectedResourceId: toOptionalAppointmentResourceId(toOptionalString(initialData.resourceId) ?? input.defaultResourceId),
123484
123603
  selectedDate: toOptionalString(initialData.selectedDate),
123485
123604
  selectedSlot: null,
123486
- fieldValues: collectInitialFieldValues(initialData),
123605
+ fieldValues: collectInitialBookingFieldValues(initialData),
123487
123606
  touchedFields: {},
123488
123607
  attemptedStepIds: {},
123489
123608
  discountCode: toOptionalString(initialData.discountCode) ?? "",
@@ -123495,14 +123614,6 @@ function createInitialBookingFlowReducerState(input) {
123495
123614
  feedback: { kind: "none" }
123496
123615
  };
123497
123616
  }
123498
- function collectInitialFieldValues(initialData) {
123499
- const values = {};
123500
- for (const [key, value] of Object.entries(initialData)) {
123501
- if (BOOKING_FORM_DATA_RESERVED_KEYS.has(key) || !isBookingFieldValue(value)) continue;
123502
- values[key] = value;
123503
- }
123504
- return values;
123505
- }
123506
123617
  function toOptionalString(value) {
123507
123618
  if (typeof value !== "string") return void 0;
123508
123619
  const trimmed = value.trim();
@@ -123521,9 +123632,6 @@ function toOptionalAppointmentResourceId(value) {
123521
123632
  function toOptionalCustomerPassId(value) {
123522
123633
  return toOptionalBrandedId(value, unsafeAsCustomerPassId);
123523
123634
  }
123524
- function isBookingFieldValue(value) {
123525
- return value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean" || Array.isArray(value) && value.every((item) => typeof item === "string");
123526
- }
123527
123635
  /**
123528
123636
  * Send the flow back to the date step when the slot it was holding went away,
123529
123637
  * leaving a scoped feedback message. A completed booking is left alone.
@@ -123545,17 +123653,7 @@ function applyAvailabilitySelectionInvalidation(state, invalidation) {
123545
123653
  }
123546
123654
  function bookingFlowReducer(state, event) {
123547
123655
  switch (event.type) {
123548
- case "service-selected": return {
123549
- ...state,
123550
- selectedServiceId: event.serviceId,
123551
- selectedResourceId: void 0,
123552
- selectedDate: void 0,
123553
- selectedSlot: null,
123554
- selectedAppointmentPackageId: void 0,
123555
- selectedSlidingAmountInput: "",
123556
- selectedCollectionOptionKind: void 0,
123557
- validationErrors: clearBookingFormError(state.validationErrors)
123558
- };
123656
+ case "service-selected": return applyBookingServiceSelection(state, event.serviceId);
123559
123657
  case "resource-selected": return {
123560
123658
  ...state,
123561
123659
  selectedResourceId: event.resourceId ?? void 0,
@@ -123662,6 +123760,24 @@ function bookingFlowReducer(state, event) {
123662
123760
  default: return assertNever$5(event);
123663
123761
  }
123664
123762
  }
123763
+ function applyBookingServiceSelection(state, serviceId) {
123764
+ return {
123765
+ ...state,
123766
+ selectedServiceId: serviceId,
123767
+ selectedResourceId: void 0,
123768
+ selectedDate: void 0,
123769
+ selectedSlot: null,
123770
+ selectedAppointmentPackageId: void 0,
123771
+ selectedSlidingAmountInput: "",
123772
+ selectedCollectionOptionKind: void 0,
123773
+ fieldValues: omitBookingConsentEntries(state.fieldValues),
123774
+ touchedFields: omitBookingConsentEntries(state.touchedFields),
123775
+ validationErrors: {
123776
+ ...clearBookingFormError(state.validationErrors),
123777
+ fieldErrors: omitBookingConsentEntries(state.validationErrors.fieldErrors)
123778
+ }
123779
+ };
123780
+ }
123665
123781
  function clearAvailabilityFeedback(feedback) {
123666
123782
  return feedback.kind === "error" && feedback.scope === "availability" ? { kind: "none" } : feedback;
123667
123783
  }
@@ -123822,7 +123938,8 @@ function validateBookingFields(input) {
123822
123938
  return errors;
123823
123939
  }
123824
123940
  function validateBookingField(field, value) {
123825
- if (field.required && isBlankFieldValue(value)) return `${field.label} is required`;
123941
+ const requiredError = validateRequiredBookingField(field, value);
123942
+ if (requiredError) return requiredError;
123826
123943
  if (isBlankFieldValue(value)) return null;
123827
123944
  const strValue = typeof value === "string" ? value : String(value);
123828
123945
  if (field.type === "email") return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(strValue) ? null : "Please enter a valid email address";
@@ -123851,6 +123968,10 @@ function validateBookingField(field, value) {
123851
123968
  }
123852
123969
  return null;
123853
123970
  }
123971
+ function validateRequiredBookingField(field, value) {
123972
+ if (field.type === "booking_requirement_consent") return value === true ? null : `${field.label} is required`;
123973
+ return field.required && isBlankFieldValue(value) ? `${field.label} is required` : null;
123974
+ }
123854
123975
  function deriveBookingFlowSteps(input) {
123855
123976
  const stepResolution = buildBookingStepResolution({
123856
123977
  form: input.form,
@@ -123922,7 +124043,8 @@ function deriveBookingFieldViews(input) {
123922
124043
  return (input.form?.schema?.fields ?? []).map((field) => {
123923
124044
  const fieldId = unsafeAsBookingFieldId(field.id);
123924
124045
  const inputId = `${input.idPrefix}-${fieldId}`;
123925
- const helpTextId = field.helpText ? `${inputId}-help` : null;
124046
+ const helpText = field.type === "booking_requirement_consent" ? null : field.helpText ?? null;
124047
+ const helpTextId = helpText ? `${inputId}-help` : null;
123926
124048
  const fieldValue = input.values[field.id] ?? null;
123927
124049
  const localError = input.touched?.[field.id] ? validateBookingField(field, fieldValue) : null;
123928
124050
  const error = input.errors[field.id] ?? localError;
@@ -123932,17 +124054,17 @@ function deriveBookingFieldViews(input) {
123932
124054
  field,
123933
124055
  id: fieldId,
123934
124056
  label: field.label,
123935
- type: field.type,
123936
124057
  value: fieldValue,
123937
124058
  required: Boolean(field.required),
123938
124059
  error,
123939
- helpText: field.helpText ?? null,
124060
+ helpText,
123940
124061
  inputId,
123941
124062
  labelId: `${inputId}-label`,
123942
124063
  helpTextId,
123943
124064
  errorId,
123944
124065
  describedBy,
123945
- ariaInvalid: Boolean(error)
124066
+ ariaInvalid: Boolean(error),
124067
+ type: field.type
123946
124068
  };
123947
124069
  });
123948
124070
  }
@@ -124136,6 +124258,7 @@ function useHeadlessBookingFlow(options) {
124136
124258
  const selectedServiceId = state.selectedServiceId ?? defaultServiceId;
124137
124259
  const selectedResourceId = state.selectedResourceId ?? defaultResourceId;
124138
124260
  const selectedService = options.services.find((service) => service.id === selectedServiceId) ?? null;
124261
+ const runtimeForm = useSelectedAppointmentConsentForm(options.form, selectedService);
124139
124262
  const lastSlidingServiceIdRef = useRef(null);
124140
124263
  useEffect(() => {
124141
124264
  const selectedId = selectedService?.id ?? null;
@@ -124176,7 +124299,7 @@ function useHeadlessBookingFlow(options) {
124176
124299
  viewerTimeZone
124177
124300
  ]);
124178
124301
  const stepState = useMemo(() => deriveBookingFlowSteps({
124179
- form: options.form,
124302
+ form: runtimeForm,
124180
124303
  services: options.services,
124181
124304
  data,
124182
124305
  defaultServiceId,
@@ -124192,7 +124315,7 @@ function useHeadlessBookingFlow(options) {
124192
124315
  defaultServiceId,
124193
124316
  defaultResourceId,
124194
124317
  options.enableAppointmentPackages,
124195
- options.form,
124318
+ runtimeForm,
124196
124319
  options.requiresResourceSelection,
124197
124320
  options.requiresServiceSelection,
124198
124321
  options.services,
@@ -124246,13 +124369,13 @@ function useHeadlessBookingFlow(options) {
124246
124369
  state.selectedSlot
124247
124370
  ]);
124248
124371
  const fields = useMemo(() => deriveBookingFieldViews({
124249
- form: options.form,
124372
+ form: runtimeForm,
124250
124373
  values: state.fieldValues,
124251
124374
  errors: state.validationErrors.fieldErrors,
124252
124375
  touched: state.touchedFields,
124253
124376
  idPrefix: `booking-${options.formId}`
124254
124377
  }), [
124255
- options.form,
124378
+ runtimeForm,
124256
124379
  options.formId,
124257
124380
  state.fieldValues,
124258
124381
  state.touchedFields,
@@ -124372,7 +124495,7 @@ function useHeadlessBookingFlow(options) {
124372
124495
  const latestRef = useLatestRef({
124373
124496
  state,
124374
124497
  data,
124375
- form: options.form,
124498
+ form: runtimeForm,
124376
124499
  formId: formKey,
124377
124500
  services: options.services,
124378
124501
  defaultServiceId,
@@ -124624,7 +124747,7 @@ function useHeadlessBookingFlow(options) {
124624
124747
  phase: state.phase
124625
124748
  });
124626
124749
  const view = resolveHeadlessBookingView({
124627
- form: options.form,
124750
+ form: runtimeForm,
124628
124751
  feedback: state.feedback
124629
124752
  });
124630
124753
  const appointmentPackagesModel = resolveAppointmentPackagesModel({
@@ -125388,6 +125511,27 @@ function FieldValidationMessage({ id, children, className, live = "assertive" })
125388
125511
  });
125389
125512
  }
125390
125513
  //#endregion
125514
+ //#region ../blocks/src/system/runtime/shared/components/BookingConsentAgreement.tsx
125515
+ function BookingConsentAgreement({ agreement, showTitle = true, title, titleId }) {
125516
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [showTitle ? /* @__PURE__ */ jsxs("div", {
125517
+ id: titleId,
125518
+ className: "form-label",
125519
+ children: [title, /* @__PURE__ */ jsx("span", {
125520
+ className: "required-marker",
125521
+ children: "*"
125522
+ })]
125523
+ }) : null, /* @__PURE__ */ jsx("div", {
125524
+ role: "group",
125525
+ "aria-label": showTitle ? void 0 : title,
125526
+ "aria-labelledby": showTitle ? titleId : void 0,
125527
+ children: /* @__PURE__ */ jsx(RichText, {
125528
+ doc: agreement,
125529
+ linkTarget: "new-tab",
125530
+ className: "rb-prose rb-max-w-none"
125531
+ })
125532
+ })] });
125533
+ }
125534
+ //#endregion
125391
125535
  //#region ../blocks/src/system/runtime/nodes/booking-form.default-ui.tsx
125392
125536
  function optionCardClassName(isSelected) {
125393
125537
  return `rb-option-card${isSelected ? " rb-option-card--selected" : ""}`;
@@ -125836,7 +125980,11 @@ function DefaultDynamicField({ booking, field }) {
125836
125980
  return /* @__PURE__ */ jsxs("div", {
125837
125981
  className: "rb-space-y-2",
125838
125982
  children: [
125839
- /* @__PURE__ */ jsxs("label", {
125983
+ field.field.type === "booking_requirement_consent" ? /* @__PURE__ */ jsx(BookingConsentAgreement, {
125984
+ agreement: field.field.agreement,
125985
+ title: field.label,
125986
+ titleId: field.labelId
125987
+ }) : /* @__PURE__ */ jsxs("label", {
125840
125988
  id: field.labelId,
125841
125989
  htmlFor: field.inputId,
125842
125990
  className: "form-label",
@@ -125881,7 +126029,7 @@ function DefaultFieldInput({ describedBy, error, errorId, field, onBlur, onChang
125881
126029
  required: field.required,
125882
126030
  ...validationProps
125883
126031
  };
125884
- switch (field.type) {
126032
+ switch (field.field.type) {
125885
126033
  case "textarea": return /* @__PURE__ */ jsx("textarea", {
125886
126034
  ...commonProps,
125887
126035
  value: strValue,
@@ -125995,7 +126143,7 @@ function DefaultFieldInput({ describedBy, error, errorId, field, onBlur, onChang
125995
126143
  className: "form-checkbox rb-mt-0.5"
125996
126144
  }), /* @__PURE__ */ jsx("span", {
125997
126145
  className: "rb-caption",
125998
- children: field.field.placeholder || field.label
126146
+ children: field.field.checkboxLabel
125999
126147
  })]
126000
126148
  });
126001
126149
  case "number": return /* @__PURE__ */ jsx("input", {
@@ -126064,10 +126212,10 @@ function DefaultBookingDiscount({ booking }) {
126064
126212
  children: /* @__PURE__ */ jsxs("p", {
126065
126213
  className: "ab-text",
126066
126214
  children: [
126067
- "Discount available: ",
126068
- booking.discount.autoAppliedDiscount.publicLabel,
126215
+ "Discount available:",
126069
126216
  " ",
126070
- "will apply automatically at checkout."
126217
+ booking.discount.autoAppliedDiscount.publicLabel,
126218
+ " will apply automatically at checkout."
126071
126219
  ]
126072
126220
  })
126073
126221
  }) : null]
@@ -127812,13 +127960,72 @@ function LoggedInAsUser({ email, onLogout, classPrefix }) {
127812
127960
  }
127813
127961
  //#endregion
127814
127962
  //#region ../blocks/src/system/runtime/nodes/event-registration/AttendeeDetailsStep.tsx
127963
+ function EventConsentField({ consent, error, formData, idBase, onChange }) {
127964
+ const errorId = `${idBase}-consent-error`;
127965
+ return /* @__PURE__ */ jsxs("div", {
127966
+ className: "er-field",
127967
+ children: [
127968
+ /* @__PURE__ */ jsx(BookingConsentAgreement, {
127969
+ agreement: consent.agreement,
127970
+ title: consent.title,
127971
+ titleId: `${idBase}-consent-title`
127972
+ }),
127973
+ /* @__PURE__ */ jsxs("label", {
127974
+ className: "er-label rb-flex rb-items-start rb-gap-2 rb-cursor-pointer",
127975
+ children: [
127976
+ /* @__PURE__ */ jsx("input", {
127977
+ "aria-describedby": error ? errorId : void 0,
127978
+ className: "form-checkbox rb-mt-0.5",
127979
+ checked: formData.consentAccepted === true,
127980
+ onChange: (event) => onChange({
127981
+ ...formData,
127982
+ consentAccepted: event.target.checked
127983
+ }),
127984
+ type: "checkbox"
127985
+ }),
127986
+ consent.checkboxLabel,
127987
+ " ",
127988
+ /* @__PURE__ */ jsx("span", {
127989
+ className: "er-required",
127990
+ children: "*"
127991
+ })
127992
+ ]
127993
+ }),
127994
+ error ? /* @__PURE__ */ jsx(FieldValidationMessage, {
127995
+ id: errorId,
127996
+ className: "er-error",
127997
+ children: error
127998
+ }) : null
127999
+ ]
128000
+ });
128001
+ }
128002
+ function resolveGuestDetailsChangeHandler(requireGuestDetails, ticketsCount, onGuestsChange) {
128003
+ return requireGuestDetails && ticketsCount > 1 && onGuestsChange ? onGuestsChange : null;
128004
+ }
128005
+ function NotesField({ id, onChange, value }) {
128006
+ return /* @__PURE__ */ jsxs("div", {
128007
+ className: "er-field",
128008
+ children: [/* @__PURE__ */ jsx("label", {
128009
+ className: "er-label",
128010
+ htmlFor: id,
128011
+ children: "Notes"
128012
+ }), /* @__PURE__ */ jsx("textarea", {
128013
+ id,
128014
+ value,
128015
+ onChange: (event) => onChange(event.target.value),
128016
+ className: "er-input",
128017
+ placeholder: "Any special requirements or notes (optional)",
128018
+ rows: 3
128019
+ })]
128020
+ });
128021
+ }
127815
128022
  /**
127816
128023
  * Attendee Details Step
127817
128024
  *
127818
128025
  * Collects attendee information: name, email, phone, and notes.
127819
128026
  * Validates required fields and displays errors.
127820
128027
  */
127821
- const AttendeeDetailsStep = ({ formData, onChange, errors, emailLocked = false, onLogout, ticketsCount = 1, requireGuestDetails = false, guests = [], onGuestsChange, guestErrors = {}, guestSectionShake = false, onGuestShakeEnd }) => {
128028
+ const AttendeeDetailsStep = ({ formData, onChange, errors, emailLocked = false, onLogout, ticketsCount = 1, requireGuestDetails = false, guests = [], onGuestsChange, guestErrors = {}, guestSectionShake = false, onGuestShakeEnd, consent }) => {
127822
128029
  const idBase = useId();
127823
128030
  const nameId = `${idBase}-name`;
127824
128031
  const emailId = `${idBase}-email`;
@@ -127834,7 +128041,7 @@ const AttendeeDetailsStep = ({ formData, onChange, errors, emailLocked = false,
127834
128041
  message: errors.email,
127835
128042
  messageId: emailErrorId
127836
128043
  });
127837
- const showGuestSection = requireGuestDetails && ticketsCount > 1 && onGuestsChange;
128044
+ const guestDetailsChangeHandler = resolveGuestDetailsChangeHandler(requireGuestDetails, ticketsCount, onGuestsChange);
127838
128045
  return /* @__PURE__ */ jsxs("div", {
127839
128046
  className: "rb-reg-stack er-stack",
127840
128047
  children: [
@@ -127927,29 +128134,26 @@ const AttendeeDetailsStep = ({ formData, onChange, errors, emailLocked = false,
127927
128134
  placeholder: "(optional)"
127928
128135
  })]
127929
128136
  }),
127930
- /* @__PURE__ */ jsxs("div", {
127931
- className: "er-field",
127932
- children: [/* @__PURE__ */ jsx("label", {
127933
- className: "er-label",
127934
- htmlFor: notesId,
127935
- children: "Notes"
127936
- }), /* @__PURE__ */ jsx("textarea", {
127937
- id: notesId,
127938
- value: formData.notes,
127939
- onChange: (e) => onChange({
127940
- ...formData,
127941
- notes: e.target.value
127942
- }),
127943
- className: "er-input",
127944
- placeholder: "Any special requirements or notes (optional)",
127945
- rows: 3
127946
- })]
127947
- })
128137
+ /* @__PURE__ */ jsx(NotesField, {
128138
+ id: notesId,
128139
+ value: formData.notes,
128140
+ onChange: (notes) => onChange({
128141
+ ...formData,
128142
+ notes
128143
+ })
128144
+ }),
128145
+ consent ? /* @__PURE__ */ jsx(EventConsentField, {
128146
+ consent,
128147
+ error: errors.consentAccepted,
128148
+ formData,
128149
+ idBase,
128150
+ onChange
128151
+ }) : null
127948
128152
  ] }),
127949
- showGuestSection && /* @__PURE__ */ jsx(GuestDetailsSection, {
128153
+ guestDetailsChangeHandler && /* @__PURE__ */ jsx(GuestDetailsSection, {
127950
128154
  guests,
127951
128155
  errors: guestErrors,
127952
- onChange: onGuestsChange,
128156
+ onChange: guestDetailsChangeHandler,
127953
128157
  shake: guestSectionShake,
127954
128158
  onShakeEnd: onGuestShakeEnd
127955
128159
  })
@@ -128721,6 +128925,9 @@ const VerifyingTimeoutStep$1 = ({ onCheckAgain, supportEmail }) => {
128721
128925
  };
128722
128926
  //#endregion
128723
128927
  //#region ../blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizardContent.tsx
128928
+ function getWizardConsent(wizard) {
128929
+ return (wizard.selectedEvent ?? wizard.preSelectedEvent)?.consent ?? null;
128930
+ }
128724
128931
  function EventRegistrationWizardContent(props) {
128725
128932
  const { wizard } = props;
128726
128933
  const showSpamProtection = props.showSpamProtection ?? isSpamProtectionEnabled();
@@ -128800,7 +129007,8 @@ function EventRegistrationWizardContent(props) {
128800
129007
  onGuestsChange: wizard.setGuests,
128801
129008
  guestErrors: wizard.guestErrors,
128802
129009
  guestSectionShake: wizard.guestSectionShake,
128803
- onGuestShakeEnd: wizard.handleGuestShakeEnd
129010
+ onGuestShakeEnd: wizard.handleGuestShakeEnd,
129011
+ consent: getWizardConsent(wizard)
128804
129012
  }),
128805
129013
  showSpamProtection && /* @__PURE__ */ jsx("div", {
128806
129014
  className: "er-altcha",
@@ -129168,11 +129376,21 @@ function EventRegistrationSummaryBar(props) {
129168
129376
  }
129169
129377
  //#endregion
129170
129378
  //#region ../blocks/src/system/runtime/nodes/event-registration/validation.ts
129171
- function validateFormData(formData) {
129379
+ function createInitialRegistrationFormData() {
129380
+ return {
129381
+ name: "",
129382
+ email: "",
129383
+ phone: "",
129384
+ notes: "",
129385
+ consentAccepted: false
129386
+ };
129387
+ }
129388
+ function validateFormData(formData, requiresConsent = false) {
129172
129389
  const errors = {};
129173
129390
  if (!formData.name.trim()) errors.name = "Name is required";
129174
129391
  if (!formData.email.trim()) errors.email = "Email is required";
129175
129392
  else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.email)) errors.email = "Invalid email address";
129393
+ if (requiresConsent && formData.consentAccepted !== true) errors.consentAccepted = "Please read and accept the agreement before continuing.";
129176
129394
  return errors;
129177
129395
  }
129178
129396
  //#endregion
@@ -129991,6 +130209,7 @@ function useEventRegistrationSubmitWithDeps(options, deps) {
129991
130209
  name: options.formData.name.trim(),
129992
130210
  phone: options.formData.phone.trim() || void 0,
129993
130211
  notes: options.formData.notes.trim() || void 0,
130212
+ consentAccepted: options.formData.consentAccepted,
129994
130213
  altchaSolution: options.altchaSolution,
129995
130214
  paymentMethod: method,
129996
130215
  customerPassId: method === "pass" ? passId : void 0,
@@ -130127,12 +130346,7 @@ function useEventRegistrationWizardWithDeps(options, deps) {
130127
130346
  const step = flowState.step;
130128
130347
  const paymentSelection = flowState.paymentSelection;
130129
130348
  const [selectedEvent, setSelectedEvent] = useState(preSelectedEvent ?? null);
130130
- const [formData, setFormData] = useState({
130131
- name: "",
130132
- email: "",
130133
- phone: "",
130134
- notes: ""
130135
- });
130349
+ const [formData, setFormData] = useState(createInitialRegistrationFormData);
130136
130350
  const [errors, setErrors] = useState({});
130137
130351
  const [guests, setGuests] = useState([]);
130138
130352
  const [guestErrors, setGuestErrors] = useState({});
@@ -130430,7 +130644,7 @@ function useEventRegistrationWizardWithDeps(options, deps) {
130430
130644
  guests
130431
130645
  ]);
130432
130646
  const validateForm = () => {
130433
- const newErrors = validateFormData(formData);
130647
+ const newErrors = validateFormData(formData, Boolean(currentEvent?.consent));
130434
130648
  setErrors(newErrors);
130435
130649
  const newGuestErrors = {};
130436
130650
  if (requireGuestDetails && guests.length > 0) {
@@ -130619,6 +130833,10 @@ function useEventRegistrationWizardWithDeps(options, deps) {
130619
130833
  });
130620
130834
  const handleEventSelect = (event) => {
130621
130835
  setSelectedEvent(event);
130836
+ setFormData((current) => ({
130837
+ ...current,
130838
+ consentAccepted: false
130839
+ }));
130622
130840
  const slidingScale = getSlidingScaleForEvent(event);
130623
130841
  setSelectedSlidingAmountInput(slidingScale?.suggestedAmount !== null && slidingScale?.suggestedAmount !== void 0 ? formatCentsAsCurrencyInput$1(slidingScale.suggestedAmount) : "");
130624
130842
  setSelectedAttendanceMode((event.deliveryMode ?? "in_person") === "hybrid" ? null : (event.deliveryMode ?? "in_person") === "online" ? "online" : "in_person");
@@ -131882,6 +132100,7 @@ function validateSubmission(state, setters) {
131882
132100
  message: "Choose an available set of dates to continue."
131883
132101
  };
131884
132102
  const errors = validateFormData$1(state.formData);
132103
+ if (state.selectedRun.consent && state.formData.consentAccepted !== true) errors.consentAccepted = "Please read and accept the agreement before continuing.";
131885
132104
  setters.setErrors(errors);
131886
132105
  if (Object.keys(errors).length > 0) return { kind: "validation-failed" };
131887
132106
  const pricingMessage = getMissingWholeSeriesPricingSelectionMessage(state.pricing);
@@ -131905,6 +132124,7 @@ function registrantPayload(state) {
131905
132124
  name: state.formData.name.trim(),
131906
132125
  phone: state.formData.phone.trim() || void 0,
131907
132126
  formData: { notes: state.formData.notes.trim() || void 0 },
132127
+ consentAccepted: state.formData.consentAccepted,
131908
132128
  altchaSolution: state.altchaSolution,
131909
132129
  claimToken: state.claimToken ?? void 0
131910
132130
  };
@@ -132028,7 +132248,8 @@ const EMPTY_FORM$1 = {
132028
132248
  name: "",
132029
132249
  email: "",
132030
132250
  phone: "",
132031
- notes: ""
132251
+ notes: "",
132252
+ consentAccepted: false
132032
132253
  };
132033
132254
  function useWholeSeriesRegistrationPortal(api) {
132034
132255
  const [formData, setFormData] = useState(EMPTY_FORM$1);
@@ -132566,19 +132787,65 @@ function WholeSeriesSlidingScaleInput({ pricing, value, onChange }) {
132566
132787
  ]
132567
132788
  });
132568
132789
  }
132569
- function EnrollmentForm({ formData, errors, onChange, isEmailLocked, isLoading, onLogout }) {
132570
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(EnrollmentIdentityFields, {
132571
- formData,
132572
- errors,
132573
- onChange,
132574
- isEmailLocked,
132575
- isLoading,
132576
- onLogout
132577
- }), /* @__PURE__ */ jsx(EnrollmentOptionalFields, {
132578
- formData,
132579
- onChange,
132580
- isLoading
132581
- })] });
132790
+ function WholeSeriesConsentField({ consent, error, formData, isLoading, onChange }) {
132791
+ const errorId = "er-whole-series-consent-error";
132792
+ return /* @__PURE__ */ jsxs("div", {
132793
+ className: "er-whole-series-form__field",
132794
+ children: [
132795
+ /* @__PURE__ */ jsx(BookingConsentAgreement, {
132796
+ agreement: consent.agreement,
132797
+ title: consent.title,
132798
+ titleId: "er-whole-series-consent-title"
132799
+ }),
132800
+ /* @__PURE__ */ jsxs("label", {
132801
+ className: "er-whole-series-form__label rb-flex rb-items-start rb-gap-2 rb-cursor-pointer",
132802
+ children: [
132803
+ /* @__PURE__ */ jsx("input", {
132804
+ type: "checkbox",
132805
+ className: "form-checkbox rb-mt-0.5",
132806
+ checked: formData.consentAccepted === true,
132807
+ disabled: isLoading,
132808
+ "aria-describedby": error ? errorId : void 0,
132809
+ onChange: (event) => onChange({
132810
+ ...formData,
132811
+ consentAccepted: event.target.checked
132812
+ })
132813
+ }),
132814
+ consent.checkboxLabel,
132815
+ " *"
132816
+ ]
132817
+ }),
132818
+ error ? /* @__PURE__ */ jsx(FieldValidationMessage, {
132819
+ id: errorId,
132820
+ className: "er-whole-series-form__error",
132821
+ children: error
132822
+ }) : null
132823
+ ]
132824
+ });
132825
+ }
132826
+ function EnrollmentForm({ formData, errors, onChange, isEmailLocked, isLoading, onLogout, consent }) {
132827
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
132828
+ /* @__PURE__ */ jsx(EnrollmentIdentityFields, {
132829
+ formData,
132830
+ errors,
132831
+ onChange,
132832
+ isEmailLocked,
132833
+ isLoading,
132834
+ onLogout
132835
+ }),
132836
+ /* @__PURE__ */ jsx(EnrollmentOptionalFields, {
132837
+ formData,
132838
+ onChange,
132839
+ isLoading
132840
+ }),
132841
+ consent ? /* @__PURE__ */ jsx(WholeSeriesConsentField, {
132842
+ consent,
132843
+ error: errors.consentAccepted,
132844
+ formData,
132845
+ isLoading,
132846
+ onChange
132847
+ }) : null
132848
+ ] });
132582
132849
  }
132583
132850
  function EnrollmentIdentityFields({ formData, errors, onChange, isEmailLocked, isLoading, onLogout }) {
132584
132851
  const nameErrorId = "er-whole-series-name-error";
@@ -132773,7 +133040,8 @@ function RegistrationDetailsForm({ wizard, display }) {
132773
133040
  onChange: wizard.updateFormData,
132774
133041
  isEmailLocked: wizard.portalAuthState === "authenticated" || wizard.waitlistClaim.claim !== null,
132775
133042
  isLoading: wizard.portalAuthState === "checking" || wizard.waitlistClaim.isLoading,
132776
- onLogout: wizard.handleLogout
133043
+ onLogout: wizard.handleLogout,
133044
+ consent: wizard.selectedRun?.consent ?? null
132777
133045
  }),
132778
133046
  /* @__PURE__ */ jsx(PricingFields, { wizard }),
132779
133047
  wizard.showSpamProtection ? /* @__PURE__ */ jsx("div", {
@@ -133349,30 +133617,6 @@ function resolveEmptyMessage(props, wizard) {
133349
133617
  return wizard.scopedRuns.some((run) => !run.status || allowedStatuses.includes(run.status)) ? null : "Booking is not currently available for this run.";
133350
133618
  }
133351
133619
  //#endregion
133352
- //#region ../blocks/src/system/runtime/nodes/event-registration/registrationSurface.ts
133353
- function planEventRegistrationSurface(input) {
133354
- const scopedEvents = resolveEventRegistrationScopedEvents(input.events, {
133355
- occurrenceContext: input.occurrenceContext,
133356
- subject: input.subject
133357
- });
133358
- const bookingScopes = new Set(scopedEvents.map((event) => event.bookingScope));
133359
- if (!input.occurrenceContext && !input.subject && bookingScopes.has("single_occurrence")) return {
133360
- kind: "occurrence",
133361
- events: scopedEvents.filter((event) => event.bookingScope === "single_occurrence")
133362
- };
133363
- if (bookingScopes.size === 0 || bookingScopes.has("single_occurrence")) return bookingScopes.has("whole_series") ? { kind: "mixedBookingScopes" } : {
133364
- kind: "occurrence",
133365
- events: scopedEvents
133366
- };
133367
- const requiredSeriesIds = new Set(scopedEvents.map((event) => event.seriesId));
133368
- const offerings = input.wholeSeriesOfferings.filter((offering) => requiredSeriesIds.has(offering.eventSeriesId));
133369
- const loadedSeriesIds = new Set(offerings.map((offering) => offering.eventSeriesId));
133370
- return [...requiredSeriesIds].every((seriesId) => loadedSeriesIds.has(seriesId)) && offerings.length > 0 ? {
133371
- kind: "wholeSeries",
133372
- offerings
133373
- } : { kind: "unavailableWholeSeries" };
133374
- }
133375
- //#endregion
133376
133620
  //#region ../blocks/src/system/runtime/nodes/event-registration/PastOccurrenceNotice.tsx
133377
133621
  function isPastOccurrence(startsAt) {
133378
133622
  if (!startsAt) return false;
@@ -133426,7 +133670,8 @@ function toEventRegistrationClientProps(props, display) {
133426
133670
  const EventRegistrationClient = (clientProps) => {
133427
133671
  const surface = planEventRegistrationSurface({
133428
133672
  events: clientProps.events ?? [],
133429
- wholeSeriesOfferings: clientProps.wholeSeriesOffering ? [clientProps.wholeSeriesOffering] : clientProps.wholeSeriesOfferings ?? [],
133673
+ wholeSeriesOfferings: clientProps.wholeSeriesOfferings ?? [],
133674
+ wholeSeriesOffering: clientProps.wholeSeriesOffering,
133430
133675
  occurrenceContext: clientProps.occurrenceContext,
133431
133676
  subject: clientProps.subject
133432
133677
  });
@@ -141502,6 +141747,14 @@ const clientComponentRegistry = buildClientRegistryFromEntries(serverComponentRe
141502
141747
  //#endregion
141503
141748
  //#region ../blocks/src/system/types/link.ts
141504
141749
  const nullableString = z.union([z.string().min(1), z.null()]);
141750
+ const RESOLVED_INTERNAL_LINK_ENTITY_TYPES = [
141751
+ "page",
141752
+ "content",
141753
+ "pageSurface"
141754
+ ];
141755
+ function isResolvedInternalLinkEntityType(value) {
141756
+ return typeof value === "string" && RESOLVED_INTERNAL_LINK_ENTITY_TYPES.includes(value);
141757
+ }
141505
141758
  const resolvedInternalLinkKeys = [
141506
141759
  "entityId",
141507
141760
  "entityType",
@@ -141523,7 +141776,7 @@ const internalResolvedLinkSchema = z.object({
141523
141776
  kind: z.literal("internal"),
141524
141777
  routeId: z.string().min(1),
141525
141778
  entityId: z.string().min(1),
141526
- entityType: z.enum(["page", "content"]),
141779
+ entityType: z.enum(RESOLVED_INTERNAL_LINK_ENTITY_TYPES),
141527
141780
  href: z.string().min(1),
141528
141781
  title: z.string().min(1),
141529
141782
  typeLabel: z.string().min(1),
@@ -141557,7 +141810,7 @@ const linkSchema = z.union([
141557
141810
  entryLinkSchema$1
141558
141811
  ]);
141559
141812
  function isInternalResolvedLinkValue(value) {
141560
- return value?.kind === "internal" && "entityId" in value && "entityType" in value && "href" in value && "title" in value && "typeLabel" in value && typeof value.entityId === "string" && typeof value.entityType === "string" && typeof value.href === "string" && typeof value.title === "string" && typeof value.typeLabel === "string";
141813
+ return value?.kind === "internal" && "entityId" in value && "entityType" in value && "href" in value && "title" in value && "typeLabel" in value && typeof value.entityId === "string" && isResolvedInternalLinkEntityType(value.entityType) && typeof value.href === "string" && typeof value.title === "string" && typeof value.typeLabel === "string";
141561
141814
  }
141562
141815
  //#endregion
141563
141816
  //#region ../blocks/src/system/manifest/fieldValidation/writeCanonicalization.ts
@@ -148835,7 +149088,7 @@ const publicRouteCandidatesSchema = z.object({ routes: z.array(z.object({
148835
149088
  entityId: z.string(),
148836
149089
  path: z.string(),
148837
149090
  title: z.string(),
148838
- kind: z.enum(["page", "content"]),
149091
+ kind: z.enum(RESOLVED_INTERNAL_LINK_ENTITY_TYPES),
148839
149092
  contentTypeKey: z.string().nullable().optional()
148840
149093
  })) });
148841
149094
  const groupOverrideFields = [
@@ -154781,8 +155034,8 @@ function generateInputCss({ themeId, theme, inputSystem }) {
154781
155034
  const radioSelector = `${rootSelector} .form-radio`;
154782
155035
  const checkableRules = [];
154783
155036
  checkableRules.push("appearance: none");
154784
- checkableRules.push("width: 1rem");
154785
- checkableRules.push("height: 1rem");
155037
+ checkableRules.push("width: 1.125rem");
155038
+ checkableRules.push("height: 1.125rem");
154786
155039
  checkableRules.push("flex-shrink: 0");
154787
155040
  checkableRules.push(`border: ${borderPx} solid ${rgbColorValue(inputSystem.base.border.colorToken)}`);
154788
155041
  if (inputSystem.base.background.type === "transparent") checkableRules.push("background-color: transparent");
@@ -184546,7 +184799,7 @@ const internalLinkPayloadSchema = z.object({
184546
184799
  kind: z.literal("internal"),
184547
184800
  routeId: z.string().uuid(),
184548
184801
  entityId: z.string().uuid(),
184549
- entityType: z.enum(["page", "content"]),
184802
+ entityType: z.enum(RESOLVED_INTERNAL_LINK_ENTITY_TYPES),
184550
184803
  href: z.string().min(1),
184551
184804
  title: z.string().min(1),
184552
184805
  typeLabel: z.string().min(1),
@@ -186039,17 +186292,25 @@ async function updateRouteMetadata(apiClient, { siteId, routeId, body, options }
186039
186292
  * Falls back to an internal route payload for legacy rows or incomplete data.
186040
186293
  */
186041
186294
  function toRoutableLinkPayload(item) {
186042
- if (item.identifier) {
186043
- if (item.entityType === "page") return {
186044
- kind: "page",
186045
- identifier: item.identifier
186046
- };
186047
- if (item.entityType === "content" && item.contentTypeKey) return {
186048
- kind: "entry",
186049
- contentType: item.contentTypeKey,
186050
- identifier: item.identifier
186051
- };
186295
+ switch (item.entityType) {
186296
+ case "page":
186297
+ if (item.identifier) return {
186298
+ kind: "page",
186299
+ identifier: item.identifier
186300
+ };
186301
+ return toResolvedInternalPayload(item);
186302
+ case "content":
186303
+ if (item.identifier && item.contentTypeKey) return {
186304
+ kind: "entry",
186305
+ contentType: item.contentTypeKey,
186306
+ identifier: item.identifier
186307
+ };
186308
+ return toResolvedInternalPayload(item);
186309
+ case "pageSurface": return toResolvedInternalPayload(item);
186310
+ default: return assertNever$10(item);
186052
186311
  }
186312
+ }
186313
+ function toResolvedInternalPayload(item) {
186053
186314
  return {
186054
186315
  kind: "internal",
186055
186316
  routeId: item.routeId,
@@ -198843,7 +199104,7 @@ function LinkPicker(props) {
198843
199104
  children: [
198844
199105
  /* @__PURE__ */ jsx("p", {
198845
199106
  className: "text-sm text-muted-foreground",
198846
- children: "Select any published or draft page, post, or routed entry for this site."
199107
+ children: "Select any published or draft page, event, post, or routed entry for this site."
198847
199108
  }),
198848
199109
  /* @__PURE__ */ jsx(Input, {
198849
199110
  className: "min-w-0",
@@ -198864,6 +199125,7 @@ function LinkPicker(props) {
198864
199125
  className: cn$2("flex min-w-0 w-full items-center gap-2 px-3 py-2 text-left text-sm transition-colors hover:bg-muted", isSelected && "bg-muted"),
198865
199126
  onClick: () => handleInternalSelect(item),
198866
199127
  disabled,
199128
+ "aria-pressed": isSelected,
198867
199129
  children: [
198868
199130
  /* @__PURE__ */ jsxs("div", {
198869
199131
  className: "min-w-0 flex-1 overflow-hidden",
@@ -215937,6 +216199,7 @@ function normalizeCustomPath(value) {
215937
216199
  return `/${trimmed}`;
215938
216200
  }
215939
216201
  function toInternalLinkAttrs(item) {
216202
+ if (item.entityType === "pageSurface") return toPageSurfaceLinkAttrs(item);
215940
216203
  if (item.identifier) {
215941
216204
  if (item.entityType === "page") return {
215942
216205
  kind: "page",
@@ -215966,6 +216229,20 @@ function toInternalLinkAttrs(item) {
215966
216229
  }
215967
216230
  return null;
215968
216231
  }
216232
+ function toPageSurfaceLinkAttrs(item) {
216233
+ return {
216234
+ kind: "internal",
216235
+ routeId: item.routeId,
216236
+ entityId: item.entityId,
216237
+ entityType: "pageSurface",
216238
+ title: item.title || item.draftTitle || "Untitled",
216239
+ typeLabel: item.typeLabel,
216240
+ href: item.path || "/",
216241
+ contentTypeKey: null,
216242
+ contentTypeName: null,
216243
+ updatedAt: item.updatedAt
216244
+ };
216245
+ }
215969
216246
  function getDisplayTitle(item) {
215970
216247
  return item.title || item.draftTitle || "Untitled";
215971
216248
  }
@@ -216162,6 +216439,12 @@ function LinkPopover({ editor, tone = "dark", initialItems, loadItems }) {
216162
216439
  setExternalUrlValue(href);
216163
216440
  setCustomPathValue("");
216164
216441
  }
216442
+ setSelectedRouteId(null);
216443
+ }, [editor, open]);
216444
+ useEffect(() => {
216445
+ if (!open || selectableItems.length === 0) return;
216446
+ const attrs = editor.getAttributes("link") ?? {};
216447
+ if (normalizeTab(attrs) !== "internal") return;
216165
216448
  setSelectedRouteId(findSelectedRouteId(attrs, selectableItems));
216166
216449
  }, [
216167
216450
  editor,
@@ -216442,12 +216725,18 @@ function shouldShowToolbar(visibility, state) {
216442
216725
  }
216443
216726
  //#endregion
216444
216727
  //#region ../editor/src/primitives/rich-text/RichTextEditorSurface.tsx
216728
+ const BASE_EDITOR_LINK_STYLES = `
216729
+ :where([data-rb-rich-text-editor-content]) a {
216730
+ text-decoration-line: underline;
216731
+ text-underline-offset: 0.14em;
216732
+ }
216733
+ `;
216445
216734
  function shouldHandleRichTextActivationKey(container, target) {
216446
216735
  if (!(target instanceof HTMLElement)) return true;
216447
216736
  if (target === container) return true;
216448
216737
  return !target.closest("[contenteditable=\"true\"], .ProseMirror, input, textarea, select, button, a[href]");
216449
216738
  }
216450
- function RichTextEditorSurface({ editor, config, isEmpty, className, contentClassName, placeholderClassName, placeholderText, ariaLabel, linkItems, onRequestLinkItems, onPickImage, toolbarLayout, onClick, renderContent }) {
216739
+ function RichTextEditorSurface({ editor, config, isEmpty, className, contentClassName, placeholderClassName, placeholderText, ariaLabel, ariaDescribedBy, linkItems, onRequestLinkItems, onPickImage, toolbarLayout, onClick, renderContent }) {
216451
216740
  const editableAriaLabel = ariaLabel ?? placeholderText ?? config.placeholder;
216452
216741
  useEffect(() => {
216453
216742
  if (!editor) return;
@@ -216455,10 +216744,16 @@ function RichTextEditorSurface({ editor, config, isEmpty, className, contentClas
216455
216744
  editableElement.setAttribute("role", "textbox");
216456
216745
  editableElement.setAttribute("aria-multiline", "true");
216457
216746
  editableElement.setAttribute("aria-label", editableAriaLabel);
216747
+ if (ariaDescribedBy) editableElement.setAttribute("aria-describedby", ariaDescribedBy);
216458
216748
  return () => {
216459
216749
  if (editableElement.getAttribute("aria-label") === editableAriaLabel) editableElement.removeAttribute("aria-label");
216750
+ if (editableElement.getAttribute("aria-describedby") === ariaDescribedBy) editableElement.removeAttribute("aria-describedby");
216460
216751
  };
216461
- }, [editableAriaLabel, editor]);
216752
+ }, [
216753
+ ariaDescribedBy,
216754
+ editableAriaLabel,
216755
+ editor
216756
+ ]);
216462
216757
  const interactiveContentProps = onClick ? {
216463
216758
  role: "button",
216464
216759
  tabIndex: 0,
@@ -216471,16 +216766,17 @@ function RichTextEditorSurface({ editor, config, isEmpty, className, contentClas
216471
216766
  "aria-label": editableAriaLabel
216472
216767
  } : void 0;
216473
216768
  const content = /* @__PURE__ */ jsxs("div", {
216474
- className: cn("relative", contentClassName),
216769
+ "data-rb-rich-text-editor-content": true,
216770
+ className: cn("relative grid", contentClassName),
216475
216771
  onClick,
216476
216772
  ...interactiveContentProps,
216477
216773
  children: [isEmpty ? /* @__PURE__ */ jsx("span", {
216478
- className: cn("absolute left-0 right-0 top-0 pointer-events-none text-sm italic text-muted-foreground", placeholderClassName),
216774
+ className: cn("pointer-events-none col-start-1 row-start-1 self-start text-sm italic text-muted-foreground", placeholderClassName),
216479
216775
  "aria-hidden": "true",
216480
216776
  children: placeholderText ?? config.placeholder
216481
216777
  }) : null, /* @__PURE__ */ jsx(EditorContent, {
216482
216778
  editor,
216483
- className: "outline-none w-full"
216779
+ className: "col-start-1 row-start-1 min-w-0 w-full outline-none"
216484
216780
  })]
216485
216781
  });
216486
216782
  const toolbar = toolbarLayout.kind === "hidden" ? null : /* @__PURE__ */ jsx(RichTextToolbar, {
@@ -216495,7 +216791,11 @@ function RichTextEditorSurface({ editor, config, isEmpty, className, contentClas
216495
216791
  });
216496
216792
  return /* @__PURE__ */ jsxs("div", {
216497
216793
  className,
216498
- children: [toolbarLayout.kind === "external" ? toolbarLayout.renderHost(toolbar) : toolbar, renderContent ? renderContent(content) : content]
216794
+ children: [
216795
+ /* @__PURE__ */ jsx("style", { children: BASE_EDITOR_LINK_STYLES }),
216796
+ toolbarLayout.kind === "external" ? toolbarLayout.renderHost(toolbar) : toolbar,
216797
+ renderContent ? renderContent(content) : content
216798
+ ]
216499
216799
  });
216500
216800
  }
216501
216801
  //#endregion
@@ -220254,6 +220554,24 @@ const limitedExtensions = [
220254
220554
  }),
220255
220555
  Placeholder.configure({ placeholder: "Click to start writing…" })
220256
220556
  ];
220557
+ const consentExtensions = [
220558
+ StarterKit.configure({
220559
+ heading: false,
220560
+ blockquote: false,
220561
+ bulletList: false,
220562
+ orderedList: false,
220563
+ listItem: false,
220564
+ code: false,
220565
+ codeBlock: false,
220566
+ strike: false,
220567
+ horizontalRule: false
220568
+ }),
220569
+ RichTextLink.configure({
220570
+ openOnClick: false,
220571
+ HTMLAttributes: { rel: "noreferrer noopener" }
220572
+ }),
220573
+ Placeholder.configure({ placeholder: "Click to start writing…" })
220574
+ ];
220257
220575
  const notesExtensions = [
220258
220576
  StarterKit.configure({
220259
220577
  heading: false,
@@ -220306,6 +220624,16 @@ const richTextConfigs = {
220306
220624
  placeholder: "Click to start writing…",
220307
220625
  pastePolicy: semanticTextOnlyPaste
220308
220626
  },
220627
+ consent: {
220628
+ extensions: consentExtensions,
220629
+ toolbar: [
220630
+ { type: "bold" },
220631
+ { type: "italic" },
220632
+ { type: "link" }
220633
+ ],
220634
+ placeholder: "Click to start writing…",
220635
+ pastePolicy: semanticTextOnlyPaste
220636
+ },
220309
220637
  notes: {
220310
220638
  extensions: notesExtensions,
220311
220639
  toolbar: [
@@ -228845,4 +229173,4 @@ function useSiteChromeCustomizeOptional() {
228845
229173
  return useContext(SiteChromeCustomizeContext);
228846
229174
  }
228847
229175
  //#endregion
228848
- export { FooterComposerPanel as $, LoaderCircle as $a, SelectValue as $i, richTextFragment as $n, parseGeneratedIconAssetId as $r, createSnapshotFromPageRecord as $t, markApplySaved as A, cn$2 as Aa, VARIANT_ROLES as Ai, getResponsiveScopeSpec as An, gradientToCss as Ar, useEditor$1 as At, resetTypographyToSaved as B, Undo2 as Ba, hasEmptyOption as Bi, resolveEntryRouteTarget as Bn, backgroundAppearanceColorTokenNames as Br, useEditorUiStoreInstance as Bt, applyTypographyDraftPatch as C, DropdownMenuItem as Ca, buttonStyleSelectionKey as Ci, useMediaEditorOptional as Cn, curatedSiteStyles as Cr, MediaField as Ct, dismissWarnings as D, Primitive as Da, pageDesignEditorBackgroundOverrideOwner as Di, containerResponsiveThemeCss as Dn, findFooterLook as Dr, RichTextField as Dt, deriveStyleConfiguratorCapabilities as E, DropdownMenuTrigger as Ea, isThemeV2NormalEditorRawStyleFieldName as Ei, ThemeScope as En, surfaceResolutionContextFromTheme as Er, useRichTextImagePicker as Et, previewCuratedPalette as F, expectParsedBrandedId as Fa, BlockApiProvider as Fi, getDefaultComponentRegistry as Fn, curatedPalettes as Fr, prepareBlockEditorManifest as Ft, beginAutosaveBatch as G, SlidersHorizontal as Ga, useField as Gi, SITE_CHROME_VISIBLE_HEADER_SELECTOR as Gn, bindingSchema as Gr, pushHistoryEntry as Gt, styleConfiguratorHistoryEntryForPersistedSelection as H, Tablet as Ha, mapOptionValueForSelect as Hi, resolveRouteTarget as Hn, parseBackgroundAppearanceColorToken as Hr, canRedoHistory as Ht, previewFooterLook as I, parseMediaAssetId as Ia, getFieldIntent as Ii, LINKED_CONTENT_ENTRY_META_KEY as In, defaultSectionTransitionVariantForFamily as Ir, stripTopLevelRoutingUi as It, enqueueTransaction as J, Pencil as Ja, TooltipTrigger as Ji, visibleHeaderClearancePx as Jn, EDITABLE_SURFACE_FORWARDING_PROP as Jr, unsafeAsLinkedContentEntryId as Jt, confirmAutosaveBatch as K, RotateCcw as Ka, Tooltip as Ki, SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR as Kn, eventCalendarListLayoutCompatibleDisplayModeValues as Kr, redoHistory as Kt, previewHeaderLayout as L, parseSiteId as La, isHeaderField as Li, coerceLinkedContentEntriesPayload as Ln, sectionTransitionFamilies as Lr, getBlockManifestFromSdkConfig as Lt, openRow as M, unsafeAsEditorBlockId as Ma, paletteColorEntries as Mi, createCustomBlockRegistry as Mn, GRADIENT_PRESET_IDS as Mr, LinkWidgetProvider as Mt, palettePreviewProjection as N, unsafeAsEditorBlockValues as Na, paletteColorsSchema as Ni, makeDefaultBlockComponent as Nn, getGradientPreset as Nr, BlockEditor as Nt, isPreviewingChange as O, Button$1 as Oa, asDesignBlockId as Oi, buildThemeRuntime as On, getHeaderLayout as Or, RichTextWidgetProvider as Ot, previewButtonStyle as P, assertNever$10 as Pa, ORDINARY_TEXT_MIN_CONTRAST_RATIO as Pi, readBlockComposition as Pn, parseGradientPresetId as Pr, hideThemeV2RawStyleFields as Pt, resolvePreviewSidebarTab as Q, Maximize2 as Qa, SelectTrigger as Qi, ImageResolveContextProvider as Qn, parseBlockIconValue as Qr, createRoutingHelpers as Qt, previewHeaderStyle as R, X as Ra, SdkConfigProvider as Ri, getLinkedContentEntryMeta as Rn, sectionTransitionFamilyForBoundaryOptionId as Rr, classifyHistoryShortcut as Rt, applyResolvedSelections as S, DropdownMenuContent as Sa, updateButtonStyleSelectionChoice as Si, MediaEditorContextProvider as Sn, componentRuntimeRulesForTheme as Sr, FileField as St, createStyleConfiguratorState as T, DropdownMenuSeparator as Ta, parseThemeForPersistence as Ti, isSupportedLoaderEndpoint as Tn, getCuratedSiteStyle as Tr, ReferenceWidgetProvider as Tt, syncStyleConfiguratorState as U, Sparkles as Ua, unmapValueFromSelect as Ui, getBlockDefinition as Un, defaultThemeTokens as Ur, canUndoHistory as Ut, setPaletteColors as V, TriangleAlert as Va, mapCurrentValueForSelect as Vi, resolvePageRouteTarget as Vn, backgroundAppearanceQuickColorTokenNames as Vr, useOptionalEditorUiStoreInstance as Vt, toggleRow as W, Smartphone as Wa, FieldFrame as Wi, projectRecurringSchedule as Wn, ctaButton as Wr, createHistoryState as Wt, rejectAutosaveBatch as X, Palette as Xa, SelectContent as Xi, createManifestValidator as Xn, parseBackgroundContent as Xr, useMultiAutosave as Xt, idleEditorTransactionQueueState as Y, PenLine as Ya, Select$1 as Yi, resolveVariantKey as Yn, planSiteChromePlacement as Yr, recordsEqual as Yt, createOptimisticActionRunner as Z, Monitor as Za, SelectItem as Zi, clientComponentRegistry as Zn, runTransforms as Zr, useDebouncedLatestSave as Zt, PREVIEW_DESIGN_SAVE_ERROR_MESSAGE as _, Collapsible as _a, buttonStyleHoverPreferenceValue as _i, listEntryPageContentSlots as _n, applyCompiledRuntimeFieldsToContent as _r, IconPickerField as _t, previewDesignHistoryDomainForCommand as a, PopoverTrigger as aa, inlineTextToPlainText as ai, resolveContentTitle as an, ChevronLeft as ao, singleButtonFragment as ar, useUISelector as at, cycleSiteChromeSelectionId as b, Surface as ba, resolveButtonStyleSelection as bi, deriveLaunchReadiness as bn, retargetCompiledRuntimeFieldsForContentAdjacency as br, ButtonVariantField as bt, selectionSnapshotFromApplySiteStyleSelectionResponse as c, TabsContent as ca, RichText as ci, ManifestForm as cn, __exportAll as co, testimonialsCarouselFragment as cr, useEntryController as ct, resolveStyleConfiguratorInitialSnapshot as d, Dialog as da, resolveImageUrlWithContext as di, FormRenderer as dn, heroCtaRowFragment as dr, createSiteOptionWidgetAdapters as dt, Callout as ea, parseGeneratedIconSetId as ei, BUILT_IN_REFERENCE_KINDS as en, Image as eo, headingFragment as er, renderSiteChromeBlock as et, PreviewDesignCoordinatorProvider as f, DialogContent as fa, setContextResolveImageUrlContext as fi, evaluateVisibility as fn, ctaRowFragment as fr, SiteOptionPickerField as ft, PREVIEW_DESIGN_LOAD_ERROR_MESSAGE as g, DialogTitle as ga, siblingPath$1 as gi, getPageDesignEditorState as gn, formatSiteChromeBackgroundTokenLabel as gr, InlineTextField as gt, usePreviewThemeOverlay as h, DialogHeader as ha, getAtPath as hi, applyPageDesignEditorAction as hn, defineFragment as hr, OfferingsPreviewWidgetProvider as ht, usePreviewDesignHistoryOrder as i, PopoverContent as ia, coerceInlineTextWithFallback as ii, resolvePageRouteSlug as in, ChevronRight as io, blogFeaturedPostFragment as ir, ContentFieldsForm as it, markApplySaving as j, parseFooterModuleId as ja, textColorStyle as ji, escapeStyleContent as jn, GRADIENT_PRESETS as jr, LinkField as jt, markApplyFailed as k, cva as ka, assertNever$7 as ki, DEFAULT_THEME_RESPONSIVE_MODE as kn, getHeaderStyle as kr, EditorProvider as kt, deriveSiteStylePreviewUpdate as l, TabsList as la, buildResolveImageUrlContext as li, createManifestFormAdapter as ln, testimonialsHeadingFragment as lr, useEntryEditorController as lt, PreviewThemeOverlayProvider as m, DialogFooter as ma, attachRenderableMediaAssetFields as mi, MediaEditor as mn, bodyCopyFragment as mr, OfferingsPreviewGroupOrderField as mt, useSiteChromeCustomizeOptional as n, SearchInput as na, isObjectRecord$1 as ni, parseReferenceKind as nn, Eye as no, faqAccordionFragment as nr, PreviewInlineTextEditor as nt, selectPreviewDesignHistoryDomain as o, Input as oa, isInlineTextEmpty as oi, PaletteProvider as on, ChevronDown as oo, formEmbedFragment as or, EditableBlockProvider as ot, usePreviewDesignCoordinator as p, DialogDescription as pa, SECTION_BACKGROUND_MIN_SOURCE_WIDTH as pi, createStoreBackend as pn, heroCopyFragment as pr, SiteOptionWidgetProvider as pt, deriveTransactionCapabilities as q, Redo2 as qa, TooltipContent as qi, planSiteOverlayHeaderClearance as qn, eventCalendarListLayoutOptions as qr, undoHistory as qt, PreviewDesignHistoryOrderProvider as r, Popover as ra, isRecord$16 as ri, deriveRouteMetadataPresentation as rn, EllipsisVertical as ro, faqHeadingFragment as rr, PreviewTextEditor as rt, buildApplySiteStyleSelectionBody as s, Tabs as sa, Text$2 as si, usePalette as sn, Check as so, formCopyFragment as sr, EntryControllerProvider as st, SiteChromeCustomizeProvider as t, CalloutDescription as ta, renderInlineText as ti, isAdapterReferenceKind as tn, GripVertical as to, cardFragment as tr, PreviewRichTextEditor as tt, planSiteStylePreviewChange as u, TabsTrigger as ua, getCurrentResolveImageUrlContext as ui, createManifestValidation as un, ctaCopyFragment as ur, createSiteOptionApiLoader as ut, reportPreviewDesignError as v, CollapsibleContent as va, buttonStyleSelectionParameterValue as vi, decodePublicProductCategorySelectorQuery as vn, compileEditorModelRuntime as vr, EntryPickerField as vt, cancelPreview as w, DropdownMenuLabel as wa, themeButtonClassName as wi, useApiMediaUploader as wn, designRuntimeRulesForTheme as wr, ReferenceField as wt, planSiteChromeSelection as x, DropdownMenu as xa, updateButtonStyleHoverPreference as xi, AMBIENT_BACKGROUND_ROLES as xn, planPageDesignLayoutLookCompatibility as xr, ButtonWidgetProvider as xt, buildSiteChromeSelectionModels as y, CollapsibleTrigger as ya, findButtonStyleRecipe as yi, DEFAULT_LAUNCH_READINESS_INPUT as yn, retargetCompiledBoundaryRuntimeForContentAdjacency as yr, EntryPickerWidgetProvider as yt, previewSiteStyle as z, Upload as za, useSdkConfig as zi, defaultTransforms as zn, sectionTransitionVariantForBoundaryOptionId as zr, useEditorUiStore as zt };
229176
+ export { FooterComposerPanel as $, Maximize2 as $a, SelectTrigger as $i, richTextFragment as $n, parseBlockIconValue as $r, createSnapshotFromPageRecord as $t, markApplySaved as A, cva as Aa, assertNever$7 as Ai, getResponsiveScopeSpec as An, gradientToCss as Ar, useEditor$1 as At, resetTypographyToSaved as B, Upload as Ba, useSdkConfig as Bi, resolveEntryRouteTarget as Bn, backgroundAppearanceColorTokenNames as Br, useEditorUiStoreInstance as Bt, applyTypographyDraftPatch as C, DropdownMenuContent as Ca, updateButtonStyleSelectionChoice as Ci, useMediaEditorOptional as Cn, curatedSiteStyles as Cr, MediaField as Ct, dismissWarnings as D, DropdownMenuTrigger as Da, isThemeV2NormalEditorRawStyleFieldName as Di, containerResponsiveThemeCss as Dn, findFooterLook as Dr, RichTextField as Dt, deriveStyleConfiguratorCapabilities as E, DropdownMenuSeparator as Ea, parseThemeForPersistence as Ei, ThemeScope as En, surfaceResolutionContextFromTheme as Er, useRichTextImagePicker as Et, previewCuratedPalette as F, assertNever$10 as Fa, ORDINARY_TEXT_MIN_CONTRAST_RATIO as Fi, getDefaultComponentRegistry as Fn, curatedPalettes as Fr, prepareBlockEditorManifest as Ft, beginAutosaveBatch as G, Smartphone as Ga, FieldFrame as Gi, SITE_CHROME_VISIBLE_HEADER_SELECTOR as Gn, bindingSchema as Gr, pushHistoryEntry as Gt, styleConfiguratorHistoryEntryForPersistedSelection as H, TriangleAlert as Ha, mapCurrentValueForSelect as Hi, resolveRouteTarget as Hn, parseBackgroundAppearanceColorToken as Hr, canRedoHistory as Ht, previewFooterLook as I, expectParsedBrandedId as Ia, BlockApiProvider as Ii, LINKED_CONTENT_ENTRY_META_KEY as In, defaultSectionTransitionVariantForFamily as Ir, stripTopLevelRoutingUi as It, enqueueTransaction as J, Redo2 as Ja, TooltipContent as Ji, visibleHeaderClearancePx as Jn, bookingConsentCarrierSchema as Jr, unsafeAsLinkedContentEntryId as Jt, confirmAutosaveBatch as K, SlidersHorizontal as Ka, useField as Ki, SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR as Kn, eventCalendarListLayoutCompatibleDisplayModeValues as Kr, redoHistory as Kt, previewHeaderLayout as L, parseMediaAssetId as La, getFieldIntent as Li, coerceLinkedContentEntriesPayload as Ln, sectionTransitionFamilies as Lr, getBlockManifestFromSdkConfig as Lt, openRow as M, parseFooterModuleId as Ma, textColorStyle as Mi, createCustomBlockRegistry as Mn, GRADIENT_PRESET_IDS as Mr, LinkWidgetProvider as Mt, palettePreviewProjection as N, unsafeAsEditorBlockId as Na, paletteColorEntries as Ni, makeDefaultBlockComponent as Nn, getGradientPreset as Nr, BlockEditor as Nt, isPreviewingChange as O, Primitive as Oa, pageDesignEditorBackgroundOverrideOwner as Oi, buildThemeRuntime as On, getHeaderLayout as Or, RichTextWidgetProvider as Ot, previewButtonStyle as P, unsafeAsEditorBlockValues as Pa, paletteColorsSchema as Pi, readBlockComposition as Pn, parseGradientPresetId as Pr, hideThemeV2RawStyleFields as Pt, resolvePreviewSidebarTab as Q, Monitor as Qa, SelectItem as Qi, ImageResolveContextProvider as Qn, runTransforms as Qr, createRoutingHelpers as Qt, previewHeaderStyle as R, parseSiteId as Ra, isHeaderField as Ri, getLinkedContentEntryMeta as Rn, sectionTransitionFamilyForBoundaryOptionId as Rr, classifyHistoryShortcut as Rt, applyResolvedSelections as S, DropdownMenu as Sa, updateButtonStyleHoverPreference as Si, MediaEditorContextProvider as Sn, componentRuntimeRulesForTheme as Sr, FileField as St, createStyleConfiguratorState as T, DropdownMenuLabel as Ta, themeButtonClassName as Ti, isSupportedLoaderEndpoint as Tn, getCuratedSiteStyle as Tr, ReferenceWidgetProvider as Tt, syncStyleConfiguratorState as U, Tablet as Ua, mapOptionValueForSelect as Ui, getBlockDefinition as Un, defaultThemeTokens as Ur, canUndoHistory as Ut, setPaletteColors as V, Undo2 as Va, hasEmptyOption as Vi, resolvePageRouteTarget as Vn, backgroundAppearanceQuickColorTokenNames as Vr, useOptionalEditorUiStoreInstance as Vt, toggleRow as W, Sparkles as Wa, unmapValueFromSelect as Wi, projectRecurringSchedule as Wn, ctaButton as Wr, createHistoryState as Wt, rejectAutosaveBatch as X, PenLine as Xa, Select$1 as Xi, createManifestValidator as Xn, planSiteChromePlacement as Xr, useMultiAutosave as Xt, idleEditorTransactionQueueState as Y, Pencil as Ya, TooltipTrigger as Yi, resolveVariantKey as Yn, EDITABLE_SURFACE_FORWARDING_PROP as Yr, recordsEqual as Yt, createOptimisticActionRunner as Z, Palette as Za, SelectContent as Zi, clientComponentRegistry as Zn, parseBackgroundContent as Zr, useDebouncedLatestSave as Zt, PREVIEW_DESIGN_SAVE_ERROR_MESSAGE as _, DialogTitle as _a, siblingPath$1 as _i, listEntryPageContentSlots as _n, applyCompiledRuntimeFieldsToContent as _r, IconPickerField as _t, previewDesignHistoryDomainForCommand as a, PopoverContent as aa, coerceInlineTextWithFallback as ai, resolveContentTitle as an, ChevronRight as ao, singleButtonFragment as ar, useUISelector as at, cycleSiteChromeSelectionId as b, CollapsibleTrigger as ba, findButtonStyleRecipe as bi, deriveLaunchReadiness as bn, retargetCompiledRuntimeFieldsForContentAdjacency as br, ButtonVariantField as bt, selectionSnapshotFromApplySiteStyleSelectionResponse as c, Tabs as ca, Text$2 as ci, ManifestForm as cn, Check as co, testimonialsCarouselFragment as cr, useEntryController as ct, resolveStyleConfiguratorInitialSnapshot as d, TabsTrigger as da, getCurrentResolveImageUrlContext as di, FormRenderer as dn, heroCtaRowFragment as dr, createSiteOptionWidgetAdapters as dt, SelectValue as ea, parseGeneratedIconAssetId as ei, BUILT_IN_REFERENCE_KINDS as en, LoaderCircle as eo, headingFragment as er, renderSiteChromeBlock as et, PreviewDesignCoordinatorProvider as f, Dialog as fa, resolveImageUrlWithContext as fi, evaluateVisibility as fn, ctaRowFragment as fr, SiteOptionPickerField as ft, PREVIEW_DESIGN_LOAD_ERROR_MESSAGE as g, DialogHeader as ga, getAtPath as gi, getPageDesignEditorState as gn, formatSiteChromeBackgroundTokenLabel as gr, InlineTextField as gt, usePreviewThemeOverlay as h, DialogFooter as ha, attachRenderableMediaAssetFields as hi, applyPageDesignEditorAction as hn, defineFragment as hr, OfferingsPreviewWidgetProvider as ht, usePreviewDesignHistoryOrder as i, Popover as ia, isRecord$16 as ii, resolvePageRouteSlug as in, EllipsisVertical as io, blogFeaturedPostFragment as ir, ContentFieldsForm as it, markApplySaving as j, cn$2 as ja, VARIANT_ROLES as ji, escapeStyleContent as jn, GRADIENT_PRESETS as jr, LinkField as jt, markApplyFailed as k, Button$1 as ka, asDesignBlockId as ki, DEFAULT_THEME_RESPONSIVE_MODE as kn, getHeaderStyle as kr, EditorProvider as kt, deriveSiteStylePreviewUpdate as l, TabsContent as la, RichText as li, createManifestFormAdapter as ln, __exportAll as lo, testimonialsHeadingFragment as lr, useEntryEditorController as lt, PreviewThemeOverlayProvider as m, DialogDescription as ma, SECTION_BACKGROUND_MIN_SOURCE_WIDTH as mi, MediaEditor as mn, bodyCopyFragment as mr, OfferingsPreviewGroupOrderField as mt, useSiteChromeCustomizeOptional as n, CalloutDescription as na, renderInlineText as ni, parseReferenceKind as nn, GripVertical as no, faqAccordionFragment as nr, PreviewInlineTextEditor as nt, selectPreviewDesignHistoryDomain as o, PopoverTrigger as oa, inlineTextToPlainText as oi, PaletteProvider as on, ChevronLeft as oo, formEmbedFragment as or, EditableBlockProvider as ot, usePreviewDesignCoordinator as p, DialogContent as pa, setContextResolveImageUrlContext as pi, createStoreBackend as pn, heroCopyFragment as pr, SiteOptionWidgetProvider as pt, deriveTransactionCapabilities as q, RotateCcw as qa, Tooltip as qi, planSiteOverlayHeaderClearance as qn, eventCalendarListLayoutOptions as qr, undoHistory as qt, PreviewDesignHistoryOrderProvider as r, SearchInput as ra, isObjectRecord$1 as ri, deriveRouteMetadataPresentation as rn, Eye as ro, faqHeadingFragment as rr, PreviewTextEditor as rt, buildApplySiteStyleSelectionBody as s, Input as sa, isInlineTextEmpty as si, usePalette as sn, ChevronDown as so, formCopyFragment as sr, EntryControllerProvider as st, SiteChromeCustomizeProvider as t, Callout as ta, parseGeneratedIconSetId as ti, isAdapterReferenceKind as tn, Image as to, cardFragment as tr, PreviewRichTextEditor as tt, planSiteStylePreviewChange as u, TabsList as ua, buildResolveImageUrlContext as ui, createManifestValidation as un, ctaCopyFragment as ur, createSiteOptionApiLoader as ut, reportPreviewDesignError as v, Collapsible as va, buttonStyleHoverPreferenceValue as vi, decodePublicProductCategorySelectorQuery as vn, compileEditorModelRuntime as vr, EntryPickerField as vt, cancelPreview as w, DropdownMenuItem as wa, buttonStyleSelectionKey as wi, useApiMediaUploader as wn, designRuntimeRulesForTheme as wr, ReferenceField as wt, planSiteChromeSelection as x, Surface as xa, resolveButtonStyleSelection as xi, AMBIENT_BACKGROUND_ROLES as xn, planPageDesignLayoutLookCompatibility as xr, ButtonWidgetProvider as xt, buildSiteChromeSelectionModels as y, CollapsibleContent as ya, buttonStyleSelectionParameterValue as yi, DEFAULT_LAUNCH_READINESS_INPUT as yn, retargetCompiledBoundaryRuntimeForContentAdjacency as yr, EntryPickerWidgetProvider as yt, previewSiteStyle as z, X as za, SdkConfigProvider as zi, defaultTransforms as zn, sectionTransitionVariantForBoundaryOptionId as zr, useEditorUiStore as zt };