@deriv-com/dds-marketing 1.1.2 → 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 (401) hide show
  1. package/.llm/components/accordion.md +10 -0
  2. package/.llm/components/accordionitem.md +10 -0
  3. package/.llm/components/aspectratio.md +10 -0
  4. package/.llm/components/awards.md +10 -0
  5. package/.llm/components/background.md +52 -9
  6. package/.llm/components/badge.md +13 -3
  7. package/.llm/components/bottomsheet.md +13 -3
  8. package/.llm/components/breadcrumb.md +10 -0
  9. package/.llm/components/breadcrumbitem.md +10 -0
  10. package/.llm/components/button.md +13 -3
  11. package/.llm/components/buttonicon.md +17 -7
  12. package/.llm/components/card.md +11 -1
  13. package/.llm/components/cardbody.md +12 -2
  14. package/.llm/components/cardbutton.md +10 -0
  15. package/.llm/components/checkbox.md +7 -1
  16. package/.llm/components/comparisoncards.md +13 -3
  17. package/.llm/components/comparisontable.md +10 -0
  18. package/.llm/components/ctabanner.md +10 -0
  19. package/.llm/components/ctabannerslider.md +10 -0
  20. package/.llm/components/datatable.md +10 -0
  21. package/.llm/components/divider.md +10 -0
  22. package/.llm/components/documentlink.md +237 -0
  23. package/.llm/components/documents.md +268 -0
  24. package/.llm/components/downloadbanner.md +11 -1
  25. package/.llm/components/dropdownmenu.md +15 -5
  26. package/.llm/components/estimator.md +342 -0
  27. package/.llm/components/faqaccordion.md +10 -0
  28. package/.llm/components/featurebullets.md +10 -0
  29. package/.llm/components/featurecards.md +47 -3
  30. package/.llm/components/featurecardscarousel.md +11 -1
  31. package/.llm/components/featurescroll.md +10 -0
  32. package/.llm/components/featuresplit.md +10 -0
  33. package/.llm/components/featurestack.md +10 -0
  34. package/.llm/components/featuretabs.md +369 -0
  35. package/.llm/components/filterchip.md +11 -1
  36. package/.llm/components/footer.md +10 -0
  37. package/.llm/components/footergroup.md +10 -0
  38. package/.llm/components/grid.md +34 -1
  39. package/.llm/components/icon.md +15 -5
  40. package/.llm/components/illustrationcard.md +56 -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 +33 -3
  46. package/.llm/components/imagebanner.md +35 -6
  47. package/.llm/components/landinghero.md +10 -0
  48. package/.llm/components/link.md +12 -2
  49. package/.llm/components/logocolumns.md +11 -1
  50. package/.llm/components/logorows.md +46 -2
  51. package/.llm/components/menuitem.md +12 -2
  52. package/.llm/components/navbar.md +11 -1
  53. package/.llm/components/navbaritem.md +10 -0
  54. package/.llm/components/navbarmenu.md +10 -0
  55. package/.llm/components/navbarmenugroup.md +10 -0
  56. package/.llm/components/navbarpanel.md +10 -0
  57. package/.llm/components/navbarswitcher.md +16 -6
  58. package/.llm/components/navbarswitcheroption.md +10 -0
  59. package/.llm/components/option.md +11 -1
  60. package/.llm/components/pageheader.md +10 -0
  61. package/.llm/components/pagination.md +10 -0
  62. package/.llm/components/paginationdots.md +10 -0
  63. package/.llm/components/producthero.md +33 -4
  64. package/.llm/components/progressbar.md +305 -0
  65. package/.llm/components/removablechip.md +11 -1
  66. package/.llm/components/resourcebanner.md +10 -0
  67. package/.llm/components/row.md +10 -0
  68. package/.llm/components/scenescroll.md +42 -24
  69. package/.llm/components/scenescrollword.md +267 -0
  70. package/.llm/components/scroller.md +10 -0
  71. package/.llm/components/searchinput.md +10 -0
  72. package/.llm/components/segmentedcontrol.md +33 -2
  73. package/.llm/components/segmentedcontrolitem.md +12 -2
  74. package/.llm/components/select.md +10 -0
  75. package/.llm/components/selectchip.md +10 -0
  76. package/.llm/components/spinner.md +10 -0
  77. package/.llm/components/stack.md +10 -0
  78. package/.llm/components/stats.md +50 -1
  79. package/.llm/components/statscarousel.md +227 -0
  80. package/.llm/components/statusdot.md +45 -1
  81. package/.llm/components/steps.md +10 -0
  82. package/.llm/components/stickycards.md +10 -0
  83. package/.llm/components/subdomainnavbar.md +11 -1
  84. package/.llm/components/tab.md +12 -2
  85. package/.llm/components/table.md +10 -0
  86. package/.llm/components/tablebody.md +10 -0
  87. package/.llm/components/tablecell.md +10 -0
  88. package/.llm/components/tablehead.md +10 -0
  89. package/.llm/components/tableheadercell.md +10 -0
  90. package/.llm/components/tablerow.md +10 -0
  91. package/.llm/components/tablist.md +10 -0
  92. package/.llm/components/teamgrid.md +10 -0
  93. package/.llm/components/testimonialrow.md +47 -3
  94. package/.llm/components/testimonialslider.md +12 -2
  95. package/.llm/components/textarea.md +10 -0
  96. package/.llm/components/textinput.md +11 -1
  97. package/.llm/components/textscroll.md +10 -0
  98. package/.llm/components/tiers.md +17 -7
  99. package/.llm/components/tooltip.md +6 -0
  100. package/.llm/components/typography.md +67 -1
  101. package/.llm/digest/accordion.md +1 -1
  102. package/.llm/digest/accordionitem.md +1 -1
  103. package/.llm/digest/aspectratio.md +1 -1
  104. package/.llm/digest/awards.md +1 -1
  105. package/.llm/digest/background.md +14 -6
  106. package/.llm/digest/badge.md +1 -1
  107. package/.llm/digest/bottomsheet.md +1 -1
  108. package/.llm/digest/breadcrumb.md +1 -1
  109. package/.llm/digest/breadcrumbitem.md +1 -1
  110. package/.llm/digest/button.md +2 -2
  111. package/.llm/digest/buttonicon.md +2 -2
  112. package/.llm/digest/card.md +1 -1
  113. package/.llm/digest/cardbody.md +1 -1
  114. package/.llm/digest/cardbutton.md +1 -1
  115. package/.llm/digest/checkbox.md +1 -1
  116. package/.llm/digest/comparisoncards.md +1 -1
  117. package/.llm/digest/comparisontable.md +1 -1
  118. package/.llm/digest/ctabanner.md +1 -1
  119. package/.llm/digest/ctabannerslider.md +1 -1
  120. package/.llm/digest/datatable.md +1 -1
  121. package/.llm/digest/divider.md +1 -1
  122. package/.llm/digest/documentlink.md +52 -0
  123. package/.llm/digest/documents.md +51 -0
  124. package/.llm/digest/downloadbanner.md +2 -2
  125. package/.llm/digest/dropdownmenu.md +1 -1
  126. package/.llm/digest/estimator.md +66 -0
  127. package/.llm/digest/faqaccordion.md +1 -1
  128. package/.llm/digest/featurebullets.md +1 -1
  129. package/.llm/digest/featurecards.md +8 -1
  130. package/.llm/digest/featurecardscarousel.md +1 -1
  131. package/.llm/digest/featurescroll.md +1 -1
  132. package/.llm/digest/featuresplit.md +1 -1
  133. package/.llm/digest/featurestack.md +1 -1
  134. package/.llm/digest/featuretabs.md +50 -0
  135. package/.llm/digest/filterchip.md +1 -1
  136. package/.llm/digest/footer.md +1 -1
  137. package/.llm/digest/footergroup.md +1 -1
  138. package/.llm/digest/grid.md +2 -1
  139. package/.llm/digest/icon.md +1 -1
  140. package/.llm/digest/illustrationcard.md +7 -2
  141. package/.llm/digest/illustrationcheck.md +42 -0
  142. package/.llm/digest/illustrationchoice.md +43 -0
  143. package/.llm/digest/illustrationcode.md +41 -0
  144. package/.llm/digest/illustrationlist.md +38 -0
  145. package/.llm/digest/illustrationscene.md +5 -3
  146. package/.llm/digest/imagebanner.md +11 -5
  147. package/.llm/digest/landinghero.md +1 -1
  148. package/.llm/digest/link.md +1 -1
  149. package/.llm/digest/logocolumns.md +2 -2
  150. package/.llm/digest/logorows.md +9 -2
  151. package/.llm/digest/menuitem.md +1 -1
  152. package/.llm/digest/navbar.md +1 -1
  153. package/.llm/digest/navbaritem.md +1 -1
  154. package/.llm/digest/navbarmenu.md +1 -1
  155. package/.llm/digest/navbarmenugroup.md +1 -1
  156. package/.llm/digest/navbarpanel.md +1 -1
  157. package/.llm/digest/navbarswitcher.md +1 -1
  158. package/.llm/digest/navbarswitcheroption.md +1 -1
  159. package/.llm/digest/option.md +1 -1
  160. package/.llm/digest/pageheader.md +1 -1
  161. package/.llm/digest/pagination.md +1 -1
  162. package/.llm/digest/paginationdots.md +1 -1
  163. package/.llm/digest/producthero.md +9 -3
  164. package/.llm/digest/progressbar.md +56 -0
  165. package/.llm/digest/removablechip.md +1 -1
  166. package/.llm/digest/resourcebanner.md +1 -1
  167. package/.llm/digest/row.md +1 -1
  168. package/.llm/digest/scenescroll.md +7 -6
  169. package/.llm/digest/scenescrollword.md +56 -0
  170. package/.llm/digest/scroller.md +1 -1
  171. package/.llm/digest/searchinput.md +1 -1
  172. package/.llm/digest/segmentedcontrol.md +4 -1
  173. package/.llm/digest/segmentedcontrolitem.md +2 -2
  174. package/.llm/digest/select.md +1 -1
  175. package/.llm/digest/selectchip.md +1 -1
  176. package/.llm/digest/spinner.md +1 -1
  177. package/.llm/digest/stack.md +1 -1
  178. package/.llm/digest/stats.md +9 -1
  179. package/.llm/digest/statscarousel.md +48 -0
  180. package/.llm/digest/statusdot.md +8 -1
  181. package/.llm/digest/steps.md +1 -1
  182. package/.llm/digest/stickycards.md +1 -1
  183. package/.llm/digest/subdomainnavbar.md +1 -1
  184. package/.llm/digest/tab.md +1 -1
  185. package/.llm/digest/table.md +1 -1
  186. package/.llm/digest/tablebody.md +1 -1
  187. package/.llm/digest/tablecell.md +1 -1
  188. package/.llm/digest/tablehead.md +1 -1
  189. package/.llm/digest/tableheadercell.md +1 -1
  190. package/.llm/digest/tablerow.md +1 -1
  191. package/.llm/digest/tablist.md +1 -1
  192. package/.llm/digest/teamgrid.md +1 -1
  193. package/.llm/digest/testimonialrow.md +9 -2
  194. package/.llm/digest/testimonialslider.md +2 -2
  195. package/.llm/digest/textarea.md +1 -1
  196. package/.llm/digest/textinput.md +1 -1
  197. package/.llm/digest/textscroll.md +1 -1
  198. package/.llm/digest/tiers.md +1 -1
  199. package/.llm/digest/typography.md +19 -1
  200. package/.llm/index.md +15 -4
  201. package/.llm/rules.md +10 -0
  202. package/.llm/tokens.md +13 -3
  203. package/AGENTS.md +14 -2
  204. package/README.md +28 -3
  205. package/dist/components/arrival.d.ts +32 -0
  206. package/dist/components/arrival.js +140 -0
  207. package/dist/components/arrives.d.ts +17 -0
  208. package/dist/components/arrives.js +14 -0
  209. package/dist/components/blocks/awards/Awards.js +2 -27
  210. package/dist/components/blocks/block-pattern.css +23 -0
  211. package/dist/components/blocks/comparison-cards/comparison-cards-impl.css +29 -12
  212. package/dist/components/blocks/documents/Documents.css +90 -0
  213. package/dist/components/blocks/documents/Documents.d.ts +22 -0
  214. package/dist/components/blocks/documents/Documents.js +30 -0
  215. package/dist/components/blocks/documents/Documents.types.d.ts +37 -0
  216. package/dist/components/blocks/documents/Documents.types.js +14 -0
  217. package/dist/components/blocks/documents/documents-impl.css +103 -0
  218. package/dist/components/blocks/download-banner/DownloadBanner.css +1 -1
  219. package/dist/components/blocks/download-banner/DownloadBanner.types.d.ts +1 -1
  220. package/dist/components/blocks/estimator/Estimator.css +206 -0
  221. package/dist/components/blocks/estimator/Estimator.d.ts +27 -0
  222. package/dist/components/blocks/estimator/Estimator.js +61 -0
  223. package/dist/components/blocks/estimator/Estimator.types.d.ts +63 -0
  224. package/dist/components/blocks/estimator/Estimator.types.js +25 -0
  225. package/dist/components/blocks/estimator/estimator-impl.css +159 -0
  226. package/dist/components/blocks/feature-cards/FeatureCards.d.ts +2 -1
  227. package/dist/components/blocks/feature-cards/FeatureCards.js +10 -7
  228. package/dist/components/blocks/feature-cards/FeatureCards.types.d.ts +9 -1
  229. package/dist/components/blocks/feature-cards/feature-cards-impl.css +15 -3
  230. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.d.ts +1 -1
  231. package/dist/components/blocks/feature-cards-carousel/feature-cards-carousel-impl.css +12 -0
  232. package/dist/components/blocks/feature-tabs/FeatureTabs.css +100 -0
  233. package/dist/components/blocks/feature-tabs/FeatureTabs.d.ts +23 -0
  234. package/dist/components/blocks/feature-tabs/FeatureTabs.js +38 -0
  235. package/dist/components/blocks/feature-tabs/FeatureTabs.types.d.ts +35 -0
  236. package/dist/components/blocks/feature-tabs/FeatureTabs.types.js +14 -0
  237. package/dist/components/blocks/feature-tabs/feature-tabs-impl.css +53 -0
  238. package/dist/components/blocks/image-banner/ImageBanner.css +1 -1
  239. package/dist/components/blocks/image-banner/ImageBanner.d.ts +2 -1
  240. package/dist/components/blocks/image-banner/ImageBanner.js +3 -2
  241. package/dist/components/blocks/image-banner/ImageBanner.types.d.ts +10 -8
  242. package/dist/components/blocks/image-banner/ImageBanner.types.js +1 -1
  243. package/dist/components/blocks/image-banner/image-banner-impl.css +78 -71
  244. package/dist/components/blocks/laurel.d.ts +16 -0
  245. package/dist/components/blocks/laurel.js +28 -0
  246. package/dist/components/blocks/logo-columns/LogoColumns.css +1 -1
  247. package/dist/components/blocks/logo-columns/LogoColumns.types.d.ts +1 -1
  248. package/dist/components/blocks/logo-rows/LogoRows.css +1 -1
  249. package/dist/components/blocks/logo-rows/LogoRows.d.ts +2 -1
  250. package/dist/components/blocks/logo-rows/LogoRows.js +7 -4
  251. package/dist/components/blocks/logo-rows/LogoRows.types.d.ts +9 -1
  252. package/dist/components/blocks/pattern-tone.d.ts +11 -0
  253. package/dist/components/blocks/pattern-tone.js +7 -0
  254. package/dist/components/blocks/product-hero/ProductHero.d.ts +1 -1
  255. package/dist/components/blocks/product-hero/ProductHero.js +2 -2
  256. package/dist/components/blocks/product-hero/ProductHero.types.d.ts +8 -3
  257. package/dist/components/blocks/product-hero/ProductHero.types.js +1 -1
  258. package/dist/components/blocks/product-hero/product-hero-impl.css +54 -0
  259. package/dist/components/blocks/resource-banner/ResourceBanner.css +1 -1
  260. package/dist/components/blocks/scene-scroll/SceneScroll.css +1 -1
  261. package/dist/components/blocks/scene-scroll/SceneScroll.d.ts +6 -5
  262. package/dist/components/blocks/scene-scroll/SceneScroll.js +8 -7
  263. package/dist/components/blocks/scene-scroll/SceneScroll.types.d.ts +5 -5
  264. package/dist/components/blocks/scene-scroll/SceneScroll.types.js +1 -1
  265. package/dist/components/blocks/scene-scroll/scene-scroll-impl.css +61 -44
  266. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.css +105 -0
  267. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.d.ts +31 -0
  268. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.js +67 -0
  269. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.types.d.ts +39 -0
  270. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.types.js +18 -0
  271. package/dist/components/blocks/scene-scroll-word/scene-scroll-word-impl.css +370 -0
  272. package/dist/components/blocks/stats/Stats.d.ts +2 -1
  273. package/dist/components/blocks/stats/Stats.js +17 -14
  274. package/dist/components/blocks/stats/Stats.types.d.ts +8 -0
  275. package/dist/components/blocks/stats/stats-impl.css +4 -1
  276. package/dist/components/blocks/stats/use-wheel.d.ts +1 -1
  277. package/dist/components/blocks/stats/use-wheel.js +8 -4
  278. package/dist/components/blocks/stats-carousel/StatsCarousel.css +209 -0
  279. package/dist/components/blocks/stats-carousel/StatsCarousel.d.ts +20 -0
  280. package/dist/components/blocks/stats-carousel/StatsCarousel.js +48 -0
  281. package/dist/components/blocks/stats-carousel/StatsCarousel.types.d.ts +43 -0
  282. package/dist/components/blocks/stats-carousel/StatsCarousel.types.js +23 -0
  283. package/dist/components/blocks/stats-carousel/stats-carousel-impl.css +233 -0
  284. package/dist/components/blocks/sticky-cards/sticky-cards-impl.css +8 -0
  285. package/dist/components/blocks/testimonial-row/TestimonialRow.css +1 -1
  286. package/dist/components/blocks/testimonial-row/TestimonialRow.d.ts +2 -1
  287. package/dist/components/blocks/testimonial-row/TestimonialRow.js +16 -13
  288. package/dist/components/blocks/testimonial-row/TestimonialRow.types.d.ts +9 -1
  289. package/dist/components/blocks/testimonial-slider/TestimonialSlider.css +1 -1
  290. package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.d.ts +1 -1
  291. package/dist/components/blocks/tiers/Tiers.types.d.ts +1 -1
  292. package/dist/components/core/background/Background.css +19 -0
  293. package/dist/components/core/background/Background.types.d.ts +2 -1
  294. package/dist/components/core/background/background-impl.css +47 -15
  295. package/dist/components/core/background/halftone.js +1 -1
  296. package/dist/components/core/button/Button.css +5 -5
  297. package/dist/components/core/button-icon/ButtonIcon.types.d.ts +1 -1
  298. package/dist/components/core/card-body/CardBody.css +5 -0
  299. package/dist/components/core/card-body/CardBody.types.d.ts +1 -1
  300. package/dist/components/core/document-link/DocumentLink.css +59 -0
  301. package/dist/components/core/document-link/DocumentLink.d.ts +19 -0
  302. package/dist/components/core/document-link/DocumentLink.js +21 -0
  303. package/dist/components/core/document-link/DocumentLink.types.d.ts +41 -0
  304. package/dist/components/core/document-link/DocumentLink.types.js +11 -0
  305. package/dist/components/core/document-link/document-link-impl.css +23 -0
  306. package/dist/components/core/illustration-card/IllustrationCard.css +7 -0
  307. package/dist/components/core/illustration-card/IllustrationCard.d.ts +5 -1
  308. package/dist/components/core/illustration-card/IllustrationCard.js +34 -8
  309. package/dist/components/core/illustration-card/IllustrationCard.types.d.ts +8 -1
  310. package/dist/components/core/illustration-card/IllustrationCard.types.js +1 -0
  311. package/dist/components/core/illustration-card/illustration-card-impl.css +113 -0
  312. package/dist/components/core/illustration-check/IllustrationCheck.css +25 -0
  313. package/dist/components/core/illustration-check/IllustrationCheck.d.ts +16 -0
  314. package/dist/components/core/illustration-check/IllustrationCheck.js +22 -0
  315. package/dist/components/core/illustration-check/IllustrationCheck.types.d.ts +25 -0
  316. package/dist/components/core/illustration-check/IllustrationCheck.types.js +9 -0
  317. package/dist/components/core/illustration-check/illustration-check-impl.css +76 -0
  318. package/dist/components/core/illustration-choice/IllustrationChoice.css +62 -0
  319. package/dist/components/core/illustration-choice/IllustrationChoice.d.ts +16 -0
  320. package/dist/components/core/illustration-choice/IllustrationChoice.js +31 -0
  321. package/dist/components/core/illustration-choice/IllustrationChoice.types.d.ts +25 -0
  322. package/dist/components/core/illustration-choice/IllustrationChoice.types.js +11 -0
  323. package/dist/components/core/illustration-choice/illustration-choice-impl.css +103 -0
  324. package/dist/components/core/illustration-code/IllustrationCode.css +25 -0
  325. package/dist/components/core/illustration-code/IllustrationCode.d.ts +12 -0
  326. package/dist/components/core/illustration-code/IllustrationCode.js +20 -0
  327. package/dist/components/core/illustration-code/IllustrationCode.types.d.ts +23 -0
  328. package/dist/components/core/illustration-code/IllustrationCode.types.js +8 -0
  329. package/dist/components/core/illustration-code/illustration-code-impl.css +42 -0
  330. package/dist/components/core/illustration-list/IllustrationList.css +19 -0
  331. package/dist/components/core/illustration-list/IllustrationList.d.ts +16 -0
  332. package/dist/components/core/illustration-list/IllustrationList.js +18 -0
  333. package/dist/components/core/illustration-list/IllustrationList.types.d.ts +15 -0
  334. package/dist/components/core/illustration-list/IllustrationList.types.js +6 -0
  335. package/dist/components/core/illustration-list/illustration-list-impl.css +52 -0
  336. package/dist/components/core/illustration-scene/IllustrationScene.css +6 -0
  337. package/dist/components/core/illustration-scene/IllustrationScene.d.ts +3 -2
  338. package/dist/components/core/illustration-scene/IllustrationScene.js +4 -3
  339. package/dist/components/core/illustration-scene/IllustrationScene.types.d.ts +5 -1
  340. package/dist/components/core/illustration-scene/IllustrationScene.types.js +2 -1
  341. package/dist/components/core/illustration-scene/illustration-scene-impl.css +65 -0
  342. package/dist/components/core/link/link-impl.css +5 -19
  343. package/dist/components/core/progress-bar/ProgressBar.css +101 -0
  344. package/dist/components/core/progress-bar/ProgressBar.d.ts +5 -0
  345. package/dist/components/core/progress-bar/ProgressBar.js +34 -0
  346. package/dist/components/core/progress-bar/ProgressBar.types.d.ts +52 -0
  347. package/dist/components/core/progress-bar/ProgressBar.types.js +12 -0
  348. package/dist/components/core/progress-bar/progress-bar-impl.css +45 -0
  349. package/dist/components/core/segmented-control/SegmentedControl.d.ts +1 -1
  350. package/dist/components/core/segmented-control/SegmentedControl.js +13 -5
  351. package/dist/components/core/segmented-control/SegmentedControl.types.d.ts +5 -1
  352. package/dist/components/core/segmented-control/segmented-control-impl.css +35 -0
  353. package/dist/components/core/segmented-control-item/SegmentedControlItem.types.d.ts +1 -1
  354. package/dist/components/core/select/Select.css +2 -0
  355. package/dist/components/core/select/select-impl.css +58 -0
  356. package/dist/components/core/status-dot/StatusDot.d.ts +1 -1
  357. package/dist/components/core/status-dot/StatusDot.js +7 -4
  358. package/dist/components/core/status-dot/StatusDot.types.d.ts +9 -1
  359. package/dist/components/core/status-dot/status-dot-impl.css +101 -0
  360. package/dist/components/core/text-area/TextArea.css +2 -0
  361. package/dist/components/core/text-area/text-area-impl.css +54 -0
  362. package/dist/components/core/text-input/TextInput.css +2 -0
  363. package/dist/components/core/text-input/text-input-impl.css +63 -0
  364. package/dist/components/core/typography/Typography.d.ts +3 -283
  365. package/dist/components/core/typography/Typography.js +9 -1
  366. package/dist/components/core/typography/Typography.types.d.ts +9 -15
  367. package/dist/components/core/typography/TypographyMotion.d.ts +28 -0
  368. package/dist/components/core/typography/TypographyMotion.js +43 -0
  369. package/dist/components/core/typography/typography-impl.css +106 -0
  370. package/dist/components/estimator-data.d.ts +29 -0
  371. package/dist/components/estimator-data.js +12 -0
  372. package/dist/components/illustration-data.d.ts +15 -0
  373. package/dist/components/illustration-data.js +7 -0
  374. package/dist/components/index.d.ts +25 -1
  375. package/dist/components/index.js +22 -0
  376. package/dist/components/layout/grid/Grid.css +5 -0
  377. package/dist/components/layout/grid/Grid.types.d.ts +2 -1
  378. package/dist/components/scene-scroll-data.d.ts +35 -0
  379. package/dist/components/tiers-data.d.ts +3 -2
  380. package/dist/icons/accounts.d.ts +1 -0
  381. package/dist/icons/accounts.js +1 -0
  382. package/dist/icons/app-stores.d.ts +1 -0
  383. package/dist/icons/app-stores.js +1 -0
  384. package/dist/icons/currency.d.ts +1 -0
  385. package/dist/icons/currency.js +1 -0
  386. package/dist/icons/flag.d.ts +1 -0
  387. package/dist/icons/flag.js +1 -0
  388. package/dist/icons/illustrative.d.ts +1 -0
  389. package/dist/icons/illustrative.js +1 -0
  390. package/dist/icons/index.d.ts +1 -0
  391. package/dist/icons/index.js +4 -0
  392. package/dist/icons/markets.d.ts +1 -0
  393. package/dist/icons/markets.js +1 -0
  394. package/dist/icons/social.d.ts +1 -0
  395. package/dist/icons/social.js +1 -0
  396. package/dist/icons/system.d.ts +1 -0
  397. package/dist/icons/system.js +1 -0
  398. package/dist/icons/trade.d.ts +1 -0
  399. package/dist/icons/trade.js +1 -0
  400. package/dist/marketing.css +26 -6
  401. package/package.json +44 -2
