@deriv-com/dds-marketing 1.0.2 → 1.1.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 (315) hide show
  1. package/.llm/components/awards.md +209 -0
  2. package/.llm/components/background.md +89 -40
  3. package/.llm/components/bottomsheet.md +5 -0
  4. package/.llm/components/comparisoncards.md +257 -0
  5. package/.llm/components/comparisontable.md +231 -0
  6. package/.llm/components/ctabanner.md +9 -12
  7. package/.llm/components/ctabannerslider.md +15 -2
  8. package/.llm/components/datatable.md +273 -0
  9. package/.llm/components/downloadbanner.md +283 -0
  10. package/.llm/components/featurecards.md +41 -3
  11. package/.llm/components/featurecardscarousel.md +311 -0
  12. package/.llm/components/featuresplit.md +5 -0
  13. package/.llm/components/featurestack.md +227 -0
  14. package/.llm/components/illustrationcard.md +2 -2
  15. package/.llm/components/illustrationscene.md +6 -10
  16. package/.llm/components/imagebanner.md +278 -0
  17. package/.llm/components/navbar.md +1 -1
  18. package/.llm/components/navbaritem.md +4 -0
  19. package/.llm/components/pageheader.md +4 -3
  20. package/.llm/components/paginationdots.md +6 -1
  21. package/.llm/components/producthero.md +35 -11
  22. package/.llm/components/resourcebanner.md +247 -0
  23. package/.llm/components/scenescroll.md +222 -0
  24. package/.llm/components/select.md +17 -0
  25. package/.llm/components/stats.md +219 -0
  26. package/.llm/components/steps.md +286 -0
  27. package/.llm/components/stickycards.md +251 -0
  28. package/.llm/components/tableheadercell.md +19 -0
  29. package/.llm/components/teamgrid.md +243 -0
  30. package/.llm/components/testimonialrow.md +5 -0
  31. package/.llm/components/testimonialslider.md +14 -1
  32. package/.llm/components/textarea.md +13 -0
  33. package/.llm/components/textinput.md +13 -0
  34. package/.llm/components/textscroll.md +187 -0
  35. package/.llm/components/tiers.md +227 -0
  36. package/.llm/digest/awards.md +45 -0
  37. package/.llm/digest/background.md +11 -10
  38. package/.llm/digest/bottomsheet.md +2 -0
  39. package/.llm/digest/comparisoncards.md +51 -0
  40. package/.llm/digest/comparisontable.md +53 -0
  41. package/.llm/digest/ctabanner.md +4 -4
  42. package/.llm/digest/ctabannerslider.md +4 -0
  43. package/.llm/digest/datatable.md +65 -0
  44. package/.llm/digest/downloadbanner.md +65 -0
  45. package/.llm/digest/featurecards.md +1 -1
  46. package/.llm/digest/featurecardscarousel.md +54 -0
  47. package/.llm/digest/featuresplit.md +1 -0
  48. package/.llm/digest/featurestack.md +48 -0
  49. package/.llm/digest/illustrationscene.md +2 -3
  50. package/.llm/digest/imagebanner.md +64 -0
  51. package/.llm/digest/navbaritem.md +1 -0
  52. package/.llm/digest/pageheader.md +2 -1
  53. package/.llm/digest/paginationdots.md +3 -1
  54. package/.llm/digest/producthero.md +4 -2
  55. package/.llm/digest/resourcebanner.md +53 -0
  56. package/.llm/digest/scenescroll.md +49 -0
  57. package/.llm/digest/select.md +5 -0
  58. package/.llm/digest/stats.md +46 -0
  59. package/.llm/digest/steps.md +55 -0
  60. package/.llm/digest/stickycards.md +52 -0
  61. package/.llm/digest/tableheadercell.md +4 -0
  62. package/.llm/digest/teamgrid.md +53 -0
  63. package/.llm/digest/testimonialrow.md +2 -0
  64. package/.llm/digest/testimonialslider.md +4 -0
  65. package/.llm/digest/textarea.md +4 -0
  66. package/.llm/digest/textinput.md +4 -0
  67. package/.llm/digest/textscroll.md +43 -0
  68. package/.llm/digest/tiers.md +50 -0
  69. package/.llm/index.md +19 -3
  70. package/.llm/tokens.md +26 -1
  71. package/AGENTS.md +17 -1
  72. package/dist/components/awards-data.d.ts +24 -0
  73. package/dist/components/awards-data.js +11 -0
  74. package/dist/components/block-image-data.d.ts +24 -0
  75. package/dist/components/block-image-data.js +9 -0
  76. package/dist/components/blocks/awards/Awards.css +134 -0
  77. package/dist/components/blocks/awards/Awards.d.ts +24 -0
  78. package/dist/components/blocks/awards/Awards.js +114 -0
  79. package/dist/components/blocks/awards/Awards.types.d.ts +31 -0
  80. package/dist/components/blocks/awards/Awards.types.js +16 -0
  81. package/dist/components/blocks/awards/awards-impl.css +222 -0
  82. package/dist/components/blocks/cards-of.d.ts +16 -0
  83. package/dist/components/blocks/cards-of.js +23 -0
  84. package/dist/components/blocks/comparison-cards/ComparisonCards.css +195 -0
  85. package/dist/components/blocks/comparison-cards/ComparisonCards.d.ts +24 -0
  86. package/dist/components/blocks/comparison-cards/ComparisonCards.js +75 -0
  87. package/dist/components/blocks/comparison-cards/ComparisonCards.types.d.ts +49 -0
  88. package/dist/components/blocks/comparison-cards/ComparisonCards.types.js +26 -0
  89. package/dist/components/blocks/comparison-cards/comparison-cards-impl.css +262 -0
  90. package/dist/components/blocks/comparison-table/ComparisonTable.css +111 -0
  91. package/dist/components/blocks/comparison-table/ComparisonTable.d.ts +25 -0
  92. package/dist/components/blocks/comparison-table/ComparisonTable.js +100 -0
  93. package/dist/components/blocks/comparison-table/ComparisonTable.types.d.ts +36 -0
  94. package/dist/components/blocks/comparison-table/ComparisonTable.types.js +15 -0
  95. package/dist/components/blocks/comparison-table/comparison-table-impl.css +143 -0
  96. package/dist/components/blocks/cta-banner/CtaBanner.css +1 -0
  97. package/dist/components/blocks/cta-banner/CtaBanner.js +2 -2
  98. package/dist/components/blocks/cta-banner/CtaBanner.types.d.ts +4 -3
  99. package/dist/components/blocks/cta-banner/CtaBanner.types.js +1 -1
  100. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.css +1 -0
  101. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.d.ts +1 -1
  102. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.js +6 -2
  103. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.d.ts +8 -0
  104. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.js +1 -1
  105. package/dist/components/blocks/data-table/DataTable.css +170 -0
  106. package/dist/components/blocks/data-table/DataTable.d.ts +29 -0
  107. package/dist/components/blocks/data-table/DataTable.js +84 -0
  108. package/dist/components/blocks/data-table/DataTable.types.d.ts +69 -0
  109. package/dist/components/blocks/data-table/DataTable.types.js +19 -0
  110. package/dist/components/blocks/data-table/data-table-impl.css +155 -0
  111. package/dist/components/blocks/download-banner/DownloadBanner.css +228 -0
  112. package/dist/components/blocks/download-banner/DownloadBanner.d.ts +28 -0
  113. package/dist/components/blocks/download-banner/DownloadBanner.js +75 -0
  114. package/dist/components/blocks/download-banner/DownloadBanner.types.d.ts +56 -0
  115. package/dist/components/blocks/download-banner/DownloadBanner.types.js +23 -0
  116. package/dist/components/blocks/download-banner/download-banner-impl.css +216 -0
  117. package/dist/components/blocks/faq-accordion/FaqAccordion.css +1 -0
  118. package/dist/components/blocks/faq-accordion/faq-accordion-impl.css +3 -7
  119. package/dist/components/blocks/feature-bullets/FeatureBullets.css +1 -0
  120. package/dist/components/blocks/feature-bullets/feature-bullets-impl.css +14 -1
  121. package/dist/components/blocks/feature-cards/FeatureCards.css +1 -0
  122. package/dist/components/blocks/feature-cards/FeatureCards.d.ts +2 -1
  123. package/dist/components/blocks/feature-cards/FeatureCards.js +4 -21
  124. package/dist/components/blocks/feature-cards/feature-cards-impl.css +10 -9
  125. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.css +115 -0
  126. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.d.ts +30 -0
  127. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.js +160 -0
  128. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.d.ts +52 -0
  129. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.js +17 -0
  130. package/dist/components/blocks/feature-cards-carousel/feature-cards-carousel-impl.css +207 -0
  131. package/dist/components/blocks/feature-scroll/FeatureScroll.css +1 -0
  132. package/dist/components/blocks/feature-split/FeatureSplit.css +1 -0
  133. package/dist/components/blocks/feature-split/feature-split-impl.css +14 -1
  134. package/dist/components/blocks/feature-stack/FeatureStack.css +86 -0
  135. package/dist/components/blocks/feature-stack/FeatureStack.d.ts +19 -0
  136. package/dist/components/blocks/feature-stack/FeatureStack.js +27 -0
  137. package/dist/components/blocks/feature-stack/FeatureStack.types.d.ts +34 -0
  138. package/dist/components/blocks/feature-stack/FeatureStack.types.js +14 -0
  139. package/dist/components/blocks/feature-stack/feature-stack-impl.css +87 -0
  140. package/dist/components/blocks/image-banner/ImageBanner.css +133 -0
  141. package/dist/components/blocks/image-banner/ImageBanner.d.ts +32 -0
  142. package/dist/components/blocks/image-banner/ImageBanner.js +41 -0
  143. package/dist/components/blocks/image-banner/ImageBanner.types.d.ts +54 -0
  144. package/dist/components/blocks/image-banner/ImageBanner.types.js +14 -0
  145. package/dist/components/blocks/image-banner/image-banner-impl.css +281 -0
  146. package/dist/components/blocks/landing-hero/LandingHero.css +1 -0
  147. package/dist/components/blocks/logo-columns/LogoColumns.css +1 -0
  148. package/dist/components/blocks/logo-rows/LogoRows.css +1 -0
  149. package/dist/components/blocks/page-header/PageHeader.css +1 -0
  150. package/dist/components/blocks/page-header/PageHeader.js +2 -2
  151. package/dist/components/blocks/page-header/PageHeader.types.d.ts +4 -2
  152. package/dist/components/blocks/page-header/PageHeader.types.js +1 -1
  153. package/dist/components/blocks/page-header/page-header-impl.css +5 -3
  154. package/dist/components/blocks/product-hero/ProductHero.css +8 -3
  155. package/dist/components/blocks/product-hero/ProductHero.d.ts +1 -1
  156. package/dist/components/blocks/product-hero/ProductHero.js +5 -2
  157. package/dist/components/blocks/product-hero/ProductHero.types.d.ts +5 -1
  158. package/dist/components/blocks/product-hero/ProductHero.types.js +1 -0
  159. package/dist/components/blocks/product-hero/product-hero-impl.css +43 -12
  160. package/dist/components/blocks/resource-banner/ResourceBanner.css +106 -0
  161. package/dist/components/blocks/resource-banner/ResourceBanner.d.ts +32 -0
  162. package/dist/components/blocks/resource-banner/ResourceBanner.js +51 -0
  163. package/dist/components/blocks/resource-banner/ResourceBanner.types.d.ts +44 -0
  164. package/dist/components/blocks/resource-banner/ResourceBanner.types.js +14 -0
  165. package/dist/components/blocks/resource-banner/resource-banner-impl.css +69 -0
  166. package/dist/components/blocks/scene-scroll/SceneScroll.css +93 -0
  167. package/dist/components/blocks/scene-scroll/SceneScroll.d.ts +36 -0
  168. package/dist/components/blocks/scene-scroll/SceneScroll.js +54 -0
  169. package/dist/components/blocks/scene-scroll/SceneScroll.types.d.ts +32 -0
  170. package/dist/components/blocks/scene-scroll/SceneScroll.types.js +15 -0
  171. package/dist/components/blocks/scene-scroll/scene-scroll-impl.css +275 -0
  172. package/dist/components/blocks/stats/Stats.css +139 -0
  173. package/dist/components/blocks/stats/Stats.d.ts +24 -0
  174. package/dist/components/blocks/stats/Stats.js +120 -0
  175. package/dist/components/blocks/stats/Stats.types.d.ts +36 -0
  176. package/dist/components/blocks/stats/Stats.types.js +19 -0
  177. package/dist/components/blocks/stats/stats-count.d.ts +34 -0
  178. package/dist/components/blocks/stats/stats-count.js +61 -0
  179. package/dist/components/blocks/stats/stats-impl.css +284 -0
  180. package/dist/components/blocks/stats/use-wheel.d.ts +37 -0
  181. package/dist/components/blocks/stats/use-wheel.js +126 -0
  182. package/dist/components/blocks/steps/Steps.css +202 -0
  183. package/dist/components/blocks/steps/Steps.d.ts +32 -0
  184. package/dist/components/blocks/steps/Steps.js +65 -0
  185. package/dist/components/blocks/steps/Steps.types.d.ts +48 -0
  186. package/dist/components/blocks/steps/Steps.types.js +21 -0
  187. package/dist/components/blocks/steps/steps-impl.css +216 -0
  188. package/dist/components/blocks/steps/use-turn.d.ts +33 -0
  189. package/dist/components/blocks/steps/use-turn.js +75 -0
  190. package/dist/components/blocks/sticky-cards/StickyCards.css +154 -0
  191. package/dist/components/blocks/sticky-cards/StickyCards.d.ts +35 -0
  192. package/dist/components/blocks/sticky-cards/StickyCards.js +153 -0
  193. package/dist/components/blocks/sticky-cards/StickyCards.types.d.ts +43 -0
  194. package/dist/components/blocks/sticky-cards/StickyCards.types.js +18 -0
  195. package/dist/components/blocks/sticky-cards/sticky-cards-impl.css +393 -0
  196. package/dist/components/blocks/team-grid/TeamGrid.css +159 -0
  197. package/dist/components/blocks/team-grid/TeamGrid.d.ts +28 -0
  198. package/dist/components/blocks/team-grid/TeamGrid.js +74 -0
  199. package/dist/components/blocks/team-grid/TeamGrid.types.d.ts +51 -0
  200. package/dist/components/blocks/team-grid/TeamGrid.types.js +20 -0
  201. package/dist/components/blocks/team-grid/team-grid-impl.css +129 -0
  202. package/dist/components/blocks/testimonial-row/TestimonialRow.css +1 -0
  203. package/dist/components/blocks/testimonial-row/TestimonialRow.d.ts +1 -1
  204. package/dist/components/blocks/testimonial-row/TestimonialRow.js +4 -3
  205. package/dist/components/blocks/testimonial-row/TestimonialRow.types.d.ts +3 -0
  206. package/dist/components/blocks/testimonial-row/TestimonialRow.types.js +1 -1
  207. package/dist/components/blocks/testimonial-row/testimonial-row-impl.css +8 -0
  208. package/dist/components/blocks/testimonial-slider/TestimonialSlider.css +1 -0
  209. package/dist/components/blocks/testimonial-slider/TestimonialSlider.d.ts +1 -1
  210. package/dist/components/blocks/testimonial-slider/TestimonialSlider.js +2 -2
  211. package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.d.ts +8 -0
  212. package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.js +1 -1
  213. package/dist/components/blocks/text-scroll/TextScroll.css +53 -0
  214. package/dist/components/blocks/text-scroll/TextScroll.d.ts +5 -0
  215. package/dist/components/blocks/text-scroll/TextScroll.js +71 -0
  216. package/dist/components/blocks/text-scroll/TextScroll.types.d.ts +22 -0
  217. package/dist/components/blocks/text-scroll/TextScroll.types.js +10 -0
  218. package/dist/components/blocks/text-scroll/text-scroll-impl.css +115 -0
  219. package/dist/components/blocks/tiers/Tiers.css +233 -0
  220. package/dist/components/blocks/tiers/Tiers.d.ts +32 -0
  221. package/dist/components/blocks/tiers/Tiers.js +68 -0
  222. package/dist/components/blocks/tiers/Tiers.types.d.ts +45 -0
  223. package/dist/components/blocks/tiers/Tiers.types.js +25 -0
  224. package/dist/components/blocks/tiers/tiers-impl.css +185 -0
  225. package/dist/components/blocks/use-rotation.d.ts +12 -2
  226. package/dist/components/blocks/use-rotation.js +6 -28
  227. package/dist/components/comparison-cards-data.d.ts +59 -0
  228. package/dist/components/comparison-cards-data.js +12 -0
  229. package/dist/components/comparison-table-data.d.ts +39 -0
  230. package/dist/components/comparison-table-data.js +11 -0
  231. package/dist/components/core/accordion-item/AccordionItem.css +1 -5
  232. package/dist/components/core/background/Background.css +23 -0
  233. package/dist/components/core/background/Background.d.ts +10 -4
  234. package/dist/components/core/background/Background.js +16 -7
  235. package/dist/components/core/background/Background.types.d.ts +11 -8
  236. package/dist/components/core/background/Background.types.js +3 -1
  237. package/dist/components/core/background/background-impl.css +334 -1
  238. package/dist/components/core/background/halftone.d.ts +11 -0
  239. package/dist/components/core/background/halftone.js +43 -3
  240. package/dist/components/core/background/patterns.d.ts +66 -0
  241. package/dist/components/core/background/patterns.js +244 -0
  242. package/dist/components/core/background/shader.d.ts +44 -0
  243. package/dist/components/core/background/shader.js +307 -0
  244. package/dist/components/core/background/use-shader.d.ts +11 -0
  245. package/dist/components/core/background/use-shader.js +25 -0
  246. package/dist/components/core/background/use-spotlight.d.ts +2 -1
  247. package/dist/components/core/background/use-spotlight.js +9 -1
  248. package/dist/components/core/bottom-sheet/BottomSheet.js +2 -2
  249. package/dist/components/core/bottom-sheet/BottomSheet.types.d.ts +3 -1
  250. package/dist/components/core/breadcrumb/Breadcrumb.d.ts +1 -0
  251. package/dist/components/core/breadcrumb/Breadcrumb.js +1 -0
  252. package/dist/components/core/breadcrumb/breadcrumb-impl.css +11 -0
  253. package/dist/components/core/button/button-impl.css +14 -1
  254. package/dist/components/core/illustration-card/IllustrationCard.js +1 -1
  255. package/dist/components/core/illustration-card/illustration-card-impl.css +20 -0
  256. package/dist/components/core/illustration-scene/IllustrationScene.css +4 -7
  257. package/dist/components/core/illustration-scene/IllustrationScene.types.d.ts +2 -3
  258. package/dist/components/core/illustration-scene/illustration-scene-impl.css +7 -1
  259. package/dist/components/core/link/Link.js +7 -3
  260. package/dist/components/core/link/link-impl.css +29 -2
  261. package/dist/components/core/navbar/Navbar.css +2 -2
  262. package/dist/components/core/navbar/Navbar.types.d.ts +1 -1
  263. package/dist/components/core/navbar-item/NavbarItem.d.ts +2 -1
  264. package/dist/components/core/navbar-item/NavbarItem.js +3 -10
  265. package/dist/components/core/navbar-item/NavbarItem.types.d.ts +4 -1
  266. package/dist/components/core/navbar-item/NavbarItem.types.js +1 -1
  267. package/dist/components/core/navbar-item/navbar-item-impl.css +10 -0
  268. package/dist/components/core/navbar-menu/navbar-menu-impl.css +9 -0
  269. package/dist/components/core/navbar-switcher/navbar-switcher-impl.css +19 -0
  270. package/dist/components/core/pagination/Pagination.js +1 -1
  271. package/dist/components/core/pagination/pagination-impl.css +9 -0
  272. package/dist/components/core/pagination-dots/PaginationDots.d.ts +1 -1
  273. package/dist/components/core/pagination-dots/PaginationDots.js +3 -3
  274. package/dist/components/core/pagination-dots/PaginationDots.types.d.ts +3 -1
  275. package/dist/components/core/segmented-control/SegmentedControl.css +4 -3
  276. package/dist/components/core/segmented-control/SegmentedControl.js +17 -3
  277. package/dist/components/core/segmented-control-item/SegmentedControlItem.css +2 -1
  278. package/dist/components/core/select/Select.js +3 -3
  279. package/dist/components/core/select/Select.types.d.ts +11 -1
  280. package/dist/components/core/select/Select.types.js +1 -1
  281. package/dist/components/core/tab-list/TabList.js +9 -1
  282. package/dist/components/core/table-header-cell/TableHeaderCell.d.ts +1 -1
  283. package/dist/components/core/table-header-cell/TableHeaderCell.js +5 -2
  284. package/dist/components/core/table-header-cell/TableHeaderCell.types.d.ts +7 -1
  285. package/dist/components/core/table-header-cell/TableHeaderCell.types.js +1 -1
  286. package/dist/components/core/text-area/TextArea.d.ts +1 -1
  287. package/dist/components/core/text-area/TextArea.js +2 -2
  288. package/dist/components/core/text-area/TextArea.types.d.ts +9 -1
  289. package/dist/components/core/text-area/TextArea.types.js +1 -1
  290. package/dist/components/core/text-input/TextInput.d.ts +1 -1
  291. package/dist/components/core/text-input/TextInput.js +2 -2
  292. package/dist/components/core/text-input/TextInput.types.d.ts +9 -1
  293. package/dist/components/core/text-input/TextInput.types.js +1 -1
  294. package/dist/components/data-table-data.d.ts +33 -0
  295. package/dist/components/data-table-data.js +12 -0
  296. package/dist/components/download-banner-data.d.ts +52 -0
  297. package/dist/components/download-banner-data.js +11 -0
  298. package/dist/components/index.d.ts +45 -0
  299. package/dist/components/index.js +32 -0
  300. package/dist/components/resource-banner-data.d.ts +34 -0
  301. package/dist/components/resource-banner-data.js +13 -0
  302. package/dist/components/scene-scroll-data.d.ts +24 -0
  303. package/dist/components/scene-scroll-data.js +9 -0
  304. package/dist/components/stats-data.d.ts +28 -0
  305. package/dist/components/stats-data.js +11 -0
  306. package/dist/components/steps-data.d.ts +38 -0
  307. package/dist/components/steps-data.js +13 -0
  308. package/dist/components/sticky-cards-data.d.ts +43 -0
  309. package/dist/components/sticky-cards-data.js +12 -0
  310. package/dist/components/team-grid-data.d.ts +38 -0
  311. package/dist/components/team-grid-data.js +11 -0
  312. package/dist/components/tiers-data.d.ts +47 -0
  313. package/dist/components/tiers-data.js +13 -0
  314. package/dist/marketing.css +77 -28
  315. package/package.json +1 -1
