@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
@@ -9,6 +9,75 @@ const footerModeSchema = z.enum([
9
9
  "none"
10
10
  ]);
11
11
  //#endregion
12
+ //#region ../api/src/defineEndpointDefinitions.ts
13
+ /**
14
+ * Validates extracted endpoint descriptors while preserving each literal path,
15
+ * method, and parameter contract for the typed URL builders.
16
+ */
17
+ function defineEndpointDefinitions(definitions) {
18
+ return definitions;
19
+ }
20
+ //#endregion
21
+ //#region ../api/src/publicNewsletterEndpointDefinitions.ts
22
+ const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
23
+ subscribeNewsletter: {
24
+ path: "/public/sites/{siteId}/newsletter/subscribe",
25
+ method: "POST",
26
+ tags: ["public-newsletter-{siteId}"],
27
+ auth: "public",
28
+ responseKind: "json"
29
+ },
30
+ confirmNewsletter: {
31
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
32
+ method: "GET",
33
+ tags: ["public-newsletter-{siteId}"],
34
+ auth: "public",
35
+ responseKind: "text"
36
+ },
37
+ unsubscribeNewsletter: {
38
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
39
+ method: "GET",
40
+ tags: ["public-newsletter-{siteId}"],
41
+ auth: "public",
42
+ responseKind: "text"
43
+ },
44
+ unsubscribeNewsletterPost: {
45
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
46
+ method: "POST",
47
+ tags: ["public-newsletter-{siteId}"],
48
+ auth: "public",
49
+ responseKind: "text"
50
+ },
51
+ confirmNewsletterPost: {
52
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
53
+ method: "POST",
54
+ tags: ["public-newsletter-{siteId}"],
55
+ auth: "public",
56
+ responseKind: "text"
57
+ },
58
+ getNewsletterPreferences: {
59
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
60
+ method: "GET",
61
+ tags: ["public-newsletter-{siteId}"],
62
+ auth: "public",
63
+ responseKind: "text"
64
+ },
65
+ saveNewsletterPreferences: {
66
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
67
+ method: "POST",
68
+ tags: ["public-newsletter-{siteId}"],
69
+ auth: "public",
70
+ responseKind: "text"
71
+ },
72
+ getNewsletterArchive: {
73
+ path: "/public/sites/{siteId}/newsletter/archive/{token}",
74
+ method: "GET",
75
+ tags: ["public-newsletter-{siteId}"],
76
+ auth: "public",
77
+ responseKind: "text"
78
+ }
79
+ });
80
+ //#endregion
12
81
  //#region ../api/src/apiEndpointTypes.ts