@@ -2,6 +2,10 @@
2
2
 
3
3
  # Accordion
4
4
 
5
+ A stack of headings whose detail expands when the reader asks for it.
6
+
7
+ ## Why it is built this way
8
+
5
9
  A stack of rows whose headings stay and whose detail is put away until the reader asks for it. It exists so a long page can be read as a short one: the headings are the page, and each row is something the reader may or may not want. Two rows at least — a set is what makes it work, because a heading earns its place by being scanned against the ones around it. One row is open at a time and that is not configurable here: a marketing page is read by scrolling, and a set that could hold every row open is the long page the accordion was put there to shorten.
6
10
 
7
11
  ## Use when
@@ -76,6 +80,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
76
80
  Guidance only — cannot be checked automatically.
77
81
  - **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.
78
82
  Guidance only — cannot be checked automatically.
83
+ - **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.
84
+
85
+ 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.
86
+
87
+ 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.
88
+ Guidance only — cannot be checked automatically.
79
89
  - **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.
80
90
 
81
91
  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.
@@ -2,6 +2,10 @@
2
2
 
3
3
  # AccordionItem
4
4
 
5
+ One row of an Accordion: a heading that stays, and detail that expands.
6
+
7
+ ## Why it is built this way
8
+
5
9
  One row of an Accordion: a heading that is always there, and the detail under it that is not. The heading is the whole of the target — the words and the chevron are one control, because a reader aiming at a row is aiming at the row rather than at the mark on the end of it. The chevron says which way the row is about to move rather than which way it just moved, so it is a promise rather than a report.