package/.llm/tokens.md CHANGED
@@ -17,6 +17,7 @@ one value at every width.
17
17
  - `--color-bg-band-subtle` — A recessed band across the page, e.g. a section of steps or features set apart from the ones around it. gray.50 in light, white at six in dark. For a fill inside a control — a secondary button, a badge — use color.bg.subtle.
18
18
  - `--color-bg-brand` — Primary action surface, e.g. sign-up button, hero CTA, promotional banner. The same coral in light and dark; pair with color.fg.on-brand for text.
19
19
  - `--color-bg-brand-active` — Pressed state for color.bg.brand. One step further along the ramp than the hover, in the same direction, so a press reads as more of what the hover began.
20
+ - `--color-bg-brand-deep` — The brand's darkest red, the same in both themes — a shade in a pattern drawn in the brand's reds, e.g. the deepest pool of Background's mesh. Not a ground for words: color.bg.brand-subtle is the tint that turns with the theme.
20
21
  - `--color-bg-brand-hover` — Hover state for color.bg.brand.
21
22
  - `--color-bg-brand-strong` — A dark surface, for a band breaking a long page or a card carrying more weight than its neighbours, e.g. a feature band, the footer. gray.950 in light and dark alike, so the band is the same wherever it is drawn. Pair with color.fg.on-brand-strong for text.
