@deriv-com/dds-marketing 1.1.3 → 1.2.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 (295) hide show
  1. package/.llm/components/accordion.md +6 -0
  2. package/.llm/components/accordionitem.md +6 -0
  3. package/.llm/components/aspectratio.md +6 -0
  4. package/.llm/components/awards.md +6 -0
  5. package/.llm/components/background.md +49 -10
  6. package/.llm/components/badge.md +6 -0
  7. package/.llm/components/bottomsheet.md +6 -0
  8. package/.llm/components/breadcrumb.md +6 -0
  9. package/.llm/components/breadcrumbitem.md +6 -0
  10. package/.llm/components/button.md +9 -3
  11. package/.llm/components/buttonicon.md +7 -1
  12. package/.llm/components/card.md +6 -0
  13. package/.llm/components/cardbody.md +7 -1
  14. package/.llm/components/cardbutton.md +6 -0
  15. package/.llm/components/checkbox.md +6 -0
  16. package/.llm/components/comparisoncards.md +9 -3
  17. package/.llm/components/comparisontable.md +6 -0
  18. package/.llm/components/ctabanner.md +6 -0
  19. package/.llm/components/ctabannerslider.md +6 -0
  20. package/.llm/components/datatable.md +6 -0
  21. package/.llm/components/divider.md +6 -0
  22. package/.llm/components/documentlink.md +237 -0
  23. package/.llm/components/documents.md +268 -0
  24. package/.llm/components/downloadbanner.md +7 -1
  25. package/.llm/components/dropdownmenu.md +6 -0
  26. package/.llm/components/estimator.md +6 -0
  27. package/.llm/components/faqaccordion.md +6 -0
  28. package/.llm/components/featurebullets.md +6 -0
  29. package/.llm/components/featurecards.md +42 -2
  30. package/.llm/components/featurecardscarousel.md +7 -1
  31. package/.llm/components/featurescroll.md +6 -0
  32. package/.llm/components/featuresplit.md +6 -0
  33. package/.llm/components/featurestack.md +6 -0
  34. package/.llm/components/featuretabs.md +369 -0
  35. package/.llm/components/filterchip.md +6 -0
  36. package/.llm/components/footer.md +6 -0
  37. package/.llm/components/footergroup.md +6 -0
  38. package/.llm/components/grid.md +30 -1
  39. package/.llm/components/icon.md +6 -0
  40. package/.llm/components/illustrationcard.md +52 -2
  41. package/.llm/components/illustrationcheck.md +193 -0
  42. package/.llm/components/illustrationchoice.md +187 -0
  43. package/.llm/components/illustrationcode.md +192 -0
  44. package/.llm/components/illustrationlist.md +175 -0
  45. package/.llm/components/illustrationscene.md +29 -3
  46. package/.llm/components/imagebanner.md +30 -5
  47. package/.llm/components/landinghero.md +6 -0
  48. package/.llm/components/link.md +7 -1
  49. package/.llm/components/logocolumns.md +7 -1
  50. package/.llm/components/logorows.md +42 -2
  51. package/.llm/components/menuitem.md +6 -0
  52. package/.llm/components/navbar.md +6 -0
  53. package/.llm/components/navbaritem.md +6 -0
  54. package/.llm/components/navbarmenu.md +6 -0
  55. package/.llm/components/navbarmenugroup.md +6 -0
  56. package/.llm/components/navbarpanel.md +6 -0
  57. package/.llm/components/navbarswitcher.md +6 -0
  58. package/.llm/components/navbarswitcheroption.md +6 -0
  59. package/.llm/components/option.md +6 -0
  60. package/.llm/components/pageheader.md +6 -0
  61. package/.llm/components/pagination.md +6 -0
  62. package/.llm/components/paginationdots.md +6 -0
  63. package/.llm/components/producthero.md +29 -4
  64. package/.llm/components/progressbar.md +305 -0
  65. package/.llm/components/removablechip.md +6 -0
  66. package/.llm/components/resourcebanner.md +6 -0
  67. package/.llm/components/row.md +6 -0
  68. package/.llm/components/scenescroll.md +38 -24
  69. package/.llm/components/scenescrollword.md +267 -0
  70. package/.llm/components/scroller.md +6 -0
  71. package/.llm/components/searchinput.md +6 -0
  72. package/.llm/components/segmentedcontrol.md +28 -1
  73. package/.llm/components/segmentedcontrolitem.md +6 -0
  74. package/.llm/components/select.md +6 -0
  75. package/.llm/components/selectchip.md +6 -0
  76. package/.llm/components/spinner.md +6 -0
  77. package/.llm/components/stack.md +6 -0
  78. package/.llm/components/stats.md +46 -1
  79. package/.llm/components/statscarousel.md +227 -0
  80. package/.llm/components/statusdot.md +41 -1
  81. package/.llm/components/steps.md +6 -0
  82. package/.llm/components/stickycards.md +6 -0
  83. package/.llm/components/subdomainnavbar.md +6 -0
  84. package/.llm/components/tab.md +6 -0
  85. package/.llm/components/table.md +6 -0
  86. package/.llm/components/tablebody.md +6 -0
  87. package/.llm/components/tablecell.md +6 -0
  88. package/.llm/components/tablehead.md +6 -0
  89. package/.llm/components/tableheadercell.md +6 -0
  90. package/.llm/components/tablerow.md +6 -0
  91. package/.llm/components/tablist.md +6 -0
  92. package/.llm/components/teamgrid.md +6 -0
  93. package/.llm/components/testimonialrow.md +43 -3
  94. package/.llm/components/testimonialslider.md +8 -2
  95. package/.llm/components/textarea.md +6 -0
  96. package/.llm/components/textinput.md +6 -0
  97. package/.llm/components/textscroll.md +6 -0
  98. package/.llm/components/tiers.md +13 -7
  99. package/.llm/components/tooltip.md +6 -0
  100. package/.llm/components/typography.md +63 -1
  101. package/.llm/digest/background.md +14 -6
  102. package/.llm/digest/button.md +1 -1
  103. package/.llm/digest/buttonicon.md +1 -1
  104. package/.llm/digest/documentlink.md +52 -0
  105. package/.llm/digest/documents.md +51 -0
  106. package/.llm/digest/downloadbanner.md +1 -1
  107. package/.llm/digest/featurecards.md +7 -0
  108. package/.llm/digest/featuretabs.md +50 -0
  109. package/.llm/digest/grid.md +1 -0
  110. package/.llm/digest/illustrationcard.md +6 -1
  111. package/.llm/digest/illustrationcheck.md +42 -0
  112. package/.llm/digest/illustrationchoice.md +43 -0
  113. package/.llm/digest/illustrationcode.md +41 -0
  114. package/.llm/digest/illustrationlist.md +38 -0
  115. package/.llm/digest/illustrationscene.md +4 -2
  116. package/.llm/digest/imagebanner.md +9 -3
  117. package/.llm/digest/logocolumns.md +1 -1
  118. package/.llm/digest/logorows.md +8 -1
  119. package/.llm/digest/producthero.md +8 -2
  120. package/.llm/digest/progressbar.md +56 -0
  121. package/.llm/digest/scenescroll.md +6 -5
  122. package/.llm/digest/scenescrollword.md +56 -0
  123. package/.llm/digest/segmentedcontrol.md +3 -0
  124. package/.llm/digest/stats.md +8 -0
  125. package/.llm/digest/statscarousel.md +48 -0
  126. package/.llm/digest/statusdot.md +7 -0
  127. package/.llm/digest/testimonialrow.md +8 -1
  128. package/.llm/digest/testimonialslider.md +1 -1
  129. package/.llm/digest/typography.md +18 -0
  130. package/.llm/index.md +14 -4
  131. package/.llm/rules.md +10 -0
  132. package/.llm/tokens.md +12 -3
  133. package/AGENTS.md +13 -2
  134. package/dist/components/arrival.d.ts +32 -0
  135. package/dist/components/arrival.js +140 -0
  136. package/dist/components/arrives.d.ts +17 -0
  137. package/dist/components/arrives.js +14 -0
  138. package/dist/components/blocks/awards/Awards.js +2 -27
  139. package/dist/components/blocks/block-pattern.css +23 -0
  140. package/dist/components/blocks/comparison-cards/comparison-cards-impl.css +29 -0
  141. package/dist/components/blocks/documents/Documents.css +90 -0
  142. package/dist/components/blocks/documents/Documents.d.ts +22 -0
  143. package/dist/components/blocks/documents/Documents.js +30 -0
  144. package/dist/components/blocks/documents/Documents.types.d.ts +37 -0
  145. package/dist/components/blocks/documents/Documents.types.js +14 -0
  146. package/dist/components/blocks/documents/documents-impl.css +103 -0
  147. package/dist/components/blocks/download-banner/DownloadBanner.css +1 -1
  148. package/dist/components/blocks/download-banner/DownloadBanner.types.d.ts +1 -1
  149. package/dist/components/blocks/feature-cards/FeatureCards.d.ts +2 -1
  150. package/dist/components/blocks/feature-cards/FeatureCards.js +10 -7
  151. package/dist/components/blocks/feature-cards/FeatureCards.types.d.ts +9 -1
  152. package/dist/components/blocks/feature-cards/feature-cards-impl.css +15 -3
  153. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.d.ts +1 -1
  154. package/dist/components/blocks/feature-cards-carousel/feature-cards-carousel-impl.css +12 -0
  155. package/dist/components/blocks/feature-tabs/FeatureTabs.css +100 -0
  156. package/dist/components/blocks/feature-tabs/FeatureTabs.d.ts +23 -0
  157. package/dist/components/blocks/feature-tabs/FeatureTabs.js +38 -0
  158. package/dist/components/blocks/feature-tabs/FeatureTabs.types.d.ts +35 -0
  159. package/dist/components/blocks/feature-tabs/FeatureTabs.types.js +14 -0
  160. package/dist/components/blocks/feature-tabs/feature-tabs-impl.css +53 -0
  161. package/dist/components/blocks/image-banner/ImageBanner.css +1 -1
  162. package/dist/components/blocks/image-banner/ImageBanner.d.ts +1 -1
  163. package/dist/components/blocks/image-banner/ImageBanner.js +2 -2
  164. package/dist/components/blocks/image-banner/ImageBanner.types.d.ts +9 -7
  165. package/dist/components/blocks/image-banner/ImageBanner.types.js +1 -1
  166. package/dist/components/blocks/image-banner/image-banner-impl.css +77 -26
  167. package/dist/components/blocks/laurel.d.ts +16 -0
  168. package/dist/components/blocks/laurel.js +28 -0
  169. package/dist/components/blocks/logo-columns/LogoColumns.css +1 -1
  170. package/dist/components/blocks/logo-columns/LogoColumns.types.d.ts +1 -1
  171. package/dist/components/blocks/logo-rows/LogoRows.css +1 -1
  172. package/dist/components/blocks/logo-rows/LogoRows.d.ts +2 -1
  173. package/dist/components/blocks/logo-rows/LogoRows.js +7 -4
  174. package/dist/components/blocks/logo-rows/LogoRows.types.d.ts +9 -1
  175. package/dist/components/blocks/pattern-tone.d.ts +11 -0
  176. package/dist/components/blocks/pattern-tone.js +7 -0
  177. package/dist/components/blocks/product-hero/ProductHero.d.ts +1 -1
  178. package/dist/components/blocks/product-hero/ProductHero.js +2 -2
  179. package/dist/components/blocks/product-hero/ProductHero.types.d.ts +8 -3
  180. package/dist/components/blocks/product-hero/ProductHero.types.js +1 -1
  181. package/dist/components/blocks/product-hero/product-hero-impl.css +54 -0
  182. package/dist/components/blocks/resource-banner/ResourceBanner.css +1 -1
  183. package/dist/components/blocks/scene-scroll/SceneScroll.css +1 -1
  184. package/dist/components/blocks/scene-scroll/SceneScroll.d.ts +6 -5
  185. package/dist/components/blocks/scene-scroll/SceneScroll.js +8 -7
  186. package/dist/components/blocks/scene-scroll/SceneScroll.types.d.ts +5 -5
  187. package/dist/components/blocks/scene-scroll/SceneScroll.types.js +1 -1
  188. package/dist/components/blocks/scene-scroll/scene-scroll-impl.css +61 -44
  189. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.css +105 -0
  190. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.d.ts +31 -0
  191. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.js +67 -0
  192. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.types.d.ts +39 -0
  193. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.types.js +18 -0
  194. package/dist/components/blocks/scene-scroll-word/scene-scroll-word-impl.css +370 -0
  195. package/dist/components/blocks/stats/Stats.d.ts +2 -1
  196. package/dist/components/blocks/stats/Stats.js +17 -14
  197. package/dist/components/blocks/stats/Stats.types.d.ts +8 -0
  198. package/dist/components/blocks/stats/stats-impl.css +4 -1
  199. package/dist/components/blocks/stats/use-wheel.d.ts +1 -1
  200. package/dist/components/blocks/stats/use-wheel.js +8 -4
  201. package/dist/components/blocks/stats-carousel/StatsCarousel.css +209 -0
  202. package/dist/components/blocks/stats-carousel/StatsCarousel.d.ts +20 -0
  203. package/dist/components/blocks/stats-carousel/StatsCarousel.js +48 -0
  204. package/dist/components/blocks/stats-carousel/StatsCarousel.types.d.ts +43 -0
  205. package/dist/components/blocks/stats-carousel/StatsCarousel.types.js +23 -0
  206. package/dist/components/blocks/stats-carousel/stats-carousel-impl.css +233 -0
  207. package/dist/components/blocks/sticky-cards/sticky-cards-impl.css +8 -0
  208. package/dist/components/blocks/testimonial-row/TestimonialRow.css +1 -1
  209. package/dist/components/blocks/testimonial-row/TestimonialRow.d.ts +2 -1
  210. package/dist/components/blocks/testimonial-row/TestimonialRow.js +16 -13
  211. package/dist/components/blocks/testimonial-row/TestimonialRow.types.d.ts +9 -1
  212. package/dist/components/blocks/testimonial-slider/TestimonialSlider.css +1 -1
  213. package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.d.ts +1 -1
  214. package/dist/components/blocks/tiers/Tiers.types.d.ts +1 -1
  215. package/dist/components/core/background/Background.css +19 -0
  216. package/dist/components/core/background/Background.types.d.ts +2 -1
  217. package/dist/components/core/background/background-impl.css +47 -15
  218. package/dist/components/core/background/halftone.js +1 -1
  219. package/dist/components/core/button/Button.css +5 -5
  220. package/dist/components/core/button-icon/ButtonIcon.types.d.ts +1 -1
  221. package/dist/components/core/card-body/CardBody.css +5 -0
  222. package/dist/components/core/card-body/CardBody.types.d.ts +1 -1
  223. package/dist/components/core/document-link/DocumentLink.css +59 -0
  224. package/dist/components/core/document-link/DocumentLink.d.ts +19 -0
  225. package/dist/components/core/document-link/DocumentLink.js +21 -0
  226. package/dist/components/core/document-link/DocumentLink.types.d.ts +41 -0
  227. package/dist/components/core/document-link/DocumentLink.types.js +11 -0
  228. package/dist/components/core/document-link/document-link-impl.css +23 -0
  229. package/dist/components/core/illustration-card/IllustrationCard.css +7 -0
  230. package/dist/components/core/illustration-card/IllustrationCard.d.ts +5 -1
  231. package/dist/components/core/illustration-card/IllustrationCard.js +34 -8
  232. package/dist/components/core/illustration-card/IllustrationCard.types.d.ts +8 -1
  233. package/dist/components/core/illustration-card/IllustrationCard.types.js +1 -0
  234. package/dist/components/core/illustration-card/illustration-card-impl.css +113 -0
  235. package/dist/components/core/illustration-check/IllustrationCheck.css +25 -0
  236. package/dist/components/core/illustration-check/IllustrationCheck.d.ts +16 -0
  237. package/dist/components/core/illustration-check/IllustrationCheck.js +22 -0
  238. package/dist/components/core/illustration-check/IllustrationCheck.types.d.ts +25 -0
  239. package/dist/components/core/illustration-check/IllustrationCheck.types.js +9 -0
  240. package/dist/components/core/illustration-check/illustration-check-impl.css +76 -0
  241. package/dist/components/core/illustration-choice/IllustrationChoice.css +62 -0
  242. package/dist/components/core/illustration-choice/IllustrationChoice.d.ts +16 -0
  243. package/dist/components/core/illustration-choice/IllustrationChoice.js +31 -0
  244. package/dist/components/core/illustration-choice/IllustrationChoice.types.d.ts +25 -0
  245. package/dist/components/core/illustration-choice/IllustrationChoice.types.js +11 -0
  246. package/dist/components/core/illustration-choice/illustration-choice-impl.css +103 -0
  247. package/dist/components/core/illustration-code/IllustrationCode.css +25 -0
  248. package/dist/components/core/illustration-code/IllustrationCode.d.ts +12 -0
  249. package/dist/components/core/illustration-code/IllustrationCode.js +20 -0
  250. package/dist/components/core/illustration-code/IllustrationCode.types.d.ts +23 -0
  251. package/dist/components/core/illustration-code/IllustrationCode.types.js +8 -0
  252. package/dist/components/core/illustration-code/illustration-code-impl.css +42 -0
  253. package/dist/components/core/illustration-list/IllustrationList.css +19 -0
  254. package/dist/components/core/illustration-list/IllustrationList.d.ts +16 -0
  255. package/dist/components/core/illustration-list/IllustrationList.js +18 -0
  256. package/dist/components/core/illustration-list/IllustrationList.types.d.ts +15 -0
  257. package/dist/components/core/illustration-list/IllustrationList.types.js +6 -0
  258. package/dist/components/core/illustration-list/illustration-list-impl.css +52 -0
  259. package/dist/components/core/illustration-scene/IllustrationScene.css +6 -0
  260. package/dist/components/core/illustration-scene/IllustrationScene.d.ts +3 -2
  261. package/dist/components/core/illustration-scene/IllustrationScene.js +4 -3
  262. package/dist/components/core/illustration-scene/IllustrationScene.types.d.ts +5 -1
  263. package/dist/components/core/illustration-scene/IllustrationScene.types.js +2 -1
  264. package/dist/components/core/illustration-scene/illustration-scene-impl.css +65 -0
  265. package/dist/components/core/link/link-impl.css +5 -19
  266. package/dist/components/core/progress-bar/ProgressBar.css +101 -0
  267. package/dist/components/core/progress-bar/ProgressBar.d.ts +5 -0
  268. package/dist/components/core/progress-bar/ProgressBar.js +34 -0
  269. package/dist/components/core/progress-bar/ProgressBar.types.d.ts +52 -0
  270. package/dist/components/core/progress-bar/ProgressBar.types.js +12 -0
  271. package/dist/components/core/progress-bar/progress-bar-impl.css +45 -0
  272. package/dist/components/core/segmented-control/SegmentedControl.d.ts +1 -1
  273. package/dist/components/core/segmented-control/SegmentedControl.js +13 -5
  274. package/dist/components/core/segmented-control/SegmentedControl.types.d.ts +5 -1
  275. package/dist/components/core/segmented-control/segmented-control-impl.css +35 -0
  276. package/dist/components/core/status-dot/StatusDot.d.ts +1 -1
  277. package/dist/components/core/status-dot/StatusDot.js +7 -4
  278. package/dist/components/core/status-dot/StatusDot.types.d.ts +9 -1
  279. package/dist/components/core/status-dot/status-dot-impl.css +101 -0
  280. package/dist/components/core/typography/Typography.d.ts +3 -283
  281. package/dist/components/core/typography/Typography.js +9 -1
  282. package/dist/components/core/typography/Typography.types.d.ts +9 -15
  283. package/dist/components/core/typography/TypographyMotion.d.ts +28 -0
  284. package/dist/components/core/typography/TypographyMotion.js +43 -0
  285. package/dist/components/core/typography/typography-impl.css +106 -0
  286. package/dist/components/illustration-data.d.ts +15 -0
  287. package/dist/components/illustration-data.js +7 -0
  288. package/dist/components/index.d.ts +22 -1
  289. package/dist/components/index.js +20 -0
  290. package/dist/components/layout/grid/Grid.css +5 -0
  291. package/dist/components/layout/grid/Grid.types.d.ts +2 -1
  292. package/dist/components/scene-scroll-data.d.ts +35 -0
  293. package/dist/components/tiers-data.d.ts +3 -2
  294. package/dist/marketing.css +24 -6
  295. package/package.json +1 -1