6
10
 
7
11
  ## Use when
@@ -140,6 +144,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
140
144
  Guidance only — cannot be checked automatically.
141
145
  - **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.
142
146
  Guidance only — cannot be checked automatically.
147
+ - **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.
148
+
149
+ 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.
150
+
151
+ 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.
152
+ Guidance only — cannot be checked automatically.
143
153
  - **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.
144
154
 
145
155
  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.
@@ -2,6 +2,10 @@
2
2
 
3
3
  # AspectRatio
4
4
 
5
+ Holds its content to a fixed shape and reserves the space before it loads.
6
+
7
+ ## Why it is built this way
8
+
5
9
  A box that holds one shape whatever is put in it, so a page reserves the room a picture will take before the picture arrives. It draws nothing — no fill, no corner, no edge — and owns one decision: the proportion. What it holds fills it and is cropped to fit, because a box asked for a shape and given something a different shape has to answer which of the two wins, and the box is the one the layout was built on.
6
10
 
7
11
  It exists because the alternative is every page doing the arithmetic. A row of cards whose images arrive at three different shapes is a row that settles on its tallest, and a hero whose art loads late is a page that jumps once the browser learns how tall it is. Both are the same fault: the shape was known and nothing said it.
@@ -96,6 +100,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
96
100
  Guidance only — cannot be checked automatically.