13
82
  function allowedDemoMutationPolicy() {
14
83
  return {
@@ -100,17 +169,85 @@ const SDK_ENTRY_READ_ENDPOINTS = {
100
169
  }
101
170
  };
102
171
  //#endregion
103
- //#region ../api/src/defineEndpointDefinitions.ts
104
- /**
105
- * Validates extracted endpoint descriptors while preserving each literal path,
106
- * method, and parameter contract for the typed URL builders.
107
- */
108
- function defineEndpointDefinitions(definitions) {
109
- return definitions;
110
- }
111
- //#endregion
112
172
  //#region ../api/src/appointmentEndpointDefinitions.ts
113
173
  const APPOINTMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
174
+ ...defineEndpointDefinitions({
175
+ listGroupedAppointmentServices: {
176
+ path: "/sites/{siteId}/bookings/services/grouped",
177
+ method: "GET",
178
+ auth: "user",
179
+ responseKind: "json",
180
+ errors: ["server:internal_error"]
181
+ },
182
+ reorderAppointmentServices: {
183
+ path: "/sites/{siteId}/bookings/services/order",
184
+ method: "PUT",
185
+ auth: "user",
186
+ responseKind: "json",
187
+ errors: [
188
+ "validation:invalid_input",
189
+ "auth:forbidden",
190
+ "resource:not_found",
191
+ "resource:conflict",
192
+ "server:internal_error"
193
+ ]
194
+ },
195
+ listAppointmentServiceCategories: {
196
+ path: "/sites/{siteId}/bookings/service-categories",
197
+ method: "GET",
198
+ auth: "user",
199
+ responseKind: "json",
200
+ errors: ["server:internal_error"]
201
+ },
202
+ createAppointmentServiceCategory: {
203
+ path: "/sites/{siteId}/bookings/service-categories",
204
+ method: "POST",
205
+ auth: "user",
206
+ responseKind: "json",
207
+ errors: [
208
+ "validation:invalid_input",
209
+ "auth:forbidden",
210
+ "resource:conflict",
211
+ "server:internal_error"
212
+ ]
213
+ },
214
+ updateAppointmentServiceCategory: {
215
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
216
+ method: "PUT",
217
+ auth: "user",
218
+ responseKind: "json",
219
+ errors: [
220
+ "validation:invalid_input",
221
+ "auth:forbidden",
222
+ "resource:not_found",
223
+ "resource:conflict",
224
+ "server:internal_error"
225
+ ]
226
+ },
227
+ deleteAppointmentServiceCategory: {
228
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
229
+ method: "DELETE",
230
+ auth: "user",
231
+ responseKind: "json",
232
+ errors: [
233
+ "auth:forbidden",
234
+ "resource:not_found",
235
+ "server:internal_error"
236
+ ]
237
+ },
238
+ reorderAppointmentServiceCategories: {
239
+ path: "/sites/{siteId}/bookings/service-categories/order",
240
+ method: "PUT",
241
+ auth: "user",
242
+ responseKind: "json",
243
+ errors: [
244
+ "validation:invalid_input",
245
+ "auth:forbidden",
246
+ "resource:conflict",
247
+ "server:internal_error"
248
+ ]
249
+ }
250
+ }),
114
251
  listAppointmentResources: {
115
252
  path: "/sites/{siteId}/bookings/resources",
116
253
  method: "GET",
@@ -1258,39 +1395,6 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1258
1395
  auth: "user",
1259
1396
  responseKind: "json",
1260
1397
  demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1261
- },
1262
- listNewsletterSendJobs: {
1263
- path: "/sites/{siteId}/newsletter/jobs",
1264
- method: "GET",
1265
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1266
- auth: "user",
1267
- responseKind: "json"
1268
- },
1269
- retryNewsletterSendJob: {
1270
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/retry",
1271
- method: "POST",
1272
- errors: [
1273
- "validation:invalid_input",
1274
- "resource:not_found",
1275
- "auth:forbidden",
1276
- "server:internal_error"
1277
- ],
1278
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1279
- auth: "user",
1280
- responseKind: "json"
1281
- },
1282
- cancelNewsletterSendJob: {
1283
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/cancel",
1284
- method: "POST",
1285
- errors: [
1286
- "validation:invalid_input",
1287
- "resource:not_found",
1288
- "auth:forbidden",
1289
- "server:internal_error"
1290
- ],
1291
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1292
- auth: "user",
1293
- responseKind: "json"
1294
1398
  }
1295
1399
  });
1296
1400
  //#endregion
@@ -3366,6 +3470,7 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3366
3470
  }
3367
3471
  });
