@riverbankcms/sdk 0.144.0 → 0.145.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 (162) hide show
  1. package/dist/{PreviewEditorSidebar-CQZNnFiM.mjs → PreviewEditorSidebar-O-V6Pl5a.mjs} +4 -4
  2. package/dist/{PreviewEditorUI-DCNxnmI0.mjs → PreviewEditorUI-1UlX_9cw.mjs} +3 -3
  3. package/dist/{PreviewQueryProvider-BCYICImX.mjs → PreviewQueryProvider-BxGwdOCV.mjs} +1 -1
  4. package/dist/{SdkPreviewModeRuntime-BJolUbr1.mjs → SdkPreviewModeRuntime-DYbA_4iv.mjs} +419 -348
  5. package/dist/{SiteChromeCustomizeContext-CKgEpoxi.mjs → SiteChromeCustomizeContext-CNTKQ9nx.mjs} +2081 -1313
  6. package/dist/_dts/ai/src/contracts/proposals.d.ts +4719 -66
  7. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +429 -6
  8. package/dist/_dts/api/src/appointmentEndpointDefinitions.d.ts +49 -0
  9. package/dist/_dts/api/src/appointmentServiceCategoryEndpoints.d.ts +75 -0
  10. package/dist/_dts/api/src/appointmentServiceContracts.d.ts +80 -0
  11. package/dist/_dts/api/src/appointmentSetup.d.ts +8 -1
  12. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +2 -12
  13. package/dist/_dts/api/src/communications.d.ts +14 -22
  14. package/dist/_dts/api/src/contentRuntime.d.ts +2 -0
  15. package/dist/_dts/api/src/endpoints.d.ts +105 -58
  16. package/dist/_dts/api/src/indexExtendedTypes.d.ts +1 -1
  17. package/dist/_dts/api/src/launchReadiness.d.ts +2 -0
  18. package/dist/_dts/api/src/newsletterEndpointDefinitions.d.ts +0 -23
  19. package/dist/_dts/api/src/onboarding/confirmationResend.d.ts +3 -0
  20. package/dist/_dts/api/src/publicBookingService.d.ts +35 -1
  21. package/dist/_dts/api/src/publicExperience/newsletterEndpoints.d.ts +13 -0
  22. package/dist/_dts/api/src/publicNewsletterEndpointDefinitions.d.ts +58 -0
  23. package/dist/_dts/api/src/schemas/admin-observability-logs.d.ts +3 -3
  24. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +2 -6
  25. package/dist/_dts/api/src/types.d.ts +2 -1
  26. package/dist/_dts/blocks/src/PageRenderer.d.ts +4 -4
  27. package/dist/_dts/blocks/src/bindings/index.d.ts +2 -2
  28. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +24 -0
  29. package/dist/_dts/blocks/src/index.d.ts +1 -1
  30. package/dist/_dts/blocks/src/pageRenderJoins.d.ts +68 -0
  31. package/dist/_dts/blocks/src/pageRenderPlan.d.ts +8 -27
  32. package/dist/_dts/blocks/src/pageRenderPreparation.d.ts +7 -4
  33. package/dist/_dts/blocks/src/pageRendererBoundaries.d.ts +40 -23
  34. package/dist/_dts/blocks/src/server.d.ts +1 -1
  35. package/dist/_dts/blocks/src/system/blocks/appointment-services.d.ts +2 -0
  36. package/dist/_dts/blocks/src/system/blocks/events/eventSelectionFields.d.ts +2 -2
  37. package/dist/_dts/blocks/src/system/blocks/events/shared/calendarWindow.d.ts +1 -1
  38. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +2 -2
  39. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +47 -47
  40. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +29 -3
  41. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.d.ts +8 -1
  42. package/dist/_dts/blocks/src/system/runtime/nodes/appointment-services.d.ts +22 -2
  43. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +3 -1
  44. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.interactive.d.ts +57 -2
  45. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.service-categories.d.ts +29 -0
  46. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.service-choices.d.ts +13 -0
  47. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.state.d.ts +3 -3
  48. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +13 -1
  49. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.d.ts +1 -1
  50. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +3 -3
  51. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.submission.d.ts +20 -1
  52. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +2 -0
  53. package/dist/_dts/content-model/src/content-types/schema.d.ts +1 -1
  54. package/dist/_dts/core/src/appointment-service-categories.d.ts +108 -0
  55. package/dist/_dts/core/src/editor-state.d.ts +6 -0
  56. package/dist/_dts/core/src/index.d.ts +1 -0
  57. package/dist/_dts/core/src/public-profile.d.ts +9 -0
  58. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +663 -241
  59. package/dist/_dts/editor-blocks/src/block-editor/types.d.ts +6 -0
  60. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/loaders.d.ts +16 -1
  61. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/types.d.ts +13 -0
  62. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/utils.d.ts +29 -0
  63. package/dist/_dts/preview-next/src/client/blocks/BoundaryControl.d.ts +7 -2
  64. package/dist/_dts/preview-next/src/client/blocks/composer/mergeDrafts.d.ts +1 -1
  65. package/dist/_dts/preview-next/src/client/blocks/composer/types.d.ts +1 -0
  66. package/dist/_dts/preview-next/src/client/blocks/previewProjection/applyPreviewProjections.d.ts +1 -3
  67. package/dist/_dts/preview-next/src/client/blocks/previewProjection/runtimeContentDecoration.d.ts +2 -2
  68. package/dist/_dts/preview-next/src/client/blocks/previewProjection/types.d.ts +2 -2
  69. package/dist/_dts/preview-next/src/client/preview/PreviewEntryControllerProvider.d.ts +1 -0
  70. package/dist/_dts/sdk/src/client/runtimeCacheKeys.d.ts +8 -0
  71. package/dist/_dts/sdk/src/client/types.d.ts +1 -1
  72. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  73. package/dist/_dts/sdk/src/contracts/page.d.ts +7 -2
  74. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +5 -0
  75. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +2 -2
  76. package/dist/_dts/sdk/src/public-api/contracts.d.ts +6 -8
  77. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -2
  78. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +2 -2
  79. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +1 -1
  80. package/dist/_dts/sdk/src/rendering/hooks/useContent.d.ts +1 -1
  81. package/dist/_dts/sdk/src/version.d.ts +1 -1
  82. package/dist/_dts/surfaces/src/index.d.ts +1 -0
  83. package/dist/_dts/theme-core/src/layout/boundaryCss.d.ts +3 -0
  84. package/dist/_dts/theme-core/src/site-styles/compositionBudget.d.ts +8 -0
  85. package/dist/_dts/theme-core/src/site-styles/contentTemplateRuntimeCompiler.d.ts +3 -2
  86. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +1 -3
  87. package/dist/_dts/theme-core/src/site-styles/generatedDesignPipeline.d.ts +3 -0
  88. package/dist/_dts/theme-core/src/site-styles/index.d.ts +3 -0
  89. package/dist/_dts/theme-core/src/site-styles/joinTreatment.d.ts +132 -0
  90. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorBoundaries.d.ts +31 -0
  91. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +33 -29
  92. package/dist/_dts/theme-core/src/site-styles/pageDesignIntent.d.ts +4 -4
  93. package/dist/_dts/theme-core/src/site-styles/pageFlowPresets.d.ts +36 -0
  94. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +4 -10
  95. package/dist/_dts/theme-core/src/site-styles/rawStyleFields.d.ts +17 -4
  96. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +20 -74
  97. package/dist/_dts/theme-core/src/site-styles/sectionBoundaryComposition.d.ts +95 -0
  98. package/dist/_dts/theme-core/src/site-styles/sectionTransitions.d.ts +80 -518
  99. package/dist/_dts/theme-core/src/site-styles/siteStyleBlockPolicies.d.ts +9 -4
  100. package/dist/_dts/theme-core/src/site-styles/transitionCatalogue.d.ts +320 -0
  101. package/dist/_dts/theme-core/src/site-styles/types.d.ts +3 -18
  102. package/dist/client/{BookingConsentAgreement-DoAILrkN.mjs → BookingConsentAgreement-DlVOmpW4.mjs} +2 -2
  103. package/dist/client/{DiscountCodeDisclosure-X528hUTf.mjs → DiscountCodeDisclosure-T9q623PQ.mjs} +1 -1
  104. package/dist/client/{EventCombined.client-DSBVwq5m.mjs → EventCombined.client-DnsUeONl.mjs} +6 -6
  105. package/dist/client/{EventListing.client-DmFAX7Vb.mjs → EventListing.client-CNBFqJS4.mjs} +2 -2
  106. package/dist/client/{LeafletStaticMap-BAqXdfhq.mjs → LeafletStaticMap-C7higg52.mjs} +1 -1
  107. package/dist/client/{ThemedButton-BwNFVwi4.mjs → ThemedButton-LAJTNrS8.mjs} +1 -1
  108. package/dist/client/{accordion-DRhMdkbd.mjs → accordion-BcNF9TjX.mjs} +1 -1
  109. package/dist/client/{bookingForm-iJ_nCsNF.mjs → bookingForm-BUaQ3S03.mjs} +142 -50
  110. package/dist/client/bookings.mjs +191 -64
  111. package/dist/client/{carousel-D8zuffZr.mjs → carousel-CTdF6e0V.mjs} +1 -1
  112. package/dist/client/{cart-DeMGJViN.mjs → cart-pGtyf_XU.mjs} +3 -3
  113. package/dist/client/{checkout-DXc06Km2.mjs → checkout-Da9WSn7Y.mjs} +3 -3
  114. package/dist/client/client.mjs +1630 -816
  115. package/dist/client/{context-CDLCfDep.mjs → context-BFeY_Wbm.mjs} +1 -1
  116. package/dist/client/{dates-ClFx7Epy.mjs → dates-BhwVSxDg.mjs} +2 -2
  117. package/dist/client/{eventCalendar-BaGpnOGN.mjs → eventCalendar-BAtdnR4s.mjs} +9 -9
  118. package/dist/client/{eventCombined-ywONOx2m.mjs → eventCombined-RksA3tRC.mjs} +4 -4
  119. package/dist/client/{eventDetails-B2LlOTYY.mjs → eventDetails-BB9hB4wR.mjs} +4 -4
  120. package/dist/client/{eventListing-CMgxWpqP.mjs → eventListing-BpJBkviM.mjs} +4 -4
  121. package/dist/client/{eventRegistration-BarLDNHR.mjs → eventRegistration-B18jFq_o.mjs} +8 -8
  122. package/dist/client/{form-BjqKaBJ7.mjs → form-Dodt8Y8t.mjs} +3 -3
  123. package/dist/client/{headerSection-CP4XDwz1.mjs → headerSection-B0qj9ttg.mjs} +3 -3
  124. package/dist/client/hooks.mjs +550 -99
  125. package/dist/client/{locationMap-C5gW-d-w.mjs → locationMap-gn-iMk7a.mjs} +3 -3
  126. package/dist/client/{newsletterForm-afXlVSA0.mjs → newsletterForm-oByLdFkr.mjs} +26 -5
  127. package/dist/client/{pricing-Bl1CAl28.mjs → pricing-BOU0_Hai.mjs} +1 -1
  128. package/dist/client/{productDetail-CvQ3jWQe.mjs → productDetail-D9v1zH2j.mjs} +3 -3
  129. package/dist/client/{productList-U874PGO7.mjs → productList-D-mItx1n.mjs} +3 -3
  130. package/dist/client/{propsDecoder-DPXtCZWP.mjs → propsDecoder-C3TP_z4x.mjs} +72 -33
  131. package/dist/client/rendering/client.mjs +900 -266
  132. package/dist/client/rendering/islands.mjs +17 -17
  133. package/dist/client/rendering.mjs +1637 -788
  134. package/dist/client/{routeIslandApiConfig-NGYiUWXu.mjs → routeIslandApiConfig-DzN1W0sq.mjs} +1 -1
  135. package/dist/client/{scrollToBlock-0-C3DVhK.mjs → scrollToBlock-CWs8EIdo.mjs} +1 -1
  136. package/dist/client/{shop-BXjXhM9P.mjs → shop-Dufw7N7o.mjs} +7 -7
  137. package/dist/client/{shop-commerce-BZ6UlWJ7.mjs → shop-commerce-gklw_hLF.mjs} +6 -6
  138. package/dist/client/{shop-commerce-store-DlSBXb3D.mjs → shop-commerce-store-Sf1eyTaZ.mjs} +1 -1
  139. package/dist/client/{shopShared-kkEOiLPA.mjs → shopShared-B5nyA41S.mjs} +4 -4
  140. package/dist/client/{useEventFilters-zvnnE1ro.mjs → useEventFilters-CLL829vy.mjs} +6 -6
  141. package/dist/preview-next/before-render.mjs +147 -77
  142. package/dist/preview-next/client/runtime.mjs +4 -4
  143. package/dist/preview-next/keepAlive.mjs +147 -77
  144. package/dist/preview-next/middleware.mjs +147 -77
  145. package/dist/{previewAuthStore-JA6-I_sL.mjs → previewAuthStore-BxAFlu-j.mjs} +147 -77
  146. package/dist/{sdk-runtime-DFJlQt3q.mjs → sdk-runtime-D0uZFev7.mjs} +2 -2
  147. package/dist/{separator-o8GHb1xh.mjs → separator-EvdCAn4V.mjs} +1 -1
  148. package/dist/server/components.mjs +1727 -991
  149. package/dist/server/config-validation.mjs +537 -97
  150. package/dist/server/config.mjs +537 -97
  151. package/dist/server/data.mjs +549 -98
  152. package/dist/server/index.mjs +159 -81
  153. package/dist/server/next.mjs +1460 -748
  154. package/dist/server/page-converter.mjs +384 -54
  155. package/dist/server/prebuild.mjs +1 -1
  156. package/dist/server/rendering/server.mjs +1712 -973
  157. package/dist/server/rendering.mjs +1748 -1001
  158. package/dist/server/routing.mjs +624 -131
  159. package/dist/server/server.mjs +554 -138
  160. package/dist/server/theme-bridge.mjs +1192 -27
  161. package/dist/server/theme.mjs +6 -4
  162. package/package.json +2 -1