@@ -25,10 +25,11 @@ The photograph is the scene and the card is what it says. The card's `label` des
25
25
 
26
26
  ## Anatomy
27
27
 
28
- IllustrationScene renders 2 elements. A token binding names the part it applies to.
28
+ IllustrationScene renders 3 elements. A token binding names the part it applies to.
29
29
 
30
- - `root` — `<div>`, class `dds-illustrationscene`. The frame, and the shape: one of three proportions — the aspect tokens, the same three IllustrationCard takes — holding radius.surface like a Card and clipping the photograph to it. It places the card it holds over the photograph, at a share of its width that depends on the shape, so every scene across a site composes the same way.
30
+ - `root` — `<div>`, class `dds-illustrationscene`. The frame, and the shape: one of three proportions — the aspect tokens, the same three IllustrationCard takes — holding radius.surface like a Card and clipping the photograph to it. It places the card it holds over the photograph, at a share of its width that depends on the shape, so every scene across a site composes the same way. At the foot the card is a strip at most two fifths of the frame tall, and the UI in it is scaled down to fit that, as a centred card's already is — so a narrow column never has the card bury its photograph or run off the top of it. Inside a block's arrival the scene arrives in two beats: the photograph with whatever holds it, the card three steps of motion.duration.stagger later, rising onto it.
31
31
  - `image` — `<img>`, class `dds-illustrationscene__image`. The photograph, filling the frame and cropped to it from the centre. Decoration unless `alt` says otherwise: the card's `label` already describes the whole picture, so most scenes leave the photograph out of the accessibility tree. While it loads, the frame shows color.bg.surface, so the card is never left floating on nothing.
