@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
@@ -54,6 +54,75 @@ const footerModeSchema = z.enum([
54
54
  "none"
55
55
  ]);
56
56
  //#endregion
57
+ //#region ../api/src/defineEndpointDefinitions.ts
58
+ /**
59
+ * Validates extracted endpoint descriptors while preserving each literal path,
60
+ * method, and parameter contract for the typed URL builders.
61
+ */
62
+ function defineEndpointDefinitions(definitions) {
63
+ return definitions;
64
+ }
65
+ //#endregion
66
+ //#region ../api/src/publicNewsletterEndpointDefinitions.ts
67
+ const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
68
+ subscribeNewsletter: {
69
+ path: "/public/sites/{siteId}/newsletter/subscribe",
70
+ method: "POST",
71
+ tags: ["public-newsletter-{siteId}"],
72
+ auth: "public",
73
+ responseKind: "json"
74
+ },
75
+ confirmNewsletter: {
76
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
77
+ method: "GET",
78
+ tags: ["public-newsletter-{siteId}"],
79
+ auth: "public",
80
+ responseKind: "text"
81
+ },
82
+ unsubscribeNewsletter: {
83
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
84
+ method: "GET",
85
+ tags: ["public-newsletter-{siteId}"],
86
+ auth: "public",
87
+ responseKind: "text"
88
+ },
89
+ unsubscribeNewsletterPost: {
90
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
91
+ method: "POST",
92
+ tags: ["public-newsletter-{siteId}"],
93
+ auth: "public",
94
+ responseKind: "text"
95
+ },
96
+ confirmNewsletterPost: {
97
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
98
+ method: "POST",
99
+ tags: ["public-newsletter-{siteId}"],
100
+ auth: "public",
101
+ responseKind: "text"
102
+ },
103
+ getNewsletterPreferences: {
104
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
105
+ method: "GET",
106
+ tags: ["public-newsletter-{siteId}"],
107
+ auth: "public",
108
+ responseKind: "text"
109
+ },
110
+ saveNewsletterPreferences: {
111
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
112
+ method: "POST",
113
+ tags: ["public-newsletter-{siteId}"],
114
+ auth: "public",
115
+ responseKind: "text"
116
+ },
117
+ getNewsletterArchive: {
118
+ path: "/public/sites/{siteId}/newsletter/archive/{token}",
119
+ method: "GET",
120
+ tags: ["public-newsletter-{siteId}"],
121
+ auth: "public",
122
+ responseKind: "text"
123
+ }
124
+ });
125
+ //#endregion
57
126
  //#region ../api/src/apiEndpointTypes.ts
