@riverbankcms/sdk 0.142.0 → 0.144.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 (187) hide show
  1. package/dist/{PreviewEditorSidebar-Dk6Dt11f.mjs → PreviewEditorSidebar-CQZNnFiM.mjs} +20 -26
  2. package/dist/{PreviewEditorUI-D6EQTsCA.mjs → PreviewEditorUI-DCNxnmI0.mjs} +3 -3
  3. package/dist/{PreviewQueryProvider-CC-EPkyQ.mjs → PreviewQueryProvider-BCYICImX.mjs} +1 -1
  4. package/dist/{SdkPreviewModeRuntime-DH1n4ytY.mjs → SdkPreviewModeRuntime-BJolUbr1.mjs} +17 -8
  5. package/dist/{SiteChromeCustomizeContext-DunIzY0K.mjs → SiteChromeCustomizeContext-CKgEpoxi.mjs} +2406 -1988
  6. package/dist/_dts/api/src/billing.d.ts +1 -1
  7. package/dist/_dts/api/src/billingEndpointTypes.d.ts +8 -2
  8. package/dist/_dts/api/src/bookingConfig.d.ts +3 -1
  9. package/dist/_dts/api/src/endpoints.d.ts +7 -0
  10. package/dist/_dts/api/src/index.d.ts +1 -1
  11. package/dist/_dts/api/src/navigation/dashboardBookingsNav.d.ts +4 -4
  12. package/dist/_dts/api/src/publicEventEndpointDefinitions.d.ts +7 -0
  13. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +49 -41
  14. package/dist/_dts/api/src/sdkContracts.d.ts +1 -1
  15. package/dist/_dts/api/src/sdkSettingsContracts.d.ts +8 -0
  16. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +2 -8
  17. package/dist/_dts/api/src/siteSettings.d.ts +17 -7
  18. package/dist/_dts/billing/src/membership/index.d.ts +3 -0
  19. package/dist/_dts/block-form/src/backend/types.d.ts +14 -0
  20. package/dist/_dts/block-form/src/client/index.d.ts +1 -0
  21. package/dist/_dts/block-form/src/context/RepeaterHostActionsContext.d.ts +30 -0
  22. package/dist/_dts/block-form/src/context/index.d.ts +1 -0
  23. package/dist/_dts/block-form/src/index.d.ts +1 -0
  24. package/dist/_dts/block-form/src/widgets/RepeaterField/components/RepeaterList.d.ts +4 -1
  25. package/dist/_dts/block-form/src/widgets/RepeaterField/components/RepeaterRow.d.ts +5 -2
  26. package/dist/_dts/block-form/src/widgets/RepeaterField/components/RepeaterRowActions.d.ts +11 -1
  27. package/dist/_dts/block-form/src/widgets/RepeaterField/hooks/index.d.ts +1 -0
  28. package/dist/_dts/block-form/src/widgets/RepeaterField/hooks/useEmptyStateFocusAfterRemoval.d.ts +8 -0
  29. package/dist/_dts/block-form/src/widgets/RepeaterField/utils/buildSummary.d.ts +15 -1
  30. package/dist/_dts/block-form/src/widgets/RepeaterField/utils/repeaterRowActionsDomain.d.ts +5 -2
  31. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +34 -10
  32. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +3 -0
  33. package/dist/_dts/blocks/src/system/constants/events.d.ts +10 -0
  34. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +7 -1
  35. package/dist/_dts/blocks/src/system/runtime/api/context.d.ts +3 -3
  36. package/dist/_dts/blocks/src/system/runtime/api/endpoints.d.ts +18 -0
  37. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +3 -2
  38. package/dist/_dts/blocks/src/system/runtime/api/readAuthority.d.ts +11 -0
  39. package/dist/_dts/blocks/src/system/runtime/api/types/core.d.ts +9 -0
  40. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +95 -35
  41. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +7 -13
  42. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +3 -6
  43. package/dist/_dts/blocks/src/system/runtime/hooks/useCalendarEvents.d.ts +9 -4
  44. package/dist/_dts/blocks/src/system/runtime/hooks/useCalendarEvents.state.d.ts +0 -1
  45. package/dist/_dts/blocks/src/system/runtime/hooks/useEventPagination.d.ts +1 -3
  46. package/dist/_dts/blocks/src/system/runtime/nodes/basic.d.ts +7 -24
  47. package/dist/_dts/blocks/src/system/runtime/nodes/cart.server.d.ts +1 -0
  48. package/dist/_dts/blocks/src/system/runtime/nodes/checkout.server.d.ts +1 -0
  49. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationBookingLayer.d.ts +2 -1
  50. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationSurface.d.ts +2 -1
  51. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizardActions.d.ts +2 -1
  52. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/PaymentStatusStep.d.ts +10 -0
  53. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/TicketSelectionStep.d.ts +0 -2
  54. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +14 -1
  55. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.override.d.ts +2 -1
  56. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.planning.d.ts +2 -2
  57. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationCompletion.d.ts +1 -4
  58. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationDerivations.d.ts +12 -0
  59. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/registrationErrorRecovery.d.ts +1 -1
  60. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/sessionStorage.d.ts +1 -0
  61. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/ticketSelectionLines.d.ts +4 -5
  62. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +9 -11
  63. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +56 -2
  64. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +12 -6
  65. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/usePaymentStatusRecovery.d.ts +23 -0
  66. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/utils.d.ts +1 -1
  67. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +8 -0
  68. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCalendar.interactive.d.ts +4 -5
  69. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +7 -2
  70. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +7 -5
  71. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +5 -6
  72. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +3 -1
  73. package/dist/_dts/blocks/src/system/runtime/nodes/header-control.d.ts +10 -0
  74. package/dist/_dts/blocks/src/system/runtime/nodes/layout.d.ts +6 -21
  75. package/dist/_dts/blocks/src/system/runtime/nodes/product-detail.server.d.ts +1 -0
  76. package/dist/_dts/blocks/src/system/runtime/nodes/product-list.server.d.ts +1 -0
  77. package/dist/_dts/blocks/src/system/runtime/nodes/shop.interactive.d.ts +13 -0
  78. package/dist/_dts/blocks/src/system/runtime/nodes/shop.server.d.ts +1 -0
  79. package/dist/_dts/blocks/src/system/runtime/shared/components/ThemedButton.d.ts +58 -0
  80. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +2 -0
  81. package/dist/_dts/blocks/src/system/transforms/registry/chromeLogo.d.ts +23 -0
  82. package/dist/_dts/blocks/src/system/transforms/registry/index.d.ts +2 -1
  83. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +3 -1
  84. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +4 -1
  85. package/dist/_dts/commerce/src/purchase/event-registration-errors.d.ts +4 -4
  86. package/dist/_dts/commerce/src/purchase/eventCheckoutRecoveryWindow.d.ts +8 -0
  87. package/dist/_dts/commerce/src/purchase/index.d.ts +2 -1
  88. package/dist/_dts/commerce/src/purchase/stateTransitions.d.ts +1 -13
  89. package/dist/_dts/core/src/event-catalogue.d.ts +27 -0
  90. package/dist/_dts/core/src/event-preset-vocabulary.d.ts +7 -0
  91. package/dist/_dts/core/src/index.d.ts +2 -0
  92. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +3126 -3077
  93. package/dist/_dts/db/src/schemas/forms.d.ts +286 -2
  94. package/dist/_dts/editor-blocks/src/block-editor/{BlockCardHeader.d.ts → BlockCardFrame.d.ts} +11 -3
  95. package/dist/_dts/logger/src/console.d.ts +3 -0
  96. package/dist/_dts/sdk/src/client/publicEventReadOperations.d.ts +1 -0
  97. package/dist/_dts/sdk/src/client/types.d.ts +3 -0
  98. package/dist/_dts/sdk/src/navigation/index.d.ts +27 -0
  99. package/dist/_dts/sdk/src/public-api/contracts.d.ts +15 -7
  100. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +1 -0
  101. package/dist/_dts/sdk/src/rendering/client.d.ts +1 -0
  102. package/dist/_dts/sdk/src/rendering/components/Block.shared.d.ts +1 -0
  103. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +7 -1
  104. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +2 -0
  105. package/dist/_dts/sdk/src/rendering/islands/enhancers/routeIslandApiConfig.d.ts +3 -2
  106. package/dist/_dts/sdk/src/rendering/islands/enhancers/shopShared.d.ts +2 -0
  107. package/dist/_dts/sdk/src/rendering/overrides.d.ts +1 -0
  108. package/dist/_dts/sdk/src/version.d.ts +1 -1
  109. package/dist/_dts/theme-core/src/buttons/affordanceSuppression.d.ts +1 -1
  110. package/dist/_dts/theme-core/src/buttons/classNames.d.ts +3 -13
  111. package/dist/_dts/theme-core/src/customCss/index.d.ts +1 -1
  112. package/dist/_dts/theme-core/src/customCss/patch.d.ts +0 -5
  113. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  114. package/dist/_dts/theme-core/src/surfaces/index.d.ts +1 -0
  115. package/dist/_dts/theme-core/src/surfaces/logoVariant.d.ts +26 -0
  116. package/dist/_dts/theme-core/src/utils/colorStyles.d.ts +10 -0
  117. package/dist/_dts/ui/src/editor-item-card.d.ts +116 -0
  118. package/dist/_dts/ui/src/index.d.ts +1 -0
  119. package/dist/client/{BookingConsentAgreement-CnJeq3_r.mjs → BookingConsentAgreement-DoAILrkN.mjs} +4 -55
  120. package/dist/client/{DiscountCodeDisclosure-BINEO6J9.mjs → DiscountCodeDisclosure-X528hUTf.mjs} +27 -17
  121. package/dist/client/{EventCombined.client-srxNQ6sZ.mjs → EventCombined.client-DSBVwq5m.mjs} +54 -46
  122. package/dist/client/{EventListing.client-DbyVyGkX.mjs → EventListing.client-DmFAX7Vb.mjs} +3 -4
  123. package/dist/client/{LeafletStaticMap-B-wpijzL.mjs → LeafletStaticMap-BAqXdfhq.mjs} +1 -1
  124. package/dist/client/ThemedButton-BwNFVwi4.mjs +412 -0
  125. package/dist/client/{accordion-B-iUXU7n.mjs → accordion-DRhMdkbd.mjs} +1 -1
  126. package/dist/client/{bookingForm-BXYPke5q.mjs → bookingForm-iJ_nCsNF.mjs} +26 -32
  127. package/dist/client/bookings.mjs +657 -650
  128. package/dist/client/{carousel-Cr4aj63H.mjs → carousel-D8zuffZr.mjs} +2 -2
  129. package/dist/client/{carousel.client-DQTjCVQT.mjs → carousel.client-jahpU9Vz.mjs} +1 -1
  130. package/dist/client/{cart-DibP9WWa.mjs → cart-DeMGJViN.mjs} +3 -3
  131. package/dist/client/{checkout-CrSBVnL8.mjs → checkout-DXc06Km2.mjs} +3 -3
  132. package/dist/client/{checkoutUrls-FL6lRkrt.mjs → checkoutUrls-CW3-78uu.mjs} +1 -1
  133. package/dist/client/client.mjs +2714 -2448
  134. package/dist/client/{colorStyles-3013aRAY.mjs → colorStyles-CuJBiS-1.mjs} +16 -4
  135. package/dist/client/{context-Ces-AgdR.mjs → context-CDLCfDep.mjs} +35 -8
  136. package/dist/client/{dates-BXyNeNhB.mjs → dates-ClFx7Epy.mjs} +2 -2
  137. package/dist/client/{eventCalendar-HwpPeqrH.mjs → eventCalendar-BaGpnOGN.mjs} +39 -50
  138. package/dist/client/{eventCombined-BpFUkuEI.mjs → eventCombined-ywONOx2m.mjs} +5 -4
  139. package/dist/client/{eventDetails-DK_agiWy.mjs → eventDetails-B2LlOTYY.mjs} +4 -4
  140. package/dist/client/{eventListing-DhzHqP1c.mjs → eventListing-CMgxWpqP.mjs} +5 -4
  141. package/dist/client/{eventRegistration-BdQ_Dn2d.mjs → eventRegistration-BarLDNHR.mjs} +549 -592
  142. package/dist/client/{form-B1frcuzy.mjs → form-BjqKaBJ7.mjs} +9 -10
  143. package/dist/client/{headerSection-CT5z460s.mjs → headerSection-CP4XDwz1.mjs} +23 -30
  144. package/dist/client/hooks.mjs +269 -63
  145. package/dist/client/{locationMap-CIQXB9i2.mjs → locationMap-C5gW-d-w.mjs} +9 -10
  146. package/dist/client/{media-DHpfFwd3.mjs → media-BtJ37tzS.mjs} +1 -1
  147. package/dist/client/{newsletterForm-BYNYZSes.mjs → newsletterForm-afXlVSA0.mjs} +8 -9
  148. package/dist/client/{pricing-CbTlAsmt.mjs → pricing-Bl1CAl28.mjs} +1 -1
  149. package/dist/client/{productDetail-CR7Z3yjS.mjs → productDetail-CvQ3jWQe.mjs} +3 -3
  150. package/dist/client/{productList-DXj00vzR.mjs → productList-U874PGO7.mjs} +3 -3
  151. package/dist/client/{propsDecoder-DiLiBdek.mjs → propsDecoder-DPXtCZWP.mjs} +100 -29
  152. package/dist/client/rendering/client.mjs +2397 -2279
  153. package/dist/client/rendering/islands.mjs +19 -19
  154. package/dist/client/rendering.mjs +2742 -2452
  155. package/dist/client/{routeIslandApiConfig-UNsfPcYq.mjs → routeIslandApiConfig-NGYiUWXu.mjs} +8 -1
  156. package/dist/client/{scrollToBlock-CrcbBf0h.mjs → scrollToBlock-0-C3DVhK.mjs} +1 -1
  157. package/dist/client/{shop-DgqiB_1b.mjs → shop-BXjXhM9P.mjs} +45 -58
  158. package/dist/client/{shop-commerce-D_J781in.mjs → shop-commerce-BZ6UlWJ7.mjs} +42 -55
  159. package/dist/client/{shop-commerce-store-PGUbDwqe.mjs → shop-commerce-store-DlSBXb3D.mjs} +1 -1
  160. package/dist/client/{shopShared-C_Bb2zwG.mjs → shopShared-kkEOiLPA.mjs} +6 -5
  161. package/dist/client/{useEventFilters-CM17Xpr1.mjs → useEventFilters-zvnnE1ro.mjs} +66 -355
  162. package/dist/preview-next/before-render.mjs +11 -0
  163. package/dist/preview-next/client/runtime.mjs +4 -4
  164. package/dist/preview-next/editor-chrome.css +8 -0
  165. package/dist/preview-next/keepAlive.mjs +11 -0
  166. package/dist/preview-next/middleware.mjs +11 -0
  167. package/dist/{previewAuthStore-oVttoRDO.mjs → previewAuthStore-JA6-I_sL.mjs} +11 -0
  168. package/dist/{sdk-runtime-DhmuRhIX.mjs → sdk-runtime-DFJlQt3q.mjs} +2 -2
  169. package/dist/{separator-C3hlg9LH.mjs → separator-o8GHb1xh.mjs} +1 -1
  170. package/dist/server/components.mjs +840 -625
  171. package/dist/server/config-validation.mjs +269 -63
  172. package/dist/server/config.mjs +269 -63
  173. package/dist/server/data.mjs +269 -63
  174. package/dist/server/index.mjs +20 -5
  175. package/dist/server/navigation.mjs +28 -1
  176. package/dist/server/next.mjs +14129 -13937
  177. package/dist/server/page-converter.mjs +111 -59
  178. package/dist/server/prebuild.mjs +1 -1
  179. package/dist/server/rendering/server.mjs +844 -624
  180. package/dist/server/rendering.mjs +842 -626
  181. package/dist/server/routing.mjs +306 -69
  182. package/dist/server/server.mjs +278 -68
  183. package/dist/server/theme-bridge.mjs +40 -1
  184. package/dist/styles/index.css +6 -0
  185. package/package.json +1 -1
  186. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/checkoutRecovery.d.ts +0 -14
  187. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useCheckoutRecovery.d.ts +0 -8