32
+ - `shade` — `<div>`, class `dds-illustrationscene__shade`. Under `shade`, a shade of color.bg.overlay between the photograph and the card, under the card only: up from the foot to just above a card at the foot and clear above it, or an oval behind a centred card and clear at the frame's edges. It is there for the card's small type, which on the glass over a bright photograph comes out below 4.5:1; the shade darkens what the glass blurs rather than the whole photograph. Decoration, with nothing in it. Rendered only when `shade` is set.
32
33
 
33
34
  Apply these classes from the generated `illustrationSceneParts` constant rather than writing the strings by hand.
34
35
 
@@ -55,7 +56,7 @@ Never for: Fitting a particular photograph. The shape is a decision about the la
55
56
  - `bottom` — The card centred along the foot of the frame, held off it by the card's own inset — for a photograph whose subject fills the top: a face, a person reaching up, a skyline
56
57
 
57
58
  Use when: Where the card sits over the photograph, so the subject of the photograph stays clear of it
58
- Never for: Anything but keeping the photograph's subject clear. The card's size is fixed by the shape; placement moves it and nothing else
59
+ Never for: Anything but keeping the photograph's subject clear. The card's width is fixed by the shape; placement moves it, and at the foot holds it to at most two fifths of the frame's height
59
60
 
60
61
  ### src — `string` **Required.**
61
62
 
@@ -67,6 +68,11 @@ Never for: A data URI holding a photograph. A scene's photograph is the heaviest
67
68
  Use when: Empty by default, because the card's `label` describes the whole picture and the photograph is decoration. Write one only where the photograph says something the label does not
68
69
  Never for: Repeating the card's label. A screen reader would hear the picture described twice
69
70
 
71
+ ### shade — `boolean` (default `false`)
72
+
73
+ Use when: The photograph is bright where the card sits — a sunny sky, a white wall — so the glass would come out mid-grey and the card's small lines would fall below AA. A shade under the card only, following the card's placement, so the rest of the photograph keeps its light.
74
+ Never for: A photograph already dark where the card sits, or darkening the whole photograph. The shade is for the card's type, and on a dark photograph it only takes light out of the scene.
75
+
70
76
  Also accepts everything from `HTMLAttributes<HTMLDivElement>`.
71
77
 
72
78
  ## Accessibility
@@ -92,6 +98,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
92
98
  Guidance only — cannot be checked automatically.
93
99
  - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
94
100
  Guidance only — cannot be checked automatically.
101
+ - **A page has at most one patterned band, between its hero and its closing call to action** — A patterned ground — the halftone, the aurora, the mesh, the grid or the rings — is what makes a band the one a reader stops at, and it only works by being the exception. So a page has at most one, placed between its hero and its closing call to action; the hero's and the call to action's own patterns are theirs and do not count, and the band never goes on either of them.
102
+
103
+ The pattern is the band's first layer, under its content and over nothing. A block that can carry one says so with its own `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows — and draws it there; a section built by hand places a Background with nothing in it as its first child. Never wrap a block in a Background: the block paints its own ground over the pattern and hides it.
104
+
105
+ Only a band whose content is stacked can carry one. Every pattern rises from the band's foot, so the band needs a heading over what it introduces, centred, with the foot left open. A band whose content runs side by side — words beside a picture, a split, columns reaching the foot — puts the glow behind the picture or under the words; it stays on its flat ground.
106
+ Guidance only — cannot be checked automatically.
95
107
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
96
108
 
97
109
  color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
@@ -231,3 +243,17 @@ import { IllustrationScene } from '@deriv-com/dds-marketing'
231
243
  // bottom
