@riverbankcms/sdk 0.145.0 → 0.146.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 +17 -0
  2. package/dist/{PreviewEditorSidebar-O-V6Pl5a.mjs → PreviewEditorSidebar-kg2r2Fyi.mjs} +4 -4
  3. package/dist/{PreviewEditorUI-1UlX_9cw.mjs → PreviewEditorUI-sWMLp5dT.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-BxGwdOCV.mjs → PreviewQueryProvider-Cg51xq1w.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-DYbA_4iv.mjs → SdkPreviewModeRuntime-h2ti3Hch.mjs} +280 -182
  6. package/dist/{SiteChromeCustomizeContext-CNTKQ9nx.mjs → SiteChromeCustomizeContext-DEACFH9m.mjs} +1330 -734
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +924 -0
  8. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +84 -0
  9. package/dist/_dts/api/src/bookingConfig.d.ts +8 -1
  10. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +8 -14
  11. package/dist/_dts/api/src/bookingManagementEventEndpointTypes.d.ts +45 -1
  12. package/dist/_dts/api/src/clientErrorReporting.d.ts +50 -0
  13. package/dist/_dts/api/src/communications.d.ts +20 -4
  14. package/dist/_dts/api/src/contentRuntime.d.ts +3 -7
  15. package/dist/_dts/api/src/endpoints.d.ts +223 -88
  16. package/dist/_dts/api/src/event-visibility.d.ts +20 -0
  17. package/dist/_dts/api/src/eventManagementContracts.d.ts +56 -3
  18. package/dist/_dts/api/src/eventManagementEndpointDefinitions.d.ts +24 -0
  19. package/dist/_dts/api/src/eventPageWords.d.ts +19 -0
  20. package/dist/_dts/api/src/eventSeriesRegistrationEndpointDefinitions.d.ts +14 -0
  21. package/dist/_dts/api/src/index.d.ts +7 -1
  22. package/dist/_dts/api/src/indexCoreTypes.d.ts +1 -1
  23. package/dist/_dts/api/src/indexExtendedTypes.d.ts +1 -1
  24. package/dist/_dts/api/src/launchReadiness.d.ts +20 -2
  25. package/dist/_dts/api/src/launchRequirementPriority.d.ts +3 -0
  26. package/dist/_dts/api/src/newsletterCampaignCommandEndpoints.d.ts +13 -0
  27. package/dist/_dts/api/src/newsletterEndpointDefinitions.d.ts +42 -0
  28. package/dist/_dts/api/src/occurrenceScheduling.d.ts +10 -0
  29. package/dist/_dts/api/src/pageSurfaceEndpoints.d.ts +44 -0
  30. package/dist/_dts/api/src/participantMessaging.d.ts +11 -1
  31. package/dist/_dts/api/src/sdk-event-upsert.d.ts +40 -1
  32. package/dist/_dts/api/src/sdkContracts.d.ts +3 -42
  33. package/dist/_dts/api/src/sdkCourseBooking.d.ts +30 -0
  34. package/dist/_dts/api/src/sdkEventEndpointDefinitions.d.ts +76 -0
  35. package/dist/_dts/api/src/sdkEventLifecycle.d.ts +37 -0
  36. package/dist/_dts/api/src/sdkManagedEventContracts.d.ts +18 -0
  37. package/dist/_dts/api/src/sdkPageDesign.d.ts +388 -0
  38. package/dist/_dts/api/src/sdkPageDesignEndpointDefinitions.d.ts +22 -0
  39. package/dist/_dts/api/src/sdkPullEventContracts.d.ts +46 -0
  40. package/dist/_dts/api/src/siteAddressEndpoints.d.ts +29 -0
  41. package/dist/_dts/api/src/siteManagementEndpointDefinitions.d.ts +49 -0
  42. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +2 -32
  43. package/dist/_dts/api/src/siteOnboarding.d.ts +75 -9
  44. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +1 -1
  45. package/dist/_dts/api/src/types.d.ts +7 -1
  46. package/dist/_dts/api/src/wholeSeriesRuns.d.ts +14 -0
  47. package/dist/_dts/blocks/src/index.d.ts +2 -0
  48. package/dist/_dts/blocks/src/pageRenderAdmission.d.ts +10 -0
  49. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +3 -1
  50. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +27 -5
  51. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +14 -1
  52. package/dist/_dts/blocks/src/system/icons/social.d.ts +1 -1
  53. package/dist/_dts/blocks/src/system/registry.d.ts +1 -1
  54. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.d.ts +1 -0
  55. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +20 -4
  56. package/dist/_dts/blocks/src/system/runtime/nodes/form.fields.d.ts +5 -0
  57. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.block-submission.d.ts +36 -0
  58. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.client.d.ts +1 -1
  59. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.interactive.d.ts +6 -1
  60. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.parts.d.ts +46 -0
  61. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.types.d.ts +2 -1
  62. package/dist/_dts/blocks/src/system/runtime/resolver.d.ts +2 -1
  63. package/dist/_dts/blocks/src/system/runtime/shared/components/CheckboxChoice.d.ts +18 -0
  64. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +1 -0
  65. package/dist/_dts/content-editor/src/index.d.ts +1 -0
  66. package/dist/_dts/content-editor/src/primitives/previewEditableOutline.d.ts +2 -0
  67. package/dist/_dts/content-editor/src/ui/editorBlockEquality.d.ts +3 -0
  68. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +3 -5
  69. package/dist/_dts/core/src/block-content-identity.d.ts +5 -0
  70. package/dist/_dts/core/src/editor-state.d.ts +2 -7
  71. package/dist/_dts/core/src/index.d.ts +1 -0
  72. package/dist/_dts/core/src/mailing-list-submission.d.ts +3 -1
  73. package/dist/_dts/core/src/public-event-booking-availability.d.ts +20 -1
  74. package/dist/_dts/core/src/public-profile.d.ts +3 -1
  75. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +49 -2
  76. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +3 -0
  77. package/dist/_dts/editor-blocks/src/block-editor/EmptyState.d.ts +13 -1
  78. package/dist/_dts/editor-blocks/src/block-editor/types.d.ts +2 -8
  79. package/dist/_dts/editor-blocks/src/index.d.ts +1 -0
  80. package/dist/_dts/preview-next/src/client/blocks/composer/types.d.ts +3 -4
  81. package/dist/_dts/preview-next/src/client/preview/PreviewEntryControllerProvider.d.ts +1 -2
  82. package/dist/_dts/sdk/src/next/renderSdkContent.d.ts +0 -1
  83. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -2
  84. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +2 -2
  85. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +6 -1
  86. package/dist/_dts/sdk/src/rendering/helpers/loadPage.d.ts +5 -2
  87. package/dist/_dts/sdk/src/rendering/helpers/pageRuntimeSupport.d.ts +6 -1
  88. package/dist/_dts/sdk/src/rendering/helpers/templateContent.d.ts +2 -0
  89. package/dist/_dts/sdk/src/rendering/hooks/useContent.d.ts +5 -1
  90. package/dist/_dts/sdk/src/rendering/hooks/usePage.d.ts +5 -1
  91. package/dist/_dts/sdk/src/version.d.ts +1 -1
  92. package/dist/_dts/surfaces/src/index.d.ts +9 -0
  93. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  94. package/dist/_dts/theme-core/src/inputs/checkable.d.ts +42 -0
  95. package/dist/_dts/theme-core/src/inputs/inputGroup.d.ts +19 -0
  96. package/dist/_dts/ui/src/navigation-tabs.d.ts +2 -1
  97. package/dist/client/{BookingConsentAgreement-DlVOmpW4.mjs → BookingConsentAgreement-BQKL045f.mjs} +2 -2
  98. package/dist/client/CheckboxChoice--W2n6yKs.mjs +24 -0
  99. package/dist/client/{DiscountCodeDisclosure-T9q623PQ.mjs → DiscountCodeDisclosure-CsOtjFY7.mjs} +1 -1
  100. package/dist/client/{EventCombined.client-DnsUeONl.mjs → EventCombined.client-BdRjVbhH.mjs} +6 -6
  101. package/dist/client/{EventListing.client-CNBFqJS4.mjs → EventListing.client-DBxC6xOU.mjs} +2 -2
  102. package/dist/client/{LeafletStaticMap-C7higg52.mjs → LeafletStaticMap-mHEJKrTs.mjs} +1 -1
  103. package/dist/client/{ThemedButton-LAJTNrS8.mjs → ThemedButton-CE5KYT6z.mjs} +1 -1
  104. package/dist/client/{accordion-BcNF9TjX.mjs → accordion-BEQNSptH.mjs} +1 -1
  105. package/dist/client/{bookingForm-BUaQ3S03.mjs → bookingForm-AMr-s5vw.mjs} +33 -52
  106. package/dist/client/bookings.mjs +48 -46
  107. package/dist/client/{carousel-CTdF6e0V.mjs → carousel-Bbt_QgJy.mjs} +1 -1
  108. package/dist/client/{cart-pGtyf_XU.mjs → cart-CnWi30zJ.mjs} +3 -3
  109. package/dist/client/{checkout-Da9WSn7Y.mjs → checkout-f3nkWgd4.mjs} +3 -3
  110. package/dist/client/client.mjs +1611 -815
  111. package/dist/client/{context-BFeY_Wbm.mjs → context-Bc8T6pCe.mjs} +1 -1
  112. package/dist/client/{dates-BhwVSxDg.mjs → dates-DUsCEzLb.mjs} +2 -3
  113. package/dist/client/{eventCalendar-BAtdnR4s.mjs → eventCalendar-CKwgXui5.mjs} +9 -9
  114. package/dist/client/{eventCombined-RksA3tRC.mjs → eventCombined-CBAOSTGR.mjs} +4 -4
  115. package/dist/client/{eventDetails-BB9hB4wR.mjs → eventDetails-Dh-_WiBD.mjs} +4 -4
  116. package/dist/client/{eventListing-BpJBkviM.mjs → eventListing-CA3frIH5.mjs} +4 -4
  117. package/dist/client/{eventRegistration-B18jFq_o.mjs → eventRegistration-BHtsgdcg.mjs} +21 -22
  118. package/dist/client/{form-Dodt8Y8t.mjs → form-C2h3YAcg.mjs} +135 -104
  119. package/dist/client/{headerSection-B0qj9ttg.mjs → headerSection-lwMuMTH9.mjs} +3 -3
  120. package/dist/client/hooks.mjs +489 -65
  121. package/dist/client/{locationMap-gn-iMk7a.mjs → locationMap-DJ2bLODV.mjs} +3 -3
  122. package/dist/client/{newsletterForm-oByLdFkr.mjs → newsletterForm-8Pu5K32g.mjs} +203 -101
  123. package/dist/client/{pricing-BOU0_Hai.mjs → pricing-HHx3IgBz.mjs} +1 -1
  124. package/dist/client/{productDetail-D9v1zH2j.mjs → productDetail-C_1odnAf.mjs} +3 -3
  125. package/dist/client/{productList-D-mItx1n.mjs → productList-CtCv-Nmx.mjs} +3 -3
  126. package/dist/client/{propsDecoder-C3TP_z4x.mjs → propsDecoder-Dcgsncxb.mjs} +40 -23
  127. package/dist/client/rendering/client.mjs +490 -457
  128. package/dist/client/rendering/islands.mjs +17 -17
  129. package/dist/client/rendering.mjs +1515 -628
  130. package/dist/client/{routeIslandApiConfig-DzN1W0sq.mjs → routeIslandApiConfig-CWLP7wu3.mjs} +1 -1
  131. package/dist/client/{scrollToBlock-CWs8EIdo.mjs → scrollToBlock-BNgaEUpo.mjs} +1 -1
  132. package/dist/client/{shop-Dufw7N7o.mjs → shop-DQXrQ8kJ.mjs} +7 -7
  133. package/dist/client/{shop-commerce-gklw_hLF.mjs → shop-commerce-B88zmWWo.mjs} +6 -6
  134. package/dist/client/{shop-commerce-store-Sf1eyTaZ.mjs → shop-commerce-store-DtSfkKuX.mjs} +1 -1
  135. package/dist/client/{shopShared-B5nyA41S.mjs → shopShared-cuaONpkJ.mjs} +4 -4
  136. package/dist/client/{useEventFilters-CLL829vy.mjs → useEventFilters-Bukew6Gb.mjs} +6 -6
  137. package/dist/preview-next/before-render.mjs +368 -103
  138. package/dist/preview-next/client/runtime.mjs +4 -4
  139. package/dist/preview-next/editor-base.css +11 -0
  140. package/dist/preview-next/keepAlive.mjs +328 -103
  141. package/dist/preview-next/middleware.mjs +329 -103
  142. package/dist/{previewAuthStore-BxAFlu-j.mjs → previewAuthStore-h5IgbSp4.mjs} +353 -103
  143. package/dist/{sdk-runtime-D0uZFev7.mjs → sdk-runtime-DTc1uIXn.mjs} +2 -2
  144. package/dist/{separator-EvdCAn4V.mjs → separator-BpHS1KZK.mjs} +1 -1
  145. package/dist/server/components.mjs +1376 -331
  146. package/dist/server/config-validation.mjs +405 -27
  147. package/dist/server/config.mjs +405 -27
  148. package/dist/server/data.mjs +405 -27
  149. package/dist/server/index.mjs +370 -104
  150. package/dist/server/next.mjs +1430 -463
  151. package/dist/server/page-converter.mjs +36 -25
  152. package/dist/server/prebuild.mjs +1 -1
  153. package/dist/server/rendering/server.mjs +1374 -331
  154. package/dist/server/rendering.mjs +1436 -364
  155. package/dist/server/routing.mjs +476 -43
  156. package/dist/server/server.mjs +504 -169
  157. package/dist/server/theme-bridge.mjs +467 -111
  158. package/dist/styles/index.css +186 -65
  159. package/package.json +1 -1
