@riverbankcms/sdk 0.104.1 → 0.104.3

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 (120) hide show
  1. package/dist/{PreviewEditorSidebar-CmaPXdKu.mjs → PreviewEditorSidebar-CBMhU9p_.mjs} +3 -3
  2. package/dist/{PreviewEditorUI-C5xRTh2b.mjs → PreviewEditorUI-C5KEw4M8.mjs} +2 -2
  3. package/dist/{SdkPreviewModeRuntime-Eks51NcN.mjs → SdkPreviewModeRuntime-Iq12HjL7.mjs} +1142 -177
  4. package/dist/{SiteChromeCustomizeContext-Bt8zb3qu.mjs → SiteChromeCustomizeContext-Cx0NMdyv.mjs} +1640 -877
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +10 -0
  6. package/dist/_dts/blocks/src/primitives/layout/Grid.d.ts +12 -8
  7. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +3 -0
  8. package/dist/_dts/blocks/src/system/blocks/events/shared/layout.d.ts +11 -1
  9. package/dist/_dts/blocks/src/system/blocks/testimonials.d.ts +7 -1
  10. package/dist/_dts/blocks/src/system/constants/events.d.ts +1 -1
  11. package/dist/_dts/blocks/src/system/fragments/library/testimonialsCarousel.d.ts +12 -0
  12. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +2 -2
  13. package/dist/_dts/blocks/src/system/runtime/nodes/basic.d.ts +14 -0
  14. package/dist/_dts/blocks/src/system/runtime/nodes/buttonAffordance.d.ts +33 -0
  15. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/WeekBoardView.d.ts +28 -0
  16. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCapacity.d.ts +32 -0
  17. package/dist/_dts/blocks/src/system/runtime/nodes/shared/contract-schemas.d.ts +1 -0
  18. package/dist/_dts/blocks/src/system/runtime/nodes/svg.d.ts +77 -0
  19. package/dist/_dts/blocks/src/system/transforms/registry/_utils/surfaceForegroundStyles.d.ts +2 -0
  20. package/dist/_dts/blocks/src/system/transforms/registry/boxStyles.d.ts +3 -40
  21. package/dist/_dts/blocks/src/system/transforms/registry/formatting.d.ts +14 -0
  22. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +11 -0
  23. package/dist/_dts/core/src/branded.d.ts +5 -0
  24. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +18 -0
  25. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +2 -2
  26. package/dist/_dts/sdk/src/version.d.ts +1 -1
  27. package/dist/_dts/theme-core/src/ThemeScope.d.ts +1 -1
  28. package/dist/_dts/theme-core/src/buttons/affordanceIcons.d.ts +29 -0
  29. package/dist/_dts/theme-core/src/buttons/generateButtonCss.d.ts +6 -0
  30. package/dist/_dts/theme-core/src/buttons/index.d.ts +1 -0
  31. package/dist/_dts/theme-core/src/buttons/personalities/flat-ink.d.ts +20 -0
  32. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  33. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +4 -0
  34. package/dist/_dts/theme-core/src/buttons/types.d.ts +34 -0
  35. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  36. package/dist/_dts/theme-core/src/gradients/types.d.ts +27 -3
  37. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +51 -15
  38. package/dist/_dts/theme-core/src/palette/curated/brand-led.d.ts +13 -0
  39. package/dist/_dts/theme-core/src/palette/curated/index.d.ts +12 -0
  40. package/dist/_dts/theme-core/src/palette/historicalThemePalette.d.ts +44 -0
  41. package/dist/_dts/theme-core/src/palette/index.d.ts +1 -0
  42. package/dist/_dts/theme-core/src/palette/legacySelection.d.ts +13 -2
  43. package/dist/_dts/theme-core/src/palette/persistenceReadSource.d.ts +17 -2
  44. package/dist/_dts/theme-core/src/palette/themePaletteCompatibility.d.ts +3 -4
  45. package/dist/_dts/theme-core/src/runtime/themeCssVarNames.d.ts +1 -0
  46. package/dist/_dts/theme-core/src/schema.d.ts +108 -26
  47. package/dist/_dts/theme-core/src/site-styles/accessibleSurfaces.d.ts +2 -1
  48. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +50 -1
  49. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +2 -2
  50. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  51. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +56 -1
  52. package/dist/_dts/theme-core/src/site-styles/typographyPresets.d.ts +16 -1
  53. package/dist/_dts/theme-core/src/status/index.d.ts +0 -1
  54. package/dist/_dts/theme-core/src/surfaces/foregroundContract.d.ts +19 -0
  55. package/dist/_dts/theme-core/src/surfaces/foregroundRoles.d.ts +9 -0
  56. package/dist/_dts/theme-core/src/surfaces/index.d.ts +2 -0
  57. package/dist/_dts/ui/src/button.d.ts +1 -1
  58. package/dist/cli/index.mjs +1558 -468
  59. package/dist/client/{DiscountCodeDisclosure-Dit2aItR.mjs → DiscountCodeDisclosure-BXM73_E5.mjs} +1 -1
  60. package/dist/client/{EventCombined.client-BnREyCjf.mjs → EventCombined.client-DT5elP7j.mjs} +4 -4
  61. package/dist/client/{EventListing.client-0uHld51x.mjs → EventListing.client-pTYGfV9C.mjs} +2 -2
  62. package/dist/client/{LeafletStaticMap-DJcvSfmj.mjs → LeafletStaticMap-dQrhlUe3.mjs} +1 -1
  63. package/dist/client/{MagicLinkForm-EAsIktfw.mjs → MagicLinkForm-u6Dul4j5.mjs} +2 -2
  64. package/dist/client/{StepIndicator-CRR17tYI.mjs → StepIndicator-nWqineJ2.mjs} +2 -2
  65. package/dist/client/{accordion-B47HIuuH.mjs → accordion-CSJcTUyH.mjs} +1 -1
  66. package/dist/client/{bookingForm-I1E-8F9P.mjs → bookingForm-C73wOuVa.mjs} +6 -6
  67. package/dist/client/bookings.mjs +137 -1
  68. package/dist/client/{buttons-BbPn8OKA.mjs → buttons-DfYyqt8C.mjs} +138 -2
  69. package/dist/client/{carousel-OlM7SyBs.mjs → carousel-fMBb0JSc.mjs} +1 -1
  70. package/dist/client/{cart-BKpG5jz6.mjs → cart-BtaCwT3S.mjs} +3 -3
  71. package/dist/client/{checkout-Dmmr6qoU.mjs → checkout-DkTwZSnh.mjs} +3 -3
  72. package/dist/client/client.mjs +2327 -542
  73. package/dist/client/{colorStyles-DuW4Fjqd.mjs → colorStyles-Wyl6JujD.mjs} +45 -4
  74. package/dist/client/{courseRegistration-CflZiqGk.mjs → courseRegistration-DnLmapJu.mjs} +7 -7
  75. package/dist/client/{eventCalendar-BvoLWcp-.mjs → eventCalendar-BvLOc9KY.mjs} +165 -5
  76. package/dist/client/{eventCombined-DsrO8t_t.mjs → eventCombined-kShgJPQr.mjs} +2 -2
  77. package/dist/client/{eventDetails-C3hxgcJm.mjs → eventDetails-C5NTM0Vo.mjs} +3 -3
  78. package/dist/client/{eventListing-C-hb237X.mjs → eventListing-B82ZdKP6.mjs} +2 -2
  79. package/dist/client/{eventRegistration-B0gyzDGi.mjs → eventRegistration-qJVFqBWo.mjs} +7 -7
  80. package/dist/client/{form-C_RUi6oJ.mjs → form-BvAcKiuu.mjs} +2 -2
  81. package/dist/client/{headerSection-IKQiD2U0.mjs → headerSection-NvAiEHAg.mjs} +3 -3
  82. package/dist/client/hooks.mjs +1034 -356
  83. package/dist/client/{locationMap-8ZBrMzRJ.mjs → locationMap-D0j52xfI.mjs} +3 -3
  84. package/dist/client/{media-CZJKL7fi.mjs → media-BCW_g2cQ.mjs} +1 -1
  85. package/dist/client/{newsletterForm-CYk3ucwj.mjs → newsletterForm-B8_i93qH.mjs} +2 -2
  86. package/dist/client/{pricing-B5GmvfIH.mjs → pricing-DIYnyHOk.mjs} +1 -1
  87. package/dist/client/{productDetail-BjS2Dqzo.mjs → productDetail-w0eAHkuQ.mjs} +3 -3
  88. package/dist/client/{productList-BOHvC8My.mjs → productList-Vsguq5Xt.mjs} +3 -3
  89. package/dist/client/{propsDecoder-WS6UEJwZ.mjs → propsDecoder-CD2pJ1WB.mjs} +37 -2
  90. package/dist/client/rendering/client.mjs +1722 -760
  91. package/dist/client/rendering/islands.mjs +19 -19
  92. package/dist/client/rendering.mjs +2303 -518
  93. package/dist/client/{shop-CON03-wN.mjs → shop-Dgxs-Q8F.mjs} +6 -6
  94. package/dist/client/{shop-commerce-DlqrFgH8.mjs → shop-commerce-DJAhsTaT.mjs} +6 -6
  95. package/dist/client/{shop-commerce-store-l74-Kne6.mjs → shop-commerce-store-CfCXltXW.mjs} +1 -1
  96. package/dist/client/{shopShared-CQheEXSg.mjs → shopShared-CmDcPXUt.mjs} +2 -2
  97. package/dist/client/{useDiscountCodeUi-v6OluyWl.mjs → useDiscountCodeUi-CirrT2bM.mjs} +1 -1
  98. package/dist/client/{useEventFilters-BqSTcNOf.mjs → useEventFilters-CNZxlCcO.mjs} +5 -5
  99. package/dist/client/{usePolling-DMfADjIF.mjs → usePolling-Baks_iBI.mjs} +2 -2
  100. package/dist/preview-next/client/runtime.mjs +3 -3
  101. package/dist/{sdk-runtime-BUmJ0DaT.mjs → sdk-runtime-BfNiFeNJ.mjs} +1 -1
  102. package/dist/{separator-Dd-JYok7.mjs → separator-BhAR_Xmf.mjs} +1 -1
  103. package/dist/server/components.mjs +2293 -531
  104. package/dist/server/config-validation.mjs +1040 -357
  105. package/dist/server/config.mjs +1040 -357
  106. package/dist/server/data.mjs +1034 -356
  107. package/dist/server/index.mjs +1 -1
  108. package/dist/server/next.mjs +2296 -534
  109. package/dist/server/page-converter.mjs +1018 -324
  110. package/dist/server/prebuild.mjs +1 -1
  111. package/dist/server/rendering/server.mjs +2278 -521
  112. package/dist/server/rendering.mjs +2293 -531
  113. package/dist/server/routing.mjs +1092 -338
  114. package/dist/server/server.mjs +1016 -338
  115. package/dist/server/theme-bridge.mjs +1240 -77
  116. package/dist/server/theme.mjs +165 -5
  117. package/dist/styles/index.css +617 -34
  118. package/package.json +1 -1
  119. package/dist/_dts/blocks/src/system/transforms/registry/_utils/sectionForegroundStyles.d.ts +0 -2
  120. package/dist/_dts/theme-core/src/status/contextualColors.d.ts +0 -6