3368
3472
  ({
3473
+ ...PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS,
3369
3474
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
3370
3475
  ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
3371
3476
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
@@ -10088,6 +10193,15 @@ function asSiteStyleId(value) {
10088
10193
  function asDesignSystemTemplateId(value) {
10089
10194
  return brandNonEmptyString(value, "DesignSystemTemplateId");
10090
10195
  }
10196
+ function toNonEmptyReadonlyArray(values) {
10197
+ const [first, ...rest] = values;
10198
+ return first === void 0 ? null : [first, ...rest];
10199
+ }
10200
+ function requireNonEmptyReadonlyArray(values, message = "Expected a non-empty array.") {
10201
+ const result = toNonEmptyReadonlyArray(values);
10202
+ if (!result) throw new Error(message);
10203
+ return result;
10204
+ }
10091
10205
  function makeBoundaryId(previousBlockId, nextBlockId) {
10092
10206
  return asDesignBoundaryId(`boundary:${encodeURIComponent(previousBlockId)}:${encodeURIComponent(nextBlockId)}`);
10093
10207
  }
@@ -10290,16 +10404,18 @@ const themeV2RuntimeStyleFieldNames = [
10290
10404
  "_frameStyles",
10291
10405
  "_sectionStyles",
10292
10406
  "_containerStyles",
10293
- "_cardStyles",
10294
- "_transitionStyles",
10295
- "styleGroup"
10407
+ "_cardStyles"
10296
10408
  ];
10297
10409
  const themeV2BlockSpecificRawStyleFieldNames = [
10298
10410
  "_contentCardStyles",
10299
10411
  "_heroLayoutStyles",
10300
10412
  "_textCardStyles"
10301
10413
  ];
10302
- const themeV2NormalEditorRawStyleFieldNames = [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
10414
+ const themeV2NormalEditorRawStyleFieldNames = [
10415
+ ...themeV2RuntimeStyleFieldNames,
10416
+ ...themeV2BlockSpecificRawStyleFieldNames,
10417
+ "styleGroup"
10418
+ ];
10303
10419
  new Set(themeV2NormalEditorRawStyleFieldNames);
10304
10420
  [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
10305
10421
  const pageDesignEditorBackgroundOverrideOwner = "page-design-editor";
@@ -12025,11 +12141,260 @@ function cardRoleFromLegacyVocabulary(value) {
12025
12141
  */
12026
12142
  const cardRoleWithLegacyAliasSchema = z.preprocess((value) => cardRoleFromLegacyVocabulary(value) ?? value, cardRoleSchema);
12027
12143
  //#endregion
12028
- //#region ../theme-core/src/site-styles/compilationPlan.ts
12029
- const defaultHeaderBrandPreferences = {
12030
- brandDisplay: "auto",
12031
- logoSize: "auto"
12032
- };
12144
+ //#region ../theme-core/src/site-styles/transitionCatalogue.ts
12145
+ /**
12146
+ * Family order for pickers. Entries below are listed family by family in this
12147
+ * same order, so the flat option list and the grouped families agree.
12148
+ */
12149
+ const transitionCatalogueFamilies = [
12150
+ {
12151
+ id: "gradient",
12152
+ label: "Gradient"
12153
+ },
12154
+ {
12155
+ id: "wave",
12156
+ label: "Wave"
12157
+ },
12158
+ {
12159
+ id: "angle",
12160
+ label: "Angle"
12161
+ }
12162
+ ];
12163
+ const mediumHeight = "6rem + 2px";
12164
+ const compactHeight = "4.5rem + 2px";
12165
+ const largeHeight = "7rem + 2px";
12166
+ /**
12167
+ * The single source of transition vocabulary. Order is significant: it is the
12168
+ * order of `boundaryOptions` (after `none`) and of each family's variants,
12169
+ * which persisted pins, page-flow presets and the editor picker all rely on.
12170
+ *
12171
+ * Shapes match what `generateLayoutCss` draws today. Structured
12172
+ * amplitude/frequency treatments (issue 826) extend this list later.
12173
+ */
12174
+ const transitionCatalogueEntries = defineExactCatalog()([
12175
+ {
12176
+ intent: "soft-fade-short",
12177
+ optionId: asBoundaryOptionId("break:soft"),
12178
+ family: "gradient",
12179
+ variantId: "soft",
12180
+ label: "Soft",
12181
+ variantLabel: "Soft",
12182
+ treatment: {
12183
+ kind: "soft-fade",
12184
+ height: "medium",
12185
+ curve: "soft"
12186
+ },
12187
+ size: "medium",
12188
+ heightExpression: mediumHeight,
12189
+ shape: { kind: "fade" }
12190
+ },
12191
+ {
12192
+ intent: "soft-fade-long",
12193
+ optionId: asBoundaryOptionId("break:spacious"),
12194
+ family: "gradient",
12195
+ variantId: "spacious",
12196
+ label: "Spacious",
12197
+ variantLabel: "Spacious",
12198
+ treatment: {
12199
+ kind: "soft-fade",
12200
+ height: "large",
12201
+ curve: "spacious"
12202
+ },
12203
+ size: "spacious",
12204
+ heightExpression: "10rem",
12205
+ shape: { kind: "fade" }
12206
+ },
12207
+ {
12208
+ intent: "soft-fade-expansive",
12209
+ optionId: asBoundaryOptionId("break:expansive"),
12210
+ family: "gradient",
12211
+ variantId: "expansive",
12212
+ label: "Expansive",
12213
+ variantLabel: "Expansive",
12214
+ treatment: {
12215
+ kind: "soft-fade",
12216
+ height: "expansive",
12217
+ curve: "expansive"
12218
+ },
12219
+ size: "expansive",
12220
+ heightExpression: "14rem",
12221
+ shape: { kind: "fade" }
12222
+ },
12223
+ {
12224
+ intent: "wave-edge-balanced",
12225
+ optionId: asBoundaryOptionId("break:wave-balanced"),
12226
+ family: "wave",
12227
+ variantId: "balanced",
12228
+ label: "Balanced wave",
12229
+ variantLabel: "Balanced",
12230
+ treatment: {
12231
+ kind: "wave-edge",
12232
+ height: "medium",
12233
+ amplitude: "balanced",
12234
+ rhythm: "double",
12235
+ symmetry: "symmetrical"
12236
+ },
12237
+ size: "medium",
12238
+ heightExpression: mediumHeight,
12239
+ shape: {
12240
+ kind: "wave",
12241
+ mask: "balanced"
12242
+ }
12243
+ },
12244
+ {
12245
+ intent: "wave-edge",
12246
+ optionId: asBoundaryOptionId("break:wave"),
12247
+ family: "wave",
12248
+ variantId: "classic",
12249
+ label: "Classic wave",
12250
+ variantLabel: "Classic",
12251
+ treatment: {
12252
+ kind: "wave-edge",
12253
+ height: "medium",
12254
+ amplitude: "balanced",
12255
+ rhythm: "double",
12256
+ symmetry: "asymmetrical"
12257
+ },
12258
+ size: "medium",
12259
+ heightExpression: mediumHeight,
12260
+ shape: {
12261
+ kind: "wave",
12262
+ mask: "classic"
12263
+ }
12264
+ },
12265
+ {
12266
+ intent: "wave-edge-gentle",
12267
+ optionId: asBoundaryOptionId("break:wave-gentle"),
12268
+ family: "wave",
12269
+ variantId: "gentle",
12270
+ label: "Gentle wave",
12271
+ variantLabel: "Gentle",
12272
+ treatment: {
12273
+ kind: "wave-edge",
12274
+ height: "compact",
12275
+ amplitude: "subtle",
12276
+ rhythm: "single",
12277
+ symmetry: "symmetrical"
12278
+ },
12279
+ size: "compact",
12280
+ heightExpression: compactHeight,
12281
+ shape: {
12282
+ kind: "wave",
12283
+ mask: "gentle"
12284
+ }
12285
+ },
12286
+ {
12287
+ intent: "wave-edge-bold",
12288
+ optionId: asBoundaryOptionId("break:wave-bold"),
12289
+ family: "wave",
12290
+ variantId: "bold",
12291
+ label: "Bold wave",
12292
+ variantLabel: "Bold",
12293
+ treatment: {
12294
+ kind: "wave-edge",
12295
+ height: "large",
12296
+ amplitude: "bold",
12297
+ rhythm: "double",
12298
+ symmetry: "symmetrical"
12299
+ },
12300
+ size: "large",
12301
+ heightExpression: largeHeight,
12302
+ shape: {
12303
+ kind: "wave",
12304
+ mask: "bold"
12305
+ }
12306
+ },
12307
+ {
12308
+ intent: "wave-edge-drift",
12309
+ optionId: asBoundaryOptionId("break:wave-drift"),
12310
+ family: "wave",
12311
+ variantId: "drift",
12312
+ label: "Drift wave",
12313
+ variantLabel: "Drift",
12314
+ treatment: {
12315
+ kind: "wave-edge",
12316
+ height: "medium",
12317
+ amplitude: "balanced",
12318
+ rhythm: "double",
12319
+ symmetry: "drift"
12320
+ },
12321
+ size: "medium",
12322
+ heightExpression: mediumHeight,
12323
+ shape: {
12324
+ kind: "wave",
12325
+ mask: "drift"
12326
+ }
12327
+ },
12328
+ {
12329
+ intent: "angle-edge-subtle",
12330
+ optionId: asBoundaryOptionId("break:angle-subtle"),
12331
+ family: "angle",
12332
+ variantId: "subtle",
12333
+ label: "Subtle angle",
12334
+ variantLabel: "Subtle",
12335
+ treatment: {
12336
+ kind: "angle-edge",
12337
+ height: "compact",
12338
+ slope: "subtle",
12339
+ direction: "forward"
12340
+ },
12341
+ size: "compact",
12342
+ heightExpression: compactHeight,
12343
+ shape: {
12344
+ kind: "angle",
12345
+ polygon: {
12346
+ startTopPercent: 34,
12347
+ endTopPercent: 18
12348
+ }
12349
+ }
12350
+ },
12351
+ {
12352
+ intent: "angle-edge",
12353
+ optionId: asBoundaryOptionId("break:angle-balanced"),
12354
+ family: "angle",
12355
+ variantId: "balanced",
12356
+ label: "Balanced angle",
12357
+ variantLabel: "Balanced",
12358
+ treatment: {
12359
+ kind: "angle-edge",
12360
+ height: "medium",
12361
+ slope: "balanced",
12362
+ direction: "forward"
12363
+ },
12364
+ size: "medium",
12365
+ heightExpression: mediumHeight,
12366
+ shape: {
12367
+ kind: "angle",
12368
+ polygon: {
12369
+ startTopPercent: 42,
12370
+ endTopPercent: 8
12371
+ }
12372
+ }
12373
+ },
12374
+ {
12375
+ intent: "angle-edge-steep",
12376
+ optionId: asBoundaryOptionId("break:angle-steep"),
12377
+ family: "angle",
12378
+ variantId: "steep",
12379
+ label: "Steep angle",
12380
+ variantLabel: "Steep",
12381
+ treatment: {
12382
+ kind: "angle-edge",
12383
+ height: "large",
12384
+ slope: "steep",
12385
+ direction: "forward"
12386
+ },
12387
+ size: "large",
12388
+ heightExpression: largeHeight,
12389
+ shape: {
12390
+ kind: "angle",
12391
+ polygon: {
12392
+ startTopPercent: 54,
12393
+ endTopPercent: 0
12394
+ }
12395
+ }
12396
+ }
12397
+ ]);
12033
12398
  //#endregion
12034
12399
  //#region ../theme-core/src/site-styles/sectionTransitions.ts
12035
12400
  function boundaryRuntimeMetrics(family, size, heightExpression) {
@@ -12040,42 +12405,106 @@ function boundaryRuntimeMetrics(family, size, heightExpression) {
12040
12405
  reserveCss: `calc((${heightExpression}) / 2)`
12041
12406
  };
12042
12407
  }
12043
- boundaryRuntimeMetrics("gradient", "medium", "6rem + 2px"), boundaryRuntimeMetrics("gradient", "spacious", "10rem"), boundaryRuntimeMetrics("gradient", "expansive", "14rem"), boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"), boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"), boundaryRuntimeMetrics("wave", "compact", "4.5rem + 2px"), boundaryRuntimeMetrics("wave", "large", "7rem + 2px"), boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"), boundaryRuntimeMetrics("angle", "medium", "6rem + 2px"), boundaryRuntimeMetrics("angle", "compact", "4.5rem + 2px"), boundaryRuntimeMetrics("angle", "large", "7rem + 2px");
12408
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, entry]));
12409
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, boundaryRuntimeMetrics(entry.family, entry.size, entry.heightExpression)]));
12410
+ /**
12411
+ * The catalogue's compile-time coverage check guarantees an entry per
12412
+ * decorative intent, so a miss here is a broken invariant, not bad input.
12413
+ */
12414
+ function requireCatalogueValue(values, intent) {
12415
+ const value = values.get(intent);
12416
+ if (value === void 0) throw new Error(`Transition catalogue has no entry for ${intent}`);
12417
+ return value;
12418
+ }
12044
12419
  const noneBoundaryOption = {
12045
12420
  id: asBoundaryOptionId("break:none"),
12046
12421
  label: "None",
12047
12422
  transitionAfter: "none",
12048
12423
  treatment: { kind: "none" }
12049
12424
  };
