@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
@@ -43,6 +43,75 @@ function parsePublicProductCategorySelector(value) {
43
43
  };
44
44
  }
45
45
  //#endregion
46
+ //#region ../api/src/defineEndpointDefinitions.ts
47
+ /**
48
+ * Validates extracted endpoint descriptors while preserving each literal path,
49
+ * method, and parameter contract for the typed URL builders.
50
+ */
51
+ function defineEndpointDefinitions(definitions) {
52
+ return definitions;
53
+ }
54
+ //#endregion
55
+ //#region ../api/src/publicNewsletterEndpointDefinitions.ts
56
+ const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
57
+ subscribeNewsletter: {
58
+ path: "/public/sites/{siteId}/newsletter/subscribe",
59
+ method: "POST",
60
+ tags: ["public-newsletter-{siteId}"],
61
+ auth: "public",
62
+ responseKind: "json"
63
+ },
64
+ confirmNewsletter: {
65
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
66
+ method: "GET",
67
+ tags: ["public-newsletter-{siteId}"],
68
+ auth: "public",
69
+ responseKind: "text"
70
+ },
71
+ unsubscribeNewsletter: {
72
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
73
+ method: "GET",
74
+ tags: ["public-newsletter-{siteId}"],
75
+ auth: "public",
76
+ responseKind: "text"
77
+ },
78
+ unsubscribeNewsletterPost: {
79
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
80
+ method: "POST",
81
+ tags: ["public-newsletter-{siteId}"],
82
+ auth: "public",
83
+ responseKind: "text"
84
+ },
85
+ confirmNewsletterPost: {
86
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
87
+ method: "POST",
88
+ tags: ["public-newsletter-{siteId}"],
89
+ auth: "public",
90
+ responseKind: "text"
91
+ },
92
+ getNewsletterPreferences: {
93
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
94
+ method: "GET",
95
+ tags: ["public-newsletter-{siteId}"],
96
+ auth: "public",
97
+ responseKind: "text"
98
+ },
99
+ saveNewsletterPreferences: {
100
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
101
+ method: "POST",
102
+ tags: ["public-newsletter-{siteId}"],
103
+ auth: "public",
104
+ responseKind: "text"
105
+ },
106
+ getNewsletterArchive: {
107
+ path: "/public/sites/{siteId}/newsletter/archive/{token}",
108
+ method: "GET",
109
+ tags: ["public-newsletter-{siteId}"],
110
+ auth: "public",
111
+ responseKind: "text"
112
+ }
113
+ });
114
+ //#endregion
46
115
  //#region ../api/src/apiEndpointTypes.ts