@@ -2,7 +2,7 @@ import type { Theme } from '../../blocks/src/index';
2
2
  import type { SiteVerticalBookingConfig } from '../../core/src/index';
3
3
  import { z } from 'zod';
4
4
  import type { AiGenerateSiteEntityType, AiGenerateSitePrimaryCta, AiGenerateSiteRequest } from './siteGeneration';
5
- import type { AppointmentSetupTargetStep } from './appointmentSetup';
5
+ import type { AppointmentSetupReadiness, AppointmentSetupTargetStep } from './appointmentSetup';
6
6
  import type { MacadamiaOnboardingLogoAnalysis, MacadamiaOnboardingSurfaceData, PublicOnboardingSurfaceId } from './onboarding/surfaceData';
7
7
  export type * from './onboarding/surfaceData';
8
8
  /**
@@ -89,8 +89,8 @@ export type AiBrandGuidelinesGenerateResponse = {
89
89
  stats: SiteContentSamplingStats;
90
90
  };
91
91
  };
92
- export type LaunchRequirementId = 'confirm_email' | 'review_generated_site' | 'configure_appointments' | 'configure_events' | 'configure_courses' | 'connect_payments' | 'connect_custom_domain';
93
- export type LaunchRequirementPackId = 'core' | 'bookings_appointments' | 'bookings_events' | 'bookings_courses' | 'payments' | 'domain';
92
+ export type LaunchRequirementId = 'confirm_email' | 'review_generated_site' | 'configure_appointments' | 'configure_events' | 'configure_courses' | 'connect_payments' | 'connect_custom_domain' | 'add_first_offering' | 'add_cover_image' | 'add_public_contact';
93
+ export type LaunchRequirementPackId = 'core' | 'bookings_appointments' | 'bookings_events' | 'bookings_courses' | 'payments' | 'domain' | 'offerings' | 'presence';
94
94
  export type LaunchRequirementPriority = 'required' | 'recommended' | 'optional';
95
95
  export type LaunchRequirementState = 'complete' | 'pending';
96
96
  export type LaunchRequirementOwner = 'admin' | 'editor' | 'either';
@@ -162,23 +162,36 @@ export type LaunchAppointmentsPackState = {
162
162
  kind: 'disabled';
163
163
  } | {
164
164
  kind: 'ready';
165
- } | {
165
+ }
166
+ /** `missing` is the first gap in setup, so copy can name it. */
167
+ | {
166
168
  kind: 'pending_setup';
169
+ missing: LaunchAppointmentsSetupGap;
167
170
  targetStep: AppointmentSetupTargetStep;
168
171
  };