12050
- const softBoundaryOption = {
12051
- id: asBoundaryOptionId("break:soft"),
12052
- label: "Soft",
12053
- transitionAfter: "soft-fade-short",
12054
- treatment: {
12055
- kind: "soft-fade",
12056
- height: "medium",
12057
- curve: "soft"
12058
- }
12425
+ const boundaryOptionByIntent = new Map(transitionCatalogueEntries.map((entry) => [entry.intent, {
12426
+ id: entry.optionId,
12427
+ label: entry.label,
12428
+ transitionAfter: entry.intent,
12429
+ treatment: entry.treatment
12430
+ }]));
12431
+ function boundaryOptionForTransitionIntent(intent) {
12432
+ return requireCatalogueValue(boundaryOptionByIntent, intent);
12433
+ }
12434
+ const softBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-short");
12435
+ const spaciousBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-long");
12436
+ boundaryOptionForTransitionIntent("soft-fade-expansive");
12437
+ boundaryOptionForTransitionIntent("wave-edge");
12438
+ boundaryOptionForTransitionIntent("wave-edge-balanced");
12439
+ boundaryOptionForTransitionIntent("wave-edge-gentle");
12440
+ boundaryOptionForTransitionIntent("wave-edge-bold");
12441
+ boundaryOptionForTransitionIntent("wave-edge-drift");
12442
+ boundaryOptionForTransitionIntent("angle-edge-subtle");
12443
+ boundaryOptionForTransitionIntent("angle-edge");
12444
+ boundaryOptionForTransitionIntent("angle-edge-steep");
12445
+ /**
12446
+ * Must remain non-empty; downstream code indexes `[0]` as the documented default.
12447
+ */
12448
+ const boundaryOptions = [noneBoundaryOption, ...transitionCatalogueEntries.map((entry) => boundaryOptionForTransitionIntent(entry.intent))];
12449
+ const noneTransitionVariant = {
12450
+ familyId: "none",
12451
+ variantId: "none",
12452
+ label: "None",
12453
+ boundaryOption: noneBoundaryOption
12059
12454
  };
12060
- const spaciousBoundaryOption = {
12061
- id: asBoundaryOptionId("break:spacious"),
12062
- label: "Spacious",
12063
- transitionAfter: "soft-fade-long",
12064
- treatment: {
12065
- kind: "soft-fade",
12066
- height: "large",
12067
- curve: "spacious"
12068
- }
12455
+ function transitionVariantForEntry(entry) {
12456
+ return {
12457
+ familyId: entry.family,
12458
+ variantId: entry.variantId,
12459
+ label: entry.variantLabel,
12460
+ boundaryOption: boundaryOptionForTransitionIntent(entry.intent)
12461
+ };
12462
+ }
12463
+ const sectionTransitionFamilies = [{
12464
+ id: "none",
12465
+ label: "None",
12466
+ variants: [noneTransitionVariant]
12467
+ }, ...transitionCatalogueFamilies.map((family) => ({
12468
+ id: family.id,
12469
+ label: family.label,
12470
+ variants: requireNonEmptyReadonlyArray(transitionCatalogueEntries.filter((entry) => entry.family === family.id).map(transitionVariantForEntry), `Transition family ${family.id} has no catalogue entries.`)
12471
+ }))];
12472
+ new Map(boundaryOptions.map((option) => [option.id, option]));
12473
+ new Map(boundaryOptions.map((option) => [stableTreatmentKey(option.treatment), option]));
12474
+ new Map(sectionTransitionFamilies.flatMap((family) => family.variants.map((variant) => [variant.boundaryOption.id, variant])));
12475
+ new Map(sectionTransitionFamilies.map((family) => [family.id, family]));
12476
+ function stableTreatmentKey(treatment) {
12477
+ switch (treatment.kind) {
12478
+ case "none": return "none";
12479
+ case "soft-fade": return `${treatment.kind}:${treatment.height}:${treatment.curve}`;
12480
+ case "wave-edge": return [
12481
+ treatment.kind,
12482
+ treatment.height,
12483
+ treatment.amplitude,
12484
+ treatment.rhythm,
12485
+ treatment.symmetry
12486
+ ].join(":");
12487
+ case "angle-edge": return [
12488
+ treatment.kind,
12489
+ treatment.height,
12490
+ treatment.slope,
12491
+ treatment.direction
12492
+ ].join(":");
12493
+ case "legacy-unsupported": return `${treatment.kind}:${treatment.boundaryOptionId}`;
12494
+ }
12495
+ }
12496
+ requireThemeColorToken$1("background");
12497
+ function requireThemeColorToken$1(value) {
12498
+ const token = parseThemeColorToken(value);
12499
+ if (!token) throw new Error(`Expected a theme color token. Received: ${value}`);
12500
+ return token;
12501
+ }
12502
+ //#endregion
12503
+ //#region ../theme-core/src/site-styles/compilationPlan.ts
12504
+ const defaultHeaderBrandPreferences = {
12505
+ brandDisplay: "auto",
12506
+ logoSize: "auto"
12069
12507
  };
12070
- asBoundaryOptionId("break:expansive");
12071
- asBoundaryOptionId("break:wave");
12072
- asBoundaryOptionId("break:wave-balanced");
12073
- asBoundaryOptionId("break:wave-gentle");
12074
- asBoundaryOptionId("break:wave-bold");
12075
- asBoundaryOptionId("break:wave-drift");
12076
- asBoundaryOptionId("break:angle-subtle");
12077
- asBoundaryOptionId("break:angle-balanced");
12078
- asBoundaryOptionId("break:angle-steep");
12079
12508
  asBoundaryOptionId("break:unknown");
12080
12509
  const pageDesignUserPinnedAppearanceChoiceSchema = z.object({
12081
12510
  kind: z.literal("user-pinned"),
@@ -12202,14 +12631,11 @@ function validateUniquePageDesignPins(intent, ctx) {
12202
12631
  label: "block Look pin"
12203
12632
  });
12204
12633
  addDuplicateStringIssues(ctx, {
12205
- values: intent.boundaryPins.map((pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)),
12634
+ values: intent.boundaryPins.map((pin) => makeBoundaryId(pin.previousBlockId, pin.nextBlockId)),
12206
12635
  path: ["boundaryPins"],
12207
12636
  label: "boundary pin"
12208
12637
  });
12209
12638
  }
12210
- function boundaryKey(previousBlockId, nextBlockId) {
12211
- return makeBoundaryId(previousBlockId, nextBlockId);
12212
- }
12213
12639
  //#endregion
12214
12640
  //#region ../theme-core/src/accordions/siteStyleDefaults.ts
12215
12641
  /**
@@ -13837,6 +14263,13 @@ z.object({
13837
14263
  fields: nonEmptyRuntimeStyleFieldNamesSchema,
13838
14264
  authority: styleAuthoritySchema
13839
14265
  }).strict();
14266
+ asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
14267
+ asPageFlowPresetId("generated-default");
14268
+ asSiteStyleId("site-style:south-west-twerk-school");
14269
+ asAppearancePresetId("hero-brand-scrim-fixed-frame");
14270
+ asLayoutVariantKey("classic");
14271
+ asLayoutVariantKey("micro");
14272
+ asBoundaryOptionId("break:wave");
13840
14273
  //#endregion
13841
14274
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
13842
14275
  function defineSectionForegroundRuntimeTokens(input) {
@@ -13860,7 +14293,7 @@ function defineComponentRuntimeRules(rules) {
13860
14293
  }
13861
14294
  /**
13862
14295
  * Default design rules translate semantic page-level choices into the current
13863
- * runtime's section background and transition style-group vocabulary.
14296
+ * runtime's section background vocabulary.
13864
14297
  */
13865
14298
  const defaultDesignRuntimeRules = defineDesignRuntimeRules({
13866
14299
  sectionSurfaces: {
@@ -13895,8 +14328,7 @@ const defaultDesignRuntimeRules = defineDesignRuntimeRules({
13895
14328
  color: "surface",
13896
14329
  opacity: .88
13897
14330
  }
13898
- },
13899
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
14331
+ }
13900
14332
  });
13901
14333
  /**
13902
14334
  * Default component rules translate frame and item-surface semantics into the
@@ -15631,19 +16063,11 @@ const curatedSiteStyles = [
15631
16063
  })
15632
16064
  ];
15633
16065
  new Map(curatedSiteStyles.map((style) => [style.id, style]));
15634
- asPageFlowPresetId("generated-default");
15635
- asSiteStyleId("site-style:south-west-twerk-school");
15636
- asAppearancePresetId("hero-brand-scrim-fixed-frame");
15637
- asLayoutVariantKey("classic");
15638
- asLayoutVariantKey("micro");
15639
- asBoundaryOptionId("break:wave");
15640
- asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
15641
16066
  //#endregion
15642
16067
  //#region ../theme-core/src/site-styles/resolver.ts
15643
16068
  const blockDesignFallback = {
15644
16069
  sectionSurface: "base",
15645
16070
  contentFrame: plainFrame,
15646
- transitionAfter: "none",
15647
16071
  sectionHeight: "default",
15648
16072
  heroLegibility: "none",
15649
16073
  imageSurfaceTreatment: { kind: "none" },
@@ -15654,7 +16078,7 @@ const blockDesignFallback = {
15654
16078
  accordionIconTreatment: null,
15655
16079
  composition: null
15656
16080
  };
15657
- blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.transitionAfter, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
16081
+ blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
15658
16082
  //#endregion
15659
16083
  //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
15660
16084
  const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
@@ -16466,7 +16890,8 @@ const siteOptionSources = [
16466
16890
  "eventCategories",
16467
16891
  "eventSeries",
16468
16892
  "venues",
16469
- "staffMembers"
16893
+ "staffMembers",
16894
+ "appointmentServiceCategories"
16470
16895
  ];
16471
16896
  const mediaDeliverySchema = z.object({
16472
16897
  sizes: z.string().optional(),
@@ -27334,6 +27759,15 @@ const appointmentServicesBlockDefinition = {
27334
27759
  required: false,
27335
27760
  ui: { intent: "content" }
27336
27761
  },
27762
+ createSiteOptionSelectField({
27763
+ id: "categoryId",
27764
+ label: "Category",
27765
+ description: "Show one category (with its heading and intro), or leave it on All categories to show everything grouped.",
27766
+ required: false,
27767
+ multiple: false,
27768
+ optionSource: "appointmentServiceCategories",
27769
+ ui: { intent: "content" }
27770
+ }),
27337
27771
  sectionStylesField({
27338
27772
  id: "_sectionStyles",
27339
27773
  label: "Section styles",
@@ -27368,6 +27802,7 @@ const appointmentServicesBlockDefinition = {
27368
27802
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
27369
27803
  el("appointment-services", {
27370
27804
  sectionHeading: { $bind: { from: "content.heading" } },
27805
+ categoryId: { $bind: { from: "content.categoryId" } },
27371
27806
  services: { $bind: { from: "data.services" } },
27372
27807
  pathname: { $bind: { from: "$root.pathname" } },
27373
27808
  servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
@@ -38715,7 +39150,12 @@ const appointmentSetupServiceDraftSchema = z.object({
38715
39150
  venue: appointmentSetupVenueChoiceSchema,
38716
39151
  timezone: z.string().trim().min(1).nullable(),
38717
39152
  payment: appointmentSetupPaymentDraftSchema,
38718
- assignment: appointmentSetupServiceAssignmentDraftSchema
39153
+ assignment: appointmentSetupServiceAssignmentDraftSchema,
39154
+ /**
39155
+ * The service's category, or null for "Other" (issue 1403). Omitted leaves
39156
+ * an existing service's category alone and puts a new one in "Other".
39157
+ */
39158
+ categoryId: z.string().uuid().nullable().optional()
38719
39159
  }).superRefine((service, ctx) => {
38720
39160
  if (service.payment.kind !== "free" && (service.priceAmount === null || service.priceAmount <= 0)) ctx.addIssue({
38721
39161
  code: "custom",