97
101
  - **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.
98
102
  Guidance only — cannot be checked automatically.
103
+ - **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.
104
+
105
+ 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.
106
+
107
+ 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.
108
+ Guidance only — cannot be checked automatically.
99
109
  - **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.
100
110
 
101
111
  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.
@@ -2,6 +2,10 @@
2
2
 
3
3
  # Awards
4
4
 
5
+ Lists the industry awards a company has won, each framed between two laurels.
6
+
7
+ ## Why it is built this way
8
+
5
9
  A section of social proof that lists the industry awards a company has won, each a badge between two laurels: a laurel, the award's name and its issuer, and the same laurel mirrored. From the fold the badges wrap into rows centred under the heading, five at most to a row and fewer as the band narrows, a short last row centred rather than left at the start. On a phone they run in one row across the band that moves along on its own, a loop with no seam.
6
10
 
7
11
  The reference design's FeatureAwards, phone marquee included, at motion.duration.ticker per award. It holds still while a pointer rests on it, while it has focus — it is a tab stop named by the heading while it runs — and while it is pressed; a reader who asked for less motion gets the row still, to swipe.
@@ -94,6 +98,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
94
98
  Guidance only — cannot be checked automatically.
95
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.
96
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.
97
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.
98
108
 
99
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.
@@ -2,21 +2,32 @@
2
2
 