232
244
  <IllustrationScene ratio="square" src="/sample-card-image.svg" placement="bottom">{illustrationcards}</IllustrationScene>
233
245
  ```
246
+
247
+ ### A shade for a bright photograph
248
+
249
+ shade darkens under the card only, so its small type keeps AA over a bright photograph and the rest keeps its light.
250
+
251
+ ```tsx
252
+ import { IllustrationScene } from '@deriv-com/dds-marketing'
253
+
254
+ // bottom, shade
255
+ <IllustrationScene ratio="square" src="/sample-banner-art.svg" placement="bottom" shade>{illustrationcards}</IllustrationScene>
256
+
257
+ // center, shade
258
+ <IllustrationScene ratio="square" src="/sample-banner-art.svg" placement="center" shade>{illustrationcards}</IllustrationScene>
259
+ ```
@@ -31,8 +31,8 @@ ImageBanner renders 8 elements. A token binding names the part it applies to.
31
31
 
32
32
  - `root` — `<section>`, class `dds-imagebanner`. The section. It paints one of the page's three grounds and the ink that goes with it — see `ground` — and asks its own width, so the card folds on the section's measure rather than the window's. A region named by its headline.
33
33
  - `inner` — `<div>`, class `dds-imagebanner__inner`. The measure and the gutter, the same column every band holds its content in. On a phone the card gives up the gutter and runs the width of the screen, as the reference design's does.
34
- - `card` — `<div>`, class `dds-imagebanner__card`. The dark card holding everything: color.bg.brand-strong, or color.bg.surface-card-strong on the dark band so it is still a card there, with white ink on both. It clips the photograph to its rounded corners. From 48rem the words and the photograph sit side by side, in the order `mediaPosition` names; below it they stack.
35
- - `content` — `<div>`, class `dds-imagebanner__content`. The headline, the line under it and the action, inset from the card's edge. It sets no gap of its own: the step from a title to its description and the step from a description to what follows are two roles, carried by each part's own margin.
34
+ - `card` — `<div>`, class `dds-imagebanner__card`. The dark card holding everything: color.bg.brand-strong, or color.bg.surface-card-strong-on-brand-strong on the dark band so it is still a card there, with white ink on both. It clips the photograph to its rounded corners. From 48rem the words and the photograph sit side by side, in the order `mediaPosition` names; below it they stack.
35
+ - `content` — `<div>`, class `dds-imagebanner__content`. The headline, the line under it and the action, inset from the card's edge. It sets no gap of its own: the step from a title to its description and the step from a description to what follows are two roles, carried by each part's own margin. On a cover card it lays the shade under its words: color.bg.overlay across the column the words take, fading to clear from the words' end to space.section.default past the column's edge toward the photograph — across from the fold, downward on a phone — and nothing beyond that, so the photograph keeps its light everywhere the words are not.
36
36
  - `title` — `<h2>`, class `dds-imagebanner__title`. The headline. `h2` by default because the card sits under the page's own heading; `headingLevel` moves the level and never the size. Drawn at font.h2.
37
37
  - `description` — `<p>`, class `dds-imagebanner__description`. The line under the headline, at the body step and the description measure. Rendered only when `description` is set.
38
38
  - `action` — `<div>`, class `dds-imagebanner__action`. The one action, under the line. On a phone it fills the width of the card; from 48rem it is its own size. Rendered only when `action` is set.
@@ -51,7 +51,7 @@ Apply these classes from the generated `imageBannerParts` constant rather than w
51
51
 
52
52
  - `page` — The default, and the page's own white, with the dark card set into it. Most of the time: the card is already the break
53
53
  - `subtle` — The grey band, for a card that follows a white section the page wants told apart from this one. Painted as the band's tint laid over the page's own ground, so it is the same grey whatever is behind the section
54
- - `strong` — `color.bg.brand-strong`, the dark band, with the card a step lighter at color.bg.surface-card-strong so it still reads as a card. For a page whose dark band is already here and wants the card inside it
54
+ - `strong` — `color.bg.brand-strong`, the dark band, with the card a step lighter at color.bg.surface-card-strong-on-brand-strong so it still reads as a card. For a page whose dark band is already here and wants the card inside it
55
55
 
56
56
  Use when: Which of the page's three grounds the band around the card paints. The card is dark whatever this says — that is what the block is — so this is about the rhythm of the page, white, grey or dark, and never about the card. The ink follows the ground and is not a second decision.
57
57
  Never for: Making the card darker. The card is dark on every ground; painting the band dark too spends the page's one dark band on a section that was already one.
@@ -59,10 +59,10 @@ Never for: Making the card darker. The card is dark on every ground; painting th
59
59
  ### variant — `split` | `cover` (default `split`)
60
60
 
61
61
  - `split` — The default. The words in one half and the photograph filling the other, edge to edge, with one action under the words. On a phone the card runs the width of the screen and the photograph stacks with the words
62
- - `cover` — The photograph fills the whole card, with the words over it behind a scrim that darkens the side they are on and leaves the photograph clear on the other. For a photograph wide enough to be the band rather than half of it
62
+ - `cover` — The photograph fills the whole card, with the words over it on a shade that darkens the words' own column and fades out just past it, leaving the rest of the photograph clear. For a photograph wide enough to be the band rather than half of it
63
63
 
64
64
  Use when: What the photograph does: beside the words, or behind them. Both carry one action — two of the reference design's layouts.
65
- Never for: Choosing by how busy the page looks. Cover hides part of the photograph under the scrim; it is a decision about the photograph, not decoration.
65
+ Never for: Choosing by how busy the page looks. Cover lays the words on part of the photograph behind a shade; it is a decision about the photograph, not decoration.
66
66
 
67
67
  ### mediaPosition — `end` | `start` (default `end`)
68
68
 
@@ -107,6 +107,11 @@ Never for: Artwork with words in it. The cover photograph sits under a scrim and
107
107
  Use when: The photograph drifts against the scroll as the card passes through the view, the drift every block's picture shares — drawn at motion.scale.parallax and moved from motion.translate.parallax-from to motion.translate.parallax-to over the whole pass — so it reads as further away than the card — the reference design's ParallaxBanner, which this replaces. On by default, as every block's picture drifts: pass false for a card whose photograph must hold still under its button.
108
108
  Never for: Holding still for a reader who asked for less motion — it already holds still for them, and in a browser that cannot drive it from the scroll.
109
109
 
110
+ ### stackOnPhone — `boolean` (default `false`)
111
+
112
+ Use when: A cover photograph whose subject a phone's crop would put under the words or cut off — a person, a face, hands. On a phone the words stand on the card's own dark ground and the photograph follows them at the landscape shape, whole and clear; from the fold it is the cover card as before.
113
+ Never for: A split card, which stacks on a phone already, or a photograph that is setting rather than subject. Stacked, the phone loses the cover look, so keep it for the photograph that would otherwise lose its subject.
114
+
110
115
  ## Accessibility
111
116
 
112
117
  Guaranteed by the component. Write none of it by hand: the ids these attributes point at are generated per instance, so an attribute set from outside either says the same thing twice or points at nothing.
@@ -132,6 +137,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
132
137
  Guidance only — cannot be checked automatically.
133
138
  - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
134
139
  Guidance only — cannot be checked automatically.
140
+ - **A page has at most one patterned band, between its hero and its closing call to action** — A patterned ground — the halftone, the aurora, the mesh, the grid or the rings — is what makes a band the one a reader stops at, and it only works by being the exception. So a page has at most one, placed between its hero and its closing call to action; the hero's and the call to action's own patterns are theirs and do not count, and the band never goes on either of them.
141
+
142
+ The pattern is the band's first layer, under its content and over nothing. A block that can carry one says so with its own `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows — and draws it there; a section built by hand places a Background with nothing in it as its first child. Never wrap a block in a Background: the block paints its own ground over the pattern and hides it.
143
+
144
+ Only a band whose content is stacked can carry one. Every pattern rises from the band's foot, so the band needs a heading over what it introduces, centred, with the foot left open. A band whose content runs side by side — words beside a picture, a split, columns reaching the foot — puts the glow behind the picture or under the words; it stays on its flat ground.
145
+ Guidance only — cannot be checked automatically.
135
146
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
136
147
 
137
148
  color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
@@ -209,6 +220,9 @@ Two things genuinely have no logical form and are not covered by this. A CSS gra
209
220
  A list of features is the content there, ruled lines a reader goes down; this card is a photograph and one action
210
221
  → use `FeatureBullets` instead.
211
222
 
223
+ ❌ variant=split + stackOnPhone=true
224
+ A split card already stacks its words and its photograph on a phone; there is nothing for this to change.
225
+
212
226
  ## Example
