@riverbankcms/sdk 0.60.16 → 0.62.2

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 (167) hide show
  1. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +41 -1
  2. package/dist/_dts/api/src/bookingRecords.d.ts +100 -3
  3. package/dist/_dts/api/src/bookings.d.ts +2 -1
  4. package/dist/_dts/api/src/endpoints.d.ts +96 -0
  5. package/dist/_dts/api/src/index.d.ts +5 -1
  6. package/dist/_dts/api/src/participantMessaging.d.ts +113 -0
  7. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +51 -47
  8. package/dist/_dts/api/src/types.d.ts +1 -0
  9. package/dist/_dts/blocks/src/index.d.ts +66 -62
  10. package/dist/_dts/blocks/src/lib/media.d.ts +60 -0
  11. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +2 -2
  12. package/dist/_dts/blocks/src/system/blocks/audio-player.d.ts +2 -2
  13. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +2 -2
  14. package/dist/_dts/blocks/src/system/blocks/blog-post.d.ts +0 -21
  15. package/dist/_dts/blocks/src/system/blocks/body-text.d.ts +2 -6
  16. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +2 -2
  17. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +2 -2
  18. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +0 -10
  19. package/dist/_dts/blocks/src/system/blocks/columns.d.ts +0 -10
  20. package/dist/_dts/blocks/src/system/blocks/course-details.d.ts +0 -20
  21. package/dist/_dts/blocks/src/system/blocks/course-registration.d.ts +0 -20
  22. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +15 -15
  23. package/dist/_dts/blocks/src/system/blocks/cta-full.d.ts +5 -10
  24. package/dist/_dts/blocks/src/system/blocks/embed.d.ts +0 -11
  25. package/dist/_dts/blocks/src/system/blocks/event-details.d.ts +0 -20
  26. package/dist/_dts/blocks/src/system/blocks/event-registration.d.ts +0 -20
  27. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +43 -27
  28. package/dist/_dts/blocks/src/system/blocks/events/event-listing.d.ts +24 -15
  29. package/dist/_dts/blocks/src/system/blocks/events/event-spotlight.d.ts +2 -2
  30. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +132 -12
  31. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +3 -2
  32. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +2 -10
  33. package/dist/_dts/blocks/src/system/blocks/file-download.d.ts +2 -2
  34. package/dist/_dts/blocks/src/system/blocks/form.d.ts +2 -24
  35. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +2 -2
  36. package/dist/_dts/blocks/src/system/blocks/hero.d.ts +2 -3
  37. package/dist/_dts/blocks/src/system/blocks/image-gallery.d.ts +2 -2
  38. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +0 -13
  39. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +17 -17
  40. package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +2 -10
  41. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +2 -2
  42. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +2 -2
  43. package/dist/_dts/blocks/src/system/blocks/shared/bookingPaymentTerms.d.ts +9 -9
  44. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +2 -2
  45. package/dist/_dts/blocks/src/system/blocks/single-button.d.ts +16 -15
  46. package/dist/_dts/blocks/src/system/blocks/site-footer.d.ts +2 -6
  47. package/dist/_dts/blocks/src/system/blocks/site-header.d.ts +0 -11
  48. package/dist/_dts/blocks/src/system/blocks/team-members.d.ts +3 -3
  49. package/dist/_dts/blocks/src/system/blocks/testimonials.d.ts +2 -2
  50. package/dist/_dts/blocks/src/system/blocks/video-grid.d.ts +2 -2
  51. package/dist/_dts/blocks/src/system/constants/events.d.ts +18 -0
  52. package/dist/_dts/blocks/src/system/customize/facets.d.ts +105 -0
  53. package/dist/_dts/blocks/src/system/defineBlock.d.ts +29 -5
  54. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +2 -1
  55. package/dist/_dts/blocks/src/system/fragments/library/blogFeaturedPost.d.ts +0 -24
  56. package/dist/_dts/blocks/src/system/fragments/library/bodyCopy.d.ts +0 -4
  57. package/dist/_dts/blocks/src/system/fragments/library/bookingForm.d.ts +0 -4
  58. package/dist/_dts/blocks/src/system/fragments/library/card.d.ts +0 -6
  59. package/dist/_dts/blocks/src/system/fragments/library/columnContent.d.ts +0 -6
  60. package/dist/_dts/blocks/src/system/fragments/library/ctaCopy.d.ts +0 -4
  61. package/dist/_dts/blocks/src/system/fragments/library/ctaRow.d.ts +0 -4
  62. package/dist/_dts/blocks/src/system/fragments/library/faqAccordion.d.ts +0 -4
  63. package/dist/_dts/blocks/src/system/fragments/library/faqHeading.d.ts +0 -4
  64. package/dist/_dts/blocks/src/system/fragments/library/feedbackCallout.d.ts +0 -6
  65. package/dist/_dts/blocks/src/system/fragments/library/footerBottomText.d.ts +0 -4
  66. package/dist/_dts/blocks/src/system/fragments/library/formCopy.d.ts +0 -4
  67. package/dist/_dts/blocks/src/system/fragments/library/formEmbed.d.ts +0 -18
  68. package/dist/_dts/blocks/src/system/fragments/library/headerCta.d.ts +0 -4
  69. package/dist/_dts/blocks/src/system/fragments/library/heading.d.ts +0 -6
  70. package/dist/_dts/blocks/src/system/fragments/library/heroCopy.d.ts +0 -4
  71. package/dist/_dts/blocks/src/system/fragments/library/heroCtaRow.d.ts +0 -4
  72. package/dist/_dts/blocks/src/system/fragments/library/heroLayoutControls.d.ts +0 -4
  73. package/dist/_dts/blocks/src/system/fragments/library/image.d.ts +0 -6
  74. package/dist/_dts/blocks/src/system/fragments/library/newsletterCopy.d.ts +0 -4
  75. package/dist/_dts/blocks/src/system/fragments/library/newsletterForm.d.ts +0 -4
  76. package/dist/_dts/blocks/src/system/fragments/library/quote.d.ts +0 -6
  77. package/dist/_dts/blocks/src/system/fragments/library/richText.d.ts +0 -6
  78. package/dist/_dts/blocks/src/system/fragments/library/sectionState.d.ts +0 -6
  79. package/dist/_dts/blocks/src/system/fragments/library/singleButton.d.ts +0 -4
  80. package/dist/_dts/blocks/src/system/fragments/library/spinner.d.ts +0 -5
  81. package/dist/_dts/blocks/src/system/fragments/library/teamMember.d.ts +0 -6
  82. package/dist/_dts/blocks/src/system/fragments/library/testimonialsCarousel.d.ts +0 -31
  83. package/dist/_dts/blocks/src/system/fragments/library/testimonialsHeading.d.ts +0 -4
  84. package/dist/_dts/blocks/src/system/fragments/library/videoEmbed.d.ts +0 -6
  85. package/dist/_dts/blocks/src/system/fragments/types.d.ts +11 -3
  86. package/dist/_dts/blocks/src/system/helpers/resolveBackground.d.ts +4 -0
  87. package/dist/_dts/blocks/src/system/index.d.ts +1 -0
  88. package/dist/_dts/blocks/src/system/manifest/derivedContent.d.ts +3 -3
  89. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +10 -10
  90. package/dist/_dts/blocks/src/system/media/constrainedVideoMedia.d.ts +13 -0
  91. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +6 -0
  92. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +3 -0
  93. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCalendar.interactive.d.ts +4 -0
  94. package/dist/_dts/blocks/src/system/runtime/nodes/media.d.ts +1 -0
  95. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +7 -0
  96. package/dist/_dts/content-model/src/contentManifest.d.ts +2 -2
  97. package/dist/_dts/content-model/src/referenceFields.d.ts +7 -1
  98. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +34 -6
  99. package/dist/_dts/editor-blocks/src/media/MediaField.d.ts +2 -0
  100. package/dist/_dts/editor-blocks/src/widgets/entry-picker/EntryPickerWidgetProvider.d.ts +3 -2
  101. package/dist/_dts/editor-blocks/src/widgets/entry-picker/loaders.d.ts +2 -1
  102. package/dist/_dts/editor-blocks/src/widgets/entry-picker/types.d.ts +2 -1
  103. package/dist/_dts/editor-blocks/src/widgets/link/LinkPicker.d.ts +2 -1
  104. package/dist/_dts/editor-blocks/src/widgets/link/LinkWidget.d.ts +2 -1
  105. package/dist/_dts/editor-blocks/src/widgets/link/LinkWidgetContext.d.ts +2 -1
  106. package/dist/_dts/editor-blocks/src/widgets/link/loaders.d.ts +2 -1
  107. package/dist/_dts/editor-blocks/src/widgets/link/types.d.ts +3 -2
  108. package/dist/_dts/editor-blocks/src/widgets/reference/dynamicAdapters.d.ts +9 -0
  109. package/dist/_dts/editor-blocks/src/widgets/reference/loaders.d.ts +5 -1
  110. package/dist/_dts/media-core/src/index.d.ts +1 -0
  111. package/dist/_dts/media-core/src/videoSlotPolicy.d.ts +38 -0
  112. package/dist/_dts/media-editor/src/MediaEditor.d.ts +3 -1
  113. package/dist/_dts/media-editor/src/MediaPickerDialog.d.ts +7 -0
  114. package/dist/_dts/preview-next/src/client/blocks/customizeFacetControls.d.ts +9 -0
  115. package/dist/_dts/preview-next/src/client/blocks/previewCustomizeActions.d.ts +14 -0
  116. package/dist/_dts/preview-next/src/client/layout/PreviewLayoutContext.d.ts +9 -7
  117. package/dist/_dts/preview-next/src/client/preview/previewCustomizeHistory.d.ts +6 -3
  118. package/dist/_dts/preview-next/src/client/widgets/widgetAdapters.d.ts +1 -1
  119. package/dist/_dts/sdk/src/contracts/content.d.ts +10 -0
  120. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +1 -1
  121. package/dist/_dts/sdk/src/manifest/prompt/examples/features-grid.d.ts +1 -1
  122. package/dist/_dts/sdk/src/manifest/prompt/examples/pricing.d.ts +5 -5
  123. package/dist/_dts/sdk/src/rendering/helpers/bindings.d.ts +1 -0
  124. package/dist/_dts/sdk/src/version.d.ts +1 -1
  125. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  126. package/dist/_dts/theme-core/src/index.d.ts +1 -0
  127. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +3 -0
  128. package/dist/_dts/theme-core/src/schema.d.ts +25 -0
  129. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +515 -0
  130. package/dist/_dts/theme-core/src/site-styles/appearancePresetResolution.d.ts +12 -0
  131. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +119 -0
  132. package/dist/_dts/theme-core/src/site-styles/appearancePresets.d.ts +5 -563
  133. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +448 -0
  134. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +6 -0
  135. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +12 -0
  136. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +2 -0
  137. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +8 -0
  138. package/dist/_dts/theme-core/src/site-styles/siteChromeAppearancePresets.d.ts +67 -0
  139. package/dist/_dts/theme-core/src/site-styles/sourceCatalogs.d.ts +6 -6
  140. package/dist/_dts/theme-core/src/site-styles/types.d.ts +22 -3
  141. package/dist/_dts/theme-core/src/siteChrome.d.ts +11 -0
  142. package/dist/cli/index.mjs +4310 -3464
  143. package/dist/client/bookings.mjs +310 -310
  144. package/dist/client/client.mjs +61329 -60359
  145. package/dist/client/hooks.mjs +1254 -731
  146. package/dist/client/rendering/client.mjs +5959 -5226
  147. package/dist/client/rendering/islands.mjs +3842 -3275
  148. package/dist/client/rendering.mjs +7495 -6519
  149. package/dist/preview-next/before-render.mjs +118 -0
  150. package/dist/preview-next/client/runtime.mjs +4489 -2773
  151. package/dist/preview-next/middleware.mjs +136 -0
  152. package/dist/server/components.mjs +1342 -765
  153. package/dist/server/config-validation.mjs +1256 -733
  154. package/dist/server/config.mjs +1256 -733
  155. package/dist/server/data.mjs +1254 -731
  156. package/dist/server/index.mjs +191 -18
  157. package/dist/server/next.mjs +1339 -760
  158. package/dist/server/page-converter.mjs +1088 -734
  159. package/dist/server/prebuild.mjs +1 -1
  160. package/dist/server/rendering/server.mjs +1338 -762
  161. package/dist/server/rendering.mjs +1351 -770
  162. package/dist/server/routing.mjs +1340 -754
  163. package/dist/server/server.mjs +1260 -734
  164. package/dist/server/theme-bridge.mjs +198 -34
  165. package/dist/server/theme.mjs +6 -0
  166. package/dist/styles/index.css +28 -9
  167. package/package.json +1 -1
@@ -1002,6 +1002,14 @@ var ENDPOINT_DEFINITIONS = {
1002
1002
  auth: "user",
1003
1003
  responseKind: "json"
1004
1004
  },