172
+ export type LaunchAppointmentsSetupGap = Exclude<AppointmentSetupReadiness['kind'], 'not_applicable' | 'bookable'>;
173
+ /** The event offering kinds a launch item can name (courses have their own item). */
174
+ export declare const LAUNCH_EVENT_OFFERING_KINDS: readonly ["classes", "workshops", "retreats", "performances"];
175
+ export type LaunchEventOfferingKind = (typeof LAUNCH_EVENT_OFFERING_KINDS)[number];
169
176
  export type LaunchEventsPackState = {
170
177
  kind: 'disabled';
171
178
  } | {
172
179
  kind: 'ready';
173
- } | {
180
+ }
181
+ /** `offeredKinds`: event kinds recorded at onboarding, in wizard order; empty when none. */
182
+ | {
174
183
  kind: 'pending_setup';
184
+ offeredKinds: readonly LaunchEventOfferingKind[];
175
185
  };
186
+ /** Keyed on whether a Stripe account exists: `connected_pending` has one that can't take payments yet. */
176
187
  export type LaunchPaymentsPackState = {
177
188
  kind: 'not_applicable';
178
189
  } | {
179
190
  kind: 'ready';
180
191
  } | {
181
- kind: 'pending_setup';
192
+ kind: 'not_connected';
193
+ } | {
194
+ kind: 'connected_pending';
182
195
  };