22
23
  - `--color-bg-brand-subtle` — A brand ground quiet enough to read dark ink on. The solid coral takes white at 3.39:1 and is waived for a word; this pairs with color.fg.brand well past the bar, so a mark can be brand-coloured without spending the waiver.
@@ -33,6 +34,7 @@ one value at every width.
33
34
  - `--color-bg-page` — The website's ground. A section that needs separating from it takes color.bg.subtle, color.bg.brand-strong or color.bg.brand, rather than the page carrying a tint of its own.
34
35
  - `--color-bg-readonly` — A field whose value is fixed but still worth reading. Lighter than the disabled ground and at full contrast, which is the distinction: readonly is legible and settled, disabled recedes because it is not actionable.
35
36
  - `--color-bg-selected` — The active or current item in a set of choices, e.g. selected nav item, current tab, highlighted row. Not for recessive areas — use color.bg.subtle.
37
+ - `--color-bg-store-badge` — The ground of an app store's download badge: the black the stores' own badge artwork is drawn on, the same in both themes, so a badge chip and the artwork in it read as one badge.
36
38
  - `--color-bg-strong` — Inverted neutral fill for an action that has to outrank everything around it — near-black in light and pure white in dark, the highest contrast the page can carry. Not a section ground: a band takes bg.subtle, bg.brand-strong or bg.brand. Pair with color.fg.on-strong.
37
39
  - `--color-bg-strong-on-brand` — The solid fill of a control on color.bg.brand, e.g. the primary action on the coral band. Near-black in both modes, because the band does not change — unlike color.bg.strong, which turns white in dark.
