@riverbankcms/sdk 0.139.0 → 0.140.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 (196) hide show
  1. package/README.md +1 -1
  2. package/dist/{PreviewEditorSidebar-BDeenhi3.mjs → PreviewEditorSidebar-CUyTzd5z.mjs} +4 -4
  3. package/dist/{PreviewEditorUI-DSRhgjF5.mjs → PreviewEditorUI-Agkw4v5i.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-D2K8GLUG.mjs → PreviewQueryProvider-CN0ewic5.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-CL7wSnYu.mjs → SdkPreviewModeRuntime-DdbeAdS8.mjs} +22 -8
  6. package/dist/{SiteChromeCustomizeContext-BhDn-5ir.mjs → SiteChromeCustomizeContext-CqGOz-Kv.mjs} +2053 -1110
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +165 -165
  8. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +212 -212
  9. package/dist/_dts/api/src/accessAdmin.d.ts +74 -104
  10. package/dist/_dts/api/src/aiEndpoints.d.ts +5 -1
  11. package/dist/_dts/api/src/authSubmission.d.ts +46 -0
  12. package/dist/_dts/api/src/billing.d.ts +8 -4
  13. package/dist/_dts/api/src/billingEndpointDefinitions.d.ts +23 -0
  14. package/dist/_dts/api/src/billingEndpointTypes.d.ts +26 -0
  15. package/dist/_dts/api/src/blocks.d.ts +2 -0
  16. package/dist/_dts/api/src/bookingRecords.d.ts +1 -2
  17. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +8 -1
  18. package/dist/_dts/api/src/communications.d.ts +0 -1
  19. package/dist/_dts/api/src/contentRuntime.d.ts +8 -3
  20. package/dist/_dts/api/src/endpoints.d.ts +93 -64
  21. package/dist/_dts/api/src/event-destination-policy.d.ts +2 -1
  22. package/dist/_dts/api/src/footerSettings.d.ts +9 -6
  23. package/dist/_dts/api/src/index.d.ts +5 -6
  24. package/dist/_dts/api/src/indexCoreTypes.d.ts +1 -1
  25. package/dist/_dts/api/src/indexExtendedTypes.d.ts +1 -1
  26. package/dist/_dts/api/src/mailingListIntegration.d.ts +8 -2
  27. package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +1 -1
  28. package/dist/_dts/api/src/navigation/types.d.ts +1 -1
  29. package/dist/_dts/api/src/onboarding/confirmationResend.d.ts +25 -0
  30. package/dist/_dts/api/src/onboarding/surfaceData.d.ts +32 -32
  31. package/dist/_dts/api/src/publicBookingAvailabilityEndpointDefinitions.d.ts +8 -0
  32. package/dist/_dts/api/src/publicExperience/commerceEndpoints.d.ts +1 -0
  33. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +11 -3
  34. package/dist/_dts/api/src/publicExperience/sharedTypes.d.ts +3 -29
  35. package/dist/_dts/api/src/publicOnboardingAttemptEndpointDefinitions.d.ts +65 -0
  36. package/dist/_dts/api/src/saveOutcome.d.ts +20 -0
  37. package/dist/_dts/api/src/sdkContracts.d.ts +3 -22
  38. package/dist/_dts/api/src/sdkPushContracts.d.ts +18 -0
  39. package/dist/_dts/api/src/sdkThemeWire.d.ts +44 -44
  40. package/dist/_dts/api/src/settings/permissions.d.ts +12 -0
  41. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +9 -5
  42. package/dist/_dts/api/src/siteOnboarding.d.ts +2 -9
  43. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +2 -4
  44. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +3 -1
  45. package/dist/_dts/api/src/siteSettings.d.ts +20 -7
  46. package/dist/_dts/api/src/types.d.ts +77 -77
  47. package/dist/_dts/api/src/wholeSeriesRuns.d.ts +2 -37
  48. package/dist/_dts/billing/src/membership/index.d.ts +3 -0
  49. package/dist/_dts/billing/src/plans/types.d.ts +3 -0
  50. package/dist/_dts/billing/src/site-arrangements.d.ts +14 -3
  51. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +16 -4
  52. package/dist/_dts/blocks/src/pageRenderAdmission.d.ts +2 -0
  53. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +5 -0
  54. package/dist/_dts/blocks/src/portal/types.d.ts +2 -4
  55. package/dist/_dts/blocks/src/portal/waitlist-types.d.ts +35 -0
  56. package/dist/_dts/blocks/src/system/blocks/event-registration.d.ts +2 -0
  57. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +42 -0
  58. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +4 -0
  59. package/dist/_dts/blocks/src/system/data/index.d.ts +2 -2
  60. package/dist/_dts/blocks/src/system/data/prefetchBlockData.d.ts +2 -1
  61. package/dist/_dts/blocks/src/system/data/types.d.ts +9 -0
  62. package/dist/_dts/blocks/src/system/registry.d.ts +1 -0
  63. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +0 -28
  64. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
  65. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +7 -3
  66. package/dist/_dts/blocks/src/system/runtime/api/types/portal.d.ts +1 -1
  67. package/dist/_dts/blocks/src/system/runtime/api/types/waitlist-claims.d.ts +7 -2
  68. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +30 -6
  69. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +15 -3
  70. package/dist/_dts/blocks/src/system/runtime/nodes/appointment-services.d.ts +43 -0
  71. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationSurface.d.ts +1 -2
  72. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/TicketSelectionStep.d.ts +2 -0
  73. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/checkoutRecovery.d.ts +14 -0
  74. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.d.ts +56 -0
  75. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +6 -8
  76. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useCheckoutRecovery.d.ts +8 -0
  77. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +8 -7
  78. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +10 -2
  79. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventSourceRecovery.d.ts +18 -0
  80. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.client.d.ts +1 -1
  81. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +24 -6
  82. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +4 -2
  83. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.interactive.d.ts +6 -0
  84. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.types.d.ts +1 -0
  85. package/dist/_dts/blocks/src/system/runtime/resolver.d.ts +1 -0
  86. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +2 -6
  87. package/dist/_dts/blocks/src/system/runtime/shared/index.d.ts +2 -2
  88. package/dist/_dts/blocks/src/system/runtime/shared/useWaitlistClaim.d.ts +2 -0
  89. package/dist/_dts/commerce/src/purchase/event-registration-errors.d.ts +4 -0
  90. package/dist/_dts/commerce/src/purchase/orderItemMetadata.d.ts +27 -4
  91. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +2 -1
  92. package/dist/_dts/content-editor/src/hooks/useBlockAutosave.d.ts +3 -1
  93. package/dist/_dts/content-editor/src/useFooterComposerState.d.ts +3 -0
  94. package/dist/_dts/core/src/branded.d.ts +0 -8
  95. package/dist/_dts/core/src/index.d.ts +1 -0
  96. package/dist/_dts/core/src/mailing-list-setup-parser.d.ts +1 -1
  97. package/dist/_dts/core/src/mailing-list-setup.d.ts +14 -1
  98. package/dist/_dts/core/src/mailing-list-submission.d.ts +7 -27
  99. package/dist/_dts/core/src/participants.d.ts +2 -29
  100. package/dist/_dts/core/src/public-experience.d.ts +4 -0
  101. package/dist/_dts/core/src/public-profile.d.ts +27 -1
  102. package/dist/_dts/core/src/site-route-target.d.ts +9 -2
  103. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +293 -606
  104. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/MailingListGlobalSettingsSummary.d.ts +10 -0
  105. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/MailingListTargetingField.d.ts +3 -2
  106. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/context.d.ts +3 -2
  107. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/loaders.d.ts +3 -2
  108. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/targetingState.d.ts +19 -0
  109. package/dist/_dts/sdk/src/public-api/contracts.d.ts +14 -20
  110. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -0
  111. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +2 -0
  112. package/dist/_dts/sdk/src/rendering/helpers/pageRuntimeSupport.d.ts +7 -1
  113. package/dist/_dts/sdk/src/rendering/helpers/templateContent.d.ts +1 -0
  114. package/dist/_dts/sdk/src/version.d.ts +1 -1
  115. package/dist/_dts/theme-core/src/accordions/types.d.ts +3 -3
  116. package/dist/_dts/theme-core/src/cards/types.d.ts +21 -21
  117. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  118. package/dist/_dts/theme-core/src/header/interactionPalette.d.ts +8 -2
  119. package/dist/_dts/theme-core/src/header/legacyHeaderVariant.d.ts +2 -2
  120. package/dist/_dts/theme-core/src/inputs/types.d.ts +2 -2
  121. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +54 -54
  122. package/dist/_dts/theme-core/src/runtime/buildThemeRuntimeFromBridge.d.ts +1 -4
  123. package/dist/_dts/theme-core/src/schema.d.ts +84 -84
  124. package/dist/_dts/theme-core/src/shared/componentStyles.d.ts +1 -1
  125. package/dist/_dts/theme-core/src/site-styles/backgroundAppearance.d.ts +2 -2
  126. package/dist/_dts/theme-core/src/surfaces/foregroundInteraction.d.ts +77 -0
  127. package/dist/_dts/theme-core/src/surfaces/index.d.ts +1 -0
  128. package/dist/_dts/theme-core/src/typography/generateTypographyCss.d.ts +2 -2
  129. package/dist/_dts/ui/src/lib/use-delayed-flag.d.ts +9 -0
  130. package/dist/_dts/ui/src/pending-button.d.ts +10 -0
  131. package/dist/client/{BookingConsentAgreement-CZvTDtsK.mjs → BookingConsentAgreement-CuKa82V4.mjs} +4 -4
  132. package/dist/client/{DiscountCodeDisclosure-D-DsLCMU.mjs → DiscountCodeDisclosure-BbYieKWB.mjs} +1 -1
  133. package/dist/client/{EventCombined.client-dWqgd5ZO.mjs → EventCombined.client-LTfR1Aby.mjs} +6 -6
  134. package/dist/client/{EventListing.client-BMRa9IYp.mjs → EventListing.client-DUHpYSuo.mjs} +2 -2
  135. package/dist/client/{LeafletStaticMap-D21W9kBZ.mjs → LeafletStaticMap-CHRupL6m.mjs} +1 -1
  136. package/dist/client/{accordion-FxF_ta47.mjs → accordion-6HiIFxNL.mjs} +1 -1
  137. package/dist/client/{bookingForm-YnwW4TGw.mjs → bookingForm-Dlmid43H.mjs} +7 -7
  138. package/dist/client/bookings.mjs +325 -140
  139. package/dist/client/{carousel-vng7fFT5.mjs → carousel-DmkZRRq_.mjs} +2 -2
  140. package/dist/client/{carousel.client-59G_WMr4.mjs → carousel.client-DQTjCVQT.mjs} +1 -1
  141. package/dist/client/{cart-DEPDsjNk.mjs → cart-CIC24330.mjs} +3 -3
  142. package/dist/client/{checkout-CZRWu9rW.mjs → checkout-D1Zw9imo.mjs} +3 -3
  143. package/dist/client/{checkoutUrls-BuseL0dw.mjs → checkoutUrls-FL6lRkrt.mjs} +1 -1
  144. package/dist/client/client.mjs +1717 -882
  145. package/dist/client/{colorStyles-CrxJrPjJ.mjs → colorStyles-3013aRAY.mjs} +3 -1
  146. package/dist/client/{context-DvU_WUmd.mjs → context-Cy1OayHx.mjs} +6 -19
  147. package/dist/client/{dates-wnPMiRl5.mjs → dates-aDcfoLHr.mjs} +2 -2
  148. package/dist/client/{eventCalendar-BA3Q5L15.mjs → eventCalendar-FQxMPAjf.mjs} +8 -8
  149. package/dist/client/{eventCombined-51wgR-1R.mjs → eventCombined-Dr3ac6Hb.mjs} +3 -3
  150. package/dist/client/{eventDetails-modaetpm.mjs → eventDetails-D-AzUHFQ.mjs} +4 -4
  151. package/dist/client/{eventListing-D8t2J3Kv.mjs → eventListing-B3XxBf3i.mjs} +3 -3
  152. package/dist/client/{eventRegistration-CYqtkCE_.mjs → eventRegistration-I6EaokFD.mjs} +500 -152
  153. package/dist/client/{form-CBKXN5In.mjs → form-BbWckVWY.mjs} +3 -3
  154. package/dist/client/{headerSection-DylDqNrs.mjs → headerSection-C9qU4Y7x.mjs} +2 -2
  155. package/dist/client/hooks.mjs +445 -180
  156. package/dist/client/{locationMap-CvWrG0vZ.mjs → locationMap-CLCShvlG.mjs} +3 -3
  157. package/dist/client/{media-BOHuueS5.mjs → media-DHpfFwd3.mjs} +1 -1
  158. package/dist/client/{newsletterForm-Btwk70zw.mjs → newsletterForm-Briukxzi.mjs} +130 -87
  159. package/dist/client/{pricing-Uzw-GQ6Y.mjs → pricing-Copadu-2.mjs} +1 -1
  160. package/dist/client/{productDetail-JLcUYKnd.mjs → productDetail-oujlRd-r.mjs} +3 -3
  161. package/dist/client/{productList-FM0cbUzj.mjs → productList-BRiIRUcd.mjs} +3 -3
  162. package/dist/client/{propsDecoder-DYzafZb2.mjs → propsDecoder-CB2KS_ko.mjs} +130 -24
  163. package/dist/client/rendering/client.mjs +911 -400
  164. package/dist/client/rendering/islands.mjs +19 -19
  165. package/dist/client/rendering.mjs +1696 -818
  166. package/dist/client/{scrollToBlock-CvXszexS.mjs → scrollToBlock-B1IS1_ua.mjs} +1 -1
  167. package/dist/client/{shop-BIcjvy5a.mjs → shop-Vn6yNFED.mjs} +6 -6
  168. package/dist/client/{shop-commerce-BZQsy7xw.mjs → shop-commerce-BVTqipYp.mjs} +7 -7
  169. package/dist/client/{shop-commerce-store-D5V7XAb5.mjs → shop-commerce-store-BVnJVy7v.mjs} +1 -1
  170. package/dist/client/{shopShared-DowkXevB.mjs → shopShared-COIeK77T.mjs} +4 -4
  171. package/dist/client/{useEventFilters-oMoTw_JE.mjs → useEventFilters-DzIUcS9n.mjs} +7 -7
  172. package/dist/preview-next/before-render.mjs +119 -64
  173. package/dist/preview-next/client/runtime.mjs +4 -4
  174. package/dist/preview-next/keepAlive.mjs +119 -64
  175. package/dist/preview-next/middleware.mjs +119 -64
  176. package/dist/{previewAuthStore-COUyAKaX.mjs → previewAuthStore-Gjb6r6vz.mjs} +119 -64
  177. package/dist/{sdk-runtime-D4k2LSGF.mjs → sdk-runtime-CnCLvZRv.mjs} +2 -2
  178. package/dist/{separator-UGtpag4Z.mjs → separator-DKDRJ1oH.mjs} +1 -1
  179. package/dist/server/components.mjs +787 -323
  180. package/dist/server/config-validation.mjs +328 -79
  181. package/dist/server/config.mjs +332 -83
  182. package/dist/server/data.mjs +441 -180
  183. package/dist/server/index.mjs +126 -66
  184. package/dist/server/next.mjs +1031 -595
  185. package/dist/server/page-converter.mjs +183 -74
  186. package/dist/server/prebuild.mjs +1 -1
  187. package/dist/server/rendering/server.mjs +1068 -592
  188. package/dist/server/rendering.mjs +802 -324
  189. package/dist/server/routing.mjs +506 -214
  190. package/dist/server/server.mjs +468 -244
  191. package/dist/server/theme-bridge.mjs +433 -100
  192. package/dist/server/theme.mjs +8 -2
  193. package/dist/styles/index.css +237 -43
  194. package/package.json +1 -1
  195. package/dist/_dts/blocks/src/system/runtime/shared/components/BookingOptionCompactRow.d.ts +0 -29
  196. package/dist/_dts/blocks/src/system/runtime/shared/components/BookingOptionList.d.ts +0 -13
