@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
@@ -367,6 +367,21 @@ var selectSourceSchema = z2.discriminatedUnion("kind", [
367
367
  function assertNeverSelectSource(value) {
368
368
  throw new Error(`Unhandled select source: ${JSON.stringify(value)}`);
369
369
  }
370
+ var visibleWhenPredicateSchema = z2.object({
371
+ field: z2.string().min(1),
372
+ equals: z2.any().optional(),
373
+ notEquals: z2.any().optional(),
374
+ oneOf: z2.array(z2.any()).optional(),
375
+ notIn: z2.array(z2.any()).optional(),
376
+ minItems: z2.number().int().nonnegative().optional(),
377
+ maxItems: z2.number().int().nonnegative().optional()
378
+ });
379
+ var visibleWhenSchema = z2.union([
380
+ visibleWhenPredicateSchema,
381
+ z2.object({
382
+ allOf: z2.array(visibleWhenPredicateSchema).min(1)
383
+ })
384
+ ]);
370
385
  var uiSchema = z2.object({
371
386
  widget: z2.string().optional(),
372
387
  // Container/widget presets (used by Group/Repeater widgets themselves, not for widget selection)
@@ -399,13 +414,7 @@ var uiSchema = z2.object({
399
414
  showValue: z2.boolean().optional(),
400
415
  pattern: z2.string().optional(),
401
416
  placeholder: z2.string().optional(),
402
- visibleWhen: z2.object({
403
- field: z2.string().min(1),
404
- equals: z2.any().optional(),
405
- notEquals: z2.any().optional(),
406
- oneOf: z2.array(z2.any()).optional(),
407
- notIn: z2.array(z2.any()).optional()
408
- }).optional(),
417
+ visibleWhen: visibleWhenSchema.optional(),
409
418
  // Modal configuration for modal and group fields
410
419
  modalConfig: z2.object({
411
420
  buttonLabel: z2.string().optional(),
@@ -1107,6 +1116,7 @@ var eventListTreatmentValues = [
1107
1116
  ];
1108
1117
  var eyebrowTreatmentValues = [
1109
1118
  "plain",
1119
+ "accent",
1110
1120
  "pill",
1111
1121
  "accent-pill",
1112
1122
  "pill-bounce",
@@ -4112,6 +4122,95 @@ var joyStamp = defineButtonPersonality({
4112
4122
  }
4113
4123
  });
4114
4124
 
4125
+ // ../theme-core/src/buttons/personalities/ornate-ritual.ts
4126
+ var ornateRitual = defineButtonPersonality({
4127
+ id: "ornate-ritual",
4128
+ name: "Ornate Ritual",
4129
+ description: "Ceremonial framed buttons with jewel-toned fills and quiet color-change hover states.",
4130
+ tags: { tone: "classic", energy: "vibrant", motion: "subtle", era: "organic" },
4131
+ buttonSystem: {
4132
+ global: {
4133
+ cornerStyle: "rounded",
4134
+ shadow: "none",
4135
+ textTransform: "uppercase",
4136
+ fontWeight: 600,
4137
+ borderWidth: 1,
4138
+ hoverTransform: "none",
4139
+ hoverColor: "none",
4140
+ letterSpacing: "loose"
4141
+ },
4142
+ sizes: {
4143
+ sm: { padding: "0.5625rem 1.25rem", fontSize: "text-xs" },
4144
+ md: { padding: "0.75rem 1.75rem", fontSize: "text-xs" },
4145
+ lg: { padding: "0.875rem 2.25rem", fontSize: "text-sm" },
4146
+ xl: { padding: "1rem 2.75rem", fontSize: "text-base" }
4147
+ },
4148
+ variants: [
4149
+ {
4150
+ id: "primary",
4151
+ name: "Primary",
4152
+ enabled: true,
4153
+ priority: 1,
4154
+ background: { type: "solid", colorToken: "primary" },
4155
+ textColorToken: "primaryForeground",
4156
+ borderRadius: "rounded-md",
4157
+ border: { widthClass: "border", colorToken: "primary" },
4158
+ shadow: { elevation: "none", softness: null, position: "bottom" },
4159
+ effects: {
4160
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "primary-100" } }],
4161
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
4162
+ }
4163
+ },
4164
+ {
4165
+ id: "secondary",
4166
+ name: "Secondary",
4167
+ enabled: true,
4168
+ priority: 2,
4169
+ background: { type: "solid", colorToken: "secondary" },
4170
+ textColorToken: "primaryForeground",
4171
+ borderRadius: "rounded-md",
4172
+ border: { widthClass: "border", colorToken: "primary" },
4173
+ shadow: { elevation: "none", softness: null, position: "bottom" },
4174
+ effects: {
4175
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
4176
+ }
4177
+ },
4178
+ {
4179
+ id: "outline",
4180
+ name: "Outline",
4181
+ enabled: true,
4182
+ priority: 3,
4183
+ background: { type: "transparent" },
4184
+ textColorToken: "primary",
4185
+ borderRadius: "rounded-md",
4186
+ border: { widthClass: "border", colorToken: "primary" },
4187
+ shadow: { elevation: "none", softness: null, position: "bottom" },
4188
+ effects: {
4189
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
4190
+ }
4191
+ },
4192
+ {
4193
+ id: "ghost",
4194
+ name: "Ghost",
4195
+ enabled: true,
4196
+ priority: 3,
4197
+ background: { type: "transparent" },
4198
+ textColorToken: "accent",
4199
+ borderRadius: "rounded-none",
4200
+ sizes: {
4201
+ sm: { padding: "0.375rem 0", fontSize: "text-xs" },
4202
+ md: { padding: "0.5rem 0", fontSize: "text-sm" },
4203
+ lg: { padding: "0.625rem 0", fontSize: "text-base" },
4204
+ xl: { padding: "0.75rem 0", fontSize: "text-lg" }
4205
+ },
4206
+ effects: {
4207
+ base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
4208
+ }
4209
+ }
4210
+ ]
4211
+ }
4212
+ });
4213
+
4115
4214
  // ../theme-core/src/buttons/personalities/pebble.ts
4116
4215
  var pebble = defineButtonPersonality({
4117
4216
  id: "pebble",
@@ -4385,7 +4484,8 @@ var buttonPersonalities = [
4385
4484
  inkStamp,
4386
4485
  brushedWash,
4387
4486
  showtimePill,
4388
- joyStamp
4487
+ joyStamp,
4488
+ ornateRitual
4389
4489
  ];
4390
4490
  var personalitiesById = new Map(
4391
4491
  buttonPersonalities.map((p) => [p.id, p])
@@ -5011,7 +5111,7 @@ function rgbColorValue(token) {
5011
5111
  if (alpha === void 0) {
5012
5112
  return `rgb(var(${cssVar}))`;
5013
5113
  }
5014
- return `rgba(var(${cssVar}), ${alpha})`;
5114
+ return `rgb(var(${cssVar}) / ${alpha})`;
5015
5115
  }
5016
5116
  function backgroundColorStyle(token) {
5017
5117
  return { backgroundColor: rgbColorValue(token) };
@@ -6046,6 +6146,28 @@ var warmDarkEmber = definePaletteVariant({
6046
6146
  { name: "border", hex: "#894e31" }
6047
6147
  ]
6048
6148
  });
6149
+ var warmDarkKirtanGold = definePaletteVariant({
6150
+ id: "warm-dark-kirtan-gold",
6151
+ name: "Warm Dark \u2014 Kirtan Gold",
6152
+ description: "Deep plum ground with pale gold primary, rose accent, and soft devotional text.",
6153
+ tags: { tone: "bold", energy: "calm", era: "editorial" },
6154
+ mode: "dark",
6155
+ colors: [
6156
+ { name: "primary", hex: "#ffcdb2" },
6157
+ { name: "secondary", hex: "#b5838d" },
6158
+ { name: "accent", hex: "#e5989b" },
6159
+ { name: "success", hex: "#8fbf8f" },
6160
+ { name: "warning", hex: "#f2b86b" },
6161
+ { name: "destructive", hex: "#d96b6b" },
6162
+ { name: "background", hex: "#403944" },
6163
+ { name: "surface", hex: "#403944" },
6164
+ { name: "surfaceAlt", hex: "#372f3b" },
6165
+ { name: "muted", hex: "#4d4550" },
6166
+ { name: "text", hex: "#e6d2d5" },
6167
+ { name: "primaryForeground", hex: "#403944" },
6168
+ { name: "border", hex: "#8d747a" }
6169
+ ]
6170
+ });
6049
6171
 
6050
6172
  // ../theme-core/src/palette/variants/index.ts
6051
6173
  var paletteVariants = [
@@ -6069,7 +6191,8 @@ var paletteVariants = [
6069
6191
  softNaturalWatercolor,
6070
6192
  softNaturalLilac,
6071
6193
  // Warm-dark family (dark mode)
6072
- warmDarkEmber
6194
+ warmDarkEmber,
6195
+ warmDarkKirtanGold
6073
6196
  ];
6074
6197
  var paletteVariantsById = new Map(
6075
6198
  paletteVariants.map((v) => [v.id, v])
@@ -7568,9 +7691,125 @@ function headerConfigurationKey(configuration) {
7568
7691
  function asFooterLookId(value) {
7569
7692
  return value;
7570
7693
  }
7571
- var guaranteedFallbackFooterLookId = asFooterLookId("footer-muted-grounding");
7694
+ function asFooterLayoutId(value) {
7695
+ return value;
7696
+ }
7697
+ function asFooterStyleId(value) {
7698
+ return value;
7699
+ }
7700
+ var guaranteedFallbackFooterLookId = asFooterLookId("footer-identity-quiet");
7701
+ var footerLayoutCatalog = defineExactCatalog()([
7702
+ {
7703
+ id: asFooterLayoutId("identity"),
7704
+ label: "Identity",
7705
+ description: "Logo, site text, address, and legal copy without relying on footer navigation."
7706
+ },
7707
+ {
7708
+ id: asFooterLayoutId("centered"),
7709
+ label: "Centered",
7710
+ description: "A calm centered stack for identity, short copy, and optional compact navigation.",
7711
+ maxRecommendedNavDensity: "sparse"
7712
+ },
7713
+ {
7714
+ id: asFooterLayoutId("split"),
7715
+ label: "Split",
7716
+ description: "Navigation and brand signoff separated into a wider split footer.",
7717
+ requiresFooterNav: true,
7718
+ maxRecommendedNavDensity: "balanced"
7719
+ },
7720
+ {
7721
+ id: asFooterLayoutId("columns"),
7722
+ label: "Columns",
7723
+ description: "Grouped footer navigation columns with a supporting bottom line.",
7724
+ requiresFooterNav: true,
7725
+ requiresFooterNavGroups: true
7726
+ }
7727
+ ]);
7728
+ var footerStyleCatalog = defineExactCatalog()([
7729
+ {
7730
+ id: asFooterStyleId("quiet"),
7731
+ label: "Quiet",
7732
+ description: "Lightweight, practical footer treatment."
7733
+ },
7734
+ {
7735
+ id: asFooterStyleId("calm"),
7736
+ label: "Calm",
7737
+ description: "Soft centered treatment with restrained dividers."
7738
+ },
7739
+ {
7740
+ id: asFooterStyleId("editorial"),
7741
+ label: "Editorial",
7742
+ description: "Text-forward treatment with fine-line structure."
7743
+ },
7744
+ {
7745
+ id: asFooterStyleId("brand-band"),
7746
+ label: "Brand band",
7747
+ description: "High-contrast brand treatment with a stronger bottom bar."
7748
+ }
7749
+ ]);
7750
+ var footerLayoutsById = new Map(
7751
+ footerLayoutCatalog.map((layout) => [layout.id, layout])
7752
+ );
7753
+ var footerStylesById = new Map(
7754
+ footerStyleCatalog.map((style) => [style.id, style])
7755
+ );
7756
+ function identityQuietFooter(theme) {
7757
+ return {
7758
+ ...theme.footer,
7759
+ variant: "simple",
7760
+ maxWidth: "container",
7761
+ background: {
7762
+ type: "color",
7763
+ color: "surface"
7764
+ },
7765
+ navStyle: "minimal",
7766
+ navWeight: "regular",
7767
+ navColor: "text",
7768
+ navLinkStyle: {
7769
+ typography: "body",
7770
+ fontWeight: "regular",
7771
+ textTransform: "none",
7772
+ italic: false,
7773
+ colorToken: "text",
7774
+ hoverColorToken: "primary",
7775
+ padding: "none",
7776
+ borderRadius: "none"
7777
+ },
7778
+ navLayout: {
7779
+ layout: "inline-wrap",
7780
+ align: "start",
7781
+ gapX: "default",
7782
+ gapY: "tight"
7783
+ },
7784
+ logo: {
7785
+ showLogo: true,
7786
+ showLogoText: true,
7787
+ placement: "left",
7788
+ size: "sm",
7789
+ align: "start"
7790
+ },
7791
+ bottomBar: {
7792
+ enabled: false,
7793
+ fullBleed: false,
7794
+ textAlign: "left",
7795
+ paddingX: "default",
7796
+ paddingY: "compact",
7797
+ borderTop: {
7798
+ width: "none"
7799
+ }
7800
+ }
7801
+ };
7802
+ }
7572
7803
  function mutedGroundingFooter(theme) {
7573
- return theme.footer;
7804
+ return {
7805
+ ...identityQuietFooter(theme),
7806
+ background: theme.footer.background,
7807
+ navStyle: theme.footer.navStyle,
7808
+ navColor: theme.footer.navColor,
7809
+ navWeight: theme.footer.navWeight,
7810
+ navLinkStyle: theme.footer.navLinkStyle,
7811
+ bottomTextLinkStyle: theme.footer.bottomTextLinkStyle
7812
+ };
7574
7813
  }
7575
7814
  function brandTwoBandFooter(theme) {
7576
7815
  return {
@@ -7675,6 +7914,53 @@ function centeredCalmFooter(theme) {
7675
7914
  }
7676
7915
  };
7677
7916
  }
7917
+ function splitEditorialFooter(theme) {
7918
+ return {
7919
+ ...theme.footer,
7920
+ variant: "split",
7921
+ maxWidth: "container",
7922
+ background: {
7923
+ type: "color",
7924
+ color: "surface"
7925
+ },
7926
+ navStyle: "minimal",
7927
+ navWeight: "regular",
7928
+ navColor: "text",
7929
+ navLinkStyle: {
7930
+ typography: "body",
7931
+ fontWeight: "regular",
7932
+ textTransform: "none",
7933
+ italic: false,
7934
+ colorToken: "text",
7935
+ hoverColorToken: "primary",
7936
+ padding: "none",
7937
+ borderRadius: "none"
7938
+ },
7939
+ navLayout: {
7940
+ layout: "inline-wrap",
7941
+ align: "start",
7942
+ gapX: "relaxed",
7943
+ gapY: "tight"
7944
+ },
7945
+ logo: {
7946
+ showLogo: true,
7947
+ showLogoText: true,
7948
+ placement: "right",
7949
+ size: "sm",
7950
+ align: "end"
7951
+ },
7952
+ bottomBar: {
7953
+ enabled: true,
7954
+ fullBleed: false,
7955
+ textAlign: "left",
7956
+ paddingX: "default",
7957
+ paddingY: "compact",
7958
+ borderTop: {
7959
+ width: "thin"
7960
+ }
7961
+ }
7962
+ };
7963
+ }
7678
7964
  function editorialColumnsFooter(theme) {
7679
7965
  return {
7680
7966
  ...theme.footer,
@@ -7717,25 +8003,47 @@ function editorialColumnsFooter(theme) {
7717
8003
  };
7718
8004
  }
7719
8005
  var footerLookCatalog = defineExactCatalog()([
8006
+ {
8007
+ id: asFooterLookId("footer-identity-quiet"),
8008
+ label: "Identity footer",
8009
+ layoutId: asFooterLayoutId("identity"),
8010
+ styleId: asFooterStyleId("quiet"),
8011
+ compile: identityQuietFooter
8012
+ },
7720
8013
  {
7721
8014
  id: asFooterLookId("footer-muted-grounding"),
7722
8015
  label: "Muted grounding footer",
8016
+ layoutId: asFooterLayoutId("identity"),
8017
+ styleId: asFooterStyleId("quiet"),
8018
+ hiddenFromLayoutStyleControls: true,
7723
8019
  compile: mutedGroundingFooter
7724
8020
  },
7725
8021
  {
7726
8022
  id: asFooterLookId("footer-centered-calm"),
7727
8023
  label: "Centered calm footer",
8024
+ layoutId: asFooterLayoutId("centered"),
8025
+ styleId: asFooterStyleId("calm"),
7728
8026
  compile: centeredCalmFooter
7729
8027
  },
8028
+ {
8029
+ id: asFooterLookId("footer-split-editorial"),
8030
+ label: "Split editorial footer",
8031
+ layoutId: asFooterLayoutId("split"),
8032
+ styleId: asFooterStyleId("editorial"),
8033
+ compile: splitEditorialFooter
8034
+ },
7730
8035
  {
7731
8036
  id: asFooterLookId("footer-editorial-columns"),
7732
8037
  label: "Editorial columns footer",
8038
+ layoutId: asFooterLayoutId("columns"),
8039
+ styleId: asFooterStyleId("editorial"),
7733
8040
  compile: editorialColumnsFooter
7734
8041
  },
7735
8042
  {
7736
8043
  id: asFooterLookId("site-footer-brand-two-band"),
7737
8044
  label: "Two-band brand footer",
7738
- maxRecommendedNavDensity: "balanced",
8045
+ layoutId: asFooterLayoutId("split"),
8046
+ styleId: asFooterStyleId("brand-band"),
7739
8047
  allowedContentPresence: ["default-footer", "default-and-blocks"],
7740
8048
  compile: brandTwoBandFooter
7741
8049
  }
@@ -7938,6 +8246,30 @@ var luxeContrastTypography = {
7938
8246
  },
7939
8247
  scale: "spacious"
7940
8248
  };
8249
+ var kirtanOrnateTypography = {
8250
+ body: {
8251
+ family: "Jost, system-ui, sans-serif",
8252
+ size: "md",
8253
+ weight: "regular",
8254
+ lineHeight: "relaxed",
8255
+ letterSpacing: "normal"
8256
+ },
8257
+ headings: {
8258
+ default: {
8259
+ family: "Marcellus, Georgia, serif",
8260
+ weight: "regular",
8261
+ lineHeight: "normal",
8262
+ letterSpacing: "normal",
8263
+ colorToken: "primary",
8264
+ italic: null,
8265
+ case: null
8266
+ },
8267
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
8268
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
8269
+ h3: { size: "md", weight: "regular", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
8270
+ },
8271
+ scale: "spacious"
8272
+ };
7941
8273
  var boldDisplayTypography = {
7942
8274
  body: {
7943
8275
  family: "Manrope, system-ui, sans-serif",
@@ -7972,16 +8304,16 @@ var originalJoyTypography = {
7972
8304
  },
7973
8305
  headings: {
7974
8306
  default: {
7975
- family: "Bricolage Grotesque, system-ui, sans-serif",
7976
- weight: "bold",
8307
+ family: "Lobster, cursive",
8308
+ weight: "regular",
7977
8309
  lineHeight: "normal",
7978
- letterSpacing: "tight",
8310
+ letterSpacing: "normal",
7979
8311
  italic: null,
7980
8312
  case: null
7981
8313
  },
7982
- h1: { size: "2xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
7983
- h2: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
7984
- h3: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null }
8314
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
8315
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
8316
+ h3: { size: "lg", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null }
7985
8317
  },
7986
8318
  scale: "balanced"
7987
8319
  };
@@ -8046,6 +8378,32 @@ var typographyPresets = [
8046
8378
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
8047
8379
  typography: luxeContrastTypography
8048
8380
  }),
8381
+ defineTypographyPreset({
8382
+ id: "typography-preset:kirtan-ornate",
8383
+ name: "Kirtan Ornate",
8384
+ description: "Marcellus devotional headings over a refined Jost body, matching dark ceremonial layouts.",
8385
+ defaultFonts: { body: "Jost, system-ui, sans-serif", heading: "Marcellus, Georgia, serif" },
8386
+ recommendedFonts: {
8387
+ body: ["Jost", "Manrope", "Inter"],
8388
+ heading: ["Marcellus", "Cormorant Garamond", "Playfair Display"]
8389
+ },
8390
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
8391
+ typography: kirtanOrnateTypography,
8392
+ heroTypography: {
8393
+ headlineSize: "6xl",
8394
+ headlineLineHeight: "normal",
8395
+ subheadlineSize: "xl",
8396
+ subheadlineLineHeight: "relaxed",
8397
+ microHeadlineSize: "5xl",
8398
+ microHeadlineLineHeight: "normal",
8399
+ microSubheadlineSize: "lg",
8400
+ microSubheadlineLineHeight: "relaxed",
8401
+ responsive: {
8402
+ tablet: { headlineSize: "5xl" },
8403
+ mobile: { headlineSize: "4xl", subheadlineSize: "lg" }
8404
+ }
8405
+ }
8406
+ }),
8049
8407
  defineTypographyPreset({
8050
8408
  id: "typography-preset:bold-display",
8051
8409
  name: "Bold Display",
@@ -8075,11 +8433,11 @@ var typographyPresets = [
8075
8433
  defineTypographyPreset({
8076
8434
  id: "typography-preset:original-joy",
8077
8435
  name: "Original Joy",
8078
- description: "Bold Bricolage Grotesque display headings over a clean DM Sans body, editorial and warm.",
8079
- defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Bricolage Grotesque, system-ui, sans-serif" },
8436
+ description: "Lobster display headings over a clean DM Sans body, expressive and warm.",
8437
+ defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Lobster, cursive" },
8080
8438
  recommendedFonts: {
8081
8439
  body: ["DM Sans", "Inter", "Manrope"],
8082
- heading: ["Bricolage Grotesque", "Space Grotesk", "Archivo"]
8440
+ heading: ["Lobster", "Bricolage Grotesque", "Space Grotesk"]
8083
8441
  },
8084
8442
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
8085
8443
  typography: originalJoyTypography,
@@ -8103,24 +8461,338 @@ var typographyPresetsById = new Map(
8103
8461
  typographyPresets.map((preset) => [preset.id, preset])
8104
8462
  );
8105
8463
 
8106
- // ../theme-core/src/site-styles/curatedSiteStyles.ts
8107
- var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
8108
- var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
8109
- var curatedSiteStyleIdValues = [
8110
- "site-style:calm-studio",
8111
- "site-style:clear-professional",
8112
- "site-style:warm-editorial",
8113
- "site-style:bright-community",
8114
- "site-style:quiet-luxury",
8115
- "site-style:practical-services",
8116
- "site-style:quiet-practice",
8117
- "site-style:personal-retreat-journal",
8118
- "site-style:tactile-workshop",
8119
- "site-style:modern-wellness",
8464
+ // ../theme-core/src/site-styles/designState.ts
8465
+ import { z as z22 } from "zod";
8466
+ var themeV2DesignStateSchemaVersion = 1;
8467
+ var designResolutionPolicySchema = z22.enum(["generated", "user", "admin", "sdk"]);
8468
+ var runtimeStyleFieldNameSchema = z22.enum(themeV2RuntimeStyleFieldNames);
8469
+ var nonEmptyRuntimeStyleFieldNamesSchema = z22.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
8470
+ fields3[0],
8471
+ ...fields3.slice(1)
8472
+ ]);
8473
+ var heroLegibilityStrategySchema = z22.enum([
8474
+ "none",
8475
+ "scrim-gradient",
8476
+ "solid-panel"
8477
+ ]);
8478
+ var heroCompositionIntentSchema = z22.enum([
8479
+ "center",
8480
+ "bottom-left"
8481
+ ]);
8482
+ var heroTypographyScaleIntentSchema = z22.enum([
8483
+ "quiet",
8484
+ "editorial",
8485
+ "display",
8486
+ "poster"
8487
+ ]);
8488
+ var sectionHeightIntentSchema = z22.enum([
8489
+ "default",
8490
+ "banner",
8491
+ "hero",
8492
+ "immersive"
8493
+ ]);
8494
+ var imageSurfaceTreatmentIntensitySchema = z22.enum(["soft", "balanced", "strong"]);
8495
+ var imageSurfaceMotionSchema = z22.enum(["static", "fixed-frame"]);
8496
+ var imageSurfaceTreatmentSchema = z22.discriminatedUnion("kind", [
8497
+ z22.object({ kind: z22.literal("none") }).strict(),
8498
+ z22.object({
8499
+ kind: z22.literal("brand-scrim"),
8500
+ token: z22.enum(["primary", "secondary", "accent"]),
8501
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
8502
+ }).strict(),
8503
+ z22.object({
8504
+ kind: z22.literal("brand-wash"),
8505
+ token: z22.enum(["primary", "secondary", "accent"]),
8506
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
8507
+ }).strict(),
8508
+ z22.object({
8509
+ kind: z22.literal("neutral-scrim"),
8510
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
8511
+ }).strict(),
8512
+ z22.object({
8513
+ kind: z22.literal("neutral-wash"),
8514
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
8515
+ }).strict(),
8516
+ z22.object({
8517
+ kind: z22.literal("solid-panel"),
8518
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
8519
+ }).strict()
8520
+ ]);
8521
+ var testimonialCardTreatmentSchema = z22.enum(["default", "accent-quote"]);
8522
+ var tileTreatmentSchema = z22.enum(tileTreatmentValues);
8523
+ var eventListTreatmentSchema = z22.enum(eventListTreatmentValues);
8524
+ var eyebrowTreatmentSchema = z22.enum(eyebrowTreatmentValues);
8525
+ function uniqueNonEmpty(values) {
8526
+ const uniqueValues = [...new Set(values)];
8527
+ const firstValue = uniqueValues[0];
8528
+ if (!firstValue) {
8529
+ throw new Error("Expected at least one Theme V2 design state option.");
8530
+ }
8531
+ return [firstValue, ...uniqueValues.slice(1)];
8532
+ }
8533
+ var userPanelTreatments = uniqueNonEmpty(
8534
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
8535
+ );
8536
+ var userFlushTreatments = uniqueNonEmpty(
8537
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
8538
+ );
8539
+ var userFlushBleeds = uniqueNonEmpty(
8540
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
8541
+ );
8542
+ var contentFrameIntentSchema = z22.discriminatedUnion("kind", [
8543
+ z22.object({ kind: z22.literal("plain") }).strict(),
8544
+ z22.object({
8545
+ kind: z22.literal("panel"),
8546
+ treatment: z22.enum(userPanelTreatments)
8547
+ }).strict(),
8548
+ z22.object({
8549
+ kind: z22.literal("flush-panel"),
8550
+ treatment: z22.enum(userFlushTreatments),
8551
+ bleed: z22.enum(userFlushBleeds)
8552
+ }).strict()
8553
+ ]);
8554
+ var blockDesignPlanSchema = z22.object({
8555
+ blockId: z22.string().min(1).transform(asDesignBlockId),
8556
+ blockKind: z22.string().min(1),
8557
+ purpose: z22.string().min(1),
8558
+ sectionSurface: z22.enum(userDesignOptionCatalog.sectionSurfaces),
8559
+ contentFrame: contentFrameIntentSchema,
8560
+ itemSurface: z22.enum(userDesignOptionCatalog.itemSurfaces),
8561
+ transitionAfter: z22.enum(userDesignOptionCatalog.transitions),
8562
+ emphasis: z22.enum(userDesignOptionCatalog.emphases),
8563
+ sectionHeight: sectionHeightIntentSchema.optional(),
8564
+ heroLegibility: heroLegibilityStrategySchema.optional(),
8565
+ heroComposition: heroCompositionIntentSchema.optional(),
8566
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
8567
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
8568
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
8569
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
8570
+ tileTreatment: tileTreatmentSchema.optional(),
8571
+ eventListTreatment: eventListTreatmentSchema.optional(),
8572
+ eyebrowTreatment: eyebrowTreatmentSchema.optional()
8573
+ }).strict();
8574
+ var styleAuthoritySchema = z22.discriminatedUnion("kind", [
8575
+ z22.object({
8576
+ kind: z22.literal("theme-v2"),
8577
+ source: designResolutionPolicySchema,
8578
+ siteStyleId: z22.string().min(1).transform(asSiteStyleId),
8579
+ templateId: z22.string().min(1).transform(asDesignSystemTemplateId),
8580
+ templateVersion: z22.number().int().nonnegative(),
8581
+ resolverVersion: z22.number().int().nonnegative()
8582
+ }).strict(),
8583
+ z22.object({
8584
+ kind: z22.literal("legacy-raw"),
8585
+ reason: z22.enum(["pre-theme-v2", "manual-runtime-fields"])
8586
+ }).strict(),
8587
+ z22.object({
8588
+ kind: z22.literal("advanced-detached"),
8589
+ reason: z22.literal("detached-custom-runtime-fields")
8590
+ }).strict()
8591
+ ]);
8592
+ var blockRuntimeStyleAuthoritySchema = z22.object({
8593
+ unit: z22.literal("block-runtime-fields"),
8594
+ blockId: z22.string().min(1).transform(asDesignBlockId),
8595
+ fields: nonEmptyRuntimeStyleFieldNamesSchema,
8596
+ authority: styleAuthoritySchema
8597
+ }).strict();
8598
+ var persistedPageDesignStateV1Schema = z22.object({
8599
+ schemaVersion: z22.literal(themeV2DesignStateSchemaVersion),
8600
+ siteStyleId: z22.string().min(1).transform(asSiteStyleId),
8601
+ templateId: z22.string().min(1).transform(asDesignSystemTemplateId),
8602
+ templateVersion: z22.number().int().nonnegative(),
8603
+ resolverVersion: z22.number().int().nonnegative(),
8604
+ rhythmPresetId: z22.string().min(1),
8605
+ blocks: z22.array(blockDesignPlanSchema),
8606
+ styleAuthorities: z22.array(blockRuntimeStyleAuthoritySchema)
8607
+ }).strict();
8608
+
8609
+ // ../theme-core/src/site-styles/runtimeCompiler.ts
8610
+ function defineDesignRuntimeRules(rules) {
8611
+ return rules;
8612
+ }
8613
+ function defineComponentRuntimeRules(rules) {
8614
+ return rules;
8615
+ }
8616
+ var defaultDesignRuntimeRules = defineDesignRuntimeRules({
8617
+ sectionSurfaces: {
8618
+ base: {},
8619
+ "muted-band": {
8620
+ background: {
8621
+ type: "color",
8622
+ color: "muted"
8623
+ }
8624
+ },
8625
+ "accent-band": {
8626
+ background: {
8627
+ type: "color",
8628
+ color: "primary"
8629
+ }
8630
+ },
8631
+ "brand-depth-band": {
8632
+ background: {
8633
+ type: "color",
8634
+ color: "primary-800"
8635
+ }
8636
+ },
8637
+ "hero-image": {
8638
+ background: {
8639
+ type: "image",
8640
+ opacity: 1,
8641
+ position: "center center",
8642
+ ...uniformSectionForeground("text")
8643
+ }
8644
+ }
8645
+ },
8646
+ heroLegibility: {
8647
+ "scrim-gradient": {
8648
+ type: "gradient",
8649
+ gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
8650
+ opacity: 1
8651
+ },
8652
+ "solid-panel": {
8653
+ type: "color",
8654
+ color: "surface",
8655
+ opacity: 0.88
8656
+ }
8657
+ },
8658
+ transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
8659
+ });
8660
+ var defaultComponentRuntimeRules = defineComponentRuntimeRules({
8661
+ panelFrames: {
8662
+ inset: {
8663
+ spacing: "comfortable",
8664
+ rounded: "xl",
8665
+ raised: false,
8666
+ background: {
8667
+ type: "color",
8668
+ color: "surfaceAlt",
8669
+ textColor: "text"
8670
+ }
8671
+ },
8672
+ raised: {
8673
+ spacing: "comfortable",
8674
+ rounded: "xl",
8675
+ raised: true,
8676
+ background: {
8677
+ type: "color",
8678
+ color: "surfaceAlt",
8679
+ textColor: "text"
8680
+ }
8681
+ },
8682
+ editorial: {
8683
+ spacing: "medium",
8684
+ rounded: "xl",
8685
+ raised: false,
8686
+ background: {
8687
+ type: "color",
8688
+ color: "surface",
8689
+ textColor: "text"
8690
+ }
8691
+ }
8692
+ },
8693
+ flushFrames: {
8694
+ "media-panel": {
8695
+ fullWidth: true,
8696
+ spacing: "none",
8697
+ rounded: "none",
8698
+ raised: false
8699
+ }
8700
+ },
8701
+ itemSurfaces: {
8702
+ none: null,
8703
+ default: {
8704
+ spacing: "medium",
8705
+ rounded: "lg",
8706
+ raised: false
8707
+ },
8708
+ flat: {
8709
+ spacing: "medium",
8710
+ rounded: "lg",
8711
+ raised: false
8712
+ },
8713
+ outlined: {
8714
+ spacing: "medium",
8715
+ rounded: "lg",
8716
+ raised: false,
8717
+ border: {
8718
+ enabled: true,
8719
+ width: "1",
8720
+ colorToken: "border"
8721
+ }
8722
+ },
8723
+ raised: {
8724
+ spacing: "medium",
8725
+ rounded: "xl",
8726
+ raised: true
8727
+ },
8728
+ inset: {
8729
+ treatment: "soft-panel",
8730
+ spacing: "comfortable",
8731
+ rounded: "xl",
8732
+ raised: false,
8733
+ border: {
8734
+ enabled: false
8735
+ },
8736
+ background: {
8737
+ type: "color",
8738
+ color: "surfaceAlt",
8739
+ textColor: "text"
8740
+ }
8741
+ },
8742
+ editorial: {
8743
+ // Boxless open column with a short rule on top; the visual treatment
8744
+ // lives in blocks-static/card-treatments.css.
8745
+ treatment: "editorial-rule",
8746
+ spacing: "none",
8747
+ rounded: "none",
8748
+ raised: false,
8749
+ border: {
8750
+ enabled: false
8751
+ }
8752
+ },
8753
+ "color-blocked": {
8754
+ // Bold, flat colour-blocked cards. The per-card background colour cycle
8755
+ // (by position) and staggered offset live in
8756
+ // blocks-static/card-treatments.css; here we set the shared shape:
8757
+ // generous padding, large radius, no border, flat (no shadow).
8758
+ treatment: "color-blocked",
8759
+ spacing: "spacious",
8760
+ rounded: "2xl",
8761
+ raised: false,
8762
+ border: {
8763
+ enabled: false
8764
+ }
8765
+ }
8766
+ }
8767
+ });
8768
+ function uniformSectionForeground(token) {
8769
+ return {
8770
+ textColor: token,
8771
+ headingColor: token,
8772
+ linkColor: token,
8773
+ supportingColor: token
8774
+ };
8775
+ }
8776
+
8777
+ // ../theme-core/src/site-styles/curatedSiteStyles.ts
8778
+ var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
8779
+ var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
8780
+ var curatedSiteStyleIdValues = [
8781
+ "site-style:calm-studio",
8782
+ "site-style:clear-professional",
8783
+ "site-style:warm-editorial",
8784
+ "site-style:bright-community",
8785
+ "site-style:quiet-luxury",
8786
+ "site-style:practical-services",
8787
+ "site-style:quiet-practice",
8788
+ "site-style:personal-retreat-journal",
8789
+ "site-style:tactile-workshop",
8790
+ "site-style:modern-wellness",
8120
8791
  "site-style:clarity-zen-blue",
8121
8792
  SOFT_EARTH_SITE_STYLE_ID_VALUE,
8122
8793
  "site-style:bold-launch",
8123
8794
  "site-style:south-west-twerk-school",
8795
+ "site-style:kirtan-ornate",
8124
8796
  "site-style:original-joy"
8125
8797
  ];
8126
8798
  var quietBudget = {
@@ -8147,6 +8819,50 @@ var expressiveBudget = {
8147
8819
  mediaDensity: "high",
8148
8820
  decorativeRepetition: "medium"
8149
8821
  };
8822
+ var kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
8823
+ ...defaultDesignRuntimeRules,
8824
+ defaultEyebrowTreatment: "accent",
8825
+ sectionSurfaces: {
8826
+ ...defaultDesignRuntimeRules.sectionSurfaces,
8827
+ "muted-band": {
8828
+ background: {
8829
+ type: "color",
8830
+ color: "muted"
8831
+ },
8832
+ foreground: {
8833
+ textColor: "text",
8834
+ headingColor: "primary",
8835
+ linkColor: "primary",
8836
+ supportingColor: "text"
8837
+ }
8838
+ },
8839
+ "brand-depth-band": {
8840
+ background: {
8841
+ type: "color",
8842
+ color: "primary-800"
8843
+ },
8844
+ foreground: {
8845
+ textColor: "text",
8846
+ headingColor: "primary",
8847
+ linkColor: "primary",
8848
+ supportingColor: "text"
8849
+ }
8850
+ },
8851
+ "hero-image": {
8852
+ background: {
8853
+ type: "image",
8854
+ opacity: 1,
8855
+ position: "center center"
8856
+ },
8857
+ foreground: {
8858
+ textColor: "text",
8859
+ headingColor: "primary",
8860
+ linkColor: "primary",
8861
+ supportingColor: "text"
8862
+ }
8863
+ }
8864
+ }
8865
+ });
8150
8866
  var expressiveUnderlineInputs = {
8151
8867
  base: {
8152
8868
  background: { type: "transparent" },
@@ -8184,6 +8900,43 @@ var expressiveUnderlineInputs = {
8184
8900
  opacity: 0.6
8185
8901
  }
8186
8902
  };
8903
+ var ornateDarkInputs = {
8904
+ base: {
8905
+ background: { type: "solid", colorToken: "surfaceAlt" },
8906
+ textColorToken: "text",
8907
+ border: {
8908
+ widthClass: "border",
8909
+ colorToken: "primary/45",
8910
+ style: "all"
8911
+ },
8912
+ corners: "square",
8913
+ shadow: null,
8914
+ spacing: "medium",
8915
+ fontSize: "base"
8916
+ },
8917
+ label: {
8918
+ textColorToken: "primary",
8919
+ fontWeight: "semibold",
8920
+ fontSize: "xs",
8921
+ textTransform: "uppercase",
8922
+ letterSpacing: "wider",
8923
+ opacity: 1
8924
+ },
8925
+ focus: {
8926
+ ringColorToken: "primary/18",
8927
+ ringWidth: "2",
8928
+ borderColorToken: "primary/70"
8929
+ },
8930
+ error: {
8931
+ borderColorToken: "destructive",
8932
+ textColorToken: "destructive"
8933
+ },
8934
+ disabled: {
8935
+ backgroundColorToken: "muted",
8936
+ textColorToken: "mutedText",
8937
+ opacity: 0.6
8938
+ }
8939
+ };
8187
8940
  function uniqueContentFrameKinds() {
8188
8941
  const kinds = [
8189
8942
  ...new Set(
@@ -8241,6 +8994,7 @@ function defineCuratedSiteStyle(input) {
8241
8994
  // clean/minimal styles default to none.
8242
8995
  headingDecoration: input.headingDecoration ?? noHeadingDecoration,
8243
8996
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
8997
+ ...input.designRuntimeRules ? { designRuntimeRules: input.designRuntimeRules } : {},
8244
8998
  ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
8245
8999
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
8246
9000
  defaultHeaderSelection: input.defaultHeaderSelection ? {
@@ -8727,266 +9481,43 @@ var curatedSiteStyles = [
8727
9481
  spacing: "regular",
8728
9482
  motion: "subtle"
8729
9483
  },
8730
- compositionBudget: quietBudget,
8731
- recommendedHeaderLookIds: [
8732
- "practical-utility",
8733
- "clean-base",
8734
- "centered-calm"
8735
- ],
8736
- buttonPersonalityChoices: [
8737
- buttonChoice("pebble"),
8738
- buttonChoice("soft-pill"),
8739
- buttonChoice("editorial-link")
8740
- ],
8741
- paletteVariantChoices: [
8742
- paletteChoice("soft-natural-stone"),
8743
- paletteChoice("soft-natural-sage"),
8744
- paletteChoice("warm-neutral-clay")
8745
- ]
8746
- }),
8747
- defineCuratedSiteStyle({
8748
- id: "site-style:clarity-zen-blue",
8749
- name: "Clarity Zen",
8750
- headingDecoration: { family: "short-center-rule", colorToken: "primary" },
8751
- description: "Calm, editorial, and reassuring for therapy, counselling, and wellbeing support practices.",
8752
- generationBrief: "Use a calm, soft palette, editorial serif headings, warm grounded copy, rounded cards, calm proof sections, and clear booking routes. Keep the tone compassionate and straightforward, with professional trust rather than hard-sell wellness language.",
8753
- siteCreatorSelection: {
8754
- kind: "site_creator_keyword_heuristic",
8755
- priority: 25
8756
- },
8757
- selectionKeywordRules: [
8758
- { kind: "substring", value: "psychotherap" },
8759
- { kind: "phrase", value: "mental health" },
8760
- { kind: "phrase", value: "talk therapy" },
8761
- { kind: "phrase", value: "therapy and wellbeing" }
8762
- ],
8763
- tokenRecipes: {
8764
- palette: "brand-led",
8765
- contrast: "standard",
8766
- radius: "rounded",
8767
- shadow: "subtle",
8768
- typography: "serif-editorial",
8769
- spacing: "airy",
8770
- motion: "subtle"
8771
- },
8772
- compositionBudget: balancedBudget,
8773
- themeOverrides: {
8774
- accordions: editorialDividedAccordionSystem,
8775
- cards: clarityZenCardSystem,
8776
- testimonialQuote: serifDisplayQuote,
8777
- typography: {
8778
- body: {
8779
- family: "Roboto, system-ui, sans-serif",
8780
- size: "md",
8781
- weight: "regular",
8782
- lineHeight: "relaxed",
8783
- letterSpacing: "normal"
8784
- },
8785
- headings: {
8786
- // Forum ships a single 400 weight; keep every heading weight
8787
- // 'regular' so the Google Fonts request stays valid.
8788
- default: {
8789
- family: "Forum, Georgia, serif",
8790
- weight: "regular",
8791
- lineHeight: "normal",
8792
- letterSpacing: "normal",
8793
- colorToken: "text",
8794
- italic: null,
8795
- case: null
8796
- },
8797
- h1: {
8798
- size: "xl",
8799
- weight: "regular",
8800
- lineHeight: "normal",
8801
- letterSpacing: "normal",
8802
- italic: null
8803
- },
8804
- h2: {
8805
- size: "xl",
8806
- weight: "regular",
8807
- lineHeight: "normal",
8808
- letterSpacing: "normal",
8809
- italic: null
8810
- },
8811
- h3: {
8812
- size: "md",
8813
- weight: "regular",
8814
- lineHeight: "normal",
8815
- letterSpacing: "normal",
8816
- italic: null
8817
- }
8818
- },
8819
- scale: "majorThird"
8820
- },
8821
- bodyText: {
8822
- intro: {
8823
- paragraphSize: "default",
8824
- headingSize: "editorial"
8825
- }
8826
- }
8827
- },
8828
- defaultBlockVariants: {
8829
- "block.faq": "split-heading-columns"
8830
- },
8831
- recommendedAppearancePresetIds: [
8832
- "hero-split-editorial",
8833
- "intro-portrait-bio",
8834
- "intro-organic-statement",
8835
- "feature-cards-soft-panels",
8836
- "feature-cards-editorial-columns",
8837
- "feature-cards-photo-tiles",
8838
- "media-text-quiet-story",
8839
- "testimonials-non-carded",
8840
- "faq-contained-help",
8841
- "contact-form-panel"
8842
- ],
8843
- recommendedHeaderLookIds: [
8844
- "centered-calm",
8845
- "serif-line",
8846
- "minimal-transparent"
8847
- ],
8848
- recommendedFooterLookIds: [
8849
- "footer-centered-calm",
8850
- "footer-editorial-columns",
8851
- "footer-muted-grounding"
8852
- ],
8853
- buttonPersonalityChoices: [
8854
- buttonChoice("soft-pill"),
8855
- buttonChoice("pebble"),
8856
- buttonChoice("editorial-link")
8857
- ],
8858
- paletteVariantChoices: [
8859
- paletteChoice("soft-natural-lilac"),
8860
- paletteChoice("soft-natural-watercolor"),
8861
- paletteChoice("soft-natural-stone"),
8862
- paletteChoice("warm-neutral-cream")
8863
- ]
8864
- }),
8865
- defineCuratedSiteStyle({
8866
- id: "site-style:personal-retreat-journal",
8867
- name: "Personal Retreat Journal",
8868
- themeOverrides: {
8869
- accordions: editorialDividedAccordionSystem,
8870
- testimonialQuote: serifDisplayQuote
8871
- },
8872
- headingDecoration: { family: "short-center-rule", colorToken: "primary" },
8873
- description: "Warm, story-led, and readable for solo practitioners with mixed offers.",
8874
- generationBrief: "Center the practitioner as the guide, then make private sessions, classes, retreats, and resources feel like clear pathways. Keep retreat copy grounded and practical, with enough editorial warmth for longer reading.",
8875
- siteCreatorSelection: {
8876
- kind: "site_creator_keyword_heuristic",
8877
- priority: 40
8878
- },
8879
- selectionKeywordRules: [
8880
- { kind: "substring", value: "retreat" },
8881
- { kind: "phrase", value: "solo practitioner" },
8882
- { kind: "phrase", value: "personal brand" },
8883
- { kind: "substring", value: "teacher" },
8884
- { kind: "substring", value: "coach" },
8885
- { kind: "phrase", value: "retreat resources" },
8886
- { kind: "substring", value: "journal" }
8887
- ],
8888
- tokenRecipes: {
8889
- palette: "warm-neutral",
8890
- contrast: "standard",
8891
- radius: "soft",
8892
- shadow: "subtle",
8893
- typography: "serif-editorial",
8894
- spacing: "airy",
8895
- motion: "subtle"
8896
- },
8897
- compositionBudget: balancedBudget,
8898
- recommendedHeaderLookIds: [
8899
- "serif-line",
8900
- "centered-calm",
8901
- "minimal-transparent"
8902
- ],
8903
- buttonPersonalityChoices: [
8904
- buttonChoice("editorial-link"),
8905
- buttonChoice("soft-pill"),
8906
- buttonChoice("brushed-wash")
8907
- ],
8908
- paletteVariantChoices: [
8909
- paletteChoice("warm-neutral-forest"),
8910
- paletteChoice("warm-neutral-clay"),
8911
- paletteChoice("soft-natural-stone")
8912
- ]
8913
- }),
8914
- defineCuratedSiteStyle({
8915
- id: "site-style:tactile-workshop",
8916
- name: "Tactile Workshop",
8917
- themeOverrides: {
8918
- accordions: warmInsetAccordionSystem,
8919
- testimonialQuote: accentGlyphQuote
8920
- },
8921
- headingDecoration: { family: "organic-squiggle", colorToken: "primary" },
8922
- description: "Bright, hands-on, and image-led for maker studios, workshops, and creative classes.",
8923
- generationBrief: "Lead with objects, materials, studio process, and practical booking detail. Keep the tone warm and direct, with useful mess, clear dates, and enough gallery rhythm to feel like a real creative studio.",
8924
- siteCreatorSelection: {
8925
- kind: "site_creator_keyword_heuristic",
8926
- priority: 50
8927
- },
8928
- selectionKeywordRules: [
8929
- { kind: "substring", value: "ceramic" },
8930
- { kind: "word", value: "pottery" },
8931
- { kind: "phrase", value: "maker studio" },
8932
- { kind: "phrase", value: "craft class" },
8933
- { kind: "phrase", value: "craft workshop" },
8934
- { kind: "word", value: "clay" },
8935
- { kind: "word", value: "kiln" }
8936
- ],
8937
- tokenRecipes: {
8938
- palette: "brand-led",
8939
- contrast: "standard",
8940
- radius: "soft",
8941
- shadow: "subtle",
8942
- typography: "friendly-sans",
8943
- spacing: "regular",
8944
- motion: "subtle"
8945
- },
8946
- compositionBudget: balancedBudget,
8947
- recommendedHeaderLookIds: [
8948
- "brand-solid",
8949
- "practical-utility",
8950
- "clean-base"
8951
- ],
8952
- recommendedFooterLookIds: [
8953
- "site-footer-brand-two-band",
8954
- "footer-muted-grounding"
9484
+ compositionBudget: quietBudget,
9485
+ recommendedHeaderLookIds: [
9486
+ "practical-utility",
9487
+ "clean-base",
9488
+ "centered-calm"
8955
9489
  ],
8956
9490
  buttonPersonalityChoices: [
8957
9491
  buttonChoice("pebble"),
8958
- buttonChoice("confident-chip"),
8959
- buttonChoice("ink-stamp"),
9492
+ buttonChoice("soft-pill"),
8960
9493
  buttonChoice("editorial-link")
8961
9494
  ],
8962
9495
  paletteVariantChoices: [
8963
- paletteChoice("brand-led-warm"),
8964
- paletteChoice("brand-led-cool"),
8965
- paletteChoice("soft-natural-watercolor"),
9496
+ paletteChoice("soft-natural-stone"),
9497
+ paletteChoice("soft-natural-sage"),
8966
9498
  paletteChoice("warm-neutral-clay")
8967
9499
  ]
8968
9500
  }),
8969
9501
  defineCuratedSiteStyle({
8970
- id: SOFT_EARTH_SITE_STYLE_ID,
8971
- name: "Soft Earth",
8972
- headingDecoration: { family: "organic-squiggle", colorToken: "primary" },
8973
- description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
8974
- generationBrief: "Use cream space, terracotta CTAs, olive quote bands, natural imagery, generous but composed spacing, and editorial serif headings. Prefer a real intro section, image-led offering cards, warm community quotes, and an FAQ with a full-width intro above two columns of questions when content allows.",
9502
+ id: "site-style:clarity-zen-blue",
9503
+ name: "Clarity Zen",
9504
+ headingDecoration: { family: "short-center-rule", colorToken: "primary" },
9505
+ description: "Calm, editorial, and reassuring for therapy, counselling, and wellbeing support practices.",
9506
+ generationBrief: "Use a calm, soft palette, editorial serif headings, warm grounded copy, rounded cards, calm proof sections, and clear booking routes. Keep the tone compassionate and straightforward, with professional trust rather than hard-sell wellness language.",
8975
9507
  siteCreatorSelection: {
8976
9508
  kind: "site_creator_keyword_heuristic",
8977
- priority: 45
9509
+ priority: 25
8978
9510
  },
8979
9511
  selectionKeywordRules: [
8980
- { kind: "word", value: "meditation" },
8981
- { kind: "word", value: "wellbeing" },
8982
- { kind: "substring", value: "retreat" },
8983
- { kind: "phrase", value: "yoga studio" },
8984
- { kind: "phrase", value: "mindful movement" }
9512
+ { kind: "substring", value: "psychotherap" },
9513
+ { kind: "phrase", value: "mental health" },
9514
+ { kind: "phrase", value: "talk therapy" },
9515
+ { kind: "phrase", value: "therapy and wellbeing" }
8985
9516
  ],
8986
9517
  tokenRecipes: {
8987
- palette: "warm-neutral",
9518
+ palette: "brand-led",
8988
9519
  contrast: "standard",
8989
- radius: "soft",
9520
+ radius: "rounded",
8990
9521
  shadow: "subtle",
8991
9522
  typography: "serif-editorial",
8992
9523
  spacing: "airy",
@@ -8994,17 +9525,22 @@ var curatedSiteStyles = [
8994
9525
  },
8995
9526
  compositionBudget: balancedBudget,
8996
9527
  themeOverrides: {
9528
+ accordions: editorialDividedAccordionSystem,
9529
+ cards: clarityZenCardSystem,
9530
+ testimonialQuote: serifDisplayQuote,
8997
9531
  typography: {
8998
9532
  body: {
8999
- family: "Inter, system-ui, sans-serif",
9533
+ family: "Roboto, system-ui, sans-serif",
9000
9534
  size: "md",
9001
9535
  weight: "regular",
9002
9536
  lineHeight: "relaxed",
9003
9537
  letterSpacing: "normal"
9004
9538
  },
9005
9539
  headings: {
9540
+ // Forum ships a single 400 weight; keep every heading weight
9541
+ // 'regular' so the Google Fonts request stays valid.
9006
9542
  default: {
9007
- family: '"Cormorant Garamond", Georgia, serif',
9543
+ family: "Forum, Georgia, serif",
9008
9544
  weight: "regular",
9009
9545
  lineHeight: "normal",
9010
9546
  letterSpacing: "normal",
@@ -9020,7 +9556,7 @@ var curatedSiteStyles = [
9020
9556
  italic: null
9021
9557
  },
9022
9558
  h2: {
9023
- size: "lg",
9559
+ size: "xl",
9024
9560
  weight: "regular",
9025
9561
  lineHeight: "normal",
9026
9562
  letterSpacing: "normal",
@@ -9041,571 +9577,550 @@ var curatedSiteStyles = [
9041
9577
  paragraphSize: "default",
9042
9578
  headingSize: "editorial"
9043
9579
  }
9044
- },
9045
- accordions: softEarthAccordionSystem,
9046
- testimonialQuote: accentGlyphQuote
9580
+ }
9047
9581
  },
9048
9582
  defaultBlockVariants: {
9049
- "block.faq": "question-columns"
9050
- },
9051
- recommendedAppearancePresetIds: [
9052
- "hero-brand-scrim",
9053
- "intro-organic-statement",
9054
- "feature-cards-raised-rule",
9055
- "events-lined-panel",
9056
- "testimonials-non-carded",
9057
- "contact-form-panel"
9058
- ],
9059
- recommendedHeaderLookIds: [
9060
- "centered-calm",
9061
- "minimal-transparent",
9062
- "serif-line"
9063
- ],
9064
- recommendedFooterLookIds: [
9065
- "footer-muted-grounding",
9066
- "site-footer-brand-two-band"
9067
- ],
9068
- buttonPersonalityChoices: [
9069
- buttonChoice("earth-pill"),
9070
- buttonChoice("soft-pill"),
9071
- buttonChoice("pebble"),
9072
- buttonChoice("editorial-link")
9073
- ],
9074
- paletteVariantChoices: [
9075
- paletteChoice("warm-neutral-soft-earth"),
9076
- paletteChoice("warm-neutral-clay"),
9077
- paletteChoice("warm-neutral-forest"),
9078
- paletteChoice("soft-natural-sage")
9079
- ]
9080
- }),
9081
- defineCuratedSiteStyle({
9082
- id: "site-style:bold-launch",
9083
- name: "Bold Launch",
9084
- themeOverrides: {
9085
- accordions: boldBorderedAccordionSystem,
9086
- testimonialQuote: accentGlyphQuote
9087
- },
9088
- headingDecoration: { family: "short-center-rule", colorToken: "primary" },
9089
- description: "High-energy and punchy for launches, campaigns, and creative offers.",
9090
- generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
9091
- siteCreatorSelection: {
9092
- kind: "site_creator_keyword_heuristic",
9093
- priority: 10
9094
- },
9095
- selectionKeywordRules: [
9096
- { kind: "substring", value: "launch" },
9097
- { kind: "substring", value: "campaign" },
9098
- { kind: "word", value: "preorder" },
9099
- { kind: "phrase", value: "pre-order" },
9100
- { kind: "substring", value: "waitlist" },
9101
- { kind: "word", value: "drop" }
9102
- ],
9103
- tokenRecipes: {
9104
- palette: "high-contrast",
9105
- contrast: "maximum",
9106
- radius: "pill",
9107
- shadow: "layered",
9108
- typography: "clean-sans",
9109
- spacing: "regular",
9110
- motion: "expressive"
9111
- },
9112
- compositionBudget: expressiveBudget,
9113
- recommendedHeaderLookIds: [
9114
- "transparent-overlay",
9115
- "floating-glass",
9116
- "brand-solid"
9117
- ],
9118
- buttonPersonalityChoices: [
9119
- buttonChoice("ink-stamp"),
9120
- buttonChoice("confident-chip"),
9121
- buttonChoice("brushed-wash"),
9122
- buttonChoice("pebble")
9123
- ],
9124
- paletteVariantChoices: [
9125
- paletteChoice("high-contrast-monochrome"),
9126
- paletteChoice("high-contrast-ink"),
9127
- paletteChoice("brand-led-jewel"),
9128
- paletteChoice("brand-led-warm")
9129
- ]
9130
- }),
9131
- defineCuratedSiteStyle({
9132
- id: "site-style:south-west-twerk-school",
9133
- name: "South West Twerk School",
9134
- headingDecoration: { family: "organic-squiggle", colorToken: "primary" },
9135
- description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
9136
- generationBrief: "Use confident rhythm, bold burgundy-and-gold accents, large editorial intro copy, strong booking routes, and dark feature sections where proof or forms need emphasis.",
9137
- tokenRecipes: {
9138
- palette: "brand-led",
9139
- contrast: "maximum",
9140
- radius: "soft",
9141
- shadow: "layered",
9142
- typography: "clean-sans",
9143
- spacing: "airy",
9144
- motion: "expressive"
9145
- },
9146
- compositionBudget: expressiveBudget,
9147
- typographyPresetChoices: [
9148
- typographyChoice("typography-preset:bold-display"),
9149
- typographyChoice("typography-preset:modern-sans"),
9150
- typographyChoice("typography-preset:luxe-contrast")
9151
- ],
9152
- defaultTypographyPresetId: "typography-preset:bold-display",
9153
- themeOverrides: {
9154
- accordions: boldBorderedAccordionSystem,
9155
- cards: southWestCardSystem,
9156
- testimonialQuote: accentGlyphQuote,
9157
- bodyText: {
9158
- intro: {
9159
- paragraphSize: "editorial",
9160
- headingSize: "editorial"
9161
- }
9162
- },
9163
- inputs: expressiveUnderlineInputs
9164
- },
9165
- recommendedAppearancePresetIds: [
9166
- "hero-brand-scrim-fixed-frame",
9167
- "body-text-editorial-intro",
9168
- "schedule-details-brand-depth",
9169
- "testimonials-statement-cards",
9170
- "contact-form-panel"
9171
- ],
9172
- recommendedHeaderLookIds: [
9173
- "brand-solid",
9174
- "transparent-overlay",
9175
- "practical-utility"
9176
- ],
9177
- recommendedFooterLookIds: [
9178
- "site-footer-brand-two-band",
9179
- "footer-muted-grounding"
9180
- ],
9181
- buttonPersonalityChoices: [
9182
- buttonChoice("showtime-pill"),
9183
- buttonChoice("confident-chip"),
9184
- buttonChoice("ink-stamp"),
9185
- buttonChoice("brushed-wash")
9186
- ],
9187
- paletteVariantChoices: [
9188
- paletteChoice("brand-led-burgundy-gold"),
9189
- paletteChoice("brand-led-jewel"),
9190
- paletteChoice("brand-led-warm"),
9191
- paletteChoice("high-contrast-ink")
9192
- ]
9193
- }),
9194
- defineCuratedSiteStyle({
9195
- id: "site-style:original-joy",
9196
- name: "Original Joy",
9197
- headingDecoration: { family: "organic-squiggle", colorToken: "primary" },
9198
- description: "Warm, dark, and editorial: deep clay grounds, cream type, and bold burnt-orange accents for soulful community brands.",
9199
- generationBrief: "Use a deep brown ground with cream text and burnt-orange accents, large display headings, generous spacing, organic rounded shapes, and bold colour-blocked feature sections. Lead with warmth and belonging; calls to action should feel strong but unhurried.",
9200
- tokenRecipes: {
9201
- palette: "brand-led",
9202
- contrast: "maximum",
9203
- radius: "rounded",
9204
- shadow: "subtle",
9205
- typography: "clean-sans",
9206
- spacing: "airy",
9207
- motion: "expressive"
9208
- },
9209
- compositionBudget: expressiveBudget,
9210
- typographyPresetChoices: [
9211
- typographyChoice("typography-preset:original-joy"),
9212
- typographyChoice("typography-preset:bold-display"),
9213
- typographyChoice("typography-preset:modern-sans")
9214
- ],
9215
- defaultTypographyPresetId: "typography-preset:original-joy",
9216
- themeOverrides: {
9217
- accordions: boldBorderedAccordionSystem,
9218
- // Shared card system: warm rounded brown cards (event + testimonial cards
9219
- // pick this up automatically) with a burnt-orange statement variant.
9220
- cards: originalJoyCardSystem,
9221
- testimonialQuote: accentGlyphQuote,
9222
- bodyText: {
9223
- intro: {
9224
- paragraphSize: "editorial",
9225
- headingSize: "editorial"
9226
- }
9227
- }
9583
+ "block.faq": "split-heading-columns"
9228
9584
  },
9229
- // Recommended block looks: the bold colour-blocked feature cards, a calm
9230
- // band for the events spotlight, and statement testimonial cards.
9231
9585
  recommendedAppearancePresetIds: [
9232
- "feature-cards-bold-colors",
9233
- "offerings-calm-list",
9234
- "testimonials-statement-cards"
9235
- ],
9236
- // Floating, transparent "Clear Split" header (no fill behind the nav links).
9237
- defaultHeaderSelection: { layoutId: "floating", styleId: "minimal-surface" },
9238
- recommendedHeaderLayoutChoices: [headerLayoutChoice("floating")],
9239
- recommendedHeaderStyleChoicesByLayout: {
9240
- floating: [
9241
- headerStyleChoice("minimal-surface"),
9242
- headerStyleChoice("split-glass"),
9243
- headerStyleChoice("glass")
9244
- ]
9245
- },
9246
- // Legacy bridge only (the real curation is the explicit selection above).
9247
- // Kept to a reserved-space, non-overlay look on purpose: the split hero
9248
- // flows below the Clear Split header, so we must NOT trigger the immersive
9249
- // overlay-hero promotion that looks like `floating-glass` would force.
9250
- recommendedHeaderLookIds: ["minimal-transparent"],
9586
+ "hero-split-editorial",
9587
+ "intro-portrait-bio",
9588
+ "intro-organic-statement",
9589
+ "feature-cards-soft-panels",
9590
+ "feature-cards-editorial-columns",
9591
+ "feature-cards-photo-tiles",
9592
+ "media-text-quiet-story",
9593
+ "testimonials-non-carded",
9594
+ "faq-contained-help",
9595
+ "contact-form-panel"
9596
+ ],
9597
+ recommendedHeaderLookIds: [
9598
+ "centered-calm",
9599
+ "serif-line",
9600
+ "minimal-transparent"
9601
+ ],
9251
9602
  recommendedFooterLookIds: [
9252
- "site-footer-brand-two-band",
9603
+ "footer-centered-calm",
9604
+ "footer-editorial-columns",
9253
9605
  "footer-muted-grounding"
9254
9606
  ],
9255
9607
  buttonPersonalityChoices: [
9256
- buttonChoice("joy-stamp"),
9257
- buttonChoice("ink-stamp"),
9258
- buttonChoice("showtime-pill")
9608
+ buttonChoice("soft-pill"),
9609
+ buttonChoice("pebble"),
9610
+ buttonChoice("editorial-link")
9259
9611
  ],
9260
- paletteVariantChoices: [paletteChoice("warm-dark-ember")]
9261
- })
9262
- ];
9263
- var curatedSiteStylesById = new Map(
9264
- curatedSiteStyles.map((style) => [style.id, style])
9265
- );
9266
-
9267
- // ../theme-core/src/site-styles/siteStyleBlockPolicies.ts
9268
- var defaultPolicyPageFlowPresetId = asPageFlowPresetId("generated-default");
9269
- var southWestTwerkSchoolSiteStyleId = asSiteStyleId("site-style:south-west-twerk-school");
9270
- var heroBrandScrimFixedFrameLookId = asAppearancePresetId("hero-brand-scrim-fixed-frame");
9271
- var classicHeroLayoutVariantKey = asLayoutVariantKey("classic");
9272
- var microHeroLayoutVariantKey = asLayoutVariantKey("micro");
9273
- var waveBoundaryOptionId = asBoundaryOptionId("break:wave");
9274
-
9275
- // ../theme-core/src/site-styles/pageDesignEditorModel.ts
9276
- var pageFlowPresets = [
9277
- {
9278
- id: asPageFlowPresetId("flow:quiet"),
9279
- label: "Quiet",
9280
- boundaryStrategy: "quiet",
9281
- defaultBoundaryOptionId: noneBoundaryOption.id
9282
- },
9283
- {
9284
- id: asPageFlowPresetId("flow:balanced"),
9285
- label: "Balanced",
9286
- boundaryStrategy: "balanced",
9287
- defaultBoundaryOptionId: softBoundaryOption.id
9288
- },
9289
- {
9290
- id: asPageFlowPresetId("flow:expressive"),
9291
- label: "Expressive",
9292
- boundaryStrategy: "expressive",
9293
- defaultBoundaryOptionId: spaciousBoundaryOption.id
9294
- }
9295
- ];
9296
-
9297
- // ../theme-core/src/site-styles/designState.ts
9298
- import { z as z22 } from "zod";
9299
- var themeV2DesignStateSchemaVersion = 1;
9300
- var designResolutionPolicySchema = z22.enum(["generated", "user", "admin", "sdk"]);
9301
- var runtimeStyleFieldNameSchema = z22.enum(themeV2RuntimeStyleFieldNames);
9302
- var nonEmptyRuntimeStyleFieldNamesSchema = z22.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
9303
- fields3[0],
9304
- ...fields3.slice(1)
9305
- ]);
9306
- var heroLegibilityStrategySchema = z22.enum([
9307
- "none",
9308
- "scrim-gradient",
9309
- "solid-panel"
9310
- ]);
9311
- var heroCompositionIntentSchema = z22.enum([
9312
- "center",
9313
- "bottom-left"
9314
- ]);
9315
- var heroTypographyScaleIntentSchema = z22.enum([
9316
- "quiet",
9317
- "editorial",
9318
- "display",
9319
- "poster"
9320
- ]);
9321
- var sectionHeightIntentSchema = z22.enum([
9322
- "default",
9323
- "banner",
9324
- "hero",
9325
- "immersive"
9326
- ]);
9327
- var imageSurfaceTreatmentIntensitySchema = z22.enum(["soft", "balanced", "strong"]);
9328
- var imageSurfaceMotionSchema = z22.enum(["static", "fixed-frame"]);
9329
- var imageSurfaceTreatmentSchema = z22.discriminatedUnion("kind", [
9330
- z22.object({ kind: z22.literal("none") }).strict(),
9331
- z22.object({
9332
- kind: z22.literal("brand-scrim"),
9333
- token: z22.enum(["primary", "secondary", "accent"]),
9334
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
9335
- }).strict(),
9336
- z22.object({
9337
- kind: z22.literal("brand-wash"),
9338
- token: z22.enum(["primary", "secondary", "accent"]),
9339
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
9340
- }).strict(),
9341
- z22.object({
9342
- kind: z22.literal("neutral-scrim"),
9343
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
9344
- }).strict(),
9345
- z22.object({
9346
- kind: z22.literal("neutral-wash"),
9347
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
9348
- }).strict(),
9349
- z22.object({
9350
- kind: z22.literal("solid-panel"),
9351
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
9352
- }).strict()
9353
- ]);
9354
- var testimonialCardTreatmentSchema = z22.enum(["default", "accent-quote"]);
9355
- var tileTreatmentSchema = z22.enum(tileTreatmentValues);
9356
- var eventListTreatmentSchema = z22.enum(eventListTreatmentValues);
9357
- var eyebrowTreatmentSchema = z22.enum(eyebrowTreatmentValues);
9358
- function uniqueNonEmpty(values) {
9359
- const uniqueValues = [...new Set(values)];
9360
- const firstValue = uniqueValues[0];
9361
- if (!firstValue) {
9362
- throw new Error("Expected at least one Theme V2 design state option.");
9363
- }
9364
- return [firstValue, ...uniqueValues.slice(1)];
9365
- }
9366
- var userPanelTreatments = uniqueNonEmpty(
9367
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
9368
- );
9369
- var userFlushTreatments = uniqueNonEmpty(
9370
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
9371
- );
9372
- var userFlushBleeds = uniqueNonEmpty(
9373
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
9374
- );
9375
- var contentFrameIntentSchema = z22.discriminatedUnion("kind", [
9376
- z22.object({ kind: z22.literal("plain") }).strict(),
9377
- z22.object({
9378
- kind: z22.literal("panel"),
9379
- treatment: z22.enum(userPanelTreatments)
9380
- }).strict(),
9381
- z22.object({
9382
- kind: z22.literal("flush-panel"),
9383
- treatment: z22.enum(userFlushTreatments),
9384
- bleed: z22.enum(userFlushBleeds)
9385
- }).strict()
9386
- ]);
9387
- var blockDesignPlanSchema = z22.object({
9388
- blockId: z22.string().min(1).transform(asDesignBlockId),
9389
- blockKind: z22.string().min(1),
9390
- purpose: z22.string().min(1),
9391
- sectionSurface: z22.enum(userDesignOptionCatalog.sectionSurfaces),
9392
- contentFrame: contentFrameIntentSchema,
9393
- itemSurface: z22.enum(userDesignOptionCatalog.itemSurfaces),
9394
- transitionAfter: z22.enum(userDesignOptionCatalog.transitions),
9395
- emphasis: z22.enum(userDesignOptionCatalog.emphases),
9396
- sectionHeight: sectionHeightIntentSchema.optional(),
9397
- heroLegibility: heroLegibilityStrategySchema.optional(),
9398
- heroComposition: heroCompositionIntentSchema.optional(),
9399
- heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
9400
- imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
9401
- imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
9402
- testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
9403
- tileTreatment: tileTreatmentSchema.optional(),
9404
- eventListTreatment: eventListTreatmentSchema.optional(),
9405
- eyebrowTreatment: eyebrowTreatmentSchema.optional()
9406
- }).strict();
9407
- var styleAuthoritySchema = z22.discriminatedUnion("kind", [
9408
- z22.object({
9409
- kind: z22.literal("theme-v2"),
9410
- source: designResolutionPolicySchema,
9411
- siteStyleId: z22.string().min(1).transform(asSiteStyleId),
9412
- templateId: z22.string().min(1).transform(asDesignSystemTemplateId),
9413
- templateVersion: z22.number().int().nonnegative(),
9414
- resolverVersion: z22.number().int().nonnegative()
9415
- }).strict(),
9416
- z22.object({
9417
- kind: z22.literal("legacy-raw"),
9418
- reason: z22.enum(["pre-theme-v2", "manual-runtime-fields"])
9419
- }).strict(),
9420
- z22.object({
9421
- kind: z22.literal("advanced-detached"),
9422
- reason: z22.literal("detached-custom-runtime-fields")
9423
- }).strict()
9424
- ]);
9425
- var blockRuntimeStyleAuthoritySchema = z22.object({
9426
- unit: z22.literal("block-runtime-fields"),
9427
- blockId: z22.string().min(1).transform(asDesignBlockId),
9428
- fields: nonEmptyRuntimeStyleFieldNamesSchema,
9429
- authority: styleAuthoritySchema
9430
- }).strict();
9431
- var persistedPageDesignStateV1Schema = z22.object({
9432
- schemaVersion: z22.literal(themeV2DesignStateSchemaVersion),
9433
- siteStyleId: z22.string().min(1).transform(asSiteStyleId),
9434
- templateId: z22.string().min(1).transform(asDesignSystemTemplateId),
9435
- templateVersion: z22.number().int().nonnegative(),
9436
- resolverVersion: z22.number().int().nonnegative(),
9437
- rhythmPresetId: z22.string().min(1),
9438
- blocks: z22.array(blockDesignPlanSchema),
9439
- styleAuthorities: z22.array(blockRuntimeStyleAuthoritySchema)
9440
- }).strict();
9441
-
9442
- // ../theme-core/src/site-styles/runtimeCompiler.ts
9443
- function defineDesignRuntimeRules(rules) {
9444
- return rules;
9445
- }
9446
- function defineComponentRuntimeRules(rules) {
9447
- return rules;
9448
- }
9449
- var defaultDesignRuntimeRules = defineDesignRuntimeRules({
9450
- sectionSurfaces: {
9451
- base: {},
9452
- "muted-band": {
9453
- background: {
9454
- type: "color",
9455
- color: "muted"
9456
- }
9612
+ paletteVariantChoices: [
9613
+ paletteChoice("soft-natural-lilac"),
9614
+ paletteChoice("soft-natural-watercolor"),
9615
+ paletteChoice("soft-natural-stone"),
9616
+ paletteChoice("warm-neutral-cream")
9617
+ ]
9618
+ }),
9619
+ defineCuratedSiteStyle({
9620
+ id: "site-style:personal-retreat-journal",
9621
+ name: "Personal Retreat Journal",
9622
+ themeOverrides: {
9623
+ accordions: editorialDividedAccordionSystem,
9624
+ testimonialQuote: serifDisplayQuote
9625
+ },
9626
+ headingDecoration: { family: "short-center-rule", colorToken: "primary" },
9627
+ description: "Warm, story-led, and readable for solo practitioners with mixed offers.",
9628
+ generationBrief: "Center the practitioner as the guide, then make private sessions, classes, retreats, and resources feel like clear pathways. Keep retreat copy grounded and practical, with enough editorial warmth for longer reading.",
9629
+ siteCreatorSelection: {
9630
+ kind: "site_creator_keyword_heuristic",
9631
+ priority: 40
9632
+ },
9633
+ selectionKeywordRules: [
9634
+ { kind: "substring", value: "retreat" },
9635
+ { kind: "phrase", value: "solo practitioner" },
9636
+ { kind: "phrase", value: "personal brand" },
9637
+ { kind: "substring", value: "teacher" },
9638
+ { kind: "substring", value: "coach" },
9639
+ { kind: "phrase", value: "retreat resources" },
9640
+ { kind: "substring", value: "journal" }
9641
+ ],
9642
+ tokenRecipes: {
9643
+ palette: "warm-neutral",
9644
+ contrast: "standard",
9645
+ radius: "soft",
9646
+ shadow: "subtle",
9647
+ typography: "serif-editorial",
9648
+ spacing: "airy",
9649
+ motion: "subtle"
9457
9650
  },
9458
- "accent-band": {
9459
- background: {
9460
- type: "color",
9461
- color: "primary"
9462
- }
9651
+ compositionBudget: balancedBudget,
9652
+ recommendedHeaderLookIds: [
9653
+ "serif-line",
9654
+ "centered-calm",
9655
+ "minimal-transparent"
9656
+ ],
9657
+ buttonPersonalityChoices: [
9658
+ buttonChoice("editorial-link"),
9659
+ buttonChoice("soft-pill"),
9660
+ buttonChoice("brushed-wash")
9661
+ ],
9662
+ paletteVariantChoices: [
9663
+ paletteChoice("warm-neutral-forest"),
9664
+ paletteChoice("warm-neutral-clay"),
9665
+ paletteChoice("soft-natural-stone")
9666
+ ]
9667
+ }),
9668
+ defineCuratedSiteStyle({
9669
+ id: "site-style:tactile-workshop",
9670
+ name: "Tactile Workshop",
9671
+ themeOverrides: {
9672
+ accordions: warmInsetAccordionSystem,
9673
+ testimonialQuote: accentGlyphQuote
9463
9674
  },
9464
- "brand-depth-band": {
9465
- background: {
9466
- type: "color",
9467
- color: "primary-800"
9468
- }
9675
+ headingDecoration: { family: "organic-squiggle", colorToken: "primary" },
9676
+ description: "Bright, hands-on, and image-led for maker studios, workshops, and creative classes.",
9677
+ generationBrief: "Lead with objects, materials, studio process, and practical booking detail. Keep the tone warm and direct, with useful mess, clear dates, and enough gallery rhythm to feel like a real creative studio.",
9678
+ siteCreatorSelection: {
9679
+ kind: "site_creator_keyword_heuristic",
9680
+ priority: 50
9469
9681
  },
9470
- "hero-image": {
9471
- background: {
9472
- type: "image",
9473
- opacity: 1,
9474
- position: "center center",
9475
- ...uniformSectionForeground("text")
9476
- }
9477
- }
9478
- },
9479
- heroLegibility: {
9480
- "scrim-gradient": {
9481
- type: "gradient",
9482
- gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
9483
- opacity: 1
9682
+ selectionKeywordRules: [
9683
+ { kind: "substring", value: "ceramic" },
9684
+ { kind: "word", value: "pottery" },
9685
+ { kind: "phrase", value: "maker studio" },
9686
+ { kind: "phrase", value: "craft class" },
9687
+ { kind: "phrase", value: "craft workshop" },
9688
+ { kind: "word", value: "clay" },
9689
+ { kind: "word", value: "kiln" }
9690
+ ],
9691
+ tokenRecipes: {
9692
+ palette: "brand-led",
9693
+ contrast: "standard",
9694
+ radius: "soft",
9695
+ shadow: "subtle",
9696
+ typography: "friendly-sans",
9697
+ spacing: "regular",
9698
+ motion: "subtle"
9484
9699
  },
9485
- "solid-panel": {
9486
- type: "color",
9487
- color: "surface",
9488
- opacity: 0.88
9489
- }
9490
- },
9491
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
9492
- });
9493
- var defaultComponentRuntimeRules = defineComponentRuntimeRules({
9494
- panelFrames: {
9495
- inset: {
9496
- spacing: "comfortable",
9497
- rounded: "xl",
9498
- raised: false,
9499
- background: {
9500
- type: "color",
9501
- color: "surfaceAlt",
9502
- textColor: "text"
9503
- }
9700
+ compositionBudget: balancedBudget,
9701
+ recommendedHeaderLookIds: [
9702
+ "brand-solid",
9703
+ "practical-utility",
9704
+ "clean-base"
9705
+ ],
9706
+ recommendedFooterLookIds: [
9707
+ "site-footer-brand-two-band",
9708
+ "footer-muted-grounding"
9709
+ ],
9710
+ buttonPersonalityChoices: [
9711
+ buttonChoice("pebble"),
9712
+ buttonChoice("confident-chip"),
9713
+ buttonChoice("ink-stamp"),
9714
+ buttonChoice("editorial-link")
9715
+ ],
9716
+ paletteVariantChoices: [
9717
+ paletteChoice("brand-led-warm"),
9718
+ paletteChoice("brand-led-cool"),
9719
+ paletteChoice("soft-natural-watercolor"),
9720
+ paletteChoice("warm-neutral-clay")
9721
+ ]
9722
+ }),
9723
+ defineCuratedSiteStyle({
9724
+ id: SOFT_EARTH_SITE_STYLE_ID,
9725
+ name: "Soft Earth",
9726
+ headingDecoration: { family: "organic-squiggle", colorToken: "primary" },
9727
+ description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
9728
+ generationBrief: "Use cream space, terracotta CTAs, olive quote bands, natural imagery, generous but composed spacing, and editorial serif headings. Prefer a real intro section, image-led offering cards, warm community quotes, and an FAQ with a full-width intro above two columns of questions when content allows.",
9729
+ siteCreatorSelection: {
9730
+ kind: "site_creator_keyword_heuristic",
9731
+ priority: 45
9732
+ },
9733
+ selectionKeywordRules: [
9734
+ { kind: "word", value: "meditation" },
9735
+ { kind: "word", value: "wellbeing" },
9736
+ { kind: "substring", value: "retreat" },
9737
+ { kind: "phrase", value: "yoga studio" },
9738
+ { kind: "phrase", value: "mindful movement" }
9739
+ ],
9740
+ tokenRecipes: {
9741
+ palette: "warm-neutral",
9742
+ contrast: "standard",
9743
+ radius: "soft",
9744
+ shadow: "subtle",
9745
+ typography: "serif-editorial",
9746
+ spacing: "airy",
9747
+ motion: "subtle"
9748
+ },
9749
+ compositionBudget: balancedBudget,
9750
+ themeOverrides: {
9751
+ typography: {
9752
+ body: {
9753
+ family: "Inter, system-ui, sans-serif",
9754
+ size: "md",
9755
+ weight: "regular",
9756
+ lineHeight: "relaxed",
9757
+ letterSpacing: "normal"
9758
+ },
9759
+ headings: {
9760
+ default: {
9761
+ family: '"Cormorant Garamond", Georgia, serif',
9762
+ weight: "regular",
9763
+ lineHeight: "normal",
9764
+ letterSpacing: "normal",
9765
+ colorToken: "text",
9766
+ italic: null,
9767
+ case: null
9768
+ },
9769
+ h1: {
9770
+ size: "xl",
9771
+ weight: "regular",
9772
+ lineHeight: "normal",
9773
+ letterSpacing: "normal",
9774
+ italic: null
9775
+ },
9776
+ h2: {
9777
+ size: "lg",
9778
+ weight: "regular",
9779
+ lineHeight: "normal",
9780
+ letterSpacing: "normal",
9781
+ italic: null
9782
+ },
9783
+ h3: {
9784
+ size: "md",
9785
+ weight: "regular",
9786
+ lineHeight: "normal",
9787
+ letterSpacing: "normal",
9788
+ italic: null
9789
+ }
9790
+ },
9791
+ scale: "majorThird"
9792
+ },
9793
+ bodyText: {
9794
+ intro: {
9795
+ paragraphSize: "default",
9796
+ headingSize: "editorial"
9797
+ }
9798
+ },
9799
+ accordions: softEarthAccordionSystem,
9800
+ testimonialQuote: accentGlyphQuote
9801
+ },
9802
+ defaultBlockVariants: {
9803
+ "block.faq": "question-columns"
9804
+ },
9805
+ recommendedAppearancePresetIds: [
9806
+ "hero-brand-scrim",
9807
+ "intro-organic-statement",
9808
+ "feature-cards-raised-rule",
9809
+ "events-lined-panel",
9810
+ "testimonials-non-carded",
9811
+ "contact-form-panel"
9812
+ ],
9813
+ recommendedHeaderLookIds: [
9814
+ "centered-calm",
9815
+ "minimal-transparent",
9816
+ "serif-line"
9817
+ ],
9818
+ recommendedFooterLookIds: [
9819
+ "footer-muted-grounding",
9820
+ "site-footer-brand-two-band"
9821
+ ],
9822
+ buttonPersonalityChoices: [
9823
+ buttonChoice("earth-pill"),
9824
+ buttonChoice("soft-pill"),
9825
+ buttonChoice("pebble"),
9826
+ buttonChoice("editorial-link")
9827
+ ],
9828
+ paletteVariantChoices: [
9829
+ paletteChoice("warm-neutral-soft-earth"),
9830
+ paletteChoice("warm-neutral-clay"),
9831
+ paletteChoice("warm-neutral-forest"),
9832
+ paletteChoice("soft-natural-sage")
9833
+ ]
9834
+ }),
9835
+ defineCuratedSiteStyle({
9836
+ id: "site-style:bold-launch",
9837
+ name: "Bold Launch",
9838
+ themeOverrides: {
9839
+ accordions: boldBorderedAccordionSystem,
9840
+ testimonialQuote: accentGlyphQuote
9841
+ },
9842
+ headingDecoration: { family: "short-center-rule", colorToken: "primary" },
9843
+ description: "High-energy and punchy for launches, campaigns, and creative offers.",
9844
+ generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
9845
+ siteCreatorSelection: {
9846
+ kind: "site_creator_keyword_heuristic",
9847
+ priority: 10
9848
+ },
9849
+ selectionKeywordRules: [
9850
+ { kind: "substring", value: "launch" },
9851
+ { kind: "substring", value: "campaign" },
9852
+ { kind: "word", value: "preorder" },
9853
+ { kind: "phrase", value: "pre-order" },
9854
+ { kind: "substring", value: "waitlist" },
9855
+ { kind: "word", value: "drop" }
9856
+ ],
9857
+ tokenRecipes: {
9858
+ palette: "high-contrast",
9859
+ contrast: "maximum",
9860
+ radius: "pill",
9861
+ shadow: "layered",
9862
+ typography: "clean-sans",
9863
+ spacing: "regular",
9864
+ motion: "expressive"
9504
9865
  },
9505
- raised: {
9506
- spacing: "comfortable",
9507
- rounded: "xl",
9508
- raised: true,
9509
- background: {
9510
- type: "color",
9511
- color: "surfaceAlt",
9512
- textColor: "text"
9513
- }
9866
+ compositionBudget: expressiveBudget,
9867
+ recommendedHeaderLookIds: [
9868
+ "transparent-overlay",
9869
+ "floating-glass",
9870
+ "brand-solid"
9871
+ ],
9872
+ buttonPersonalityChoices: [
9873
+ buttonChoice("ink-stamp"),
9874
+ buttonChoice("confident-chip"),
9875
+ buttonChoice("brushed-wash"),
9876
+ buttonChoice("pebble")
9877
+ ],
9878
+ paletteVariantChoices: [
9879
+ paletteChoice("high-contrast-monochrome"),
9880
+ paletteChoice("high-contrast-ink"),
9881
+ paletteChoice("brand-led-jewel"),
9882
+ paletteChoice("brand-led-warm")
9883
+ ]
9884
+ }),
9885
+ defineCuratedSiteStyle({
9886
+ id: "site-style:south-west-twerk-school",
9887
+ name: "South West Twerk School",
9888
+ headingDecoration: { family: "organic-squiggle", colorToken: "primary" },
9889
+ description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
9890
+ generationBrief: "Use confident rhythm, bold burgundy-and-gold accents, large editorial intro copy, strong booking routes, and dark feature sections where proof or forms need emphasis.",
9891
+ tokenRecipes: {
9892
+ palette: "brand-led",
9893
+ contrast: "maximum",
9894
+ radius: "soft",
9895
+ shadow: "layered",
9896
+ typography: "clean-sans",
9897
+ spacing: "airy",
9898
+ motion: "expressive"
9514
9899
  },
9515
- editorial: {
9516
- spacing: "medium",
9517
- rounded: "xl",
9518
- raised: false,
9519
- background: {
9520
- type: "color",
9521
- color: "surface",
9522
- textColor: "text"
9523
- }
9524
- }
9525
- },
9526
- flushFrames: {
9527
- "media-panel": {
9528
- fullWidth: true,
9529
- spacing: "none",
9530
- rounded: "none",
9531
- raised: false
9532
- }
9533
- },
9534
- itemSurfaces: {
9535
- none: null,
9536
- default: {
9537
- spacing: "medium",
9538
- rounded: "lg",
9539
- raised: false
9900
+ compositionBudget: expressiveBudget,
9901
+ typographyPresetChoices: [
9902
+ typographyChoice("typography-preset:bold-display"),
9903
+ typographyChoice("typography-preset:modern-sans"),
9904
+ typographyChoice("typography-preset:luxe-contrast")
9905
+ ],
9906
+ defaultTypographyPresetId: "typography-preset:bold-display",
9907
+ themeOverrides: {
9908
+ accordions: boldBorderedAccordionSystem,
9909
+ cards: southWestCardSystem,
9910
+ testimonialQuote: accentGlyphQuote,
9911
+ bodyText: {
9912
+ intro: {
9913
+ paragraphSize: "editorial",
9914
+ headingSize: "editorial"
9915
+ }
9916
+ },
9917
+ inputs: expressiveUnderlineInputs
9540
9918
  },
9541
- flat: {
9542
- spacing: "medium",
9543
- rounded: "lg",
9544
- raised: false
9919
+ recommendedAppearancePresetIds: [
9920
+ "hero-brand-scrim-fixed-frame",
9921
+ "body-text-editorial-intro",
9922
+ "schedule-details-brand-depth",
9923
+ "testimonials-statement-cards",
9924
+ "contact-form-panel"
9925
+ ],
9926
+ recommendedHeaderLookIds: [
9927
+ "brand-solid",
9928
+ "transparent-overlay",
9929
+ "practical-utility"
9930
+ ],
9931
+ recommendedFooterLookIds: [
9932
+ "site-footer-brand-two-band",
9933
+ "footer-muted-grounding"
9934
+ ],
9935
+ buttonPersonalityChoices: [
9936
+ buttonChoice("showtime-pill"),
9937
+ buttonChoice("confident-chip"),
9938
+ buttonChoice("ink-stamp"),
9939
+ buttonChoice("brushed-wash")
9940
+ ],
9941
+ paletteVariantChoices: [
9942
+ paletteChoice("brand-led-burgundy-gold"),
9943
+ paletteChoice("brand-led-jewel"),
9944
+ paletteChoice("brand-led-warm"),
9945
+ paletteChoice("high-contrast-ink")
9946
+ ]
9947
+ }),
9948
+ defineCuratedSiteStyle({
9949
+ id: "site-style:kirtan-ornate",
9950
+ name: "Kirtan Ornate",
9951
+ headingDecoration: { family: "short-center-rule", colorToken: "accent" },
9952
+ description: "Ceremonial, jewel-toned, and devotional: ornate frames, warm contrast, and composed rhythm for intimate music gatherings.",
9953
+ 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.",
9954
+ selectionKeywordRules: [
9955
+ { kind: "word", value: "kirtan" },
9956
+ { kind: "word", value: "chanting" },
9957
+ { kind: "word", value: "ceremony" },
9958
+ { kind: "word", value: "devotional" }
9959
+ ],
9960
+ tokenRecipes: {
9961
+ palette: "brand-led",
9962
+ contrast: "strong",
9963
+ radius: "soft",
9964
+ shadow: "subtle",
9965
+ typography: "serif-editorial",
9966
+ spacing: "airy",
9967
+ motion: "subtle"
9545
9968
  },
9546
- outlined: {
9547
- spacing: "medium",
9548
- rounded: "lg",
9549
- raised: false,
9550
- border: {
9551
- enabled: true,
9552
- width: "1",
9553
- colorToken: "border"
9554
- }
9969
+ compositionBudget: expressiveBudget,
9970
+ typographyPresetChoices: [
9971
+ typographyChoice("typography-preset:kirtan-ornate"),
9972
+ typographyChoice("typography-preset:luxe-contrast"),
9973
+ typographyChoice("typography-preset:editorial-serif")
9974
+ ],
9975
+ defaultTypographyPresetId: "typography-preset:kirtan-ornate",
9976
+ themeOverrides: {
9977
+ accordions: warmInsetAccordionSystem,
9978
+ cards: originalJoyCardSystem,
9979
+ testimonialQuote: serifDisplayQuote,
9980
+ bodyText: {
9981
+ intro: {
9982
+ paragraphSize: "editorial",
9983
+ headingSize: "editorial"
9984
+ }
9985
+ },
9986
+ inputs: ornateDarkInputs
9555
9987
  },
9556
- raised: {
9557
- spacing: "medium",
9558
- rounded: "xl",
9559
- raised: true
9988
+ designRuntimeRules: kirtanOrnateDesignRuntimeRules,
9989
+ recommendedAppearancePresetIds: [
9990
+ "hero-brand-scrim-fixed-frame",
9991
+ "media-text-quiet-story",
9992
+ "events-lined-panel",
9993
+ "schedule-details-brand-depth",
9994
+ "testimonials-statement-cards",
9995
+ "contact-form-panel"
9996
+ ],
9997
+ defaultHeaderSelection: { layoutId: "floating", styleId: "minimal-surface" },
9998
+ recommendedHeaderLayoutChoices: [headerLayoutChoice("floating")],
9999
+ recommendedHeaderStyleChoicesByLayout: {
10000
+ floating: [
10001
+ headerStyleChoice("minimal-surface"),
10002
+ headerStyleChoice("split-glass"),
10003
+ headerStyleChoice("glass")
10004
+ ]
9560
10005
  },
9561
- inset: {
9562
- treatment: "soft-panel",
9563
- spacing: "comfortable",
9564
- rounded: "xl",
9565
- raised: false,
9566
- border: {
9567
- enabled: false
9568
- },
9569
- background: {
9570
- type: "color",
9571
- color: "surfaceAlt",
9572
- textColor: "text"
9573
- }
10006
+ recommendedHeaderLookIds: ["minimal-transparent"],
10007
+ recommendedFooterLookIds: [
10008
+ "site-footer-brand-two-band",
10009
+ "footer-muted-grounding"
10010
+ ],
10011
+ buttonPersonalityChoices: [
10012
+ buttonChoice("ornate-ritual"),
10013
+ buttonChoice("joy-stamp"),
10014
+ buttonChoice("ink-stamp")
10015
+ ],
10016
+ paletteVariantChoices: [
10017
+ paletteChoice("warm-dark-kirtan-gold"),
10018
+ paletteChoice("warm-dark-ember"),
10019
+ paletteChoice("brand-led-burgundy-gold")
10020
+ ]
10021
+ }),
10022
+ defineCuratedSiteStyle({
10023
+ id: "site-style:original-joy",
10024
+ name: "Original Joy",
10025
+ headingDecoration: { family: "organic-squiggle", colorToken: "primary" },
10026
+ description: "Warm, dark, and editorial: deep clay grounds, cream type, and bold burnt-orange accents for soulful community brands.",
10027
+ generationBrief: "Use a deep brown ground with cream text and burnt-orange accents, large display headings, generous spacing, organic rounded shapes, and bold colour-blocked feature sections. Lead with warmth and belonging; calls to action should feel strong but unhurried.",
10028
+ tokenRecipes: {
10029
+ palette: "brand-led",
10030
+ contrast: "maximum",
10031
+ radius: "rounded",
10032
+ shadow: "subtle",
10033
+ typography: "clean-sans",
10034
+ spacing: "airy",
10035
+ motion: "expressive"
9574
10036
  },
9575
- editorial: {
9576
- // Boxless open column with a short rule on top; the visual treatment
9577
- // lives in blocks-static/card-treatments.css.
9578
- treatment: "editorial-rule",
9579
- spacing: "none",
9580
- rounded: "none",
9581
- raised: false,
9582
- border: {
9583
- enabled: false
10037
+ compositionBudget: expressiveBudget,
10038
+ typographyPresetChoices: [
10039
+ typographyChoice("typography-preset:original-joy"),
10040
+ typographyChoice("typography-preset:bold-display"),
10041
+ typographyChoice("typography-preset:modern-sans")
10042
+ ],
10043
+ defaultTypographyPresetId: "typography-preset:original-joy",
10044
+ themeOverrides: {
10045
+ accordions: boldBorderedAccordionSystem,
10046
+ // Shared card system: warm rounded brown cards (event + testimonial cards
10047
+ // pick this up automatically) with a burnt-orange statement variant.
10048
+ cards: originalJoyCardSystem,
10049
+ testimonialQuote: accentGlyphQuote,
10050
+ bodyText: {
10051
+ intro: {
10052
+ paragraphSize: "editorial",
10053
+ headingSize: "editorial"
10054
+ }
9584
10055
  }
9585
10056
  },
9586
- "color-blocked": {
9587
- // Bold, flat colour-blocked cards. The per-card background colour cycle
9588
- // (by position) and staggered offset live in
9589
- // blocks-static/card-treatments.css; here we set the shared shape:
9590
- // generous padding, large radius, no border, flat (no shadow).
9591
- treatment: "color-blocked",
9592
- spacing: "spacious",
9593
- rounded: "2xl",
9594
- raised: false,
9595
- border: {
9596
- enabled: false
9597
- }
9598
- }
10057
+ // Recommended block looks: the bold colour-blocked feature cards, a calm
10058
+ // band for the events spotlight, and statement testimonial cards.
10059
+ recommendedAppearancePresetIds: [
10060
+ "feature-cards-bold-colors",
10061
+ "offerings-calm-list",
10062
+ "testimonials-statement-cards"
10063
+ ],
10064
+ // Floating, transparent "Clear Split" header (no fill behind the nav links).
10065
+ defaultHeaderSelection: { layoutId: "floating", styleId: "minimal-surface" },
10066
+ recommendedHeaderLayoutChoices: [headerLayoutChoice("floating")],
10067
+ recommendedHeaderStyleChoicesByLayout: {
10068
+ floating: [
10069
+ headerStyleChoice("minimal-surface"),
10070
+ headerStyleChoice("split-glass"),
10071
+ headerStyleChoice("glass")
10072
+ ]
10073
+ },
10074
+ // Legacy bridge only (the real curation is the explicit selection above).
10075
+ // Kept to a reserved-space, non-overlay look on purpose: the split hero
10076
+ // flows below the Clear Split header, so we must NOT trigger the immersive
10077
+ // overlay-hero promotion that looks like `floating-glass` would force.
10078
+ recommendedHeaderLookIds: ["minimal-transparent"],
10079
+ recommendedFooterLookIds: [
10080
+ "site-footer-brand-two-band",
10081
+ "footer-muted-grounding"
10082
+ ],
10083
+ buttonPersonalityChoices: [
10084
+ buttonChoice("joy-stamp"),
10085
+ buttonChoice("ink-stamp"),
10086
+ buttonChoice("showtime-pill")
10087
+ ],
10088
+ paletteVariantChoices: [paletteChoice("warm-dark-ember")]
10089
+ })
10090
+ ];
10091
+ var curatedSiteStylesById = new Map(
10092
+ curatedSiteStyles.map((style) => [style.id, style])
10093
+ );
10094
+
10095
+ // ../theme-core/src/site-styles/siteStyleBlockPolicies.ts
10096
+ var defaultPolicyPageFlowPresetId = asPageFlowPresetId("generated-default");
10097
+ var southWestTwerkSchoolSiteStyleId = asSiteStyleId("site-style:south-west-twerk-school");
10098
+ var heroBrandScrimFixedFrameLookId = asAppearancePresetId("hero-brand-scrim-fixed-frame");
10099
+ var classicHeroLayoutVariantKey = asLayoutVariantKey("classic");
10100
+ var microHeroLayoutVariantKey = asLayoutVariantKey("micro");
10101
+ var waveBoundaryOptionId = asBoundaryOptionId("break:wave");
10102
+
10103
+ // ../theme-core/src/site-styles/pageDesignEditorModel.ts
10104
+ var pageFlowPresets = [
10105
+ {
10106
+ id: asPageFlowPresetId("flow:quiet"),
10107
+ label: "Quiet",
10108
+ boundaryStrategy: "quiet",
10109
+ defaultBoundaryOptionId: noneBoundaryOption.id
10110
+ },
10111
+ {
10112
+ id: asPageFlowPresetId("flow:balanced"),
10113
+ label: "Balanced",
10114
+ boundaryStrategy: "balanced",
10115
+ defaultBoundaryOptionId: softBoundaryOption.id
10116
+ },
10117
+ {
10118
+ id: asPageFlowPresetId("flow:expressive"),
10119
+ label: "Expressive",
10120
+ boundaryStrategy: "expressive",
10121
+ defaultBoundaryOptionId: spaciousBoundaryOption.id
9599
10122
  }
9600
- });
9601
- function uniformSectionForeground(token) {
9602
- return {
9603
- textColor: token,
9604
- headingColor: token,
9605
- linkColor: token,
9606
- supportingColor: token
9607
- };
9608
- }
10123
+ ];
9609
10124
 
9610
10125
  // ../theme-core/src/site-styles/generatedSchemas.ts
9611
10126
  import { z as z23 } from "zod";
@@ -10393,6 +10908,31 @@ function cardStylesField(options = {}) {
10393
10908
  return createBoxStylesFieldWithDepth("card", options);
10394
10909
  }
10395
10910
 
10911
+ // ../blocks/src/system/fields/imageShape.ts
10912
+ var standardImageShapeOptions = [
10913
+ { value: "default", label: "Default" },
10914
+ { value: "square", label: "Square corners" },
10915
+ { value: "rounded", label: "Rounded corners" },
10916
+ { value: "circle", label: "Circle" },
10917
+ { value: "arch", label: "Arch" }
10918
+ ];
10919
+ function createImageShapeField(options = {}) {
10920
+ return {
10921
+ id: options.id ?? "imageShape",
10922
+ type: "select",
10923
+ label: options.label ?? "Image shape",
10924
+ ...options.description ? { description: options.description } : {},
10925
+ required: false,
10926
+ defaultValue: options.defaultValue ?? "default",
10927
+ multiple: false,
10928
+ options: [...standardImageShapeOptions],
10929
+ ui: {
10930
+ intent: options.uiIntent ?? "display",
10931
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
10932
+ }
10933
+ };
10934
+ }
10935
+
10396
10936
  // ../blocks/src/utils/env.ts
10397
10937
  function isDevEnvironment() {
10398
10938
  try {
@@ -11152,7 +11692,7 @@ function buildFooterNavAll(common) {
11152
11692
  return stack(
11153
11693
  { className: common.className, gap: common.gap, align: "stretch" },
11154
11694
  [item],
11155
- when(collectionPath)
11695
+ whenCollectionHasItems(collectionPath)
11156
11696
  );
11157
11697
  }
11158
11698
  function buildFooterNavLinksOnly(common) {
@@ -11185,7 +11725,7 @@ function buildFooterNavLinksOnly(common) {
11185
11725
  return stack(
11186
11726
  { className: common.className, gap: common.gap, align: "stretch" },
11187
11727
  [item],
11188
- when(collectionPath)
11728
+ whenCollectionHasItems(collectionPath)
11189
11729
  );
11190
11730
  }
11191
11731
  function buildFooterNavFlatten(common) {
@@ -11234,9 +11774,20 @@ function buildFooterNavFlatten(common) {
11234
11774
  return stack(
11235
11775
  { className: common.className, gap: common.gap, align: "stretch" },
11236
11776
  [item],
11237
- when(collectionPath)
11777
+ whenCollectionHasItems(collectionPath)
11238
11778
  );
11239
11779
  }
11780
+ var whenCollectionHasItems = (collectionPath) => (node) => ({
11781
+ ...node,
11782
+ $when: {
11783
+ when: {
11784
+ from: collectionPath,
11785
+ transforms: [{ id: "array.length" }]
11786
+ },
11787
+ equals: 0,
11788
+ not: true
11789
+ }
11790
+ });
11240
11791
  function footerNav(opts) {
11241
11792
  const mode = opts?.mode ?? "all";
11242
11793
  const collectionPath = opts?.collectionPath ?? "footerMenu.items";
@@ -13293,8 +13844,23 @@ function fragmentsToRepeaterField(id, label, fragments, options = {}) {
13293
13844
  var heroLayoutControlsFragment = defineFragment({
13294
13845
  id: "heroLayoutControls",
13295
13846
  title: "Hero Layout",
13296
- description: "Alignment and content width controls for hero layouts.",
13847
+ description: "Title scale, alignment, and content width controls for hero layouts.",
13297
13848
  fields: [
13849
+ {
13850
+ id: "titleSize",
13851
+ type: "select",
13852
+ label: "Title size",
13853
+ description: "Adjust the visual scale of the hero title.",
13854
+ required: false,
13855
+ ui: { intent: "display" },
13856
+ options: [
13857
+ { value: "auto", label: "Auto" },
13858
+ { value: "quiet", label: "Normal" },
13859
+ { value: "editorial", label: "Large" },
13860
+ { value: "display", label: "Huge" },
13861
+ { value: "poster", label: "Poster" }
13862
+ ]
13863
+ },
13298
13864
  {
13299
13865
  id: "contentAlignment",
13300
13866
  type: "select",
@@ -14089,7 +14655,18 @@ function heroSplitImagePane() {
14089
14655
  return stack(
14090
14656
  {
14091
14657
  gap: "none",
14092
- className: "rb-relative rb-overflow-hidden rb-rounded-3xl",
14658
+ className: {
14659
+ $bind: {
14660
+ from: "content.imageShape",
14661
+ transforms: [
14662
+ {
14663
+ id: "ui.imageShapeClassName",
14664
+ options: { baseClass: "rb-relative rb-overflow-hidden rb-rounded-3xl" }
14665
+ }
14666
+ ],
14667
+ fallback: "rb-relative rb-overflow-hidden rb-rounded-3xl"
14668
+ }
14669
+ },
14093
14670
  style: {
14094
14671
  minHeight: "clamp(18rem, 36vw, 34rem)"
14095
14672
  }
@@ -14207,6 +14784,12 @@ var heroConfig = {
14207
14784
  label: "Content card",
14208
14785
  renderInHeader: true,
14209
14786
  intent: "style"
14787
+ }),
14788
+ createImageShapeField({
14789
+ id: "imageShape",
14790
+ label: "Image shape",
14791
+ defaultValue: "default",
14792
+ uiIntent: "display"
14210
14793
  })
14211
14794
  ],
14212
14795
  layout: classicLayout,
@@ -14221,6 +14804,15 @@ var heroConfig = {
14221
14804
  description: "Hero section with headline, subtitle, and repeatable CTAs.",
14222
14805
  tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
14223
14806
  icon: "Sparkles",
14807
+ previewCustomize: {
14808
+ quickFieldPriority: [
14809
+ "titleSize",
14810
+ "contentAlignment",
14811
+ "contentMaxWidth",
14812
+ "verticalAlignment",
14813
+ "imageShape"
14814
+ ]
14815
+ },
14224
14816
  styleTokens: {
14225
14817
  typography: "display",
14226
14818
  spacing: "xl"
@@ -14237,7 +14829,8 @@ var standardAspectRatioOptions = [
14237
14829
  { value: "16/9", label: "16:9 (Landscape)" },
14238
14830
  { value: "4/3", label: "4:3 (Standard)" },
14239
14831
  { value: "1/1", label: "1:1 (Square)" },
14240
- { value: "3/4", label: "3:4 (Portrait)" }
14832
+ { value: "3/4", label: "3:4 (Portrait)" },
14833
+ { value: "9/16", label: "9:16 (Tall portrait)" }
14241
14834
  ];
14242
14835
  function createAspectRatioField(options = {}) {
14243
14836
  return {
@@ -15427,34 +16020,286 @@ var formManifest = createBlockManifest({
15427
16020
  description: "Copy above the form.",
15428
16021
  icon: "PanelTop"
15429
16022
  },
15430
- "two-column": {
15431
- label: "Two column",
15432
- description: "Copy on the left and form on the right.",
15433
- icon: "Columns2"
16023
+ "two-column": {
16024
+ label: "Two column",
16025
+ description: "Copy on the left and form on the right.",
16026
+ icon: "Columns2"
16027
+ }
16028
+ },
16029
+ styleTokens: { background: "surface", typography: "body", spacing: "md" },
16030
+ behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },
16031
+ category: "interactive",
16032
+ tags: ["form", "contact", "input", "submit", "fields", "signup", "lead-capture"],
16033
+ icon: "FormInput"
16034
+ });
16035
+ var formDataSchema = z30.object({
16036
+ id: z30.string(),
16037
+ siteId: z30.string(),
16038
+ userId: z30.string(),
16039
+ name: z30.string(),
16040
+ slug: z30.string(),
16041
+ schemaJson: z30.any(),
16042
+ settingsJson: z30.any().optional(),
16043
+ createdAt: z30.string(),
16044
+ updatedAt: z30.string()
16045
+ });
16046
+ var formBlockDefinition = {
16047
+ manifest: formManifest,
16048
+ dataSchemas: { form: formDataSchema.optional() },
16049
+ dataLoaders,
16050
+ runtime: formBlockRuntime
16051
+ };
16052
+
16053
+ // ../blocks/src/system/blocks/contact-newsletter.ts
16054
+ var contactNewsletterLayout = styledSection({
16055
+ children: sectionContainer([
16056
+ el(
16057
+ "div",
16058
+ { className: "contact-newsletter-grid" },
16059
+ [
16060
+ el(
16061
+ "div",
16062
+ { className: "contact-newsletter-column contact-newsletter-contact" },
16063
+ [
16064
+ el(
16065
+ "div",
16066
+ { className: "contact-newsletter-copy" },
16067
+ [
16068
+ text(
16069
+ {
16070
+ as: "h2",
16071
+ className: "form-copy-title"
16072
+ },
16073
+ when("contactTitle"),
16074
+ bind("contactTitle")
16075
+ ),
16076
+ richText(
16077
+ {
16078
+ className: "form-copy-intro rb-prose rb-max-w-none"
16079
+ },
16080
+ when("contactIntro"),
16081
+ bind("contactIntro")
16082
+ )
16083
+ ]
16084
+ ),
16085
+ el(
16086
+ "form",
16087
+ withApiBindings({
16088
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } },
16089
+ submitLabel: { $bind: { from: "contactSubmitLabel" } },
16090
+ successMessage: { $bind: { from: "contactSuccessMessage" } }
16091
+ }),
16092
+ [],
16093
+ bind("data.form")
16094
+ )
16095
+ ]
16096
+ ),
16097
+ el(
16098
+ "div",
16099
+ { className: "contact-newsletter-column contact-newsletter-info contact-newsletter-newsletter" },
16100
+ [
16101
+ el(
16102
+ "div",
16103
+ { className: "contact-newsletter-copy" },
16104
+ [
16105
+ text(
16106
+ {
16107
+ as: "h2",
16108
+ className: "newsletter-copy-title"
16109
+ },
16110
+ when("newsletterTitle"),
16111
+ bind("newsletterTitle")
16112
+ ),
16113
+ richText(
16114
+ {
16115
+ className: "newsletter-copy-subtitle rb-prose rb-max-w-none"
16116
+ },
16117
+ when("newsletterSubtitle"),
16118
+ bind("newsletterSubtitle")
16119
+ )
16120
+ ]
16121
+ ),
16122
+ el(
16123
+ "newsletter-form",
16124
+ withApiBindings({
16125
+ listId: { $bind: { from: "listId" } },
16126
+ preset: { $bind: { from: "preset" } },
16127
+ includePhone: { $bind: { from: "includePhone" } },
16128
+ buttonLabel: { $bind: { from: "newsletterButtonLabel" } },
16129
+ successMessage: { $bind: { from: "newsletterSuccessMessage" } },
16130
+ privacyNote: { $bind: { from: "newsletterPrivacyNote" } },
16131
+ tags: { $bind: { from: "newsletterTags" } },
16132
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } }
16133
+ }),
16134
+ []
16135
+ )
16136
+ ]
16137
+ )
16138
+ ]
16139
+ )
16140
+ ], {
16141
+ className: "contact-newsletter-container"
16142
+ }),
16143
+ baseClass: "",
16144
+ spacing: "medium",
16145
+ background: "surface"
16146
+ });
16147
+ var contactNewsletterManifest = createBlockManifest({
16148
+ id: "block.contact-newsletter",
16149
+ title: "Contact + Newsletter",
16150
+ titleSource: "contactTitle",
16151
+ description: "Two-column newsletter signup and contact form section.",
16152
+ category: "interactive",
16153
+ layout: contactNewsletterLayout,
16154
+ defaultVariant: "default",
16155
+ variants: {
16156
+ default: contactNewsletterLayout
16157
+ },
16158
+ variantOptions: {
16159
+ default: {
16160
+ label: "Two column",
16161
+ description: "Newsletter and contact form side by side.",
16162
+ icon: "Columns2"
16163
+ }
16164
+ },
16165
+ additionalFields: [
16166
+ {
16167
+ id: "newsletterTitle",
16168
+ type: "text",
16169
+ label: "Newsletter title",
16170
+ defaultValue: "Stay connected"
16171
+ },
16172
+ {
16173
+ id: "newsletterSubtitle",
16174
+ type: "richText",
16175
+ label: "Newsletter intro"
16176
+ },
16177
+ {
16178
+ id: "listId",
16179
+ type: "reference",
16180
+ label: "Newsletter list",
16181
+ description: "Select the list new subscribers should be added to.",
16182
+ required: true,
16183
+ referenceKind: "newsletterList",
16184
+ allowManualEntry: false,
16185
+ ui: { intent: "behavior" }
16186
+ },
16187
+ {
16188
+ id: "preset",
16189
+ type: "select",
16190
+ label: "Newsletter fields",
16191
+ defaultValue: "emailOnly",
16192
+ ui: { intent: "display" },
16193
+ options: [
16194
+ { value: "emailOnly", label: "Email only" },
16195
+ { value: "emailName", label: "Email + Name" },
16196
+ { value: "emailFirstLast", label: "Email + First/Last Name" },
16197
+ { value: "emailNameCompany", label: "Email + Name + Company (B2B)" }
16198
+ ]
16199
+ },
16200
+ {
16201
+ id: "includePhone",
16202
+ type: "boolean",
16203
+ label: "Include phone field",
16204
+ defaultValue: false,
16205
+ ui: { intent: "display" }
16206
+ },
16207
+ {
16208
+ id: "newsletterButtonLabel",
16209
+ type: "text",
16210
+ label: "Newsletter button label",
16211
+ defaultValue: "Subscribe",
16212
+ ui: { intent: "display" }
16213
+ },
16214
+ {
16215
+ id: "newsletterSuccessMessage",
16216
+ type: "text",
16217
+ label: "Newsletter success message",
16218
+ defaultValue: "Thanks for subscribing!",
16219
+ ui: { intent: "behavior" }
16220
+ },
16221
+ {
16222
+ id: "newsletterPrivacyNote",
16223
+ type: "text",
16224
+ label: "Privacy note",
16225
+ ui: { intent: "display" }
16226
+ },
16227
+ {
16228
+ id: "newsletterTags",
16229
+ type: "text",
16230
+ label: "Newsletter tags",
16231
+ description: "Optional tags to apply on subscribe, separated by comma or semicolon.",
16232
+ ui: { intent: "behavior" }
16233
+ },
16234
+ {
16235
+ id: "contactTitle",
16236
+ type: "text",
16237
+ label: "Contact title",
16238
+ defaultValue: "Get in touch"
16239
+ },
16240
+ {
16241
+ id: "contactIntro",
16242
+ type: "richText",
16243
+ label: "Contact intro"
16244
+ },
16245
+ {
16246
+ id: "formSlug",
16247
+ type: "reference",
16248
+ label: "Contact form",
16249
+ description: "Pick a saved form to render.",
16250
+ required: true,
16251
+ referenceKind: "form",
16252
+ allowManualEntry: false,
16253
+ ui: { intent: "behavior" }
16254
+ },
16255
+ {
16256
+ id: "contactSubmitLabel",
16257
+ type: "text",
16258
+ label: "Contact button label",
16259
+ defaultValue: "Send message",
16260
+ ui: { intent: "display" }
16261
+ },
16262
+ {
16263
+ id: "contactSuccessMessage",
16264
+ type: "text",
16265
+ label: "Contact success message",
16266
+ defaultValue: "Thanks - we received your message.",
16267
+ ui: { intent: "behavior" }
15434
16268
  }
16269
+ ],
16270
+ styleTokens: {
16271
+ background: "surface",
16272
+ typography: "body",
16273
+ spacing: "md"
15435
16274
  },
15436
- styleTokens: { background: "surface", typography: "body", spacing: "md" },
15437
- behaviours: { supportsThemeSwitching: true, inlineEditing: false, animation: false, paletteHidden: false },
15438
- category: "interactive",
15439
- tags: ["form", "contact", "input", "submit", "fields", "signup", "lead-capture"],
15440
- icon: "FormInput"
15441
- });
15442
- var formDataSchema = z30.object({
15443
- id: z30.string(),
15444
- siteId: z30.string(),
15445
- userId: z30.string(),
15446
- name: z30.string(),
15447
- slug: z30.string(),
15448
- schemaJson: z30.any(),
15449
- settingsJson: z30.any().optional(),
15450
- createdAt: z30.string(),
15451
- updatedAt: z30.string()
16275
+ behaviours: {
16276
+ supportsThemeSwitching: true,
16277
+ inlineEditing: true,
16278
+ animation: false,
16279
+ paletteHidden: false
16280
+ },
16281
+ tags: [
16282
+ "contact",
16283
+ "newsletter",
16284
+ "signup",
16285
+ "email",
16286
+ "form",
16287
+ "lead-capture"
16288
+ ],
16289
+ icon: "MailPlus"
15452
16290
  });
15453
- var formBlockDefinition = {
15454
- manifest: formManifest,
16291
+ var contactNewsletterBlockDefinition = {
16292
+ manifest: contactNewsletterManifest,
15455
16293
  dataSchemas: { form: formDataSchema.optional() },
15456
- dataLoaders,
15457
- runtime: formBlockRuntime
16294
+ dataLoaders: {
16295
+ form: {
16296
+ endpoint: "getPublicFormById",
16297
+ params: {
16298
+ formSlug: { $bind: { from: "formSlug" } }
16299
+ },
16300
+ mode: "server"
16301
+ }
16302
+ }
15458
16303
  };
15459
16304
 
15460
16305
  // ../blocks/src/system/blocks/faq.ts
@@ -16000,6 +16845,21 @@ var siteHeaderManifest = createBlockManifest({
16000
16845
  id: "block.site-header",
16001
16846
  title: "Site Header",
16002
16847
  category: "layout",
16848
+ additionalFields: [
16849
+ {
16850
+ id: "mode",
16851
+ type: "select",
16852
+ label: "Header display",
16853
+ required: false,
16854
+ multiple: false,
16855
+ defaultValue: "default",
16856
+ options: [
16857
+ { value: "default", label: "Show header" },
16858
+ { value: "hidden", label: "Hide header" }
16859
+ ],
16860
+ ui: { intent: "display" }
16861
+ }
16862
+ ],
16003
16863
  // Skip section styles - this block uses theme-based styling
16004
16864
  skipSectionStyles: true,
16005
16865
  // Block manages its own wrapper - enables sticky positioning
@@ -17402,6 +18262,9 @@ var mediaTextManifest = createBlockManifest({
17402
18262
  category: "layout",
17403
18263
  includeContainerStyles: true,
17404
18264
  titleSource: "title",
18265
+ previewCustomize: {
18266
+ quickFieldPriority: ["imagePosition", "ratio", "imageShape", "titleAlignment", "aspectRatio"]
18267
+ },
17405
18268
  additionalFields: [
17406
18269
  {
17407
18270
  id: "images",
@@ -17440,7 +18303,7 @@ var mediaTextManifest = createBlockManifest({
17440
18303
  {
17441
18304
  id: "titleAlignment",
17442
18305
  type: "select",
17443
- label: "Title alignment",
18306
+ label: "Content alignment",
17444
18307
  required: false,
17445
18308
  defaultValue: "left",
17446
18309
  multiple: false,
@@ -17498,7 +18361,18 @@ var mediaTextManifest = createBlockManifest({
17498
18361
  transition: "slide"
17499
18362
  },
17500
18363
  ui: { intent: "behavior" }
17501
- }),
18364
+ }).map((field) => ({
18365
+ ...field,
18366
+ ui: {
18367
+ ...field.ui ?? {},
18368
+ visibleWhen: field.id === "carouselAutoplayDelay" ? {
18369
+ allOf: [
18370
+ { field: "images", minItems: 2 },
18371
+ { field: "carouselAutoplay", equals: true }
18372
+ ]
18373
+ } : { field: "images", minItems: 2 }
18374
+ }
18375
+ })),
17502
18376
  createAspectRatioField({
17503
18377
  id: "aspectRatio",
17504
18378
  label: "Media aspect ratio",
@@ -17506,6 +18380,12 @@ var mediaTextManifest = createBlockManifest({
17506
18380
  defaultValue: "auto",
17507
18381
  visibleWhen: { field: "images", notEquals: null }
17508
18382
  }),
18383
+ createImageShapeField({
18384
+ id: "imageShape",
18385
+ label: "Media shape",
18386
+ defaultValue: "default",
18387
+ visibleWhen: { field: "images", notEquals: null }
18388
+ }),
17509
18389
  {
17510
18390
  id: "text",
17511
18391
  type: "richText",
@@ -17539,6 +18419,30 @@ var mediaTextManifest = createBlockManifest({
17539
18419
  ...options?.not ? { not: true } : {}
17540
18420
  }
17541
18421
  });
18422
+ const bodyClassNameFromAlignment = {
18423
+ $bind: {
18424
+ from: "content.titleAlignment",
18425
+ transforms: [
18426
+ {
18427
+ id: "ui.bodyClassFromAlignment",
18428
+ options: { base: "rb-prose rb-max-w-none" }
18429
+ }
18430
+ ],
18431
+ fallback: "rb-prose rb-max-w-none"
18432
+ }
18433
+ };
18434
+ const titleClassNameFromAlignment = {
18435
+ $bind: {
18436
+ from: "content.titleAlignment",
18437
+ transforms: [
18438
+ {
18439
+ id: "ui.headingClassFromAlignment",
18440
+ options: { base: "" }
18441
+ }
18442
+ ],
18443
+ fallback: ""
18444
+ }
18445
+ };
17542
18446
  const defaultTextColumn = el("div", {}, [
17543
18447
  styledCard(
17544
18448
  [
@@ -17563,8 +18467,55 @@ var mediaTextManifest = createBlockManifest({
17563
18467
  bind("content.text")
17564
18468
  )
17565
18469
  ]);
18470
+ const bioTextColumn = el(
18471
+ "div",
18472
+ { className: "rb-flex rb-h-full rb-w-full rb-max-w-prose rb-flex-col rb-justify-center rb-gap-5" },
18473
+ [
18474
+ text(
18475
+ {
18476
+ as: "h2",
18477
+ className: titleClassNameFromAlignment
18478
+ },
18479
+ when("content.title"),
18480
+ bind("content.title")
18481
+ ),
18482
+ styledCard(
18483
+ [
18484
+ richText(
18485
+ {
18486
+ className: bodyClassNameFromAlignment
18487
+ },
18488
+ bind("content.text")
18489
+ )
18490
+ ],
18491
+ {
18492
+ stylesFrom: "content._textCardStyles",
18493
+ backgroundFrom: "content._textCardStyles.background"
18494
+ },
18495
+ when("content.wrapTextInCard")
18496
+ ),
18497
+ richText(
18498
+ {
18499
+ className: bodyClassNameFromAlignment
18500
+ },
18501
+ when("content.wrapTextInCard", { not: true }),
18502
+ bind("content.text")
18503
+ )
18504
+ ]
18505
+ );
17566
18506
  const defaultImageCommonProps = {
17567
- className: "rb-w-full rb-h-auto rb-object-cover",
18507
+ className: {
18508
+ $bind: {
18509
+ from: "content.imageShape",
18510
+ transforms: [
18511
+ {
18512
+ id: "ui.imageShapeClassName",
18513
+ options: { baseClass: "rb-w-full rb-h-auto rb-object-cover" }
18514
+ }
18515
+ ],
18516
+ fallback: "rb-w-full rb-h-auto rb-object-cover"
18517
+ }
18518
+ },
17568
18519
  style: {
17569
18520
  aspectRatio: { $bind: { from: "content.aspectRatio" } }
17570
18521
  }
@@ -17605,6 +18556,27 @@ var mediaTextManifest = createBlockManifest({
17605
18556
  ],
17606
18557
  whenImagesLength(0, { not: true })
17607
18558
  );
18559
+ const bioImagesLayout = el(
18560
+ "div",
18561
+ {},
18562
+ [
18563
+ responsiveTwoColumn({
18564
+ image: el("div", {}, [
18565
+ el("div", {}, [defaultSingleImage], whenImagesLength(1)),
18566
+ el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))
18567
+ ]),
18568
+ text: bioTextColumn,
18569
+ ratioFrom: "content.ratio",
18570
+ imagePositionFrom: "content.imagePosition",
18571
+ containerClassName: "rb-flex rb-flex-col rb-md-flex-row rb-md-items-center",
18572
+ gapFrom: "content.gap",
18573
+ gapFallback: "comfortable",
18574
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
18575
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-stretch"
18576
+ })
18577
+ ],
18578
+ whenImagesLength(0, { not: true })
18579
+ );
17608
18580
  const defaultTextOnlyLayout = el(
17609
18581
  "div",
17610
18582
  {},
@@ -17634,7 +18606,45 @@ var mediaTextManifest = createBlockManifest({
17634
18606
  ],
17635
18607
  whenImagesLength(0)
17636
18608
  );
18609
+ const bioTextOnlyLayout = el(
18610
+ "div",
18611
+ { className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5" },
18612
+ [
18613
+ text(
18614
+ {
18615
+ as: "h2",
18616
+ className: titleClassNameFromAlignment
18617
+ },
18618
+ when("content.title"),
18619
+ bind("content.title")
18620
+ ),
18621
+ styledCard(
18622
+ [
18623
+ richText(
18624
+ {
18625
+ className: bodyClassNameFromAlignment
18626
+ },
18627
+ bind("content.text")
18628
+ )
18629
+ ],
18630
+ {
18631
+ stylesFrom: "content._textCardStyles",
18632
+ backgroundFrom: "content._textCardStyles.background"
18633
+ },
18634
+ when("content.wrapTextInCard")
18635
+ ),
18636
+ richText(
18637
+ {
18638
+ className: bodyClassNameFromAlignment
18639
+ },
18640
+ when("content.wrapTextInCard", { not: true }),
18641
+ bind("content.text")
18642
+ )
18643
+ ],
18644
+ whenImagesLength(0)
18645
+ );
17637
18646
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
18647
+ const bioInner = el("div", {}, [bioImagesLayout, bioTextOnlyLayout]);
17638
18648
  const defaultLayout2 = styledSection({
17639
18649
  children: styledContainer({
17640
18650
  rootType: "stack",
@@ -17643,18 +18653,7 @@ var mediaTextManifest = createBlockManifest({
17643
18653
  text(
17644
18654
  {
17645
18655
  as: "h2",
17646
- className: {
17647
- $bind: {
17648
- from: "content.titleAlignment",
17649
- transforms: [
17650
- {
17651
- id: "ui.headingClassFromAlignment",
17652
- options: { base: "" }
17653
- }
17654
- ],
17655
- fallback: ""
17656
- }
17657
- }
18656
+ className: titleClassNameFromAlignment
17658
18657
  },
17659
18658
  when("content.title"),
17660
18659
  bind("content.title")
@@ -17666,14 +18665,28 @@ var mediaTextManifest = createBlockManifest({
17666
18665
  baseClass: "",
17667
18666
  spacing: "medium"
17668
18667
  });
18668
+ const bioLayout = styledSection({
18669
+ children: styledContainer({
18670
+ rootType: "stack",
18671
+ rootProps: { gap: "lg" },
18672
+ children: [bioInner]
18673
+ }),
18674
+ baseClass: "",
18675
+ spacing: "medium"
18676
+ });
17669
18677
  return {
17670
18678
  layout: defaultLayout2,
17671
18679
  variants: {
17672
- default: defaultLayout2
18680
+ default: defaultLayout2,
18681
+ bio: bioLayout
17673
18682
  },
17674
18683
  defaultVariant: "default",
17675
18684
  variantOptions: {
17676
- default: { label: "Default" }
18685
+ default: { label: "Default" },
18686
+ bio: {
18687
+ label: "Bio",
18688
+ description: "Vertically centered title and copy beside media."
18689
+ }
17677
18690
  }
17678
18691
  };
17679
18692
  })(),
@@ -18379,6 +19392,126 @@ var occurrenceContextSchema = z36.object({
18379
19392
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
18380
19393
  import { z as z38 } from "zod";
18381
19394
 
19395
+ // ../blocks/src/system/runtime/nodes/events/shared/pricing.ts
19396
+ var DEFAULT_EVENT_CURRENCY = "USD";
19397
+ function resolveRuntimeEventPricing(event) {
19398
+ if (isPublicEventPricing(event.pricing)) {
19399
+ return event.pricing;
19400
+ }
19401
+ const legacy = event;
19402
+ const currency = readCurrency(legacy.currency);
19403
+ if (event.requiresRegistration === false) {
19404
+ return {
19405
+ kind: "drop_in",
19406
+ currency,
19407
+ display: { kind: "free", currency }
19408
+ };
19409
+ }
19410
+ if (legacy.pricingMode === "ticket_types") {
19411
+ const ticketTypes = Array.isArray(legacy.ticketTypes) ? legacy.ticketTypes.filter(isPublicEventTicketType) : [];
19412
+ return {
19413
+ kind: "ticket_types",
19414
+ currency,
19415
+ ticketTypes,
19416
+ display: readTicketTypePriceDisplay(legacy.priceDisplay, currency)
19417
+ };
19418
+ }
19419
+ const amount = typeof legacy.price === "number" ? legacy.price : 0;
19420
+ if (legacy.pricingType === "paid" && amount > 0) {
19421
+ return {
19422
+ kind: "single_paid",
19423
+ amount,
19424
+ currency,
19425
+ display: { kind: "exact", amount, currency }
19426
+ };
19427
+ }
19428
+ return {
19429
+ kind: "free_registration",
19430
+ currency,
19431
+ display: { kind: "free", currency }
19432
+ };
19433
+ }
19434
+ function readCurrency(value) {
19435
+ return typeof value === "string" && value.trim().length > 0 ? value : DEFAULT_EVENT_CURRENCY;
19436
+ }
19437
+ function isRecord2(value) {
19438
+ return typeof value === "object" && value !== null && !Array.isArray(value);
19439
+ }
19440
+ function isPublicEventPricing(value) {
19441
+ if (!isRecord2(value) || typeof value.kind !== "string") return false;
19442
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course";
19443
+ }
19444
+ function isPublicEventTicketType(value) {
19445
+ return isRecord2(value) && typeof value.id === "string";
19446
+ }
19447
+ function readTicketTypePriceDisplay(value, currency) {
19448
+ const display = readLegacyPriceDisplay(value, currency);
19449
+ return display.kind === "course" ? { kind: "unavailable", currency } : display;
19450
+ }
19451
+ function readLegacyPriceDisplay(value, currency) {
19452
+ if (!isRecord2(value) || typeof value.kind !== "string") {
19453
+ return { kind: "unavailable", currency };
19454
+ }
19455
+ const displayCurrency = readCurrency(value.currency);
19456
+ switch (value.kind) {
19457
+ case "free":
19458
+ return { kind: "free", currency: displayCurrency };
19459
+ case "exact":
19460
+ return readAmount(value.amount) !== null ? {
19461
+ kind: "exact",
19462
+ amount: readAmount(value.amount) ?? 0,
19463
+ currency: displayCurrency
19464
+ } : { kind: "unavailable", currency };
19465
+ case "from":
19466
+ return readAmount(value.amount) !== null ? {
19467
+ kind: "from",
19468
+ amount: readAmount(value.amount) ?? 0,
19469
+ currency: displayCurrency
19470
+ } : { kind: "unavailable", currency };
19471
+ case "mixed":
19472
+ return readAmount(value.paidFromAmount) !== null ? {
19473
+ kind: "mixed",
19474
+ paidFromAmount: readAmount(value.paidFromAmount) ?? 0,
19475
+ currency: displayCurrency
19476
+ } : { kind: "unavailable", currency };
19477
+ case "unavailable":
19478
+ return { kind: "unavailable", currency: displayCurrency };
19479
+ case "course":
19480
+ return isRecord2(value.display) ? {
19481
+ kind: "course",
19482
+ display: readCoursePriceDisplay(value.display, displayCurrency)
19483
+ } : {
19484
+ kind: "course",
19485
+ display: { kind: "unavailable", currency: displayCurrency }
19486
+ };
19487
+ default:
19488
+ return { kind: "unavailable", currency };
19489
+ }
19490
+ }
19491
+ function readCoursePriceDisplay(value, currency) {
19492
+ switch (value.kind) {
19493
+ case "free":
19494
+ return { kind: "free", currency: readCurrency(value.currency) };
19495
+ case "exact":
19496
+ return readAmount(value.amount) !== null ? {
19497
+ kind: "exact",
19498
+ amount: readAmount(value.amount) ?? 0,
19499
+ currency: readCurrency(value.currency)
19500
+ } : { kind: "unavailable", currency };
19501
+ case "from":
19502
+ return readAmount(value.amount) !== null ? {
19503
+ kind: "from",
19504
+ amount: readAmount(value.amount) ?? 0,
19505
+ currency: readCurrency(value.currency)
19506
+ } : { kind: "unavailable", currency };
19507
+ default:
19508
+ return { kind: "unavailable", currency };
19509
+ }
19510
+ }
19511
+ function readAmount(value) {
19512
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
19513
+ }
19514
+
18382
19515
  // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
18383
19516
  import { z as z37 } from "zod";
18384
19517
 
@@ -18409,11 +19542,21 @@ var filterAutoShowSchema = z37.enum(["auto", "always", "never"]);
18409
19542
  var calendarTabViewsSchema = z37.enum(["both", "month", "week"]);
18410
19543
 
18411
19544
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
19545
+ var EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = ["Date", "Tickets", "Details"];
19546
+ var [
19547
+ eventRegistrationGenericDateStepLabel,
19548
+ eventRegistrationGenericTicketsStepLabel,
19549
+ eventRegistrationGenericDetailsStepLabel
19550
+ ] = EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS;
18412
19551
  var contentEntrySchema = z38.object({
18413
19552
  id: z38.string(),
18414
19553
  slug: z38.string(),
18415
19554
  contentTypeSlug: z38.string()
18416
19555
  });
19556
+ var eventRegistrationPublicEventSchema = z38.preprocess(
19557
+ normalizeEventRegistrationEventInput,
19558
+ publicEventSchema
19559
+ );
18417
19560
  var eventRegistrationSourceSchema = z38.object({
18418
19561
  siteId: z38.string().optional(),
18419
19562
  apiBaseUrl: z38.string().optional(),
@@ -18421,7 +19564,7 @@ var eventRegistrationSourceSchema = z38.object({
18421
19564
  previewToken: z38.string().nullable().optional(),
18422
19565
  occurrenceContext: occurrenceContextSchema.optional(),
18423
19566
  contentEntry: contentEntrySchema.nullable().optional(),
18424
- events: z38.array(publicEventSchema).nullable().optional(),
19567
+ events: z38.array(eventRegistrationPublicEventSchema).nullable().optional(),
18425
19568
  className: z38.string().nullable().optional(),
18426
19569
  buttonText: z38.string().nullable().optional(),
18427
19570
  maxTickets: z38.string().nullable().optional(),
@@ -18436,14 +19579,21 @@ var eventRegistrationSourceSchema = z38.object({
18436
19579
  });
18437
19580
  var eventRegistrationDisplaySchema = z38.object({
18438
19581
  kind: z38.literal("event-registration"),
18439
- state: z38.literal("shell"),
19582
+ state: z38.literal("generic-shell"),
18440
19583
  className: z38.string().nullable(),
19584
+ titleText: z38.string(),
19585
+ bodyText: z38.string(),
19586
+ stepLabels: z38.tuple([
19587
+ z38.literal(eventRegistrationGenericDateStepLabel),
19588
+ z38.literal(eventRegistrationGenericTicketsStepLabel),
19589
+ z38.literal(eventRegistrationGenericDetailsStepLabel)
19590
+ ]),
18441
19591
  summaryButtonText: z38.string()
18442
19592
  });
18443
19593
  var eventRegistrationHydrationSchema = z38.object({
18444
19594
  occurrenceContext: occurrenceContextSchema.optional(),
18445
19595
  contentEntry: contentEntrySchema.nullable().optional(),
18446
- events: z38.array(publicEventSchema).nullable().optional(),
19596
+ events: z38.array(eventRegistrationPublicEventSchema).nullable().optional(),
18447
19597
  maxTickets: z38.string().optional(),
18448
19598
  showVenue: z38.boolean().optional(),
18449
19599
  showCapacity: z38.boolean().optional(),
@@ -18474,8 +19624,11 @@ var eventRegistrationIslandMetaKeys = defineInteractiveIslandMetaKeys(
18474
19624
  function buildEventRegistrationDisplay(source) {
18475
19625
  return {
18476
19626
  kind: "event-registration",
18477
- state: "shell",
19627
+ state: "generic-shell",
18478
19628
  className: source.className ?? null,
19629
+ titleText: "Event registration",
19630
+ bodyText: "Preparing dates, tickets, and booking details.",
19631
+ stepLabels: EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS,
18479
19632
  summaryButtonText: source.buttonText?.trim() || "Register"
18480
19633
  };
18481
19634
  }
@@ -18502,6 +19655,18 @@ var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
18502
19655
  }
18503
19656
  })
18504
19657
  });
19658
+ function normalizeEventRegistrationEventInput(value) {
19659
+ if (!isRecord3(value)) {
19660
+ return value;
19661
+ }
19662
+ return {
19663
+ ...value,
19664
+ pricing: resolveRuntimeEventPricing(value)
19665
+ };
19666
+ }
19667
+ function isRecord3(value) {
19668
+ return typeof value === "object" && value !== null && !Array.isArray(value);
19669
+ }
18505
19670
  var eventRegistrationInteractiveIslandPropsCodec = createInteractiveIslandCodec({
18506
19671
  runtime: eventRegistrationBlockRuntime,
18507
19672
  mode: "event-registration",
@@ -20924,7 +22089,7 @@ function inferLegacyOfferingsPreviewGroupOrder(overrides) {
20924
22089
  return keys.length >= 2 ? keys : [];
20925
22090
  }
20926
22091
  function normalizeOfferingsPreviewContentForWrite(value) {
20927
- if (!isRecord2(value)) return null;
22092
+ if (!isRecord4(value)) return null;
20928
22093
  const groupOrderValue = value.groupOrder;
20929
22094
  if (Array.isArray(groupOrderValue)) {
20930
22095
  const normalized = normalizeOfferingsPreviewGroupOrder(groupOrderValue);
@@ -20937,7 +22102,7 @@ function normalizeOfferingsPreviewContentForWrite(value) {
20937
22102
  return { ...value, groupOrder: [] };
20938
22103
  }
20939
22104
  const legacyOrder = inferLegacyOfferingsPreviewGroupOrder(
20940
- Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord2) : []
22105
+ Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord4) : []
20941
22106
  );
20942
22107
  return legacyOrder.length > 0 ? { ...value, groupOrder: legacyOrder } : value;
20943
22108
  }
@@ -20951,7 +22116,7 @@ function uniqueOfferingsPreviewSourceKeys(values) {
20951
22116
  }
20952
22117
  return keys;
20953
22118
  }
20954
- function isRecord2(value) {
22119
+ function isRecord4(value) {
20955
22120
  return typeof value === "object" && value !== null && !Array.isArray(value);
20956
22121
  }
20957
22122
 
@@ -21318,7 +22483,7 @@ function isOfferingsPreviewItemLimit(value) {
21318
22483
  return value === "1" || value === "2" || value === "3" || value === "4" || value === "5" || value === "6" || value === null;
21319
22484
  }
21320
22485
  function normalizeOfferingsPreviewGroupOverride(value) {
21321
- if (!isRecord3(value)) return [];
22486
+ if (!isRecord5(value)) return [];
21322
22487
  const override = {};
21323
22488
  if (isOfferingsPreviewSourceKey(value.sourceKey) || value.sourceKey === null) {
21324
22489
  override.sourceKey = value.sourceKey;
@@ -21350,12 +22515,12 @@ function isButtonVariant(value) {
21350
22515
  return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
21351
22516
  }
21352
22517
  function normalizeCardStylesContent(value) {
21353
- return isRecord3(value) || value === null ? value : void 0;
22518
+ return isRecord5(value) || value === null ? value : void 0;
21354
22519
  }
21355
22520
  function normalizeSectionStylesContent(value) {
21356
- return isRecord3(value) || value === null ? value : void 0;
22521
+ return isRecord5(value) || value === null ? value : void 0;
21357
22522
  }
21358
- function isRecord3(value) {
22523
+ function isRecord5(value) {
21359
22524
  return typeof value === "object" && value !== null && !Array.isArray(value);
21360
22525
  }
21361
22526
 
@@ -25315,11 +26480,13 @@ var heroImageSurfaceMotions = [
25315
26480
  ];
25316
26481
  var standardEyebrowTreatments = [
25317
26482
  "plain",
26483
+ "accent",
25318
26484
  "pill",
25319
26485
  "accent-pill"
25320
26486
  ];
25321
26487
  var animatedEyebrowTreatments = [
25322
26488
  "plain",
26489
+ "accent",
25323
26490
  "pill",
25324
26491
  "accent-pill",
25325
26492
  "pill-bounce",
@@ -25620,6 +26787,17 @@ var systemBlockDefinitionsRaw = [
25620
26787
  layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
25621
26788
  ]
25622
26789
  })),
26790
+ withDesignCapability("block.contact-newsletter", contactNewsletterBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
26791
+ flow: conversionFlow,
26792
+ layoutProfiles: [
26793
+ layoutProfile({
26794
+ variantKey: "default",
26795
+ family: "split",
26796
+ weight: "featured",
26797
+ bias: "soft"
26798
+ })
26799
+ ]
26800
+ })),
25623
26801
  withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
25624
26802
  sectionSurfaces: "supported",
25625
26803
  contentFrames: ["plain", "panel"],
@@ -25711,6 +26889,12 @@ var systemBlockDefinitionsRaw = [
25711
26889
  family: "media-text",
25712
26890
  weight: "featured",
25713
26891
  bias: "soft"
26892
+ }),
26893
+ layoutProfile({
26894
+ variantKey: "bio",
26895
+ family: "media-text",
26896
+ weight: "featured",
26897
+ bias: "soft"
25714
26898
  })
25715
26899
  ]
25716
26900
  })),
@@ -29550,7 +30734,7 @@ function sanitizeExtractedContent(content) {
29550
30734
  }
29551
30735
  return result;
29552
30736
  }
29553
- function isRecord4(value) {
30737
+ function isRecord6(value) {
29554
30738
  return typeof value === "object" && value !== null && !Array.isArray(value);
29555
30739
  }
29556
30740
  function isBoxStylesField(fieldId) {
@@ -29659,7 +30843,7 @@ async function populateBuiltinBlock(sectionIndex, section2, blockInfo, ctx) {
29659
30843
  await ctx.debug.writeText(`pass2-builtin-${sectionIndex}-raw.txt`, rawText);
29660
30844
  await ctx.debug.writeJson(`pass2-builtin-${sectionIndex}-output.json`, result);
29661
30845
  const rawContent = result.content;
29662
- const sanitizedContent = isRecord4(rawContent) ? sanitizeExtractedContent(rawContent) : {};
30846
+ const sanitizedContent = isRecord6(rawContent) ? sanitizeExtractedContent(rawContent) : {};
29663
30847
  return {
29664
30848
  success: true,
29665
30849
  block: {