@@ -1,6 +1,6 @@
1
1
  import type { BookingPaymentTermsConfig, EventBookingPolicyMode, PublicBookingPaymentTermsAvailability } from "./bookingConfig";
2
2
  import type { BookingServicePricing } from "./bookingServicePricing";
3
- import type { BookingConsent } from "../../core/src/index";
3
+ import type { BookingConsent, ServiceCategorySummary } from "../../core/src/index";
4
4
  /**
5
5
  * Where a service happens, as a visitor may see it before booking.
6
6
  *
@@ -121,3 +121,37 @@ export type PublicBookingService = {
121
121
  */
122
122
  practitioners?: readonly PublicBookingPractitioner[];
123
123
  };
124
+ /**
125
+ * A category's public face: its heading and optional intro (issue 1403).
126
+ *
127
+ * The internal `identifier` (a key for site commands) and `sort_order` stay
128
+ * internal. Order is carried by position in the response's `categories` array.
129
+ */
130
+ export type PublicServiceCategorySummary = ServiceCategorySummary;
131
+ /**
132
+ * One row of the services catalogue: the service as the list shows it, plus
133
+ * the category it belongs to (`null` is the trailing "Other" group).
134
+ *
135
+ * The single-service reads (by id, by slug) return `PublicBookingService`
136
+ * unchanged; only the list carries `categoryId`.
137
+ */
138
+ export type PublicBookingServiceCatalogueItem = Omit<PublicBookingService, "description"> & {
139
+ description?: string;
140
+ categoryId: string | null;
141
+ };
142
+ /**
143
+ * The services list response.
144
+ *
145
+ * `services` is in display order (category order, then each service's
146
+ * position in its group, with uncategorised services last). `categories` is
147
+ * every category the site has, in order, including ones with no services in
148
+ * this response, and it is always present, including on an `ids`-restricted
149
+ * read. Deciding which groups are empty is the layout's job
150
+ * (`layoutServicesByCategory` in `@riverbankcms/core`), not this payload's.
151
+ * An empty `categories` means the site has no categories and the list stays
152
+ * flat.
153
+ */
154
+ export type PublicBookingServicesResponse = {
155
+ services: PublicBookingServiceCatalogueItem[];
156
+ categories: PublicServiceCategorySummary[];
157
+ };
@@ -22,6 +22,19 @@ export type PublicNewsletterAPIEndpoints = {
22
22
  siteId: string;
23
23
  token: string;
24
24
  }, string>;