@@ -64,8 +64,12 @@
64
64
  text-transform: uppercase;
65
65
  }
66
66
 
67
- /* Eyebrow text - small uppercase labels for section introductions */
67
+ /* Eyebrow text - small uppercase labels for section introductions.
68
+ font-family resolves to the optional eyebrow/mono font role, falling back
69
+ to the body font when the theme sets none (so existing themes are
70
+ unchanged). */
68
71
  .rb-eyebrow {
72
+ font-family: var(--font-eyebrow, var(--font-body));
69
73
  font-size: 0.875rem;
70
74
  font-weight: 600;
71
75
  letter-spacing: 0.025em;
@@ -80,11 +84,11 @@
80
84
  width: fit-content;
81
85
  align-items: center;
82
86
  justify-content: center;
83
- border: 1px solid color-mix(in srgb, var(--section-text-color, rgb(var(--tb-text))) 46%, transparent);
87
+ border: 1px solid color-mix(in srgb, var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39))) 46%, transparent);
84
88
  border-radius: 9999px;
85
- background: color-mix(in srgb, var(--section-text-color, rgb(var(--tb-text))) 14%, transparent);
89
+ background: color-mix(in srgb, var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39))) 14%, transparent);
86
90
  padding: 0.5rem 1rem;
87
- color: var(--section-text-color, rgb(var(--tb-text)));
91
+ color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
88
92
  line-height: 1;
89
93
  }
90
94
  .rb-eyebrow-treatment-pill.rb-eyebrow-treatment-accent {
@@ -576,6 +580,50 @@
576
580
  }
577
581
  }
578
582
 