38
40
  - `--color-bg-subtle` — A recessive fill inside a control or a small area, e.g. a secondary button, a neutral badge. For a band across the page use color.bg.band-subtle; for selected items, color.bg.selected.
@@ -125,6 +127,7 @@ one value at every width.
125
127
  - `--space-inset-sm` — Default padding inside controls, e.g. form inputs, dropdowns, sign-up fields.
126
128
  - `--space-inset-xl` **adapts** — Padding inside a card or a panel — the step most cards want, between the tight lg and the page's own gutter.
127
129
  - `--space-inset-xs` — Padding inside compact controls, e.g. buttons, nav items, form chips.
130
+ - `--space-pile-peek` — How much of each covered card shows above the next in a StickyCards pile. Each card stops this much lower than the one under it, so the covered cards read as a stack of edges.
128
131
  - `--space-section-compact` **adapts** — The air above and below a section of supporting content, or one closely related to the section before it. Where the default step would read as a break rather than a step.
129
132
  - `--space-section-default` **adapts** — The air above and below a section, and the step most take. Adjacent sections each contribute their own; nothing adds a gap between them on top of it.
130
133
 
@@ -142,14 +145,21 @@ one value at every width.
142
145
  - `--size-control-lg` — Height of a large control, for a hero or a conversion band. Twice space.control.lg, on the same reasoning as the default step.
143
146
  - `--size-control-md` — Height of a default-size control, the same measure product gives its own default. Twice space.control.md, so on a pill the corner radius and the side padding are one measure and a label starts where the curve stops.
144
147
  - `--size-control-sm` — Height of a small control — a picker in a navigation bar, a field in a filter row. Half of it is space.control.sm and a quarter is radius.control.sm, the ratio every step of this ramp holds. Desktop only: below what a finger reliably hits.
145
- - `--size-dot-current` — How wide the current mark in a row of dots stretches, against size.dot.diameter for the rest — a pill three dots long, so where the reader is reads by shape.
148
+ - `--size-data-table-search` — The widest a DataTable's search runs beside its result count, from the fold. Room for a market's name and a symbol with the magnifier and the clear button either side; on a phone it takes the row.
149
+ - `--size-dot-current` — How long the current mark in a set of dots stretches along the set, against size.dot.diameter for the rest — a pill three dots long, so where the reader is reads by shape. Wide in a row, tall in Stats' column standing on end.
146
150
  - `--size-dot-diameter` — The mark standing in for one page of a short sequence, or for a status beside a name. Eight: small enough that a row of ten reads as a row rather than as ten controls, and large enough to find at arm's length.
151
+ - `--size-download-banner-badge` — The width every store badge on a DownloadBanner takes, so badges whose artwork differs in shape line up as one set.
152
+ - `--size-download-banner-media` — The width of the app's image on a featured DownloadBanner — a phone held out beside the words rather than a slab across the card. The same width as size.grid.track-lg, for a different thing.
153
+ - `--size-download-banner-qr` — The side of the QR code on a DownloadBanner, a square. Large enough to scan from a phone held at arm's length off a desktop screen, small enough to sit beside a heading.
154
+ - `--size-feature-cards-carousel-card` — The width of a card on a FeatureCardsCarousel, from the fold, held to the column. Narrow enough that the row shows the next card's edge, which says there is more.
155
+ - `--size-feature-stack-media` — The widest the picture a FeatureStack ends on runs, centred. Wider than the words above it, so the picture is the section's weight; narrower than the page, so it stays an illustration rather than a band.
147
156
  - `--size-grid-track-lg` — For a cell holding a picture as well as words, or a pricing plan with a list under it. Three fit the page's measure and four do not, which is what makes this the floor for a grid meant to read as three across.
148
157
  - `--size-grid-track-md` — The default track floor, for a feature card: a heading and a line or two beneath it. Four of these fit the page's measure, so a grid asking for three has room to spare and drops to two on a tablet rather than at the first sign of pressure.
149
158
  - `--size-grid-track-sm` — The narrowest a grid track goes before the grid drops a column. For a cell holding a logo, an icon and a word, or one short claim — six of them clear the page's measure with the page gutter still on both sides.
150
159
  - `--size-halftone-dot` — The widest a halftone dot grows, at the brightest point of the glow. Six against size.halftone.pitch's twenty, so even the largest dots stand well apart and the pattern reads as a fine screen of light rather than a field of discs.
151
160
  - `--size-halftone-pitch` — How far apart a halftone background's dots sit, centre to centre. A pitch rather than a gap, as size.rule-grid.pitch is: how often a decorative mark recurs. Twenty, against a six-pixel dot: a fine screen that reads as a tone across a band.
152
161
  - `--size-heading-group-max` — How wide an eyebrow, a title and a description may run as a block. Independent or centred groups take this; one that has to sit on the grid takes eight columns instead, which is a span rather than a measure.
162
+ - `--size-image-banner-card` — The least height an ImageBanner's split and cover cards take, so the photograph has room to show beside or behind the words — the reference design's card. The same depth as size.band.compact, for a different thing: a card in the page rather than the band that opens it.
153
163
  - `--size-logo-columns-height` — How much of a LogoColumns wall shows at once, from the fold. Tall enough that a column reads as running on past both edges; half of it on a phone.
154
164
  - `--size-logo-rows-tile` — The width of a tile on a LogoRows, from the fold; three quarters of it on a phone. Wide enough for a wordmark, narrow enough that a row shows several at once.
155
165
  - `--size-measure-description` — How wide a supporting description runs. Wider than a title because it is read rather than taken in, and narrower than long-form because it sits under something.
@@ -161,6 +171,7 @@ one value at every width.
161
171
  - `--size-menu-panel-max` — The widest a section's menu panel gets. Narrower than the page's own measure on purpose: a panel is scanned across with a pointer already on it, and one as wide as the page leaves its last column a long way from the name that opened it.
162
172
  - `--size-menu-panel-min` — The shortest a section's menu panel gets, whatever it holds. A bar's sections rarely have the same number of destinations, and panels that each took their own height would change size as the reader moved along the row.
163
173
  - `--size-menu-max` — The tallest a menu's surface gets before its commands scroll. Product's measure, and counted in rows: five whole and part of a sixth at either size. Neither lands on a row boundary — a ceiling cutting clean at the last full row looks like the whole set.
174
+ - `--size-mesh-blur` — How far a mesh background blurs its pools into one another. Enough that no pool keeps an edge, so the reds read as one liquid rather than shapes.
164
175
  - `--size-review-card-min` — The shortest a TestimonialRow card gets. A floor, not a height: a one-line review keeps a card's shape, and a longer one still grows it.
165
176
  - `--size-rings-pitch` — How far apart the rings on a band sit, counted out from the middle of its foot. A pitch, as size.rule-grid.pitch is; tighter than the grid's, because rings spaced that wide read as a target rather than a ripple.
166
177
  - `--size-rings-spotlight` — How far the pointer's light reaches on the rings: the radius within which they brighten around the pointer and fade to the resting rings. The rule grid's reach, so the two answer the pointer alike.
@@ -176,9 +187,13 @@ one value at every width.
176
187
  - `--size-spinner-lg` — Spinner diameter at size lg. For a section holding space for content that has not arrived — an embed, a demo, a band of live figures. Its job there is to be visible from where the reader is looking, which is the whole section rather than one control in it.
177
188
  - `--size-spinner-md` — Spinner diameter at size md. The default: large enough to be the one thing happening in a form or a card, small enough that it does not become the card's subject.
178
189
  - `--size-spinner-sm` — Spinner diameter at size sm. Sixteen, which is the size of the body copy it sits beside — an indicator in a line of text reads as part of the line rather than as something dropped into it.
190
+ - `--size-sticky-cards-compact-max` — The widest a StickyCards pile of text-first cards runs, centred under its heading — the heading group's own measure, so pile and heading share a column.
191
+ - `--size-sticky-cards-compact-min` — The shortest a text-first StickyCards card is drawn. A card a title and a sentence tall is a strip, and a pile of strips reads as a list rather than as cards laid over each other.
192
+ - `--size-sticky-cards-feature-min` — The least height a StickyCards feature card takes — a chapter of the page rather than a tile, tall enough for its picture to be the card's half.
179
193
  - `--size-switcher-panel-width` — The width of a switcher's floating panel. Stated because the panel is out of flow and would otherwise shrink to the trigger it hangs from, wrapping every choice and running the set down the page.
180
194
  - `--size-target-min` — The smallest a thing a pointer has to hit may be. Bind it as a minimum on any control whose size would otherwise come from its contents — a pressable card is as big as its words, and one holding a single short line is smaller than a fingertip.
181
195
  - `--size-testimonial-art` — The decorative pictures in a TestimonialSlider's corners, as squares. Large enough to read as pictures, small enough to leave the card the quote's.
