@deriv-com/dds-marketing 0.2.0 → 1.0.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 (279) hide show
  1. package/.llm/components/accordion.md +8 -0
  2. package/.llm/components/accordionitem.md +8 -0
  3. package/.llm/components/aspectratio.md +8 -0
  4. package/.llm/components/badge.md +8 -0
  5. package/.llm/components/bottomsheet.md +8 -0
  6. package/.llm/components/breadcrumb.md +8 -0
  7. package/.llm/components/breadcrumbitem.md +8 -0
  8. package/.llm/components/button.md +46 -22
  9. package/.llm/components/buttonicon.md +14 -6
  10. package/.llm/components/card.md +15 -1
  11. package/.llm/components/cardbody.md +28 -2
  12. package/.llm/components/cardbutton.md +15 -1
  13. package/.llm/components/checkbox.md +8 -0
  14. package/.llm/components/ctabanner.md +186 -0
  15. package/.llm/components/ctabannerslider.md +204 -0
  16. package/.llm/components/divider.md +8 -0
  17. package/.llm/components/dropdownmenu.md +13 -5
  18. package/.llm/components/faqaccordion.md +217 -0
  19. package/.llm/components/featurebullets.md +254 -0
  20. package/.llm/components/featurecards.md +313 -0
  21. package/.llm/components/featurescroll.md +284 -0
  22. package/.llm/components/featuresplit.md +249 -0
  23. package/.llm/components/filterchip.md +8 -0
  24. package/.llm/components/footer.md +8 -0
  25. package/.llm/components/footergroup.md +8 -0
  26. package/.llm/components/grid.md +8 -0
  27. package/.llm/components/icon.md +8 -0
  28. package/.llm/components/landinghero.md +254 -0
  29. package/.llm/components/link.md +9 -1
  30. package/.llm/components/logocolumns.md +235 -0
  31. package/.llm/components/logorows.md +212 -0
  32. package/.llm/components/menuitem.md +8 -0
  33. package/.llm/components/navbar.md +79 -15
  34. package/.llm/components/navbaritem.md +9 -1
  35. package/.llm/components/navbarmenu.md +8 -0
  36. package/.llm/components/navbarmenugroup.md +8 -0
  37. package/.llm/components/navbarpanel.md +9 -1
  38. package/.llm/components/navbarswitcher.md +9 -1
  39. package/.llm/components/navbarswitcheroption.md +8 -0
  40. package/.llm/components/option.md +8 -0
  41. package/.llm/components/pageheader.md +231 -0
  42. package/.llm/components/pagination.md +26 -89
  43. package/.llm/components/paginationdots.md +215 -0
  44. package/.llm/components/producthero.md +248 -0
  45. package/.llm/components/removablechip.md +8 -0
  46. package/.llm/components/row.md +8 -0
  47. package/.llm/components/scroller.md +8 -0
  48. package/.llm/components/searchinput.md +8 -0
  49. package/.llm/components/segmentedcontrol.md +8 -0
  50. package/.llm/components/segmentedcontrolitem.md +8 -0
  51. package/.llm/components/select.md +8 -0
  52. package/.llm/components/selectchip.md +56 -15
  53. package/.llm/components/spinner.md +8 -0
  54. package/.llm/components/stack.md +8 -0
  55. package/.llm/components/statusdot.md +8 -0
  56. package/.llm/components/subdomainnavbar.md +8 -0
  57. package/.llm/components/tab.md +8 -0
  58. package/.llm/components/table.md +8 -0
  59. package/.llm/components/tablebody.md +8 -0
  60. package/.llm/components/tablecell.md +8 -0
  61. package/.llm/components/tablehead.md +8 -0
  62. package/.llm/components/tableheadercell.md +8 -0
  63. package/.llm/components/tablerow.md +8 -0
  64. package/.llm/components/tablist.md +8 -0
  65. package/.llm/components/testimonialrow.md +235 -0
  66. package/.llm/components/testimonialslider.md +254 -0
  67. package/.llm/components/textarea.md +8 -0
  68. package/.llm/components/textinput.md +8 -0
  69. package/.llm/components/tooltip.md +8 -0
  70. package/.llm/components/typography.md +8 -0
  71. package/.llm/digest/button.md +11 -6
  72. package/.llm/digest/buttonicon.md +2 -2
  73. package/.llm/digest/card.md +1 -0
  74. package/.llm/digest/cardbody.md +3 -1
  75. package/.llm/digest/cardbutton.md +1 -0
  76. package/.llm/digest/ctabanner.md +44 -0
  77. package/.llm/digest/ctabannerslider.md +45 -0
  78. package/.llm/digest/dropdownmenu.md +1 -1
  79. package/.llm/digest/faqaccordion.md +43 -0
  80. package/.llm/digest/featurebullets.md +52 -0
  81. package/.llm/digest/featurecards.md +49 -0
  82. package/.llm/digest/featurescroll.md +52 -0
  83. package/.llm/digest/featuresplit.md +54 -0
  84. package/.llm/digest/landinghero.md +53 -0
  85. package/.llm/digest/logocolumns.md +55 -0
  86. package/.llm/digest/logorows.md +48 -0
  87. package/.llm/digest/navbar.md +18 -3
  88. package/.llm/digest/pageheader.md +49 -0
  89. package/.llm/digest/pagination.md +6 -17
  90. package/.llm/digest/paginationdots.md +43 -0
  91. package/.llm/digest/producthero.md +53 -0
  92. package/.llm/digest/selectchip.md +6 -1
  93. package/.llm/digest/testimonialrow.md +51 -0
  94. package/.llm/digest/testimonialslider.md +51 -0
  95. package/.llm/index.md +24 -3
  96. package/.llm/rules.md +24 -0
  97. package/.llm/tokens.md +56 -12
  98. package/AGENTS.md +28 -3
  99. package/README.md +41 -21
  100. package/dist/components/banner-data.d.ts +38 -0
  101. package/dist/components/banner-data.js +15 -0
  102. package/dist/components/blocks/block-reveal.css +90 -0
  103. package/dist/components/blocks/cta-banner/CtaBanner.css +66 -0
  104. package/dist/components/blocks/cta-banner/CtaBanner.d.ts +22 -0
  105. package/dist/components/blocks/cta-banner/CtaBanner.js +31 -0
  106. package/dist/components/blocks/cta-banner/CtaBanner.types.d.ts +29 -0
  107. package/dist/components/blocks/cta-banner/CtaBanner.types.js +13 -0
  108. package/dist/components/blocks/cta-banner/cta-banner-impl.css +29 -0
  109. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.css +90 -0
  110. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.d.ts +39 -0
  111. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.js +60 -0
  112. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.d.ts +41 -0
  113. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.js +15 -0
  114. package/dist/components/blocks/cta-banner-slider/cta-banner-slider-impl.css +73 -0
  115. package/dist/components/blocks/faq-accordion/FaqAccordion.css +54 -0
  116. package/dist/components/blocks/faq-accordion/FaqAccordion.d.ts +20 -0
  117. package/dist/components/blocks/faq-accordion/FaqAccordion.js +28 -0
  118. package/dist/components/blocks/faq-accordion/FaqAccordion.types.d.ts +25 -0
  119. package/dist/components/blocks/faq-accordion/FaqAccordion.types.js +10 -0
  120. package/dist/components/blocks/faq-accordion/faq-accordion-impl.css +54 -0
  121. package/dist/components/blocks/feature-bullets/FeatureBullets.css +139 -0
  122. package/dist/components/blocks/feature-bullets/FeatureBullets.d.ts +31 -0
  123. package/dist/components/blocks/feature-bullets/FeatureBullets.js +55 -0
  124. package/dist/components/blocks/feature-bullets/FeatureBullets.types.d.ts +39 -0
  125. package/dist/components/blocks/feature-bullets/FeatureBullets.types.js +16 -0
  126. package/dist/components/blocks/feature-bullets/feature-bullets-impl.css +104 -0
  127. package/dist/components/blocks/feature-cards/FeatureCards.css +84 -0
  128. package/dist/components/blocks/feature-cards/FeatureCards.d.ts +24 -0
  129. package/dist/components/blocks/feature-cards/FeatureCards.js +66 -0
  130. package/dist/components/blocks/feature-cards/FeatureCards.types.d.ts +33 -0
  131. package/dist/components/blocks/feature-cards/FeatureCards.types.js +14 -0
  132. package/dist/components/blocks/feature-cards/feature-cards-impl.css +245 -0
  133. package/dist/components/blocks/feature-scroll/FeatureScroll.css +137 -0
  134. package/dist/components/blocks/feature-scroll/FeatureScroll.d.ts +39 -0
  135. package/dist/components/blocks/feature-scroll/FeatureScroll.js +167 -0
  136. package/dist/components/blocks/feature-scroll/FeatureScroll.types.d.ts +40 -0
  137. package/dist/components/blocks/feature-scroll/FeatureScroll.types.js +17 -0
  138. package/dist/components/blocks/feature-scroll/feature-scroll-impl.css +292 -0
  139. package/dist/components/blocks/feature-split/FeatureSplit.css +95 -0
  140. package/dist/components/blocks/feature-split/FeatureSplit.d.ts +30 -0
  141. package/dist/components/blocks/feature-split/FeatureSplit.js +38 -0
  142. package/dist/components/blocks/feature-split/FeatureSplit.types.d.ts +39 -0
  143. package/dist/components/blocks/feature-split/FeatureSplit.types.js +14 -0
  144. package/dist/components/blocks/feature-split/feature-split-impl.css +83 -0
  145. package/dist/components/blocks/landing-hero/LandingHero.css +85 -0
  146. package/dist/components/blocks/landing-hero/LandingHero.d.ts +41 -0
  147. package/dist/components/blocks/landing-hero/LandingHero.js +54 -0
  148. package/dist/components/blocks/landing-hero/LandingHero.types.d.ts +37 -0
  149. package/dist/components/blocks/landing-hero/LandingHero.types.js +15 -0
  150. package/dist/components/blocks/landing-hero/landing-hero-impl.css +355 -0
  151. package/dist/components/blocks/logo-columns/LogoColumns.css +161 -0
  152. package/dist/components/blocks/logo-columns/LogoColumns.d.ts +23 -0
  153. package/dist/components/blocks/logo-columns/LogoColumns.js +46 -0
  154. package/dist/components/blocks/logo-columns/LogoColumns.types.d.ts +46 -0
  155. package/dist/components/blocks/logo-columns/LogoColumns.types.js +18 -0
  156. package/dist/components/blocks/logo-columns/logo-columns-impl.css +188 -0
  157. package/dist/components/blocks/logo-rows/LogoRows.css +122 -0
  158. package/dist/components/blocks/logo-rows/LogoRows.d.ts +20 -0
  159. package/dist/components/blocks/logo-rows/LogoRows.js +43 -0
  160. package/dist/components/blocks/logo-rows/LogoRows.types.d.ts +36 -0
  161. package/dist/components/blocks/logo-rows/LogoRows.types.js +16 -0
  162. package/dist/components/blocks/logo-rows/logo-rows-impl.css +179 -0
  163. package/dist/components/blocks/page-header/PageHeader.css +79 -0
  164. package/dist/components/blocks/page-header/PageHeader.d.ts +34 -0
  165. package/dist/components/blocks/page-header/PageHeader.js +43 -0
  166. package/dist/components/blocks/page-header/PageHeader.types.d.ts +32 -0
  167. package/dist/components/blocks/page-header/PageHeader.types.js +14 -0
  168. package/dist/components/blocks/page-header/page-header-impl.css +176 -0
  169. package/dist/components/blocks/product-hero/ProductHero.css +86 -0
  170. package/dist/components/blocks/product-hero/ProductHero.d.ts +35 -0
  171. package/dist/components/blocks/product-hero/ProductHero.js +48 -0
  172. package/dist/components/blocks/product-hero/ProductHero.types.d.ts +37 -0
  173. package/dist/components/blocks/product-hero/ProductHero.types.js +15 -0
  174. package/dist/components/blocks/product-hero/product-hero-impl.css +354 -0
  175. package/dist/components/blocks/testimonial-row/TestimonialRow.css +245 -0
  176. package/dist/components/blocks/testimonial-row/TestimonialRow.d.ts +20 -0
  177. package/dist/components/blocks/testimonial-row/TestimonialRow.js +128 -0
  178. package/dist/components/blocks/testimonial-row/TestimonialRow.types.d.ts +54 -0
  179. package/dist/components/blocks/testimonial-row/TestimonialRow.types.js +26 -0
  180. package/dist/components/blocks/testimonial-row/testimonial-row-impl.css +195 -0
  181. package/dist/components/blocks/testimonial-slider/TestimonialSlider.css +181 -0
  182. package/dist/components/blocks/testimonial-slider/TestimonialSlider.d.ts +22 -0
  183. package/dist/components/blocks/testimonial-slider/TestimonialSlider.js +36 -0
  184. package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.d.ts +49 -0
  185. package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.js +21 -0
  186. package/dist/components/blocks/testimonial-slider/testimonial-slider-impl.css +202 -0
  187. package/dist/components/blocks/use-reveal.d.ts +46 -0
  188. package/dist/components/blocks/use-reveal.js +120 -0
  189. package/dist/components/blocks/use-rotation.d.ts +62 -0
  190. package/dist/components/blocks/use-rotation.js +176 -0
  191. package/dist/components/core/accordion-item/AccordionItem.css +6 -5
  192. package/dist/components/core/bottom-sheet/BottomSheet.css +1 -1
  193. package/dist/components/core/button/Button.css +63 -16
  194. package/dist/components/core/button/Button.d.ts +14 -12
  195. package/dist/components/core/button/Button.js +43 -14
  196. package/dist/components/core/button/Button.types.d.ts +9 -14
  197. package/dist/components/core/button/button-impl.css +25 -0
  198. package/dist/components/core/button-icon/ButtonIcon.css +31 -15
  199. package/dist/components/core/button-icon/ButtonIcon.d.ts +2 -2
  200. package/dist/components/core/button-icon/ButtonIcon.js +2 -2
  201. package/dist/components/core/button-icon/ButtonIcon.types.d.ts +4 -4
  202. package/dist/components/core/card/Card.css +13 -4
  203. package/dist/components/core/card/Card.types.d.ts +2 -1
  204. package/dist/components/core/card-body/CardBody.css +11 -6
  205. package/dist/components/core/card-body/CardBody.d.ts +1 -1
  206. package/dist/components/core/card-body/CardBody.js +2 -2
  207. package/dist/components/core/card-body/CardBody.types.d.ts +4 -1
  208. package/dist/components/core/card-body/CardBody.types.js +1 -0
  209. package/dist/components/core/card-button/CardButton.css +13 -4
  210. package/dist/components/core/card-button/CardButton.types.d.ts +2 -1
  211. package/dist/components/core/checkbox/Checkbox.css +8 -1
  212. package/dist/components/core/dropdown-menu/DropdownMenu.css +13 -12
  213. package/dist/components/core/dropdown-menu/DropdownMenu.d.ts +5 -3
  214. package/dist/components/core/dropdown-menu/DropdownMenu.js +5 -3
  215. package/dist/components/core/filter-chip/FilterChip.css +2 -1
  216. package/dist/components/core/footer/footer-impl.css +1 -1
  217. package/dist/components/core/footer-group/FooterGroup.css +8 -7
  218. package/dist/components/core/icon/Icon.css +1 -1
  219. package/dist/components/core/link/Link.css +1 -1
  220. package/dist/components/core/menu-item/MenuItem.css +1 -1
  221. package/dist/components/core/navbar/Navbar.css +7 -8
  222. package/dist/components/core/navbar/Navbar.d.ts +17 -1
  223. package/dist/components/core/navbar/Navbar.js +139 -12
  224. package/dist/components/core/navbar/Navbar.types.d.ts +23 -4
  225. package/dist/components/core/navbar/Navbar.types.js +1 -1
  226. package/dist/components/core/navbar/navbar-impl.css +10 -3
  227. package/dist/components/core/navbar/navbar-material.css +96 -0
  228. package/dist/components/core/navbar-item/NavbarItem.css +4 -4
  229. package/dist/components/core/navbar-menu/NavbarMenu.css +7 -5
  230. package/dist/components/core/navbar-menu/NavbarMenu.d.ts +1 -0
  231. package/dist/components/core/navbar-menu/NavbarMenu.js +1 -0
  232. package/dist/components/core/navbar-menu/navbar-menu-impl.css +7 -7
  233. package/dist/components/core/navbar-switcher/NavbarSwitcher.css +6 -5
  234. package/dist/components/core/navbar-switcher/NavbarSwitcher.d.ts +1 -0
  235. package/dist/components/core/navbar-switcher/NavbarSwitcher.js +2 -1
  236. package/dist/components/core/option/Option.css +1 -1
  237. package/dist/components/core/pagination/Pagination.css +1 -75
  238. package/dist/components/core/pagination/Pagination.d.ts +4 -4
  239. package/dist/components/core/pagination/Pagination.js +11 -51
  240. package/dist/components/core/pagination/Pagination.types.d.ts +5 -17
  241. package/dist/components/core/pagination/Pagination.types.js +1 -3
  242. package/dist/components/core/pagination-dots/PaginationDots.css +60 -0
  243. package/dist/components/core/pagination-dots/PaginationDots.d.ts +25 -0
  244. package/dist/components/core/pagination-dots/PaginationDots.js +104 -0
  245. package/dist/components/core/pagination-dots/PaginationDots.types.d.ts +38 -0
  246. package/dist/components/core/pagination-dots/PaginationDots.types.js +9 -0
  247. package/dist/components/core/removable-chip/RemovableChip.css +3 -3
  248. package/dist/components/core/search-input/SearchInput.css +1 -1
  249. package/dist/components/core/segmented-control/SegmentedControl.css +1 -1
  250. package/dist/components/core/segmented-control-item/SegmentedControlItem.css +1 -1
  251. package/dist/components/core/select/Select.css +2 -1
  252. package/dist/components/core/select-chip/SelectChip.css +14 -7
  253. package/dist/components/core/select-chip/SelectChip.d.ts +1 -1
  254. package/dist/components/core/select-chip/SelectChip.js +7 -4
  255. package/dist/components/core/select-chip/SelectChip.types.d.ts +7 -1
  256. package/dist/components/core/select-chip/SelectChip.types.js +1 -1
  257. package/dist/components/core/select-chip/select-chip-impl.css +14 -3
  258. package/dist/components/core/status-dot/StatusDot.css +1 -1
  259. package/dist/components/core/subdomain-navbar/SubdomainNavbar.css +3 -3
  260. package/dist/components/core/tab/Tab.css +1 -1
  261. package/dist/components/core/tab-list/TabList.css +1 -1
  262. package/dist/components/core/table/table-impl.css +36 -14
  263. package/dist/components/core/table-header-cell/TableHeaderCell.css +5 -5
  264. package/dist/components/core/text-area/TextArea.css +1 -1
  265. package/dist/components/core/text-input/TextInput.css +1 -1
  266. package/dist/components/core/tooltip/Tooltip.css +1 -1
  267. package/dist/components/core/typography/Typography.css +5 -5
  268. package/dist/components/index.d.ts +35 -0
  269. package/dist/components/index.js +30 -0
  270. package/dist/components/logo-data.d.ts +24 -0
  271. package/dist/components/logo-data.js +11 -0
  272. package/dist/components/scroll-data.d.ts +64 -0
  273. package/dist/components/scroll-data.js +17 -0
  274. package/dist/components/testimonial-row-data.d.ts +51 -0
  275. package/dist/components/testimonial-row-data.js +11 -0
  276. package/dist/components/testimonial-slider-data.d.ts +26 -0
  277. package/dist/components/testimonial-slider-data.js +10 -0
  278. package/dist/marketing.css +385 -14
  279. package/package.json +1 -6