583
+ /*
584
+ * Responsive fractional grid tracks (rb-grid-tracks).
585
+ *
586
+ * Asymmetric AND responsive grid-template-columns, driven by inline custom
587
+ * properties the Grid primitive sets per breakpoint from string track
588
+ * templates:
589
+ * --rb-gtc-base / --rb-gtc-sm / --rb-gtc-md / --rb-gtc-lg / --rb-gtc-xl
590
+ * Each breakpoint falls back to the next smaller one, so only the breakpoints
591
+ * an author actually sets take effect (e.g. base '1fr' + lg '1fr 0.9fr'
592
+ * collapses to a single column below lg). Authored here (not per node) so the
593
+ * @media -> @container conversion (container responsive mode) applies too.
594
+ */
595
+ .rb-grid-tracks {
596
+ grid-template-columns: var(--rb-gtc-base, 1fr);
597
+ }
598
+ @media (min-width: 640px) {
599
+ @scope ([data-rb-responsive-mode="viewport"]) to (:scope [data-rb-responsive-mode]) {
600
+ .rb-grid-tracks {
601
+ grid-template-columns: var(--rb-gtc-sm, var(--rb-gtc-base, 1fr));
602
+ }
603
+ }
604
+ }
605
+ @media (min-width: 768px) {
606
+ @scope ([data-rb-responsive-mode="viewport"]) to (:scope [data-rb-responsive-mode]) {
607
+ .rb-grid-tracks {
608
+ grid-template-columns: var(--rb-gtc-md, var(--rb-gtc-sm, var(--rb-gtc-base, 1fr)));
609
+ }
610
+ }
611
+ }
612
+ @media (min-width: 1024px) {
613
+ @scope ([data-rb-responsive-mode="viewport"]) to (:scope [data-rb-responsive-mode]) {
614
+ .rb-grid-tracks {
615
+ grid-template-columns: var(--rb-gtc-lg, var(--rb-gtc-md, var(--rb-gtc-sm, var(--rb-gtc-base, 1fr))));
616
+ }
617
+ }
618
+ }
619
+ @media (min-width: 1280px) {
620
+ @scope ([data-rb-responsive-mode="viewport"]) to (:scope [data-rb-responsive-mode]) {
621
+ .rb-grid-tracks {
622
+ grid-template-columns: var(--rb-gtc-xl, var(--rb-gtc-lg, var(--rb-gtc-md, var(--rb-gtc-sm, var(--rb-gtc-base, 1fr)))));
623
+ }
624
+ }
625
+ }
626
+
579
627
  /* Alignment */
580
628
  .rb-items-start {
581
629
  align-items: flex-start;
@@ -1761,6 +1809,11 @@
1761
1809
  :where(.theme-scope) .rb-modal {
1762
1810
  width: min(var(--rb-modal-max-width, 560px), 100%);
1763
1811
  background: var(--rb-modal-bg, rgb(var(--tb-surface)));
1812
+ color: var(--rb-modal-text, rgb(var(--tb-text, 17 24 39)));
1813
+ --rb-surface-text-color: var(--rb-modal-text, rgb(var(--tb-text, 17 24 39)));
1814
+ --rb-surface-heading-color: var(--rb-modal-heading, var(--rb-modal-text, rgb(var(--tb-text, 17 24 39))));
1815
+ --rb-surface-link-color: var(--rb-modal-link, var(--rb-modal-text, rgb(var(--tb-text, 17 24 39))));
1816
+ --rb-surface-supporting-color: var(--rb-modal-supporting, var(--rb-modal-text, rgb(var(--tb-text, 17 24 39))));
1764
1817
  border: 1px solid var(--rb-modal-border, rgb(var(--tb-border)));
1765
1818
  border-radius: var(--rb-modal-radius, var(--radius-card));
1766
1819
  box-shadow: var(--rb-modal-shadow, var(--shadow-lg, var(--shadow-elev)));
@@ -1780,7 +1833,7 @@
1780
1833
  font-family: var(--font-heading);
1781
1834
  font-size: 1.0625rem;
1782
1835
  font-weight: 600;
1783
- color: rgb(var(--tb-text));
1836
+ color: var(--rb-surface-heading-color, var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39))));
1784
1837
  }
1785
1838
 
1786
1839
  :where(.theme-scope) .rb-modal__close {
@@ -1790,7 +1843,7 @@
1790
1843
  height: 2.25rem;
1791
1844
  padding: 0;
1792
1845
  line-height: 1;
1793
- color: rgb(var(--tb-mutedText));
1846
+ color: var(--rb-surface-supporting-color, var(--rb-surface-text-color, rgb(var(--tb-mutedText, 100 116 139))));
1794
1847
  cursor: pointer;
1795
1848
  display: grid;
1796
1849
  place-items: center;
@@ -1798,7 +1851,7 @@
1798
1851
  }
1799
1852
 
1800
1853
  :where(.theme-scope) .rb-modal__close:hover {
1801
- color: rgb(var(--tb-text));
1854
+ color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
1802
1855
  background: rgba(var(--tb-border), 0.2);
1803
1856
  }
1804
1857
 
@@ -1809,7 +1862,7 @@
1809
1862
 
1810
1863
  :where(.theme-scope) .rb-modal__body {
1811
1864
  padding: 0.875rem 1rem 1rem;
1812
- color: rgb(var(--tb-text));
1865
+ color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
1813
1866
  font-size: 0.9375rem;
1814
1867
  line-height: 1.45;
1815
1868
  }