@@ -109,7 +109,7 @@ export type StripeConnectDisconnectResponse = {
109
109
  success: boolean;
110
110
  message: string;
111
111
  };
112
- export declare function changePlan(apiClient: ApiClient, { attemptId, planId, interval, prorationBehavior, options, }: ChangePlanRequest & {
112
+ export declare function changePlan(apiClient: ApiClient, request: ChangePlanRequest & {
113
113
  options?: RequestInit;
114
114
  }): Promise<ChangePlanResponse>;
115
115
  export declare function createBillingPortalSession(apiClient: ApiClient, options?: RequestInit): Promise<BillingPortalSessionResponse>;
@@ -4,17 +4,23 @@ import type { APIEndpoint } from './apiEndpointTypes';
4
4
  import type { BillingPortalSessionResponse } from './billing';
5
5
  export type ChangePlanRequest = Readonly<{
6
6
  attemptId: string;
7
+ }> & (Readonly<{
8
+ intent: 'change_plan';
7
9
  planId: string;
8
10
  interval: 'monthly';
9
11
  prorationBehavior?: 'create_prorations' | 'always_invoice' | 'none';
10
- }>;
12
+ }> | Readonly<{
13
+ intent: 'reverse_cancellation';
14
+ }>);
11
15
  export type ChangePlanResponse = Readonly<{
12
16
  membership: MembershipSummary | null;
13
17
  }>;
14
- export type AdminChangePlanRequest = Readonly<Omit<ChangePlanRequest, 'interval' | 'attemptId'> & {
18
+ export type AdminChangePlanRequest = Readonly<{
15
19
  attemptId?: string;
16
20
  userId: string;
21
+ planId: string;
17
22
  interval: BillingInterval;
23
+ prorationBehavior?: 'create_prorations' | 'always_invoice' | 'none';
18
24
  reason?: string;
19
25
  bypassProration?: boolean;
20
26
  }>;
@@ -1,7 +1,7 @@
1
1
  import type { EventOnlineDetails } from './bookingRecords';
2
2
  import type { CreateEventRequest } from './eventManagementContracts';
3
3
  import { BOOKING_SETTINGS_SECTION_KEYS } from './bookingSettingsSections';
4
- import { type EventPreset } from '../../core/src/index';
4
+ import { type ResolvedEventCatalogue, type EventPreset } from '../../core/src/index';
5
5
  export { BOOKING_SETTINGS_SECTION_KEYS, BOOKING_SETTINGS_SECTION_LABELS, } from './bookingSettingsSections';
6
6
  import type { EventBookingOffer, EventPricing, EventPricingAttendanceScope, PricingOptionId, PublicEventPricingOptionAvailability, SiteVerticalBookingConfig, StaffMemberId, UserId } from '../../core/src/index';
7
7
  /**
@@ -420,3 +420,5 @@ export type BookingSettingsEditorSnapshot = {
420
420
  appointmentStaffNotificationSetupHealth: AppointmentStaffNotificationSetupHealth;
421
421
  };
422
422
  export type BookingSettingsResponse = BookingSettingsEditorSnapshot;
423
+ /** Normalize optional wire defaults once before projecting operational Event policy. */
424
+ export declare function resolveBookingSettingsEventCatalogue(settings: Pick<BookingSettings, 'verticalConfig' | 'eventTypePresets'>): ResolvedEventCatalogue;
@@ -5832,6 +5832,13 @@ export declare const API_ENDPOINTS: {
5832
5832
  auth: "public";
5833
5833
  responseKind: "json";
5834
5834
  };
5835
+ readonly checkPublicEventRegistrationNextStep: {
5836
+ path: "/public/sites/{siteId}/events/registration-next-step";
5837
+ method: "POST";
5838
+ auth: "public";
5839
+ responseKind: "json";
5840
+ errors: ("auth:forbidden" | "validation:invalid_input" | "server:internal_error")[];
5841
+ };
5835
5842
  readonly listPublicEventCalendarWindow: {
5836
5843
  path: "/public/sites/{siteId}/events/calendar-window";
5837
5844
  method: "GET";
@@ -71,7 +71,7 @@ export { deleteEventOfferingRequest, addEventSeriesRegistrationRequest, updateEv
71
71
  export * from './appointmentServiceContracts';
72
72
  export type { BookingPricing, BookingPricingDraft, BookingPricingInput, BookingPricingInputValueTypes, BookingPricingOption, BookingPricingOptionInput, BookingSettingsSection, BookingSettingsSectionUpdate, BookingSettingsSectionUpdateRequest, } from './bookingConfig';
73
73
  export type { BookingServicePricing, BookingServicePricingInput, BookingServicePricingOption, BookingServicePricingOptionInput, } from './bookingServicePricing';
74
- export { BOOKING_SETTINGS_SECTION_LABELS, BOOKING_SETTINGS_SECTION_KEYS, BOOKING_SETTINGS_SECTIONS, DEFAULT_APPOINTMENT_STAFF_DIGEST_LOCAL_SEND_TIME, DEFAULT_BOOKING_NOTIFICATION_SEND_RULE, DEFAULT_BOOKING_NOTIFICATION_SETTINGS, DIRECT_CHECKOUT_COLLECTION_OPTION_KINDS, applyBookingSettingsSectionUpdate, applyBookingSettingsSectionUpdates, createBookingSettingsUpdateRequest, } from './bookingConfig';
74
+ export { BOOKING_SETTINGS_SECTION_LABELS, BOOKING_SETTINGS_SECTION_KEYS, BOOKING_SETTINGS_SECTIONS, DEFAULT_APPOINTMENT_STAFF_DIGEST_LOCAL_SEND_TIME, DEFAULT_BOOKING_NOTIFICATION_SEND_RULE, DEFAULT_BOOKING_NOTIFICATION_SETTINGS, DIRECT_CHECKOUT_COLLECTION_OPTION_KINDS, applyBookingSettingsSectionUpdate, applyBookingSettingsSectionUpdates, createBookingSettingsUpdateRequest, resolveBookingSettingsEventCatalogue, } from './bookingConfig';
75
75
  export { bookingPaymentCollectionOptionSchema } from './bookingPaymentTermSchemas';
76
76
  export { BOOKING_LEDGER_CANCELLATION_MODE_VALUES, BOOKING_LEDGER_DATE_BASIS_VALUES, BOOKING_LEDGER_KIND_VALUES, BOOKING_LEDGER_PERIOD_PRESET_VALUES, BOOKING_ACTIVITY_CATEGORY_VALUES, BOOKING_ACTIVITY_TYPE_VALUES, BOOKING_QUESTION_ANSWER_EXPORT_SCOPES, BOOKING_QUESTION_ANSWER_EXPORT_SCOPE_VALUES, CUSTOMER_MEMBERSHIP_STATUS_VALUES, CUSTOMER_PASS_STATUS_VALUES, } from './bookingRecords';
77
77
  export type { BookingQuestionAnswerExportScopeKind, CreatePersonRecordEntryRequest, ExportBookingQuestionAnswersCsvRequest, } from './bookingRecords';
@@ -1,4 +1,4 @@
1
- import { type AppointmentResourceId, type EventSeriesCanonicalBehaviour, type SiteVerticalBookingConfig } from "../../../core/src/index";
1
+ import { type AppointmentResourceId, type EventPreset, type ResolvedEventCatalogue } from "../../../core/src/index";
2
2
  import type { BookingSettingsSection } from "../bookingConfig";
3
3
  import { type StaffScope } from "../staffAccess";
4
4
  import type { SiteRole } from "../siteMembers";
@@ -59,9 +59,9 @@ export type DashboardBookingsNavDestination = Readonly<{
59
59
  kind: "events_all";
60
60
  }> | Readonly<{
61
61
  kind: "events_preset";
62
- preset: EventSeriesCanonicalBehaviour;
62
+ preset: Exclude<EventPreset, 'event'>;
63
63
  }> | Readonly<{
64
- kind: "courses";
64
+ kind: "events_other";
65
65
  }> | Readonly<{
66
66
  kind: "venues";
67
67
  }> | Readonly<{
@@ -86,4 +86,4 @@ export type DashboardBookingsNavGroupPlan = Readonly<{
86
86
  items: readonly DashboardBookingsNavItemPlan[];
87
87
  }>;
88
88
  export declare function resolveDashboardBookingsNavPolicy(modules: DashboardBookingModules, ctx: DashboardBookingsNavContext): DashboardBookingsNavPolicy;
89
- export declare function buildDashboardBookingsNavPlan(modules: DashboardBookingModules, ctx: DashboardBookingsNavContext, verticalConfig?: SiteVerticalBookingConfig | null): readonly DashboardBookingsNavGroupPlan[];
89
+ export declare function buildDashboardBookingsNavPlan(modules: DashboardBookingModules, ctx: DashboardBookingsNavContext, catalogue: ResolvedEventCatalogue): readonly DashboardBookingsNavGroupPlan[];
@@ -1,4 +1,11 @@
1
1
  export declare const PUBLIC_EVENT_ENDPOINT_DEFINITIONS: {
2
+ checkPublicEventRegistrationNextStep: {
3
+ path: "/public/sites/{siteId}/events/registration-next-step";
4
+ method: "POST";
5
+ auth: "public";
6
+ responseKind: "json";
7
+ errors: ("auth:forbidden" | "validation:invalid_input" | "server:internal_error")[];
8
+ };
2
9
  listPublicEventCalendarWindow: {
3
10
  path: "/public/sites/{siteId}/events/calendar-window";
4
11
  method: "GET";
@@ -7,7 +7,8 @@ import type { EventRegistrationOptionsRequest, EventRegistrationOptionsResponse
7
7
  import type { PublicWaitlistClaimResponse } from '../../../commerce/src/index';
8
8
  import type { APIEndpoint } from '../apiEndpointTypes';
9
9
  import type { DirectCheckoutCollectionOptionKind, EventAttendanceMode } from '../bookingConfig';
10
- import type { EventTicketLineSummaryResponse, EventTicketSelectionRequest, PublicEventLoaderParams } from './sharedTypes';
10
+ import type { EventTicketSelectionRequest, PublicEventLoaderParams } from './sharedTypes';
11
+ import type { EventRegisterResponse as EventRegistrationOutcome, EventRegistrationPaymentSubject, EventRegistrationNextStepRequest, EventRegistrationNextStepResponse } from '../../../blocks/src/system/runtime/api/types';
11
12
  /**
12
13
  * The canonical public Event record.
13
14
  *
@@ -60,6 +61,7 @@ export type PublicEventAPIEndpoints = {
60
61
  }>;
61
62
  resolveEventSubroute: APIEndpoint<never, {
62
63
  siteId: string;
64
+ stage?: 'published' | 'preview';
63
65
  kind: 'event-occurrence' | 'event-run';
64
66
  subjectKind: 'eventOffering' | 'eventSeries';
65
67
  subjectId: string;
@@ -95,6 +97,12 @@ export type PublicEventAPIEndpoints = {
95
97
  * The single-occurrence commit is keyed on it; see #1273.
96
98
  */
97
99
  registrationCommandId: string;
100
+ checkout?: {
101
+ successUrl: string;
102
+ cancelUrl: string;
103
+ discountCode?: string;
104
+ collectionOptionKind?: DirectCheckoutCollectionOptionKind;
105
+ };
98
106
  subject: {
99
107
  kind: 'occurrence';
100
108
  occurrenceId: string;
@@ -126,51 +134,13 @@ export type PublicEventAPIEndpoints = {
126
134
  }>;
127
135
  }, {
128
136
  siteId: string;
129
- }, {
130
- success: boolean;
131
- scope: 'occurrence';
132
- attendeeId: string;
133
- status: 'confirmed';
134
- paymentMethod: 'free' | 'pass' | 'membership' | 'stripe' | 'pass_bundle' | 'membership_bundle';
135
- pendingPayment: boolean;
136
- passCreditsUsed?: number;
137
- passCreditsRemaining?: number;
138
- alreadyRegistered?: boolean;
139
- ticketLines: EventTicketLineSummaryResponse[];
140
- message: string;
141
- } | {
142
- success: boolean;
143
- scope: 'occurrence';
144
- attendeeId: string;
145
- status: 'waitlist';
146
- waitlistPosition: number | null;
147
- alreadyRegistered?: boolean;
148
- message: string;
149
- } | {
150
- success: boolean;
151
- scope: 'wholeSeries';
152
- registrationId: string;
153
- status: 'confirmed';
154
- paymentMethod: 'free' | 'membership';
155
- pendingPayment: false;
156
- alreadyRegistered?: boolean;
157
- ticketLines: EventTicketLineSummaryResponse[];
158
- message: string;
159
- } | {
160
- success: boolean;
161
- scope: 'wholeSeries';
162
- waitlistEntryId: string;
163
- status: 'waitlist';
164
- waitlistPosition: number | null;
165
- alreadyRegistered?: boolean;
166
- message: string;
167
- }>;
137
+ }, EventRegistrationOutcome>;
168
138
  createPublicEventCheckout: APIEndpoint<{
169
139
  subject: {
170
140
  kind: 'occurrence';
171
141
  attendeeId: string;
172
142
  };
173
- registrationCommandId?: string;
143
+ registrationCommandId: string;
174
144
  checkoutType?: 'event' | 'pass_bundle' | 'membership_bundle';
175
145
  productId?: string;
176
146
  discountCode?: string;
@@ -211,13 +181,27 @@ export type PublicEventAPIEndpoints = {
211
181
  checkoutUrl: string | null;
212
182
  sessionId: string | null;
213
183
  bypassed: boolean;
184
+ deferredBalance?: {
185
+ amountCents: number;
186
+ currency: string;
187
+ };
214
188
  } | {
215
189
  scope: 'wholeSeries';
216
190
  registrationId: string;
217
191
  checkoutAttemptId: string;
192
+ recoverableUntil?: string;
218
193
  checkoutUrl: string | null;
219
194
  sessionId: string | null;
220
195
  bypassed: boolean;
196
+ deferredBalance?: {
197
+ amountCents: number;
198
+ currency: string;
199
+ };
200
+ } | {
201
+ scope: 'wholeSeries';
202
+ status: 'paymentStatusRequired';
203
+ checkoutAttemptId: string;
204
+ recoverableUntil?: string;
221
205
  } | {
222
206
  scope: 'wholeSeries';
223
207
  status: 'waitlist';
@@ -228,6 +212,9 @@ export type PublicEventAPIEndpoints = {
228
212
  getPublicEventRegistrationOptions: APIEndpoint<PublicEventRegistrationOptionsRequest, {
229
213
  siteId: string;
230
214
  }, PublicEventRegistrationOptionsResponse>;
215
+ checkPublicEventRegistrationNextStep: APIEndpoint<EventRegistrationNextStepRequest, {
216
+ siteId: string;
217
+ }, EventRegistrationNextStepResponse>;
231
218
  getPublicEventRegistrationStatus: APIEndpoint<never, {
232
219
  siteId: string;
233
220
  } & ({
@@ -249,10 +236,17 @@ export type PublicEventAPIEndpoints = {
249
236
  } | {
250
237
  kind: 'abandon';
251
238
  checkoutAttemptId: string;
239
+ } | {
240
+ kind: 'checkStatus';
241
+ subject: EventRegistrationPaymentSubject;
252
242
  }, {
253
243
  siteId: string;
254
244
  }, {
255
245
  kind: 'resolved';
246
+ deferredBalance?: {
247
+ amountCents: number;
248
+ currency: string;
249
+ };
256
250
  reference: {
257
251
  scope: 'occurrence';
258
252
  attendeeId: string;
@@ -266,6 +260,20 @@ export type PublicEventAPIEndpoints = {
266
260
  kind: 'notFound';
267
261
  } | {
268
262
  kind: 'reconciliationRequired';
263
+ } | {
264
+ kind: 'paymentProcessing';
265
+ recoverableUntil?: string;
266
+ } | {
267
+ kind: 'paymentAvailable';
268
+ checkoutUrl: string;
269
+ recoverableUntil?: string;
270
+ } | {
271
+ kind: 'paymentRetryAvailable';
272
+ } | {
273
+ kind: 'paymentCheckUnavailable';
274
+ recoverableUntil?: string;
275
+ } | {
276
+ kind: 'paymentAssistanceRequired';
269
277
  }>;
270
278
  getPublicEventTicketQrSvg: APIEndpoint<never, {
271
279
  siteId: string;
@@ -17,7 +17,7 @@ export type { SdkCatalogButtonRole, SdkCatalogButtonStyleControl, } from './sdkT
17
17
  import type { SdkPullEventCategory } from './sdkEventCategoryContracts';
18
18
  import type { SdkPullSettings } from './sdkSettingsContracts';
19
19
  export type { SdkConfigureBookingVerticalRequest, SdkConfigureBookingVerticalResponse, SdkPullSettingsWarning, } from './sdkBookingVerticalContracts';
20
- export type { SdkPullSettings, SdkPullSettingsResponse, } from './sdkSettingsContracts';
20
+ export type { SdkPullSettings, SdkPullSettingsResponse, SdkUpdateSettingsInput, } from './sdkSettingsContracts';
21
21
  export type { SdkPullEventCategory } from './sdkEventCategoryContracts';
22
22
  import type { SdkManagementEvent, SdkManagementEventOccurrence, SdkManagementEventRun } from './sdkManagedEventContracts';
23
23
  export type { SdkEventOccurrenceDeletionEligibility, SdkEventOccurrenceProvenance, SdkManagementEvent, SdkManagementEventOccurrence, SdkManagementEventRun, } from './sdkManagedEventContracts';
@@ -11,11 +11,19 @@ export interface SdkPullSettings {
11
11
  ogImage?: string;
12
12
  allowIndexingInProduction?: boolean;
13
13
  } | null;
14
+ /** Media identifier of the site logo, designed for light backgrounds. */
14
15
  logoIdentifier?: string | null;
16
+ /** Media identifier of the optional logo designed for dark backgrounds. */
17
+ logoDarkBackgroundIdentifier?: string | null;
15
18
  faviconIdentifier?: string | null;
16
19
  /** Optional, configured booking vertical for SDK-owned booking surfaces. */
17
20
  verticalConfig?: ConfiguredSiteVerticalBookingConfig;
18
21
  }
22
+ /**
23
+ * The settings a management client may write. Named field by field so a new
24
+ * pull-only field never becomes writable just by being added to the pull shape.
25
+ */
26
+ export type SdkUpdateSettingsInput = Partial<Pick<SdkPullSettings, 'siteTitle' | 'homepageId' | 'seoDefaults' | 'logoIdentifier' | 'logoDarkBackgroundIdentifier' | 'faviconIdentifier'>>;
19
27
  export interface SdkPullSettingsResponse {
20
28
  settings: SdkPullSettings;
21
29
  warnings?: readonly (string | SdkPullSettingsWarning)[];
@@ -7,7 +7,7 @@ import type { CheckRedirectQuery, CheckRedirectResponse, CreateRedirectRuleReque
7
7
  import type { CreateManagementKeyRequest, CreateManagementKeyResponse, CreateSiteApiKeyRequest, CreateSiteApiKeyResponse, CreateSitePreviewKeyRequest, CreateSitePreviewKeyResponse, CreateWebhookRequest, CreateWebhookResponse, DeleteBackupUploadRequest, DeleteBackupUploadResponse, DeleteWebhookResponse, GetSiteApiKeyAccessLogsResponse, ListSitePreviewKeysResponse, GetWebhookResponse, ImportBackupAsNewSiteRequest, ImportBackupAsNewSiteResponse, ImportSiteBackupRequest, ListManagementKeysResponse, ListSiteApiKeysResponse, ListWebhooksResponse, RevokeManagementKeyRequest, RevokeManagementKeyResponse, RevokeSiteApiKeyResponse, SdkDeploymentHealthResponse, SetupSdkDeploymentRevalidationWebhookRequest, SetupSdkDeploymentRevalidationWebhookResponse, SetupSdkRevalidationWebhookRequest, SetupSdkRevalidationWebhookResponse, UpdateWebhookRequest, UpdateWebhookResponse, BackupImportResponse, BackupPreviewRequest, BackupPreviewResponse, CreateBackupUploadUrlRequest, CreateBackupUploadUrlResponse } from './siteInfrastructure';
8
8
  import type { GetSiteInspirationAnalysisResponse, ListSiteInspirationAnalysesResponse } from './siteGeneration';
9
9
  import type { ListGscPropertiesAdminResponse, AuthStatusResponse, CronAppointmentRemindersResponse, CronBillingStatusResponse, CronEventFeedbackEmailsResponse, CronEventOccurrencesResponse, CronEventRemindersResponse, CronMediaJobsQuery, CronMediaJobsResponse, CronNewsletterSendResponse, CronPaymentReconciliationResponse, CronSeoIngestResponse, CronWaitlistExpiryResponse } from './siteOperations';
10
- import type { ManagementMediaAsset, MediaResolveResponse, PushSdkConfigRequest, PushSdkConfigResponse, SdkAddEventOccurrenceRequest, SdkBackfillIdentifiersResult, SdkEventOccurrenceResponse, SdkGetEntryResponse, SdkGetEventCategoryResponse, SdkGetEventResponse, SdkGetFormResponse, SdkGetPageBlockResponse, SdkPatchPageBlockBody, SdkPatchPageBlockResponse, SdkGetVenueResponse, SdkListEntriesResponse, SdkListEventCategoriesResponse, SdkListEventOccurrencesResponse, SdkListEventsResponse, SdkListFormsResponse, SdkListVenuesResponse, SdkMediaFinalizeUploadResponse, SdkMediaDeleteApplyResponse, SdkMediaDeletePreviewResponse, SdkMediaDownloadResponse, SdkMediaListResponse, SdkMediaUploadUrlResponse, SdkPageResponse, SdkEntryUpsertSlotBlock, SdkPublishOrUnpublishEntryResponse, SdkPullContentTypesResponse, SdkCatalogBlocksResponse, SdkCatalogContentTypesResponse, SdkCapabilitiesResponse, SdkConfigureBookingVerticalRequest, SdkConfigureBookingVerticalResponse, SdkDemoContentResponse, SdkDeleteResponse, SdkPullEntriesAllResponse, SdkPullEntriesByTypeResponse, SdkPullEntriesResponse, SdkPullEventCategoriesResponse, SdkPullEventsResponse, SdkPullFooterResponse, SdkPullFormSchema, SdkPullFormsResponse, SdkPullFormSettings, SdkPullDraftsResponse, SdkPullNavigationResponse, SdkPullPagesResponse, SdkPullSettings, SdkPullSettingsResponse, SdkPullSiteInfoResponse, SdkPullVenue, SdkPullVenuesResponse, SdkUpdateSettingsResponse, SdkUpdateEventOccurrenceRequest, SdkUpsertBlockResponse, SdkUpsertEntryResponse, SdkUpsertPageResponse, SdkUpsertEventCategoryResponse, SdkUpsertEventResponse, SdkUpsertFooterResponse, SdkUpsertFormResponse, SdkUpsertNavigationMenuResponse, SdkUpsertVenueResponse } from './sdkContracts';
10
+ import type { ManagementMediaAsset, MediaResolveResponse, PushSdkConfigRequest, PushSdkConfigResponse, SdkAddEventOccurrenceRequest, SdkBackfillIdentifiersResult, SdkEventOccurrenceResponse, SdkGetEntryResponse, SdkGetEventCategoryResponse, SdkGetEventResponse, SdkGetFormResponse, SdkGetPageBlockResponse, SdkPatchPageBlockBody, SdkPatchPageBlockResponse, SdkGetVenueResponse, SdkListEntriesResponse, SdkListEventCategoriesResponse, SdkListEventOccurrencesResponse, SdkListEventsResponse, SdkListFormsResponse, SdkListVenuesResponse, SdkMediaFinalizeUploadResponse, SdkMediaDeleteApplyResponse, SdkMediaDeletePreviewResponse, SdkMediaDownloadResponse, SdkMediaListResponse, SdkMediaUploadUrlResponse, SdkPageResponse, SdkEntryUpsertSlotBlock, SdkPublishOrUnpublishEntryResponse, SdkPullContentTypesResponse, SdkCatalogBlocksResponse, SdkCatalogContentTypesResponse, SdkCapabilitiesResponse, SdkConfigureBookingVerticalRequest, SdkConfigureBookingVerticalResponse, SdkDemoContentResponse, SdkDeleteResponse, SdkPullEntriesAllResponse, SdkPullEntriesByTypeResponse, SdkPullEntriesResponse, SdkPullEventCategoriesResponse, SdkPullEventsResponse, SdkPullFooterResponse, SdkPullFormSchema, SdkPullFormsResponse, SdkPullFormSettings, SdkPullDraftsResponse, SdkPullNavigationResponse, SdkPullPagesResponse, SdkUpdateSettingsInput, SdkPullSettingsResponse, SdkPullSiteInfoResponse, SdkPullVenue, SdkPullVenuesResponse, SdkUpdateSettingsResponse, SdkUpdateEventOccurrenceRequest, SdkUpsertBlockResponse, SdkUpsertEntryResponse, SdkUpsertPageResponse, SdkUpsertEventCategoryResponse, SdkUpsertEventResponse, SdkUpsertFooterResponse, SdkUpsertFormResponse, SdkUpsertNavigationMenuResponse, SdkUpsertVenueResponse } from './sdkContracts';
11
11
  import type { FooterCompositionUpdateRequest } from './siteManagementEndpoints';
12
12
  import type { SdkEventUpsertBody } from './sdk-event-upsert';
13
13
  import type { SdkEntryPaginationQueryInput } from './schemas/sdk-entries';
@@ -472,13 +472,7 @@ export type SitePlatformAPIEndpoints = {
472
472
  contentType: string;
473
473
  identifier: string;
474
474
  }, SdkPublishOrUnpublishEntryResponse>;
475
- sdkUpdateSettings: APIEndpoint<{
476
- siteTitle?: string;
477
- homepageId?: string | null;
478
- seoDefaults?: SdkPullSettings['seoDefaults'];
479
- logoIdentifier?: string | null;
480
- faviconIdentifier?: string | null;
481
- }, {
475
+ sdkUpdateSettings: APIEndpoint<SdkUpdateSettingsInput, {
482
476
  siteId: string;
483
477
  }, SdkUpdateSettingsResponse>;
484
478
  sdkConfigureBookingVertical: APIEndpoint<SdkConfigureBookingVerticalRequest, {
@@ -14,7 +14,13 @@ export type SiteGeneralSettingsPayload = {
14
14
  * must not have its save rejected or blank the stored value.
15
15
  */
16
16
  siteDescription?: string | null;
17
+ /** The site logo, designed for light backgrounds. */
17
18
  logoAssetId: string | null;
19
+ /**
20
+ * Optional logo designed for dark backgrounds. Optional on the way in,
21
+ * where absent means unchanged.
22
+ */
23
+ logoDarkBackgroundAssetId?: string | null;
18
24
  /** Optional masthead image for the hosted booking storefront. */
19
25
  coverAssetId?: string | null;
20
26
  faviconAssetId: string | null;
@@ -86,15 +92,19 @@ export type SiteBusinessAddressPayload = {
86
92
  export type SiteBusinessAddressResponse = {
87
93
  businessAddress: BusinessAddress | null;
88
94
  };
95
+ export type SiteLayoutLogoPayload = {
96
+ assetId: string | null;
97
+ url: string | null;
98
+ alt: string | null;
99
+ width?: number | null;
100
+ height?: number | null;
101
+ };
89
102
  export type SiteLayoutResolvedPayload = SiteLayoutSettingsPayload & {
90
103
  banner: SiteBannerSettingsPayload;
91
- logo?: {
92
- assetId: string | null;
93
- url: string | null;
94
- alt: string | null;
95
- width?: number | null;
96
- height?: number | null;
97
- };
104
+ /** The site logo, designed for light backgrounds. */
105
+ logo?: SiteLayoutLogoPayload;
106
+ /** Optional logo designed for dark backgrounds; null or absent when unset. */
107
+ logoForDarkBackgrounds?: SiteLayoutLogoPayload | null;
98
108
  };
99
109
  export type SiteLayoutSettingsResponse = {
100
110
  settings: SiteLayoutSettingsPayload;
@@ -9,6 +9,7 @@ export interface MembershipState {
9
9
  status: SubscriptionRecord['status'];
10
10
  currentPeriodEnd: string;
11
11
  cancelAtPeriodEnd: boolean;
12
+ hasRecoverableSubscription: boolean;
12
13
  trialEndsAt?: string | null;
13
14
  entitlements: PlanEntitlements;
14
15
  }
@@ -22,6 +23,8 @@ export interface MembershipSummary {
22
23
  status: SubscriptionRecord['status'];
23
24
  currentPeriodEnd: string;
24
25
  cancelAtPeriodEnd: boolean;
26
+ /** Server-derived provider lifecycle signal; do not infer this from status. */
27
+ hasRecoverableSubscription: boolean;
25
28
  trialEndsAt?: string | null;
26
29
  }
27
30
  export type InvalidMembership = Readonly<{
@@ -46,6 +46,13 @@ export type FormState = {
46
46
  isSubmitting?: boolean;
47
47
  errors: Record<string, FieldError>;
48
48
  };
49
+ /** Array operations that preserve the identity of rows they don't touch. */
50
+ export type FieldArrayOperations = Readonly<{
51
+ append: (value: unknown) => void;
52
+ insert: (index: number, value: unknown) => void;
53
+ move: (from: number, to: number) => void;
54
+ remove: (index: number) => void;
55
+ }>;
49
56
  /**
50
57
  * Unified form backend interface.
51
58
  * Factory functions (createRHFBackend, createStoreBackend) return this interface.
@@ -97,6 +104,13 @@ export interface FormBackend {
97
104
  /** Insert item at index */
98
105
  insert: (path: string, index: number, value: unknown) => void;
99
106
  };
107
+ /**
108
+ * React Hook Form backend only. A mounted repeater registers its
109
+ * `useFieldArray` operations for a path, and `arrayField` uses them for that
110
+ * path so existing rows keep their ids (and their open state). Returns a
111
+ * function that unregisters them.
112
+ */
113
+ registerFieldArray?: (path: string, operations: FieldArrayOperations) => () => void;
100
114
  /** Get form-level state */
101
115
  formState: FormState;
102
116
  /** Reset entire form (optionally with new values) */
@@ -8,6 +8,7 @@ export { BlockContextProvider, useBlockContext } from '../context';
8
8
  export { DisplayLabelResolverProvider, useDisplayLabelResolvers, } from '../context';
9
9
  export { FieldPreviewResolverProvider, useFieldPreviewResolvers, } from '../context';
10
10
  export { ImageResolveContextProvider, useImageResolveContextOptional, } from '../context';
11
+ export { RepeaterHostActionsProvider, useRepeaterHostActions, } from '../context';
11
12
  export { FieldFrame, FieldFrameMessage } from '../widgets/FieldFrame';
12
13
  export { WidgetField, WidgetFieldMessage } from '../widgets/Field';
13
14
  export { SelectField } from '../widgets/SelectField';
@@ -0,0 +1,30 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * Actions a host screen can take over for a specific repeater.
4
+ *
5
+ * Block-form stays generic: it doesn't know what a "field preset" or a
6
+ * form's naming rules are. A host that does can register actions for a
7
+ * repeater path, and the repeater asks instead of acting. With nothing
8
+ * registered, a repeater behaves exactly as it always has.
9
+ */
10
+ export type RepeaterHostActions = Readonly<{
11
+ /**
12
+ * The host decides what to add at `position` (and adds it). While this is
13
+ * registered the repeater shows an insert divider between items, and its
14
+ * add button calls this instead of appending a blank item.
15
+ */
16
+ requestAdd?: (position: number) => void;
17
+ /** The host duplicates the item at `index`, following its own rules. */
18
+ requestDuplicate?: (index: number) => void;
19
+ /** Label for the add button and insert dividers' noun, e.g. "field". */
20
+ addLabel?: string;
21
+ /** Shown instead of the list and add button while the repeater is empty. */
22
+ emptyState?: ReactNode;
23
+ }>;
24
+ /** Host actions keyed by repeater path, e.g. `{ fields: { requestAdd } }`. */
25
+ export type RepeaterHostActionsMap = Readonly<Record<string, RepeaterHostActions>>;
26
+ export declare function RepeaterHostActionsProvider({ actions, children, }: Readonly<{
27
+ actions: RepeaterHostActionsMap;
28
+ children: ReactNode;
29
+ }>): import("react").JSX.Element;
30
+ export declare function useRepeaterHostActions(path: string): RepeaterHostActions;
@@ -2,3 +2,4 @@ export { BlockContextProvider, useBlockContext, type BlockContextValue, type Blo
2
2
  export { DisplayLabelResolverProvider, useDisplayLabelResolvers, type DisplayLabelResolver, type DisplayLabelResolverMap, type ResolverCallContext, } from './DisplayLabelResolverContext';
3
3
  export { FieldPreviewResolverProvider, useFieldPreviewResolvers, type FieldPreviewResolver, type FieldPreviewResolverMap, type FieldPreviewResolverCallContext, } from './FieldPreviewResolverContext';
4
4
  export { ImageResolveContextProvider, useImageResolveContextOptional, } from './ImageResolveContext';
5
+ export { RepeaterHostActionsProvider, useRepeaterHostActions, type RepeaterHostActions, type RepeaterHostActionsMap, } from './RepeaterHostActionsContext';
@@ -26,3 +26,4 @@ export type { DateParseResult, DatePickerPopoverProps, } from './widgets/DateFie
26
26
  export type { FieldSettingsModalProps } from './widgets/FieldSettingsModal';
27
27
  export type { SettingsModalProps, SettingsTab, SettingsTabId, } from './widgets/SettingsModal';
28
28
  export type { VisibilityValueReader } from './utils/evaluateVisibility';
29
+ export type { RepeaterHostActions, RepeaterHostActionsMap, } from './context/RepeaterHostActionsContext';
@@ -4,6 +4,7 @@
4
4
  import { type ReactNode, type RefObject } from 'react';
5
5
  import type { RepeaterFieldConfig, FieldConfig } from '../../../fields/types';
6
6
  import type { FormBackend } from '../../../backend/types';
7
+ import type { RepeaterHostActions } from '../../../context/RepeaterHostActionsContext';
7
8
  export interface RepeaterListProps {
8
9
  config: RepeaterFieldConfig;
9
10
  backend: FormBackend;
@@ -12,9 +13,11 @@ export interface RepeaterListProps {
12
13
  id: string;
13
14
  }>;
14
15
  minItems: number;
16
+ maxItems?: number;
15
17
  onMove: (from: number, to: number) => void;
16
18
  onRemove: (index: number) => void;
17
19
  renderChild: (field: FieldConfig, path: string) => ReactNode;
18
20
  focusFallbackRef?: RefObject<HTMLButtonElement | null>;
21
+ hostActions?: RepeaterHostActions;
19
22
  }
20
- export declare function RepeaterList({ config, backend, basePath, items, minItems, onMove, onRemove, renderChild, focusFallbackRef, }: RepeaterListProps): ReactNode;
23
+ export declare function RepeaterList({ config, backend, basePath, items, minItems, maxItems, onMove, onRemove, renderChild, focusFallbackRef, hostActions, }: RepeaterListProps): ReactNode;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Repeater row - sortable item with disclosure
2
+ * Repeater row - sortable item on the shared editor item card
3
3
  * Handles drag-drop, disclosure state, and coordinates child rendering
4
4
  *
5
5
  * Routes non-content item fields into a settings modal in the row header.
@@ -16,11 +16,14 @@ export interface RepeaterRowProps {
16
16
  basePath: string;
17
17
  itemsLength: number;
18
18
  minItems: number;
19
+ maxItems?: number;
19
20
  containerWidth: number;
20
21
  onMove: (from: number, to: number, focusTarget: RepeaterRowActionFocusTarget) => void;
21
22
  onRemove: (index: number) => void;
23
+ /** Offers "Duplicate item" when provided. */
24
+ onDuplicate?: (index: number) => void;
22
25
  renderChild: (field: FieldConfig, path: string) => ReactNode;
23
26
  canDrag: boolean;
24
27
  actionControlRefs?: Partial<Record<RepeaterRowActionFocusTarget, Ref<HTMLButtonElement>>>;
25
28
  }
26
- export declare function RepeaterRow({ id, index, config, backend, basePath, itemsLength, minItems, containerWidth, onMove, onRemove, renderChild, canDrag, actionControlRefs, }: RepeaterRowProps): ReactNode;
29
+ export declare function RepeaterRow({ id, index, config, backend, basePath, itemsLength, minItems, maxItems, containerWidth, onMove, onRemove, onDuplicate, renderChild, canDrag, actionControlRefs, }: RepeaterRowProps): ReactNode;
@@ -2,20 +2,30 @@
2
2
  * Repeater row action controls - direct reorder buttons plus compact menu.
3
3
  */
4
4
  import type { ReactNode, Ref } from 'react';
5
+ import { type EditorItemCardActionsProps } from '../../../../../ui/src/index';
5
6
  export interface RepeaterRowActionsProps {
6
7
  index: number;
7
8
  itemsLength: number;
8
9
  minItems: number;
10
+ maxItems?: number;
9
11
  containerWidth?: number;
10
12
  actionPresentation?: 'auto' | 'wide' | 'compact';
11
13
  itemLabel: string;
12
14
  onMoveUp: () => void;
13
15
  onMoveDown: () => void;
14
16
  onRemove: () => void;
17
+ /** Offers "Duplicate item" when provided. */
18
+ onDuplicate?: () => void;
15
19
  actionControlRefs?: Partial<Record<RepeaterRowActionFocusTarget, Ref<HTMLButtonElement>>>;
16
20
  showReorderActions?: boolean;
17
21
  disableMoveUp?: boolean;
18
22
  disableMoveDown?: boolean;
19
23
  }
20
24
  export type RepeaterRowActionFocusTarget = 'moveEarlier' | 'moveLater' | 'menu';
21
- export declare function RepeaterRowActions({ index, itemsLength, minItems, containerWidth, actionPresentation, itemLabel, onMoveUp, onMoveDown, onRemove, actionControlRefs, showReorderActions, disableMoveUp, disableMoveDown, }: RepeaterRowActionsProps): ReactNode;
25
+ /**
26
+ * The repeater's row actions, as props for the shared editor item card.
27
+ * Availability, compact collapsing and focus refs stay here with the
28
+ * repeater; the card only draws them.
29
+ */
30
+ export declare function buildRepeaterRowActions({ index, itemsLength, minItems, maxItems, containerWidth, actionPresentation, itemLabel, onMoveUp, onMoveDown, onRemove, onDuplicate, actionControlRefs, showReorderActions, disableMoveUp, disableMoveDown, }: RepeaterRowActionsProps): EditorItemCardActionsProps;
31
+ export declare function RepeaterRowActions(props: RepeaterRowActionsProps): ReactNode;
@@ -4,3 +4,4 @@ export { useResolvedItemLabel, useResolvedRepeaterItemLabel, type ResolvedRepeat
4
4
  export { useLayoutGridCapacity } from './useLayoutGridCapacity';
5
5
  export { useLinearRepeaterDnd, type LinearRepeaterSortingStrategyKind } from './useLinearRepeaterDnd';
6
6
  export { useRepeaterPointerDragCapability } from './useRepeaterPointerDragCapability';
7
+ export { useEmptyStateFocusAfterRemoval } from './useEmptyStateFocusAfterRemoval';
@@ -0,0 +1,8 @@
1
+ import { type RefObject } from 'react';
2
+ /**
3
+ * When removing the last item swaps the list for a host's empty state, the
4
+ * removed row's controls are gone and focus would fall to the page. Move it to
5
+ * the empty state's first action instead — but only after a removal, never
6
+ * when a repeater simply starts out empty.
7
+ */
8
+ export declare function useEmptyStateFocusAfterRemoval(itemCount: number, showEmptyState: boolean): RefObject<HTMLDivElement | null>;
@@ -2,7 +2,21 @@
2
2
  * Build a summary preview text for a repeater item
3
3
  * Shows first 2 non-hidden, non-label-source field values
4
4
  */
5
- import type { RepeaterFieldConfig } from '../../../fields/types';
5
+ import type { RepeaterFieldConfig, FieldConfig } from '../../../fields/types';
6
6
  import type { FormBackend } from '../../../backend/types';
7
7
  export declare const DEFAULT_REPEATER_SUMMARY_MAX_CHARS = 96;
8
+ type SummaryPartOptions = Readonly<{
9
+ /** True when the repeater named this field in `summaryFields`. */
10
+ explicitlyListed: boolean;
11
+ }>;
12
+ /**
13
+ * The summary text for one field's value, resolved by the field's type:
14
+ * select values become their option labels (a value missing from the
15
+ * select's own options is omitted rather than shown as an internal key), and
16
+ * a boolean contributes its own label when true
17
+ * — but only when the repeater asked for it, so checkboxes don't start
18
+ * appearing in summaries that never had them.
19
+ */
20
+ export declare function resolveSummaryPart(field: FieldConfig, value: unknown, options: SummaryPartOptions): string | null;
8
21
  export declare function buildSummary(field: RepeaterFieldConfig, index: number, backend: FormBackend, basePath: string): string;
22
+ export {};
@@ -1,10 +1,10 @@
1
1
  export declare const REPEATER_ROW_COMPACT_ACTIONS_WIDTH = 640;
2
- export type RepeaterRowActionId = 'moveEarlier' | 'moveLater' | 'delete';
2
+ export type RepeaterRowActionId = 'moveEarlier' | 'moveLater' | 'duplicate' | 'delete';
3
3
  export type RepeaterRowActionAvailability = {
4
4
  kind: 'enabled';
5
5
  } | {
6
6
  kind: 'disabled';
7
- reason: 'first-item' | 'last-item' | 'minimum-items' | 'unavailable';
7
+ reason: 'first-item' | 'last-item' | 'minimum-items' | 'maximum-items' | 'unavailable';
8
8
  };
9
9
  export type RepeaterRowMenuAction = {
10
10
  id: RepeaterRowActionId;
@@ -32,6 +32,9 @@ export type RepeaterRowActionPresentationInput = {
32
32
  index: number;
33
33
  itemsLength: number;
34
34
  minItems: number;
35
+ /** Present when duplicating is offered; duplicates count towards it. */
36
+ maxItems?: number;
37
+ canDuplicate?: boolean;
35
38
  actionPresentation?: 'auto' | 'wide' | 'compact';
36
39
  };
37
40
  export type RepeaterRowActionRenderPlanInput = RepeaterRowActionPresentationInput & {