@@ -169,6 +169,14 @@ The target and the mark are separate decisions, and conflating them is what prod
169
169
 
170
170
  Declared rather than emergent. Padding plus contents does clear 24px in several components today, and it is the weaker statement: it is a size nobody wrote down, so it moves when the type scale or the glyph does, and nothing says it was meant to be a target at all.
171
171
  Guidance only — cannot be checked automatically.
172
+ - **A component is written along the reading axis, not along the page's left and right** — Every measure, inset and placement in this package names an axis rather than a side: inline-size and block-size, padding-inline and padding-block, inset-inline-start and inset-block-end, margin-inline: auto, text-align: start. Written that way a component follows whichever direction the page is read in, and a band whose claim ranges to the leading edge with its subject on the trailing one is the same composition in Arabic as in English, mirrored, with nothing restated. Written as left and right it is the same pixels in both, which is a layout nobody designed for the second language.
173
+
174
+ The enum values follow the same rule and for the same reason. A prop that names where a picture sits takes start and end, never left and right — FeatureSplit, FeatureBullets and FeatureScroll all declare mediaPosition that way, and the flex directions they generate flip on their own because row already means the reading order. A value called left would have to be re-read as right by every author working in a mirrored page, which is a translation this system should be doing rather than asking for.
175
+
176
+ The guidance a contract carries is part of the component, so it follows too. Describing a claim as ranging left is describing one of the two languages, and it was written that way here for a while: three of the opening bands said so in their own intent. A reader in a mirrored page meets that sentence and has to decide whether the component is wrong or the sentence is, and neither answer is one documentation should force.
177
+
178
+ Two things genuinely have no logical form and are not covered by this. A CSS gradient takes a physical direction — there is no to inline-end — so a pattern that must mirror has to be stated twice under a direction query, and one that is periodic and centred, like PageHeader's rule grid, does not need to. A glyph that points the way onward is the other: an arrow is a picture of a direction, and mirroring it belongs to the icon set rather than to the component holding it.
179
+ Guidance only — cannot be checked automatically.
172
180
 