@@ -1,7 +1,7 @@
1
- import { i as textColorStyle } from "./colorStyles-CrxJrPjJ.mjs";
2
- import { t as defineIslandPropsDecoder, ut as themeButtonClassName } from "./propsDecoder-DYzafZb2.mjs";
1
+ import { i as textColorStyle } from "./colorStyles-3013aRAY.mjs";
2
+ import { dt as themeButtonClassName, t as defineIslandPropsDecoder } from "./propsDecoder-CB2KS_ko.mjs";
3
3
  import { t as mountReactIsland } from "./reactMount-SY8AVRof.mjs";
4
- import { t as LeafletStaticMap } from "./LeafletStaticMap-D21W9kBZ.mjs";
4
+ import { t as LeafletStaticMap } from "./LeafletStaticMap-CHRupL6m.mjs";
5
5
  import "react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  //#region ../core/src/location.ts
@@ -1,4 +1,4 @@
1
- import { C as unsafeAsStorageBucketName, D as clsx, E as ok$1, T as err, f as isExplicitRectCrop, i as textColorStyle, m as resolveMediaTransformForAspect, n as mergeStyles, p as parseAspectRatioValue, t as backgroundColorStyle, w as unsafeAsStoragePath, x as unsafeAsMediaAssetId } from "./colorStyles-CrxJrPjJ.mjs";
1
+ import { D as ok$1, E as err, O as clsx, S as unsafeAsMediaAssetId, T as unsafeAsStoragePath, f as isExplicitRectCrop, i as textColorStyle, m as resolveMediaTransformForAspect, n as mergeStyles, p as parseAspectRatioValue, t as backgroundColorStyle, w as unsafeAsStorageBucketName } from "./colorStyles-3013aRAY.mjs";
2
2
  import "react";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  //#region ../media-core/src/fileSafety.ts