@@ -1969,7 +2022,7 @@
1969
2022
  & h6 {
1970
2023
  font-family: var(--font-heading);
1971
2024
  /* Color is set by generateTypographyCss.ts with full cascade:
1972
- --section-heading-color -> --section-text-color -> --hc-hN -> --hc-heading -> inherit */
2025
+ --rb-surface-heading-color -> --rb-surface-text-color -> --hc-hN -> --hc-heading -> global text */
1973
2026
  font-weight: var(--font-weight-heading);
1974
2027
  text-transform: var(--tt-heading);
1975
2028
  font-variant-caps: var(--fv-heading);
@@ -2115,7 +2168,7 @@
2115
2168
 
2116
2169
  /* Neutral prose uses theme text color by default */
2117
2170
  :where(.theme-scope) .rb-prose-neutral {
2118
- color: var(--section-text-color, rgb(var(--tb-text)));
2171
+ color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
2119
2172
  }
2120
2173
 
2121
2174
  :where(.theme-scope) .rb-prose p,
@@ -2149,8 +2202,14 @@
2149
2202
 
2150
2203
  :where(.theme-scope) .rb-prose a {
2151
2204
  --rb-prose-effective-link-color: var(
2152
- --section-link-color,
2153
- var(--rb-prose-link-color, rgb(var(--tb-primary)))
2205
+ --rb-surface-link-color,
2206
+ var(
2207
+ --rb-surface-text-color,
2208
+ var(
2209
+ --rb-prose-link-color,
2210
+ rgb(var(--tb-primary, var(--tb-text, 17 24 39)))
2211
+ )
2212
+ )
2154
2213
  );
2155
2214
  color: var(--rb-prose-effective-link-color);
2156
2215
  text-decoration-line: var(--rb-prose-link-decoration-line, underline);
@@ -2161,14 +2220,11 @@
2161
2220
  );
2162
2221
  text-underline-offset: var(--rb-prose-link-underline-offset, 0.14em);
2163
2222
  text-decoration-color: var(
2164
- --section-link-decoration-color,
2165
- var(
2166
- --rb-prose-link-decoration-color,
2167
- color-mix(
2168
- in srgb,
2169
- var(--rb-prose-effective-link-color) 35%,
2170
- transparent
2171
- )
2223
+ --rb-prose-link-decoration-color,
2224
+ color-mix(
2225
+ in srgb,
2226
+ var(--rb-prose-effective-link-color) 35%,
2227
+ transparent
2172
2228
  )
2173
2229
  );
2174
2230
  transition:
@@ -2192,7 +2248,7 @@
2192
2248
 
2193
2249
  :where(.theme-scope) .rb-prose blockquote {
2194
2250
  /* Blockquotes use muted text color */
2195
- color: var(--section-supporting-color, rgb(var(--tb-mutedText)));
2251
+ color: var(--rb-surface-supporting-color, var(--rb-surface-text-color, rgb(var(--tb-mutedText, 100 116 139))));
2196
2252
  border-left-color: rgb(var(--tb-border));
2197
2253
  }
2198
2254
 
@@ -3216,6 +3272,10 @@
3216
3272
  :where(.theme-scope) .card-surface {
3217
3273
  background: rgb(var(--tb-surface));
3218
3274
  color: rgb(var(--tb-onSurface, var(--tb-text)));
3275
+ --rb-surface-text-color: rgb(var(--tb-onSurface, var(--tb-text)));
3276
+ --rb-surface-heading-color: rgb(var(--tb-onSurface, var(--tb-text)));
3277
+ --rb-surface-link-color: rgb(var(--tb-onSurface, var(--tb-text)));
3278
+ --rb-surface-supporting-color: rgb(var(--tb-onSurface, var(--tb-text)));
3219
3279
  border: 1px solid rgb(var(--tb-border));
3220
3280
  border-radius: var(--radius-card);
3221
3281
  box-shadow: var(--shadow-elev);
@@ -3353,6 +3413,10 @@
3353
3413
  padding: clamp(1rem, 2vw, 1.5rem);
3354
3414
  background: var(--rb-reg-surface-bg, rgb(var(--tb-surface, 248 250 252)));
3355
3415
  color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
3416
+ --rb-surface-text-color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
3417
+ --rb-surface-heading-color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
3418
+ --rb-surface-link-color: var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42))));
3419
+ --rb-surface-supporting-color: var(--rb-reg-on-surface-muted, var(--rb-reg-on-surface, rgb(var(--tb-onSurface, var(--tb-text, 15 23 42)))));
3356
3420
  transition: border-color var(--rb-block-transition, 150ms) ease;
3357
3421
  width: 100%;
3358
3422
  max-width: 800px;
@@ -6425,6 +6489,344 @@
6425
6489
  }
6426
6490
  }
6427
6491
 
