@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
@@ -995,6 +995,14 @@ var ENDPOINT_DEFINITIONS = {
995
995
  auth: "user",
996
996
  responseKind: "json"
997
997
  },
998
+ exportAppointmentServicesCsv: {
999
+ path: "/sites/{siteId}/bookings/services/export.csv",
1000
+ method: "GET",
1001
+ tags: ["site-{siteId}", "bookings", "appointment-services-{siteId}"],
1002
+ errors: [],
1003
+ auth: "user",
1004
+ responseKind: "blob"
1005
+ },
998
1006
  createAppointmentService: {
999
1007
  path: "/sites/{siteId}/bookings/services",
1000
1008
  method: "POST",
@@ -1263,6 +1271,14 @@ var ENDPOINT_DEFINITIONS = {
1263
1271
  auth: "user",
1264
1272
  responseKind: "json"
1265
1273
  },
1274
+ exportCoursesCsv: {
1275
+ path: "/sites/{siteId}/bookings/courses/export.csv",
1276
+ method: "GET",
1277
+ tags: ["site-{siteId}", "bookings", "courses-{siteId}"],
1278
+ errors: [],
1279
+ auth: "user",
1280
+ responseKind: "blob"
1281
+ },
1266
1282
  createCourse: {
1267
1283
  path: "/sites/{siteId}/bookings/courses",
1268
1284
  method: "POST",
@@ -1362,6 +1378,14 @@ var ENDPOINT_DEFINITIONS = {
1362
1378
  responseKind: "json",
1363
1379
  errors: []
1364
1380
  },
1381
+ exportCourseWaitlistCsv: {
1382
+ path: "/sites/{siteId}/bookings/courses/{courseId}/waitlist/export.csv",
1383
+ method: "GET",
1384
+ tags: ["site-{siteId}", "bookings", "courses-{courseId}"],
1385
+ auth: "user",
1386
+ responseKind: "blob",
1387
+ errors: []
1388
+ },
1365
1389
  updateCourseEnrollment: {
1366
1390
  path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments/{enrollmentId}",
1367
1391
  method: "PATCH",
@@ -3957,6 +3981,14 @@ var ENDPOINT_DEFINITIONS = {
3957
3981
  auth: "user",
3958
3982
  responseKind: "json"
3959
3983
  },
3984
+ exportEventSeriesCsv: {
3985
+ path: "/sites/{siteId}/bookings/event-series/export.csv",
3986
+ method: "GET",
3987
+ tags: ["site-{siteId}", "bookings", "event-series-{siteId}"],
3988
+ errors: [],
3989
+ auth: "user",
3990
+ responseKind: "blob"
3991
+ },
3960
3992
  createEventSeries: {
3961
3993
  path: "/sites/{siteId}/bookings/event-series",
3962
3994
  method: "POST",
@@ -4025,6 +4057,60 @@ var ENDPOINT_DEFINITIONS = {
4025
4057
  errors: [],
4026
4058
  responseKind: "blob"
4027
4059
  },
4060
+ getParticipantMessageRecipients: {
4061
+ path: "/sites/{siteId}/bookings/participant-messaging/recipients",
4062
+ method: "POST",
4063
+ tags: ["site-{siteId}"],
4064
+ auth: "user",
4065
+ errors: [
4066
+ "validation:invalid_input",
4067
+ "auth:forbidden",
4068
+ "resource:not_found",
4069
+ "server:internal_error"
4070
+ ],
4071
+ responseKind: "json"
4072
+ },
4073
+ sendParticipantMessage: {
4074
+ path: "/sites/{siteId}/bookings/participant-messaging/send",
4075
+ method: "POST",
4076
+ tags: ["site-{siteId}"],
4077
+ auth: "user",
4078
+ errors: [
4079
+ "validation:invalid_input",
4080
+ "auth:forbidden",
4081
+ "resource:not_found",
4082
+ "resource:conflict",
4083
+ "server:internal_error"
4084
+ ],
4085
+ responseKind: "json"
4086
+ },
4087
+ testParticipantMessage: {
4088
+ path: "/sites/{siteId}/bookings/participant-messaging/test",
4089
+ method: "POST",
4090
+ tags: ["site-{siteId}"],
4091
+ auth: "user",
4092
+ errors: [
4093
+ "validation:invalid_input",
4094
+ "auth:forbidden",
4095
+ "resource:not_found",
4096
+ "resource:conflict",
4097
+ "server:internal_error"
4098
+ ],
4099
+ responseKind: "json"
4100
+ },
4101
+ listParticipantMessageHistory: {
4102
+ path: "/sites/{siteId}/bookings/participant-messaging/history",
4103
+ method: "POST",
4104
+ tags: ["site-{siteId}"],
4105
+ auth: "user",
4106
+ errors: [
4107
+ "validation:invalid_input",
4108
+ "auth:forbidden",
4109
+ "resource:not_found",
4110
+ "server:internal_error"
4111
+ ],
4112
+ responseKind: "json"
4113
+ },
4028
4114
  listEventSeriesWaitlist: {
4029
4115
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist",
4030
4116
  method: "GET",
@@ -4033,6 +4119,14 @@ var ENDPOINT_DEFINITIONS = {
4033
4119
  responseKind: "json",
4034
4120
  errors: []
4035
4121
  },
4122
+ exportEventSeriesWaitlistCsv: {
4123
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist/export.csv",
4124
+ method: "GET",
4125
+ tags: ["site-{siteId}", "bookings", "event-series-{seriesId}"],
4126
+ auth: "user",
4127
+ responseKind: "blob",
4128
+ errors: []
4129
+ },
4036
4130
  addEventOccurrenceAttendee: {
4037
4131
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/occurrences/{occurrenceId}/attendees",
4038
4132
  method: "POST",
@@ -4749,6 +4843,14 @@ var ENDPOINT_DEFINITIONS = {
4749
4843
  auth: "user",
4750
4844
  responseKind: "json"
4751
4845
  },
4846
+ exportSiteCustomerPassesCsv: {
4847
+ path: "/sites/{siteId}/bookings/customer-passes/export.csv",
4848
+ method: "GET",
4849
+ tags: ["site-{siteId}", "bookings", "customer-passes-{siteId}"],
4850
+ auth: "user",
4851
+ responseKind: "blob",
4852
+ errors: []
4853
+ },
4752
4854
  listSiteCustomerMemberships: {
4753
4855
  path: "/sites/{siteId}/bookings/customer-memberships",
4754
4856
  method: "GET",
@@ -4812,6 +4914,22 @@ var ENDPOINT_DEFINITIONS = {
4812
4914
  auth: "user",
4813
4915
  responseKind: "blob"
4814
4916
  },
4917
+ exportBookingLedgerCsv: {
4918
+ path: "/sites/{siteId}/bookings/ledger/export.csv",
4919
+ method: "GET",
4920
+ tags: ["site-{siteId}", "bookings", "booking-ledger-{siteId}"],
4921
+ errors: [],
4922
+ auth: "user",
4923
+ responseKind: "blob"
4924
+ },
4925
+ exportBookingQuestionAnswersCsv: {
4926
+ path: "/sites/{siteId}/bookings/intake-answers/export.csv",
4927
+ method: "GET",
4928
+ tags: ["site-{siteId}", "bookings", "intake-answers-{siteId}"],
4929
+ errors: [],
4930
+ auth: "user",
4931
+ responseKind: "blob"
4932
+ },
4815
4933
  // Site logs
4816
4934
  listSiteActivityLogs: {
4817
4935
  path: "/sites/{siteId}/logs/activity",
@@ -6169,7 +6287,11 @@ function resolveRepeaterGridColumnFieldId(options) {
6169
6287
 
6170
6288
  // ../blocks/src/system/manifest/schema.ts
6171
6289
  var visibilityLevels = ["admin", "designer", "author"];
6172
- var siteOptionSources = ["eventCategories", "venues", "staffMembers"];
6290
+ var siteOptionSources = [
6291
+ "eventCategories",
6292
+ "venues",
6293
+ "staffMembers"
6294
+ ];
6173
6295
  var mediaDeliverySchema = z3.object({
6174
6296
  sizes: z3.string().optional(),
6175
6297
  widthCandidates: z3.array(z3.number().int().positive()).optional(),
@@ -6207,7 +6329,10 @@ var uiSchema = z3.object({
6207
6329
  hidden: z3.boolean().optional(),
6208
6330
  hideLabel: z3.boolean().optional(),
6209
6331
  hideDescription: z3.boolean().optional(),
6210
- showCharCount: z3.union([z3.number().int().positive(), z3.object({ max: z3.number().int().positive() })]).optional(),
6332
+ showCharCount: z3.union([
6333
+ z3.number().int().positive(),
6334
+ z3.object({ max: z3.number().int().positive() })
6335
+ ]).optional(),
6211
6336
  showSlugPreview: z3.boolean().optional(),
6212
6337
  variant: z3.enum(["full", "inline", "limited", "media", "notes"]).optional(),
6213
6338
  richTextVariant: z3.enum(["full", "inline", "limited", "media", "notes"]).optional(),
@@ -6217,10 +6342,7 @@ var uiSchema = z3.object({
6217
6342
  showMediaPreview: z3.boolean().optional(),
6218
6343
  showMediaOverlayActions: z3.boolean().optional(),
6219
6344
  mediaDelivery: mediaDeliverySchema.optional(),
6220
- mediaDeliveryByVariant: z3.record(
6221
- z3.string(),
6222
- mediaDeliverySchema
6223
- ).optional(),
6345
+ mediaDeliveryByVariant: z3.record(z3.string(), mediaDeliverySchema).optional(),
6224
6346
  // Optional input hints for validators/widgets
6225
6347
  inputType: z3.enum(["text", "email", "tel", "number"]).optional(),
6226
6348
  min: z3.number().optional(),
@@ -6328,7 +6450,9 @@ var richTextFieldSchema = baseFieldSchema.extend({
6328
6450
  });
6329
6451
  var mediaFieldSchema = baseFieldSchema.extend({
6330
6452
  type: z3.literal("media"),
6331
- mediaKinds: z3.array(z3.enum(["image", "video", "audio", "document", "spreadsheet", "archive"])).default(["image"]),
6453
+ mediaKinds: z3.array(
6454
+ z3.enum(["image", "video", "audio", "document", "spreadsheet", "archive"])
6455
+ ).default(["image"]),
6332
6456
  aspectRatio: z3.string().optional()
6333
6457
  });
6334
6458
  var booleanFieldSchema = baseFieldSchema.extend({
@@ -6450,7 +6574,9 @@ var referenceFieldSchema = baseFieldSchema.extend({
6450
6574
  var itemTypeSchema = z3.object({
6451
6575
  label: z3.string().min(1),
6452
6576
  icon: z3.string().optional(),
6453
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Item type requires at least one field"))
6577
+ fields: z3.lazy(
6578
+ () => getFieldSchemaInternal().array().min(1, "Item type requires at least one field")
6579
+ )
6454
6580
  });
6455
6581
  var repeaterFieldSchema = baseFieldSchema.extend({
6456
6582
  type: z3.literal("repeater"),
@@ -6460,7 +6586,9 @@ var repeaterFieldSchema = baseFieldSchema.extend({
6460
6586
  maxItems: z3.number().int().positive().optional(),
6461
6587
  // Monomorphic mode
6462
6588
  schema: z3.object({
6463
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Repeater requires at least one field"))
6589
+ fields: z3.lazy(
6590
+ () => getFieldSchemaInternal().array().min(1, "Repeater requires at least one field")
6591
+ )
6464
6592
  }).optional(),
6465
6593
  // Polymorphic mode
6466
6594
  polymorphic: z3.boolean().optional(),
@@ -6506,13 +6634,19 @@ var repeaterFieldSchema = baseFieldSchema.extend({
6506
6634
  const itemTypes = Object.values(
6507
6635
  data.itemTypes
6508
6636
  );
6509
- return itemTypes.every((itemType) => Array.isArray(itemType.fields) && requiredFieldIds.every((requiredId) => itemType.fields?.some((field) => field.id === requiredId)));
6637
+ return itemTypes.every(
6638
+ (itemType) => Array.isArray(itemType.fields) && requiredFieldIds.every(
6639
+ (requiredId) => itemType.fields?.some((field) => field.id === requiredId)
6640
+ )
6641
+ );
6510
6642
  }
6511
6643
  const schemaFields = data.schema?.fields;
6512
6644
  if (!schemaFields) {
6513
6645
  return true;
6514
6646
  }
6515
- return requiredFieldIds.every((requiredId) => schemaFields.some((field) => field.id === requiredId));
6647
+ return requiredFieldIds.every(
6648
+ (requiredId) => schemaFields.some((field) => field.id === requiredId)
6649
+ );
6516
6650
  },
6517
6651
  {
6518
6652
  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`,
@@ -6540,7 +6674,9 @@ var repeaterFieldSchema = baseFieldSchema.extend({
6540
6674
  if (!schemaFields) {
6541
6675
  return true;
6542
6676
  }
6543
- const field = schemaFields.find((candidate) => candidate.id === labelField);
6677
+ const field = schemaFields.find(
6678
+ (candidate) => candidate.id === labelField
6679
+ );
6544
6680
  return field?.type === "text";
6545
6681
  },
6546
6682
  {
@@ -6551,13 +6687,17 @@ var repeaterFieldSchema = baseFieldSchema.extend({
6551
6687
  var groupFieldSchema = baseFieldSchema.extend({
6552
6688
  type: z3.literal("group"),
6553
6689
  schema: z3.object({
6554
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Group requires at least one field"))
6690
+ fields: z3.lazy(
6691
+ () => getFieldSchemaInternal().array().min(1, "Group requires at least one field")
6692
+ )
6555
6693
  })
6556
6694
  });
6557
6695
  var modalFieldSchema = baseFieldSchema.extend({
6558
6696
  type: z3.literal("modal"),
6559
6697
  schema: z3.object({
6560
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Modal requires at least one field"))
6698
+ fields: z3.lazy(
6699
+ () => getFieldSchemaInternal().array().min(1, "Modal requires at least one field")
6700
+ )
6561
6701
  })
6562
6702
  });
6563
6703
  var numberFieldSchema = baseFieldSchema.extend({
@@ -6664,31 +6804,35 @@ function expectParsedSelectField(field) {
6664
6804
  return field;
6665
6805
  }
6666
6806
  function createSiteOptionSelectField(input) {
6667
- return expectParsedSelectField(parseFieldDefinition({
6668
- ...input,
6669
- type: "select",
6670
- options: [],
6671
- multiple: input.multiple ?? false,
6672
- source: { kind: "site", optionSource: input.optionSource },
6673
- ui: {
6674
- ...input.ui ?? {},
6675
- widget: "siteOptionPicker",
6676
- siteOptionSource: input.optionSource
6677
- }
6678
- }));
6807
+ return expectParsedSelectField(
6808
+ parseFieldDefinition({
6809
+ ...input,
6810
+ type: "select",
6811
+ options: [],
6812
+ multiple: input.multiple ?? false,
6813
+ source: { kind: "site", optionSource: input.optionSource },
6814
+ ui: {
6815
+ ...input.ui ?? {},
6816
+ widget: "siteOptionPicker",
6817
+ siteOptionSource: input.optionSource
6818
+ }
6819
+ })
6820
+ );
6679
6821
  }
6680
6822
  function createSdkSelectField(input) {
6681
- return expectParsedSelectField(parseFieldDefinition({
6682
- ...input,
6683
- type: "select",
6684
- options: input.options,
6685
- multiple: input.multiple ?? false,
6686
- source: { kind: "sdk" },
6687
- ui: {
6688
- ...input.ui ?? {},
6689
- widget: "sdkSelect"
6690
- }
6691
- }));
6823
+ return expectParsedSelectField(
6824
+ parseFieldDefinition({
6825
+ ...input,
6826
+ type: "select",
6827
+ options: input.options,
6828
+ multiple: input.multiple ?? false,
6829
+ source: { kind: "sdk" },
6830
+ ui: {
6831
+ ...input.ui ?? {},
6832
+ widget: "sdkSelect"
6833
+ }
6834
+ })
6835
+ );
6692
6836
  }
6693
6837
  var slotSchema = z3.object({
6694
6838
  id: z3.string().min(1),
@@ -6699,8 +6843,20 @@ var slotSchema = z3.object({
6699
6843
  help: z3.string().optional(),
6700
6844
  visibleRoles: z3.array(z3.enum(visibilityLevels)).optional()
6701
6845
  });
6702
- var typographyTokens = ["display", "heading", "subheading", "body", "caption"];
6703
- var colorTokens = ["background", "surface", "foreground", "accent", "muted"];
6846
+ var typographyTokens = [
6847
+ "display",
6848
+ "heading",
6849
+ "subheading",
6850
+ "body",
6851
+ "caption"
6852
+ ];
6853
+ var colorTokens = [
6854
+ "background",
6855
+ "surface",
6856
+ "foreground",
6857
+ "accent",
6858
+ "muted"
6859
+ ];
6704
6860
  var spacingTokens = ["none", "xs", "sm", "md", "lg", "xl"];
6705
6861
  var radiusTokens = ["none", "sm", "md", "lg", "full"];
6706
6862
  var styleTokenSchema = z3.object({
@@ -6720,7 +6876,14 @@ var behaviourSchema = z3.object({
6720
6876
  // Block manages its own wrapper (for sticky/fixed positioning)
6721
6877
  managesOwnWrapper: z3.boolean().optional()
6722
6878
  });
6723
- var blockCategoryEnum = z3.enum(["marketing", "content", "blog", "media", "layout", "interactive"]);
6879
+ var blockCategoryEnum = z3.enum([
6880
+ "marketing",
6881
+ "content",
6882
+ "blog",
6883
+ "media",
6884
+ "layout",
6885
+ "interactive"
6886
+ ]);
6724
6887
  var manifestSchema = z3.object({
6725
6888
  name: z3.string().min(1),
6726
6889
  version: z3.string().min(1),
@@ -7319,6 +7482,20 @@ var applyAppointmentSetupRequestSchema = z6.object({
7319
7482
  bookingNotice: appointmentSetupBookingNoticeSchema
7320
7483
  });
7321
7484
 
7485
+ // ../api/src/bookingRecords.ts
7486
+ var BOOKING_QUESTION_ANSWER_EXPORT_SCOPES = {
7487
+ site: "site",
7488
+ appointments: "appointments",
7489
+ eventSeries: "event_series",
7490
+ course: "course"
7491
+ };
7492
+ var BOOKING_QUESTION_ANSWER_EXPORT_SCOPE_VALUES = [
7493
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.site,
7494
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.appointments,
7495
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.eventSeries,
7496
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.course
7497
+ ];
7498
+
7322
7499
  // ../api/src/common/cancellation.ts
7323
7500
  var STAFF_CANCELLATION_CONTEXT_UI_CATEGORIES = [
7324
7501
  "customer_requested",
@@ -7645,6 +7822,24 @@ function registerManifest(manifest) {
7645
7822
  return manifest;
7646
7823
  }
7647
7824
 
7825
+ // ../theme-core/src/site-styles/appearancePresetResolution.ts
7826
+ function assertValidOptionGroups(preset2) {
7827
+ preset2.optionGroups?.forEach((group) => {
7828
+ const selectedOption = group.options.find(
7829
+ (option) => option.id === group.selectedOptionId
7830
+ );
7831
+ if (!selectedOption) {
7832
+ throw new Error(
7833
+ `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
7834
+ );
7835
+ }
7836
+ });
7837
+ }
7838
+ function defineBlockAppearancePreset(preset2) {
7839
+ assertValidOptionGroups(preset2);
7840
+ return preset2;
7841
+ }
7842
+
7648
7843
  // ../theme-core/src/site-styles/types.ts
7649
7844
  function asDesignBlockId(value) {
7650
7845
  return brandNonEmptyString(value, "DesignBlockId");
@@ -7726,6 +7921,11 @@ function flushPanelFrame(options) {
7726
7921
  function defineFrameCapability(capability) {
7727
7922
  return capability;
7728
7923
  }
7924
+ var tileTreatmentValues = [
7925
+ "default",
7926
+ "quiet",
7927
+ "brand-depth"
7928
+ ];
7729
7929
  var eyebrowTreatmentValues = [
7730
7930
  "plain",
7731
7931
  "pill",
@@ -7741,31 +7941,13 @@ function defineBlockDesignCapability(capability) {
7741
7941
  imageSurfaceTreatments: capability.imageSurfaceTreatments ?? ["none"],
7742
7942
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7743
7943
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
7944
+ tileTreatments: capability.tileTreatments ?? ["default"],
7744
7945
  eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"]
7745
7946
  };
7746
7947
  }
7747
7948
 
7748
- // ../theme-core/src/site-styles/appearancePresets.ts
7749
- function assertValidOptionGroups(preset2) {
7750
- preset2.optionGroups?.forEach((group) => {
7751
- const selectedOption = group.options.find(
7752
- (option) => option.id === group.selectedOptionId
7753
- );
7754
- if (!selectedOption) {
7755
- throw new Error(
7756
- `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
7757
- );
7758
- }
7759
- });
7760
- }
7761
- function defineBlockAppearancePreset(preset2) {
7762
- assertValidOptionGroups(preset2);
7763
- return preset2;
7764
- }
7765
- function defineSiteChromeAppearancePreset(preset2) {
7766
- return preset2;
7767
- }
7768
- var appearancePresets = [
7949
+ // ../theme-core/src/site-styles/blockAppearancePresets.ts
7950
+ var blockAppearancePresets = [
7769
7951
  defineBlockAppearancePreset({
7770
7952
  kind: "block-design",
7771
7953
  id: "hero-immersive-image",
@@ -7891,6 +8073,24 @@ var appearancePresets = [
7891
8073
  eyebrowTreatment: "accent-pill-bounce"
7892
8074
  }
7893
8075
  }),
8076
+ defineBlockAppearancePreset({
8077
+ kind: "block-design",
8078
+ id: "hero-brand-depth-expressive",
8079
+ target: "hero",
8080
+ label: "Expressive brand-depth hero",
8081
+ blockKinds: ["block.hero"],
8082
+ constraints: {
8083
+ layoutFamilies: ["centered", "compact"]
8084
+ },
8085
+ design: {
8086
+ sectionSurface: "brand-depth-band",
8087
+ contentFrame: plainFrame,
8088
+ itemSurface: "none",
8089
+ transitionAfter: "soft-fade-short",
8090
+ emphasis: "high",
8091
+ eyebrowTreatment: "accent-pill-bounce"
8092
+ }
8093
+ }),
7894
8094
  defineBlockAppearancePreset({
7895
8095
  kind: "block-design",
7896
8096
  id: "hero-contained-intro",
@@ -7919,6 +8119,20 @@ var appearancePresets = [
7919
8119
  emphasis: "high"
7920
8120
  }
7921
8121
  }),
8122
+ defineBlockAppearancePreset({
8123
+ kind: "block-design",
8124
+ id: "body-text-brand-depth-intro",
8125
+ target: "body-text",
8126
+ label: "Brand-depth intro copy",
8127
+ blockKinds: ["block.body-text"],
8128
+ design: {
8129
+ sectionSurface: "brand-depth-band",
8130
+ contentFrame: plainFrame,
8131
+ itemSurface: "none",
8132
+ transitionAfter: "soft-fade-short",
8133
+ emphasis: "high"
8134
+ }
8135
+ }),
7922
8136
  defineBlockAppearancePreset({
7923
8137
  kind: "block-design",
7924
8138
  id: "offerings-calm-list",
@@ -7961,6 +8175,21 @@ var appearancePresets = [
7961
8175
  emphasis: "medium"
7962
8176
  }
7963
8177
  }),
8178
+ defineBlockAppearancePreset({
8179
+ kind: "block-design",
8180
+ id: "schedule-details-brand-depth",
8181
+ target: "events",
8182
+ label: "Brand-depth schedule details",
8183
+ blockKinds: ["block.event-details", "block.course-details"],
8184
+ design: {
8185
+ sectionSurface: "brand-depth-band",
8186
+ contentFrame: plainFrame,
8187
+ itemSurface: "none",
8188
+ transitionAfter: "none",
8189
+ emphasis: "medium",
8190
+ tileTreatment: "brand-depth"
8191
+ }
8192
+ }),
7964
8193
  defineBlockAppearancePreset({
7965
8194
  kind: "block-design",
7966
8195
  id: "media-text-flush-feature",
@@ -8046,6 +8275,20 @@ var appearancePresets = [
8046
8275
  testimonialCardTreatment: "accent-quote"
8047
8276
  }
8048
8277
  }),
8278
+ defineBlockAppearancePreset({
8279
+ kind: "block-design",
8280
+ id: "faq-base-accordion",
8281
+ target: "faq",
8282
+ label: "Base accordion FAQ",
8283
+ blockKinds: ["block.faq"],
8284
+ design: {
8285
+ sectionSurface: "base",
8286
+ contentFrame: plainFrame,
8287
+ itemSurface: "default",
8288
+ transitionAfter: "none",
8289
+ emphasis: "medium"
8290
+ }
8291
+ }),
8049
8292
  defineBlockAppearancePreset({
8050
8293
  kind: "block-design",
8051
8294
  id: "faq-contained-help",
@@ -8088,6 +8331,20 @@ var appearancePresets = [
8088
8331
  emphasis: "high"
8089
8332
  }
8090
8333
  }),
8334
+ defineBlockAppearancePreset({
8335
+ kind: "block-design",
8336
+ id: "contact-form-brand-depth-card",
8337
+ target: "contact-form",
8338
+ label: "Brand-depth form card",
8339
+ blockKinds: ["block.form"],
8340
+ design: {
8341
+ sectionSurface: "brand-depth-band",
8342
+ contentFrame: panelFrame("raised"),
8343
+ itemSurface: "none",
8344
+ transitionAfter: "none",
8345
+ emphasis: "high"
8346
+ }
8347
+ }),
8091
8348
  defineBlockAppearancePreset({
8092
8349
  kind: "block-design",
8093
8350
  id: "cta-accent-band",
@@ -8101,7 +8358,14 @@ var appearancePresets = [
8101
8358
  transitionAfter: "none",
8102
8359
  emphasis: "high"
8103
8360
  }
8104
- }),
8361
+ })
8362
+ ];
8363
+
8364
+ // ../theme-core/src/site-styles/siteChromeAppearancePresets.ts
8365
+ function defineSiteChromeAppearancePreset(preset2) {
8366
+ return preset2;
8367
+ }
8368
+ var siteChromeAppearancePresets = [
8105
8369
  defineSiteChromeAppearancePreset({
8106
8370
  kind: "site-chrome",
8107
8371
  id: "header-clean-base",
@@ -8169,6 +8433,12 @@ var appearancePresets = [
8169
8433
  })
8170
8434
  ];
8171
8435
 
8436
+ // ../theme-core/src/site-styles/appearancePresetCatalog.ts
8437
+ var appearancePresets = [
8438
+ ...blockAppearancePresets,
8439
+ ...siteChromeAppearancePresets
8440
+ ];
8441
+
8172
8442
  // ../theme-core/src/site-styles/blockFlow.ts
8173
8443
  function defineBlockDesignMetadata(input) {
8174
8444
  const layoutProfiles = (input.layoutProfiles ?? []).map((profile) => ({
@@ -9643,6 +9913,7 @@ var sectionStylesOverrideSchema = z22.object({
9643
9913
  background: boxBackgroundSchema.nullable().optional(),
9644
9914
  spacing: semanticSpacingSchema.nullable().optional(),
9645
9915
  minHeight: z22.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
9916
+ tileTreatment: z22.enum(tileTreatmentValues).nullable().optional(),
9646
9917
  eyebrowTreatment: z22.enum(eyebrowTreatmentValues).nullable().optional()
9647
9918
  });
9648
9919
  var containerStylesOverrideSchema = z22.object({
@@ -10436,7 +10707,7 @@ var userContentFrames = [
10436
10707
  ];
10437
10708
  var generatedDesignOptionCatalog = {
10438
10709
  source: "generated",
10439
- sectionSurfaces: ["base", "muted-band", "accent-band", "hero-image"],
10710
+ sectionSurfaces: ["base", "muted-band", "accent-band", "brand-depth-band", "hero-image"],
10440
10711
  contentFrames: generatedContentFrames,
10441
10712
  itemSurfaces: ["none", "default", "flat", "outlined", "raised"],
10442
10713
  transitions: ["none", "soft-fade-short", "soft-fade-long"],
@@ -10506,6 +10777,43 @@ var expressiveBudget = {
10506
10777
  mediaDensity: "high",
10507
10778
  decorativeRepetition: "medium"
10508
10779
  };
10780
+ var expressiveUnderlineInputs = {
10781
+ base: {
10782
+ background: { type: "transparent" },
10783
+ textColorToken: "text",
10784
+ border: {
10785
+ widthClass: "border-2",
10786
+ colorToken: "border",
10787
+ style: "underline"
10788
+ },
10789
+ corners: "square",
10790
+ shadow: null,
10791
+ spacing: "compact",
10792
+ fontSize: "base"
10793
+ },
10794
+ label: {
10795
+ textColorToken: "primary",
10796
+ fontWeight: "black",
10797
+ fontSize: "xs",
10798
+ textTransform: "uppercase",
10799
+ letterSpacing: "widest",
10800
+ opacity: 1
10801
+ },
10802
+ focus: {
10803
+ ringColorToken: "secondary",
10804
+ ringWidth: "0",
10805
+ borderColorToken: "secondary"
10806
+ },
10807
+ error: {
10808
+ borderColorToken: "destructive",
10809
+ textColorToken: "destructive"
10810
+ },
10811
+ disabled: {
10812
+ backgroundColorToken: "surface",
10813
+ textColorToken: "text",
10814
+ opacity: 0.6
10815
+ }
10816
+ };
10509
10817
  function uniqueContentFrameKinds() {
10510
10818
  const kinds = [...new Set(
10511
10819
  generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
@@ -10856,15 +11164,17 @@ var curatedSiteStyles = [
10856
11164
  paragraphSize: "editorial",
10857
11165
  headingSize: "editorial"
10858
11166
  }
10859
- }
11167
+ },
11168
+ inputs: expressiveUnderlineInputs
10860
11169
  },
10861
11170
  recommendedAppearancePresetIds: [
10862
11171
  "site-header-brand-solid-inverted-cta",
10863
11172
  "site-footer-brand-two-band",
10864
11173
  "hero-brand-scrim-fixed-frame",
10865
11174
  "body-text-editorial-intro",
11175
+ "schedule-details-brand-depth",
10866
11176
  "testimonials-accent-quote-proof",
10867
- "contact-form-dark-card"
11177
+ "contact-form-brand-depth-card"
10868
11178
  ],
10869
11179
  buttonPersonalityChoices: [
10870
11180
  buttonChoice("showtime-pill"),
@@ -10998,6 +11308,7 @@ var imageSurfaceTreatmentSchema = z24.discriminatedUnion("kind", [
10998
11308
  }).strict()
10999
11309
  ]);
11000
11310
  var testimonialCardTreatmentSchema = z24.enum(["default", "accent-quote"]);
11311
+ var tileTreatmentSchema = z24.enum(tileTreatmentValues);
11001
11312
  var eyebrowTreatmentSchema = z24.enum(eyebrowTreatmentValues);
11002
11313
  function uniqueNonEmpty(values) {
11003
11314
  const uniqueValues = [...new Set(values)];
@@ -11042,6 +11353,7 @@ var blockDesignPlanSchema = z24.object({
11042
11353
  imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
11043
11354
  imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
11044
11355
  testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
11356
+ tileTreatment: tileTreatmentSchema.optional(),
11045
11357
  eyebrowTreatment: eyebrowTreatmentSchema.optional()
11046
11358
  }).strict();
11047
11359
  var styleAuthoritySchema = z24.discriminatedUnion("kind", [
@@ -11105,6 +11417,14 @@ var defaultDesignRuntimeRules = defineDesignRuntimeRules({
11105
11417
  headingColor: "primaryForeground"
11106
11418
  }
11107
11419
  },
11420
+ "brand-depth-band": {
11421
+ background: {
11422
+ type: "color",
11423
+ color: "primary-800",
11424
+ textColor: "primaryForeground",
11425
+ headingColor: "primaryForeground"
11426
+ }
11427
+ },
11108
11428
  "hero-image": {
11109
11429
  background: {
11110
11430
  type: "image",
@@ -12994,6 +13314,21 @@ function createTransformRegistry(definitions) {
12994
13314
  }
12995
13315
 
12996
13316
  // ../blocks/src/system/transforms/registry/_utils/colorResolution.ts
13317
+ var CSS_COLOR_FUNCTION_PATTERN = /^(?:rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch|color|color-mix|light-dark)\(/i;
13318
+ var CSS_HEX_COLOR_PATTERN = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
13319
+ var THEME_COLOR_TOKEN_PATTERN = /^[a-zA-Z][a-zA-Z0-9]*(?:-[a-zA-Z0-9]+)*(?:\/(?:100|[1-9]?\d|0))?$/;
13320
+ var CSS_COLOR_KEYWORDS = /* @__PURE__ */ new Set([
13321
+ "transparent",
13322
+ "currentColor",
13323
+ "inherit",
13324
+ "initial",
13325
+ "revert",
13326
+ "revert-layer",
13327
+ "unset"
13328
+ ]);
13329
+ function isLiteralCssColorValue(value) {
13330
+ return CSS_HEX_COLOR_PATTERN.test(value) || CSS_COLOR_FUNCTION_PATTERN.test(value) || value.startsWith("var(") || CSS_COLOR_KEYWORDS.has(value);
13331
+ }
12997
13332
  function resolveBackgroundColorValue(tokenOrCssValue, context) {
12998
13333
  const trimmed = tokenOrCssValue.trim();
12999
13334
  if (!trimmed) return "";
@@ -13010,8 +13345,11 @@ function resolveBackgroundColorValue(tokenOrCssValue, context) {
13010
13345
  return rgbColorValue(trimmed);
13011
13346
  }
13012
13347
  }
13013
- if (trimmed === "transparent") {
13014
- return "transparent";
13348
+ if (isLiteralCssColorValue(trimmed)) {
13349
+ return trimmed;
13350
+ }
13351
+ if (THEME_COLOR_TOKEN_PATTERN.test(trimmed)) {
13352
+ return rgbColorValue(trimmed);
13015
13353
  }
13016
13354
  return trimmed;
13017
13355
  }
@@ -13267,6 +13605,15 @@ function hasFixedFrameBackgroundMotion(value) {
13267
13605
  const background = asPartialObject(input?.background);
13268
13606
  return background?.motion === "fixed-frame";
13269
13607
  }
13608
+ var tileTreatmentClassMap = {
13609
+ default: "",
13610
+ quiet: "rb-tile-treatment-quiet",
13611
+ "brand-depth": "rb-tile-treatment-brand-depth"
13612
+ };
13613
+ var tileTreatmentSet = new Set(tileTreatmentValues);
13614
+ function isTileTreatment(value) {
13615
+ return typeof value === "string" && tileTreatmentSet.has(value);
13616
+ }
13270
13617
  var sectionClassNameTransform = {
13271
13618
  id: "sectionStyles.resolveClassName",
13272
13619
  kind: "string",
@@ -13323,6 +13670,17 @@ var sectionClassNameTransform = {
13323
13670
  classes.push(minHeightClass);
13324
13671
  }
13325
13672
  }
13673
+ const tileTreatment = input?.tileTreatment;
13674
+ if (isTileTreatment(tileTreatment)) {
13675
+ const tileTreatmentClass = tileTreatmentClassMap[tileTreatment];
13676
+ if (tileTreatmentClass) {
13677
+ classes.push(tileTreatmentClass);
13678
+ }
13679
+ } else if (typeof tileTreatment === "string" && process.env.NODE_ENV !== "production") {
13680
+ console.warn(
13681
+ `[sectionStyles] Invalid tileTreatment value in _sectionStyles: "${tileTreatment}". Expected one of: ${tileTreatmentValues.join(", ")}.`
13682
+ );
13683
+ }
13326
13684
  if (hasFixedFrameBackgroundMotion(input)) {
13327
13685
  classes.push(fixedFrameScopeClass);
13328
13686
  }
@@ -16197,6 +16555,9 @@ function createBlockManifest(config) {
16197
16555
  };
16198
16556
  return augmentManifest(manifest);
16199
16557
  }
16558
+ function createBlockManifestWithContentShape(config, _contentShape) {
16559
+ return createBlockManifest(config);
16560
+ }
16200
16561
  function normalizeBlockLayout(layout) {
16201
16562
  return Array.isArray(layout) ? [...layout] : layout;
16202
16563
  }
@@ -16829,7 +17190,7 @@ var ctaComposition = composeFragments([
16829
17190
  { fragment: ctaCopyFragment },
16830
17191
  { fragment: ctaRowFragment }
16831
17192
  ]);
16832
- var ctaFullManifest = createBlockManifest({
17193
+ var ctaFullConfig = {
16833
17194
  id: "block.cta-full",
16834
17195
  title: "Full-width CTA",
16835
17196
  category: "marketing",
@@ -16847,7 +17208,8 @@ var ctaFullManifest = createBlockManifest({
16847
17208
  description: "Centered call to action with optional background image.",
16848
17209
  tags: ["cta", "call-to-action", "button", "conversion", "action", "sign-up", "get-started"],
16849
17210
  icon: "Target"
16850
- });
17211
+ };
17212
+ var ctaFullManifest = createBlockManifest(ctaFullConfig);
16851
17213
  var ctaFullBlockDefinition = {
16852
17214
  manifest: ctaFullManifest
16853
17215
  };
@@ -19931,9 +20293,9 @@ var mediaTextManifest = createBlockManifest({
19931
20293
  {
19932
20294
  id: "images",
19933
20295
  type: "repeater",
19934
- label: "Images",
20296
+ label: "Media",
19935
20297
  required: false,
19936
- itemLabel: "Image",
20298
+ itemLabel: "Media",
19937
20299
  minItems: 0,
19938
20300
  maxItems: 6,
19939
20301
  allowConversion: true,
@@ -19947,9 +20309,9 @@ var mediaTextManifest = createBlockManifest({
19947
20309
  {
19948
20310
  id: "image",
19949
20311
  type: "media",
19950
- label: "Image",
20312
+ label: "Media",
19951
20313
  required: true,
19952
- mediaKinds: ["image"]
20314
+ mediaKinds: ["image", "video"]
19953
20315
  }
19954
20316
  ]
19955
20317
  }
@@ -20027,8 +20389,8 @@ var mediaTextManifest = createBlockManifest({
20027
20389
  {
20028
20390
  id: "aspectRatio",
20029
20391
  type: "select",
20030
- label: "Image aspect ratio",
20031
- description: "Crop image to a consistent aspect ratio.",
20392
+ label: "Media aspect ratio",
20393
+ description: "Crop media to a consistent aspect ratio.",
20032
20394
  required: false,
20033
20395
  defaultValue: "auto",
20034
20396
  multiple: false,
@@ -20215,8 +20577,8 @@ var mediaTextManifest = createBlockManifest({
20215
20577
  }
20216
20578
  };
20217
20579
  })(),
20218
- description: "Two columns: image/carousel + rich text (with optional section title).",
20219
- tags: ["media", "image", "carousel", "text", "two-column", "layout"],
20580
+ description: "Two columns: media/carousel + rich text (with optional section title).",
20581
+ tags: ["media", "image", "video", "carousel", "text", "two-column", "layout"],
20220
20582
  icon: "Columns"
20221
20583
  });
20222
20584
  var mediaTextBlockDefinition = {
@@ -20367,6 +20729,19 @@ var transformSchema2 = z39.object({
20367
20729
  hotspot: hotspotSchema2.optional(),
20368
20730
  rotation: rotationSchema2.optional()
20369
20731
  });
20732
+ var mediaPosterSchema = z39.discriminatedUnion("tag", [
20733
+ z39.object({
20734
+ tag: z39.literal("storage"),
20735
+ assetId: z39.string().optional(),
20736
+ storageBucket: z39.string().min(1),
20737
+ storagePath: z39.string().min(1)
20738
+ }),
20739
+ z39.object({
20740
+ tag: z39.literal("external-src"),
20741
+ assetId: z39.string().optional(),
20742
+ src: z39.string().url()
20743
+ })
20744
+ ]);
20370
20745
  var mediaBaseSchema = z39.object({
20371
20746
  purpose: z39.string().optional(),
20372
20747
  placeholder: z39.boolean().default(true).optional(),
@@ -20380,6 +20755,7 @@ var mediaBaseSchema = z39.object({
20380
20755
  height: z39.number().optional(),
20381
20756
  storageBucket: z39.string().optional(),
20382
20757
  storagePath: z39.string().optional(),
20758
+ poster: mediaPosterSchema.optional(),
20383
20759
  transform: transformSchema2.optional()
20384
20760
  });
20385
20761
  var imageMediaSchema = mediaBaseSchema.extend({ type: z39.literal("image") });
@@ -20863,10 +21239,28 @@ import { z as z45 } from "zod";
20863
21239
 
20864
21240
  // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
20865
21241
  import { z as z44 } from "zod";
21242
+
21243
+ // ../blocks/src/system/constants/events.ts
21244
+ var eventCalendarDisplayModeValues = ["combined", "month", "week", "list", "timetable"];
21245
+ var eventCalendarListLayoutValues = ["stack", "grid", "compact"];
21246
+ var eventCalendarListLayoutOptions = [
21247
+ { id: "stack", label: "Stack" },
21248
+ { id: "grid", label: "Grid" },
21249
+ { id: "compact", label: "Compact" }
21250
+ ];
21251
+ function isEventCalendarDisplayMode(value) {
21252
+ return typeof value === "string" && eventCalendarDisplayModeValues.includes(value);
21253
+ }
21254
+ function isEventCalendarListLayout(value) {
21255
+ return typeof value === "string" && eventCalendarListLayoutValues.includes(value);
21256
+ }
21257
+
21258
+ // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
20866
21259
  var previewStageSchema = z44.enum(["preview", "published"]);
20867
21260
  var registrationButtonVariantSchema = z44.enum(["primary", "secondary", "outline"]);
20868
21261
  var eventButtonVariantSchema = z44.enum(["primary", "secondary", "outline", "link"]);
20869
- var eventLayoutSchema = z44.enum(["grid", "stack", "compact"]);
21262
+ var eventLayoutSchema = z44.enum(eventCalendarListLayoutValues);
21263
+ var eventCalendarDisplayModeSchema = z44.enum(eventCalendarDisplayModeValues);
20870
21264
  var columnOptionSchema = z44.enum(["2", "3", "4"]);
20871
21265
  var weekStartSchema = z44.enum(["sunday", "monday"]);
20872
21266
  var filterAutoShowSchema = z44.enum(["auto", "always", "never"]);
@@ -22248,7 +22642,232 @@ var eventListingInteractiveIslandPropsCodec = createInteractiveIslandCodec({
22248
22642
  });
22249
22643
 
22250
22644
  // ../blocks/src/system/blocks/events/event-listing.ts
22251
- var eventListingManifest = createBlockManifest({
22645
+ var eventListingAdditionalFields = [
22646
+ ...sectionHeaderFields("All Events"),
22647
+ ...(() => {
22648
+ const columns = columnsField(["2", "3", "4"]);
22649
+ return [
22650
+ {
22651
+ ...layoutField,
22652
+ ui: { ...layoutField.ui ?? {}, intent: "display" }
22653
+ },
22654
+ {
22655
+ ...columns,
22656
+ ui: { ...columns.ui ?? {}, intent: "display" }
22657
+ }
22658
+ ];
22659
+ })(),
22660
+ {
22661
+ id: "eventsPerPage",
22662
+ type: "select",
22663
+ label: "Events per page",
22664
+ description: "Number of events to load at a time",
22665
+ required: false,
22666
+ multiple: false,
22667
+ defaultValue: "12",
22668
+ options: [
22669
+ { value: "3", label: "3 events" },
22670
+ { value: "6", label: "6 events" },
22671
+ { value: "12", label: "12 events" },
22672
+ { value: "24", label: "24 events" }
22673
+ ],
22674
+ ui: { intent: "display" }
22675
+ },
22676
+ {
22677
+ id: "paginationMode",
22678
+ type: "select",
22679
+ label: "More events",
22680
+ description: "How to access events beyond the initial list",
22681
+ required: false,
22682
+ multiple: false,
22683
+ defaultValue: "loadMore",
22684
+ options: [
22685
+ { value: "loadMore", label: "Load more button" },
22686
+ { value: "seeAllLink", label: "Link to another page" }
22687
+ ],
22688
+ ui: { intent: "display" }
22689
+ },
22690
+ {
22691
+ id: "seeAllUrl",
22692
+ type: "link",
22693
+ label: "See all destination",
22694
+ required: false,
22695
+ ui: {
22696
+ intent: "display",
22697
+ visibleWhen: {
22698
+ field: "paginationMode",
22699
+ equals: "seeAllLink"
22700
+ }
22701
+ }
22702
+ },
22703
+ {
22704
+ id: "loadMoreText",
22705
+ type: "text",
22706
+ label: "Button text",
22707
+ description: "Text for the pagination button or link",
22708
+ required: false,
22709
+ multiline: false,
22710
+ defaultValue: "Load more events",
22711
+ maxLength: 40
22712
+ },
22713
+ ...cardStylingFields.map((field) => ({
22714
+ ...field,
22715
+ ui: { ...field.ui ?? {}, intent: "style" }
22716
+ })),
22717
+ ...eventDisplayFields.map((field) => ({
22718
+ ...field,
22719
+ ui: { ...field.ui ?? {}, intent: "display" }
22720
+ })),
22721
+ {
22722
+ id: "kind",
22723
+ type: "select",
22724
+ label: "Show",
22725
+ description: "Choose whether this list shows courses, events, or both",
22726
+ required: false,
22727
+ multiple: false,
22728
+ defaultValue: "all",
22729
+ options: [
22730
+ { value: "all", label: "Courses and events" },
22731
+ { value: "courses", label: "Courses only" },
22732
+ { value: "events", label: "Events only" }
22733
+ ],
22734
+ ui: { intent: "behavior" }
22735
+ },
22736
+ {
22737
+ id: "eventSurface",
22738
+ type: "select",
22739
+ label: "Event surface",
22740
+ description: "Choose a semantic event scope",
22741
+ required: false,
22742
+ multiple: false,
22743
+ defaultValue: "all",
22744
+ options: [
22745
+ { value: "all", label: "All events" },
22746
+ { value: "regularClassSchedule", label: "Regular class schedule" },
22747
+ { value: "specialDatedEvents", label: "Workshops and special events" },
22748
+ { value: "custom", label: "Custom" }
22749
+ ],
22750
+ ui: { intent: "behavior" }
22751
+ },
22752
+ {
22753
+ id: "filterEventPresets",
22754
+ type: "select",
22755
+ label: "Pre-filter by event type",
22756
+ description: "Restrict this block to specific event types",
22757
+ required: false,
22758
+ multiple: true,
22759
+ defaultValue: [],
22760
+ options: [
22761
+ { value: "class", label: "Classes" },
22762
+ { value: "workshop", label: "Workshops" },
22763
+ { value: "retreat", label: "Retreats" },
22764
+ { value: "performance", label: "Performances" }
22765
+ ],
22766
+ ui: {
22767
+ intent: "behavior",
22768
+ visibleWhen: { field: "eventSurface", equals: "custom" }
22769
+ }
22770
+ },
22771
+ {
22772
+ id: "scheduleScope",
22773
+ type: "select",
22774
+ label: "Schedule cadence",
22775
+ description: "Restrict this block by recurrence",
22776
+ required: false,
22777
+ multiple: false,
22778
+ defaultValue: "any",
22779
+ options: [
22780
+ { value: "any", label: "Any cadence" },
22781
+ { value: "recurring", label: "Recurring only" },
22782
+ { value: "oneOff", label: "One-off only" }
22783
+ ],
22784
+ ui: {
22785
+ intent: "behavior",
22786
+ visibleWhen: { field: "eventSurface", equals: "custom" }
22787
+ }
22788
+ },
22789
+ {
22790
+ ...emptyStateField,
22791
+ ui: { ...emptyStateField.ui ?? {}, intent: "display" }
22792
+ },
22793
+ sectionStylesField({
22794
+ id: "_sectionStyles",
22795
+ label: "Section styles",
22796
+ renderInHeader: false
22797
+ })
22798
+ ];
22799
+ var eventListingLayout = [
22800
+ styledSection({
22801
+ children: sectionContainer([
22802
+ // Optional heading
22803
+ text(
22804
+ { as: "h2" },
22805
+ bind("content.heading"),
22806
+ when("content.heading")
22807
+ ),
22808
+ // Optional description
22809
+ richText(
22810
+ { className: "rb-prose rb-max-w-none" },
22811
+ bind("content.description"),
22812
+ when("content.description")
22813
+ ),
22814
+ // Event listing component with pagination
22815
+ el("event-listing", withApiBindings({
22816
+ events: { $bind: { from: "data.events" } },
22817
+ stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
22818
+ layout: { $bind: { from: "content.layout", fallback: "grid" } },
22819
+ columns: { $bind: { from: "content.columns", fallback: "3" } },
22820
+ eventsPerPage: { $bind: { from: "content.eventsPerPage", fallback: "12" } },
22821
+ paginationMode: { $bind: { from: "content.paginationMode", fallback: "loadMore" } },
22822
+ seeAllUrl: { $bind: { from: "content.seeAllUrl", transforms: [{ id: "links.resolve" }] } },
22823
+ loadMoreText: { $bind: { from: "content.loadMoreText", fallback: "Load more events" } },
22824
+ cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
22825
+ buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
22826
+ buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
22827
+ showVenue: { $bind: { from: "content.showVenue" } },
22828
+ showMap: { $bind: { from: "content.showMap" } },
22829
+ showCapacity: { $bind: { from: "content.showCapacity" } },
22830
+ eventKind: { $bind: { from: "content.kind", fallback: "all" } },
22831
+ eventSurface: { $bind: { from: "content.eventSurface", fallback: "all" } },
22832
+ filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
22833
+ scheduleScope: { $bind: { from: "content.scheduleScope", fallback: "any" } },
22834
+ emptyMessage: { $bind: { from: "content.emptyMessage" } }
22835
+ }))
22836
+ ], {
22837
+ gap: "lg"
22838
+ }),
22839
+ // sectionContainer (rb-container) already provides horizontal padding
22840
+ baseClass: "",
22841
+ spacing: "comfortable"
22842
+ })
22843
+ ];
22844
+ var eventListingDerivedFields = [
22845
+ {
22846
+ id: "layout",
22847
+ type: "select",
22848
+ required: false,
22849
+ multiple: false,
22850
+ options: [
22851
+ { value: "grid" },
22852
+ { value: "stack" }
22853
+ ]
22854
+ },
22855
+ {
22856
+ id: "paginationMode",
22857
+ type: "select",
22858
+ required: false,
22859
+ multiple: false,
22860
+ options: [
22861
+ { value: "loadMore" },
22862
+ { value: "seeAllLink" }
22863
+ ]
22864
+ }
22865
+ ];
22866
+ var eventListingContentShape = {
22867
+ additionalFields: eventListingDerivedFields,
22868
+ skipSectionStyles: true
22869
+ };
22870
+ var eventListingConfig = {
22252
22871
  id: "block.event-listing",
22253
22872
  version: "1.1.0",
22254
22873
  title: "Event Listing",
@@ -22256,211 +22875,18 @@ var eventListingManifest = createBlockManifest({
22256
22875
  description: "Paginated list of all upcoming events",
22257
22876
  // Preserve legacy section styles field configuration (renderInHeader: false).
22258
22877
  skipSectionStyles: true,
22259
- additionalFields: [
22260
- ...sectionHeaderFields("All Events"),
22261
- ...(() => {
22262
- const columns = columnsField(["2", "3", "4"]);
22263
- return [
22264
- {
22265
- ...layoutField,
22266
- ui: { ...layoutField.ui ?? {}, intent: "display" }
22267
- },
22268
- {
22269
- ...columns,
22270
- ui: { ...columns.ui ?? {}, intent: "display" }
22271
- }
22272
- ];
22273
- })(),
22274
- {
22275
- id: "eventsPerPage",
22276
- type: "select",
22277
- label: "Events per page",
22278
- description: "Number of events to load at a time",
22279
- required: false,
22280
- multiple: false,
22281
- defaultValue: "12",
22282
- options: [
22283
- { value: "3", label: "3 events" },
22284
- { value: "6", label: "6 events" },
22285
- { value: "12", label: "12 events" },
22286
- { value: "24", label: "24 events" }
22287
- ],
22288
- ui: { intent: "display" }
22289
- },
22290
- {
22291
- id: "paginationMode",
22292
- type: "select",
22293
- label: "More events",
22294
- description: "How to access events beyond the initial list",
22295
- required: false,
22296
- multiple: false,
22297
- defaultValue: "loadMore",
22298
- options: [
22299
- { value: "loadMore", label: "Load more button" },
22300
- { value: "seeAllLink", label: "Link to another page" }
22301
- ],
22302
- ui: { intent: "display" }
22303
- },
22304
- {
22305
- id: "seeAllUrl",
22306
- type: "link",
22307
- label: "See all destination",
22308
- required: false,
22309
- ui: {
22310
- intent: "display",
22311
- visibleWhen: {
22312
- field: "paginationMode",
22313
- equals: "seeAllLink"
22314
- }
22315
- }
22316
- },
22317
- {
22318
- id: "loadMoreText",
22319
- type: "text",
22320
- label: "Button text",
22321
- description: "Text for the pagination button or link",
22322
- required: false,
22323
- multiline: false,
22324
- defaultValue: "Load more events",
22325
- maxLength: 40
22326
- },
22327
- ...cardStylingFields.map((field) => ({
22328
- ...field,
22329
- ui: { ...field.ui ?? {}, intent: "style" }
22330
- })),
22331
- ...eventDisplayFields.map((field) => ({
22332
- ...field,
22333
- ui: { ...field.ui ?? {}, intent: "display" }
22334
- })),
22335
- {
22336
- id: "kind",
22337
- type: "select",
22338
- label: "Show",
22339
- description: "Choose whether this list shows courses, events, or both",
22340
- required: false,
22341
- multiple: false,
22342
- defaultValue: "all",
22343
- options: [
22344
- { value: "all", label: "Courses and events" },
22345
- { value: "courses", label: "Courses only" },
22346
- { value: "events", label: "Events only" }
22347
- ],
22348
- ui: { intent: "behavior" }
22349
- },
22350
- {
22351
- id: "eventSurface",
22352
- type: "select",
22353
- label: "Event surface",
22354
- description: "Choose a semantic event scope",
22355
- required: false,
22356
- multiple: false,
22357
- defaultValue: "all",
22358
- options: [
22359
- { value: "all", label: "All events" },
22360
- { value: "regularClassSchedule", label: "Regular class schedule" },
22361
- { value: "specialDatedEvents", label: "Workshops and special events" },
22362
- { value: "custom", label: "Custom" }
22363
- ],
22364
- ui: { intent: "behavior" }
22365
- },
22366
- {
22367
- id: "filterEventPresets",
22368
- type: "select",
22369
- label: "Pre-filter by event type",
22370
- description: "Restrict this block to specific event types",
22371
- required: false,
22372
- multiple: true,
22373
- defaultValue: [],
22374
- options: [
22375
- { value: "class", label: "Classes" },
22376
- { value: "workshop", label: "Workshops" },
22377
- { value: "retreat", label: "Retreats" },
22378
- { value: "performance", label: "Performances" }
22379
- ],
22380
- ui: {
22381
- intent: "behavior",
22382
- visibleWhen: { field: "eventSurface", equals: "custom" }
22383
- }
22384
- },
22385
- {
22386
- id: "scheduleScope",
22387
- type: "select",
22388
- label: "Schedule cadence",
22389
- description: "Restrict this block by recurrence",
22390
- required: false,
22391
- multiple: false,
22392
- defaultValue: "any",
22393
- options: [
22394
- { value: "any", label: "Any cadence" },
22395
- { value: "recurring", label: "Recurring only" },
22396
- { value: "oneOff", label: "One-off only" }
22397
- ],
22398
- ui: {
22399
- intent: "behavior",
22400
- visibleWhen: { field: "eventSurface", equals: "custom" }
22401
- }
22402
- },
22403
- {
22404
- ...emptyStateField,
22405
- ui: { ...emptyStateField.ui ?? {}, intent: "display" }
22406
- },
22407
- sectionStylesField({
22408
- id: "_sectionStyles",
22409
- label: "Section styles",
22410
- renderInHeader: false
22411
- })
22412
- ],
22878
+ additionalFields: eventListingAdditionalFields,
22413
22879
  styleTokens: { background: "surface", typography: "body", spacing: "md" },
22414
22880
  behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: true },
22415
22881
  category: "interactive",
22416
22882
  tags: ["events", "listing", "paginated", "archive", "all-events"],
22417
22883
  icon: "List",
22418
- layout: [
22419
- styledSection({
22420
- children: sectionContainer([
22421
- // Optional heading
22422
- text(
22423
- { as: "h2" },
22424
- bind("content.heading"),
22425
- when("content.heading")
22426
- ),
22427
- // Optional description
22428
- richText(
22429
- { className: "rb-prose rb-max-w-none" },
22430
- bind("content.description"),
22431
- when("content.description")
22432
- ),
22433
- // Event listing component with pagination
22434
- el("event-listing", withApiBindings({
22435
- events: { $bind: { from: "data.events" } },
22436
- stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
22437
- layout: { $bind: { from: "content.layout", fallback: "grid" } },
22438
- columns: { $bind: { from: "content.columns", fallback: "3" } },
22439
- eventsPerPage: { $bind: { from: "content.eventsPerPage", fallback: "12" } },
22440
- paginationMode: { $bind: { from: "content.paginationMode", fallback: "loadMore" } },
22441
- seeAllUrl: { $bind: { from: "content.seeAllUrl", transforms: [{ id: "links.resolve" }] } },
22442
- loadMoreText: { $bind: { from: "content.loadMoreText", fallback: "Load more events" } },
22443
- cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
22444
- buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
22445
- buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
22446
- showVenue: { $bind: { from: "content.showVenue" } },
22447
- showMap: { $bind: { from: "content.showMap" } },
22448
- showCapacity: { $bind: { from: "content.showCapacity" } },
22449
- eventKind: { $bind: { from: "content.kind", fallback: "all" } },
22450
- eventSurface: { $bind: { from: "content.eventSurface", fallback: "all" } },
22451
- filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
22452
- scheduleScope: { $bind: { from: "content.scheduleScope", fallback: "any" } },
22453
- emptyMessage: { $bind: { from: "content.emptyMessage" } }
22454
- }))
22455
- ], {
22456
- gap: "lg"
22457
- }),
22458
- // sectionContainer (rb-container) already provides horizontal padding
22459
- baseClass: "",
22460
- spacing: "comfortable"
22461
- })
22462
- ]
22463
- });
22884
+ layout: eventListingLayout
22885
+ };
22886
+ var eventListingManifest = createBlockManifestWithContentShape(
22887
+ eventListingConfig,
22888
+ eventListingContentShape
22889
+ );
22464
22890
  var eventListingBlockDefinition = {
22465
22891
  manifest: eventListingManifest,
22466
22892
  runtime: eventListingBlockRuntime,
@@ -22487,7 +22913,6 @@ var eventListingBlockDefinition = {
22487
22913
 
22488
22914
  // ../blocks/src/system/runtime/nodes/events/EventCalendar.interactive.ts
22489
22915
  import { z as z51 } from "zod";
22490
- var displayModeSchema = z51.enum(["combined", "month", "week", "list", "timetable"]);
22491
22916
  var eventBlockKindSchema2 = z51.enum(eventBlockKindValues);
22492
22917
  var eventSurfaceScopeSchema2 = z51.enum(eventSurfaceScopeValues);
22493
22918
  var eventScheduleScopeSchema3 = z51.enum(eventScheduleScopeValues);
@@ -22497,7 +22922,8 @@ var eventCalendarSourceSchema = z51.object(
22497
22922
  siteId: z51.string(),
22498
22923
  apiBaseUrl: z51.string().optional(),
22499
22924
  stage: previewStageSchema.optional(),
22500
- displayMode: displayModeSchema.nullable().optional(),
22925
+ variant: eventCalendarDisplayModeSchema.nullable().optional(),
22926
+ displayMode: eventCalendarDisplayModeSchema.nullable().optional(),
22501
22927
  listLayout: eventLayoutSchema.optional(),
22502
22928
  listColumns: columnOptionSchema.optional(),
22503
22929
  layout: eventLayoutSchema.optional(),
@@ -22529,7 +22955,7 @@ var eventCalendarSourceSchema = z51.object(
22529
22955
  );
22530
22956
  var eventCalendarDisplaySchema = z51.object({
22531
22957
  kind: z51.literal("event-calendar"),
22532
- displayMode: displayModeSchema,
22958
+ displayMode: eventCalendarDisplayModeSchema,
22533
22959
  className: z51.string().nullable(),
22534
22960
  events: z51.array(publicEventSchema),
22535
22961
  listLayout: eventLayoutSchema,
@@ -22584,7 +23010,7 @@ var eventCalendarIslandMetaKeys = defineInteractiveIslandMetaKeys(
22584
23010
  function buildEventCalendarDisplay(source) {
22585
23011
  return {
22586
23012
  kind: "event-calendar",
22587
- displayMode: source.displayMode ?? "combined",
23013
+ displayMode: source.variant ?? source.displayMode ?? "combined",
22588
23014
  className: source.className ?? null,
22589
23015
  events: (source.events ?? []).slice().sort(
22590
23016
  (left, right) => new Date(left.startsAt).getTime() - new Date(right.startsAt).getTime()
@@ -22651,8 +23077,12 @@ var eventCalendarInteractiveIslandPropsCodec = createInteractiveIslandCodec({
22651
23077
  function normalizeEventCalendarContent(content) {
22652
23078
  const record = typeof content === "object" && content !== null ? content : {};
22653
23079
  const kind = normalizeEventBlockKind(record.kind);
23080
+ const variant = normalizeEventCalendarDisplayMode(record.variant) ?? normalizeEventCalendarDisplayMode(record.displayMode);
22654
23081
  return {
22655
23082
  ...record,
23083
+ ...variant ? { variant } : {},
23084
+ displayMode: normalizeEventCalendarDisplayMode(record.displayMode),
23085
+ listLayout: normalizeEventCalendarListLayout(record.listLayout),
22656
23086
  kind,
22657
23087
  eventSurface: normalizeEventSurfaceScope(record.eventSurface),
22658
23088
  filterEventPresets: normalizeEventSurfacePresets(record.filterEventPresets),
@@ -22664,355 +23094,515 @@ function normalizeEventCalendarContent(content) {
22664
23094
  filterVenueId: normalizeEventVenueId(record.filterVenueId)
22665
23095
  };
22666
23096
  }
22667
- var eventCalendarManifest = createBlockManifest({
22668
- id: "block.event-calendar",
22669
- version: "3.6.0",
22670
- title: "Event Calendar",
22671
- titleSource: "heading",
22672
- description: "Display events with calendar, list, or combined views with filtering",
22673
- // Preserve legacy section styles field configuration (renderInHeader: false).
22674
- skipSectionStyles: true,
22675
- additionalFields: [
22676
- ...sectionHeaderFields("Event Calendar"),
22677
- // Display Mode (replaces calendarView)
22678
- {
22679
- id: "displayMode",
22680
- type: "select",
22681
- label: "Display mode",
22682
- description: "How events are displayed",
22683
- required: false,
22684
- multiple: false,
22685
- defaultValue: "combined",
22686
- options: [
22687
- { value: "combined", label: "Combined (List + Calendar tabs)" },
22688
- { value: "month", label: "Month calendar" },
22689
- { value: "week", label: "Week agenda" },
22690
- { value: "timetable", label: "Timetable" },
22691
- { value: "list", label: "List" }
22692
- ],
22693
- ui: { intent: "display" }
22694
- },
22695
- // List options (visible when displayMode is list or combined)
22696
- {
22697
- id: "listLayout",
22698
- type: "select",
22699
- label: "List layout",
22700
- description: "Layout style for list view",
22701
- required: false,
22702
- multiple: false,
22703
- defaultValue: "stack",
22704
- options: [
22705
- { value: "stack", label: "Stack (full-width cards)" },
22706
- { value: "grid", label: "Grid" },
22707
- { value: "compact", label: "Compact (dense rows)" }
22708
- ],
22709
- ui: {
22710
- intent: "display",
22711
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list"] }
22712
- }
22713
- },
22714
- {
22715
- id: "listColumns",
22716
- type: "select",
22717
- label: "Grid columns",
22718
- description: "Number of columns in grid layout",
22719
- required: false,
22720
- multiple: false,
22721
- defaultValue: "3",
22722
- options: [
22723
- { value: "2", label: "2 columns" },
22724
- { value: "3", label: "3 columns" },
22725
- { value: "4", label: "4 columns" }
22726
- ],
22727
- ui: {
22728
- intent: "display",
22729
- visibleWhen: { field: "listLayout", equals: "grid" }
22730
- }
22731
- },
22732
- {
22733
- id: "eventsPerPage",
22734
- type: "select",
22735
- label: "Events per page (cards)",
22736
- description: "Number of events to load initially in card layouts",
22737
- required: false,
22738
- multiple: false,
22739
- defaultValue: "12",
22740
- options: [
22741
- { value: "6", label: "6" },
22742
- { value: "12", label: "12" },
22743
- { value: "24", label: "24" }
22744
- ],
22745
- ui: {
22746
- intent: "display",
22747
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list"] }
22748
- }
22749
- },
22750
- {
22751
- id: "compactEventsPerPage",
22752
- type: "select",
22753
- label: "Events per page (compact)",
22754
- description: "Number of events to show per page in compact layout",
22755
- required: false,
22756
- multiple: false,
22757
- defaultValue: "10",
22758
- options: [
22759
- { value: "10", label: "10" },
22760
- { value: "20", label: "20" },
22761
- { value: "30", label: "30" }
22762
- ],
22763
- ui: {
22764
- intent: "display",
22765
- visibleWhen: { field: "listLayout", equals: "compact" }
22766
- }
22767
- },
22768
- {
22769
- id: "loadMoreText",
22770
- type: "text",
22771
- label: "Load more button text",
22772
- description: "Text for the load more button",
22773
- required: false,
22774
- multiline: false,
22775
- defaultValue: "Load more events",
22776
- ui: {
22777
- intent: "content",
22778
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list"] }
22779
- }
22780
- },
22781
- // Calendar options
22782
- {
22783
- id: "startOfWeek",
22784
- type: "select",
22785
- label: "Week starts on",
22786
- description: "First day of the week",
22787
- required: false,
22788
- multiple: false,
22789
- defaultValue: "monday",
22790
- options: [
22791
- { value: "sunday", label: "Sunday" },
22792
- { value: "monday", label: "Monday" }
22793
- ],
22794
- ui: {
22795
- intent: "display",
22796
- visibleWhen: {
22797
- field: "displayMode",
22798
- oneOf: ["combined", "month", "week"]
22799
- }
22800
- }
22801
- },
22802
- // Combined mode options
22803
- {
22804
- id: "calendarTabViews",
22805
- type: "select",
22806
- label: "Calendar tab views",
22807
- description: "Which calendar views to show in the Calendar tab",
22808
- required: false,
22809
- multiple: false,
22810
- defaultValue: "both",
22811
- options: [
22812
- { value: "both", label: "Month + Week toggle" },
22813
- { value: "month", label: "Month only" },
22814
- { value: "week", label: "Week only" }
22815
- ],
22816
- ui: {
22817
- intent: "display",
22818
- visibleWhen: { field: "displayMode", equals: "combined" }
22819
- }
22820
- },
22821
- // Filtering options
22822
- {
22823
- id: "kind",
22824
- type: "select",
22825
- label: "Show",
22826
- description: "Restrict this block to all offerings, courses, or events",
22827
- required: false,
22828
- multiple: false,
22829
- defaultValue: "all",
22830
- options: [
22831
- { value: "all", label: "All offerings" },
22832
- { value: "courses", label: "Courses only" },
22833
- { value: "events", label: "Events only" }
22834
- ],
22835
- ui: { intent: "behavior" }
22836
- },
22837
- {
22838
- id: "showFilters",
22839
- type: "boolean",
22840
- label: "Show filters",
22841
- description: "Show category, staff, and venue filters",
22842
- required: false,
22843
- defaultValue: true,
22844
- ui: {
22845
- intent: "display",
22846
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
22847
- }
22848
- },
22849
- {
22850
- id: "showCategoryFilter",
22851
- type: "select",
22852
- label: "Show category filter",
22853
- description: "When to show the category filter dropdown",
22854
- required: false,
22855
- multiple: false,
22856
- defaultValue: "auto",
22857
- options: [
22858
- { value: "auto", label: "Auto (when >1 category has events)" },
22859
- { value: "always", label: "Always" },
22860
- { value: "never", label: "Never" }
23097
+ function normalizeEventCalendarDisplayMode(value) {
23098
+ return isEventCalendarDisplayMode(value) ? value : void 0;
23099
+ }
23100
+ function normalizeEventCalendarListLayout(value) {
23101
+ return isEventCalendarListLayout(value) ? value : void 0;
23102
+ }
23103
+ var eventCalendarLayout = [
23104
+ styledSection({
23105
+ children: sectionContainer(
23106
+ [
23107
+ // Optional heading
23108
+ text({ as: "h2" }, bind("content.heading"), when("content.heading")),
23109
+ // Optional description
23110
+ richText(
23111
+ { className: "rb-prose rb-max-w-none" },
23112
+ bind("content.description"),
23113
+ when("content.description")
23114
+ ),
23115
+ // Event calendar component (handles all display modes)
23116
+ el(
23117
+ "event-calendar",
23118
+ withApiBindings({
23119
+ events: { $bind: { from: "data.events" } },
23120
+ stage: {
23121
+ $bind: { from: "$root.previewStage", fallback: "published" }
23122
+ },
23123
+ // Variant is the new Theme V2-facing display mode. displayMode is
23124
+ // retained as a legacy fallback for existing content.
23125
+ variant: {
23126
+ $bind: { from: "content.variant" }
23127
+ },
23128
+ displayMode: {
23129
+ $bind: { from: "content.displayMode" }
23130
+ },
23131
+ // List options
23132
+ listLayout: { $bind: { from: "content.listLayout" } },
23133
+ listColumns: { $bind: { from: "content.listColumns" } },
23134
+ // Legacy compatibility: older event-calendar content used layout/columns
23135
+ layout: { $bind: { from: "content.layout" } },
23136
+ columns: { $bind: { from: "content.columns" } },
23137
+ eventsPerPage: {
23138
+ $bind: { from: "content.eventsPerPage", fallback: "12" }
23139
+ },
23140
+ compactEventsPerPage: {
23141
+ $bind: { from: "content.compactEventsPerPage", fallback: "10" }
23142
+ },
23143
+ loadMoreText: {
23144
+ $bind: {
23145
+ from: "content.loadMoreText",
23146
+ fallback: "Load more events"
23147
+ }
23148
+ },
23149
+ // Calendar options
23150
+ startOfWeek: {
23151
+ $bind: { from: "content.startOfWeek", fallback: "monday" }
23152
+ },
23153
+ calendarTabViews: {
23154
+ $bind: { from: "content.calendarTabViews", fallback: "both" }
23155
+ },
23156
+ // Filtering options
23157
+ showFilters: {
23158
+ $bind: { from: "content.showFilters", fallback: true }
23159
+ },
23160
+ showCategoryFilter: {
23161
+ $bind: { from: "content.showCategoryFilter", fallback: "auto" }
23162
+ },
23163
+ showVenueFilter: {
23164
+ $bind: { from: "content.showVenueFilter", fallback: false }
23165
+ },
23166
+ showStaffFilter: {
23167
+ $bind: { from: "content.showStaffFilter", fallback: true }
23168
+ },
23169
+ showCapacity: {
23170
+ $bind: { from: "content.showCapacity", fallback: true }
23171
+ },
23172
+ kind: { $bind: { from: "content.kind", fallback: "all" } },
23173
+ eventSurface: {
23174
+ $bind: { from: "content.eventSurface", fallback: "all" }
23175
+ },
23176
+ filterEventPresets: {
23177
+ $bind: { from: "content.filterEventPresets" }
23178
+ },
23179
+ scheduleScope: {
23180
+ $bind: { from: "content.scheduleScope", fallback: "any" }
23181
+ },
23182
+ filterCategoryIds: {
23183
+ $bind: { from: "content.filterCategoryIds" }
23184
+ },
23185
+ filterStaffMemberId: {
23186
+ $bind: { from: "content.filterStaffMemberId" }
23187
+ },
23188
+ filterVenueId: { $bind: { from: "content.filterVenueId" } },
23189
+ // Styling
23190
+ buttonVariant: {
23191
+ $bind: { from: "content.buttonVariant", fallback: "primary" }
23192
+ },
23193
+ buttonText: {
23194
+ $bind: { from: "content.buttonText", fallback: "View event" }
23195
+ },
23196
+ emptyMessage: { $bind: { from: "content.emptyMessage" } }
23197
+ })
23198
+ )
22861
23199
  ],
22862
- ui: {
22863
- intent: "display",
22864
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
22865
- }
22866
- },
22867
- {
22868
- id: "showVenueFilter",
22869
- type: "boolean",
22870
- label: "Show venue filter",
22871
- description: "Show venue filter dropdown",
22872
- required: false,
22873
- defaultValue: false,
22874
- ui: {
22875
- intent: "display",
22876
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
22877
- }
22878
- },
22879
- {
22880
- id: "showStaffFilter",
22881
- type: "boolean",
22882
- label: "Show staff filter",
22883
- description: "Show staff filter dropdown",
22884
- required: false,
22885
- defaultValue: true,
22886
- ui: {
22887
- intent: "display",
22888
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
22889
- }
22890
- },
22891
- {
22892
- id: "showCapacity",
22893
- type: "boolean",
22894
- label: "Show available spots",
22895
- description: "Display remaining capacity on event cards and timetable cells",
22896
- required: false,
22897
- defaultValue: true,
22898
- ui: {
22899
- intent: "display",
22900
- visibleWhen: {
22901
- field: "displayMode",
22902
- oneOf: ["combined", "list", "week", "timetable"]
22903
- }
23200
+ {
23201
+ gap: "lg"
22904
23202
  }
22905
- },
22906
- // Block-level pre-filtering
22907
- {
22908
- id: "eventSurface",
22909
- type: "select",
22910
- label: "Event surface",
22911
- description: "Choose a semantic event scope",
22912
- required: false,
22913
- multiple: false,
22914
- defaultValue: "all",
22915
- options: [
22916
- { value: "all", label: "All events" },
22917
- { value: "regularClassSchedule", label: "Regular class schedule" },
22918
- { value: "specialDatedEvents", label: "Workshops and special events" },
22919
- { value: "custom", label: "Custom" }
22920
- ],
22921
- ui: { intent: "behavior" }
22922
- },
22923
- {
22924
- id: "filterEventPresets",
22925
- type: "select",
22926
- label: "Pre-filter by event type",
22927
- description: "Restrict this block to specific event types",
22928
- required: false,
22929
- multiple: true,
22930
- defaultValue: [],
22931
- options: [
22932
- { value: "class", label: "Classes" },
22933
- { value: "workshop", label: "Workshops" },
22934
- { value: "retreat", label: "Retreats" },
22935
- { value: "performance", label: "Performances" }
22936
- ],
22937
- ui: {
22938
- intent: "behavior",
22939
- visibleWhen: { field: "eventSurface", equals: "custom" }
23203
+ ),
23204
+ // sectionContainer (rb-container) already provides horizontal padding
23205
+ baseClass: "",
23206
+ spacing: "comfortable"
23207
+ })
23208
+ ];
23209
+ var eventCalendarAdditionalFields = [
23210
+ ...sectionHeaderFields("Event Calendar"),
23211
+ // Display Mode (replaces calendarView)
23212
+ {
23213
+ id: "displayMode",
23214
+ type: "select",
23215
+ label: "Display mode",
23216
+ description: "How events are displayed",
23217
+ required: false,
23218
+ multiple: false,
23219
+ defaultValue: "combined",
23220
+ options: [
23221
+ { value: "combined", label: "Combined (List + Calendar tabs)" },
23222
+ { value: "month", label: "Month calendar" },
23223
+ { value: "week", label: "Week agenda" },
23224
+ { value: "timetable", label: "Timetable" },
23225
+ { value: "list", label: "List" }
23226
+ ],
23227
+ ui: { intent: "display", hidden: true }
23228
+ },
23229
+ // List options (visible when displayMode is list or combined)
23230
+ {
23231
+ id: "listLayout",
23232
+ type: "select",
23233
+ label: "List layout",
23234
+ description: "Layout style for list view",
23235
+ required: false,
23236
+ multiple: false,
23237
+ defaultValue: "stack",
23238
+ options: eventCalendarListLayoutOptions.map((option) => ({
23239
+ value: option.id,
23240
+ label: option.label
23241
+ })),
23242
+ ui: {
23243
+ intent: "display",
23244
+ visibleWhen: { field: "variant", oneOf: ["combined", "list"] }
23245
+ }
23246
+ },
23247
+ {
23248
+ id: "listColumns",
23249
+ type: "select",
23250
+ label: "Grid columns",
23251
+ description: "Number of columns in grid layout",
23252
+ required: false,
23253
+ multiple: false,
23254
+ defaultValue: "3",
23255
+ options: [
23256
+ { value: "2", label: "2 columns" },
23257
+ { value: "3", label: "3 columns" },
23258
+ { value: "4", label: "4 columns" }
23259
+ ],
23260
+ ui: {
23261
+ intent: "display",
23262
+ visibleWhen: { field: "listLayout", equals: "grid" }
23263
+ }
23264
+ },
23265
+ {
23266
+ id: "eventsPerPage",
23267
+ type: "select",
23268
+ label: "Events per page (cards)",
23269
+ description: "Number of events to load initially in card layouts",
23270
+ required: false,
23271
+ multiple: false,
23272
+ defaultValue: "12",
23273
+ options: [
23274
+ { value: "6", label: "6" },
23275
+ { value: "12", label: "12" },
23276
+ { value: "24", label: "24" }
23277
+ ],
23278
+ ui: {
23279
+ intent: "display",
23280
+ visibleWhen: { field: "variant", oneOf: ["combined", "list"] }
23281
+ }
23282
+ },
23283
+ {
23284
+ id: "compactEventsPerPage",
23285
+ type: "select",
23286
+ label: "Events per page (compact)",
23287
+ description: "Number of events to show per page in compact layout",
23288
+ required: false,
23289
+ multiple: false,
23290
+ defaultValue: "10",
23291
+ options: [
23292
+ { value: "10", label: "10" },
23293
+ { value: "20", label: "20" },
23294
+ { value: "30", label: "30" }
23295
+ ],
23296
+ ui: {
23297
+ intent: "display",
23298
+ visibleWhen: { field: "listLayout", equals: "compact" }
23299
+ }
23300
+ },
23301
+ {
23302
+ id: "loadMoreText",
23303
+ type: "text",
23304
+ label: "Load more button text",
23305
+ description: "Text for the load more button",
23306
+ required: false,
23307
+ multiline: false,
23308
+ defaultValue: "Load more events",
23309
+ ui: {
23310
+ intent: "content",
23311
+ visibleWhen: { field: "variant", oneOf: ["combined", "list"] }
23312
+ }
23313
+ },
23314
+ // Calendar options
23315
+ {
23316
+ id: "startOfWeek",
23317
+ type: "select",
23318
+ label: "Week starts on",
23319
+ description: "First day of the week",
23320
+ required: false,
23321
+ multiple: false,
23322
+ defaultValue: "monday",
23323
+ options: [
23324
+ { value: "sunday", label: "Sunday" },
23325
+ { value: "monday", label: "Monday" }
23326
+ ],
23327
+ ui: {
23328
+ intent: "display",
23329
+ visibleWhen: {
23330
+ field: "variant",
23331
+ oneOf: ["combined", "month", "week"]
22940
23332
  }
22941
- },
22942
- {
22943
- id: "scheduleScope",
22944
- type: "select",
22945
- label: "Schedule cadence",
22946
- description: "Restrict this block by recurrence",
22947
- required: false,
22948
- multiple: false,
22949
- defaultValue: "any",
22950
- options: [
22951
- { value: "any", label: "Any cadence" },
22952
- { value: "recurring", label: "Recurring only" },
22953
- { value: "oneOff", label: "One-off only" }
22954
- ],
22955
- ui: {
22956
- intent: "behavior",
22957
- visibleWhen: { field: "eventSurface", equals: "custom" }
23333
+ }
23334
+ },
23335
+ // Combined mode options
23336
+ {
23337
+ id: "calendarTabViews",
23338
+ type: "select",
23339
+ label: "Calendar tab views",
23340
+ description: "Which calendar views to show in the Calendar tab",
23341
+ required: false,
23342
+ multiple: false,
23343
+ defaultValue: "both",
23344
+ options: [
23345
+ { value: "both", label: "Month + Week toggle" },
23346
+ { value: "month", label: "Month only" },
23347
+ { value: "week", label: "Week only" }
23348
+ ],
23349
+ ui: {
23350
+ intent: "display",
23351
+ visibleWhen: { field: "variant", equals: "combined" }
23352
+ }
23353
+ },
23354
+ // Filtering options
23355
+ {
23356
+ id: "kind",
23357
+ type: "select",
23358
+ label: "Show",
23359
+ description: "Restrict this block to all offerings, courses, or events",
23360
+ required: false,
23361
+ multiple: false,
23362
+ defaultValue: "all",
23363
+ options: [
23364
+ { value: "all", label: "All offerings" },
23365
+ { value: "courses", label: "Courses only" },
23366
+ { value: "events", label: "Events only" }
23367
+ ],
23368
+ ui: { intent: "behavior" }
23369
+ },
23370
+ {
23371
+ id: "showFilters",
23372
+ type: "boolean",
23373
+ label: "Show filters",
23374
+ description: "Show category, staff, and venue filters",
23375
+ required: false,
23376
+ defaultValue: true,
23377
+ ui: {
23378
+ intent: "display",
23379
+ visibleWhen: {
23380
+ field: "variant",
23381
+ oneOf: ["combined", "list", "timetable"]
22958
23382
  }
22959
- },
22960
- createSiteOptionSelectField({
22961
- id: "filterCategoryIds",
22962
- label: "Pre-filter by categories",
22963
- description: "Restrict this block to specific event categories",
22964
- required: false,
22965
- multiple: true,
22966
- defaultValue: [],
22967
- optionSource: "eventCategories",
22968
- ui: {
22969
- intent: "behavior",
22970
- searchThreshold: 8,
22971
- visibleWhen: { field: "kind", notEquals: "courses" }
23383
+ }
23384
+ },
23385
+ {
23386
+ id: "showCategoryFilter",
23387
+ type: "select",
23388
+ label: "Show category filter",
23389
+ description: "When to show the category filter dropdown",
23390
+ required: false,
23391
+ multiple: false,
23392
+ defaultValue: "auto",
23393
+ options: [
23394
+ { value: "auto", label: "Auto (when >1 category has events)" },
23395
+ { value: "always", label: "Always" },
23396
+ { value: "never", label: "Never" }
23397
+ ],
23398
+ ui: {
23399
+ intent: "display",
23400
+ visibleWhen: {
23401
+ field: "variant",
23402
+ oneOf: ["combined", "list", "timetable"]
22972
23403
  }
22973
- }),
22974
- createSiteOptionSelectField({
22975
- id: "filterStaffMemberId",
22976
- label: "Pre-filter by staff member",
22977
- description: "Restrict this block to a single staff member",
22978
- required: false,
22979
- multiple: false,
22980
- optionSource: "staffMembers",
22981
- ui: {
22982
- intent: "behavior",
22983
- searchThreshold: 8
23404
+ }
23405
+ },
23406
+ {
23407
+ id: "showVenueFilter",
23408
+ type: "boolean",
23409
+ label: "Show venue filter",
23410
+ description: "Show venue filter dropdown",
23411
+ required: false,
23412
+ defaultValue: false,
23413
+ ui: {
23414
+ intent: "display",
23415
+ visibleWhen: {
23416
+ field: "variant",
23417
+ oneOf: ["combined", "list", "timetable"]
22984
23418
  }
22985
- }),
22986
- createSiteOptionSelectField({
22987
- id: "filterVenueId",
22988
- label: "Pre-filter by venue",
22989
- description: "Restrict this block to a single venue",
22990
- required: false,
22991
- multiple: false,
22992
- optionSource: "venues",
22993
- ui: {
22994
- intent: "behavior",
22995
- searchThreshold: 8
23419
+ }
23420
+ },
23421
+ {
23422
+ id: "showStaffFilter",
23423
+ type: "boolean",
23424
+ label: "Show staff filter",
23425
+ description: "Show staff filter dropdown",
23426
+ required: false,
23427
+ defaultValue: true,
23428
+ ui: {
23429
+ intent: "display",
23430
+ visibleWhen: {
23431
+ field: "variant",
23432
+ oneOf: ["combined", "list", "timetable"]
22996
23433
  }
22997
- }),
22998
- // Card styling
22999
- ...cardStylingFields.filter((f) => f.id === "buttonVariant" || f.id === "buttonText").map((field) => ({
23000
- ...field,
23001
- ui: {
23002
- ...field.ui ?? {},
23003
- intent: field.id === "buttonVariant" ? "style" : "content"
23434
+ }
23435
+ },
23436
+ {
23437
+ id: "showCapacity",
23438
+ type: "boolean",
23439
+ label: "Show available spots",
23440
+ description: "Display remaining capacity on event cards and timetable cells",
23441
+ required: false,
23442
+ defaultValue: true,
23443
+ ui: {
23444
+ intent: "display",
23445
+ visibleWhen: {
23446
+ field: "variant",
23447
+ oneOf: ["combined", "list", "week", "timetable"]
23004
23448
  }
23005
- })),
23006
- {
23007
- ...emptyStateField,
23008
- ui: { ...emptyStateField.ui ?? {}, intent: "display" }
23009
- },
23010
- sectionStylesField({
23011
- id: "_sectionStyles",
23012
- label: "Section styles",
23013
- renderInHeader: false
23014
- })
23015
- ],
23449
+ }
23450
+ },
23451
+ // Block-level pre-filtering
23452
+ {
23453
+ id: "eventSurface",
23454
+ type: "select",
23455
+ label: "Event surface",
23456
+ description: "Choose a semantic event scope",
23457
+ required: false,
23458
+ multiple: false,
23459
+ defaultValue: "all",
23460
+ options: [
23461
+ { value: "all", label: "All events" },
23462
+ { value: "regularClassSchedule", label: "Regular class schedule" },
23463
+ { value: "specialDatedEvents", label: "Workshops and special events" },
23464
+ { value: "custom", label: "Custom" }
23465
+ ],
23466
+ ui: { intent: "behavior" }
23467
+ },
23468
+ {
23469
+ id: "filterEventPresets",
23470
+ type: "select",
23471
+ label: "Pre-filter by event type",
23472
+ description: "Restrict this block to specific event types",
23473
+ required: false,
23474
+ multiple: true,
23475
+ defaultValue: [],
23476
+ options: [
23477
+ { value: "class", label: "Classes" },
23478
+ { value: "workshop", label: "Workshops" },
23479
+ { value: "retreat", label: "Retreats" },
23480
+ { value: "performance", label: "Performances" }
23481
+ ],
23482
+ ui: {
23483
+ intent: "behavior",
23484
+ visibleWhen: { field: "eventSurface", equals: "custom" }
23485
+ }
23486
+ },
23487
+ {
23488
+ id: "scheduleScope",
23489
+ type: "select",
23490
+ label: "Schedule cadence",
23491
+ description: "Restrict this block by recurrence",
23492
+ required: false,
23493
+ multiple: false,
23494
+ defaultValue: "any",
23495
+ options: [
23496
+ { value: "any", label: "Any cadence" },
23497
+ { value: "recurring", label: "Recurring only" },
23498
+ { value: "oneOff", label: "One-off only" }
23499
+ ],
23500
+ ui: {
23501
+ intent: "behavior",
23502
+ visibleWhen: { field: "eventSurface", equals: "custom" }
23503
+ }
23504
+ },
23505
+ createSiteOptionSelectField({
23506
+ id: "filterCategoryIds",
23507
+ label: "Pre-filter by categories",
23508
+ description: "Restrict this block to specific event categories",
23509
+ required: false,
23510
+ multiple: true,
23511
+ defaultValue: [],
23512
+ optionSource: "eventCategories",
23513
+ ui: {
23514
+ intent: "behavior",
23515
+ searchThreshold: 8,
23516
+ visibleWhen: { field: "kind", notEquals: "courses" }
23517
+ }
23518
+ }),
23519
+ createSiteOptionSelectField({
23520
+ id: "filterStaffMemberId",
23521
+ label: "Pre-filter by staff member",
23522
+ description: "Restrict this block to a single staff member",
23523
+ required: false,
23524
+ multiple: false,
23525
+ optionSource: "staffMembers",
23526
+ ui: {
23527
+ intent: "behavior",
23528
+ searchThreshold: 8
23529
+ }
23530
+ }),
23531
+ createSiteOptionSelectField({
23532
+ id: "filterVenueId",
23533
+ label: "Pre-filter by venue",
23534
+ description: "Restrict this block to a single venue",
23535
+ required: false,
23536
+ multiple: false,
23537
+ optionSource: "venues",
23538
+ ui: {
23539
+ intent: "behavior",
23540
+ searchThreshold: 8
23541
+ }
23542
+ }),
23543
+ // Card styling
23544
+ ...cardStylingFields.filter((f) => f.id === "buttonVariant" || f.id === "buttonText").map((field) => ({
23545
+ ...field,
23546
+ ui: {
23547
+ ...field.ui ?? {},
23548
+ intent: field.id === "buttonVariant" ? "style" : "content"
23549
+ }
23550
+ })),
23551
+ {
23552
+ ...emptyStateField,
23553
+ ui: { ...emptyStateField.ui ?? {}, intent: "display" }
23554
+ },
23555
+ sectionStylesField({
23556
+ id: "_sectionStyles",
23557
+ label: "Section styles",
23558
+ renderInHeader: false
23559
+ })
23560
+ ];
23561
+ var eventCalendarVariants = {
23562
+ combined: eventCalendarLayout[0],
23563
+ month: eventCalendarLayout[0],
23564
+ week: eventCalendarLayout[0],
23565
+ timetable: eventCalendarLayout[0],
23566
+ list: eventCalendarLayout[0]
23567
+ };
23568
+ var eventCalendarDerivedFields = [
23569
+ {
23570
+ id: "displayMode",
23571
+ type: "select",
23572
+ required: false,
23573
+ multiple: false,
23574
+ options: [
23575
+ { value: "combined" },
23576
+ { value: "month" },
23577
+ { value: "week" },
23578
+ { value: "timetable" },
23579
+ { value: "list" }
23580
+ ]
23581
+ },
23582
+ {
23583
+ id: "listLayout",
23584
+ type: "select",
23585
+ required: false,
23586
+ multiple: false,
23587
+ options: eventCalendarListLayoutOptions.map((option) => ({
23588
+ value: option.id
23589
+ }))
23590
+ }
23591
+ ];
23592
+ var eventCalendarContentShape = {
23593
+ additionalFields: eventCalendarDerivedFields,
23594
+ variants: eventCalendarVariants,
23595
+ skipSectionStyles: true
23596
+ };
23597
+ var eventCalendarConfig = {
23598
+ id: "block.event-calendar",
23599
+ version: "3.6.0",
23600
+ title: "Event Calendar",
23601
+ titleSource: "heading",
23602
+ description: "Display events with calendar, list, or combined views with filtering",
23603
+ // Preserve legacy section styles field configuration (renderInHeader: false).
23604
+ skipSectionStyles: true,
23605
+ additionalFields: eventCalendarAdditionalFields,
23016
23606
  styleTokens: { background: "surface", typography: "body", spacing: "md" },
23017
23607
  behaviours: {
23018
23608
  supportsThemeSwitching: true,
@@ -23032,109 +23622,21 @@ var eventCalendarManifest = createBlockManifest({
23032
23622
  "filter"
23033
23623
  ],
23034
23624
  icon: "CalendarDays",
23035
- layout: [
23036
- styledSection({
23037
- children: sectionContainer(
23038
- [
23039
- // Optional heading
23040
- text({ as: "h2" }, bind("content.heading"), when("content.heading")),
23041
- // Optional description
23042
- richText(
23043
- { className: "rb-prose rb-max-w-none" },
23044
- bind("content.description"),
23045
- when("content.description")
23046
- ),
23047
- // Event calendar component (handles all display modes)
23048
- el(
23049
- "event-calendar",
23050
- withApiBindings({
23051
- events: { $bind: { from: "data.events" } },
23052
- stage: {
23053
- $bind: { from: "$root.previewStage", fallback: "published" }
23054
- },
23055
- // Display mode
23056
- displayMode: {
23057
- $bind: { from: "content.displayMode", fallback: "combined" }
23058
- },
23059
- // List options
23060
- listLayout: { $bind: { from: "content.listLayout" } },
23061
- listColumns: { $bind: { from: "content.listColumns" } },
23062
- // Legacy compatibility: older event-calendar content used layout/columns
23063
- layout: { $bind: { from: "content.layout" } },
23064
- columns: { $bind: { from: "content.columns" } },
23065
- eventsPerPage: {
23066
- $bind: { from: "content.eventsPerPage", fallback: "12" }
23067
- },
23068
- compactEventsPerPage: {
23069
- $bind: { from: "content.compactEventsPerPage", fallback: "10" }
23070
- },
23071
- loadMoreText: {
23072
- $bind: {
23073
- from: "content.loadMoreText",
23074
- fallback: "Load more events"
23075
- }
23076
- },
23077
- // Calendar options
23078
- startOfWeek: {
23079
- $bind: { from: "content.startOfWeek", fallback: "monday" }
23080
- },
23081
- calendarTabViews: {
23082
- $bind: { from: "content.calendarTabViews", fallback: "both" }
23083
- },
23084
- // Filtering options
23085
- showFilters: {
23086
- $bind: { from: "content.showFilters", fallback: true }
23087
- },
23088
- showCategoryFilter: {
23089
- $bind: { from: "content.showCategoryFilter", fallback: "auto" }
23090
- },
23091
- showVenueFilter: {
23092
- $bind: { from: "content.showVenueFilter", fallback: false }
23093
- },
23094
- showStaffFilter: {
23095
- $bind: { from: "content.showStaffFilter", fallback: true }
23096
- },
23097
- showCapacity: {
23098
- $bind: { from: "content.showCapacity", fallback: true }
23099
- },
23100
- kind: { $bind: { from: "content.kind", fallback: "all" } },
23101
- eventSurface: {
23102
- $bind: { from: "content.eventSurface", fallback: "all" }
23103
- },
23104
- filterEventPresets: {
23105
- $bind: { from: "content.filterEventPresets" }
23106
- },
23107
- scheduleScope: {
23108
- $bind: { from: "content.scheduleScope", fallback: "any" }
23109
- },
23110
- filterCategoryIds: {
23111
- $bind: { from: "content.filterCategoryIds" }
23112
- },
23113
- filterStaffMemberId: {
23114
- $bind: { from: "content.filterStaffMemberId" }
23115
- },
23116
- filterVenueId: { $bind: { from: "content.filterVenueId" } },
23117
- // Styling
23118
- buttonVariant: {
23119
- $bind: { from: "content.buttonVariant", fallback: "primary" }
23120
- },
23121
- buttonText: {
23122
- $bind: { from: "content.buttonText", fallback: "View event" }
23123
- },
23124
- emptyMessage: { $bind: { from: "content.emptyMessage" } }
23125
- })
23126
- )
23127
- ],
23128
- {
23129
- gap: "lg"
23130
- }
23131
- ),
23132
- // sectionContainer (rb-container) already provides horizontal padding
23133
- baseClass: "",
23134
- spacing: "comfortable"
23135
- })
23136
- ]
23137
- });
23625
+ layout: eventCalendarLayout,
23626
+ variants: eventCalendarVariants,
23627
+ defaultVariant: "combined",
23628
+ variantOptions: {
23629
+ combined: { label: "Combined" },
23630
+ month: { label: "Month" },
23631
+ week: { label: "Week" },
23632
+ timetable: { label: "Timetable" },
23633
+ list: { label: "List" }
23634
+ }
23635
+ };
23636
+ var eventCalendarManifest = createBlockManifestWithContentShape(
23637
+ eventCalendarConfig,
23638
+ eventCalendarContentShape
23639
+ );
23138
23640
  var eventCalendarBlockDefinition = {
23139
23641
  manifest: eventCalendarManifest,
23140
23642
  normalizeContent: normalizeEventCalendarContent,
@@ -27187,14 +27689,29 @@ function mediaPanelCapable() {
27187
27689
  var allSectionSurfaces = [
27188
27690
  "base",
27189
27691
  "muted-band",
27190
- "accent-band"
27692
+ "accent-band",
27693
+ "brand-depth-band"
27191
27694
  ];
27192
27695
  var heroSectionSurfaces = [
27193
27696
  "base",
27194
27697
  "muted-band",
27195
27698
  "accent-band",
27699
+ "brand-depth-band",
27196
27700
  "hero-image"
27197
27701
  ];
27702
+ var scheduleTileTreatments = [
27703
+ "default",
27704
+ "quiet",
27705
+ "brand-depth"
27706
+ ];
27707
+ function scheduleDetailsCapable() {
27708
+ return declareBlockDesignCapability({
27709
+ sectionSurfaces: "supported",
27710
+ contentFrames: ["plain"],
27711
+ itemSurfaces: "unsupported",
27712
+ tileTreatments: scheduleTileTreatments
27713
+ });
27714
+ }
27198
27715
  function defaultBoundaryBias(visualWeight) {
27199
27716
  return visualWeight === "featured" || visualWeight === "immersive" ? "clear" : "soft";
27200
27717
  }
@@ -27432,7 +27949,7 @@ var systemBlockDefinitionsRaw = [
27432
27949
  flow: conversionFlow,
27433
27950
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
27434
27951
  })),
27435
- withDesignCapability("block.event-details", eventDetailsBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
27952
+ withDesignCapability("block.event-details", eventDetailsBlockDefinition, scheduleDetailsCapable(), defineBlockDesignMetadata({
27436
27953
  flow: offeringsFlow,
27437
27954
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
27438
27955
  })),
@@ -27440,7 +27957,7 @@ var systemBlockDefinitionsRaw = [
27440
27957
  flow: conversionFlow,
27441
27958
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
27442
27959
  })),
27443
- withDesignCapability("block.course-details", courseDetailsBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
27960
+ withDesignCapability("block.course-details", courseDetailsBlockDefinition, scheduleDetailsCapable(), defineBlockDesignMetadata({
27444
27961
  flow: offeringsFlow,
27445
27962
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
27446
27963
  })),
@@ -27455,7 +27972,13 @@ var systemBlockDefinitionsRaw = [
27455
27972
  })),
27456
27973
  withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
27457
27974
  flow: offeringsFlow,
27458
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
27975
+ layoutProfiles: [
27976
+ layoutProfile({ variantKey: "combined", family: "grid", weight: "standard" }),
27977
+ layoutProfile({ variantKey: "list", family: "stack", weight: "standard" }),
27978
+ layoutProfile({ variantKey: "month", family: "grid", weight: "standard" }),
27979
+ layoutProfile({ variantKey: "week", family: "stack", weight: "standard" }),
27980
+ layoutProfile({ variantKey: "timetable", family: "stack", weight: "standard" })
27981
+ ]
27459
27982
  })),
27460
27983
  // Friendly wrapper blocks
27461
27984
  withDesignCapability("block.team-members", teamMembersBlockDefinition, sectionOnly(), defineBlockDesignMetadata({