47
116
  function allowedDemoMutationPolicy() {
48
117
  return {
@@ -134,17 +203,85 @@ const SDK_ENTRY_READ_ENDPOINTS = {
134
203
  }
135
204
  };
136
205
  //#endregion
137
- //#region ../api/src/defineEndpointDefinitions.ts
138
- /**
139
- * Validates extracted endpoint descriptors while preserving each literal path,
140
- * method, and parameter contract for the typed URL builders.
141
- */
142
- function defineEndpointDefinitions(definitions) {
143
- return definitions;
144
- }
145
- //#endregion
146
206
  //#region ../api/src/appointmentEndpointDefinitions.ts
147
207
  const APPOINTMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
208
+ ...defineEndpointDefinitions({
209
+ listGroupedAppointmentServices: {
210
+ path: "/sites/{siteId}/bookings/services/grouped",
211
+ method: "GET",
212
+ auth: "user",
213
+ responseKind: "json",
214
+ errors: ["server:internal_error"]
215
+ },
216
+ reorderAppointmentServices: {
217
+ path: "/sites/{siteId}/bookings/services/order",
218
+ method: "PUT",
219
+ auth: "user",
220
+ responseKind: "json",
221
+ errors: [
222
+ "validation:invalid_input",
223
+ "auth:forbidden",
224
+ "resource:not_found",
225
+ "resource:conflict",
226
+ "server:internal_error"
227
+ ]
228
+ },
229
+ listAppointmentServiceCategories: {
230
+ path: "/sites/{siteId}/bookings/service-categories",
231
+ method: "GET",
232
+ auth: "user",
233
+ responseKind: "json",
234
+ errors: ["server:internal_error"]
235
+ },
236
+ createAppointmentServiceCategory: {
237
+ path: "/sites/{siteId}/bookings/service-categories",
238
+ method: "POST",
239
+ auth: "user",
240
+ responseKind: "json",
241
+ errors: [
242
+ "validation:invalid_input",
243
+ "auth:forbidden",
244
+ "resource:conflict",
245
+ "server:internal_error"
246
+ ]
247
+ },
248
+ updateAppointmentServiceCategory: {
249
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
250
+ method: "PUT",
251
+ auth: "user",
252
+ responseKind: "json",
253
+ errors: [
254
+ "validation:invalid_input",
255
+ "auth:forbidden",
256
+ "resource:not_found",
257
+ "resource:conflict",
258
+ "server:internal_error"
259
+ ]
260
+ },
261
+ deleteAppointmentServiceCategory: {
262
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
263
+ method: "DELETE",
264
+ auth: "user",
265
+ responseKind: "json",
266
+ errors: [
267
+ "auth:forbidden",
268
+ "resource:not_found",
269
+ "server:internal_error"
270
+ ]
271
+ },
272
+ reorderAppointmentServiceCategories: {
273
+ path: "/sites/{siteId}/bookings/service-categories/order",
274
+ method: "PUT",
275
+ auth: "user",
276
+ responseKind: "json",
277
+ errors: [
278
+ "validation:invalid_input",
279
+ "auth:forbidden",
280
+ "resource:conflict",
281
+ "server:internal_error"
282
+ ]
283
+ }
284
+ }),
148
285
  listAppointmentResources: {
149
286
  path: "/sites/{siteId}/bookings/resources",
150
287
  method: "GET",
@@ -1292,39 +1429,6 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1292
1429
  auth: "user",
1293
1430
  responseKind: "json",
1294
1431
  demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1295
- },
1296
- listNewsletterSendJobs: {
1297
- path: "/sites/{siteId}/newsletter/jobs",
1298
- method: "GET",
1299
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1300
- auth: "user",
1301
- responseKind: "json"
1302
- },
1303
- retryNewsletterSendJob: {
1304
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/retry",
1305
- method: "POST",
1306
- errors: [
1307
- "validation:invalid_input",
1308
- "resource:not_found",
1309
- "auth:forbidden",
1310
- "server:internal_error"
1311
- ],
1312
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1313
- auth: "user",
1314
- responseKind: "json"
1315
- },
1316
- cancelNewsletterSendJob: {
1317
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/cancel",
1318
- method: "POST",
1319
- errors: [
1320
- "validation:invalid_input",
1321
- "resource:not_found",
1322
- "auth:forbidden",
1323
- "server:internal_error"
1324
- ],
1325
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1326
- auth: "user",
1327
- responseKind: "json"
1328
1432
  }
1329
1433
  });
1330
1434
  //#endregion
@@ -3403,6 +3507,7 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3403
3507
  }
3404
3508
  });
3405
3509
  const API_ENDPOINTS$1 = {
3510
+ ...PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS,
3406
3511
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
3407
3512
  ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
3408
3513
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
@@ -6537,41 +6642,6 @@ const API_ENDPOINTS$1 = {
6537
6642
  "server:internal_error"
6538
6643
  ]
6539
6644
  },