@@ -1,13 +1,13 @@
1
1
  "use client";
2
- import { D as clsx } from "./colorStyles-CrxJrPjJ.mjs";
3
- import { Ht as parseMailingListVisitorSelection, Nt as assertNever, pn as assertNever$1, t as defineIslandPropsDecoder, ut as themeButtonClassName } from "./propsDecoder-DYzafZb2.mjs";
4
- import { n as useBlockApi, t as BlockApiProvider } from "./context-DvU_WUmd.mjs";
2
+ import { O as clsx } from "./colorStyles-3013aRAY.mjs";
3
+ import { Pt as assertNever, Ut as parseMailingListVisitorSelection, dt as themeButtonClassName, mn as assertNever$1, t as defineIslandPropsDecoder } from "./propsDecoder-CB2KS_ko.mjs";
4
+ import { n as useBlockApi, r as BlockApiError, t as BlockApiProvider } from "./context-Cy1OayHx.mjs";
5
5
  import { n as isSpamProtectionEnabled, r as AltchaWidget, t as getChallengeUrl } from "./src-B833rYRr.mjs";
6
6
  import { t as FeedbackMessage } from "./FeedbackMessage-CtLvvS_d.mjs";
7
7
  import { n as getFieldValidationControlProps, t as FieldValidationMessage } from "./FieldValidationMessage-AYanWFb-.mjs";
