@riverbankcms/sdk 0.143.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 (161) hide show
  1. package/dist/{PreviewEditorSidebar-DROGfMKi.mjs → PreviewEditorSidebar-CQZNnFiM.mjs} +19 -25
  2. package/dist/{PreviewEditorUI-BaRjhFu-.mjs → PreviewEditorUI-DCNxnmI0.mjs} +2 -2
  3. package/dist/{SdkPreviewModeRuntime-OIABYLES.mjs → SdkPreviewModeRuntime-BJolUbr1.mjs} +15 -6
  4. package/dist/{SiteChromeCustomizeContext-ohjTvZbc.mjs → SiteChromeCustomizeContext-CKgEpoxi.mjs} +1915 -1463
  5. package/dist/_dts/api/src/billing.d.ts +1 -1
  6. package/dist/_dts/api/src/billingEndpointTypes.d.ts +8 -2
  7. package/dist/_dts/api/src/bookingConfig.d.ts +3 -1
  8. package/dist/_dts/api/src/index.d.ts +1 -1
  9. package/dist/_dts/api/src/navigation/dashboardBookingsNav.d.ts +4 -4
  10. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +1 -0
  11. package/dist/_dts/api/src/sdkContracts.d.ts +1 -1
  12. package/dist/_dts/api/src/sdkSettingsContracts.d.ts +8 -0
  13. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +2 -8
  14. package/dist/_dts/api/src/siteSettings.d.ts +17 -7
  15. package/dist/_dts/billing/src/membership/index.d.ts +3 -0
  16. package/dist/_dts/block-form/src/backend/types.d.ts +14 -0
  17. package/dist/_dts/block-form/src/client/index.d.ts +1 -0
  18. package/dist/_dts/block-form/src/context/RepeaterHostActionsContext.d.ts +30 -0
  19. package/dist/_dts/block-form/src/context/index.d.ts +1 -0
  20. package/dist/_dts/block-form/src/index.d.ts +1 -0
  21. package/dist/_dts/block-form/src/widgets/RepeaterField/components/RepeaterList.d.ts +4 -1
  22. package/dist/_dts/block-form/src/widgets/RepeaterField/components/RepeaterRow.d.ts +5 -2
  23. package/dist/_dts/block-form/src/widgets/RepeaterField/components/RepeaterRowActions.d.ts +11 -1
  24. package/dist/_dts/block-form/src/widgets/RepeaterField/hooks/index.d.ts +1 -0
  25. package/dist/_dts/block-form/src/widgets/RepeaterField/hooks/useEmptyStateFocusAfterRemoval.d.ts +8 -0
  26. package/dist/_dts/block-form/src/widgets/RepeaterField/utils/buildSummary.d.ts +15 -1
  27. package/dist/_dts/block-form/src/widgets/RepeaterField/utils/repeaterRowActionsDomain.d.ts +5 -2
  28. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +34 -10
  29. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +3 -0
  30. package/dist/_dts/blocks/src/system/constants/events.d.ts +10 -0
  31. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +5 -0
  32. package/dist/_dts/blocks/src/system/runtime/api/context.d.ts +3 -3
  33. package/dist/_dts/blocks/src/system/runtime/api/endpoints.d.ts +10 -0
  34. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +3 -2
  35. package/dist/_dts/blocks/src/system/runtime/api/readAuthority.d.ts +11 -0
  36. package/dist/_dts/blocks/src/system/runtime/api/types/core.d.ts +9 -0
  37. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +7 -13
  38. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +3 -6
  39. package/dist/_dts/blocks/src/system/runtime/hooks/useCalendarEvents.d.ts +9 -4
  40. package/dist/_dts/blocks/src/system/runtime/hooks/useCalendarEvents.state.d.ts +0 -1
  41. package/dist/_dts/blocks/src/system/runtime/hooks/useEventPagination.d.ts +1 -3
  42. package/dist/_dts/blocks/src/system/runtime/nodes/basic.d.ts +7 -24
  43. package/dist/_dts/blocks/src/system/runtime/nodes/cart.server.d.ts +1 -0
  44. package/dist/_dts/blocks/src/system/runtime/nodes/checkout.server.d.ts +1 -0
  45. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationBookingLayer.d.ts +2 -1
  46. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationSurface.d.ts +2 -1
  47. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizardActions.d.ts +2 -1
  48. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +2 -0
  49. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.override.d.ts +2 -1
  50. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +2 -2
  51. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +8 -0
  52. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCalendar.interactive.d.ts +4 -5
  53. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +7 -2
  54. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +7 -5
  55. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +5 -6
  56. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +3 -1
  57. package/dist/_dts/blocks/src/system/runtime/nodes/header-control.d.ts +10 -0
  58. package/dist/_dts/blocks/src/system/runtime/nodes/layout.d.ts +6 -21
  59. package/dist/_dts/blocks/src/system/runtime/nodes/product-detail.server.d.ts +1 -0
  60. package/dist/_dts/blocks/src/system/runtime/nodes/product-list.server.d.ts +1 -0
  61. package/dist/_dts/blocks/src/system/runtime/nodes/shop.interactive.d.ts +13 -0
  62. package/dist/_dts/blocks/src/system/runtime/nodes/shop.server.d.ts +1 -0
  63. package/dist/_dts/blocks/src/system/runtime/shared/components/ThemedButton.d.ts +58 -0
  64. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +2 -0
  65. package/dist/_dts/blocks/src/system/transforms/registry/chromeLogo.d.ts +23 -0
  66. package/dist/_dts/blocks/src/system/transforms/registry/index.d.ts +2 -1
  67. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +3 -1
  68. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +4 -1
  69. package/dist/_dts/core/src/event-catalogue.d.ts +27 -0
  70. package/dist/_dts/core/src/event-preset-vocabulary.d.ts +7 -0
  71. package/dist/_dts/core/src/index.d.ts +2 -0
  72. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +13 -0
  73. package/dist/_dts/db/src/schemas/forms.d.ts +286 -2
  74. package/dist/_dts/editor-blocks/src/block-editor/{BlockCardHeader.d.ts → BlockCardFrame.d.ts} +11 -3
  75. package/dist/_dts/logger/src/console.d.ts +3 -0
  76. package/dist/_dts/sdk/src/client/publicEventReadOperations.d.ts +1 -0
  77. package/dist/_dts/sdk/src/client/types.d.ts +3 -0
  78. package/dist/_dts/sdk/src/navigation/index.d.ts +27 -0
  79. package/dist/_dts/sdk/src/public-api/contracts.d.ts +15 -7
  80. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +1 -0
  81. package/dist/_dts/sdk/src/rendering/client.d.ts +1 -0
  82. package/dist/_dts/sdk/src/rendering/components/Block.shared.d.ts +1 -0
  83. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +7 -1
  84. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +2 -0
  85. package/dist/_dts/sdk/src/rendering/islands/enhancers/routeIslandApiConfig.d.ts +3 -2
  86. package/dist/_dts/sdk/src/rendering/islands/enhancers/shopShared.d.ts +2 -0
  87. package/dist/_dts/sdk/src/rendering/overrides.d.ts +1 -0
  88. package/dist/_dts/sdk/src/version.d.ts +1 -1
  89. package/dist/_dts/theme-core/src/buttons/affordanceSuppression.d.ts +1 -1
  90. package/dist/_dts/theme-core/src/buttons/classNames.d.ts +3 -13
  91. package/dist/_dts/theme-core/src/customCss/index.d.ts +1 -1
  92. package/dist/_dts/theme-core/src/customCss/patch.d.ts +0 -5
  93. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  94. package/dist/_dts/theme-core/src/surfaces/index.d.ts +1 -0
  95. package/dist/_dts/theme-core/src/surfaces/logoVariant.d.ts +26 -0
  96. package/dist/_dts/theme-core/src/utils/colorStyles.d.ts +10 -0
  97. package/dist/_dts/ui/src/editor-item-card.d.ts +116 -0
  98. package/dist/_dts/ui/src/index.d.ts +1 -0
  99. package/dist/client/{BookingConsentAgreement-BoCtvzzu.mjs → BookingConsentAgreement-DoAILrkN.mjs} +4 -55
  100. package/dist/client/{DiscountCodeDisclosure-B5S30nZk.mjs → DiscountCodeDisclosure-X528hUTf.mjs} +27 -17
  101. package/dist/client/{EventCombined.client-CeZ2-zSt.mjs → EventCombined.client-DSBVwq5m.mjs} +54 -46
  102. package/dist/client/{EventListing.client-DJN3j8B3.mjs → EventListing.client-DmFAX7Vb.mjs} +3 -4
  103. package/dist/client/{LeafletStaticMap-RjtGzDQT.mjs → LeafletStaticMap-BAqXdfhq.mjs} +1 -1
  104. package/dist/client/ThemedButton-BwNFVwi4.mjs +412 -0
  105. package/dist/client/{accordion-DOmnDoyg.mjs → accordion-DRhMdkbd.mjs} +1 -1
  106. package/dist/client/{bookingForm-C0vk7pgS.mjs → bookingForm-iJ_nCsNF.mjs} +26 -32
  107. package/dist/client/bookings.mjs +201 -118
  108. package/dist/client/{carousel-BZJ7pno3.mjs → carousel-D8zuffZr.mjs} +2 -2
  109. package/dist/client/{carousel.client-DQTjCVQT.mjs → carousel.client-jahpU9Vz.mjs} +1 -1
  110. package/dist/client/{cart-CaeVAHJl.mjs → cart-DeMGJViN.mjs} +3 -3
  111. package/dist/client/{checkout-7wmoNDtG.mjs → checkout-DXc06Km2.mjs} +3 -3
  112. package/dist/client/{checkoutUrls-FL6lRkrt.mjs → checkoutUrls-CW3-78uu.mjs} +1 -1
  113. package/dist/client/client.mjs +2271 -1983
  114. package/dist/client/{colorStyles-3013aRAY.mjs → colorStyles-CuJBiS-1.mjs} +16 -4
  115. package/dist/client/{context-BOimxE3U.mjs → context-CDLCfDep.mjs} +24 -8
  116. package/dist/client/{dates-BnzVksi4.mjs → dates-ClFx7Epy.mjs} +2 -2
  117. package/dist/client/{eventCalendar-l-fpaslC.mjs → eventCalendar-BaGpnOGN.mjs} +39 -50
  118. package/dist/client/{eventCombined-DGGvssK6.mjs → eventCombined-ywONOx2m.mjs} +5 -4
  119. package/dist/client/{eventDetails-DRiCm_hL.mjs → eventDetails-B2LlOTYY.mjs} +4 -4
  120. package/dist/client/{eventListing-dph8loYX.mjs → eventListing-CMgxWpqP.mjs} +5 -4
  121. package/dist/client/{eventRegistration-ClBohmbY.mjs → eventRegistration-BarLDNHR.mjs} +83 -68
  122. package/dist/client/{form-BLVVAnd3.mjs → form-BjqKaBJ7.mjs} +9 -10
  123. package/dist/client/{headerSection-DHy4C8Ix.mjs → headerSection-CP4XDwz1.mjs} +23 -30
  124. package/dist/client/hooks.mjs +257 -63
  125. package/dist/client/{locationMap-6HuS28ck.mjs → locationMap-C5gW-d-w.mjs} +9 -10
  126. package/dist/client/{media-DHpfFwd3.mjs → media-BtJ37tzS.mjs} +1 -1
  127. package/dist/client/{newsletterForm-xOdcOhZP.mjs → newsletterForm-afXlVSA0.mjs} +8 -9
  128. package/dist/client/{pricing-ChinRYFt.mjs → pricing-Bl1CAl28.mjs} +1 -1
  129. package/dist/client/{productDetail-0chA5gbK.mjs → productDetail-CvQ3jWQe.mjs} +3 -3
  130. package/dist/client/{productList-OoINA0h1.mjs → productList-U874PGO7.mjs} +3 -3
  131. package/dist/client/{propsDecoder-CIZ-hbIG.mjs → propsDecoder-DPXtCZWP.mjs} +87 -29
  132. package/dist/client/rendering/client.mjs +1891 -1740
  133. package/dist/client/rendering/islands.mjs +19 -19
  134. package/dist/client/rendering.mjs +2225 -1913
  135. package/dist/client/{routeIslandApiConfig-UNsfPcYq.mjs → routeIslandApiConfig-NGYiUWXu.mjs} +8 -1
  136. package/dist/client/{scrollToBlock-BPZl0gPZ.mjs → scrollToBlock-0-C3DVhK.mjs} +1 -1
  137. package/dist/client/{shop-CLJFqNIq.mjs → shop-BXjXhM9P.mjs} +45 -58
  138. package/dist/client/{shop-commerce-PpANg5wB.mjs → shop-commerce-BZ6UlWJ7.mjs} +42 -55
  139. package/dist/client/{shop-commerce-store-TA_Kz2ku.mjs → shop-commerce-store-DlSBXb3D.mjs} +1 -1
  140. package/dist/client/{shopShared-DzcFcA5g.mjs → shopShared-kkEOiLPA.mjs} +6 -5
  141. package/dist/client/{useEventFilters-CFU21QZo.mjs → useEventFilters-zvnnE1ro.mjs} +66 -355
  142. package/dist/preview-next/client/runtime.mjs +3 -3
  143. package/dist/preview-next/editor-chrome.css +8 -0
  144. package/dist/{sdk-runtime-CDKl0Fr7.mjs → sdk-runtime-DFJlQt3q.mjs} +1 -1
  145. package/dist/{separator-BTp96X32.mjs → separator-o8GHb1xh.mjs} +1 -1
  146. package/dist/server/components.mjs +828 -623
  147. package/dist/server/config-validation.mjs +257 -63
  148. package/dist/server/config.mjs +257 -63
  149. package/dist/server/data.mjs +257 -63
  150. package/dist/server/index.mjs +9 -5
  151. package/dist/server/navigation.mjs +28 -1
  152. package/dist/server/next.mjs +14129 -13947
  153. package/dist/server/page-converter.mjs +110 -59
  154. package/dist/server/prebuild.mjs +1 -1
  155. package/dist/server/rendering/server.mjs +832 -624
  156. package/dist/server/rendering.mjs +830 -624
  157. package/dist/server/routing.mjs +294 -69
  158. package/dist/server/server.mjs +266 -68
  159. package/dist/server/theme-bridge.mjs +40 -1
  160. package/dist/styles/index.css +6 -0
  161. package/package.json +1 -1
@@ -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;
@@ -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[];
@@ -61,6 +61,7 @@ export type PublicEventAPIEndpoints = {
61
61
  }>;
62
62
  resolveEventSubroute: APIEndpoint<never, {
63
63
  siteId: string;
64
+ stage?: 'published' | 'preview';
64
65
  kind: 'event-occurrence' | 'event-run';
65
66
  subjectKind: 'eventOffering' | 'eventSeries';
66
67
  subjectId: 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 & {