58
127
  function allowedDemoMutationPolicy() {
59
128
  return {
@@ -145,17 +214,85 @@ const SDK_ENTRY_READ_ENDPOINTS = {
145
214
  }
146
215
  };
147
216
  //#endregion
148
- //#region ../api/src/defineEndpointDefinitions.ts
149
- /**
150
- * Validates extracted endpoint descriptors while preserving each literal path,
151
- * method, and parameter contract for the typed URL builders.
152
- */
153
- function defineEndpointDefinitions(definitions) {
154
- return definitions;
155
- }
156
- //#endregion
157
217
  //#region ../api/src/appointmentEndpointDefinitions.ts
158
218
  const APPOINTMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
219
+ ...defineEndpointDefinitions({
220
+ listGroupedAppointmentServices: {
221
+ path: "/sites/{siteId}/bookings/services/grouped",
222
+ method: "GET",
223
+ auth: "user",
224
+ responseKind: "json",
225
+ errors: ["server:internal_error"]
226
+ },
227
+ reorderAppointmentServices: {
228
+ path: "/sites/{siteId}/bookings/services/order",
229
+ method: "PUT",
230
+ auth: "user",
231
+ responseKind: "json",
232
+ errors: [
233
+ "validation:invalid_input",
234
+ "auth:forbidden",
235
+ "resource:not_found",
236
+ "resource:conflict",
237
+ "server:internal_error"
238
+ ]
239
+ },
240
+ listAppointmentServiceCategories: {
241
+ path: "/sites/{siteId}/bookings/service-categories",
242
+ method: "GET",
243
+ auth: "user",
244
+ responseKind: "json",
245
+ errors: ["server:internal_error"]
246
+ },
247
+ createAppointmentServiceCategory: {
248
+ path: "/sites/{siteId}/bookings/service-categories",
249
+ method: "POST",
250
+ auth: "user",
251
+ responseKind: "json",
252
+ errors: [
253
+ "validation:invalid_input",
254
+ "auth:forbidden",
255
+ "resource:conflict",
256
+ "server:internal_error"
257
+ ]
258
+ },
259
+ updateAppointmentServiceCategory: {
260
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
261
+ method: "PUT",
262
+ auth: "user",
263
+ responseKind: "json",
264
+ errors: [
265
+ "validation:invalid_input",
266
+ "auth:forbidden",
267
+ "resource:not_found",
268
+ "resource:conflict",
269
+ "server:internal_error"
270
+ ]
271
+ },
272
+ deleteAppointmentServiceCategory: {
273
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
274
+ method: "DELETE",
275
+ auth: "user",
276
+ responseKind: "json",
277
+ errors: [
278
+ "auth:forbidden",
279
+ "resource:not_found",
280
+ "server:internal_error"
281
+ ]
282
+ },
283
+ reorderAppointmentServiceCategories: {
284
+ path: "/sites/{siteId}/bookings/service-categories/order",
285
+ method: "PUT",
286
+ auth: "user",
287
+ responseKind: "json",
288
+ errors: [
289
+ "validation:invalid_input",
290
+ "auth:forbidden",
291
+ "resource:conflict",
292
+ "server:internal_error"
293
+ ]
294
+ }
295
+ }),
159
296
  listAppointmentResources: {
160
297
  path: "/sites/{siteId}/bookings/resources",
161
298
  method: "GET",
@@ -1303,39 +1440,6 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1303
1440
  auth: "user",
1304
1441
  responseKind: "json",
1305
1442
  demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1306
- },
1307
- listNewsletterSendJobs: {
1308
- path: "/sites/{siteId}/newsletter/jobs",
1309
- method: "GET",
1310
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1311
- auth: "user",
1312
- responseKind: "json"
1313
- },
1314
- retryNewsletterSendJob: {
1315
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/retry",
1316
- method: "POST",
1317
- errors: [
1318
- "validation:invalid_input",
1319
- "resource:not_found",
1320
- "auth:forbidden",
1321
- "server:internal_error"
1322
- ],
1323
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1324
- auth: "user",
1325
- responseKind: "json"
1326
- },
1327
- cancelNewsletterSendJob: {
1328
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/cancel",
1329
- method: "POST",
1330
- errors: [
1331
- "validation:invalid_input",
1332
- "resource:not_found",
1333
- "auth:forbidden",
1334
- "server:internal_error"
1335
- ],
1336
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1337
- auth: "user",
1338
- responseKind: "json"
1339
1443
  }
1340
1444
  });
1341
1445
  //#endregion
@@ -3443,6 +3547,7 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3443
3547
  }
3444
3548
  });