6492
+ /* -----------------------------------------------------------------------------
6493
+ * Week Board View
6494
+ * Compact "class day-board": day columns side by side, one card per class,
6495
+ * three-state availability (available / filling / waitlist), and a footer CTA.
6496
+ * ----------------------------------------------------------------------------- */
6497
+
6498
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board {
6499
+ /* Status accent tokens — map the three availability states onto theme colours.
6500
+ * available -> secondary, filling -> accent, waitlist -> muted text. */
6501
+ --ec-status-available: rgb(var(--tb-secondary));
6502
+ --ec-status-filling: rgb(var(--tb-accent));
6503
+ --ec-status-waitlist: rgba(var(--tb-text), 0.4);
6504
+ --event-week-board-cols: 7;
6505
+
6506
+ border: 1px solid var(--ec-border);
6507
+ border-radius: var(--rb-block-radius);
6508
+ background-color: var(--ec-surface);
6509
+ color: var(--ec-text);
6510
+ overflow: hidden;
6511
+ box-shadow: 0 14px 34px -24px rgba(var(--tb-text), 0.35);
6512
+ }
6513
+
6514
+ /* Top bar: title + legend */
6515
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-top {
6516
+ display: flex;
6517
+ align-items: center;
6518
+ justify-content: space-between;
6519
+ gap: 1rem;
6520
+ flex-wrap: wrap;
6521
+ padding: 1.1rem 1.5rem;
6522
+ background-color: var(--ec-header-bg);
6523
+ border-bottom: 1px solid var(--ec-border-subtle);
6524
+ }
6525
+
6526
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-title {
6527
+ font-size: 0.8125rem;
6528
+ font-weight: 600;
6529
+ letter-spacing: 0.12em;
6530
+ text-transform: uppercase;
6531
+ color: rgb(var(--tb-primary));
6532
+ }
6533
+
6534
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-legend {
6535
+ display: flex;
6536
+ align-items: center;
6537
+ gap: 1.1rem;
6538
+ flex-wrap: wrap;
6539
+ font-size: 0.6875rem;
6540
+ letter-spacing: 0.03em;
6541
+ opacity: 0.75;
6542
+ }
6543
+
6544
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-legend-item {
6545
+ display: inline-flex;
6546
+ align-items: center;
6547
+ gap: 0.4rem;
6548
+ }
6549
+
6550
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-legend-dot {
6551
+ width: 0.55rem;
6552
+ height: 0.55rem;
6553
+ border-radius: 50%;
6554
+ display: inline-block;
6555
+ }
6556
+
6557
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-legend-dot[data-status="available"] {
6558
+ background-color: var(--ec-status-available);
6559
+ }
6560
+
6561
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-legend-dot[data-status="filling"] {
6562
+ background-color: var(--ec-status-filling);
6563
+ }
6564
+
6565
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-legend-dot[data-status="waitlist"] {
6566
+ background-color: var(--ec-status-waitlist);
6567
+ }
6568
+
6569
+ /* Day columns grid */
6570
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-grid {
6571
+ display: grid;
6572
+ grid-template-columns: repeat(var(--event-week-board-cols), minmax(0, 1fr));
6573
+ }
6574
+
6575
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-day {
6576
+ display: flex;
6577
+ flex-direction: column;
6578
+ min-height: 15rem;
6579
+ /* Tabular column rule. Driven by the theme border tokens so borderless site
6580
+ * styles (border.width: 'none' -> --rb-border-width: 0) render no grid at all,
6581
+ * while hairline/thin/thick themes get a crisp full-strength divider. */
6582
+ border-right: var(--rb-border-width, 1px) solid rgb(var(--tb-border));
6583
+ }
6584
+
6585
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-day:last-child {
6586
+ border-right: none;
6587
+ }
6588
+
6589
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-day-head {
6590
+ display: flex;
6591
+ align-items: baseline;
6592
+ gap: 0.4rem;
6593
+ padding: 0.9rem 0.9rem 0.65rem;
6594
+ /* Header-row underline — same border-token gating as the column rules. */
6595
+ border-bottom: var(--rb-border-width, 1px) solid rgb(var(--tb-border));
6596
+ }
6597
+
6598
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-day--today .event-week-board-day-head {
6599
+ background-color: var(--ec-today-bg);
6600
+ }
6601
+
6602
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-day-abbr {
6603
+ font-size: 0.6875rem;
6604
+ font-weight: 600;
6605
+ letter-spacing: 0.1em;
6606
+ text-transform: uppercase;
6607
+ opacity: 0.65;
6608
+ }
6609
+
6610
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-day--today .event-week-board-day-abbr {
6611
+ opacity: 1;
6612
+ color: var(--ec-today-text);
6613
+ }
6614
+
6615
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-day-num {
6616
+ font-size: 0.8125rem;
6617
+ font-weight: 600;
6618
+ opacity: 0.5;
6619
+ }
6620
+
6621
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-day-body {
6622
+ display: flex;
6623
+ flex-direction: column;
6624
+ gap: 0.65rem;
6625
+ padding: 0.9rem;
6626
+ flex: 1;
6627
+ }
6628
+
6629
+ /* Class card */
6630
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-card {
6631
+ display: flex;
6632
+ flex-direction: column;
6633
+ gap: 0.45rem;
6634
+ padding: 0.8rem 0.85rem;
6635
+ border: 1px solid var(--ec-border-subtle);
6636
+ border-left: 3px solid var(--ec-status-available);
6637
+ border-radius: calc(var(--rb-block-radius) / 1.5);
6638
+ background-color: var(--ec-surface);
6639
+ color: inherit;
6640
+ text-decoration: none;
6641
+ transition:
6642
+ transform var(--rb-block-transition) ease,
6643
+ box-shadow var(--rb-block-transition) ease,
6644
+ border-color var(--rb-block-transition) ease;
6645
+ }
6646
+
6647
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-card[data-status="filling"] {
6648
+ border-left-color: var(--ec-status-filling);
6649
+ }
6650
+
6651
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-card[data-status="waitlist"] {
6652
+ border-left-color: var(--ec-status-waitlist);
6653
+ }
6654
+
6655
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-card:hover {
6656
+ transform: translateY(-2px);
6657
+ box-shadow: 0 6px 16px -8px rgba(var(--tb-text), 0.28);
6658
+ border-color: rgba(var(--tb-primary), 0.4);
6659
+ }
6660
+
6661
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-card:focus-visible {
6662
+ outline: 2px solid rgb(var(--tb-primary));
6663
+ outline-offset: 2px;
6664
+ }
6665
+
6666
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-card-title {
6667
+ font-family: var(--font-heading, inherit);
6668
+ font-size: 0.9375rem;
6669
+ font-weight: 600;
6670
+ line-height: 1.2;
6671
+ }
6672
+
6673
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-card-time {
6674
+ font-size: 0.75rem;
6675
+ letter-spacing: 0.01em;
6676
+ opacity: 0.7;
6677
+ }
6678
+
6679
+ /* Capacity pill */
6680
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-card-pill {
6681
+ align-self: flex-start;
6682
+ display: inline-flex;
6683
+ align-items: center;
6684
+ padding: 0.15rem 0.6rem;
6685
+ border-radius: 999px;
6686
+ font-size: 0.6875rem;
6687
+ font-weight: 600;
6688
+ letter-spacing: 0.02em;
6689
+ /* Available (default): a calm neutral/muted pill — not a coloured outline.
6690
+ * Filling -> amber and waitlist -> muted outline are handled by the
6691
+ * data-status overrides below. */
6692
+ border: 1px solid var(--ec-border);
6693
+ background-color: rgba(var(--tb-text), 0.06);
6694
+ color: rgba(var(--tb-text), 0.62);
6695
+ border-color: var(--ec-border);
6696
+ }
6697
+
6698
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-card-pill[data-status="filling"] {
6699
+ background-color: rgba(var(--tb-accent), 0.14);
6700
+ color: var(--ec-status-filling);
6701
+ border-color: rgba(var(--tb-accent), 0.32);
6702
+ }
6703
+
6704
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-card-pill[data-status="waitlist"] {
6705
+ background-color: transparent;
6706
+ color: rgba(var(--tb-text), 0.6);
6707
+ border-color: var(--ec-border);
6708
+ }
6709
+
6710
+ /* Footer */
6711
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-foot {
6712
+ display: flex;
6713
+ align-items: center;
6714
+ justify-content: space-between;
6715
+ gap: 1rem;
6716
+ flex-wrap: wrap;
6717
+ padding: 1.1rem 1.5rem;
6718
+ background-color: var(--ec-header-bg);
6719
+ border-top: 1px solid var(--ec-border-subtle);
6720
+ }
6721
+
6722
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-foot-note {
6723
+ margin: 0;
6724
+ font-size: 0.875rem;
6725
+ opacity: 0.75;
6726
+ }
6727
+
6728
+ /* Responsive: collapse day columns to a stacked list on narrow viewports */
6729
+ @media (max-width: 1023px) {
6730
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-grid {
6731
+ grid-template-columns: 1fr;
6732
+ }
6733
+
6734
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-day {
6735
+ min-height: 0;
6736
+ border-right: none;
6737
+ border-bottom: var(--rb-border-width, 1px) solid rgb(var(--tb-border));
6738
+ }
6739
+
6740
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-day:last-child {
6741
+ border-bottom: none;
6742
+ }
6743
+
6744
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-day--empty {
6745
+ display: none;
6746
+ }
6747
+
6748
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-day-head {
6749
+ border-bottom: none;
6750
+ padding-bottom: 0.25rem;
6751
+ }
6752
+
6753
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-day-body {
6754
+ flex-direction: row;
6755
+ flex-wrap: wrap;
6756
+ padding-top: 0.35rem;
6757
+ }
6758
+
6759
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-card {
6760
+ flex: 1 1 14rem;
6761
+ }
6762
+ }
6763
+
6764
+ @media (max-width: 639px) {
6765
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-legend {
6766
+ display: none;
6767
+ }
6768
+
6769
+ :where(.theme-scope) :where([data-block="event-calendar"]) .event-week-board-card {
6770
+ flex: 1 1 100%;
6771
+ }
6772
+ }
6773
+
6774
+ /* -----------------------------------------------------------------------------
6775
+ * Week-board section band
6776
+ * Give the whole week-board section (head + panel) a subtle surface band so it
6777
+ * reads as a distinct zone from the page — the "testimonials band" pattern.
6778
+ * Painted as a pseudo-element above the section's fallback background layer
6779
+ * (z-index -10) but behind the content, so no block-content wiring is needed.
6780
+ * Surface + hairline rules are token-referenced: on a borderless site style
6781
+ * (--rb-border-width: 0) the band keeps its surface tint but drops the rules.
6782
+ * ----------------------------------------------------------------------------- */
6783
+ :where(.theme-scope) [data-slot="section"]:has(.event-calendar--week-board)::before {
6784
+ content: "";
6785
+ position: absolute;
6786
+ inset: 0;
6787
+ z-index: -9;
6788
+ background-color: rgb(var(--tb-surfaceAlt));
6789
+ border-block: var(--rb-border-width, 1px) solid rgb(var(--tb-border));
6790
+ pointer-events: none;
6791
+ }
6792
+
6793
+ /* -----------------------------------------------------------------------------
6794
+ * Event section head — split (heading left, intro right)
6795
+ * Rendered by the block frame (outside [data-block="event-calendar"]) via
6796
+ * eventSectionHeaderLayoutNodes({ splitClassName }). Lays the heading and its
6797
+ * supporting intro out as a two-column head on wide viewports, stacking on
6798
+ * narrow ones. The section band above provides the distinct background.
6799
+ * ----------------------------------------------------------------------------- */
6800
+ :where(.theme-scope) .event-section-head--split {
6801
+ display: flex;
6802
+ align-items: flex-end;
6803
+ justify-content: space-between;
6804
+ gap: clamp(1.5rem, 4vw, 3.5rem);
6805
+ flex-wrap: wrap;
6806
+ }
6807
+
6808
+ :where(.theme-scope) .event-section-head--split > :where(h1, h2, h3) {
6809
+ margin: 0;
6810
+ }
6811
+
6812
+ :where(.theme-scope) .event-section-head--split > .rb-prose {
6813
+ flex: 1 1 22rem;
6814
+ max-width: 34rem;
6815
+ margin: 0;
6816
+ }
6817
+
6818
+ @media (max-width: 767px) {
6819
+ :where(.theme-scope) .event-section-head--split {
6820
+ flex-direction: column;
6821
+ align-items: flex-start;
6822
+ gap: 0.75rem;
6823
+ }
6824
+
6825
+ :where(.theme-scope) .event-section-head--split > .rb-prose {
6826
+ flex-basis: auto;
6827
+ }
6828
+ }
6829
+
6428
6830
  /* -----------------------------------------------------------------------------
6429
6831
  * Event Calendar Modals
6430
6832
  * Modal overlays for event details and day events list
@@ -6854,7 +7256,7 @@
6854
7256
  }
6855
7257
 
6856
7258
  :where(.theme-scope) .rb-inline-text-accent-contrast {
6857
- color: var(--section-text-color, rgb(var(--tb-text)));
7259
+ color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
6858
7260
  }
6859
7261
 
6860
7262
  :where(.theme-scope) .rb-inline-text-highlight {
@@ -6865,7 +7267,7 @@
6865
7267
  }
6866
7268
 
6867
7269
  :where(.theme-scope) .rb-inline-text-highlight-soft {
6868
- background: color-mix(in oklab, var(--section-text-color, rgb(var(--tb-text))) 14%, transparent);
7270
+ background: color-mix(in oklab, var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39))) 14%, transparent);
6869
7271
  }
6870
7272
 
6871
7273
  :where(.theme-scope) .rb-inline-text-highlight-accent {
@@ -6886,7 +7288,7 @@
6886
7288
 
6887
7289
  /* Eyebrow - color only (typography via .rb-eyebrow) */
