@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
@@ -1050,6 +1050,14 @@ var ENDPOINT_DEFINITIONS = {
1050
1050
  auth: "user",
1051
1051
  responseKind: "json"
1052
1052
  },
1053
+ exportAppointmentServicesCsv: {
1054
+ path: "/sites/{siteId}/bookings/services/export.csv",
1055
+ method: "GET",
1056
+ tags: ["site-{siteId}", "bookings", "appointment-services-{siteId}"],
1057
+ errors: [],
1058
+ auth: "user",
1059
+ responseKind: "blob"
1060
+ },
1053
1061
  createAppointmentService: {
1054
1062
  path: "/sites/{siteId}/bookings/services",
1055
1063
  method: "POST",
@@ -1318,6 +1326,14 @@ var ENDPOINT_DEFINITIONS = {
1318
1326
  auth: "user",
1319
1327
  responseKind: "json"
1320
1328
  },
1329
+ exportCoursesCsv: {
1330
+ path: "/sites/{siteId}/bookings/courses/export.csv",
1331
+ method: "GET",
1332
+ tags: ["site-{siteId}", "bookings", "courses-{siteId}"],
1333
+ errors: [],
1334
+ auth: "user",
1335
+ responseKind: "blob"
1336
+ },
1321
1337
  createCourse: {
1322
1338
  path: "/sites/{siteId}/bookings/courses",
1323
1339
  method: "POST",
@@ -1417,6 +1433,14 @@ var ENDPOINT_DEFINITIONS = {
1417
1433
  responseKind: "json",
1418
1434
  errors: []
1419
1435
  },
1436
+ exportCourseWaitlistCsv: {
1437
+ path: "/sites/{siteId}/bookings/courses/{courseId}/waitlist/export.csv",
1438
+ method: "GET",
1439
+ tags: ["site-{siteId}", "bookings", "courses-{courseId}"],
1440
+ auth: "user",
1441
+ responseKind: "blob",
1442
+ errors: []
1443
+ },
1420
1444
  updateCourseEnrollment: {
1421
1445
  path: "/sites/{siteId}/bookings/courses/{courseId}/enrollments/{enrollmentId}",
1422
1446
  method: "PATCH",
@@ -4012,6 +4036,14 @@ var ENDPOINT_DEFINITIONS = {
4012
4036
  auth: "user",
4013
4037
  responseKind: "json"
4014
4038
  },
4039
+ exportEventSeriesCsv: {
4040
+ path: "/sites/{siteId}/bookings/event-series/export.csv",
4041
+ method: "GET",
4042
+ tags: ["site-{siteId}", "bookings", "event-series-{siteId}"],
4043
+ errors: [],
4044
+ auth: "user",
4045
+ responseKind: "blob"
4046
+ },
4015
4047
  createEventSeries: {
4016
4048
  path: "/sites/{siteId}/bookings/event-series",
4017
4049
  method: "POST",
@@ -4080,6 +4112,60 @@ var ENDPOINT_DEFINITIONS = {
4080
4112
  errors: [],
4081
4113
  responseKind: "blob"
4082
4114
  },
4115
+ getParticipantMessageRecipients: {
4116
+ path: "/sites/{siteId}/bookings/participant-messaging/recipients",
4117
+ method: "POST",
4118
+ tags: ["site-{siteId}"],
4119
+ auth: "user",
4120
+ errors: [
4121
+ "validation:invalid_input",
4122
+ "auth:forbidden",
4123
+ "resource:not_found",
4124
+ "server:internal_error"
4125
+ ],
4126
+ responseKind: "json"
4127
+ },
4128
+ sendParticipantMessage: {
4129
+ path: "/sites/{siteId}/bookings/participant-messaging/send",
4130
+ method: "POST",
4131
+ tags: ["site-{siteId}"],
4132
+ auth: "user",
4133
+ errors: [
4134
+ "validation:invalid_input",
4135
+ "auth:forbidden",
4136
+ "resource:not_found",
4137
+ "resource:conflict",
4138
+ "server:internal_error"
4139
+ ],
4140
+ responseKind: "json"
4141
+ },
4142
+ testParticipantMessage: {
4143
+ path: "/sites/{siteId}/bookings/participant-messaging/test",
4144
+ method: "POST",
4145
+ tags: ["site-{siteId}"],
4146
+ auth: "user",
4147
+ errors: [
4148
+ "validation:invalid_input",
4149
+ "auth:forbidden",
4150
+ "resource:not_found",
4151
+ "resource:conflict",
4152
+ "server:internal_error"
4153
+ ],
4154
+ responseKind: "json"
4155
+ },
4156
+ listParticipantMessageHistory: {
4157
+ path: "/sites/{siteId}/bookings/participant-messaging/history",
4158
+ method: "POST",
4159
+ tags: ["site-{siteId}"],
4160
+ auth: "user",
4161
+ errors: [
4162
+ "validation:invalid_input",
4163
+ "auth:forbidden",
4164
+ "resource:not_found",
4165
+ "server:internal_error"
4166
+ ],
4167
+ responseKind: "json"
4168
+ },
4083
4169
  listEventSeriesWaitlist: {
4084
4170
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist",
4085
4171
  method: "GET",
@@ -4088,6 +4174,14 @@ var ENDPOINT_DEFINITIONS = {
4088
4174
  responseKind: "json",
4089
4175
  errors: []
4090
4176
  },
4177
+ exportEventSeriesWaitlistCsv: {
4178
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/waitlist/export.csv",
4179
+ method: "GET",
4180
+ tags: ["site-{siteId}", "bookings", "event-series-{seriesId}"],
4181
+ auth: "user",
4182
+ responseKind: "blob",
4183
+ errors: []
4184
+ },
4091
4185
  addEventOccurrenceAttendee: {
4092
4186
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/occurrences/{occurrenceId}/attendees",
4093
4187
  method: "POST",
@@ -4804,6 +4898,14 @@ var ENDPOINT_DEFINITIONS = {
4804
4898
  auth: "user",
4805
4899
  responseKind: "json"
4806
4900
  },
4901
+ exportSiteCustomerPassesCsv: {
4902
+ path: "/sites/{siteId}/bookings/customer-passes/export.csv",
4903
+ method: "GET",
4904
+ tags: ["site-{siteId}", "bookings", "customer-passes-{siteId}"],
4905
+ auth: "user",
4906
+ responseKind: "blob",
4907
+ errors: []
4908
+ },
4807
4909
  listSiteCustomerMemberships: {
4808
4910
  path: "/sites/{siteId}/bookings/customer-memberships",
4809
4911
  method: "GET",
@@ -4867,6 +4969,22 @@ var ENDPOINT_DEFINITIONS = {
4867
4969
  auth: "user",
4868
4970
  responseKind: "blob"
4869
4971
  },
4972
+ exportBookingLedgerCsv: {
4973
+ path: "/sites/{siteId}/bookings/ledger/export.csv",
4974
+ method: "GET",
4975
+ tags: ["site-{siteId}", "bookings", "booking-ledger-{siteId}"],
4976
+ errors: [],
4977
+ auth: "user",
4978
+ responseKind: "blob"
4979
+ },
4980
+ exportBookingQuestionAnswersCsv: {
4981
+ path: "/sites/{siteId}/bookings/intake-answers/export.csv",
4982
+ method: "GET",
4983
+ tags: ["site-{siteId}", "bookings", "intake-answers-{siteId}"],
4984
+ errors: [],
4985
+ auth: "user",
4986
+ responseKind: "blob"
4987
+ },
4870
4988
  // Site logs
4871
4989
  listSiteActivityLogs: {
4872
4990
  path: "/sites/{siteId}/logs/activity",
@@ -6463,7 +6581,7 @@ var SimpleCache = class {
6463
6581
  };
6464
6582
 
6465
6583
  // src/version.ts
6466
- var SDK_VERSION = "0.60.16";
6584
+ var SDK_VERSION = "0.62.2";
6467
6585
 
6468
6586
  // src/client/error.ts
6469
6587
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -7960,7 +8078,11 @@ function resolveRepeaterGridColumnFieldId(options) {
7960
8078
 
7961
8079
  // ../blocks/src/system/manifest/schema.ts
7962
8080
  var visibilityLevels = ["admin", "designer", "author"];
7963
- var siteOptionSources = ["eventCategories", "venues", "staffMembers"];
8081
+ var siteOptionSources = [
8082
+ "eventCategories",
8083
+ "venues",
8084
+ "staffMembers"
8085
+ ];
7964
8086
  var mediaDeliverySchema = z3.object({
7965
8087
  sizes: z3.string().optional(),
7966
8088
  widthCandidates: z3.array(z3.number().int().positive()).optional(),
@@ -7998,7 +8120,10 @@ var uiSchema = z3.object({
7998
8120
  hidden: z3.boolean().optional(),
7999
8121
  hideLabel: z3.boolean().optional(),
8000
8122
  hideDescription: z3.boolean().optional(),
8001
- showCharCount: z3.union([z3.number().int().positive(), z3.object({ max: z3.number().int().positive() })]).optional(),
8123
+ showCharCount: z3.union([
8124
+ z3.number().int().positive(),
8125
+ z3.object({ max: z3.number().int().positive() })
8126
+ ]).optional(),
8002
8127
  showSlugPreview: z3.boolean().optional(),
8003
8128
  variant: z3.enum(["full", "inline", "limited", "media", "notes"]).optional(),
8004
8129
  richTextVariant: z3.enum(["full", "inline", "limited", "media", "notes"]).optional(),
@@ -8008,10 +8133,7 @@ var uiSchema = z3.object({
8008
8133
  showMediaPreview: z3.boolean().optional(),
8009
8134
  showMediaOverlayActions: z3.boolean().optional(),
8010
8135
  mediaDelivery: mediaDeliverySchema.optional(),
8011
- mediaDeliveryByVariant: z3.record(
8012
- z3.string(),
8013
- mediaDeliverySchema
8014
- ).optional(),
8136
+ mediaDeliveryByVariant: z3.record(z3.string(), mediaDeliverySchema).optional(),
8015
8137
  // Optional input hints for validators/widgets
8016
8138
  inputType: z3.enum(["text", "email", "tel", "number"]).optional(),
8017
8139
  min: z3.number().optional(),
@@ -8119,7 +8241,9 @@ var richTextFieldSchema = baseFieldSchema.extend({
8119
8241
  });
8120
8242
  var mediaFieldSchema = baseFieldSchema.extend({
8121
8243
  type: z3.literal("media"),
8122
- mediaKinds: z3.array(z3.enum(["image", "video", "audio", "document", "spreadsheet", "archive"])).default(["image"]),
8244
+ mediaKinds: z3.array(
8245
+ z3.enum(["image", "video", "audio", "document", "spreadsheet", "archive"])
8246
+ ).default(["image"]),
8123
8247
  aspectRatio: z3.string().optional()
8124
8248
  });
8125
8249
  var booleanFieldSchema = baseFieldSchema.extend({
@@ -8241,7 +8365,9 @@ var referenceFieldSchema = baseFieldSchema.extend({
8241
8365
  var itemTypeSchema = z3.object({
8242
8366
  label: z3.string().min(1),
8243
8367
  icon: z3.string().optional(),
8244
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Item type requires at least one field"))
8368
+ fields: z3.lazy(
8369
+ () => getFieldSchemaInternal().array().min(1, "Item type requires at least one field")
8370
+ )
8245
8371
  });
8246
8372
  var repeaterFieldSchema = baseFieldSchema.extend({
8247
8373
  type: z3.literal("repeater"),
@@ -8251,7 +8377,9 @@ var repeaterFieldSchema = baseFieldSchema.extend({
8251
8377
  maxItems: z3.number().int().positive().optional(),
8252
8378
  // Monomorphic mode
8253
8379
  schema: z3.object({
8254
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Repeater requires at least one field"))
8380
+ fields: z3.lazy(
8381
+ () => getFieldSchemaInternal().array().min(1, "Repeater requires at least one field")
8382
+ )
8255
8383
  }).optional(),
8256
8384
  // Polymorphic mode
8257
8385
  polymorphic: z3.boolean().optional(),
@@ -8297,13 +8425,19 @@ var repeaterFieldSchema = baseFieldSchema.extend({
8297
8425
  const itemTypes = Object.values(
8298
8426
  data.itemTypes
8299
8427
  );
8300
- return itemTypes.every((itemType) => Array.isArray(itemType.fields) && requiredFieldIds.every((requiredId) => itemType.fields?.some((field) => field.id === requiredId)));
8428
+ return itemTypes.every(
8429
+ (itemType) => Array.isArray(itemType.fields) && requiredFieldIds.every(
8430
+ (requiredId) => itemType.fields?.some((field) => field.id === requiredId)
8431
+ )
8432
+ );
8301
8433
  }
8302
8434
  const schemaFields = data.schema?.fields;
8303
8435
  if (!schemaFields) {
8304
8436
  return true;
8305
8437
  }
8306
- return requiredFieldIds.every((requiredId) => schemaFields.some((field) => field.id === requiredId));
8438
+ return requiredFieldIds.every(
8439
+ (requiredId) => schemaFields.some((field) => field.id === requiredId)
8440
+ );
8307
8441
  },
8308
8442
  {
8309
8443
  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`,
@@ -8331,7 +8465,9 @@ var repeaterFieldSchema = baseFieldSchema.extend({
8331
8465
  if (!schemaFields) {
8332
8466
  return true;
8333
8467
  }
8334
- const field = schemaFields.find((candidate) => candidate.id === labelField);
8468
+ const field = schemaFields.find(
8469
+ (candidate) => candidate.id === labelField
8470
+ );
8335
8471
  return field?.type === "text";
8336
8472
  },
8337
8473
  {
@@ -8342,13 +8478,17 @@ var repeaterFieldSchema = baseFieldSchema.extend({
8342
8478
  var groupFieldSchema = baseFieldSchema.extend({
8343
8479
  type: z3.literal("group"),
8344
8480
  schema: z3.object({
8345
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Group requires at least one field"))
8481
+ fields: z3.lazy(
8482
+ () => getFieldSchemaInternal().array().min(1, "Group requires at least one field")
8483
+ )
8346
8484
  })
8347
8485
  });
8348
8486
  var modalFieldSchema = baseFieldSchema.extend({
8349
8487
  type: z3.literal("modal"),
8350
8488
  schema: z3.object({
8351
- fields: z3.lazy(() => getFieldSchemaInternal().array().min(1, "Modal requires at least one field"))
8489
+ fields: z3.lazy(
8490
+ () => getFieldSchemaInternal().array().min(1, "Modal requires at least one field")
8491
+ )
8352
8492
  })
8353
8493
  });
8354
8494
  var numberFieldSchema = baseFieldSchema.extend({
@@ -8455,31 +8595,35 @@ function expectParsedSelectField(field) {
8455
8595
  return field;
8456
8596
  }
8457
8597
  function createSiteOptionSelectField(input) {
8458
- return expectParsedSelectField(parseFieldDefinition({
8459
- ...input,
8460
- type: "select",
8461
- options: [],
8462
- multiple: input.multiple ?? false,
8463
- source: { kind: "site", optionSource: input.optionSource },
8464
- ui: {
8465
- ...input.ui ?? {},
8466
- widget: "siteOptionPicker",
8467
- siteOptionSource: input.optionSource
8468
- }
8469
- }));
8598
+ return expectParsedSelectField(
8599
+ parseFieldDefinition({
8600
+ ...input,
8601
+ type: "select",
8602
+ options: [],
8603
+ multiple: input.multiple ?? false,
8604
+ source: { kind: "site", optionSource: input.optionSource },
8605
+ ui: {
8606
+ ...input.ui ?? {},
8607
+ widget: "siteOptionPicker",
8608
+ siteOptionSource: input.optionSource
8609
+ }
8610
+ })
8611
+ );
8470
8612
  }
8471
8613
  function createSdkSelectField(input) {
8472
- return expectParsedSelectField(parseFieldDefinition({
8473
- ...input,
8474
- type: "select",
8475
- options: input.options,
8476
- multiple: input.multiple ?? false,
8477
- source: { kind: "sdk" },
8478
- ui: {
8479
- ...input.ui ?? {},
8480
- widget: "sdkSelect"
8481
- }
8482
- }));
8614
+ return expectParsedSelectField(
8615
+ parseFieldDefinition({
8616
+ ...input,
8617
+ type: "select",
8618
+ options: input.options,
8619
+ multiple: input.multiple ?? false,
8620
+ source: { kind: "sdk" },
8621
+ ui: {
8622
+ ...input.ui ?? {},
8623
+ widget: "sdkSelect"
8624
+ }
8625
+ })
8626
+ );
8483
8627
  }
8484
8628
  var slotSchema = z3.object({
8485
8629
  id: z3.string().min(1),
@@ -8490,8 +8634,20 @@ var slotSchema = z3.object({
8490
8634
  help: z3.string().optional(),
8491
8635
  visibleRoles: z3.array(z3.enum(visibilityLevels)).optional()
8492
8636
  });
8493
- var typographyTokens = ["display", "heading", "subheading", "body", "caption"];
8494
- var colorTokens = ["background", "surface", "foreground", "accent", "muted"];
8637
+ var typographyTokens = [
8638
+ "display",
8639
+ "heading",
8640
+ "subheading",
8641
+ "body",
8642
+ "caption"
8643
+ ];
8644
+ var colorTokens = [
8645
+ "background",
8646
+ "surface",
8647
+ "foreground",
8648
+ "accent",
8649
+ "muted"
8650
+ ];
8495
8651
  var spacingTokens = ["none", "xs", "sm", "md", "lg", "xl"];
8496
8652
  var radiusTokens = ["none", "sm", "md", "lg", "full"];
8497
8653
  var styleTokenSchema = z3.object({
@@ -8511,7 +8667,14 @@ var behaviourSchema = z3.object({
8511
8667
  // Block manages its own wrapper (for sticky/fixed positioning)
8512
8668
  managesOwnWrapper: z3.boolean().optional()
8513
8669
  });
8514
- var blockCategoryEnum = z3.enum(["marketing", "content", "blog", "media", "layout", "interactive"]);
8670
+ var blockCategoryEnum = z3.enum([
8671
+ "marketing",
8672
+ "content",
8673
+ "blog",
8674
+ "media",
8675
+ "layout",
8676
+ "interactive"
8677
+ ]);
8515
8678
  var manifestSchema = z3.object({
8516
8679
  name: z3.string().min(1),
8517
8680
  version: z3.string().min(1),
@@ -9103,6 +9266,20 @@ var applyAppointmentSetupRequestSchema = z6.object({
9103
9266
  bookingNotice: appointmentSetupBookingNoticeSchema
9104
9267
  });
9105
9268
 
9269
+ // ../api/src/bookingRecords.ts
9270
+ var BOOKING_QUESTION_ANSWER_EXPORT_SCOPES = {
9271
+ site: "site",
9272
+ appointments: "appointments",
9273
+ eventSeries: "event_series",
9274
+ course: "course"
9275
+ };
9276
+ var BOOKING_QUESTION_ANSWER_EXPORT_SCOPE_VALUES = [
9277
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.site,
9278
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.appointments,
9279
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.eventSeries,
9280
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.course
9281
+ ];
9282
+
9106
9283
  // ../api/src/common/cancellation.ts
9107
9284
  var STAFF_CANCELLATION_CONTEXT_UI_CATEGORIES = [
9108
9285
  "customer_requested",
@@ -9394,6 +9571,24 @@ function registerManifest(manifest) {
9394
9571
  return manifest;
9395
9572
  }
9396
9573
 
9574
+ // ../theme-core/src/site-styles/appearancePresetResolution.ts
9575
+ function assertValidOptionGroups(preset2) {
9576
+ preset2.optionGroups?.forEach((group) => {
9577
+ const selectedOption = group.options.find(
9578
+ (option) => option.id === group.selectedOptionId
9579
+ );
9580
+ if (!selectedOption) {
9581
+ throw new Error(
9582
+ `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
9583
+ );
9584
+ }
9585
+ });
9586
+ }
9587
+ function defineBlockAppearancePreset(preset2) {
9588
+ assertValidOptionGroups(preset2);
9589
+ return preset2;
9590
+ }
9591
+
9397
9592
  // ../theme-core/src/site-styles/types.ts
9398
9593
  function asDesignBlockId(value) {
9399
9594
  return brandNonEmptyString(value, "DesignBlockId");
@@ -9475,6 +9670,11 @@ function flushPanelFrame(options) {
9475
9670
  function defineFrameCapability(capability) {
9476
9671
  return capability;
9477
9672
  }
9673
+ var tileTreatmentValues = [
9674
+ "default",
9675
+ "quiet",
9676
+ "brand-depth"
9677
+ ];
9478
9678
  var eyebrowTreatmentValues = [
9479
9679
  "plain",
9480
9680
  "pill",
@@ -9490,31 +9690,13 @@ function defineBlockDesignCapability(capability) {
9490
9690
  imageSurfaceTreatments: capability.imageSurfaceTreatments ?? ["none"],
9491
9691
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
9492
9692
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
9693
+ tileTreatments: capability.tileTreatments ?? ["default"],
9493
9694
  eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"]
9494
9695
  };
9495
9696
  }
9496
9697
 
9497
- // ../theme-core/src/site-styles/appearancePresets.ts
9498
- function assertValidOptionGroups(preset2) {
9499
- preset2.optionGroups?.forEach((group) => {
9500
- const selectedOption = group.options.find(
9501
- (option) => option.id === group.selectedOptionId
9502
- );
9503
- if (!selectedOption) {
9504
- throw new Error(
9505
- `Appearance preset "${preset2.id}" option group "${group.id}" selects missing option "${group.selectedOptionId}".`
9506
- );
9507
- }
9508
- });
9509
- }
9510
- function defineBlockAppearancePreset(preset2) {
9511
- assertValidOptionGroups(preset2);
9512
- return preset2;
9513
- }
9514
- function defineSiteChromeAppearancePreset(preset2) {
9515
- return preset2;
9516
- }
9517
- var appearancePresets = [
9698
+ // ../theme-core/src/site-styles/blockAppearancePresets.ts
9699
+ var blockAppearancePresets = [
9518
9700
  defineBlockAppearancePreset({
9519
9701
  kind: "block-design",
9520
9702
  id: "hero-immersive-image",
@@ -9640,6 +9822,24 @@ var appearancePresets = [
9640
9822
  eyebrowTreatment: "accent-pill-bounce"
9641
9823
  }
9642
9824
  }),
9825
+ defineBlockAppearancePreset({
9826
+ kind: "block-design",
9827
+ id: "hero-brand-depth-expressive",
9828
+ target: "hero",
9829
+ label: "Expressive brand-depth hero",
9830
+ blockKinds: ["block.hero"],
9831
+ constraints: {
9832
+ layoutFamilies: ["centered", "compact"]
9833
+ },
9834
+ design: {
9835
+ sectionSurface: "brand-depth-band",
9836
+ contentFrame: plainFrame,
9837
+ itemSurface: "none",
9838
+ transitionAfter: "soft-fade-short",
9839
+ emphasis: "high",
9840
+ eyebrowTreatment: "accent-pill-bounce"
9841
+ }
9842
+ }),
9643
9843
  defineBlockAppearancePreset({
9644
9844
  kind: "block-design",
9645
9845
  id: "hero-contained-intro",
@@ -9668,6 +9868,20 @@ var appearancePresets = [
9668
9868
  emphasis: "high"
9669
9869
  }
9670
9870
  }),
9871
+ defineBlockAppearancePreset({
9872
+ kind: "block-design",
9873
+ id: "body-text-brand-depth-intro",
9874
+ target: "body-text",
9875
+ label: "Brand-depth intro copy",
9876
+ blockKinds: ["block.body-text"],
9877
+ design: {
9878
+ sectionSurface: "brand-depth-band",
9879
+ contentFrame: plainFrame,
9880
+ itemSurface: "none",
9881
+ transitionAfter: "soft-fade-short",
9882
+ emphasis: "high"
9883
+ }
9884
+ }),
9671
9885
  defineBlockAppearancePreset({
9672
9886
  kind: "block-design",
9673
9887
  id: "offerings-calm-list",
@@ -9710,6 +9924,21 @@ var appearancePresets = [
9710
9924
  emphasis: "medium"
9711
9925
  }
9712
9926
  }),
9927
+ defineBlockAppearancePreset({
9928
+ kind: "block-design",
9929
+ id: "schedule-details-brand-depth",
9930
+ target: "events",
9931
+ label: "Brand-depth schedule details",
9932
+ blockKinds: ["block.event-details", "block.course-details"],
9933
+ design: {
9934
+ sectionSurface: "brand-depth-band",
9935
+ contentFrame: plainFrame,
9936
+ itemSurface: "none",
9937
+ transitionAfter: "none",
9938
+ emphasis: "medium",
9939
+ tileTreatment: "brand-depth"
9940
+ }
9941
+ }),
9713
9942
  defineBlockAppearancePreset({
9714
9943
  kind: "block-design",
9715
9944
  id: "media-text-flush-feature",
@@ -9795,6 +10024,20 @@ var appearancePresets = [
9795
10024
  testimonialCardTreatment: "accent-quote"
9796
10025
  }
9797
10026
  }),
10027
+ defineBlockAppearancePreset({
10028
+ kind: "block-design",
10029
+ id: "faq-base-accordion",
10030
+ target: "faq",
10031
+ label: "Base accordion FAQ",
10032
+ blockKinds: ["block.faq"],
10033
+ design: {
10034
+ sectionSurface: "base",
10035
+ contentFrame: plainFrame,
10036
+ itemSurface: "default",
10037
+ transitionAfter: "none",
10038
+ emphasis: "medium"
10039
+ }
10040
+ }),
9798
10041
  defineBlockAppearancePreset({
9799
10042
  kind: "block-design",
9800
10043
  id: "faq-contained-help",
@@ -9837,6 +10080,20 @@ var appearancePresets = [
9837
10080
  emphasis: "high"
9838
10081
  }
9839
10082
  }),
10083
+ defineBlockAppearancePreset({
10084
+ kind: "block-design",
10085
+ id: "contact-form-brand-depth-card",
10086
+ target: "contact-form",
10087
+ label: "Brand-depth form card",
10088
+ blockKinds: ["block.form"],
10089
+ design: {
10090
+ sectionSurface: "brand-depth-band",
10091
+ contentFrame: panelFrame("raised"),
10092
+ itemSurface: "none",
10093
+ transitionAfter: "none",
10094
+ emphasis: "high"
10095
+ }
10096
+ }),
9840
10097
  defineBlockAppearancePreset({
9841
10098
  kind: "block-design",
9842
10099
  id: "cta-accent-band",
@@ -9850,7 +10107,14 @@ var appearancePresets = [
9850
10107
  transitionAfter: "none",
9851
10108
  emphasis: "high"
9852
10109
  }
9853
- }),
10110
+ })
10111
+ ];
10112
+
10113
+ // ../theme-core/src/site-styles/siteChromeAppearancePresets.ts
10114
+ function defineSiteChromeAppearancePreset(preset2) {
10115
+ return preset2;
10116
+ }
10117
+ var siteChromeAppearancePresets = [
9854
10118
  defineSiteChromeAppearancePreset({
9855
10119
  kind: "site-chrome",
9856
10120
  id: "header-clean-base",
@@ -9918,6 +10182,12 @@ var appearancePresets = [
9918
10182
  })
9919
10183
  ];
9920
10184
 
10185
+ // ../theme-core/src/site-styles/appearancePresetCatalog.ts
10186
+ var appearancePresets = [
10187
+ ...blockAppearancePresets,
10188
+ ...siteChromeAppearancePresets
10189
+ ];
10190
+
9921
10191
  // ../theme-core/src/site-styles/blockFlow.ts
9922
10192
  function defineBlockDesignMetadata(input) {
9923
10193
  const layoutProfiles = (input.layoutProfiles ?? []).map((profile) => ({
@@ -11392,6 +11662,7 @@ var sectionStylesOverrideSchema = z22.object({
11392
11662
  background: boxBackgroundSchema.nullable().optional(),
11393
11663
  spacing: semanticSpacingSchema.nullable().optional(),
11394
11664
  minHeight: z22.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
11665
+ tileTreatment: z22.enum(tileTreatmentValues).nullable().optional(),
11395
11666
  eyebrowTreatment: z22.enum(eyebrowTreatmentValues).nullable().optional()
11396
11667
  });
11397
11668
  var containerStylesOverrideSchema = z22.object({
@@ -12185,7 +12456,7 @@ var userContentFrames = [
12185
12456
  ];
12186
12457
  var generatedDesignOptionCatalog = {
12187
12458
  source: "generated",
12188
- sectionSurfaces: ["base", "muted-band", "accent-band", "hero-image"],
12459
+ sectionSurfaces: ["base", "muted-band", "accent-band", "brand-depth-band", "hero-image"],
12189
12460
  contentFrames: generatedContentFrames,
12190
12461
  itemSurfaces: ["none", "default", "flat", "outlined", "raised"],
12191
12462
  transitions: ["none", "soft-fade-short", "soft-fade-long"],
@@ -12255,6 +12526,43 @@ var expressiveBudget = {
12255
12526
  mediaDensity: "high",
12256
12527
  decorativeRepetition: "medium"
12257
12528
  };
12529
+ var expressiveUnderlineInputs = {
12530
+ base: {
12531
+ background: { type: "transparent" },
12532
+ textColorToken: "text",
12533
+ border: {
12534
+ widthClass: "border-2",
12535
+ colorToken: "border",
12536
+ style: "underline"
12537
+ },
12538
+ corners: "square",
12539
+ shadow: null,
12540
+ spacing: "compact",
12541
+ fontSize: "base"
12542
+ },
12543
+ label: {
12544
+ textColorToken: "primary",
12545
+ fontWeight: "black",
12546
+ fontSize: "xs",
12547
+ textTransform: "uppercase",
12548
+ letterSpacing: "widest",
12549
+ opacity: 1
12550
+ },
12551
+ focus: {
12552
+ ringColorToken: "secondary",
12553
+ ringWidth: "0",
12554
+ borderColorToken: "secondary"
12555
+ },
12556
+ error: {
12557
+ borderColorToken: "destructive",
12558
+ textColorToken: "destructive"
12559
+ },
12560
+ disabled: {
12561
+ backgroundColorToken: "surface",
12562
+ textColorToken: "text",
12563
+ opacity: 0.6
12564
+ }
12565
+ };
12258
12566
  function uniqueContentFrameKinds() {
12259
12567
  const kinds = [...new Set(
12260
12568
  generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
@@ -12605,15 +12913,17 @@ var curatedSiteStyles = [
12605
12913
  paragraphSize: "editorial",
12606
12914
  headingSize: "editorial"
12607
12915
  }
12608
- }
12916
+ },
12917
+ inputs: expressiveUnderlineInputs
12609
12918
  },
12610
12919
  recommendedAppearancePresetIds: [
12611
12920
  "site-header-brand-solid-inverted-cta",
12612
12921
  "site-footer-brand-two-band",
12613
12922
  "hero-brand-scrim-fixed-frame",
12614
12923
  "body-text-editorial-intro",
12924
+ "schedule-details-brand-depth",
12615
12925
  "testimonials-accent-quote-proof",
12616
- "contact-form-dark-card"
12926
+ "contact-form-brand-depth-card"
12617
12927
  ],
12618
12928
  buttonPersonalityChoices: [
12619
12929
  buttonChoice("showtime-pill"),
@@ -12747,6 +13057,7 @@ var imageSurfaceTreatmentSchema = z24.discriminatedUnion("kind", [
12747
13057
  }).strict()
12748
13058
  ]);
12749
13059
  var testimonialCardTreatmentSchema = z24.enum(["default", "accent-quote"]);
13060
+ var tileTreatmentSchema = z24.enum(tileTreatmentValues);
12750
13061
  var eyebrowTreatmentSchema = z24.enum(eyebrowTreatmentValues);
12751
13062
  function uniqueNonEmpty(values) {
12752
13063
  const uniqueValues = [...new Set(values)];
@@ -12791,6 +13102,7 @@ var blockDesignPlanSchema = z24.object({
12791
13102
  imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
12792
13103
  imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
12793
13104
  testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
13105
+ tileTreatment: tileTreatmentSchema.optional(),
12794
13106
  eyebrowTreatment: eyebrowTreatmentSchema.optional()
12795
13107
  }).strict();
12796
13108
  var styleAuthoritySchema = z24.discriminatedUnion("kind", [
@@ -12854,6 +13166,14 @@ var defaultDesignRuntimeRules = defineDesignRuntimeRules({
12854
13166
  headingColor: "primaryForeground"
12855
13167
  }
12856
13168
  },
13169
+ "brand-depth-band": {
13170
+ background: {
13171
+ type: "color",
13172
+ color: "primary-800",
13173
+ textColor: "primaryForeground",
13174
+ headingColor: "primaryForeground"
13175
+ }
13176
+ },
12857
13177
  "hero-image": {
12858
13178
  background: {
12859
13179
  type: "image",
@@ -14743,6 +15063,21 @@ function createTransformRegistry(definitions) {
14743
15063
  }
14744
15064
 
14745
15065
  // ../blocks/src/system/transforms/registry/_utils/colorResolution.ts
15066
+ var CSS_COLOR_FUNCTION_PATTERN = /^(?:rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch|color|color-mix|light-dark)\(/i;
15067
+ var CSS_HEX_COLOR_PATTERN = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
15068
+ var THEME_COLOR_TOKEN_PATTERN = /^[a-zA-Z][a-zA-Z0-9]*(?:-[a-zA-Z0-9]+)*(?:\/(?:100|[1-9]?\d|0))?$/;
15069
+ var CSS_COLOR_KEYWORDS = /* @__PURE__ */ new Set([
15070
+ "transparent",
15071
+ "currentColor",
15072
+ "inherit",
15073
+ "initial",
15074
+ "revert",
15075
+ "revert-layer",
15076
+ "unset"
15077
+ ]);
15078
+ function isLiteralCssColorValue(value) {
15079
+ return CSS_HEX_COLOR_PATTERN.test(value) || CSS_COLOR_FUNCTION_PATTERN.test(value) || value.startsWith("var(") || CSS_COLOR_KEYWORDS.has(value);
15080
+ }
14746
15081
  function resolveBackgroundColorValue(tokenOrCssValue, context) {
14747
15082
  const trimmed = tokenOrCssValue.trim();
14748
15083
  if (!trimmed) return "";
@@ -14759,8 +15094,11 @@ function resolveBackgroundColorValue(tokenOrCssValue, context) {
14759
15094
  return rgbColorValue(trimmed);
14760
15095
  }
14761
15096
  }
14762
- if (trimmed === "transparent") {
14763
- return "transparent";
15097
+ if (isLiteralCssColorValue(trimmed)) {
15098
+ return trimmed;
15099
+ }
15100
+ if (THEME_COLOR_TOKEN_PATTERN.test(trimmed)) {
15101
+ return rgbColorValue(trimmed);
14764
15102
  }
14765
15103
  return trimmed;
14766
15104
  }
@@ -15016,6 +15354,15 @@ function hasFixedFrameBackgroundMotion(value) {
15016
15354
  const background = asPartialObject(input?.background);
15017
15355
  return background?.motion === "fixed-frame";
15018
15356
  }
15357
+ var tileTreatmentClassMap = {
15358
+ default: "",
15359
+ quiet: "rb-tile-treatment-quiet",
15360
+ "brand-depth": "rb-tile-treatment-brand-depth"
15361
+ };
15362
+ var tileTreatmentSet = new Set(tileTreatmentValues);
15363
+ function isTileTreatment(value) {
15364
+ return typeof value === "string" && tileTreatmentSet.has(value);
15365
+ }
15019
15366
  var sectionClassNameTransform = {
15020
15367
  id: "sectionStyles.resolveClassName",
15021
15368
  kind: "string",
@@ -15072,6 +15419,17 @@ var sectionClassNameTransform = {
15072
15419
  classes.push(minHeightClass);
15073
15420
  }
15074
15421
  }
15422
+ const tileTreatment = input?.tileTreatment;
15423
+ if (isTileTreatment(tileTreatment)) {
15424
+ const tileTreatmentClass = tileTreatmentClassMap[tileTreatment];
15425
+ if (tileTreatmentClass) {
15426
+ classes.push(tileTreatmentClass);
15427
+ }
15428
+ } else if (typeof tileTreatment === "string" && process.env.NODE_ENV !== "production") {
15429
+ console.warn(
15430
+ `[sectionStyles] Invalid tileTreatment value in _sectionStyles: "${tileTreatment}". Expected one of: ${tileTreatmentValues.join(", ")}.`
15431
+ );
15432
+ }
15075
15433
  if (hasFixedFrameBackgroundMotion(input)) {
15076
15434
  classes.push(fixedFrameScopeClass);
15077
15435
  }
@@ -17946,6 +18304,9 @@ function createBlockManifest(config) {
17946
18304
  };
17947
18305
  return augmentManifest(manifest);
17948
18306
  }
18307
+ function createBlockManifestWithContentShape(config, _contentShape) {
18308
+ return createBlockManifest(config);
18309
+ }
17949
18310
  function normalizeBlockLayout(layout) {
17950
18311
  return Array.isArray(layout) ? [...layout] : layout;
17951
18312
  }
@@ -18578,7 +18939,7 @@ var ctaComposition = composeFragments([
18578
18939
  { fragment: ctaCopyFragment },
18579
18940
  { fragment: ctaRowFragment }
18580
18941
  ]);
18581
- var ctaFullManifest = createBlockManifest({
18942
+ var ctaFullConfig = {
18582
18943
  id: "block.cta-full",
18583
18944
  title: "Full-width CTA",
18584
18945
  category: "marketing",
@@ -18596,7 +18957,8 @@ var ctaFullManifest = createBlockManifest({
18596
18957
  description: "Centered call to action with optional background image.",
18597
18958
  tags: ["cta", "call-to-action", "button", "conversion", "action", "sign-up", "get-started"],
18598
18959
  icon: "Target"
18599
- });
18960
+ };
18961
+ var ctaFullManifest = createBlockManifest(ctaFullConfig);
18600
18962
  var ctaFullBlockDefinition = {
18601
18963
  manifest: ctaFullManifest
18602
18964
  };
@@ -21680,9 +22042,9 @@ var mediaTextManifest = createBlockManifest({
21680
22042
  {
21681
22043
  id: "images",
21682
22044
  type: "repeater",
21683
- label: "Images",
22045
+ label: "Media",
21684
22046
  required: false,
21685
- itemLabel: "Image",
22047
+ itemLabel: "Media",
21686
22048
  minItems: 0,
21687
22049
  maxItems: 6,
21688
22050
  allowConversion: true,
@@ -21696,9 +22058,9 @@ var mediaTextManifest = createBlockManifest({
21696
22058
  {
21697
22059
  id: "image",
21698
22060
  type: "media",
21699
- label: "Image",
22061
+ label: "Media",
21700
22062
  required: true,
21701
- mediaKinds: ["image"]
22063
+ mediaKinds: ["image", "video"]
21702
22064
  }
21703
22065
  ]
21704
22066
  }
@@ -21776,8 +22138,8 @@ var mediaTextManifest = createBlockManifest({
21776
22138
  {
21777
22139
  id: "aspectRatio",
21778
22140
  type: "select",
21779
- label: "Image aspect ratio",
21780
- description: "Crop image to a consistent aspect ratio.",
22141
+ label: "Media aspect ratio",
22142
+ description: "Crop media to a consistent aspect ratio.",
21781
22143
  required: false,
21782
22144
  defaultValue: "auto",
21783
22145
  multiple: false,
@@ -21964,8 +22326,8 @@ var mediaTextManifest = createBlockManifest({
21964
22326
  }
21965
22327
  };
21966
22328
  })(),
21967
- description: "Two columns: image/carousel + rich text (with optional section title).",
21968
- tags: ["media", "image", "carousel", "text", "two-column", "layout"],
22329
+ description: "Two columns: media/carousel + rich text (with optional section title).",
22330
+ tags: ["media", "image", "video", "carousel", "text", "two-column", "layout"],
21969
22331
  icon: "Columns"
21970
22332
  });
21971
22333
  var mediaTextBlockDefinition = {
@@ -22116,6 +22478,19 @@ var transformSchema2 = z39.object({
22116
22478
  hotspot: hotspotSchema2.optional(),
22117
22479
  rotation: rotationSchema2.optional()
22118
22480
  });
22481
+ var mediaPosterSchema = z39.discriminatedUnion("tag", [
22482
+ z39.object({
22483
+ tag: z39.literal("storage"),
22484
+ assetId: z39.string().optional(),
22485
+ storageBucket: z39.string().min(1),
22486
+ storagePath: z39.string().min(1)
22487
+ }),
22488
+ z39.object({
22489
+ tag: z39.literal("external-src"),
22490
+ assetId: z39.string().optional(),
22491
+ src: z39.string().url()
22492
+ })
22493
+ ]);
22119
22494
  var mediaBaseSchema = z39.object({
22120
22495
  purpose: z39.string().optional(),
22121
22496
  placeholder: z39.boolean().default(true).optional(),
@@ -22129,6 +22504,7 @@ var mediaBaseSchema = z39.object({
22129
22504
  height: z39.number().optional(),
22130
22505
  storageBucket: z39.string().optional(),
22131
22506
  storagePath: z39.string().optional(),
22507
+ poster: mediaPosterSchema.optional(),
22132
22508
  transform: transformSchema2.optional()
22133
22509
  });
22134
22510
  var imageMediaSchema = mediaBaseSchema.extend({ type: z39.literal("image") });
@@ -22612,10 +22988,28 @@ import { z as z45 } from "zod";
22612
22988
 
22613
22989
  // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
22614
22990
  import { z as z44 } from "zod";
22991
+
22992
+ // ../blocks/src/system/constants/events.ts
22993
+ var eventCalendarDisplayModeValues = ["combined", "month", "week", "list", "timetable"];
22994
+ var eventCalendarListLayoutValues = ["stack", "grid", "compact"];
22995
+ var eventCalendarListLayoutOptions = [
22996
+ { id: "stack", label: "Stack" },
22997
+ { id: "grid", label: "Grid" },
22998
+ { id: "compact", label: "Compact" }
22999
+ ];
23000
+ function isEventCalendarDisplayMode(value) {
23001
+ return typeof value === "string" && eventCalendarDisplayModeValues.includes(value);
23002
+ }
23003
+ function isEventCalendarListLayout(value) {
23004
+ return typeof value === "string" && eventCalendarListLayoutValues.includes(value);
23005
+ }
23006
+
23007
+ // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
22615
23008
  var previewStageSchema = z44.enum(["preview", "published"]);
22616
23009
  var registrationButtonVariantSchema = z44.enum(["primary", "secondary", "outline"]);
22617
23010
  var eventButtonVariantSchema = z44.enum(["primary", "secondary", "outline", "link"]);
22618
- var eventLayoutSchema = z44.enum(["grid", "stack", "compact"]);
23011
+ var eventLayoutSchema = z44.enum(eventCalendarListLayoutValues);
23012
+ var eventCalendarDisplayModeSchema = z44.enum(eventCalendarDisplayModeValues);
22619
23013
  var columnOptionSchema = z44.enum(["2", "3", "4"]);
22620
23014
  var weekStartSchema = z44.enum(["sunday", "monday"]);
22621
23015
  var filterAutoShowSchema = z44.enum(["auto", "always", "never"]);
@@ -23997,7 +24391,232 @@ var eventListingInteractiveIslandPropsCodec = createInteractiveIslandCodec({
23997
24391
  });
23998
24392
 
23999
24393
  // ../blocks/src/system/blocks/events/event-listing.ts
24000
- var eventListingManifest = createBlockManifest({
24394
+ var eventListingAdditionalFields = [
24395
+ ...sectionHeaderFields("All Events"),
24396
+ ...(() => {
24397
+ const columns = columnsField(["2", "3", "4"]);
24398
+ return [
24399
+ {
24400
+ ...layoutField,
24401
+ ui: { ...layoutField.ui ?? {}, intent: "display" }
24402
+ },
24403
+ {
24404
+ ...columns,
24405
+ ui: { ...columns.ui ?? {}, intent: "display" }
24406
+ }
24407
+ ];
24408
+ })(),
24409
+ {
24410
+ id: "eventsPerPage",
24411
+ type: "select",
24412
+ label: "Events per page",
24413
+ description: "Number of events to load at a time",
24414
+ required: false,
24415
+ multiple: false,
24416
+ defaultValue: "12",
24417
+ options: [
24418
+ { value: "3", label: "3 events" },
24419
+ { value: "6", label: "6 events" },
24420
+ { value: "12", label: "12 events" },
24421
+ { value: "24", label: "24 events" }
24422
+ ],
24423
+ ui: { intent: "display" }
24424
+ },
24425
+ {
24426
+ id: "paginationMode",
24427
+ type: "select",
24428
+ label: "More events",
24429
+ description: "How to access events beyond the initial list",
24430
+ required: false,
24431
+ multiple: false,
24432
+ defaultValue: "loadMore",
24433
+ options: [
24434
+ { value: "loadMore", label: "Load more button" },
24435
+ { value: "seeAllLink", label: "Link to another page" }
24436
+ ],
24437
+ ui: { intent: "display" }
24438
+ },
24439
+ {
24440
+ id: "seeAllUrl",
24441
+ type: "link",
24442
+ label: "See all destination",
24443
+ required: false,
24444
+ ui: {
24445
+ intent: "display",
24446
+ visibleWhen: {
24447
+ field: "paginationMode",
24448
+ equals: "seeAllLink"
24449
+ }
24450
+ }
24451
+ },
24452
+ {
24453
+ id: "loadMoreText",
24454
+ type: "text",
24455
+ label: "Button text",
24456
+ description: "Text for the pagination button or link",
24457
+ required: false,
24458
+ multiline: false,
24459
+ defaultValue: "Load more events",
24460
+ maxLength: 40
24461
+ },
24462
+ ...cardStylingFields.map((field) => ({
24463
+ ...field,
24464
+ ui: { ...field.ui ?? {}, intent: "style" }
24465
+ })),
24466
+ ...eventDisplayFields.map((field) => ({
24467
+ ...field,
24468
+ ui: { ...field.ui ?? {}, intent: "display" }
24469
+ })),
24470
+ {
24471
+ id: "kind",
24472
+ type: "select",
24473
+ label: "Show",
24474
+ description: "Choose whether this list shows courses, events, or both",
24475
+ required: false,
24476
+ multiple: false,
24477
+ defaultValue: "all",
24478
+ options: [
24479
+ { value: "all", label: "Courses and events" },
24480
+ { value: "courses", label: "Courses only" },
24481
+ { value: "events", label: "Events only" }
24482
+ ],
24483
+ ui: { intent: "behavior" }
24484
+ },
24485
+ {
24486
+ id: "eventSurface",
24487
+ type: "select",
24488
+ label: "Event surface",
24489
+ description: "Choose a semantic event scope",
24490
+ required: false,
24491
+ multiple: false,
24492
+ defaultValue: "all",
24493
+ options: [
24494
+ { value: "all", label: "All events" },
24495
+ { value: "regularClassSchedule", label: "Regular class schedule" },
24496
+ { value: "specialDatedEvents", label: "Workshops and special events" },
24497
+ { value: "custom", label: "Custom" }
24498
+ ],
24499
+ ui: { intent: "behavior" }
24500
+ },
24501
+ {
24502
+ id: "filterEventPresets",
24503
+ type: "select",
24504
+ label: "Pre-filter by event type",
24505
+ description: "Restrict this block to specific event types",
24506
+ required: false,
24507
+ multiple: true,
24508
+ defaultValue: [],
24509
+ options: [
24510
+ { value: "class", label: "Classes" },
24511
+ { value: "workshop", label: "Workshops" },
24512
+ { value: "retreat", label: "Retreats" },
24513
+ { value: "performance", label: "Performances" }
24514
+ ],
24515
+ ui: {
24516
+ intent: "behavior",
24517
+ visibleWhen: { field: "eventSurface", equals: "custom" }
24518
+ }
24519
+ },
24520
+ {
24521
+ id: "scheduleScope",
24522
+ type: "select",
24523
+ label: "Schedule cadence",
24524
+ description: "Restrict this block by recurrence",
24525
+ required: false,
24526
+ multiple: false,
24527
+ defaultValue: "any",
24528
+ options: [
24529
+ { value: "any", label: "Any cadence" },
24530
+ { value: "recurring", label: "Recurring only" },
24531
+ { value: "oneOff", label: "One-off only" }
24532
+ ],
24533
+ ui: {
24534
+ intent: "behavior",
24535
+ visibleWhen: { field: "eventSurface", equals: "custom" }
24536
+ }
24537
+ },
24538
+ {
24539
+ ...emptyStateField,
24540
+ ui: { ...emptyStateField.ui ?? {}, intent: "display" }
24541
+ },
24542
+ sectionStylesField({
24543
+ id: "_sectionStyles",
24544
+ label: "Section styles",
24545
+ renderInHeader: false
24546
+ })
24547
+ ];
24548
+ var eventListingLayout = [
24549
+ styledSection({
24550
+ children: sectionContainer([
24551
+ // Optional heading
24552
+ text(
24553
+ { as: "h2" },
24554
+ bind("content.heading"),
24555
+ when("content.heading")
24556
+ ),
24557
+ // Optional description
24558
+ richText(
24559
+ { className: "rb-prose rb-max-w-none" },
24560
+ bind("content.description"),
24561
+ when("content.description")
24562
+ ),
24563
+ // Event listing component with pagination
24564
+ el("event-listing", withApiBindings({
24565
+ events: { $bind: { from: "data.events" } },
24566
+ stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
24567
+ layout: { $bind: { from: "content.layout", fallback: "grid" } },
24568
+ columns: { $bind: { from: "content.columns", fallback: "3" } },
24569
+ eventsPerPage: { $bind: { from: "content.eventsPerPage", fallback: "12" } },
24570
+ paginationMode: { $bind: { from: "content.paginationMode", fallback: "loadMore" } },
24571
+ seeAllUrl: { $bind: { from: "content.seeAllUrl", transforms: [{ id: "links.resolve" }] } },
24572
+ loadMoreText: { $bind: { from: "content.loadMoreText", fallback: "Load more events" } },
24573
+ cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
24574
+ buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
24575
+ buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
24576
+ showVenue: { $bind: { from: "content.showVenue" } },
24577
+ showMap: { $bind: { from: "content.showMap" } },
24578
+ showCapacity: { $bind: { from: "content.showCapacity" } },
24579
+ eventKind: { $bind: { from: "content.kind", fallback: "all" } },
24580
+ eventSurface: { $bind: { from: "content.eventSurface", fallback: "all" } },
24581
+ filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
24582
+ scheduleScope: { $bind: { from: "content.scheduleScope", fallback: "any" } },
24583
+ emptyMessage: { $bind: { from: "content.emptyMessage" } }
24584
+ }))
24585
+ ], {
24586
+ gap: "lg"
24587
+ }),
24588
+ // sectionContainer (rb-container) already provides horizontal padding
24589
+ baseClass: "",
24590
+ spacing: "comfortable"
24591
+ })
24592
+ ];
24593
+ var eventListingDerivedFields = [
24594
+ {
24595
+ id: "layout",
24596
+ type: "select",
24597
+ required: false,
24598
+ multiple: false,
24599
+ options: [
24600
+ { value: "grid" },
24601
+ { value: "stack" }
24602
+ ]
24603
+ },
24604
+ {
24605
+ id: "paginationMode",
24606
+ type: "select",
24607
+ required: false,
24608
+ multiple: false,
24609
+ options: [
24610
+ { value: "loadMore" },
24611
+ { value: "seeAllLink" }
24612
+ ]
24613
+ }
24614
+ ];
24615
+ var eventListingContentShape = {
24616
+ additionalFields: eventListingDerivedFields,
24617
+ skipSectionStyles: true
24618
+ };
24619
+ var eventListingConfig = {
24001
24620
  id: "block.event-listing",
24002
24621
  version: "1.1.0",
24003
24622
  title: "Event Listing",
@@ -24005,211 +24624,18 @@ var eventListingManifest = createBlockManifest({
24005
24624
  description: "Paginated list of all upcoming events",
24006
24625
  // Preserve legacy section styles field configuration (renderInHeader: false).
24007
24626
  skipSectionStyles: true,
24008
- additionalFields: [
24009
- ...sectionHeaderFields("All Events"),
24010
- ...(() => {
24011
- const columns = columnsField(["2", "3", "4"]);
24012
- return [
24013
- {
24014
- ...layoutField,
24015
- ui: { ...layoutField.ui ?? {}, intent: "display" }
24016
- },
24017
- {
24018
- ...columns,
24019
- ui: { ...columns.ui ?? {}, intent: "display" }
24020
- }
24021
- ];
24022
- })(),
24023
- {
24024
- id: "eventsPerPage",
24025
- type: "select",
24026
- label: "Events per page",
24027
- description: "Number of events to load at a time",
24028
- required: false,
24029
- multiple: false,
24030
- defaultValue: "12",
24031
- options: [
24032
- { value: "3", label: "3 events" },
24033
- { value: "6", label: "6 events" },
24034
- { value: "12", label: "12 events" },
24035
- { value: "24", label: "24 events" }
24036
- ],
24037
- ui: { intent: "display" }
24038
- },
24039
- {
24040
- id: "paginationMode",
24041
- type: "select",
24042
- label: "More events",
24043
- description: "How to access events beyond the initial list",
24044
- required: false,
24045
- multiple: false,
24046
- defaultValue: "loadMore",
24047
- options: [
24048
- { value: "loadMore", label: "Load more button" },
24049
- { value: "seeAllLink", label: "Link to another page" }
24050
- ],
24051
- ui: { intent: "display" }
24052
- },
24053
- {
24054
- id: "seeAllUrl",
24055
- type: "link",
24056
- label: "See all destination",
24057
- required: false,
24058
- ui: {
24059
- intent: "display",
24060
- visibleWhen: {
24061
- field: "paginationMode",
24062
- equals: "seeAllLink"
24063
- }
24064
- }
24065
- },
24066
- {
24067
- id: "loadMoreText",
24068
- type: "text",
24069
- label: "Button text",
24070
- description: "Text for the pagination button or link",
24071
- required: false,
24072
- multiline: false,
24073
- defaultValue: "Load more events",
24074
- maxLength: 40
24075
- },
24076
- ...cardStylingFields.map((field) => ({
24077
- ...field,
24078
- ui: { ...field.ui ?? {}, intent: "style" }
24079
- })),
24080
- ...eventDisplayFields.map((field) => ({
24081
- ...field,
24082
- ui: { ...field.ui ?? {}, intent: "display" }
24083
- })),
24084
- {
24085
- id: "kind",
24086
- type: "select",
24087
- label: "Show",
24088
- description: "Choose whether this list shows courses, events, or both",
24089
- required: false,
24090
- multiple: false,
24091
- defaultValue: "all",
24092
- options: [
24093
- { value: "all", label: "Courses and events" },
24094
- { value: "courses", label: "Courses only" },
24095
- { value: "events", label: "Events only" }
24096
- ],
24097
- ui: { intent: "behavior" }
24098
- },
24099
- {
24100
- id: "eventSurface",
24101
- type: "select",
24102
- label: "Event surface",
24103
- description: "Choose a semantic event scope",
24104
- required: false,
24105
- multiple: false,
24106
- defaultValue: "all",
24107
- options: [
24108
- { value: "all", label: "All events" },
24109
- { value: "regularClassSchedule", label: "Regular class schedule" },
24110
- { value: "specialDatedEvents", label: "Workshops and special events" },
24111
- { value: "custom", label: "Custom" }
24112
- ],
24113
- ui: { intent: "behavior" }
24114
- },
24115
- {
24116
- id: "filterEventPresets",
24117
- type: "select",
24118
- label: "Pre-filter by event type",
24119
- description: "Restrict this block to specific event types",
24120
- required: false,
24121
- multiple: true,
24122
- defaultValue: [],
24123
- options: [
24124
- { value: "class", label: "Classes" },
24125
- { value: "workshop", label: "Workshops" },
24126
- { value: "retreat", label: "Retreats" },
24127
- { value: "performance", label: "Performances" }
24128
- ],
24129
- ui: {
24130
- intent: "behavior",
24131
- visibleWhen: { field: "eventSurface", equals: "custom" }
24132
- }
24133
- },
24134
- {
24135
- id: "scheduleScope",
24136
- type: "select",
24137
- label: "Schedule cadence",
24138
- description: "Restrict this block by recurrence",
24139
- required: false,
24140
- multiple: false,
24141
- defaultValue: "any",
24142
- options: [
24143
- { value: "any", label: "Any cadence" },
24144
- { value: "recurring", label: "Recurring only" },
24145
- { value: "oneOff", label: "One-off only" }
24146
- ],
24147
- ui: {
24148
- intent: "behavior",
24149
- visibleWhen: { field: "eventSurface", equals: "custom" }
24150
- }
24151
- },
24152
- {
24153
- ...emptyStateField,
24154
- ui: { ...emptyStateField.ui ?? {}, intent: "display" }
24155
- },
24156
- sectionStylesField({
24157
- id: "_sectionStyles",
24158
- label: "Section styles",
24159
- renderInHeader: false
24160
- })
24161
- ],
24627
+ additionalFields: eventListingAdditionalFields,
24162
24628
  styleTokens: { background: "surface", typography: "body", spacing: "md" },
24163
24629
  behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: true },
24164
24630
  category: "interactive",
24165
24631
  tags: ["events", "listing", "paginated", "archive", "all-events"],
24166
24632
  icon: "List",
24167
- layout: [
24168
- styledSection({
24169
- children: sectionContainer([
24170
- // Optional heading
24171
- text(
24172
- { as: "h2" },
24173
- bind("content.heading"),
24174
- when("content.heading")
24175
- ),
24176
- // Optional description
24177
- richText(
24178
- { className: "rb-prose rb-max-w-none" },
24179
- bind("content.description"),
24180
- when("content.description")
24181
- ),
24182
- // Event listing component with pagination
24183
- el("event-listing", withApiBindings({
24184
- events: { $bind: { from: "data.events" } },
24185
- stage: { $bind: { from: "$root.previewStage", fallback: "published" } },
24186
- layout: { $bind: { from: "content.layout", fallback: "grid" } },
24187
- columns: { $bind: { from: "content.columns", fallback: "3" } },
24188
- eventsPerPage: { $bind: { from: "content.eventsPerPage", fallback: "12" } },
24189
- paginationMode: { $bind: { from: "content.paginationMode", fallback: "loadMore" } },
24190
- seeAllUrl: { $bind: { from: "content.seeAllUrl", transforms: [{ id: "links.resolve" }] } },
24191
- loadMoreText: { $bind: { from: "content.loadMoreText", fallback: "Load more events" } },
24192
- cardVariant: { $bind: { from: "content.cardVariant", fallback: "default" } },
24193
- buttonVariant: { $bind: { from: "content.buttonVariant", fallback: "primary" } },
24194
- buttonText: { $bind: { from: "content.buttonText", fallback: "View event" } },
24195
- showVenue: { $bind: { from: "content.showVenue" } },
24196
- showMap: { $bind: { from: "content.showMap" } },
24197
- showCapacity: { $bind: { from: "content.showCapacity" } },
24198
- eventKind: { $bind: { from: "content.kind", fallback: "all" } },
24199
- eventSurface: { $bind: { from: "content.eventSurface", fallback: "all" } },
24200
- filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
24201
- scheduleScope: { $bind: { from: "content.scheduleScope", fallback: "any" } },
24202
- emptyMessage: { $bind: { from: "content.emptyMessage" } }
24203
- }))
24204
- ], {
24205
- gap: "lg"
24206
- }),
24207
- // sectionContainer (rb-container) already provides horizontal padding
24208
- baseClass: "",
24209
- spacing: "comfortable"
24210
- })
24211
- ]
24212
- });
24633
+ layout: eventListingLayout
24634
+ };
24635
+ var eventListingManifest = createBlockManifestWithContentShape(
24636
+ eventListingConfig,
24637
+ eventListingContentShape
24638
+ );
24213
24639
  var eventListingBlockDefinition = {
24214
24640
  manifest: eventListingManifest,
24215
24641
  runtime: eventListingBlockRuntime,
@@ -24236,7 +24662,6 @@ var eventListingBlockDefinition = {
24236
24662
 
24237
24663
  // ../blocks/src/system/runtime/nodes/events/EventCalendar.interactive.ts
24238
24664
  import { z as z51 } from "zod";
24239
- var displayModeSchema = z51.enum(["combined", "month", "week", "list", "timetable"]);
24240
24665
  var eventBlockKindSchema2 = z51.enum(eventBlockKindValues);
24241
24666
  var eventSurfaceScopeSchema2 = z51.enum(eventSurfaceScopeValues);
24242
24667
  var eventScheduleScopeSchema3 = z51.enum(eventScheduleScopeValues);
@@ -24246,7 +24671,8 @@ var eventCalendarSourceSchema = z51.object(
24246
24671
  siteId: z51.string(),
24247
24672
  apiBaseUrl: z51.string().optional(),
24248
24673
  stage: previewStageSchema.optional(),
24249
- displayMode: displayModeSchema.nullable().optional(),
24674
+ variant: eventCalendarDisplayModeSchema.nullable().optional(),
24675
+ displayMode: eventCalendarDisplayModeSchema.nullable().optional(),
24250
24676
  listLayout: eventLayoutSchema.optional(),
24251
24677
  listColumns: columnOptionSchema.optional(),
24252
24678
  layout: eventLayoutSchema.optional(),
@@ -24278,7 +24704,7 @@ var eventCalendarSourceSchema = z51.object(
24278
24704
  );
24279
24705
  var eventCalendarDisplaySchema = z51.object({
24280
24706
  kind: z51.literal("event-calendar"),
24281
- displayMode: displayModeSchema,
24707
+ displayMode: eventCalendarDisplayModeSchema,
24282
24708
  className: z51.string().nullable(),
24283
24709
  events: z51.array(publicEventSchema),
24284
24710
  listLayout: eventLayoutSchema,
@@ -24333,7 +24759,7 @@ var eventCalendarIslandMetaKeys = defineInteractiveIslandMetaKeys(
24333
24759
  function buildEventCalendarDisplay(source) {
24334
24760
  return {
24335
24761
  kind: "event-calendar",
24336
- displayMode: source.displayMode ?? "combined",
24762
+ displayMode: source.variant ?? source.displayMode ?? "combined",
24337
24763
  className: source.className ?? null,
24338
24764
  events: (source.events ?? []).slice().sort(
24339
24765
  (left, right) => new Date(left.startsAt).getTime() - new Date(right.startsAt).getTime()
@@ -24400,8 +24826,12 @@ var eventCalendarInteractiveIslandPropsCodec = createInteractiveIslandCodec({
24400
24826
  function normalizeEventCalendarContent(content) {
24401
24827
  const record = typeof content === "object" && content !== null ? content : {};
24402
24828
  const kind = normalizeEventBlockKind(record.kind);
24829
+ const variant = normalizeEventCalendarDisplayMode(record.variant) ?? normalizeEventCalendarDisplayMode(record.displayMode);
24403
24830
  return {
24404
24831
  ...record,
24832
+ ...variant ? { variant } : {},
24833
+ displayMode: normalizeEventCalendarDisplayMode(record.displayMode),
24834
+ listLayout: normalizeEventCalendarListLayout(record.listLayout),
24405
24835
  kind,
24406
24836
  eventSurface: normalizeEventSurfaceScope(record.eventSurface),
24407
24837
  filterEventPresets: normalizeEventSurfacePresets(record.filterEventPresets),
@@ -24413,355 +24843,515 @@ function normalizeEventCalendarContent(content) {
24413
24843
  filterVenueId: normalizeEventVenueId(record.filterVenueId)
24414
24844
  };
24415
24845
  }
24416
- var eventCalendarManifest = createBlockManifest({
24417
- id: "block.event-calendar",
24418
- version: "3.6.0",
24419
- title: "Event Calendar",
24420
- titleSource: "heading",
24421
- description: "Display events with calendar, list, or combined views with filtering",
24422
- // Preserve legacy section styles field configuration (renderInHeader: false).
24423
- skipSectionStyles: true,
24424
- additionalFields: [
24425
- ...sectionHeaderFields("Event Calendar"),
24426
- // Display Mode (replaces calendarView)
24427
- {
24428
- id: "displayMode",
24429
- type: "select",
24430
- label: "Display mode",
24431
- description: "How events are displayed",
24432
- required: false,
24433
- multiple: false,
24434
- defaultValue: "combined",
24435
- options: [
24436
- { value: "combined", label: "Combined (List + Calendar tabs)" },
24437
- { value: "month", label: "Month calendar" },
24438
- { value: "week", label: "Week agenda" },
24439
- { value: "timetable", label: "Timetable" },
24440
- { value: "list", label: "List" }
24441
- ],
24442
- ui: { intent: "display" }
24443
- },
24444
- // List options (visible when displayMode is list or combined)
24445
- {
24446
- id: "listLayout",
24447
- type: "select",
24448
- label: "List layout",
24449
- description: "Layout style for list view",
24450
- required: false,
24451
- multiple: false,
24452
- defaultValue: "stack",
24453
- options: [
24454
- { value: "stack", label: "Stack (full-width cards)" },
24455
- { value: "grid", label: "Grid" },
24456
- { value: "compact", label: "Compact (dense rows)" }
24457
- ],
24458
- ui: {
24459
- intent: "display",
24460
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list"] }
24461
- }
24462
- },
24463
- {
24464
- id: "listColumns",
24465
- type: "select",
24466
- label: "Grid columns",
24467
- description: "Number of columns in grid layout",
24468
- required: false,
24469
- multiple: false,
24470
- defaultValue: "3",
24471
- options: [
24472
- { value: "2", label: "2 columns" },
24473
- { value: "3", label: "3 columns" },
24474
- { value: "4", label: "4 columns" }
24475
- ],
24476
- ui: {
24477
- intent: "display",
24478
- visibleWhen: { field: "listLayout", equals: "grid" }
24479
- }
24480
- },
24481
- {
24482
- id: "eventsPerPage",
24483
- type: "select",
24484
- label: "Events per page (cards)",
24485
- description: "Number of events to load initially in card layouts",
24486
- required: false,
24487
- multiple: false,
24488
- defaultValue: "12",
24489
- options: [
24490
- { value: "6", label: "6" },
24491
- { value: "12", label: "12" },
24492
- { value: "24", label: "24" }
24493
- ],
24494
- ui: {
24495
- intent: "display",
24496
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list"] }
24497
- }
24498
- },
24499
- {
24500
- id: "compactEventsPerPage",
24501
- type: "select",
24502
- label: "Events per page (compact)",
24503
- description: "Number of events to show per page in compact layout",
24504
- required: false,
24505
- multiple: false,
24506
- defaultValue: "10",
24507
- options: [
24508
- { value: "10", label: "10" },
24509
- { value: "20", label: "20" },
24510
- { value: "30", label: "30" }
24511
- ],
24512
- ui: {
24513
- intent: "display",
24514
- visibleWhen: { field: "listLayout", equals: "compact" }
24515
- }
24516
- },
24517
- {
24518
- id: "loadMoreText",
24519
- type: "text",
24520
- label: "Load more button text",
24521
- description: "Text for the load more button",
24522
- required: false,
24523
- multiline: false,
24524
- defaultValue: "Load more events",
24525
- ui: {
24526
- intent: "content",
24527
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list"] }
24528
- }
24529
- },
24530
- // Calendar options
24531
- {
24532
- id: "startOfWeek",
24533
- type: "select",
24534
- label: "Week starts on",
24535
- description: "First day of the week",
24536
- required: false,
24537
- multiple: false,
24538
- defaultValue: "monday",
24539
- options: [
24540
- { value: "sunday", label: "Sunday" },
24541
- { value: "monday", label: "Monday" }
24542
- ],
24543
- ui: {
24544
- intent: "display",
24545
- visibleWhen: {
24546
- field: "displayMode",
24547
- oneOf: ["combined", "month", "week"]
24548
- }
24549
- }
24550
- },
24551
- // Combined mode options
24552
- {
24553
- id: "calendarTabViews",
24554
- type: "select",
24555
- label: "Calendar tab views",
24556
- description: "Which calendar views to show in the Calendar tab",
24557
- required: false,
24558
- multiple: false,
24559
- defaultValue: "both",
24560
- options: [
24561
- { value: "both", label: "Month + Week toggle" },
24562
- { value: "month", label: "Month only" },
24563
- { value: "week", label: "Week only" }
24564
- ],
24565
- ui: {
24566
- intent: "display",
24567
- visibleWhen: { field: "displayMode", equals: "combined" }
24568
- }
24569
- },
24570
- // Filtering options
24571
- {
24572
- id: "kind",
24573
- type: "select",
24574
- label: "Show",
24575
- description: "Restrict this block to all offerings, courses, or events",
24576
- required: false,
24577
- multiple: false,
24578
- defaultValue: "all",
24579
- options: [
24580
- { value: "all", label: "All offerings" },
24581
- { value: "courses", label: "Courses only" },
24582
- { value: "events", label: "Events only" }
24583
- ],
24584
- ui: { intent: "behavior" }
24585
- },
24586
- {
24587
- id: "showFilters",
24588
- type: "boolean",
24589
- label: "Show filters",
24590
- description: "Show category, staff, and venue filters",
24591
- required: false,
24592
- defaultValue: true,
24593
- ui: {
24594
- intent: "display",
24595
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
24596
- }
24597
- },
24598
- {
24599
- id: "showCategoryFilter",
24600
- type: "select",
24601
- label: "Show category filter",
24602
- description: "When to show the category filter dropdown",
24603
- required: false,
24604
- multiple: false,
24605
- defaultValue: "auto",
24606
- options: [
24607
- { value: "auto", label: "Auto (when >1 category has events)" },
24608
- { value: "always", label: "Always" },
24609
- { value: "never", label: "Never" }
24846
+ function normalizeEventCalendarDisplayMode(value) {
24847
+ return isEventCalendarDisplayMode(value) ? value : void 0;
24848
+ }
24849
+ function normalizeEventCalendarListLayout(value) {
24850
+ return isEventCalendarListLayout(value) ? value : void 0;
24851
+ }
24852
+ var eventCalendarLayout = [
24853
+ styledSection({
24854
+ children: sectionContainer(
24855
+ [
24856
+ // Optional heading
24857
+ text({ as: "h2" }, bind("content.heading"), when("content.heading")),
24858
+ // Optional description
24859
+ richText(
24860
+ { className: "rb-prose rb-max-w-none" },
24861
+ bind("content.description"),
24862
+ when("content.description")
24863
+ ),
24864
+ // Event calendar component (handles all display modes)
24865
+ el(
24866
+ "event-calendar",
24867
+ withApiBindings({
24868
+ events: { $bind: { from: "data.events" } },
24869
+ stage: {
24870
+ $bind: { from: "$root.previewStage", fallback: "published" }
24871
+ },
24872
+ // Variant is the new Theme V2-facing display mode. displayMode is
24873
+ // retained as a legacy fallback for existing content.
24874
+ variant: {
24875
+ $bind: { from: "content.variant" }
24876
+ },
24877
+ displayMode: {
24878
+ $bind: { from: "content.displayMode" }
24879
+ },
24880
+ // List options
24881
+ listLayout: { $bind: { from: "content.listLayout" } },
24882
+ listColumns: { $bind: { from: "content.listColumns" } },
24883
+ // Legacy compatibility: older event-calendar content used layout/columns
24884
+ layout: { $bind: { from: "content.layout" } },
24885
+ columns: { $bind: { from: "content.columns" } },
24886
+ eventsPerPage: {
24887
+ $bind: { from: "content.eventsPerPage", fallback: "12" }
24888
+ },
24889
+ compactEventsPerPage: {
24890
+ $bind: { from: "content.compactEventsPerPage", fallback: "10" }
24891
+ },
24892
+ loadMoreText: {
24893
+ $bind: {
24894
+ from: "content.loadMoreText",
24895
+ fallback: "Load more events"
24896
+ }
24897
+ },
24898
+ // Calendar options
24899
+ startOfWeek: {
24900
+ $bind: { from: "content.startOfWeek", fallback: "monday" }
24901
+ },
24902
+ calendarTabViews: {
24903
+ $bind: { from: "content.calendarTabViews", fallback: "both" }
24904
+ },
24905
+ // Filtering options
24906
+ showFilters: {
24907
+ $bind: { from: "content.showFilters", fallback: true }
24908
+ },
24909
+ showCategoryFilter: {
24910
+ $bind: { from: "content.showCategoryFilter", fallback: "auto" }
24911
+ },
24912
+ showVenueFilter: {
24913
+ $bind: { from: "content.showVenueFilter", fallback: false }
24914
+ },
24915
+ showStaffFilter: {
24916
+ $bind: { from: "content.showStaffFilter", fallback: true }
24917
+ },
24918
+ showCapacity: {
24919
+ $bind: { from: "content.showCapacity", fallback: true }
24920
+ },
24921
+ kind: { $bind: { from: "content.kind", fallback: "all" } },
24922
+ eventSurface: {
24923
+ $bind: { from: "content.eventSurface", fallback: "all" }
24924
+ },
24925
+ filterEventPresets: {
24926
+ $bind: { from: "content.filterEventPresets" }
24927
+ },
24928
+ scheduleScope: {
24929
+ $bind: { from: "content.scheduleScope", fallback: "any" }
24930
+ },
24931
+ filterCategoryIds: {
24932
+ $bind: { from: "content.filterCategoryIds" }
24933
+ },
24934
+ filterStaffMemberId: {
24935
+ $bind: { from: "content.filterStaffMemberId" }
24936
+ },
24937
+ filterVenueId: { $bind: { from: "content.filterVenueId" } },
24938
+ // Styling
24939
+ buttonVariant: {
24940
+ $bind: { from: "content.buttonVariant", fallback: "primary" }
24941
+ },
24942
+ buttonText: {
24943
+ $bind: { from: "content.buttonText", fallback: "View event" }
24944
+ },
24945
+ emptyMessage: { $bind: { from: "content.emptyMessage" } }
24946
+ })
24947
+ )
24610
24948
  ],
24611
- ui: {
24612
- intent: "display",
24613
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
24614
- }
24615
- },
24616
- {
24617
- id: "showVenueFilter",
24618
- type: "boolean",
24619
- label: "Show venue filter",
24620
- description: "Show venue filter dropdown",
24621
- required: false,
24622
- defaultValue: false,
24623
- ui: {
24624
- intent: "display",
24625
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
24626
- }
24627
- },
24628
- {
24629
- id: "showStaffFilter",
24630
- type: "boolean",
24631
- label: "Show staff filter",
24632
- description: "Show staff filter dropdown",
24633
- required: false,
24634
- defaultValue: true,
24635
- ui: {
24636
- intent: "display",
24637
- visibleWhen: { field: "displayMode", oneOf: ["combined", "list", "timetable"] }
24638
- }
24639
- },
24640
- {
24641
- id: "showCapacity",
24642
- type: "boolean",
24643
- label: "Show available spots",
24644
- description: "Display remaining capacity on event cards and timetable cells",
24645
- required: false,
24646
- defaultValue: true,
24647
- ui: {
24648
- intent: "display",
24649
- visibleWhen: {
24650
- field: "displayMode",
24651
- oneOf: ["combined", "list", "week", "timetable"]
24652
- }
24949
+ {
24950
+ gap: "lg"
24653
24951
  }
24654
- },
24655
- // Block-level pre-filtering
24656
- {
24657
- id: "eventSurface",
24658
- type: "select",
24659
- label: "Event surface",
24660
- description: "Choose a semantic event scope",
24661
- required: false,
24662
- multiple: false,
24663
- defaultValue: "all",
24664
- options: [
24665
- { value: "all", label: "All events" },
24666
- { value: "regularClassSchedule", label: "Regular class schedule" },
24667
- { value: "specialDatedEvents", label: "Workshops and special events" },
24668
- { value: "custom", label: "Custom" }
24669
- ],
24670
- ui: { intent: "behavior" }
24671
- },
24672
- {
24673
- id: "filterEventPresets",
24674
- type: "select",
24675
- label: "Pre-filter by event type",
24676
- description: "Restrict this block to specific event types",
24677
- required: false,
24678
- multiple: true,
24679
- defaultValue: [],
24680
- options: [
24681
- { value: "class", label: "Classes" },
24682
- { value: "workshop", label: "Workshops" },
24683
- { value: "retreat", label: "Retreats" },
24684
- { value: "performance", label: "Performances" }
24685
- ],
24686
- ui: {
24687
- intent: "behavior",
24688
- visibleWhen: { field: "eventSurface", equals: "custom" }
24952
+ ),
24953
+ // sectionContainer (rb-container) already provides horizontal padding
24954
+ baseClass: "",
24955
+ spacing: "comfortable"
24956
+ })
24957
+ ];
24958
+ var eventCalendarAdditionalFields = [
24959
+ ...sectionHeaderFields("Event Calendar"),
24960
+ // Display Mode (replaces calendarView)
24961
+ {
24962
+ id: "displayMode",
24963
+ type: "select",
24964
+ label: "Display mode",
24965
+ description: "How events are displayed",
24966
+ required: false,
24967
+ multiple: false,
24968
+ defaultValue: "combined",
24969
+ options: [
24970
+ { value: "combined", label: "Combined (List + Calendar tabs)" },
24971
+ { value: "month", label: "Month calendar" },
24972
+ { value: "week", label: "Week agenda" },
24973
+ { value: "timetable", label: "Timetable" },
24974
+ { value: "list", label: "List" }
24975
+ ],
24976
+ ui: { intent: "display", hidden: true }
24977
+ },
24978
+ // List options (visible when displayMode is list or combined)
24979
+ {
24980
+ id: "listLayout",
24981
+ type: "select",
24982
+ label: "List layout",
24983
+ description: "Layout style for list view",
24984
+ required: false,
24985
+ multiple: false,
24986
+ defaultValue: "stack",
24987
+ options: eventCalendarListLayoutOptions.map((option) => ({
24988
+ value: option.id,
24989
+ label: option.label
24990
+ })),
24991
+ ui: {
24992
+ intent: "display",
24993
+ visibleWhen: { field: "variant", oneOf: ["combined", "list"] }
24994
+ }
24995
+ },
24996
+ {
24997
+ id: "listColumns",
24998
+ type: "select",
24999
+ label: "Grid columns",
25000
+ description: "Number of columns in grid layout",
25001
+ required: false,
25002
+ multiple: false,
25003
+ defaultValue: "3",
25004
+ options: [
25005
+ { value: "2", label: "2 columns" },
25006
+ { value: "3", label: "3 columns" },
25007
+ { value: "4", label: "4 columns" }
25008
+ ],
25009
+ ui: {
25010
+ intent: "display",
25011
+ visibleWhen: { field: "listLayout", equals: "grid" }
25012
+ }
25013
+ },
25014
+ {
25015
+ id: "eventsPerPage",
25016
+ type: "select",
25017
+ label: "Events per page (cards)",
25018
+ description: "Number of events to load initially in card layouts",
25019
+ required: false,
25020
+ multiple: false,
25021
+ defaultValue: "12",
25022
+ options: [
25023
+ { value: "6", label: "6" },
25024
+ { value: "12", label: "12" },
25025
+ { value: "24", label: "24" }
25026
+ ],
25027
+ ui: {
25028
+ intent: "display",
25029
+ visibleWhen: { field: "variant", oneOf: ["combined", "list"] }
25030
+ }
25031
+ },
25032
+ {
25033
+ id: "compactEventsPerPage",
25034
+ type: "select",
25035
+ label: "Events per page (compact)",
25036
+ description: "Number of events to show per page in compact layout",
25037
+ required: false,
25038
+ multiple: false,
25039
+ defaultValue: "10",
25040
+ options: [
25041
+ { value: "10", label: "10" },
25042
+ { value: "20", label: "20" },
25043
+ { value: "30", label: "30" }
25044
+ ],
25045
+ ui: {
25046
+ intent: "display",
25047
+ visibleWhen: { field: "listLayout", equals: "compact" }
25048
+ }
25049
+ },
25050
+ {
25051
+ id: "loadMoreText",
25052
+ type: "text",
25053
+ label: "Load more button text",
25054
+ description: "Text for the load more button",
25055
+ required: false,
25056
+ multiline: false,
25057
+ defaultValue: "Load more events",
25058
+ ui: {
25059
+ intent: "content",
25060
+ visibleWhen: { field: "variant", oneOf: ["combined", "list"] }
25061
+ }
25062
+ },
25063
+ // Calendar options
25064
+ {
25065
+ id: "startOfWeek",
25066
+ type: "select",
25067
+ label: "Week starts on",
25068
+ description: "First day of the week",
25069
+ required: false,
25070
+ multiple: false,
25071
+ defaultValue: "monday",
25072
+ options: [
25073
+ { value: "sunday", label: "Sunday" },
25074
+ { value: "monday", label: "Monday" }
25075
+ ],
25076
+ ui: {
25077
+ intent: "display",
25078
+ visibleWhen: {
25079
+ field: "variant",
25080
+ oneOf: ["combined", "month", "week"]
24689
25081
  }
24690
- },
24691
- {
24692
- id: "scheduleScope",
24693
- type: "select",
24694
- label: "Schedule cadence",
24695
- description: "Restrict this block by recurrence",
24696
- required: false,
24697
- multiple: false,
24698
- defaultValue: "any",
24699
- options: [
24700
- { value: "any", label: "Any cadence" },
24701
- { value: "recurring", label: "Recurring only" },
24702
- { value: "oneOff", label: "One-off only" }
24703
- ],
24704
- ui: {
24705
- intent: "behavior",
24706
- visibleWhen: { field: "eventSurface", equals: "custom" }
25082
+ }
25083
+ },
25084
+ // Combined mode options
25085
+ {
25086
+ id: "calendarTabViews",
25087
+ type: "select",
25088
+ label: "Calendar tab views",
25089
+ description: "Which calendar views to show in the Calendar tab",
25090
+ required: false,
25091
+ multiple: false,
25092
+ defaultValue: "both",
25093
+ options: [
25094
+ { value: "both", label: "Month + Week toggle" },
25095
+ { value: "month", label: "Month only" },
25096
+ { value: "week", label: "Week only" }
25097
+ ],
25098
+ ui: {
25099
+ intent: "display",
25100
+ visibleWhen: { field: "variant", equals: "combined" }
25101
+ }
25102
+ },
25103
+ // Filtering options
25104
+ {
25105
+ id: "kind",
25106
+ type: "select",
25107
+ label: "Show",
25108
+ description: "Restrict this block to all offerings, courses, or events",
25109
+ required: false,
25110
+ multiple: false,
25111
+ defaultValue: "all",
25112
+ options: [
25113
+ { value: "all", label: "All offerings" },
25114
+ { value: "courses", label: "Courses only" },
25115
+ { value: "events", label: "Events only" }
25116
+ ],
25117
+ ui: { intent: "behavior" }
25118
+ },
25119
+ {
25120
+ id: "showFilters",
25121
+ type: "boolean",
25122
+ label: "Show filters",
25123
+ description: "Show category, staff, and venue filters",
25124
+ required: false,
25125
+ defaultValue: true,
25126
+ ui: {
25127
+ intent: "display",
25128
+ visibleWhen: {
25129
+ field: "variant",
25130
+ oneOf: ["combined", "list", "timetable"]
24707
25131
  }
24708
- },
24709
- createSiteOptionSelectField({
24710
- id: "filterCategoryIds",
24711
- label: "Pre-filter by categories",
24712
- description: "Restrict this block to specific event categories",
24713
- required: false,
24714
- multiple: true,
24715
- defaultValue: [],
24716
- optionSource: "eventCategories",
24717
- ui: {
24718
- intent: "behavior",
24719
- searchThreshold: 8,
24720
- visibleWhen: { field: "kind", notEquals: "courses" }
25132
+ }
25133
+ },
25134
+ {
25135
+ id: "showCategoryFilter",
25136
+ type: "select",
25137
+ label: "Show category filter",
25138
+ description: "When to show the category filter dropdown",
25139
+ required: false,
25140
+ multiple: false,
25141
+ defaultValue: "auto",
25142
+ options: [
25143
+ { value: "auto", label: "Auto (when >1 category has events)" },
25144
+ { value: "always", label: "Always" },
25145
+ { value: "never", label: "Never" }
25146
+ ],
25147
+ ui: {
25148
+ intent: "display",
25149
+ visibleWhen: {
25150
+ field: "variant",
25151
+ oneOf: ["combined", "list", "timetable"]
24721
25152
  }
24722
- }),
24723
- createSiteOptionSelectField({
24724
- id: "filterStaffMemberId",
24725
- label: "Pre-filter by staff member",
24726
- description: "Restrict this block to a single staff member",
24727
- required: false,
24728
- multiple: false,
24729
- optionSource: "staffMembers",
24730
- ui: {
24731
- intent: "behavior",
24732
- searchThreshold: 8
25153
+ }
25154
+ },
25155
+ {
25156
+ id: "showVenueFilter",
25157
+ type: "boolean",
25158
+ label: "Show venue filter",
25159
+ description: "Show venue filter dropdown",
25160
+ required: false,
25161
+ defaultValue: false,
25162
+ ui: {
25163
+ intent: "display",
25164
+ visibleWhen: {
25165
+ field: "variant",
25166
+ oneOf: ["combined", "list", "timetable"]
24733
25167
  }
24734
- }),
24735
- createSiteOptionSelectField({
24736
- id: "filterVenueId",
24737
- label: "Pre-filter by venue",
24738
- description: "Restrict this block to a single venue",
24739
- required: false,
24740
- multiple: false,
24741
- optionSource: "venues",
24742
- ui: {
24743
- intent: "behavior",
24744
- searchThreshold: 8
25168
+ }
25169
+ },
25170
+ {
25171
+ id: "showStaffFilter",
25172
+ type: "boolean",
25173
+ label: "Show staff filter",
25174
+ description: "Show staff filter dropdown",
25175
+ required: false,
25176
+ defaultValue: true,
25177
+ ui: {
25178
+ intent: "display",
25179
+ visibleWhen: {
25180
+ field: "variant",
25181
+ oneOf: ["combined", "list", "timetable"]
24745
25182
  }
24746
- }),
24747
- // Card styling
24748
- ...cardStylingFields.filter((f) => f.id === "buttonVariant" || f.id === "buttonText").map((field) => ({
24749
- ...field,
24750
- ui: {
24751
- ...field.ui ?? {},
24752
- intent: field.id === "buttonVariant" ? "style" : "content"
25183
+ }
25184
+ },
25185
+ {
25186
+ id: "showCapacity",
25187
+ type: "boolean",
25188
+ label: "Show available spots",
25189
+ description: "Display remaining capacity on event cards and timetable cells",
25190
+ required: false,
25191
+ defaultValue: true,
25192
+ ui: {
25193
+ intent: "display",
25194
+ visibleWhen: {
25195
+ field: "variant",
25196
+ oneOf: ["combined", "list", "week", "timetable"]
24753
25197
  }
24754
- })),
24755
- {
24756
- ...emptyStateField,
24757
- ui: { ...emptyStateField.ui ?? {}, intent: "display" }
24758
- },
24759
- sectionStylesField({
24760
- id: "_sectionStyles",
24761
- label: "Section styles",
24762
- renderInHeader: false
24763
- })
24764
- ],
25198
+ }
25199
+ },
25200
+ // Block-level pre-filtering
25201
+ {
25202
+ id: "eventSurface",
25203
+ type: "select",
25204
+ label: "Event surface",
25205
+ description: "Choose a semantic event scope",
25206
+ required: false,
25207
+ multiple: false,
25208
+ defaultValue: "all",
25209
+ options: [
25210
+ { value: "all", label: "All events" },
25211
+ { value: "regularClassSchedule", label: "Regular class schedule" },
25212
+ { value: "specialDatedEvents", label: "Workshops and special events" },
25213
+ { value: "custom", label: "Custom" }
25214
+ ],
25215
+ ui: { intent: "behavior" }
25216
+ },
25217
+ {
25218
+ id: "filterEventPresets",
25219
+ type: "select",
25220
+ label: "Pre-filter by event type",
25221
+ description: "Restrict this block to specific event types",
25222
+ required: false,
25223
+ multiple: true,
25224
+ defaultValue: [],
25225
+ options: [
25226
+ { value: "class", label: "Classes" },
25227
+ { value: "workshop", label: "Workshops" },
25228
+ { value: "retreat", label: "Retreats" },
25229
+ { value: "performance", label: "Performances" }
25230
+ ],
25231
+ ui: {
25232
+ intent: "behavior",
25233
+ visibleWhen: { field: "eventSurface", equals: "custom" }
25234
+ }
25235
+ },
25236
+ {
25237
+ id: "scheduleScope",
25238
+ type: "select",
25239
+ label: "Schedule cadence",
25240
+ description: "Restrict this block by recurrence",
25241
+ required: false,
25242
+ multiple: false,
25243
+ defaultValue: "any",
25244
+ options: [
25245
+ { value: "any", label: "Any cadence" },
25246
+ { value: "recurring", label: "Recurring only" },
25247
+ { value: "oneOff", label: "One-off only" }
25248
+ ],
25249
+ ui: {
25250
+ intent: "behavior",
25251
+ visibleWhen: { field: "eventSurface", equals: "custom" }
25252
+ }
25253
+ },
25254
+ createSiteOptionSelectField({
25255
+ id: "filterCategoryIds",
25256
+ label: "Pre-filter by categories",
25257
+ description: "Restrict this block to specific event categories",
25258
+ required: false,
25259
+ multiple: true,
25260
+ defaultValue: [],
25261
+ optionSource: "eventCategories",
25262
+ ui: {
25263
+ intent: "behavior",
25264
+ searchThreshold: 8,
25265
+ visibleWhen: { field: "kind", notEquals: "courses" }
25266
+ }
25267
+ }),
25268
+ createSiteOptionSelectField({
25269
+ id: "filterStaffMemberId",
25270
+ label: "Pre-filter by staff member",
25271
+ description: "Restrict this block to a single staff member",
25272
+ required: false,
25273
+ multiple: false,
25274
+ optionSource: "staffMembers",
25275
+ ui: {
25276
+ intent: "behavior",
25277
+ searchThreshold: 8
25278
+ }
25279
+ }),
25280
+ createSiteOptionSelectField({
25281
+ id: "filterVenueId",
25282
+ label: "Pre-filter by venue",
25283
+ description: "Restrict this block to a single venue",
25284
+ required: false,
25285
+ multiple: false,
25286
+ optionSource: "venues",
25287
+ ui: {
25288
+ intent: "behavior",
25289
+ searchThreshold: 8
25290
+ }
25291
+ }),
25292
+ // Card styling
25293
+ ...cardStylingFields.filter((f) => f.id === "buttonVariant" || f.id === "buttonText").map((field) => ({
25294
+ ...field,
25295
+ ui: {
25296
+ ...field.ui ?? {},
25297
+ intent: field.id === "buttonVariant" ? "style" : "content"
25298
+ }
25299
+ })),
25300
+ {
25301
+ ...emptyStateField,
25302
+ ui: { ...emptyStateField.ui ?? {}, intent: "display" }
25303
+ },
25304
+ sectionStylesField({
25305
+ id: "_sectionStyles",
25306
+ label: "Section styles",
25307
+ renderInHeader: false
25308
+ })
25309
+ ];
25310
+ var eventCalendarVariants = {
25311
+ combined: eventCalendarLayout[0],
25312
+ month: eventCalendarLayout[0],
25313
+ week: eventCalendarLayout[0],
25314
+ timetable: eventCalendarLayout[0],
25315
+ list: eventCalendarLayout[0]
25316
+ };
25317
+ var eventCalendarDerivedFields = [
25318
+ {
25319
+ id: "displayMode",
25320
+ type: "select",
25321
+ required: false,
25322
+ multiple: false,
25323
+ options: [
25324
+ { value: "combined" },
25325
+ { value: "month" },
25326
+ { value: "week" },
25327
+ { value: "timetable" },
25328
+ { value: "list" }
25329
+ ]
25330
+ },
25331
+ {
25332
+ id: "listLayout",
25333
+ type: "select",
25334
+ required: false,
25335
+ multiple: false,
25336
+ options: eventCalendarListLayoutOptions.map((option) => ({
25337
+ value: option.id
25338
+ }))
25339
+ }
25340
+ ];
25341
+ var eventCalendarContentShape = {
25342
+ additionalFields: eventCalendarDerivedFields,
25343
+ variants: eventCalendarVariants,
25344
+ skipSectionStyles: true
25345
+ };
25346
+ var eventCalendarConfig = {
25347
+ id: "block.event-calendar",
25348
+ version: "3.6.0",
25349
+ title: "Event Calendar",
25350
+ titleSource: "heading",
25351
+ description: "Display events with calendar, list, or combined views with filtering",
25352
+ // Preserve legacy section styles field configuration (renderInHeader: false).
25353
+ skipSectionStyles: true,
25354
+ additionalFields: eventCalendarAdditionalFields,
24765
25355
  styleTokens: { background: "surface", typography: "body", spacing: "md" },
24766
25356
  behaviours: {
24767
25357
  supportsThemeSwitching: true,
@@ -24781,109 +25371,21 @@ var eventCalendarManifest = createBlockManifest({
24781
25371
  "filter"
24782
25372
  ],
24783
25373
  icon: "CalendarDays",
24784
- layout: [
24785
- styledSection({
24786
- children: sectionContainer(
24787
- [
24788
- // Optional heading
24789
- text({ as: "h2" }, bind("content.heading"), when("content.heading")),
24790
- // Optional description
24791
- richText(
24792
- { className: "rb-prose rb-max-w-none" },
24793
- bind("content.description"),
24794
- when("content.description")
24795
- ),
24796
- // Event calendar component (handles all display modes)
24797
- el(
24798
- "event-calendar",
24799
- withApiBindings({
24800
- events: { $bind: { from: "data.events" } },
24801
- stage: {
24802
- $bind: { from: "$root.previewStage", fallback: "published" }
24803
- },
24804
- // Display mode
24805
- displayMode: {
24806
- $bind: { from: "content.displayMode", fallback: "combined" }
24807
- },
24808
- // List options
24809
- listLayout: { $bind: { from: "content.listLayout" } },
24810
- listColumns: { $bind: { from: "content.listColumns" } },
24811
- // Legacy compatibility: older event-calendar content used layout/columns
24812
- layout: { $bind: { from: "content.layout" } },
24813
- columns: { $bind: { from: "content.columns" } },
24814
- eventsPerPage: {
24815
- $bind: { from: "content.eventsPerPage", fallback: "12" }
24816
- },
24817
- compactEventsPerPage: {
24818
- $bind: { from: "content.compactEventsPerPage", fallback: "10" }
24819
- },
24820
- loadMoreText: {
24821
- $bind: {
24822
- from: "content.loadMoreText",
24823
- fallback: "Load more events"
24824
- }
24825
- },
24826
- // Calendar options
24827
- startOfWeek: {
24828
- $bind: { from: "content.startOfWeek", fallback: "monday" }
24829
- },
24830
- calendarTabViews: {
24831
- $bind: { from: "content.calendarTabViews", fallback: "both" }
24832
- },
24833
- // Filtering options
24834
- showFilters: {
24835
- $bind: { from: "content.showFilters", fallback: true }
24836
- },
24837
- showCategoryFilter: {
24838
- $bind: { from: "content.showCategoryFilter", fallback: "auto" }
24839
- },
24840
- showVenueFilter: {
24841
- $bind: { from: "content.showVenueFilter", fallback: false }
24842
- },
24843
- showStaffFilter: {
24844
- $bind: { from: "content.showStaffFilter", fallback: true }
24845
- },
24846
- showCapacity: {
24847
- $bind: { from: "content.showCapacity", fallback: true }
24848
- },
24849
- kind: { $bind: { from: "content.kind", fallback: "all" } },
24850
- eventSurface: {
24851
- $bind: { from: "content.eventSurface", fallback: "all" }
24852
- },
24853
- filterEventPresets: {
24854
- $bind: { from: "content.filterEventPresets" }
24855
- },
24856
- scheduleScope: {
24857
- $bind: { from: "content.scheduleScope", fallback: "any" }
24858
- },
24859
- filterCategoryIds: {
24860
- $bind: { from: "content.filterCategoryIds" }
24861
- },
24862
- filterStaffMemberId: {
24863
- $bind: { from: "content.filterStaffMemberId" }
24864
- },
24865
- filterVenueId: { $bind: { from: "content.filterVenueId" } },
24866
- // Styling
24867
- buttonVariant: {
24868
- $bind: { from: "content.buttonVariant", fallback: "primary" }
24869
- },
24870
- buttonText: {
24871
- $bind: { from: "content.buttonText", fallback: "View event" }
24872
- },
24873
- emptyMessage: { $bind: { from: "content.emptyMessage" } }
24874
- })
24875
- )
24876
- ],
24877
- {
24878
- gap: "lg"
24879
- }
24880
- ),
24881
- // sectionContainer (rb-container) already provides horizontal padding
24882
- baseClass: "",
24883
- spacing: "comfortable"
24884
- })
24885
- ]
24886
- });
25374
+ layout: eventCalendarLayout,
25375
+ variants: eventCalendarVariants,
25376
+ defaultVariant: "combined",
25377
+ variantOptions: {
25378
+ combined: { label: "Combined" },
25379
+ month: { label: "Month" },
25380
+ week: { label: "Week" },
25381
+ timetable: { label: "Timetable" },
25382
+ list: { label: "List" }
25383
+ }
25384
+ };
25385
+ var eventCalendarManifest = createBlockManifestWithContentShape(
25386
+ eventCalendarConfig,
25387
+ eventCalendarContentShape
25388
+ );
24887
25389
  var eventCalendarBlockDefinition = {
24888
25390
  manifest: eventCalendarManifest,
24889
25391
  normalizeContent: normalizeEventCalendarContent,
@@ -28936,14 +29438,29 @@ function mediaPanelCapable() {
28936
29438
  var allSectionSurfaces = [
28937
29439
  "base",
28938
29440
  "muted-band",
28939
- "accent-band"
29441
+ "accent-band",
29442
+ "brand-depth-band"
28940
29443
  ];
28941
29444
  var heroSectionSurfaces = [
28942
29445
  "base",
28943
29446
  "muted-band",
28944
29447
  "accent-band",
29448
+ "brand-depth-band",
28945
29449
  "hero-image"
28946
29450
  ];
29451
+ var scheduleTileTreatments = [
29452
+ "default",
29453
+ "quiet",
29454
+ "brand-depth"
29455
+ ];
29456
+ function scheduleDetailsCapable() {
29457
+ return declareBlockDesignCapability({
29458
+ sectionSurfaces: "supported",
29459
+ contentFrames: ["plain"],
29460
+ itemSurfaces: "unsupported",
29461
+ tileTreatments: scheduleTileTreatments
29462
+ });
29463
+ }
28947
29464
  function defaultBoundaryBias(visualWeight) {
28948
29465
  return visualWeight === "featured" || visualWeight === "immersive" ? "clear" : "soft";
28949
29466
  }
@@ -29181,7 +29698,7 @@ var systemBlockDefinitionsRaw = [
29181
29698
  flow: conversionFlow,
29182
29699
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
29183
29700
  })),
29184
- withDesignCapability("block.event-details", eventDetailsBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
29701
+ withDesignCapability("block.event-details", eventDetailsBlockDefinition, scheduleDetailsCapable(), defineBlockDesignMetadata({
29185
29702
  flow: offeringsFlow,
29186
29703
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
29187
29704
  })),
@@ -29189,7 +29706,7 @@ var systemBlockDefinitionsRaw = [
29189
29706
  flow: conversionFlow,
29190
29707
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
29191
29708
  })),
29192
- withDesignCapability("block.course-details", courseDetailsBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
29709
+ withDesignCapability("block.course-details", courseDetailsBlockDefinition, scheduleDetailsCapable(), defineBlockDesignMetadata({
29193
29710
  flow: offeringsFlow,
29194
29711
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
29195
29712
  })),
@@ -29204,7 +29721,13 @@ var systemBlockDefinitionsRaw = [
29204
29721
  })),
29205
29722
  withDesignCapability("block.event-calendar", eventCalendarBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
29206
29723
  flow: offeringsFlow,
29207
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
29724
+ layoutProfiles: [
29725
+ layoutProfile({ variantKey: "combined", family: "grid", weight: "standard" }),
29726
+ layoutProfile({ variantKey: "list", family: "stack", weight: "standard" }),
29727
+ layoutProfile({ variantKey: "month", family: "grid", weight: "standard" }),
29728
+ layoutProfile({ variantKey: "week", family: "stack", weight: "standard" }),
29729
+ layoutProfile({ variantKey: "timetable", family: "stack", weight: "standard" })
29730
+ ]
29208
29731
  })),
29209
29732
  // Friendly wrapper blocks
29210
29733
  withDesignCapability("block.team-members", teamMembersBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
@@ -30751,6 +31274,9 @@ function applyBindings(bindings, context) {
30751
31274
  }
30752
31275
  return result;
30753
31276
  }
31277
+ function applyBindingsToContent(baseContent, bindings, context) {
31278
+ return { ...baseContent, ...applyBindings(bindings, context) };
31279
+ }
30754
31280
  function setBindingValue(target, path, value) {
30755
31281
  const segments = path.split(".").map((segment) => segment.trim()).filter(Boolean);
30756
31282
  if (segments.length === 0) return;
@@ -30930,7 +31456,7 @@ function isDocWrapper(value) {
30930
31456
 
30931
31457
  // src/rendering/helpers/bindings.ts
30932
31458
  var normalizeBindingOutput2 = normalizeBindingOutput;
30933
- var applyBindings2 = applyBindings;
31459
+ var applyBindingsToContent2 = applyBindingsToContent;
30934
31460
 
30935
31461
  // src/rendering/helpers/loadContent.ts
30936
31462
  function isPageContent(result) {
@@ -31141,7 +31667,7 @@ function resolveTemplateBlock(block, bindingContext) {
31141
31667
  }
31142
31668
  const bindings = block.bindings ?? {};
31143
31669
  const hasBindings = typeof bindings === "object" && Object.keys(bindings).length > 0;
31144
- const resolvedContent = hasBindings ? normalizeBindingOutput2(applyBindings2(bindings, bindingContext)) : baseContent;
31670
+ const resolvedContent = hasBindings ? normalizeBindingOutput2(applyBindingsToContent2(baseContent, bindings, bindingContext)) : baseContent;
31145
31671
  return {
31146
31672
  id: block.id,
31147
31673
  kind: block.blockKind,