@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
@@ -998,6 +998,14 @@ var ENDPOINT_DEFINITIONS = {
998
998
  auth: "user",
999
999
  responseKind: "json"
1000
1000
  },
1001
+ exportAppointmentServicesCsv: {
1002
+ path: "/sites/{siteId}/bookings/services/export.csv",
1003
+ method: "GET",
1004
+ tags: ["site-{siteId}", "bookings", "appointment-services-{siteId}"],
1005
+ errors: [],
1006
+ auth: "user",
1007
+ responseKind: "blob"
1008
+ },
1001
1009
  createAppointmentService: {
1002
1010
  path: "/sites/{siteId}/bookings/services",
1003
1011
  method: "POST",
@@ -1266,6 +1274,14 @@ var ENDPOINT_DEFINITIONS = {
1266
1274
  auth: "user",
1267
1275
  responseKind: "json"
1268
1276
  },
1277
+ exportCoursesCsv: {
1278
+ path: "/sites/{siteId}/bookings/courses/export.csv",
1279
+ method: "GET",
1280
+ tags: ["site-{siteId}", "bookings", "courses-{siteId}"],
1281
+ errors: [],
1282
+ auth: "user",
1283
+ responseKind: "blob"
1284
+ },
1269
1285
  createCourse: {
1270
1286
  path: "/sites/{siteId}/bookings/courses",
1271
1287
  method: "POST",
@@ -1365,6 +1381,14 @@ var ENDPOINT_DEFINITIONS = {
1365
1381
  responseKind: "json",
1366
1382
  errors: []
1367
1383
  },
1384
+ exportCourseWaitlistCsv: {
1385
+ path: "/sites/{siteId}/bookings/courses/{courseId}/waitlist/export.csv",
1386
+ method: "GET",
1387
+ tags: ["site-{siteId}", "bookings", "courses-{courseId}"],
1388
+ auth: "user",
1389
+ responseKind: "blob",
1390
+ errors: []
1391
+ },
1368
1392
  updateCourseEnrollment: {
1369
1393
  path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments/{enrollmentId}",
1370
1394
  method: "PATCH",
@@ -3960,6 +3984,14 @@ var ENDPOINT_DEFINITIONS = {
3960
3984
  auth: "user",
3961
3985
  responseKind: "json"
3962
3986
  },
3987
+ exportEventSeriesCsv: {
3988
+ path: "/sites/{siteId}/bookings/event-series/export.csv",
3989
+ method: "GET",
3990
+ tags: ["site-{siteId}", "bookings", "event-series-{siteId}"],
3991
+ errors: [],
3992
+ auth: "user",
3993
+ responseKind: "blob"
3994
+ },
3963
3995
  createEventSeries: {
3964
3996
  path: "/sites/{siteId}/bookings/event-series",
3965
3997
  method: "POST",
@@ -4028,6 +4060,60 @@ var ENDPOINT_DEFINITIONS = {
4028
4060
  errors: [],
4029
4061
  responseKind: "blob"
4030
4062
  },
4063
+ getParticipantMessageRecipients: {
4064
+ path: "/sites/{siteId}/bookings/participant-messaging/recipients",
4065
+ method: "POST",
4066
+ tags: ["site-{siteId}"],
4067
+ auth: "user",
4068
+ errors: [
4069
+ "validation:invalid_input",
4070
+ "auth:forbidden",
4071
+ "resource:not_found",
4072
+ "server:internal_error"
4073
+ ],
4074
+ responseKind: "json"
4075
+ },
4076
+ sendParticipantMessage: {
4077
+ path: "/sites/{siteId}/bookings/participant-messaging/send",
4078
+ method: "POST",
4079
+ tags: ["site-{siteId}"],
4080
+ auth: "user",
4081
+ errors: [
4082
+ "validation:invalid_input",
4083
+ "auth:forbidden",
4084
+ "resource:not_found",
4085
+ "resource:conflict",
4086
+ "server:internal_error"
4087
+ ],
4088
+ responseKind: "json"
4089
+ },
4090
+ testParticipantMessage: {
4091
+ path: "/sites/{siteId}/bookings/participant-messaging/test",
4092
+ method: "POST",
4093
+ tags: ["site-{siteId}"],
4094
+ auth: "user",
4095
+ errors: [
4096
+ "validation:invalid_input",
4097
+ "auth:forbidden",
4098
+ "resource:not_found",
4099
+ "resource:conflict",
4100
+ "server:internal_error"
4101
+ ],
4102
+ responseKind: "json"
4103
+ },
4104
+ listParticipantMessageHistory: {
4105
+ path: "/sites/{siteId}/bookings/participant-messaging/history",
4106
+ method: "POST",
4107
+ tags: ["site-{siteId}"],
4108
+ auth: "user",
4109
+ errors: [
4110
+ "validation:invalid_input",
4111
+ "auth:forbidden",
4112
+ "resource:not_found",
4113
+ "server:internal_error"
4114
+ ],
4115
+ responseKind: "json"
4116
+ },
4031
4117
  listEventSeriesWaitlist: {
4032
4118
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist",
4033
4119
  method: "GET",
@@ -4036,6 +4122,14 @@ var ENDPOINT_DEFINITIONS = {
4036
4122
  responseKind: "json",
4037
4123
  errors: []
4038
4124
  },
4125
+ exportEventSeriesWaitlistCsv: {
4126
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist/export.csv",
4127
+ method: "GET",
4128
+ tags: ["site-{siteId}", "bookings", "event-series-{seriesId}"],
4129
+ auth: "user",
4130
+ responseKind: "blob",
4131
+ errors: []
4132
+ },
4039
4133
  addEventOccurrenceAttendee: {
4040
4134
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/occurrences/{occurrenceId}/attendees",
4041
4135
  method: "POST",
@@ -4752,6 +4846,14 @@ var ENDPOINT_DEFINITIONS = {
4752
4846
  auth: "user",
4753
4847
  responseKind: "json"
4754
4848
  },
4849
+ exportSiteCustomerPassesCsv: {
4850
+ path: "/sites/{siteId}/bookings/customer-passes/export.csv",
4851
+ method: "GET",
4852
+ tags: ["site-{siteId}", "bookings", "customer-passes-{siteId}"],
4853
+ auth: "user",
4854
+ responseKind: "blob",
4855
+ errors: []
4856
+ },
4755
4857
  listSiteCustomerMemberships: {
4756
4858
  path: "/sites/{siteId}/bookings/customer-memberships",
4757
4859
  method: "GET",
@@ -4815,6 +4917,22 @@ var ENDPOINT_DEFINITIONS = {
4815
4917
  auth: "user",
4816
4918
  responseKind: "blob"
4817
4919
  },
4920
+ exportBookingLedgerCsv: {
4921
+ path: "/sites/{siteId}/bookings/ledger/export.csv",
4922
+ method: "GET",
4923
+ tags: ["site-{siteId}", "bookings", "booking-ledger-{siteId}"],
4924
+ errors: [],
4925
+ auth: "user",
4926
+ responseKind: "blob"
4927
+ },
4928
+ exportBookingQuestionAnswersCsv: {
4929
+ path: "/sites/{siteId}/bookings/intake-answers/export.csv",
4930
+ method: "GET",
4931
+ tags: ["site-{siteId}", "bookings", "intake-answers-{siteId}"],
4932
+ errors: [],
4933
+ auth: "user",
4934
+ responseKind: "blob"
4935
+ },
4818
4936
  // Site logs
4819
4937
  listSiteActivityLogs: {
4820
4938
  path: "/sites/{siteId}/logs/activity",
@@ -6270,7 +6388,11 @@ function resolveRepeaterGridColumnFieldId(options) {
6270
6388
 
6271
6389
  // ../blocks/src/system/manifest/schema.ts
6272
6390
  var visibilityLevels = ["admin", "designer", "author"];
6273
- var siteOptionSources = ["eventCategories", "venues", "staffMembers"];
6391
+ var siteOptionSources = [
6392
+ "eventCategories",
6393
+ "venues",
6394
+ "staffMembers"
6395
+ ];
6274
6396
  var mediaDeliverySchema = z3.object({
6275
6397
  sizes: z3.string().optional(),
6276
6398
  widthCandidates: z3.array(z3.number().int().positive()).optional(),
@@ -6308,7 +6430,10 @@ var uiSchema = z3.object({
6308
6430
  hidden: z3.boolean().optional(),
6309
6431
  hideLabel: z3.boolean().optional(),
6310
6432
  hideDescription: z3.boolean().optional(),
6311
- showCharCount: z3.union([z3.number().int().positive(), z3.object({ max: z3.number().int().positive() })]).optional(),
6433
+ showCharCount: z3.union([
6434
+ z3.number().int().positive(),
6435
+ z3.object({ max: z3.number().int().positive() })
6436
+ ]).optional(),
6312
6437
  showSlugPreview: z3.boolean().optional(),
6313
6438
  variant: z3.enum(["full", "inline", "limited", "media", "notes"]).optional(),
6314
6439
  richTextVariant: z3.enum(["full", "inline", "limited", "media", "notes"]).optional(),
@@ -6318,10 +6443,7 @@ var uiSchema = z3.object({
6318
6443
  showMediaPreview: z3.boolean().optional(),
6319
6444
  showMediaOverlayActions: z3.boolean().optional(),
6320
6445
  mediaDelivery: mediaDeliverySchema.optional(),
6321
- mediaDeliveryByVariant: z3.record(
6322
- z3.string(),
6323
- mediaDeliverySchema
6324
- ).optional(),
6446
+ mediaDeliveryByVariant: z3.record(z3.string(), mediaDeliverySchema).optional(),
6325
6447
  // Optional input hints for validators/widgets
6326
6448
  inputType: z3.enum(["text", "email", "tel", "number"]).optional(),
6327
6449
  min: z3.number().optional(),
@@ -6429,7 +6551,9 @@ var richTextFieldSchema = baseFieldSchema.extend({
6429
6551
  });
6430
6552
  var mediaFieldSchema = baseFieldSchema.extend({
6431
6553
  type: z3.literal("media"),
6432
- mediaKinds: z3.array(z3.enum(["image", "video", "audio", "document", "spreadsheet", "archive"])).default(["image"]),
6554
+ mediaKinds: z3.array(
6555
+ z3.enum(["image", "video", "audio", "document", "spreadsheet", "archive"])
6556
+ ).default(["image"]),
6433
6557
  aspectRatio: z3.string().optional()
6434
6558
  });
6435
6559
  var booleanFieldSchema = baseFieldSchema.extend({
@@ -6551,7 +6675,9 @@ var referenceFieldSchema = baseFieldSchema.extend({
6551
6675
  var itemTypeSchema = z3.object({
6552
6676
  label: z3.string().min(1),
6553
6677
  icon: z3.string().optional(),
6554
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Item type requires at least one field"))
6678
+ fields: z3.lazy(
6679
+ () => getFieldSchemaInternal().array().min(1, "Item type requires at least one field")
6680
+ )
6555
6681
  });
6556
6682
  var repeaterFieldSchema = baseFieldSchema.extend({
6557
6683
  type: z3.literal("repeater"),
@@ -6561,7 +6687,9 @@ var repeaterFieldSchema = baseFieldSchema.extend({
6561
6687
  maxItems: z3.number().int().positive().optional(),
6562
6688
  // Monomorphic mode
6563
6689
  schema: z3.object({
6564
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Repeater requires at least one field"))
6690
+ fields: z3.lazy(
6691
+ () => getFieldSchemaInternal().array().min(1, "Repeater requires at least one field")
6692
+ )
6565
6693
  }).optional(),
6566
6694
  // Polymorphic mode
6567
6695
  polymorphic: z3.boolean().optional(),
@@ -6607,13 +6735,19 @@ var repeaterFieldSchema = baseFieldSchema.extend({
6607
6735
  const itemTypes = Object.values(
6608
6736
  data.itemTypes
6609
6737
  );
6610
- return itemTypes.every((itemType) => Array.isArray(itemType.fields) && requiredFieldIds.every((requiredId) => itemType.fields?.some((field) => field.id === requiredId)));
6738
+ return itemTypes.every(
6739
+ (itemType) => Array.isArray(itemType.fields) && requiredFieldIds.every(
6740
+ (requiredId) => itemType.fields?.some((field) => field.id === requiredId)
6741
+ )
6742
+ );
6611
6743
  }
6612
6744
  const schemaFields = data.schema?.fields;
6613
6745
  if (!schemaFields) {
6614
6746
  return true;
6615
6747
  }
6616
- return requiredFieldIds.every((requiredId) => schemaFields.some((field) => field.id === requiredId));
6748
+ return requiredFieldIds.every(
6749
+ (requiredId) => schemaFields.some((field) => field.id === requiredId)
6750
+ );
6617
6751
  },
6618
6752
  {
6619
6753
  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`,
@@ -6641,7 +6775,9 @@ var repeaterFieldSchema = baseFieldSchema.extend({
6641
6775
  if (!schemaFields) {
6642
6776
  return true;
6643
6777
  }
6644
- const field = schemaFields.find((candidate) => candidate.id === labelField);
6778
+ const field = schemaFields.find(
6779
+ (candidate) => candidate.id === labelField
6780
+ );
6645
6781
  return field?.type === "text";
6646
6782
  },
6647
6783
  {
@@ -6652,13 +6788,17 @@ var repeaterFieldSchema = baseFieldSchema.extend({
6652
6788
  var groupFieldSchema = baseFieldSchema.extend({
6653
6789
  type: z3.literal("group"),
6654
6790
  schema: z3.object({
6655
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Group requires at least one field"))
6791
+ fields: z3.lazy(
6792
+ () => getFieldSchemaInternal().array().min(1, "Group requires at least one field")
6793
+ )
6656
6794
  })
6657
6795
  });
6658
6796
  var modalFieldSchema = baseFieldSchema.extend({
6659
6797
  type: z3.literal("modal"),
6660
6798
  schema: z3.object({
6661
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Modal requires at least one field"))
6799
+ fields: z3.lazy(
6800
+ () => getFieldSchemaInternal().array().min(1, "Modal requires at least one field")
6801
+ )
6662
6802
  })
6663
6803
  });
6664
6804
  var numberFieldSchema = baseFieldSchema.extend({
@@ -6765,31 +6905,35 @@ function expectParsedSelectField(field) {
6765
6905
  return field;
6766
6906
  }
6767
6907
  function createSiteOptionSelectField(input) {
6768
- return expectParsedSelectField(parseFieldDefinition({
6769
- ...input,
6770
- type: "select",
6771
- options: [],
6772
- multiple: input.multiple ?? false,
6773
- source: { kind: "site", optionSource: input.optionSource },
6774
- ui: {
6775
- ...input.ui ?? {},
6776
- widget: "siteOptionPicker",
6777
- siteOptionSource: input.optionSource
6778
- }
6779
- }));
6908
+ return expectParsedSelectField(
6909
+ parseFieldDefinition({
6910
+ ...input,
6911
+ type: "select",
6912
+ options: [],
6913
+ multiple: input.multiple ?? false,
6914
+ source: { kind: "site", optionSource: input.optionSource },
6915
+ ui: {
6916
+ ...input.ui ?? {},
6917
+ widget: "siteOptionPicker",
6918
+ siteOptionSource: input.optionSource
6919
+ }
6920
+ })
6921
+ );
6780
6922
  }
6781
6923
  function createSdkSelectField(input) {
6782
- return expectParsedSelectField(parseFieldDefinition({
6783
- ...input,
6784
- type: "select",
6785
- options: input.options,
6786
- multiple: input.multiple ?? false,
6787
- source: { kind: "sdk" },
6788
- ui: {
6789
- ...input.ui ?? {},
6790
- widget: "sdkSelect"
6791
- }
6792
- }));
6924
+ return expectParsedSelectField(
6925
+ parseFieldDefinition({
6926
+ ...input,
6927
+ type: "select",
6928
+ options: input.options,
6929
+ multiple: input.multiple ?? false,
6930
+ source: { kind: "sdk" },
6931
+ ui: {
6932
+ ...input.ui ?? {},
6933
+ widget: "sdkSelect"
6934
+ }
6935
+ })
6936
+ );
6793
6937
  }
6794
6938
  var slotSchema = z3.object({
6795
6939
  id: z3.string().min(1),
@@ -6800,8 +6944,20 @@ var slotSchema = z3.object({
6800
6944
  help: z3.string().optional(),
6801
6945
  visibleRoles: z3.array(z3.enum(visibilityLevels)).optional()
6802
6946
  });
6803
- var typographyTokens = ["display", "heading", "subheading", "body", "caption"];
6804
- var colorTokens = ["background", "surface", "foreground", "accent", "muted"];
6947
+ var typographyTokens = [
6948
+ "display",
6949
+ "heading",
6950
+ "subheading",
6951
+ "body",
6952
+ "caption"
6953
+ ];
6954
+ var colorTokens = [
6955
+ "background",
6956
+ "surface",
6957
+ "foreground",
6958
+ "accent",
6959
+ "muted"
6960
+ ];
6805
6961
  var spacingTokens = ["none", "xs", "sm", "md", "lg", "xl"];
6806
6962
  var radiusTokens = ["none", "sm", "md", "lg", "full"];
6807
6963
  var styleTokenSchema = z3.object({
@@ -6821,7 +6977,14 @@ var behaviourSchema = z3.object({
6821
6977
  // Block manages its own wrapper (for sticky/fixed positioning)
6822
6978
  managesOwnWrapper: z3.boolean().optional()
6823
6979
  });
6824
- var blockCategoryEnum = z3.enum(["marketing", "content", "blog", "media", "layout", "interactive"]);
6980
+ var blockCategoryEnum = z3.enum([
6981
+ "marketing",
6982
+ "content",
6983
+ "blog",
6984
+ "media",
6985
+ "layout",
6986
+ "interactive"
6987
+ ]);
6825
6988
  var manifestSchema = z3.object({
6826
6989
  name: z3.string().min(1),
6827
6990
  version: z3.string().min(1),
@@ -7420,6 +7583,20 @@ var applyAppointmentSetupRequestSchema = z6.object({
7420
7583
  bookingNotice: appointmentSetupBookingNoticeSchema
7421
7584
  });
7422
7585
 
7586
+ // ../api/src/bookingRecords.ts
7587
+ var BOOKING_QUESTION_ANSWER_EXPORT_SCOPES = {
7588
+ site: "site",
7589
+ appointments: "appointments",
7590
+ eventSeries: "event_series",
7591
+ course: "course"
7592
+ };
7593
+ var BOOKING_QUESTION_ANSWER_EXPORT_SCOPE_VALUES = [
7594
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.site,
7595
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.appointments,
7596
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.eventSeries,
7597
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.course
7598
+ ];
7599
+
7423
7600
  // ../api/src/common/cancellation.ts
7424
7601
  var STAFF_CANCELLATION_CONTEXT_UI_CATEGORIES = [
7425
7602
  "customer_requested",
@@ -7791,6 +7968,24 @@ function registerManifest(manifest) {
7791
7968
  return manifest;
7792
7969
  }
7793
7970
 
7971
+ // ../theme-core/src/site-styles/appearancePresetResolution.ts
7972
+ function assertValidOptionGroups(preset2) {
7973
+ preset2.optionGroups?.forEach((group) => {
7974
+ const selectedOption = group.options.find(
7975
+ (option) => option.id === group.selectedOptionId
7976
+ );
7977
+ if (!selectedOption) {
7978
+ throw new Error(
7979
+ `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
7980
+ );
7981
+ }
7982
+ });
7983
+ }
7984
+ function defineBlockAppearancePreset(preset2) {
7985
+ assertValidOptionGroups(preset2);
7986
+ return preset2;
7987
+ }
7988
+
7794
7989
  // ../theme-core/src/site-styles/types.ts
7795
7990
  function asDesignBlockId(value) {
7796
7991
  return brandNonEmptyString(value, "DesignBlockId");
@@ -7872,6 +8067,11 @@ function flushPanelFrame(options) {
7872
8067
  function defineFrameCapability(capability) {
7873
8068
  return capability;
7874
8069
  }
8070
+ var tileTreatmentValues = [
8071
+ "default",
8072
+ "quiet",
8073
+ "brand-depth"
8074
+ ];
7875
8075
  var eyebrowTreatmentValues = [
7876
8076
  "plain",
7877
8077
  "pill",
@@ -7887,31 +8087,13 @@ function defineBlockDesignCapability(capability) {
7887
8087
  imageSurfaceTreatments: capability.imageSurfaceTreatments ?? ["none"],
7888
8088
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7889
8089
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
8090
+ tileTreatments: capability.tileTreatments ?? ["default"],
7890
8091
  eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"]
7891
8092
  };
7892
8093
  }
7893
8094
 
7894
- // ../theme-core/src/site-styles/appearancePresets.ts
7895
- function assertValidOptionGroups(preset2) {
7896
- preset2.optionGroups?.forEach((group) => {
7897
- const selectedOption = group.options.find(
7898
- (option) => option.id === group.selectedOptionId
7899
- );
7900
- if (!selectedOption) {
7901
- throw new Error(
7902
- `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
7903
- );
7904
- }
7905
- });
7906
- }
7907
- function defineBlockAppearancePreset(preset2) {
7908
- assertValidOptionGroups(preset2);
7909
- return preset2;
7910
- }
7911
- function defineSiteChromeAppearancePreset(preset2) {
7912
- return preset2;
7913
- }
7914
- var appearancePresets = [
8095
+ // ../theme-core/src/site-styles/blockAppearancePresets.ts
8096
+ var blockAppearancePresets = [
7915
8097
  defineBlockAppearancePreset({
7916
8098
  kind: "block-design",
7917
8099
  id: "hero-immersive-image",
@@ -8037,6 +8219,24 @@ var appearancePresets = [
8037
8219
  eyebrowTreatment: "accent-pill-bounce"
8038
8220
  }
8039
8221
  }),
8222
+ defineBlockAppearancePreset({
8223
+ kind: "block-design",
8224
+ id: "hero-brand-depth-expressive",
8225
+ target: "hero",
8226
+ label: "Expressive brand-depth hero",
8227
+ blockKinds: ["block.hero"],
8228
+ constraints: {
8229
+ layoutFamilies: ["centered", "compact"]
8230
+ },
8231
+ design: {
8232
+ sectionSurface: "brand-depth-band",
8233
+ contentFrame: plainFrame,
8234
+ itemSurface: "none",
8235
+ transitionAfter: "soft-fade-short",
8236
+ emphasis: "high",
8237
+ eyebrowTreatment: "accent-pill-bounce"
8238
+ }
8239
+ }),
8040
8240
  defineBlockAppearancePreset({
8041
8241
  kind: "block-design",
8042
8242
  id: "hero-contained-intro",
@@ -8065,6 +8265,20 @@ var appearancePresets = [
8065
8265
  emphasis: "high"
8066
8266
  }
8067
8267
  }),
8268
+ defineBlockAppearancePreset({
8269
+ kind: "block-design",
8270
+ id: "body-text-brand-depth-intro",
8271
+ target: "body-text",
8272
+ label: "Brand-depth intro copy",
8273
+ blockKinds: ["block.body-text"],
8274
+ design: {
8275
+ sectionSurface: "brand-depth-band",
8276
+ contentFrame: plainFrame,
8277
+ itemSurface: "none",
8278
+ transitionAfter: "soft-fade-short",
8279
+ emphasis: "high"
8280
+ }
8281
+ }),
8068
8282
  defineBlockAppearancePreset({
8069
8283
  kind: "block-design",
8070
8284
  id: "offerings-calm-list",
@@ -8107,6 +8321,21 @@ var appearancePresets = [
8107
8321
  emphasis: "medium"
8108
8322
  }
8109
8323
  }),
8324
+ defineBlockAppearancePreset({
8325
+ kind: "block-design",
8326
+ id: "schedule-details-brand-depth",
8327
+ target: "events",
8328
+ label: "Brand-depth schedule details",
8329
+ blockKinds: ["block.event-details", "block.course-details"],
8330
+ design: {
8331
+ sectionSurface: "brand-depth-band",
8332
+ contentFrame: plainFrame,
8333
+ itemSurface: "none",
8334
+ transitionAfter: "none",
8335
+ emphasis: "medium",
8336
+ tileTreatment: "brand-depth"
8337
+ }
8338
+ }),
8110
8339
  defineBlockAppearancePreset({
8111
8340
  kind: "block-design",
8112
8341
  id: "media-text-flush-feature",
@@ -8192,6 +8421,20 @@ var appearancePresets = [
8192
8421
  testimonialCardTreatment: "accent-quote"
8193
8422
  }
8194
8423
  }),
8424
+ defineBlockAppearancePreset({
8425
+ kind: "block-design",
8426
+ id: "faq-base-accordion",
8427
+ target: "faq",
8428
+ label: "Base accordion FAQ",
8429
+ blockKinds: ["block.faq"],
8430
+ design: {
8431
+ sectionSurface: "base",
8432
+ contentFrame: plainFrame,
8433
+ itemSurface: "default",
8434
+ transitionAfter: "none",
8435
+ emphasis: "medium"
8436
+ }
8437
+ }),
8195
8438
  defineBlockAppearancePreset({
8196
8439
  kind: "block-design",
8197
8440
  id: "faq-contained-help",
@@ -8234,6 +8477,20 @@ var appearancePresets = [
8234
8477
  emphasis: "high"
8235
8478
  }
8236
8479
  }),
8480
+ defineBlockAppearancePreset({
8481
+ kind: "block-design",
8482
+ id: "contact-form-brand-depth-card",
8483
+ target: "contact-form",
8484
+ label: "Brand-depth form card",
8485
+ blockKinds: ["block.form"],
8486
+ design: {
8487
+ sectionSurface: "brand-depth-band",
8488
+ contentFrame: panelFrame("raised"),
8489
+ itemSurface: "none",
8490
+ transitionAfter: "none",
8491
+ emphasis: "high"
8492
+ }
8493
+ }),
8237
8494
  defineBlockAppearancePreset({
8238
8495
  kind: "block-design",
8239
8496
  id: "cta-accent-band",
@@ -8247,7 +8504,14 @@ var appearancePresets = [
8247
8504
  transitionAfter: "none",
8248
8505
  emphasis: "high"
8249
8506
  }
8250
- }),
8507
+ })
8508
+ ];
8509
+
8510
+ // ../theme-core/src/site-styles/siteChromeAppearancePresets.ts
8511
+ function defineSiteChromeAppearancePreset(preset2) {
8512
+ return preset2;
8513
+ }
8514
+ var siteChromeAppearancePresets = [
8251
8515
  defineSiteChromeAppearancePreset({
8252
8516
  kind: "site-chrome",
8253
8517
  id: "header-clean-base",
@@ -8315,6 +8579,12 @@ var appearancePresets = [
8315
8579
  })
8316
8580
  ];
8317
8581
 
8582
+ // ../theme-core/src/site-styles/appearancePresetCatalog.ts
8583
+ var appearancePresets = [
8584
+ ...blockAppearancePresets,
8585
+ ...siteChromeAppearancePresets
8586
+ ];
8587
+
8318
8588
  // ../theme-core/src/site-styles/blockFlow.ts
8319
8589
  function defineBlockDesignMetadata(input) {
8320
8590
  const layoutProfiles = (input.layoutProfiles ?? []).map((profile) => ({
@@ -9789,6 +10059,7 @@ var sectionStylesOverrideSchema = z22.object({
9789
10059
  background: boxBackgroundSchema.nullable().optional(),
9790
10060
  spacing: semanticSpacingSchema.nullable().optional(),
9791
10061
  minHeight: z22.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
10062
+ tileTreatment: z22.enum(tileTreatmentValues).nullable().optional(),
9792
10063
  eyebrowTreatment: z22.enum(eyebrowTreatmentValues).nullable().optional()
9793
10064
  });
9794
10065
  var containerStylesOverrideSchema = z22.object({
@@ -10582,7 +10853,7 @@ var userContentFrames = [
10582
10853
  ];
10583
10854
  var generatedDesignOptionCatalog = {
10584
10855
  source: "generated",
10585
- sectionSurfaces: ["base", "muted-band", "accent-band", "hero-image"],
10856
+ sectionSurfaces: ["base", "muted-band", "accent-band", "brand-depth-band", "hero-image"],
10586
10857
  contentFrames: generatedContentFrames,
10587
10858
  itemSurfaces: ["none", "default", "flat", "outlined", "raised"],
10588
10859
  transitions: ["none", "soft-fade-short", "soft-fade-long"],
@@ -10652,6 +10923,43 @@ var expressiveBudget = {
10652
10923
  mediaDensity: "high",
10653
10924
  decorativeRepetition: "medium"
10654
10925
  };
10926
+ var expressiveUnderlineInputs = {
10927
+ base: {
10928
+ background: { type: "transparent" },
10929
+ textColorToken: "text",
10930
+ border: {
10931
+ widthClass: "border-2",
10932
+ colorToken: "border",
10933
+ style: "underline"
10934
+ },
10935
+ corners: "square",
10936
+ shadow: null,
10937
+ spacing: "compact",
10938
+ fontSize: "base"
10939
+ },
10940
+ label: {
10941
+ textColorToken: "primary",
10942
+ fontWeight: "black",
10943
+ fontSize: "xs",
10944
+ textTransform: "uppercase",
10945
+ letterSpacing: "widest",
10946
+ opacity: 1
10947
+ },
10948
+ focus: {
10949
+ ringColorToken: "secondary",
10950
+ ringWidth: "0",
10951
+ borderColorToken: "secondary"
10952
+ },
10953
+ error: {
10954
+ borderColorToken: "destructive",
10955
+ textColorToken: "destructive"
10956
+ },
10957
+ disabled: {
10958
+ backgroundColorToken: "surface",
10959
+ textColorToken: "text",
10960
+ opacity: 0.6
10961
+ }
10962
+ };
10655
10963
  function uniqueContentFrameKinds() {
10656
10964
  const kinds = [...new Set(
10657
10965
  generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
@@ -11002,15 +11310,17 @@ var curatedSiteStyles = [
11002
11310
  paragraphSize: "editorial",
11003
11311
  headingSize: "editorial"
11004
11312
  }
11005
- }
11313
+ },
11314
+ inputs: expressiveUnderlineInputs
11006
11315
  },
11007
11316
  recommendedAppearancePresetIds: [
11008
11317
  "site-header-brand-solid-inverted-cta",
11009
11318
  "site-footer-brand-two-band",
11010
11319
  "hero-brand-scrim-fixed-frame",
11011
11320
  "body-text-editorial-intro",
11321
+ "schedule-details-brand-depth",
11012
11322
  "testimonials-accent-quote-proof",
11013
- "contact-form-dark-card"
11323
+ "contact-form-brand-depth-card"
11014
11324
  ],
11015
11325
  buttonPersonalityChoices: [
11016
11326
  buttonChoice("showtime-pill"),
@@ -11144,6 +11454,7 @@ var imageSurfaceTreatmentSchema = z24.discriminatedUnion("kind", [
11144
11454
  }).strict()
11145
11455
  ]);
11146
11456
  var testimonialCardTreatmentSchema = z24.enum(["default", "accent-quote"]);
11457
+ var tileTreatmentSchema = z24.enum(tileTreatmentValues);
11147
11458
  var eyebrowTreatmentSchema = z24.enum(eyebrowTreatmentValues);
11148
11459
  function uniqueNonEmpty(values) {
11149
11460
  const uniqueValues = [...new Set(values)];
@@ -11188,6 +11499,7 @@ var blockDesignPlanSchema = z24.object({
11188
11499
  imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
11189
11500
  imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
11190
11501
  testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
11502
+ tileTreatment: tileTreatmentSchema.optional(),
11191
11503
  eyebrowTreatment: eyebrowTreatmentSchema.optional()
11192
11504
  }).strict();
11193
11505
  var styleAuthoritySchema = z24.discriminatedUnion("kind", [
@@ -11251,6 +11563,14 @@ var defaultDesignRuntimeRules = defineDesignRuntimeRules({
11251
11563
  headingColor: "primaryForeground"
11252
11564
  }
11253
11565
  },
11566
+ "brand-depth-band": {
11567
+ background: {
11568
+ type: "color",
11569
+ color: "primary-800",
11570
+ textColor: "primaryForeground",
11571
+ headingColor: "primaryForeground"
11572
+ }
11573
+ },
11254
11574
  "hero-image": {
11255
11575
  background: {
11256
11576
  type: "image",
@@ -13129,6 +13449,21 @@ function createTransformRegistry(definitions) {
13129
13449
  }
13130
13450
 
13131
13451
  // ../blocks/src/system/transforms/registry/_utils/colorResolution.ts
13452
+ var CSS_COLOR_FUNCTION_PATTERN = /^(?:rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch|color|color-mix|light-dark)\(/i;
13453
+ var CSS_HEX_COLOR_PATTERN = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
13454
+ var THEME_COLOR_TOKEN_PATTERN = /^[a-zA-Z][a-zA-Z0-9]*(?:-[a-zA-Z0-9]+)*(?:\/(?:100|[1-9]?\d|0))?$/;
13455
+ var CSS_COLOR_KEYWORDS = /* @__PURE__ */ new Set([
13456
+ "transparent",
13457
+ "currentColor",
13458
+ "inherit",
13459
+ "initial",
13460
+ "revert",
13461
+ "revert-layer",
13462
+ "unset"
13463
+ ]);
13464
+ function isLiteralCssColorValue(value) {
13465
+ return CSS_HEX_COLOR_PATTERN.test(value) || CSS_COLOR_FUNCTION_PATTERN.test(value) || value.startsWith("var(") || CSS_COLOR_KEYWORDS.has(value);
13466
+ }
13132
13467
  function resolveBackgroundColorValue(tokenOrCssValue, context) {
13133
13468
  const trimmed = tokenOrCssValue.trim();
13134
13469
  if (!trimmed) return "";
@@ -13145,8 +13480,11 @@ function resolveBackgroundColorValue(tokenOrCssValue, context) {
13145
13480
  return rgbColorValue(trimmed);
13146
13481
  }
13147
13482
  }
13148
- if (trimmed === "transparent") {
13149
- return "transparent";
13483
+ if (isLiteralCssColorValue(trimmed)) {
13484
+ return trimmed;
13485
+ }
13486
+ if (THEME_COLOR_TOKEN_PATTERN.test(trimmed)) {
13487
+ return rgbColorValue(trimmed);
13150
13488
  }
13151
13489
  return trimmed;
13152
13490
  }
@@ -13402,6 +13740,15 @@ function hasFixedFrameBackgroundMotion(value) {
13402
13740
  const background = asPartialObject(input?.background);
13403
13741
  return background?.motion === "fixed-frame";
13404
13742
  }
13743
+ var tileTreatmentClassMap = {
13744
+ default: "",
13745
+ quiet: "rb-tile-treatment-quiet",
13746
+ "brand-depth": "rb-tile-treatment-brand-depth"
13747
+ };
13748
+ var tileTreatmentSet = new Set(tileTreatmentValues);
13749
+ function isTileTreatment(value) {
13750
+ return typeof value === "string" && tileTreatmentSet.has(value);
13751
+ }
13405
13752
  var sectionClassNameTransform = {
13406
13753
  id: "sectionStyles.resolveClassName",
13407
13754
  kind: "string",
@@ -13458,8 +13805,19 @@ var sectionClassNameTransform = {
13458
13805
  classes.push(minHeightClass);
13459
13806
  }
13460
13807
  }
13461
- if (hasFixedFrameBackgroundMotion(input)) {
13462
- classes.push(fixedFrameScopeClass);
13808
+ const tileTreatment = input?.tileTreatment;
13809
+ if (isTileTreatment(tileTreatment)) {
13810
+ const tileTreatmentClass = tileTreatmentClassMap[tileTreatment];
13811
+ if (tileTreatmentClass) {
13812
+ classes.push(tileTreatmentClass);
13813
+ }
13814
+ } else if (typeof tileTreatment === "string" && process.env.NODE_ENV !== "production") {
13815
+ console.warn(
13816
+ `[sectionStyles] Invalid tileTreatment value in _sectionStyles: "${tileTreatment}". Expected one of: ${tileTreatmentValues.join(", ")}.`
13817
+ );
13818
+ }
13819
+ if (hasFixedFrameBackgroundMotion(input)) {
13820
+ classes.push(fixedFrameScopeClass);
13463
13821
  }
13464
13822
  return classes.join(" ").trim();
13465
13823
  }
@@ -16332,6 +16690,9 @@ function createBlockManifest(config) {
16332
16690
  };
16333
16691
  return augmentManifest(manifest);
16334
16692
  }
16693
+ function createBlockManifestWithContentShape(config, _contentShape) {
16694
+ return createBlockManifest(config);
16695
+ }
16335
16696
  function normalizeBlockLayout(layout) {
16336
16697
  return Array.isArray(layout) ? [...layout] : layout;
16337
16698
  }
@@ -16964,7 +17325,7 @@ var ctaComposition = composeFragments([
16964
17325
  { fragment: ctaCopyFragment },
16965
17326
  { fragment: ctaRowFragment }
16966
17327
  ]);
16967
- var ctaFullManifest = createBlockManifest({
17328
+ var ctaFullConfig = {
16968
17329
  id: "block.cta-full",
16969
17330
  title: "Full-width CTA",
16970
17331
  category: "marketing",
@@ -16982,7 +17343,8 @@ var ctaFullManifest = createBlockManifest({
16982
17343
  description: "Centered call to action with optional background image.",
16983
17344
  tags: ["cta", "call-to-action", "button", "conversion", "action", "sign-up", "get-started"],
16984
17345
  icon: "Target"
16985
- });
17346
+ };
17347
+ var ctaFullManifest = createBlockManifest(ctaFullConfig);
16986
17348
  var ctaFullBlockDefinition = {
16987
17349
  manifest: ctaFullManifest
16988
17350
  };
@@ -20063,9 +20425,9 @@ var mediaTextManifest = createBlockManifest({
20063
20425
  {
20064
20426
  id: "images",
20065
20427
  type: "repeater",
20066
- label: "Images",
20428
+ label: "Media",
20067
20429
  required: false,
20068
- itemLabel: "Image",
20430
+ itemLabel: "Media",
20069
20431
  minItems: 0,
20070
20432
  maxItems: 6,
20071
20433
  allowConversion: true,
@@ -20079,9 +20441,9 @@ var mediaTextManifest = createBlockManifest({
20079
20441
  {
20080
20442
  id: "image",
20081
20443
  type: "media",
20082
- label: "Image",
20444
+ label: "Media",
20083
20445
  required: true,
20084
- mediaKinds: ["image"]
20446
+ mediaKinds: ["image", "video"]
20085
20447
  }
20086
20448
  ]
20087
20449
  }
@@ -20159,8 +20521,8 @@ var mediaTextManifest = createBlockManifest({
20159
20521
  {
20160
20522
  id: "aspectRatio",
20161
20523
  type: "select",
20162
- label: "Image aspect ratio",
20163
- description: "Crop image to a consistent aspect ratio.",
20524
+ label: "Media aspect ratio",
20525
+ description: "Crop media to a consistent aspect ratio.",
20164
20526
  required: false,
20165
20527
  defaultValue: "auto",
20166
20528
  multiple: false,
@@ -20347,8 +20709,8 @@ var mediaTextManifest = createBlockManifest({
20347
20709
  }
20348
20710
  };
20349
20711
  })(),
20350
- description: "Two columns: image/carousel + rich text (with optional section title).",
20351
- tags: ["media", "image", "carousel", "text", "two-column", "layout"],
20712
+ description: "Two columns: media/carousel + rich text (with optional section title).",
20713
+ tags: ["media", "image", "video", "carousel", "text", "two-column", "layout"],
20352
20714
  icon: "Columns"
20353
20715
  });
20354
20716
  var mediaTextBlockDefinition = {
@@ -20499,6 +20861,19 @@ var transformSchema2 = z39.object({
20499
20861
  hotspot: hotspotSchema2.optional(),
20500
20862
  rotation: rotationSchema2.optional()
20501
20863
  });
20864
+ var mediaPosterSchema = z39.discriminatedUnion("tag", [
20865
+ z39.object({
20866
+ tag: z39.literal("storage"),
20867
+ assetId: z39.string().optional(),
20868
+ storageBucket: z39.string().min(1),
20869
+ storagePath: z39.string().min(1)
20870
+ }),
20871
+ z39.object({
20872
+ tag: z39.literal("external-src"),
20873
+ assetId: z39.string().optional(),
20874
+ src: z39.string().url()
20875
+ })
20876
+ ]);
20502
20877
  var mediaBaseSchema = z39.object({
20503
20878
  purpose: z39.string().optional(),
20504
20879
  placeholder: z39.boolean().default(true).optional(),
@@ -20512,6 +20887,7 @@ var mediaBaseSchema = z39.object({
20512
20887
  height: z39.number().optional(),
20513
20888
  storageBucket: z39.string().optional(),
20514
20889
  storagePath: z39.string().optional(),
20890
+ poster: mediaPosterSchema.optional(),
20515
20891
  transform: transformSchema2.optional()
20516
20892
  });
20517
20893
  var imageMediaSchema = mediaBaseSchema.extend({ type: z39.literal("image") });
@@ -20995,10 +21371,28 @@ import { z as z45 } from "zod";
20995
21371
 
20996
21372
  // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
20997
21373
  import { z as z44 } from "zod";
21374
+
21375
+ // ../blocks/src/system/constants/events.ts
21376
+ var eventCalendarDisplayModeValues = ["combined", "month", "week", "list", "timetable"];
21377
+ var eventCalendarListLayoutValues = ["stack", "grid", "compact"];
21378
+ var eventCalendarListLayoutOptions = [
21379
+ { id: "stack", label: "Stack" },
21380
+ { id: "grid", label: "Grid" },
21381
+ { id: "compact", label: "Compact" }
21382
+ ];
21383
+ function isEventCalendarDisplayMode(value) {
21384
+ return typeof value === "string" && eventCalendarDisplayModeValues.includes(value);
21385
+ }
21386
+ function isEventCalendarListLayout(value) {
21387
+ return typeof value === "string" && eventCalendarListLayoutValues.includes(value);
21388
+ }
21389
+
21390
+ // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
20998
21391
  var previewStageSchema = z44.enum(["preview", "published"]);
20999
21392
  var registrationButtonVariantSchema = z44.enum(["primary", "secondary", "outline"]);
21000
21393
  var eventButtonVariantSchema = z44.enum(["primary", "secondary", "outline", "link"]);
21001
- var eventLayoutSchema = z44.enum(["grid", "stack", "compact"]);
21394
+ var eventLayoutSchema = z44.enum(eventCalendarListLayoutValues);
21395
+ var eventCalendarDisplayModeSchema = z44.enum(eventCalendarDisplayModeValues);
21002
21396
  var columnOptionSchema = z44.enum(["2", "3", "4"]);
21003
21397
  var weekStartSchema = z44.enum(["sunday", "monday"]);
21004
21398
  var filterAutoShowSchema = z44.enum(["auto", "always", "never"]);
@@ -22380,7 +22774,232 @@ var eventListingInteractiveIslandPropsCodec = createInteractiveIslandCodec({
22380
22774
  });
22381
22775
 
22382
22776
  // ../blocks/src/system/blocks/events/event-listing.ts
22383
- var eventListingManifest = createBlockManifest({
22777
+ var eventListingAdditionalFields = [
22778
+ ...sectionHeaderFields("All Events"),
22779
+ ...(() => {
22780
+ const columns = columnsField(["2", "3", "4"]);
22781
+ return [
22782
+ {
22783
+ ...layoutField,
22784
+ ui: { ...layoutField.ui ?? {}, intent: "display" }
22785
+ },
22786
+ {
22787
+ ...columns,
22788
+ ui: { ...columns.ui ?? {}, intent: "display" }
22789
+ }
22790
+ ];
22791
+ })(),
22792
+ {
22793
+ id: "eventsPerPage",
22794
+ type: "select",
22795
+ label: "Events per page",
22796
+ description: "Number of events to load at a time",
22797
+ required: false,
22798
+ multiple: false,
22799
+ defaultValue: "12",
22800
+ options: [
22801
+ { value: "3", label: "3 events" },
22802
+ { value: "6", label: "6 events" },
22803
+ { value: "12", label: "12 events" },
22804
+ { value: "24", label: "24 events" }
22805
+ ],
22806
+ ui: { intent: "display" }
22807
+ },
22808
+ {
22809
+ id: "paginationMode",
22810
+ type: "select",
22811
+ label: "More events",
22812
+ description: "How to access events beyond the initial list",
22813
+ required: false,
22814
+ multiple: false,
22815
+ defaultValue: "loadMore",
22816
+ options: [
22817
+ { value: "loadMore", label: "Load more button" },
22818
+ { value: "seeAllLink", label: "Link to another page" }
22819
+ ],
22820
+ ui: { intent: "display" }
22821
+ },
22822
+ {
22823
+ id: "seeAllUrl",
22824
+ type: "link",
22825
+ label: "See all destination",
22826
+ required: false,
22827
+ ui: {
22828
+ intent: "display",
22829
+ visibleWhen: {
22830
+ field: "paginationMode",
22831
+ equals: "seeAllLink"
22832
+ }
22833
+ }
22834
+ },
22835
+ {
22836
+ id: "loadMoreText",
22837
+ type: "text",
22838
+ label: "Button text",
22839
+ description: "Text for the pagination button or link",
22840
+ required: false,
22841
+ multiline: false,
22842
+ defaultValue: "Load more events",
22843
+ maxLength: 40
22844
+ },
22845
+ ...cardStylingFields.map((field) => ({
22846
+ ...field,
22847
+ ui: { ...field.ui ?? {}, intent: "style" }
22848
+ })),
22849
+ ...eventDisplayFields.map((field) => ({
22850
+ ...field,
22851
+ ui: { ...field.ui ?? {}, intent: "display" }
22852
+ })),
22853
+ {
22854
+ id: "kind",
22855
+ type: "select",
22856
+ label: "Show",
22857
+ description: "Choose whether this list shows courses, events, or both",
22858
+ required: false,
22859
+ multiple: false,
22860
+ defaultValue: "all",
22861
+ options: [
22862
+ { value: "all", label: "Courses and events" },
22863
+ { value: "courses", label: "Courses only" },
22864
+ { value: "events", label: "Events only" }
22865
+ ],
22866
+ ui: { intent: "behavior" }
22867
+ },
22868
+ {
22869
+ id: "eventSurface",
22870
+ type: "select",
22871
+ label: "Event surface",
22872
+ description: "Choose a semantic event scope",
22873
+ required: false,
22874
+ multiple: false,
22875
+ defaultValue: "all",
22876
+ options: [
22877
+ { value: "all", label: "All events" },
22878
+ { value: "regularClassSchedule", label: "Regular class schedule" },
22879
+ { value: "specialDatedEvents", label: "Workshops and special events" },
22880
+ { value: "custom", label: "Custom" }
22881
+ ],
22882
+ ui: { intent: "behavior" }
22883
+ },
22884
+ {
22885
+ id: "filterEventPresets",
22886
+ type: "select",
22887
+ label: "Pre-filter by event type",
22888
+ description: "Restrict this block to specific event types",
22889
+ required: false,
22890
+ multiple: true,
22891
+ defaultValue: [],
22892
+ options: [
22893
+ { value: "class", label: "Classes" },
22894
+ { value: "workshop", label: "Workshops" },
22895
+ { value: "retreat", label: "Retreats" },
22896
+ { value: "performance", label: "Performances" }
22897
+ ],
22898
+ ui: {
22899
+ intent: "behavior",
22900
+ visibleWhen: { field: "eventSurface", equals: "custom" }
22901
+ }
22902
+ },
22903
+ {
22904
+ id: "scheduleScope",
22905
+ type: "select",
22906
+ label: "Schedule cadence",
22907
+ description: "Restrict this block by recurrence",
22908
+ required: false,
22909
+ multiple: false,
22910
+ defaultValue: "any",
22911
+ options: [
22912
+ { value: "any", label: "Any cadence" },
22913
+ { value: "recurring", label: "Recurring only" },
22914
+ { value: "oneOff", label: "One-off only" }
22915
+ ],
22916
+ ui: {
22917
+ intent: "behavior",
22918
+ visibleWhen: { field: "eventSurface", equals: "custom" }
22919
+ }
22920
+ },
22921
+ {
22922
+ ...emptyStateField,
22923
+ ui: { ...emptyStateField.ui ?? {}, intent: "display" }
22924
+ },
22925
+ sectionStylesField({
22926
+ id: "_sectionStyles",
22927
+ label: "Section styles",
22928
+ renderInHeader: false
22929
+ })
22930
+ ];
22931
+ var eventListingLayout = [
22932
+ styledSection({
22933
+ children: sectionContainer([
22934
+ // Optional heading
22935
+ text(
22936
+ { as: "h2" },
22937
+ bind("content.heading"),
22938
+ when("content.heading")
22939
+ ),
22940
+ // Optional description
22941
+ richText(
22942
+ { className: "rb-prose rb-max-w-none" },
22943
+ bind("content.description"),
22944
+ when("content.description")
22945
+ ),
22946
+ // Event listing component with pagination
22947
+ el("event-listing", withApiBindings({
22948
+ events: { $bind: { from: "data.events" } },
22949
+ stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
22950
+ layout: { $bind: { from: "content.layout", fallback: "grid" } },
22951
+ columns: { $bind: { from: "content.columns", fallback: "3" } },
22952
+ eventsPerPage: { $bind: { from: "content.eventsPerPage", fallback: "12" } },
22953
+ paginationMode: { $bind: { from: "content.paginationMode", fallback: "loadMore" } },
22954
+ seeAllUrl: { $bind: { from: "content.seeAllUrl", transforms: [{ id: "links.resolve" }] } },
22955
+ loadMoreText: { $bind: { from: "content.loadMoreText", fallback: "Load more events" } },
22956
+ cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
22957
+ buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
22958
+ buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
22959
+ showVenue: { $bind: { from: "content.showVenue" } },
22960
+ showMap: { $bind: { from: "content.showMap" } },
22961
+ showCapacity: { $bind: { from: "content.showCapacity" } },
22962
+ eventKind: { $bind: { from: "content.kind", fallback: "all" } },
22963
+ eventSurface: { $bind: { from: "content.eventSurface", fallback: "all" } },
22964
+ filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
22965
+ scheduleScope: { $bind: { from: "content.scheduleScope", fallback: "any" } },
22966
+ emptyMessage: { $bind: { from: "content.emptyMessage" } }
22967
+ }))
22968
+ ], {
22969
+ gap: "lg"
22970
+ }),
22971
+ // sectionContainer (rb-container) already provides horizontal padding
22972
+ baseClass: "",
22973
+ spacing: "comfortable"
22974
+ })
22975
+ ];
22976
+ var eventListingDerivedFields = [
22977
+ {
22978
+ id: "layout",
22979
+ type: "select",
22980
+ required: false,
22981
+ multiple: false,
22982
+ options: [
22983
+ { value: "grid" },
22984
+ { value: "stack" }
22985
+ ]
22986
+ },
22987
+ {
22988
+ id: "paginationMode",
22989
+ type: "select",
22990
+ required: false,
22991
+ multiple: false,
22992
+ options: [
22993
+ { value: "loadMore" },
22994
+ { value: "seeAllLink" }
22995
+ ]
22996
+ }
22997
+ ];
22998
+ var eventListingContentShape = {
22999
+ additionalFields: eventListingDerivedFields,
23000
+ skipSectionStyles: true
23001
+ };
23002
+ var eventListingConfig = {
22384
23003
  id: "block.event-listing",
22385
23004
  version: "1.1.0",
22386
23005
  title: "Event Listing",
@@ -22388,211 +23007,18 @@ var eventListingManifest = createBlockManifest({
22388
23007
  description: "Paginated list of all upcoming events",
22389
23008
  // Preserve legacy section styles field configuration (renderInHeader: false).
22390
23009
  skipSectionStyles: true,
22391
- additionalFields: [
22392
- ...sectionHeaderFields("All Events"),
22393
- ...(() => {
22394
- const columns = columnsField(["2", "3", "4"]);
22395
- return [
22396
- {
22397
- ...layoutField,
22398
- ui: { ...layoutField.ui ?? {}, intent: "display" }
22399
- },
22400
- {
22401
- ...columns,
22402
- ui: { ...columns.ui ?? {}, intent: "display" }
22403
- }
22404
- ];
22405
- })(),
22406
- {
22407
- id: "eventsPerPage",
22408
- type: "select",
22409
- label: "Events per page",
22410
- description: "Number of events to load at a time",
22411
- required: false,
22412
- multiple: false,
22413
- defaultValue: "12",
22414
- options: [
22415
- { value: "3", label: "3 events" },
22416
- { value: "6", label: "6 events" },
22417
- { value: "12", label: "12 events" },
22418
- { value: "24", label: "24 events" }
22419
- ],
22420
- ui: { intent: "display" }
22421
- },
22422
- {
22423
- id: "paginationMode",
22424
- type: "select",
22425
- label: "More events",
22426
- description: "How to access events beyond the initial list",
22427
- required: false,
22428
- multiple: false,
22429
- defaultValue: "loadMore",
22430
- options: [
22431
- { value: "loadMore", label: "Load more button" },
22432
- { value: "seeAllLink", label: "Link to another page" }
22433
- ],
22434
- ui: { intent: "display" }
22435
- },
22436
- {
22437
- id: "seeAllUrl",
22438
- type: "link",
22439
- label: "See all destination",
22440
- required: false,
22441
- ui: {
22442
- intent: "display",
22443
- visibleWhen: {
22444
- field: "paginationMode",
22445
- equals: "seeAllLink"
22446
- }
22447
- }
22448
- },
22449
- {
22450
- id: "loadMoreText",
22451
- type: "text",
22452
- label: "Button text",
22453
- description: "Text for the pagination button or link",
22454
- required: false,
22455
- multiline: false,
22456
- defaultValue: "Load more events",
22457
- maxLength: 40
22458
- },
22459
- ...cardStylingFields.map((field) => ({
22460
- ...field,
22461
- ui: { ...field.ui ?? {}, intent: "style" }
22462
- })),
22463
- ...eventDisplayFields.map((field) => ({
22464
- ...field,
22465
- ui: { ...field.ui ?? {}, intent: "display" }
22466
- })),
22467
- {
22468
- id: "kind",
22469
- type: "select",
22470
- label: "Show",
22471
- description: "Choose whether this list shows courses, events, or both",
22472
- required: false,
22473
- multiple: false,
22474
- defaultValue: "all",
22475
- options: [
22476
- { value: "all", label: "Courses and events" },
22477
- { value: "courses", label: "Courses only" },
22478
- { value: "events", label: "Events only" }
22479
- ],
22480
- ui: { intent: "behavior" }
22481
- },
22482
- {
22483
- id: "eventSurface",
22484
- type: "select",
22485
- label: "Event surface",
22486
- description: "Choose a semantic event scope",
22487
- required: false,
22488
- multiple: false,
22489
- defaultValue: "all",
22490
- options: [
22491
- { value: "all", label: "All events" },
22492
- { value: "regularClassSchedule", label: "Regular class schedule" },
22493
- { value: "specialDatedEvents", label: "Workshops and special events" },
22494
- { value: "custom", label: "Custom" }
22495
- ],
22496
- ui: { intent: "behavior" }
22497
- },
22498
- {
22499
- id: "filterEventPresets",
22500
- type: "select",
22501
- label: "Pre-filter by event type",
22502
- description: "Restrict this block to specific event types",
22503
- required: false,
22504
- multiple: true,
22505
- defaultValue: [],
22506
- options: [
22507
- { value: "class", label: "Classes" },
22508
- { value: "workshop", label: "Workshops" },
22509
- { value: "retreat", label: "Retreats" },
22510
- { value: "performance", label: "Performances" }
22511
- ],
22512
- ui: {
22513
- intent: "behavior",
22514
- visibleWhen: { field: "eventSurface", equals: "custom" }
22515
- }
22516
- },
22517
- {
22518
- id: "scheduleScope",
22519
- type: "select",
22520
- label: "Schedule cadence",
22521
- description: "Restrict this block by recurrence",
22522
- required: false,
22523
- multiple: false,
22524
- defaultValue: "any",
22525
- options: [
22526
- { value: "any", label: "Any cadence" },
22527
- { value: "recurring", label: "Recurring only" },
22528
- { value: "oneOff", label: "One-off only" }
22529
- ],
22530
- ui: {
22531
- intent: "behavior",
22532
- visibleWhen: { field: "eventSurface", equals: "custom" }
22533
- }
22534
- },
22535
- {
22536
- ...emptyStateField,
22537
- ui: { ...emptyStateField.ui ?? {}, intent: "display" }
22538
- },
22539
- sectionStylesField({
22540
- id: "_sectionStyles",
22541
- label: "Section styles",
22542
- renderInHeader: false
22543
- })
22544
- ],
23010
+ additionalFields: eventListingAdditionalFields,
22545
23011
  styleTokens: { background: "surface", typography: "body", spacing: "md" },
22546
23012
  behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: true },
22547
23013
  category: "interactive",
22548
23014
  tags: ["events", "listing", "paginated", "archive", "all-events"],
22549
23015
  icon: "List",
22550
- layout: [
22551
- styledSection({
22552
- children: sectionContainer([
22553
- // Optional heading
22554
- text(
22555
- { as: "h2" },
22556
- bind("content.heading"),
22557
- when("content.heading")
22558
- ),
22559
- // Optional description
22560
- richText(
22561
- { className: "rb-prose rb-max-w-none" },
22562
- bind("content.description"),
22563
- when("content.description")
22564
- ),
22565
- // Event listing component with pagination
22566
- el("event-listing", withApiBindings({
22567
- events: { $bind: { from: "data.events" } },
22568
- stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
22569
- layout: { $bind: { from: "content.layout", fallback: "grid" } },
22570
- columns: { $bind: { from: "content.columns", fallback: "3" } },
22571
- eventsPerPage: { $bind: { from: "content.eventsPerPage", fallback: "12" } },
22572
- paginationMode: { $bind: { from: "content.paginationMode", fallback: "loadMore" } },
22573
- seeAllUrl: { $bind: { from: "content.seeAllUrl", transforms: [{ id: "links.resolve" }] } },
22574
- loadMoreText: { $bind: { from: "content.loadMoreText", fallback: "Load more events" } },
22575
- cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
22576
- buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
22577
- buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
22578
- showVenue: { $bind: { from: "content.showVenue" } },
22579
- showMap: { $bind: { from: "content.showMap" } },
22580
- showCapacity: { $bind: { from: "content.showCapacity" } },
22581
- eventKind: { $bind: { from: "content.kind", fallback: "all" } },
22582
- eventSurface: { $bind: { from: "content.eventSurface", fallback: "all" } },
22583
- filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
22584
- scheduleScope: { $bind: { from: "content.scheduleScope", fallback: "any" } },
22585
- emptyMessage: { $bind: { from: "content.emptyMessage" } }
22586
- }))
22587
- ], {
22588
- gap: "lg"
22589
- }),
22590
- // sectionContainer (rb-container) already provides horizontal padding
22591
- baseClass: "",
22592
- spacing: "comfortable"
22593
- })
22594
- ]
22595
- });
23016
+ layout: eventListingLayout
23017
+ };
23018
+ var eventListingManifest = createBlockManifestWithContentShape(
23019
+ eventListingConfig,
23020
+ eventListingContentShape
23021
+ );
22596
23022
  var eventListingBlockDefinition = {
22597
23023
  manifest: eventListingManifest,
22598
23024
  runtime: eventListingBlockRuntime,
@@ -22619,7 +23045,6 @@ var eventListingBlockDefinition = {
22619
23045
 
22620
23046
  // ../blocks/src/system/runtime/nodes/events/EventCalendar.interactive.ts
22621
23047
  import { z as z51 } from "zod";
22622
- var displayModeSchema = z51.enum(["combined", "month", "week", "list", "timetable"]);
22623
23048
  var eventBlockKindSchema2 = z51.enum(eventBlockKindValues);
22624
23049
  var eventSurfaceScopeSchema2 = z51.enum(eventSurfaceScopeValues);
22625
23050
  var eventScheduleScopeSchema3 = z51.enum(eventScheduleScopeValues);
@@ -22629,7 +23054,8 @@ var eventCalendarSourceSchema = z51.object(
22629
23054
  siteId: z51.string(),
22630
23055
  apiBaseUrl: z51.string().optional(),
22631
23056
  stage: previewStageSchema.optional(),
22632
- displayMode: displayModeSchema.nullable().optional(),
23057
+ variant: eventCalendarDisplayModeSchema.nullable().optional(),
23058
+ displayMode: eventCalendarDisplayModeSchema.nullable().optional(),
22633
23059
  listLayout: eventLayoutSchema.optional(),
22634
23060
  listColumns: columnOptionSchema.optional(),
22635
23061
  layout: eventLayoutSchema.optional(),
@@ -22661,7 +23087,7 @@ var eventCalendarSourceSchema = z51.object(
22661
23087
  );
22662
23088
  var eventCalendarDisplaySchema = z51.object({
22663
23089
  kind: z51.literal("event-calendar"),
22664
- displayMode: displayModeSchema,
23090
+ displayMode: eventCalendarDisplayModeSchema,
22665
23091
  className: z51.string().nullable(),
22666
23092
  events: z51.array(publicEventSchema),
22667
23093
  listLayout: eventLayoutSchema,
@@ -22716,7 +23142,7 @@ var eventCalendarIslandMetaKeys = defineInteractiveIslandMetaKeys(
22716
23142
  function buildEventCalendarDisplay(source) {
22717
23143
  return {
22718
23144
  kind: "event-calendar",
22719
- displayMode: source.displayMode ?? "combined",
23145
+ displayMode: source.variant ?? source.displayMode ?? "combined",
22720
23146
  className: source.className ?? null,
22721
23147
  events: (source.events ?? []).slice().sort(
22722
23148
  (left, right) => new Date(left.startsAt).getTime() - new Date(right.startsAt).getTime()
@@ -22783,8 +23209,12 @@ var eventCalendarInteractiveIslandPropsCodec = createInteractiveIslandCodec({
22783
23209
  function normalizeEventCalendarContent(content) {
22784
23210
  const record = typeof content === "object" && content !== null ? content : {};
22785
23211
  const kind = normalizeEventBlockKind(record.kind);
23212
+ const variant = normalizeEventCalendarDisplayMode(record.variant) ?? normalizeEventCalendarDisplayMode(record.displayMode);
22786
23213
  return {
22787
23214
  ...record,
23215
+ ...variant ? { variant } : {},
23216
+ displayMode: normalizeEventCalendarDisplayMode(record.displayMode),
23217
+ listLayout: normalizeEventCalendarListLayout(record.listLayout),
22788
23218
  kind,
22789
23219
  eventSurface: normalizeEventSurfaceScope(record.eventSurface),
22790
23220
  filterEventPresets: normalizeEventSurfacePresets(record.filterEventPresets),
@@ -22796,355 +23226,515 @@ function normalizeEventCalendarContent(content) {
22796
23226
  filterVenueId: normalizeEventVenueId(record.filterVenueId)
22797
23227
  };
22798
23228
  }
22799
- var eventCalendarManifest = createBlockManifest({
22800
- id: "block.event-calendar",
22801
- version: "3.6.0",
22802
- title: "Event Calendar",
22803
- titleSource: "heading",
22804
- description: "Display events with calendar, list, or combined views with filtering",
22805
- // Preserve legacy section styles field configuration (renderInHeader: false).
22806
- skipSectionStyles: true,
22807
- additionalFields: [
22808
- ...sectionHeaderFields("Event Calendar"),
22809
- // Display Mode (replaces calendarView)
22810
- {
22811
- id: "displayMode",
22812
- type: "select",
22813
- label: "Display mode",
22814
- description: "How events are displayed",
22815
- required: false,
22816
- multiple: false,
22817
- defaultValue: "combined",
22818
- options: [
22819
- { value: "combined", label: "Combined (List + Calendar tabs)" },
22820
- { value: "month", label: "Month calendar" },
22821
- { value: "week", label: "Week agenda" },
22822
- { value: "timetable", label: "Timetable" },
22823
- { value: "list", label: "List" }
22824
- ],
22825
- ui: { intent: "display" }
22826
- },
22827
- // List options (visible when displayMode is list or combined)
22828
- {
22829
- id: "listLayout",
22830
- type: "select",
22831
- label: "List layout",
22832
- description: "Layout style for list view",
22833
- required: false,
22834
- multiple: false,
22835
- defaultValue: "stack",
22836
- options: [
22837
- { value: "stack", label: "Stack (full-width cards)" },
22838
- { value: "grid", label: "Grid" },
22839
- { value: "compact", label: "Compact (dense rows)" }
22840
- ],
22841
- ui: {
22842
- intent: "display",
22843
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list"] }
22844
- }
22845
- },
22846
- {
22847
- id: "listColumns",
22848
- type: "select",
22849
- label: "Grid columns",
22850
- description: "Number of columns in grid layout",
22851
- required: false,
22852
- multiple: false,
22853
- defaultValue: "3",
22854
- options: [
22855
- { value: "2", label: "2 columns" },
22856
- { value: "3", label: "3 columns" },
22857
- { value: "4", label: "4 columns" }
22858
- ],
22859
- ui: {
22860
- intent: "display",
22861
- visibleWhen: { field: "listLayout", equals: "grid" }
22862
- }
22863
- },
22864
- {
22865
- id: "eventsPerPage",
22866
- type: "select",
22867
- label: "Events per page (cards)",
22868
- description: "Number of events to load initially in card layouts",
22869
- required: false,
22870
- multiple: false,
22871
- defaultValue: "12",
22872
- options: [
22873
- { value: "6", label: "6" },
22874
- { value: "12", label: "12" },
22875
- { value: "24", label: "24" }
22876
- ],
22877
- ui: {
22878
- intent: "display",
22879
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list"] }
22880
- }
22881
- },
22882
- {
22883
- id: "compactEventsPerPage",
22884
- type: "select",
22885
- label: "Events per page (compact)",
22886
- description: "Number of events to show per page in compact layout",
22887
- required: false,
22888
- multiple: false,
22889
- defaultValue: "10",
22890
- options: [
22891
- { value: "10", label: "10" },
22892
- { value: "20", label: "20" },
22893
- { value: "30", label: "30" }
22894
- ],
22895
- ui: {
22896
- intent: "display",
22897
- visibleWhen: { field: "listLayout", equals: "compact" }
22898
- }
22899
- },
22900
- {
22901
- id: "loadMoreText",
22902
- type: "text",
22903
- label: "Load more button text",
22904
- description: "Text for the load more button",
22905
- required: false,
22906
- multiline: false,
22907
- defaultValue: "Load more events",
22908
- ui: {
22909
- intent: "content",
22910
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list"] }
22911
- }
22912
- },
22913
- // Calendar options
22914
- {
22915
- id: "startOfWeek",
22916
- type: "select",
22917
- label: "Week starts on",
22918
- description: "First day of the week",
22919
- required: false,
22920
- multiple: false,
22921
- defaultValue: "monday",
22922
- options: [
22923
- { value: "sunday", label: "Sunday" },
22924
- { value: "monday", label: "Monday" }
22925
- ],
22926
- ui: {
22927
- intent: "display",
22928
- visibleWhen: {
22929
- field: "displayMode",
22930
- oneOf: ["combined", "month", "week"]
22931
- }
22932
- }
22933
- },
22934
- // Combined mode options
22935
- {
22936
- id: "calendarTabViews",
22937
- type: "select",
22938
- label: "Calendar tab views",
22939
- description: "Which calendar views to show in the Calendar tab",
22940
- required: false,
22941
- multiple: false,
22942
- defaultValue: "both",
22943
- options: [
22944
- { value: "both", label: "Month + Week toggle" },
22945
- { value: "month", label: "Month only" },
22946
- { value: "week", label: "Week only" }
22947
- ],
22948
- ui: {
22949
- intent: "display",
22950
- visibleWhen: { field: "displayMode", equals: "combined" }
22951
- }
22952
- },
22953
- // Filtering options
22954
- {
22955
- id: "kind",
22956
- type: "select",
22957
- label: "Show",
22958
- description: "Restrict this block to all offerings, courses, or events",
22959
- required: false,
22960
- multiple: false,
22961
- defaultValue: "all",
22962
- options: [
22963
- { value: "all", label: "All offerings" },
22964
- { value: "courses", label: "Courses only" },
22965
- { value: "events", label: "Events only" }
22966
- ],
22967
- ui: { intent: "behavior" }
22968
- },
22969
- {
22970
- id: "showFilters",
22971
- type: "boolean",
22972
- label: "Show filters",
22973
- description: "Show category, staff, and venue filters",
22974
- required: false,
22975
- defaultValue: true,
22976
- ui: {
22977
- intent: "display",
22978
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
22979
- }
22980
- },
22981
- {
22982
- id: "showCategoryFilter",
22983
- type: "select",
22984
- label: "Show category filter",
22985
- description: "When to show the category filter dropdown",
22986
- required: false,
22987
- multiple: false,
22988
- defaultValue: "auto",
22989
- options: [
22990
- { value: "auto", label: "Auto (when >1 category has events)" },
22991
- { value: "always", label: "Always" },
22992
- { value: "never", label: "Never" }
23229
+ function normalizeEventCalendarDisplayMode(value) {
23230
+ return isEventCalendarDisplayMode(value) ? value : void 0;
23231
+ }
23232
+ function normalizeEventCalendarListLayout(value) {
23233
+ return isEventCalendarListLayout(value) ? value : void 0;
23234
+ }
23235
+ var eventCalendarLayout = [
23236
+ styledSection({
23237
+ children: sectionContainer(
23238
+ [
23239
+ // Optional heading
23240
+ text({ as: "h2" }, bind("content.heading"), when("content.heading")),
23241
+ // Optional description
23242
+ richText(
23243
+ { className: "rb-prose rb-max-w-none" },
23244
+ bind("content.description"),
23245
+ when("content.description")
23246
+ ),
23247
+ // Event calendar component (handles all display modes)
23248
+ el(
23249
+ "event-calendar",
23250
+ withApiBindings({
23251
+ events: { $bind: { from: "data.events" } },
23252
+ stage: {
23253
+ $bind: { from: "$root.previewStage", fallback: "published" }
23254
+ },
23255
+ // Variant is the new Theme V2-facing display mode. displayMode is
23256
+ // retained as a legacy fallback for existing content.
23257
+ variant: {
23258
+ $bind: { from: "content.variant" }
23259
+ },
23260
+ displayMode: {
23261
+ $bind: { from: "content.displayMode" }
23262
+ },
23263
+ // List options
23264
+ listLayout: { $bind: { from: "content.listLayout" } },
23265
+ listColumns: { $bind: { from: "content.listColumns" } },
23266
+ // Legacy compatibility: older event-calendar content used layout/columns
23267
+ layout: { $bind: { from: "content.layout" } },
23268
+ columns: { $bind: { from: "content.columns" } },
23269
+ eventsPerPage: {
23270
+ $bind: { from: "content.eventsPerPage", fallback: "12" }
23271
+ },
23272
+ compactEventsPerPage: {
23273
+ $bind: { from: "content.compactEventsPerPage", fallback: "10" }
23274
+ },
23275
+ loadMoreText: {
23276
+ $bind: {
23277
+ from: "content.loadMoreText",
23278
+ fallback: "Load more events"
23279
+ }
23280
+ },
23281
+ // Calendar options
23282
+ startOfWeek: {
23283
+ $bind: { from: "content.startOfWeek", fallback: "monday" }
23284
+ },
23285
+ calendarTabViews: {
23286
+ $bind: { from: "content.calendarTabViews", fallback: "both" }
23287
+ },
23288
+ // Filtering options
23289
+ showFilters: {
23290
+ $bind: { from: "content.showFilters", fallback: true }
23291
+ },
23292
+ showCategoryFilter: {
23293
+ $bind: { from: "content.showCategoryFilter", fallback: "auto" }
23294
+ },
23295
+ showVenueFilter: {
23296
+ $bind: { from: "content.showVenueFilter", fallback: false }
23297
+ },
23298
+ showStaffFilter: {
23299
+ $bind: { from: "content.showStaffFilter", fallback: true }
23300
+ },
23301
+ showCapacity: {
23302
+ $bind: { from: "content.showCapacity", fallback: true }
23303
+ },
23304
+ kind: { $bind: { from: "content.kind", fallback: "all" } },
23305
+ eventSurface: {
23306
+ $bind: { from: "content.eventSurface", fallback: "all" }
23307
+ },
23308
+ filterEventPresets: {
23309
+ $bind: { from: "content.filterEventPresets" }
23310
+ },
23311
+ scheduleScope: {
23312
+ $bind: { from: "content.scheduleScope", fallback: "any" }
23313
+ },
23314
+ filterCategoryIds: {
23315
+ $bind: { from: "content.filterCategoryIds" }
23316
+ },
23317
+ filterStaffMemberId: {
23318
+ $bind: { from: "content.filterStaffMemberId" }
23319
+ },
23320
+ filterVenueId: { $bind: { from: "content.filterVenueId" } },
23321
+ // Styling
23322
+ buttonVariant: {
23323
+ $bind: { from: "content.buttonVariant", fallback: "primary" }
23324
+ },
23325
+ buttonText: {
23326
+ $bind: { from: "content.buttonText", fallback: "View event" }
23327
+ },
23328
+ emptyMessage: { $bind: { from: "content.emptyMessage" } }
23329
+ })
23330
+ )
22993
23331
  ],
22994
- ui: {
22995
- intent: "display",
22996
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
22997
- }
22998
- },
22999
- {
23000
- id: "showVenueFilter",
23001
- type: "boolean",
23002
- label: "Show venue filter",
23003
- description: "Show venue filter dropdown",
23004
- required: false,
23005
- defaultValue: false,
23006
- ui: {
23007
- intent: "display",
23008
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
23009
- }
23010
- },
23011
- {
23012
- id: "showStaffFilter",
23013
- type: "boolean",
23014
- label: "Show staff filter",
23015
- description: "Show staff filter dropdown",
23016
- required: false,
23017
- defaultValue: true,
23018
- ui: {
23019
- intent: "display",
23020
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
23021
- }
23022
- },
23023
- {
23024
- id: "showCapacity",
23025
- type: "boolean",
23026
- label: "Show available spots",
23027
- description: "Display remaining capacity on event cards and timetable cells",
23028
- required: false,
23029
- defaultValue: true,
23030
- ui: {
23031
- intent: "display",
23032
- visibleWhen: {
23033
- field: "displayMode",
23034
- oneOf: ["combined", "list", "week", "timetable"]
23035
- }
23332
+ {
23333
+ gap: "lg"
23036
23334
  }
23037
- },
23038
- // Block-level pre-filtering
23039
- {
23040
- id: "eventSurface",
23041
- type: "select",
23042
- label: "Event surface",
23043
- description: "Choose a semantic event scope",
23044
- required: false,
23045
- multiple: false,
23046
- defaultValue: "all",
23047
- options: [
23048
- { value: "all", label: "All events" },
23049
- { value: "regularClassSchedule", label: "Regular class schedule" },
23050
- { value: "specialDatedEvents", label: "Workshops and special events" },
23051
- { value: "custom", label: "Custom" }
23052
- ],
23053
- ui: { intent: "behavior" }
23054
- },
23055
- {
23056
- id: "filterEventPresets",
23057
- type: "select",
23058
- label: "Pre-filter by event type",
23059
- description: "Restrict this block to specific event types",
23060
- required: false,
23061
- multiple: true,
23062
- defaultValue: [],
23063
- options: [
23064
- { value: "class", label: "Classes" },
23065
- { value: "workshop", label: "Workshops" },
23066
- { value: "retreat", label: "Retreats" },
23067
- { value: "performance", label: "Performances" }
23068
- ],
23069
- ui: {
23070
- intent: "behavior",
23071
- visibleWhen: { field: "eventSurface", equals: "custom" }
23335
+ ),
23336
+ // sectionContainer (rb-container) already provides horizontal padding
23337
+ baseClass: "",
23338
+ spacing: "comfortable"
23339
+ })
23340
+ ];
23341
+ var eventCalendarAdditionalFields = [
23342
+ ...sectionHeaderFields("Event Calendar"),
23343
+ // Display Mode (replaces calendarView)
23344
+ {
23345
+ id: "displayMode",
23346
+ type: "select",
23347
+ label: "Display mode",
23348
+ description: "How events are displayed",
23349
+ required: false,
23350
+ multiple: false,
23351
+ defaultValue: "combined",
23352
+ options: [
23353
+ { value: "combined", label: "Combined (List + Calendar tabs)" },
23354
+ { value: "month", label: "Month calendar" },
23355
+ { value: "week", label: "Week agenda" },
23356
+ { value: "timetable", label: "Timetable" },
23357
+ { value: "list", label: "List" }
23358
+ ],
23359
+ ui: { intent: "display", hidden: true }
23360
+ },
23361
+ // List options (visible when displayMode is list or combined)
23362
+ {
23363
+ id: "listLayout",
23364
+ type: "select",
23365
+ label: "List layout",
23366
+ description: "Layout style for list view",
23367
+ required: false,
23368
+ multiple: false,
23369
+ defaultValue: "stack",
23370
+ options: eventCalendarListLayoutOptions.map((option) => ({
23371
+ value: option.id,
23372
+ label: option.label
23373
+ })),
23374
+ ui: {
23375
+ intent: "display",
23376
+ visibleWhen: { field: "variant", oneOf: ["combined", "list"] }
23377
+ }
23378
+ },
23379
+ {
23380
+ id: "listColumns",
23381
+ type: "select",
23382
+ label: "Grid columns",
23383
+ description: "Number of columns in grid layout",
23384
+ required: false,
23385
+ multiple: false,
23386
+ defaultValue: "3",
23387
+ options: [
23388
+ { value: "2", label: "2 columns" },
23389
+ { value: "3", label: "3 columns" },
23390
+ { value: "4", label: "4 columns" }
23391
+ ],
23392
+ ui: {
23393
+ intent: "display",
23394
+ visibleWhen: { field: "listLayout", equals: "grid" }
23395
+ }
23396
+ },
23397
+ {
23398
+ id: "eventsPerPage",
23399
+ type: "select",
23400
+ label: "Events per page (cards)",
23401
+ description: "Number of events to load initially in card layouts",
23402
+ required: false,
23403
+ multiple: false,
23404
+ defaultValue: "12",
23405
+ options: [
23406
+ { value: "6", label: "6" },
23407
+ { value: "12", label: "12" },
23408
+ { value: "24", label: "24" }
23409
+ ],
23410
+ ui: {
23411
+ intent: "display",
23412
+ visibleWhen: { field: "variant", oneOf: ["combined", "list"] }
23413
+ }
23414
+ },
23415
+ {
23416
+ id: "compactEventsPerPage",
23417
+ type: "select",
23418
+ label: "Events per page (compact)",
23419
+ description: "Number of events to show per page in compact layout",
23420
+ required: false,
23421
+ multiple: false,
23422
+ defaultValue: "10",
23423
+ options: [
23424
+ { value: "10", label: "10" },
23425
+ { value: "20", label: "20" },
23426
+ { value: "30", label: "30" }
23427
+ ],
23428
+ ui: {
23429
+ intent: "display",
23430
+ visibleWhen: { field: "listLayout", equals: "compact" }
23431
+ }
23432
+ },
23433
+ {
23434
+ id: "loadMoreText",
23435
+ type: "text",
23436
+ label: "Load more button text",
23437
+ description: "Text for the load more button",
23438
+ required: false,
23439
+ multiline: false,
23440
+ defaultValue: "Load more events",
23441
+ ui: {
23442
+ intent: "content",
23443
+ visibleWhen: { field: "variant", oneOf: ["combined", "list"] }
23444
+ }
23445
+ },
23446
+ // Calendar options
23447
+ {
23448
+ id: "startOfWeek",
23449
+ type: "select",
23450
+ label: "Week starts on",
23451
+ description: "First day of the week",
23452
+ required: false,
23453
+ multiple: false,
23454
+ defaultValue: "monday",
23455
+ options: [
23456
+ { value: "sunday", label: "Sunday" },
23457
+ { value: "monday", label: "Monday" }
23458
+ ],
23459
+ ui: {
23460
+ intent: "display",
23461
+ visibleWhen: {
23462
+ field: "variant",
23463
+ oneOf: ["combined", "month", "week"]
23072
23464
  }
23073
- },
23074
- {
23075
- id: "scheduleScope",
23076
- type: "select",
23077
- label: "Schedule cadence",
23078
- description: "Restrict this block by recurrence",
23079
- required: false,
23080
- multiple: false,
23081
- defaultValue: "any",
23082
- options: [
23083
- { value: "any", label: "Any cadence" },
23084
- { value: "recurring", label: "Recurring only" },
23085
- { value: "oneOff", label: "One-off only" }
23086
- ],
23087
- ui: {
23088
- intent: "behavior",
23089
- visibleWhen: { field: "eventSurface", equals: "custom" }
23465
+ }
23466
+ },
23467
+ // Combined mode options
23468
+ {
23469
+ id: "calendarTabViews",
23470
+ type: "select",
23471
+ label: "Calendar tab views",
23472
+ description: "Which calendar views to show in the Calendar tab",
23473
+ required: false,
23474
+ multiple: false,
23475
+ defaultValue: "both",
23476
+ options: [
23477
+ { value: "both", label: "Month + Week toggle" },
23478
+ { value: "month", label: "Month only" },
23479
+ { value: "week", label: "Week only" }
23480
+ ],
23481
+ ui: {
23482
+ intent: "display",
23483
+ visibleWhen: { field: "variant", equals: "combined" }
23484
+ }
23485
+ },
23486
+ // Filtering options
23487
+ {
23488
+ id: "kind",
23489
+ type: "select",
23490
+ label: "Show",
23491
+ description: "Restrict this block to all offerings, courses, or events",
23492
+ required: false,
23493
+ multiple: false,
23494
+ defaultValue: "all",
23495
+ options: [
23496
+ { value: "all", label: "All offerings" },
23497
+ { value: "courses", label: "Courses only" },
23498
+ { value: "events", label: "Events only" }
23499
+ ],
23500
+ ui: { intent: "behavior" }
23501
+ },
23502
+ {
23503
+ id: "showFilters",
23504
+ type: "boolean",
23505
+ label: "Show filters",
23506
+ description: "Show category, staff, and venue filters",
23507
+ required: false,
23508
+ defaultValue: true,
23509
+ ui: {
23510
+ intent: "display",
23511
+ visibleWhen: {
23512
+ field: "variant",
23513
+ oneOf: ["combined", "list", "timetable"]
23090
23514
  }
23091
- },
23092
- createSiteOptionSelectField({
23093
- id: "filterCategoryIds",
23094
- label: "Pre-filter by categories",
23095
- description: "Restrict this block to specific event categories",
23096
- required: false,
23097
- multiple: true,
23098
- defaultValue: [],
23099
- optionSource: "eventCategories",
23100
- ui: {
23101
- intent: "behavior",
23102
- searchThreshold: 8,
23103
- visibleWhen: { field: "kind", notEquals: "courses" }
23515
+ }
23516
+ },
23517
+ {
23518
+ id: "showCategoryFilter",
23519
+ type: "select",
23520
+ label: "Show category filter",
23521
+ description: "When to show the category filter dropdown",
23522
+ required: false,
23523
+ multiple: false,
23524
+ defaultValue: "auto",
23525
+ options: [
23526
+ { value: "auto", label: "Auto (when >1 category has events)" },
23527
+ { value: "always", label: "Always" },
23528
+ { value: "never", label: "Never" }
23529
+ ],
23530
+ ui: {
23531
+ intent: "display",
23532
+ visibleWhen: {
23533
+ field: "variant",
23534
+ oneOf: ["combined", "list", "timetable"]
23104
23535
  }
23105
- }),
23106
- createSiteOptionSelectField({
23107
- id: "filterStaffMemberId",
23108
- label: "Pre-filter by staff member",
23109
- description: "Restrict this block to a single staff member",
23110
- required: false,
23111
- multiple: false,
23112
- optionSource: "staffMembers",
23113
- ui: {
23114
- intent: "behavior",
23115
- searchThreshold: 8
23536
+ }
23537
+ },
23538
+ {
23539
+ id: "showVenueFilter",
23540
+ type: "boolean",
23541
+ label: "Show venue filter",
23542
+ description: "Show venue filter dropdown",
23543
+ required: false,
23544
+ defaultValue: false,
23545
+ ui: {
23546
+ intent: "display",
23547
+ visibleWhen: {
23548
+ field: "variant",
23549
+ oneOf: ["combined", "list", "timetable"]
23116
23550
  }
23117
- }),
23118
- createSiteOptionSelectField({
23119
- id: "filterVenueId",
23120
- label: "Pre-filter by venue",
23121
- description: "Restrict this block to a single venue",
23122
- required: false,
23123
- multiple: false,
23124
- optionSource: "venues",
23125
- ui: {
23126
- intent: "behavior",
23127
- searchThreshold: 8
23551
+ }
23552
+ },
23553
+ {
23554
+ id: "showStaffFilter",
23555
+ type: "boolean",
23556
+ label: "Show staff filter",
23557
+ description: "Show staff filter dropdown",
23558
+ required: false,
23559
+ defaultValue: true,
23560
+ ui: {
23561
+ intent: "display",
23562
+ visibleWhen: {
23563
+ field: "variant",
23564
+ oneOf: ["combined", "list", "timetable"]
23128
23565
  }
23129
- }),
23130
- // Card styling
23131
- ...cardStylingFields.filter((f) => f.id === "buttonVariant" || f.id === "buttonText").map((field) => ({
23132
- ...field,
23133
- ui: {
23134
- ...field.ui ?? {},
23135
- intent: field.id === "buttonVariant" ? "style" : "content"
23566
+ }
23567
+ },
23568
+ {
23569
+ id: "showCapacity",
23570
+ type: "boolean",
23571
+ label: "Show available spots",
23572
+ description: "Display remaining capacity on event cards and timetable cells",
23573
+ required: false,
23574
+ defaultValue: true,
23575
+ ui: {
23576
+ intent: "display",
23577
+ visibleWhen: {
23578
+ field: "variant",
23579
+ oneOf: ["combined", "list", "week", "timetable"]
23136
23580
  }
23137
- })),
23138
- {
23139
- ...emptyStateField,
23140
- ui: { ...emptyStateField.ui ?? {}, intent: "display" }
23141
- },
23142
- sectionStylesField({
23143
- id: "_sectionStyles",
23144
- label: "Section styles",
23145
- renderInHeader: false
23146
- })
23147
- ],
23581
+ }
23582
+ },
23583
+ // Block-level pre-filtering
23584
+ {
23585
+ id: "eventSurface",
23586
+ type: "select",
23587
+ label: "Event surface",
23588
+ description: "Choose a semantic event scope",
23589
+ required: false,
23590
+ multiple: false,
23591
+ defaultValue: "all",
23592
+ options: [
23593
+ { value: "all", label: "All events" },
23594
+ { value: "regularClassSchedule", label: "Regular class schedule" },
23595
+ { value: "specialDatedEvents", label: "Workshops and special events" },
23596
+ { value: "custom", label: "Custom" }
23597
+ ],
23598
+ ui: { intent: "behavior" }
23599
+ },
23600
+ {
23601
+ id: "filterEventPresets",
23602
+ type: "select",
23603
+ label: "Pre-filter by event type",
23604
+ description: "Restrict this block to specific event types",
23605
+ required: false,
23606
+ multiple: true,
23607
+ defaultValue: [],
23608
+ options: [
23609
+ { value: "class", label: "Classes" },
23610
+ { value: "workshop", label: "Workshops" },
23611
+ { value: "retreat", label: "Retreats" },
23612
+ { value: "performance", label: "Performances" }
23613
+ ],
23614
+ ui: {
23615
+ intent: "behavior",
23616
+ visibleWhen: { field: "eventSurface", equals: "custom" }
23617
+ }
23618
+ },
23619
+ {
23620
+ id: "scheduleScope",
23621
+ type: "select",
23622
+ label: "Schedule cadence",
23623
+ description: "Restrict this block by recurrence",
23624
+ required: false,
23625
+ multiple: false,
23626
+ defaultValue: "any",
23627
+ options: [
23628
+ { value: "any", label: "Any cadence" },
23629
+ { value: "recurring", label: "Recurring only" },
23630
+ { value: "oneOff", label: "One-off only" }
23631
+ ],
23632
+ ui: {
23633
+ intent: "behavior",
23634
+ visibleWhen: { field: "eventSurface", equals: "custom" }
23635
+ }
23636
+ },
23637
+ createSiteOptionSelectField({
23638
+ id: "filterCategoryIds",
23639
+ label: "Pre-filter by categories",
23640
+ description: "Restrict this block to specific event categories",
23641
+ required: false,
23642
+ multiple: true,
23643
+ defaultValue: [],
23644
+ optionSource: "eventCategories",
23645
+ ui: {
23646
+ intent: "behavior",
23647
+ searchThreshold: 8,
23648
+ visibleWhen: { field: "kind", notEquals: "courses" }
23649
+ }
23650
+ }),
23651
+ createSiteOptionSelectField({
23652
+ id: "filterStaffMemberId",
23653
+ label: "Pre-filter by staff member",
23654
+ description: "Restrict this block to a single staff member",
23655
+ required: false,
23656
+ multiple: false,
23657
+ optionSource: "staffMembers",
23658
+ ui: {
23659
+ intent: "behavior",
23660
+ searchThreshold: 8
23661
+ }
23662
+ }),
23663
+ createSiteOptionSelectField({
23664
+ id: "filterVenueId",
23665
+ label: "Pre-filter by venue",
23666
+ description: "Restrict this block to a single venue",
23667
+ required: false,
23668
+ multiple: false,
23669
+ optionSource: "venues",
23670
+ ui: {
23671
+ intent: "behavior",
23672
+ searchThreshold: 8
23673
+ }
23674
+ }),
23675
+ // Card styling
23676
+ ...cardStylingFields.filter((f) => f.id === "buttonVariant" || f.id === "buttonText").map((field) => ({
23677
+ ...field,
23678
+ ui: {
23679
+ ...field.ui ?? {},
23680
+ intent: field.id === "buttonVariant" ? "style" : "content"
23681
+ }
23682
+ })),
23683
+ {
23684
+ ...emptyStateField,
23685
+ ui: { ...emptyStateField.ui ?? {}, intent: "display" }
23686
+ },
23687
+ sectionStylesField({
23688
+ id: "_sectionStyles",
23689
+ label: "Section styles",
23690
+ renderInHeader: false
23691
+ })
23692
+ ];
23693
+ var eventCalendarVariants = {
23694
+ combined: eventCalendarLayout[0],
23695
+ month: eventCalendarLayout[0],
23696
+ week: eventCalendarLayout[0],
23697
+ timetable: eventCalendarLayout[0],
23698
+ list: eventCalendarLayout[0]
23699
+ };
23700
+ var eventCalendarDerivedFields = [
23701
+ {
23702
+ id: "displayMode",
23703
+ type: "select",
23704
+ required: false,
23705
+ multiple: false,
23706
+ options: [
23707
+ { value: "combined" },
23708
+ { value: "month" },
23709
+ { value: "week" },
23710
+ { value: "timetable" },
23711
+ { value: "list" }
23712
+ ]
23713
+ },
23714
+ {
23715
+ id: "listLayout",
23716
+ type: "select",
23717
+ required: false,
23718
+ multiple: false,
23719
+ options: eventCalendarListLayoutOptions.map((option) => ({
23720
+ value: option.id
23721
+ }))
23722
+ }
23723
+ ];
23724
+ var eventCalendarContentShape = {
23725
+ additionalFields: eventCalendarDerivedFields,
23726
+ variants: eventCalendarVariants,
23727
+ skipSectionStyles: true
23728
+ };
23729
+ var eventCalendarConfig = {
23730
+ id: "block.event-calendar",
23731
+ version: "3.6.0",
23732
+ title: "Event Calendar",
23733
+ titleSource: "heading",
23734
+ description: "Display events with calendar, list, or combined views with filtering",
23735
+ // Preserve legacy section styles field configuration (renderInHeader: false).
23736
+ skipSectionStyles: true,
23737
+ additionalFields: eventCalendarAdditionalFields,
23148
23738
  styleTokens: { background: "surface", typography: "body", spacing: "md" },
23149
23739
  behaviours: {
23150
23740
  supportsThemeSwitching: true,
@@ -23164,109 +23754,21 @@ var eventCalendarManifest = createBlockManifest({
23164
23754
  "filter"
23165
23755
  ],
23166
23756
  icon: "CalendarDays",
23167
- layout: [
23168
- styledSection({
23169
- children: sectionContainer(
23170
- [
23171
- // Optional heading
23172
- text({ as: "h2" }, bind("content.heading"), when("content.heading")),
23173
- // Optional description
23174
- richText(
23175
- { className: "rb-prose rb-max-w-none" },
23176
- bind("content.description"),
23177
- when("content.description")
23178
- ),
23179
- // Event calendar component (handles all display modes)
23180
- el(
23181
- "event-calendar",
23182
- withApiBindings({
23183
- events: { $bind: { from: "data.events" } },
23184
- stage: {
23185
- $bind: { from: "$root.previewStage", fallback: "published" }
23186
- },
23187
- // Display mode
23188
- displayMode: {
23189
- $bind: { from: "content.displayMode", fallback: "combined" }
23190
- },
23191
- // List options
23192
- listLayout: { $bind: { from: "content.listLayout" } },
23193
- listColumns: { $bind: { from: "content.listColumns" } },
23194
- // Legacy compatibility: older event-calendar content used layout/columns
23195
- layout: { $bind: { from: "content.layout" } },
23196
- columns: { $bind: { from: "content.columns" } },
23197
- eventsPerPage: {
23198
- $bind: { from: "content.eventsPerPage", fallback: "12" }
23199
- },
23200
- compactEventsPerPage: {
23201
- $bind: { from: "content.compactEventsPerPage", fallback: "10" }
23202
- },
23203
- loadMoreText: {
23204
- $bind: {
23205
- from: "content.loadMoreText",
23206
- fallback: "Load more events"
23207
- }
23208
- },
23209
- // Calendar options
23210
- startOfWeek: {
23211
- $bind: { from: "content.startOfWeek", fallback: "monday" }
23212
- },
23213
- calendarTabViews: {
23214
- $bind: { from: "content.calendarTabViews", fallback: "both" }
23215
- },
23216
- // Filtering options
23217
- showFilters: {
23218
- $bind: { from: "content.showFilters", fallback: true }
23219
- },
23220
- showCategoryFilter: {
23221
- $bind: { from: "content.showCategoryFilter", fallback: "auto" }
23222
- },
23223
- showVenueFilter: {
23224
- $bind: { from: "content.showVenueFilter", fallback: false }
23225
- },
23226
- showStaffFilter: {
23227
- $bind: { from: "content.showStaffFilter", fallback: true }
23228
- },
23229
- showCapacity: {
23230
- $bind: { from: "content.showCapacity", fallback: true }
23231
- },
23232
- kind: { $bind: { from: "content.kind", fallback: "all" } },
23233
- eventSurface: {
23234
- $bind: { from: "content.eventSurface", fallback: "all" }
23235
- },
23236
- filterEventPresets: {
23237
- $bind: { from: "content.filterEventPresets" }
23238
- },
23239
- scheduleScope: {
23240
- $bind: { from: "content.scheduleScope", fallback: "any" }
23241
- },
23242
- filterCategoryIds: {
23243
- $bind: { from: "content.filterCategoryIds" }
23244
- },
23245
- filterStaffMemberId: {
23246
- $bind: { from: "content.filterStaffMemberId" }
23247
- },
23248
- filterVenueId: { $bind: { from: "content.filterVenueId" } },
23249
- // Styling
23250
- buttonVariant: {
23251
- $bind: { from: "content.buttonVariant", fallback: "primary" }
23252
- },
23253
- buttonText: {
23254
- $bind: { from: "content.buttonText", fallback: "View event" }
23255
- },
23256
- emptyMessage: { $bind: { from: "content.emptyMessage" } }
23257
- })
23258
- )
23259
- ],
23260
- {
23261
- gap: "lg"
23262
- }
23263
- ),
23264
- // sectionContainer (rb-container) already provides horizontal padding
23265
- baseClass: "",
23266
- spacing: "comfortable"
23267
- })
23268
- ]
23269
- });
23757
+ layout: eventCalendarLayout,
23758
+ variants: eventCalendarVariants,
23759
+ defaultVariant: "combined",
23760
+ variantOptions: {
23761
+ combined: { label: "Combined" },
23762
+ month: { label: "Month" },
23763
+ week: { label: "Week" },
23764
+ timetable: { label: "Timetable" },
23765
+ list: { label: "List" }
23766
+ }
23767
+ };
23768
+ var eventCalendarManifest = createBlockManifestWithContentShape(
23769
+ eventCalendarConfig,
23770
+ eventCalendarContentShape
23771
+ );
23270
23772
  var eventCalendarBlockDefinition = {
23271
23773
  manifest: eventCalendarManifest,
23272
23774
  normalizeContent: normalizeEventCalendarContent,
@@ -27319,14 +27821,29 @@ function mediaPanelCapable() {
27319
27821
  var allSectionSurfaces = [
27320
27822
  "base",
27321
27823
  "muted-band",
27322
- "accent-band"
27824
+ "accent-band",
27825
+ "brand-depth-band"
27323
27826
  ];
27324
27827
  var heroSectionSurfaces = [
27325
27828
  "base",
27326
27829
  "muted-band",
27327
27830
  "accent-band",
27831
+ "brand-depth-band",
27328
27832
  "hero-image"
27329
27833
  ];
27834
+ var scheduleTileTreatments = [
27835
+ "default",
27836
+ "quiet",
27837
+ "brand-depth"
27838
+ ];
27839
+ function scheduleDetailsCapable() {
27840
+ return declareBlockDesignCapability({
27841
+ sectionSurfaces: "supported",
27842
+ contentFrames: ["plain"],
27843
+ itemSurfaces: "unsupported",
27844
+ tileTreatments: scheduleTileTreatments
27845
+ });
27846
+ }
27330
27847
  function defaultBoundaryBias(visualWeight) {
27331
27848
  return visualWeight === "featured" || visualWeight === "immersive" ? "clear" : "soft";
27332
27849
  }
@@ -27564,7 +28081,7 @@ var systemBlockDefinitionsRaw = [
27564
28081
  flow: conversionFlow,
27565
28082
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
27566
28083
  })),
27567
- withDesignCapability("block.event-details", eventDetailsBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
28084
+ withDesignCapability("block.event-details", eventDetailsBlockDefinition, scheduleDetailsCapable(), defineBlockDesignMetadata({
27568
28085
  flow: offeringsFlow,
27569
28086
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
27570
28087
  })),
@@ -27572,7 +28089,7 @@ var systemBlockDefinitionsRaw = [
27572
28089
  flow: conversionFlow,
27573
28090
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
27574
28091
  })),
27575
- withDesignCapability("block.course-details", courseDetailsBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
28092
+ withDesignCapability("block.course-details", courseDetailsBlockDefinition, scheduleDetailsCapable(), defineBlockDesignMetadata({
27576
28093
  flow: offeringsFlow,
27577
28094
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
27578
28095
  })),
@@ -27587,7 +28104,13 @@ var systemBlockDefinitionsRaw = [
27587
28104
  })),
27588
28105
  withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
27589
28106
  flow: offeringsFlow,
27590
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
28107
+ layoutProfiles: [
28108
+ layoutProfile({ variantKey: "combined", family: "grid", weight: "standard" }),
28109
+ layoutProfile({ variantKey: "list", family: "stack", weight: "standard" }),
28110
+ layoutProfile({ variantKey: "month", family: "grid", weight: "standard" }),
28111
+ layoutProfile({ variantKey: "week", family: "stack", weight: "standard" }),
28112
+ layoutProfile({ variantKey: "timetable", family: "stack", weight: "standard" })
28113
+ ]
27591
28114
  })),
27592
28115
  // Friendly wrapper blocks
27593
28116
  withDesignCapability("block.team-members", teamMembersBlockDefinition, sectionOnly(), defineBlockDesignMetadata({