6888
7290
  :where(.theme-scope) :where([data-block="hero"]) .hero-eyebrow:not(.rb-eyebrow-treatment-accent) {
6889
- color: var(--section-text-color, rgb(var(--tb-text)));
7291
+ color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
6890
7292
  }
6891
7293
 
6892
7294
  /* Subheadline - supporting text below headline */
@@ -6896,7 +7298,7 @@
6896
7298
 
6897
7299
  :where(.theme-scope) :where([data-block="hero"]) .hero-subheadline {
6898
7300
  font-size: 1.125rem;
6899
- color: var(--section-supporting-color, var(--section-text-color, rgb(var(--tb-text))));
7301
+ color: var(--rb-surface-supporting-color, var(--rb-surface-text-color, rgb(var(--tb-mutedText, 100 116 139))));
6900
7302
  }
6901
7303
 
6902
7304
  @media (min-width: 640px) {
@@ -6985,7 +7387,7 @@
6985
7387
 
6986
7388
  /* CTA content/body text */
6987
7389
  :where(.theme-scope) :where([data-block="cta-full"]) .cta-content {
6988
- color: var(--section-supporting-color, rgb(var(--tb-mutedText)));
7390
+ color: var(--rb-surface-supporting-color, var(--rb-surface-text-color, rgb(var(--tb-mutedText, 100 116 139))));
6989
7391
  }
6990
7392
 
6991
7393
  /* CTA button row container */
@@ -7087,7 +7489,7 @@
7087
7489
  /* Form intro text */
7088
7490
  :where(.theme-scope) :where([data-block="form"]) .form-copy-intro {
7089
7491
  font-size: 1rem;
7090
- color: var(--section-text-color, rgb(var(--tb-text)));
7492
+ color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
7091
7493
  }
7092
7494
 
7093
7495
  /* =============================================================================
@@ -7448,6 +7850,10 @@
7448
7850
  --rb-modal-overlay-bg: rgb(var(--tb-text, 0 0 0) / 0.6);
7449
7851
  --rb-modal-shadow: var(--shadow-lg, var(--shadow-elev));
7450
7852
  --rb-modal-z-index: 20000;
7853
+ --rb-modal-text: rgb(var(--tb-text, 17 24 39));
7854
+ --rb-modal-heading: rgb(var(--tb-text, 17 24 39));
7855
+ --rb-modal-link: rgb(var(--tb-primary, var(--tb-text, 17 24 39)));
7856
+ --rb-modal-supporting: rgb(var(--tb-mutedText, 100 116 139));
7451
7857
  --shop-card-radius: var(--rb-block-radius, var(--radius-card, 0.75rem));
7452
7858
  --shop-control-radius: var(--rb-input-radius, var(--radius-control, 0.375rem));
7453
7859
  }
@@ -7505,6 +7911,11 @@
7505
7911
  /* Product card */
7506
7912
  :where(.theme-scope) .shop__card {
7507
7913
  background: rgb(var(--tb-surface));
7914
+ color: rgb(var(--tb-text, 17 24 39));
7915
+ --rb-surface-text-color: rgb(var(--tb-text, 17 24 39));
7916
+ --rb-surface-heading-color: rgb(var(--tb-text, 17 24 39));
7917
+ --rb-surface-link-color: rgb(var(--tb-primary, var(--tb-text, 17 24 39)));
7918
+ --rb-surface-supporting-color: rgb(var(--tb-mutedText, 100 116 139));
7508
7919
  border: 1px solid rgb(var(--tb-border));
7509
7920
  border-radius: var(--shop-card-radius);
7510
7921
  padding: 1.5rem;
@@ -7657,6 +8068,11 @@
7657
8068
  border: 1px solid rgb(var(--tb-border));
7658
8069
  border-radius: var(--shop-card-radius);
7659
8070
  background: rgb(var(--tb-surface));
8071
+ color: rgb(var(--tb-text, 17 24 39));
8072
+ --rb-surface-text-color: rgb(var(--tb-text, 17 24 39));
8073
+ --rb-surface-heading-color: rgb(var(--tb-text, 17 24 39));
8074
+ --rb-surface-link-color: rgb(var(--tb-primary, var(--tb-text, 17 24 39)));
8075
+ --rb-surface-supporting-color: rgb(var(--tb-mutedText, 100 116 139));
7660
8076
  }
7661
8077
 
7662
8078
  :where(.theme-scope) :where([data-block="shop"]) .rb-state-icon--success {
@@ -7729,6 +8145,11 @@
7729
8145
  margin: 0 auto;
7730
8146
  padding: 2rem;
7731
8147
  background: var(--cp-card-bg);
8148
+ color: var(--cp-text);
8149
+ --rb-surface-text-color: var(--cp-text);
8150
+ --rb-surface-heading-color: var(--cp-text);
8151
+ --rb-surface-link-color: var(--cp-primary);
8152
+ --rb-surface-supporting-color: var(--cp-muted);
7732
8153
  border: 1px solid var(--cp-card-border);
7733
8154
  border-radius: var(--cp-card-radius);
7734
8155
  }
@@ -7857,6 +8278,11 @@
7857
8278
  padding: 3rem 2rem;
7858
8279
  text-align: center;
7859
8280
  background: var(--cp-card-bg);
8281
+ color: var(--cp-text);
8282
+ --rb-surface-text-color: var(--cp-text);
8283
+ --rb-surface-heading-color: var(--cp-text);
8284
+ --rb-surface-link-color: var(--cp-primary);
8285
+ --rb-surface-supporting-color: var(--cp-muted);
7860
8286
  border: 1px dashed var(--cp-card-border);
7861
8287
  border-radius: var(--cp-card-radius);
7862
8288
  }