3
3
  # Background
4
4
 
5
+ A patterned ground for a page's one standout band, drawn as its first layer.
6
+
7
+ ## Why it is built this way
8
+
5
9
  A ground a section or a block sits on, painted with a pattern rather than a flat fill — a halftone, an aurora, a mesh, a rule grid or rings. It moves slowly at rest, answers the pointer and carries no meaning; what the band holds sits on top of it.
6
10
 
7
11
  ## Use when
8
12
 
9
- - A band that has to stand apart from the page around it with more than a change of fill — the opening of a landing page, a call to action, a section that closes a long page
10
- - A dark band that would otherwise be a flat slab. The glow gives it a centre for the eye, which is where the band's heading or its action should sit
11
- - A light page that wants one moment of brand colour without a coral block: the dots carry the colour at a fraction of the area a fill would
13
+ - The page's one patterned band, between its hero and its closing call to action, on a section built by hand rather than from a block — a heading stacked over what it introduces, centred, with the band's foot left open, because every pattern rises from the foot
14
+ - Inside a block that offers it, as that block's `background` prop — FeatureCards, Stats, TestimonialRow and LogoRows draw it as their first layer, and LandingHero, PageHeader, CtaBanner, CtaBannerSlider and DownloadBanner their own. Prefer those to a hand-built section
12
15
 
13
16
  ## Do not use
14
17
 
15
- - The band only needs separating from the page around it → nothing here does this
18
+ - The band is a set of features with a picture each → `FeatureCards`
19
+ - The band is three to five headline numbers → `Stats`
20
+ - The band is a row of short reviews → `TestimonialRow`
21
+ - The band is a strip of partner or payment logos → `LogoRows`
22
+ - The band opens the page → `LandingHero`
23
+ - The band asks the reader to act → `CtaBanner`
16
24
  - The ground is a picture or a video → `AspectRatio`
25
+ - More than one band on a page. One patterned band, between the hero and the closing call to action, is what makes it the band a reader remembers; two make neither, and a page of them is noise. The hero's and the call to action's own patterns do not count against it, and it does not go on either of them
26
+ - Wrapping a block. Every block paints its own ground over whatever is behind it, so a block inside a Background hides the pattern — and the pattern belongs under a band's content as its first layer, not around it as a frame. A block that can carry one has a `background` prop; one that has not is not a band for a pattern
27
+ - A band whose content runs side by side — words beside a picture, a split, a row of columns reaching the foot. Every pattern rises from the band's foot, so it needs a heading stacked over content with the foot left open; laid across, the glow comes up behind the picture or under the words
28
+ - Separating a band from the page. A block's `ground` — `subtle` for the grey band, `strong` for the dark one — does that with a flat fill at no cost to the eye; a pattern is decoration that has to earn its place
17
29
  - Carrying meaning. The pattern is hidden from assistive technology and reads differently on every screen size, so nothing a reader needs may depend on it — not a highlight, not a direction, not a state
18
30
  - Behind long reading. Dots behind a paragraph are texture under every word, and the brightest of them sit exactly where the eye is reading; put prose on a plain ground and keep this for the band that opens or closes it
19
- - Two in a row. Adjacent patterned bands lose the edge between them, and the reader sees one long busy surface rather than two sections
20
31
  - A card, a panel or any surface smaller than a band. At a few hundred pixels the glow has nowhere to fall off to, and the dots read as noise rather than light
21
32
 
22
33
  ## Anatomy
@@ -48,10 +59,11 @@ Apply these classes from the generated `backgroundParts` constant rather than wr
48
59
 
49
60
  ## Props
50
61
 
51
- ### tone — `dark` | `light` | `brand` (default `brand`)
62
+ ### tone — `dark` | `light` | `subtle` | `brand` (default `brand`)
52
63
 
53
64
  - `dark` — The band the halftone was drawn for: coral dots glowing on color.bg.brand-strong, which is dark in both modes. Reach for it for the band a page opens or closes on, where the glow gives the band a centre
54
65
  - `light` — Coral dots on the page's own ground, for a light page that wants one moment of brand colour without a solid coral band. The glow reads as warmth rather than light, so keep it for a section that is not competing with a dark one nearby
66
+ - `subtle` — The light pattern on the subtle band's grey — color.bg.band-subtle laid over the page, the grey a block's `ground="subtle"` paints — for a block that carries a pattern on that ground. The same coral as the light tone; only the ground under it is the band's grey rather than the page's white.
55
67
  - `brand` — The default: the brand's own coral, the ground the mesh was made for and the one a call to action stands on. White dots on it for the halftone. The heading is white too, and the glow rises from the foot of the band towards it, so check the words read on the coral alone — the pattern can only add to what is behind them
56
68
 
57
69
  Use when: Which ground the dots are drawn on. It sets the flat colour under the pattern, the dots' ink — coral on the dark and light grounds, white on the coral one — and the ink of what sits on it
@@ -105,6 +117,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
105
117
  Guidance only — cannot be checked automatically.
106
118
  - **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
119
  Guidance only — cannot be checked automatically.
120
+ - **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.
121
+
122
+ 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.
123
+
124
+ 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.
125
+ Guidance only — cannot be checked automatically.
108
126
  - **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
127
 
110
128
  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.
@@ -166,9 +184,29 @@ Two things genuinely have no logical form and are not covered by this. A CSS gra
166
184
 
167
185
  ## Anti-examples
168
186
 