25
+ confirmNewsletterPost: APIEndpoint<never, {
26
+ siteId: string;
27
+ token: string;
28
+ }, string>;
29
+ getNewsletterPreferences: APIEndpoint<never, {
30
+ siteId: string;
31
+ token: string;
32
+ unsubscribe?: string;
33
+ }, string>;
34
+ saveNewsletterPreferences: APIEndpoint<FormData, {
35
+ siteId: string;
36
+ token: string;
37
+ }, string>;
25
38
  getNewsletterArchive: APIEndpoint<never, {
26
39
  siteId: string;
27
40
  token: string;
@@ -0,0 +1,58 @@
1
+ export declare const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS: {
2
+ subscribeNewsletter: {
3
+ path: "/public/sites/{siteId}/newsletter/subscribe";
4
+ method: "POST";
5
+ tags: "public-newsletter-{siteId}"[];
6
+ auth: "public";
7
+ responseKind: "json";
8
+ };
9
+ confirmNewsletter: {
10
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}";
11
+ method: "GET";
12
+ tags: "public-newsletter-{siteId}"[];
13
+ auth: "public";
14
+ responseKind: "text";
15
+ };
16
+ unsubscribeNewsletter: {
17
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}";
18
+ method: "GET";
19
+ tags: "public-newsletter-{siteId}"[];
20
+ auth: "public";
21
+ responseKind: "text";
22
+ };
23
+ unsubscribeNewsletterPost: {
24
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}";
25
+ method: "POST";
26
+ tags: "public-newsletter-{siteId}"[];
27
+ auth: "public";
28
+ responseKind: "text";
29
+ };
30
+ confirmNewsletterPost: {
31
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}";
32
+ method: "POST";
33
+ tags: "public-newsletter-{siteId}"[];
34
+ auth: "public";
35
+ responseKind: "text";
36
+ };
37
+ getNewsletterPreferences: {
38
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}";
39
+ method: "GET";
40
+ tags: "public-newsletter-{siteId}"[];
41
+ auth: "public";
42
+ responseKind: "text";
43
+ };
44
+ saveNewsletterPreferences: {
45
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}";
46
+ method: "POST";
47
+ tags: "public-newsletter-{siteId}"[];
48
+ auth: "public";
49
+ responseKind: "text";
50
+ };
51
+ getNewsletterArchive: {
52
+ path: "/public/sites/{siteId}/newsletter/archive/{token}";
53
+ method: "GET";
54
+ tags: "public-newsletter-{siteId}"[];
55
+ auth: "public";
56
+ responseKind: "text";
57
+ };
58
+ };
@@ -8,8 +8,8 @@ export declare const adminListAxiomLogsQuerySchema: z.ZodObject<{
8
8
  search: z.ZodOptional<z.ZodString>;
9
9
  tail: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
10
10
  mode: z.ZodOptional<z.ZodEnum<{
11
- errors: "errors";
12
11
  all: "all";
12
+ errors: "errors";
13
13
  warnings: "warnings";
14
14
  }>>;
15
15
  }, z.core.$strip>;
@@ -40,8 +40,8 @@ export declare const adminListSupabaseLogsQuerySchema: z.ZodObject<{
40
40
  search: z.ZodOptional<z.ZodString>;
41
41
  tail: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
42
42
  mode: z.ZodOptional<z.ZodEnum<{
43
- errors: "errors";
44
43
  all: "all";
44
+ errors: "errors";
45
45
  warnings: "warnings";
46
46
  }>>;
47
47
  }, z.core.$strip>;
@@ -53,8 +53,8 @@ export declare const adminListVercelLogsQuerySchema: z.ZodObject<{
53
53
  search: z.ZodOptional<z.ZodString>;
54
54
  tail: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
55
55
  mode: z.ZodOptional<z.ZodEnum<{
56
- errors: "errors";
57
56
  all: "all";
57
+ errors: "errors";
58
58
  warnings: "warnings";
59
59
  }>>;
60
60
  }, z.core.$strip>;