1005
+ exportAppointmentServicesCsv: {
1006
+ path: "/sites/{siteId}/bookings/services/export.csv",
1007
+ method: "GET",
1008
+ tags: ["site-{siteId}", "bookings", "appointment-services-{siteId}"],
1009
+ errors: [],
1010
+ auth: "user",
1011
+ responseKind: "blob"
1012
+ },
1005
1013
  createAppointmentService: {
1006
1014
  path: "/sites/{siteId}/bookings/services",
1007
1015
  method: "POST",
@@ -1270,6 +1278,14 @@ var ENDPOINT_DEFINITIONS = {
1270
1278
  auth: "user",
1271
1279
  responseKind: "json"
1272
1280
  },
1281
+ exportCoursesCsv: {
1282
+ path: "/sites/{siteId}/bookings/courses/export.csv",
1283
+ method: "GET",
1284
+ tags: ["site-{siteId}", "bookings", "courses-{siteId}"],
1285
+ errors: [],
1286
+ auth: "user",
1287
+ responseKind: "blob"
1288
+ },
1273
1289
  createCourse: {
1274
1290
  path: "/sites/{siteId}/bookings/courses",
1275
1291
  method: "POST",
@@ -1369,6 +1385,14 @@ var ENDPOINT_DEFINITIONS = {
1369
1385
  responseKind: "json",
1370
1386
  errors: []
1371
1387
  },
1388
+ exportCourseWaitlistCsv: {
1389
+ path: "/sites/{siteId}/bookings/courses/{courseId}/waitlist/export.csv",
1390
+ method: "GET",
1391
+ tags: ["site-{siteId}", "bookings", "courses-{courseId}"],
1392
+ auth: "user",
1393
+ responseKind: "blob",
1394
+ errors: []
1395
+ },
1372
1396
  updateCourseEnrollment: {
1373
1397
  path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments/{enrollmentId}",
1374
1398
  method: "PATCH",
@@ -3964,6 +3988,14 @@ var ENDPOINT_DEFINITIONS = {
3964
3988
  auth: "user",
3965
3989
  responseKind: "json"
3966
3990
  },
3991
+ exportEventSeriesCsv: {
3992
+ path: "/sites/{siteId}/bookings/event-series/export.csv",
3993
+ method: "GET",
3994
+ tags: ["site-{siteId}", "bookings", "event-series-{siteId}"],
3995
+ errors: [],
3996
+ auth: "user",
3997
+ responseKind: "blob"
3998
+ },
3967
3999
  createEventSeries: {
3968
4000
  path: "/sites/{siteId}/bookings/event-series",
3969
4001
  method: "POST",
@@ -4032,6 +4064,60 @@ var ENDPOINT_DEFINITIONS = {
4032
4064
  errors: [],
4033
4065
  responseKind: "blob"
4034
4066
  },
4067
+ getParticipantMessageRecipients: {
4068
+ path: "/sites/{siteId}/bookings/participant-messaging/recipients",
4069
+ method: "POST",
4070
+ tags: ["site-{siteId}"],
4071
+ auth: "user",
4072
+ errors: [
4073
+ "validation:invalid_input",
4074
+ "auth:forbidden",
4075
+ "resource:not_found",
4076
+ "server:internal_error"
4077
+ ],
4078
+ responseKind: "json"
4079
+ },
4080
+ sendParticipantMessage: {
4081
+ path: "/sites/{siteId}/bookings/participant-messaging/send",
4082
+ method: "POST",
4083
+ tags: ["site-{siteId}"],
4084
+ auth: "user",
4085
+ errors: [
4086
+ "validation:invalid_input",
4087
+ "auth:forbidden",
4088
+ "resource:not_found",
4089
+ "resource:conflict",
4090
+ "server:internal_error"
4091
+ ],
4092
+ responseKind: "json"
4093
+ },
4094
+ testParticipantMessage: {
4095
+ path: "/sites/{siteId}/bookings/participant-messaging/test",
4096
+ method: "POST",
4097
+ tags: ["site-{siteId}"],
4098
+ auth: "user",
4099
+ errors: [
4100
+ "validation:invalid_input",
4101
+ "auth:forbidden",
4102
+ "resource:not_found",
4103
+ "resource:conflict",
4104
+ "server:internal_error"
4105
+ ],
4106
+ responseKind: "json"
4107
+ },
4108
+ listParticipantMessageHistory: {
4109
+ path: "/sites/{siteId}/bookings/participant-messaging/history",
4110
+ method: "POST",
4111
+ tags: ["site-{siteId}"],
4112
+ auth: "user",
4113
+ errors: [
4114
+ "validation:invalid_input",
4115
+ "auth:forbidden",
4116
+ "resource:not_found",
4117
+ "server:internal_error"
4118
+ ],
4119
+ responseKind: "json"
4120
+ },
4035
4121
  listEventSeriesWaitlist: {
4036
4122
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist",
4037
4123
  method: "GET",
@@ -4040,6 +4126,14 @@ var ENDPOINT_DEFINITIONS = {
4040
4126
  responseKind: "json",
4041
4127
  errors: []
4042
4128
  },
4129
+ exportEventSeriesWaitlistCsv: {
4130
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist/export.csv",
4131
+ method: "GET",
4132
+ tags: ["site-{siteId}", "bookings", "event-series-{seriesId}"],
4133
+ auth: "user",
4134
+ responseKind: "blob",
4135
+ errors: []
4136
+ },
4043
4137
  addEventOccurrenceAttendee: {
4044
4138
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/occurrences/{occurrenceId}/attendees",
4045
4139
  method: "POST",
@@ -4756,6 +4850,14 @@ var ENDPOINT_DEFINITIONS = {
4756
4850
  auth: "user",
4757
4851
  responseKind: "json"
4758
4852
  },
4853
+ exportSiteCustomerPassesCsv: {
4854
+ path: "/sites/{siteId}/bookings/customer-passes/export.csv",
4855
+ method: "GET",
4856
+ tags: ["site-{siteId}", "bookings", "customer-passes-{siteId}"],
4857
+ auth: "user",
4858
+ responseKind: "blob",
4859
+ errors: []
4860
+ },
4759
4861
  listSiteCustomerMemberships: {
4760
4862
  path: "/sites/{siteId}/bookings/customer-memberships",
4761
4863
  method: "GET",
@@ -4819,6 +4921,22 @@ var ENDPOINT_DEFINITIONS = {
4819
4921
  auth: "user",
4820
4922
  responseKind: "blob"
4821
4923
  },
4924
+ exportBookingLedgerCsv: {
4925
+ path: "/sites/{siteId}/bookings/ledger/export.csv",
4926
+ method: "GET",
4927
+ tags: ["site-{siteId}", "bookings", "booking-ledger-{siteId}"],
4928
+ errors: [],
4929
+ auth: "user",
4930
+ responseKind: "blob"
4931
+ },
4932
+ exportBookingQuestionAnswersCsv: {
4933
+ path: "/sites/{siteId}/bookings/intake-answers/export.csv",
4934
+ method: "GET",
4935
+ tags: ["site-{siteId}", "bookings", "intake-answers-{siteId}"],
4936
+ errors: [],
4937
+ auth: "user",
4938
+ responseKind: "blob"
4939
+ },
4822
4940
  // Site logs
4823
4941
  listSiteActivityLogs: {
4824
4942
  path: "/sites/{siteId}/logs/activity",
@@ -6176,7 +6294,11 @@ function resolveRepeaterGridColumnFieldId(options) {
6176
6294
 
6177
6295
  // ../blocks/src/system/manifest/schema.ts
6178
6296
  var visibilityLevels = ["admin", "designer", "author"];
6179
- var siteOptionSources = ["eventCategories", "venues", "staffMembers"];
6297
+ var siteOptionSources = [
6298
+ "eventCategories",
6299
+ "venues",
6300
+ "staffMembers"
6301
+ ];
6180
6302
  var mediaDeliverySchema = z3.object({
6181
6303
  sizes: z3.string().optional(),
6182
6304
  widthCandidates: z3.array(z3.number().int().positive()).optional(),
@@ -6214,7 +6336,10 @@ var uiSchema = z3.object({
6214
6336
  hidden: z3.boolean().optional(),
6215
6337
  hideLabel: z3.boolean().optional(),
6216
6338
  hideDescription: z3.boolean().optional(),
6217
- showCharCount: z3.union([z3.number().int().positive(), z3.object({ max: z3.number().int().positive() })]).optional(),
6339
+ showCharCount: z3.union([
6340
+ z3.number().int().positive(),
6341
+ z3.object({ max: z3.number().int().positive() })
6342
+ ]).optional(),
6218
6343
  showSlugPreview: z3.boolean().optional(),
6219
6344
  variant: z3.enum(["full", "inline", "limited", "media", "notes"]).optional(),
6220
6345
  richTextVariant: z3.enum(["full", "inline", "limited", "media", "notes"]).optional(),
@@ -6224,10 +6349,7 @@ var uiSchema = z3.object({
6224
6349
  showMediaPreview: z3.boolean().optional(),
6225
6350
  showMediaOverlayActions: z3.boolean().optional(),
6226
6351
  mediaDelivery: mediaDeliverySchema.optional(),
6227
- mediaDeliveryByVariant: z3.record(
6228
- z3.string(),
6229
- mediaDeliverySchema
6230
- ).optional(),
6352
+ mediaDeliveryByVariant: z3.record(z3.string(), mediaDeliverySchema).optional(),
6231
6353
  // Optional input hints for validators/widgets
6232
6354
  inputType: z3.enum(["text", "email", "tel", "number"]).optional(),
6233
6355
  min: z3.number().optional(),
@@ -6335,7 +6457,9 @@ var richTextFieldSchema = baseFieldSchema.extend({
6335
6457
  });
6336
6458
  var mediaFieldSchema = baseFieldSchema.extend({
6337
6459
  type: z3.literal("media"),
6338
- mediaKinds: z3.array(z3.enum(["image", "video", "audio", "document", "spreadsheet", "archive"])).default(["image"]),
6460
+ mediaKinds: z3.array(
6461
+ z3.enum(["image", "video", "audio", "document", "spreadsheet", "archive"])
6462
+ ).default(["image"]),
6339
6463
  aspectRatio: z3.string().optional()
6340
6464
  });
6341
6465
  var booleanFieldSchema = baseFieldSchema.extend({
@@ -6457,7 +6581,9 @@ var referenceFieldSchema = baseFieldSchema.extend({
6457
6581
  var itemTypeSchema = z3.object({
6458
6582
  label: z3.string().min(1),
6459
6583
  icon: z3.string().optional(),
6460
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Item type requires at least one field"))
6584
+ fields: z3.lazy(
6585
+ () => getFieldSchemaInternal().array().min(1, "Item type requires at least one field")
6586
+ )
6461
6587
  });
6462
6588
  var repeaterFieldSchema = baseFieldSchema.extend({
6463
6589
  type: z3.literal("repeater"),
@@ -6467,7 +6593,9 @@ var repeaterFieldSchema = baseFieldSchema.extend({
6467
6593
  maxItems: z3.number().int().positive().optional(),
6468
6594
  // Monomorphic mode
6469
6595
  schema: z3.object({
6470
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Repeater requires at least one field"))
6596
+ fields: z3.lazy(
6597
+ () => getFieldSchemaInternal().array().min(1, "Repeater requires at least one field")
6598
+ )
6471
6599
  }).optional(),
6472
6600
  // Polymorphic mode
6473
6601
  polymorphic: z3.boolean().optional(),
@@ -6513,13 +6641,19 @@ var repeaterFieldSchema = baseFieldSchema.extend({
6513
6641
  const itemTypes = Object.values(
6514
6642
  data.itemTypes
6515
6643
  );
6516
- return itemTypes.every((itemType) => Array.isArray(itemType.fields) && requiredFieldIds.every((requiredId) => itemType.fields?.some((field) => field.id === requiredId)));
6644
+ return itemTypes.every(
6645
+ (itemType) => Array.isArray(itemType.fields) && requiredFieldIds.every(
6646
+ (requiredId) => itemType.fields?.some((field) => field.id === requiredId)
6647
+ )
6648
+ );
6517
6649
  }
6518
6650
  const schemaFields = data.schema?.fields;
6519
6651
  if (!schemaFields) {
6520
6652
  return true;
6521
6653
  }
6522
- return requiredFieldIds.every((requiredId) => schemaFields.some((field) => field.id === requiredId));
6654
+ return requiredFieldIds.every(
6655
+ (requiredId) => schemaFields.some((field) => field.id === requiredId)
6656
+ );
6523
6657
  },
6524
6658
  {
6525
6659
  message: `layoutGrid repeaters require span/row/column fields (defaults: '${DEFAULT_REPEATER_GRID_SPAN_FIELD_ID}', '${DEFAULT_REPEATER_GRID_ROW_FIELD_ID}', '${DEFAULT_REPEATER_GRID_COLUMN_FIELD_ID}') to exist in repeater item fields`,
@@ -6547,7 +6681,9 @@ var repeaterFieldSchema = baseFieldSchema.extend({
6547
6681
  if (!schemaFields) {
6548
6682
  return true;
6549
6683
  }
6550
- const field = schemaFields.find((candidate) => candidate.id === labelField);
6684
+ const field = schemaFields.find(
6685
+ (candidate) => candidate.id === labelField
6686
+ );
6551
6687
  return field?.type === "text";
6552
6688
  },
6553
6689
  {
@@ -6558,13 +6694,17 @@ var repeaterFieldSchema = baseFieldSchema.extend({
6558
6694
  var groupFieldSchema = baseFieldSchema.extend({
6559
6695
  type: z3.literal("group"),
6560
6696
  schema: z3.object({
6561
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Group requires at least one field"))
6697
+ fields: z3.lazy(
6698
+ () => getFieldSchemaInternal().array().min(1, "Group requires at least one field")
6699
+ )
6562
6700
  })
6563
6701
  });
6564
6702
  var modalFieldSchema = baseFieldSchema.extend({
6565
6703
  type: z3.literal("modal"),
6566
6704
  schema: z3.object({
6567
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Modal requires at least one field"))
6705
+ fields: z3.lazy(
6706
+ () => getFieldSchemaInternal().array().min(1, "Modal requires at least one field")
6707
+ )
6568
6708
  })
6569
6709
  });
6570
6710
  var numberFieldSchema = baseFieldSchema.extend({
@@ -6671,31 +6811,35 @@ function expectParsedSelectField(field) {
6671
6811
  return field;
6672
6812
  }
6673
6813
  function createSiteOptionSelectField(input) {
6674
- return expectParsedSelectField(parseFieldDefinition({
6675
- ...input,
6676
- type: "select",
6677
- options: [],
6678
- multiple: input.multiple ?? false,
6679
- source: { kind: "site", optionSource: input.optionSource },
6680
- ui: {
6681
- ...input.ui ?? {},
6682
- widget: "siteOptionPicker",
6683
- siteOptionSource: input.optionSource
6684
- }
6685
- }));
6814
+ return expectParsedSelectField(
6815
+ parseFieldDefinition({
6816
+ ...input,
6817
+ type: "select",
6818
+ options: [],
6819
+ multiple: input.multiple ?? false,
6820
+ source: { kind: "site", optionSource: input.optionSource },
6821
+ ui: {
6822
+ ...input.ui ?? {},
6823
+ widget: "siteOptionPicker",
6824
+ siteOptionSource: input.optionSource
6825
+ }
6826
+ })
6827
+ );
6686
6828
  }
6687
6829
  function createSdkSelectField(input) {
6688
- return expectParsedSelectField(parseFieldDefinition({
6689
- ...input,
6690
- type: "select",
6691
- options: input.options,
6692
- multiple: input.multiple ?? false,
6693
- source: { kind: "sdk" },
6694
- ui: {
6695
- ...input.ui ?? {},
6696
- widget: "sdkSelect"
6697
- }
6698
- }));
6830
+ return expectParsedSelectField(
6831
+ parseFieldDefinition({
6832
+ ...input,
6833
+ type: "select",
6834
+ options: input.options,
6835
+ multiple: input.multiple ?? false,
6836
+ source: { kind: "sdk" },
6837
+ ui: {
6838
+ ...input.ui ?? {},
6839
+ widget: "sdkSelect"
6840
+ }
6841
+ })
6842
+ );
6699
6843
  }
6700
6844
  var slotSchema = z3.object({
6701
6845
  id: z3.string().min(1),
@@ -6706,8 +6850,20 @@ var slotSchema = z3.object({
6706
6850
  help: z3.string().optional(),
6707
6851
  visibleRoles: z3.array(z3.enum(visibilityLevels)).optional()
6708
6852
  });
6709
- var typographyTokens = ["display", "heading", "subheading", "body", "caption"];
6710
- var colorTokens = ["background", "surface", "foreground", "accent", "muted"];
6853
+ var typographyTokens = [
6854
+ "display",
6855
+ "heading",
6856
+ "subheading",
6857
+ "body",
6858
+ "caption"
6859
+ ];
6860
+ var colorTokens = [
6861
+ "background",
6862
+ "surface",
6863
+ "foreground",
6864
+ "accent",
6865
+ "muted"
6866
+ ];
6711
6867
  var spacingTokens = ["none", "xs", "sm", "md", "lg", "xl"];
6712
6868
  var radiusTokens = ["none", "sm", "md", "lg", "full"];
6713
6869
  var styleTokenSchema = z3.object({
@@ -6727,7 +6883,14 @@ var behaviourSchema = z3.object({
6727
6883
  // Block manages its own wrapper (for sticky/fixed positioning)
6728
6884
  managesOwnWrapper: z3.boolean().optional()
6729
6885
  });
6730
- var blockCategoryEnum = z3.enum(["marketing", "content", "blog", "media", "layout", "interactive"]);
6886
+ var blockCategoryEnum = z3.enum([
6887
+ "marketing",
6888
+ "content",
6889
+ "blog",
6890
+ "media",
6891
+ "layout",
6892
+ "interactive"
6893
+ ]);
6731
6894
  var manifestSchema = z3.object({
6732
6895
  name: z3.string().min(1),
6733
6896
  version: z3.string().min(1),
@@ -7326,6 +7489,20 @@ var applyAppointmentSetupRequestSchema = z6.object({
7326
7489
  bookingNotice: appointmentSetupBookingNoticeSchema
7327
7490
  });
7328
7491
 
7492
+ // ../api/src/bookingRecords.ts
7493
+ var BOOKING_QUESTION_ANSWER_EXPORT_SCOPES = {
7494
+ site: "site",
7495
+ appointments: "appointments",
7496
+ eventSeries: "event_series",
7497
+ course: "course"
7498
+ };
7499
+ var BOOKING_QUESTION_ANSWER_EXPORT_SCOPE_VALUES = [
7500
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.site,
7501
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.appointments,
7502
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.eventSeries,
7503
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.course
7504
+ ];
7505
+
7329
7506
  // ../api/src/common/cancellation.ts
7330
7507
  var STAFF_CANCELLATION_CONTEXT_UI_CATEGORIES = [
7331
7508
  "customer_requested",
@@ -7652,6 +7829,24 @@ function registerManifest(manifest) {
7652
7829
  return manifest;
7653
7830
  }
7654
7831
 
7832
+ // ../theme-core/src/site-styles/appearancePresetResolution.ts
7833
+ function assertValidOptionGroups(preset2) {
7834
+ preset2.optionGroups?.forEach((group) => {
7835
+ const selectedOption = group.options.find(
7836
+ (option) => option.id === group.selectedOptionId
7837
+ );
7838
+ if (!selectedOption) {
7839
+ throw new Error(
7840
+ `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
7841
+ );
7842
+ }
7843
+ });
7844
+ }
7845
+ function defineBlockAppearancePreset(preset2) {
7846
+ assertValidOptionGroups(preset2);
7847
+ return preset2;
7848
+ }
7849
+
7655
7850
  // ../theme-core/src/site-styles/types.ts
7656
7851
  function asDesignBlockId(value) {
7657
7852
  return brandNonEmptyString(value, "DesignBlockId");
@@ -7733,6 +7928,11 @@ function flushPanelFrame(options) {
7733
7928
  function defineFrameCapability(capability) {
7734
7929
  return capability;
7735
7930
  }
7931
+ var tileTreatmentValues = [
7932
+ "default",
7933
+ "quiet",
7934
+ "brand-depth"
7935
+ ];
7736
7936
  var eyebrowTreatmentValues = [
7737
7937
  "plain",
7738
7938
  "pill",
@@ -7748,31 +7948,13 @@ function defineBlockDesignCapability(capability) {
7748
7948
  imageSurfaceTreatments: capability.imageSurfaceTreatments ?? ["none"],
7749
7949
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7750
7950
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
7951
+ tileTreatments: capability.tileTreatments ?? ["default"],
7751
7952
  eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"]
7752
7953
  };
7753
7954
  }
7754
7955
 
7755
- // ../theme-core/src/site-styles/appearancePresets.ts
7756
- function assertValidOptionGroups(preset2) {
7757
- preset2.optionGroups?.forEach((group) => {
7758
- const selectedOption = group.options.find(
7759
- (option) => option.id === group.selectedOptionId
7760
- );
7761
- if (!selectedOption) {
7762
- throw new Error(
7763
- `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
7764
- );
7765
- }
7766
- });
7767
- }
7768
- function defineBlockAppearancePreset(preset2) {
7769
- assertValidOptionGroups(preset2);
7770
- return preset2;
7771
- }
7772
- function defineSiteChromeAppearancePreset(preset2) {
7773
- return preset2;
7774
- }
7775
- var appearancePresets = [
7956
+ // ../theme-core/src/site-styles/blockAppearancePresets.ts
7957
+ var blockAppearancePresets = [
7776
7958
  defineBlockAppearancePreset({
7777
7959
  kind: "block-design",
7778
7960
  id: "hero-immersive-image",
@@ -7898,6 +8080,24 @@ var appearancePresets = [
7898
8080
  eyebrowTreatment: "accent-pill-bounce"
7899
8081
  }
7900
8082
  }),
8083
+ defineBlockAppearancePreset({
8084
+ kind: "block-design",
8085
+ id: "hero-brand-depth-expressive",
8086
+ target: "hero",
8087
+ label: "Expressive brand-depth hero",
8088
+ blockKinds: ["block.hero"],
8089
+ constraints: {
8090
+ layoutFamilies: ["centered", "compact"]
8091
+ },
8092
+ design: {
8093
+ sectionSurface: "brand-depth-band",
8094
+ contentFrame: plainFrame,
8095
+ itemSurface: "none",
8096
+ transitionAfter: "soft-fade-short",
8097
+ emphasis: "high",
8098
+ eyebrowTreatment: "accent-pill-bounce"
8099
+ }
8100
+ }),
7901
8101
  defineBlockAppearancePreset({
7902
8102
  kind: "block-design",
7903
8103
  id: "hero-contained-intro",
@@ -7926,6 +8126,20 @@ var appearancePresets = [
7926
8126
  emphasis: "high"
7927
8127
  }
7928
8128
  }),
8129
+ defineBlockAppearancePreset({
8130
+ kind: "block-design",
8131
+ id: "body-text-brand-depth-intro",
8132
+ target: "body-text",
8133
+ label: "Brand-depth intro copy",
8134
+ blockKinds: ["block.body-text"],
8135
+ design: {
8136
+ sectionSurface: "brand-depth-band",
8137
+ contentFrame: plainFrame,
8138
+ itemSurface: "none",
8139
+ transitionAfter: "soft-fade-short",
8140
+ emphasis: "high"
8141
+ }
8142
+ }),
7929
8143
  defineBlockAppearancePreset({
7930
8144
  kind: "block-design",
7931
8145
  id: "offerings-calm-list",
@@ -7968,6 +8182,21 @@ var appearancePresets = [
7968
8182
  emphasis: "medium"
7969
8183
  }
7970
8184
  }),
8185
+ defineBlockAppearancePreset({
8186
+ kind: "block-design",
8187
+ id: "schedule-details-brand-depth",
8188
+ target: "events",
8189
+ label: "Brand-depth schedule details",
8190
+ blockKinds: ["block.event-details", "block.course-details"],
8191
+ design: {
8192
+ sectionSurface: "brand-depth-band",
8193
+ contentFrame: plainFrame,
8194
+ itemSurface: "none",
8195
+ transitionAfter: "none",
8196
+ emphasis: "medium",
8197
+ tileTreatment: "brand-depth"
8198
+ }
8199
+ }),
7971
8200
  defineBlockAppearancePreset({
7972
8201
  kind: "block-design",
7973
8202
  id: "media-text-flush-feature",
@@ -8053,6 +8282,20 @@ var appearancePresets = [
8053
8282
  testimonialCardTreatment: "accent-quote"
8054
8283
  }
8055
8284
  }),
8285
+ defineBlockAppearancePreset({
8286
+ kind: "block-design",
8287
+ id: "faq-base-accordion",
8288
+ target: "faq",
8289
+ label: "Base accordion FAQ",
8290
+ blockKinds: ["block.faq"],
8291
+ design: {
8292
+ sectionSurface: "base",
8293
+ contentFrame: plainFrame,
8294
+ itemSurface: "default",
8295
+ transitionAfter: "none",
8296
+ emphasis: "medium"
8297
+ }
8298
+ }),
8056
8299
  defineBlockAppearancePreset({
8057
8300
  kind: "block-design",
8058
8301
  id: "faq-contained-help",
@@ -8095,6 +8338,20 @@ var appearancePresets = [
8095
8338
  emphasis: "high"
8096
8339
  }
8097
8340
  }),
8341
+ defineBlockAppearancePreset({
8342
+ kind: "block-design",
8343
+ id: "contact-form-brand-depth-card",
8344
+ target: "contact-form",
8345
+ label: "Brand-depth form card",
8346
+ blockKinds: ["block.form"],
8347
+ design: {
8348
+ sectionSurface: "brand-depth-band",
8349
+ contentFrame: panelFrame("raised"),
8350
+ itemSurface: "none",
8351
+ transitionAfter: "none",
8352
+ emphasis: "high"
8353
+ }
8354
+ }),
8098
8355
  defineBlockAppearancePreset({
8099
8356
  kind: "block-design",
8100
8357
  id: "cta-accent-band",
@@ -8108,7 +8365,14 @@ var appearancePresets = [
8108
8365
  transitionAfter: "none",
8109
8366
  emphasis: "high"
8110
8367
  }
8111
- }),
8368
+ })
8369
+ ];
8370
+
8371
+ // ../theme-core/src/site-styles/siteChromeAppearancePresets.ts
8372
+ function defineSiteChromeAppearancePreset(preset2) {
8373
+ return preset2;
8374
+ }
8375
+ var siteChromeAppearancePresets = [
8112
8376
  defineSiteChromeAppearancePreset({
8113
8377
  kind: "site-chrome",
8114
8378
  id: "header-clean-base",
@@ -8176,6 +8440,12 @@ var appearancePresets = [
8176
8440
  })
8177
8441
  ];
8178
8442
 
8443
+ // ../theme-core/src/site-styles/appearancePresetCatalog.ts
8444
+ var appearancePresets = [
8445
+ ...blockAppearancePresets,
8446
+ ...siteChromeAppearancePresets
8447
+ ];
8448
+
8179
8449
  // ../theme-core/src/site-styles/blockFlow.ts
8180
8450
  function defineBlockDesignMetadata(input) {
8181
8451
  const layoutProfiles = (input.layoutProfiles ?? []).map((profile) => ({
@@ -9650,6 +9920,7 @@ var sectionStylesOverrideSchema = z22.object({
9650
9920
  background: boxBackgroundSchema.nullable().optional(),
9651
9921
  spacing: semanticSpacingSchema.nullable().optional(),
9652
9922
  minHeight: z22.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
9923
+ tileTreatment: z22.enum(tileTreatmentValues).nullable().optional(),
9653
9924
  eyebrowTreatment: z22.enum(eyebrowTreatmentValues).nullable().optional()
9654
9925
  });
9655
9926
  var containerStylesOverrideSchema = z22.object({
@@ -10443,7 +10714,7 @@ var userContentFrames = [
10443
10714
  ];
10444
10715
  var generatedDesignOptionCatalog = {
10445
10716
  source: "generated",
10446
- sectionSurfaces: ["base", "muted-band", "accent-band", "hero-image"],
10717
+ sectionSurfaces: ["base", "muted-band", "accent-band", "brand-depth-band", "hero-image"],
10447
10718
  contentFrames: generatedContentFrames,
10448
10719
  itemSurfaces: ["none", "default", "flat", "outlined", "raised"],
10449
10720
  transitions: ["none", "soft-fade-short", "soft-fade-long"],
@@ -10513,6 +10784,43 @@ var expressiveBudget = {
10513
10784
  mediaDensity: "high",
10514
10785
  decorativeRepetition: "medium"
10515
10786
  };
10787
+ var expressiveUnderlineInputs = {
10788
+ base: {
10789
+ background: { type: "transparent" },
10790
+ textColorToken: "text",
10791
+ border: {
10792
+ widthClass: "border-2",
10793
+ colorToken: "border",
10794
+ style: "underline"
10795
+ },
10796
+ corners: "square",
10797
+ shadow: null,
10798
+ spacing: "compact",
10799
+ fontSize: "base"
10800
+ },
10801
+ label: {
10802
+ textColorToken: "primary",
10803
+ fontWeight: "black",
10804
+ fontSize: "xs",
10805
+ textTransform: "uppercase",
10806
+ letterSpacing: "widest",
10807
+ opacity: 1
10808
+ },
10809
+ focus: {
10810
+ ringColorToken: "secondary",
10811
+ ringWidth: "0",
10812
+ borderColorToken: "secondary"
10813
+ },
10814
+ error: {
10815
+ borderColorToken: "destructive",
10816
+ textColorToken: "destructive"
10817
+ },
10818
+ disabled: {
10819
+ backgroundColorToken: "surface",
10820
+ textColorToken: "text",
10821
+ opacity: 0.6
10822
+ }
10823
+ };
10516
10824
  function uniqueContentFrameKinds() {
10517
10825
  const kinds = [...new Set(
10518
10826
  generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
@@ -10863,15 +11171,17 @@ var curatedSiteStyles = [
10863
11171
  paragraphSize: "editorial",
10864
11172
  headingSize: "editorial"
10865
11173
  }
10866
- }
11174
+ },
11175
+ inputs: expressiveUnderlineInputs
10867
11176
  },
10868
11177
  recommendedAppearancePresetIds: [
10869
11178
  "site-header-brand-solid-inverted-cta",
10870
11179
  "site-footer-brand-two-band",
10871
11180
  "hero-brand-scrim-fixed-frame",
10872
11181
  "body-text-editorial-intro",
11182
+ "schedule-details-brand-depth",
10873
11183
  "testimonials-accent-quote-proof",
10874
- "contact-form-dark-card"
11184
+ "contact-form-brand-depth-card"
10875
11185
  ],
10876
11186
  buttonPersonalityChoices: [
10877
11187
  buttonChoice("showtime-pill"),
@@ -11005,6 +11315,7 @@ var imageSurfaceTreatmentSchema = z24.discriminatedUnion("kind", [
11005
11315
  }).strict()
11006
11316
  ]);
11007
11317
  var testimonialCardTreatmentSchema = z24.enum(["default", "accent-quote"]);
11318
+ var tileTreatmentSchema = z24.enum(tileTreatmentValues);
11008
11319
  var eyebrowTreatmentSchema = z24.enum(eyebrowTreatmentValues);
11009
11320
  function uniqueNonEmpty(values) {
11010
11321
  const uniqueValues = [...new Set(values)];
@@ -11049,6 +11360,7 @@ var blockDesignPlanSchema = z24.object({
11049
11360
  imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
11050
11361
  imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
11051
11362
  testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
11363
+ tileTreatment: tileTreatmentSchema.optional(),
11052
11364
  eyebrowTreatment: eyebrowTreatmentSchema.optional()
11053
11365
  }).strict();
11054
11366
  var styleAuthoritySchema = z24.discriminatedUnion("kind", [
@@ -11112,6 +11424,14 @@ var defaultDesignRuntimeRules = defineDesignRuntimeRules({
11112
11424
  headingColor: "primaryForeground"
11113
11425
  }
11114
11426
  },
11427
+ "brand-depth-band": {
11428
+ background: {
11429
+ type: "color",
11430
+ color: "primary-800",
11431
+ textColor: "primaryForeground",
11432
+ headingColor: "primaryForeground"
11433
+ }
11434
+ },
11115
11435
  "hero-image": {
11116
11436
  background: {
11117
11437
  type: "image",
@@ -13001,6 +13321,21 @@ function createTransformRegistry(definitions) {
13001
13321
  }
13002
13322
 
13003
13323
  // ../blocks/src/system/transforms/registry/_utils/colorResolution.ts
13324
+ var CSS_COLOR_FUNCTION_PATTERN = /^(?:rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch|color|color-mix|light-dark)\(/i;
13325
+ var CSS_HEX_COLOR_PATTERN = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
13326
+ var THEME_COLOR_TOKEN_PATTERN = /^[a-zA-Z][a-zA-Z0-9]*(?:-[a-zA-Z0-9]+)*(?:\/(?:100|[1-9]?\d|0))?$/;
13327
+ var CSS_COLOR_KEYWORDS = /* @__PURE__ */ new Set([
13328
+ "transparent",
13329
+ "currentColor",
13330
+ "inherit",
13331
+ "initial",
13332
+ "revert",
13333
+ "revert-layer",
13334
+ "unset"
13335
+ ]);
13336
+ function isLiteralCssColorValue(value) {
13337
+ return CSS_HEX_COLOR_PATTERN.test(value) || CSS_COLOR_FUNCTION_PATTERN.test(value) || value.startsWith("var(") || CSS_COLOR_KEYWORDS.has(value);
13338
+ }
13004
13339
  function resolveBackgroundColorValue(tokenOrCssValue, context) {
13005
13340
  const trimmed = tokenOrCssValue.trim();
13006
13341
  if (!trimmed) return "";
@@ -13017,8 +13352,11 @@ function resolveBackgroundColorValue(tokenOrCssValue, context) {
13017
13352
  return rgbColorValue(trimmed);
13018
13353
  }
13019
13354
  }
13020
- if (trimmed === "transparent") {
13021
- return "transparent";
13355
+ if (isLiteralCssColorValue(trimmed)) {
13356
+ return trimmed;
13357
+ }
13358
+ if (THEME_COLOR_TOKEN_PATTERN.test(trimmed)) {
13359
+ return rgbColorValue(trimmed);
13022
13360
  }
13023
13361
  return trimmed;
13024
13362
  }
@@ -13274,6 +13612,15 @@ function hasFixedFrameBackgroundMotion(value) {
13274
13612
  const background = asPartialObject(input?.background);
13275
13613
  return background?.motion === "fixed-frame";
13276
13614
  }
13615
+ var tileTreatmentClassMap = {
13616
+ default: "",
13617
+ quiet: "rb-tile-treatment-quiet",
13618
+ "brand-depth": "rb-tile-treatment-brand-depth"
13619
+ };
13620
+ var tileTreatmentSet = new Set(tileTreatmentValues);
13621
+ function isTileTreatment(value) {
13622
+ return typeof value === "string" && tileTreatmentSet.has(value);
13623
+ }
13277
13624
  var sectionClassNameTransform = {
13278
13625
  id: "sectionStyles.resolveClassName",
13279
13626
  kind: "string",
@@ -13330,6 +13677,17 @@ var sectionClassNameTransform = {
13330
13677
  classes.push(minHeightClass);
13331
13678
  }
13332
13679
  }
13680
+ const tileTreatment = input?.tileTreatment;
13681
+ if (isTileTreatment(tileTreatment)) {
13682
+ const tileTreatmentClass = tileTreatmentClassMap[tileTreatment];
13683
+ if (tileTreatmentClass) {
13684
+ classes.push(tileTreatmentClass);
13685
+ }
13686
+ } else if (typeof tileTreatment === "string" && true) {
13687
+ console.warn(
13688
+ `[sectionStyles] Invalid tileTreatment value in _sectionStyles: "${tileTreatment}". Expected one of: ${tileTreatmentValues.join(", ")}.`
13689
+ );
13690
+ }
13333
13691
  if (hasFixedFrameBackgroundMotion(input)) {
13334
13692
  classes.push(fixedFrameScopeClass);
13335
13693
  }
@@ -16204,6 +16562,9 @@ function createBlockManifest(config) {
16204
16562
  };
16205
16563
  return augmentManifest(manifest);
16206
16564
  }
16565
+ function createBlockManifestWithContentShape(config, _contentShape) {
16566
+ return createBlockManifest(config);
16567
+ }
16207
16568
  function normalizeBlockLayout(layout) {
16208
16569
  return Array.isArray(layout) ? [...layout] : layout;
16209
16570
  }
@@ -16836,7 +17197,7 @@ var ctaComposition = composeFragments([
16836
17197
  { fragment: ctaCopyFragment },
16837
17198
  { fragment: ctaRowFragment }
16838
17199
  ]);
16839
- var ctaFullManifest = createBlockManifest({
17200
+ var ctaFullConfig = {
16840
17201
  id: "block.cta-full",
16841
17202
  title: "Full-width CTA",
16842
17203
  category: "marketing",
@@ -16854,7 +17215,8 @@ var ctaFullManifest = createBlockManifest({
16854
17215
  description: "Centered call to action with optional background image.",
16855
17216
  tags: ["cta", "call-to-action", "button", "conversion", "action", "sign-up", "get-started"],
16856
17217
  icon: "Target"
16857
- });
17218
+ };
17219
+ var ctaFullManifest = createBlockManifest(ctaFullConfig);
16858
17220
  var ctaFullBlockDefinition = {
16859
17221
  manifest: ctaFullManifest
16860
17222
  };
@@ -19938,9 +20300,9 @@ var mediaTextManifest = createBlockManifest({
19938
20300
  {
19939
20301
  id: "images",
19940
20302
  type: "repeater",
19941
- label: "Images",
20303
+ label: "Media",
19942
20304
  required: false,
19943
- itemLabel: "Image",
20305
+ itemLabel: "Media",
19944
20306
  minItems: 0,
19945
20307
  maxItems: 6,
19946
20308
  allowConversion: true,
@@ -19954,9 +20316,9 @@ var mediaTextManifest = createBlockManifest({
19954
20316
  {
19955
20317
  id: "image",
19956
20318
  type: "media",
19957
- label: "Image",
20319
+ label: "Media",
19958
20320
  required: true,
19959
- mediaKinds: ["image"]
20321
+ mediaKinds: ["image", "video"]
19960
20322
  }
19961
20323
  ]
19962
20324
  }
@@ -20034,8 +20396,8 @@ var mediaTextManifest = createBlockManifest({
20034
20396
  {
20035
20397
  id: "aspectRatio",
20036
20398
  type: "select",
20037
- label: "Image aspect ratio",
20038
- description: "Crop image to a consistent aspect ratio.",
20399
+ label: "Media aspect ratio",
20400
+ description: "Crop media to a consistent aspect ratio.",
20039
20401
  required: false,
20040
20402
  defaultValue: "auto",
20041
20403
  multiple: false,
@@ -20222,8 +20584,8 @@ var mediaTextManifest = createBlockManifest({
20222
20584
  }
20223
20585
  };
20224
20586
  })(),
20225
- description: "Two columns: image/carousel + rich text (with optional section title).",
20226
- tags: ["media", "image", "carousel", "text", "two-column", "layout"],
20587
+ description: "Two columns: media/carousel + rich text (with optional section title).",
20588
+ tags: ["media", "image", "video", "carousel", "text", "two-column", "layout"],
20227
20589
  icon: "Columns"
20228
20590
  });
20229
20591
  var mediaTextBlockDefinition = {
@@ -20374,6 +20736,19 @@ var transformSchema2 = z39.object({
20374
20736
  hotspot: hotspotSchema2.optional(),
20375
20737
  rotation: rotationSchema2.optional()
20376
20738
  });
20739
+ var mediaPosterSchema = z39.discriminatedUnion("tag", [
20740
+ z39.object({
20741
+ tag: z39.literal("storage"),
20742
+ assetId: z39.string().optional(),
20743
+ storageBucket: z39.string().min(1),
20744
+ storagePath: z39.string().min(1)
20745
+ }),
20746
+ z39.object({
20747
+ tag: z39.literal("external-src"),
20748
+ assetId: z39.string().optional(),
20749
+ src: z39.string().url()
20750
+ })
20751
+ ]);
20377
20752
  var mediaBaseSchema = z39.object({
20378
20753
  purpose: z39.string().optional(),
20379
20754
  placeholder: z39.boolean().default(true).optional(),
@@ -20387,6 +20762,7 @@ var mediaBaseSchema = z39.object({
20387
20762
  height: z39.number().optional(),
20388
20763
  storageBucket: z39.string().optional(),
20389
20764
  storagePath: z39.string().optional(),
20765
+ poster: mediaPosterSchema.optional(),
20390
20766
  transform: transformSchema2.optional()
20391
20767
  });
20392
20768
  var imageMediaSchema = mediaBaseSchema.extend({ type: z39.literal("image") });
@@ -20870,10 +21246,28 @@ import { z as z45 } from "zod";
20870
21246
 
20871
21247
  // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
20872
21248
  import { z as z44 } from "zod";
21249
+
21250
+ // ../blocks/src/system/constants/events.ts
21251
+ var eventCalendarDisplayModeValues = ["combined", "month", "week", "list", "timetable"];
21252
+ var eventCalendarListLayoutValues = ["stack", "grid", "compact"];
21253
+ var eventCalendarListLayoutOptions = [
21254
+ { id: "stack", label: "Stack" },
21255
+ { id: "grid", label: "Grid" },
21256
+ { id: "compact", label: "Compact" }
21257
+ ];
21258
+ function isEventCalendarDisplayMode(value) {
21259
+ return typeof value === "string" && eventCalendarDisplayModeValues.includes(value);
21260
+ }
21261
+ function isEventCalendarListLayout(value) {
21262
+ return typeof value === "string" && eventCalendarListLayoutValues.includes(value);
21263
+ }
21264
+
21265
+ // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
20873
21266
  var previewStageSchema = z44.enum(["preview", "published"]);
20874
21267
  var registrationButtonVariantSchema = z44.enum(["primary", "secondary", "outline"]);
20875
21268
  var eventButtonVariantSchema = z44.enum(["primary", "secondary", "outline", "link"]);
20876
- var eventLayoutSchema = z44.enum(["grid", "stack", "compact"]);
21269
+ var eventLayoutSchema = z44.enum(eventCalendarListLayoutValues);
21270
+ var eventCalendarDisplayModeSchema = z44.enum(eventCalendarDisplayModeValues);
20877
21271
  var columnOptionSchema = z44.enum(["2", "3", "4"]);
20878
21272
  var weekStartSchema = z44.enum(["sunday", "monday"]);
20879
21273
  var filterAutoShowSchema = z44.enum(["auto", "always", "never"]);
@@ -22255,7 +22649,232 @@ var eventListingInteractiveIslandPropsCodec = createInteractiveIslandCodec({
22255
22649
  });
22256
22650
 
22257
22651
  // ../blocks/src/system/blocks/events/event-listing.ts
22258
- var eventListingManifest = createBlockManifest({
22652
+ var eventListingAdditionalFields = [
22653
+ ...sectionHeaderFields("All Events"),
22654
+ ...(() => {
22655
+ const columns = columnsField(["2", "3", "4"]);
22656
+ return [
22657
+ {
22658
+ ...layoutField,
22659
+ ui: { ...layoutField.ui ?? {}, intent: "display" }
22660
+ },
22661
+ {
22662
+ ...columns,
22663
+ ui: { ...columns.ui ?? {}, intent: "display" }
22664
+ }
22665
+ ];
22666
+ })(),
22667
+ {
22668
+ id: "eventsPerPage",
22669
+ type: "select",
22670
+ label: "Events per page",
22671
+ description: "Number of events to load at a time",
22672
+ required: false,
22673
+ multiple: false,
22674
+ defaultValue: "12",
22675
+ options: [
22676
+ { value: "3", label: "3 events" },
22677
+ { value: "6", label: "6 events" },
22678
+ { value: "12", label: "12 events" },
22679
+ { value: "24", label: "24 events" }
22680
+ ],
22681
+ ui: { intent: "display" }
22682
+ },
22683
+ {
22684
+ id: "paginationMode",
22685
+ type: "select",
22686
+ label: "More events",
22687
+ description: "How to access events beyond the initial list",
22688
+ required: false,
22689
+ multiple: false,
22690
+ defaultValue: "loadMore",
22691
+ options: [
22692
+ { value: "loadMore", label: "Load more button" },
22693
+ { value: "seeAllLink", label: "Link to another page" }
22694
+ ],
22695
+ ui: { intent: "display" }
22696
+ },
22697
+ {
22698
+ id: "seeAllUrl",
22699
+ type: "link",
22700
+ label: "See all destination",
22701
+ required: false,
22702
+ ui: {
22703
+ intent: "display",
22704
+ visibleWhen: {
22705
+ field: "paginationMode",
22706
+ equals: "seeAllLink"
22707
+ }
22708
+ }
22709
+ },
22710
+ {
22711
+ id: "loadMoreText",
22712
+ type: "text",
22713
+ label: "Button text",
22714
+ description: "Text for the pagination button or link",
22715
+ required: false,
22716
+ multiline: false,
22717
+ defaultValue: "Load more events",
22718
+ maxLength: 40
22719
+ },
22720
+ ...cardStylingFields.map((field) => ({
22721
+ ...field,
22722
+ ui: { ...field.ui ?? {}, intent: "style" }
22723
+ })),
22724
+ ...eventDisplayFields.map((field) => ({
22725
+ ...field,
22726
+ ui: { ...field.ui ?? {}, intent: "display" }
22727
+ })),
22728
+ {
22729
+ id: "kind",
22730
+ type: "select",
22731
+ label: "Show",
22732
+ description: "Choose whether this list shows courses, events, or both",
22733
+ required: false,
22734
+ multiple: false,
22735
+ defaultValue: "all",
22736
+ options: [
22737
+ { value: "all", label: "Courses and events" },
22738
+ { value: "courses", label: "Courses only" },
22739
+ { value: "events", label: "Events only" }
22740
+ ],
22741
+ ui: { intent: "behavior" }
22742
+ },
22743
+ {
22744
+ id: "eventSurface",
22745
+ type: "select",
22746
+ label: "Event surface",
22747
+ description: "Choose a semantic event scope",
22748
+ required: false,
22749
+ multiple: false,
22750
+ defaultValue: "all",
22751
+ options: [
22752
+ { value: "all", label: "All events" },
22753
+ { value: "regularClassSchedule", label: "Regular class schedule" },
22754
+ { value: "specialDatedEvents", label: "Workshops and special events" },
22755
+ { value: "custom", label: "Custom" }
22756
+ ],
22757
+ ui: { intent: "behavior" }
22758
+ },
22759
+ {
22760
+ id: "filterEventPresets",
22761
+ type: "select",
22762
+ label: "Pre-filter by event type",
22763
+ description: "Restrict this block to specific event types",
22764
+ required: false,
22765
+ multiple: true,
22766
+ defaultValue: [],
22767
+ options: [
22768
+ { value: "class", label: "Classes" },
22769
+ { value: "workshop", label: "Workshops" },
22770
+ { value: "retreat", label: "Retreats" },
22771
+ { value: "performance", label: "Performances" }
22772
+ ],
22773
+ ui: {
22774
+ intent: "behavior",
22775
+ visibleWhen: { field: "eventSurface", equals: "custom" }
22776
+ }
22777
+ },
22778
+ {
22779
+ id: "scheduleScope",
22780
+ type: "select",
22781
+ label: "Schedule cadence",
22782
+ description: "Restrict this block by recurrence",
22783
+ required: false,
22784
+ multiple: false,
22785
+ defaultValue: "any",
22786
+ options: [
22787
+ { value: "any", label: "Any cadence" },
22788
+ { value: "recurring", label: "Recurring only" },
22789
+ { value: "oneOff", label: "One-off only" }
22790
+ ],
22791
+ ui: {
22792
+ intent: "behavior",
22793
+ visibleWhen: { field: "eventSurface", equals: "custom" }
22794
+ }
22795
+ },
22796
+ {
22797
+ ...emptyStateField,
22798
+ ui: { ...emptyStateField.ui ?? {}, intent: "display" }
22799
+ },
22800
+ sectionStylesField({
22801
+ id: "_sectionStyles",
22802
+ label: "Section styles",
22803
+ renderInHeader: false
22804
+ })
22805
+ ];
22806
+ var eventListingLayout = [
22807
+ styledSection({
22808
+ children: sectionContainer([
22809
+ // Optional heading
22810
+ text(
22811
+ { as: "h2" },
22812
+ bind("content.heading"),
22813
+ when("content.heading")
22814
+ ),
22815
+ // Optional description
22816
+ richText(
22817
+ { className: "rb-prose rb-max-w-none" },
22818
+ bind("content.description"),
22819
+ when("content.description")
22820
+ ),
22821
+ // Event listing component with pagination
22822
+ el("event-listing", withApiBindings({
22823
+ events: { $bind: { from: "data.events" } },
22824
+ stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
22825
+ layout: { $bind: { from: "content.layout", fallback: "grid" } },
22826
+ columns: { $bind: { from: "content.columns", fallback: "3" } },
22827
+ eventsPerPage: { $bind: { from: "content.eventsPerPage", fallback: "12" } },
22828
+ paginationMode: { $bind: { from: "content.paginationMode", fallback: "loadMore" } },
22829
+ seeAllUrl: { $bind: { from: "content.seeAllUrl", transforms: [{ id: "links.resolve" }] } },
22830
+ loadMoreText: { $bind: { from: "content.loadMoreText", fallback: "Load more events" } },
22831
+ cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
22832
+ buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
22833
+ buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
22834
+ showVenue: { $bind: { from: "content.showVenue" } },
22835
+ showMap: { $bind: { from: "content.showMap" } },
22836
+ showCapacity: { $bind: { from: "content.showCapacity" } },
22837
+ eventKind: { $bind: { from: "content.kind", fallback: "all" } },
22838
+ eventSurface: { $bind: { from: "content.eventSurface", fallback: "all" } },
22839
+ filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
22840
+ scheduleScope: { $bind: { from: "content.scheduleScope", fallback: "any" } },
22841
+ emptyMessage: { $bind: { from: "content.emptyMessage" } }
22842
+ }))
22843
+ ], {
22844
+ gap: "lg"
22845
+ }),
22846
+ // sectionContainer (rb-container) already provides horizontal padding
22847
+ baseClass: "",
22848
+ spacing: "comfortable"
22849
+ })
22850
+ ];
22851
+ var eventListingDerivedFields = [
22852
+ {
22853
+ id: "layout",
22854
+ type: "select",
22855
+ required: false,
22856
+ multiple: false,
22857
+ options: [
22858
+ { value: "grid" },
22859
+ { value: "stack" }
22860
+ ]
22861
+ },
22862
+ {
22863
+ id: "paginationMode",
22864
+ type: "select",
22865
+ required: false,
22866
+ multiple: false,
22867
+ options: [
22868
+ { value: "loadMore" },
22869
+ { value: "seeAllLink" }
22870
+ ]
22871
+ }
22872
+ ];
22873
+ var eventListingContentShape = {
22874
+ additionalFields: eventListingDerivedFields,
22875
+ skipSectionStyles: true
22876
+ };
22877
+ var eventListingConfig = {
22259
22878
  id: "block.event-listing",
22260
22879
  version: "1.1.0",
22261
22880
  title: "Event Listing",
@@ -22263,211 +22882,18 @@ var eventListingManifest = createBlockManifest({
22263
22882
  description: "Paginated list of all upcoming events",
22264
22883
  // Preserve legacy section styles field configuration (renderInHeader: false).
22265
22884
  skipSectionStyles: true,
22266
- additionalFields: [
22267
- ...sectionHeaderFields("All Events"),
22268
- ...(() => {
22269
- const columns = columnsField(["2", "3", "4"]);
22270
- return [
22271
- {
22272
- ...layoutField,
22273
- ui: { ...layoutField.ui ?? {}, intent: "display" }
22274
- },
22275
- {
22276
- ...columns,
22277
- ui: { ...columns.ui ?? {}, intent: "display" }
22278
- }
22279
- ];
22280
- })(),
22281
- {
22282
- id: "eventsPerPage",
22283
- type: "select",
22284
- label: "Events per page",
22285
- description: "Number of events to load at a time",
22286
- required: false,
22287
- multiple: false,
22288
- defaultValue: "12",
22289
- options: [
22290
- { value: "3", label: "3 events" },
22291
- { value: "6", label: "6 events" },
22292
- { value: "12", label: "12 events" },
22293
- { value: "24", label: "24 events" }
22294
- ],
22295
- ui: { intent: "display" }
22296
- },
22297
- {
22298
- id: "paginationMode",
22299
- type: "select",
22300
- label: "More events",
22301
- description: "How to access events beyond the initial list",
22302
- required: false,
22303
- multiple: false,
22304
- defaultValue: "loadMore",
22305
- options: [
22306
- { value: "loadMore", label: "Load more button" },
22307
- { value: "seeAllLink", label: "Link to another page" }
22308
- ],
22309
- ui: { intent: "display" }
22310
- },
22311
- {
22312
- id: "seeAllUrl",
22313
- type: "link",
22314
- label: "See all destination",
22315
- required: false,
22316
- ui: {
22317
- intent: "display",
22318
- visibleWhen: {
22319
- field: "paginationMode",
22320
- equals: "seeAllLink"
22321
- }
22322
- }
22323
- },
22324
- {
22325
- id: "loadMoreText",
22326
- type: "text",
22327
- label: "Button text",
22328
- description: "Text for the pagination button or link",
22329
- required: false,
22330
- multiline: false,
22331
- defaultValue: "Load more events",
22332
- maxLength: 40
22333
- },
22334
- ...cardStylingFields.map((field) => ({
22335
- ...field,
22336
- ui: { ...field.ui ?? {}, intent: "style" }
22337
- })),
22338
- ...eventDisplayFields.map((field) => ({
22339
- ...field,
22340
- ui: { ...field.ui ?? {}, intent: "display" }
22341
- })),
22342
- {
22343
- id: "kind",
22344
- type: "select",
22345
- label: "Show",
22346
- description: "Choose whether this list shows courses, events, or both",
22347
- required: false,
22348
- multiple: false,
22349
- defaultValue: "all",
22350
- options: [
22351
- { value: "all", label: "Courses and events" },
22352
- { value: "courses", label: "Courses only" },
22353
- { value: "events", label: "Events only" }
22354
- ],
22355
- ui: { intent: "behavior" }
22356
- },
22357
- {
22358
- id: "eventSurface",
22359
- type: "select",
22360
- label: "Event surface",
22361
- description: "Choose a semantic event scope",
22362
- required: false,
22363
- multiple: false,
22364
- defaultValue: "all",
22365
- options: [
22366
- { value: "all", label: "All events" },
22367
- { value: "regularClassSchedule", label: "Regular class schedule" },
22368
- { value: "specialDatedEvents", label: "Workshops and special events" },
22369
- { value: "custom", label: "Custom" }
22370
- ],
22371
- ui: { intent: "behavior" }
22372
- },
22373
- {
22374
- id: "filterEventPresets",
22375
- type: "select",
22376
- label: "Pre-filter by event type",
22377
- description: "Restrict this block to specific event types",
22378
- required: false,
22379
- multiple: true,
22380
- defaultValue: [],
22381
- options: [
22382
- { value: "class", label: "Classes" },
22383
- { value: "workshop", label: "Workshops" },
22384
- { value: "retreat", label: "Retreats" },
22385
- { value: "performance", label: "Performances" }
22386
- ],
22387
- ui: {
22388
- intent: "behavior",
22389
- visibleWhen: { field: "eventSurface", equals: "custom" }
22390
- }
22391
- },
22392
- {
22393
- id: "scheduleScope",
22394
- type: "select",
22395
- label: "Schedule cadence",
22396
- description: "Restrict this block by recurrence",
22397
- required: false,
22398
- multiple: false,
22399
- defaultValue: "any",
22400
- options: [
22401
- { value: "any", label: "Any cadence" },
22402
- { value: "recurring", label: "Recurring only" },
22403
- { value: "oneOff", label: "One-off only" }
22404
- ],
22405
- ui: {
22406
- intent: "behavior",
22407
- visibleWhen: { field: "eventSurface", equals: "custom" }
22408
- }
22409
- },
22410
- {
22411
- ...emptyStateField,
22412
- ui: { ...emptyStateField.ui ?? {}, intent: "display" }
22413
- },
22414
- sectionStylesField({
22415
- id: "_sectionStyles",
22416
- label: "Section styles",
22417
- renderInHeader: false
22418
- })
22419
- ],
22885
+ additionalFields: eventListingAdditionalFields,
22420
22886
  styleTokens: { background: "surface", typography: "body", spacing: "md" },
22421
22887
  behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: true },
22422
22888
  category: "interactive",
22423
22889
  tags: ["events", "listing", "paginated", "archive", "all-events"],
22424
22890
  icon: "List",
22425
- layout: [
22426
- styledSection({
22427
- children: sectionContainer([
22428
- // Optional heading
22429
- text(
22430
- { as: "h2" },
22431
- bind("content.heading"),
22432
- when("content.heading")
22433
- ),
22434
- // Optional description
22435
- richText(
22436
- { className: "rb-prose rb-max-w-none" },
22437
- bind("content.description"),
22438
- when("content.description")
22439
- ),
22440
- // Event listing component with pagination
22441
- el("event-listing", withApiBindings({
22442
- events: { $bind: { from: "data.events" } },
22443
- stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
22444
- layout: { $bind: { from: "content.layout", fallback: "grid" } },
22445
- columns: { $bind: { from: "content.columns", fallback: "3" } },
22446
- eventsPerPage: { $bind: { from: "content.eventsPerPage", fallback: "12" } },
22447
- paginationMode: { $bind: { from: "content.paginationMode", fallback: "loadMore" } },
22448
- seeAllUrl: { $bind: { from: "content.seeAllUrl", transforms: [{ id: "links.resolve" }] } },
22449
- loadMoreText: { $bind: { from: "content.loadMoreText", fallback: "Load more events" } },
22450
- cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
22451
- buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
22452
- buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
22453
- showVenue: { $bind: { from: "content.showVenue" } },
22454
- showMap: { $bind: { from: "content.showMap" } },
22455
- showCapacity: { $bind: { from: "content.showCapacity" } },
22456
- eventKind: { $bind: { from: "content.kind", fallback: "all" } },
22457
- eventSurface: { $bind: { from: "content.eventSurface", fallback: "all" } },
22458
- filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
22459
- scheduleScope: { $bind: { from: "content.scheduleScope", fallback: "any" } },
22460
- emptyMessage: { $bind: { from: "content.emptyMessage" } }
22461
- }))
22462
- ], {
22463
- gap: "lg"
22464
- }),
22465
- // sectionContainer (rb-container) already provides horizontal padding
22466
- baseClass: "",
22467
- spacing: "comfortable"
22468
- })
22469
- ]
22470
- });
22891
+ layout: eventListingLayout
22892
+ };
22893
+ var eventListingManifest = createBlockManifestWithContentShape(
22894
+ eventListingConfig,
22895
+ eventListingContentShape
22896
+ );
22471
22897
  var eventListingBlockDefinition = {
22472
22898
  manifest: eventListingManifest,
22473
22899
  runtime: eventListingBlockRuntime,
@@ -22494,7 +22920,6 @@ var eventListingBlockDefinition = {
22494
22920
 
22495
22921
  // ../blocks/src/system/runtime/nodes/events/EventCalendar.interactive.ts
22496
22922
  import { z as z51 } from "zod";
22497
- var displayModeSchema = z51.enum(["combined", "month", "week", "list", "timetable"]);
22498
22923
  var eventBlockKindSchema2 = z51.enum(eventBlockKindValues);
22499
22924
  var eventSurfaceScopeSchema2 = z51.enum(eventSurfaceScopeValues);
22500
22925
  var eventScheduleScopeSchema3 = z51.enum(eventScheduleScopeValues);
@@ -22504,7 +22929,8 @@ var eventCalendarSourceSchema = z51.object(
22504
22929
  siteId: z51.string(),
22505
22930
  apiBaseUrl: z51.string().optional(),
22506
22931
  stage: previewStageSchema.optional(),
22507
- displayMode: displayModeSchema.nullable().optional(),
22932
+ variant: eventCalendarDisplayModeSchema.nullable().optional(),
22933
+ displayMode: eventCalendarDisplayModeSchema.nullable().optional(),
22508
22934
  listLayout: eventLayoutSchema.optional(),
22509
22935
  listColumns: columnOptionSchema.optional(),
22510
22936
  layout: eventLayoutSchema.optional(),
@@ -22536,7 +22962,7 @@ var eventCalendarSourceSchema = z51.object(
22536
22962
  );
22537
22963
  var eventCalendarDisplaySchema = z51.object({
22538
22964
  kind: z51.literal("event-calendar"),
22539
- displayMode: displayModeSchema,
22965
+ displayMode: eventCalendarDisplayModeSchema,
22540
22966
  className: z51.string().nullable(),
22541
22967
  events: z51.array(publicEventSchema),
22542
22968
  listLayout: eventLayoutSchema,
@@ -22591,7 +23017,7 @@ var eventCalendarIslandMetaKeys = defineInteractiveIslandMetaKeys(
22591
23017
  function buildEventCalendarDisplay(source) {
22592
23018
  return {
22593
23019
  kind: "event-calendar",
22594
- displayMode: source.displayMode ?? "combined",
23020
+ displayMode: source.variant ?? source.displayMode ?? "combined",
22595
23021
  className: source.className ?? null,
22596
23022
  events: (source.events ?? []).slice().sort(
22597
23023
  (left, right) => new Date(left.startsAt).getTime() - new Date(right.startsAt).getTime()
@@ -22658,8 +23084,12 @@ var eventCalendarInteractiveIslandPropsCodec = createInteractiveIslandCodec({
22658
23084
  function normalizeEventCalendarContent(content) {
22659
23085
  const record = typeof content === "object" && content !== null ? content : {};
22660
23086
  const kind = normalizeEventBlockKind(record.kind);
23087
+ const variant = normalizeEventCalendarDisplayMode(record.variant) ?? normalizeEventCalendarDisplayMode(record.displayMode);
22661
23088
  return {
22662
23089
  ...record,
23090
+ ...variant ? { variant } : {},
23091
+ displayMode: normalizeEventCalendarDisplayMode(record.displayMode),
23092
+ listLayout: normalizeEventCalendarListLayout(record.listLayout),
22663
23093
  kind,
22664
23094
  eventSurface: normalizeEventSurfaceScope(record.eventSurface),
22665
23095
  filterEventPresets: normalizeEventSurfacePresets(record.filterEventPresets),
@@ -22671,355 +23101,515 @@ function normalizeEventCalendarContent(content) {
22671
23101
  filterVenueId: normalizeEventVenueId(record.filterVenueId)
22672
23102
  };
22673
23103
  }
22674
- var eventCalendarManifest = createBlockManifest({
22675
- id: "block.event-calendar",
22676
- version: "3.6.0",
22677
- title: "Event Calendar",
22678
- titleSource: "heading",
22679
- description: "Display events with calendar, list, or combined views with filtering",
22680
- // Preserve legacy section styles field configuration (renderInHeader: false).
22681
- skipSectionStyles: true,
22682
- additionalFields: [
22683
- ...sectionHeaderFields("Event Calendar"),
22684
- // Display Mode (replaces calendarView)
22685
- {
22686
- id: "displayMode",
22687
- type: "select",
22688
- label: "Display mode",
22689
- description: "How events are displayed",
22690
- required: false,
22691
- multiple: false,
22692
- defaultValue: "combined",
22693
- options: [
22694
- { value: "combined", label: "Combined (List + Calendar tabs)" },
22695
- { value: "month", label: "Month calendar" },
22696
- { value: "week", label: "Week agenda" },
22697
- { value: "timetable", label: "Timetable" },
22698
- { value: "list", label: "List" }
22699
- ],
22700
- ui: { intent: "display" }
22701
- },
22702
- // List options (visible when displayMode is list or combined)
22703
- {
22704
- id: "listLayout",
22705
- type: "select",
22706
- label: "List layout",
22707
- description: "Layout style for list view",
22708
- required: false,
22709
- multiple: false,
22710
- defaultValue: "stack",
22711
- options: [
22712
- { value: "stack", label: "Stack (full-width cards)" },
22713
- { value: "grid", label: "Grid" },
22714
- { value: "compact", label: "Compact (dense rows)" }
22715
- ],
22716
- ui: {
22717
- intent: "display",
22718
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list"] }
22719
- }
22720
- },
22721
- {
22722
- id: "listColumns",
22723
- type: "select",
22724
- label: "Grid columns",
22725
- description: "Number of columns in grid layout",
22726
- required: false,
22727
- multiple: false,
22728
- defaultValue: "3",
22729
- options: [
22730
- { value: "2", label: "2 columns" },
22731
- { value: "3", label: "3 columns" },
22732
- { value: "4", label: "4 columns" }
22733
- ],
22734
- ui: {
22735
- intent: "display",
22736
- visibleWhen: { field: "listLayout", equals: "grid" }
22737
- }
22738
- },
22739
- {
22740
- id: "eventsPerPage",
22741
- type: "select",
22742
- label: "Events per page (cards)",
22743
- description: "Number of events to load initially in card layouts",
22744
- required: false,
22745
- multiple: false,
22746
- defaultValue: "12",
22747
- options: [
22748
- { value: "6", label: "6" },
22749
- { value: "12", label: "12" },
22750
- { value: "24", label: "24" }
22751
- ],
22752
- ui: {
22753
- intent: "display",
22754
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list"] }
22755
- }
22756
- },
22757
- {
22758
- id: "compactEventsPerPage",
22759
- type: "select",
22760
- label: "Events per page (compact)",
22761
- description: "Number of events to show per page in compact layout",
22762
- required: false,
22763
- multiple: false,
22764
- defaultValue: "10",
22765
- options: [
22766
- { value: "10", label: "10" },
22767
- { value: "20", label: "20" },
22768
- { value: "30", label: "30" }
22769
- ],
22770
- ui: {
22771
- intent: "display",
22772
- visibleWhen: { field: "listLayout", equals: "compact" }
22773
- }
22774
- },
22775
- {
22776
- id: "loadMoreText",
22777
- type: "text",
22778
- label: "Load more button text",
22779
- description: "Text for the load more button",
22780
- required: false,
22781
- multiline: false,
22782
- defaultValue: "Load more events",
22783
- ui: {
22784
- intent: "content",
22785
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list"] }
22786
- }
22787
- },
22788
- // Calendar options
22789
- {
22790
- id: "startOfWeek",
22791
- type: "select",
22792
- label: "Week starts on",
22793
- description: "First day of the week",
22794
- required: false,
22795
- multiple: false,
22796
- defaultValue: "monday",
22797
- options: [
22798
- { value: "sunday", label: "Sunday" },
22799
- { value: "monday", label: "Monday" }
22800
- ],
22801
- ui: {
22802
- intent: "display",
22803
- visibleWhen: {
22804
- field: "displayMode",
22805
- oneOf: ["combined", "month", "week"]
22806
- }
22807
- }
22808
- },
22809
- // Combined mode options
22810
- {
22811
- id: "calendarTabViews",
22812
- type: "select",
22813
- label: "Calendar tab views",
22814
- description: "Which calendar views to show in the Calendar tab",
22815
- required: false,
22816
- multiple: false,
22817
- defaultValue: "both",
22818
- options: [
22819
- { value: "both", label: "Month + Week toggle" },
22820
- { value: "month", label: "Month only" },
22821
- { value: "week", label: "Week only" }
22822
- ],
22823
- ui: {
22824
- intent: "display",
22825
- visibleWhen: { field: "displayMode", equals: "combined" }
22826
- }
22827
- },
22828
- // Filtering options
22829
- {
22830
- id: "kind",
22831
- type: "select",
22832
- label: "Show",
22833
- description: "Restrict this block to all offerings, courses, or events",
22834
- required: false,
22835
- multiple: false,
22836
- defaultValue: "all",
22837
- options: [
22838
- { value: "all", label: "All offerings" },
22839
- { value: "courses", label: "Courses only" },
22840
- { value: "events", label: "Events only" }
22841
- ],
22842
- ui: { intent: "behavior" }
22843
- },
22844
- {
22845
- id: "showFilters",
22846
- type: "boolean",
22847
- label: "Show filters",
22848
- description: "Show category, staff, and venue filters",
22849
- required: false,
22850
- defaultValue: true,
22851
- ui: {
22852
- intent: "display",
22853
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
22854
- }
22855
- },
22856
- {
22857
- id: "showCategoryFilter",
22858
- type: "select",
22859
- label: "Show category filter",
22860
- description: "When to show the category filter dropdown",
22861
- required: false,
22862
- multiple: false,
22863
- defaultValue: "auto",
22864
- options: [
22865
- { value: "auto", label: "Auto (when >1 category has events)" },
22866
- { value: "always", label: "Always" },
22867
- { value: "never", label: "Never" }
23104
+ function normalizeEventCalendarDisplayMode(value) {
23105
+ return isEventCalendarDisplayMode(value) ? value : void 0;
23106
+ }
23107
+ function normalizeEventCalendarListLayout(value) {
23108
+ return isEventCalendarListLayout(value) ? value : void 0;
23109
+ }
23110
+ var eventCalendarLayout = [
23111
+ styledSection({
23112
+ children: sectionContainer(
23113
+ [
23114
+ // Optional heading
23115
+ text({ as: "h2" }, bind("content.heading"), when("content.heading")),
23116
+ // Optional description
23117
+ richText(
23118
+ { className: "rb-prose rb-max-w-none" },
23119
+ bind("content.description"),
23120
+ when("content.description")
23121
+ ),
23122
+ // Event calendar component (handles all display modes)
23123
+ el(
23124
+ "event-calendar",
23125
+ withApiBindings({
23126
+ events: { $bind: { from: "data.events" } },
23127
+ stage: {
23128
+ $bind: { from: "$root.previewStage", fallback: "published" }
23129
+ },
23130
+ // Variant is the new Theme V2-facing display mode. displayMode is
23131
+ // retained as a legacy fallback for existing content.
23132
+ variant: {
23133
+ $bind: { from: "content.variant" }
23134
+ },
23135
+ displayMode: {
23136
+ $bind: { from: "content.displayMode" }
23137
+ },
23138
+ // List options
23139
+ listLayout: { $bind: { from: "content.listLayout" } },
23140
+ listColumns: { $bind: { from: "content.listColumns" } },
23141
+ // Legacy compatibility: older event-calendar content used layout/columns
23142
+ layout: { $bind: { from: "content.layout" } },
23143
+ columns: { $bind: { from: "content.columns" } },
23144
+ eventsPerPage: {
23145
+ $bind: { from: "content.eventsPerPage", fallback: "12" }
23146
+ },
23147
+ compactEventsPerPage: {
23148
+ $bind: { from: "content.compactEventsPerPage", fallback: "10" }
23149
+ },
23150
+ loadMoreText: {
23151
+ $bind: {
23152
+ from: "content.loadMoreText",
23153
+ fallback: "Load more events"
23154
+ }
23155
+ },
23156
+ // Calendar options
23157
+ startOfWeek: {
23158
+ $bind: { from: "content.startOfWeek", fallback: "monday" }
23159
+ },
23160
+ calendarTabViews: {
23161
+ $bind: { from: "content.calendarTabViews", fallback: "both" }
23162
+ },
23163
+ // Filtering options
23164
+ showFilters: {
23165
+ $bind: { from: "content.showFilters", fallback: true }
23166
+ },
23167
+ showCategoryFilter: {
23168
+ $bind: { from: "content.showCategoryFilter", fallback: "auto" }
23169
+ },
23170
+ showVenueFilter: {
23171
+ $bind: { from: "content.showVenueFilter", fallback: false }
23172
+ },
23173
+ showStaffFilter: {
23174
+ $bind: { from: "content.showStaffFilter", fallback: true }
23175
+ },
23176
+ showCapacity: {
23177
+ $bind: { from: "content.showCapacity", fallback: true }
23178
+ },
23179
+ kind: { $bind: { from: "content.kind", fallback: "all" } },
23180
+ eventSurface: {
23181
+ $bind: { from: "content.eventSurface", fallback: "all" }
23182
+ },
23183
+ filterEventPresets: {
23184
+ $bind: { from: "content.filterEventPresets" }
23185
+ },
23186
+ scheduleScope: {
23187
+ $bind: { from: "content.scheduleScope", fallback: "any" }
23188
+ },
23189
+ filterCategoryIds: {
23190
+ $bind: { from: "content.filterCategoryIds" }
23191
+ },
23192
+ filterStaffMemberId: {
23193
+ $bind: { from: "content.filterStaffMemberId" }
23194
+ },
23195
+ filterVenueId: { $bind: { from: "content.filterVenueId" } },
23196
+ // Styling
23197
+ buttonVariant: {
23198
+ $bind: { from: "content.buttonVariant", fallback: "primary" }
23199
+ },
23200
+ buttonText: {
23201
+ $bind: { from: "content.buttonText", fallback: "View event" }
23202
+ },
23203
+ emptyMessage: { $bind: { from: "content.emptyMessage" } }
23204
+ })
23205
+ )
22868
23206
  ],
22869
- ui: {
22870
- intent: "display",
22871
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
22872
- }
22873
- },
22874
- {
22875
- id: "showVenueFilter",
22876
- type: "boolean",
22877
- label: "Show venue filter",
22878
- description: "Show venue filter dropdown",
22879
- required: false,
22880
- defaultValue: false,
22881
- ui: {
22882
- intent: "display",
22883
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
22884
- }
22885
- },
22886
- {
22887
- id: "showStaffFilter",
22888
- type: "boolean",
22889
- label: "Show staff filter",
22890
- description: "Show staff filter dropdown",
22891
- required: false,
22892
- defaultValue: true,
22893
- ui: {
22894
- intent: "display",
22895
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
22896
- }
22897
- },
22898
- {
22899
- id: "showCapacity",
22900
- type: "boolean",
22901
- label: "Show available spots",
22902
- description: "Display remaining capacity on event cards and timetable cells",
22903
- required: false,
22904
- defaultValue: true,
22905
- ui: {
22906
- intent: "display",
22907
- visibleWhen: {
22908
- field: "displayMode",
22909
- oneOf: ["combined", "list", "week", "timetable"]
22910
- }
23207
+ {
23208
+ gap: "lg"
22911
23209
  }
22912
- },
22913
- // Block-level pre-filtering
22914
- {
22915
- id: "eventSurface",
22916
- type: "select",
22917
- label: "Event surface",
22918
- description: "Choose a semantic event scope",
22919
- required: false,
22920
- multiple: false,
22921
- defaultValue: "all",
22922
- options: [
22923
- { value: "all", label: "All events" },
22924
- { value: "regularClassSchedule", label: "Regular class schedule" },
22925
- { value: "specialDatedEvents", label: "Workshops and special events" },
22926
- { value: "custom", label: "Custom" }
22927
- ],
22928
- ui: { intent: "behavior" }
22929
- },
22930
- {
22931
- id: "filterEventPresets",
22932
- type: "select",
22933
- label: "Pre-filter by event type",
22934
- description: "Restrict this block to specific event types",
22935
- required: false,
22936
- multiple: true,
22937
- defaultValue: [],
22938
- options: [
22939
- { value: "class", label: "Classes" },
22940
- { value: "workshop", label: "Workshops" },
22941
- { value: "retreat", label: "Retreats" },
22942
- { value: "performance", label: "Performances" }
22943
- ],
22944
- ui: {
22945
- intent: "behavior",
22946
- visibleWhen: { field: "eventSurface", equals: "custom" }
23210
+ ),
23211
+ // sectionContainer (rb-container) already provides horizontal padding
23212
+ baseClass: "",
23213
+ spacing: "comfortable"
23214
+ })
23215
+ ];
23216
+ var eventCalendarAdditionalFields = [
23217
+ ...sectionHeaderFields("Event Calendar"),
23218
+ // Display Mode (replaces calendarView)
23219
+ {
23220
+ id: "displayMode",
23221
+ type: "select",
23222
+ label: "Display mode",
23223
+ description: "How events are displayed",
23224
+ required: false,
23225
+ multiple: false,
23226
+ defaultValue: "combined",
23227
+ options: [
23228
+ { value: "combined", label: "Combined (List + Calendar tabs)" },
23229
+ { value: "month", label: "Month calendar" },
23230
+ { value: "week", label: "Week agenda" },
23231
+ { value: "timetable", label: "Timetable" },
23232
+ { value: "list", label: "List" }
23233
+ ],
23234
+ ui: { intent: "display", hidden: true }
23235
+ },
23236
+ // List options (visible when displayMode is list or combined)
23237
+ {
23238
+ id: "listLayout",
23239
+ type: "select",
23240
+ label: "List layout",
23241
+ description: "Layout style for list view",
23242
+ required: false,
23243
+ multiple: false,
23244
+ defaultValue: "stack",
23245
+ options: eventCalendarListLayoutOptions.map((option) => ({
23246
+ value: option.id,
23247
+ label: option.label
23248
+ })),
23249
+ ui: {
23250
+ intent: "display",
23251
+ visibleWhen: { field: "variant", oneOf: ["combined", "list"] }
23252
+ }
23253
+ },
23254
+ {
23255
+ id: "listColumns",
23256
+ type: "select",
23257
+ label: "Grid columns",
23258
+ description: "Number of columns in grid layout",
23259
+ required: false,
23260
+ multiple: false,
23261
+ defaultValue: "3",
23262
+ options: [
23263
+ { value: "2", label: "2 columns" },
23264
+ { value: "3", label: "3 columns" },
23265
+ { value: "4", label: "4 columns" }
23266
+ ],
23267
+ ui: {
23268
+ intent: "display",
23269
+ visibleWhen: { field: "listLayout", equals: "grid" }
23270
+ }
23271
+ },
23272
+ {
23273
+ id: "eventsPerPage",
23274
+ type: "select",
23275
+ label: "Events per page (cards)",
23276
+ description: "Number of events to load initially in card layouts",
23277
+ required: false,
23278
+ multiple: false,
23279
+ defaultValue: "12",
23280
+ options: [
23281
+ { value: "6", label: "6" },
23282
+ { value: "12", label: "12" },
23283
+ { value: "24", label: "24" }
23284
+ ],
23285
+ ui: {
23286
+ intent: "display",
23287
+ visibleWhen: { field: "variant", oneOf: ["combined", "list"] }
23288
+ }
23289
+ },
23290
+ {
23291
+ id: "compactEventsPerPage",
23292
+ type: "select",
23293
+ label: "Events per page (compact)",
23294
+ description: "Number of events to show per page in compact layout",
23295
+ required: false,
23296
+ multiple: false,
23297
+ defaultValue: "10",
23298
+ options: [
23299
+ { value: "10", label: "10" },
23300
+ { value: "20", label: "20" },
23301
+ { value: "30", label: "30" }
23302
+ ],
23303
+ ui: {
23304
+ intent: "display",
23305
+ visibleWhen: { field: "listLayout", equals: "compact" }
23306
+ }
23307
+ },
23308
+ {
23309
+ id: "loadMoreText",
23310
+ type: "text",
23311
+ label: "Load more button text",
23312
+ description: "Text for the load more button",
23313
+ required: false,
23314
+ multiline: false,
23315
+ defaultValue: "Load more events",
23316
+ ui: {
23317
+ intent: "content",
23318
+ visibleWhen: { field: "variant", oneOf: ["combined", "list"] }
23319
+ }
23320
+ },
23321
+ // Calendar options
23322
+ {
23323
+ id: "startOfWeek",
23324
+ type: "select",
23325
+ label: "Week starts on",
23326
+ description: "First day of the week",
23327
+ required: false,
23328
+ multiple: false,
23329
+ defaultValue: "monday",
23330
+ options: [
23331
+ { value: "sunday", label: "Sunday" },
23332
+ { value: "monday", label: "Monday" }
23333
+ ],
23334
+ ui: {
23335
+ intent: "display",
23336
+ visibleWhen: {
23337
+ field: "variant",
23338
+ oneOf: ["combined", "month", "week"]
22947
23339
  }
22948
- },
22949
- {
22950
- id: "scheduleScope",
22951
- type: "select",
22952
- label: "Schedule cadence",
22953
- description: "Restrict this block by recurrence",
22954
- required: false,
22955
- multiple: false,
22956
- defaultValue: "any",
22957
- options: [
22958
- { value: "any", label: "Any cadence" },
22959
- { value: "recurring", label: "Recurring only" },
22960
- { value: "oneOff", label: "One-off only" }
22961
- ],
22962
- ui: {
22963
- intent: "behavior",
22964
- visibleWhen: { field: "eventSurface", equals: "custom" }
23340
+ }
23341
+ },
23342
+ // Combined mode options
23343
+ {
23344
+ id: "calendarTabViews",
23345
+ type: "select",
23346
+ label: "Calendar tab views",
23347
+ description: "Which calendar views to show in the Calendar tab",
23348
+ required: false,
23349
+ multiple: false,
23350
+ defaultValue: "both",
23351
+ options: [
23352
+ { value: "both", label: "Month + Week toggle" },
23353
+ { value: "month", label: "Month only" },
23354
+ { value: "week", label: "Week only" }
23355
+ ],
23356
+ ui: {
23357
+ intent: "display",
23358
+ visibleWhen: { field: "variant", equals: "combined" }
23359
+ }
23360
+ },
23361
+ // Filtering options
23362
+ {
23363
+ id: "kind",
23364
+ type: "select",
23365
+ label: "Show",
23366
+ description: "Restrict this block to all offerings, courses, or events",
23367
+ required: false,
23368
+ multiple: false,
23369
+ defaultValue: "all",
23370
+ options: [
23371
+ { value: "all", label: "All offerings" },
23372
+ { value: "courses", label: "Courses only" },
23373
+ { value: "events", label: "Events only" }
23374
+ ],
23375
+ ui: { intent: "behavior" }
23376
+ },
23377
+ {
23378
+ id: "showFilters",
23379
+ type: "boolean",
23380
+ label: "Show filters",
23381
+ description: "Show category, staff, and venue filters",
23382
+ required: false,
23383
+ defaultValue: true,
23384
+ ui: {
23385
+ intent: "display",
23386
+ visibleWhen: {
23387
+ field: "variant",
23388
+ oneOf: ["combined", "list", "timetable"]
22965
23389
  }
22966
- },
22967
- createSiteOptionSelectField({
22968
- id: "filterCategoryIds",
22969
- label: "Pre-filter by categories",
22970
- description: "Restrict this block to specific event categories",
22971
- required: false,
22972
- multiple: true,
22973
- defaultValue: [],
22974
- optionSource: "eventCategories",
22975
- ui: {
22976
- intent: "behavior",
22977
- searchThreshold: 8,
22978
- visibleWhen: { field: "kind", notEquals: "courses" }
23390
+ }
23391
+ },
23392
+ {
23393
+ id: "showCategoryFilter",
23394
+ type: "select",
23395
+ label: "Show category filter",
23396
+ description: "When to show the category filter dropdown",
23397
+ required: false,
23398
+ multiple: false,
23399
+ defaultValue: "auto",
23400
+ options: [
23401
+ { value: "auto", label: "Auto (when >1 category has events)" },
23402
+ { value: "always", label: "Always" },
23403
+ { value: "never", label: "Never" }
23404
+ ],
23405
+ ui: {
23406
+ intent: "display",
23407
+ visibleWhen: {
23408
+ field: "variant",
23409
+ oneOf: ["combined", "list", "timetable"]
22979
23410
  }
22980
- }),
22981
- createSiteOptionSelectField({
22982
- id: "filterStaffMemberId",
22983
- label: "Pre-filter by staff member",
22984
- description: "Restrict this block to a single staff member",
22985
- required: false,
22986
- multiple: false,
22987
- optionSource: "staffMembers",
22988
- ui: {
22989
- intent: "behavior",
22990
- searchThreshold: 8
23411
+ }
23412
+ },
23413
+ {
23414
+ id: "showVenueFilter",
23415
+ type: "boolean",
23416
+ label: "Show venue filter",
23417
+ description: "Show venue filter dropdown",
23418
+ required: false,
23419
+ defaultValue: false,
23420
+ ui: {
23421
+ intent: "display",
23422
+ visibleWhen: {
23423
+ field: "variant",
23424
+ oneOf: ["combined", "list", "timetable"]
22991
23425
  }
22992
- }),
22993
- createSiteOptionSelectField({
22994
- id: "filterVenueId",
22995
- label: "Pre-filter by venue",
22996
- description: "Restrict this block to a single venue",
22997
- required: false,
22998
- multiple: false,
22999
- optionSource: "venues",
23000
- ui: {
23001
- intent: "behavior",
23002
- searchThreshold: 8
23426
+ }
23427
+ },
23428
+ {
23429
+ id: "showStaffFilter",
23430
+ type: "boolean",
23431
+ label: "Show staff filter",
23432
+ description: "Show staff filter dropdown",
23433
+ required: false,
23434
+ defaultValue: true,
23435
+ ui: {
23436
+ intent: "display",
23437
+ visibleWhen: {
23438
+ field: "variant",
23439
+ oneOf: ["combined", "list", "timetable"]
23003
23440
  }
23004
- }),
23005
- // Card styling
23006
- ...cardStylingFields.filter((f) => f.id === "buttonVariant" || f.id === "buttonText").map((field) => ({
23007
- ...field,
23008
- ui: {
23009
- ...field.ui ?? {},
23010
- intent: field.id === "buttonVariant" ? "style" : "content"
23441
+ }
23442
+ },
23443
+ {
23444
+ id: "showCapacity",
23445
+ type: "boolean",
23446
+ label: "Show available spots",
23447
+ description: "Display remaining capacity on event cards and timetable cells",
23448
+ required: false,
23449
+ defaultValue: true,
23450
+ ui: {
23451
+ intent: "display",
23452
+ visibleWhen: {
23453
+ field: "variant",
23454
+ oneOf: ["combined", "list", "week", "timetable"]
23011
23455
  }
23012
- })),
23013
- {
23014
- ...emptyStateField,
23015
- ui: { ...emptyStateField.ui ?? {}, intent: "display" }
23016
- },
23017
- sectionStylesField({
23018
- id: "_sectionStyles",
23019
- label: "Section styles",
23020
- renderInHeader: false
23021
- })
23022
- ],
23456
+ }
23457
+ },
23458
+ // Block-level pre-filtering
23459
+ {
23460
+ id: "eventSurface",
23461
+ type: "select",
23462
+ label: "Event surface",
23463
+ description: "Choose a semantic event scope",
23464
+ required: false,
23465
+ multiple: false,
23466
+ defaultValue: "all",
23467
+ options: [
23468
+ { value: "all", label: "All events" },
23469
+ { value: "regularClassSchedule", label: "Regular class schedule" },
23470
+ { value: "specialDatedEvents", label: "Workshops and special events" },
23471
+ { value: "custom", label: "Custom" }
23472
+ ],
23473
+ ui: { intent: "behavior" }
23474
+ },
23475
+ {
23476
+ id: "filterEventPresets",
23477
+ type: "select",
23478
+ label: "Pre-filter by event type",
23479
+ description: "Restrict this block to specific event types",
23480
+ required: false,
23481
+ multiple: true,
23482
+ defaultValue: [],
23483
+ options: [
23484
+ { value: "class", label: "Classes" },
23485
+ { value: "workshop", label: "Workshops" },
23486
+ { value: "retreat", label: "Retreats" },
23487
+ { value: "performance", label: "Performances" }
23488
+ ],
23489
+ ui: {
23490
+ intent: "behavior",
23491
+ visibleWhen: { field: "eventSurface", equals: "custom" }
23492
+ }
23493
+ },
23494
+ {
23495
+ id: "scheduleScope",
23496
+ type: "select",
23497
+ label: "Schedule cadence",
23498
+ description: "Restrict this block by recurrence",
23499
+ required: false,
23500
+ multiple: false,
23501
+ defaultValue: "any",
23502
+ options: [
23503
+ { value: "any", label: "Any cadence" },
23504
+ { value: "recurring", label: "Recurring only" },
23505
+ { value: "oneOff", label: "One-off only" }
23506
+ ],
23507
+ ui: {
23508
+ intent: "behavior",
23509
+ visibleWhen: { field: "eventSurface", equals: "custom" }
23510
+ }
23511
+ },
23512
+ createSiteOptionSelectField({
23513
+ id: "filterCategoryIds",
23514
+ label: "Pre-filter by categories",
23515
+ description: "Restrict this block to specific event categories",
23516
+ required: false,
23517
+ multiple: true,
23518
+ defaultValue: [],
23519
+ optionSource: "eventCategories",
23520
+ ui: {
23521
+ intent: "behavior",
23522
+ searchThreshold: 8,
23523
+ visibleWhen: { field: "kind", notEquals: "courses" }
23524
+ }
23525
+ }),
23526
+ createSiteOptionSelectField({
23527
+ id: "filterStaffMemberId",
23528
+ label: "Pre-filter by staff member",
23529
+ description: "Restrict this block to a single staff member",
23530
+ required: false,
23531
+ multiple: false,
23532
+ optionSource: "staffMembers",
23533
+ ui: {
23534
+ intent: "behavior",
23535
+ searchThreshold: 8
23536
+ }
23537
+ }),
23538
+ createSiteOptionSelectField({
23539
+ id: "filterVenueId",
23540
+ label: "Pre-filter by venue",
23541
+ description: "Restrict this block to a single venue",
23542
+ required: false,
23543
+ multiple: false,
23544
+ optionSource: "venues",
23545
+ ui: {
23546
+ intent: "behavior",
23547
+ searchThreshold: 8
23548
+ }
23549
+ }),
23550
+ // Card styling
23551
+ ...cardStylingFields.filter((f) => f.id === "buttonVariant" || f.id === "buttonText").map((field) => ({
23552
+ ...field,
23553
+ ui: {
23554
+ ...field.ui ?? {},
23555
+ intent: field.id === "buttonVariant" ? "style" : "content"
23556
+ }
23557
+ })),
23558
+ {
23559
+ ...emptyStateField,
23560
+ ui: { ...emptyStateField.ui ?? {}, intent: "display" }
23561
+ },
23562
+ sectionStylesField({
23563
+ id: "_sectionStyles",
23564
+ label: "Section styles",
23565
+ renderInHeader: false
23566
+ })
23567
+ ];
23568
+ var eventCalendarVariants = {
23569
+ combined: eventCalendarLayout[0],
23570
+ month: eventCalendarLayout[0],
23571
+ week: eventCalendarLayout[0],
23572
+ timetable: eventCalendarLayout[0],
23573
+ list: eventCalendarLayout[0]
23574
+ };
23575
+ var eventCalendarDerivedFields = [
23576
+ {
23577
+ id: "displayMode",
23578
+ type: "select",
23579
+ required: false,
23580
+ multiple: false,
23581
+ options: [
23582
+ { value: "combined" },
23583
+ { value: "month" },
23584
+ { value: "week" },
23585
+ { value: "timetable" },
23586
+ { value: "list" }
23587
+ ]
23588
+ },
23589
+ {
23590
+ id: "listLayout",
23591
+ type: "select",
23592
+ required: false,
23593
+ multiple: false,
23594
+ options: eventCalendarListLayoutOptions.map((option) => ({
23595
+ value: option.id
23596
+ }))
23597
+ }
23598
+ ];
23599
+ var eventCalendarContentShape = {
23600
+ additionalFields: eventCalendarDerivedFields,
23601
+ variants: eventCalendarVariants,
23602
+ skipSectionStyles: true
23603
+ };
23604
+ var eventCalendarConfig = {
23605
+ id: "block.event-calendar",
23606
+ version: "3.6.0",
23607
+ title: "Event Calendar",
23608
+ titleSource: "heading",
23609
+ description: "Display events with calendar, list, or combined views with filtering",
23610
+ // Preserve legacy section styles field configuration (renderInHeader: false).
23611
+ skipSectionStyles: true,
23612
+ additionalFields: eventCalendarAdditionalFields,
23023
23613
  styleTokens: { background: "surface", typography: "body", spacing: "md" },
23024
23614
  behaviours: {
23025
23615
  supportsThemeSwitching: true,
@@ -23039,109 +23629,21 @@ var eventCalendarManifest = createBlockManifest({
23039
23629
  "filter"
23040
23630
  ],
23041
23631
  icon: "CalendarDays",
23042
- layout: [
23043
- styledSection({
23044
- children: sectionContainer(
23045
- [
23046
- // Optional heading
23047
- text({ as: "h2" }, bind("content.heading"), when("content.heading")),
23048
- // Optional description
23049
- richText(
23050
- { className: "rb-prose rb-max-w-none" },
23051
- bind("content.description"),
23052
- when("content.description")
23053
- ),
23054
- // Event calendar component (handles all display modes)
23055
- el(
23056
- "event-calendar",
23057
- withApiBindings({
23058
- events: { $bind: { from: "data.events" } },
23059
- stage: {
23060
- $bind: { from: "$root.previewStage", fallback: "published" }
23061
- },
23062
- // Display mode
23063
- displayMode: {
23064
- $bind: { from: "content.displayMode", fallback: "combined" }
23065
- },
23066
- // List options
23067
- listLayout: { $bind: { from: "content.listLayout" } },
23068
- listColumns: { $bind: { from: "content.listColumns" } },
23069
- // Legacy compatibility: older event-calendar content used layout/columns
23070
- layout: { $bind: { from: "content.layout" } },
23071
- columns: { $bind: { from: "content.columns" } },
23072
- eventsPerPage: {
23073
- $bind: { from: "content.eventsPerPage", fallback: "12" }
23074
- },
23075
- compactEventsPerPage: {
23076
- $bind: { from: "content.compactEventsPerPage", fallback: "10" }
23077
- },
23078
- loadMoreText: {
23079
- $bind: {
23080
- from: "content.loadMoreText",
23081
- fallback: "Load more events"
23082
- }
23083
- },
23084
- // Calendar options
23085
- startOfWeek: {
23086
- $bind: { from: "content.startOfWeek", fallback: "monday" }
23087
- },
23088
- calendarTabViews: {
23089
- $bind: { from: "content.calendarTabViews", fallback: "both" }
23090
- },
23091
- // Filtering options
23092
- showFilters: {
23093
- $bind: { from: "content.showFilters", fallback: true }
23094
- },
23095
- showCategoryFilter: {
23096
- $bind: { from: "content.showCategoryFilter", fallback: "auto" }
23097
- },
23098
- showVenueFilter: {
23099
- $bind: { from: "content.showVenueFilter", fallback: false }
23100
- },
23101
- showStaffFilter: {
23102
- $bind: { from: "content.showStaffFilter", fallback: true }
23103
- },
23104
- showCapacity: {
23105
- $bind: { from: "content.showCapacity", fallback: true }
23106
- },
23107
- kind: { $bind: { from: "content.kind", fallback: "all" } },
23108
- eventSurface: {
23109
- $bind: { from: "content.eventSurface", fallback: "all" }
23110
- },
23111
- filterEventPresets: {
23112
- $bind: { from: "content.filterEventPresets" }
23113
- },
23114
- scheduleScope: {
23115
- $bind: { from: "content.scheduleScope", fallback: "any" }
23116
- },
23117
- filterCategoryIds: {
23118
- $bind: { from: "content.filterCategoryIds" }
23119
- },
23120
- filterStaffMemberId: {
23121
- $bind: { from: "content.filterStaffMemberId" }
23122
- },
23123
- filterVenueId: { $bind: { from: "content.filterVenueId" } },
23124
- // Styling
23125
- buttonVariant: {
23126
- $bind: { from: "content.buttonVariant", fallback: "primary" }
23127
- },
23128
- buttonText: {
23129
- $bind: { from: "content.buttonText", fallback: "View event" }
23130
- },
23131
- emptyMessage: { $bind: { from: "content.emptyMessage" } }
23132
- })
23133
- )
23134
- ],
23135
- {
23136
- gap: "lg"
23137
- }
23138
- ),
23139
- // sectionContainer (rb-container) already provides horizontal padding
23140
- baseClass: "",
23141
- spacing: "comfortable"
23142
- })
23143
- ]
23144
- });
23632
+ layout: eventCalendarLayout,
23633
+ variants: eventCalendarVariants,
23634
+ defaultVariant: "combined",
23635
+ variantOptions: {
23636
+ combined: { label: "Combined" },
23637
+ month: { label: "Month" },
23638
+ week: { label: "Week" },
23639
+ timetable: { label: "Timetable" },
23640
+ list: { label: "List" }
23641
+ }
23642
+ };
23643
+ var eventCalendarManifest = createBlockManifestWithContentShape(
23644
+ eventCalendarConfig,
23645
+ eventCalendarContentShape
23646
+ );
23145
23647
  var eventCalendarBlockDefinition = {
23146
23648
  manifest: eventCalendarManifest,
23147
23649
  normalizeContent: normalizeEventCalendarContent,
@@ -27194,14 +27696,29 @@ function mediaPanelCapable() {
27194
27696
  var allSectionSurfaces = [
27195
27697
  "base",
27196
27698
  "muted-band",
27197
- "accent-band"
27699
+ "accent-band",
27700
+ "brand-depth-band"
27198
27701
  ];
27199
27702
  var heroSectionSurfaces = [
27200
27703
  "base",
27201
27704
  "muted-band",
27202
27705
  "accent-band",
27706
+ "brand-depth-band",
27203
27707
  "hero-image"
27204
27708
  ];
27709
+ var scheduleTileTreatments = [
27710
+ "default",
27711
+ "quiet",
27712
+ "brand-depth"
27713
+ ];
27714
+ function scheduleDetailsCapable() {
27715
+ return declareBlockDesignCapability({
27716
+ sectionSurfaces: "supported",
27717
+ contentFrames: ["plain"],
27718
+ itemSurfaces: "unsupported",
27719
+ tileTreatments: scheduleTileTreatments
27720
+ });
27721
+ }
27205
27722
  function defaultBoundaryBias(visualWeight) {
27206
27723
  return visualWeight === "featured" || visualWeight === "immersive" ? "clear" : "soft";
27207
27724
  }
@@ -27439,7 +27956,7 @@ var systemBlockDefinitionsRaw = [
27439
27956
  flow: conversionFlow,
27440
27957
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
27441
27958
  })),
27442
- withDesignCapability("block.event-details", eventDetailsBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
27959
+ withDesignCapability("block.event-details", eventDetailsBlockDefinition, scheduleDetailsCapable(), defineBlockDesignMetadata({
27443
27960
  flow: offeringsFlow,
27444
27961
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
27445
27962
  })),
@@ -27447,7 +27964,7 @@ var systemBlockDefinitionsRaw = [
27447
27964
  flow: conversionFlow,
27448
27965
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
27449
27966
  })),
27450
- withDesignCapability("block.course-details", courseDetailsBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
27967
+ withDesignCapability("block.course-details", courseDetailsBlockDefinition, scheduleDetailsCapable(), defineBlockDesignMetadata({
27451
27968
  flow: offeringsFlow,
27452
27969
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
27453
27970
  })),
@@ -27462,7 +27979,13 @@ var systemBlockDefinitionsRaw = [
27462
27979
  })),
27463
27980
  withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
27464
27981
  flow: offeringsFlow,
27465
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
27982
+ layoutProfiles: [
27983
+ layoutProfile({ variantKey: "combined", family: "grid", weight: "standard" }),
27984
+ layoutProfile({ variantKey: "list", family: "stack", weight: "standard" }),
27985
+ layoutProfile({ variantKey: "month", family: "grid", weight: "standard" }),
27986
+ layoutProfile({ variantKey: "week", family: "stack", weight: "standard" }),
27987
+ layoutProfile({ variantKey: "timetable", family: "stack", weight: "standard" })
27988
+ ]
27466
27989
  })),
27467
27990
  // Friendly wrapper blocks
27468
27991
  withDesignCapability("block.team-members", teamMembersBlockDefinition, sectionOnly(), defineBlockDesignMetadata({