173
181
  ## Anti-examples
174
182
 
@@ -142,6 +142,14 @@ The target and the mark are separate decisions, and conflating them is what prod
142
142
 
143
143
  Declared rather than emergent. Padding plus contents does clear 24px in several components today, and it is the weaker statement: it is a size nobody wrote down, so it moves when the type scale or the glyph does, and nothing says it was meant to be a target at all.
144
144
  Guidance only — cannot be checked automatically.
145
+ - **A component is written along the reading axis, not along the page's left and right** — Every measure, inset and placement in this package names an axis rather than a side: inline-size and block-size, padding-inline and padding-block, inset-inline-start and inset-block-end, margin-inline: auto, text-align: start. Written that way a component follows whichever direction the page is read in, and a band whose claim ranges to the leading edge with its subject on the trailing one is the same composition in Arabic as in English, mirrored, with nothing restated. Written as left and right it is the same pixels in both, which is a layout nobody designed for the second language.
146
+
147
+ The enum values follow the same rule and for the same reason. A prop that names where a picture sits takes start and end, never left and right — FeatureSplit, FeatureBullets and FeatureScroll all declare mediaPosition that way, and the flex directions they generate flip on their own because row already means the reading order. A value called left would have to be re-read as right by every author working in a mirrored page, which is a translation this system should be doing rather than asking for.
148
+
149
+ The guidance a contract carries is part of the component, so it follows too. Describing a claim as ranging left is describing one of the two languages, and it was written that way here for a while: three of the opening bands said so in their own intent. A reader in a mirrored page meets that sentence and has to decide whether the component is wrong or the sentence is, and neither answer is one documentation should force.
150
+
151
+ Two things genuinely have no logical form and are not covered by this. A CSS gradient takes a physical direction — there is no to inline-end — so a pattern that must mirror has to be stated twice under a direction query, and one that is periodic and centred, like PageHeader's rule grid, does not need to. A glyph that points the way onward is the other: an arrow is a picture of a direction, and mirroring it belongs to the icon set rather than to the component holding it.
152
+ Guidance only — cannot be checked automatically.
145
153
 