3445
3549
  ({
3550
+ ...PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS,
3446
3551
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
3447
3552
  ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
3448
3553
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
@@ -10165,6 +10270,15 @@ function asSiteStyleId(value) {
10165
10270
  function asDesignSystemTemplateId(value) {
10166
10271
  return brandNonEmptyString(value, "DesignSystemTemplateId");
10167
10272
  }
10273
+ function toNonEmptyReadonlyArray(values) {
10274
+ const [first, ...rest] = values;
10275
+ return first === void 0 ? null : [first, ...rest];
10276
+ }
10277
+ function requireNonEmptyReadonlyArray(values, message = "Expected a non-empty array.") {
10278
+ const result = toNonEmptyReadonlyArray(values);
10279
+ if (!result) throw new Error(message);
10280
+ return result;
10281
+ }
10168
10282
  function makeBoundaryId(previousBlockId, nextBlockId) {
10169
10283
  return asDesignBoundaryId(`boundary:${encodeURIComponent(previousBlockId)}:${encodeURIComponent(nextBlockId)}`);
10170
10284
  }
@@ -10367,16 +10481,18 @@ const themeV2RuntimeStyleFieldNames = [
10367
10481
  "_frameStyles",
10368
10482
  "_sectionStyles",
10369
10483
  "_containerStyles",
10370
- "_cardStyles",
10371
- "_transitionStyles",
10372
- "styleGroup"
10484
+ "_cardStyles"
10373
10485
  ];
10374
10486
  const themeV2BlockSpecificRawStyleFieldNames = [
10375
10487
  "_contentCardStyles",
10376
10488
  "_heroLayoutStyles",
10377
10489
  "_textCardStyles"
10378
10490
  ];
10379
- const themeV2NormalEditorRawStyleFieldNames = [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
10491
+ const themeV2NormalEditorRawStyleFieldNames = [
10492
+ ...themeV2RuntimeStyleFieldNames,
10493
+ ...themeV2BlockSpecificRawStyleFieldNames,
10494
+ "styleGroup"
10495
+ ];
10380
10496
  new Set(themeV2NormalEditorRawStyleFieldNames);
10381
10497
  [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
10382
10498
  const pageDesignEditorBackgroundOverrideOwner = "page-design-editor";
@@ -12102,11 +12218,260 @@ function cardRoleFromLegacyVocabulary(value) {
12102
12218
  */
12103
12219
  const cardRoleWithLegacyAliasSchema = z.preprocess((value) => cardRoleFromLegacyVocabulary(value) ?? value, cardRoleSchema);
12104
12220
  //#endregion
12105
- //#region ../theme-core/src/site-styles/compilationPlan.ts
12106
- const defaultHeaderBrandPreferences = {
12107
- brandDisplay: "auto",
12108
- logoSize: "auto"
12109
- };
12221
+ //#region ../theme-core/src/site-styles/transitionCatalogue.ts
12222
+ /**
12223
+ * Family order for pickers. Entries below are listed family by family in this
12224
+ * same order, so the flat option list and the grouped families agree.
12225
+ */
12226
+ const transitionCatalogueFamilies = [
12227
+ {
12228
+ id: "gradient",
12229
+ label: "Gradient"
12230
+ },
12231
+ {
12232
+ id: "wave",
12233
+ label: "Wave"
12234
+ },
12235
+ {
12236
+ id: "angle",
12237
+ label: "Angle"
12238
+ }
12239
+ ];
12240
+ const mediumHeight = "6rem + 2px";
12241
+ const compactHeight = "4.5rem + 2px";
12242
+ const largeHeight = "7rem + 2px";
12243
+ /**
12244
+ * The single source of transition vocabulary. Order is significant: it is the
12245
+ * order of `boundaryOptions` (after `none`) and of each family's variants,
12246
+ * which persisted pins, page-flow presets and the editor picker all rely on.
12247
+ *
12248
+ * Shapes match what `generateLayoutCss` draws today. Structured
12249
+ * amplitude/frequency treatments (issue 826) extend this list later.
12250
+ */
12251
+ const transitionCatalogueEntries = defineExactCatalog()([
12252
+ {
12253
+ intent: "soft-fade-short",
12254
+ optionId: asBoundaryOptionId("break:soft"),
12255
+ family: "gradient",
12256
+ variantId: "soft",
12257
+ label: "Soft",
12258
+ variantLabel: "Soft",
12259
+ treatment: {
12260
+ kind: "soft-fade",
12261
+ height: "medium",
12262
+ curve: "soft"
12263
+ },
12264
+ size: "medium",
12265
+ heightExpression: mediumHeight,
12266
+ shape: { kind: "fade" }
12267
+ },
12268
+ {
12269
+ intent: "soft-fade-long",
12270
+ optionId: asBoundaryOptionId("break:spacious"),
12271
+ family: "gradient",
12272
+ variantId: "spacious",
12273
+ label: "Spacious",
12274
+ variantLabel: "Spacious",
12275
+ treatment: {
12276
+ kind: "soft-fade",
12277
+ height: "large",
12278
+ curve: "spacious"
12279
+ },
12280
+ size: "spacious",
12281
+ heightExpression: "10rem",
12282
+ shape: { kind: "fade" }
12283
+ },
12284
+ {
12285
+ intent: "soft-fade-expansive",
12286
+ optionId: asBoundaryOptionId("break:expansive"),
12287
+ family: "gradient",
12288
+ variantId: "expansive",
12289
+ label: "Expansive",
12290
+ variantLabel: "Expansive",
12291
+ treatment: {
12292
+ kind: "soft-fade",
12293
+ height: "expansive",
12294
+ curve: "expansive"
12295
+ },
12296
+ size: "expansive",
12297
+ heightExpression: "14rem",
12298
+ shape: { kind: "fade" }
12299
+ },
12300
+ {
12301
+ intent: "wave-edge-balanced",
12302
+ optionId: asBoundaryOptionId("break:wave-balanced"),
12303
+ family: "wave",
12304
+ variantId: "balanced",
12305
+ label: "Balanced wave",
12306
+ variantLabel: "Balanced",
12307
+ treatment: {
12308
+ kind: "wave-edge",
12309
+ height: "medium",
12310
+ amplitude: "balanced",
12311
+ rhythm: "double",
12312
+ symmetry: "symmetrical"
12313
+ },
12314
+ size: "medium",
12315
+ heightExpression: mediumHeight,
12316
+ shape: {
12317
+ kind: "wave",
12318
+ mask: "balanced"
12319
+ }
12320
+ },
12321
+ {
12322
+ intent: "wave-edge",
12323
+ optionId: asBoundaryOptionId("break:wave"),
12324
+ family: "wave",
12325
+ variantId: "classic",
12326
+ label: "Classic wave",
12327
+ variantLabel: "Classic",
12328
+ treatment: {
12329
+ kind: "wave-edge",
12330
+ height: "medium",
12331
+ amplitude: "balanced",
12332
+ rhythm: "double",
12333
+ symmetry: "asymmetrical"
12334
+ },
12335
+ size: "medium",
12336
+ heightExpression: mediumHeight,
12337
+ shape: {
12338
+ kind: "wave",
12339
+ mask: "classic"
12340
+ }
12341
+ },
12342
+ {
12343
+ intent: "wave-edge-gentle",
12344
+ optionId: asBoundaryOptionId("break:wave-gentle"),
12345
+ family: "wave",
12346
+ variantId: "gentle",
12347
+ label: "Gentle wave",
12348
+ variantLabel: "Gentle",
12349
+ treatment: {
12350
+ kind: "wave-edge",
12351
+ height: "compact",
12352
+ amplitude: "subtle",
12353
+ rhythm: "single",
12354
+ symmetry: "symmetrical"
12355
+ },
12356
+ size: "compact",
12357
+ heightExpression: compactHeight,
12358
+ shape: {
12359
+ kind: "wave",
12360
+ mask: "gentle"
12361
+ }
12362
+ },
12363
+ {
12364
+ intent: "wave-edge-bold",
12365
+ optionId: asBoundaryOptionId("break:wave-bold"),
12366
+ family: "wave",
12367
+ variantId: "bold",
12368
+ label: "Bold wave",
12369
+ variantLabel: "Bold",
12370
+ treatment: {
12371
+ kind: "wave-edge",
12372
+ height: "large",
12373
+ amplitude: "bold",
12374
+ rhythm: "double",
12375
+ symmetry: "symmetrical"
12376
+ },
12377
+ size: "large",
12378
+ heightExpression: largeHeight,
12379
+ shape: {
12380
+ kind: "wave",
12381
+ mask: "bold"
12382
+ }
12383
+ },
12384
+ {
12385
+ intent: "wave-edge-drift",
12386
+ optionId: asBoundaryOptionId("break:wave-drift"),
12387
+ family: "wave",
12388
+ variantId: "drift",
12389
+ label: "Drift wave",
12390
+ variantLabel: "Drift",
12391
+ treatment: {
12392
+ kind: "wave-edge",
12393
+ height: "medium",
12394
+ amplitude: "balanced",
12395
+ rhythm: "double",
12396
+ symmetry: "drift"
12397
+ },
12398
+ size: "medium",
12399
+ heightExpression: mediumHeight,
12400
+ shape: {
12401
+ kind: "wave",
12402
+ mask: "drift"
12403
+ }
12404
+ },
12405
+ {
12406
+ intent: "angle-edge-subtle",
12407
+ optionId: asBoundaryOptionId("break:angle-subtle"),
12408
+ family: "angle",
12409
+ variantId: "subtle",
12410
+ label: "Subtle angle",
12411
+ variantLabel: "Subtle",
12412
+ treatment: {
12413
+ kind: "angle-edge",
12414
+ height: "compact",
12415
+ slope: "subtle",
12416
+ direction: "forward"
12417
+ },
12418
+ size: "compact",
12419
+ heightExpression: compactHeight,
12420
+ shape: {
12421
+ kind: "angle",
12422
+ polygon: {
12423
+ startTopPercent: 34,
12424
+ endTopPercent: 18
12425
+ }
12426
+ }
12427
+ },
12428
+ {
12429
+ intent: "angle-edge",
12430
+ optionId: asBoundaryOptionId("break:angle-balanced"),
12431
+ family: "angle",
12432
+ variantId: "balanced",
12433
+ label: "Balanced angle",
12434
+ variantLabel: "Balanced",
12435
+ treatment: {
12436
+ kind: "angle-edge",
12437
+ height: "medium",
12438
+ slope: "balanced",
12439
+ direction: "forward"
12440
+ },
12441
+ size: "medium",
12442
+ heightExpression: mediumHeight,
12443
+ shape: {
12444
+ kind: "angle",
12445
+ polygon: {
12446
+ startTopPercent: 42,
12447
+ endTopPercent: 8
12448
+ }
12449
+ }
12450
+ },
12451
+ {
12452
+ intent: "angle-edge-steep",
12453
+ optionId: asBoundaryOptionId("break:angle-steep"),
12454
+ family: "angle",
12455
+ variantId: "steep",
12456
+ label: "Steep angle",
12457
+ variantLabel: "Steep",
12458
+ treatment: {
12459
+ kind: "angle-edge",
12460
+ height: "large",
12461
+ slope: "steep",
12462
+ direction: "forward"
12463
+ },
12464
+ size: "large",
12465
+ heightExpression: largeHeight,
12466
+ shape: {
12467
+ kind: "angle",
12468
+ polygon: {
12469
+ startTopPercent: 54,
12470
+ endTopPercent: 0
12471
+ }
12472
+ }
12473
+ }
12474
+ ]);
12110
12475
  //#endregion
12111
12476
  //#region ../theme-core/src/site-styles/sectionTransitions.ts
12112
12477
  function boundaryRuntimeMetrics(family, size, heightExpression) {
@@ -12117,42 +12482,106 @@ function boundaryRuntimeMetrics(family, size, heightExpression) {
12117
12482
  reserveCss: `calc((${heightExpression}) / 2)`
12118
12483
  };
12119
12484
  }
12120
- 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");
12485
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, entry]));
12486
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, boundaryRuntimeMetrics(entry.family, entry.size, entry.heightExpression)]));
12487
+ /**
12488
+ * The catalogue's compile-time coverage check guarantees an entry per
12489
+ * decorative intent, so a miss here is a broken invariant, not bad input.
12490
+ */
12491
+ function requireCatalogueValue(values, intent) {
12492
+ const value = values.get(intent);
12493
+ if (value === void 0) throw new Error(`Transition catalogue has no entry for ${intent}`);
12494
+ return value;
12495
+ }
12121
12496
  const noneBoundaryOption = {
12122
12497
  id: asBoundaryOptionId("break:none"),
12123
12498
  label: "None",
12124
12499
  transitionAfter: "none",
12125
12500
  treatment: { kind: "none" }
12126
12501
  };