@@ -8,7 +8,7 @@ import type { AdminListAxiomLogsQueryOutput, AdminListErrorLogsQueryOutput, Admi
8
8
  import type { AcceptAdminInviteRequest, AcceptAdminInviteResponse, AcceptSiteInvitationRequest, AcceptSiteInvitationResponse, AddCustomDomainRequest, AddCustomDomainResponse, AdminDeleteUserResponse, AuthInviteContinueRequest, AuthInviteContinueResponse, AuthInviteRegisterRequest, AuthInviteRegisterResponse, AuthResetCompleteRequest, AuthResetCompleteResponse, AuthSubmissionResult, BulkOperationResult, CreateAdminInviteRequest, CreateAdminInviteResponse, CreateAdminUserRequest, CreateAdminUserResponse, CreateAllowedDomainRequest, CreateAllowedDomainResponse, DeleteAllowedDomainResponse, DomainConfigResult, DomainSearchResultResponse, CurrentUserPractitionerLinkResponse, InviteSiteMemberRequest, InviteSiteMemberResponse, LinkCurrentUserPractitionerRequest, ListAdminInvitesResponse, ListAllowedDomainsResponse, ListSiteMembersResponse, LookupSiteDomainRequest, LookupSiteDomainResponse, MfaBackupCodesOverviewResponse, MfaBackupCodesRotateResponse, MfaOverviewResponse, MfaPhoneChallengeRequest, MfaPhoneChallengeResponse, MfaPhoneEnrollRequest, MfaPhoneEnrollResponse, MfaPhoneVerifyRequest, MfaTotpActivateRequest, MfaTotpEnrollResponse, MfaTotpVerifyRequest, MfaTotpVerifyResponse, ReauthSubmissionResult, RegisterDomainRequestPayload, RegisterDomainResponse, RegistrarBooleanMutationRequest, RegistrarLifecycleResponse, RegistrarRenewalPostureResponse, RegisterSiteDomainRequest, RegisterSiteDomainResponse, RemoveSiteMemberResponse, RevokeAdminInviteResponse, RevokeSiteInvitationResponse, ResendSiteInvitationResponse, SetHomepageRequest, SetHomepageResponse, SiteDomainContactPayload, SiteDomainRecord, TransferSiteOwnershipRequest, TransferSiteOwnershipResponse, UpdateSiteMemberRoleRequest, UpdateSiteMemberRoleResponse } from './accessAdmin';
9
9
  import type { AdminRoleMutationResponse, RevokeAdminRoleRequest, StartImpersonationRequest, StartImpersonationResponse, StopImpersonationRequest, StopImpersonationResponse, UpsertAdminRoleRequest } from './admin/types';
10
10
  import type { AccountRevokeSessionsBody, AccountRevokeSessionsResponse, AccountUpdatePasswordBody, AccountUpdatePasswordResponse, CreateManualSiteRequest, CreateManualSiteResponse } from './siteOperations';
11
- import type { BookingSessionCancelAppointmentRequest, BookingSessionCancelAppointmentResponse, BookingSessionCreateAppointmentRequest, BookingSessionCreateAppointmentResponse, BookingSessionGetAppointmentResponse, BookingSessionListEligibleAppointmentPackagesResponse, BookingSessionGetEventResponse, BookingSessionListAppointmentsResponse, BookingSessionListEventsResponse, BookingSessionListMembershipsResponse, BookingSessionListPassesResponse, BookingSessionMeResponse, BookingSessionUpdateMeRequest, BookingSessionUpdateMeResponse, PublicBookingAppointmentStatusResponse, PublicBookingAvailabilityQuery, PublicBookingAvailableDatesResponse, PublicBookingAvailableSlotsResponse, PublicBookingService, PublicWeeklySlotAvailabilityQuery, PublicWeeklySlotAvailabilityResponse, PublicCreateBookingAppointmentRequest, PublicCreateBookingAppointmentResponse, ReferenceOptionsResponse } from './bookingOperations';
11
+ import type { BookingSessionCancelAppointmentRequest, BookingSessionCancelAppointmentResponse, BookingSessionCreateAppointmentRequest, BookingSessionCreateAppointmentResponse, BookingSessionGetAppointmentResponse, BookingSessionListEligibleAppointmentPackagesResponse, BookingSessionGetEventResponse, BookingSessionListAppointmentsResponse, BookingSessionListEventsResponse, BookingSessionListMembershipsResponse, BookingSessionListPassesResponse, BookingSessionMeResponse, BookingSessionUpdateMeRequest, BookingSessionUpdateMeResponse, PublicBookingAppointmentStatusResponse, PublicBookingAvailabilityQuery, PublicBookingAvailableDatesResponse, PublicBookingAvailableSlotsResponse, PublicBookingService, PublicBookingServicesResponse, PublicWeeklySlotAvailabilityQuery, PublicWeeklySlotAvailabilityResponse, PublicCreateBookingAppointmentRequest, PublicCreateBookingAppointmentResponse, ReferenceOptionsResponse } from './bookingOperations';
12
12
  import type { ContentEntryOrPageResponse, ContentEntrySummary, ExportFormSubmissionsCsvQuery, ExportFormSubmissionsCsvResponse, CreateFormSubmissionRectificationAnnotationRequest, CreateFormSubmissionRectificationAnnotationResponse, FormRecord, FormSubmissionWithRectificationAnnotations, FormSummary, NavigationItemRecord, NavigationMenuWithItems, PublicFormRecord, PublishedContentEntryOrPageResponse, RunSdkWorkflowResponse, ScheduledContentEntryOrPageResponse, WorkflowRunStatusResponse } from './contentRuntime';
13
13
  import type { GetVersionHistoryResponse, ListVersionHistoryResponse, RestoreVersionHistoryRequest, RestoreVersionHistoryResponse, VersionHistoryListQuery } from './contentVersionHistory';
14
14
  import type { ApplyContentTemplateAddonRequest, ContentTemplateDetailsResponse, CreateTemplateBlockRequest, GetTransformsResponse, ReorderTemplateBlocksRequest, SerializedContentTypeSummary, UpdateContentTemplateBlockBindingsRequest, UpdateContentTemplateBlockRequest } from './contentTypes';
@@ -987,11 +987,7 @@ export type SiteManagementAPIEndpoints = BillingAPIEndpoints & {
987
987
  getPublicBookingServices: APIEndpoint<never, {
988
988
  siteId: string;
989
989
  ids?: string;
990
- }, {
991
- services: Array<Omit<PublicBookingService, 'description'> & {
992
- description?: string;
993
- }>;
994
- }>;
990
+ }, PublicBookingServicesResponse>;
995
991
  getPublicBookingService: APIEndpoint<never, {
996
992
  siteId: string;
997
993
  serviceId: string;
@@ -59,6 +59,7 @@ export type { AdminProfileRole, AdminRoleMutationResponse, RevokeAdminRoleReques
59
59
  import type { AccountAPIEndpoints } from './accountEndpoints';
60
60
  export type * from './accountEndpoints';
61
61
  import type { AiAndLaunchReadinessAPIEndpointDefinitions, AiAPIEndpointName, AiAPIEndpoints, LaunchReadinessAPIEndpointName, LaunchReadinessAPIEndpoints } from './aiEndpoints';
62
+ import type { AppointmentServiceCategoryAPIEndpoints } from './appointmentServiceCategoryEndpoints';
62
63
  import type { BookingManagementAPIEndpoints } from './bookingManagementEndpoints';
63
64
  import type { CommercePortalAPIEndpoints } from './commercePortalEndpoints';
64
65
  import type { MailchimpIntegrationAPIEndpoints } from './mailchimpIntegration';
@@ -70,7 +71,7 @@ import type { SitePlatformAPIEndpoints } from './sitePlatformEndpoints';
70
71
  import type { SiteRuntimeAPIEndpoints } from './siteRuntimeEndpoints';
71
72
  type TableName = keyof DbDatabase['public']['Tables'];
72
73
  export type DTOType<K extends TableName> = Partial<CamelizeKeys<DbRow<K>>>;
73
- type APIEndpointsMonolith = AiAndLaunchReadinessAPIEndpointDefinitions & AccountAPIEndpoints & SeoEndpointDefinitions & SiteManagementAPIEndpoints & PublicExperienceAPIEndpoints & SiteRuntimeAPIEndpoints & SitePlatformAPIEndpoints & BookingManagementAPIEndpoints & CommercePortalAPIEndpoints & MailchimpIntegrationAPIEndpoints & MailingListIntegrationAPIEndpoints;
74
+ type APIEndpointsMonolith = AiAndLaunchReadinessAPIEndpointDefinitions & AccountAPIEndpoints & SeoEndpointDefinitions & SiteManagementAPIEndpoints & PublicExperienceAPIEndpoints & SiteRuntimeAPIEndpoints & SitePlatformAPIEndpoints & BookingManagementAPIEndpoints & AppointmentServiceCategoryAPIEndpoints & CommercePortalAPIEndpoints & MailchimpIntegrationAPIEndpoints & MailingListIntegrationAPIEndpoints;
74
75
  type ComposeEndpointMaps<Maps extends readonly object[], Acc extends object = {}> = Maps extends readonly [
75
76
  infer Head extends object,
76
77
  ...infer Tail extends readonly object[]
@@ -4,20 +4,20 @@ import type { PageOutline } from './structure/schema';
4
4
  import type { SdkCustomBlock } from './system/manifest/schema';
5
5
  import type { RouteMap } from './system/transforms';
6
6
  import { type OverrideOnlyRenderMode, type ThemedRenderMode, type TokensOnlyRenderMode } from './pageRenderingMode';
7
- import { type PageBoundaryWrapper, type PageRuntimeBoundary } from './pageRendererBoundaries';
7
+ import { type PageJoinRenderer, type PageRuntimeJoin } from './pageRendererBoundaries';
8
8
  import { type BlockOverrides, type PageRendererDataContext, type SdkConfigForRenderer } from './pageRendererContracts';
9
9
  import { type RenderablePageOutline } from './pageRenderAdmission';
10
10
  export type { PageBlockRenderAdmissionError, RenderablePageBlock, RenderablePageOutline, } from './pageRenderAdmission';
11
11
  export type { BlockOverrideComponent, BlockOverrideProps, BlockOverrides, EntrySubrouteContextData, OccurrenceContextData, SdkConfigForRenderer, } from './pageRendererContracts';
12
12
  export { MissingBlockOverrideError } from './pageRenderingMode';
13
- export type { PageBlockPosition, PageRuntimeBoundary, } from './pageRendererBoundaries';
13
+ export type { PageBlockPosition, PageJoinRenderer, PageJoinSlot, PageRuntimeJoin, RenderedJoin, } from './pageRendererBoundaries';
14
14
  type PageRendererCommonProps<TPage> = {
15
15
  page: TPage | null;
16
- runtimeBoundaries?: readonly PageRuntimeBoundary[];
16
+ runtimeJoins?: readonly PageRuntimeJoin[];
17
17
  dataContext?: PageRendererDataContext;
18
18
  routeMap?: RouteMap;
19
19
  wrapBlock?: (blockId: string, rendered: React.ReactNode) => React.ReactNode;
20
- wrapBoundary?: PageBoundaryWrapper;
20
+ renderJoin?: PageJoinRenderer;
21
21
  registry?: ResolverContext['registry'];
22
22
  blockOverrides?: BlockOverrides;
23
23
  sdkConfig?: SdkConfigForRenderer | null;
@@ -6,8 +6,8 @@
6
6
  */
7
7
  export type { BindingSource, BindingDescriptor, BindingInput, BindingMap, BindingContext, BindingPath, BindingTransformName, KnownBindingTransformName, FieldBindingDescriptor, MetaBindingDescriptor, LiteralBindingDescriptor, TransformBindingDescriptor, FallbackBindingDescriptor, } from './types';
8
8
  export { TRANSFORMS, BINDING_SOURCES } from './types';
9
- export { asDesignBlockId, asContentTemplateDesignBlockId, asLayoutVariantKey, buildPageDesignEditorReadModel, compileContentTemplateRuntimeFields, parsePageDesignIntent, surfaceResolutionContextFromTheme, designRuntimeRulesForTheme, type DesignBlockId, parseContentTemplateDesignIntent, type CompiledBlockRuntimeFields, type CompiledBoundaryRuntime, type LayoutVariantKey, type PageDesignEditorBlockInput, type PageDesignIntent, type SurfaceResolutionContext, applyBlockContentVariantPolicy, deriveSiteStyleBlockPolicy, } from '../../../theme-core/src/site-styles/index';
10
- export { applyCompiledRuntimeFieldsToContent, buildEditorModelRuntimeBoundaries, buildEditorModelRuntimeFieldsByBlockId, compileEditorModelRuntime, retargetCompiledBoundaryRuntimeForContentAdjacency, retargetCompiledRuntimeFieldsForContentAdjacency, } from '../../../theme-core/src/site-styles/previewCompiler';
9
+ export { asDesignBlockId, asContentTemplateDesignBlockId, asLayoutVariantKey, buildPageDesignEditorReadModel, compileContentTemplateRuntimeFields, parsePageDesignIntent, surfaceResolutionContextFromTheme, designRuntimeRulesForTheme, type DesignBlockId, parseContentTemplateDesignIntent, type CompiledBlockRuntimeFields, type PageRuntimeJoin, type LayoutVariantKey, type PageDesignEditorBlockInput, type PageDesignIntent, type SurfaceResolutionContext, applyBlockContentVariantPolicy, deriveSiteStyleBlockPolicy, } from '../../../theme-core/src/site-styles/index';
10
+ export { applyCompiledRuntimeFieldsToContent, buildEditorModelRuntimeFieldsByBlockId, compileEditorModelRuntime, } from '../../../theme-core/src/site-styles/previewCompiler';
11
11
  export { blockDesignMetadataMapFromDefinitions } from '../system/designCapabilities';
12
12
  export { systemBlockDefinitions } from '../system/blocks';
13
13
  import type { BindingContext, BindingDescriptor, BindingInput, BindingMap, BindingPath, FieldBindingDescriptor, FallbackBindingDescriptor, KnownBindingTransformName, LiteralBindingDescriptor, MetaBindingDescriptor, TransformBindingDescriptor } from './types';
@@ -87,6 +87,12 @@ export declare const proofBlockIslandCodecs: {
87
87
  agreement: import("../../../core/src/index").RichTextDoc;
88
88
  checkboxLabel: string;
89
89
  }>;
90
+ categoryId?: string | null;
91
+ }>[];
92
+ serviceCategories?: readonly Readonly<{
93
+ id: string;
94
+ name: string;
95
+ description: string | null;
90
96
  }>[];
91
97
  spamProtectionEnabled?: boolean;
92
98
  }>;
@@ -169,6 +175,12 @@ export declare const proofBlockIslandCodecs: {
169
175
  agreement: import("../../../core/src/index").RichTextDoc;
170
176
  checkboxLabel: string;
171
177
  }>;
178
+ categoryId?: string | null;
179
+ }>[];
180
+ serviceCategories?: readonly Readonly<{
181
+ id: string;
182
+ name: string;
183
+ description: string | null;
172
184
  }>[];
173
185
  spamProtectionEnabled?: boolean;
174
186
  }>;
@@ -1037,6 +1049,12 @@ export declare const runtimeIslandCodecs: {
1037
1049
  agreement: import("../../../core/src/index").RichTextDoc;
1038
1050
  checkboxLabel: string;
1039
1051
  }>;
1052
+ categoryId?: string | null;
1053
+ }>[];
1054
+ serviceCategories?: readonly Readonly<{
1055
+ id: string;
1056
+ name: string;
1057
+ description: string | null;
1040
1058
  }>[];