146
154
  ## Anti-examples
147
155
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Button
4
4
 
5
- Drives a visitor toward a conversion goal by navigating them to the next step in a funnel — a signup page, a pricing page, a demo booking. …
5
+ 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. …
6
6
 
7
7
  `import { Button } from '@deriv-com/dds-marketing'`
8
8
 
@@ -14,8 +14,8 @@ Drives a visitor toward a conversion goal by navigating them to the next step in
14
14
 
15
15
  ## Something else, when
16
16
 
17
- - The action happens on the current page — submitting a form, toggling a setting, opening a dialog, removing something → **nothing in this system does this**
18
- - The words belong inside a sentence or a paragraph of body copy → **nothing in this system does this**
17
+ - The action belongs to an application surface — a trade form, a settings panel, a confirmation that removes something → **nothing in this system does this**
18
+ - The words belong inside a sentence or a paragraph of body copy → **Link**
19
19
  - The control is a glyph alone, with no words → **ButtonIcon**
20
20
 
21
21
  ## Props
@@ -31,12 +31,17 @@ Drives a visitor toward a conversion goal by navigating them to the next step in
31
31
  - `lg` — A hero, or a full-width conversion band that is the only control in view. …
32
32
  - **tone** `enum` · default "default"
33
33
  - `default` — The page's own ground, which sets the ink this component was drawn against — every button on a white page
34
- - `inherit` — A section that painted its own ground and set its own ink: a dark hero, a brand band, a photo. …
35
- - **href** `string` · required — Always. The destination is the component — an anchor without an href is not a link, is not reachable by keyboard, and is announced as plain text, so there is no default that could stand in for one. …
36
- - never: A placeholder while the destination is undecided — a # or an empty string is a control that looks live, takes focus and goes nowhere. Nor javascript: or a handler dressed as a URL: an action that runs in place is product's Button, and this component's own guidance says so
34
+ - `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. …
35
+ - `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. …
36
+ - **href** `string` · optional — The press goes somewhere with a URL of its own — the ordinary case for a call to action on a marketing page. It makes this an anchor rather than a button, which is what gives a visitor cmd-click, a visible destination and a copyable link. …
37
+ - never: A placeholder while the destination is undecided — a # or an empty string is a control that looks live, takes focus and goes nowhere. Nor javascript: or a handler dressed as a URL: leave href out and pass onClick, and this renders a button that does the work in place
37
38
  - **showIcon** `boolean` · default false — Where the destination continues a sequence rather than being simply somewhere else to go — the hero CTA that starts a signup, the button at the foot of a step. …
38
39
  - never: Every button in a section. The mark says "this continues" and is worth something only while it points at the one control that does; on four at once it is decoration and the reader stops reading it
39
40
 
41
+ ## The type refuses
42
+
43
+ - variant="primary" with tone="brand" — The primary is the coral fill, and tone="brand" says the button stands on the coral band: coral on coral is a button nobody can see. On the band the primary action is variant="inverse"
44
+
40
45
  ## Inside it
41
46
 
42
47
  - Takes only text.
@@ -34,7 +34,7 @@ One press carried by a glyph alone, in the space a label would need. …
34
34
  - `primary` — The one glyph-alone press a section is built around — a play control over a hero, the single action a band exists for. …
35
35
  - `secondary` — The ordinary case for these, because they usually arrive several at a time — a footer's social row, a carousel's two directions, a bar's dismiss. …
36
36
  - `inverse` — A section that paints its own ground — a brand-coloured band, a photo, a dark takeover. …
37
- - `plain` — The control sits on a surface that has already said what it is — the exit on a sheet, a step in a set of marks — and a ring around it would be the loudest thing there. …
37
+ - `plain` — The control sits on a surface that has already said what it is — the exit on a sheet, a step in a set of marks — and a tint behind it would be the loudest thing there. …
38
38
  - never: Ranking a row of these against each other. A footer's five social links are peers; one of them drawn heavier says the other four are lesser, which is not a thing anybody meant to say. …
39
39
  - **size** `enum` · default "md" — Matching the control to the density of the band it sits in, which on a marketing page is set by the section rather than by the control
40
40
  - `sm` — A dense row of controls — a filter bar, a utility strip, a compact carousel. A square of size.control.sm holding a mark at icon.control.sm. …
@@ -43,7 +43,7 @@ One press carried by a glyph alone, in the space a label would need. …
43
43
  - never: Making one of a set stand out. Two of these side by side at different steps read as a control and its afterthought, and a carousel whose next is larger than its previous has said the path runs one way
44
44
  - **tone** `enum` · default "default"
45
45
  - `default` — The control is on a light ground, which is every surface this package paints by default