8
8
  import { t as mountReactIsland } from "./reactMount-SY8AVRof.mjs";
9
- import { useReducer, useState } from "react";
10
- import { jsx, jsxs } from "react/jsx-runtime";
9
+ import { useEffect, useReducer, useRef, useState } from "react";
10
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
11
  //#region ../blocks/src/system/runtime/nodes/newsletter-form.client.state.ts
12
12
  const initialNewsletterFormSubmissionState = { tag: "idle" };
13
13
  function newsletterFormSubmissionReducer(state, action) {
@@ -108,6 +108,11 @@ function NewsletterFormClient({ render }) {
108
108
  const api = useBlockApi();
109
109
  const [submissionState, dispatchSubmission] = useReducer(newsletterFormSubmissionReducer, initialNewsletterFormSubmissionState);
110
110
  const [altchaSolution, setAltchaSolution] = useState(null);
111
+ const successRef = useRef(null);
112
+ const succeeded = isNewsletterFormSuccess(submissionState);
113
+ useEffect(() => {
114
+ if (succeeded) successRef.current?.focus();
115
+ }, [succeeded]);
111
116
  const showSpamProtection = render.hydration.spamProtectionEnabled ?? isSpamProtectionEnabled();
112
117
  const fields = render.display.fields;
113
118
  const handleSubmit = async (e) => {
@@ -147,7 +152,7 @@ function NewsletterFormClient({ render }) {
147
152
  if (render.hydration.setupRevision === null || render.display.availability === "unavailable") {
148
153
  dispatchSubmission({
149
154
  type: "failed",
150
- error: newsletterFormError("Mailing-list signup is not available right now.")
155
+ error: newsletterFormError(SIGNUPS_PAUSED_MESSAGE)
151
156
  });
152
157
  return;
153
158
  }
@@ -155,7 +160,7 @@ function NewsletterFormClient({ render }) {
155
160
  if (visitorSelection === null) {
156
161
  dispatchSubmission({
157
162
  type: "failed",
158
- error: newsletterFormError("Choose at least one email topic.")
163
+ error: newsletterFieldError(TOPIC_CHOICE_FIELD_ID, "Choose at least one email topic.")
159
164
  });
160
165
  return;
161
166
  }
@@ -187,71 +192,27 @@ function NewsletterFormClient({ render }) {
187
192
  } catch (err) {
188
193
  dispatchSubmission({
189
194
  type: "failed",
190
- error: newsletterFormError(err instanceof Error ? err.message : "Subscription failed. Please try again.")
195
+ error: newsletterFormError(transportFailureMessage(err))
191
196
  });
192
197
  }
193
198
  };
194
- const renderField = (field) => {
195
- const inputId = `newsletter_${field.id}`;
196
- const fieldError = getNewsletterSubmissionFieldError(submissionState, field.id);
197
- const fieldErrorId = `${inputId}-error`;
198
- const validationProps = getFieldValidationControlProps({
199
- message: fieldError,
200
- messageId: fieldErrorId
201
- });
202
- return /* @__PURE__ */ jsxs("div", {
203
- className: "fb-field newsletter-field",
204
- children: [
205
- /* @__PURE__ */ jsxs("label", {
206
- htmlFor: inputId,
207
- className: "form-label",
208
- children: [field.label, field.required && /* @__PURE__ */ jsx("span", {
209
- className: "newsletter-required",
210
- "aria-hidden": "true",
211
- children: "*"
212
- })]
213
- }),
214
- /* @__PURE__ */ jsx("input", {
215
- id: inputId,
216
- name: field.id,
217
- type: field.type,
218
- required: field.required,
219
- placeholder: field.placeholder,
220
- className: "form-input",
221
- autoComplete: field.type === "email" ? "email" : void 0,
222
- disabled: isNewsletterFormSubmitting(submissionState),
223
- ...validationProps
224
- }),
225
- fieldError && /* @__PURE__ */ jsx(FieldValidationMessage, {
226
- id: fieldErrorId,
227
- className: "fb-error",
228
- children: fieldError
229
- })
230
- ]
231
- }, field.id);
232
- };
199
+ const submitting = isNewsletterFormSubmitting(submissionState);
233
200
  const formError = getNewsletterSubmissionFormError(submissionState);
234
- if (isNewsletterFormSuccess(submissionState)) {
235
- const outcome = getNewsletterSuccessOutcome(submissionState);
236
- return /* @__PURE__ */ jsx("div", {
237
- className: clsx("newsletter-form", "newsletter-success", render.display.className ?? void 0),
238
- children: /* @__PURE__ */ jsx(FeedbackMessage, {
239
- tone: "success",
240
- className: "fb-success",
241
- role: "status",
242
- children: outcome === "confirmation_required" ? "Please check your inbox to confirm your signup." : "Thanks — you’re on the list."
243
- })
244
- });
245
- }
201
+ if (succeeded) return /* @__PURE__ */ jsx("div", {
202
+ ref: successRef,
203
+ tabIndex: -1,
204
+ className: clsx("newsletter-form", "newsletter-success", render.display.className ?? void 0),
205
+ children: /* @__PURE__ */ jsx(FeedbackMessage, {
206
+ tone: "success",
207
+ className: "fb-success",
208
+ role: "status",
209
+ children: getNewsletterSuccessOutcome(submissionState) === "confirmation_required" ? "Please check your inbox to confirm your signup." : render.display.successMessage
210
+ })
211
+ });
246
212
  if (render.display.availability === "unavailable") return /* @__PURE__ */ jsx(UnavailableNewsletterForm, { className: render.display.className });
247
- return /* @__PURE__ */ jsxs("div", {
213
+ return /* @__PURE__ */ jsx("div", {
248
214
  className: clsx("newsletter-form", render.display.className ?? void 0),
249
- children: [formError && /* @__PURE__ */ jsx(FeedbackMessage, {
250
- tone: "error",
251
- className: "fb-error",
252
- role: "alert",
253
- children: formError
254
- }), /* @__PURE__ */ jsxs("form", {
215
+ children: /* @__PURE__ */ jsxs("form", {
255
216
  onSubmit: handleSubmit,
256
217
  className: "fb-form",
257
218
  children: [
@@ -266,18 +227,15 @@ function NewsletterFormClient({ render }) {
266
227
  /* @__PURE__ */ jsxs("div", {
267
228
  className: "newsletter-form-fields",
268
229
  children: [
269
- fields.map(renderField),
270
- render.hydration.choicePresentation === "visitor_choice" ? /* @__PURE__ */ jsxs("fieldset", {
271
- className: "newsletter-topics",
272
- children: [/* @__PURE__ */ jsx("legend", { children: "What would you like to hear about?" }), render.display.choices.map((choice) => /* @__PURE__ */ jsxs("label", {
273
- className: "newsletter-topic-choice",
274
- children: [/* @__PURE__ */ jsx("input", {
275
- type: "checkbox",
276
- name: "mailingListChoice",
277
- value: choice.id,
278
- disabled: isNewsletterFormSubmitting(submissionState)
279
- }), choice.label]
280
- }, choice.id))]
230
+ fields.map((field) => /* @__PURE__ */ jsx(NewsletterField, {
231
+ field,
232
+ submitting,
233
+ error: getNewsletterSubmissionFieldError(submissionState, field.id)
234
+ }, field.id)),
235
+ render.hydration.choicePresentation === "visitor_choice" ? /* @__PURE__ */ jsx(NewsletterTopicChoices, {
236
+ choices: render.display.choices,
237
+ submitting,
238
+ error: getNewsletterSubmissionFieldError(submissionState, TOPIC_CHOICE_FIELD_ID)
281
239
  }) : null,
282
240
  showSpamProtection && /* @__PURE__ */ jsx("div", {
283
241
  className: "newsletter-altcha",
@@ -286,6 +244,12 @@ function NewsletterFormClient({ render }) {
286
244
  onSolutionChange: setAltchaSolution
287
245
  })
288
246
  }),
247
+ formError && /* @__PURE__ */ jsx(FeedbackMessage, {
248
+ tone: "error",
249
+ className: "fb-error",
250
+ role: "alert",
251
+ children: formError
252
+ }),
289
253
  /* @__PURE__ */ jsx("div", {
290
254
  className: "newsletter-submit",
291
255
  children: /* @__PURE__ */ jsx("button", {
@@ -294,8 +258,8 @@ function NewsletterFormClient({ render }) {
294
258
  variant: render.display.buttonVariant,
295
259
  size: "md"
296
260
  }),
297
- disabled: isNewsletterFormSubmitting(submissionState),
298
- children: isNewsletterFormSubmitting(submissionState) ? "Subscribing..." : render.display.buttonLabel
261
+ disabled: submitting,
262
+ children: submitting ? "Subscribing..." : render.display.buttonLabel
299
263
  })
300
264
  })
301
265
  ]
@@ -305,9 +269,70 @@ function NewsletterFormClient({ render }) {
305
269
  children: render.display.privacyNote
306
270
  })
307
271
  ]
308
- })]
272
+ })
273
+ });
274
+ }
275
+ function NewsletterField({ field, submitting, error }) {
276
+ const inputId = `newsletter_${field.id}`;
277
+ const errorId = `${inputId}-error`;
278
+ return /* @__PURE__ */ jsxs("div", {
279
+ className: "fb-field newsletter-field",
280
+ children: [
281
+ /* @__PURE__ */ jsxs("label", {
282
+ htmlFor: inputId,
283
+ className: "form-label",
284
+ children: [field.label, field.required && /* @__PURE__ */ jsx("span", {
285
+ className: "newsletter-required",
286
+ "aria-hidden": "true",
287
+ children: "*"
288
+ })]
289
+ }),
290
+ /* @__PURE__ */ jsx("input", {
291
+ id: inputId,
292
+ name: field.id,
293
+ type: field.type,
294
+ required: field.required,
295
+ placeholder: field.placeholder,
296
+ className: "form-input",
297
+ autoComplete: field.type === "email" ? "email" : void 0,
298
+ disabled: submitting,
299
+ ...getFieldValidationControlProps({
300
+ message: error,
301
+ messageId: errorId
302
+ })
303
+ }),
304
+ error && /* @__PURE__ */ jsx(FieldValidationMessage, {
305
+ id: errorId,
306
+ className: "fb-error",
307
+ children: error
308
+ })
309
+ ]
309
310
  });
310
311
  }
312
+ function NewsletterTopicChoices({ choices, submitting, error }) {
313
+ const errorId = `newsletter_${TOPIC_CHOICE_FIELD_ID}-error`;
314
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("fieldset", {
315
+ className: "fb-fieldset newsletter-topics",
316
+ "aria-describedby": error ? errorId : void 0,
317
+ children: [/* @__PURE__ */ jsx("legend", {
318
+ className: "form-label",
319
+ children: "What would you like to hear about?"
320
+ }), choices.map((choice) => /* @__PURE__ */ jsxs("label", {
321
+ className: "fb-inline form-label newsletter-topic-choice",
322
+ children: [/* @__PURE__ */ jsx("input", {
323
+ type: "checkbox",
324
+ name: TOPIC_CHOICE_FIELD_ID,
325
+ value: choice.id,
326
+ className: "form-checkbox",
327
+ disabled: submitting
328
+ }), /* @__PURE__ */ jsx("span", { children: choice.label })]
329
+ }, choice.id))]
330
+ }), error && /* @__PURE__ */ jsx(FieldValidationMessage, {
331
+ id: errorId,
332
+ className: "fb-error",
333
+ children: error
334
+ })] });
335
+ }
311
336
  function UnavailableNewsletterForm({ className }) {
312
337
  return /* @__PURE__ */ jsx("div", {
313
338
  className: clsx("newsletter-form", className ?? void 0),
@@ -315,13 +340,32 @@ function UnavailableNewsletterForm({ className }) {
315
340
  tone: "error",
316
341
  className: "fb-error",
317
342
  role: "status",
318
- children: "Mailing-list signup is not available right now."
343
+ children: SIGNUPS_PAUSED_MESSAGE
319
344
  })
320
345
  });
321
346
  }
347
+ const TOPIC_CHOICE_FIELD_ID = "mailingListChoice";
348
+ /** The site's setup is broken or missing: nothing the visitor does will help. */
349
+ const SIGNUPS_PAUSED_MESSAGE = "We can’t accept signups right now. Please try again later.";
350
+ /** The provider did not answer in time or at all: worth another go shortly. */
351
+ const RETRY_SHORTLY_MESSAGE = "We couldn’t confirm your signup. Please try again in a little while.";
352
+ const TOO_MANY_ATTEMPTS_MESSAGE = "There have been too many signup attempts. Please wait a moment and try again.";
353
+ /**
354
+ * Vetted copy for a request that never produced a signup response. The raw
355
+ * error text ("Failed to fetch", "received invalid JSON") is for logs, not
356
+ * visitors.
357
+ */
358
+ function transportFailureMessage(err) {
359
+ if (err instanceof BlockApiError) {
360
+ if (err.status === 429) return TOO_MANY_ATTEMPTS_MESSAGE;
361
+ if (err.status === 403) return "We couldn’t verify this submission. Please try again.";
362
+ if (err.status === 400 || err.status === 422) return "Please check your details and try again.";
363
+ }
364
+ return RETRY_SHORTLY_MESSAGE;
365
+ }
322
366
  function readVisitorSelection(formData, hydration) {
323
367
  if (hydration.choicePresentation !== "visitor_choice") return void 0;
324
- const ids = formData.getAll("mailingListChoice").flatMap((value) => typeof value === "string" ? [value] : []);
368
+ const ids = formData.getAll(TOPIC_CHOICE_FIELD_ID).flatMap((value) => typeof value === "string" ? [value] : []);
325
369
  if (ids.length === 0) return null;
326
370
  const raw = hydration.choiceProvider === "native" ? {
327
371
  provider: "native",
@@ -343,11 +387,10 @@ function publicSignupError(outcome) {
343
387
  case "unavailable": switch (outcome.reason) {
344
388
  case "configuration_unavailable":
345
389
  case "authentication_failed":
346
- case "target_unavailable": return "Mailing-list signup is not available right now.";
390
+ case "target_unavailable": return SIGNUPS_PAUSED_MESSAGE;
347
391
  case "stale_configuration": return "This signup form has changed. Refresh the page, then try again.";
348
- case "subscriber_suppressed": return "This address cannot be added. Please contact the site if you would like help.";
349
- case "rate_limited": return "There have been too many signup attempts. Please wait a moment and try again.";
350
- case "temporarily_unavailable": return "We could not sign you up just now. Please try again shortly.";
392
+ case "rate_limited": return TOO_MANY_ATTEMPTS_MESSAGE;
393
+ case "temporarily_unavailable": return RETRY_SHORTLY_MESSAGE;
351
394
  }
352
395
  case "uncertain": return "We could not confirm whether your signup completed. Please wait a moment, then try again.";
353
396
  }
@@ -1,4 +1,4 @@
1
- import { in as formatEventPricing, rn as formatBookingPriceDisplay, sn as publicEventPricingDisplay } from "./propsDecoder-DYzafZb2.mjs";
1
+ import { an as formatEventPricing, cn as publicEventPricingDisplay, in as formatBookingPriceDisplay } from "./propsDecoder-CB2KS_ko.mjs";
2
2
  //#region ../blocks/src/system/runtime/nodes/events/domain/capacity.ts
3
3
  /**
4
4
  * Compute remaining spots for an event from `availableSpots` with a fallback
@@ -1,6 +1,6 @@
1
- import { t as defineIslandPropsDecoder } from "./propsDecoder-DYzafZb2.mjs";
2
- import { r as ProductDetailController } from "./shop-commerce-BZQsy7xw.mjs";
3
- import { t as mountShopBlockIsland } from "./shopShared-DowkXevB.mjs";
1
+ import { t as defineIslandPropsDecoder } from "./propsDecoder-CB2KS_ko.mjs";
2
+ import { r as ProductDetailController } from "./shop-commerce-BVTqipYp.mjs";
3
+ import { t as mountShopBlockIsland } from "./shopShared-COIeK77T.mjs";
4
4
  import "react";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region ../blocks/src/system/runtime/nodes/product-detail.client.tsx
@@ -1,6 +1,6 @@
1
- import { t as defineIslandPropsDecoder } from "./propsDecoder-DYzafZb2.mjs";
2
- import { i as ProductListController } from "./shop-commerce-BZQsy7xw.mjs";
3
- import { t as mountShopBlockIsland } from "./shopShared-DowkXevB.mjs";
1
+ import { t as defineIslandPropsDecoder } from "./propsDecoder-CB2KS_ko.mjs";
2
+ import { i as ProductListController } from "./shop-commerce-BVTqipYp.mjs";
3
+ import { t as mountShopBlockIsland } from "./shopShared-COIeK77T.mjs";
4
4
  import "react";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region ../blocks/src/system/runtime/nodes/product-list.client.tsx