1041
1059
  spamProtectionEnabled?: boolean;
1042
1060
  }>;
@@ -1119,6 +1137,12 @@ export declare const runtimeIslandCodecs: {
1119
1137
  agreement: import("../../../core/src/index").RichTextDoc;
1120
1138
  checkboxLabel: string;
1121
1139
  }>;
1140
+ categoryId?: string | null;
1141
+ }>[];
1142
+ serviceCategories?: readonly Readonly<{
1143
+ id: string;
1144
+ name: string;
1145
+ description: string | null;
1122
1146
  }>[];
1123
1147
  spamProtectionEnabled?: boolean;
1124
1148
  }>;
@@ -2,7 +2,7 @@ export { default as PageRenderer, EditorPageRenderer } from './PageRenderer';
2
2
  export type { RenderAudience as PageRenderAudience } from './pageRenderAudience';
3
3
  export { createCustomBlockRegistry, mergeBlockDescriptorsWithRegistry, planCustomBlockRegistryResolution, transformToBlockDescriptor, } from './customBlockRegistry';
4
4
  export type { CustomBlockConflictReason, CustomBlockManifestSource, CustomBlockRegistry, CustomBlockRegistryConflict, CustomBlockRegistryEntry, CustomBlockRegistryResolutionPlan, CustomBlockSourcePolicy, ResolvedCustomBlockManifest, SdkConfigForBlockPicker, } from './customBlockRegistry';