169
- ❌ Background for: The band only needs separating from the page around it
170
- A plain fill — color.bg.band-subtle, or color.bg.brand-strong for a dark band — separates a section at no cost to the eye. A pattern is decoration that has to earn its place, and a page where every band has one has none that stand out
171
- → nothing in this system does this. Not a gap waiting to be filled — the case belongs outside it.
187
+ ❌ Background for: The band is a set of features with a picture each
188
+ Its `background` prop draws this pattern as the section's first layer, under its own ground and content; wrapping it in Background instead hides the pattern under the ground it paints
189
+ → use `FeatureCards` instead.
190
+
191
+ ❌ Background for: The band is three to five headline numbers
192
+ Its `background` prop draws this pattern as the section's first layer; wrapped, its ground covers the pattern
193
+ → use `Stats` instead.
194
+
195
+ ❌ Background for: The band is a row of short reviews
196
+ Its `background` prop draws this pattern as the section's first layer; wrapped, its ground covers the pattern
197
+ → use `TestimonialRow` instead.
198
+
199
+ ❌ Background for: The band is a strip of partner or payment logos
200
+ Its `background` prop draws this pattern as the section's first layer; wrapped, its ground covers the pattern
201
+ → use `LogoRows` instead.
202
+
203
+ ❌ Background for: The band opens the page
204
+ The hero carries its own pattern through its `background` prop, as PageHeader does for a company page; the page's one patterned band is a different band, further down
205
+ → use `LandingHero` instead.
206
+
207
+ ❌ Background for: The band asks the reader to act
208
+ The closing call to action carries its own grid, as CtaBannerSlider and DownloadBanner carry theirs; the page's one patterned band sits before it, not on it
209
+ → use `CtaBanner` instead.
172
210
 
173
211
  ❌ Background for: The ground is a picture or a video
174
212
  Art is content, sized and cropped by the layout. This draws a pattern from tokens and has no picture to hold
@@ -210,6 +248,11 @@ import { Background, Typography } from '@deriv-com/dds-marketing'
210
248
  <Background tone="light">
211
249
  <Typography variant="h3">Trade the markets that move you</Typography>
212
250
  </Background>
251
+
252
+ // subtle
253
+ <Background tone="subtle">
254
+ <Typography variant="h3">Trade the markets that move you</Typography>
255
+ </Background>
213
256
  ```
214
257
 
215
258
  ### The halftone moving
@@ -2,6 +2,10 @@
2
2
 
3
3
  # Badge
4
4
 
5
+ A short label marking something as new, chosen or reduced.
6
+
7
+ ## Why it is built this way
8
+
5
9
  A short word marking something as new, chosen or reduced. It is promotion rather than state: a marketing page badges the plan it wants read first and the feature it shipped last week, where an app badges what an account is currently doing. That difference decides everything else here — there is no success or warning ground, because nothing on a landing page has a status, and the colour a badge takes says how loudly the page is asking rather than what it is reporting.
6
10
 
7
11
  Use it sparingly, and this is not a nicety. A badge works by being the one thing on a card that is not the copy; a page with a badge on every card has a row of ordinary labels in coloured pills and nothing marked at all.
@@ -111,6 +115,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
111
115
  Guidance only — cannot be checked automatically.
112
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.
113
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.
114
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.
115
125
 
116
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.
@@ -184,7 +194,7 @@ Two things genuinely have no logical form and are not covered by this. A CSS gra
184
194
 
185
195
  ```tsx
186
196
  import { Badge } from '@deriv-com/dds-marketing'
187
- import { GlobeRegularIcon } from '@deriv-com/quill-icons-web'
197
+ import { GlobeRegularIcon } from '@deriv-com/dds-marketing/icons'
188
198
 
189
199
  <Badge label="For platforms" icon={<GlobeRegularIcon />} />
190
200
  ```
@@ -197,7 +207,7 @@ Both are a tint carrying the colour and dark ink carrying the words. Brand makes
197
207
 
198
208
  ```tsx
199
209
  import { Badge } from '@deriv-com/dds-marketing'
200
- import { ChartCandlestickRegularIcon, GlobeRegularIcon } from '@deriv-com/quill-icons-web'
210
+ import { ChartCandlestickRegularIcon, GlobeRegularIcon } from '@deriv-com/dds-marketing/icons'
201
211
 
202
212
  // accent — the plan the page wants read first
203
213
  <Badge variant="accent" label="Most popular" icon={<GlobeRegularIcon />} />
@@ -212,7 +222,7 @@ The mark says what the badge is about faster than its word does. It is decorativ
212
222
 
213
223
  ```tsx
214
224
  import { Badge } from '@deriv-com/dds-marketing'
215
- import { GlobeRegularIcon } from '@deriv-com/quill-icons-web'
225
+ import { GlobeRegularIcon } from '@deriv-com/dds-marketing/icons'
216
226
 
217
227
  // With a glyph
218
228
  <Badge label="For platforms" icon={<GlobeRegularIcon />} />
@@ -2,6 +2,10 @@
2
2
 
3
3
  # BottomSheet
4
4
 
5
+ A panel that rises from the bottom edge for one focused task on small screens.
6
+
7
+ ## Why it is built this way
8
+
5
9
  A panel that rises from the bottom edge to hold a single focused task on small screens. It owns the way out, the controls ranged above it and the row that names the task; what the task looks like is the consumer's.
6
10
 
7
11
  ## Use when
@@ -210,6 +214,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
210
214
  Guidance only — cannot be checked automatically.
211
215
  - **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.
212
216
  Guidance only — cannot be checked automatically.
217
+ - **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.
218
+
219
+ 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.
220
+
221
+ 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.
222
+ Guidance only — cannot be checked automatically.
213
223
  - **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.
214
224
 
215
225
  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.
@@ -309,7 +319,7 @@ A sheet says how to leave it once: a handle to pull, or a close button to press.
309
319
 
310
320
  ```tsx
311
321
  import { BottomSheet, ButtonIcon } from '@deriv-com/dds-marketing'
312
- import { PenSolidIcon } from '@deriv-com/quill-icons-web'
322
+ import { PenSolidIcon } from '@deriv-com/dds-marketing/icons'
313
323
 
314
324
  // The handle alone, which is the default
315
325
  <BottomSheet onOpenChange={(open, reason) => { /* your handler */ }} open title="Filter results">Markets, date range and contract type</BottomSheet>
@@ -330,7 +340,7 @@ It ranges to the start and stays there, whatever is at either end of the row. Th
330
340
 
331
341
  ```tsx
332
342
  import { BottomSheet, ButtonIcon } from '@deriv-com/dds-marketing'
333
- import { PenSolidIcon } from '@deriv-com/quill-icons-web'
343
+ import { PenSolidIcon } from '@deriv-com/dds-marketing/icons'
334
344
 
335
345
  // The title alone
336
346
  <BottomSheet onOpenChange={(open, reason) => { /* your handler */ }} open showClose={false} showHandle={false} title="Filter results">Markets, date range and contract type</BottomSheet>
@@ -348,7 +358,7 @@ A sheet reached from another sheet needs the step before it. Back takes the lead
348
358
 
349
359
  ```tsx
350
360
  import { BottomSheet, ButtonIcon } from '@deriv-com/dds-marketing'
351
- import { ArrowLeftRegularIcon, PenSolidIcon } from '@deriv-com/quill-icons-web'
361
+ import { ArrowLeftRegularIcon, PenSolidIcon } from '@deriv-com/dds-marketing/icons'
352
362
 
353
363
  // The way back, opposite the way out