196
+ - `--size-tiers-medal` — The medal over each tier's name in a Tiers section, as a square. Large enough to read as a medal rather than an icon beside the words, small enough that four across leave the cards under them the row.
182
197
  - `--size-tooltip-max` — The widest a tooltip gets before its text wraps. Short enough that the eye finds the start of the next line without hunting for it, which is the whole job of a measure — and a tooltip that needs more than two lines is a tooltip carrying something that belongs on the page.
183
198
 
184
199
  ## radius
@@ -253,6 +268,12 @@ one value at every width.
253
268
  - `--font-field-label-md-line-height`
254
269
  - `--font-field-label-md-size`
255
270
  - `--font-field-label-md-weight`
271
+ - `font.figure-lg` — A figure with the row to itself — the one in place on Stats' wheel on a phone. Larger than font.figure, which shares a row with the figures beside it: alone, the number is the one thing the band is showing. The same size at every width, because it is only drawn on a phone.
272
+ - `--font-figure-lg-family`
273
+ - `--font-figure-lg-letter-spacing`
274
+ - `--font-figure-lg-line-height`
275
+ - `--font-figure-lg-size`
276
+ - `--font-figure-lg-weight`
256
277
  - `font.figure` — A number read as a fact rather than as a heading. It takes a heading's size, because a figure has to hold a row on its own, and semibold rather than extrabold: the weight a title needs makes a number look like a claim.
257
278
  - `--font-figure-family`
258
279
  - `--font-figure-letter-spacing`
@@ -361,6 +382,7 @@ one value at every width.
361
382
  - `--motion-duration-drift` — One way of a slow drift that runs while something is on screen — an aurora wandering along a band's foot and back. Ten seconds, so the movement is felt rather than watched.
362
383
  - `--motion-duration-dwell` — How long a rotating message holds before the next one moves in, e.g. a CTA banner's slides. Long enough to read a headline and a line under it; the reference site's 2000 moved before a reader reached the button.
363
384
  - `--motion-duration-fast` — Direct user actions that should feel instant, e.g. hover, press, toggle.
385
+ - `--motion-duration-hold` — How long one of a turning set of figures holds in place before the next turns in — Stats' wheel on a phone. A second, where motion.duration.dwell holds a slide for five: a number and its label are read at a glance, and a wheel that stood still longer would read as stuck.
364
386
  - `--motion-duration-instant` — A change the reader has already moved past — a tooltip leaving once the pointer is elsewhere. Not a short duration but no duration: animating a dismissal keeps a thing on screen after the reason for it has gone.
365
387
  - `--motion-duration-media-hover` — How long art takes to settle inside a frame that holds still. Longer than duration.normal, which suits a card that lifts and is over; a picture that zooms is still on screen when it stops and the eye follows it the whole way.
366
388
  - `--motion-duration-normal` — UI elements entering or leaving, e.g. dropdowns, tooltips, tab switches, card hover.
@@ -370,7 +392,9 @@ one value at every width.
370
392
  - `--motion-duration-slow` — Large UI transitions, e.g. accordions expanding, page transitions, interactive demos.
371
393
  - `--motion-duration-spinner` — One full rotation of a spinner. Fast enough to read as working, slow enough that the stroke does not blur into a solid ring.
372
394
  - `--motion-duration-stagger` — The step between one part of a section arriving and the next. A gap rather than a length: five parts at this step trail the first by less than half a second, so a block still arrives as one thing rather than assembling itself while a reader waits.
395
+ - `--motion-duration-ticker` — How long a running row takes to carry one item past — Awards' row on a phone, multiplied by the number of awards for one whole loop. The reference site's pace: thirty-two seconds for eight awards, slow enough to read an award as it goes by.
373
396
  - `--motion-duration-trail` — How long something takes to catch up with a pointer it trails — a background's glow following the pointer across a band. Half a second, so the light drifts after the hand rather than sticking to it: a trail is felt, a cursor is tracked.
397
+ - `--motion-duration-turn` — One turn of a wheel of figures: the one in place rising away as the next rises into it. The reference site's 700 — long enough that the eye follows the number in rather than seeing it swap.
374
398
  - `--motion-easing-enter` — UI elements arriving on screen — decelerates into place, e.g. dropdown opening, tooltip appearing.
375
399
  - `--motion-easing-exit` — UI elements leaving the screen — accelerates away, e.g. menu closing, notification dismissing.
376
400
  - `--motion-easing-media-hover` — Art moving inside a frame that holds still. Symmetric, unlike easing.standard: a hover runs forward on enter and backward on leave, so a one-way curve that settles hard reads as a snap going one way and a drift the other.
@@ -382,6 +406,7 @@ one value at every width.
382
406
  - `--motion-scale-enter` — What a component scales from when something reveals it — a tooltip appearing. Needs a transform origin on the edge nearest its anchor, or it grows out of its own middle. The counterpart to scale.hover, which is a response rather than an entrance.
383
407
  - `--motion-scale-hover` — How much a control grows under the cursor on hover. Deliberately small — a control that grows past the pointer fires its own mouse-out.
384
408
  - `--motion-scale-media-hover` — How much art grows inside a frame that holds still — an editorial card's picture under the cursor. Twice motion.scale.hover, which stays smaller because a control can outrun its own pointer and a framed picture cannot.
409
+ - `--motion-scale-pile-covered` — How far a card in a StickyCards pile draws back once the next card has slid over it, from its top edge, so the pile reads as depth. Not motion.scale.enter, which is for something arriving.
385
410
  - `--motion-translate-enter` — Where a surface waits before something reveals it: level on the inline axis, its own full height down the block one. A share of the element rather than of the page, so a sheet travels exactly its own height whatever that turns out to be.
386
411
  - `--motion-translate-hover` — How far a pressable surface rises under the cursor. A fixed distance rather than a share of the element, so a tall card and a short one lift by the same amount and a row of them stays level. Small enough that nothing it sits beside looks disturbed.
387
412
  - `--motion-translate-reveal` — How far a section waits below where it lands, before the scroll brings it up. A fixed distance rather than a share of the block, so a hero a screen tall and a split half that arrive by the same movement. Pairs with motion.easing.reveal.
package/AGENTS.md CHANGED
@@ -143,20 +143,36 @@ screen is built in is not something to reach for while building a control.
143
143
 
144
144
  ### Blocks — the sections a page is built from, and the rhythm between them
145
145
 
146
+ - **Awards** — Building credibility with the industry awards a company has won
147
+ - **ComparisonCards** — Two or three products, accounts or plans that answer the same few questions differently
148
+ - **ComparisonTable** — Comparing two or three options
146
149
  - **CtaBanner** — A short, high-contrast promotion with one clear action
147
150
  - **CtaBannerSlider** — Rotating between two or three genuinely different promotions without a hero's weight
151
+ - **DataTable** — Trading instruments and their specifications
152
+ - **DownloadBanner** — Promoting an app across the stores and platforms it ships on
148
153
  - **FaqAccordion** — The questions a reader asks before acting
149
154
  - **FeatureBullets** — A page has to list what a product or a plan includes, and the list is the argument
150
- - **FeatureCards** — Three or four things a product does, each a heading and a sentence, read side by side and compared at a glance
155
+ - **FeatureCards** — Three or four things a product does, each a card with a heading, a line and a picture under them, read side by side and compared at a glance
156
+ - **FeatureCardsCarousel** — A "what you get" band of five or six authored cards, each a benefit with a line and a picture, too many for one row of a grid, where one card in focus with a peek of the next is the point
151
157
  - **FeatureScroll** — A page has three or more things of the same kind to explain, each with a picture worth a screen
152
158
  - **FeatureSplit** — A page needs one more point about something it has already introduced, with a picture to carry it
159
+ - **FeatureStack** — A statement with a picture that carries it
160
+ - **ImageBanner** — Driving a single mid-page or end-of-page action with a photograph to carry it
153
161
  - **LandingHero** — A main landing page needs its opening band
154
162
  - **LogoColumns** — Showing the partners, integrations or payment methods behind a claim
155
163
  - **LogoRows** — Showing the partners, integrations or payment methods behind a claim under it, where the words lead and the logos follow
156
164
  - **PageHeader** — A company, legal or support page needs its opening band
157
165
  - **ProductHero** — A product or a market page needs its opening band
166
+ - **ResourceBanner** — Pointing readers at related guides, policies, or reference pages at the end of an informational section
167
+ - **SceneScroll** — Two states of one thing a page wants felt rather than listed
168
+ - **Stats** — Three to five headline numbers that prove scale or credibility
169
+ - **Steps** — A page explains a get-started or onboarding flow
170
+ - **StickyCards** — A set of markets, products or benefits a page wants read one at a time as the reader scrolls
171
+ - **TeamGrid** — A leadership team, an advisory board or a regional management list on an about page
158
172
  - **TestimonialRow** — Five to ten short, rated reviews collected by a review service, where seeing several at once is the point and the overall score is worth stating