5
- export type { BlockOverrideComponent, BlockOverrideProps, BlockOverrides, EntrySubrouteContextData, EditorPageRendererProps, PageBlockRenderAdmissionError, PageRendererProps, RenderablePageBlock, RenderablePageOutline, OccurrenceContextData, PageBlockPosition, PageRuntimeBoundary, SdkConfigForRenderer, } from './PageRenderer';
5
+ export type { BlockOverrideComponent, BlockOverrideProps, BlockOverrides, EntrySubrouteContextData, EditorPageRendererProps, PageBlockRenderAdmissionError, PageRendererProps, RenderablePageBlock, RenderablePageOutline, OccurrenceContextData, PageBlockPosition, PageJoinRenderer, PageJoinSlot, PageRuntimeJoin, RenderedJoin, SdkConfigForRenderer, } from './PageRenderer';
6
6
  export { MissingBlockOverrideError } from './pageRenderingMode';
7
7
  export * from './subroutes';
8
8
  export * from './structure/schema';
@@ -0,0 +1,68 @@
1
+ import { type BoundaryLayout, type BoundaryOutcome, type DecorativeTransitionIntent, type DesignBoundaryId, type PageRuntimeJoin as ThemeCorePageRuntimeJoin } from '../../theme-core/src/site-styles/index';
2
+ /**
3
+ * A break between two adjacent blocks as the server sends it: intent only.
4
+ * Everything visual is decided here, from the content that finally renders
5
+ * (issue 1422).
6
+ */
7
+ export type PageRuntimeJoin = ThemeCorePageRuntimeJoin<string>;
8
+ /**
9
+ * A join after composition: its treatment plus whether and how it draws. The
10
+ * outcome comes from the same composition as the painted markup, so the
11
+ * editor's "won't show here" note can never disagree with the page.
12
+ */
13
+ export type RenderedJoin = Readonly<{
14
+ boundaryId: DesignBoundaryId;
15
+ previousBlockId: string;
16
+ nextBlockId: string;
17
+ treatment: DecorativeTransitionIntent;
18
+ outcome: BoundaryOutcome;
19
+ }>;
20
+ /**
21
+ * One adjacent pair of surviving blocks. `join` is null when the pair has no
22
+ * break at all; a join that exists but does not draw carries a not-shown
23
+ * outcome instead.
24
+ */
25
+ export type PageJoinSlot = Readonly<{
26
+ previousBlockId: string;
27
+ nextBlockId: string;
28
+ join: RenderedJoin | null;
29
+ }>;
30
+ /** The survivor facts composition needs: its id, kind and final content. */
31
+ export type JoinSurvivor = Readonly<{
32
+ id: string | null | undefined;
33
+ kind: string;
34
+ content: Record<string, unknown>;
35
+ }>;
36
+ /**
37
+ * Re-points joins across omitted blocks. Pure over joins.
38
+ *
39
+ * Joins are keyed by adjacent block-id pairs, so dropping B from [A, B, C]
40
+ * removes the A→C join as well as B's own, because no A→C join was ever
41
+ * resolved. For each surviving pair the original join is kept when the pair
42
+ * was already adjacent. Across a gap, the treatment comes from the join
43
+ * entering the omitted run (A→first omitted), falling back to the one leaving
44
+ * it (last omitted→C). Nothing visual is carried: the survivors are composed
45
+ * from their own content afterwards.
46
+ *
47
+ * `survivors` are compared by identity against `originalBlocks`.
48
+ */
49
+ export declare function retargetJoinsAcrossOmissions<TBlock extends Readonly<{
50
+ id?: string | null;
51
+ }>>(input: Readonly<{
52
+ joins: readonly PageRuntimeJoin[];
53
+ originalBlocks: readonly TBlock[];
54
+ survivingBlocks: ReadonlySet<TBlock>;
55
+ }>): readonly PageRuntimeJoin[];
56
+ /**
57
+ * The single composition site. For every adjacent pair of survivors with ids,
58
+ * finds its join and composes it from both survivors' final content: what
59
+ * each paints with and the frame each draws.
60
+ */
61
+ export declare function composePageJoins(input: Readonly<{
62
+ joins: readonly PageRuntimeJoin[];
63
+ survivors: readonly JoinSurvivor[];
64
+ }>): readonly PageJoinSlot[];
65
+ /** Placement, reserves and paint for a join that draws; null otherwise. */
66
+ export declare function renderedJoinLayout(join: RenderedJoin | null): BoundaryLayout | null;
67
+ /** Slot lookup key for an adjacent pair, in the one boundary-id scheme. */
68
+ export declare function joinSlotKey(previousBlockId: string, nextBlockId: string): DesignBoundaryId;
@@ -1,7 +1,7 @@
1
1
  import { getBlockDefinition } from './system';
2
2
  import type { SdkCustomBlock } from './system/manifest/schema';
3
3
  import type { PresentationBlock, PresentationPageOutline } from './pageRenderAdmission';
4
- import { type PageRuntimeBoundary } from './pageRendererBoundaries';
4
+ import { type PageRuntimeJoin } from './pageRenderJoins';
5
5
  import type { BlockOverrideComponent, BlockOverrides, SdkConfigForRenderer } from './pageRendererContracts';
6
6
  import type { NotRenderableReason, RenderAudience } from './pageRenderAudience';