354
364
  <BottomSheet onOpenChange={(open, reason) => { /* your handler */ }} open showClose showHandle={false} back={<ButtonIcon variant="plain" size="sm" label="Back to filters" icon={<ArrowLeftRegularIcon />} />} title="Choose markets">Forex, Commodities, Stock indices, Cryptocurrencies</BottomSheet>
@@ -2,6 +2,10 @@
2
2
 
3
3
  # Breadcrumb
4
4
 
5
+ Shows where the current page sits in the site, with links back up.
6
+
7
+ ## Why it is built this way
8
+
5
9
  The trail of ancestors above the current page on a marketing site, showing the visitor where they are in the site hierarchy. Every level but the last is a link back to that section; the last is where they already are. On a marketing site the trail is often the only structural cue a visitor has — they may have arrived from a search result or a campaign link and have no mental model of the site yet. It renders every level it is given and wraps rather than collapsing, because hiding levels describes a shallower hierarchy than the one the visitor is in.
6
10
 
7
11
  ## Use when
@@ -68,6 +72,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
68
72
  Guidance only — cannot be checked automatically.
69
73
  - **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.
70
74
  Guidance only — cannot be checked automatically.
75
+ - **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.
76
+
77
+ 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.
78
+
79
+ 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.
80
+ Guidance only — cannot be checked automatically.
71
81
  - **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.
72
82
 
73
83
  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.
@@ -2,6 +2,10 @@
2
2
 
3
3
  # BreadcrumbItem
4
4
 
5
+ One level in a Breadcrumb.
6
+
7
+ ## Why it is built this way
8
+
5
9
  One level in a Breadcrumb on a marketing site. It renders either a link back to that level or, for the level the visitor is already on, plain text marked as the current page. It knows nothing about the levels around it — what order they come in and what sits between them belongs to the trail, not to any level in it.
6
10
 
7
11
  ## Use when
@@ -82,6 +86,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
82
86
  Guidance only — cannot be checked automatically.
83
87
  - **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.
84
88
  Guidance only — cannot be checked automatically.
89
+ - **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.
90
+
91
+ 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.
92
+
93
+ 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.
94
+ Guidance only — cannot be checked automatically.
85
95
  - **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.
86
96
 
87
97
  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.
@@ -2,6 +2,10 @@
2
2
 
3
3
  # Button
4
4
 
5
+ Triggers the one action a section asks for, such as signing up.
6
+
7
+ ## Why it is built this way
8
+
5
9
  Drives a visitor toward a conversion goal — a signup page, a pricing page, a demo booking — or performs the one action a section asks for, such as sending a newsletter form or opening a video. An `<a>` when given an href and a `<button>` when not, so a CTA that goes somewhere gets the browser's navigation and one that acts in place answers Space and does what the page says.
6
10
 
7
11
  ## Use when
@@ -36,7 +40,7 @@ Apply these classes from the generated `buttonParts` constant rather than writin
36
40
  ### variant — `primary` | `secondary` | `inverse` (default `primary`)
37
41
 
38
42
  - `primary` — The step the page was built to produce. Carries the brand fill, which is what makes it findable at a glance and what makes it meaningless once there are two — a section offering two brand fills has said nothing about either.
39
- - `secondary` — A real destination that is not the one being pushed — compare plans, read the docs, talk to sales. The lightest tint the ramp offers, color.bg.subtle, the same fill product's secondary carries, so a CTA and its alternative read as one family across both packages. Hover and press are layered over the fill as a background-image rather than replacing it, which is how product darkens a tint that has no hover partner of its own. On the dark band, tone="inverse" keeps the fill and turns it white.
43
+ - `secondary` — A real destination that is not the one being pushed — compare plans, read the docs, talk to sales. On the page's own ground an outline rather than a quiet fill: no fill at rest, an edge in color.border.strong, and color.bg.hover and color.bg.active washed in under a pointer and a press, so it keeps the shape, the inset and the target size of the primary beside it and gives up only the fill. Outlined on every ground: on the dark band (tone="inverse") and the coral one (tone="brand") the words turn white and the edge is color.border.strong-inverse, with the band's own hover and press washes.
40
44
  - `inverse` — A section that paints its own ground — a brand-coloured hero, a photo band, a dark takeover. There the brand fill is invisible against the fill behind it and a neutral edge is the wrong ink, so the only thing that reads is a solid at the far end of the neutral ramp: pure black in light, pure white in dark. It outranks everything near it, which is what makes it right there and wrong anywhere else.
41
45
 
42
46
  Use when: Deciding how much of the section a destination claims. Primary is the default and the one to spend deliberately.
@@ -53,8 +57,8 @@ Use when: Matching the control to the density of the band it sits in, which on a
53
57
  ### tone — `default` | `inverse` | `brand` (default `default`)
54
58
 
55
59
  - `default` — The page's own ground, which sets the ink this component was drawn against — every button on a white page
56
- - `inverse` — The control stands on the dark band, color.bg.brand-strong — a hero, a navigation bar at the top of one, a footer — which is the same near-black in light and dark. The secondary keeps its filled shape: a six-percent white tint with hover and press layered over it, and the label in color.fg.on-brand-strong. Every value is fixed, because the band is.
57
- - `brand` — The control stands on the coral band, color.bg.brand — CtaBanner and CtaBannerSlider — which is the same coral in light and dark, so nothing on it switches either. variant="inverse" is a near-black pill with a white label in both themes, rather than turning white in dark beside a white secondary; the secondary is the same six-percent white tint it is on the dark band. Hover, press and the focus ring are the dark band's fixed values.
60
+ - `inverse` — The control stands on the dark band, color.bg.brand-strong — a hero, a navigation bar at the top of one, a footer — which is near-black in light and dark alike — slate.900 in light, a step deeper in dark. The secondary stays an outline: no fill at rest, an edge in color.border.strong-inverse, hover and press washed in over it, and the label in color.fg.on-brand-strong. Every value is fixed: white and white washes read on the band at either depth.
61
+ - `brand` — The control stands on the coral band, color.bg.brand — CtaBanner and CtaBannerSlider — which is the same coral in light and dark, so nothing on it switches either. variant="inverse" is a near-black pill with a white label in both themes, rather than turning white in dark beside a white secondary; the secondary is the same white outline it is on the dark band. Hover, press and the focus ring are the dark band's fixed values.
58
62
 
59
63
  ### href — `string`
60
64
 
@@ -120,6 +124,12 @@ Guidance rather than a count. The bar is drawn with a second copy of an action i
120
124
  Guidance only — cannot be checked automatically.
121
125
  - **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.
122
126
  Guidance only — cannot be checked automatically.
127
+ - **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.
128
+
129
+ 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.
130
+
131
+ 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.
132
+ Guidance only — cannot be checked automatically.
123
133
  - **At most one primary button in a group of actions** — Two brand fills side by side ask the visitor to choose between two things that look equally urgent, and nothing tells them which one the page wants. So a group of actions — a hero's pair, a banner's pair, the buttons in a navigation bar — leads with at most one primary, and whatever sits beside it is secondary.
124
134
 
125
135
  The limit belongs to the group, not the page. A landing page asks for the same thing more than once on purpose: the sign-up in the bar, again under the opening claim, again in a banner halfway down and in the closing band. Each of those is one ask repeated where the reader has arrived, not a second ask competing with the first, and a rule that counted primaries across the page would forbid the thing a marketing page is built to do. This rule came from Product as one primary per view, and there it is right: a view is one screen with one task, and two primaries on it really are two tasks. On a page that scrolls through several sections the view is the wrong unit. The group is the one a reader compares.