@@ -7869,6 +8295,11 @@
7869
8295
  /* Card */
7870
8296
  :where(.theme-scope) :where([data-block="customer-portal"]) .cp-card {
7871
8297
  background: var(--cp-card-bg);
8298
+ color: var(--cp-text);
8299
+ --rb-surface-text-color: var(--cp-text);
8300
+ --rb-surface-heading-color: var(--cp-text);
8301
+ --rb-surface-link-color: var(--cp-primary);
8302
+ --rb-surface-supporting-color: var(--cp-muted);
7872
8303
  border: 1px solid var(--cp-card-border);
7873
8304
  border-radius: var(--cp-card-radius);
7874
8305
  padding: 1.25rem;
@@ -8033,6 +8464,11 @@
8033
8464
  /* Table */
8034
8465
  :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table-wrap {
8035
8466
  background: var(--cp-card-bg);
8467
+ color: var(--cp-text);
8468
+ --rb-surface-text-color: var(--cp-text);
8469
+ --rb-surface-heading-color: var(--cp-text);
8470
+ --rb-surface-link-color: var(--cp-primary);
8471
+ --rb-surface-supporting-color: var(--cp-muted);
8036
8472
  border: 1px solid var(--cp-card-border);
8037
8473
  border-radius: var(--cp-card-radius);
8038
8474
  }
@@ -8594,6 +9030,139 @@
8594
9030
  }
8595
9031
 
8596
9032
 
9033
+ /* =============================================================================
9034
+ * Variant: featured-editorial
9035
+ *
9036
+ * An asymmetric layout: a large featured (spruce-ink) quote card beside a
9037
+ * column of stacked white cards. Renders NO avatars. Colours are palette
9038
+ * tokens only. Node structure is built in testimonialsCarousel.ts.
9039
+ * ============================================================================= */
9040
+
9041
+ /* Section head: heading left, lead-in line to the right; stacks on mobile. */
9042
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-fe-head {
9043
+ display: flex;
9044
+ flex-direction: column;
9045
+ align-items: flex-start;
9046
+ gap: 0.875rem;
9047
+ }
9048
+
9049
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-fe-leadin {
9050
+ max-width: 30rem;
9051
+ }
9052
+
9053
+ @media (min-width: 768px) {
9054
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-fe-head {
9055
+ flex-direction: row;
9056
+ align-items: flex-end;
9057
+ justify-content: space-between;
9058
+ gap: 1.5rem;
9059
+ }
9060
+ }
9061
+
9062
+ /* Card grid: featured (wider) beside the stacked column. Single column on
9063
+ * small screens. */
9064
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-fe-grid {
9065
+ display: grid;
9066
+ grid-template-columns: minmax(0, 1fr);
9067
+ gap: 1.25rem;
9068
+ align-items: stretch;
9069
+ }
9070
+
9071
+ @media (min-width: 1024px) {
9072
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-fe-grid {
9073
+ grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr);
9074
+ }
9075
+ }
9076
+
9077
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-fe-col {
9078
+ display: grid;
9079
+ gap: 1.25rem;
9080
+ align-content: start;
9081
+ }
9082
+
9083
+ /* Base card (white surface) */
9084
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-fe-card {
9085
+ display: flex;
9086
+ flex-direction: column;
9087
+ height: 100%;
9088
+ border-radius: var(--rb-block-radius);
9089
+ padding: 1.875rem 1.875rem 1.625rem;
9090
+ background: rgb(var(--tb-surface));
9091
+ border: 1px solid rgba(var(--tb-border), 0.9);
9092
+ box-shadow: 0 1px 2px rgba(var(--tb-shadow, 0 0 0), 0.05);
9093
+ }
9094
+
9095
+ /* Featured (spruce-ink) card */
9096
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-fe-card--feature {
9097
+ padding: 2.5rem;
9098
+ background: rgb(var(--tb-primary));
9099
+ border-color: transparent;
9100
+ color: rgb(var(--tb-onPrimary));
9101
+ }
9102
+
9103
+ /* Amber quote mark, oversized serif */
9104
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-fe-qmark {
9105
+ display: block;
9106
+ height: 1.6rem;
9107
+ font-family: var(--font-heading, Georgia, serif);
9108
+ font-style: italic;
9109
+ font-size: 3.375rem;
9110
+ line-height: 0.6;
9111
+ color: rgb(var(--tb-secondary));
9112
+ }
9113
+
9114
+ /* Quote body. The inner <p> is targeted directly (not via :where) so the
9115
+ * serif display font and sizing win over the theme's base paragraph rule. */
9116
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-fe-quote {
9117
+ flex: 1 1 auto;
9118
+ margin-top: 1.25rem;
9119
+ }
9120
+
9121
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-fe-quote p {
9122
+ margin: 0;
9123
+ font-family: var(--font-heading, Georgia, serif);
9124
+ font-size: 1.15rem;
9125
+ line-height: 1.5;
9126
+ color: rgb(var(--tb-text));
9127
+ }
9128
+
9129
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-fe-card--feature .rb-testimonials-fe-quote p {
9130
+ color: rgb(var(--tb-onPrimary));
9131
+ font-size: clamp(1.375rem, 2.4vw, 1.6875rem);
9132
+ line-height: 1.42;
9133
+ letter-spacing: -0.01em;
9134
+ }
9135
+
9136
+ /* Attribution: name (bold) + context line, no avatar */
9137
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-fe-meta {
9138
+ display: flex;
9139
+ flex-direction: column;
9140
+ gap: 0.25rem;
9141
+ margin-top: 1.625rem;
9142
+ }
9143
+
9144
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-fe-name {
9145
+ font-weight: 600;
9146
+ font-size: 0.97rem;
9147
+ color: rgb(var(--tb-text));
9148
+ }
9149
+
9150
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-fe-context {
9151
+ font-size: 0.78rem;
9152
+ letter-spacing: 0.02em;
9153
+ color: rgb(var(--tb-mutedText));
9154
+ }
9155
+
9156
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-fe-card--feature .rb-testimonials-fe-name {
9157
+ color: rgb(var(--tb-onPrimary));
9158
+ }
9159
+
9160
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-fe-card--feature .rb-testimonials-fe-context {
9161
+ color: rgb(var(--tb-onPrimary));
9162
+ opacity: 0.7;
9163
+ }
9164
+
9165
+
8597
9166
  /* Testimonials carousel tweaks: arrow styling + gutters + equal-height cards */
