@riverbankcms/sdk 0.82.0 → 0.84.0

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 (194) hide show
  1. package/README.md +16 -0
  2. package/dist/{PreviewEditorSidebar-LHGK6RIO.mjs → PreviewEditorSidebar-HML67UDA.mjs} +330 -11
  3. package/dist/{PreviewEditorUI-AXZG2SDC.mjs → PreviewEditorUI-I4BQUU6K.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-MCKMVDTK.mjs +8 -0
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +200 -0
  6. package/dist/_dts/api/src/blocks.d.ts +36 -0
  7. package/dist/_dts/api/src/contentRuntime.d.ts +46 -0
  8. package/dist/_dts/api/src/endpoints.d.ts +40 -0
  9. package/dist/_dts/api/src/index.d.ts +2 -2
  10. package/dist/_dts/api/src/sdk-event-pricing.d.ts +61 -0
  11. package/dist/_dts/api/src/sdk-event-schedule.d.ts +52 -0
  12. package/dist/_dts/api/src/sdk-event-upsert.d.ts +50 -0
  13. package/dist/_dts/api/src/sdkContracts.d.ts +67 -33
  14. package/dist/_dts/api/src/shared-contracts.d.ts +13 -0
  15. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +22 -36
  16. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +46 -1
  17. package/dist/_dts/block-form/src/backend/useBackendWatch.d.ts +6 -1
  18. package/dist/_dts/block-form/src/utils/evaluateVisibility.d.ts +3 -2
  19. package/dist/_dts/block-form/src/utils/visibleWhen.d.ts +7 -0
  20. package/dist/_dts/blocks/src/PageRenderer.d.ts +11 -0
  21. package/dist/_dts/blocks/src/bindings/index.d.ts +1 -1
  22. package/dist/_dts/blocks/src/client/site-chrome.d.ts +1 -1
  23. package/dist/_dts/blocks/src/client.d.ts +4 -0
  24. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +16 -4
  25. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -2016
  26. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -2016
  27. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -2016
  28. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -2016
  29. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -2016
  30. package/dist/_dts/blocks/src/system/blocks/contact-newsletter.d.ts +171 -0
  31. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +288 -2016
  32. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -2016
  33. package/dist/_dts/blocks/src/system/blocks/hero.d.ts +3 -2
  34. package/dist/_dts/blocks/src/system/blocks/index.d.ts +1 -0
  35. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -7
  36. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +2534 -151
  37. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -2016
  38. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -2016
  39. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -2016
  40. package/dist/_dts/blocks/src/system/blocks/site-header.d.ts +36 -3
  41. package/dist/_dts/blocks/src/system/blocks/team-members.d.ts +2 -2
  42. package/dist/_dts/blocks/src/system/constants/blockKinds.d.ts +1 -1
  43. package/dist/_dts/blocks/src/system/fields/aspectRatio.d.ts +4 -1
  44. package/dist/_dts/blocks/src/system/fields/imageShape.d.ts +30 -0
  45. package/dist/_dts/blocks/src/system/fragments/library/heroLayoutControls.d.ts +25 -0
  46. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +35 -161
  47. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +24 -6
  48. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +12 -3
  49. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessEventRegistrationFlow.d.ts +33 -0
  50. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.state.d.ts +303 -0
  51. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +20 -1
  52. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +4 -3
  53. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/utils.d.ts +1 -1
  54. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +26 -6
  55. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/pricing.d.ts +14 -0
  56. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +1 -1
  57. package/dist/_dts/content-editor/src/controller/buildBlockPublishedBaselines.d.ts +1 -1
  58. package/dist/_dts/content-editor/src/controller/seedDraftBaselinesFromBlocks.d.ts +1 -1
  59. package/dist/_dts/content-editor/src/controller/useBlocksList.d.ts +1 -1
  60. package/dist/_dts/content-editor/src/controller/useInvalidBlockRecovery.d.ts +1 -1
  61. package/dist/_dts/content-editor/src/primitives/PreviewRichTextEditor.d.ts +2 -1
  62. package/dist/_dts/content-editor/src/primitives/PreviewTextEditor.d.ts +1 -0
  63. package/dist/_dts/content-model/src/entry-slots/index.d.ts +1 -0
  64. package/dist/_dts/content-model/src/entry-slots/types.d.ts +356 -0
  65. package/dist/_dts/content-model/src/index.d.ts +1 -0
  66. package/dist/_dts/content-model/src/templates/defaults.d.ts +7 -0
  67. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +100 -5
  68. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +6 -1
  69. package/dist/_dts/editor-blocks/src/BlockForm.d.ts +1 -1
  70. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockCreation.d.ts +3 -2
  71. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockDuplication.d.ts +3 -2
  72. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockReorder.d.ts +3 -2
  73. package/dist/_dts/editor-blocks/src/block-editor/owner.d.ts +27 -0
  74. package/dist/_dts/editor-blocks/src/index.d.ts +1 -0
  75. package/dist/_dts/media-core/src/assetsInUseSummary.d.ts +8 -0
  76. package/dist/_dts/media-core/src/mediaUsageProjection.d.ts +37 -3
  77. package/dist/_dts/preview-next/src/client/blocks/pageDesignRuntimePreview.d.ts +4 -2
  78. package/dist/_dts/preview-next/src/client/blocks/previewProjection/runtimeContentDecoration.d.ts +2 -2
  79. package/dist/_dts/preview-next/src/client/preview/EntryEditorPanel.d.ts +3 -1
  80. package/dist/_dts/preview-next/src/client/preview/EntrySlotBlockEditorPanel.d.ts +19 -0
  81. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeButton.d.ts +8 -0
  82. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +4 -1
  83. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +1 -1
  84. package/dist/_dts/preview-next/src/client/preview/linkedEntryEditEvents.d.ts +9 -0
  85. package/dist/_dts/preview-next/src/client/preview/previewCustomizeControls.d.ts +9 -8
  86. package/dist/_dts/preview-next/src/client/preview/siteChromeLookRows.d.ts +10 -1
  87. package/dist/_dts/preview-next/src/client/preview/siteChromeQuickControlHistoryState.d.ts +5 -1
  88. package/dist/_dts/sdk/src/bookings/index.d.ts +5 -4
  89. package/dist/_dts/sdk/src/bookings/types.d.ts +2 -2
  90. package/dist/_dts/sdk/src/cli/content/reader.d.ts +9 -8
  91. package/dist/_dts/sdk/src/cli/content/writer.d.ts +6 -1
  92. package/dist/_dts/sdk/src/cli/helpers.d.ts +10 -5
  93. package/dist/_dts/sdk/src/cli/merge-remote/entryLocal.d.ts +2 -2
  94. package/dist/_dts/sdk/src/cli/merge-remote/entryMerge.d.ts +2 -1
  95. package/dist/_dts/sdk/src/cli/merge-remote/entrySnapshots.d.ts +2 -2
  96. package/dist/_dts/sdk/src/client/management/index.d.ts +1 -1
  97. package/dist/_dts/sdk/src/client/management/types.d.ts +40 -10
  98. package/dist/_dts/sdk/src/config/field-definitions.d.ts +13 -7
  99. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +26 -3
  100. package/dist/_dts/sdk/src/public-api/contracts.d.ts +13 -0
  101. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +1 -0
  102. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +6 -1
  103. package/dist/_dts/sdk/src/rendering/overrides.d.ts +6 -1
  104. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  105. package/dist/_dts/sdk/src/version.d.ts +1 -1
  106. package/dist/_dts/site-commands/src/commands.d.ts +15 -0
  107. package/dist/_dts/theme-core/src/accordions/types.d.ts +1 -1
  108. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  109. package/dist/_dts/theme-core/src/buttons/personalities/ornate-ritual.d.ts +16 -0
  110. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +1 -1
  111. package/dist/_dts/theme-core/src/buttons/types.d.ts +3 -3
  112. package/dist/_dts/theme-core/src/cards/types.d.ts +15 -15
  113. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  114. package/dist/_dts/theme-core/src/inputs/types.d.ts +1 -1
  115. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +33 -33
  116. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +15 -0
  117. package/dist/_dts/theme-core/src/palette/variants/warm-dark.d.ts +16 -0
  118. package/dist/_dts/theme-core/src/schema.d.ts +30 -25
  119. package/dist/_dts/theme-core/src/site-styles/backgroundAppearance.d.ts +2 -2
  120. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +141 -1
  121. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +2 -0
  122. package/dist/_dts/theme-core/src/site-styles/footerLooks.d.ts +110 -5
  123. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  124. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +1 -1
  125. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +5 -1
  126. package/dist/_dts/theme-core/src/site-styles/tokenRecipes.d.ts +1 -1
  127. package/dist/_dts/theme-core/src/site-styles/types.d.ts +1 -1
  128. package/dist/_dts/theme-core/src/site-styles/typographyPresets.d.ts +16 -1
  129. package/dist/_dts/theme-core/src/siteChromePlanning.d.ts +1 -0
  130. package/dist/_dts/theme-core/src/utils/colorStyles.d.ts +6 -6
  131. package/dist/{chunk-2BUMISSH.mjs → chunk-3LXFQS7T.mjs} +1 -1
  132. package/dist/{chunk-G35HOQEN.mjs → chunk-5E33VO6J.mjs} +132 -46
  133. package/dist/{chunk-HKB6XVIP.mjs → chunk-6X2OVO3S.mjs} +2 -2
  134. package/dist/{chunk-6FWNF3DJ.mjs → chunk-HFMGVJCE.mjs} +158 -20
  135. package/dist/{chunk-FIREV57T.mjs → chunk-LBBPD2IW.mjs} +40 -0
  136. package/dist/{chunk-XQR6THQJ.mjs → chunk-MSHZO4SL.mjs} +3193 -1216
  137. package/dist/cli/index.mjs +2635 -575
  138. package/dist/cli/init-docs/content/getting-started.md +2 -0
  139. package/dist/cli/init-docs/content/workflow-templates.md +93 -2
  140. package/dist/client/{accordion-G34C45TW.mjs → accordion-ESY65T56.mjs} +2 -2
  141. package/dist/client/{bookingForm-BLBVKSAQ.mjs → bookingForm-JRFNZUHD.mjs} +5 -5
  142. package/dist/client/bookings.mjs +3539 -269
  143. package/dist/client/{carousel-7ZVTBRMD.mjs → carousel-CPR5VWIP.mjs} +3 -3
  144. package/dist/client/{cart-Q6S6LZUO.mjs → cart-ZUX5BA7O.mjs} +6 -6
  145. package/dist/client/{checkout-5QJLDE4I.mjs → checkout-RULGBADZ.mjs} +6 -6
  146. package/dist/client/{chunk-CHAB5ACD.mjs → chunk-52I7BGEK.mjs} +2 -2
  147. package/dist/client/{chunk-CSZGLBYR.mjs → chunk-5ZEAZ33K.mjs} +1 -1
  148. package/dist/client/{chunk-ZF4XEWDM.mjs → chunk-BT6AEIKN.mjs} +1 -1
  149. package/dist/client/{chunk-RJHTCTCZ.mjs → chunk-HXPWP5EN.mjs} +268 -15
  150. package/dist/client/{chunk-5PQH4Y75.mjs → chunk-JWEYB4V6.mjs} +2 -2
  151. package/dist/client/{chunk-EQKYMX4N.mjs → chunk-RDJFCPY3.mjs} +158 -51
  152. package/dist/client/{chunk-SBBSMFFG.mjs → chunk-SYIJ5JO2.mjs} +1 -1
  153. package/dist/client/{chunk-WJFHDTYF.mjs → chunk-URQCZD5W.mjs} +5 -5
  154. package/dist/client/{chunk-U2EW7RSR.mjs → chunk-Z5OBQ5I4.mjs} +1 -1
  155. package/dist/client/{chunk-S3MKFGOG.mjs → chunk-ZE5G642V.mjs} +1 -1
  156. package/dist/client/client.mjs +2391 -673
  157. package/dist/client/{courseRegistration-VUG2JJDB.mjs → courseRegistration-QTUDC35T.mjs} +5 -5
  158. package/dist/client/{eventCalendar-E7D2LD4N.mjs → eventCalendar-Q7NS4XLD.mjs} +7 -7
  159. package/dist/client/{eventCombined-FUZ2Z3CS.mjs → eventCombined-QAO7VUO5.mjs} +7 -7
  160. package/dist/client/{eventDetails-QRITJAOW.mjs → eventDetails-WTNNU6Q3.mjs} +7 -7
  161. package/dist/client/{eventListing-INMQMJZ5.mjs → eventListing-5TA2ELDT.mjs} +7 -7
  162. package/dist/client/{eventRegistration-TOOJD4WU.mjs → eventRegistration-M6USZGRF.mjs} +7 -7
  163. package/dist/client/{form-BOWN7ZNQ.mjs → form-DGVGXLMH.mjs} +2 -2
  164. package/dist/client/{headerSection-HFQNZOUU.mjs → headerSection-O2AGMPCU.mjs} +3 -3
  165. package/dist/client/hooks.mjs +1636 -385
  166. package/dist/client/{locationMap-VUZGC7Y5.mjs → locationMap-EJRNRIKJ.mjs} +2 -2
  167. package/dist/client/{newsletterForm-X2XQTPCB.mjs → newsletterForm-7NTC2DTR.mjs} +2 -2
  168. package/dist/client/{productDetail-TA7D2G2B.mjs → productDetail-HH4LP53D.mjs} +6 -6
  169. package/dist/client/{productList-AZOLOZKM.mjs → productList-YVHYM2AF.mjs} +6 -6
  170. package/dist/client/rendering/client.mjs +2303 -1068
  171. package/dist/client/rendering/islands.mjs +19 -19
  172. package/dist/client/rendering.mjs +2587 -796
  173. package/dist/client/{shop-ZDLO7IIG.mjs → shop-UIFX7XRK.mjs} +6 -6
  174. package/dist/preview-next/before-render.mjs +40 -0
  175. package/dist/preview-next/client/runtime.mjs +5 -5
  176. package/dist/preview-next/middleware.mjs +40 -0
  177. package/dist/{sdk-runtime-CTWKNBDQ.mjs → sdk-runtime-ZENAOYMN.mjs} +6 -6
  178. package/dist/server/components.mjs +2028 -457
  179. package/dist/server/config-validation.mjs +1629 -377
  180. package/dist/server/config.mjs +1629 -377
  181. package/dist/server/data.mjs +1636 -385
  182. package/dist/server/index.mjs +42 -1
  183. package/dist/server/next.mjs +2215 -571
  184. package/dist/server/page-converter.mjs +2068 -884
  185. package/dist/server/prebuild.mjs +1 -1
  186. package/dist/server/rendering/server.mjs +2040 -469
  187. package/dist/server/rendering.mjs +2119 -475
  188. package/dist/server/routing.mjs +1711 -419
  189. package/dist/server/server.mjs +1718 -394
  190. package/dist/server/theme-bridge.mjs +1180 -101
  191. package/dist/server/theme.mjs +92 -1
  192. package/dist/styles/index.css +292 -36
  193. package/package.json +1 -1
  194. package/dist/SdkPreviewModeRuntime-RNVRHFFR.mjs +0 -8
@@ -3276,6 +3276,46 @@ var ENDPOINT_DEFINITIONS = {
3276
3276
  auth: "user",
3277
3277
  responseKind: "json"
3278
3278
  },
3279
+ listEntrySlotBlocks: {
3280
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
3281
+ method: "GET",
3282
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3283
+ auth: "user",
3284
+ responseKind: "json",
3285
+ errors: ["resource:not_found"]
3286
+ },
3287
+ listEntryPageContentSlots: {
3288
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots",
3289
+ method: "GET",
3290
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slots", "blocks"],
3291
+ auth: "user",
3292
+ responseKind: "json",
3293
+ errors: ["resource:not_found"]
3294
+ },
3295
+ createEntrySlotBlock: {
3296
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
3297
+ method: "POST",
3298
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3299
+ auth: "user",
3300
+ responseKind: "json",
3301
+ errors: ["validation:invalid_input", "resource:not_found"]
3302
+ },
3303
+ reorderEntrySlotBlocks: {
3304
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/reorder",
3305
+ method: "POST",
3306
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3307
+ auth: "user",
3308
+ responseKind: "json",
3309
+ errors: ["validation:invalid_input", "resource:not_found"]
3310
+ },
3311
+ deleteEntrySlotBlock: {
3312
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/{blockId}",
3313
+ method: "DELETE",
3314
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
3315
+ auth: "user",
3316
+ responseKind: "json",
3317
+ errors: ["resource:not_found"]
3318
+ },
3279
3319
  createBlock: {
3280
3320
  path: "/sites/{siteId}/pages/{pageId}/blocks",
3281
3321
  method: "POST",
@@ -7351,6 +7391,21 @@ var selectSourceSchema = z5.discriminatedUnion("kind", [
7351
7391
  function assertNeverSelectSource(value) {
7352
7392
  throw new Error(`Unhandled select source: ${JSON.stringify(value)}`);
7353
7393
  }
7394
+ var visibleWhenPredicateSchema = z5.object({
7395
+ field: z5.string().min(1),
7396
+ equals: z5.any().optional(),
7397
+ notEquals: z5.any().optional(),
7398
+ oneOf: z5.array(z5.any()).optional(),
7399
+ notIn: z5.array(z5.any()).optional(),
7400
+ minItems: z5.number().int().nonnegative().optional(),
7401
+ maxItems: z5.number().int().nonnegative().optional()
7402
+ });
7403
+ var visibleWhenSchema = z5.union([
7404
+ visibleWhenPredicateSchema,
7405
+ z5.object({
7406
+ allOf: z5.array(visibleWhenPredicateSchema).min(1)
7407
+ })
7408
+ ]);
7354
7409
  var uiSchema = z5.object({
7355
7410
  widget: z5.string().optional(),
7356
7411
  // Container/widget presets (used by Group/Repeater widgets themselves, not for widget selection)
@@ -7383,13 +7438,7 @@ var uiSchema = z5.object({
7383
7438
  showValue: z5.boolean().optional(),
7384
7439
  pattern: z5.string().optional(),
7385
7440
  placeholder: z5.string().optional(),
7386
- visibleWhen: z5.object({
7387
- field: z5.string().min(1),
7388
- equals: z5.any().optional(),
7389
- notEquals: z5.any().optional(),
7390
- oneOf: z5.array(z5.any()).optional(),
7391
- notIn: z5.array(z5.any()).optional()
7392
- }).optional(),
7441
+ visibleWhen: visibleWhenSchema.optional(),
7393
7442
  // Modal configuration for modal and group fields
7394
7443
  modalConfig: z5.object({
7395
7444
  buttonLabel: z5.string().optional(),
@@ -10303,6 +10352,7 @@ var eventListTreatmentValues = [
10303
10352
  ];
10304
10353
  var eyebrowTreatmentValues = [
10305
10354
  "plain",
10355
+ "accent",
10306
10356
  "pill",
10307
10357
  "accent-pill",
10308
10358
  "pill-bounce",
@@ -12160,9 +12210,9 @@ var _Vibrant = class _Vibrant2 {
12160
12210
  }
12161
12211
  image.remove();
12162
12212
  return res;
12163
- } catch (err2) {
12213
+ } catch (err3) {
12164
12214
  image.remove();
12165
- return Promise.reject(err2);
12215
+ return Promise.reject(err3);
12166
12216
  }
12167
12217
  }
12168
12218
  async getPalettes() {
@@ -12176,9 +12226,9 @@ var _Vibrant = class _Vibrant2 {
12176
12226
  const res = result1.palettes;
12177
12227
  image.remove();
12178
12228
  return res;
12179
- } catch (err2) {
12229
+ } catch (err3) {
12180
12230
  image.remove();
12181
- return Promise.reject(err2);
12231
+ return Promise.reject(err3);
12182
12232
  }
12183
12233
  }
12184
12234
  };
@@ -14641,7 +14691,8 @@ var STRUCTURAL_DECLARATIONS = [
14641
14691
  ["transition", "all 200ms ease-in-out"],
14642
14692
  ["display", "inline-flex"],
14643
14693
  ["align-items", "center"],
14644
- ["justify-content", "center"]
14694
+ ["justify-content", "center"],
14695
+ ["outline", "none"]
14645
14696
  ];
14646
14697
  function generateButtonCss(options) {
14647
14698
  const { themeId, theme, buttonSystem: providedButtonSystem } = options;
@@ -14671,6 +14722,7 @@ function variantChunks(variant, global, themeSizes, themeId, tokens, theme) {
14671
14722
  out.push(variantBaseRule(variant, variantId, global, themeId, tokens, theme));
14672
14723
  const hoverBg = variantHoverBackgroundRule(variant, variantId, global, themeId, tokens);
14673
14724
  if (hoverBg) out.push(hoverBg);
14725
+ out.push(variantFocusVisibleRule(variantId, themeId));
14674
14726
  const effects = variantEffectsCss(variant, themeId, tokens, theme);
14675
14727
  if (effects) out.push({ raw: effects });
14676
14728
  out.push(...variantDisabledRules(variantId, themeId));
@@ -14728,6 +14780,12 @@ function variantHoverBackgroundRule(variant, variantId, global, themeId, tokens)
14728
14780
  ["background-color", tokens.getColor(hoverToken)]
14729
14781
  ]);
14730
14782
  }
14783
+ function variantFocusVisibleRule(variantId, themeId) {
14784
+ return rule(`:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId)}:focus-visible`, [
14785
+ ["outline", "2px solid currentColor"],
14786
+ ["outline-offset", "3px"]
14787
+ ]);
14788
+ }
14731
14789
  function variantEffectsCss(variant, themeId, tokens, theme) {
14732
14790
  if (!variant.effects) return "";
14733
14791
  const elementConfig = {
@@ -15359,6 +15417,95 @@ var joyStamp = defineButtonPersonality({
15359
15417
  }
15360
15418
  });
15361
15419
 
15420
+ // ../theme-core/src/buttons/personalities/ornate-ritual.ts
15421
+ var ornateRitual = defineButtonPersonality({
15422
+ id: "ornate-ritual",
15423
+ name: "Ornate Ritual",
15424
+ description: "Ceremonial framed buttons with jewel-toned fills and quiet color-change hover states.",
15425
+ tags: { tone: "classic", energy: "vibrant", motion: "subtle", era: "organic" },
15426
+ buttonSystem: {
15427
+ global: {
15428
+ cornerStyle: "rounded",
15429
+ shadow: "none",
15430
+ textTransform: "uppercase",
15431
+ fontWeight: 600,
15432
+ borderWidth: 1,
15433
+ hoverTransform: "none",
15434
+ hoverColor: "none",
15435
+ letterSpacing: "loose"
15436
+ },
15437
+ sizes: {
15438
+ sm: { padding: "0.5625rem 1.25rem", fontSize: "text-xs" },
15439
+ md: { padding: "0.75rem 1.75rem", fontSize: "text-xs" },
15440
+ lg: { padding: "0.875rem 2.25rem", fontSize: "text-sm" },
15441
+ xl: { padding: "1rem 2.75rem", fontSize: "text-base" }
15442
+ },
15443
+ variants: [
15444
+ {
15445
+ id: "primary",
15446
+ name: "Primary",
15447
+ enabled: true,
15448
+ priority: 1,
15449
+ background: { type: "solid", colorToken: "primary" },
15450
+ textColorToken: "primaryForeground",
15451
+ borderRadius: "rounded-md",
15452
+ border: { widthClass: "border", colorToken: "primary" },
15453
+ shadow: { elevation: "none", softness: null, position: "bottom" },
15454
+ effects: {
15455
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "primary-100" } }],
15456
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
15457
+ }
15458
+ },
15459
+ {
15460
+ id: "secondary",
15461
+ name: "Secondary",
15462
+ enabled: true,
15463
+ priority: 2,
15464
+ background: { type: "solid", colorToken: "secondary" },
15465
+ textColorToken: "primaryForeground",
15466
+ borderRadius: "rounded-md",
15467
+ border: { widthClass: "border", colorToken: "primary" },
15468
+ shadow: { elevation: "none", softness: null, position: "bottom" },
15469
+ effects: {
15470
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
15471
+ }
15472
+ },
15473
+ {
15474
+ id: "outline",
15475
+ name: "Outline",
15476
+ enabled: true,
15477
+ priority: 3,
15478
+ background: { type: "transparent" },
15479
+ textColorToken: "primary",
15480
+ borderRadius: "rounded-md",
15481
+ border: { widthClass: "border", colorToken: "primary" },
15482
+ shadow: { elevation: "none", softness: null, position: "bottom" },
15483
+ effects: {
15484
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
15485
+ }
15486
+ },
15487
+ {
15488
+ id: "ghost",
15489
+ name: "Ghost",
15490
+ enabled: true,
15491
+ priority: 3,
15492
+ background: { type: "transparent" },
15493
+ textColorToken: "accent",
15494
+ borderRadius: "rounded-none",
15495
+ sizes: {
15496
+ sm: { padding: "0.375rem 0", fontSize: "text-xs" },
15497
+ md: { padding: "0.5rem 0", fontSize: "text-sm" },
15498
+ lg: { padding: "0.625rem 0", fontSize: "text-base" },
15499
+ xl: { padding: "0.75rem 0", fontSize: "text-lg" }
15500
+ },
15501
+ effects: {
15502
+ base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
15503
+ }
15504
+ }
15505
+ ]
15506
+ }
15507
+ });
15508
+
15362
15509
  // ../theme-core/src/buttons/personalities/pebble.ts
15363
15510
  var pebble = defineButtonPersonality({
15364
15511
  id: "pebble",
@@ -15632,7 +15779,8 @@ var buttonPersonalities = [
15632
15779
  inkStamp,
15633
15780
  brushedWash,
15634
15781
  showtimePill,
15635
- joyStamp
15782
+ joyStamp,
15783
+ ornateRitual
15636
15784
  ];
15637
15785
  var personalitiesById = new Map(
15638
15786
  buttonPersonalities.map((p) => [p.id, p])
@@ -16627,7 +16775,7 @@ function rgbColorValue(token) {
16627
16775
  if (alpha === void 0) {
16628
16776
  return `rgb(var(${cssVar}))`;
16629
16777
  }
16630
- return `rgba(var(${cssVar}), ${alpha})`;
16778
+ return `rgb(var(${cssVar}) / ${alpha})`;
16631
16779
  }
16632
16780
  function backgroundColorStyle(token) {
16633
16781
  return { backgroundColor: rgbColorValue(token) };
@@ -17756,6 +17904,28 @@ var warmDarkEmber = definePaletteVariant({
17756
17904
  { name: "border", hex: "#894e31" }
17757
17905
  ]
17758
17906
  });
17907
+ var warmDarkKirtanGold = definePaletteVariant({
17908
+ id: "warm-dark-kirtan-gold",
17909
+ name: "Warm Dark \u2014 Kirtan Gold",
17910
+ description: "Deep plum ground with pale gold primary, rose accent, and soft devotional text.",
17911
+ tags: { tone: "bold", energy: "calm", era: "editorial" },
17912
+ mode: "dark",
17913
+ colors: [
17914
+ { name: "primary", hex: "#ffcdb2" },
17915
+ { name: "secondary", hex: "#b5838d" },
17916
+ { name: "accent", hex: "#e5989b" },
17917
+ { name: "success", hex: "#8fbf8f" },
17918
+ { name: "warning", hex: "#f2b86b" },
17919
+ { name: "destructive", hex: "#d96b6b" },
17920
+ { name: "background", hex: "#403944" },
17921
+ { name: "surface", hex: "#403944" },
17922
+ { name: "surfaceAlt", hex: "#372f3b" },
17923
+ { name: "muted", hex: "#4d4550" },
17924
+ { name: "text", hex: "#e6d2d5" },
17925
+ { name: "primaryForeground", hex: "#403944" },
17926
+ { name: "border", hex: "#8d747a" }
17927
+ ]
17928
+ });
17759
17929
 
17760
17930
  // ../theme-core/src/palette/variants/index.ts
17761
17931
  var paletteVariants = [
@@ -17779,7 +17949,8 @@ var paletteVariants = [
17779
17949
  softNaturalWatercolor,
17780
17950
  softNaturalLilac,
17781
17951
  // Warm-dark family (dark mode)
17782
- warmDarkEmber
17952
+ warmDarkEmber,
17953
+ warmDarkKirtanGold
17783
17954
  ];
17784
17955
  var paletteVariantsById = new Map(
17785
17956
  paletteVariants.map((v) => [v.id, v])
@@ -19348,9 +19519,125 @@ function headerConfigurationKey(configuration) {
19348
19519
  function asFooterLookId(value) {
19349
19520
  return value;
19350
19521
  }
19351
- var guaranteedFallbackFooterLookId = asFooterLookId("footer-muted-grounding");
19522
+ function asFooterLayoutId(value) {
19523
+ return value;
19524
+ }
19525
+ function asFooterStyleId(value) {
19526
+ return value;
19527
+ }
19528
+ var guaranteedFallbackFooterLookId = asFooterLookId("footer-identity-quiet");
19529
+ var footerLayoutCatalog = defineExactCatalog()([
19530
+ {
19531
+ id: asFooterLayoutId("identity"),
19532
+ label: "Identity",
19533
+ description: "Logo, site text, address, and legal copy without relying on footer navigation."
19534
+ },
19535
+ {
19536
+ id: asFooterLayoutId("centered"),
19537
+ label: "Centered",
19538
+ description: "A calm centered stack for identity, short copy, and optional compact navigation.",
19539
+ maxRecommendedNavDensity: "sparse"
19540
+ },
19541
+ {
19542
+ id: asFooterLayoutId("split"),
19543
+ label: "Split",
19544
+ description: "Navigation and brand signoff separated into a wider split footer.",
19545
+ requiresFooterNav: true,
19546
+ maxRecommendedNavDensity: "balanced"
19547
+ },
19548
+ {
19549
+ id: asFooterLayoutId("columns"),
19550
+ label: "Columns",
19551
+ description: "Grouped footer navigation columns with a supporting bottom line.",
19552
+ requiresFooterNav: true,
19553
+ requiresFooterNavGroups: true
19554
+ }
19555
+ ]);
19556
+ var footerStyleCatalog = defineExactCatalog()([
19557
+ {
19558
+ id: asFooterStyleId("quiet"),
19559
+ label: "Quiet",
19560
+ description: "Lightweight, practical footer treatment."
19561
+ },
19562
+ {
19563
+ id: asFooterStyleId("calm"),
19564
+ label: "Calm",
19565
+ description: "Soft centered treatment with restrained dividers."
19566
+ },
19567
+ {
19568
+ id: asFooterStyleId("editorial"),
19569
+ label: "Editorial",
19570
+ description: "Text-forward treatment with fine-line structure."
19571
+ },
19572
+ {
19573
+ id: asFooterStyleId("brand-band"),
19574
+ label: "Brand band",
19575
+ description: "High-contrast brand treatment with a stronger bottom bar."
19576
+ }
19577
+ ]);
19578
+ var footerLayoutsById = new Map(
19579
+ footerLayoutCatalog.map((layout) => [layout.id, layout])
19580
+ );
19581
+ var footerStylesById = new Map(
19582
+ footerStyleCatalog.map((style) => [style.id, style])
19583
+ );
19584
+ function identityQuietFooter(theme) {
19585
+ return {
19586
+ ...theme.footer,
19587
+ variant: "simple",
19588
+ maxWidth: "container",
19589
+ background: {
19590
+ type: "color",
19591
+ color: "surface"
19592
+ },
19593
+ navStyle: "minimal",
19594
+ navWeight: "regular",
19595
+ navColor: "text",
19596
+ navLinkStyle: {
19597
+ typography: "body",
19598
+ fontWeight: "regular",
19599
+ textTransform: "none",
19600
+ italic: false,
19601
+ colorToken: "text",
19602
+ hoverColorToken: "primary",
19603
+ padding: "none",
19604
+ borderRadius: "none"
19605
+ },
19606
+ navLayout: {
19607
+ layout: "inline-wrap",
19608
+ align: "start",
19609
+ gapX: "default",
19610
+ gapY: "tight"
19611
+ },
19612
+ logo: {
19613
+ showLogo: true,
19614
+ showLogoText: true,
19615
+ placement: "left",
19616
+ size: "sm",
19617
+ align: "start"
19618
+ },
19619
+ bottomBar: {
19620
+ enabled: false,
19621
+ fullBleed: false,
19622
+ textAlign: "left",
19623
+ paddingX: "default",
19624
+ paddingY: "compact",
19625
+ borderTop: {
19626
+ width: "none"
19627
+ }
19628
+ }
19629
+ };
19630
+ }
19352
19631
  function mutedGroundingFooter(theme) {
19353
- return theme.footer;
19632
+ return {
19633
+ ...identityQuietFooter(theme),
19634
+ background: theme.footer.background,
19635
+ navStyle: theme.footer.navStyle,
19636
+ navColor: theme.footer.navColor,
19637
+ navWeight: theme.footer.navWeight,
19638
+ navLinkStyle: theme.footer.navLinkStyle,
19639
+ bottomTextLinkStyle: theme.footer.bottomTextLinkStyle
19640
+ };
19354
19641
  }
19355
19642
  function brandTwoBandFooter(theme) {
19356
19643
  return {
@@ -19455,6 +19742,53 @@ function centeredCalmFooter(theme) {
19455
19742
  }
19456
19743
  };
19457
19744
  }
19745
+ function splitEditorialFooter(theme) {
19746
+ return {
19747
+ ...theme.footer,
19748
+ variant: "split",
19749
+ maxWidth: "container",
19750
+ background: {
19751
+ type: "color",
19752
+ color: "surface"
19753
+ },
19754
+ navStyle: "minimal",
19755
+ navWeight: "regular",
19756
+ navColor: "text",
19757
+ navLinkStyle: {
19758
+ typography: "body",
19759
+ fontWeight: "regular",
19760
+ textTransform: "none",
19761
+ italic: false,
19762
+ colorToken: "text",
19763
+ hoverColorToken: "primary",
19764
+ padding: "none",
19765
+ borderRadius: "none"
19766
+ },
19767
+ navLayout: {
19768
+ layout: "inline-wrap",
19769
+ align: "start",
19770
+ gapX: "relaxed",
19771
+ gapY: "tight"
19772
+ },
19773
+ logo: {
19774
+ showLogo: true,
19775
+ showLogoText: true,
19776
+ placement: "right",
19777
+ size: "sm",
19778
+ align: "end"
19779
+ },
19780
+ bottomBar: {
19781
+ enabled: true,
19782
+ fullBleed: false,
19783
+ textAlign: "left",
19784
+ paddingX: "default",
19785
+ paddingY: "compact",
19786
+ borderTop: {
19787
+ width: "thin"
19788
+ }
19789
+ }
19790
+ };
19791
+ }
19458
19792
  function editorialColumnsFooter(theme) {
19459
19793
  return {
19460
19794
  ...theme.footer,
@@ -19497,25 +19831,47 @@ function editorialColumnsFooter(theme) {
19497
19831
  };
19498
19832
  }
19499
19833
  var footerLookCatalog = defineExactCatalog()([
19834
+ {
19835
+ id: asFooterLookId("footer-identity-quiet"),
19836
+ label: "Identity footer",
19837
+ layoutId: asFooterLayoutId("identity"),
19838
+ styleId: asFooterStyleId("quiet"),
19839
+ compile: identityQuietFooter
19840
+ },
19500
19841
  {
19501
19842
  id: asFooterLookId("footer-muted-grounding"),
19502
19843
  label: "Muted grounding footer",
19844
+ layoutId: asFooterLayoutId("identity"),
19845
+ styleId: asFooterStyleId("quiet"),
19846
+ hiddenFromLayoutStyleControls: true,
19503
19847
  compile: mutedGroundingFooter
19504
19848
  },
19505
19849
  {
19506
19850
  id: asFooterLookId("footer-centered-calm"),
19507
19851
  label: "Centered calm footer",
19852
+ layoutId: asFooterLayoutId("centered"),
19853
+ styleId: asFooterStyleId("calm"),
19508
19854
  compile: centeredCalmFooter
19509
19855
  },
19856
+ {
19857
+ id: asFooterLookId("footer-split-editorial"),
19858
+ label: "Split editorial footer",
19859
+ layoutId: asFooterLayoutId("split"),
19860
+ styleId: asFooterStyleId("editorial"),
19861
+ compile: splitEditorialFooter
19862
+ },
19510
19863
  {
19511
19864
  id: asFooterLookId("footer-editorial-columns"),
19512
19865
  label: "Editorial columns footer",
19866
+ layoutId: asFooterLayoutId("columns"),
19867
+ styleId: asFooterStyleId("editorial"),
19513
19868
  compile: editorialColumnsFooter
19514
19869
  },
19515
19870
  {
19516
19871
  id: asFooterLookId("site-footer-brand-two-band"),
19517
19872
  label: "Two-band brand footer",
19518
- maxRecommendedNavDensity: "balanced",
19873
+ layoutId: asFooterLayoutId("split"),
19874
+ styleId: asFooterStyleId("brand-band"),
19519
19875
  allowedContentPresence: ["default-footer", "default-and-blocks"],
19520
19876
  compile: brandTwoBandFooter
19521
19877
  }
@@ -19718,6 +20074,30 @@ var luxeContrastTypography = {
19718
20074
  },
19719
20075
  scale: "spacious"
19720
20076
  };
20077
+ var kirtanOrnateTypography = {
20078
+ body: {
20079
+ family: "Jost, system-ui, sans-serif",
20080
+ size: "md",
20081
+ weight: "regular",
20082
+ lineHeight: "relaxed",
20083
+ letterSpacing: "normal"
20084
+ },
20085
+ headings: {
20086
+ default: {
20087
+ family: "Marcellus, Georgia, serif",
20088
+ weight: "regular",
20089
+ lineHeight: "normal",
20090
+ letterSpacing: "normal",
20091
+ colorToken: "primary",
20092
+ italic: null,
20093
+ case: null
20094
+ },
20095
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
20096
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
20097
+ h3: { size: "md", weight: "regular", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
20098
+ },
20099
+ scale: "spacious"
20100
+ };
19721
20101
  var boldDisplayTypography = {
19722
20102
  body: {
19723
20103
  family: "Manrope, system-ui, sans-serif",
@@ -19752,16 +20132,16 @@ var originalJoyTypography = {
19752
20132
  },
19753
20133
  headings: {
19754
20134
  default: {
19755
- family: "Bricolage Grotesque, system-ui, sans-serif",
19756
- weight: "bold",
20135
+ family: "Lobster, cursive",
20136
+ weight: "regular",
19757
20137
  lineHeight: "normal",
19758
- letterSpacing: "tight",
20138
+ letterSpacing: "normal",
19759
20139
  italic: null,
19760
20140
  case: null
19761
20141
  },
19762
- h1: { size: "2xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
19763
- h2: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
19764
- h3: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null }
20142
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
20143
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
20144
+ h3: { size: "lg", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null }
19765
20145
  },
19766
20146
  scale: "balanced"
19767
20147
  };
@@ -19826,6 +20206,32 @@ var typographyPresets = [
19826
20206
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
19827
20207
  typography: luxeContrastTypography
19828
20208
  }),
20209
+ defineTypographyPreset({
20210
+ id: "typography-preset:kirtan-ornate",
20211
+ name: "Kirtan Ornate",
20212
+ description: "Marcellus devotional headings over a refined Jost body, matching dark ceremonial layouts.",
20213
+ defaultFonts: { body: "Jost, system-ui, sans-serif", heading: "Marcellus, Georgia, serif" },
20214
+ recommendedFonts: {
20215
+ body: ["Jost", "Manrope", "Inter"],
20216
+ heading: ["Marcellus", "Cormorant Garamond", "Playfair Display"]
20217
+ },
20218
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
20219
+ typography: kirtanOrnateTypography,
20220
+ heroTypography: {
20221
+ headlineSize: "6xl",
20222
+ headlineLineHeight: "normal",
20223
+ subheadlineSize: "xl",
20224
+ subheadlineLineHeight: "relaxed",
20225
+ microHeadlineSize: "5xl",
20226
+ microHeadlineLineHeight: "normal",
20227
+ microSubheadlineSize: "lg",
20228
+ microSubheadlineLineHeight: "relaxed",
20229
+ responsive: {
20230
+ tablet: { headlineSize: "5xl" },
20231
+ mobile: { headlineSize: "4xl", subheadlineSize: "lg" }
20232
+ }
20233
+ }
20234
+ }),
19829
20235
  defineTypographyPreset({
19830
20236
  id: "typography-preset:bold-display",
19831
20237
  name: "Bold Display",
@@ -19855,11 +20261,11 @@ var typographyPresets = [
19855
20261
  defineTypographyPreset({
19856
20262
  id: "typography-preset:original-joy",
19857
20263
  name: "Original Joy",
19858
- description: "Bold Bricolage Grotesque display headings over a clean DM Sans body, editorial and warm.",
19859
- defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Bricolage Grotesque, system-ui, sans-serif" },
20264
+ description: "Lobster display headings over a clean DM Sans body, expressive and warm.",
20265
+ defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Lobster, cursive" },
19860
20266
  recommendedFonts: {
19861
20267
  body: ["DM Sans", "Inter", "Manrope"],
19862
- heading: ["Bricolage Grotesque", "Space Grotesk", "Archivo"]
20268
+ heading: ["Lobster", "Bricolage Grotesque", "Space Grotesk"]
19863
20269
  },
19864
20270
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
19865
20271
  typography: originalJoyTypography,
@@ -19883,6 +20289,319 @@ var typographyPresetsById = new Map(
19883
20289
  typographyPresets.map((preset2) => [preset2.id, preset2])
19884
20290
  );
19885
20291
 
20292
+ // ../theme-core/src/site-styles/designState.ts
20293
+ import { z as z27 } from "zod";
20294
+ var themeV2DesignStateSchemaVersion = 1;
20295
+ var designResolutionPolicySchema = z27.enum(["generated", "user", "admin", "sdk"]);
20296
+ var runtimeStyleFieldNameSchema = z27.enum(themeV2RuntimeStyleFieldNames);
20297
+ var nonEmptyRuntimeStyleFieldNamesSchema = z27.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
20298
+ fields3[0],
20299
+ ...fields3.slice(1)
20300
+ ]);
20301
+ var heroLegibilityStrategySchema = z27.enum([
20302
+ "none",
20303
+ "scrim-gradient",
20304
+ "solid-panel"
20305
+ ]);
20306
+ var heroCompositionIntentSchema = z27.enum([
20307
+ "center",
20308
+ "bottom-left"
20309
+ ]);
20310
+ var heroTypographyScaleIntentSchema = z27.enum([
20311
+ "quiet",
20312
+ "editorial",
20313
+ "display",
20314
+ "poster"
20315
+ ]);
20316
+ var sectionHeightIntentSchema = z27.enum([
20317
+ "default",
20318
+ "banner",
20319
+ "hero",
20320
+ "immersive"
20321
+ ]);
20322
+ var imageSurfaceTreatmentIntensitySchema = z27.enum(["soft", "balanced", "strong"]);
20323
+ var imageSurfaceMotionSchema = z27.enum(["static", "fixed-frame"]);
20324
+ var imageSurfaceTreatmentSchema = z27.discriminatedUnion("kind", [
20325
+ z27.object({ kind: z27.literal("none") }).strict(),
20326
+ z27.object({
20327
+ kind: z27.literal("brand-scrim"),
20328
+ token: z27.enum(["primary", "secondary", "accent"]),
20329
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
20330
+ }).strict(),
20331
+ z27.object({
20332
+ kind: z27.literal("brand-wash"),
20333
+ token: z27.enum(["primary", "secondary", "accent"]),
20334
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
20335
+ }).strict(),
20336
+ z27.object({
20337
+ kind: z27.literal("neutral-scrim"),
20338
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
20339
+ }).strict(),
20340
+ z27.object({
20341
+ kind: z27.literal("neutral-wash"),
20342
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
20343
+ }).strict(),
20344
+ z27.object({
20345
+ kind: z27.literal("solid-panel"),
20346
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
20347
+ }).strict()
20348
+ ]);
20349
+ var testimonialCardTreatmentSchema = z27.enum(["default", "accent-quote"]);
20350
+ var tileTreatmentSchema = z27.enum(tileTreatmentValues);
20351
+ var eventListTreatmentSchema = z27.enum(eventListTreatmentValues);
20352
+ var eyebrowTreatmentSchema = z27.enum(eyebrowTreatmentValues);
20353
+ function uniqueNonEmpty(values) {
20354
+ const uniqueValues = [...new Set(values)];
20355
+ const firstValue = uniqueValues[0];
20356
+ if (!firstValue) {
20357
+ throw new Error("Expected at least one Theme V2 design state option.");
20358
+ }
20359
+ return [firstValue, ...uniqueValues.slice(1)];
20360
+ }
20361
+ var userPanelTreatments = uniqueNonEmpty(
20362
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
20363
+ );
20364
+ var userFlushTreatments = uniqueNonEmpty(
20365
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
20366
+ );
20367
+ var userFlushBleeds = uniqueNonEmpty(
20368
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
20369
+ );
20370
+ var contentFrameIntentSchema = z27.discriminatedUnion("kind", [
20371
+ z27.object({ kind: z27.literal("plain") }).strict(),
20372
+ z27.object({
20373
+ kind: z27.literal("panel"),
20374
+ treatment: z27.enum(userPanelTreatments)
20375
+ }).strict(),
20376
+ z27.object({
20377
+ kind: z27.literal("flush-panel"),
20378
+ treatment: z27.enum(userFlushTreatments),
20379
+ bleed: z27.enum(userFlushBleeds)
20380
+ }).strict()
20381
+ ]);
20382
+ var blockDesignPlanSchema = z27.object({
20383
+ blockId: z27.string().min(1).transform(asDesignBlockId),
20384
+ blockKind: z27.string().min(1),
20385
+ purpose: z27.string().min(1),
20386
+ sectionSurface: z27.enum(userDesignOptionCatalog.sectionSurfaces),
20387
+ contentFrame: contentFrameIntentSchema,
20388
+ itemSurface: z27.enum(userDesignOptionCatalog.itemSurfaces),
20389
+ transitionAfter: z27.enum(userDesignOptionCatalog.transitions),
20390
+ emphasis: z27.enum(userDesignOptionCatalog.emphases),
20391
+ sectionHeight: sectionHeightIntentSchema.optional(),
20392
+ heroLegibility: heroLegibilityStrategySchema.optional(),
20393
+ heroComposition: heroCompositionIntentSchema.optional(),
20394
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
20395
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
20396
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
20397
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
20398
+ tileTreatment: tileTreatmentSchema.optional(),
20399
+ eventListTreatment: eventListTreatmentSchema.optional(),
20400
+ eyebrowTreatment: eyebrowTreatmentSchema.optional()
20401
+ }).strict();
20402
+ var styleAuthoritySchema = z27.discriminatedUnion("kind", [
20403
+ z27.object({
20404
+ kind: z27.literal("theme-v2"),
20405
+ source: designResolutionPolicySchema,
20406
+ siteStyleId: z27.string().min(1).transform(asSiteStyleId),
20407
+ templateId: z27.string().min(1).transform(asDesignSystemTemplateId),
20408
+ templateVersion: z27.number().int().nonnegative(),
20409
+ resolverVersion: z27.number().int().nonnegative()
20410
+ }).strict(),
20411
+ z27.object({
20412
+ kind: z27.literal("legacy-raw"),
20413
+ reason: z27.enum(["pre-theme-v2", "manual-runtime-fields"])
20414
+ }).strict(),
20415
+ z27.object({
20416
+ kind: z27.literal("advanced-detached"),
20417
+ reason: z27.literal("detached-custom-runtime-fields")
20418
+ }).strict()
20419
+ ]);
20420
+ var blockRuntimeStyleAuthoritySchema = z27.object({
20421
+ unit: z27.literal("block-runtime-fields"),
20422
+ blockId: z27.string().min(1).transform(asDesignBlockId),
20423
+ fields: nonEmptyRuntimeStyleFieldNamesSchema,
20424
+ authority: styleAuthoritySchema
20425
+ }).strict();
20426
+ var persistedPageDesignStateV1Schema = z27.object({
20427
+ schemaVersion: z27.literal(themeV2DesignStateSchemaVersion),
20428
+ siteStyleId: z27.string().min(1).transform(asSiteStyleId),
20429
+ templateId: z27.string().min(1).transform(asDesignSystemTemplateId),
20430
+ templateVersion: z27.number().int().nonnegative(),
20431
+ resolverVersion: z27.number().int().nonnegative(),
20432
+ rhythmPresetId: z27.string().min(1),
20433
+ blocks: z27.array(blockDesignPlanSchema),
20434
+ styleAuthorities: z27.array(blockRuntimeStyleAuthoritySchema)
20435
+ }).strict();
20436
+
20437
+ // ../theme-core/src/site-styles/runtimeCompiler.ts
20438
+ function defineDesignRuntimeRules(rules) {
20439
+ return rules;
20440
+ }
20441
+ function defineComponentRuntimeRules(rules) {
20442
+ return rules;
20443
+ }
20444
+ var defaultDesignRuntimeRules = defineDesignRuntimeRules({
20445
+ sectionSurfaces: {
20446
+ base: {},
20447
+ "muted-band": {
20448
+ background: {
20449
+ type: "color",
20450
+ color: "muted"
20451
+ }
20452
+ },
20453
+ "accent-band": {
20454
+ background: {
20455
+ type: "color",
20456
+ color: "primary"
20457
+ }
20458
+ },
20459
+ "brand-depth-band": {
20460
+ background: {
20461
+ type: "color",
20462
+ color: "primary-800"
20463
+ }
20464
+ },
20465
+ "hero-image": {
20466
+ background: {
20467
+ type: "image",
20468
+ opacity: 1,
20469
+ position: "center center",
20470
+ ...uniformSectionForeground("text")
20471
+ }
20472
+ }
20473
+ },
20474
+ heroLegibility: {
20475
+ "scrim-gradient": {
20476
+ type: "gradient",
20477
+ gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
20478
+ opacity: 1
20479
+ },
20480
+ "solid-panel": {
20481
+ type: "color",
20482
+ color: "surface",
20483
+ opacity: 0.88
20484
+ }
20485
+ },
20486
+ transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
20487
+ });
20488
+ var defaultComponentRuntimeRules = defineComponentRuntimeRules({
20489
+ panelFrames: {
20490
+ inset: {
20491
+ spacing: "comfortable",
20492
+ rounded: "xl",
20493
+ raised: false,
20494
+ background: {
20495
+ type: "color",
20496
+ color: "surfaceAlt",
20497
+ textColor: "text"
20498
+ }
20499
+ },
20500
+ raised: {
20501
+ spacing: "comfortable",
20502
+ rounded: "xl",
20503
+ raised: true,
20504
+ background: {
20505
+ type: "color",
20506
+ color: "surfaceAlt",
20507
+ textColor: "text"
20508
+ }
20509
+ },
20510
+ editorial: {
20511
+ spacing: "medium",
20512
+ rounded: "xl",
20513
+ raised: false,
20514
+ background: {
20515
+ type: "color",
20516
+ color: "surface",
20517
+ textColor: "text"
20518
+ }
20519
+ }
20520
+ },
20521
+ flushFrames: {
20522
+ "media-panel": {
20523
+ fullWidth: true,
20524
+ spacing: "none",
20525
+ rounded: "none",
20526
+ raised: false
20527
+ }
20528
+ },
20529
+ itemSurfaces: {
20530
+ none: null,
20531
+ default: {
20532
+ spacing: "medium",
20533
+ rounded: "lg",
20534
+ raised: false
20535
+ },
20536
+ flat: {
20537
+ spacing: "medium",
20538
+ rounded: "lg",
20539
+ raised: false
20540
+ },
20541
+ outlined: {
20542
+ spacing: "medium",
20543
+ rounded: "lg",
20544
+ raised: false,
20545
+ border: {
20546
+ enabled: true,
20547
+ width: "1",
20548
+ colorToken: "border"
20549
+ }
20550
+ },
20551
+ raised: {
20552
+ spacing: "medium",
20553
+ rounded: "xl",
20554
+ raised: true
20555
+ },
20556
+ inset: {
20557
+ treatment: "soft-panel",
20558
+ spacing: "comfortable",
20559
+ rounded: "xl",
20560
+ raised: false,
20561
+ border: {
20562
+ enabled: false
20563
+ },
20564
+ background: {
20565
+ type: "color",
20566
+ color: "surfaceAlt",
20567
+ textColor: "text"
20568
+ }
20569
+ },
20570
+ editorial: {
20571
+ // Boxless open column with a short rule on top; the visual treatment
20572
+ // lives in blocks-static/card-treatments.css.
20573
+ treatment: "editorial-rule",
20574
+ spacing: "none",
20575
+ rounded: "none",
20576
+ raised: false,
20577
+ border: {
20578
+ enabled: false
20579
+ }
20580
+ },
20581
+ "color-blocked": {
20582
+ // Bold, flat colour-blocked cards. The per-card background colour cycle
20583
+ // (by position) and staggered offset live in
20584
+ // blocks-static/card-treatments.css; here we set the shared shape:
20585
+ // generous padding, large radius, no border, flat (no shadow).
20586
+ treatment: "color-blocked",
20587
+ spacing: "spacious",
20588
+ rounded: "2xl",
20589
+ raised: false,
20590
+ border: {
20591
+ enabled: false
20592
+ }
20593
+ }
20594
+ }
20595
+ });
20596
+ function uniformSectionForeground(token) {
20597
+ return {
20598
+ textColor: token,
20599
+ headingColor: token,
20600
+ linkColor: token,
20601
+ supportingColor: token
20602
+ };
20603
+ }
20604
+
19886
20605
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
19887
20606
  var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
19888
20607
  var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
@@ -19901,6 +20620,7 @@ var curatedSiteStyleIdValues = [
19901
20620
  SOFT_EARTH_SITE_STYLE_ID_VALUE,
19902
20621
  "site-style:bold-launch",
19903
20622
  "site-style:south-west-twerk-school",
20623
+ "site-style:kirtan-ornate",
19904
20624
  "site-style:original-joy"
19905
20625
  ];
19906
20626
  var quietBudget = {
@@ -19927,6 +20647,50 @@ var expressiveBudget = {
19927
20647
  mediaDensity: "high",
19928
20648
  decorativeRepetition: "medium"
19929
20649
  };
20650
+ var kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
20651
+ ...defaultDesignRuntimeRules,
20652
+ defaultEyebrowTreatment: "accent",
20653
+ sectionSurfaces: {
20654
+ ...defaultDesignRuntimeRules.sectionSurfaces,
20655
+ "muted-band": {
20656
+ background: {
20657
+ type: "color",
20658
+ color: "muted"
20659
+ },
20660
+ foreground: {
20661
+ textColor: "text",
20662
+ headingColor: "primary",
20663
+ linkColor: "primary",
20664
+ supportingColor: "text"
20665
+ }
20666
+ },
20667
+ "brand-depth-band": {
20668
+ background: {
20669
+ type: "color",
20670
+ color: "primary-800"
20671
+ },
20672
+ foreground: {
20673
+ textColor: "text",
20674
+ headingColor: "primary",
20675
+ linkColor: "primary",
20676
+ supportingColor: "text"
20677
+ }
20678
+ },
20679
+ "hero-image": {
20680
+ background: {
20681
+ type: "image",
20682
+ opacity: 1,
20683
+ position: "center center"
20684
+ },
20685
+ foreground: {
20686
+ textColor: "text",
20687
+ headingColor: "primary",
20688
+ linkColor: "primary",
20689
+ supportingColor: "text"
20690
+ }
20691
+ }
20692
+ }
20693
+ });
19930
20694
  var expressiveUnderlineInputs = {
19931
20695
  base: {
19932
20696
  background: { type: "transparent" },
@@ -19964,6 +20728,43 @@ var expressiveUnderlineInputs = {
19964
20728
  opacity: 0.6
19965
20729
  }
19966
20730
  };
20731
+ var ornateDarkInputs = {
20732
+ base: {
20733
+ background: { type: "solid", colorToken: "surfaceAlt" },
20734
+ textColorToken: "text",
20735
+ border: {
20736
+ widthClass: "border",
20737
+ colorToken: "primary/45",
20738
+ style: "all"
20739
+ },
20740
+ corners: "square",
20741
+ shadow: null,
20742
+ spacing: "medium",
20743
+ fontSize: "base"
20744
+ },
20745
+ label: {
20746
+ textColorToken: "primary",
20747
+ fontWeight: "semibold",
20748
+ fontSize: "xs",
20749
+ textTransform: "uppercase",
20750
+ letterSpacing: "wider",
20751
+ opacity: 1
20752
+ },
20753
+ focus: {
20754
+ ringColorToken: "primary/18",
20755
+ ringWidth: "2",
20756
+ borderColorToken: "primary/70"
20757
+ },
20758
+ error: {
20759
+ borderColorToken: "destructive",
20760
+ textColorToken: "destructive"
20761
+ },
20762
+ disabled: {
20763
+ backgroundColorToken: "muted",
20764
+ textColorToken: "mutedText",
20765
+ opacity: 0.6
20766
+ }
20767
+ };
19967
20768
  function uniqueContentFrameKinds() {
19968
20769
  const kinds = [
19969
20770
  ...new Set(
@@ -20021,6 +20822,7 @@ function defineCuratedSiteStyle(input) {
20021
20822
  // clean/minimal styles default to none.
20022
20823
  headingDecoration: input.headingDecoration ?? noHeadingDecoration,
20023
20824
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
20825
+ ...input.designRuntimeRules ? { designRuntimeRules: input.designRuntimeRules } : {},
20024
20826
  ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
20025
20827
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
20026
20828
  defaultHeaderSelection: input.defaultHeaderSelection ? {
@@ -20971,6 +21773,80 @@ var curatedSiteStyles = [
20971
21773
  paletteChoice("high-contrast-ink")
20972
21774
  ]
20973
21775
  }),
21776
+ defineCuratedSiteStyle({
21777
+ id: "site-style:kirtan-ornate",
21778
+ name: "Kirtan Ornate",
21779
+ headingDecoration: { family: "short-center-rule", colorToken: "accent" },
21780
+ description: "Ceremonial, jewel-toned, and devotional: ornate frames, warm contrast, and composed rhythm for intimate music gatherings.",
21781
+ generationBrief: "Use a deep plum ground with pale gold as the main brand color, rose accent details, cream text, spacious split hero sections, devotional editorial headings, compact event lists, and framed conversion sections. The mood should feel soulful and ceremonial, not gothic or theatrical.",
21782
+ selectionKeywordRules: [
21783
+ { kind: "word", value: "kirtan" },
21784
+ { kind: "word", value: "chanting" },
21785
+ { kind: "word", value: "ceremony" },
21786
+ { kind: "word", value: "devotional" }
21787
+ ],
21788
+ tokenRecipes: {
21789
+ palette: "brand-led",
21790
+ contrast: "strong",
21791
+ radius: "soft",
21792
+ shadow: "subtle",
21793
+ typography: "serif-editorial",
21794
+ spacing: "airy",
21795
+ motion: "subtle"
21796
+ },
21797
+ compositionBudget: expressiveBudget,
21798
+ typographyPresetChoices: [
21799
+ typographyChoice("typography-preset:kirtan-ornate"),
21800
+ typographyChoice("typography-preset:luxe-contrast"),
21801
+ typographyChoice("typography-preset:editorial-serif")
21802
+ ],
21803
+ defaultTypographyPresetId: "typography-preset:kirtan-ornate",
21804
+ themeOverrides: {
21805
+ accordions: warmInsetAccordionSystem,
21806
+ cards: originalJoyCardSystem,
21807
+ testimonialQuote: serifDisplayQuote,
21808
+ bodyText: {
21809
+ intro: {
21810
+ paragraphSize: "editorial",
21811
+ headingSize: "editorial"
21812
+ }
21813
+ },
21814
+ inputs: ornateDarkInputs
21815
+ },
21816
+ designRuntimeRules: kirtanOrnateDesignRuntimeRules,
21817
+ recommendedAppearancePresetIds: [
21818
+ "hero-brand-scrim-fixed-frame",
21819
+ "media-text-quiet-story",
21820
+ "events-lined-panel",
21821
+ "schedule-details-brand-depth",
21822
+ "testimonials-statement-cards",
21823
+ "contact-form-panel"
21824
+ ],
21825
+ defaultHeaderSelection: { layoutId: "floating", styleId: "minimal-surface" },
21826
+ recommendedHeaderLayoutChoices: [headerLayoutChoice("floating")],
21827
+ recommendedHeaderStyleChoicesByLayout: {
21828
+ floating: [
21829
+ headerStyleChoice("minimal-surface"),
21830
+ headerStyleChoice("split-glass"),
21831
+ headerStyleChoice("glass")
21832
+ ]
21833
+ },
21834
+ recommendedHeaderLookIds: ["minimal-transparent"],
21835
+ recommendedFooterLookIds: [
21836
+ "site-footer-brand-two-band",
21837
+ "footer-muted-grounding"
21838
+ ],
21839
+ buttonPersonalityChoices: [
21840
+ buttonChoice("ornate-ritual"),
21841
+ buttonChoice("joy-stamp"),
21842
+ buttonChoice("ink-stamp")
21843
+ ],
21844
+ paletteVariantChoices: [
21845
+ paletteChoice("warm-dark-kirtan-gold"),
21846
+ paletteChoice("warm-dark-ember"),
21847
+ paletteChoice("brand-led-burgundy-gold")
21848
+ ]
21849
+ }),
20974
21850
  defineCuratedSiteStyle({
20975
21851
  id: "site-style:original-joy",
20976
21852
  name: "Original Joy",
@@ -21077,319 +21953,6 @@ var pageFlowPresets = [
21077
21953
  }
21078
21954
  ];
21079
21955
 
21080
- // ../theme-core/src/site-styles/designState.ts
21081
- import { z as z27 } from "zod";
21082
- var themeV2DesignStateSchemaVersion = 1;
21083
- var designResolutionPolicySchema = z27.enum(["generated", "user", "admin", "sdk"]);
21084
- var runtimeStyleFieldNameSchema = z27.enum(themeV2RuntimeStyleFieldNames);
21085
- var nonEmptyRuntimeStyleFieldNamesSchema = z27.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
21086
- fields3[0],
21087
- ...fields3.slice(1)
21088
- ]);
21089
- var heroLegibilityStrategySchema = z27.enum([
21090
- "none",
21091
- "scrim-gradient",
21092
- "solid-panel"
21093
- ]);
21094
- var heroCompositionIntentSchema = z27.enum([
21095
- "center",
21096
- "bottom-left"
21097
- ]);
21098
- var heroTypographyScaleIntentSchema = z27.enum([
21099
- "quiet",
21100
- "editorial",
21101
- "display",
21102
- "poster"
21103
- ]);
21104
- var sectionHeightIntentSchema = z27.enum([
21105
- "default",
21106
- "banner",
21107
- "hero",
21108
- "immersive"
21109
- ]);
21110
- var imageSurfaceTreatmentIntensitySchema = z27.enum(["soft", "balanced", "strong"]);
21111
- var imageSurfaceMotionSchema = z27.enum(["static", "fixed-frame"]);
21112
- var imageSurfaceTreatmentSchema = z27.discriminatedUnion("kind", [
21113
- z27.object({ kind: z27.literal("none") }).strict(),
21114
- z27.object({
21115
- kind: z27.literal("brand-scrim"),
21116
- token: z27.enum(["primary", "secondary", "accent"]),
21117
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
21118
- }).strict(),
21119
- z27.object({
21120
- kind: z27.literal("brand-wash"),
21121
- token: z27.enum(["primary", "secondary", "accent"]),
21122
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
21123
- }).strict(),
21124
- z27.object({
21125
- kind: z27.literal("neutral-scrim"),
21126
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
21127
- }).strict(),
21128
- z27.object({
21129
- kind: z27.literal("neutral-wash"),
21130
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
21131
- }).strict(),
21132
- z27.object({
21133
- kind: z27.literal("solid-panel"),
21134
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
21135
- }).strict()
21136
- ]);
21137
- var testimonialCardTreatmentSchema = z27.enum(["default", "accent-quote"]);
21138
- var tileTreatmentSchema = z27.enum(tileTreatmentValues);
21139
- var eventListTreatmentSchema = z27.enum(eventListTreatmentValues);
21140
- var eyebrowTreatmentSchema = z27.enum(eyebrowTreatmentValues);
21141
- function uniqueNonEmpty(values) {
21142
- const uniqueValues = [...new Set(values)];
21143
- const firstValue = uniqueValues[0];
21144
- if (!firstValue) {
21145
- throw new Error("Expected at least one Theme V2 design state option.");
21146
- }
21147
- return [firstValue, ...uniqueValues.slice(1)];
21148
- }
21149
- var userPanelTreatments = uniqueNonEmpty(
21150
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
21151
- );
21152
- var userFlushTreatments = uniqueNonEmpty(
21153
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
21154
- );
21155
- var userFlushBleeds = uniqueNonEmpty(
21156
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
21157
- );
21158
- var contentFrameIntentSchema = z27.discriminatedUnion("kind", [
21159
- z27.object({ kind: z27.literal("plain") }).strict(),
21160
- z27.object({
21161
- kind: z27.literal("panel"),
21162
- treatment: z27.enum(userPanelTreatments)
21163
- }).strict(),
21164
- z27.object({
21165
- kind: z27.literal("flush-panel"),
21166
- treatment: z27.enum(userFlushTreatments),
21167
- bleed: z27.enum(userFlushBleeds)
21168
- }).strict()
21169
- ]);
21170
- var blockDesignPlanSchema = z27.object({
21171
- blockId: z27.string().min(1).transform(asDesignBlockId),
21172
- blockKind: z27.string().min(1),
21173
- purpose: z27.string().min(1),
21174
- sectionSurface: z27.enum(userDesignOptionCatalog.sectionSurfaces),
21175
- contentFrame: contentFrameIntentSchema,
21176
- itemSurface: z27.enum(userDesignOptionCatalog.itemSurfaces),
21177
- transitionAfter: z27.enum(userDesignOptionCatalog.transitions),
21178
- emphasis: z27.enum(userDesignOptionCatalog.emphases),
21179
- sectionHeight: sectionHeightIntentSchema.optional(),
21180
- heroLegibility: heroLegibilityStrategySchema.optional(),
21181
- heroComposition: heroCompositionIntentSchema.optional(),
21182
- heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
21183
- imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
21184
- imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
21185
- testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
21186
- tileTreatment: tileTreatmentSchema.optional(),
21187
- eventListTreatment: eventListTreatmentSchema.optional(),
21188
- eyebrowTreatment: eyebrowTreatmentSchema.optional()
21189
- }).strict();
21190
- var styleAuthoritySchema = z27.discriminatedUnion("kind", [
21191
- z27.object({
21192
- kind: z27.literal("theme-v2"),
21193
- source: designResolutionPolicySchema,
21194
- siteStyleId: z27.string().min(1).transform(asSiteStyleId),
21195
- templateId: z27.string().min(1).transform(asDesignSystemTemplateId),
21196
- templateVersion: z27.number().int().nonnegative(),
21197
- resolverVersion: z27.number().int().nonnegative()
21198
- }).strict(),
21199
- z27.object({
21200
- kind: z27.literal("legacy-raw"),
21201
- reason: z27.enum(["pre-theme-v2", "manual-runtime-fields"])
21202
- }).strict(),
21203
- z27.object({
21204
- kind: z27.literal("advanced-detached"),
21205
- reason: z27.literal("detached-custom-runtime-fields")
21206
- }).strict()
21207
- ]);
21208
- var blockRuntimeStyleAuthoritySchema = z27.object({
21209
- unit: z27.literal("block-runtime-fields"),
21210
- blockId: z27.string().min(1).transform(asDesignBlockId),
21211
- fields: nonEmptyRuntimeStyleFieldNamesSchema,
21212
- authority: styleAuthoritySchema
21213
- }).strict();
21214
- var persistedPageDesignStateV1Schema = z27.object({
21215
- schemaVersion: z27.literal(themeV2DesignStateSchemaVersion),
21216
- siteStyleId: z27.string().min(1).transform(asSiteStyleId),
21217
- templateId: z27.string().min(1).transform(asDesignSystemTemplateId),
21218
- templateVersion: z27.number().int().nonnegative(),
21219
- resolverVersion: z27.number().int().nonnegative(),
21220
- rhythmPresetId: z27.string().min(1),
21221
- blocks: z27.array(blockDesignPlanSchema),
21222
- styleAuthorities: z27.array(blockRuntimeStyleAuthoritySchema)
21223
- }).strict();
21224
-
21225
- // ../theme-core/src/site-styles/runtimeCompiler.ts
21226
- function defineDesignRuntimeRules(rules) {
21227
- return rules;
21228
- }
21229
- function defineComponentRuntimeRules(rules) {
21230
- return rules;
21231
- }
21232
- var defaultDesignRuntimeRules = defineDesignRuntimeRules({
21233
- sectionSurfaces: {
21234
- base: {},
21235
- "muted-band": {
21236
- background: {
21237
- type: "color",
21238
- color: "muted"
21239
- }
21240
- },
21241
- "accent-band": {
21242
- background: {
21243
- type: "color",
21244
- color: "primary"
21245
- }
21246
- },
21247
- "brand-depth-band": {
21248
- background: {
21249
- type: "color",
21250
- color: "primary-800"
21251
- }
21252
- },
21253
- "hero-image": {
21254
- background: {
21255
- type: "image",
21256
- opacity: 1,
21257
- position: "center center",
21258
- ...uniformSectionForeground("text")
21259
- }
21260
- }
21261
- },
21262
- heroLegibility: {
21263
- "scrim-gradient": {
21264
- type: "gradient",
21265
- gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
21266
- opacity: 1
21267
- },
21268
- "solid-panel": {
21269
- type: "color",
21270
- color: "surface",
21271
- opacity: 0.88
21272
- }
21273
- },
21274
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
21275
- });
21276
- var defaultComponentRuntimeRules = defineComponentRuntimeRules({
21277
- panelFrames: {
21278
- inset: {
21279
- spacing: "comfortable",
21280
- rounded: "xl",
21281
- raised: false,
21282
- background: {
21283
- type: "color",
21284
- color: "surfaceAlt",
21285
- textColor: "text"
21286
- }
21287
- },
21288
- raised: {
21289
- spacing: "comfortable",
21290
- rounded: "xl",
21291
- raised: true,
21292
- background: {
21293
- type: "color",
21294
- color: "surfaceAlt",
21295
- textColor: "text"
21296
- }
21297
- },
21298
- editorial: {
21299
- spacing: "medium",
21300
- rounded: "xl",
21301
- raised: false,
21302
- background: {
21303
- type: "color",
21304
- color: "surface",
21305
- textColor: "text"
21306
- }
21307
- }
21308
- },
21309
- flushFrames: {
21310
- "media-panel": {
21311
- fullWidth: true,
21312
- spacing: "none",
21313
- rounded: "none",
21314
- raised: false
21315
- }
21316
- },
21317
- itemSurfaces: {
21318
- none: null,
21319
- default: {
21320
- spacing: "medium",
21321
- rounded: "lg",
21322
- raised: false
21323
- },
21324
- flat: {
21325
- spacing: "medium",
21326
- rounded: "lg",
21327
- raised: false
21328
- },
21329
- outlined: {
21330
- spacing: "medium",
21331
- rounded: "lg",
21332
- raised: false,
21333
- border: {
21334
- enabled: true,
21335
- width: "1",
21336
- colorToken: "border"
21337
- }
21338
- },
21339
- raised: {
21340
- spacing: "medium",
21341
- rounded: "xl",
21342
- raised: true
21343
- },
21344
- inset: {
21345
- treatment: "soft-panel",
21346
- spacing: "comfortable",
21347
- rounded: "xl",
21348
- raised: false,
21349
- border: {
21350
- enabled: false
21351
- },
21352
- background: {
21353
- type: "color",
21354
- color: "surfaceAlt",
21355
- textColor: "text"
21356
- }
21357
- },
21358
- editorial: {
21359
- // Boxless open column with a short rule on top; the visual treatment
21360
- // lives in blocks-static/card-treatments.css.
21361
- treatment: "editorial-rule",
21362
- spacing: "none",
21363
- rounded: "none",
21364
- raised: false,
21365
- border: {
21366
- enabled: false
21367
- }
21368
- },
21369
- "color-blocked": {
21370
- // Bold, flat colour-blocked cards. The per-card background colour cycle
21371
- // (by position) and staggered offset live in
21372
- // blocks-static/card-treatments.css; here we set the shared shape:
21373
- // generous padding, large radius, no border, flat (no shadow).
21374
- treatment: "color-blocked",
21375
- spacing: "spacious",
21376
- rounded: "2xl",
21377
- raised: false,
21378
- border: {
21379
- enabled: false
21380
- }
21381
- }
21382
- }
21383
- });
21384
- function uniformSectionForeground(token) {
21385
- return {
21386
- textColor: token,
21387
- headingColor: token,
21388
- linkColor: token,
21389
- supportingColor: token
21390
- };
21391
- }
21392
-
21393
21956
  // ../theme-core/src/site-styles/generatedSchemas.ts
21394
21957
  import { z as z28 } from "zod";
21395
21958
  function uniqueNonEmpty2(values) {
@@ -22201,6 +22764,31 @@ function cardStylesField(options = {}) {
22201
22764
  return createBoxStylesFieldWithDepth("card", options);
22202
22765
  }
22203
22766
 
22767
+ // ../blocks/src/system/fields/imageShape.ts
22768
+ var standardImageShapeOptions = [
22769
+ { value: "default", label: "Default" },
22770
+ { value: "square", label: "Square corners" },
22771
+ { value: "rounded", label: "Rounded corners" },
22772
+ { value: "circle", label: "Circle" },
22773
+ { value: "arch", label: "Arch" }
22774
+ ];
22775
+ function createImageShapeField(options = {}) {
22776
+ return {
22777
+ id: options.id ?? "imageShape",
22778
+ type: "select",
22779
+ label: options.label ?? "Image shape",
22780
+ ...options.description ? { description: options.description } : {},
22781
+ required: false,
22782
+ defaultValue: options.defaultValue ?? "default",
22783
+ multiple: false,
22784
+ options: [...standardImageShapeOptions],
22785
+ ui: {
22786
+ intent: options.uiIntent ?? "display",
22787
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
22788
+ }
22789
+ };
22790
+ }
22791
+
22204
22792
  // ../blocks/src/utils/env.ts
22205
22793
  function isDevEnvironment() {
22206
22794
  try {
@@ -23015,7 +23603,7 @@ function buildFooterNavAll(common) {
23015
23603
  return stack(
23016
23604
  { className: common.className, gap: common.gap, align: "stretch" },
23017
23605
  [item],
23018
- when(collectionPath)
23606
+ whenCollectionHasItems(collectionPath)
23019
23607
  );
23020
23608
  }
23021
23609
  function buildFooterNavLinksOnly(common) {
@@ -23048,7 +23636,7 @@ function buildFooterNavLinksOnly(common) {
23048
23636
  return stack(
23049
23637
  { className: common.className, gap: common.gap, align: "stretch" },
23050
23638
  [item],
23051
- when(collectionPath)
23639
+ whenCollectionHasItems(collectionPath)
23052
23640
  );
23053
23641
  }
23054
23642
  function buildFooterNavFlatten(common) {
@@ -23097,9 +23685,20 @@ function buildFooterNavFlatten(common) {
23097
23685
  return stack(
23098
23686
  { className: common.className, gap: common.gap, align: "stretch" },
23099
23687
  [item],
23100
- when(collectionPath)
23688
+ whenCollectionHasItems(collectionPath)
23101
23689
  );
23102
23690
  }
23691
+ var whenCollectionHasItems = (collectionPath) => (node) => ({
23692
+ ...node,
23693
+ $when: {
23694
+ when: {
23695
+ from: collectionPath,
23696
+ transforms: [{ id: "array.length" }]
23697
+ },
23698
+ equals: 0,
23699
+ not: true
23700
+ }
23701
+ });
23103
23702
  function footerNav(opts) {
23104
23703
  const mode = opts?.mode ?? "all";
23105
23704
  const collectionPath = opts?.collectionPath ?? "footerMenu.items";
@@ -25814,8 +26413,23 @@ function fragmentsToRepeaterField(id, label, fragments, options = {}) {
25814
26413
  var heroLayoutControlsFragment = defineFragment({
25815
26414
  id: "heroLayoutControls",
25816
26415
  title: "Hero Layout",
25817
- description: "Alignment and content width controls for hero layouts.",
26416
+ description: "Title scale, alignment, and content width controls for hero layouts.",
25818
26417
  fields: [
26418
+ {
26419
+ id: "titleSize",
26420
+ type: "select",
26421
+ label: "Title size",
26422
+ description: "Adjust the visual scale of the hero title.",
26423
+ required: false,
26424
+ ui: { intent: "display" },
26425
+ options: [
26426
+ { value: "auto", label: "Auto" },
26427
+ { value: "quiet", label: "Normal" },
26428
+ { value: "editorial", label: "Large" },
26429
+ { value: "display", label: "Huge" },
26430
+ { value: "poster", label: "Poster" }
26431
+ ]
26432
+ },
25819
26433
  {
25820
26434
  id: "contentAlignment",
25821
26435
  type: "select",
@@ -26610,7 +27224,18 @@ function heroSplitImagePane() {
26610
27224
  return stack(
26611
27225
  {
26612
27226
  gap: "none",
26613
- className: "rb-relative rb-overflow-hidden rb-rounded-3xl",
27227
+ className: {
27228
+ $bind: {
27229
+ from: "content.imageShape",
27230
+ transforms: [
27231
+ {
27232
+ id: "ui.imageShapeClassName",
27233
+ options: { baseClass: "rb-relative rb-overflow-hidden rb-rounded-3xl" }
27234
+ }
27235
+ ],
27236
+ fallback: "rb-relative rb-overflow-hidden rb-rounded-3xl"
27237
+ }
27238
+ },
26614
27239
  style: {
26615
27240
  minHeight: "clamp(18rem, 36vw, 34rem)"
26616
27241
  }
@@ -26728,6 +27353,12 @@ var heroConfig = {
26728
27353
  label: "Content card",
26729
27354
  renderInHeader: true,
26730
27355
  intent: "style"
27356
+ }),
27357
+ createImageShapeField({
27358
+ id: "imageShape",
27359
+ label: "Image shape",
27360
+ defaultValue: "default",
27361
+ uiIntent: "display"
26731
27362
  })
26732
27363
  ],
26733
27364
  layout: classicLayout,
@@ -26742,6 +27373,15 @@ var heroConfig = {
26742
27373
  description: "Hero section with headline, subtitle, and repeatable CTAs.",
26743
27374
  tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
26744
27375
  icon: "Sparkles",
27376
+ previewCustomize: {
27377
+ quickFieldPriority: [
27378
+ "titleSize",
27379
+ "contentAlignment",
27380
+ "contentMaxWidth",
27381
+ "verticalAlignment",
27382
+ "imageShape"
27383
+ ]
27384
+ },
26745
27385
  styleTokens: {
26746
27386
  typography: "display",
26747
27387
  spacing: "xl"
@@ -26758,7 +27398,8 @@ var standardAspectRatioOptions = [
26758
27398
  { value: "16/9", label: "16:9 (Landscape)" },
26759
27399
  { value: "4/3", label: "4:3 (Standard)" },
26760
27400
  { value: "1/1", label: "1:1 (Square)" },
26761
- { value: "3/4", label: "3:4 (Portrait)" }
27401
+ { value: "3/4", label: "3:4 (Portrait)" },
27402
+ { value: "9/16", label: "9:16 (Tall portrait)" }
26762
27403
  ];
26763
27404
  function createAspectRatioField(options = {}) {
26764
27405
  return {
@@ -28000,6 +28641,258 @@ var formBlockDefinition = {
28000
28641
  runtime: formBlockRuntime
28001
28642
  };
28002
28643
 
28644
+ // ../blocks/src/system/blocks/contact-newsletter.ts
28645
+ var contactNewsletterLayout = styledSection({
28646
+ children: sectionContainer([
28647
+ el(
28648
+ "div",
28649
+ { className: "contact-newsletter-grid" },
28650
+ [
28651
+ el(
28652
+ "div",
28653
+ { className: "contact-newsletter-column contact-newsletter-contact" },
28654
+ [
28655
+ el(
28656
+ "div",
28657
+ { className: "contact-newsletter-copy" },
28658
+ [
28659
+ text(
28660
+ {
28661
+ as: "h2",
28662
+ className: "form-copy-title"
28663
+ },
28664
+ when("contactTitle"),
28665
+ bind("contactTitle")
28666
+ ),
28667
+ richText(
28668
+ {
28669
+ className: "form-copy-intro rb-prose rb-max-w-none"
28670
+ },
28671
+ when("contactIntro"),
28672
+ bind("contactIntro")
28673
+ )
28674
+ ]
28675
+ ),
28676
+ el(
28677
+ "form",
28678
+ withApiBindings({
28679
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } },
28680
+ submitLabel: { $bind: { from: "contactSubmitLabel" } },
28681
+ successMessage: { $bind: { from: "contactSuccessMessage" } }
28682
+ }),
28683
+ [],
28684
+ bind("data.form")
28685
+ )
28686
+ ]
28687
+ ),
28688
+ el(
28689
+ "div",
28690
+ { className: "contact-newsletter-column contact-newsletter-info contact-newsletter-newsletter" },
28691
+ [
28692
+ el(
28693
+ "div",
28694
+ { className: "contact-newsletter-copy" },
28695
+ [
28696
+ text(
28697
+ {
28698
+ as: "h2",
28699
+ className: "newsletter-copy-title"
28700
+ },
28701
+ when("newsletterTitle"),
28702
+ bind("newsletterTitle")
28703
+ ),
28704
+ richText(
28705
+ {
28706
+ className: "newsletter-copy-subtitle rb-prose rb-max-w-none"
28707
+ },
28708
+ when("newsletterSubtitle"),
28709
+ bind("newsletterSubtitle")
28710
+ )
28711
+ ]
28712
+ ),
28713
+ el(
28714
+ "newsletter-form",
28715
+ withApiBindings({
28716
+ listId: { $bind: { from: "listId" } },
28717
+ preset: { $bind: { from: "preset" } },
28718
+ includePhone: { $bind: { from: "includePhone" } },
28719
+ buttonLabel: { $bind: { from: "newsletterButtonLabel" } },
28720
+ successMessage: { $bind: { from: "newsletterSuccessMessage" } },
28721
+ privacyNote: { $bind: { from: "newsletterPrivacyNote" } },
28722
+ tags: { $bind: { from: "newsletterTags" } },
28723
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } }
28724
+ }),
28725
+ []
28726
+ )
28727
+ ]
28728
+ )
28729
+ ]
28730
+ )
28731
+ ], {
28732
+ className: "contact-newsletter-container"
28733
+ }),
28734
+ baseClass: "",
28735
+ spacing: "medium",
28736
+ background: "surface"
28737
+ });
28738
+ var contactNewsletterManifest = createBlockManifest({
28739
+ id: "block.contact-newsletter",
28740
+ title: "Contact + Newsletter",
28741
+ titleSource: "contactTitle",
28742
+ description: "Two-column newsletter signup and contact form section.",
28743
+ category: "interactive",
28744
+ layout: contactNewsletterLayout,
28745
+ defaultVariant: "default",
28746
+ variants: {
28747
+ default: contactNewsletterLayout
28748
+ },
28749
+ variantOptions: {
28750
+ default: {
28751
+ label: "Two column",
28752
+ description: "Newsletter and contact form side by side.",
28753
+ icon: "Columns2"
28754
+ }
28755
+ },
28756
+ additionalFields: [
28757
+ {
28758
+ id: "newsletterTitle",
28759
+ type: "text",
28760
+ label: "Newsletter title",
28761
+ defaultValue: "Stay connected"
28762
+ },
28763
+ {
28764
+ id: "newsletterSubtitle",
28765
+ type: "richText",
28766
+ label: "Newsletter intro"
28767
+ },
28768
+ {
28769
+ id: "listId",
28770
+ type: "reference",
28771
+ label: "Newsletter list",
28772
+ description: "Select the list new subscribers should be added to.",
28773
+ required: true,
28774
+ referenceKind: "newsletterList",
28775
+ allowManualEntry: false,
28776
+ ui: { intent: "behavior" }
28777
+ },
28778
+ {
28779
+ id: "preset",
28780
+ type: "select",
28781
+ label: "Newsletter fields",
28782
+ defaultValue: "emailOnly",
28783
+ ui: { intent: "display" },
28784
+ options: [
28785
+ { value: "emailOnly", label: "Email only" },
28786
+ { value: "emailName", label: "Email + Name" },
28787
+ { value: "emailFirstLast", label: "Email + First/Last Name" },
28788
+ { value: "emailNameCompany", label: "Email + Name + Company (B2B)" }
28789
+ ]
28790
+ },
28791
+ {
28792
+ id: "includePhone",
28793
+ type: "boolean",
28794
+ label: "Include phone field",
28795
+ defaultValue: false,
28796
+ ui: { intent: "display" }
28797
+ },
28798
+ {
28799
+ id: "newsletterButtonLabel",
28800
+ type: "text",
28801
+ label: "Newsletter button label",
28802
+ defaultValue: "Subscribe",
28803
+ ui: { intent: "display" }
28804
+ },
28805
+ {
28806
+ id: "newsletterSuccessMessage",
28807
+ type: "text",
28808
+ label: "Newsletter success message",
28809
+ defaultValue: "Thanks for subscribing!",
28810
+ ui: { intent: "behavior" }
28811
+ },
28812
+ {
28813
+ id: "newsletterPrivacyNote",
28814
+ type: "text",
28815
+ label: "Privacy note",
28816
+ ui: { intent: "display" }
28817
+ },
28818
+ {
28819
+ id: "newsletterTags",
28820
+ type: "text",
28821
+ label: "Newsletter tags",
28822
+ description: "Optional tags to apply on subscribe, separated by comma or semicolon.",
28823
+ ui: { intent: "behavior" }
28824
+ },
28825
+ {
28826
+ id: "contactTitle",
28827
+ type: "text",
28828
+ label: "Contact title",
28829
+ defaultValue: "Get in touch"
28830
+ },
28831
+ {
28832
+ id: "contactIntro",
28833
+ type: "richText",
28834
+ label: "Contact intro"
28835
+ },
28836
+ {
28837
+ id: "formSlug",
28838
+ type: "reference",
28839
+ label: "Contact form",
28840
+ description: "Pick a saved form to render.",
28841
+ required: true,
28842
+ referenceKind: "form",
28843
+ allowManualEntry: false,
28844
+ ui: { intent: "behavior" }
28845
+ },
28846
+ {
28847
+ id: "contactSubmitLabel",
28848
+ type: "text",
28849
+ label: "Contact button label",
28850
+ defaultValue: "Send message",
28851
+ ui: { intent: "display" }
28852
+ },
28853
+ {
28854
+ id: "contactSuccessMessage",
28855
+ type: "text",
28856
+ label: "Contact success message",
28857
+ defaultValue: "Thanks - we received your message.",
28858
+ ui: { intent: "behavior" }
28859
+ }
28860
+ ],
28861
+ styleTokens: {
28862
+ background: "surface",
28863
+ typography: "body",
28864
+ spacing: "md"
28865
+ },
28866
+ behaviours: {
28867
+ supportsThemeSwitching: true,
28868
+ inlineEditing: true,
28869
+ animation: false,
28870
+ paletteHidden: false
28871
+ },
28872
+ tags: [
28873
+ "contact",
28874
+ "newsletter",
28875
+ "signup",
28876
+ "email",
28877
+ "form",
28878
+ "lead-capture"
28879
+ ],
28880
+ icon: "MailPlus"
28881
+ });
28882
+ var contactNewsletterBlockDefinition = {
28883
+ manifest: contactNewsletterManifest,
28884
+ dataSchemas: { form: formDataSchema.optional() },
28885
+ dataLoaders: {
28886
+ form: {
28887
+ endpoint: "getPublicFormById",
28888
+ params: {
28889
+ formSlug: { $bind: { from: "formSlug" } }
28890
+ },
28891
+ mode: "server"
28892
+ }
28893
+ }
28894
+ };
28895
+
28003
28896
  // ../blocks/src/system/blocks/faq.ts
28004
28897
  function fragmentLayoutNode2(layout) {
28005
28898
  return isNodeDefinitionArray2(layout) ? el("div", {}, [...layout]) : layout;
@@ -28228,6 +29121,7 @@ var joinClasses3 = (parts) => parts.filter(
28228
29121
  ).join(" ").replace(/\s+/g, " ").trim();
28229
29122
  var eyebrowTreatmentClassMap = {
28230
29123
  plain: "",
29124
+ accent: "rb-eyebrow-treatment-accent",
28231
29125
  pill: "rb-eyebrow-treatment-pill",
28232
29126
  "accent-pill": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent",
28233
29127
  "pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-pill-bounce",
@@ -28254,6 +29148,13 @@ var imageGalleryCornerClassMap = {
28254
29148
  "2xl": "rb-rounded-2xl",
28255
29149
  "3xl": "rb-rounded-3xl"
28256
29150
  };
29151
+ var imageShapeClassMap = {
29152
+ default: "",
29153
+ square: "rb-media-shape-square",
29154
+ rounded: "rb-media-shape-rounded",
29155
+ circle: "rb-media-shape-circle",
29156
+ arch: "rb-media-shape-arch"
29157
+ };
28257
29158
  var parseRatio = (raw) => {
28258
29159
  if (typeof raw !== "string") return null;
28259
29160
  const value = raw.trim();
@@ -28398,6 +29299,10 @@ function resolveHeroContentMaxWidth(content) {
28398
29299
  return "default";
28399
29300
  }
28400
29301
  function resolveHeroTypographyScale(content) {
29302
+ const titleSize = readString(content, "titleSize");
29303
+ if (titleSize === "quiet" || titleSize === "editorial" || titleSize === "display" || titleSize === "poster") {
29304
+ return titleSize;
29305
+ }
28401
29306
  const raw = readHeroLayoutString(
28402
29307
  content,
28403
29308
  "typographyScale",
@@ -28639,6 +29544,16 @@ var uiTransforms = [
28639
29544
  heroGridClassFromVerticalAlignmentTransform,
28640
29545
  imageFragmentClassTransform,
28641
29546
  imageFragmentSizeTransform,
29547
+ {
29548
+ id: "ui.imageShapeClassName",
29549
+ kind: "string",
29550
+ summary: "Apply a constrained media shape class",
29551
+ run: (value, options) => {
29552
+ const baseClass = typeof options?.baseClass === "string" ? options.baseClass : "";
29553
+ const shape = typeof value === "string" ? value.trim() : "default";
29554
+ return joinClasses3([baseClass, imageShapeClassMap[shape] ?? ""]);
29555
+ }
29556
+ },
28642
29557
  conditionalClassTransform,
28643
29558
  twoColumnContainerClassTransform,
28644
29559
  twoColumnFlexBasisTransform,
@@ -30032,6 +30947,21 @@ var siteHeaderManifest = createBlockManifest({
30032
30947
  id: "block.site-header",
30033
30948
  title: "Site Header",
30034
30949
  category: "layout",
30950
+ additionalFields: [
30951
+ {
30952
+ id: "mode",
30953
+ type: "select",
30954
+ label: "Header display",
30955
+ required: false,
30956
+ multiple: false,
30957
+ defaultValue: "default",
30958
+ options: [
30959
+ { value: "default", label: "Show header" },
30960
+ { value: "hidden", label: "Hide header" }
30961
+ ],
30962
+ ui: { intent: "display" }
30963
+ }
30964
+ ],
30035
30965
  // Skip section styles - this block uses theme-based styling
30036
30966
  skipSectionStyles: true,
30037
30967
  // Block manages its own wrapper - enables sticky positioning
@@ -31444,6 +32374,9 @@ var mediaTextManifest = createBlockManifest({
31444
32374
  category: "layout",
31445
32375
  includeContainerStyles: true,
31446
32376
  titleSource: "title",
32377
+ previewCustomize: {
32378
+ quickFieldPriority: ["imagePosition", "ratio", "imageShape", "titleAlignment", "aspectRatio"]
32379
+ },
31447
32380
  additionalFields: [
31448
32381
  {
31449
32382
  id: "images",
@@ -31482,7 +32415,7 @@ var mediaTextManifest = createBlockManifest({
31482
32415
  {
31483
32416
  id: "titleAlignment",
31484
32417
  type: "select",
31485
- label: "Title alignment",
32418
+ label: "Content alignment",
31486
32419
  required: false,
31487
32420
  defaultValue: "left",
31488
32421
  multiple: false,
@@ -31540,7 +32473,18 @@ var mediaTextManifest = createBlockManifest({
31540
32473
  transition: "slide"
31541
32474
  },
31542
32475
  ui: { intent: "behavior" }
31543
- }),
32476
+ }).map((field) => ({
32477
+ ...field,
32478
+ ui: {
32479
+ ...field.ui ?? {},
32480
+ visibleWhen: field.id === "carouselAutoplayDelay" ? {
32481
+ allOf: [
32482
+ { field: "images", minItems: 2 },
32483
+ { field: "carouselAutoplay", equals: true }
32484
+ ]
32485
+ } : { field: "images", minItems: 2 }
32486
+ }
32487
+ })),
31544
32488
  createAspectRatioField({
31545
32489
  id: "aspectRatio",
31546
32490
  label: "Media aspect ratio",
@@ -31548,6 +32492,12 @@ var mediaTextManifest = createBlockManifest({
31548
32492
  defaultValue: "auto",
31549
32493
  visibleWhen: { field: "images", notEquals: null }
31550
32494
  }),
32495
+ createImageShapeField({
32496
+ id: "imageShape",
32497
+ label: "Media shape",
32498
+ defaultValue: "default",
32499
+ visibleWhen: { field: "images", notEquals: null }
32500
+ }),
31551
32501
  {
31552
32502
  id: "text",
31553
32503
  type: "richText",
@@ -31581,6 +32531,30 @@ var mediaTextManifest = createBlockManifest({
31581
32531
  ...options?.not ? { not: true } : {}
31582
32532
  }
31583
32533
  });
32534
+ const bodyClassNameFromAlignment = {
32535
+ $bind: {
32536
+ from: "content.titleAlignment",
32537
+ transforms: [
32538
+ {
32539
+ id: "ui.bodyClassFromAlignment",
32540
+ options: { base: "rb-prose rb-max-w-none" }
32541
+ }
32542
+ ],
32543
+ fallback: "rb-prose rb-max-w-none"
32544
+ }
32545
+ };
32546
+ const titleClassNameFromAlignment = {
32547
+ $bind: {
32548
+ from: "content.titleAlignment",
32549
+ transforms: [
32550
+ {
32551
+ id: "ui.headingClassFromAlignment",
32552
+ options: { base: "" }
32553
+ }
32554
+ ],
32555
+ fallback: ""
32556
+ }
32557
+ };
31584
32558
  const defaultTextColumn = el("div", {}, [
31585
32559
  styledCard(
31586
32560
  [
@@ -31605,8 +32579,55 @@ var mediaTextManifest = createBlockManifest({
31605
32579
  bind("content.text")
31606
32580
  )
31607
32581
  ]);
32582
+ const bioTextColumn = el(
32583
+ "div",
32584
+ { className: "rb-flex rb-h-full rb-w-full rb-max-w-prose rb-flex-col rb-justify-center rb-gap-5" },
32585
+ [
32586
+ text(
32587
+ {
32588
+ as: "h2",
32589
+ className: titleClassNameFromAlignment
32590
+ },
32591
+ when("content.title"),
32592
+ bind("content.title")
32593
+ ),
32594
+ styledCard(
32595
+ [
32596
+ richText(
32597
+ {
32598
+ className: bodyClassNameFromAlignment
32599
+ },
32600
+ bind("content.text")
32601
+ )
32602
+ ],
32603
+ {
32604
+ stylesFrom: "content._textCardStyles",
32605
+ backgroundFrom: "content._textCardStyles.background"
32606
+ },
32607
+ when("content.wrapTextInCard")
32608
+ ),
32609
+ richText(
32610
+ {
32611
+ className: bodyClassNameFromAlignment
32612
+ },
32613
+ when("content.wrapTextInCard", { not: true }),
32614
+ bind("content.text")
32615
+ )
32616
+ ]
32617
+ );
31608
32618
  const defaultImageCommonProps = {
31609
- className: "rb-w-full rb-h-auto rb-object-cover",
32619
+ className: {
32620
+ $bind: {
32621
+ from: "content.imageShape",
32622
+ transforms: [
32623
+ {
32624
+ id: "ui.imageShapeClassName",
32625
+ options: { baseClass: "rb-w-full rb-h-auto rb-object-cover" }
32626
+ }
32627
+ ],
32628
+ fallback: "rb-w-full rb-h-auto rb-object-cover"
32629
+ }
32630
+ },
31610
32631
  style: {
31611
32632
  aspectRatio: { $bind: { from: "content.aspectRatio" } }
31612
32633
  }
@@ -31647,6 +32668,27 @@ var mediaTextManifest = createBlockManifest({
31647
32668
  ],
31648
32669
  whenImagesLength(0, { not: true })
31649
32670
  );
32671
+ const bioImagesLayout = el(
32672
+ "div",
32673
+ {},
32674
+ [
32675
+ responsiveTwoColumn({
32676
+ image: el("div", {}, [
32677
+ el("div", {}, [defaultSingleImage], whenImagesLength(1)),
32678
+ el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))
32679
+ ]),
32680
+ text: bioTextColumn,
32681
+ ratioFrom: "content.ratio",
32682
+ imagePositionFrom: "content.imagePosition",
32683
+ containerClassName: "rb-flex rb-flex-col rb-md-flex-row rb-md-items-center",
32684
+ gapFrom: "content.gap",
32685
+ gapFallback: "comfortable",
32686
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
32687
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-stretch"
32688
+ })
32689
+ ],
32690
+ whenImagesLength(0, { not: true })
32691
+ );
31650
32692
  const defaultTextOnlyLayout = el(
31651
32693
  "div",
31652
32694
  {},
@@ -31676,7 +32718,45 @@ var mediaTextManifest = createBlockManifest({
31676
32718
  ],
31677
32719
  whenImagesLength(0)
31678
32720
  );
32721
+ const bioTextOnlyLayout = el(
32722
+ "div",
32723
+ { className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5" },
32724
+ [
32725
+ text(
32726
+ {
32727
+ as: "h2",
32728
+ className: titleClassNameFromAlignment
32729
+ },
32730
+ when("content.title"),
32731
+ bind("content.title")
32732
+ ),
32733
+ styledCard(
32734
+ [
32735
+ richText(
32736
+ {
32737
+ className: bodyClassNameFromAlignment
32738
+ },
32739
+ bind("content.text")
32740
+ )
32741
+ ],
32742
+ {
32743
+ stylesFrom: "content._textCardStyles",
32744
+ backgroundFrom: "content._textCardStyles.background"
32745
+ },
32746
+ when("content.wrapTextInCard")
32747
+ ),
32748
+ richText(
32749
+ {
32750
+ className: bodyClassNameFromAlignment
32751
+ },
32752
+ when("content.wrapTextInCard", { not: true }),
32753
+ bind("content.text")
32754
+ )
32755
+ ],
32756
+ whenImagesLength(0)
32757
+ );
31679
32758
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
32759
+ const bioInner = el("div", {}, [bioImagesLayout, bioTextOnlyLayout]);
31680
32760
  const defaultLayout2 = styledSection({
31681
32761
  children: styledContainer({
31682
32762
  rootType: "stack",
@@ -31685,18 +32765,7 @@ var mediaTextManifest = createBlockManifest({
31685
32765
  text(
31686
32766
  {
31687
32767
  as: "h2",
31688
- className: {
31689
- $bind: {
31690
- from: "content.titleAlignment",
31691
- transforms: [
31692
- {
31693
- id: "ui.headingClassFromAlignment",
31694
- options: { base: "" }
31695
- }
31696
- ],
31697
- fallback: ""
31698
- }
31699
- }
32768
+ className: titleClassNameFromAlignment
31700
32769
  },
31701
32770
  when("content.title"),
31702
32771
  bind("content.title")
@@ -31708,14 +32777,28 @@ var mediaTextManifest = createBlockManifest({
31708
32777
  baseClass: "",
31709
32778
  spacing: "medium"
31710
32779
  });
32780
+ const bioLayout = styledSection({
32781
+ children: styledContainer({
32782
+ rootType: "stack",
32783
+ rootProps: { gap: "lg" },
32784
+ children: [bioInner]
32785
+ }),
32786
+ baseClass: "",
32787
+ spacing: "medium"
32788
+ });
31711
32789
  return {
31712
32790
  layout: defaultLayout2,
31713
32791
  variants: {
31714
- default: defaultLayout2
32792
+ default: defaultLayout2,
32793
+ bio: bioLayout
31715
32794
  },
31716
32795
  defaultVariant: "default",
31717
32796
  variantOptions: {
31718
- default: { label: "Default" }
32797
+ default: { label: "Default" },
32798
+ bio: {
32799
+ label: "Bio",
32800
+ description: "Vertically centered title and copy beside media."
32801
+ }
31719
32802
  }
31720
32803
  };
31721
32804
  })(),
@@ -32421,6 +33504,126 @@ var occurrenceContextSchema = z46.object({
32421
33504
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
32422
33505
  import { z as z48 } from "zod";
32423
33506
 
33507
+ // ../blocks/src/system/runtime/nodes/events/shared/pricing.ts
33508
+ var DEFAULT_EVENT_CURRENCY = "USD";
33509
+ function resolveRuntimeEventPricing(event) {
33510
+ if (isPublicEventPricing(event.pricing)) {
33511
+ return event.pricing;
33512
+ }
33513
+ const legacy = event;
33514
+ const currency = readCurrency(legacy.currency);
33515
+ if (event.requiresRegistration === false) {
33516
+ return {
33517
+ kind: "drop_in",
33518
+ currency,
33519
+ display: { kind: "free", currency }
33520
+ };
33521
+ }
33522
+ if (legacy.pricingMode === "ticket_types") {
33523
+ const ticketTypes = Array.isArray(legacy.ticketTypes) ? legacy.ticketTypes.filter(isPublicEventTicketType) : [];
33524
+ return {
33525
+ kind: "ticket_types",
33526
+ currency,
33527
+ ticketTypes,
33528
+ display: readTicketTypePriceDisplay(legacy.priceDisplay, currency)
33529
+ };
33530
+ }
33531
+ const amount = typeof legacy.price === "number" ? legacy.price : 0;
33532
+ if (legacy.pricingType === "paid" && amount > 0) {
33533
+ return {
33534
+ kind: "single_paid",
33535
+ amount,
33536
+ currency,
33537
+ display: { kind: "exact", amount, currency }
33538
+ };
33539
+ }
33540
+ return {
33541
+ kind: "free_registration",
33542
+ currency,
33543
+ display: { kind: "free", currency }
33544
+ };
33545
+ }
33546
+ function readCurrency(value) {
33547
+ return typeof value === "string" && value.trim().length > 0 ? value : DEFAULT_EVENT_CURRENCY;
33548
+ }
33549
+ function isRecord5(value) {
33550
+ return typeof value === "object" && value !== null && !Array.isArray(value);
33551
+ }
33552
+ function isPublicEventPricing(value) {
33553
+ if (!isRecord5(value) || typeof value.kind !== "string") return false;
33554
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course";
33555
+ }
33556
+ function isPublicEventTicketType(value) {
33557
+ return isRecord5(value) && typeof value.id === "string";
33558
+ }
33559
+ function readTicketTypePriceDisplay(value, currency) {
33560
+ const display = readLegacyPriceDisplay(value, currency);
33561
+ return display.kind === "course" ? { kind: "unavailable", currency } : display;
33562
+ }
33563
+ function readLegacyPriceDisplay(value, currency) {
33564
+ if (!isRecord5(value) || typeof value.kind !== "string") {
33565
+ return { kind: "unavailable", currency };
33566
+ }
33567
+ const displayCurrency = readCurrency(value.currency);
33568
+ switch (value.kind) {
33569
+ case "free":
33570
+ return { kind: "free", currency: displayCurrency };
33571
+ case "exact":
33572
+ return readAmount(value.amount) !== null ? {
33573
+ kind: "exact",
33574
+ amount: readAmount(value.amount) ?? 0,
33575
+ currency: displayCurrency
33576
+ } : { kind: "unavailable", currency };
33577
+ case "from":
33578
+ return readAmount(value.amount) !== null ? {
33579
+ kind: "from",
33580
+ amount: readAmount(value.amount) ?? 0,
33581
+ currency: displayCurrency
33582
+ } : { kind: "unavailable", currency };
33583
+ case "mixed":
33584
+ return readAmount(value.paidFromAmount) !== null ? {
33585
+ kind: "mixed",
33586
+ paidFromAmount: readAmount(value.paidFromAmount) ?? 0,
33587
+ currency: displayCurrency
33588
+ } : { kind: "unavailable", currency };
33589
+ case "unavailable":
33590
+ return { kind: "unavailable", currency: displayCurrency };
33591
+ case "course":
33592
+ return isRecord5(value.display) ? {
33593
+ kind: "course",
33594
+ display: readCoursePriceDisplay(value.display, displayCurrency)
33595
+ } : {
33596
+ kind: "course",
33597
+ display: { kind: "unavailable", currency: displayCurrency }
33598
+ };
33599
+ default:
33600
+ return { kind: "unavailable", currency };
33601
+ }
33602
+ }
33603
+ function readCoursePriceDisplay(value, currency) {
33604
+ switch (value.kind) {
33605
+ case "free":
33606
+ return { kind: "free", currency: readCurrency(value.currency) };
33607
+ case "exact":
33608
+ return readAmount(value.amount) !== null ? {
33609
+ kind: "exact",
33610
+ amount: readAmount(value.amount) ?? 0,
33611
+ currency: readCurrency(value.currency)
33612
+ } : { kind: "unavailable", currency };
33613
+ case "from":
33614
+ return readAmount(value.amount) !== null ? {
33615
+ kind: "from",
33616
+ amount: readAmount(value.amount) ?? 0,
33617
+ currency: readCurrency(value.currency)
33618
+ } : { kind: "unavailable", currency };
33619
+ default:
33620
+ return { kind: "unavailable", currency };
33621
+ }
33622
+ }
33623
+ function readAmount(value) {
33624
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
33625
+ }
33626
+
32424
33627
  // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
32425
33628
  import { z as z47 } from "zod";
32426
33629
 
@@ -32451,11 +33654,21 @@ var filterAutoShowSchema = z47.enum(["auto", "always", "never"]);
32451
33654
  var calendarTabViewsSchema = z47.enum(["both", "month", "week"]);
32452
33655
 
32453
33656
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
33657
+ var EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = ["Date", "Tickets", "Details"];
33658
+ var [
33659
+ eventRegistrationGenericDateStepLabel,
33660
+ eventRegistrationGenericTicketsStepLabel,
33661
+ eventRegistrationGenericDetailsStepLabel
33662
+ ] = EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS;
32454
33663
  var contentEntrySchema = z48.object({
32455
33664
  id: z48.string(),
32456
33665
  slug: z48.string(),
32457
33666
  contentTypeSlug: z48.string()
32458
33667
  });
33668
+ var eventRegistrationPublicEventSchema = z48.preprocess(
33669
+ normalizeEventRegistrationEventInput,
33670
+ publicEventSchema
33671
+ );
32459
33672
  var eventRegistrationSourceSchema = z48.object({
32460
33673
  siteId: z48.string().optional(),
32461
33674
  apiBaseUrl: z48.string().optional(),
@@ -32463,7 +33676,7 @@ var eventRegistrationSourceSchema = z48.object({
32463
33676
  previewToken: z48.string().nullable().optional(),
32464
33677
  occurrenceContext: occurrenceContextSchema.optional(),
32465
33678
  contentEntry: contentEntrySchema.nullable().optional(),
32466
- events: z48.array(publicEventSchema).nullable().optional(),
33679
+ events: z48.array(eventRegistrationPublicEventSchema).nullable().optional(),
32467
33680
  className: z48.string().nullable().optional(),
32468
33681
  buttonText: z48.string().nullable().optional(),
32469
33682
  maxTickets: z48.string().nullable().optional(),
@@ -32478,14 +33691,21 @@ var eventRegistrationSourceSchema = z48.object({
32478
33691
  });
32479
33692
  var eventRegistrationDisplaySchema = z48.object({
32480
33693
  kind: z48.literal("event-registration"),
32481
- state: z48.literal("shell"),
33694
+ state: z48.literal("generic-shell"),
32482
33695
  className: z48.string().nullable(),
33696
+ titleText: z48.string(),
33697
+ bodyText: z48.string(),
33698
+ stepLabels: z48.tuple([
33699
+ z48.literal(eventRegistrationGenericDateStepLabel),
33700
+ z48.literal(eventRegistrationGenericTicketsStepLabel),
33701
+ z48.literal(eventRegistrationGenericDetailsStepLabel)
33702
+ ]),
32483
33703
  summaryButtonText: z48.string()
32484
33704
  });
32485
33705
  var eventRegistrationHydrationSchema = z48.object({
32486
33706
  occurrenceContext: occurrenceContextSchema.optional(),
32487
33707
  contentEntry: contentEntrySchema.nullable().optional(),
32488
- events: z48.array(publicEventSchema).nullable().optional(),
33708
+ events: z48.array(eventRegistrationPublicEventSchema).nullable().optional(),
32489
33709
  maxTickets: z48.string().optional(),
32490
33710
  showVenue: z48.boolean().optional(),
32491
33711
  showCapacity: z48.boolean().optional(),
@@ -32516,8 +33736,11 @@ var eventRegistrationIslandMetaKeys = defineInteractiveIslandMetaKeys(
32516
33736
  function buildEventRegistrationDisplay(source) {
32517
33737
  return {
32518
33738
  kind: "event-registration",
32519
- state: "shell",
33739
+ state: "generic-shell",
32520
33740
  className: source.className ?? null,
33741
+ titleText: "Event registration",
33742
+ bodyText: "Preparing dates, tickets, and booking details.",
33743
+ stepLabels: EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS,
32521
33744
  summaryButtonText: source.buttonText?.trim() || "Register"
32522
33745
  };
32523
33746
  }
@@ -32544,6 +33767,18 @@ var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
32544
33767
  }
32545
33768
  })
32546
33769
  });
33770
+ function normalizeEventRegistrationEventInput(value) {
33771
+ if (!isRecord6(value)) {
33772
+ return value;
33773
+ }
33774
+ return {
33775
+ ...value,
33776
+ pricing: resolveRuntimeEventPricing(value)
33777
+ };
33778
+ }
33779
+ function isRecord6(value) {
33780
+ return typeof value === "object" && value !== null && !Array.isArray(value);
33781
+ }
32547
33782
  var eventRegistrationInteractiveIslandPropsCodec = createInteractiveIslandCodec({
32548
33783
  runtime: eventRegistrationBlockRuntime,
32549
33784
  mode: "event-registration",
@@ -34393,7 +35628,9 @@ function formatPublicEventPriceDisplay(display) {
34393
35628
  }
34394
35629
  }
34395
35630
  function formatEventPrice(event) {
34396
- return formatPublicEventPriceDisplay(publicEventPricingDisplay(event.pricing));
35631
+ return formatPublicEventPriceDisplay(
35632
+ publicEventPricingDisplay(resolveRuntimeEventPricing(event))
35633
+ );
34397
35634
  }
34398
35635
  function resolveEventCta(event, buttonText) {
34399
35636
  const { isFull: isSoldOut } = getEventAvailability(event);
@@ -37456,7 +38693,7 @@ function inferLegacyOfferingsPreviewGroupOrder(overrides) {
37456
38693
  return keys.length >= 2 ? keys : [];
37457
38694
  }
37458
38695
  function normalizeOfferingsPreviewContentForWrite(value) {
37459
- if (!isRecord5(value)) return null;
38696
+ if (!isRecord7(value)) return null;
37460
38697
  const groupOrderValue = value.groupOrder;
37461
38698
  if (Array.isArray(groupOrderValue)) {
37462
38699
  const normalized = normalizeOfferingsPreviewGroupOrder(groupOrderValue);
@@ -37469,7 +38706,7 @@ function normalizeOfferingsPreviewContentForWrite(value) {
37469
38706
  return { ...value, groupOrder: [] };
37470
38707
  }
37471
38708
  const legacyOrder = inferLegacyOfferingsPreviewGroupOrder(
37472
- Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord5) : []
38709
+ Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord7) : []
37473
38710
  );
37474
38711
  return legacyOrder.length > 0 ? { ...value, groupOrder: legacyOrder } : value;
37475
38712
  }
@@ -37523,7 +38760,7 @@ function uniqueOfferingsPreviewSourceKeys(values) {
37523
38760
  }
37524
38761
  return keys;
37525
38762
  }
37526
- function isRecord5(value) {
38763
+ function isRecord7(value) {
37527
38764
  return typeof value === "object" && value !== null && !Array.isArray(value);
37528
38765
  }
37529
38766
  function mergeOrderedKeysWithDefaults(orderedKeys, defaultKeys) {
@@ -37985,7 +39222,7 @@ function isOfferingsPreviewItemLimit(value) {
37985
39222
  return value === "1" || value === "2" || value === "3" || value === "4" || value === "5" || value === "6" || value === null;
37986
39223
  }
37987
39224
  function normalizeOfferingsPreviewGroupOverride(value) {
37988
- if (!isRecord6(value)) return [];
39225
+ if (!isRecord8(value)) return [];
37989
39226
  const override = {};
37990
39227
  if (isOfferingsPreviewSourceKey(value.sourceKey) || value.sourceKey === null) {
37991
39228
  override.sourceKey = value.sourceKey;
@@ -38017,12 +39254,12 @@ function isButtonVariant(value) {
38017
39254
  return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
38018
39255
  }
38019
39256
  function normalizeCardStylesContent(value) {
38020
- return isRecord6(value) || value === null ? value : void 0;
39257
+ return isRecord8(value) || value === null ? value : void 0;
38021
39258
  }
38022
39259
  function normalizeSectionStylesContent(value) {
38023
- return isRecord6(value) || value === null ? value : void 0;
39260
+ return isRecord8(value) || value === null ? value : void 0;
38024
39261
  }
38025
- function isRecord6(value) {
39262
+ function isRecord8(value) {
38026
39263
  return typeof value === "object" && value !== null && !Array.isArray(value);
38027
39264
  }
38028
39265
 
@@ -42101,11 +43338,13 @@ var heroImageSurfaceMotions = [
42101
43338
  ];
42102
43339
  var standardEyebrowTreatments = [
42103
43340
  "plain",
43341
+ "accent",
42104
43342
  "pill",
42105
43343
  "accent-pill"
42106
43344
  ];
42107
43345
  var animatedEyebrowTreatments = [
42108
43346
  "plain",
43347
+ "accent",
42109
43348
  "pill",
42110
43349
  "accent-pill",
42111
43350
  "pill-bounce",
@@ -42406,6 +43645,17 @@ var systemBlockDefinitionsRaw = [
42406
43645
  layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
42407
43646
  ]
42408
43647
  })),
43648
+ withDesignCapability("block.contact-newsletter", contactNewsletterBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
43649
+ flow: conversionFlow,
43650
+ layoutProfiles: [
43651
+ layoutProfile({
43652
+ variantKey: "default",
43653
+ family: "split",
43654
+ weight: "featured",
43655
+ bias: "soft"
43656
+ })
43657
+ ]
43658
+ })),
42409
43659
  withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
42410
43660
  sectionSurfaces: "supported",
42411
43661
  contentFrames: ["plain", "panel"],
@@ -42497,6 +43747,12 @@ var systemBlockDefinitionsRaw = [
42497
43747
  family: "media-text",
42498
43748
  weight: "featured",
42499
43749
  bias: "soft"
43750
+ }),
43751
+ layoutProfile({
43752
+ variantKey: "bio",
43753
+ family: "media-text",
43754
+ weight: "featured",
43755
+ bias: "soft"
42500
43756
  })
42501
43757
  ]
42502
43758
  })),
@@ -43304,7 +44560,7 @@ import React4 from "react";
43304
44560
  // ../blocks/src/system/data/linkedContentEntries.ts
43305
44561
  var LINKED_CONTENT_ENTRY_META_KEY = "__rbLinkedContentEntry";
43306
44562
  function coerceLinkedContentEntriesPayload(payload) {
43307
- if (!isRecord7(payload)) return payload;
44563
+ if (!isRecord9(payload)) return payload;
43308
44564
  const response = payload;
43309
44565
  if (!Array.isArray(response.entries)) return payload;
43310
44566
  const contentType = parsePublicContentTypeMeta(response.contentType);
@@ -43312,16 +44568,16 @@ function coerceLinkedContentEntriesPayload(payload) {
43312
44568
  return response.entries.map((entry) => enrichLinkedContentEntry(entry, contentType));
43313
44569
  }
43314
44570
  function getLinkedContentEntryMeta(value) {
43315
- if (!isRecord7(value)) return null;
44571
+ if (!isRecord9(value)) return null;
43316
44572
  const candidate = value[LINKED_CONTENT_ENTRY_META_KEY];
43317
44573
  return isLinkedContentEntryMeta(candidate) ? candidate : null;
43318
44574
  }
43319
44575
  function buildLinkedContentEditTarget(input) {
43320
44576
  const { entry, sourceBlockId, sourceBlockKind, itemIndex } = input;
43321
- if (!isRecord7(entry)) return null;
44577
+ if (!isRecord9(entry)) return null;
43322
44578
  const meta = getLinkedContentEntryMeta(entry);
43323
44579
  if (!meta || meta.support.kind !== "supported") return null;
43324
- const content = isRecord7(entry.content) ? entry.content : {};
44580
+ const content = isRecord9(entry.content) ? entry.content : {};
43325
44581
  return {
43326
44582
  kind: "linked-content-entry",
43327
44583
  entryId: meta.entryId,
@@ -43371,12 +44627,12 @@ function resolveLinkedEntryInlineFieldEligibility(input) {
43371
44627
  };
43372
44628
  }
43373
44629
  function enrichLinkedContentEntry(entry, contentType) {
43374
- if (!isRecord7(entry)) return entry;
44630
+ if (!isRecord9(entry)) return entry;
43375
44631
  const entryId = typeof entry.id === "string" ? entry.id : null;
43376
44632
  if (!entryId) return entry;
43377
44633
  const title = typeof entry.title === "string" && entry.title.trim().length > 0 ? entry.title : entryId;
43378
44634
  const optimisticHash = typeof entry.optimisticHash === "string" && entry.optimisticHash.length > 0 ? entry.optimisticHash : null;
43379
- const content = isRecord7(entry.content) ? entry.content : {};
44635
+ const content = isRecord9(entry.content) ? entry.content : {};
43380
44636
  const meta = {
43381
44637
  kind: "linked-content-entry",
43382
44638
  entryId,
@@ -43472,7 +44728,7 @@ function capitalize(value) {
43472
44728
  return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();
43473
44729
  }
43474
44730
  function parsePublicContentTypeMeta(value) {
43475
- if (!isRecord7(value)) return null;
44731
+ if (!isRecord9(value)) return null;
43476
44732
  if (typeof value.key !== "string" || value.key.trim().length === 0) return null;
43477
44733
  return {
43478
44734
  key: value.key,
@@ -43482,7 +44738,7 @@ function parsePublicContentTypeMeta(value) {
43482
44738
  };
43483
44739
  }
43484
44740
  function parsePublicContentTypeLinkedEntryEditing(value) {
43485
- if (!isRecord7(value) || typeof value.kind !== "string") return null;
44741
+ if (!isRecord9(value) || typeof value.kind !== "string") return null;
43486
44742
  switch (value.kind) {
43487
44743
  case "generic":
43488
44744
  return { kind: "generic" };
@@ -43496,7 +44752,7 @@ function parsePublicContentTypeLinkedEntryEditing(value) {
43496
44752
  }
43497
44753
  }
43498
44754
  function parsePublicContentTypeFieldMeta(value) {
43499
- if (!isRecord7(value)) return [];
44755
+ if (!isRecord9(value)) return [];
43500
44756
  if (typeof value.id !== "string" || typeof value.type !== "string") return [];
43501
44757
  return [{
43502
44758
  id: value.id,
@@ -43511,14 +44767,14 @@ function parseStringArray(value) {
43511
44767
  return value.filter((item) => typeof item === "string");
43512
44768
  }
43513
44769
  function isLinkedContentEntryMeta(value) {
43514
- if (!isRecord7(value)) return false;
44770
+ if (!isRecord9(value)) return false;
43515
44771
  if (value.kind !== "linked-content-entry") return false;
43516
44772
  if (typeof value.entryId !== "string") return false;
43517
44773
  if (typeof value.contentTypeKey !== "string") return false;
43518
44774
  if (typeof value.contentTypeLabel !== "string") return false;
43519
44775
  if (typeof value.title !== "string") return false;
43520
44776
  if (!(value.optimisticHash === null || typeof value.optimisticHash === "string")) return false;
43521
- if (!isRecord7(value.contentType)) return false;
44777
+ if (!isRecord9(value.contentType)) return false;
43522
44778
  if (!isLinkedEntryFieldSourceArray(value.fieldSources)) return false;
43523
44779
  return isLinkedContentEditSupport(value.support);
43524
44780
  }
@@ -43526,7 +44782,7 @@ function isLinkedEntryFieldSourceArray(value) {
43526
44782
  return Array.isArray(value) && value.every(isLinkedEntryFieldSource);
43527
44783
  }
43528
44784
  function isLinkedEntryFieldSource(value) {
43529
- if (!isRecord7(value)) return false;
44785
+ if (!isRecord9(value)) return false;
43530
44786
  if (typeof value.displayPath !== "string") return false;
43531
44787
  switch (value.kind) {
43532
44788
  case "content-field":
@@ -43552,7 +44808,7 @@ function isLinkedEntryInlineFieldReadOnlyReason(value) {
43552
44808
  }
43553
44809
  }
43554
44810
  function isLinkedContentEditSupport(value) {
43555
- if (!isRecord7(value) || typeof value.kind !== "string") return false;
44811
+ if (!isRecord9(value) || typeof value.kind !== "string") return false;
43556
44812
  switch (value.kind) {
43557
44813
  case "supported":
43558
44814
  return true;
@@ -43564,7 +44820,7 @@ function isLinkedContentEditSupport(value) {
43564
44820
  return false;
43565
44821
  }
43566
44822
  }
43567
- function isRecord7(value) {
44823
+ function isRecord9(value) {
43568
44824
  return typeof value === "object" && value !== null && !Array.isArray(value);
43569
44825
  }
43570
44826
 
@@ -45091,12 +46347,12 @@ function toTrimmedString(value) {
45091
46347
  return trimmed ? trimmed : void 0;
45092
46348
  }
45093
46349
  function normalizeBookingFormConfig(form2) {
45094
- if (!isRecord8(form2)) return null;
46350
+ if (!isRecord10(form2)) return null;
45095
46351
  const id = readNonEmptyString(form2.id);
45096
46352
  const name = readNonEmptyString(form2.name);
45097
46353
  if (!id || !name) return null;
45098
- const schemaSource = isRecord8(form2.schema) ? form2.schema : isRecord8(form2.schemaJson) ? form2.schemaJson : null;
45099
- const settingsSource = isRecord8(form2.settings) ? form2.settings : isRecord8(form2.settingsJson) ? form2.settingsJson : null;
46354
+ const schemaSource = isRecord10(form2.schema) ? form2.schema : isRecord10(form2.schemaJson) ? form2.schemaJson : null;
46355
+ const settingsSource = isRecord10(form2.settings) ? form2.settings : isRecord10(form2.settingsJson) ? form2.settingsJson : null;
45100
46356
  return {
45101
46357
  id,
45102
46358
  name,
@@ -45120,10 +46376,10 @@ function normalizeBookingServices(services) {
45120
46376
  if (Array.isArray(services)) {
45121
46377
  return services.filter(isBookingFormService).map(normalizeService);
45122
46378
  }
45123
- if (isRecord8(services) && "services" in services) {
46379
+ if (isRecord10(services) && "services" in services) {
45124
46380
  return Array.isArray(services.services) ? services.services.filter(isBookingFormService).map(normalizeService) : [];
45125
46381
  }
45126
- return isRecord8(services) ? Object.values(services).filter(isBookingFormService).map(normalizeService) : [];
46382
+ return isRecord10(services) ? Object.values(services).filter(isBookingFormService).map(normalizeService) : [];
45127
46383
  }
45128
46384
  function normalizeBookingSchema(value) {
45129
46385
  if (!value) return void 0;
@@ -45135,7 +46391,7 @@ function normalizeBookingSchema(value) {
45135
46391
  };
45136
46392
  }
45137
46393
  function readBookingFormField(value) {
45138
- if (!isRecord8(value)) return null;
46394
+ if (!isRecord10(value)) return null;
45139
46395
  const id = readNonEmptyString(value.id);
45140
46396
  const label = readNonEmptyString(value.label);
45141
46397
  const type = readBookingFieldType(value.type);
@@ -45181,7 +46437,7 @@ function readBookingFieldOptions(value) {
45181
46437
  return options.length > 0 ? options : void 0;
45182
46438
  }
45183
46439
  function readBookingFieldOption(value) {
45184
- if (!isRecord8(value)) return null;
46440
+ if (!isRecord10(value)) return null;
45185
46441
  const optionValue = readNonEmptyString(value.value);
45186
46442
  const label = readNonEmptyString(value.label);
45187
46443
  return optionValue && label ? { value: optionValue, label } : null;
@@ -45198,7 +46454,7 @@ function normalizeBookingSettings(value) {
45198
46454
  };
45199
46455
  }
45200
46456
  function isBookingFormService(value) {
45201
- return isRecord8(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
46457
+ return isRecord10(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
45202
46458
  }
45203
46459
  function readNonEmptyString(value) {
45204
46460
  if (typeof value !== "string") return null;
@@ -45216,7 +46472,7 @@ function readStringArray(value) {
45216
46472
  const strings = value.filter((item) => typeof item === "string");
45217
46473
  return strings.length > 0 ? strings : void 0;
45218
46474
  }
45219
- function isRecord8(value) {
46475
+ function isRecord10(value) {
45220
46476
  return typeof value === "object" && value !== null;
45221
46477
  }
45222
46478
 
@@ -45664,8 +46920,9 @@ function EventDetailsView({
45664
46920
  priceCents: selected.course.priceCents,
45665
46921
  currency: selected.course.currency
45666
46922
  }) : null;
45667
- const eventPricingType = publicEventPricingType(selected.pricing);
45668
- const eventPricingCurrency = publicEventPricingCurrency(selected.pricing) ?? "USD";
46923
+ const eventPricing = resolveRuntimeEventPricing(selected);
46924
+ const eventPricingType = publicEventPricingType(eventPricing);
46925
+ const eventPricingCurrency = publicEventPricingCurrency(eventPricing) ?? "USD";
45669
46926
  const isPaid = eventPricingType === "paid";
45670
46927
  const shouldShowCoursePricing = showCost && !isDropIn && coursePricing !== null;
45671
46928
  const shouldShowEventCost = showCost && isPaid && !isDropIn && coursePricing === null;
@@ -47833,6 +49090,9 @@ var EventListingSSR = (props2) => {
47833
49090
 
47834
49091
  // ../blocks/src/system/runtime/nodes/event-registration.server.tsx
47835
49092
  import { jsx as jsx48, jsxs as jsxs34 } from "react/jsx-runtime";
49093
+ function cx(...classes) {
49094
+ return classes.filter((className) => Boolean(className)).join(" ");
49095
+ }
47836
49096
  function EventRegistrationSSR({
47837
49097
  blockId,
47838
49098
  siteId,
@@ -47875,6 +49135,7 @@ function EventRegistrationSSR({
47875
49135
  stage,
47876
49136
  supportEmail
47877
49137
  });
49138
+ const display = islandProps.render.display;
47878
49139
  return /* @__PURE__ */ jsxs34(
47879
49140
  "div",
47880
49141
  {
@@ -47886,12 +49147,52 @@ function EventRegistrationSSR({
47886
49147
  ...getIslandRootProps("event-registration", blockId),
47887
49148
  children: [
47888
49149
  /* @__PURE__ */ jsx48(IslandPropsScript, { value: islandProps }),
47889
- /* @__PURE__ */ jsx48("div", { className: "event-registration__summary", children: /* @__PURE__ */ jsx48("strong", { children: "Loading booking options..." }) }),
49150
+ /* @__PURE__ */ jsx48(EventRegistrationShell, { display }),
47890
49151
  children
47891
49152
  ]
47892
49153
  }
47893
49154
  );
47894
49155
  }
49156
+ function EventRegistrationShell({
49157
+ display
49158
+ }) {
49159
+ return /* @__PURE__ */ jsx48("div", { className: "er-container er-registration-shell", "aria-busy": "true", role: "status", children: /* @__PURE__ */ jsxs34("div", { className: "er-payment-layout er-payment-layout--no-sidebar", children: [
49160
+ /* @__PURE__ */ jsxs34("div", { className: "er-payment-layout-main", children: [
49161
+ /* @__PURE__ */ jsx48("div", { className: "er-steps-nav er-registration-shell__steps", "aria-hidden": "true", children: /* @__PURE__ */ jsx48("ol", { className: "er-steps", children: display.stepLabels.map((label, index) => {
49162
+ const isActive = index === 0;
49163
+ return /* @__PURE__ */ jsxs34("li", { className: "er-step", children: [
49164
+ /* @__PURE__ */ jsx48("span", { className: cx("er-step-circle", isActive && "er-step-circle--active"), children: index + 1 }),
49165
+ /* @__PURE__ */ jsx48("span", { className: cx("er-step-label", isActive && "er-step-label--active"), children: label }),
49166
+ index < display.stepLabels.length - 1 ? /* @__PURE__ */ jsx48("span", { className: "er-step-connector" }) : null
49167
+ ] }, label);
49168
+ }) }) }),
49169
+ /* @__PURE__ */ jsxs34("div", { className: "er-stack", children: [
49170
+ /* @__PURE__ */ jsxs34("div", { children: [
49171
+ /* @__PURE__ */ jsx48("p", { className: "er-registration-shell__eyebrow", children: "Registration" }),
49172
+ /* @__PURE__ */ jsx48("h3", { className: "er-title er-registration-shell__title", children: display.titleText }),
49173
+ /* @__PURE__ */ jsx48("p", { className: "er-text er-text--muted er-registration-shell__copy", children: display.bodyText })
49174
+ ] }),
49175
+ /* @__PURE__ */ jsxs34("div", { className: "er-event-grid er-registration-shell__cards", "aria-hidden": "true", children: [
49176
+ /* @__PURE__ */ jsxs34("div", { className: "er-event-card er-registration-shell__card", children: [
49177
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--lg" }),
49178
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--sm" })
49179
+ ] }),
49180
+ /* @__PURE__ */ jsxs34("div", { className: "er-event-card er-registration-shell__card", children: [
49181
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--md" }),
49182
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--xs" })
49183
+ ] })
49184
+ ] })
49185
+ ] })
49186
+ ] }),
49187
+ /* @__PURE__ */ jsx48("div", { className: "er-payment-layout-footer", children: /* @__PURE__ */ jsxs34("div", { className: "er-summary-bar er-registration-shell__summary", "aria-hidden": "true", children: [
49188
+ /* @__PURE__ */ jsxs34("div", { className: "er-summary-bar-info", children: [
49189
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--md" }),
49190
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--xs" })
49191
+ ] }),
49192
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__button-placeholder", children: display.summaryButtonText })
49193
+ ] }) })
49194
+ ] }) });
49195
+ }
47895
49196
  var event_registration_server_default = EventRegistrationSSR;
47896
49197
 
47897
49198
  // ../blocks/src/system/runtime/shared/components/FeedbackMessage.tsx
@@ -48477,14 +49778,14 @@ function isDecoratedHeadingBlockKind(blockKind) {
48477
49778
  return blockKind === "block.intro" || blockKind === "block.feature-cards" || blockKind === "block.testimonials" || blockKind === "block.faq";
48478
49779
  }
48479
49780
  function readVariant(blockContent) {
48480
- if (!isRecord9(blockContent)) return void 0;
49781
+ if (!isRecord11(blockContent)) return void 0;
48481
49782
  const variant = blockContent.variant;
48482
49783
  return typeof variant === "string" ? variant : void 0;
48483
49784
  }
48484
49785
  function isFaqDecoratedVariant(variant) {
48485
49786
  return variant === "default" || variant === "question-columns";
48486
49787
  }
48487
- function isRecord9(value) {
49788
+ function isRecord11(value) {
48488
49789
  return typeof value === "object" && value !== null && !Array.isArray(value);
48489
49790
  }
48490
49791
  function buildHeadingDecorationWrapperClassName(className) {
@@ -49949,20 +51250,20 @@ function generateInputCss({
49949
51250
  baseInputRules.push("background-color: transparent");
49950
51251
  } else {
49951
51252
  baseInputRules.push(
49952
- `background-color: rgb(var(--tb-${inputSystem.base.background.colorToken}))`
51253
+ `background-color: ${rgbColorValue(inputSystem.base.background.colorToken)}`
49953
51254
  );
49954
51255
  }
49955
- baseInputRules.push(`color: rgb(var(--tb-${inputSystem.base.textColorToken}))`);
51256
+ baseInputRules.push(`color: ${rgbColorValue(inputSystem.base.textColorToken)}`);
49956
51257
  const borderPx = parseBorderWidth(inputSystem.base.border.widthClass);
49957
51258
  const borderStyle = inputSystem.base.border.style ?? "all";
49958
51259
  if (borderStyle === "underline") {
49959
51260
  baseInputRules.push("border: none");
49960
51261
  baseInputRules.push(
49961
- `border-bottom: ${borderPx} solid rgb(var(--tb-${inputSystem.base.border.colorToken}))`
51262
+ `border-bottom: ${borderPx} solid ${rgbColorValue(inputSystem.base.border.colorToken)}`
49962
51263
  );
49963
51264
  } else {
49964
51265
  baseInputRules.push(
49965
- `border: ${borderPx} solid rgb(var(--tb-${inputSystem.base.border.colorToken}))`
51266
+ `border: ${borderPx} solid ${rgbColorValue(inputSystem.base.border.colorToken)}`
49966
51267
  );
49967
51268
  }
49968
51269
  if (borderStyle === "underline") {
@@ -49989,7 +51290,7 @@ function generateInputCss({
49989
51290
  baseInputRules.push("transition: border-color 0.2s ease, box-shadow 0.2s ease");
49990
51291
  const labelSelector = `${rootSelector} .form-label`;
49991
51292
  const labelRules = [];
49992
- labelRules.push(`color: rgb(var(--tb-${inputSystem.label.textColorToken}))`);
51293
+ labelRules.push(`color: ${rgbColorValue(inputSystem.label.textColorToken)}`);
49993
51294
  labelRules.push(`font-weight: ${FONT_WEIGHT_MAP[inputSystem.label.fontWeight]}`);
49994
51295
  labelRules.push(`font-size: ${LABEL_FONT_SIZE_MAP[inputSystem.label.fontSize]}`);
49995
51296
  if (inputSystem.label.textTransform && inputSystem.label.textTransform !== "none") {
@@ -50030,9 +51331,9 @@ function generateInputCss({
50030
51331
  ];
50031
51332
  const focusRules = [];
50032
51333
  focusRules.push("outline: none");
50033
- focusRules.push(`box-shadow: 0 0 0 ${inputSystem.focus.ringWidth}px rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
51334
+ focusRules.push(`box-shadow: 0 0 0 ${inputSystem.focus.ringWidth}px ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
50034
51335
  if (inputSystem.focus.borderColorToken) {
50035
- focusRules.push(`border-color: rgb(var(--tb-${inputSystem.focus.borderColorToken}))`);
51336
+ focusRules.push(`border-color: ${rgbColorValue(inputSystem.focus.borderColorToken)}`);
50036
51337
  }
50037
51338
  const errorSelectors = [
50038
51339
  `${inputSelector}[aria-invalid="true"]`,
@@ -50040,16 +51341,16 @@ function generateInputCss({
50040
51341
  `${selectSelector}[aria-invalid="true"]`
50041
51342
  ];
50042
51343
  const errorRules = [];
50043
- errorRules.push(`border-color: rgb(var(--tb-${inputSystem.error.borderColorToken}))`);
50044
- errorRules.push(`color: rgb(var(--tb-${inputSystem.error.textColorToken}))`);
51344
+ errorRules.push(`border-color: ${rgbColorValue(inputSystem.error.borderColorToken)}`);
51345
+ errorRules.push(`color: ${rgbColorValue(inputSystem.error.textColorToken)}`);
50045
51346
  const disabledSelectors = [
50046
51347
  `${inputSelector}:disabled`,
50047
51348
  `${textareaSelector}:disabled`,
50048
51349
  `${selectSelector}:disabled`
50049
51350
  ];
50050
51351
  const disabledRules = [];
50051
- disabledRules.push(`background-color: rgb(var(--tb-${inputSystem.disabled.backgroundColorToken}))`);
50052
- disabledRules.push(`color: rgb(var(--tb-${inputSystem.disabled.textColorToken}))`);
51352
+ disabledRules.push(`background-color: ${rgbColorValue(inputSystem.disabled.backgroundColorToken)}`);
51353
+ disabledRules.push(`color: ${rgbColorValue(inputSystem.disabled.textColorToken)}`);
50053
51354
  disabledRules.push(`opacity: ${inputSystem.disabled.opacity}`);
50054
51355
  disabledRules.push("cursor: not-allowed");
50055
51356
  const checkboxSelector = `${rootSelector} .form-checkbox`;
@@ -50059,12 +51360,12 @@ function generateInputCss({
50059
51360
  checkableRules.push("width: 1rem");
50060
51361
  checkableRules.push("height: 1rem");
50061
51362
  checkableRules.push("flex-shrink: 0");
50062
- checkableRules.push(`border: ${borderPx} solid rgb(var(--tb-${inputSystem.base.border.colorToken}))`);
51363
+ checkableRules.push(`border: ${borderPx} solid ${rgbColorValue(inputSystem.base.border.colorToken)}`);
50063
51364
  if (inputSystem.base.background.type === "transparent") {
50064
51365
  checkableRules.push("background-color: transparent");
50065
51366
  } else {
50066
51367
  checkableRules.push(
50067
- `background-color: rgb(var(--tb-${inputSystem.base.background.colorToken}))`
51368
+ `background-color: ${rgbColorValue(inputSystem.base.background.colorToken)}`
50068
51369
  );
50069
51370
  }
50070
51371
  checkableRules.push("cursor: pointer");
@@ -50075,22 +51376,22 @@ function generateInputCss({
50075
51376
  radioSpecificRules.push("border-radius: 9999px");
50076
51377
  const checkboxCheckedSelector = `${checkboxSelector}:checked`;
50077
51378
  const checkboxCheckedRules = [];
50078
- checkboxCheckedRules.push(`background-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
50079
- checkboxCheckedRules.push(`border-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
51379
+ checkboxCheckedRules.push(`background-color: ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
51380
+ checkboxCheckedRules.push(`border-color: ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
50080
51381
  checkboxCheckedRules.push(`background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")`);
50081
51382
  checkboxCheckedRules.push("background-size: 100% 100%");
50082
51383
  checkboxCheckedRules.push("background-position: center");
50083
51384
  checkboxCheckedRules.push("background-repeat: no-repeat");
50084
51385
  const radioCheckedSelector = `${radioSelector}:checked`;
50085
51386
  const radioCheckedRules = [];
50086
- radioCheckedRules.push(`background-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
50087
- radioCheckedRules.push(`border-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
51387
+ radioCheckedRules.push(`background-color: ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
51388
+ radioCheckedRules.push(`border-color: ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
50088
51389
  radioCheckedRules.push("background-image: radial-gradient(circle, white 40%, transparent 40%)");
50089
51390
  const checkboxFocusSelector = `${checkboxSelector}:focus-visible`;
50090
51391
  const radioFocusSelector = `${radioSelector}:focus-visible`;
50091
51392
  const checkableFocusRules = [];
50092
51393
  checkableFocusRules.push("outline: none");
50093
- checkableFocusRules.push(`box-shadow: 0 0 0 ${inputSystem.focus.ringWidth}px rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
51394
+ checkableFocusRules.push(`box-shadow: 0 0 0 ${inputSystem.focus.ringWidth}px ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
50094
51395
  const cssBlocks = [];
50095
51396
  cssBlocks.push(`${labelSelector} {
50096
51397
  ${labelRules.join(";\n ")};
@@ -51938,6 +53239,11 @@ ${root} {
51938
53239
  --er-event-card-bg: rgb(var(--tb-surface));
51939
53240
  --er-event-card-border-width: var(--rb-border-width, 1px);
51940
53241
  --er-event-card-hover-opacity: 1;
53242
+ --er-control-bg: rgb(var(--tb-background, var(--tb-surface)));
53243
+ --er-control-text: rgb(var(--tb-foreground, var(--tb-text)));
53244
+ --er-radius: var(--rb-block-radius);
53245
+ --er-surface-muted: rgba(var(--tb-muted, 241 245 249), 0.42);
53246
+ --er-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
51941
53247
 
51942
53248
  /* Step indicator */
51943
53249
  --er-step-active: rgb(var(--tb-primary));
@@ -52938,7 +54244,7 @@ function buildThemeCssVars(theme) {
52938
54244
  // These expose inputStyle/InputSystem values for blocks that can't use .form-* classes
52939
54245
  [THEME_RADIUS_CSS_VARS.input]: inputRadius,
52940
54246
  ["--rb-input-focus-width"]: `${inputSystem.focus.ringWidth}px`,
52941
- ["--rb-input-focus-color"]: `rgb(var(--tb-${inputSystem.focus.ringColorToken}))`,
54247
+ ["--rb-input-focus-color"]: rgbColorValue(inputSystem.focus.ringColorToken),
52942
54248
  // Deprecated compatibility aliases for pre-v2 block/custom CSS. New CSS should
52943
54249
  // consume the semantic --rb-* primitives above.
52944
54250
  [THEME_RADIUS_CSS_VARS.legacyCard]: blockRadius,
@@ -53264,8 +54570,8 @@ function hydrateValue(value, context) {
53264
54570
  return isUnchanged ? value : Object.fromEntries(resolvedEntries);
53265
54571
  }
53266
54572
  return value;
53267
- } catch (err2) {
53268
- console.error("[hydrateLinks] Error hydrating value:", err2, value);
54573
+ } catch (err3) {
54574
+ console.error("[hydrateLinks] Error hydrating value:", err3, value);
53269
54575
  return value;
53270
54576
  }
53271
54577
  }
@@ -53705,6 +55011,11 @@ var MemoBlockSection = React6.memo(
53705
55011
  siteId: dataContext?.siteId,
53706
55012
  apiBaseUrl: dataContext?.apiBaseUrl,
53707
55013
  portalToken: dataContext?.portalToken ?? null,
55014
+ previewToken: dataContext?.previewToken ?? null,
55015
+ stage: dataContext?.previewStage,
55016
+ occurrenceContext: dataContext?.occurrenceContext ?? null,
55017
+ entrySubrouteContext: dataContext?.entrySubrouteContext ?? null,
55018
+ contentEntry: dataContext?.contentEntry ?? null,
53708
55019
  supabaseUrl: dataContext?.supabaseUrl,
53709
55020
  imageResolveContext: resolvedImageResolveContext,
53710
55021
  blockId: block.id ?? null,
@@ -53828,6 +55139,11 @@ var MemoBlockSection = React6.memo(
53828
55139
  siteId: dataContext?.siteId,
53829
55140
  apiBaseUrl: dataContext?.apiBaseUrl,
53830
55141
  portalToken: dataContext?.portalToken ?? null,
55142
+ previewToken: dataContext?.previewToken ?? null,
55143
+ stage: dataContext?.previewStage,
55144
+ occurrenceContext: dataContext?.occurrenceContext ?? null,
55145
+ entrySubrouteContext: dataContext?.entrySubrouteContext ?? null,
55146
+ contentEntry: dataContext?.contentEntry ?? null,
53831
55147
  supabaseUrl: dataContext?.supabaseUrl,
53832
55148
  imageResolveContext: resolvedImageResolveContext,
53833
55149
  blockId: block.id ?? null,
@@ -54014,6 +55330,9 @@ var containerResponsiveThemeCss = `/*
54014
55330
  letter-spacing: 0.025em;
54015
55331
  text-transform: uppercase;
54016
55332
  }
55333
+ .rb-eyebrow-treatment-accent {
55334
+ color: rgb(var(--tb-accent));
55335
+ }
54017
55336
  .rb-eyebrow-treatment-pill {
54018
55337
  align-self: center;
54019
55338
  display: inline-flex;
@@ -54068,6 +55387,27 @@ var containerResponsiveThemeCss = `/*
54068
55387
  font-weight: 400;
54069
55388
  }
54070
55389
 
55390
+ /* Media shape treatments */
55391
+ .rb-media-shape-square,
55392
+ .rb-media-shape-rounded,
55393
+ .rb-media-shape-circle,
55394
+ .rb-media-shape-arch {
55395
+ overflow: hidden;
55396
+ }
55397
+ .rb-media-shape-square {
55398
+ border-radius: 0;
55399
+ }
55400
+ .rb-media-shape-rounded {
55401
+ border-radius: var(--rb-media-shape-radius, 1rem);
55402
+ }
55403
+ .rb-media-shape-circle {
55404
+ border-radius: 9999px;
55405
+ }
55406
+ .rb-media-shape-arch {
55407
+ border-radius: 9999px 9999px var(--rb-media-shape-arch-base-radius, 0.125rem)
55408
+ var(--rb-media-shape-arch-base-radius, 0.125rem);
55409
+ }
55410
+
54071
55411
  /* Navigation typography */
54072
55412
  .rb-nav-text {
54073
55413
  font-size: 0.875rem;
@@ -57222,7 +58562,7 @@ var containerResponsiveThemeCss = `/*
57222
58562
  :where(.theme-scope) :where([data-block="event-registration"]) .er-container {
57223
58563
  border-radius: var(--rb-block-radius);
57224
58564
  border: 1px solid var(--er-border);
57225
- padding: 1.5rem;
58565
+ padding: clamp(1rem, 2vw, 1.5rem);
57226
58566
  background: rgb(var(--tb-surface));
57227
58567
  color: var(--er-on-surface);
57228
58568
  transition: border-color var(--rb-block-transition) ease;
@@ -57231,6 +58571,109 @@ var containerResponsiveThemeCss = `/*
57231
58571
  margin-inline: 0;
57232
58572
  }
57233
58573
 
58574
+ /* SSR shell / required-island fallback */
58575
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell {
58576
+ min-height: 24rem;
58577
+ }
58578
+
58579
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__steps {
58580
+ margin-bottom: 1.25rem;
58581
+ }
58582
+
58583
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__eyebrow {
58584
+ margin: 0 0 0.35rem;
58585
+ color: var(--er-on-surface-subtle);
58586
+ font-size: 0.75rem;
58587
+ font-weight: 700;
58588
+ letter-spacing: 0.04em;
58589
+ line-height: 1.2;
58590
+ text-transform: uppercase;
58591
+ }
58592
+
58593
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__title {
58594
+ margin: 0;
58595
+ }
58596
+
58597
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__copy {
58598
+ margin: 0.35rem 0 0;
58599
+ max-width: 36rem;
58600
+ line-height: 1.45;
58601
+ }
58602
+
58603
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__cards {
58604
+ margin-top: 0.25rem;
58605
+ overflow: hidden;
58606
+ border: 1px solid var(--er-border);
58607
+ border-radius: var(--rb-block-radius);
58608
+ background: var(--er-control-bg);
58609
+ }
58610
+
58611
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__card {
58612
+ display: grid;
58613
+ gap: 0.5rem;
58614
+ padding: 1rem;
58615
+ }
58616
+
58617
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line {
58618
+ height: 0.75rem;
58619
+ border-radius: 9999px;
58620
+ background: linear-gradient(
58621
+ 90deg,
58622
+ var(--er-shell-line),
58623
+ rgba(var(--tb-primary), 0.12),
58624
+ var(--er-shell-line)
58625
+ );
58626
+ }
58627
+
58628
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--lg {
58629
+ width: min(26rem, 82%);
58630
+ }
58631
+
58632
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--md {
58633
+ width: min(19rem, 68%);
58634
+ }
58635
+
58636
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--sm {
58637
+ width: min(14rem, 52%);
58638
+ }
58639
+
58640
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--xs {
58641
+ width: min(10rem, 42%);
58642
+ }
58643
+
58644
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__summary {
58645
+ align-items: center;
58646
+ border-radius: calc(var(--rb-block-radius) * 0.75);
58647
+ border: 1px solid var(--er-summary-border);
58648
+ padding: 0.875rem 1rem;
58649
+ }
58650
+
58651
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__button-placeholder {
58652
+ display: inline-flex;
58653
+ min-height: 2.5rem;
58654
+ align-items: center;
58655
+ justify-content: center;
58656
+ border-radius: calc(var(--rb-block-radius) * 0.6);
58657
+ background: rgb(var(--tb-primary));
58658
+ color: rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255)));
58659
+ padding: 0.625rem 1rem;
58660
+ font-size: 0.875rem;
58661
+ font-weight: 600;
58662
+ line-height: 1.2;
58663
+ text-align: center;
58664
+ white-space: nowrap;
58665
+ }
58666
+
58667
+ :where(.theme-scope) :where([data-block="event-registration"]) .event-registration__hydration-error {
58668
+ border-radius: var(--rb-block-radius);
58669
+ border: 1px solid var(--er-border-error);
58670
+ background: var(--er-error-bg);
58671
+ color: var(--er-error-text);
58672
+ padding: 1rem;
58673
+ font-size: 0.9375rem;
58674
+ line-height: 1.45;
58675
+ }
58676
+
57234
58677
  :where(.theme-scope) :where([data-block="event-registration"].event-registration--embedded) .er-container {
57235
58678
  max-width: none;
57236
58679
  padding: 0;
@@ -57278,6 +58721,7 @@ var containerResponsiveThemeCss = `/*
57278
58721
  padding: 1rem;
57279
58722
  border-radius: calc(var(--rb-block-radius) * 0.75);
57280
58723
  border: 1px solid var(--er-border);
58724
+ background: var(--er-surface-muted);
57281
58725
  }
57282
58726
 
57283
58727
  /* Ticket counter */
@@ -57323,14 +58767,23 @@ var containerResponsiveThemeCss = `/*
57323
58767
  /* Form inputs */
57324
58768
  :where(.theme-scope) :where([data-block="event-registration"]) .er-input {
57325
58769
  width: 100%;
57326
- padding: 0.5rem 0.75rem;
58770
+ min-height: 2.75rem;
58771
+ padding: 0.625rem 0.75rem;
57327
58772
  border-radius: calc(var(--rb-block-radius) * 0.5);
57328
58773
  border: 1px solid var(--er-border);
57329
- background: transparent;
58774
+ background: var(--er-control-bg);
58775
+ color: var(--er-control-text);
58776
+ font: inherit;
58777
+ line-height: 1.4;
57330
58778
  transition: border-color var(--rb-block-transition) ease,
58779
+ background-color var(--rb-block-transition) ease,
57331
58780
  box-shadow var(--rb-block-transition) ease;
57332
58781
  }
57333
58782
 
58783
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-input::placeholder {
58784
+ color: var(--er-on-surface-faint);
58785
+ }
58786
+
57334
58787
  :where(.theme-scope) :where([data-block="event-registration"]) .er-input:focus {
57335
58788
  outline: none;
57336
58789
  border-color: var(--er-border-selected);
@@ -57452,7 +58905,7 @@ var containerResponsiveThemeCss = `/*
57452
58905
  }
57453
58906
 
57454
58907
  :where(.theme-scope) :where([data-block="event-registration"]) .er-event-grid .er-event-card {
57455
- padding: 0.75rem 0;
58908
+ padding: 0.875rem 0;
57456
58909
  border-width: 0 0 var(--rb-event-tile-border-width, var(--rb-border-width, 1px)) 0;
57457
58910
  border-style: solid;
57458
58911
  border-radius: 0;
@@ -57684,21 +59137,24 @@ var containerResponsiveThemeCss = `/*
57684
59137
  align-items: flex-start;
57685
59138
  gap: 0.75rem;
57686
59139
  padding: 1rem;
57687
- border: 2px solid var(--er-payment-border);
59140
+ border: 1px solid var(--er-payment-border);
57688
59141
  border-radius: var(--rb-block-radius);
57689
- background: transparent;
59142
+ background: var(--er-control-bg);
57690
59143
  cursor: pointer;
57691
59144
  transition: border-color var(--rb-block-transition) ease,
59145
+ box-shadow var(--rb-block-transition) ease,
57692
59146
  background-color var(--rb-block-transition) ease;
57693
59147
  }
57694
59148
 
57695
59149
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-option:hover {
57696
59150
  border-color: var(--er-payment-border-hover);
59151
+ box-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
57697
59152
  }
57698
59153
 
57699
59154
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-option--selected {
57700
59155
  border-color: var(--er-payment-border-selected);
57701
59156
  background-color: var(--er-payment-bg-selected);
59157
+ box-shadow: 0 0 0 1px var(--er-payment-border-selected);
57702
59158
  }
57703
59159
 
57704
59160
  /* Discount code entry */
@@ -58386,22 +59842,25 @@ var containerResponsiveThemeCss = `/*
58386
59842
  justify-content: center;
58387
59843
  gap: 0.25rem;
58388
59844
  padding: 0.75rem 0.625rem;
58389
- border: 2px solid var(--er-payment-border);
59845
+ border: 1px solid var(--er-payment-border);
58390
59846
  border-radius: var(--rb-block-radius);
58391
- background: transparent;
59847
+ background: var(--er-control-bg);
58392
59848
  cursor: pointer;
58393
59849
  text-align: center;
58394
59850
  transition: border-color var(--rb-block-transition) ease,
59851
+ box-shadow var(--rb-block-transition) ease,
58395
59852
  background-color var(--rb-block-transition) ease;
58396
59853
  }
58397
59854
 
58398
59855
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-tile:hover:not([aria-disabled="true"]) {
58399
59856
  border-color: var(--er-payment-border-hover);
59857
+ box-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
58400
59858
  }
58401
59859
 
58402
59860
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-tile--selected {
58403
59861
  border-color: var(--er-payment-border-selected);
58404
59862
  background-color: var(--er-payment-bg-selected);
59863
+ box-shadow: 0 0 0 1px var(--er-payment-border-selected);
58405
59864
  }
58406
59865
 
58407
59866
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-tile--disabled {
@@ -58504,11 +59963,10 @@ var containerResponsiveThemeCss = `/*
58504
59963
  justify-content: space-between;
58505
59964
  align-items: flex-start;
58506
59965
  gap: 1rem;
58507
- padding: 0.875rem 0;
58508
- background: transparent;
58509
- border-top: 1px solid var(--er-summary-border);
58510
- border-bottom: 1px solid var(--er-summary-border);
58511
- border-radius: 0;
59966
+ padding: 0.875rem 1rem;
59967
+ background: var(--er-surface-muted);
59968
+ border: 1px solid var(--er-summary-border);
59969
+ border-radius: calc(var(--rb-block-radius) * 0.75);
58512
59970
  }
58513
59971
 
58514
59972
  :where(.theme-scope) :where([data-block="event-registration"]) .er-summary-bar-info {
@@ -60280,18 +61738,10 @@ var containerResponsiveThemeCss = `/*
60280
61738
  /* Two-column row (opt-in per field via schema layout) */
60281
61739
  :where(.theme-scope) :where([data-block="form"]) .fb-row-2 {
60282
61740
  display: grid;
60283
- grid-template-columns: 1fr;
61741
+ grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr));
60284
61742
  gap: 1rem;
60285
61743
  }
60286
61744
 
60287
- @container rb-site (min-width: 768px) {
60288
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
60289
- :where(.theme-scope) :where([data-block="form"]) .fb-row-2 {
60290
- grid-template-columns: 1fr 1fr;
60291
- }
60292
- }
60293
- }
60294
-
60295
61745
  /* Field wrapper */
60296
61746
  :where(.theme-scope) :where([data-block="form"]) .fb-field {
60297
61747
  display: flex;
@@ -60365,6 +61815,10 @@ var containerResponsiveThemeCss = `/*
60365
61815
  }
60366
61816
 
60367
61817
  /* Subheadline - supporting text below headline */
61818
+ :where(.theme-scope) :where([data-block="hero"]) .hero-headline {
61819
+ text-wrap: balance;
61820
+ }
61821
+
60368
61822
  :where(.theme-scope) :where([data-block="hero"]) .hero-subheadline {
60369
61823
  font-size: 1.125rem;
60370
61824
  color: var(--section-supporting-color, var(--section-text-color, rgb(var(--tb-text))));
@@ -60390,8 +61844,8 @@ var containerResponsiveThemeCss = `/*
60390
61844
  }
60391
61845
 
60392
61846
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-editorial .hero-headline {
60393
- font-size: clamp(2.5rem, 5vw, 4rem);
60394
- line-height: 1.08;
61847
+ font-size: clamp(2.75rem, 5.6vw, 4.75rem);
61848
+ line-height: 1.06;
60395
61849
  }
60396
61850
 
60397
61851
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-editorial .hero-subheadline {
@@ -60400,8 +61854,8 @@ var containerResponsiveThemeCss = `/*
60400
61854
  }
60401
61855
 
60402
61856
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-display .hero-headline {
60403
- font-size: clamp(3rem, 6vw, 5rem);
60404
- line-height: 1.04;
61857
+ font-size: clamp(3.5rem, 7.2vw, 6.25rem);
61858
+ line-height: 1;
60405
61859
  }
60406
61860
 
60407
61861
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-display .hero-subheadline {
@@ -60410,8 +61864,8 @@ var containerResponsiveThemeCss = `/*
60410
61864
  }
60411
61865
 
60412
61866
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-poster .hero-headline {
60413
- font-size: clamp(3.5rem, 8vw, 6.5rem);
60414
- line-height: 0.98;
61867
+ font-size: clamp(4.25rem, 10vw, 8.5rem);
61868
+ line-height: 0.94;
60415
61869
  }
60416
61870
 
60417
61871
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-poster .hero-subheadline {
@@ -60420,13 +61874,13 @@ var containerResponsiveThemeCss = `/*
60420
61874
  }
60421
61875
 
60422
61876
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-medium.rb-hero-typography-poster .hero-headline {
60423
- font-size: clamp(3rem, 6.5vw, 5rem);
61877
+ font-size: clamp(3.5rem, 7.5vw, 6.5rem);
60424
61878
  }
60425
61879
 
60426
61880
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-long.rb-hero-typography-poster .hero-headline,
60427
61881
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-long.rb-hero-typography-display .hero-headline {
60428
- font-size: clamp(2.75rem, 5.5vw, 4.5rem);
60429
- line-height: 1.05;
61882
+ font-size: clamp(3rem, 6vw, 5.25rem);
61883
+ line-height: 1.02;
60430
61884
  }
60431
61885
 
60432
61886
  @container rb-site (max-width: 639px) {
@@ -63148,8 +64602,9 @@ var containerResponsiveThemeCss = `/*
63148
64602
  /* Privacy note */
63149
64603
  :where(.theme-scope) .newsletter-privacy-note {
63150
64604
  margin-top: 0.75rem;
63151
- font-size: 0.75rem;
63152
- color: var(--section-supporting-color, rgb(var(--tb-mutedText)));
64605
+ font-size: 1rem;
64606
+ line-height: 1.6;
64607
+ color: var(--section-text-color, rgb(var(--tb-text)));
63153
64608
  text-align: center;
63154
64609
  }
63155
64610
 
@@ -63204,6 +64659,116 @@ var containerResponsiveThemeCss = `/*
63204
64659
  color: rgb(var(--tb-text));
63205
64660
  }
63206
64661
 
64662
+ /* =============================================================================
64663
+ * Block: Contact + Newsletter
64664
+ * =============================================================================
64665
+ */
64666
+
64667
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-grid {
64668
+ display: grid;
64669
+ grid-template-columns: repeat(auto-fit, minmax(min(24rem, 100%), 1fr));
64670
+ gap: clamp(2.5rem, 6vw, 4rem);
64671
+ align-items: start;
64672
+ }
64673
+
64674
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-column {
64675
+ min-width: 0;
64676
+ }
64677
+
64678
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-copy {
64679
+ margin-bottom: 1.5rem;
64680
+ }
64681
+
64682
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .form-copy-title,
64683
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-copy-title {
64684
+ margin: 0 0 0.75rem;
64685
+ }
64686
+
64687
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .form-copy-intro,
64688
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-copy-subtitle {
64689
+ color: var(--section-text-color, rgb(var(--tb-text)));
64690
+ }
64691
+
64692
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-info {
64693
+ display: flex;
64694
+ flex-direction: column;
64695
+ align-items: flex-start;
64696
+ }
64697
+
64698
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-form {
64699
+ max-width: none;
64700
+ margin-left: 0;
64701
+ margin-right: 0;
64702
+ }
64703
+
64704
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-privacy-note {
64705
+ text-align: left;
64706
+ }
64707
+
64708
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-form {
64709
+ display: flex;
64710
+ flex-direction: column;
64711
+ gap: 1rem;
64712
+ }
64713
+
64714
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-row-2 {
64715
+ display: grid;
64716
+ grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr));
64717
+ gap: 1rem;
64718
+ }
64719
+
64720
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-field {
64721
+ display: flex;
64722
+ flex-direction: column;
64723
+ gap: 0.25rem;
64724
+ }
64725
+
64726
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-fieldset {
64727
+ display: flex;
64728
+ flex-direction: column;
64729
+ gap: 0.5rem;
64730
+ border: none;
64731
+ padding: 0;
64732
+ margin: 0;
64733
+ }
64734
+
64735
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-inline {
64736
+ display: flex;
64737
+ align-items: center;
64738
+ gap: 0.5rem;
64739
+ }
64740
+
64741
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-success,
64742
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-error,
64743
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-empty {
64744
+ border-radius: var(--rb-block-radius);
64745
+ padding: 1rem;
64746
+ font-size: 0.875rem;
64747
+ }
64748
+
64749
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-success {
64750
+ background-color: var(--fb-success-bg);
64751
+ color: var(--fb-success-text);
64752
+ border: 1px solid var(--fb-success-border);
64753
+ }
64754
+
64755
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-error {
64756
+ background-color: var(--fb-error-bg);
64757
+ color: var(--fb-error-text);
64758
+ border: 1px solid var(--fb-error-border);
64759
+ }
64760
+
64761
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-empty {
64762
+ background-color: var(--fb-empty-bg);
64763
+ color: var(--fb-empty-text);
64764
+ border: 1px dashed var(--fb-empty-border);
64765
+ text-align: center;
64766
+ }
64767
+
64768
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-actions {
64769
+ margin-top: 0.5rem;
64770
+ }
64771
+
63207
64772
  /* =============================================================================
63208
64773
  * Block: Team Members
63209
64774
  * =============================================================================
@@ -63428,8 +64993,8 @@ var containerResponsiveThemeCss = `/*
63428
64993
  container: event-compact-list / inline-size;
63429
64994
  border: 1px solid var(--event-compact-divider-color);
63430
64995
  border-radius: 1rem;
63431
- background: rgb(var(--tb-background, 255 255 255));
63432
- box-shadow: 0 1.25rem 3.5rem rgba(var(--tb-shadow), 0.08);
64996
+ background: rgb(var(--tb-surface, 255 255 255));
64997
+ box-shadow: none;
63433
64998
  }
63434
64999
 
63435
65000
  :where(.theme-scope) .rb-event-list-treatment-lined-panel .event-listing-compact-container {
@@ -63438,6 +65003,12 @@ var containerResponsiveThemeCss = `/*
63438
65003
  rgb(var(--tb-border, 229 231 235)),
63439
65004
  rgb(var(--tb-text, 17 24 39)) 8%
63440
65005
  );
65006
+ background: rgb(var(--tb-surface, 255 255 255));
65007
+ border-color: color-mix(
65008
+ in oklab,
65009
+ rgb(var(--tb-primary, 0 0 0)),
65010
+ rgb(var(--tb-border, 229 231 235)) 72%
65011
+ );
63441
65012
  }
63442
65013
 
63443
65014
  :where(.theme-scope) .event-compact-row {
@@ -63513,7 +65084,7 @@ var containerResponsiveThemeCss = `/*
63513
65084
 
63514
65085
  :where(.theme-scope) .event-compact-row-title {
63515
65086
  margin: 0;
63516
- color: rgb(var(--tb-text, 17 24 39));
65087
+ color: var(--section-heading-color, rgb(var(--tb-primary, 0 0 0)));
63517
65088
  font-family: var(--font-heading, var(--font-body, inherit));
63518
65089
  font-size: clamp(1.05rem, 1rem + 0.35vw, 1.3rem);
63519
65090
  font-weight: 400;
@@ -63606,8 +65177,6 @@ var containerResponsiveThemeCss = `/*
63606
65177
  min-height: 2.7rem;
63607
65178
  justify-content: space-between;
63608
65179
  gap: 1rem;
63609
- border-radius: 9999px;
63610
- padding-inline: 1.25rem 1rem;
63611
65180
  white-space: nowrap;
63612
65181
  }
63613
65182
 
@@ -64554,11 +66123,11 @@ function resolveParamsBindings(input, vm, meta) {
64554
66123
  return binding.fallback;
64555
66124
  }
64556
66125
  return resolved;
64557
- } catch (err2) {
66126
+ } catch (err3) {
64558
66127
  if (shouldLogWarnings) {
64559
66128
  console.warn(
64560
66129
  `bindings: failed to parse loader param binding for block "${meta?.blockKind ?? "unknown"}"`,
64561
- err2
66130
+ err3
64562
66131
  );
64563
66132
  }
64564
66133
  return void 0;
@@ -65931,7 +67500,7 @@ function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, descript
65931
67500
  }
65932
67501
 
65933
67502
  // ../api/src/utils/isRecord.ts
65934
- function isRecord10(value) {
67503
+ function isRecord12(value) {
65935
67504
  return typeof value === "object" && value !== null && !Array.isArray(value);
65936
67505
  }
65937
67506
 
@@ -66238,7 +67807,7 @@ function sanitizeMarks(marks) {
66238
67807
  if (mark.type === "bold" || mark.type === "strong" || mark.type === "italic" || mark.type === "em") {
66239
67808
  return [{ type: mark.type }];
66240
67809
  }
66241
- if (mark.type === "link" && isRecord10(mark.attrs) && typeof mark.attrs.href === "string") {
67810
+ if (mark.type === "link" && isRecord12(mark.attrs) && typeof mark.attrs.href === "string") {
66242
67811
  const attrs = { href: mark.attrs.href };
66243
67812
  if (typeof mark.attrs.target === "string" && mark.attrs.target.trim().length > 0) {
66244
67813
  attrs.target = mark.attrs.target;
@@ -66253,10 +67822,10 @@ function sanitizeMarks(marks) {
66253
67822
  return sanitized.length > 0 ? sanitized : void 0;
66254
67823
  }
66255
67824
  function unwrapRichTextValue(value) {
66256
- if (isRecord10(value) && isRecord10(value.doc)) {
67825
+ if (isRecord12(value) && isRecord12(value.doc)) {
66257
67826
  return unwrapRichTextValue(value.doc);
66258
67827
  }
66259
- if (isRecord10(value) && value.type === "doc") {
67828
+ if (isRecord12(value) && value.type === "doc") {
66260
67829
  return {
66261
67830
  type: "doc",
66262
67831
  content: Array.isArray(value.content) ? value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) : []
@@ -66265,7 +67834,7 @@ function unwrapRichTextValue(value) {
66265
67834
  return EMPTY_SITE_BANNER_BODY;
66266
67835
  }
66267
67836
  function isTipTapNodeLike(value) {
66268
- return isRecord10(value) && typeof value.type === "string";
67837
+ return isRecord12(value) && typeof value.type === "string";
66269
67838
  }
66270
67839
  function coerceTipTapNode(value) {
66271
67840
  return {
@@ -66273,9 +67842,9 @@ function coerceTipTapNode(value) {
66273
67842
  ...Array.isArray(value.content) ? { content: value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) } : {},
66274
67843
  ...typeof value.text === "string" ? { text: value.text } : {},
66275
67844
  ...Array.isArray(value.marks) ? {
66276
- marks: value.marks.filter((mark) => isRecord10(mark) && typeof mark.type === "string").map((mark) => ({
67845
+ marks: value.marks.filter((mark) => isRecord12(mark) && typeof mark.type === "string").map((mark) => ({
66277
67846
  type: mark.type,
66278
- ...isRecord10(mark.attrs) ? { attrs: mark.attrs } : {}
67847
+ ...isRecord12(mark.attrs) ? { attrs: mark.attrs } : {}
66279
67848
  }))
66280
67849
  } : {}
66281
67850
  };
@@ -66478,7 +68047,7 @@ var ENTRY_REF_KEYS = [
66478
68047
  "entryId",
66479
68048
  "slug"
66480
68049
  ];
66481
- function isRecord11(value) {
68050
+ function isRecord13(value) {
66482
68051
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
66483
68052
  }
66484
68053
  function extractManualEntryRef(item) {
@@ -66486,7 +68055,7 @@ function extractManualEntryRef(item) {
66486
68055
  const trimmed = item.trim();
66487
68056
  return trimmed.length > 0 ? trimmed : null;
66488
68057
  }
66489
- if (!isRecord11(item)) return null;
68058
+ if (!isRecord13(item)) return null;
66490
68059
  for (const key of ENTRY_REF_KEYS) {
66491
68060
  const raw = item[key];
66492
68061
  if (typeof raw === "string" && raw.trim().length > 0) {
@@ -66981,6 +68550,122 @@ function resolveSiteCustomBlocks(site) {
66981
68550
  return void 0;
66982
68551
  }
66983
68552
 
68553
+ // ../content-model/src/routeTemplate.ts
68554
+ var ROUTE_TEMPLATE_SLUG_SEGMENT = "{slug}";
68555
+ var InvalidRouteTemplateError = class extends Error {
68556
+ constructor(error) {
68557
+ super(describeRouteTemplateParseError(error));
68558
+ this.name = "InvalidRouteTemplateError";
68559
+ this.error = error;
68560
+ }
68561
+ };
68562
+ function safeParseRouteTemplate(routePattern) {
68563
+ if (routePattern === null || routePattern === "") {
68564
+ return {
68565
+ success: true,
68566
+ routeTemplate: { kind: "fallback-slug" }
68567
+ };
68568
+ }
68569
+ const segments = splitRouteSegments(routePattern);
68570
+ const slugSegmentIndices = segments.flatMap(
68571
+ (segment, index) => segment === ROUTE_TEMPLATE_SLUG_SEGMENT ? [index] : []
68572
+ );
68573
+ if (slugSegmentIndices.length > 1) {
68574
+ return {
68575
+ success: false,
68576
+ error: {
68577
+ code: "multiple-slug-segments",
68578
+ routePattern,
68579
+ segment: ROUTE_TEMPLATE_SLUG_SEGMENT
68580
+ }
68581
+ };
68582
+ }
68583
+ const invalidSegment = segments.find(
68584
+ (segment) => segment !== ROUTE_TEMPLATE_SLUG_SEGMENT && isUnsupportedDynamicSegment(segment)
68585
+ );
68586
+ if (invalidSegment) {
68587
+ return {
68588
+ success: false,
68589
+ error: {
68590
+ code: invalidSegment.startsWith(":") ? "legacy-dynamic-segment" : "unsupported-dynamic-segment",
68591
+ routePattern,
68592
+ segment: invalidSegment
68593
+ }
68594
+ };
68595
+ }
68596
+ if (slugSegmentIndices.length === 1) {
68597
+ const [prefix = "", suffix = ""] = routePattern.split(ROUTE_TEMPLATE_SLUG_SEGMENT);
68598
+ const slugIndex = slugSegmentIndices[0] ?? 0;
68599
+ return {
68600
+ success: true,
68601
+ routeTemplate: {
68602
+ kind: "slug-template",
68603
+ routePattern,
68604
+ prefix,
68605
+ suffix,
68606
+ prefixSegments: segments.slice(0, slugIndex),
68607
+ suffixSegments: segments.slice(slugIndex + 1)
68608
+ }
68609
+ };
68610
+ }
68611
+ return {
68612
+ success: true,
68613
+ routeTemplate: {
68614
+ kind: "fixed-path",
68615
+ routePattern,
68616
+ path: routePattern
68617
+ }
68618
+ };
68619
+ }
68620
+ function parseRouteTemplate(routePattern) {
68621
+ const result = safeParseRouteTemplate(routePattern);
68622
+ if (result.success) {
68623
+ return result.routeTemplate;
68624
+ }
68625
+ throw new InvalidRouteTemplateError(result.error);
68626
+ }
68627
+ function describeRouteTemplateParseError(error) {
68628
+ switch (error.code) {
68629
+ case "legacy-dynamic-segment":
68630
+ return `Route pattern "${error.routePattern}" uses unsupported dynamic segment "${error.segment ?? ":slug"}". Use "${ROUTE_TEMPLATE_SLUG_SEGMENT}" as a full path segment.`;
68631
+ case "multiple-slug-segments":
68632
+ return `Route pattern "${error.routePattern}" must not contain "${ROUTE_TEMPLATE_SLUG_SEGMENT}" more than once.`;
68633
+ case "unsupported-dynamic-segment":
68634
+ return `Route pattern "${error.routePattern}" contains unsupported dynamic segment "${error.segment ?? ""}". Route patterns may only use "${ROUTE_TEMPLATE_SLUG_SEGMENT}" as a full path segment.`;
68635
+ }
68636
+ }
68637
+ function splitRouteSegments(routePattern) {
68638
+ return routePattern.split("/").filter((segment) => segment.length > 0);
68639
+ }
68640
+ function isUnsupportedDynamicSegment(segment) {
68641
+ return segment.startsWith(":") || segment.includes("{") || segment.includes("}");
68642
+ }
68643
+
68644
+ // ../content-model/src/entry-slots/types.ts
68645
+ function ok2(value) {
68646
+ return { ok: true, value };
68647
+ }
68648
+ function err2(error) {
68649
+ return { ok: false, error };
68650
+ }
68651
+ var SLOT_KEY_PATTERN = /^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/;
68652
+ function unsafeAsSlotKey(value) {
68653
+ return value;
68654
+ }
68655
+ function parseSlotKey(value) {
68656
+ if (typeof value !== "string") return err2({ kind: "not-string" });
68657
+ const normalized = value.trim();
68658
+ if (!normalized) return err2({ kind: "empty" });
68659
+ if (!SLOT_KEY_PATTERN.test(normalized)) {
68660
+ return err2({ kind: "invalid-format", value: normalized });
68661
+ }
68662
+ return ok2(unsafeAsSlotKey(normalized));
68663
+ }
68664
+ var SYSTEM_ENTRY_SLOT_BLOCK_KIND = "system.entry-slot";
68665
+ function selectBlocksForDeclaredEntrySlot(input) {
68666
+ return input.entrySlots.find((slot) => slot.slotKey === input.declaredSlotKey)?.blocks ?? [];
68667
+ }
68668
+
66984
68669
  // src/rendering/helpers/loadContent.ts
66985
68670
  function isPageContent(result) {
66986
68671
  return result.type === "page";
@@ -67033,6 +68718,7 @@ async function loadContent(params) {
67033
68718
  };
67034
68719
  const { templatePage, resolvedData: resolvedData2 } = await processEntryTemplate(
67035
68720
  contentResponse.templates,
68721
+ contentResponse.entrySlots,
67036
68722
  entry,
67037
68723
  { siteId, preview },
67038
68724
  client,
@@ -67156,7 +68842,7 @@ function validateAndConvertBlock(block, source) {
67156
68842
  content
67157
68843
  };
67158
68844
  }
67159
- async function processEntryTemplate(templates, entry, context, client, options) {
68845
+ async function processEntryTemplate(templates, entrySlots, entry, context, client, options) {
67160
68846
  const template = templates?.[0];
67161
68847
  if (!template || !template.blocks?.length) {
67162
68848
  return { templatePage: null, resolvedData: {} };
@@ -67174,7 +68860,12 @@ async function processEntryTemplate(templates, entry, context, client, options)
67174
68860
  updatedAt: entry.updatedAt
67175
68861
  }
67176
68862
  };
67177
- const blocks = template.blocks.map((block) => resolveTemplateBlock(block, bindingContext));
68863
+ const blocks = template.blocks.flatMap(
68864
+ (block) => resolveTemplateBlockSequence(block, bindingContext, entrySlots)
68865
+ );
68866
+ if (blocks.length === 0) {
68867
+ return { templatePage: null, resolvedData: {} };
68868
+ }
67178
68869
  const templatePage = {
67179
68870
  name: template.name || "Entry Template",
67180
68871
  path: entry.path || "/",
@@ -67214,6 +68905,48 @@ function resolveTemplateBlock(block, bindingContext) {
67214
68905
  content: resolvedContent
67215
68906
  };
67216
68907
  }
68908
+ function resolveTemplateBlockSequence(block, bindingContext, entrySlots) {
68909
+ const slotKey = readEntrySlotKey(block);
68910
+ if (slotKey) {
68911
+ return selectBlocksForDeclaredEntrySlot({
68912
+ declaredSlotKey: slotKey,
68913
+ entrySlots: entrySlots ?? []
68914
+ }).map(mapEntrySlotBlock);
68915
+ }
68916
+ if (block.blockKind === SYSTEM_ENTRY_SLOT_BLOCK_KIND) {
68917
+ return [];
68918
+ }
68919
+ return [resolveTemplateBlock(block, bindingContext)];
68920
+ }
68921
+ function readEntrySlotKey(block) {
68922
+ if (block.blockKind !== SYSTEM_ENTRY_SLOT_BLOCK_KIND) return null;
68923
+ if (block.scope !== "template") return null;
68924
+ const content = block.content;
68925
+ const slotKey = content?.slotKey;
68926
+ const parsed = parseSlotKey(slotKey);
68927
+ return parsed.ok ? parsed.value : null;
68928
+ }
68929
+ function mapEntrySlotBlock(block) {
68930
+ const mapped = {
68931
+ id: block.id ?? block.blockId ?? null,
68932
+ kind: block.kind,
68933
+ purpose: block.purpose,
68934
+ orderIndex: block.orderIndex ?? null,
68935
+ content: normalizeBindingOutput2(block.content ?? {}),
68936
+ draftContent: normalizeNullableEntrySlotContent(block.draftContent),
68937
+ publishedContent: normalizeNullableEntrySlotContent(block.publishedContent)
68938
+ };
68939
+ if (block.bindings == null) {
68940
+ return mapped;
68941
+ }
68942
+ return {
68943
+ ...mapped,
68944
+ bindings: block.bindings
68945
+ };
68946
+ }
68947
+ function normalizeNullableEntrySlotContent(content) {
68948
+ return content == null ? null : normalizeBindingOutput2(content);
68949
+ }
67217
68950
 
67218
68951
  // src/rendering/blocks-page-renderer.ts
67219
68952
  import * as React8 from "react";
@@ -67368,6 +69101,7 @@ function PageContent({
67368
69101
  mediaAssets,
67369
69102
  apiBaseUrl,
67370
69103
  portalToken,
69104
+ previewToken,
67371
69105
  dataContext,
67372
69106
  useThemeScope = false
67373
69107
  }) {
@@ -67384,6 +69118,7 @@ function PageContent({
67384
69118
  siteId,
67385
69119
  apiBaseUrl,
67386
69120
  portalToken,
69121
+ previewToken,
67387
69122
  resolvedData,
67388
69123
  routes: routeMap,
67389
69124
  pagesByIdentifier,
@@ -67422,15 +69157,15 @@ function Page(props2) {
67422
69157
  var lazyBlockOverrideSymbol = /* @__PURE__ */ Symbol.for("riverbankcms.sdk.lazyBlockOverride");
67423
69158
 
67424
69159
  // src/rendering/overrideResolution.ts
67425
- function isRecord12(value) {
69160
+ function isRecord14(value) {
67426
69161
  return typeof value === "object" && value !== null;
67427
69162
  }
67428
69163
  function isBlockOutlineLike(value) {
67429
69164
  const id = value.id;
67430
- return typeof value.kind === "string" && (typeof id === "string" || id === null) && (typeof value.purpose === "string" || isRecord12(value.content) || isRecord12(value.draftContent) || isRecord12(value.bindings));
69165
+ return typeof value.kind === "string" && (typeof id === "string" || id === null) && (typeof value.purpose === "string" || isRecord14(value.content) || isRecord14(value.draftContent) || isRecord14(value.bindings));
67431
69166
  }
67432
69167
  function collectBlockKindsFromValue(value, usedKinds, seen) {
67433
- if (!isRecord12(value)) return;
69168
+ if (!isRecord14(value)) return;
67434
69169
  if (seen.has(value)) return;
67435
69170
  seen.add(value);
67436
69171
  if (isBlockOutlineLike(value)) {
@@ -67479,7 +69214,7 @@ function selectOverrideKeysForUsedKinds(usedKinds, entries) {
67479
69214
  return selectedKeys;
67480
69215
  }
67481
69216
  function isLazyRegistration(registration) {
67482
- return isRecord12(registration) && registration[lazyBlockOverrideSymbol] === true;
69217
+ return isRecord14(registration) && registration[lazyBlockOverrideSymbol] === true;
67483
69218
  }
67484
69219
  async function resolveOverrideComponent(registration) {
67485
69220
  if (isLazyRegistration(registration)) {
@@ -67568,97 +69303,6 @@ function generatePreviewMetadata(input) {
67568
69303
  });
67569
69304
  }
67570
69305
 
67571
- // ../content-model/src/routeTemplate.ts
67572
- var ROUTE_TEMPLATE_SLUG_SEGMENT = "{slug}";
67573
- var InvalidRouteTemplateError = class extends Error {
67574
- constructor(error) {
67575
- super(describeRouteTemplateParseError(error));
67576
- this.name = "InvalidRouteTemplateError";
67577
- this.error = error;
67578
- }
67579
- };
67580
- function safeParseRouteTemplate(routePattern) {
67581
- if (routePattern === null || routePattern === "") {
67582
- return {
67583
- success: true,
67584
- routeTemplate: { kind: "fallback-slug" }
67585
- };
67586
- }
67587
- const segments = splitRouteSegments(routePattern);
67588
- const slugSegmentIndices = segments.flatMap(
67589
- (segment, index) => segment === ROUTE_TEMPLATE_SLUG_SEGMENT ? [index] : []
67590
- );
67591
- if (slugSegmentIndices.length > 1) {
67592
- return {
67593
- success: false,
67594
- error: {
67595
- code: "multiple-slug-segments",
67596
- routePattern,
67597
- segment: ROUTE_TEMPLATE_SLUG_SEGMENT
67598
- }
67599
- };
67600
- }
67601
- const invalidSegment = segments.find(
67602
- (segment) => segment !== ROUTE_TEMPLATE_SLUG_SEGMENT && isUnsupportedDynamicSegment(segment)
67603
- );
67604
- if (invalidSegment) {
67605
- return {
67606
- success: false,
67607
- error: {
67608
- code: invalidSegment.startsWith(":") ? "legacy-dynamic-segment" : "unsupported-dynamic-segment",
67609
- routePattern,
67610
- segment: invalidSegment
67611
- }
67612
- };
67613
- }
67614
- if (slugSegmentIndices.length === 1) {
67615
- const [prefix = "", suffix = ""] = routePattern.split(ROUTE_TEMPLATE_SLUG_SEGMENT);
67616
- const slugIndex = slugSegmentIndices[0] ?? 0;
67617
- return {
67618
- success: true,
67619
- routeTemplate: {
67620
- kind: "slug-template",
67621
- routePattern,
67622
- prefix,
67623
- suffix,
67624
- prefixSegments: segments.slice(0, slugIndex),
67625
- suffixSegments: segments.slice(slugIndex + 1)
67626
- }
67627
- };
67628
- }
67629
- return {
67630
- success: true,
67631
- routeTemplate: {
67632
- kind: "fixed-path",
67633
- routePattern,
67634
- path: routePattern
67635
- }
67636
- };
67637
- }
67638
- function parseRouteTemplate(routePattern) {
67639
- const result = safeParseRouteTemplate(routePattern);
67640
- if (result.success) {
67641
- return result.routeTemplate;
67642
- }
67643
- throw new InvalidRouteTemplateError(result.error);
67644
- }
67645
- function describeRouteTemplateParseError(error) {
67646
- switch (error.code) {
67647
- case "legacy-dynamic-segment":
67648
- return `Route pattern "${error.routePattern}" uses unsupported dynamic segment "${error.segment ?? ":slug"}". Use "${ROUTE_TEMPLATE_SLUG_SEGMENT}" as a full path segment.`;
67649
- case "multiple-slug-segments":
67650
- return `Route pattern "${error.routePattern}" must not contain "${ROUTE_TEMPLATE_SLUG_SEGMENT}" more than once.`;
67651
- case "unsupported-dynamic-segment":
67652
- return `Route pattern "${error.routePattern}" contains unsupported dynamic segment "${error.segment ?? ""}". Route patterns may only use "${ROUTE_TEMPLATE_SLUG_SEGMENT}" as a full path segment.`;
67653
- }
67654
- }
67655
- function splitRouteSegments(routePattern) {
67656
- return routePattern.split("/").filter((segment) => segment.length > 0);
67657
- }
67658
- function isUnsupportedDynamicSegment(segment) {
67659
- return segment.startsWith(":") || segment.includes("{") || segment.includes("}");
67660
- }
67661
-
67662
69306
  // src/routing/contentTypeResolver.ts
67663
69307
  function toRoutingInfo(ct) {
67664
69308
  return {
@@ -68572,7 +70216,7 @@ var CircuitOpenError = class extends Error {
68572
70216
  };
68573
70217
 
68574
70218
  // src/version.ts
68575
- var SDK_VERSION = "0.82.0";
70219
+ var SDK_VERSION = "0.84.0";
68576
70220
 
68577
70221
  // src/next/content-load-failure.ts
68578
70222
  var SdkContentLoadError = RiverbankContentLoadError;