183
196
  export type LaunchCoursesPackState = {
184
197
  kind: 'not_applicable';
@@ -187,6 +200,24 @@ export type LaunchCoursesPackState = {
187
200
  } | {
188
201
  kind: 'pending_setup';
189
202
  };
203
+ /** Booking pages only: whether the site has anything people could book. */
204
+ export type LaunchOfferingsPackState = {
205
+ kind: 'has_offerings';
206
+ } | {
207
+ kind: 'none';
208
+ };
209
+ /** Booking pages only. */
210
+ export type LaunchCoverImagePackState = {
211
+ kind: 'set';
212
+ } | {
213
+ kind: 'missing';
214
+ };
215
+ /** Booking pages only: whether any contact method is published. */
216
+ export type LaunchPublicContactPackState = {
217
+ kind: 'published';
218
+ } | {
219
+ kind: 'missing';
220
+ };
190
221
  export type LaunchCustomDomainPackState = {
191
222
  kind: 'connected';
192
223
  domainIds: readonly string[];
@@ -196,11 +227,28 @@ export type LaunchCustomDomainPackState = {
196
227
  } | {
197
228
  kind: 'pending_setup';
198
229
  };
199
- export type LaunchRequirement = {
200
- id: LaunchRequirementId;
230
+ /**
231
+ * The exact gap behind a pending requirement, so a presentation can name it
232
+ * ("Set your hours", "Finish setting up Stripe") without re-deriving facts.
233
+ */
234
+ export type LaunchAppointmentsGapDetail = {
235
+ kind: 'appointments_gap';
236
+ missing: LaunchAppointmentsSetupGap;
237
+ };
238
+ export type LaunchPaymentsGapDetail = {
239
+ kind: 'payments_gap';
240
+ stage: 'not_connected' | 'connected_pending';
241
+ };
242
+ export type LaunchEventKindsDetail = {
243
+ kind: 'event_kinds';
244
+ offeredKinds: readonly LaunchEventOfferingKind[];
245
+ };
246
+ export type LaunchRequirementDetail = LaunchAppointmentsGapDetail | LaunchPaymentsGapDetail | LaunchEventKindsDetail;
247
+ /** Requirements that always carry a `detail` while pending. */
248
+ export type LaunchDetailedRequirementId = Extract<LaunchRequirementId, 'configure_appointments' | 'connect_payments' | 'configure_events'>;
249
+ type LaunchRequirementFields = {
201
250
  packId: LaunchRequirementPackId;
202
251
  priority: LaunchRequirementPriority;
203
- state: LaunchRequirementState;
204
252
  owner: LaunchRequirementOwner;
205
253
  title: string;
206
254
  description: string;
@@ -208,6 +256,24 @@ export type LaunchRequirement = {
208
256
  secondaryAction?: LaunchRequirementAction | null;
209
257
  evidence: LaunchRequirementEvidence;
210
258
  };
259
+ type LaunchPendingWithDetail<Id extends LaunchDetailedRequirementId, Detail> = LaunchRequirementFields & {
260
+ id: Id;
261
+ state: 'pending';
262
+ detail: Detail;
263
+ };
264
+ /**
265
+ * One launch requirement. The three detailed items must carry their gap
266
+ * while pending, so a presentation never has to guess it.
267
+ */
268
+ export type LaunchRequirement = LaunchPendingWithDetail<'configure_appointments', LaunchAppointmentsGapDetail> | LaunchPendingWithDetail<'connect_payments', LaunchPaymentsGapDetail> | LaunchPendingWithDetail<'configure_events', LaunchEventKindsDetail> | (LaunchRequirementFields & {
269
+ id: LaunchDetailedRequirementId;
270
+ state: 'complete';
271
+ detail?: never;
272
+ }) | (LaunchRequirementFields & {
273
+ id: Exclude<LaunchRequirementId, LaunchDetailedRequirementId>;
274
+ state: LaunchRequirementState;
275
+ detail?: never;
276
+ });
211
277
  export type GoLiveDecision = {
212
278
  kind: 'allowed';
213
279
  overriddenRequirementIds: LaunchRequirementId[];
@@ -23,7 +23,7 @@ export type SdkUpsertNavigationItemInput = Readonly<{
23
23
  * Site platform endpoints cover admin/configuration surfaces: redirects, webhooks,
24
24
  * keys, SDK management, content-type CRUD, backup flows, and site-level admin tools.
25
25
  */
26
- export type SitePlatformAPIEndpoints = {
26
+ export type SitePlatformAPIEndpoints = import('./sdkEventLifecycle').SdkEventLifecycleAPIEndpoints & {
27
27
  listGscPropertiesAdmin: APIEndpoint<never, never, ListGscPropertiesAdminResponse>;
28
28
  getPublicChallenge: APIEndpoint<never, never, string>;
29
29
  checkRedirect: APIEndpoint<never, CheckRedirectQuery, CheckRedirectResponse>;
@@ -12,6 +12,7 @@ export type * from './bookingAdjustments';
12
12
  export type * from './bookingConfig';
13
13
  export type * from './event-listing-destination';
14
14
  export type * from './bookingManagementEndpoints';
15
+ export type * from './newsletterCampaignCommandEndpoints';
15
16
  export type * from './bookingOperations';
16
17
  export { APPOINTMENT_HISTORY_STATUS_VALUES } from './bookingOperations';
17
18
  export type * from './bookingRecords';
@@ -28,6 +29,7 @@ export type * from './sdk-event-payment-terms';
28
29
  export type * from './siteInfrastructure';
29
30
  export type * from './siteGeneration';
30
31
  export type * from './siteManagementEndpoints';
32
+ export type * from './siteAddressEndpoints';
31
33
  export type * from './siteOnboarding';
32
34
  export type * from './siteOperations';
33
35
  export type * from './siteAssets';
@@ -61,17 +63,21 @@ export type * from './accountEndpoints';
61
63
  import type { AiAndLaunchReadinessAPIEndpointDefinitions, AiAPIEndpointName, AiAPIEndpoints, LaunchReadinessAPIEndpointName, LaunchReadinessAPIEndpoints } from './aiEndpoints';
62
64
  import type { AppointmentServiceCategoryAPIEndpoints } from './appointmentServiceCategoryEndpoints';
63
65
  import type { BookingManagementAPIEndpoints } from './bookingManagementEndpoints';
66
+ import type { NewsletterCampaignCommandAPIEndpoints } from './newsletterCampaignCommandEndpoints';
64
67
  import type { CommercePortalAPIEndpoints } from './commercePortalEndpoints';
65
68
  import type { MailchimpIntegrationAPIEndpoints } from './mailchimpIntegration';
66
69
  import type { MailingListIntegrationAPIEndpoints } from './mailingListIntegration';
67
70
  import type { PublicExperienceAPIEndpoints } from './publicExperienceEndpoints';
68
71
  import type { SeoEndpointDefinitions } from './seoEndpoints';
69
72
  import type { SiteManagementAPIEndpoints } from './siteManagementEndpoints';
73
+ import type { SiteAddressAPIEndpoints } from './siteAddressEndpoints';
70
74
  import type { SitePlatformAPIEndpoints } from './sitePlatformEndpoints';
75
+ import type { SdkPageDesignAPIEndpoints } from './sdkPageDesign';
71
76
  import type { SiteRuntimeAPIEndpoints } from './siteRuntimeEndpoints';
77
+ import type { ClientErrorReportingAPIEndpoints } from './clientErrorReporting';
72
78
  type TableName = keyof DbDatabase['public']['Tables'];
73
79
  export type DTOType<K extends TableName> = Partial<CamelizeKeys<DbRow<K>>>;
74
- type APIEndpointsMonolith = AiAndLaunchReadinessAPIEndpointDefinitions & AccountAPIEndpoints & SeoEndpointDefinitions & SiteManagementAPIEndpoints & PublicExperienceAPIEndpoints & SiteRuntimeAPIEndpoints & SitePlatformAPIEndpoints & BookingManagementAPIEndpoints & AppointmentServiceCategoryAPIEndpoints & CommercePortalAPIEndpoints & MailchimpIntegrationAPIEndpoints & MailingListIntegrationAPIEndpoints;
80
+ type APIEndpointsMonolith = AiAndLaunchReadinessAPIEndpointDefinitions & AccountAPIEndpoints & SeoEndpointDefinitions & SiteManagementAPIEndpoints & SiteAddressAPIEndpoints & PublicExperienceAPIEndpoints & SiteRuntimeAPIEndpoints & SitePlatformAPIEndpoints & SdkPageDesignAPIEndpoints & BookingManagementAPIEndpoints & NewsletterCampaignCommandAPIEndpoints & AppointmentServiceCategoryAPIEndpoints & CommercePortalAPIEndpoints & MailchimpIntegrationAPIEndpoints & MailingListIntegrationAPIEndpoints & ClientErrorReportingAPIEndpoints;
75
81
  type ComposeEndpointMaps<Maps extends readonly object[], Acc extends object = {}> = Maps extends readonly [
76
82
  infer Head extends object,
77
83
  ...infer Tail extends readonly object[]
@@ -147,3 +147,17 @@ export type UpdateEventSeriesRegistrationRequest = {
147
147
  export type UpdateEventSeriesRegistrationResponse = {
148
148
  enrollment: EventSeriesRegistrationRecord;
149
149
  };
150
+ /**
151
+ * Somebody on the team filling in or editing the answers of one person on a
152
+ * booking. A booking can hold several places and each person is asked the
153
+ * questions separately, so the person is named rather than assumed.
154
+ */
155
+ export type SaveEventSeriesRegistrationAnswersRequest = {
156
+ requirementId: string;
157
+ participantParticipationId: string;
158
+ answers: Record<string, unknown>;
159
+ };
160
+ export type SaveEventSeriesRegistrationAnswersResponse = {
161
+ savedAt: string;
162
+ filledInByName: string;
163
+ };
@@ -4,6 +4,8 @@ export { createCustomBlockRegistry, mergeBlockDescriptorsWithRegistry, planCusto
4
4
  export type { CustomBlockConflictReason, CustomBlockManifestSource, CustomBlockRegistry, CustomBlockRegistryConflict, CustomBlockRegistryEntry, CustomBlockRegistryResolutionPlan, CustomBlockSourcePolicy, ResolvedCustomBlockManifest, SdkConfigForBlockPicker, } from './customBlockRegistry';
5
5
  export type { BlockOverrideComponent, BlockOverrideProps, BlockOverrides, EntrySubrouteContextData, EditorPageRendererProps, PageBlockRenderAdmissionError, PageRendererProps, RenderablePageBlock, RenderablePageOutline, OccurrenceContextData, PageBlockPosition, PageJoinRenderer, PageJoinSlot, PageRuntimeJoin, RenderedJoin, SdkConfigForRenderer, } from './PageRenderer';
6
6
  export { MissingBlockOverrideError } from './pageRenderingMode';
7
+ export { readPublishedBlockPlacement } from './pageRenderAdmission';
8
+ export type { PublishedBlockPlacement } from './pageRenderAdmission';
7
9
  export * from './subroutes';
8
10
  export * from './structure/schema';
9
11
  export { BLOCK_BUTTON_ROLES, BLOCK_BUTTON_ROLE_OPTIONS, blockButtonRoleSchema, isBlockButtonRole, type BlockButtonRole, } from './system/constants/buttonRoles';
@@ -6,12 +6,20 @@ export type PageBlockRenderAdmissionError = Readonly<{
6
6
  }> | Readonly<{
7
7
  kind: 'manifest_unavailable';
8
8
  }>;
9
+ export type PublishedBlockPlacement = Readonly<{
10
+ id: string;
11
+ content: Record<string, unknown>;
12
+ }>;
13
+ /** Pair a published version with the content it authorises at the render boundary. */
14
+ export declare function readPublishedBlockPlacement(id: string | null | undefined, content: Record<string, unknown> | null | undefined): PublishedBlockPlacement | null;
9
15
  export type RenderablePageBlock = Readonly<{
10
16
  id: Block['id'];
11
17
  kind: Block['kind'];
12
18
  purpose: Block['purpose'];
13
19
  bindings?: Block['bindings'];
14
20
  contentVersionId?: string | null;
21
+ draftContentId?: string | null;
22
+ publishedPlacement?: PublishedBlockPlacement | null;
15
23
  admission: Readonly<{
16
24
  kind: 'renderable';
17
25
  content: RenderableManifestContent;
@@ -34,6 +42,8 @@ export type PresentationAdmission = Readonly<{
34
42
  export type PresentationBlock = Block & Readonly<{
35
43
  presentationAdmission: PresentationAdmission;
36
44
  contentVersionId?: string | null;
45
+ draftContentId?: string | null;
46
+ publishedPlacement?: PublishedBlockPlacement | null;
37
47
  }>;
38
48
  export type PresentationPageOutline = Omit<PageOutline, 'blocks'> & Readonly<{
39
49
  blocks: readonly PresentationBlock[];
@@ -7,6 +7,7 @@ import type { RouteMap } from './system/transforms';
7
7
  import type { BookingOfferingPresetSummary } from './system/blocks/offerings-preview/model';
8
8
  import type { BlockLoaderFailures } from './system/data/types';
9
9
  import type { BrowserReadAuthority } from './system/runtime/api/types';
10
+ import type { NewsletterBlockSubmission } from './system/runtime/nodes/newsletter-form.block-submission';
10
11
  /**
11
12
  * Occurrence context for event pages.
12
13
  * Passed through to blocks that need occurrence information (e.g., event-registration).
@@ -76,6 +77,7 @@ export type BlockOverrideProps<TContent = Record<string, unknown>> = {
76
77
  blockId: string | null;
77
78
  /** Exact content snapshot rendered for this block. */
78
79
  contentVersionId?: string | null;
80
+ newsletterBlockSubmission?: NewsletterBlockSubmission;
79
81
  /** Block kind identifier (e.g., "block.hero" or "custom.my-block") */
80
82
  blockKind: string;
81
83
  };
@@ -141,7 +143,7 @@ export type PageRendererDataContext = {
141
143
  resolvedData?: Record<string, Record<string, unknown>>;
142
144
  /** Failed server loader requests, kept separate from successful data. */
143
145
  loaderFailures?: BlockLoaderFailures;
144
- previewStage?: 'published' | 'preview';
146
+ previewStage: 'published' | 'preview';
145
147
  previewToken?: string | null;
146
148
  readAuthority?: BrowserReadAuthority;
147
149
  routes?: RouteMap;
@@ -18,6 +18,7 @@ export declare const publicEventLoaderQuerySchemaShape: {
18
18
  readonly seriesSlug: z.ZodOptional<z.ZodString>;
19
19
  readonly includeOccurrenceId: z.ZodOptional<z.ZodString>;
20
20
  readonly readIntent: z.ZodOptional<z.ZodString>;
21
+ readonly detailAdmission: z.ZodOptional<z.ZodString>;
21
22
  readonly detailLevel: z.ZodOptional<z.ZodString>;
22
23
  readonly readProfile: z.ZodOptional<z.ZodString>;
23
24
  };
@@ -39,6 +40,7 @@ export declare const publicEventLoaderQuerySchema: z.ZodObject<{
39
40
  seriesSlug: z.ZodOptional<z.ZodString>;
40
41
  includeOccurrenceId: z.ZodOptional<z.ZodString>;
41
42
  readIntent: z.ZodOptional<z.ZodString>;
43
+ detailAdmission: z.ZodOptional<z.ZodString>;
42
44
  detailLevel: z.ZodOptional<z.ZodString>;
43
45
  readProfile: z.ZodOptional<z.ZodString>;
44
46
  }, z.core.$strip>;
@@ -164,11 +166,15 @@ export declare const publicEventBookingAvailabilitySchema: z.ZodDiscriminatedUni
164
166
  series_archived: "series_archived";
165
167
  parent_archived: "parent_archived";
166
168
  parent_inconsistent: "parent_inconsistent";
167
- not_public: "not_public";
168
169
  already_started: "already_started";
169
170
  enrollment_closed: "enrollment_closed";
170
171
  }>;
171
172
  }, z.core.$strip>], "kind">;
173
+ export declare const publicEventBookingClosedDetailSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
174
+ kind: z.ZodLiteral<"opensSoon">;
175
+ }, z.core.$strip>, z.ZodObject<{
176
+ kind: z.ZodLiteral<"paused">;
177
+ }, z.core.$strip>], "kind">;
172
178
  export declare const publicRunSessionSchema: z.ZodObject<{
173
179
  occurrenceId: z.ZodString;
174
180
  startsAt: z.ZodString;
@@ -536,11 +542,15 @@ export declare const publicEventSchema: z.ZodUnion<readonly [z.ZodObject<{
536
542
  series_archived: "series_archived";
537
543
  parent_archived: "parent_archived";
538
544
  parent_inconsistent: "parent_inconsistent";
539
- not_public: "not_public";
540
545
  already_started: "already_started";
541
546
  enrollment_closed: "enrollment_closed";
542
547
  }>;
543
548
  }, z.core.$strip>], "kind">;
549
+ bookingClosedDetail: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
550
+ kind: z.ZodLiteral<"opensSoon">;
551
+ }, z.core.$strip>, z.ZodObject<{
552
+ kind: z.ZodLiteral<"paused">;
553
+ }, z.core.$strip>], "kind">>;
544
554
  deliveryMode: z.ZodEnum<{
545
555
  in_person: "in_person";
546
556
  online: "online";
@@ -1021,11 +1031,15 @@ export declare const publicEventSchema: z.ZodUnion<readonly [z.ZodObject<{
1021
1031
  series_archived: "series_archived";
1022
1032
  parent_archived: "parent_archived";
1023
1033
  parent_inconsistent: "parent_inconsistent";
1024
- not_public: "not_public";
1025
1034
  already_started: "already_started";
1026
1035
  enrollment_closed: "enrollment_closed";
1027
1036
  }>;
1028
1037
  }, z.core.$strip>], "kind">;
1038
+ bookingClosedDetail: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
1039
+ kind: z.ZodLiteral<"opensSoon">;
1040
+ }, z.core.$strip>, z.ZodObject<{
1041
+ kind: z.ZodLiteral<"paused">;
1042
+ }, z.core.$strip>], "kind">>;
1029
1043
  deliveryMode: z.ZodEnum<{
1030
1044
  in_person: "in_person";
1031
1045
  online: "online";
@@ -1531,11 +1545,15 @@ export declare const publicEventsArraySchema: z.ZodArray<z.ZodUnion<readonly [z.
1531
1545
  series_archived: "series_archived";
1532
1546
  parent_archived: "parent_archived";
1533
1547
  parent_inconsistent: "parent_inconsistent";
1534
- not_public: "not_public";
1535
1548
  already_started: "already_started";
1536
1549
  enrollment_closed: "enrollment_closed";
1537
1550
  }>;
1538
1551
  }, z.core.$strip>], "kind">;
1552
+ bookingClosedDetail: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
1553
+ kind: z.ZodLiteral<"opensSoon">;
1554
+ }, z.core.$strip>, z.ZodObject<{
1555
+ kind: z.ZodLiteral<"paused">;
1556
+ }, z.core.$strip>], "kind">>;
1539
1557
  deliveryMode: z.ZodEnum<{
1540
1558
  in_person: "in_person";
1541
1559
  online: "online";
@@ -2016,11 +2034,15 @@ export declare const publicEventsArraySchema: z.ZodArray<z.ZodUnion<readonly [z.
2016
2034
  series_archived: "series_archived";
2017
2035
  parent_archived: "parent_archived";
2018
2036
  parent_inconsistent: "parent_inconsistent";
2019
- not_public: "not_public";
2020
2037
  already_started: "already_started";
2021
2038
  enrollment_closed: "enrollment_closed";
2022
2039
  }>;
2023
2040
  }, z.core.$strip>], "kind">;
2041
+ bookingClosedDetail: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
2042
+ kind: z.ZodLiteral<"opensSoon">;
2043
+ }, z.core.$strip>, z.ZodObject<{
2044
+ kind: z.ZodLiteral<"paused">;
2045
+ }, z.core.$strip>], "kind">>;
2024
2046
  deliveryMode: z.ZodEnum<{
2025
2047
  in_person: "in_person";
2026
2048
  online: "online";
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Shared types for event display blocks
3
3
  */
4
- import type { LocationCoordinates, PublicEventPricing, PublicEventBookingAvailability, PublicEventPricingOption, PublicEventPricingOptionAvailability } from '../../../../../../core/src/index';
4
+ import type { LocationCoordinates, PublicEventPricing, PublicEventBookingAvailability, PublicEventBookingClosedDetail, PublicEventPricingOption, PublicEventPricingOptionAvailability } from '../../../../../../core/src/index';
5
5
  import type { Media } from '../../../../lib/media';
6
6
  import type { RichTextDoc } from '../../../manifest/richTextSchema';
7
7
  import type { BlockBookingPaymentTerms } from '../../shared/bookingPaymentTerms';
@@ -140,6 +140,19 @@ export type PublicEventBase = {
140
140
  requiresRegistration: boolean;
141
141
  /** Canonical lifecycle admission; display remains independent from booking. */
142
142
  bookingAvailability: PublicEventBookingAvailability;
143
+ /**
144
+ * Why an online page is not taking bookings, when that has two readings.
145
+ *
146
+ * Only ever present alongside a closed `bookingAvailability`, and only on a
147
+ * read that named this event and said it was rendering the event's own page.
148
+ * Every listing, calendar, filter, feed and unscoped read is absent it,
149
+ * because a unit that is not live never appears in those at all.
150
+ *
151
+ * The page also has to be online for this unit in particular: an ordinary
152
+ * event or a run with its own page speaks for itself, while a run that uses
153
+ * the course page is only spoken for when no run of that course is live.
154
+ */
155
+ bookingClosedDetail?: PublicEventBookingClosedDetail;
143
156
  /** How people can attend this event. */
144
157
  deliveryMode: 'in_person' | 'online' | 'hybrid';
145
158
  /** Per-mode availability used by registration flows. */
@@ -1,5 +1,5 @@
1
1
  import { type IconComponent } from './svg';
2
- export declare const SOCIAL_ICON_NAMES: readonly ["SocialFacebook", "SocialInstagram", "SocialLinkedIn", "SocialTikTok", "SocialX", "SocialYouTube"];
2
+ export declare const SOCIAL_ICON_NAMES: readonly ["SocialFacebook", "SocialInstagram", "SocialLinkedIn", "SocialTikTok", "SocialWhatsApp", "SocialX", "SocialYouTube"];
3
3
  export type SocialIconName = (typeof SOCIAL_ICON_NAMES)[number];
4
4
  export declare function isSocialIconName(value: unknown): value is SocialIconName;
5
5
  export declare function getSocialIconComponent(value: unknown): IconComponent | null;
@@ -25,7 +25,7 @@ export type SystemBlockComponentProps<TContent = Record<string, unknown>> = {
25
25
  data?: Record<string, unknown>;
26
26
  pathBase?: string;
27
27
  blockId?: string | null;
28
- contentVersionId?: string | null;
28
+ newsletterBlockSubmission?: ResolverContext['newsletterBlockSubmission'];
29
29
  blockKind?: string;
30
30
  blockBindings?: Record<string, unknown>;
31
31
  editableRouteMetadataFieldIds?: ResolverContext['editableRouteMetadataFieldIds'];
@@ -36,6 +36,7 @@ export declare const eventRecoveryRequestSchema: z.ZodObject<{
36
36
  seriesSlug: z.ZodOptional<z.ZodString>;
37
37
  includeOccurrenceId: z.ZodOptional<z.ZodString>;
38
38
  readIntent: z.ZodOptional<z.ZodString>;
39
+ detailAdmission: z.ZodOptional<z.ZodString>;
39
40
  readProfile: z.ZodOptional<z.ZodString>;
40
41
  }, z.core.$strip>;
41
42
  export type EventRecoveryRequest = Omit<PublicEventsRequest, 'siteId'>;
@@ -488,11 +488,15 @@ export declare const eventCollectionSourceSchemaShape: {
488
488
  series_archived: "series_archived";
489
489
  parent_archived: "parent_archived";
490
490
  parent_inconsistent: "parent_inconsistent";
491
- not_public: "not_public";
492
491
  already_started: "already_started";
493
492
  enrollment_closed: "enrollment_closed";
494
493
  }>;
495
494
  }, z.core.$strip>], "kind">;
495
+ bookingClosedDetail: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
496
+ kind: z.ZodLiteral<"opensSoon">;
497
+ }, z.core.$strip>, z.ZodObject<{
498
+ kind: z.ZodLiteral<"paused">;
499
+ }, z.core.$strip>], "kind">>;
496
500
  deliveryMode: z.ZodEnum<{
497
501
  in_person: "in_person";
498
502
  online: "online";
@@ -973,11 +977,15 @@ export declare const eventCollectionSourceSchemaShape: {
973
977
  series_archived: "series_archived";
974
978
  parent_archived: "parent_archived";
975
979
  parent_inconsistent: "parent_inconsistent";
976
- not_public: "not_public";
977
980
  already_started: "already_started";
978
981
  enrollment_closed: "enrollment_closed";
979
982
  }>;
980
983
  }, z.core.$strip>], "kind">;