159
173
  - **TestimonialSlider** — Two to five real quotes from partners or customers, each a few sentences, read one at a time
174
+ - **TextScroll** — A mission or vision statement, on an About or Who we are page
175
+ - **Tiers** — A partner, affiliate or introducing-broker programme explains its tiers and what each one earns
160
176
 
161
177
  ## Components that need mounting
162
178
 
@@ -0,0 +1,24 @@
1
+ /**
2
+ * The awards a Awards lists.
3
+ *
4
+ * Exported from the package for the reason `testimonial-row-data.ts` and `logo-data.ts` are: a block
5
+ * whose content is a list is one whose consumer builds a value before passing it.
6
+ *
7
+ * Records rather than a component per award, because an award is two lines of words — what it was
8
+ * for and who gave it — and nothing in it is an element a page composes. The laurels either side are
9
+ * the section's, the same for every award, and not something an award chooses.
10
+ */
11
+ /** One award in a Awards: what it was for, and who gave it when. */
12
+ export interface Award {
13
+ /**
14
+ * What the award was for, in the issuer's own words — "Best Trading Experience - Global". Ten
15
+ * words at most: it is set between two laurels, at a badge's width, and wraps to three lines past
16
+ * that.
17
+ */
18
+ title: string;
19
+ /**
20
+ * Who gave it, and the year — "UF Awards 2025". Short, under the title; the year is what tells a
21
+ * reader the claim is current.
22
+ */
23
+ issuer: string;
24
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The awards a Awards lists.
3
+ *
4
+ * Exported from the package for the reason `testimonial-row-data.ts` and `logo-data.ts` are: a block
5
+ * whose content is a list is one whose consumer builds a value before passing it.
6
+ *
7
+ * Records rather than a component per award, because an award is two lines of words — what it was
8
+ * for and who gave it — and nothing in it is an element a page composes. The laurels either side are
9
+ * the section's, the same for every award, and not something an award chooses.
10
+ */
11
+ export {};
@@ -0,0 +1,24 @@
1
+ /**
2
+ * A picture a block draws itself, at the picture's own shape.
3
+ *
4
+ * Exported from the package for the reason the other data shapes are: the page builds the value
5
+ * and hands it over. A record rather than a node, because the block has to draw the `<img>` to
6
+ * size it — a picture keeps its own proportions and the block only limits how tall it grows, which
7
+ * it cannot do to an element it was handed already wrapped in something else.
8
+ */
9
+ /** One picture: where it is, what it shows, and its size, so the block can hold its shape. */
10
+ export interface BlockImage {
11
+ /** Where the picture is. Use one at least as wide as the column it fills, twice that for sharp screens. */
12
+ src: string;
13
+ /**
14
+ * What a screen reader hears for it: an empty string when the words around it already say what it
15
+ * shows, a description when it carries something they do not.
16
+ */
17
+ alt: string;
18
+ /**
19
+ * The picture's own width and height, in pixels. Optional, but give them: with them the block
20
+ * reserves the picture's shape before it loads, so nothing below it moves when it arrives.
21
+ */
22
+ width?: number;
23
+ height?: number;
24
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * A picture a block draws itself, at the picture's own shape.
3
+ *
4
+ * Exported from the package for the reason the other data shapes are: the page builds the value
5
+ * and hands it over. A record rather than a node, because the block has to draw the `<img>` to
6
+ * size it — a picture keeps its own proportions and the block only limits how tall it grows, which
7
+ * it cannot do to an element it was handed already wrapped in something else.
8
+ */
9
+ export {};
@@ -0,0 +1,134 @@
1
+ /* GENERATED from awards.contract.json. Do not edit. */
2
+
3
+ :where([data-dds-context="marketing"]) .dds-awards {
4
+ box-sizing: border-box;
5
+ container-type: inline-size;
6
+ display: flex;
7
+ inline-size: 100%;
8
+ justify-content: center;
9
+ overflow: clip;
10
+ overflow-wrap: anywhere;
11
+ }
12
+
13
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__inner {
14
+ box-sizing: border-box;
15
+ display: flex;
16
+ flex-direction: column;
17
+ inline-size: 100%;
18
+ min-inline-size: 0;
19
+ max-inline-size: var(--size-content-max);
20
+ padding-block: var(--space-section-default);
21
+ padding-inline: var(--space-inset-page);
22
+ row-gap: var(--space-heading-content);
23
+ }
24
+
25
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__header {
26
+ display: flex;
27
+ flex-direction: column;
28
+ min-inline-size: 0;
29
+ max-inline-size: var(--size-measure-heading);
30
+ }
31
+
32
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__title {
33
+ margin-block: 0;
34
+ text-wrap: balance;
35
+ font-family: var(--font-h2-family);
36
+ font-size: var(--font-h2-size);
37
+ font-weight: var(--font-h2-weight);
38
+ letter-spacing: var(--font-h2-letter-spacing);
39
+ line-height: var(--font-h2-line-height);
40
+ }
41
+
42
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__list {
43
+ display: flex;
44
+ list-style: none;
45
+ margin: 0;
46
+ min-inline-size: 0;
47
+ outline-style: solid;
48
+ padding: 0;
49
+ column-gap: var(--space-grid-gutter);
50
+ outline-width: var(--border-width-none);
51
+ row-gap: var(--space-grid-gutter);
52
+ }
53
+
54
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__award {
55
+ align-items: center;
56
+ box-sizing: border-box;
57
+ display: flex;
58
+ justify-content: center;
59
+ min-inline-size: 0;
60
+ column-gap: var(--space-gap-xs);
61
+ max-inline-size: var(--size-grid-track-md);
62
+ }
63
+
64
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__laurel {
65
+ display: block;
66
+ flex: none;
67
+ inline-size: var(--icon-size-md);
68
+ }
69
+
70
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__copy {
71
+ align-items: center;
72
+ display: flex;
73
+ flex-direction: column;
74
+ min-inline-size: 0;
75
+ text-align: center;
76
+ row-gap: var(--space-heading-title-description-compact);
77
+ }
78
+
79
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__name {
80
+ margin: 0;
81
+ text-wrap: balance;
82
+ font-family: var(--font-label-sm-family);
83
+ font-size: var(--font-label-sm-size);
84
+ font-weight: var(--font-label-sm-weight);
85
+ letter-spacing: var(--font-label-sm-letter-spacing);
86
+ line-height: var(--font-label-sm-line-height);
87
+ }
88
+
89
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__issuer {
90
+ margin: 0;
91
+ font-family: var(--font-body-sm-family);
92
+ font-size: var(--font-body-sm-size);
93
+ font-weight: var(--font-body-sm-weight);
94
+ letter-spacing: var(--font-body-sm-letter-spacing);
95
+ line-height: var(--font-body-sm-line-height);
96
+ }
97
+
98
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__list:focus-visible {
99
+ outline-color: var(--color-border-focus);
100
+ outline-width: var(--border-width-focus);
101
+ }
102
+
103
+ :where([data-dds-context="marketing"]) .dds-awards[data-ground="page"] {
104
+ background-color: var(--color-bg-page);
105
+ color: var(--color-fg-default);
106
+ }
107
+
108
+ :where([data-dds-context="marketing"]) .dds-awards[data-ground="page"] .dds-awards__laurel {
109
+ color: var(--color-fg-muted);
110
+ }
111
+
112
+ :where([data-dds-context="marketing"]) .dds-awards[data-ground="strong"] {
113
+ background-color: var(--color-bg-brand-strong);
114
+ color: var(--color-fg-on-brand-strong);
115
+ }
116
+
117
+ :where([data-dds-context="marketing"]) .dds-awards[data-ground="strong"] .dds-awards__laurel {
118
+ color: var(--color-fg-muted-inverse);
119
+ }
120
+
121
+ :where([data-dds-context="marketing"]) .dds-awards[data-ground="subtle"] {
122
+ background-color: var(--color-bg-page);
123
+ background-image: linear-gradient(var(--color-bg-band-subtle), var(--color-bg-band-subtle));
124
+ color: var(--color-fg-default);
125
+ }
126
+
127
+ :where([data-dds-context="marketing"]) .dds-awards[data-ground="subtle"] .dds-awards__laurel {
128
+ color: var(--color-fg-muted);
129
+ }
130
+
131
+ :where([data-dds-context="marketing"]) .dds-awards[data-ground="strong"] .dds-awards__list:focus-visible {
132
+ outline-color: var(--color-border-focus-on-brand-strong);
133
+ }
134
+
@@ -0,0 +1,24 @@
1
+ import './Awards.css';
2
+ import './awards-impl.css';
3
+ import '../block-reveal.css';
4
+ import { type AwardsProps } from './Awards.types.js';
5
+ export type { AwardsProps };
6
+ /**
7
+ * A heading over the awards a company has won, each between two laurels — the reference design's
8
+ * FeatureAwards.
9
+ *
10
+ * One list, two shapes, and the stylesheet chooses between them on the section's width. From the
11
+ * fold it wraps into centred rows of five at most; on a phone it is one row across the band that
12
+ * runs on its own, the reference's marquee, holding still while the reader hovers, focuses or presses
13
+ * on it. The running row is the awards drawn twice, the second set hidden from assistive technology,
14
+ * so its loop has no seam and a screen reader counts each award once. A reader who asked for less
15
+ * motion gets the row still, to swipe.
16
+ *
17
+ * The awards are records rather than children, `Award` from `awards-data`: an award is
18
+ * two lines of words, and the laurels around them are the section's, the same for every award.
19
+ *
20
+ * It arrives the way every block does: the heading, then each award a step behind the one before,
21
+ * in reading order. `'use client'` for that, for `useId`, which names the region and the row by the
22
+ * heading, and for the measurement that gives the row its tab stop.
23
+ */
24
+ export declare function Awards({ ground, title, awards }: AwardsProps): import("react").JSX.Element | null;
@@ -0,0 +1,114 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useEffect, useId, useRef, useState } from 'react';
4
+ import './Awards.css';
5
+ import './awards-impl.css';
6
+ import '../block-reveal.css';
7
+ import { arriving, useReveal } from '../use-reveal.js';
8
+ import { awardsDefaults, awardsParts, } from './Awards.types.js';
9
+ /**
10
+ * Where an award comes in the arrival, capped so a long list does not keep a reader waiting.
11
+ *
12
+ * The heading takes the first step. The awards follow one step apart up to the fifth — a row's
13
+ * worth from the fold — and the rest arrive with it: block-reveal.css keeps a block's trail inside
14
+ * its own movement, and seventeen awards a step apart would trail the heading by most of a second.
15
+ */
16
+ const FIRST_AWARD = 1;
17
+ const LAST_STEP = FIRST_AWARD + 4;
18
+ /**
19
+ * The reference design's laurel, the vector its Stats section draws, in one colour.
20
+ *
21
+ * The left-hand branch: its leaves curl up and in toward whatever stands to its right. The second
22
+ * branch is this one mirrored, by the stylesheet, so one drawing serves both sides and a right-to-left
23
+ * page can swap which side is mirrored without a second picture. The reference laid it at a fifth of
24
+ * its strength; here it takes the band's quieter ink instead, a colour role rather than an alpha, so
25
+ * it follows the ground the way every other quiet thing in the package does.
26
+ */
27
+ const LAUREL_PATHS = [
28
+ 'M20.8655 76.0151C21.3631 78.5487 22.4577 80.4673 23.4245 81.7447C23.7945 82.2337 24.145 82.6275 24.4343 82.9245C24.5003 81.0424 24.5392 77.0209 23.854 73.543C23.3836 71.2282 22.6189 69.4263 21.9723 68.1997C21.7486 67.7754 21.539 67.42 21.3608 67.1361C21.2158 67.6487 21.042 68.3446 20.8935 69.1718C20.5634 71.0111 20.3623 73.4782 20.8655 76.0151Z',
29
+ 'M9.19518 69.4464C8.5612 69.2311 8.01354 69.0792 7.6041 68.9776C7.77674 69.5261 8.03563 70.2542 8.40971 71.0711C9.16156 72.713 10.3603 74.6729 12.1472 76.0342C13.9141 77.3864 15.8077 77.7752 17.2669 77.8239C17.9963 77.8483 18.6126 77.7873 19.0419 77.7209C18.3715 76.5307 16.6347 73.8279 14.0892 71.9349C12.4167 70.7081 10.6015 69.924 9.19518 69.4464Z',
30
+ 'M14.1789 62.4853C14.1095 65.0056 14.7018 67.1343 15.3106 68.6265C15.5268 69.1563 15.7445 69.6045 15.9342 69.9597C16.0737 69.4242 16.2473 68.7196 16.4239 67.9038C16.8294 66.0308 17.2467 63.5892 17.309 61.2688C17.3584 58.9612 17.0322 57.019 16.6942 55.65C16.5809 55.1908 16.4663 54.7965 16.3643 54.4749C16.1414 54.8952 15.8702 55.4487 15.5956 56.1107C14.9268 57.7233 14.2444 59.9642 14.1789 62.4853Z',
31
+ 'M6.16644 56.5363L5.92729 56.2113C4.18123 53.9739 2.10237 52.4221 0.99942 51.685C1.0448 52.2219 1.13195 52.9558 1.29599 53.7969C1.6458 55.5904 2.33816 57.834 3.68889 59.699C5.02796 61.5534 6.66938 62.5331 7.97363 63.0496C8.56984 63.2857 9.09434 63.4244 9.48448 63.5049C9.08235 62.1271 8.06278 59.1136 6.16644 56.5363Z',
32
+ 'M12.9202 41.9556C12.9103 41.468 12.8857 41.0438 12.8578 40.6964C12.5852 41.0139 12.2554 41.4254 11.9043 41.9234C10.9787 43.2365 9.91222 45.1415 9.34811 47.5086L9.21888 48.0509C8.78948 50.2094 8.89878 52.2002 9.13088 53.6853C9.21855 54.2463 9.32345 54.7333 9.42253 55.1275C10.2101 53.5777 11.6117 50.5783 12.3444 47.5177C12.8519 45.3454 12.9491 43.3817 12.9202 41.9556Z',
33
+ 'M4.26838 40.1575C3.16507 37.3338 1.55966 35.0449 0.658674 33.8839C0.595099 34.3962 0.53299 35.0674 0.509766 35.8425C0.454879 37.6743 0.618233 40.0556 1.46849 42.2871C2.30759 44.5064 3.60611 45.9871 4.68907 46.9107C5.12959 47.2864 5.53393 47.5694 5.85602 47.7717C5.82536 47.3041 5.77132 46.6715 5.67501 45.9295C5.46619 44.3205 5.06044 42.211 4.27156 40.1569L4.26838 40.1575Z',
34
+ 'M12.6632 27.4606C11.6314 28.3597 10.3804 29.7129 9.40352 31.5834L9.20135 32.004C8.19489 34.0975 7.83678 36.2499 7.73379 37.8807C7.69736 38.4576 7.693 38.9667 7.70264 39.3814C7.98105 39.0479 8.31846 38.6306 8.68777 38.1462C9.68653 36.8365 10.9078 35.0512 11.829 33.1204C12.7356 31.1936 13.238 29.3215 13.5154 27.9233C13.6157 27.4178 13.6864 26.9753 13.7361 26.6158C13.4324 26.8302 13.0648 27.1106 12.6632 27.4606Z',
35
+ 'M7.15889 23.0454L7.23043 22.5253C7.54518 19.6881 7.36017 17.0948 7.19664 15.6517C6.9244 16.0575 6.59747 16.5777 6.25738 17.1905C5.37216 18.7855 4.41002 20.986 4.07631 23.4177C3.74032 25.8399 4.108 27.8499 4.55657 29.25C4.7215 29.7648 4.89717 30.1965 5.05235 30.5349C5.64762 29.1157 6.71893 26.2445 7.15889 23.0454Z',
36
+ 'M20.7056 14.8951C19.4372 15.269 17.7724 15.9875 16.1554 17.3693L16.021 17.4932C14.3576 18.9542 13.2217 20.7665 12.5041 22.2202C12.2403 22.7546 12.0346 23.2374 11.8812 23.6318C12.2297 23.4596 12.6507 23.2423 13.1195 22.9822C14.4495 22.2442 16.1506 21.1686 17.6705 19.808C19.177 18.446 20.3493 16.9414 21.1512 15.7693C21.4549 15.3255 21.7047 14.9307 21.8987 14.6109C21.5673 14.6707 21.1626 14.7604 20.7056 14.8951Z',
37
+ 'M15.246 9.89451L15.3989 9.48769C16.3817 6.71545 16.8681 4.08928 17.0948 2.56556C16.7641 2.88544 16.3703 3.28963 15.9481 3.76978C14.7583 5.12276 13.3571 7.06214 12.4902 9.40367C11.6163 11.7394 11.483 13.8564 11.5665 15.3854C11.595 15.9081 11.6489 16.3613 11.7069 16.7298C11.9415 16.3768 12.2271 15.9318 12.5414 15.4103C13.3841 14.0121 14.4266 12.0747 15.246 9.89451Z',
38
+ 'M24.236 2.86551C22.4046 4.24716 21.0854 6.09763 20.225 7.6144C19.8673 8.24502 19.5916 8.81333 19.3933 9.25894C19.765 9.11933 20.2233 8.93634 20.7396 8.70812C22.1292 8.09394 23.9267 7.15785 25.5896 5.86671C27.2408 4.56435 28.6049 3.04428 29.5633 1.84034C29.9762 1.32163 30.3123 0.863542 30.5622 0.509562C30.206 0.526204 29.7564 0.567871 29.2396 0.659382C27.8788 0.900297 26.0564 1.48555 24.236 2.86551Z',
39
+ ];
40
+ /** One laurel branch. Decoration: hidden from assistive technology and never focusable. */
41
+ function Laurel({ side }) {
42
+ return (_jsx("svg", { className: awardsParts.laurel, "data-side": side, viewBox: "0 0 32 84", fill: "none", "aria-hidden": "true", focusable: "false", children: LAUREL_PATHS.map((d) => (_jsx("path", { d: d, fill: "currentColor", stroke: "currentColor" }, d))) }));
43
+ }
44
+ /**
45
+ * Whether the list is wider than the room it has — the phone's row, and only while it runs on past
46
+ * the band's edge.
47
+ *
48
+ * Scroller writes its tab stop unconditionally, because it cannot see what it was given. This can:
49
+ * the list is one of two shapes, and only one of them scrolls. A tab stop on rows that show every
50
+ * award is a stop that does nothing, so the list carries one while it overflows and drops it when a
51
+ * wider band wraps it. Measured rather than read off a breakpoint, because a phone's row of two
52
+ * short awards fits and does not scroll either.
53
+ *
54
+ * `false` until it has measured — a list rendered on the server has no width to ask about — and
55
+ * left there by a renderer with no ResizeObserver, which is the test environment rather than a
56
+ * browser anyone reads in.
57
+ */
58
+ function useOverflowing(list) {
59
+ const [overflowing, setOverflowing] = useState(false);
60
+ useEffect(() => {
61
+ const element = list.current;
62
+ if (element === null || typeof ResizeObserver === 'undefined')
63
+ return;
64
+ // Scrolled past its box, or — while the phone's row runs — drawn wider than the band it runs
65
+ // across: the running row is not a scroller, so it never scrolls, but it is still a row that
66
+ // goes past the edge, and its tab stop is how a keyboard holds it still.
67
+ const measure = () => {
68
+ const band = element.closest('section');
69
+ setOverflowing(element.scrollWidth > element.clientWidth ||
70
+ (band !== null && element.getBoundingClientRect().width > band.getBoundingClientRect().width + 1));
71
+ };
72
+ measure();
73
+ const observer = new ResizeObserver(measure);
74
+ observer.observe(element);
75
+ return () => observer.disconnect();
76
+ }, [list]);
77
+ return overflowing;
78
+ }
79
+ /** One award's badge: the award's words between its two laurels. */
80
+ function Badge({ award }) {
81
+ return (_jsxs(_Fragment, { children: [_jsx(Laurel, { side: "leading" }), _jsxs("div", { className: awardsParts.copy, children: [_jsx("p", { className: awardsParts.name, children: award.title }), _jsx("p", { className: awardsParts.issuer, children: award.issuer })] }), _jsx(Laurel, { side: "trailing" })] }));
82
+ }
83
+ /**
84
+ * A heading over the awards a company has won, each between two laurels — the reference design's
85
+ * FeatureAwards.
86
+ *
87
+ * One list, two shapes, and the stylesheet chooses between them on the section's width. From the
88
+ * fold it wraps into centred rows of five at most; on a phone it is one row across the band that
89
+ * runs on its own, the reference's marquee, holding still while the reader hovers, focuses or presses
90
+ * on it. The running row is the awards drawn twice, the second set hidden from assistive technology,
91
+ * so its loop has no seam and a screen reader counts each award once. A reader who asked for less
92
+ * motion gets the row still, to swipe.
93
+ *
94
+ * The awards are records rather than children, `Award` from `awards-data`: an award is
95
+ * two lines of words, and the laurels around them are the section's, the same for every award.
96
+ *
97
+ * It arrives the way every block does: the heading, then each award a step behind the one before,
98
+ * in reading order. `'use client'` for that, for `useId`, which names the region and the row by the
99
+ * heading, and for the measurement that gives the row its tab stop.
100
+ */
101
+ export function Awards({ ground = awardsDefaults.ground, title, awards }) {
102
+ const titleId = useId();
103
+ const [band, revealed] = useReveal();
104
+ const list = useRef(null);
105
+ const overflowing = useOverflowing(list);
106
+ // Nothing to show is nothing drawn: a heading over no awards is a claim with nothing behind it.
107
+ if (awards.length === 0)
108
+ return null;
109
+ return (_jsx("section", { className: awardsParts.root, "data-ground": ground, "aria-labelledby": titleId, children: _jsxs("div", { className: awardsParts.inner, ref: band, "data-revealed": revealed, children: [_jsx("div", { className: awardsParts.header, children: _jsx("h2", { className: awardsParts.title, id: titleId, ...arriving(0), children: title }) }), _jsxs("ul", { className: awardsParts.list, ref: list, role: "list", tabIndex: overflowing ? 0 : undefined, "aria-labelledby": overflowing ? titleId : undefined,
110
+ // How many awards there are, which the phone's running row times its loop by.
111
+ style: { '--dds-awards-count': awards.length }, children: [awards.map((award, at) => (
112
+ // An award's place is its identity: the list is the page's, and nothing here reorders it.
113
+ _jsx("li", { className: awardsParts.award, ...arriving(Math.min(FIRST_AWARD + at, LAST_STEP)), children: _jsx(Badge, { award: award }) }, at))), awards.map((award, at) => (_jsx("li", { className: awardsParts.award, "data-copy": "", "aria-hidden": "true", ...arriving(Math.min(FIRST_AWARD + at, LAST_STEP)), children: _jsx(Badge, { award: award }) }, `copy-${at}`)))] })] }) }));
114
+ }
@@ -0,0 +1,31 @@
1
+ import type { Award } from '../../awards-data.js';
2
+ export interface AwardsOwnProps {
3
+ /**
4
+ * `page` — The default, and the reference design's: the page's own white, with the laurels in color.fg.muted
5
+ * `subtle` — The grey band, for a section that needs setting apart from the one above it. Painted as the band's tint laid over the page's own ground, so it is the same grey whatever is behind the section
6
+ * `strong` — `color.bg.brand-strong`, the dark band, for a section a reader should arrive at. The heading and the awards turn white and the laurels take color.fg.muted-inverse, the band's own quieter ink
7
+ */
8
+ ground?: 'page' | 'subtle' | 'strong';
9
+ /** Always. What the badges are, in the fewest words that name them — "Our awards". */
10
+ title: string;
11
+ /** Always. The awards, in the order they are read — across each row from the fold, and along the one row on a phone. Newest first, usually: the year is what says a claim is current. Six or more, so the phone's row runs on past the band's edge. An empty list draws nothing. */
12
+ awards: Award[];
13
+ }
14
+ export type AwardsProps = AwardsOwnProps;
15
+ /** The class each part carries. Apply these — do not retype them. */
16
+ export declare const awardsParts: {
17
+ readonly root: "dds-awards";
18
+ readonly inner: "dds-awards__inner";
19
+ readonly header: "dds-awards__header";
20
+ readonly title: "dds-awards__title";
21
+ readonly list: "dds-awards__list";
22
+ readonly award: "dds-awards__award";
23
+ readonly laurel: "dds-awards__laurel";
24
+ readonly copy: "dds-awards__copy";
25
+ readonly name: "dds-awards__name";
26
+ readonly issuer: "dds-awards__issuer";
27
+ };
28
+ /** Generated so defaults cannot drift from the contract. */
29
+ export declare const awardsDefaults: {
30
+ readonly ground: "page";
31
+ };
@@ -0,0 +1,16 @@
1
+ // GENERATED from awards.contract.json. Do not edit.
2
+ /** The class each part carries. Apply these — do not retype them. */
3
+ export const awardsParts = {
4
+ root: 'dds-awards',
5
+ inner: 'dds-awards__inner',
6
+ header: 'dds-awards__header',
7
+ title: 'dds-awards__title',
8
+ list: 'dds-awards__list',
9
+ award: 'dds-awards__award',
10
+ laurel: 'dds-awards__laurel',
11
+ copy: 'dds-awards__copy',
12
+ name: 'dds-awards__name',
13
+ issuer: 'dds-awards__issuer',
14
+ };
15
+ /** Generated so defaults cannot drift from the contract. */
16
+ export const awardsDefaults = { ground: 'page' };