213
227
 
214
228
  ```tsx
@@ -280,3 +294,14 @@ import { AspectRatio, ImageBanner, Link } from '@deriv-com/dds-marketing'
280
294
  // Inside a section that has its h2 — headingLevel h3
281
295
  <ImageBanner variant="split" parallax title="Life at Deriv" description="We combine human values with AI precision. Collaboration, integrity and continuous learning guide every project, in every office and every time zone." action={<Link href="/careers/culture" tone="inherit">Culture at Deriv</Link>} media={<AspectRatio ratio="landscape" />} headingLevel="h3" />
282
296
  ```
297
+
298
+ ### Stacked on a phone
299
+
300
+ stackOnPhone: below the fold the words stand on the card and the photograph follows them whole, so a person framed for the desktop strip keeps their head.
301
+
302
+ ```tsx
303
+ import { AspectRatio, Button, ImageBanner } from '@deriv-com/dds-marketing'
304
+
305
+ // cover, stackOnPhone
306
+ <ImageBanner variant="cover" title="Trade on Deriv MT5" description="Forex, stocks, commodities and derived indices on the platform professionals use, with charting and order types built in." action={<Button variant="primary" tone="inverse" href="/platforms/deriv-mt5">Open a Deriv MT5 account</Button>} media={<AspectRatio ratio="landscape" />} stackOnPhone />
307
+ ```
@@ -137,6 +137,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
137
137
  Guidance only — cannot be checked automatically.
138
138
  - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
139
139
  Guidance only — cannot be checked automatically.
140
+ - **A page has at most one patterned band, between its hero and its closing call to action** — A patterned ground — the halftone, the aurora, the mesh, the grid or the rings — is what makes a band the one a reader stops at, and it only works by being the exception. So a page has at most one, placed between its hero and its closing call to action; the hero's and the call to action's own patterns are theirs and do not count, and the band never goes on either of them.
141
+
142
+ The pattern is the band's first layer, under its content and over nothing. A block that can carry one says so with its own `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows — and draws it there; a section built by hand places a Background with nothing in it as its first child. Never wrap a block in a Background: the block paints its own ground over the pattern and hides it.
143
+
144
+ Only a band whose content is stacked can carry one. Every pattern rises from the band's foot, so the band needs a heading over what it introduces, centred, with the foot left open. A band whose content runs side by side — words beside a picture, a split, columns reaching the foot — puts the glow behind the picture or under the words; it stays on its flat ground.
145
+ Guidance only — cannot be checked automatically.
140
146
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
141
147
 
142
148
  color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
@@ -50,7 +50,7 @@ Link renders 3 elements. A token binding names the part it applies to.
50
50
 
51
51
  The ink is `color.bg.brand`, which is a background role doing a foreground's job, and that is worth naming rather than hiding. `color.fg.brand` exists and is the readable one at 7.75:1 — but it is the dark red a Badge sets on a pale tint, not the coral the page is built from, and a link that did not match the buttons would read as a different kind of thing. The brand primary is one colour in this system and it is spelled `color.bg.brand`; a `fg` alias for the same value would be a second name for one decision.
52
52
 
53
- A link whose ink is the ground's gets its underline back on hover, and only on hover. That covers a standalone link at `tone: inherit` — one on a brand card, a dark band, a scrim. The list variant has the same problem and answers it with its mark instead: a column whose rows underline one at a time reads as a table of contents being corrected. At rest they are told apart by position, which is what a column of links or a line of its own already provides; under the pointer there was nothing at all, because the colour cannot change when it belongs to the ground and there is no mark to move. Product reaches the same conclusion from the other side, keeping the underline at all times for `tone: inherit` — these designs do not have one at rest, so it arrives with the pointer instead. It is in the impl sheet because `structure` carries no state.
53
+ A standalone link at `tone: inherit` — one on a brand card, a dark band, a scrim — draws no underline either, at rest or under the pointer, the same as at `tone: brand`. Its colour belongs to the ground and so cannot change on hover; what answers the pointer is the mark, which moves along the way it already points, as it does on every standalone link. Product keeps an underline at `tone: inherit` at all times; these designs have none on a standalone link anywhere, and a line that appears on one tone and not the other would make the two read as different kinds of link.
54
54
  - `icon-leading` — `<span>`, class `dds-link__icon-leading`. A glyph before the words, when the destination has a mark a reader recognises faster than its name — a document, a download, a platform. Rare in running copy and ordinary in the standalone variant, which is where it earns its place.
55
55
 
56
56
  A box of the tab's own rather than the glyph itself, because Icon clones onto the SVG and this part is the place in the line. Drawn at `icon.size.xs` — sixteen, a step below what a control takes, because this sits beside words rather than inside a target and twenty next to a sixteen-pixel label outweighs the words it is there to qualify. The part carries the gap and nothing else: the colour comes from the link, which is what `fill="currentColor"` on the glyph is for.
@@ -179,6 +179,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
179
179
  Guidance only — cannot be checked automatically.
180
180
  - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
181
181
  Guidance only — cannot be checked automatically.
182
+ - **A page has at most one patterned band, between its hero and its closing call to action** — A patterned ground — the halftone, the aurora, the mesh, the grid or the rings — is what makes a band the one a reader stops at, and it only works by being the exception. So a page has at most one, placed between its hero and its closing call to action; the hero's and the call to action's own patterns are theirs and do not count, and the band never goes on either of them.
183
+
184
+ The pattern is the band's first layer, under its content and over nothing. A block that can carry one says so with its own `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows — and draws it there; a section built by hand places a Background with nothing in it as its first child. Never wrap a block in a Background: the block paints its own ground over the pattern and hides it.
185
+
186
+ Only a band whose content is stacked can carry one. Every pattern rises from the band's foot, so the band needs a heading over what it introduces, centred, with the foot left open. A band whose content runs side by side — words beside a picture, a split, columns reaching the foot — puts the glow behind the picture or under the words; it stays on its flat ground.
187
+ Guidance only — cannot be checked automatically.
182
188
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
183
189
 
184
190
  color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
@@ -54,7 +54,7 @@ Apply these classes from the generated `logoColumnsParts` constant rather than w
54
54
 
55
55
  - `page` — The page's own white, with tiles at the recessed gray. For full-colour logos drawn for a light ground
56
56
  - `subtle` — The grey band, with white tiles on it. For full-colour logos, where the section needs setting apart from the ones around it. Painted as the band's tint over the page's own ground, so it is the same grey whatever is behind the section
57
- - `strong` — The default. `color.bg.brand-strong`, the dark band, with white words and tiles at color.bg.surface-card-strong — gray.900 in both themes, so the wall is a set of tiles a step lighter than the band. The ground white wordmarks are drawn for
57
+ - `strong` — The default. `color.bg.brand-strong`, the dark band, with white words and tiles at color.bg.surface-card-strong-on-brand-strong — slate.850 in light and slate.900 in dark, a step above the band in both, so the wall is a set of tiles a step lighter than the band. The ground white wordmarks are drawn for
58
58
 
59
59
  Use when: Which of the page's grounds the section paints, and with it the tiles' fill: the recessed surface on the page, the raised white on the grey band, and the strong card on the dark band. The dark band is the default, the reference design's: logos are most often drawn as white wordmarks for a dark ground, and a set of them reads as one wall there.
60
60
  Never for: Marking importance. Every section on a page painted dark is a page with no emphasis left, and a reader stops reading the grounds as meaning anything. Alternating for its own sake is the same mistake more slowly.
@@ -121,6 +121,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
121
121
  Guidance only — cannot be checked automatically.
122
122
  - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
123
123
  Guidance only — cannot be checked automatically.
124
+ - **A page has at most one patterned band, between its hero and its closing call to action** — A patterned ground — the halftone, the aurora, the mesh, the grid or the rings — is what makes a band the one a reader stops at, and it only works by being the exception. So a page has at most one, placed between its hero and its closing call to action; the hero's and the call to action's own patterns are theirs and do not count, and the band never goes on either of them.
125
+
126
+ The pattern is the band's first layer, under its content and over nothing. A block that can carry one says so with its own `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows — and draws it there; a section built by hand places a Background with nothing in it as its first child. Never wrap a block in a Background: the block paints its own ground over the pattern and hides it.
127
+
128
+ Only a band whose content is stacked can carry one. Every pattern rises from the band's foot, so the band needs a heading over what it introduces, centred, with the foot left open. A band whose content runs side by side — words beside a picture, a split, columns reaching the foot — puts the glow behind the picture or under the words; it stays on its flat ground.
129
+ Guidance only — cannot be checked automatically.
124
130
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
125
131
 