@@ -2,6 +2,10 @@
2
2
 
3
3
  # ButtonIcon
4
4
 
5
+ Triggers an action with an icon alone.
6
+
7
+ ## Why it is built this way
8
+
5
9
  One press carried by a glyph alone, in the space a label would need. What the press does decides the element: an `<a>` when it is given an href, a `<button>` when it is not — the fork CardButton already settled in this package, and for the same reason, that a control going to a page and a control the page handles itself are the same gesture with different destinations, and the element is what tells a browser which. The glyph is decorative to a screen reader; the name the control is announced by comes from `label`, which is never drawn, so the control is named for everyone whether or not the shape happens to be legible to them. This is the gap Button names in its own guidance: Button's words are both its accessible name and its destination, and a glyph alone has nowhere to put either.
6
10
 
7
11
  ## Use when
@@ -79,7 +83,7 @@ Never for: Making one of a set stand out. Two of these side by side at different
79
83
  ### tone — `default` | `inverse` (default `default`)
80
84
 
81
85
  - `default` — The control is on a light ground, which is every surface this package paints by default
82
- - `inverse` — The control stands on the dark band, color.bg.brand-strong — a mark in a navigation bar on a hero, a social mark in a footer — which is the same near-black in light and dark. The ink and the tints move to the band's fixed roles; nothing else does
86
+ - `inverse` — The control stands on the dark band, color.bg.brand-strong — a mark in a navigation bar on a hero, a social mark in a footer — which is near-black in light and dark alike — slate.900 in light, a step deeper in dark. The ink and the tints move to the band's fixed roles; nothing else does
83
87
 
84
88
  ### icon — `node` **Required.**
85
89
 
@@ -145,6 +149,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
145
149
  Guidance only — cannot be checked automatically.
146
150
  - **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.
147
151
  Guidance only — cannot be checked automatically.
152
+ - **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.
153
+
154
+ 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.
155
+
156
+ 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.
157
+ Guidance only — cannot be checked automatically.
148
158
  - **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.
149
159
 
150
160
  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.
@@ -226,7 +236,7 @@ Two things genuinely have no logical form and are not covered by this. A CSS gra
226
236
 
227
237
  ```tsx
228
238
  import { ButtonIcon } from '@deriv-com/dds-marketing'
229
- import { PlaySolidIcon } from '@deriv-com/quill-icons-web'
239
+ import { PlaySolidIcon } from '@deriv-com/dds-marketing/icons'
230
240
 
231
241
  <ButtonIcon label="Play the product tour" icon={<PlaySolidIcon />} />
232
242
  ```
@@ -239,7 +249,7 @@ How much of the section one press claims. Primary for the press a band is built
239
249
 
240
250
  ```tsx
241
251
  import { ButtonIcon } from '@deriv-com/dds-marketing'
242
- import { PlaySolidIcon, XmarkRegularIcon } from '@deriv-com/quill-icons-web'
252
+ import { PlaySolidIcon, XmarkRegularIcon } from '@deriv-com/dds-marketing/icons'
243
253
 
244
254
  // Primary — the press a band is built around
245
255
  <ButtonIcon variant="primary" label="Play the product tour" icon={<PlaySolidIcon />} />
@@ -260,7 +270,7 @@ Three squares from the control ramp, each holding the mark Button gives its own
260
270
 
261
271
  ```tsx
262
272
  import { ButtonIcon } from '@deriv-com/dds-marketing'
263
- import { ChevronLeftRegularIcon } from '@deriv-com/quill-icons-web'
273
+ import { ChevronLeftRegularIcon } from '@deriv-com/dds-marketing/icons'
264
274
 
265
275
  // sm — a dense row, desktop only
266
276
  <ButtonIcon size="sm" variant="secondary" label="Previous market" icon={<ChevronLeftRegularIcon />} />
@@ -278,7 +288,7 @@ href decides the element. With one it is an anchor and the browser navigates; wi
278
288
 
279
289
  ```tsx
280
290
  import { ButtonIcon } from '@deriv-com/dds-marketing'
281
- import { BarsRegularIcon, LinkedinInIcon } from '@deriv-com/quill-icons-web'
291
+ import { BarsRegularIcon, LinkedinInIcon } from '@deriv-com/dds-marketing/icons'
282
292
 
283
293
  // With href — an anchor. Cmd-click opens a tab
284
294
  <ButtonIcon variant="secondary" href="https://www.linkedin.com/company/deriv" label="Deriv on LinkedIn" icon={<LinkedinInIcon />} />
@@ -293,7 +303,7 @@ Social accounts in a footer: several at once, all one tier. One drawn heavier wo
293
303
 
294
304
  ```tsx
295
305
  import { ButtonIcon } from '@deriv-com/dds-marketing'
296
- import { FacebookFIcon, InstagramIcon, LinkedinInIcon } from '@deriv-com/quill-icons-web'
306
+ import { FacebookFIcon, InstagramIcon, LinkedinInIcon } from '@deriv-com/dds-marketing/icons'
297
307
 
298
308
  // LinkedIn
299
309
  <ButtonIcon variant="secondary" href="https://www.linkedin.com/company/deriv" label="Deriv on LinkedIn" icon={<LinkedinInIcon />} />
@@ -311,7 +321,7 @@ Plain paints nothing of its own, so what is behind it decides whether the mark c
311
321
 
312
322
  ```tsx
313
323
  import { ButtonIcon } from '@deriv-com/dds-marketing'
314
- import { PlaySolidIcon } from '@deriv-com/quill-icons-web'
324
+ import { PlaySolidIcon } from '@deriv-com/dds-marketing/icons'
315
325
 
316
326
  // default — a light surface
317
327
  <ButtonIcon label="Play the product tour" icon={<PlaySolidIcon />} variant="plain" />
@@ -2,6 +2,10 @@
2
2
 
3
3
  # Card
4
4
 
5
+ A surface that groups related content.
6
+
7
+ ## Why it is built this way
8
+
5
9
  A surface that holds content belonging together. The marketing page is white and this is a step off it, so a card is told apart by being recessed rather than by floating — a column of them reads as a set of things rather than a stack of panels. It holds a fill and a corner and nothing else: it does not pad what is inside it, and what is inside it is the page's to compose. One variant holds no fill either: `plain` paints nothing and lets whatever is beneath it through, for an editorial card that is told apart by its picture and its headline rather than by a ground.
6
10
 
7
11
  ## Use when
@@ -94,6 +98,12 @@ What this is not about is every row of controls. A set of filter chips, a pagina
94
98
  Guidance only — cannot be checked automatically.
95
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.
96
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.
97
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.
98
108
 
99
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.
@@ -249,7 +259,7 @@ The mark is inset with the copy and sized to sit above a heading, which is what
249
259
 
250
260
  ```tsx
251
261
  import { Card, CardBody, Icon } from '@deriv-com/dds-marketing'
252
- import { MemoCircleCheckRegularIcon } from '@deriv-com/quill-icons-web'
262
+ import { MemoCircleCheckRegularIcon } from '@deriv-com/dds-marketing/icons'
253
263
 
254
264
  // surface-raised — a mark, and no picture
255
265
  <Card variant="surface-raised">