984
+ bookingClosedDetail: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
985
+ kind: z.ZodLiteral<"opensSoon">;
986
+ }, z.core.$strip>, z.ZodObject<{
987
+ kind: z.ZodLiteral<"paused">;
988
+ }, z.core.$strip>], "kind">>;
981
989
  deliveryMode: z.ZodEnum<{
982
990
  in_person: "in_person";
983
991
  online: "online";
@@ -1519,11 +1527,15 @@ export declare const eventCollectionDisplaySchemaShape: {
1519
1527
  series_archived: "series_archived";
1520
1528
  parent_archived: "parent_archived";
1521
1529
  parent_inconsistent: "parent_inconsistent";
1522
- not_public: "not_public";
1523
1530
  already_started: "already_started";
1524
1531
  enrollment_closed: "enrollment_closed";
1525
1532
  }>;
1526
1533
  }, z.core.$strip>], "kind">;
1534
+ bookingClosedDetail: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
1535
+ kind: z.ZodLiteral<"opensSoon">;
1536
+ }, z.core.$strip>, z.ZodObject<{
1537
+ kind: z.ZodLiteral<"paused">;
1538
+ }, z.core.$strip>], "kind">>;
1527
1539
  deliveryMode: z.ZodEnum<{
1528
1540
  in_person: "in_person";
1529
1541
  online: "online";
@@ -2004,11 +2016,15 @@ export declare const eventCollectionDisplaySchemaShape: {
2004
2016
  series_archived: "series_archived";
2005
2017
  parent_archived: "parent_archived";
2006
2018
  parent_inconsistent: "parent_inconsistent";
2007
- not_public: "not_public";
2008
2019
  already_started: "already_started";
2009
2020
  enrollment_closed: "enrollment_closed";
2010
2021
  }>;
2011
2022
  }, z.core.$strip>], "kind">;