126
132
  color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
@@ -27,7 +27,7 @@ LogoColumns' horizontal form, for a page where the claim leads and the logos sig
27
27
 
28
28
  LogoRows renders 10 elements. A token binding names the part it applies to.
29
29
 
30
- - `root` — `<section>`, class `dds-logorows`. The section. It paints the ground and the ink to go with it — see `ground` — and asks its own width. A region named by its heading. It clips with `overflow: clip` rather than `hidden`, which would make it a scroll container and freeze the row's scroll-driven movement.
30
+ - `root` — `<section>`, class `dds-logorows`. The section. It paints the ground and the ink to go with it — see `ground` — and asks its own width. A region named by its heading. It clips with `overflow: clip` rather than `hidden`, which would make it a scroll container and freeze the row's scroll-driven movement. Given `background`, it draws the page's one patterned band: a Background as its first layer, under everything it holds, in the tone of its ground.
31
31
  - `inner` — `<div>`, class `dds-logorows__inner`. The measure and the gutter, the same column every band holds its content in, and the step from the words to the rows: space.heading.content.
32
32
  - `header` — `<div>`, class `dds-logorows__header`. The heading, the line under it and the way on. Ranged to the start on a phone and centred from the fold, FeatureCards' arrangement.
33
33
  - `title` — `<h2>`, class `dds-logorows__title`. The claim the logos back. `h2`, because a section sits under the page's own heading.
@@ -51,13 +51,24 @@ Apply these classes from the generated `logoRowsParts` constant rather than writ
51
51
 
52
52
  - `page` — The page's own white, with tiles at the recessed gray. For full-colour logos drawn for a light ground
53
53
  - `subtle` — The grey band, with white tiles on it. For full-colour logos, where the section needs setting apart from the ones around it. Painted as the band's tint over the page's own ground, so it is the same grey whatever is behind the section
54
- - `strong` — The default. `color.bg.brand-strong`, the dark band, with white words and tiles at color.bg.surface-card-strong — gray.900 in both themes, so the row is a set of tiles a step lighter than the band. The ground white wordmarks are drawn for
54
+ - `strong` — The default. `color.bg.brand-strong`, the dark band, with white words and tiles at color.bg.surface-card-strong-on-brand-strong — slate.850 in light and slate.900 in dark, a step above the band in both, so the row is a set of tiles a step lighter than the band. The ground white wordmarks are drawn for
55
55
 
56
56
  Use when: Which of the page's grounds the section paints, and with it the tiles' fill: the recessed surface on the page, the raised white on the grey band, and the strong card on the dark band. The dark band is the default, the reference design's: logos are most often drawn as white wordmarks for a dark ground, and a set of them reads as one row there.
57
57
  Never for: Marking importance. Every section on a page painted dark is a page with no emphasis left, and a reader stops reading the grounds as meaning anything. Alternating for its own sake is the same mistake more slowly.
58
58
 
59
59
  And never the brand's own coral, `color.bg.brand`, which is not offered here. That ground belongs to the band that asks a reader to do something — the one place on a page where the brand colour is the point rather than decoration — and a feature section wearing it is a page with two calls to action, one of which does nothing. It is `color.bg.brand-strong` that this offers: the dark brand ground, which is a band breaking a page rather than a band asking for something.
60
60
 
61
+ ### background — `halftone` | `aurora` | `mesh` | `grid` | `rings`
62
+
63
+ - `halftone` — A field of coral dots that grow towards a soft glow at the band's foot and settle to a fine screen away from it.
64
+ - `aurora` — Curtains of the brand's light rising from the band's foot and swaying slowly.
65
+ - `mesh` — The band in the brand's reds folded into one another like a liquid — the loudest of the five, for a dark band.
66
+ - `grid` — Hairlines a pitch apart rising from a soft bloom at the band's foot — the quietest, and the one to reach for first.
67
+ - `rings` — Hairline circles spreading out from the middle of the band's foot.
68
+
69
+ Use when: The page's one patterned band, between its hero and its closing call to action — a band a reader should stop at. The pattern is drawn by Background as the section's first layer, under its content and over nothing, in the tone of the ground: the light pattern on `page`, the same on the grey of `subtle`, the dark one on `strong`. Every pattern rises from the band's foot, which this block leaves open under its content. Leave it out and the band is its flat ground, as most bands on a page are.
70
+ Never for: More than one band on a page, or a band that is already the hero or the call to action — those carry their own patterns. One pattern is what makes a band the one a reader remembers; two make neither, and a page of them is noise. Never wrap this block in a Background instead: it paints its own ground over whatever is behind it, so the pattern would be hidden, and the pattern belongs under the content, not around it.
71
+
61
72
  ### title — `string` **Required.**
62
73
 
63
74
  Use when: Always. The one claim the logos back, in the fewest words that say it — "Trusted by leading platforms worldwide".
@@ -105,6 +116,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
105
116
  Guidance only — cannot be checked automatically.
106
117
  - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
107
118
  Guidance only — cannot be checked automatically.
119
+ - **A page has at most one patterned band, between its hero and its closing call to action** — A patterned ground — the halftone, the aurora, the mesh, the grid or the rings — is what makes a band the one a reader stops at, and it only works by being the exception. So a page has at most one, placed between its hero and its closing call to action; the hero's and the call to action's own patterns are theirs and do not count, and the band never goes on either of them.
120
+
121
+ The pattern is the band's first layer, under its content and over nothing. A block that can carry one says so with its own `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows — and draws it there; a section built by hand places a Background with nothing in it as its first child. Never wrap a block in a Background: the block paints its own ground over the pattern and hides it.
122
+
123
+ Only a band whose content is stacked can carry one. Every pattern rises from the band's foot, so the band needs a heading over what it introduces, centred, with the foot left open. A band whose content runs side by side — words beside a picture, a split, columns reaching the foot — puts the glow behind the picture or under the words; it stays on its flat ground.
124
+ Guidance only — cannot be checked automatically.
108
125
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
109
126
 
110
127
  color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
@@ -214,3 +231,26 @@ import { Link, LogoRows } from '@deriv-com/dds-marketing'
214
231
  // ground="subtle"
215
232
  <LogoRows title="Trusted by leading platforms worldwide" description="Deposit and withdraw with the payment methods your business already relies on." link={<Link variant="standalone" href="#partners">View all partners</Link>} logos={[{"name":"Visa","src":"/sample-card-image.svg"},{"name":"Mastercard","src":"/sample-card-image.svg"},{"name":"Skrill","src":"/sample-card-image.svg"},{"name":"Neteller","src":"/sample-card-image.svg"},{"name":"Perfect Money","src":"/sample-card-image.svg"},{"name":"Jeton","src":"/sample-card-image.svg"},{"name":"Sticpay","src":"/sample-card-image.svg"},{"name":"Bitcoin","src":"/sample-card-image.svg"},{"name":"Ethereum","src":"/sample-card-image.svg"},{"name":"Tether","src":"/sample-card-image.svg"}]} ground="subtle" />