12127
- const softBoundaryOption = {
12128
- id: asBoundaryOptionId("break:soft"),
12129
- label: "Soft",
12130
- transitionAfter: "soft-fade-short",
12131
- treatment: {
12132
- kind: "soft-fade",
12133
- height: "medium",
12134
- curve: "soft"
12135
- }
12502
+ const boundaryOptionByIntent = new Map(transitionCatalogueEntries.map((entry) => [entry.intent, {
12503
+ id: entry.optionId,
12504
+ label: entry.label,
12505
+ transitionAfter: entry.intent,
12506
+ treatment: entry.treatment
12507
+ }]));
12508
+ function boundaryOptionForTransitionIntent(intent) {
12509
+ return requireCatalogueValue(boundaryOptionByIntent, intent);
12510
+ }
12511
+ const softBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-short");
12512
+ const spaciousBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-long");
12513
+ boundaryOptionForTransitionIntent("soft-fade-expansive");
12514
+ boundaryOptionForTransitionIntent("wave-edge");
12515
+ boundaryOptionForTransitionIntent("wave-edge-balanced");
12516
+ boundaryOptionForTransitionIntent("wave-edge-gentle");
12517
+ boundaryOptionForTransitionIntent("wave-edge-bold");
12518
+ boundaryOptionForTransitionIntent("wave-edge-drift");
12519
+ boundaryOptionForTransitionIntent("angle-edge-subtle");
12520
+ boundaryOptionForTransitionIntent("angle-edge");
12521
+ boundaryOptionForTransitionIntent("angle-edge-steep");
12522
+ /**
12523
+ * Must remain non-empty; downstream code indexes `[0]` as the documented default.
12524
+ */
12525
+ const boundaryOptions = [noneBoundaryOption, ...transitionCatalogueEntries.map((entry) => boundaryOptionForTransitionIntent(entry.intent))];
12526
+ const noneTransitionVariant = {
12527
+ familyId: "none",
12528
+ variantId: "none",
12529
+ label: "None",
12530
+ boundaryOption: noneBoundaryOption
12136
12531
  };
12137
- const spaciousBoundaryOption = {
12138
- id: asBoundaryOptionId("break:spacious"),
12139
- label: "Spacious",
12140
- transitionAfter: "soft-fade-long",
12141
- treatment: {
12142
- kind: "soft-fade",
12143
- height: "large",
12144
- curve: "spacious"
12145
- }
12532
+ function transitionVariantForEntry(entry) {
12533
+ return {
12534
+ familyId: entry.family,
12535
+ variantId: entry.variantId,
12536
+ label: entry.variantLabel,
12537
+ boundaryOption: boundaryOptionForTransitionIntent(entry.intent)
12538
+ };
12539
+ }
12540
+ const sectionTransitionFamilies = [{
12541
+ id: "none",
12542
+ label: "None",
12543
+ variants: [noneTransitionVariant]
12544
+ }, ...transitionCatalogueFamilies.map((family) => ({
12545
+ id: family.id,
12546
+ label: family.label,
12547
+ variants: requireNonEmptyReadonlyArray(transitionCatalogueEntries.filter((entry) => entry.family === family.id).map(transitionVariantForEntry), `Transition family ${family.id} has no catalogue entries.`)
12548
+ }))];
12549
+ new Map(boundaryOptions.map((option) => [option.id, option]));
12550
+ new Map(boundaryOptions.map((option) => [stableTreatmentKey(option.treatment), option]));
12551
+ new Map(sectionTransitionFamilies.flatMap((family) => family.variants.map((variant) => [variant.boundaryOption.id, variant])));
12552
+ new Map(sectionTransitionFamilies.map((family) => [family.id, family]));
12553
+ function stableTreatmentKey(treatment) {
12554
+ switch (treatment.kind) {
12555
+ case "none": return "none";
12556
+ case "soft-fade": return `${treatment.kind}:${treatment.height}:${treatment.curve}`;
12557
+ case "wave-edge": return [
12558
+ treatment.kind,
12559
+ treatment.height,
12560
+ treatment.amplitude,
12561
+ treatment.rhythm,
12562
+ treatment.symmetry
12563
+ ].join(":");
12564
+ case "angle-edge": return [
12565
+ treatment.kind,
12566
+ treatment.height,
12567
+ treatment.slope,
12568
+ treatment.direction
12569
+ ].join(":");
12570
+ case "legacy-unsupported": return `${treatment.kind}:${treatment.boundaryOptionId}`;
12571
+ }
12572
+ }
12573
+ requireThemeColorToken$1("background");
12574
+ function requireThemeColorToken$1(value) {
12575
+ const token = parseThemeColorToken(value);
12576
+ if (!token) throw new Error(`Expected a theme color token. Received: ${value}`);
12577
+ return token;
12578
+ }
12579
+ //#endregion
12580
+ //#region ../theme-core/src/site-styles/compilationPlan.ts
12581
+ const defaultHeaderBrandPreferences = {
12582
+ brandDisplay: "auto",
12583
+ logoSize: "auto"
12146
12584
  };
12147
- asBoundaryOptionId("break:expansive");
12148
- asBoundaryOptionId("break:wave");
12149
- asBoundaryOptionId("break:wave-balanced");
12150
- asBoundaryOptionId("break:wave-gentle");
12151
- asBoundaryOptionId("break:wave-bold");
12152
- asBoundaryOptionId("break:wave-drift");
12153
- asBoundaryOptionId("break:angle-subtle");
12154
- asBoundaryOptionId("break:angle-balanced");
12155
- asBoundaryOptionId("break:angle-steep");
12156
12585
  asBoundaryOptionId("break:unknown");
12157
12586
  const pageDesignUserPinnedAppearanceChoiceSchema = z.object({
12158
12587
  kind: z.literal("user-pinned"),
@@ -12279,14 +12708,11 @@ function validateUniquePageDesignPins(intent, ctx) {
12279
12708
  label: "block Look pin"
12280
12709
  });
12281
12710
  addDuplicateStringIssues(ctx, {
12282
- values: intent.boundaryPins.map((pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)),
12711
+ values: intent.boundaryPins.map((pin) => makeBoundaryId(pin.previousBlockId, pin.nextBlockId)),
12283
12712
  path: ["boundaryPins"],
12284
12713
  label: "boundary pin"
12285
12714
  });
12286
12715
  }
12287
- function boundaryKey(previousBlockId, nextBlockId) {
12288
- return makeBoundaryId(previousBlockId, nextBlockId);
12289
- }
12290
12716
  //#endregion
12291
12717
  //#region ../theme-core/src/accordions/siteStyleDefaults.ts
12292
12718
  /**
@@ -13914,6 +14340,13 @@ z.object({
13914
14340
  fields: nonEmptyRuntimeStyleFieldNamesSchema,
13915
14341
  authority: styleAuthoritySchema
13916
14342
  }).strict();
14343
+ asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
14344
+ asPageFlowPresetId("generated-default");
14345
+ asSiteStyleId("site-style:south-west-twerk-school");
14346
+ asAppearancePresetId("hero-brand-scrim-fixed-frame");
14347
+ asLayoutVariantKey("classic");
14348
+ asLayoutVariantKey("micro");
14349
+ asBoundaryOptionId("break:wave");
13917
14350
  //#endregion
13918
14351
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
13919
14352
  function defineSectionForegroundRuntimeTokens(input) {
@@ -13937,7 +14370,7 @@ function defineComponentRuntimeRules(rules) {
13937
14370
  }
13938
14371
  /**
13939
14372
  * Default design rules translate semantic page-level choices into the current
13940
- * runtime's section background and transition style-group vocabulary.
14373
+ * runtime's section background vocabulary.
13941
14374
  */
13942
14375
  const defaultDesignRuntimeRules = defineDesignRuntimeRules({
13943
14376
  sectionSurfaces: {
@@ -13972,8 +14405,7 @@ const defaultDesignRuntimeRules = defineDesignRuntimeRules({
13972
14405
  color: "surface",
13973
14406
  opacity: .88
13974
14407
  }
13975
- },
13976
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
14408
+ }
13977
14409
  });
13978
14410
  /**
13979
14411
  * Default component rules translate frame and item-surface semantics into the
@@ -15708,19 +16140,11 @@ const curatedSiteStyles = [
15708
16140
  })
15709
16141
  ];
15710
16142
  new Map(curatedSiteStyles.map((style) => [style.id, style]));
15711
- asPageFlowPresetId("generated-default");
15712
- asSiteStyleId("site-style:south-west-twerk-school");
15713
- asAppearancePresetId("hero-brand-scrim-fixed-frame");
15714
- asLayoutVariantKey("classic");
15715
- asLayoutVariantKey("micro");
15716
- asBoundaryOptionId("break:wave");
15717
- asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
15718
16143
  //#endregion
15719
16144
  //#region ../theme-core/src/site-styles/resolver.ts
15720
16145
  const blockDesignFallback = {
15721
16146
  sectionSurface: "base",
15722
16147
  contentFrame: plainFrame,
15723
- transitionAfter: "none",
15724
16148
  sectionHeight: "default",
15725
16149
  heroLegibility: "none",
15726
16150
  imageSurfaceTreatment: { kind: "none" },
@@ -15731,7 +16155,7 @@ const blockDesignFallback = {
15731
16155
  accordionIconTreatment: null,
15732
16156
  composition: null
15733
16157
  };
15734
- blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.transitionAfter, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
16158
+ blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
15735
16159
  //#endregion
15736
16160
  //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
15737
16161
  const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
@@ -16543,7 +16967,8 @@ const siteOptionSources = [
16543
16967
  "eventCategories",
16544
16968
  "eventSeries",
16545
16969
  "venues",
16546
- "staffMembers"
16970
+ "staffMembers",
16971
+ "appointmentServiceCategories"
16547
16972
  ];
16548
16973
  const mediaDeliverySchema = z.object({
16549
16974
  sizes: z.string().optional(),
@@ -27411,6 +27836,15 @@ const appointmentServicesBlockDefinition = {
27411
27836
  required: false,
27412
27837
  ui: { intent: "content" }
27413
27838
  },
27839
+ createSiteOptionSelectField({
27840
+ id: "categoryId",
27841
+ label: "Category",
27842
+ description: "Show one category (with its heading and intro), or leave it on All categories to show everything grouped.",
27843
+ required: false,
27844
+ multiple: false,
27845
+ optionSource: "appointmentServiceCategories",
27846
+ ui: { intent: "content" }
27847
+ }),
27414
27848
  sectionStylesField({
27415
27849
  id: "_sectionStyles",
27416
27850
  label: "Section styles",
@@ -27445,6 +27879,7 @@ const appointmentServicesBlockDefinition = {
27445
27879
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
27446
27880
  el("appointment-services", {
27447
27881
  sectionHeading: { $bind: { from: "content.heading" } },
27882
+ categoryId: { $bind: { from: "content.categoryId" } },
27448
27883
  services: { $bind: { from: "data.services" } },
27449
27884
  pathname: { $bind: { from: "$root.pathname" } },
27450
27885
  servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
@@ -38792,7 +39227,12 @@ const appointmentSetupServiceDraftSchema = z.object({
38792
39227
  venue: appointmentSetupVenueChoiceSchema,
38793
39228
  timezone: z.string().trim().min(1).nullable(),
38794
39229
  payment: appointmentSetupPaymentDraftSchema,
38795
- assignment: appointmentSetupServiceAssignmentDraftSchema
39230
+ assignment: appointmentSetupServiceAssignmentDraftSchema,
39231
+ /**
39232
+ * The service's category, or null for "Other" (issue 1403). Omitted leaves
39233
+ * an existing service's category alone and puts a new one in "Other".
39234
+ */
39235
+ categoryId: z.string().uuid().nullable().optional()
38796
39236
  }).superRefine((service, ctx) => {
38797
39237
  if (service.payment.kind !== "free" && (service.priceAmount === null || service.priceAmount <= 0)) ctx.addIssue({
38798
39238
  code: "custom",