8598
9167
  :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-carousel.carousel-root .carousel-nav-btn {
8599
9168
  height: var(--rb-testimonial-carousel-arrow-size);
@@ -9737,7 +10306,7 @@
9737
10306
 
9738
10307
  :where(.theme-scope) :where([data-block="newsletter-signup"]) .newsletter-copy-subtitle {
9739
10308
  font-size: 1rem;
9740
- color: var(--section-text-color, rgb(var(--tb-text)));
10309
+ color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
9741
10310
  opacity: 0.85;
9742
10311
  }
9743
10312
 
@@ -9786,7 +10355,7 @@
9786
10355
  margin-top: 0.75rem;
9787
10356
  font-size: 1rem;
9788
10357
  line-height: 1.6;
9789
- color: var(--section-text-color, rgb(var(--tb-text)));
10358
+ color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
9790
10359
  text-align: center;
9791
10360
  }
9792
10361
 
@@ -9867,7 +10436,7 @@
9867
10436
 
9868
10437
  :where(.theme-scope) :where([data-block="contact-newsletter"]) .form-copy-intro,
9869
10438
  :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-copy-subtitle {
9870
- color: var(--section-text-color, rgb(var(--tb-text)));
10439
+ color: var(--rb-surface-text-color, rgb(var(--tb-text, 17 24 39)));
9871
10440
  }
9872
10441
 
9873
10442
  :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-info {
@@ -10264,7 +10833,7 @@
10264
10833
 
10265
10834
  :where(.theme-scope) .event-compact-row-title {
10266
10835
  margin: 0;
10267
- color: var(--section-heading-color, rgb(var(--tb-primary, 0 0 0)));
10836
+ color: var(--rb-surface-heading-color, var(--rb-surface-text-color, rgb(var(--tb-primary, var(--tb-text, 17 24 39)))));
10268
10837
  font-family: var(--font-heading, var(--font-body, inherit));
10269
10838
  font-size: clamp(1.05rem, 1rem + 0.35vw, 1.3rem);
10270
10839
  font-weight: 400;
@@ -10930,27 +11499,41 @@
10930
11499
  background: rgb(var(--tb-surface));
10931
11500
  }
10932
11501
  :where(.theme-scope) .rb-card-treatment-color-blocked:nth-child(3n + 1) {
11502
+ background: rgb(var(--tb-surface));
10933
11503
  color: rgb(var(--tb-onSurface));
11504
+ --rb-surface-text-color: rgb(var(--tb-onSurface));
11505
+ --rb-surface-heading-color: rgb(var(--tb-onSurface));
11506
+ --rb-surface-link-color: rgb(var(--tb-onSurface));
11507
+ --rb-surface-supporting-color: rgb(var(--tb-onSurface));
10934
11508
  }
10935
11509
 
10936
11510
  :where(.theme-scope) .rb-card-treatment-color-blocked:nth-child(3n + 2) > .rb-bg-surface {
10937
11511
  background: rgb(var(--tb-secondary));
10938
11512
  }
10939
11513
  :where(.theme-scope) .rb-card-treatment-color-blocked:nth-child(3n + 2) {
11514
+ background: rgb(var(--tb-secondary));
10940
11515
  color: rgb(var(--tb-onSecondary));
11516
+ --rb-surface-text-color: rgb(var(--tb-onSecondary));
11517
+ --rb-surface-heading-color: rgb(var(--tb-onSecondary));
11518
+ --rb-surface-link-color: rgb(var(--tb-onSecondary));
11519
+ --rb-surface-supporting-color: rgb(var(--tb-onSecondary));
10941
11520
  }
10942
11521
 
10943
11522
  :where(.theme-scope) .rb-card-treatment-color-blocked:nth-child(3n + 3) > .rb-bg-surface {
10944
11523
  background: rgb(var(--tb-primary));
10945
11524
  }
10946
11525
  :where(.theme-scope) .rb-card-treatment-color-blocked:nth-child(3n + 3) {
11526
+ background: rgb(var(--tb-primary));
10947
11527
  color: rgb(var(--tb-onPrimary));
11528
+ --rb-surface-text-color: rgb(var(--tb-onPrimary));
11529
+ --rb-surface-heading-color: rgb(var(--tb-onPrimary));
11530
+ --rb-surface-link-color: rgb(var(--tb-onPrimary));
11531
+ --rb-surface-supporting-color: rgb(var(--tb-onPrimary));
10948
11532
  }
10949
11533
 
10950
- /* Body copy carries an inline muted colour from the block; force it to the
10951
- * card's on-colour so it reads on every block (inline style needs !important). */
11534
+ /* Keep the intended visual hierarchy; the body color itself now resolves via
11535
+ * the nearest surface provider instead of requiring an inline override. */
10952
11536
  :where(.theme-scope) .rb-card-treatment-color-blocked .rb-feature-card-body {
10953
- color: inherit !important;
10954
11537
  opacity: 0.9;
10955
11538
  }
10956
11539