@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
@@ -1043,6 +1043,14 @@ var ENDPOINT_DEFINITIONS = {
1043
1043
  auth: "user",
1044
1044
  responseKind: "json"
1045
1045
  },
1046
+ exportAppointmentServicesCsv: {
1047
+ path: "/sites/{siteId}/bookings/services/export.csv",
1048
+ method: "GET",
1049
+ tags: ["site-{siteId}", "bookings", "appointment-services-{siteId}"],
1050
+ errors: [],
1051
+ auth: "user",
1052
+ responseKind: "blob"
1053
+ },
1046
1054
  createAppointmentService: {
1047
1055
  path: "/sites/{siteId}/bookings/services",
1048
1056
  method: "POST",
@@ -1311,6 +1319,14 @@ var ENDPOINT_DEFINITIONS = {
1311
1319
  auth: "user",
1312
1320
  responseKind: "json"
1313
1321
  },
1322
+ exportCoursesCsv: {
1323
+ path: "/sites/{siteId}/bookings/courses/export.csv",
1324
+ method: "GET",
1325
+ tags: ["site-{siteId}", "bookings", "courses-{siteId}"],
1326
+ errors: [],
1327
+ auth: "user",
1328
+ responseKind: "blob"
1329
+ },
1314
1330
  createCourse: {
1315
1331
  path: "/sites/{siteId}/bookings/courses",
1316
1332
  method: "POST",
@@ -1410,6 +1426,14 @@ var ENDPOINT_DEFINITIONS = {
1410
1426
  responseKind: "json",
1411
1427
  errors: []
1412
1428
  },
1429
+ exportCourseWaitlistCsv: {
1430
+ path: "/sites/{siteId}/bookings/courses/{courseId}/waitlist/export.csv",
1431
+ method: "GET",
1432
+ tags: ["site-{siteId}", "bookings", "courses-{courseId}"],
1433
+ auth: "user",
1434
+ responseKind: "blob",
1435
+ errors: []
1436
+ },
1413
1437
  updateCourseEnrollment: {
1414
1438
  path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments/{enrollmentId}",
1415
1439
  method: "PATCH",
@@ -4005,6 +4029,14 @@ var ENDPOINT_DEFINITIONS = {
4005
4029
  auth: "user",
4006
4030
  responseKind: "json"
4007
4031
  },
4032
+ exportEventSeriesCsv: {
4033
+ path: "/sites/{siteId}/bookings/event-series/export.csv",
4034
+ method: "GET",
4035
+ tags: ["site-{siteId}", "bookings", "event-series-{siteId}"],
4036
+ errors: [],
4037
+ auth: "user",
4038
+ responseKind: "blob"
4039
+ },
4008
4040
  createEventSeries: {
4009
4041
  path: "/sites/{siteId}/bookings/event-series",
4010
4042
  method: "POST",
@@ -4073,6 +4105,60 @@ var ENDPOINT_DEFINITIONS = {
4073
4105
  errors: [],
4074
4106
  responseKind: "blob"
4075
4107
  },
4108
+ getParticipantMessageRecipients: {
4109
+ path: "/sites/{siteId}/bookings/participant-messaging/recipients",
4110
+ method: "POST",
4111
+ tags: ["site-{siteId}"],
4112
+ auth: "user",
4113
+ errors: [
4114
+ "validation:invalid_input",
4115
+ "auth:forbidden",
4116
+ "resource:not_found",
4117
+ "server:internal_error"
4118
+ ],
4119
+ responseKind: "json"
4120
+ },
4121
+ sendParticipantMessage: {
4122
+ path: "/sites/{siteId}/bookings/participant-messaging/send",
4123
+ method: "POST",
4124
+ tags: ["site-{siteId}"],
4125
+ auth: "user",
4126
+ errors: [
4127
+ "validation:invalid_input",
4128
+ "auth:forbidden",
4129
+ "resource:not_found",
4130
+ "resource:conflict",
4131
+ "server:internal_error"
4132
+ ],
4133
+ responseKind: "json"
4134
+ },
4135
+ testParticipantMessage: {
4136
+ path: "/sites/{siteId}/bookings/participant-messaging/test",
4137
+ method: "POST",
4138
+ tags: ["site-{siteId}"],
4139
+ auth: "user",
4140
+ errors: [
4141
+ "validation:invalid_input",
4142
+ "auth:forbidden",
4143
+ "resource:not_found",
4144
+ "resource:conflict",
4145
+ "server:internal_error"
4146
+ ],
4147
+ responseKind: "json"
4148
+ },
4149
+ listParticipantMessageHistory: {
4150
+ path: "/sites/{siteId}/bookings/participant-messaging/history",
4151
+ method: "POST",
4152
+ tags: ["site-{siteId}"],
4153
+ auth: "user",
4154
+ errors: [
4155
+ "validation:invalid_input",
4156
+ "auth:forbidden",
4157
+ "resource:not_found",
4158
+ "server:internal_error"
4159
+ ],
4160
+ responseKind: "json"
4161
+ },
4076
4162
  listEventSeriesWaitlist: {
4077
4163
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist",
4078
4164
  method: "GET",
@@ -4081,6 +4167,14 @@ var ENDPOINT_DEFINITIONS = {
4081
4167
  responseKind: "json",
4082
4168
  errors: []
4083
4169
  },
4170
+ exportEventSeriesWaitlistCsv: {
4171
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist/export.csv",
4172
+ method: "GET",
4173
+ tags: ["site-{siteId}", "bookings", "event-series-{seriesId}"],
4174
+ auth: "user",
4175
+ responseKind: "blob",
4176
+ errors: []
4177
+ },
4084
4178
  addEventOccurrenceAttendee: {
4085
4179
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/occurrences/{occurrenceId}/attendees",
4086
4180
  method: "POST",
@@ -4797,6 +4891,14 @@ var ENDPOINT_DEFINITIONS = {
4797
4891
  auth: "user",
4798
4892
  responseKind: "json"
4799
4893
  },
4894
+ exportSiteCustomerPassesCsv: {
4895
+ path: "/sites/{siteId}/bookings/customer-passes/export.csv",
4896
+ method: "GET",
4897
+ tags: ["site-{siteId}", "bookings", "customer-passes-{siteId}"],
4898
+ auth: "user",
4899
+ responseKind: "blob",
4900
+ errors: []
4901
+ },
4800
4902
  listSiteCustomerMemberships: {
4801
4903
  path: "/sites/{siteId}/bookings/customer-memberships",
4802
4904
  method: "GET",
@@ -4860,6 +4962,22 @@ var ENDPOINT_DEFINITIONS = {
4860
4962
  auth: "user",
4861
4963
  responseKind: "blob"
4862
4964
  },
4965
+ exportBookingLedgerCsv: {
4966
+ path: "/sites/{siteId}/bookings/ledger/export.csv",
4967
+ method: "GET",
4968
+ tags: ["site-{siteId}", "bookings", "booking-ledger-{siteId}"],
4969
+ errors: [],
4970
+ auth: "user",
4971
+ responseKind: "blob"
4972
+ },
4973
+ exportBookingQuestionAnswersCsv: {
4974
+ path: "/sites/{siteId}/bookings/intake-answers/export.csv",
4975
+ method: "GET",
4976
+ tags: ["site-{siteId}", "bookings", "intake-answers-{siteId}"],
4977
+ errors: [],
4978
+ auth: "user",
4979
+ responseKind: "blob"
4980
+ },
4863
4981
  // Site logs
4864
4982
  listSiteActivityLogs: {
4865
4983
  path: "/sites/{siteId}/logs/activity",
@@ -6315,7 +6433,11 @@ function resolveRepeaterGridColumnFieldId(options) {
6315
6433
 
6316
6434
  // ../blocks/src/system/manifest/schema.ts
6317
6435
  var visibilityLevels = ["admin", "designer", "author"];
6318
- var siteOptionSources = ["eventCategories", "venues", "staffMembers"];
6436
+ var siteOptionSources = [
6437
+ "eventCategories",
6438
+ "venues",
6439
+ "staffMembers"
6440
+ ];
6319
6441
  var mediaDeliverySchema = z3.object({
6320
6442
  sizes: z3.string().optional(),
6321
6443
  widthCandidates: z3.array(z3.number().int().positive()).optional(),
@@ -6353,7 +6475,10 @@ var uiSchema = z3.object({
6353
6475
  hidden: z3.boolean().optional(),
6354
6476
  hideLabel: z3.boolean().optional(),
6355
6477
  hideDescription: z3.boolean().optional(),
6356
- showCharCount: z3.union([z3.number().int().positive(), z3.object({ max: z3.number().int().positive() })]).optional(),
6478
+ showCharCount: z3.union([
6479
+ z3.number().int().positive(),
6480
+ z3.object({ max: z3.number().int().positive() })
6481
+ ]).optional(),
6357
6482
  showSlugPreview: z3.boolean().optional(),
6358
6483
  variant: z3.enum(["full", "inline", "limited", "media", "notes"]).optional(),
6359
6484
  richTextVariant: z3.enum(["full", "inline", "limited", "media", "notes"]).optional(),
@@ -6363,10 +6488,7 @@ var uiSchema = z3.object({
6363
6488
  showMediaPreview: z3.boolean().optional(),
6364
6489
  showMediaOverlayActions: z3.boolean().optional(),
6365
6490
  mediaDelivery: mediaDeliverySchema.optional(),
6366
- mediaDeliveryByVariant: z3.record(
6367
- z3.string(),
6368
- mediaDeliverySchema
6369
- ).optional(),
6491
+ mediaDeliveryByVariant: z3.record(z3.string(), mediaDeliverySchema).optional(),
6370
6492
  // Optional input hints for validators/widgets
6371
6493
  inputType: z3.enum(["text", "email", "tel", "number"]).optional(),
6372
6494
  min: z3.number().optional(),
@@ -6474,7 +6596,9 @@ var richTextFieldSchema = baseFieldSchema.extend({
6474
6596
  });
6475
6597
  var mediaFieldSchema = baseFieldSchema.extend({
6476
6598
  type: z3.literal("media"),
6477
- mediaKinds: z3.array(z3.enum(["image", "video", "audio", "document", "spreadsheet", "archive"])).default(["image"]),
6599
+ mediaKinds: z3.array(
6600
+ z3.enum(["image", "video", "audio", "document", "spreadsheet", "archive"])
6601
+ ).default(["image"]),
6478
6602
  aspectRatio: z3.string().optional()
6479
6603
  });
6480
6604
  var booleanFieldSchema = baseFieldSchema.extend({
@@ -6596,7 +6720,9 @@ var referenceFieldSchema = baseFieldSchema.extend({
6596
6720
  var itemTypeSchema = z3.object({
6597
6721
  label: z3.string().min(1),
6598
6722
  icon: z3.string().optional(),
6599
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Item type requires at least one field"))
6723
+ fields: z3.lazy(
6724
+ () => getFieldSchemaInternal().array().min(1, "Item type requires at least one field")
6725
+ )
6600
6726
  });
6601
6727
  var repeaterFieldSchema = baseFieldSchema.extend({
6602
6728
  type: z3.literal("repeater"),
@@ -6606,7 +6732,9 @@ var repeaterFieldSchema = baseFieldSchema.extend({
6606
6732
  maxItems: z3.number().int().positive().optional(),
6607
6733
  // Monomorphic mode
6608
6734
  schema: z3.object({
6609
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Repeater requires at least one field"))
6735
+ fields: z3.lazy(
6736
+ () => getFieldSchemaInternal().array().min(1, "Repeater requires at least one field")
6737
+ )
6610
6738
  }).optional(),
6611
6739
  // Polymorphic mode
6612
6740
  polymorphic: z3.boolean().optional(),
@@ -6652,13 +6780,19 @@ var repeaterFieldSchema = baseFieldSchema.extend({
6652
6780
  const itemTypes = Object.values(
6653
6781
  data.itemTypes
6654
6782
  );
6655
- return itemTypes.every((itemType) => Array.isArray(itemType.fields) && requiredFieldIds.every((requiredId) => itemType.fields?.some((field) => field.id === requiredId)));
6783
+ return itemTypes.every(
6784
+ (itemType) => Array.isArray(itemType.fields) && requiredFieldIds.every(
6785
+ (requiredId) => itemType.fields?.some((field) => field.id === requiredId)
6786
+ )
6787
+ );
6656
6788
  }
6657
6789
  const schemaFields = data.schema?.fields;
6658
6790
  if (!schemaFields) {
6659
6791
  return true;
6660
6792
  }
6661
- return requiredFieldIds.every((requiredId) => schemaFields.some((field) => field.id === requiredId));
6793
+ return requiredFieldIds.every(
6794
+ (requiredId) => schemaFields.some((field) => field.id === requiredId)
6795
+ );
6662
6796
  },
6663
6797
  {
6664
6798
  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`,
@@ -6686,7 +6820,9 @@ var repeaterFieldSchema = baseFieldSchema.extend({
6686
6820
  if (!schemaFields) {
6687
6821
  return true;
6688
6822
  }
6689
- const field = schemaFields.find((candidate) => candidate.id === labelField);
6823
+ const field = schemaFields.find(
6824
+ (candidate) => candidate.id === labelField
6825
+ );
6690
6826
  return field?.type === "text";
6691
6827
  },
6692
6828
  {
@@ -6697,13 +6833,17 @@ var repeaterFieldSchema = baseFieldSchema.extend({
6697
6833
  var groupFieldSchema = baseFieldSchema.extend({
6698
6834
  type: z3.literal("group"),
6699
6835
  schema: z3.object({
6700
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Group requires at least one field"))
6836
+ fields: z3.lazy(
6837
+ () => getFieldSchemaInternal().array().min(1, "Group requires at least one field")
6838
+ )
6701
6839
  })
6702
6840
  });
6703
6841
  var modalFieldSchema = baseFieldSchema.extend({
6704
6842
  type: z3.literal("modal"),
6705
6843
  schema: z3.object({
6706
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Modal requires at least one field"))
6844
+ fields: z3.lazy(
6845
+ () => getFieldSchemaInternal().array().min(1, "Modal requires at least one field")
6846
+ )
6707
6847
  })
6708
6848
  });
6709
6849
  var numberFieldSchema = baseFieldSchema.extend({
@@ -6810,31 +6950,35 @@ function expectParsedSelectField(field) {
6810
6950
  return field;
6811
6951
  }
6812
6952
  function createSiteOptionSelectField(input) {
6813
- return expectParsedSelectField(parseFieldDefinition({
6814
- ...input,
6815
- type: "select",
6816
- options: [],
6817
- multiple: input.multiple ?? false,
6818
- source: { kind: "site", optionSource: input.optionSource },
6819
- ui: {
6820
- ...input.ui ?? {},
6821
- widget: "siteOptionPicker",
6822
- siteOptionSource: input.optionSource
6823
- }
6824
- }));
6953
+ return expectParsedSelectField(
6954
+ parseFieldDefinition({
6955
+ ...input,
6956
+ type: "select",
6957
+ options: [],
6958
+ multiple: input.multiple ?? false,
6959
+ source: { kind: "site", optionSource: input.optionSource },
6960
+ ui: {
6961
+ ...input.ui ?? {},
6962
+ widget: "siteOptionPicker",
6963
+ siteOptionSource: input.optionSource
6964
+ }
6965
+ })
6966
+ );
6825
6967
  }
6826
6968
  function createSdkSelectField(input) {
6827
- return expectParsedSelectField(parseFieldDefinition({
6828
- ...input,
6829
- type: "select",
6830
- options: input.options,
6831
- multiple: input.multiple ?? false,
6832
- source: { kind: "sdk" },
6833
- ui: {
6834
- ...input.ui ?? {},
6835
- widget: "sdkSelect"
6836
- }
6837
- }));
6969
+ return expectParsedSelectField(
6970
+ parseFieldDefinition({
6971
+ ...input,
6972
+ type: "select",
6973
+ options: input.options,
6974
+ multiple: input.multiple ?? false,
6975
+ source: { kind: "sdk" },
6976
+ ui: {
6977
+ ...input.ui ?? {},
6978
+ widget: "sdkSelect"
6979
+ }
6980
+ })
6981
+ );
6838
6982
  }
6839
6983
  var slotSchema = z3.object({
6840
6984
  id: z3.string().min(1),
@@ -6845,8 +6989,20 @@ var slotSchema = z3.object({
6845
6989
  help: z3.string().optional(),
6846
6990
  visibleRoles: z3.array(z3.enum(visibilityLevels)).optional()
6847
6991
  });
6848
- var typographyTokens = ["display", "heading", "subheading", "body", "caption"];
6849
- var colorTokens = ["background", "surface", "foreground", "accent", "muted"];
6992
+ var typographyTokens = [
6993
+ "display",
6994
+ "heading",
6995
+ "subheading",
6996
+ "body",
6997
+ "caption"
6998
+ ];
6999
+ var colorTokens = [
7000
+ "background",
7001
+ "surface",
7002
+ "foreground",
7003
+ "accent",
7004
+ "muted"
7005
+ ];
6850
7006
  var spacingTokens = ["none", "xs", "sm", "md", "lg", "xl"];
6851
7007
  var radiusTokens = ["none", "sm", "md", "lg", "full"];
6852
7008
  var styleTokenSchema = z3.object({
@@ -6866,7 +7022,14 @@ var behaviourSchema = z3.object({
6866
7022
  // Block manages its own wrapper (for sticky/fixed positioning)
6867
7023
  managesOwnWrapper: z3.boolean().optional()
6868
7024
  });
6869
- var blockCategoryEnum = z3.enum(["marketing", "content", "blog", "media", "layout", "interactive"]);
7025
+ var blockCategoryEnum = z3.enum([
7026
+ "marketing",
7027
+ "content",
7028
+ "blog",
7029
+ "media",
7030
+ "layout",
7031
+ "interactive"
7032
+ ]);
6870
7033
  var manifestSchema = z3.object({
6871
7034
  name: z3.string().min(1),
6872
7035
  version: z3.string().min(1),
@@ -7465,6 +7628,20 @@ var applyAppointmentSetupRequestSchema = z6.object({
7465
7628
  bookingNotice: appointmentSetupBookingNoticeSchema
7466
7629
  });
7467
7630
 
7631
+ // ../api/src/bookingRecords.ts
7632
+ var BOOKING_QUESTION_ANSWER_EXPORT_SCOPES = {
7633
+ site: "site",
7634
+ appointments: "appointments",
7635
+ eventSeries: "event_series",
7636
+ course: "course"
7637
+ };
7638
+ var BOOKING_QUESTION_ANSWER_EXPORT_SCOPE_VALUES = [
7639
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.site,
7640
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.appointments,
7641
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.eventSeries,
7642
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.course
7643
+ ];
7644
+
7468
7645
  // ../api/src/common/cancellation.ts
7469
7646
  var STAFF_CANCELLATION_CONTEXT_UI_CATEGORIES = [
7470
7647
  "customer_requested",
@@ -7836,6 +8013,24 @@ function registerManifest(manifest) {
7836
8013
  return manifest;
7837
8014
  }
7838
8015
 
8016
+ // ../theme-core/src/site-styles/appearancePresetResolution.ts
8017
+ function assertValidOptionGroups(preset2) {
8018
+ preset2.optionGroups?.forEach((group) => {
8019
+ const selectedOption = group.options.find(
8020
+ (option) => option.id === group.selectedOptionId
8021
+ );
8022
+ if (!selectedOption) {
8023
+ throw new Error(
8024
+ `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
8025
+ );
8026
+ }
8027
+ });
8028
+ }
8029
+ function defineBlockAppearancePreset(preset2) {
8030
+ assertValidOptionGroups(preset2);
8031
+ return preset2;
8032
+ }
8033
+
7839
8034
  // ../theme-core/src/site-styles/types.ts
7840
8035
  function asDesignBlockId(value) {
7841
8036
  return brandNonEmptyString(value, "DesignBlockId");
@@ -7917,6 +8112,11 @@ function flushPanelFrame(options) {
7917
8112
  function defineFrameCapability(capability) {
7918
8113
  return capability;
7919
8114
  }
8115
+ var tileTreatmentValues = [
8116
+ "default",
8117
+ "quiet",
8118
+ "brand-depth"
8119
+ ];
7920
8120
  var eyebrowTreatmentValues = [
7921
8121
  "plain",
7922
8122
  "pill",
@@ -7932,31 +8132,13 @@ function defineBlockDesignCapability(capability) {
7932
8132
  imageSurfaceTreatments: capability.imageSurfaceTreatments ?? ["none"],
7933
8133
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
7934
8134
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
8135
+ tileTreatments: capability.tileTreatments ?? ["default"],
7935
8136
  eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"]
7936
8137
  };
7937
8138
  }
7938
8139
 
7939
- // ../theme-core/src/site-styles/appearancePresets.ts
7940
- function assertValidOptionGroups(preset2) {
7941
- preset2.optionGroups?.forEach((group) => {
7942
- const selectedOption = group.options.find(
7943
- (option) => option.id === group.selectedOptionId
7944
- );
7945
- if (!selectedOption) {
7946
- throw new Error(
7947
- `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
7948
- );
7949
- }
7950
- });
7951
- }
7952
- function defineBlockAppearancePreset(preset2) {
7953
- assertValidOptionGroups(preset2);
7954
- return preset2;
7955
- }
7956
- function defineSiteChromeAppearancePreset(preset2) {
7957
- return preset2;
7958
- }
7959
- var appearancePresets = [
8140
+ // ../theme-core/src/site-styles/blockAppearancePresets.ts
8141
+ var blockAppearancePresets = [
7960
8142
  defineBlockAppearancePreset({
7961
8143
  kind: "block-design",
7962
8144
  id: "hero-immersive-image",
@@ -8082,6 +8264,24 @@ var appearancePresets = [
8082
8264
  eyebrowTreatment: "accent-pill-bounce"
8083
8265
  }
8084
8266
  }),
8267
+ defineBlockAppearancePreset({
8268
+ kind: "block-design",
8269
+ id: "hero-brand-depth-expressive",
8270
+ target: "hero",
8271
+ label: "Expressive brand-depth hero",
8272
+ blockKinds: ["block.hero"],
8273
+ constraints: {
8274
+ layoutFamilies: ["centered", "compact"]
8275
+ },
8276
+ design: {
8277
+ sectionSurface: "brand-depth-band",
8278
+ contentFrame: plainFrame,
8279
+ itemSurface: "none",
8280
+ transitionAfter: "soft-fade-short",
8281
+ emphasis: "high",
8282
+ eyebrowTreatment: "accent-pill-bounce"
8283
+ }
8284
+ }),
8085
8285
  defineBlockAppearancePreset({
8086
8286
  kind: "block-design",
8087
8287
  id: "hero-contained-intro",
@@ -8110,6 +8310,20 @@ var appearancePresets = [
8110
8310
  emphasis: "high"
8111
8311
  }
8112
8312
  }),
8313
+ defineBlockAppearancePreset({
8314
+ kind: "block-design",
8315
+ id: "body-text-brand-depth-intro",
8316
+ target: "body-text",
8317
+ label: "Brand-depth intro copy",
8318
+ blockKinds: ["block.body-text"],
8319
+ design: {
8320
+ sectionSurface: "brand-depth-band",
8321
+ contentFrame: plainFrame,
8322
+ itemSurface: "none",
8323
+ transitionAfter: "soft-fade-short",
8324
+ emphasis: "high"
8325
+ }
8326
+ }),
8113
8327
  defineBlockAppearancePreset({
8114
8328
  kind: "block-design",
8115
8329
  id: "offerings-calm-list",
@@ -8152,6 +8366,21 @@ var appearancePresets = [
8152
8366
  emphasis: "medium"
8153
8367
  }
8154
8368
  }),
8369
+ defineBlockAppearancePreset({
8370
+ kind: "block-design",
8371
+ id: "schedule-details-brand-depth",
8372
+ target: "events",
8373
+ label: "Brand-depth schedule details",
8374
+ blockKinds: ["block.event-details", "block.course-details"],
8375
+ design: {
8376
+ sectionSurface: "brand-depth-band",
8377
+ contentFrame: plainFrame,
8378
+ itemSurface: "none",
8379
+ transitionAfter: "none",
8380
+ emphasis: "medium",
8381
+ tileTreatment: "brand-depth"
8382
+ }
8383
+ }),
8155
8384
  defineBlockAppearancePreset({
8156
8385
  kind: "block-design",
8157
8386
  id: "media-text-flush-feature",
@@ -8237,6 +8466,20 @@ var appearancePresets = [
8237
8466
  testimonialCardTreatment: "accent-quote"
8238
8467
  }
8239
8468
  }),
8469
+ defineBlockAppearancePreset({
8470
+ kind: "block-design",
8471
+ id: "faq-base-accordion",
8472
+ target: "faq",
8473
+ label: "Base accordion FAQ",
8474
+ blockKinds: ["block.faq"],
8475
+ design: {
8476
+ sectionSurface: "base",
8477
+ contentFrame: plainFrame,
8478
+ itemSurface: "default",
8479
+ transitionAfter: "none",
8480
+ emphasis: "medium"
8481
+ }
8482
+ }),
8240
8483
  defineBlockAppearancePreset({
8241
8484
  kind: "block-design",
8242
8485
  id: "faq-contained-help",
@@ -8279,6 +8522,20 @@ var appearancePresets = [
8279
8522
  emphasis: "high"
8280
8523
  }
8281
8524
  }),
8525
+ defineBlockAppearancePreset({
8526
+ kind: "block-design",
8527
+ id: "contact-form-brand-depth-card",
8528
+ target: "contact-form",
8529
+ label: "Brand-depth form card",
8530
+ blockKinds: ["block.form"],
8531
+ design: {
8532
+ sectionSurface: "brand-depth-band",
8533
+ contentFrame: panelFrame("raised"),
8534
+ itemSurface: "none",
8535
+ transitionAfter: "none",
8536
+ emphasis: "high"
8537
+ }
8538
+ }),
8282
8539
  defineBlockAppearancePreset({
8283
8540
  kind: "block-design",
8284
8541
  id: "cta-accent-band",
@@ -8292,7 +8549,14 @@ var appearancePresets = [
8292
8549
  transitionAfter: "none",
8293
8550
  emphasis: "high"
8294
8551
  }
8295
- }),
8552
+ })
8553
+ ];
8554
+
8555
+ // ../theme-core/src/site-styles/siteChromeAppearancePresets.ts
8556
+ function defineSiteChromeAppearancePreset(preset2) {
8557
+ return preset2;
8558
+ }
8559
+ var siteChromeAppearancePresets = [
8296
8560
  defineSiteChromeAppearancePreset({
8297
8561
  kind: "site-chrome",
8298
8562
  id: "header-clean-base",
@@ -8360,6 +8624,12 @@ var appearancePresets = [
8360
8624
  })
8361
8625
  ];
8362
8626
 
8627
+ // ../theme-core/src/site-styles/appearancePresetCatalog.ts
8628
+ var appearancePresets = [
8629
+ ...blockAppearancePresets,
8630
+ ...siteChromeAppearancePresets
8631
+ ];
8632
+
8363
8633
  // ../theme-core/src/site-styles/blockFlow.ts
8364
8634
  function defineBlockDesignMetadata(input) {
8365
8635
  const layoutProfiles = (input.layoutProfiles ?? []).map((profile) => ({
@@ -9834,6 +10104,7 @@ var sectionStylesOverrideSchema = z22.object({
9834
10104
  background: boxBackgroundSchema.nullable().optional(),
9835
10105
  spacing: semanticSpacingSchema.nullable().optional(),
9836
10106
  minHeight: z22.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
10107
+ tileTreatment: z22.enum(tileTreatmentValues).nullable().optional(),
9837
10108
  eyebrowTreatment: z22.enum(eyebrowTreatmentValues).nullable().optional()
9838
10109
  });
9839
10110
  var containerStylesOverrideSchema = z22.object({
@@ -10627,7 +10898,7 @@ var userContentFrames = [
10627
10898
  ];
10628
10899
  var generatedDesignOptionCatalog = {
10629
10900
  source: "generated",
10630
- sectionSurfaces: ["base", "muted-band", "accent-band", "hero-image"],
10901
+ sectionSurfaces: ["base", "muted-band", "accent-band", "brand-depth-band", "hero-image"],
10631
10902
  contentFrames: generatedContentFrames,
10632
10903
  itemSurfaces: ["none", "default", "flat", "outlined", "raised"],
10633
10904
  transitions: ["none", "soft-fade-short", "soft-fade-long"],
@@ -10697,6 +10968,43 @@ var expressiveBudget = {
10697
10968
  mediaDensity: "high",
10698
10969
  decorativeRepetition: "medium"
10699
10970
  };
10971
+ var expressiveUnderlineInputs = {
10972
+ base: {
10973
+ background: { type: "transparent" },
10974
+ textColorToken: "text",
10975
+ border: {
10976
+ widthClass: "border-2",
10977
+ colorToken: "border",
10978
+ style: "underline"
10979
+ },
10980
+ corners: "square",
10981
+ shadow: null,
10982
+ spacing: "compact",
10983
+ fontSize: "base"
10984
+ },
10985
+ label: {
10986
+ textColorToken: "primary",
10987
+ fontWeight: "black",
10988
+ fontSize: "xs",
10989
+ textTransform: "uppercase",
10990
+ letterSpacing: "widest",
10991
+ opacity: 1
10992
+ },
10993
+ focus: {
10994
+ ringColorToken: "secondary",
10995
+ ringWidth: "0",
10996
+ borderColorToken: "secondary"
10997
+ },
10998
+ error: {
10999
+ borderColorToken: "destructive",
11000
+ textColorToken: "destructive"
11001
+ },
11002
+ disabled: {
11003
+ backgroundColorToken: "surface",
11004
+ textColorToken: "text",
11005
+ opacity: 0.6
11006
+ }
11007
+ };
10700
11008
  function uniqueContentFrameKinds() {
10701
11009
  const kinds = [...new Set(
10702
11010
  generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
@@ -11047,15 +11355,17 @@ var curatedSiteStyles = [
11047
11355
  paragraphSize: "editorial",
11048
11356
  headingSize: "editorial"
11049
11357
  }
11050
- }
11358
+ },
11359
+ inputs: expressiveUnderlineInputs
11051
11360
  },
11052
11361
  recommendedAppearancePresetIds: [
11053
11362
  "site-header-brand-solid-inverted-cta",
11054
11363
  "site-footer-brand-two-band",
11055
11364
  "hero-brand-scrim-fixed-frame",
11056
11365
  "body-text-editorial-intro",
11366
+ "schedule-details-brand-depth",
11057
11367
  "testimonials-accent-quote-proof",
11058
- "contact-form-dark-card"
11368
+ "contact-form-brand-depth-card"
11059
11369
  ],
11060
11370
  buttonPersonalityChoices: [
11061
11371
  buttonChoice("showtime-pill"),
@@ -11189,6 +11499,7 @@ var imageSurfaceTreatmentSchema = z24.discriminatedUnion("kind", [
11189
11499
  }).strict()
11190
11500
  ]);
11191
11501
  var testimonialCardTreatmentSchema = z24.enum(["default", "accent-quote"]);
11502
+ var tileTreatmentSchema = z24.enum(tileTreatmentValues);
11192
11503
  var eyebrowTreatmentSchema = z24.enum(eyebrowTreatmentValues);
11193
11504
  function uniqueNonEmpty(values) {
11194
11505
  const uniqueValues = [...new Set(values)];
@@ -11233,6 +11544,7 @@ var blockDesignPlanSchema = z24.object({
11233
11544
  imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
11234
11545
  imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
11235
11546
  testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
11547
+ tileTreatment: tileTreatmentSchema.optional(),
11236
11548
  eyebrowTreatment: eyebrowTreatmentSchema.optional()
11237
11549
  }).strict();
11238
11550
  var styleAuthoritySchema = z24.discriminatedUnion("kind", [
@@ -11296,6 +11608,14 @@ var defaultDesignRuntimeRules = defineDesignRuntimeRules({
11296
11608
  headingColor: "primaryForeground"
11297
11609
  }
11298
11610
  },
11611
+ "brand-depth-band": {
11612
+ background: {
11613
+ type: "color",
11614
+ color: "primary-800",
11615
+ textColor: "primaryForeground",
11616
+ headingColor: "primaryForeground"
11617
+ }
11618
+ },
11299
11619
  "hero-image": {
11300
11620
  background: {
11301
11621
  type: "image",
@@ -13174,6 +13494,21 @@ function createTransformRegistry(definitions) {
13174
13494
  }
13175
13495
 
13176
13496
  // ../blocks/src/system/transforms/registry/_utils/colorResolution.ts
13497
+ var CSS_COLOR_FUNCTION_PATTERN = /^(?:rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch|color|color-mix|light-dark)\(/i;
13498
+ var CSS_HEX_COLOR_PATTERN = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
13499
+ var THEME_COLOR_TOKEN_PATTERN = /^[a-zA-Z][a-zA-Z0-9]*(?:-[a-zA-Z0-9]+)*(?:\/(?:100|[1-9]?\d|0))?$/;
13500
+ var CSS_COLOR_KEYWORDS = /* @__PURE__ */ new Set([
13501
+ "transparent",
13502
+ "currentColor",
13503
+ "inherit",
13504
+ "initial",
13505
+ "revert",
13506
+ "revert-layer",
13507
+ "unset"
13508
+ ]);
13509
+ function isLiteralCssColorValue(value) {
13510
+ return CSS_HEX_COLOR_PATTERN.test(value) || CSS_COLOR_FUNCTION_PATTERN.test(value) || value.startsWith("var(") || CSS_COLOR_KEYWORDS.has(value);
13511
+ }
13177
13512
  function resolveBackgroundColorValue(tokenOrCssValue, context) {
13178
13513
  const trimmed = tokenOrCssValue.trim();
13179
13514
  if (!trimmed) return "";
@@ -13190,8 +13525,11 @@ function resolveBackgroundColorValue(tokenOrCssValue, context) {
13190
13525
  return rgbColorValue(trimmed);
13191
13526
  }
13192
13527
  }
13193
- if (trimmed === "transparent") {
13194
- return "transparent";
13528
+ if (isLiteralCssColorValue(trimmed)) {
13529
+ return trimmed;
13530
+ }
13531
+ if (THEME_COLOR_TOKEN_PATTERN.test(trimmed)) {
13532
+ return rgbColorValue(trimmed);
13195
13533
  }
13196
13534
  return trimmed;
13197
13535
  }
@@ -13447,6 +13785,15 @@ function hasFixedFrameBackgroundMotion(value) {
13447
13785
  const background = asPartialObject(input?.background);
13448
13786
  return background?.motion === "fixed-frame";
13449
13787
  }
13788
+ var tileTreatmentClassMap = {
13789
+ default: "",
13790
+ quiet: "rb-tile-treatment-quiet",
13791
+ "brand-depth": "rb-tile-treatment-brand-depth"
13792
+ };
13793
+ var tileTreatmentSet = new Set(tileTreatmentValues);
13794
+ function isTileTreatment(value) {
13795
+ return typeof value === "string" && tileTreatmentSet.has(value);
13796
+ }
13450
13797
  var sectionClassNameTransform = {
13451
13798
  id: "sectionStyles.resolveClassName",
13452
13799
  kind: "string",
@@ -13503,8 +13850,19 @@ var sectionClassNameTransform = {
13503
13850
  classes.push(minHeightClass);
13504
13851
  }
13505
13852
  }
13506
- if (hasFixedFrameBackgroundMotion(input)) {
13507
- classes.push(fixedFrameScopeClass);
13853
+ const tileTreatment = input?.tileTreatment;
13854
+ if (isTileTreatment(tileTreatment)) {
13855
+ const tileTreatmentClass = tileTreatmentClassMap[tileTreatment];
13856
+ if (tileTreatmentClass) {
13857
+ classes.push(tileTreatmentClass);
13858
+ }
13859
+ } else if (typeof tileTreatment === "string" && process.env.NODE_ENV !== "production") {
13860
+ console.warn(
13861
+ `[sectionStyles] Invalid tileTreatment value in _sectionStyles: "${tileTreatment}". Expected one of: ${tileTreatmentValues.join(", ")}.`
13862
+ );
13863
+ }
13864
+ if (hasFixedFrameBackgroundMotion(input)) {
13865
+ classes.push(fixedFrameScopeClass);
13508
13866
  }
13509
13867
  return classes.join(" ").trim();
13510
13868
  }
@@ -16377,6 +16735,9 @@ function createBlockManifest(config) {
16377
16735
  };
16378
16736
  return augmentManifest(manifest);
16379
16737
  }
16738
+ function createBlockManifestWithContentShape(config, _contentShape) {
16739
+ return createBlockManifest(config);
16740
+ }
16380
16741
  function normalizeBlockLayout(layout) {
16381
16742
  return Array.isArray(layout) ? [...layout] : layout;
16382
16743
  }
@@ -17009,7 +17370,7 @@ var ctaComposition = composeFragments([
17009
17370
  { fragment: ctaCopyFragment },
17010
17371
  { fragment: ctaRowFragment }
17011
17372
  ]);
17012
- var ctaFullManifest = createBlockManifest({
17373
+ var ctaFullConfig = {
17013
17374
  id: "block.cta-full",
17014
17375
  title: "Full-width CTA",
17015
17376
  category: "marketing",
@@ -17027,7 +17388,8 @@ var ctaFullManifest = createBlockManifest({
17027
17388
  description: "Centered call to action with optional background image.",
17028
17389
  tags: ["cta", "call-to-action", "button", "conversion", "action", "sign-up", "get-started"],
17029
17390
  icon: "Target"
17030
- });
17391
+ };
17392
+ var ctaFullManifest = createBlockManifest(ctaFullConfig);
17031
17393
  var ctaFullBlockDefinition = {
17032
17394
  manifest: ctaFullManifest
17033
17395
  };
@@ -20108,9 +20470,9 @@ var mediaTextManifest = createBlockManifest({
20108
20470
  {
20109
20471
  id: "images",
20110
20472
  type: "repeater",
20111
- label: "Images",
20473
+ label: "Media",
20112
20474
  required: false,
20113
- itemLabel: "Image",
20475
+ itemLabel: "Media",
20114
20476
  minItems: 0,
20115
20477
  maxItems: 6,
20116
20478
  allowConversion: true,
@@ -20124,9 +20486,9 @@ var mediaTextManifest = createBlockManifest({
20124
20486
  {
20125
20487
  id: "image",
20126
20488
  type: "media",
20127
- label: "Image",
20489
+ label: "Media",
20128
20490
  required: true,
20129
- mediaKinds: ["image"]
20491
+ mediaKinds: ["image", "video"]
20130
20492
  }
20131
20493
  ]
20132
20494
  }
@@ -20204,8 +20566,8 @@ var mediaTextManifest = createBlockManifest({
20204
20566
  {
20205
20567
  id: "aspectRatio",
20206
20568
  type: "select",
20207
- label: "Image aspect ratio",
20208
- description: "Crop image to a consistent aspect ratio.",
20569
+ label: "Media aspect ratio",
20570
+ description: "Crop media to a consistent aspect ratio.",
20209
20571
  required: false,
20210
20572
  defaultValue: "auto",
20211
20573
  multiple: false,
@@ -20392,8 +20754,8 @@ var mediaTextManifest = createBlockManifest({
20392
20754
  }
20393
20755
  };
20394
20756
  })(),
20395
- description: "Two columns: image/carousel + rich text (with optional section title).",
20396
- tags: ["media", "image", "carousel", "text", "two-column", "layout"],
20757
+ description: "Two columns: media/carousel + rich text (with optional section title).",
20758
+ tags: ["media", "image", "video", "carousel", "text", "two-column", "layout"],
20397
20759
  icon: "Columns"
20398
20760
  });
20399
20761
  var mediaTextBlockDefinition = {
@@ -20544,6 +20906,19 @@ var transformSchema2 = z39.object({
20544
20906
  hotspot: hotspotSchema2.optional(),
20545
20907
  rotation: rotationSchema2.optional()
20546
20908
  });
20909
+ var mediaPosterSchema = z39.discriminatedUnion("tag", [
20910
+ z39.object({
20911
+ tag: z39.literal("storage"),
20912
+ assetId: z39.string().optional(),
20913
+ storageBucket: z39.string().min(1),
20914
+ storagePath: z39.string().min(1)
20915
+ }),
20916
+ z39.object({
20917
+ tag: z39.literal("external-src"),
20918
+ assetId: z39.string().optional(),
20919
+ src: z39.string().url()
20920
+ })
20921
+ ]);
20547
20922
  var mediaBaseSchema = z39.object({
20548
20923
  purpose: z39.string().optional(),
20549
20924
  placeholder: z39.boolean().default(true).optional(),
@@ -20557,6 +20932,7 @@ var mediaBaseSchema = z39.object({
20557
20932
  height: z39.number().optional(),
20558
20933
  storageBucket: z39.string().optional(),
20559
20934
  storagePath: z39.string().optional(),
20935
+ poster: mediaPosterSchema.optional(),
20560
20936
  transform: transformSchema2.optional()
20561
20937
  });
20562
20938
  var imageMediaSchema = mediaBaseSchema.extend({ type: z39.literal("image") });
@@ -21040,10 +21416,28 @@ import { z as z45 } from "zod";
21040
21416
 
21041
21417
  // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
21042
21418
  import { z as z44 } from "zod";
21419
+
21420
+ // ../blocks/src/system/constants/events.ts
21421
+ var eventCalendarDisplayModeValues = ["combined", "month", "week", "list", "timetable"];
21422
+ var eventCalendarListLayoutValues = ["stack", "grid", "compact"];
21423
+ var eventCalendarListLayoutOptions = [
21424
+ { id: "stack", label: "Stack" },
21425
+ { id: "grid", label: "Grid" },
21426
+ { id: "compact", label: "Compact" }
21427
+ ];
21428
+ function isEventCalendarDisplayMode(value) {
21429
+ return typeof value === "string" && eventCalendarDisplayModeValues.includes(value);
21430
+ }
21431
+ function isEventCalendarListLayout(value) {
21432
+ return typeof value === "string" && eventCalendarListLayoutValues.includes(value);
21433
+ }
21434
+
21435
+ // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
21043
21436
  var previewStageSchema = z44.enum(["preview", "published"]);
21044
21437
  var registrationButtonVariantSchema = z44.enum(["primary", "secondary", "outline"]);
21045
21438
  var eventButtonVariantSchema = z44.enum(["primary", "secondary", "outline", "link"]);
21046
- var eventLayoutSchema = z44.enum(["grid", "stack", "compact"]);
21439
+ var eventLayoutSchema = z44.enum(eventCalendarListLayoutValues);
21440
+ var eventCalendarDisplayModeSchema = z44.enum(eventCalendarDisplayModeValues);
21047
21441
  var columnOptionSchema = z44.enum(["2", "3", "4"]);
21048
21442
  var weekStartSchema = z44.enum(["sunday", "monday"]);
21049
21443
  var filterAutoShowSchema = z44.enum(["auto", "always", "never"]);
@@ -22425,7 +22819,232 @@ var eventListingInteractiveIslandPropsCodec = createInteractiveIslandCodec({
22425
22819
  });
22426
22820
 
22427
22821
  // ../blocks/src/system/blocks/events/event-listing.ts
22428
- var eventListingManifest = createBlockManifest({
22822
+ var eventListingAdditionalFields = [
22823
+ ...sectionHeaderFields("All Events"),
22824
+ ...(() => {
22825
+ const columns = columnsField(["2", "3", "4"]);
22826
+ return [
22827
+ {
22828
+ ...layoutField,
22829
+ ui: { ...layoutField.ui ?? {}, intent: "display" }
22830
+ },
22831
+ {
22832
+ ...columns,
22833
+ ui: { ...columns.ui ?? {}, intent: "display" }
22834
+ }
22835
+ ];
22836
+ })(),
22837
+ {
22838
+ id: "eventsPerPage",
22839
+ type: "select",
22840
+ label: "Events per page",
22841
+ description: "Number of events to load at a time",
22842
+ required: false,
22843
+ multiple: false,
22844
+ defaultValue: "12",
22845
+ options: [
22846
+ { value: "3", label: "3 events" },
22847
+ { value: "6", label: "6 events" },
22848
+ { value: "12", label: "12 events" },
22849
+ { value: "24", label: "24 events" }
22850
+ ],
22851
+ ui: { intent: "display" }
22852
+ },
22853
+ {
22854
+ id: "paginationMode",
22855
+ type: "select",
22856
+ label: "More events",
22857
+ description: "How to access events beyond the initial list",
22858
+ required: false,
22859
+ multiple: false,
22860
+ defaultValue: "loadMore",
22861
+ options: [
22862
+ { value: "loadMore", label: "Load more button" },
22863
+ { value: "seeAllLink", label: "Link to another page" }
22864
+ ],
22865
+ ui: { intent: "display" }
22866
+ },
22867
+ {
22868
+ id: "seeAllUrl",
22869
+ type: "link",
22870
+ label: "See all destination",
22871
+ required: false,
22872
+ ui: {
22873
+ intent: "display",
22874
+ visibleWhen: {
22875
+ field: "paginationMode",
22876
+ equals: "seeAllLink"
22877
+ }
22878
+ }
22879
+ },
22880
+ {
22881
+ id: "loadMoreText",
22882
+ type: "text",
22883
+ label: "Button text",
22884
+ description: "Text for the pagination button or link",
22885
+ required: false,
22886
+ multiline: false,
22887
+ defaultValue: "Load more events",
22888
+ maxLength: 40
22889
+ },
22890
+ ...cardStylingFields.map((field) => ({
22891
+ ...field,
22892
+ ui: { ...field.ui ?? {}, intent: "style" }
22893
+ })),
22894
+ ...eventDisplayFields.map((field) => ({
22895
+ ...field,
22896
+ ui: { ...field.ui ?? {}, intent: "display" }
22897
+ })),
22898
+ {
22899
+ id: "kind",
22900
+ type: "select",
22901
+ label: "Show",
22902
+ description: "Choose whether this list shows courses, events, or both",
22903
+ required: false,
22904
+ multiple: false,
22905
+ defaultValue: "all",
22906
+ options: [
22907
+ { value: "all", label: "Courses and events" },
22908
+ { value: "courses", label: "Courses only" },
22909
+ { value: "events", label: "Events only" }
22910
+ ],
22911
+ ui: { intent: "behavior" }
22912
+ },
22913
+ {
22914
+ id: "eventSurface",
22915
+ type: "select",
22916
+ label: "Event surface",
22917
+ description: "Choose a semantic event scope",
22918
+ required: false,
22919
+ multiple: false,
22920
+ defaultValue: "all",
22921
+ options: [
22922
+ { value: "all", label: "All events" },
22923
+ { value: "regularClassSchedule", label: "Regular class schedule" },
22924
+ { value: "specialDatedEvents", label: "Workshops and special events" },
22925
+ { value: "custom", label: "Custom" }
22926
+ ],
22927
+ ui: { intent: "behavior" }
22928
+ },
22929
+ {
22930
+ id: "filterEventPresets",
22931
+ type: "select",
22932
+ label: "Pre-filter by event type",
22933
+ description: "Restrict this block to specific event types",
22934
+ required: false,
22935
+ multiple: true,
22936
+ defaultValue: [],
22937
+ options: [
22938
+ { value: "class", label: "Classes" },
22939
+ { value: "workshop", label: "Workshops" },
22940
+ { value: "retreat", label: "Retreats" },
22941
+ { value: "performance", label: "Performances" }
22942
+ ],
22943
+ ui: {
22944
+ intent: "behavior",
22945
+ visibleWhen: { field: "eventSurface", equals: "custom" }
22946
+ }
22947
+ },
22948
+ {
22949
+ id: "scheduleScope",
22950
+ type: "select",
22951
+ label: "Schedule cadence",
22952
+ description: "Restrict this block by recurrence",
22953
+ required: false,
22954
+ multiple: false,
22955
+ defaultValue: "any",
22956
+ options: [
22957
+ { value: "any", label: "Any cadence" },
22958
+ { value: "recurring", label: "Recurring only" },
22959
+ { value: "oneOff", label: "One-off only" }
22960
+ ],
22961
+ ui: {
22962
+ intent: "behavior",
22963
+ visibleWhen: { field: "eventSurface", equals: "custom" }
22964
+ }
22965
+ },
22966
+ {
22967
+ ...emptyStateField,
22968
+ ui: { ...emptyStateField.ui ?? {}, intent: "display" }
22969
+ },
22970
+ sectionStylesField({
22971
+ id: "_sectionStyles",
22972
+ label: "Section styles",
22973
+ renderInHeader: false
22974
+ })
22975
+ ];
22976
+ var eventListingLayout = [
22977
+ styledSection({
22978
+ children: sectionContainer([
22979
+ // Optional heading
22980
+ text(
22981
+ { as: "h2" },
22982
+ bind("content.heading"),
22983
+ when("content.heading")
22984
+ ),
22985
+ // Optional description
22986
+ richText(
22987
+ { className: "rb-prose rb-max-w-none" },
22988
+ bind("content.description"),
22989
+ when("content.description")
22990
+ ),
22991
+ // Event listing component with pagination
22992
+ el("event-listing", withApiBindings({
22993
+ events: { $bind: { from: "data.events" } },
22994
+ stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
22995
+ layout: { $bind: { from: "content.layout", fallback: "grid" } },
22996
+ columns: { $bind: { from: "content.columns", fallback: "3" } },
22997
+ eventsPerPage: { $bind: { from: "content.eventsPerPage", fallback: "12" } },
22998
+ paginationMode: { $bind: { from: "content.paginationMode", fallback: "loadMore" } },
22999
+ seeAllUrl: { $bind: { from: "content.seeAllUrl", transforms: [{ id: "links.resolve" }] } },
23000
+ loadMoreText: { $bind: { from: "content.loadMoreText", fallback: "Load more events" } },
23001
+ cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
23002
+ buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
23003
+ buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
23004
+ showVenue: { $bind: { from: "content.showVenue" } },
23005
+ showMap: { $bind: { from: "content.showMap" } },
23006
+ showCapacity: { $bind: { from: "content.showCapacity" } },
23007
+ eventKind: { $bind: { from: "content.kind", fallback: "all" } },
23008
+ eventSurface: { $bind: { from: "content.eventSurface", fallback: "all" } },
23009
+ filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
23010
+ scheduleScope: { $bind: { from: "content.scheduleScope", fallback: "any" } },
23011
+ emptyMessage: { $bind: { from: "content.emptyMessage" } }
23012
+ }))
23013
+ ], {
23014
+ gap: "lg"
23015
+ }),
23016
+ // sectionContainer (rb-container) already provides horizontal padding
23017
+ baseClass: "",
23018
+ spacing: "comfortable"
23019
+ })
23020
+ ];
23021
+ var eventListingDerivedFields = [
23022
+ {
23023
+ id: "layout",
23024
+ type: "select",
23025
+ required: false,
23026
+ multiple: false,
23027
+ options: [
23028
+ { value: "grid" },
23029
+ { value: "stack" }
23030
+ ]
23031
+ },
23032
+ {
23033
+ id: "paginationMode",
23034
+ type: "select",
23035
+ required: false,
23036
+ multiple: false,
23037
+ options: [
23038
+ { value: "loadMore" },
23039
+ { value: "seeAllLink" }
23040
+ ]
23041
+ }
23042
+ ];
23043
+ var eventListingContentShape = {
23044
+ additionalFields: eventListingDerivedFields,
23045
+ skipSectionStyles: true
23046
+ };
23047
+ var eventListingConfig = {
22429
23048
  id: "block.event-listing",
22430
23049
  version: "1.1.0",
22431
23050
  title: "Event Listing",
@@ -22433,211 +23052,18 @@ var eventListingManifest = createBlockManifest({
22433
23052
  description: "Paginated list of all upcoming events",
22434
23053
  // Preserve legacy section styles field configuration (renderInHeader: false).
22435
23054
  skipSectionStyles: true,
22436
- additionalFields: [
22437
- ...sectionHeaderFields("All Events"),
22438
- ...(() => {
22439
- const columns = columnsField(["2", "3", "4"]);
22440
- return [
22441
- {
22442
- ...layoutField,
22443
- ui: { ...layoutField.ui ?? {}, intent: "display" }
22444
- },
22445
- {
22446
- ...columns,
22447
- ui: { ...columns.ui ?? {}, intent: "display" }
22448
- }
22449
- ];
22450
- })(),
22451
- {
22452
- id: "eventsPerPage",
22453
- type: "select",
22454
- label: "Events per page",
22455
- description: "Number of events to load at a time",
22456
- required: false,
22457
- multiple: false,
22458
- defaultValue: "12",
22459
- options: [
22460
- { value: "3", label: "3 events" },
22461
- { value: "6", label: "6 events" },
22462
- { value: "12", label: "12 events" },
22463
- { value: "24", label: "24 events" }
22464
- ],
22465
- ui: { intent: "display" }
22466
- },
22467
- {
22468
- id: "paginationMode",
22469
- type: "select",
22470
- label: "More events",
22471
- description: "How to access events beyond the initial list",
22472
- required: false,
22473
- multiple: false,
22474
- defaultValue: "loadMore",
22475
- options: [
22476
- { value: "loadMore", label: "Load more button" },
22477
- { value: "seeAllLink", label: "Link to another page" }
22478
- ],
22479
- ui: { intent: "display" }
22480
- },
22481
- {
22482
- id: "seeAllUrl",
22483
- type: "link",
22484
- label: "See all destination",
22485
- required: false,
22486
- ui: {
22487
- intent: "display",
22488
- visibleWhen: {
22489
- field: "paginationMode",
22490
- equals: "seeAllLink"
22491
- }
22492
- }
22493
- },
22494
- {
22495
- id: "loadMoreText",
22496
- type: "text",
22497
- label: "Button text",
22498
- description: "Text for the pagination button or link",
22499
- required: false,
22500
- multiline: false,
22501
- defaultValue: "Load more events",
22502
- maxLength: 40
22503
- },
22504
- ...cardStylingFields.map((field) => ({
22505
- ...field,
22506
- ui: { ...field.ui ?? {}, intent: "style" }
22507
- })),
22508
- ...eventDisplayFields.map((field) => ({
22509
- ...field,
22510
- ui: { ...field.ui ?? {}, intent: "display" }
22511
- })),
22512
- {
22513
- id: "kind",
22514
- type: "select",
22515
- label: "Show",
22516
- description: "Choose whether this list shows courses, events, or both",
22517
- required: false,
22518
- multiple: false,
22519
- defaultValue: "all",
22520
- options: [
22521
- { value: "all", label: "Courses and events" },
22522
- { value: "courses", label: "Courses only" },
22523
- { value: "events", label: "Events only" }
22524
- ],
22525
- ui: { intent: "behavior" }
22526
- },
22527
- {
22528
- id: "eventSurface",
22529
- type: "select",
22530
- label: "Event surface",
22531
- description: "Choose a semantic event scope",
22532
- required: false,
22533
- multiple: false,
22534
- defaultValue: "all",
22535
- options: [
22536
- { value: "all", label: "All events" },
22537
- { value: "regularClassSchedule", label: "Regular class schedule" },
22538
- { value: "specialDatedEvents", label: "Workshops and special events" },
22539
- { value: "custom", label: "Custom" }
22540
- ],
22541
- ui: { intent: "behavior" }
22542
- },
22543
- {
22544
- id: "filterEventPresets",
22545
- type: "select",
22546
- label: "Pre-filter by event type",
22547
- description: "Restrict this block to specific event types",
22548
- required: false,
22549
- multiple: true,
22550
- defaultValue: [],
22551
- options: [
22552
- { value: "class", label: "Classes" },
22553
- { value: "workshop", label: "Workshops" },
22554
- { value: "retreat", label: "Retreats" },
22555
- { value: "performance", label: "Performances" }
22556
- ],
22557
- ui: {
22558
- intent: "behavior",
22559
- visibleWhen: { field: "eventSurface", equals: "custom" }
22560
- }
22561
- },
22562
- {
22563
- id: "scheduleScope",
22564
- type: "select",
22565
- label: "Schedule cadence",
22566
- description: "Restrict this block by recurrence",
22567
- required: false,
22568
- multiple: false,
22569
- defaultValue: "any",
22570
- options: [
22571
- { value: "any", label: "Any cadence" },
22572
- { value: "recurring", label: "Recurring only" },
22573
- { value: "oneOff", label: "One-off only" }
22574
- ],
22575
- ui: {
22576
- intent: "behavior",
22577
- visibleWhen: { field: "eventSurface", equals: "custom" }
22578
- }
22579
- },
22580
- {
22581
- ...emptyStateField,
22582
- ui: { ...emptyStateField.ui ?? {}, intent: "display" }
22583
- },
22584
- sectionStylesField({
22585
- id: "_sectionStyles",
22586
- label: "Section styles",
22587
- renderInHeader: false
22588
- })
22589
- ],
23055
+ additionalFields: eventListingAdditionalFields,
22590
23056
  styleTokens: { background: "surface", typography: "body", spacing: "md" },
22591
23057
  behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: true },
22592
23058
  category: "interactive",
22593
23059
  tags: ["events", "listing", "paginated", "archive", "all-events"],
22594
23060
  icon: "List",
22595
- layout: [
22596
- styledSection({
22597
- children: sectionContainer([
22598
- // Optional heading
22599
- text(
22600
- { as: "h2" },
22601
- bind("content.heading"),
22602
- when("content.heading")
22603
- ),
22604
- // Optional description
22605
- richText(
22606
- { className: "rb-prose rb-max-w-none" },
22607
- bind("content.description"),
22608
- when("content.description")
22609
- ),
22610
- // Event listing component with pagination
22611
- el("event-listing", withApiBindings({
22612
- events: { $bind: { from: "data.events" } },
22613
- stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
22614
- layout: { $bind: { from: "content.layout", fallback: "grid" } },
22615
- columns: { $bind: { from: "content.columns", fallback: "3" } },
22616
- eventsPerPage: { $bind: { from: "content.eventsPerPage", fallback: "12" } },
22617
- paginationMode: { $bind: { from: "content.paginationMode", fallback: "loadMore" } },
22618
- seeAllUrl: { $bind: { from: "content.seeAllUrl", transforms: [{ id: "links.resolve" }] } },
22619
- loadMoreText: { $bind: { from: "content.loadMoreText", fallback: "Load more events" } },
22620
- cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
22621
- buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
22622
- buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
22623
- showVenue: { $bind: { from: "content.showVenue" } },
22624
- showMap: { $bind: { from: "content.showMap" } },
22625
- showCapacity: { $bind: { from: "content.showCapacity" } },
22626
- eventKind: { $bind: { from: "content.kind", fallback: "all" } },
22627
- eventSurface: { $bind: { from: "content.eventSurface", fallback: "all" } },
22628
- filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
22629
- scheduleScope: { $bind: { from: "content.scheduleScope", fallback: "any" } },
22630
- emptyMessage: { $bind: { from: "content.emptyMessage" } }
22631
- }))
22632
- ], {
22633
- gap: "lg"
22634
- }),
22635
- // sectionContainer (rb-container) already provides horizontal padding
22636
- baseClass: "",
22637
- spacing: "comfortable"
22638
- })
22639
- ]
22640
- });
23061
+ layout: eventListingLayout
23062
+ };
23063
+ var eventListingManifest = createBlockManifestWithContentShape(
23064
+ eventListingConfig,
23065
+ eventListingContentShape
23066
+ );
22641
23067
  var eventListingBlockDefinition = {
22642
23068
  manifest: eventListingManifest,
22643
23069
  runtime: eventListingBlockRuntime,
@@ -22664,7 +23090,6 @@ var eventListingBlockDefinition = {
22664
23090
 
22665
23091
  // ../blocks/src/system/runtime/nodes/events/EventCalendar.interactive.ts
22666
23092
  import { z as z51 } from "zod";
22667
- var displayModeSchema = z51.enum(["combined", "month", "week", "list", "timetable"]);
22668
23093
  var eventBlockKindSchema2 = z51.enum(eventBlockKindValues);
22669
23094
  var eventSurfaceScopeSchema2 = z51.enum(eventSurfaceScopeValues);
22670
23095
  var eventScheduleScopeSchema3 = z51.enum(eventScheduleScopeValues);
@@ -22674,7 +23099,8 @@ var eventCalendarSourceSchema = z51.object(
22674
23099
  siteId: z51.string(),
22675
23100
  apiBaseUrl: z51.string().optional(),
22676
23101
  stage: previewStageSchema.optional(),
22677
- displayMode: displayModeSchema.nullable().optional(),
23102
+ variant: eventCalendarDisplayModeSchema.nullable().optional(),
23103
+ displayMode: eventCalendarDisplayModeSchema.nullable().optional(),
22678
23104
  listLayout: eventLayoutSchema.optional(),
22679
23105
  listColumns: columnOptionSchema.optional(),
22680
23106
  layout: eventLayoutSchema.optional(),
@@ -22706,7 +23132,7 @@ var eventCalendarSourceSchema = z51.object(
22706
23132
  );
22707
23133
  var eventCalendarDisplaySchema = z51.object({
22708
23134
  kind: z51.literal("event-calendar"),
22709
- displayMode: displayModeSchema,
23135
+ displayMode: eventCalendarDisplayModeSchema,
22710
23136
  className: z51.string().nullable(),
22711
23137
  events: z51.array(publicEventSchema),
22712
23138
  listLayout: eventLayoutSchema,
@@ -22761,7 +23187,7 @@ var eventCalendarIslandMetaKeys = defineInteractiveIslandMetaKeys(
22761
23187
  function buildEventCalendarDisplay(source) {
22762
23188
  return {
22763
23189
  kind: "event-calendar",
22764
- displayMode: source.displayMode ?? "combined",
23190
+ displayMode: source.variant ?? source.displayMode ?? "combined",
22765
23191
  className: source.className ?? null,
22766
23192
  events: (source.events ?? []).slice().sort(
22767
23193
  (left, right) => new Date(left.startsAt).getTime() - new Date(right.startsAt).getTime()
@@ -22828,8 +23254,12 @@ var eventCalendarInteractiveIslandPropsCodec = createInteractiveIslandCodec({
22828
23254
  function normalizeEventCalendarContent(content) {
22829
23255
  const record = typeof content === "object" && content !== null ? content : {};
22830
23256
  const kind = normalizeEventBlockKind(record.kind);
23257
+ const variant = normalizeEventCalendarDisplayMode(record.variant) ?? normalizeEventCalendarDisplayMode(record.displayMode);
22831
23258
  return {
22832
23259
  ...record,
23260
+ ...variant ? { variant } : {},
23261
+ displayMode: normalizeEventCalendarDisplayMode(record.displayMode),
23262
+ listLayout: normalizeEventCalendarListLayout(record.listLayout),
22833
23263
  kind,
22834
23264
  eventSurface: normalizeEventSurfaceScope(record.eventSurface),
22835
23265
  filterEventPresets: normalizeEventSurfacePresets(record.filterEventPresets),
@@ -22841,355 +23271,515 @@ function normalizeEventCalendarContent(content) {
22841
23271
  filterVenueId: normalizeEventVenueId(record.filterVenueId)
22842
23272
  };
22843
23273
  }
22844
- var eventCalendarManifest = createBlockManifest({
22845
- id: "block.event-calendar",
22846
- version: "3.6.0",
22847
- title: "Event Calendar",
22848
- titleSource: "heading",
22849
- description: "Display events with calendar, list, or combined views with filtering",
22850
- // Preserve legacy section styles field configuration (renderInHeader: false).
22851
- skipSectionStyles: true,
22852
- additionalFields: [
22853
- ...sectionHeaderFields("Event Calendar"),
22854
- // Display Mode (replaces calendarView)
22855
- {
22856
- id: "displayMode",
22857
- type: "select",
22858
- label: "Display mode",
22859
- description: "How events are displayed",
22860
- required: false,
22861
- multiple: false,
22862
- defaultValue: "combined",
22863
- options: [
22864
- { value: "combined", label: "Combined (List + Calendar tabs)" },
22865
- { value: "month", label: "Month calendar" },
22866
- { value: "week", label: "Week agenda" },
22867
- { value: "timetable", label: "Timetable" },
22868
- { value: "list", label: "List" }
22869
- ],
22870
- ui: { intent: "display" }
22871
- },
22872
- // List options (visible when displayMode is list or combined)
22873
- {
22874
- id: "listLayout",
22875
- type: "select",
22876
- label: "List layout",
22877
- description: "Layout style for list view",
22878
- required: false,
22879
- multiple: false,
22880
- defaultValue: "stack",
22881
- options: [
22882
- { value: "stack", label: "Stack (full-width cards)" },
22883
- { value: "grid", label: "Grid" },
22884
- { value: "compact", label: "Compact (dense rows)" }
22885
- ],
22886
- ui: {
22887
- intent: "display",
22888
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list"] }
22889
- }
22890
- },
22891
- {
22892
- id: "listColumns",
22893
- type: "select",
22894
- label: "Grid columns",
22895
- description: "Number of columns in grid layout",
22896
- required: false,
22897
- multiple: false,
22898
- defaultValue: "3",
22899
- options: [
22900
- { value: "2", label: "2 columns" },
22901
- { value: "3", label: "3 columns" },
22902
- { value: "4", label: "4 columns" }
22903
- ],
22904
- ui: {
22905
- intent: "display",
22906
- visibleWhen: { field: "listLayout", equals: "grid" }
22907
- }
22908
- },
22909
- {
22910
- id: "eventsPerPage",
22911
- type: "select",
22912
- label: "Events per page (cards)",
22913
- description: "Number of events to load initially in card layouts",
22914
- required: false,
22915
- multiple: false,
22916
- defaultValue: "12",
22917
- options: [
22918
- { value: "6", label: "6" },
22919
- { value: "12", label: "12" },
22920
- { value: "24", label: "24" }
22921
- ],
22922
- ui: {
22923
- intent: "display",
22924
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list"] }
22925
- }
22926
- },
22927
- {
22928
- id: "compactEventsPerPage",
22929
- type: "select",
22930
- label: "Events per page (compact)",
22931
- description: "Number of events to show per page in compact layout",
22932
- required: false,
22933
- multiple: false,
22934
- defaultValue: "10",
22935
- options: [
22936
- { value: "10", label: "10" },
22937
- { value: "20", label: "20" },
22938
- { value: "30", label: "30" }
22939
- ],
22940
- ui: {
22941
- intent: "display",
22942
- visibleWhen: { field: "listLayout", equals: "compact" }
22943
- }
22944
- },
22945
- {
22946
- id: "loadMoreText",
22947
- type: "text",
22948
- label: "Load more button text",
22949
- description: "Text for the load more button",
22950
- required: false,
22951
- multiline: false,
22952
- defaultValue: "Load more events",
22953
- ui: {
22954
- intent: "content",
22955
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list"] }
22956
- }
22957
- },
22958
- // Calendar options
22959
- {
22960
- id: "startOfWeek",
22961
- type: "select",
22962
- label: "Week starts on",
22963
- description: "First day of the week",
22964
- required: false,
22965
- multiple: false,
22966
- defaultValue: "monday",
22967
- options: [
22968
- { value: "sunday", label: "Sunday" },
22969
- { value: "monday", label: "Monday" }
22970
- ],
22971
- ui: {
22972
- intent: "display",
22973
- visibleWhen: {
22974
- field: "displayMode",
22975
- oneOf: ["combined", "month", "week"]
22976
- }
22977
- }
22978
- },
22979
- // Combined mode options
22980
- {
22981
- id: "calendarTabViews",
22982
- type: "select",
22983
- label: "Calendar tab views",
22984
- description: "Which calendar views to show in the Calendar tab",
22985
- required: false,
22986
- multiple: false,
22987
- defaultValue: "both",
22988
- options: [
22989
- { value: "both", label: "Month + Week toggle" },
22990
- { value: "month", label: "Month only" },
22991
- { value: "week", label: "Week only" }
22992
- ],
22993
- ui: {
22994
- intent: "display",
22995
- visibleWhen: { field: "displayMode", equals: "combined" }
22996
- }
22997
- },
22998
- // Filtering options
22999
- {
23000
- id: "kind",
23001
- type: "select",
23002
- label: "Show",
23003
- description: "Restrict this block to all offerings, courses, or events",
23004
- required: false,
23005
- multiple: false,
23006
- defaultValue: "all",
23007
- options: [
23008
- { value: "all", label: "All offerings" },
23009
- { value: "courses", label: "Courses only" },
23010
- { value: "events", label: "Events only" }
23011
- ],
23012
- ui: { intent: "behavior" }
23013
- },
23014
- {
23015
- id: "showFilters",
23016
- type: "boolean",
23017
- label: "Show filters",
23018
- description: "Show category, staff, and venue filters",
23019
- required: false,
23020
- defaultValue: true,
23021
- ui: {
23022
- intent: "display",
23023
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
23024
- }
23025
- },
23026
- {
23027
- id: "showCategoryFilter",
23028
- type: "select",
23029
- label: "Show category filter",
23030
- description: "When to show the category filter dropdown",
23031
- required: false,
23032
- multiple: false,
23033
- defaultValue: "auto",
23034
- options: [
23035
- { value: "auto", label: "Auto (when >1 category has events)" },
23036
- { value: "always", label: "Always" },
23037
- { value: "never", label: "Never" }
23274
+ function normalizeEventCalendarDisplayMode(value) {
23275
+ return isEventCalendarDisplayMode(value) ? value : void 0;
23276
+ }
23277
+ function normalizeEventCalendarListLayout(value) {
23278
+ return isEventCalendarListLayout(value) ? value : void 0;
23279
+ }
23280
+ var eventCalendarLayout = [
23281
+ styledSection({
23282
+ children: sectionContainer(
23283
+ [
23284
+ // Optional heading
23285
+ text({ as: "h2" }, bind("content.heading"), when("content.heading")),
23286
+ // Optional description
23287
+ richText(
23288
+ { className: "rb-prose rb-max-w-none" },
23289
+ bind("content.description"),
23290
+ when("content.description")
23291
+ ),
23292
+ // Event calendar component (handles all display modes)
23293
+ el(
23294
+ "event-calendar",
23295
+ withApiBindings({
23296
+ events: { $bind: { from: "data.events" } },
23297
+ stage: {
23298
+ $bind: { from: "$root.previewStage", fallback: "published" }
23299
+ },
23300
+ // Variant is the new Theme V2-facing display mode. displayMode is
23301
+ // retained as a legacy fallback for existing content.
23302
+ variant: {
23303
+ $bind: { from: "content.variant" }
23304
+ },
23305
+ displayMode: {
23306
+ $bind: { from: "content.displayMode" }
23307
+ },
23308
+ // List options
23309
+ listLayout: { $bind: { from: "content.listLayout" } },
23310
+ listColumns: { $bind: { from: "content.listColumns" } },
23311
+ // Legacy compatibility: older event-calendar content used layout/columns
23312
+ layout: { $bind: { from: "content.layout" } },
23313
+ columns: { $bind: { from: "content.columns" } },
23314
+ eventsPerPage: {
23315
+ $bind: { from: "content.eventsPerPage", fallback: "12" }
23316
+ },
23317
+ compactEventsPerPage: {
23318
+ $bind: { from: "content.compactEventsPerPage", fallback: "10" }
23319
+ },
23320
+ loadMoreText: {
23321
+ $bind: {
23322
+ from: "content.loadMoreText",
23323
+ fallback: "Load more events"
23324
+ }
23325
+ },
23326
+ // Calendar options
23327
+ startOfWeek: {
23328
+ $bind: { from: "content.startOfWeek", fallback: "monday" }
23329
+ },
23330
+ calendarTabViews: {
23331
+ $bind: { from: "content.calendarTabViews", fallback: "both" }
23332
+ },
23333
+ // Filtering options
23334
+ showFilters: {
23335
+ $bind: { from: "content.showFilters", fallback: true }
23336
+ },
23337
+ showCategoryFilter: {
23338
+ $bind: { from: "content.showCategoryFilter", fallback: "auto" }
23339
+ },
23340
+ showVenueFilter: {
23341
+ $bind: { from: "content.showVenueFilter", fallback: false }
23342
+ },
23343
+ showStaffFilter: {
23344
+ $bind: { from: "content.showStaffFilter", fallback: true }
23345
+ },
23346
+ showCapacity: {
23347
+ $bind: { from: "content.showCapacity", fallback: true }
23348
+ },
23349
+ kind: { $bind: { from: "content.kind", fallback: "all" } },
23350
+ eventSurface: {
23351
+ $bind: { from: "content.eventSurface", fallback: "all" }
23352
+ },
23353
+ filterEventPresets: {
23354
+ $bind: { from: "content.filterEventPresets" }
23355
+ },
23356
+ scheduleScope: {
23357
+ $bind: { from: "content.scheduleScope", fallback: "any" }
23358
+ },
23359
+ filterCategoryIds: {
23360
+ $bind: { from: "content.filterCategoryIds" }
23361
+ },
23362
+ filterStaffMemberId: {
23363
+ $bind: { from: "content.filterStaffMemberId" }
23364
+ },
23365
+ filterVenueId: { $bind: { from: "content.filterVenueId" } },
23366
+ // Styling
23367
+ buttonVariant: {
23368
+ $bind: { from: "content.buttonVariant", fallback: "primary" }
23369
+ },
23370
+ buttonText: {
23371
+ $bind: { from: "content.buttonText", fallback: "View event" }
23372
+ },
23373
+ emptyMessage: { $bind: { from: "content.emptyMessage" } }
23374
+ })
23375
+ )
23038
23376
  ],
23039
- ui: {
23040
- intent: "display",
23041
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
23042
- }
23043
- },
23044
- {
23045
- id: "showVenueFilter",
23046
- type: "boolean",
23047
- label: "Show venue filter",
23048
- description: "Show venue filter dropdown",
23049
- required: false,
23050
- defaultValue: false,
23051
- ui: {
23052
- intent: "display",
23053
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
23054
- }
23055
- },
23056
- {
23057
- id: "showStaffFilter",
23058
- type: "boolean",
23059
- label: "Show staff filter",
23060
- description: "Show staff filter dropdown",
23061
- required: false,
23062
- defaultValue: true,
23063
- ui: {
23064
- intent: "display",
23065
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
23066
- }
23067
- },
23068
- {
23069
- id: "showCapacity",
23070
- type: "boolean",
23071
- label: "Show available spots",
23072
- description: "Display remaining capacity on event cards and timetable cells",
23073
- required: false,
23074
- defaultValue: true,
23075
- ui: {
23076
- intent: "display",
23077
- visibleWhen: {
23078
- field: "displayMode",
23079
- oneOf: ["combined", "list", "week", "timetable"]
23080
- }
23377
+ {
23378
+ gap: "lg"
23081
23379
  }
23082
- },
23083
- // Block-level pre-filtering
23084
- {
23085
- id: "eventSurface",
23086
- type: "select",
23087
- label: "Event surface",
23088
- description: "Choose a semantic event scope",
23089
- required: false,
23090
- multiple: false,
23091
- defaultValue: "all",
23092
- options: [
23093
- { value: "all", label: "All events" },
23094
- { value: "regularClassSchedule", label: "Regular class schedule" },
23095
- { value: "specialDatedEvents", label: "Workshops and special events" },
23096
- { value: "custom", label: "Custom" }
23097
- ],
23098
- ui: { intent: "behavior" }
23099
- },
23100
- {
23101
- id: "filterEventPresets",
23102
- type: "select",
23103
- label: "Pre-filter by event type",
23104
- description: "Restrict this block to specific event types",
23105
- required: false,
23106
- multiple: true,
23107
- defaultValue: [],
23108
- options: [
23109
- { value: "class", label: "Classes" },
23110
- { value: "workshop", label: "Workshops" },
23111
- { value: "retreat", label: "Retreats" },
23112
- { value: "performance", label: "Performances" }
23113
- ],
23114
- ui: {
23115
- intent: "behavior",
23116
- visibleWhen: { field: "eventSurface", equals: "custom" }
23380
+ ),
23381
+ // sectionContainer (rb-container) already provides horizontal padding
23382
+ baseClass: "",
23383
+ spacing: "comfortable"
23384
+ })
23385
+ ];
23386
+ var eventCalendarAdditionalFields = [
23387
+ ...sectionHeaderFields("Event Calendar"),
23388
+ // Display Mode (replaces calendarView)
23389
+ {
23390
+ id: "displayMode",
23391
+ type: "select",
23392
+ label: "Display mode",
23393
+ description: "How events are displayed",
23394
+ required: false,
23395
+ multiple: false,
23396
+ defaultValue: "combined",
23397
+ options: [
23398
+ { value: "combined", label: "Combined (List + Calendar tabs)" },
23399
+ { value: "month", label: "Month calendar" },
23400
+ { value: "week", label: "Week agenda" },
23401
+ { value: "timetable", label: "Timetable" },
23402
+ { value: "list", label: "List" }
23403
+ ],
23404
+ ui: { intent: "display", hidden: true }
23405
+ },
23406
+ // List options (visible when displayMode is list or combined)
23407
+ {
23408
+ id: "listLayout",
23409
+ type: "select",
23410
+ label: "List layout",
23411
+ description: "Layout style for list view",
23412
+ required: false,
23413
+ multiple: false,
23414
+ defaultValue: "stack",
23415
+ options: eventCalendarListLayoutOptions.map((option) => ({
23416
+ value: option.id,
23417
+ label: option.label
23418
+ })),
23419
+ ui: {
23420
+ intent: "display",
23421
+ visibleWhen: { field: "variant", oneOf: ["combined", "list"] }
23422
+ }
23423
+ },
23424
+ {
23425
+ id: "listColumns",
23426
+ type: "select",
23427
+ label: "Grid columns",
23428
+ description: "Number of columns in grid layout",
23429
+ required: false,
23430
+ multiple: false,
23431
+ defaultValue: "3",
23432
+ options: [
23433
+ { value: "2", label: "2 columns" },
23434
+ { value: "3", label: "3 columns" },
23435
+ { value: "4", label: "4 columns" }
23436
+ ],
23437
+ ui: {
23438
+ intent: "display",
23439
+ visibleWhen: { field: "listLayout", equals: "grid" }
23440
+ }
23441
+ },
23442
+ {
23443
+ id: "eventsPerPage",
23444
+ type: "select",
23445
+ label: "Events per page (cards)",
23446
+ description: "Number of events to load initially in card layouts",
23447
+ required: false,
23448
+ multiple: false,
23449
+ defaultValue: "12",
23450
+ options: [
23451
+ { value: "6", label: "6" },
23452
+ { value: "12", label: "12" },
23453
+ { value: "24", label: "24" }
23454
+ ],
23455
+ ui: {
23456
+ intent: "display",
23457
+ visibleWhen: { field: "variant", oneOf: ["combined", "list"] }
23458
+ }
23459
+ },
23460
+ {
23461
+ id: "compactEventsPerPage",
23462
+ type: "select",
23463
+ label: "Events per page (compact)",
23464
+ description: "Number of events to show per page in compact layout",
23465
+ required: false,
23466
+ multiple: false,
23467
+ defaultValue: "10",
23468
+ options: [
23469
+ { value: "10", label: "10" },
23470
+ { value: "20", label: "20" },
23471
+ { value: "30", label: "30" }
23472
+ ],
23473
+ ui: {
23474
+ intent: "display",
23475
+ visibleWhen: { field: "listLayout", equals: "compact" }
23476
+ }
23477
+ },
23478
+ {
23479
+ id: "loadMoreText",
23480
+ type: "text",
23481
+ label: "Load more button text",
23482
+ description: "Text for the load more button",
23483
+ required: false,
23484
+ multiline: false,
23485
+ defaultValue: "Load more events",
23486
+ ui: {
23487
+ intent: "content",
23488
+ visibleWhen: { field: "variant", oneOf: ["combined", "list"] }
23489
+ }
23490
+ },
23491
+ // Calendar options
23492
+ {
23493
+ id: "startOfWeek",
23494
+ type: "select",
23495
+ label: "Week starts on",
23496
+ description: "First day of the week",
23497
+ required: false,
23498
+ multiple: false,
23499
+ defaultValue: "monday",
23500
+ options: [
23501
+ { value: "sunday", label: "Sunday" },
23502
+ { value: "monday", label: "Monday" }
23503
+ ],
23504
+ ui: {
23505
+ intent: "display",
23506
+ visibleWhen: {
23507
+ field: "variant",
23508
+ oneOf: ["combined", "month", "week"]
23117
23509
  }
23118
- },
23119
- {
23120
- id: "scheduleScope",
23121
- type: "select",
23122
- label: "Schedule cadence",
23123
- description: "Restrict this block by recurrence",
23124
- required: false,
23125
- multiple: false,
23126
- defaultValue: "any",
23127
- options: [
23128
- { value: "any", label: "Any cadence" },
23129
- { value: "recurring", label: "Recurring only" },
23130
- { value: "oneOff", label: "One-off only" }
23131
- ],
23132
- ui: {
23133
- intent: "behavior",
23134
- visibleWhen: { field: "eventSurface", equals: "custom" }
23510
+ }
23511
+ },
23512
+ // Combined mode options
23513
+ {
23514
+ id: "calendarTabViews",
23515
+ type: "select",
23516
+ label: "Calendar tab views",
23517
+ description: "Which calendar views to show in the Calendar tab",
23518
+ required: false,
23519
+ multiple: false,
23520
+ defaultValue: "both",
23521
+ options: [
23522
+ { value: "both", label: "Month + Week toggle" },
23523
+ { value: "month", label: "Month only" },
23524
+ { value: "week", label: "Week only" }
23525
+ ],
23526
+ ui: {
23527
+ intent: "display",
23528
+ visibleWhen: { field: "variant", equals: "combined" }
23529
+ }
23530
+ },
23531
+ // Filtering options
23532
+ {
23533
+ id: "kind",
23534
+ type: "select",
23535
+ label: "Show",
23536
+ description: "Restrict this block to all offerings, courses, or events",
23537
+ required: false,
23538
+ multiple: false,
23539
+ defaultValue: "all",
23540
+ options: [
23541
+ { value: "all", label: "All offerings" },
23542
+ { value: "courses", label: "Courses only" },
23543
+ { value: "events", label: "Events only" }
23544
+ ],
23545
+ ui: { intent: "behavior" }
23546
+ },
23547
+ {
23548
+ id: "showFilters",
23549
+ type: "boolean",
23550
+ label: "Show filters",
23551
+ description: "Show category, staff, and venue filters",
23552
+ required: false,
23553
+ defaultValue: true,
23554
+ ui: {
23555
+ intent: "display",
23556
+ visibleWhen: {
23557
+ field: "variant",
23558
+ oneOf: ["combined", "list", "timetable"]
23135
23559
  }
23136
- },
23137
- createSiteOptionSelectField({
23138
- id: "filterCategoryIds",
23139
- label: "Pre-filter by categories",
23140
- description: "Restrict this block to specific event categories",
23141
- required: false,
23142
- multiple: true,
23143
- defaultValue: [],
23144
- optionSource: "eventCategories",
23145
- ui: {
23146
- intent: "behavior",
23147
- searchThreshold: 8,
23148
- visibleWhen: { field: "kind", notEquals: "courses" }
23560
+ }
23561
+ },
23562
+ {
23563
+ id: "showCategoryFilter",
23564
+ type: "select",
23565
+ label: "Show category filter",
23566
+ description: "When to show the category filter dropdown",
23567
+ required: false,
23568
+ multiple: false,
23569
+ defaultValue: "auto",
23570
+ options: [
23571
+ { value: "auto", label: "Auto (when >1 category has events)" },
23572
+ { value: "always", label: "Always" },
23573
+ { value: "never", label: "Never" }
23574
+ ],
23575
+ ui: {
23576
+ intent: "display",
23577
+ visibleWhen: {
23578
+ field: "variant",
23579
+ oneOf: ["combined", "list", "timetable"]
23149
23580
  }
23150
- }),
23151
- createSiteOptionSelectField({
23152
- id: "filterStaffMemberId",
23153
- label: "Pre-filter by staff member",
23154
- description: "Restrict this block to a single staff member",
23155
- required: false,
23156
- multiple: false,
23157
- optionSource: "staffMembers",
23158
- ui: {
23159
- intent: "behavior",
23160
- searchThreshold: 8
23581
+ }
23582
+ },
23583
+ {
23584
+ id: "showVenueFilter",
23585
+ type: "boolean",
23586
+ label: "Show venue filter",
23587
+ description: "Show venue filter dropdown",
23588
+ required: false,
23589
+ defaultValue: false,
23590
+ ui: {
23591
+ intent: "display",
23592
+ visibleWhen: {
23593
+ field: "variant",
23594
+ oneOf: ["combined", "list", "timetable"]
23161
23595
  }
23162
- }),
23163
- createSiteOptionSelectField({
23164
- id: "filterVenueId",
23165
- label: "Pre-filter by venue",
23166
- description: "Restrict this block to a single venue",
23167
- required: false,
23168
- multiple: false,
23169
- optionSource: "venues",
23170
- ui: {
23171
- intent: "behavior",
23172
- searchThreshold: 8
23596
+ }
23597
+ },
23598
+ {
23599
+ id: "showStaffFilter",
23600
+ type: "boolean",
23601
+ label: "Show staff filter",
23602
+ description: "Show staff filter dropdown",
23603
+ required: false,
23604
+ defaultValue: true,
23605
+ ui: {
23606
+ intent: "display",
23607
+ visibleWhen: {
23608
+ field: "variant",
23609
+ oneOf: ["combined", "list", "timetable"]
23173
23610
  }
23174
- }),
23175
- // Card styling
23176
- ...cardStylingFields.filter((f) => f.id === "buttonVariant" || f.id === "buttonText").map((field) => ({
23177
- ...field,
23178
- ui: {
23179
- ...field.ui ?? {},
23180
- intent: field.id === "buttonVariant" ? "style" : "content"
23611
+ }
23612
+ },
23613
+ {
23614
+ id: "showCapacity",
23615
+ type: "boolean",
23616
+ label: "Show available spots",
23617
+ description: "Display remaining capacity on event cards and timetable cells",
23618
+ required: false,
23619
+ defaultValue: true,
23620
+ ui: {
23621
+ intent: "display",
23622
+ visibleWhen: {
23623
+ field: "variant",
23624
+ oneOf: ["combined", "list", "week", "timetable"]
23181
23625
  }
23182
- })),
23183
- {
23184
- ...emptyStateField,
23185
- ui: { ...emptyStateField.ui ?? {}, intent: "display" }
23186
- },
23187
- sectionStylesField({
23188
- id: "_sectionStyles",
23189
- label: "Section styles",
23190
- renderInHeader: false
23191
- })
23192
- ],
23626
+ }
23627
+ },
23628
+ // Block-level pre-filtering
23629
+ {
23630
+ id: "eventSurface",
23631
+ type: "select",
23632
+ label: "Event surface",
23633
+ description: "Choose a semantic event scope",
23634
+ required: false,
23635
+ multiple: false,
23636
+ defaultValue: "all",
23637
+ options: [
23638
+ { value: "all", label: "All events" },
23639
+ { value: "regularClassSchedule", label: "Regular class schedule" },
23640
+ { value: "specialDatedEvents", label: "Workshops and special events" },
23641
+ { value: "custom", label: "Custom" }
23642
+ ],
23643
+ ui: { intent: "behavior" }
23644
+ },
23645
+ {
23646
+ id: "filterEventPresets",
23647
+ type: "select",
23648
+ label: "Pre-filter by event type",
23649
+ description: "Restrict this block to specific event types",
23650
+ required: false,
23651
+ multiple: true,
23652
+ defaultValue: [],
23653
+ options: [
23654
+ { value: "class", label: "Classes" },
23655
+ { value: "workshop", label: "Workshops" },
23656
+ { value: "retreat", label: "Retreats" },
23657
+ { value: "performance", label: "Performances" }
23658
+ ],
23659
+ ui: {
23660
+ intent: "behavior",
23661
+ visibleWhen: { field: "eventSurface", equals: "custom" }
23662
+ }
23663
+ },
23664
+ {
23665
+ id: "scheduleScope",
23666
+ type: "select",
23667
+ label: "Schedule cadence",
23668
+ description: "Restrict this block by recurrence",
23669
+ required: false,
23670
+ multiple: false,
23671
+ defaultValue: "any",
23672
+ options: [
23673
+ { value: "any", label: "Any cadence" },
23674
+ { value: "recurring", label: "Recurring only" },
23675
+ { value: "oneOff", label: "One-off only" }
23676
+ ],
23677
+ ui: {
23678
+ intent: "behavior",
23679
+ visibleWhen: { field: "eventSurface", equals: "custom" }
23680
+ }
23681
+ },
23682
+ createSiteOptionSelectField({
23683
+ id: "filterCategoryIds",
23684
+ label: "Pre-filter by categories",
23685
+ description: "Restrict this block to specific event categories",
23686
+ required: false,
23687
+ multiple: true,
23688
+ defaultValue: [],
23689
+ optionSource: "eventCategories",
23690
+ ui: {
23691
+ intent: "behavior",
23692
+ searchThreshold: 8,
23693
+ visibleWhen: { field: "kind", notEquals: "courses" }
23694
+ }
23695
+ }),
23696
+ createSiteOptionSelectField({
23697
+ id: "filterStaffMemberId",
23698
+ label: "Pre-filter by staff member",
23699
+ description: "Restrict this block to a single staff member",
23700
+ required: false,
23701
+ multiple: false,
23702
+ optionSource: "staffMembers",
23703
+ ui: {
23704
+ intent: "behavior",
23705
+ searchThreshold: 8
23706
+ }
23707
+ }),
23708
+ createSiteOptionSelectField({
23709
+ id: "filterVenueId",
23710
+ label: "Pre-filter by venue",
23711
+ description: "Restrict this block to a single venue",
23712
+ required: false,
23713
+ multiple: false,
23714
+ optionSource: "venues",
23715
+ ui: {
23716
+ intent: "behavior",
23717
+ searchThreshold: 8
23718
+ }
23719
+ }),
23720
+ // Card styling
23721
+ ...cardStylingFields.filter((f) => f.id === "buttonVariant" || f.id === "buttonText").map((field) => ({
23722
+ ...field,
23723
+ ui: {
23724
+ ...field.ui ?? {},
23725
+ intent: field.id === "buttonVariant" ? "style" : "content"
23726
+ }
23727
+ })),
23728
+ {
23729
+ ...emptyStateField,
23730
+ ui: { ...emptyStateField.ui ?? {}, intent: "display" }
23731
+ },
23732
+ sectionStylesField({
23733
+ id: "_sectionStyles",
23734
+ label: "Section styles",
23735
+ renderInHeader: false
23736
+ })
23737
+ ];
23738
+ var eventCalendarVariants = {
23739
+ combined: eventCalendarLayout[0],
23740
+ month: eventCalendarLayout[0],
23741
+ week: eventCalendarLayout[0],
23742
+ timetable: eventCalendarLayout[0],
23743
+ list: eventCalendarLayout[0]
23744
+ };
23745
+ var eventCalendarDerivedFields = [
23746
+ {
23747
+ id: "displayMode",
23748
+ type: "select",
23749
+ required: false,
23750
+ multiple: false,
23751
+ options: [
23752
+ { value: "combined" },
23753
+ { value: "month" },
23754
+ { value: "week" },
23755
+ { value: "timetable" },
23756
+ { value: "list" }
23757
+ ]
23758
+ },
23759
+ {
23760
+ id: "listLayout",
23761
+ type: "select",
23762
+ required: false,
23763
+ multiple: false,
23764
+ options: eventCalendarListLayoutOptions.map((option) => ({
23765
+ value: option.id
23766
+ }))
23767
+ }
23768
+ ];
23769
+ var eventCalendarContentShape = {
23770
+ additionalFields: eventCalendarDerivedFields,
23771
+ variants: eventCalendarVariants,
23772
+ skipSectionStyles: true
23773
+ };
23774
+ var eventCalendarConfig = {
23775
+ id: "block.event-calendar",
23776
+ version: "3.6.0",
23777
+ title: "Event Calendar",
23778
+ titleSource: "heading",
23779
+ description: "Display events with calendar, list, or combined views with filtering",
23780
+ // Preserve legacy section styles field configuration (renderInHeader: false).
23781
+ skipSectionStyles: true,
23782
+ additionalFields: eventCalendarAdditionalFields,
23193
23783
  styleTokens: { background: "surface", typography: "body", spacing: "md" },
23194
23784
  behaviours: {
23195
23785
  supportsThemeSwitching: true,
@@ -23209,109 +23799,21 @@ var eventCalendarManifest = createBlockManifest({
23209
23799
  "filter"
23210
23800
  ],
23211
23801
  icon: "CalendarDays",
23212
- layout: [
23213
- styledSection({
23214
- children: sectionContainer(
23215
- [
23216
- // Optional heading
23217
- text({ as: "h2" }, bind("content.heading"), when("content.heading")),
23218
- // Optional description
23219
- richText(
23220
- { className: "rb-prose rb-max-w-none" },
23221
- bind("content.description"),
23222
- when("content.description")
23223
- ),
23224
- // Event calendar component (handles all display modes)
23225
- el(
23226
- "event-calendar",
23227
- withApiBindings({
23228
- events: { $bind: { from: "data.events" } },
23229
- stage: {
23230
- $bind: { from: "$root.previewStage", fallback: "published" }
23231
- },
23232
- // Display mode
23233
- displayMode: {
23234
- $bind: { from: "content.displayMode", fallback: "combined" }
23235
- },
23236
- // List options
23237
- listLayout: { $bind: { from: "content.listLayout" } },
23238
- listColumns: { $bind: { from: "content.listColumns" } },
23239
- // Legacy compatibility: older event-calendar content used layout/columns
23240
- layout: { $bind: { from: "content.layout" } },
23241
- columns: { $bind: { from: "content.columns" } },
23242
- eventsPerPage: {
23243
- $bind: { from: "content.eventsPerPage", fallback: "12" }
23244
- },
23245
- compactEventsPerPage: {
23246
- $bind: { from: "content.compactEventsPerPage", fallback: "10" }
23247
- },
23248
- loadMoreText: {
23249
- $bind: {
23250
- from: "content.loadMoreText",
23251
- fallback: "Load more events"
23252
- }
23253
- },
23254
- // Calendar options
23255
- startOfWeek: {
23256
- $bind: { from: "content.startOfWeek", fallback: "monday" }
23257
- },
23258
- calendarTabViews: {
23259
- $bind: { from: "content.calendarTabViews", fallback: "both" }
23260
- },
23261
- // Filtering options
23262
- showFilters: {
23263
- $bind: { from: "content.showFilters", fallback: true }
23264
- },
23265
- showCategoryFilter: {
23266
- $bind: { from: "content.showCategoryFilter", fallback: "auto" }
23267
- },
23268
- showVenueFilter: {
23269
- $bind: { from: "content.showVenueFilter", fallback: false }
23270
- },
23271
- showStaffFilter: {
23272
- $bind: { from: "content.showStaffFilter", fallback: true }
23273
- },
23274
- showCapacity: {
23275
- $bind: { from: "content.showCapacity", fallback: true }
23276
- },
23277
- kind: { $bind: { from: "content.kind", fallback: "all" } },
23278
- eventSurface: {
23279
- $bind: { from: "content.eventSurface", fallback: "all" }
23280
- },
23281
- filterEventPresets: {
23282
- $bind: { from: "content.filterEventPresets" }
23283
- },
23284
- scheduleScope: {
23285
- $bind: { from: "content.scheduleScope", fallback: "any" }
23286
- },
23287
- filterCategoryIds: {
23288
- $bind: { from: "content.filterCategoryIds" }
23289
- },
23290
- filterStaffMemberId: {
23291
- $bind: { from: "content.filterStaffMemberId" }
23292
- },
23293
- filterVenueId: { $bind: { from: "content.filterVenueId" } },
23294
- // Styling
23295
- buttonVariant: {
23296
- $bind: { from: "content.buttonVariant", fallback: "primary" }
23297
- },
23298
- buttonText: {
23299
- $bind: { from: "content.buttonText", fallback: "View event" }
23300
- },
23301
- emptyMessage: { $bind: { from: "content.emptyMessage" } }
23302
- })
23303
- )
23304
- ],
23305
- {
23306
- gap: "lg"
23307
- }
23308
- ),
23309
- // sectionContainer (rb-container) already provides horizontal padding
23310
- baseClass: "",
23311
- spacing: "comfortable"
23312
- })
23313
- ]
23314
- });
23802
+ layout: eventCalendarLayout,
23803
+ variants: eventCalendarVariants,
23804
+ defaultVariant: "combined",
23805
+ variantOptions: {
23806
+ combined: { label: "Combined" },
23807
+ month: { label: "Month" },
23808
+ week: { label: "Week" },
23809
+ timetable: { label: "Timetable" },
23810
+ list: { label: "List" }
23811
+ }
23812
+ };
23813
+ var eventCalendarManifest = createBlockManifestWithContentShape(
23814
+ eventCalendarConfig,
23815
+ eventCalendarContentShape
23816
+ );
23315
23817
  var eventCalendarBlockDefinition = {
23316
23818
  manifest: eventCalendarManifest,
23317
23819
  normalizeContent: normalizeEventCalendarContent,
@@ -27364,14 +27866,29 @@ function mediaPanelCapable() {
27364
27866
  var allSectionSurfaces = [
27365
27867
  "base",
27366
27868
  "muted-band",
27367
- "accent-band"
27869
+ "accent-band",
27870
+ "brand-depth-band"
27368
27871
  ];
27369
27872
  var heroSectionSurfaces = [
27370
27873
  "base",
27371
27874
  "muted-band",
27372
27875
  "accent-band",
27876
+ "brand-depth-band",
27373
27877
  "hero-image"
27374
27878
  ];
27879
+ var scheduleTileTreatments = [
27880
+ "default",
27881
+ "quiet",
27882
+ "brand-depth"
27883
+ ];
27884
+ function scheduleDetailsCapable() {
27885
+ return declareBlockDesignCapability({
27886
+ sectionSurfaces: "supported",
27887
+ contentFrames: ["plain"],
27888
+ itemSurfaces: "unsupported",
27889
+ tileTreatments: scheduleTileTreatments
27890
+ });
27891
+ }
27375
27892
  function defaultBoundaryBias(visualWeight) {
27376
27893
  return visualWeight === "featured" || visualWeight === "immersive" ? "clear" : "soft";
27377
27894
  }
@@ -27609,7 +28126,7 @@ var systemBlockDefinitionsRaw = [
27609
28126
  flow: conversionFlow,
27610
28127
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
27611
28128
  })),
27612
- withDesignCapability("block.event-details", eventDetailsBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
28129
+ withDesignCapability("block.event-details", eventDetailsBlockDefinition, scheduleDetailsCapable(), defineBlockDesignMetadata({
27613
28130
  flow: offeringsFlow,
27614
28131
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
27615
28132
  })),
@@ -27617,7 +28134,7 @@ var systemBlockDefinitionsRaw = [
27617
28134
  flow: conversionFlow,
27618
28135
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
27619
28136
  })),
27620
- withDesignCapability("block.course-details", courseDetailsBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
28137
+ withDesignCapability("block.course-details", courseDetailsBlockDefinition, scheduleDetailsCapable(), defineBlockDesignMetadata({
27621
28138
  flow: offeringsFlow,
27622
28139
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
27623
28140
  })),
@@ -27632,7 +28149,13 @@ var systemBlockDefinitionsRaw = [
27632
28149
  })),
27633
28150
  withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
27634
28151
  flow: offeringsFlow,
27635
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
28152
+ layoutProfiles: [
28153
+ layoutProfile({ variantKey: "combined", family: "grid", weight: "standard" }),
28154
+ layoutProfile({ variantKey: "list", family: "stack", weight: "standard" }),
28155
+ layoutProfile({ variantKey: "month", family: "grid", weight: "standard" }),
28156
+ layoutProfile({ variantKey: "week", family: "stack", weight: "standard" }),
28157
+ layoutProfile({ variantKey: "timetable", family: "stack", weight: "standard" })
28158
+ ]
27636
28159
  })),
27637
28160
  // Friendly wrapper blocks
27638
28161
  withDesignCapability("block.team-members", teamMembersBlockDefinition, sectionOnly(), defineBlockDesignMetadata({