216
233
  ```
234
+
235
+ ### The page's one patterned band
236
+
237
+ One band per page, between the hero and the closing call to action, its pattern drawn under the content in the tone of its ground.
238
+
239
+ ```tsx
240
+ import { Link, LogoRows } from '@deriv-com/dds-marketing'
241
+
242
+ // grid on page
243
+ <LogoRows title="Trusted by leading platforms worldwide" description="Deposit and withdraw with the payment methods your business already relies on." link={<Link variant="standalone" href="#partners">View all partners</Link>} logos={[{"name":"Visa","src":"/sample-card-image.svg"},{"name":"Mastercard","src":"/sample-card-image.svg"},{"name":"Skrill","src":"/sample-card-image.svg"},{"name":"Neteller","src":"/sample-card-image.svg"},{"name":"Perfect Money","src":"/sample-card-image.svg"},{"name":"Jeton","src":"/sample-card-image.svg"},{"name":"Sticpay","src":"/sample-card-image.svg"},{"name":"Bitcoin","src":"/sample-card-image.svg"},{"name":"Ethereum","src":"/sample-card-image.svg"},{"name":"Tether","src":"/sample-card-image.svg"}]} background="grid" ground="page" />
244
+
245
+ // rings on subtle
246
+ <LogoRows title="Trusted by leading platforms worldwide" description="Deposit and withdraw with the payment methods your business already relies on." link={<Link variant="standalone" href="#partners">View all partners</Link>} logos={[{"name":"Visa","src":"/sample-card-image.svg"},{"name":"Mastercard","src":"/sample-card-image.svg"},{"name":"Skrill","src":"/sample-card-image.svg"},{"name":"Neteller","src":"/sample-card-image.svg"},{"name":"Perfect Money","src":"/sample-card-image.svg"},{"name":"Jeton","src":"/sample-card-image.svg"},{"name":"Sticpay","src":"/sample-card-image.svg"},{"name":"Bitcoin","src":"/sample-card-image.svg"},{"name":"Ethereum","src":"/sample-card-image.svg"},{"name":"Tether","src":"/sample-card-image.svg"}]} background="rings" ground="subtle" />
247
+
248
+ // halftone on strong
249
+ <LogoRows title="Trusted by leading platforms worldwide" description="Deposit and withdraw with the payment methods your business already relies on." link={<Link variant="standalone" href="#partners">View all partners</Link>} logos={[{"name":"Visa","src":"/sample-card-image.svg"},{"name":"Mastercard","src":"/sample-card-image.svg"},{"name":"Skrill","src":"/sample-card-image.svg"},{"name":"Neteller","src":"/sample-card-image.svg"},{"name":"Perfect Money","src":"/sample-card-image.svg"},{"name":"Jeton","src":"/sample-card-image.svg"},{"name":"Sticpay","src":"/sample-card-image.svg"},{"name":"Bitcoin","src":"/sample-card-image.svg"},{"name":"Ethereum","src":"/sample-card-image.svg"},{"name":"Tether","src":"/sample-card-image.svg"}]} background="halftone" ground="strong" />
250
+
251
+ // aurora on strong
252
+ <LogoRows title="Trusted by leading platforms worldwide" description="Deposit and withdraw with the payment methods your business already relies on." link={<Link variant="standalone" href="#partners">View all partners</Link>} logos={[{"name":"Visa","src":"/sample-card-image.svg"},{"name":"Mastercard","src":"/sample-card-image.svg"},{"name":"Skrill","src":"/sample-card-image.svg"},{"name":"Neteller","src":"/sample-card-image.svg"},{"name":"Perfect Money","src":"/sample-card-image.svg"},{"name":"Jeton","src":"/sample-card-image.svg"},{"name":"Sticpay","src":"/sample-card-image.svg"},{"name":"Bitcoin","src":"/sample-card-image.svg"},{"name":"Ethereum","src":"/sample-card-image.svg"},{"name":"Tether","src":"/sample-card-image.svg"}]} background="aurora" ground="strong" />
253
+
254
+ // mesh on strong
255
+ <LogoRows title="Trusted by leading platforms worldwide" description="Deposit and withdraw with the payment methods your business already relies on." link={<Link variant="standalone" href="#partners">View all partners</Link>} logos={[{"name":"Visa","src":"/sample-card-image.svg"},{"name":"Mastercard","src":"/sample-card-image.svg"},{"name":"Skrill","src":"/sample-card-image.svg"},{"name":"Neteller","src":"/sample-card-image.svg"},{"name":"Perfect Money","src":"/sample-card-image.svg"},{"name":"Jeton","src":"/sample-card-image.svg"},{"name":"Sticpay","src":"/sample-card-image.svg"},{"name":"Bitcoin","src":"/sample-card-image.svg"},{"name":"Ethereum","src":"/sample-card-image.svg"},{"name":"Tether","src":"/sample-card-image.svg"}]} background="mesh" ground="strong" />
256
+ ```
@@ -102,6 +102,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
102
102
  Guidance only — cannot be checked automatically.
103
103
  - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
104
104
  Guidance only — cannot be checked automatically.
105
+ - **A page has at most one patterned band, between its hero and its closing call to action** — A patterned ground — the halftone, the aurora, the mesh, the grid or the rings — is what makes a band the one a reader stops at, and it only works by being the exception. So a page has at most one, placed between its hero and its closing call to action; the hero's and the call to action's own patterns are theirs and do not count, and the band never goes on either of them.
106
+
107
+ The pattern is the band's first layer, under its content and over nothing. A block that can carry one says so with its own `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows — and draws it there; a section built by hand places a Background with nothing in it as its first child. Never wrap a block in a Background: the block paints its own ground over the pattern and hides it.
108
+
109
+ Only a band whose content is stacked can carry one. Every pattern rises from the band's foot, so the band needs a heading over what it introduces, centred, with the foot left open. A band whose content runs side by side — words beside a picture, a split, columns reaching the foot — puts the glow behind the picture or under the words; it stays on its flat ground.
110
+ Guidance only — cannot be checked automatically.
105
111
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
106
112
 
107
113
  color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
@@ -302,6 +302,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
302
302
  Guidance only — cannot be checked automatically.
303
303
  - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
304
304
  Guidance only — cannot be checked automatically.
305
+ - **A page has at most one patterned band, between its hero and its closing call to action** — A patterned ground — the halftone, the aurora, the mesh, the grid or the rings — is what makes a band the one a reader stops at, and it only works by being the exception. So a page has at most one, placed between its hero and its closing call to action; the hero's and the call to action's own patterns are theirs and do not count, and the band never goes on either of them.
306
+
307
+ The pattern is the band's first layer, under its content and over nothing. A block that can carry one says so with its own `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows — and draws it there; a section built by hand places a Background with nothing in it as its first child. Never wrap a block in a Background: the block paints its own ground over the pattern and hides it.
308
+
309
+ Only a band whose content is stacked can carry one. Every pattern rises from the band's foot, so the band needs a heading over what it introduces, centred, with the foot left open. A band whose content runs side by side — words beside a picture, a split, columns reaching the foot — puts the glow behind the picture or under the words; it stays on its flat ground.
310
+ Guidance only — cannot be checked automatically.
305
311
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
306
312
 
307
313
  color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
@@ -125,6 +125,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
125
125
  Guidance only — cannot be checked automatically.
126
126
  - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
127
127
  Guidance only — cannot be checked automatically.
128
+ - **A page has at most one patterned band, between its hero and its closing call to action** — A patterned ground — the halftone, the aurora, the mesh, the grid or the rings — is what makes a band the one a reader stops at, and it only works by being the exception. So a page has at most one, placed between its hero and its closing call to action; the hero's and the call to action's own patterns are theirs and do not count, and the band never goes on either of them.
129
+
130
+ The pattern is the band's first layer, under its content and over nothing. A block that can carry one says so with its own `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows — and draws it there; a section built by hand places a Background with nothing in it as its first child. Never wrap a block in a Background: the block paints its own ground over the pattern and hides it.
131
+
132
+ Only a band whose content is stacked can carry one. Every pattern rises from the band's foot, so the band needs a heading over what it introduces, centred, with the foot left open. A band whose content runs side by side — words beside a picture, a split, columns reaching the foot — puts the glow behind the picture or under the words; it stays on its flat ground.
133
+ Guidance only — cannot be checked automatically.
128
134
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
129
135
 
130
136
  color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
@@ -191,6 +191,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
191
191
  Guidance only — cannot be checked automatically.
192
192
  - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
193
193
  Guidance only — cannot be checked automatically.
194
+ - **A page has at most one patterned band, between its hero and its closing call to action** — A patterned ground — the halftone, the aurora, the mesh, the grid or the rings — is what makes a band the one a reader stops at, and it only works by being the exception. So a page has at most one, placed between its hero and its closing call to action; the hero's and the call to action's own patterns are theirs and do not count, and the band never goes on either of them.
195
+
196
+ The pattern is the band's first layer, under its content and over nothing. A block that can carry one says so with its own `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows — and draws it there; a section built by hand places a Background with nothing in it as its first child. Never wrap a block in a Background: the block paints its own ground over the pattern and hides it.
197
+
198
+ Only a band whose content is stacked can carry one. Every pattern rises from the band's foot, so the band needs a heading over what it introduces, centred, with the foot left open. A band whose content runs side by side — words beside a picture, a split, columns reaching the foot — puts the glow behind the picture or under the words; it stays on its flat ground.
199
+ Guidance only — cannot be checked automatically.
194
200
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
195
201
 
196
202
  color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
@@ -91,6 +91,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
91
91
  Guidance only — cannot be checked automatically.
92
92
  - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
93
93
  Guidance only — cannot be checked automatically.
94
+ - **A page has at most one patterned band, between its hero and its closing call to action** — A patterned ground — the halftone, the aurora, the mesh, the grid or the rings — is what makes a band the one a reader stops at, and it only works by being the exception. So a page has at most one, placed between its hero and its closing call to action; the hero's and the call to action's own patterns are theirs and do not count, and the band never goes on either of them.
95
+
96
+ The pattern is the band's first layer, under its content and over nothing. A block that can carry one says so with its own `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows — and draws it there; a section built by hand places a Background with nothing in it as its first child. Never wrap a block in a Background: the block paints its own ground over the pattern and hides it.
97
+
98
+ Only a band whose content is stacked can carry one. Every pattern rises from the band's foot, so the band needs a heading over what it introduces, centred, with the foot left open. A band whose content runs side by side — words beside a picture, a split, columns reaching the foot — puts the glow behind the picture or under the words; it stays on its flat ground.
99
+ Guidance only — cannot be checked automatically.
94
100
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
95
101
 