6540
- subscribeNewsletter: {
6541
- path: "/public/sites/{siteId}/newsletter/subscribe",
6542
- method: "POST",
6543
- tags: ["public-newsletter-{siteId}"],
6544
- auth: "public",
6545
- responseKind: "json"
6546
- },
6547
- confirmNewsletter: {
6548
- path: "/public/sites/{siteId}/newsletter/confirm/{token}",
6549
- method: "GET",
6550
- tags: ["public-newsletter-{siteId}"],
6551
- auth: "public",
6552
- responseKind: "text"
6553
- },
6554
- unsubscribeNewsletter: {
6555
- path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
6556
- method: "GET",
6557
- tags: ["public-newsletter-{siteId}"],
6558
- auth: "public",
6559
- responseKind: "text"
6560
- },
6561
- unsubscribeNewsletterPost: {
6562
- path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
6563
- method: "POST",
6564
- tags: ["public-newsletter-{siteId}"],
6565
- auth: "public",
6566
- responseKind: "text"
6567
- },
6568
- getNewsletterArchive: {
6569
- path: "/public/sites/{siteId}/newsletter/archive/{token}",
6570
- method: "GET",
6571
- tags: ["public-newsletter-{siteId}"],
6572
- auth: "public",
6573
- responseKind: "text"
6574
- },
6575
6645
  listSiteContentTypes: {
6576
6646
  path: "/sites/{siteId}/content-types",
6577
6647
  method: "GET",
@@ -9539,7 +9609,7 @@ var SimpleCache = class {
9539
9609
  * 1. This constant
9540
9610
  * 2. The "version" field in package.json
9541
9611
  */
9542
- const SDK_VERSION = "0.144.0";
9612
+ const SDK_VERSION = "0.145.0";
9543
9613
  //#endregion
9544
9614
  //#region src/client/error.ts
9545
9615
  let _Symbol$for;
@@ -15055,6 +15125,15 @@ function asSiteStyleId(value) {
15055
15125
  function asDesignSystemTemplateId(value) {
15056
15126
  return brandNonEmptyString(value, "DesignSystemTemplateId");
15057
15127
  }
15128
+ function toNonEmptyReadonlyArray(values) {
15129
+ const [first, ...rest] = values;
15130
+ return first === void 0 ? null : [first, ...rest];
15131
+ }
15132
+ function requireNonEmptyReadonlyArray(values, message = "Expected a non-empty array.") {
15133
+ const result = toNonEmptyReadonlyArray(values);
15134
+ if (!result) throw new Error(message);
15135
+ return result;
15136
+ }
15058
15137
  function makeBoundaryId(previousBlockId, nextBlockId) {
15059
15138
  return asDesignBoundaryId(`boundary:${encodeURIComponent(previousBlockId)}:${encodeURIComponent(nextBlockId)}`);
15060
15139
  }
@@ -15257,16 +15336,18 @@ const themeV2RuntimeStyleFieldNames = [
15257
15336
  "_frameStyles",
15258
15337
  "_sectionStyles",
15259
15338
  "_containerStyles",
15260
- "_cardStyles",
15261
- "_transitionStyles",
15262
- "styleGroup"
15339
+ "_cardStyles"
15263
15340
  ];
15264
15341
  const themeV2BlockSpecificRawStyleFieldNames = [
15265
15342
  "_contentCardStyles",
15266
15343
  "_heroLayoutStyles",
15267
15344
  "_textCardStyles"
15268
15345
  ];
15269
- const themeV2NormalEditorRawStyleFieldNames = [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
15346
+ const themeV2NormalEditorRawStyleFieldNames = [
15347
+ ...themeV2RuntimeStyleFieldNames,
15348
+ ...themeV2BlockSpecificRawStyleFieldNames,
15349
+ "styleGroup"
15350
+ ];
15270
15351
  new Set(themeV2NormalEditorRawStyleFieldNames);
15271
15352
  [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
15272
15353
  const pageDesignEditorBackgroundOverrideOwner = "page-design-editor";
@@ -16547,7 +16628,8 @@ const siteOptionSources = [
16547
16628
  "eventCategories",
16548
16629
  "eventSeries",
16549
16630
  "venues",
16550
- "staffMembers"
16631
+ "staffMembers",
16632
+ "appointmentServiceCategories"
16551
16633
  ];
16552
16634
  const mediaDeliverySchema = z.object({
16553
16635
  sizes: z.string().optional(),
@@ -19922,11 +20004,260 @@ function cardRoleFromLegacyVocabulary(value) {
19922
20004
  */
19923
20005
  const cardRoleWithLegacyAliasSchema = z.preprocess((value) => cardRoleFromLegacyVocabulary(value) ?? value, cardRoleSchema);
19924
20006
  //#endregion
19925
- //#region ../theme-core/src/site-styles/compilationPlan.ts
19926
- const defaultHeaderBrandPreferences = {
19927
- brandDisplay: "auto",
19928
- logoSize: "auto"
19929
- };
20007
+ //#region ../theme-core/src/site-styles/transitionCatalogue.ts
20008
+ /**
20009
+ * Family order for pickers. Entries below are listed family by family in this
20010
+ * same order, so the flat option list and the grouped families agree.
20011
+ */
20012
+ const transitionCatalogueFamilies = [
20013
+ {
20014
+ id: "gradient",
20015
+ label: "Gradient"
20016
+ },
20017
+ {
20018
+ id: "wave",
20019
+ label: "Wave"
20020
+ },
20021
+ {
20022
+ id: "angle",
20023
+ label: "Angle"
20024
+ }
20025
+ ];
20026
+ const mediumHeight = "6rem + 2px";
20027
+ const compactHeight = "4.5rem + 2px";
20028
+ const largeHeight = "7rem + 2px";
20029
+ /**
20030
+ * The single source of transition vocabulary. Order is significant: it is the
20031
+ * order of `boundaryOptions` (after `none`) and of each family's variants,
20032
+ * which persisted pins, page-flow presets and the editor picker all rely on.
20033
+ *
20034
+ * Shapes match what `generateLayoutCss` draws today. Structured
20035
+ * amplitude/frequency treatments (issue 826) extend this list later.
20036
+ */
20037
+ const transitionCatalogueEntries = defineExactCatalog()([
20038
+ {
20039
+ intent: "soft-fade-short",
20040
+ optionId: asBoundaryOptionId("break:soft"),
20041
+ family: "gradient",
20042
+ variantId: "soft",
20043
+ label: "Soft",
20044
+ variantLabel: "Soft",
20045
+ treatment: {
20046
+ kind: "soft-fade",
20047
+ height: "medium",
20048
+ curve: "soft"
20049
+ },
20050
+ size: "medium",
20051
+ heightExpression: mediumHeight,
20052
+ shape: { kind: "fade" }
20053
+ },
20054
+ {
20055
+ intent: "soft-fade-long",
20056
+ optionId: asBoundaryOptionId("break:spacious"),
20057
+ family: "gradient",
20058
+ variantId: "spacious",
20059
+ label: "Spacious",
20060
+ variantLabel: "Spacious",
20061
+ treatment: {
20062
+ kind: "soft-fade",
20063
+ height: "large",
20064
+ curve: "spacious"
20065
+ },
20066
+ size: "spacious",
20067
+ heightExpression: "10rem",
20068
+ shape: { kind: "fade" }
20069
+ },
20070
+ {
20071
+ intent: "soft-fade-expansive",
20072
+ optionId: asBoundaryOptionId("break:expansive"),
20073
+ family: "gradient",
20074
+ variantId: "expansive",
20075
+ label: "Expansive",
20076
+ variantLabel: "Expansive",
20077
+ treatment: {
20078
+ kind: "soft-fade",
20079
+ height: "expansive",
20080
+ curve: "expansive"
20081
+ },
20082
+ size: "expansive",
20083
+ heightExpression: "14rem",
20084
+ shape: { kind: "fade" }
20085
+ },
20086
+ {
20087
+ intent: "wave-edge-balanced",
20088
+ optionId: asBoundaryOptionId("break:wave-balanced"),
20089
+ family: "wave",
20090
+ variantId: "balanced",
20091
+ label: "Balanced wave",
20092
+ variantLabel: "Balanced",
20093
+ treatment: {
20094
+ kind: "wave-edge",
20095
+ height: "medium",
20096
+ amplitude: "balanced",
20097
+ rhythm: "double",
20098
+ symmetry: "symmetrical"
20099
+ },
20100
+ size: "medium",
20101
+ heightExpression: mediumHeight,
20102
+ shape: {
20103
+ kind: "wave",
20104
+ mask: "balanced"
20105
+ }
20106
+ },
20107
+ {
20108
+ intent: "wave-edge",
20109
+ optionId: asBoundaryOptionId("break:wave"),
20110
+ family: "wave",
20111
+ variantId: "classic",
20112
+ label: "Classic wave",
20113
+ variantLabel: "Classic",
20114
+ treatment: {
20115
+ kind: "wave-edge",
20116
+ height: "medium",
20117
+ amplitude: "balanced",
20118
+ rhythm: "double",
20119
+ symmetry: "asymmetrical"
20120
+ },
20121
+ size: "medium",
20122
+ heightExpression: mediumHeight,
20123
+ shape: {
20124
+ kind: "wave",
20125
+ mask: "classic"
20126
+ }
20127
+ },
20128
+ {
20129
+ intent: "wave-edge-gentle",
20130
+ optionId: asBoundaryOptionId("break:wave-gentle"),
20131
+ family: "wave",
20132
+ variantId: "gentle",
20133
+ label: "Gentle wave",
20134
+ variantLabel: "Gentle",
20135
+ treatment: {
20136
+ kind: "wave-edge",
20137
+ height: "compact",
20138
+ amplitude: "subtle",
20139
+ rhythm: "single",
20140
+ symmetry: "symmetrical"
20141
+ },
20142
+ size: "compact",
20143
+ heightExpression: compactHeight,
20144
+ shape: {
20145
+ kind: "wave",
20146
+ mask: "gentle"
20147
+ }
20148
+ },
20149
+ {
20150
+ intent: "wave-edge-bold",
20151
+ optionId: asBoundaryOptionId("break:wave-bold"),
20152
+ family: "wave",
20153
+ variantId: "bold",
20154
+ label: "Bold wave",
20155
+ variantLabel: "Bold",
20156
+ treatment: {
20157
+ kind: "wave-edge",
20158
+ height: "large",
20159
+ amplitude: "bold",
20160
+ rhythm: "double",
20161
+ symmetry: "symmetrical"
20162
+ },
20163
+ size: "large",
20164
+ heightExpression: largeHeight,
20165
+ shape: {
20166
+ kind: "wave",
20167
+ mask: "bold"
20168
+ }
20169
+ },
20170
+ {
20171
+ intent: "wave-edge-drift",
20172
+ optionId: asBoundaryOptionId("break:wave-drift"),
20173
+ family: "wave",
20174
+ variantId: "drift",
20175
+ label: "Drift wave",
20176
+ variantLabel: "Drift",
20177
+ treatment: {
20178
+ kind: "wave-edge",
20179
+ height: "medium",
20180
+ amplitude: "balanced",
20181
+ rhythm: "double",
20182
+ symmetry: "drift"
20183
+ },
20184
+ size: "medium",
20185
+ heightExpression: mediumHeight,
20186
+ shape: {
20187
+ kind: "wave",
20188
+ mask: "drift"
20189
+ }
20190
+ },
20191
+ {
20192
+ intent: "angle-edge-subtle",
20193
+ optionId: asBoundaryOptionId("break:angle-subtle"),
20194
+ family: "angle",
20195
+ variantId: "subtle",
20196
+ label: "Subtle angle",
20197
+ variantLabel: "Subtle",
20198
+ treatment: {
20199
+ kind: "angle-edge",
20200
+ height: "compact",
20201
+ slope: "subtle",
20202
+ direction: "forward"
20203
+ },
20204
+ size: "compact",
20205
+ heightExpression: compactHeight,
20206
+ shape: {
20207
+ kind: "angle",
20208
+ polygon: {
20209
+ startTopPercent: 34,
20210
+ endTopPercent: 18
20211
+ }
20212
+ }
20213
+ },
20214
+ {
20215
+ intent: "angle-edge",
20216
+ optionId: asBoundaryOptionId("break:angle-balanced"),
20217
+ family: "angle",
20218
+ variantId: "balanced",
20219
+ label: "Balanced angle",
20220
+ variantLabel: "Balanced",
20221
+ treatment: {
20222
+ kind: "angle-edge",
20223
+ height: "medium",
20224
+ slope: "balanced",
20225
+ direction: "forward"
20226
+ },
20227
+ size: "medium",
20228
+ heightExpression: mediumHeight,
20229
+ shape: {
20230
+ kind: "angle",
20231
+ polygon: {
20232
+ startTopPercent: 42,
20233
+ endTopPercent: 8
20234
+ }
20235
+ }
20236
+ },
20237
+ {
20238
+ intent: "angle-edge-steep",
20239
+ optionId: asBoundaryOptionId("break:angle-steep"),
20240
+ family: "angle",
20241
+ variantId: "steep",
20242
+ label: "Steep angle",
20243
+ variantLabel: "Steep",
20244
+ treatment: {
20245
+ kind: "angle-edge",
20246
+ height: "large",
20247
+ slope: "steep",
20248
+ direction: "forward"
20249
+ },
20250
+ size: "large",
20251
+ heightExpression: largeHeight,
20252
+ shape: {
20253
+ kind: "angle",
20254
+ polygon: {
20255
+ startTopPercent: 54,
20256
+ endTopPercent: 0
20257
+ }
20258
+ }
20259
+ }
20260
+ ]);
19930
20261
  //#endregion
19931
20262
  //#region ../theme-core/src/site-styles/sectionTransitions.ts
19932
20263
  function boundaryRuntimeMetrics(family, size, heightExpression) {
@@ -19937,42 +20268,106 @@ function boundaryRuntimeMetrics(family, size, heightExpression) {
19937
20268
  reserveCss: `calc((${heightExpression}) / 2)`
19938
20269
  };
19939
20270
  }
19940
- 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");
20271
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, entry]));
20272
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, boundaryRuntimeMetrics(entry.family, entry.size, entry.heightExpression)]));
20273
+ /**
20274
+ * The catalogue's compile-time coverage check guarantees an entry per
20275
+ * decorative intent, so a miss here is a broken invariant, not bad input.
20276
+ */
20277
+ function requireCatalogueValue(values, intent) {
20278
+ const value = values.get(intent);
20279
+ if (value === void 0) throw new Error(`Transition catalogue has no entry for ${intent}`);
20280
+ return value;
20281
+ }
19941
20282
  const noneBoundaryOption = {
19942
20283
  id: asBoundaryOptionId("break:none"),
19943
20284
  label: "None",
19944
20285
  transitionAfter: "none",
19945
20286
  treatment: { kind: "none" }
19946
20287
  };
19947
- const softBoundaryOption = {
19948
- id: asBoundaryOptionId("break:soft"),
19949
- label: "Soft",
19950
- transitionAfter: "soft-fade-short",
19951
- treatment: {
19952
- kind: "soft-fade",
19953
- height: "medium",
19954
- curve: "soft"
19955
- }
20288
+ const boundaryOptionByIntent = new Map(transitionCatalogueEntries.map((entry) => [entry.intent, {
20289
+ id: entry.optionId,
20290
+ label: entry.label,
20291
+ transitionAfter: entry.intent,
20292
+ treatment: entry.treatment
20293
+ }]));
20294
+ function boundaryOptionForTransitionIntent(intent) {
20295
+ return requireCatalogueValue(boundaryOptionByIntent, intent);
20296
+ }
20297
+ const softBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-short");
20298
+ const spaciousBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-long");
20299
+ boundaryOptionForTransitionIntent("soft-fade-expansive");
20300
+ boundaryOptionForTransitionIntent("wave-edge");
20301
+ boundaryOptionForTransitionIntent("wave-edge-balanced");
20302
+ boundaryOptionForTransitionIntent("wave-edge-gentle");
20303
+ boundaryOptionForTransitionIntent("wave-edge-bold");
20304
+ boundaryOptionForTransitionIntent("wave-edge-drift");
20305
+ boundaryOptionForTransitionIntent("angle-edge-subtle");
20306
+ boundaryOptionForTransitionIntent("angle-edge");
20307
+ boundaryOptionForTransitionIntent("angle-edge-steep");
20308
+ /**
20309
+ * Must remain non-empty; downstream code indexes `[0]` as the documented default.
20310
+ */
20311
+ const boundaryOptions = [noneBoundaryOption, ...transitionCatalogueEntries.map((entry) => boundaryOptionForTransitionIntent(entry.intent))];
20312
+ const noneTransitionVariant = {
20313
+ familyId: "none",
20314
+ variantId: "none",
20315
+ label: "None",
20316
+ boundaryOption: noneBoundaryOption
19956
20317
  };
19957
- const spaciousBoundaryOption = {
19958
- id: asBoundaryOptionId("break:spacious"),
19959
- label: "Spacious",
19960
- transitionAfter: "soft-fade-long",
19961
- treatment: {
19962
- kind: "soft-fade",
19963
- height: "large",
19964
- curve: "spacious"
19965
- }
20318
+ function transitionVariantForEntry(entry) {
20319
+ return {
20320
+ familyId: entry.family,
20321
+ variantId: entry.variantId,
20322
+ label: entry.variantLabel,
20323
+ boundaryOption: boundaryOptionForTransitionIntent(entry.intent)
20324
+ };
20325
+ }
20326
+ const sectionTransitionFamilies = [{
20327
+ id: "none",
20328
+ label: "None",
20329
+ variants: [noneTransitionVariant]
20330
+ }, ...transitionCatalogueFamilies.map((family) => ({
20331
+ id: family.id,
20332
+ label: family.label,
20333
+ variants: requireNonEmptyReadonlyArray(transitionCatalogueEntries.filter((entry) => entry.family === family.id).map(transitionVariantForEntry), `Transition family ${family.id} has no catalogue entries.`)
20334
+ }))];
20335
+ new Map(boundaryOptions.map((option) => [option.id, option]));
20336
+ new Map(boundaryOptions.map((option) => [stableTreatmentKey(option.treatment), option]));
20337
+ new Map(sectionTransitionFamilies.flatMap((family) => family.variants.map((variant) => [variant.boundaryOption.id, variant])));
20338
+ new Map(sectionTransitionFamilies.map((family) => [family.id, family]));
20339
+ function stableTreatmentKey(treatment) {
20340
+ switch (treatment.kind) {
20341
+ case "none": return "none";
20342
+ case "soft-fade": return `${treatment.kind}:${treatment.height}:${treatment.curve}`;
20343
+ case "wave-edge": return [
20344
+ treatment.kind,
20345
+ treatment.height,
20346
+ treatment.amplitude,
20347
+ treatment.rhythm,
20348
+ treatment.symmetry
20349
+ ].join(":");
20350
+ case "angle-edge": return [
20351
+ treatment.kind,
20352
+ treatment.height,
20353
+ treatment.slope,
20354
+ treatment.direction
20355
+ ].join(":");
20356
+ case "legacy-unsupported": return `${treatment.kind}:${treatment.boundaryOptionId}`;
20357
+ }
20358
+ }
20359
+ requireThemeColorToken$1("background");
20360
+ function requireThemeColorToken$1(value) {
20361
+ const token = parseThemeColorToken(value);
20362
+ if (!token) throw new Error(`Expected a theme color token. Received: ${value}`);
20363
+ return token;
20364
+ }
20365
+ //#endregion
20366
+ //#region ../theme-core/src/site-styles/compilationPlan.ts
20367
+ const defaultHeaderBrandPreferences = {
20368
+ brandDisplay: "auto",
20369
+ logoSize: "auto"
19966
20370
  };
19967
- asBoundaryOptionId("break:expansive");
19968
- asBoundaryOptionId("break:wave");
19969
- asBoundaryOptionId("break:wave-balanced");
19970
- asBoundaryOptionId("break:wave-gentle");
19971
- asBoundaryOptionId("break:wave-bold");
19972
- asBoundaryOptionId("break:wave-drift");
19973
- asBoundaryOptionId("break:angle-subtle");
19974
- asBoundaryOptionId("break:angle-balanced");
19975
- asBoundaryOptionId("break:angle-steep");
19976
20371
  asBoundaryOptionId("break:unknown");
19977
20372
  const pageDesignUserPinnedAppearanceChoiceSchema = z.object({
19978
20373
  kind: z.literal("user-pinned"),
@@ -20099,14 +20494,11 @@ function validateUniquePageDesignPins(intent, ctx) {
20099
20494
  label: "block Look pin"
20100
20495
  });
20101
20496
  addDuplicateStringIssues(ctx, {
20102
- values: intent.boundaryPins.map((pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)),
20497
+ values: intent.boundaryPins.map((pin) => makeBoundaryId(pin.previousBlockId, pin.nextBlockId)),
20103
20498
  path: ["boundaryPins"],
20104
20499
  label: "boundary pin"
20105
20500
  });
20106
20501
  }
20107
- function boundaryKey(previousBlockId, nextBlockId) {
20108
- return makeBoundaryId(previousBlockId, nextBlockId);
20109
- }
20110
20502
  //#endregion
20111
20503
  //#region ../theme-core/src/site-styles/styleTags.ts
20112
20504
  /**
@@ -23062,6 +23454,13 @@ z.object({
23062
23454
  fields: nonEmptyRuntimeStyleFieldNamesSchema,
23063
23455
  authority: styleAuthoritySchema
23064
23456
  }).strict();
23457
+ asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
23458
+ asPageFlowPresetId("generated-default");
23459
+ asSiteStyleId("site-style:south-west-twerk-school");
23460
+ asAppearancePresetId("hero-brand-scrim-fixed-frame");
23461
+ asLayoutVariantKey("classic");
23462
+ asLayoutVariantKey("micro");
23463
+ asBoundaryOptionId("break:wave");
23065
23464
  //#endregion
23066
23465
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
23067
23466
  function defineSectionForegroundRuntimeTokens(input) {
@@ -23085,7 +23484,7 @@ function defineComponentRuntimeRules(rules) {
23085
23484
  }
23086
23485
  /**
23087
23486
  * Default design rules translate semantic page-level choices into the current
23088
- * runtime's section background and transition style-group vocabulary.
23487
+ * runtime's section background vocabulary.
23089
23488
  */
23090
23489
  const defaultDesignRuntimeRules = defineDesignRuntimeRules({
23091
23490
  sectionSurfaces: {
@@ -23120,8 +23519,7 @@ const defaultDesignRuntimeRules = defineDesignRuntimeRules({
23120
23519
  color: "surface",
23121
23520
  opacity: .88
23122
23521
  }
23123
- },
23124
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
23522
+ }
23125
23523
  });
23126
23524
  /**
23127
23525
  * Default component rules translate frame and item-surface semantics into the
@@ -24856,19 +25254,11 @@ const curatedSiteStyles = [
24856
25254
  })
24857
25255
  ];
24858
25256
  new Map(curatedSiteStyles.map((style) => [style.id, style]));
24859
- asPageFlowPresetId("generated-default");
24860
- asSiteStyleId("site-style:south-west-twerk-school");
24861
- asAppearancePresetId("hero-brand-scrim-fixed-frame");
24862
- asLayoutVariantKey("classic");
24863
- asLayoutVariantKey("micro");
24864
- asBoundaryOptionId("break:wave");
24865
- asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
24866
25257
  //#endregion
24867
25258
  //#region ../theme-core/src/site-styles/resolver.ts
24868
25259
  const blockDesignFallback = {
24869
25260
  sectionSurface: "base",
24870
25261
  contentFrame: plainFrame,
24871
- transitionAfter: "none",
24872
25262
  sectionHeight: "default",
24873
25263
  heroLegibility: "none",
24874
25264
  imageSurfaceTreatment: { kind: "none" },
@@ -24879,7 +25269,7 @@ const blockDesignFallback = {
24879
25269
  accordionIconTreatment: null,
24880
25270
  composition: null
24881
25271
  };
24882
- blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.transitionAfter, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
25272
+ blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
24883
25273
  //#endregion
24884
25274
  //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
24885
25275
  const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
@@ -35471,6 +35861,15 @@ const appointmentServicesBlockDefinition = {
35471
35861
  required: false,
35472
35862
  ui: { intent: "content" }
35473
35863
  },
35864
+ createSiteOptionSelectField({
35865
+ id: "categoryId",
35866
+ label: "Category",
35867
+ description: "Show one category (with its heading and intro), or leave it on All categories to show everything grouped.",
35868
+ required: false,
35869
+ multiple: false,
35870
+ optionSource: "appointmentServiceCategories",
35871
+ ui: { intent: "content" }
35872
+ }),
35474
35873
  sectionStylesField({
35475
35874
  id: "_sectionStyles",
35476
35875
  label: "Section styles",
@@ -35505,6 +35904,7 @@ const appointmentServicesBlockDefinition = {
35505
35904
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
35506
35905
  el("appointment-services", {
35507
35906
  sectionHeading: { $bind: { from: "content.heading" } },
35907
+ categoryId: { $bind: { from: "content.categoryId" } },
35508
35908
  services: { $bind: { from: "data.services" } },
35509
35909
  pathname: { $bind: { from: "$root.pathname" } },
35510
35910
  servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
@@ -46575,6 +46975,17 @@ function coerceToString(value) {
46575
46975
  return "";
46576
46976
  }
46577
46977
  /**
46978
+ * The appointment-services catalogue (issue 1403) pairs the services with the
46979
+ * site's ordered categories. Both are needed to group them, so that response
46980
+ * is passed through whole; any other `{ services }` wrapper is unwrapped.
46981
+ */
46982
+ function coerceServicesPayload(record) {
46983
+ return Array.isArray(record.services) && Array.isArray(record.categories) ? {
46984
+ services: record.services,
46985
+ categories: record.categories
46986
+ } : record.services;
46987
+ }
46988
+ /**
46578
46989
  * Extract data from API response.
46579
46990
  * Unwraps common response wrappers: { data }, { form }, { entries }, { services }, { teamMembers }
46580
46991
  *
@@ -46589,7 +47000,7 @@ function coercePayload(payload) {
46589
47000
  if ("data" in record && typeof record.data !== "function") return record.data;
46590
47001
  if ("form" in record && typeof record.form !== "function") return record.form;
46591
47002
  if ("entries" in record && typeof record.entries !== "function") return record.entries;
46592
- if ("services" in record && typeof record.services !== "function") return record.services;
47003
+ if ("services" in record && typeof record.services !== "function") return coerceServicesPayload(record);
46593
47004
  if ("teamMembers" in record && typeof record.teamMembers !== "function") return record.teamMembers;
46594
47005
  }
46595
47006
  return payload;
@@ -48123,7 +48534,7 @@ function createRiverbankClientWithDeps(deps, config) {
48123
48534
  const result = await reader({
48124
48535
  cacheKey: plan.cacheKey,
48125
48536
  endpoint: plan.endpoint,
48126
- payloadSchemaVersion: 1
48537
+ payloadSchemaVersion: 2
48127
48538
  });
48128
48539
  if (result.kind === "miss") return {
48129
48540
  kind: "miss",
@@ -48172,7 +48583,7 @@ function createRiverbankClientWithDeps(deps, config) {
48172
48583
  siteId: plan.siteId ?? getRuntimePayloadSiteId(payload),
48173
48584
  freshTtlSec: plan.freshTtlSec,
48174
48585
  staleTtlSec: plan.staleTtlSec,
48175
- payloadSchemaVersion: 1,
48586
+ payloadSchemaVersion: 2,
48176
48587
  writeReason: "live_success"
48177
48588
  });
48178
48589
  } catch {}
@@ -49927,7 +50338,12 @@ const appointmentSetupServiceDraftSchema = z.object({
49927
50338
  venue: appointmentSetupVenueChoiceSchema,
49928
50339
  timezone: z.string().trim().min(1).nullable(),
49929
50340
  payment: appointmentSetupPaymentDraftSchema,
49930
- assignment: appointmentSetupServiceAssignmentDraftSchema
50341
+ assignment: appointmentSetupServiceAssignmentDraftSchema,
50342
+ /**
50343
+ * The service's category, or null for "Other" (issue 1403). Omitted leaves
50344
+ * an existing service's category alone and puts a new one in "Other".
50345
+ */
50346
+ categoryId: z.string().uuid().nullable().optional()
49931
50347
  }).superRefine((service, ctx) => {
49932
50348
  if (service.payment.kind !== "free" && (service.priceAmount === null || service.priceAmount <= 0)) ctx.addIssue({
49933
50349
  code: "custom",
@@ -50913,7 +51329,7 @@ async function loadPageWithDeps(deps, params) {
50913
51329
  });
50914
51330
  return {
50915
51331
  page: pageOutline,
50916
- runtimeBoundaries: pageData.runtimeBoundaries,
51332
+ runtimeJoins: pageData.runtimeJoins,
50917
51333
  theme: requireSdkTheme(support.theme, siteId),
50918
51334
  sdkConfig: support.sdkConfig,
50919
51335
  siteId,
@@ -51696,7 +52112,7 @@ async function loadContentFromContentResponseWithDeps(deps, params) {
51696
52112
  ogImageId: pageRecord.ogImageId ?? null
51697
52113
  },
51698
52114
  page: pageOutline,
51699
- runtimeBoundaries: pageData.runtimeBoundaries,
52115
+ runtimeJoins: pageData.runtimeJoins,
51700
52116
  theme: support.theme,
51701
52117
  siteId,
51702
52118
  ...support.customBlocks ? { customBlocks: support.customBlocks } : {},