7
7
  type ResolvedBlockDefinition = NonNullable<ReturnType<typeof getBlockDefinition>>;
@@ -70,12 +70,17 @@ export type OmittedBlockDebugFields = Readonly<{
70
70
  export type PageRenderPlan = Readonly<{
71
71
  entries: readonly PageBlockRenderPlanEntry[];
72
72
  omitted: readonly OmittedPageBlock[];
73
- runtimeBoundaries: readonly PageRuntimeBoundary[] | undefined;
73
+ /**
74
+ * Joins between the plan's entries, re-pointed across plan-time omissions.
75
+ * A caller that sent no joins gets an empty list: every pair still gets a
76
+ * join slot, with no treatment.
77
+ */
78
+ runtimeJoins: readonly PageRuntimeJoin[];
74
79
  }>;
75
80
  export type BuildPageRenderPlanInput = Readonly<{
76
81
  page: PresentationPageOutline;
77
82
  audience: RenderAudience;
78
- runtimeBoundaries: readonly PageRuntimeBoundary[] | undefined;
83
+ runtimeJoins: readonly PageRuntimeJoin[] | undefined;
79
84
  previewStage: 'published' | 'preview';
80
85
  sdkConfig: SdkConfigForRenderer | null | undefined;
81
86
  customBlocks: readonly SdkCustomBlock[] | undefined;
@@ -89,28 +94,4 @@ export type BuildPageRenderPlanInput = Readonly<{
89
94
  * runs inside a `useMemo` whose recomputation React makes no promises about.
90
95
  */
91
96
  export declare function buildPageRenderPlan(input: BuildPageRenderPlanInput): PageRenderPlan;
92
- /**
93
- * Re-points section boundaries across omitted blocks.
94
- *
95
- * Boundaries are keyed by adjacent block-id *pairs*, so dropping B from
96
- * [A, B, C] does not merely remove B's boundaries — it removes the boundary
97
- * between the survivors, because no `A→C` key was ever compiled.
98
- *
99
- * Per decision D2 the treatment for a merged gap comes from the boundary
100
- * entering the omitted run (`A→firstOmitted`), falling back to the one leaving
101
- * it (`lastOmitted→C`). The destination surface is a separate question: only
102
- * the exiting boundary knows what C looks like, so the merged boundary ends on
103
- * that endpoint rather than on the omitted block's. In the exiting-only
104
- * fallback the origin remains an approximation: `from` is the omitted block's
105
- * surface, because no compiled boundary carries A's. The hosted path no longer
106
- * needs this at all (site-renderer admits blocks before compiling boundaries);
107
- * it remains the safety net for an SDK whose compiled boundaries predate an
108
- * omission.
109
- */
110
- export declare function retargetBoundariesAcrossOmissions(input: Readonly<{
111
- boundaries: readonly PageRuntimeBoundary[] | undefined;
112
- originalBlocks: readonly PresentationBlock[];
113
- survivingBlocks: ReadonlySet<PresentationBlock>;
114
- previewStage: 'published' | 'preview';
115
- }>): readonly PageRuntimeBoundary[] | undefined;
116
97
  export {};
@@ -4,9 +4,9 @@ import type { ResolveImageUrlContext } from './system/runtime/nodes/media';
4
4
  import { type PageThemeResources } from './pageRenderingMode';
5
5
  import type { PresentationBlock } from './pageRenderAdmission';
6
6
  import type { RenderAudience } from './pageRenderAudience';
7
- import type { PageRuntimeBoundary } from './pageRendererBoundaries';
7
+ import { type PageJoinSlot } from './pageRenderJoins';
8
8
  import type { BlockOverrideProps, PageRendererDataContext } from './pageRendererContracts';
9
- import { type PageBlockRenderPlanEntry, type PageRenderPlan } from './pageRenderPlan';
9
+ import type { PageBlockRenderPlanEntry, PageRenderPlan } from './pageRenderPlan';
10
10
  /**
11
11
  * What preparing a block produced.
12
12
  *
@@ -46,7 +46,11 @@ export type PageRenderPreparation = Readonly<{
46
46
  * has to replay the overrides-only guard over the entry's own `override`.
47
47
  */
48
48
  constructionFailures: readonly PageBlockRenderPlanEntry[];
49
- runtimeBoundaries: readonly PageRuntimeBoundary[] | undefined;
49
+ /**
50
+ * One slot per adjacent pair of surviving entries, composed from their final
51
+ * content after both kinds of omission.
52
+ */
53
+ joins: readonly PageJoinSlot[];
50
54
  }>;
51
55
  export type PreparePageRenderInput = Readonly<{
52
56
  plan: PageRenderPlan;
@@ -55,7 +59,6 @@ export type PreparePageRenderInput = Readonly<{
55
59
  routeMap: RouteMap | undefined;
56
60
  themeResources: PageThemeResources;
57
61
  imageResolveContext: ResolveImageUrlContext;
58
- previewStage: 'published' | 'preview';
59
62
  }>;
60
63
  /**
61
64
  * Stage two of the render plan.
@@ -1,31 +1,48 @@
1
1
  import React from 'react';
2
- import type { CompiledBoundaryRuntime } from '../../theme-core/src/site-styles/index';
3
- import type { Block } from './structure/schema';
2
+ import type { BoundaryLayout } from '../../theme-core/src/site-styles/index';
3
+ import { type PageJoinSlot, type RenderedJoin } from './pageRenderJoins';
4
4
  export type PageBlockPosition = 'only' | 'first' | 'middle' | 'last';
5
- export type PageRuntimeBoundary = CompiledBoundaryRuntime<string>;
6
- export type PageBoundaryWrapper = (boundary: PageRuntimeBoundary, rendered: React.ReactNode) => React.ReactNode;
7
- export declare const boundaryKey: (previousBlockId: string, nextBlockId: string) => string;
8
- export declare function isSiteStyleTransitionStyleGroup(value: string | undefined): value is string;
9
- export declare function boundaryMapForAdjacentBlockIds(boundaries: readonly PageRuntimeBoundary[]): ReadonlyMap<string, PageRuntimeBoundary>;
10
- export declare function boundaryBetweenBlocks(previousBlock: Block | null, nextBlock: Block | null, boundaries: ReadonlyMap<string, PageRuntimeBoundary>): PageRuntimeBoundary | null;
11
- export declare function renderBoundaryAfterBlock(input: Readonly<{
12
- block: Block;
13
- nextBlock: Block | null;
5
+ export type { PageJoinSlot, PageRuntimeJoin, RenderedJoin, } from './pageRenderJoins';
6
+ /**
7
+ * Called once for every adjacent pair of surviving blocks, including pairs
8
+ * with no join and joins that do not draw. What it returns is rendered at the
9
+ * join, after any painted boundary element. The editor mounts its section
10
+ * break control here, so the control exists even when nothing is painted.
11
+ */
12
+ export type PageJoinRenderer = (input: Readonly<{
13
+ previousBlockId: string;
14
+ nextBlockId: string;
15
+ join: RenderedJoin | null;
16
+ }>) => React.ReactNode;
17
+ export declare function joinSlotsByPair(slots: readonly PageJoinSlot[]): ReadonlyMap<string, PageJoinSlot>;
18
+ export declare function joinSlotBetween(previousBlockId: string | null | undefined, nextBlockId: string | null | undefined, slots: ReadonlyMap<string, PageJoinSlot>): PageJoinSlot | null;
19
+ /**
20
+ * The markup at one join: the painted boundary element when the join draws,
21
+ * then whatever `renderJoin` adds. Null when there is nothing to render.
22
+ */
23
+ export declare function renderJoinSlot(input: Readonly<{
24
+ slot: PageJoinSlot | null;
14
25
  blockKey: string;
15
- boundaryByAdjacentBlockIds: ReadonlyMap<string, PageRuntimeBoundary>;
16
- wrapBoundary?: PageBoundaryWrapper;
26
+ renderJoin: PageJoinRenderer | undefined;
17
27
  }>): React.ReactNode;
18
- type TransitionCssVarsStyle = React.CSSProperties & {
19
- '--site-style-transition-from'?: string;
20
- '--site-style-transition-to'?: string;
28
+ type BoundaryStyle = React.CSSProperties & {
29
+ '--boundary-shape-paint'?: string;
30
+ '--boundary-band-paint'?: string;
21
31
  '--site-style-boundary-before-reserve'?: string;
22
32
  '--site-style-boundary-after-reserve'?: string;
23
33
  };
24
- export declare function boundaryReserveCssVarsStyle(input: Readonly<{
25
- before: PageRuntimeBoundary | null;
26
- after: PageRuntimeBoundary | null;
27
- }>): TransitionCssVarsStyle | undefined;
28
- export declare function transitionCssVarsStyle(content: Record<string, unknown>): TransitionCssVarsStyle | undefined;
29
- export declare function mergeStyleObjects(left: TransitionCssVarsStyle | undefined, right: TransitionCssVarsStyle | undefined): TransitionCssVarsStyle | undefined;
34
+ /**
35
+ * Reserve attributes and variables for a block wrapper, from the joins on
36
+ * either side. A join's `before` reserve sits inside its previous section, so
37
+ * it pads the bottom of the block above the join; its `after` reserve pads the
38
+ * top of the block below. Joins that do not draw reserve nothing.
39
+ */
40
+ export declare function blockBoundaryReserves(input: Readonly<{
41
+ before: PageJoinSlot | null;
42
+ after: PageJoinSlot | null;
43
+ }>): Readonly<{
44
+ topPlacement: BoundaryLayout['placement'] | undefined;
45
+ bottomPlacement: BoundaryLayout['placement'] | undefined;
46
+ style: BoundaryStyle | undefined;
47
+ }>;
30
48
  export declare function pageBlockPosition(index: number, blockCount: number): PageBlockPosition;
31
- export {};
@@ -1,5 +1,5 @@
1
1
  export { default as PageRenderer, EditorPageRenderer, MissingBlockOverrideError, } from './PageRenderer';
2
2
  export type { RenderAudience as PageRenderAudience } from './pageRenderAudience';
3
- export type { BlockOverrideComponent, BlockOverrideProps, BlockOverrides, EntrySubrouteContextData, EditorPageRendererProps, OccurrenceContextData, PageBlockRenderAdmissionError, PageBlockPosition, PageRuntimeBoundary, RenderablePageBlock, RenderablePageOutline, SdkConfigForRenderer, } from './PageRenderer';
3
+ export type { BlockOverrideComponent, BlockOverrideProps, BlockOverrides, EntrySubrouteContextData, EditorPageRendererProps, OccurrenceContextData, PageBlockRenderAdmissionError, PageBlockPosition, PageJoinRenderer, PageJoinSlot, PageRuntimeJoin, RenderedJoin, RenderablePageBlock, RenderablePageOutline, SdkConfigForRenderer, } from './PageRenderer';
4
4
  export * from './subroutes';
5
5
  export { ThemeScope } from '../../theme-core/src/ThemeScope';
@@ -5,6 +5,8 @@ declare const appointmentServicesManifest: BlockManifest;
5
5
  export type AppointmentServicesContent = Readonly<{
6
6
  heading?: string | null;
7
7
  description?: unknown;
8
+ /** Issue 1403: one category to show; unset shows every category grouped. */
9
+ categoryId?: string | null;
8
10
  _sectionStyles?: SectionStylesContent;
9
11
  }>;
10
12
  export declare const appointmentServicesBlockDefinition: SystemBlockDefinition<AppointmentServicesContent>;
@@ -104,7 +104,7 @@ export declare const eventSelectionFields: {
104
104
  contentTypeField?: string | undefined;
105
105
  fixedContentType?: string | undefined;
106
106
  valueFrom?: "id" | "identifier" | "slug" | undefined;
107
- siteOptionSource?: "eventSeries" | "eventCategories" | "venues" | "staffMembers" | undefined;
107
+ siteOptionSource?: "eventSeries" | "eventCategories" | "venues" | "staffMembers" | "appointmentServiceCategories" | undefined;
108
108
  searchThreshold?: number | undefined;
109
109
  renderInHeader?: boolean | undefined;
110
110
  intent?: "display" | "style" | "content" | "behavior" | undefined;
@@ -114,7 +114,7 @@ export declare const eventSelectionFields: {
114
114
  kind: "static";
115
115
  } | {
116
116
  kind: "site";
117
- optionSource: "eventSeries" | "eventCategories" | "venues" | "staffMembers";
117
+ optionSource: "eventSeries" | "eventCategories" | "venues" | "staffMembers" | "appointmentServiceCategories";
118
118
  } | {
119
119
  kind: "sdk";
120
120
  } | undefined;
@@ -34,8 +34,8 @@ export declare const calendarWindowQuerySchema: z.ZodObject<{
34
34
  timetable: "timetable";
35
35
  }>>;
36
36
  eventSurface: z.ZodOptional<z.ZodEnum<{
37
- custom: "custom";
38
37
  all: "all";
38
+ custom: "custom";
39
39
  regularClassSchedule: "regularClassSchedule";
40
40
  specialDatedEvents: "specialDatedEvents";
41
41
  }>>;
@@ -125,7 +125,7 @@ export declare const locationMapManifest: import("..").DefinedBlockManifest<{
125
125
  contentTypeField?: string | undefined;
126
126
  fixedContentType?: string | undefined;
127
127
  valueFrom?: "id" | "identifier" | "slug" | undefined;
128
- siteOptionSource?: "eventSeries" | "eventCategories" | "venues" | "staffMembers" | undefined;
128
+ siteOptionSource?: "eventSeries" | "eventCategories" | "venues" | "staffMembers" | "appointmentServiceCategories" | undefined;
129
129
  searchThreshold?: number | undefined;
130
130
  renderInHeader?: boolean | undefined;
131
131
  intent?: "display" | "style" | "content" | "behavior" | undefined;
@@ -135,7 +135,7 @@ export declare const locationMapManifest: import("..").DefinedBlockManifest<{
135
135
  kind: "static";
136
136
  } | {
137
137
  kind: "site";
138
- optionSource: "eventSeries" | "eventCategories" | "venues" | "staffMembers";
138
+ optionSource: "eventSeries" | "eventCategories" | "venues" | "staffMembers" | "appointmentServiceCategories";
139
139
  } | {
140
140
  kind: "sdk";
141
141
  } | undefined;