96
102
  color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
@@ -161,6 +161,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
161
161
  Guidance only — cannot be checked automatically.
162
162
  - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
163
163
  Guidance only — cannot be checked automatically.
164
+ - **A page has at most one patterned band, between its hero and its closing call to action** — A patterned ground — the halftone, the aurora, the mesh, the grid or the rings — is what makes a band the one a reader stops at, and it only works by being the exception. So a page has at most one, placed between its hero and its closing call to action; the hero's and the call to action's own patterns are theirs and do not count, and the band never goes on either of them.
165
+
166
+ The pattern is the band's first layer, under its content and over nothing. A block that can carry one says so with its own `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows — and draws it there; a section built by hand places a Background with nothing in it as its first child. Never wrap a block in a Background: the block paints its own ground over the pattern and hides it.
167
+
168
+ Only a band whose content is stacked can carry one. Every pattern rises from the band's foot, so the band needs a heading over what it introduces, centred, with the foot left open. A band whose content runs side by side — words beside a picture, a split, columns reaching the foot — puts the glow behind the picture or under the words; it stays on its flat ground.
169
+ Guidance only — cannot be checked automatically.
164
170
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
165
171
 
166
172
  color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
@@ -150,6 +150,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
150
150
  Guidance only — cannot be checked automatically.
151
151
  - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
152
152
  Guidance only — cannot be checked automatically.
153
+ - **A page has at most one patterned band, between its hero and its closing call to action** — A patterned ground — the halftone, the aurora, the mesh, the grid or the rings — is what makes a band the one a reader stops at, and it only works by being the exception. So a page has at most one, placed between its hero and its closing call to action; the hero's and the call to action's own patterns are theirs and do not count, and the band never goes on either of them.
154
+
155
+ The pattern is the band's first layer, under its content and over nothing. A block that can carry one says so with its own `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows — and draws it there; a section built by hand places a Background with nothing in it as its first child. Never wrap a block in a Background: the block paints its own ground over the pattern and hides it.
156
+
157
+ Only a band whose content is stacked can carry one. Every pattern rises from the band's foot, so the band needs a heading over what it introduces, centred, with the foot left open. A band whose content runs side by side — words beside a picture, a split, columns reaching the foot — puts the glow behind the picture or under the words; it stays on its flat ground.
158
+ Guidance only — cannot be checked automatically.
153
159
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
154
160
 
155
161
  color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
@@ -74,6 +74,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
74
74
  Guidance only — cannot be checked automatically.
75
75
  - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
76
76
  Guidance only — cannot be checked automatically.
77
+ - **A page has at most one patterned band, between its hero and its closing call to action** — A patterned ground — the halftone, the aurora, the mesh, the grid or the rings — is what makes a band the one a reader stops at, and it only works by being the exception. So a page has at most one, placed between its hero and its closing call to action; the hero's and the call to action's own patterns are theirs and do not count, and the band never goes on either of them.
78
+
79
+ The pattern is the band's first layer, under its content and over nothing. A block that can carry one says so with its own `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows — and draws it there; a section built by hand places a Background with nothing in it as its first child. Never wrap a block in a Background: the block paints its own ground over the pattern and hides it.
80
+
81
+ Only a band whose content is stacked can carry one. Every pattern rises from the band's foot, so the band needs a heading over what it introduces, centred, with the foot left open. A band whose content runs side by side — words beside a picture, a split, columns reaching the foot — puts the glow behind the picture or under the words; it stays on its flat ground.
82
+ Guidance only — cannot be checked automatically.
77
83
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
78
84
 
79
85
  color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
@@ -112,6 +112,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
112
112
  Guidance only — cannot be checked automatically.
113
113
  - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
114
114
  Guidance only — cannot be checked automatically.
115
+ - **A page has at most one patterned band, between its hero and its closing call to action** — A patterned ground — the halftone, the aurora, the mesh, the grid or the rings — is what makes a band the one a reader stops at, and it only works by being the exception. So a page has at most one, placed between its hero and its closing call to action; the hero's and the call to action's own patterns are theirs and do not count, and the band never goes on either of them.
116
+
117
+ The pattern is the band's first layer, under its content and over nothing. A block that can carry one says so with its own `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows — and draws it there; a section built by hand places a Background with nothing in it as its first child. Never wrap a block in a Background: the block paints its own ground over the pattern and hides it.
118
+
119
+ Only a band whose content is stacked can carry one. Every pattern rises from the band's foot, so the band needs a heading over what it introduces, centred, with the foot left open. A band whose content runs side by side — words beside a picture, a split, columns reaching the foot — puts the glow behind the picture or under the words; it stays on its flat ground.
120
+ Guidance only — cannot be checked automatically.
115
121
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
116
122
 
117
123
  color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
@@ -115,6 +115,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
115
115
  Guidance only — cannot be checked automatically.
116
116
  - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
117
117
  Guidance only — cannot be checked automatically.
118
+ - **A page has at most one patterned band, between its hero and its closing call to action** — A patterned ground — the halftone, the aurora, the mesh, the grid or the rings — is what makes a band the one a reader stops at, and it only works by being the exception. So a page has at most one, placed between its hero and its closing call to action; the hero's and the call to action's own patterns are theirs and do not count, and the band never goes on either of them.
119
+
120
+ The pattern is the band's first layer, under its content and over nothing. A block that can carry one says so with its own `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows — and draws it there; a section built by hand places a Background with nothing in it as its first child. Never wrap a block in a Background: the block paints its own ground over the pattern and hides it.
121
+
122
+ Only a band whose content is stacked can carry one. Every pattern rises from the band's foot, so the band needs a heading over what it introduces, centred, with the foot left open. A band whose content runs side by side — words beside a picture, a split, columns reaching the foot — puts the glow behind the picture or under the words; it stays on its flat ground.
123
+ Guidance only — cannot be checked automatically.
118
124
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
119
125
 
120
126
  color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
@@ -155,6 +155,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
155
155
  Guidance only — cannot be checked automatically.
156
156
  - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
157
157
  Guidance only — cannot be checked automatically.
158
+ - **A page has at most one patterned band, between its hero and its closing call to action** — A patterned ground — the halftone, the aurora, the mesh, the grid or the rings — is what makes a band the one a reader stops at, and it only works by being the exception. So a page has at most one, placed between its hero and its closing call to action; the hero's and the call to action's own patterns are theirs and do not count, and the band never goes on either of them.
159
+
160
+ The pattern is the band's first layer, under its content and over nothing. A block that can carry one says so with its own `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows — and draws it there; a section built by hand places a Background with nothing in it as its first child. Never wrap a block in a Background: the block paints its own ground over the pattern and hides it.
161
+
162
+ Only a band whose content is stacked can carry one. Every pattern rises from the band's foot, so the band needs a heading over what it introduces, centred, with the foot left open. A band whose content runs side by side — words beside a picture, a split, columns reaching the foot — puts the glow behind the picture or under the words; it stays on its flat ground.
163
+ Guidance only — cannot be checked automatically.
158
164
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
159
165
 
160
166
  color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
@@ -106,6 +106,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
106
106
  Guidance only — cannot be checked automatically.
107
107
  - **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, CardButton and TextInput simultaneously.
108
108
  Guidance only — cannot be checked automatically.
109
+ - **A page has at most one patterned band, between its hero and its closing call to action** — A patterned ground — the halftone, the aurora, the mesh, the grid or the rings — is what makes a band the one a reader stops at, and it only works by being the exception. So a page has at most one, placed between its hero and its closing call to action; the hero's and the call to action's own patterns are theirs and do not count, and the band never goes on either of them.
110
+
111
+ The pattern is the band's first layer, under its content and over nothing. A block that can carry one says so with its own `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows — and draws it there; a section built by hand places a Background with nothing in it as its first child. Never wrap a block in a Background: the block paints its own ground over the pattern and hides it.
112
+
113
+ Only a band whose content is stacked can carry one. Every pattern rises from the band's foot, so the band needs a heading over what it introduces, centred, with the foot left open. A band whose content runs side by side — words beside a picture, a split, columns reaching the foot — puts the glow behind the picture or under the words; it stays on its flat ground.
114
+ Guidance only — cannot be checked automatically.
109
115
  - **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
110
116
 
111
117
  color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.