46
- - `inverse` — The control is on a ground that runs against the mode — a mark in a navigation bar standing on a dark hero. The ink and the tints move together; nothing else does
46
+ - `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. …
47
47
  - **icon** `node` · required — Always — the glyph is the whole control, so it is required rather than a slot that may be empty. …
48
48
  - never: A glyph whose meaning the visitor has to be taught, and never a second glyph — one control, one action, one shape. …
49
49
  - **label** `string` · required — Always. It is the entire accessible name, because nothing on screen carries one — the words that would have been the label if there had been room for one. …
@@ -29,6 +29,7 @@ A surface that holds content belonging together. …
29
29
 
30
30
  - **variant** `enum` · default "surface"
31
31
  - `surface` — The default, and right for a card on the page. …
32
+ - `surface-light` — A light card among dark ones that has to stay light in both themes — a row mixing a dark, a coral and a grey card, where the grey one flipping to dark in dark mode would make two dark cards and break the set. …
32
33
  - `surface-raised` — The card sits on a color.bg.subtle band rather than on the page. …
33
34
  - `plain` — An editorial card — an article, a post, a story — where the picture and the headline are what separate one card from the next. …
34
35
  - `accent` — One card in a set is the promotional one and the page has already earned the colour. The coral is the loudest ground here, so a row of them is a row of nothing louder than the rest
@@ -46,6 +46,8 @@ Everything a card holds: the words inset from its edges and the picture that rea
46
46
  - never: The sentence explaining the card. That is description, which sits under this at a gap close enough that the two read as one block. A title that runs to a sentence leaves the copy with nothing to add
47
47
  - **description** `string` · optional — What the title means, usually a sentence or two. It takes the default body step, because a card's copy is copy rather than a caption. …
48
48
  - never: A control. This body holds two regions and neither is a place to act from — a card with a call to action puts it in the Card beneath this, where it is not wearing the body's copy styling
49
+ - **link** `node` · optional — The card's own way on — "Learn more" — under the line, for a card in a Card rather than a CardButton: the card is read and the link is what is pressed. A standalone Link. …
50
+ - never: A card inside a CardButton. The whole card is already the link there, and a link inside a link is two destinations under one press — invalid HTML, and a screen reader announces both. Nor a Button: a card's way on is a destination, not an action
49
51
  - **mark** `node` · optional — The card leads with a glyph — a badge, a shield, a small piece of art that makes the feature recognisable before the title is read. …
50
52
  - never: A picture that should reach the card's edges. This is inset with the copy and sized to sit above a heading; a photograph put through it is a stamp in the corner of a wide margin. That is src, which renders the media region below or above this whole block rather than inside it
51
53
  - **src** `string` · optional — The card shows a picture — a photograph, a product render, a screenshot of the thing being described. Absent is the ordinary case: most cards are words
@@ -61,7 +63,7 @@ Everything a card holds: the words inset from its edges and the picture that rea
61
63
  ## Inside it
62
64
 
63
65
  - 2 components are refused inside it; the list and the reasons are in the long document.
64
- - Renders 9 parts: root, scrim, content, mark, eyebrow, title, description, media-frame, media.
66
+ - Renders 10 parts: root, scrim, content, mark, eyebrow, title, description, link, media-frame, media.
65
67
 
66
68
  ---
67
69
 
@@ -28,6 +28,7 @@ A card that responds to a press. …
28
28
 
29
29
  - **variant** `enum` · default "surface"
30
30
  - `surface` — The default, and right for a pressable card on the page. The same recessed step off the white page that Card takes, so a row mixing pressable and plain cards reads as one row
31
+ - `surface-light` — A light card among dark ones that has to stay light in both themes — a row mixing a dark, a coral and a grey card, where the grey one flipping to dark in dark mode would make two dark cards. …
31
32
  - `surface-raised` — The card sits on a color.bg.subtle band rather than on the page, where the recessed fill all but disappears and this one lifts off the band instead
32
33
  - `accent` — One card in a set is the promotional one and the page has already earned the colour
33
34
  - `accent-strong` — A card carrying more weight than its neighbours. The darkest of the four, and the one that takes white at 20.55:1 — the most legible ground a marketing card has
@@ -0,0 +1,44 @@
1
+ <!-- GENERATED from ctabanner.contract.json. Do not edit. -->
2
+
3
+ # CtaBanner
4
+
5
+ A full-bleed coral band carrying one short promotion and the action it asks for — the strip that breaks a long page with the one thing the page wants done, or closes it. …
6
+
7
+ `import { CtaBanner } from '@deriv-com/dds-marketing'`
8
+
9
+ ## Reach for it when
10
+
11
+ - A short, high-contrast promotion with one clear action — open an account, start trading, download the app
12
+ - The band that closes a page, or breaks a long one, on the action the page exists to produce
13
+
14
+ ## Something else, when
15
+
16
+ - Two or three promotions to rotate between → **CtaBannerSlider**
17
+ - The band that opens the page → **LandingHero**
18
+ - A message that needs a picture beside it → **FeatureSplit**
19
+
20
+ ## Never
21
+
22
+ - Two banners in one view — two coral strips are two demands, and the second makes the first one ordinary
23
+ - More than a headline, a line and two buttons
24
+
25
+ ## Props
26
+
27
+ - **title** `string` · required — Always — the message, in a few words. Short enough to take in at a glance; a line break goes where the words pause, not where the box runs out
28
+ - never: A sentence. The description is for the sentence; the title is what a reader takes in on the way past
29
+ - **headingLevel** `enum` · default "h2" — Matching the outline of the page around the banner. Size does not change with it — the headline is drawn at font.h1 at either level, the scale and the level being separate decisions
30
+ - `h2` — The default: a banner is a section of the page, under the page's own h1
31
+ - `h3` — A banner nested inside a section that already carries the h2 it belongs to
32
+ - **description** `string` · optional — A line saying why the action is worth taking — what the reader gets, or how little it costs them
33
+ - never: A paragraph. A banner is read at a glance, on the way down a page; copy a reader has to work through is copy they scroll past
34
+ - **actions** `node` · optional — The one action the message asks for, or two at most. …
35
+ - never: A third action, or a primary Button: coral on the coral ground is a button nobody can see
36
+
37
+ ## Inside it
38
+
39
+ - 7 components are refused inside it; the list and the reasons are in the long document.
40
+ - Renders 7 parts: root, inner, content, text, title, description, actions.
41
+
42
+ ---
43
+
44
+ The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/ctabanner.md`.
@@ -0,0 +1,45 @@
1
+ <!-- GENERATED from ctabannerslider.contract.json. Do not edit. -->
2
+
3
+ # CtaBannerSlider
4
+
5
+ CtaBanner's layout with a slider in it: the same full-bleed coral band, rotating between two or three short promotions. …
6
+
7
+ `import { CtaBannerSlider } from '@deriv-com/dds-marketing'`
8
+
9
+ ## Reach for it when
10
+
11
+ - Rotating between two or three genuinely different promotions without a hero's weight — open an account, try a tool, download the app
12
+
13
+ ## Something else, when
14
+
15
+ - One promotion → **CtaBanner**
16
+ - The band that opens the page → **LandingHero**
17
+ - A message with more than a headline, a line and a button or two → **FeatureSplit**
18
+
19
+ ## Never
20
+
21
+ - A single message — that is CtaBanner
22
+ - Messages that say the same thing twice, rotated to look like more
23
+ - A slider beside a CtaBanner in the same view — two coral strips are two demands
24
+
25
+ ## Props
26
+
27
+ - **slides** `data` · required — Always. The messages, in the order they rotate — two or three. …
28
+ - never: One message — that is CtaBanner — or a set padded out to rotate. Every slide is a few seconds of a reader's attention, and one that says what another said is a few seconds taken for nothing
29
+ - **headingLevel** `enum` · default "h2" — Matching the outline of the page around the banner, for every slide's headline at once. Size does not change with it — every headline is drawn at font.h1, the scale and the level being separate decisions
30
+ - `h2` — The default: a banner is a section of the page, under the page's own h1
31
+ - `h3` — A banner nested inside a section that already carries the h2 it belongs to
32
+ - **autoplay** `boolean` · default false — Whether it advances on its own, holding each slide for motion.duration.dwell. Off by default, so a slider nobody configured stays still. …
33
+ - never: A banner whose slides carry more than a reader can take in during motion.duration.dwell — turn it off rather than shorten the copy to fit the timer
34
+ - **label** `string` · default "Promotions" — The name the banner is announced by — a region a screen reader can jump to and skip. Name what it holds, not that it is a banner: 'Promotions', 'Offers'. Translate it with the page
35
+ - **controlsLabel** `string` · default "Slides" — The name the dots are announced by, as a group inside the banner. Its own name rather than the banner's, so a screen reader moving into the dots hears what they are rather than 'Promotions' a second time. …
36
+ - **slideLabel** `string` · default "Slide" — The word each dot is announced by, before its number — 'Slide 2'. Translate it with the page, as controlsLabel is; a page that translates only the group's name still has every dot announced in English
37
+
38
+ ## Inside it
39
+
40
+ - 7 components are refused inside it; the list and the reasons are in the long document.
41
+ - Renders 9 parts: root, inner, track, slide, text, title, description, actions, controls.
42
+
43
+ ---
44
+
45
+ The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/ctabannerslider.md`.
@@ -48,7 +48,7 @@ A button that opens a short set of destinations. Pressing one goes somewhere and
48
48
  - **openOnHover** `boolean` · default false — The menu is one of several things on a bar that open, and the others open on hover — a switcher beside a row of navigation sections, where a reader who has learned that the sections open under the pointer meets one control that does not and reads it as broken. …
49
49
  - never: A menu whose rows do something on the spot rather than go somewhere. Hover is an accident as often as it is an intention, and a set opened by accident is one a reader can act on by accident
50
50
  - **trigger** `node` · optional — A control this component should open rather than draw — one whose mark is the whole of it, with no words to read. …
51
- - never: Anything that is not a button. A menu opened by a div is a menu a keyboard cannot reach, and one opened by this package's Button is a link that does not navigate — Button is an anchor here, which is the reason this component drew its own trigger to begin with. …
51
+ - never: Anything that is not a button. A menu opened by a div is a menu a keyboard cannot reach, and one opened by this package's Button with an href is a link that does not navigate — Button was an anchor always when this component drew its own trigger, which is why it did. …
52
52
  - **open** `boolean` · optional — The page holds whether the menu is open, and this component stops holding it. For the case where something outside has to shut it — a navigation bar that closes its menu when another one opens. …
53
53
  - never: Opening it on arrival. A menu that opens itself is a panel the visitor did not ask for, over content they came to read — and the browser scrolls whatever takes focus into view, so it moves the page as well
54
54
  - **defaultOpen** `boolean` · optional — A specimen — a documentation page, the preview's own stage — where the menu has to be on screen to be looked at. This component still holds the state afterwards
@@ -0,0 +1,43 @@
1
+ <!-- GENERATED from faqaccordion.contract.json. Do not edit. -->
2
+
3
+ # FaqAccordion
4
+
5
+ A section of questions and answers: a heading over an Accordion, one question open at a time. …
6
+
7
+ `import { FaqAccordion } from '@deriv-com/dds-marketing'`
8
+
9
+ ## Reach for it when
10
+
11
+ - The questions a reader asks before acting — fees, limits, how long a withdrawal takes — near the end of a landing page or on a help page
12
+ - Objections a page has to answer without making every reader read every answer
13
+
14
+ ## Something else, when
15
+
16
+ - The answers are short enough to read all at once → **FeatureBullets**
17
+ - Each item is a feature, not a question → **FeatureCards**
18
+
19
+ ## Never
20
+
21
+ - Content a reader must see — terms, risk warnings, anything the page is obliged to show. A folded answer is one most readers never open
22
+ - Navigation. A row that opens to a list of links is a menu wearing a question
23
+
24
+ ## Props
25
+
26
+ - **ground** `enum` · default "page" — Which of the page's three grounds this section paints. A marketing page is white, and a band that wants to be seen as a band takes one of the other two — so this is how a page builds its rhythm: white, white, grey, white, dark. …
27
+ - `page` — The default, and the page's own white. A section that has nothing to separate itself from what is above it — most of them — and the ground a reader is already on
28
+ - `subtle` — A quiet step off the page, for a band that wants to read as its own section without changing the page's voice — the reference design's slate FAQ. …
29
+ - `strong` — `color.bg.brand-strong`, the dark band. It stops the page rather than dividing it, so it is for a section a reader should arrive at — and one per page is usually one more than enough. …
30
+ - never: Marking importance. Every section on a page painted a ground is a page with no emphasis left
31
+ - **title** `string` · required — Always. What the questions are about, in the fewest words — "Frequently asked questions", "Withdrawals"
32
+ - never: A question. The rows are the questions; the heading is what they share
33
+
34
+ ## Inside it
35
+
36
+ - Takes only AccordionItem.
37
+ - At least 2, no ceiling — fewer is not this component and more is a different one.
38
+ - 7 components are refused inside it; the list and the reasons are in the long document.
39
+ - Renders 4 parts: root, inner, title, list.
40
+
41
+ ---
42
+
43
+ The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/faqaccordion.md`.
@@ -0,0 +1,52 @@
1
+ <!-- GENERATED from featurebullets.contract.json. Do not edit. -->
2
+
3
+ # FeatureBullets
4
+
5
+ A section pairing a claim with a ruled list of what something includes, beside one picture. …
6
+
7
+ `import { FeatureBullets } from '@deriv-com/dds-marketing'`
8
+
9
+ ## Reach for it when
10
+
11
+ - A page has to list what a product or a plan includes, and the list is the argument
12
+ - Several benefits are each one line long and are read by scanning rather than reading
13
+ - A claim needs something beside it, and a picture is the only thing there is to put there
14
+
15
+ ## Something else, when
16
+
17
+ - The items are two or three words and belong on one line → **Badge**
18
+ - Each item needs a heading and a paragraph of its own → **Card**
19
+ - The section opens the page → **ProductHero**
20
+
21
+ ## Never
22
+
23
+ - A comparison. Every line here is included and marked so; a list where some items are absent needs a mark for absence, which this has no way to say
24
+ - Running prose broken into lines. A check against a sentence claims the sentence is a feature
25
+ - The page's opening or closing band. This is a section in the middle of a page and carries no navigation of its own
26
+
27
+ ## Props
28
+
29
+ - **ground** `enum` · default "page" — Which of the page's three grounds this section paints. A marketing page is white, and a band that wants to be seen as a band takes one of the other two — so this is how a page builds its rhythm: white, white, grey, white, dark. …
30
+ - `page` — The default, and the page's own white. A section that has nothing to separate itself from what is above it — most of them — and the ground a reader is already on
31
+ - `subtle` — A quiet step off the page, for a band that wants to read as its own section without changing the page's voice. The one to reach for first when two sections need telling apart. …
32
+ - `strong` — `color.bg.brand-strong`, the dark band. It stops the page rather than dividing it, so it is for a section a reader should arrive at — and one per page is usually one more than enough
33
+ - never: 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. And never the brand's own coral, `color.bg.brand`, which is not offered here. …
34
+ - **mediaPosition** `enum` · default "end" — Which side the picture takes at full width. Alternating it down a page is what stops three of these in a row reading as one long column, and it is the page's decision rather than this section's — which is why it is a prop and not a rule. …
35
+ - `end` — The default. The list is read first, which is the order the section argues in
36
+ - `start` — The second of two on a page, so the two do not read as one column with a picture stuck to one side
37
+ - never: Moving the picture on a phone. There is one column there and the list leads it
38
+ - **title** `string` · required — Always. What the list is a list of, in the fewest words that say it
39
+ - never: A sentence. The list underneath is the argument; this only has to name it
40
+ - **bullets** `data` · required — Always. One line per thing included, each short enough to take in at a glance. Strings rather than nodes, because every line is marked the same way and a line free to bring its own mark is a list that stops being one
41
+ - never: A sentence per line, or a line that is not included in what the title names. The mark against each one is a claim the page is making
42
+ - **media** `node` · required — Always. The picture that sits beside the list — a screenshot, a photograph, an illustration. …
43
+ - never: Anything a reader has to read or press. It is held to a square and cropped to fill it, so words in it are cropped too
44
+
45
+ ## Inside it
46
+
47
+ - 8 components are refused inside it; the list and the reasons are in the long document.
48
+ - Renders 10 parts: root, inner, split, content, title, list, item, mark, text, media.
49
+
50
+ ---
51
+
52
+ The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/featurebullets.md`.
@@ -0,0 +1,49 @@
1
+ <!-- GENERATED from featurecards.contract.json. Do not edit. -->
2
+
3
+ # FeatureCards
4
+
5
+ A section that opens with a heading and sets a grid of cards under it — the shape a marketing page uses for “why choose us” and “what you get”. …
6
+
7
+ `import { FeatureCards } from '@deriv-com/dds-marketing'`
8
+
9
+ ## Reach for it when
10
+
11
+ - Three or four things a product does, each a heading and a sentence, read side by side and compared at a glance
12
+ - A set of destinations — markets, platforms, tools — each a card a reader presses to go there
13
+ - One feature that deserves the whole row in a card of its own — the words beside a large picture, carded on the section's ground
14
+
15
+ ## Something else, when
16
+
17
+ - Each item is one line, and the list is the argument → **FeatureBullets**
18
+ - One claim beside a picture, with no card around it → **FeatureSplit**
19
+ - The items are read in order, one leading to the next → **FeatureScroll**
20
+
21
+ ## Never
22
+
23
+ - More than eight cards. Past two rows a grid stops being compared and starts being scanned, and that is a page of its own
24
+ - The page's opening band. This sits under the page's heading, never in place of it
25
+
26
+ ## Props
27
+
28
+ - **ground** `enum` · default "page" — Which of the page's three grounds this section paints. A marketing page is white, and a band that wants to be seen as a band takes one of the other two — so this is how a page builds its rhythm: white, white, grey, white, dark. …
29
+ - `page` — The default, and the page's own white. A section that has nothing to separate itself from what is above it — most of them — and the ground a reader is already on
30
+ - `subtle` — A quiet step off the page, for a band that wants to read as its own section without changing the page's voice. The one to reach for first when two sections need telling apart. …
31
+ - `strong` — `color.bg.brand-strong`, the dark band. It stops the page rather than dividing it, so it is for a section a reader should arrive at — and one per page is usually one more than enough. …
32
+ - never: 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. And never the brand's own coral, `color.bg.brand`, which is not offered here. …
33
+ - **title** `string` · required — Always. What the cards are, in the fewest words that name them — "Why trade with Deriv", "Markets you can trade"
34
+ - never: A sentence. The line under it is for the sentence
35
+ - **description** `string` · optional — A line saying what the set has in common, when the title alone does not
36
+ - never: A paragraph, or a summary of every card. The cards say what they are; this only says why they are together
37
+ - **link** `node` · optional — A way on to the page the whole set belongs to — "See all markets". A standalone Link, under the line
38
+ - never: A button. The cards are the actions here, and a Button over them would be a second, louder one
39
+
40
+ ## Inside it
41
+
42
+ - Takes only Card, CardButton.
43
+ - At least 1, at most 8 — fewer is not this component and more is a different one.
44
+ - 6 components are refused inside it; the list and the reasons are in the long document.
45
+ - Renders 8 parts: root, inner, header, title, description, link, grid, item.
46
+
47
+ ---
48
+
49
+ The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/featurecards.md`.
@@ -0,0 +1,52 @@
1
+ <!-- GENERATED from featurescroll.contract.json. Do not edit. -->
2
+
3
+ # FeatureScroll
4
+
5
+ A section that gives a set of things one screen each, with the picture pinned beside the words while a reader is on them. …
6
+
7
+ `import { FeatureScroll } from '@deriv-com/dds-marketing'`
8
+
9
+ ## Reach for it when
10
+
11
+ - A page has three or more things of the same kind to explain, each with a picture worth a screen — the markets a broker offers, the platforms it runs, the steps of an account opening …
12
+ - The set is meant to be walked through rather than compared, and a reader is expected to scroll it
13
+ - The set comes from somewhere — a CMS, a registry, a filtered list — rather than being written out by hand
14
+
15
+ ## Something else, when
16
+
17
+ - There are three or four items a reader is meant to compare → **FeatureCards**
18
+ - The set is lines rather than things — what an account includes → **FeatureBullets**
19
+ - There is one point to make → **FeatureSplit**
20
+ - The section opens the page → **LandingHero**
21
+
22
+ ## Never
23
+
24
+ - Two items. A set given a screen each has to be worth the travel, and a pair is worth one screen with both on it
25
+ - A list of links. The stops are things with pictures and sentences; a set of destinations belongs in a navigation panel or a footer's columns
26
+ - Anything a reader has to act on. This is a walk through a set, and a form or a price in the middle of it is a decision asked at the point a reader is least ready to make one
27
+ - A set whose stops each need their own arrangement. Every stop here is the same shape by construction, which is what makes the set a set — a page wanting one stop to differ wants several FeatureSplits instead
28
+
29
+ ## Props
30
+
31
+ - **ground** `enum` · default "page" — Which of the page's three grounds this section paints. A marketing page is white, and a band that wants to be seen as a band takes one of the other two — so this is how a page builds its rhythm: white, white, grey, white, dark. …
32
+ - `page` — The default, and the page's own white. A section that has nothing to separate itself from what is above it — most of them — and the ground a reader is already on
33
+ - `subtle` — A quiet step off the page, for a band that wants to read as its own section without changing the page's voice. The one to reach for first when two sections need telling apart. …
34
+ - `strong` — `color.bg.brand-strong`, the dark band. It stops the page rather than dividing it, so it is for a section a reader should arrive at — and one per page is usually one more than enough
35
+ - never: 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. And never the brand's own coral, `color.bg.brand`, which is not offered here. …
36
+ - **mediaPosition** `enum` · default "end" — Which side the pictures pin to, for every stop at once. …
37
+ - `end` — The default. The words are read first, which is the order a reader’s eye takes a two-up row in
38
+ - `start` — The pictures lead, for a section following one that put its own the other way — two scrolls facing the same way read as one very long column
39
+ - never: Moving the pictures on a phone. There is one column there, and the picture sits under each name whichever side this names
40
+ - **title** `string` · required — Always. What the set is a set of, in the fewest words that say it — 'All your markets in one place'. It is the only thing a reader sees before committing to several screens of scrolling, so it has to say what is coming
41
+ - never: A claim about the first stop. The heading is over the whole set; an argument belongs in the stop it argues for
42
+ - **steps** `data` · required — Always. The stops, in the order a reader meets them. Three at least — the section is built on each one having a screen, and a pair is worth one screen with both on it. …
43
+ - never: A set assembled to fill the section. Each stop costs a reader a screen of scrolling, so a stop that is there for symmetry is a screen nobody wanted
44
+
45
+ ## Inside it
46
+
47
+ - 10 components are refused inside it; the list and the reasons are in the long document.
48
+ - Renders 11 parts: root, inner, heading, steps, step, content, title, description, link, media, picture.
49
+
50
+ ---
51
+
52
+ The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/featurescroll.md`.
@@ -0,0 +1,54 @@
1
+ <!-- GENERATED from featuresplit.contract.json. Do not edit. -->
2
+
3
+ # FeatureSplit
4
+
5
+ A section putting one claim, a line explaining it and a way onward beside a single picture. …
6
+
7
+ `import { FeatureSplit } from '@deriv-com/dds-marketing'`
8
+
9
+ ## Reach for it when
10
+
11
+ - A page needs one more point about something it has already introduced, with a picture to carry it
12
+ - The point is a sentence rather than a list, and does not earn a set of cards
13
+ - A section needs a way onward that is not a call to action — a link to the page that says more
14
+
15
+ ## Something else, when
16
+
17
+ - The point is several things the reader gets, each one line long → **FeatureBullets**
18
+ - There are three or four points and each needs its own picture → **FeatureCards**
19
+ - The section opens the page → **ProductHero**
20
+
21
+ ## Never
22
+
23
+ - A list. Two sentences separated by a full stop is not a list, and a reader scanning for several things will miss the second — that is what FeatureBullets is for
24
+ - The page's opening or closing band. This is a section in the middle of a page and carries no navigation of its own
25
+ - A call to action. The way onward here is a link to somewhere that says more, not the thing the page wants a reader to do
26
+
27
+ ## Props
28
+
29
+ - **ground** `enum` · default "page" — Which of the page's three grounds this section paints. A marketing page is white, and a band that wants to be seen as a band takes one of the other two — so this is how a page builds its rhythm: white, white, grey, white, dark. …
30
+ - `page` — The default, and the page's own white. A section that has nothing to separate itself from what is above it — most of them — and the ground a reader is already on
31
+ - `subtle` — A quiet step off the page, for a band that wants to read as its own section without changing the page's voice. The one to reach for first when two sections need telling apart. …
32
+ - `strong` — `color.bg.brand-strong`, the dark band. It stops the page rather than dividing it, so it is for a section a reader should arrive at — and one per page is usually one more than enough
33
+ - never: 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. And never the brand's own coral, `color.bg.brand`, which is not offered here. …
34
+ - **mediaPosition** `enum` · default "end" — Which side the picture takes at full width. Alternating it down a page is what stops three of these in a row reading as one long column, and it is the page's decision rather than this section's — which is why it is a prop and not a rule. …
35
+ - `end` — The default. The claim is read first, which is the order the section argues in
36
+ - `start` — The second of two on a page, so the two do not read as one column with a picture stuck to one side
37
+ - never: Moving the picture on a phone. There is one column there and the words lead it
38
+ - **title** `string` · required — Always. The one claim the section makes, in the fewest words that say it
39
+ - never: A sentence. The description underneath carries the argument; this only has to name it
40
+ - **description** `string` · optional — The lines under the title that say what the claim above means, for a reader not convinced by the claim alone. …
41
+ - never: A paragraph. Past about two hundred characters the text column runs longer than the square beside it and the two halves stop lining up, which is the one thing a split has to get right. The reference design caps it at exactly that
42
+ - **link** `node` · optional — The section has somewhere to send a reader who wants more than it says — the page this one is a summary of. …
43
+ - never: The page's main call to action. This is a way onward from a supporting point, and a primary button here competes with the one the page actually wants pressed
44
+ - **media** `node` · required — Always. The picture that sits beside the claim — a screenshot, a photograph, an illustration. The section is a split and the picture is one half of it: without one the claim runs to a measure it was never sized for
45
+ - never: Anything a reader has to read or press. It is held to a square and cropped to fill it, so words in it are cropped too
46
+
47
+ ## Inside it
48
+
49
+ - 9 components are refused inside it; the list and the reasons are in the long document.
50
+ - Renders 8 parts: root, inner, split, content, title, description, link, media.
51
+
52
+ ---
53
+
54
+ The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/featuresplit.md`.
@@ -0,0 +1,53 @@
1
+ <!-- GENERATED from landinghero.contract.json. Do not edit. -->
2
+
3
+ # LandingHero
4
+
5
+ The band that opens a main landing page: the one thing the page is about, said once, at the top, over a ground dark enough that nothing above it competes. One of three opening bands, and the widest. …
6
+
7
+ `import { LandingHero } from '@deriv-com/dds-marketing'`
8
+
9
+ ## Reach for it when
10
+
11
+ - A main landing page needs its opening band — the front page, or a campaign page under it
12
+ - The claim has room to range to the reading edge with a subject beside it, which is what the landing tier is for
13
+ - The steps between an eyebrow, a title, a description and the actions under them have to be the same on every landing page
14
+
15
+ ## Something else, when
16
+
17
+ - The page is a product or a market page → **ProductHero**
18
+ - The page is a company or a legal one — contact, about, terms → **PageHeader**
19
+ - The band closes the page rather than opening it → **Footer**
20
+
21
+ ## Never
22
+
23
+ - A product, market, company or legal page. Each tier has its own band, and the reason they are separate components is so that this cannot be overridden
24
+ - A second band further down the page. This is the page's opening and its `h1`; a page with two is a page that has told a reader twice what it is about
25
+ - The navigation above it or the trail beneath that. The bar is a fixed layer the page mounts once and every band scrolls under; the breadcrumb is the page saying where it sits. Both are the page's and neither is the band's
26
+
27
+ ## Props
28
+
29
+ - **eyebrow** `string` · optional — A word or two placing the page before its title names it — a product family, a market, a campaign
30
+ - never: A second sentence. This is the line a reader takes in without reading; at the length of a clause it is a description in the wrong place and at the wrong weight
31
+ - **title** `string` · required — Always. The one thing the page is about, in the fewest words that still say it. It is the page's leading heading and the band's accessible name
32
+ - never: A sentence with a full stop. A title that reads as prose is a description that has been set at eighty pixels
33
+ - **headingLevel** `enum` · default "h1" — Which heading element the title renders as. The default is right for the band a page opens with, which is the only place this belongs. …
34
+ - `h1` — The default, and correct whenever the hero opens the page — which is what a hero is for
35
+ - `h2` — The rare page that already carries its `h1` elsewhere, and would otherwise have two
36
+ - never: Making the title look smaller. The level is what a screen reader builds its outline from, and nothing about it reaches the type
37
+ - **description** `string` · optional — The sentence under the title that says what the claim above it means, for the reader who is not yet convinced by the claim alone
38
+ - never: A paragraph. It is held to a readable measure and set at body size; past a couple of sentences a reader scrolls rather than reads, and the actions go under the fold
39
+ - **actions** `node` · optional — The one or two things the page wants a reader to do. Composed by the page rather than described to this component, so a call to action is the same Button here as anywhere else on the site
40
+ - never: A row of destinations. Three or more controls under a title is a menu, and a reader who has to choose between five things chooses none
41
+ - **media** `node` · optional — The band's visual — the subject standing beside the claim, cropped by the band's own inline edge rather than floating clear of it
42
+ - never: The background. A photograph filling the band is `backgroundImage`; this sits in front of it and is placed against the band's edge
43
+ - **backgroundImage** `string` · optional — A photograph filling the whole band. It is shown as it is — nothing is painted over it, so choose one already dark enough that the title reads on it
44
+ - never: A flat colour, or a bright photograph. The band already paints its ground, and nothing here darkens an image on the page's behalf — a pale one leaves the claim unreadable
45
+
46
+ ## Inside it
47
+
48
+ - 7 components are refused inside it; the list and the reasons are in the long document.
49
+ - Renders 9 parts: root, inner, content, text, eyebrow, title, description, actions, media.
50
+
51
+ ---
52
+
53
+ The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/landinghero.md`.