2023
+ bookingClosedDetail: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
2024
+ kind: z.ZodLiteral<"opensSoon">;
2025
+ }, z.core.$strip>, z.ZodObject<{
2026
+ kind: z.ZodLiteral<"paused">;
2027
+ }, z.core.$strip>], "kind">>;
2012
2028
  deliveryMode: z.ZodEnum<{
2013
2029
  in_person: "in_person";
2014
2030
  online: "online";
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import type { FormFieldDef } from './form.types';
3
+ export declare function FormFieldControl({ field }: Readonly<{
4
+ field: FormFieldDef;
5
+ }>): React.ReactElement;
@@ -0,0 +1,36 @@
1
+ import { type MailingListSignupSourceRef } from '../../../../../core/src/index';
2
+ export type NewsletterBlockSubmission = Readonly<{
3
+ tag: 'ready';
4
+ sourceRef: Extract<MailingListSignupSourceRef, {
5
+ tag: 'block_ref';
6
+ }>;
7
+ }> | Readonly<{
8
+ tag: 'unpublished-form';
9
+ }> | Readonly<{
10
+ tag: 'unpublished-settings';
11
+ }> | Readonly<{
12
+ tag: 'unavailable';
13
+ }>;
14
+ type BlockPlacement = Readonly<{
15
+ blockId: string | null;
16
+ selectedContentVersionId: string | null;
17
+ publishedPlacement: Readonly<{
18
+ id: string;
19
+ content: Record<string, unknown>;
20
+ }> | null;
21
+ renderedContent: Record<string, unknown>;
22
+ stage: 'published' | 'preview' | undefined;
23
+ }>;
24
+ /** Authorise one block source for both public and preview rendering. */
25
+ export declare function planNewsletterBlockSubmission(placement: BlockPlacement): NewsletterBlockSubmission;
26
+ type PreviewPlacement = Readonly<{
27
+ blockId: string | null;
28
+ publishedContentId: string | null;
29
+ renderedContent: Record<string, unknown>;
30
+ publishedContent: Record<string, unknown> | null;
31
+ }>;
32
+ /** Decide whether the visible draft can safely cite the published placement. */
33
+ export declare function planNewsletterPreviewSubmission(placement: PreviewPlacement): Exclude<NewsletterBlockSubmission, {
34
+ tag: 'unavailable';
35
+ }>;
36
+ export {};
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { NewsletterFormInteractiveIslandProps } from './newsletter-form.interactive';
2
+ import { type NewsletterFormInteractiveIslandProps } from './newsletter-form.interactive';
3
3
  /**
4
4
  * Newsletter Form Client Component
5
5
  *
@@ -31,7 +31,12 @@ export type NewsletterFormHydrationTarget = Readonly<{
31
31
  sourceRef: MailingListSignupSignedSourceRef;
32
32
  }> | Readonly<{
33
33
  tag: 'preview';
34
+ }> | Readonly<{
35
+ tag: 'unpublished-preview';
36
+ reason: 'unpublished-form' | 'unpublished-settings';
34
37
  }>;
38
+ export declare const NEWSLETTER_SIGNUPS_PAUSED_MESSAGE = "We can\u2019t accept signups right now. Please try again later.";
39
+ export declare function newsletterBlockSubmissionMessage(target: NewsletterFormHydrationTarget): string | null;
35
40
  type MailingListSignupBlockSourceRef = Extract<MailingListSignupSourceRef, {
36
41
  tag: 'block_ref';
37
42
  }>;
@@ -42,7 +47,7 @@ type NewsletterIslandMeta = Readonly<{
42
47
  siteId?: string;
43
48
  apiBaseUrl?: string;
44
49
  }>;
45
- export declare function buildNewsletterDisplay(source: NewsletterFormSourceProps): NewsletterFormDisplay;
50
+ export declare function buildNewsletterDisplay(source: Pick<NewsletterFormSourceProps, 'source' | 'mailingList' | 'targeting' | 'buttonVariant' | 'className'>): NewsletterFormDisplay;
46
51
  export type NewsletterFormInteractiveIslandProps = InteractiveIslandProps<NewsletterIslandMeta, 'newsletter-form', typeof newsletterFormBlockRuntime>;
47
52
  export declare const newsletterFormBlockRuntime: Readonly<{
48
53
  kind: "progressive";
@@ -0,0 +1,46 @@
1
+ import React from 'react';
2
+ import type { NewsletterButtonVariant, NewsletterFieldDef } from './newsletter-form.types';
3
+ /**
4
+ * Newsletter form pieces shared by the SSR render and the hydrated island, so
5
+ * both produce the same markup.
6
+ *
7
+ * Labels are visually hidden: every field has a placeholder, and a visible
8
+ * "Email *" label over a single field reads like a generic form. Screen
9
+ * readers still get the label.
10
+ */
11
+ export declare const TOPIC_CHOICE_FIELD_ID = "mailingListChoice";
12
+ type FieldState = Readonly<{
13
+ disabled?: boolean;
14
+ error?: string | null;
15
+ }>;
16
+ /** Splits the preset's fields into the email (joined with the button) and the rest. */
17
+ export declare function partitionNewsletterFields(fields: readonly NewsletterFieldDef[]): Readonly<{
18
+ email: NewsletterFieldDef | null;
19
+ extra: readonly NewsletterFieldDef[];
20
+ }>;
21
+ export declare function NewsletterExtraField({ field, disabled, error, }: Readonly<{
22
+ field: NewsletterFieldDef;
23
+ }> & FieldState): React.ReactElement;
24
+ /** The email field and submit button sharing one input-styled shell. */
25
+ export declare function NewsletterEmailEntry({ field, buttonVariant, buttonLabel, disabled, error, }: Readonly<{
26
+ field: NewsletterFieldDef;
27
+ buttonVariant: NewsletterButtonVariant;
28
+ buttonLabel: string;
29
+ }> & FieldState): React.ReactElement;
30
+ /**
31
+ * The submit action: joined to the email field when the preset has one
32
+ * (every current preset does), otherwise a plain themed button.
33
+ */
34
+ export declare function NewsletterSubmitRow({ emailField, buttonVariant, buttonLabel, disabled, error, }: Readonly<{
35
+ emailField: NewsletterFieldDef | null;
36
+ buttonVariant: NewsletterButtonVariant;
37
+ buttonLabel: string;
38
+ }> & FieldState): React.ReactElement;
39
+ /** Visitor-chosen topics as toggle chips. Real checkboxes underneath. */
40
+ export declare function NewsletterTopicChips({ choices, disabled, error, }: Readonly<{
41
+ choices: readonly Readonly<{
42
+ id: string;
43
+ label: string;
44
+ }>[];
45
+ }> & FieldState): React.ReactElement;
46
+ export {};
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import type { MailingListGlobalForm, MailingListPlacementTargeting, MailingListRuntimeContext, MailingListSignupSourceRef } from '../../../../../core/src/index';
7
7
  import type { BlockButtonRole } from '../../constants/buttonRoles';
8
+ import type { NewsletterBlockSubmission } from './newsletter-form.block-submission';
8
9
  export type NewsletterPreset = MailingListGlobalForm['fields']['preset'];
9
10
  export type NewsletterFieldDef = {
10
11
  id: string;
@@ -33,7 +34,7 @@ type NewsletterFormCommonProps = {
33
34
  type BlockNewsletterFormSource = Readonly<{
34
35
  source: 'block';
35
36
  blockId?: string | null;
36
- contentVersionId?: string | null;
37
+ newsletterBlockSubmission: NewsletterBlockSubmission;
37
38
  }>;
38
39
  type SignedFooterNewsletterFormSource = Readonly<{
39
40
  source: 'signed-footer';