@deriv-com/dds-marketing 1.0.1 → 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 (336) hide show
  1. package/.llm/components/awards.md +209 -0
  2. package/.llm/components/background.md +420 -0
  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 +22 -0
  7. package/.llm/components/ctabannerslider.md +36 -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 +236 -0
  15. package/.llm/components/illustrationscene.md +229 -0
  16. package/.llm/components/imagebanner.md +278 -0
  17. package/.llm/components/landinghero.md +24 -0
  18. package/.llm/components/navbar.md +1 -1
  19. package/.llm/components/navbaritem.md +4 -0
  20. package/.llm/components/pageheader.md +22 -0
  21. package/.llm/components/paginationdots.md +6 -1
  22. package/.llm/components/producthero.md +35 -11
  23. package/.llm/components/resourcebanner.md +247 -0
  24. package/.llm/components/scenescroll.md +222 -0
  25. package/.llm/components/select.md +17 -0
  26. package/.llm/components/stats.md +219 -0
  27. package/.llm/components/steps.md +286 -0
  28. package/.llm/components/stickycards.md +251 -0
  29. package/.llm/components/tableheadercell.md +19 -0
  30. package/.llm/components/teamgrid.md +243 -0
  31. package/.llm/components/testimonialrow.md +5 -0
  32. package/.llm/components/testimonialslider.md +14 -1
  33. package/.llm/components/textarea.md +13 -0
  34. package/.llm/components/textinput.md +13 -0
  35. package/.llm/components/textscroll.md +187 -0
  36. package/.llm/components/tiers.md +227 -0
  37. package/.llm/digest/awards.md +45 -0
  38. package/.llm/digest/background.md +53 -0
  39. package/.llm/digest/bottomsheet.md +2 -0
  40. package/.llm/digest/comparisoncards.md +51 -0
  41. package/.llm/digest/comparisontable.md +53 -0
  42. package/.llm/digest/ctabanner.md +4 -0
  43. package/.llm/digest/ctabannerslider.md +7 -0
  44. package/.llm/digest/datatable.md +65 -0
  45. package/.llm/digest/downloadbanner.md +65 -0
  46. package/.llm/digest/featurecards.md +1 -1
  47. package/.llm/digest/featurecardscarousel.md +54 -0
  48. package/.llm/digest/featuresplit.md +1 -0
  49. package/.llm/digest/featurestack.md +48 -0
  50. package/.llm/digest/illustrationcard.md +46 -0
  51. package/.llm/digest/illustrationscene.md +50 -0
  52. package/.llm/digest/imagebanner.md +64 -0
  53. package/.llm/digest/landinghero.md +7 -0
  54. package/.llm/digest/navbaritem.md +1 -0
  55. package/.llm/digest/pageheader.md +4 -0
  56. package/.llm/digest/paginationdots.md +3 -1
  57. package/.llm/digest/producthero.md +4 -2
  58. package/.llm/digest/resourcebanner.md +53 -0
  59. package/.llm/digest/scenescroll.md +49 -0
  60. package/.llm/digest/select.md +5 -0
  61. package/.llm/digest/stats.md +46 -0
  62. package/.llm/digest/steps.md +55 -0
  63. package/.llm/digest/stickycards.md +52 -0
  64. package/.llm/digest/tableheadercell.md +4 -0
  65. package/.llm/digest/teamgrid.md +53 -0
  66. package/.llm/digest/testimonialrow.md +2 -0
  67. package/.llm/digest/testimonialslider.md +4 -0
  68. package/.llm/digest/textarea.md +4 -0
  69. package/.llm/digest/textinput.md +4 -0
  70. package/.llm/digest/textscroll.md +43 -0
  71. package/.llm/digest/tiers.md +50 -0
  72. package/.llm/index.md +25 -2
  73. package/.llm/tokens.md +37 -1
  74. package/AGENTS.md +20 -1
  75. package/dist/components/awards-data.d.ts +24 -0
  76. package/dist/components/awards-data.js +11 -0
  77. package/dist/components/block-image-data.d.ts +24 -0
  78. package/dist/components/block-image-data.js +9 -0
  79. package/dist/components/blocks/awards/Awards.css +134 -0
  80. package/dist/components/blocks/awards/Awards.d.ts +24 -0
  81. package/dist/components/blocks/awards/Awards.js +114 -0
  82. package/dist/components/blocks/awards/Awards.types.d.ts +31 -0
  83. package/dist/components/blocks/awards/Awards.types.js +16 -0
  84. package/dist/components/blocks/awards/awards-impl.css +222 -0
  85. package/dist/components/blocks/cards-of.d.ts +16 -0
  86. package/dist/components/blocks/cards-of.js +23 -0
  87. package/dist/components/blocks/comparison-cards/ComparisonCards.css +195 -0
  88. package/dist/components/blocks/comparison-cards/ComparisonCards.d.ts +24 -0
  89. package/dist/components/blocks/comparison-cards/ComparisonCards.js +75 -0
  90. package/dist/components/blocks/comparison-cards/ComparisonCards.types.d.ts +49 -0
  91. package/dist/components/blocks/comparison-cards/ComparisonCards.types.js +26 -0
  92. package/dist/components/blocks/comparison-cards/comparison-cards-impl.css +262 -0
  93. package/dist/components/blocks/comparison-table/ComparisonTable.css +111 -0
  94. package/dist/components/blocks/comparison-table/ComparisonTable.d.ts +25 -0
  95. package/dist/components/blocks/comparison-table/ComparisonTable.js +100 -0
  96. package/dist/components/blocks/comparison-table/ComparisonTable.types.d.ts +36 -0
  97. package/dist/components/blocks/comparison-table/ComparisonTable.types.js +15 -0
  98. package/dist/components/blocks/comparison-table/comparison-table-impl.css +143 -0
  99. package/dist/components/blocks/cta-banner/CtaBanner.css +1 -0
  100. package/dist/components/blocks/cta-banner/CtaBanner.d.ts +1 -1
  101. package/dist/components/blocks/cta-banner/CtaBanner.js +3 -2
  102. package/dist/components/blocks/cta-banner/CtaBanner.types.d.ts +6 -0
  103. package/dist/components/blocks/cta-banner/CtaBanner.types.js +1 -1
  104. package/dist/components/blocks/cta-banner/cta-banner-impl.css +8 -0
  105. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.css +1 -0
  106. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.d.ts +1 -1
  107. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.js +10 -5
  108. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.d.ts +12 -0
  109. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.js +1 -1
  110. package/dist/components/blocks/cta-banner-slider/cta-banner-slider-impl.css +8 -0
  111. package/dist/components/blocks/data-table/DataTable.css +170 -0
  112. package/dist/components/blocks/data-table/DataTable.d.ts +29 -0
  113. package/dist/components/blocks/data-table/DataTable.js +84 -0
  114. package/dist/components/blocks/data-table/DataTable.types.d.ts +69 -0
  115. package/dist/components/blocks/data-table/DataTable.types.js +19 -0
  116. package/dist/components/blocks/data-table/data-table-impl.css +155 -0
  117. package/dist/components/blocks/download-banner/DownloadBanner.css +228 -0
  118. package/dist/components/blocks/download-banner/DownloadBanner.d.ts +28 -0
  119. package/dist/components/blocks/download-banner/DownloadBanner.js +75 -0
  120. package/dist/components/blocks/download-banner/DownloadBanner.types.d.ts +56 -0
  121. package/dist/components/blocks/download-banner/DownloadBanner.types.js +23 -0
  122. package/dist/components/blocks/download-banner/download-banner-impl.css +216 -0
  123. package/dist/components/blocks/faq-accordion/FaqAccordion.css +1 -0
  124. package/dist/components/blocks/faq-accordion/faq-accordion-impl.css +3 -7
  125. package/dist/components/blocks/feature-bullets/FeatureBullets.css +1 -0
  126. package/dist/components/blocks/feature-bullets/feature-bullets-impl.css +14 -1
  127. package/dist/components/blocks/feature-cards/FeatureCards.css +1 -0
  128. package/dist/components/blocks/feature-cards/FeatureCards.d.ts +2 -1
  129. package/dist/components/blocks/feature-cards/FeatureCards.js +4 -21
  130. package/dist/components/blocks/feature-cards/feature-cards-impl.css +10 -9
  131. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.css +115 -0
  132. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.d.ts +30 -0
  133. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.js +160 -0
  134. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.d.ts +52 -0
  135. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.js +17 -0
  136. package/dist/components/blocks/feature-cards-carousel/feature-cards-carousel-impl.css +207 -0
  137. package/dist/components/blocks/feature-scroll/FeatureScroll.css +1 -0
  138. package/dist/components/blocks/feature-split/FeatureSplit.css +1 -0
  139. package/dist/components/blocks/feature-split/feature-split-impl.css +14 -1
  140. package/dist/components/blocks/feature-stack/FeatureStack.css +86 -0
  141. package/dist/components/blocks/feature-stack/FeatureStack.d.ts +19 -0
  142. package/dist/components/blocks/feature-stack/FeatureStack.js +27 -0
  143. package/dist/components/blocks/feature-stack/FeatureStack.types.d.ts +34 -0
  144. package/dist/components/blocks/feature-stack/FeatureStack.types.js +14 -0
  145. package/dist/components/blocks/feature-stack/feature-stack-impl.css +87 -0
  146. package/dist/components/blocks/image-banner/ImageBanner.css +133 -0
  147. package/dist/components/blocks/image-banner/ImageBanner.d.ts +32 -0
  148. package/dist/components/blocks/image-banner/ImageBanner.js +41 -0
  149. package/dist/components/blocks/image-banner/ImageBanner.types.d.ts +54 -0
  150. package/dist/components/blocks/image-banner/ImageBanner.types.js +14 -0
  151. package/dist/components/blocks/image-banner/image-banner-impl.css +281 -0
  152. package/dist/components/blocks/landing-hero/LandingHero.css +1 -0
  153. package/dist/components/blocks/landing-hero/LandingHero.d.ts +1 -1
  154. package/dist/components/blocks/landing-hero/LandingHero.js +4 -3
  155. package/dist/components/blocks/landing-hero/LandingHero.types.d.ts +7 -3
  156. package/dist/components/blocks/logo-columns/LogoColumns.css +1 -0
  157. package/dist/components/blocks/logo-rows/LogoRows.css +1 -0
  158. package/dist/components/blocks/page-header/PageHeader.css +1 -0
  159. package/dist/components/blocks/page-header/PageHeader.d.ts +1 -1
  160. package/dist/components/blocks/page-header/PageHeader.js +3 -2
  161. package/dist/components/blocks/page-header/PageHeader.types.d.ts +6 -0
  162. package/dist/components/blocks/page-header/PageHeader.types.js +1 -1
  163. package/dist/components/blocks/page-header/page-header-impl.css +10 -0
  164. package/dist/components/blocks/product-hero/ProductHero.css +8 -3
  165. package/dist/components/blocks/product-hero/ProductHero.d.ts +1 -1
  166. package/dist/components/blocks/product-hero/ProductHero.js +5 -2
  167. package/dist/components/blocks/product-hero/ProductHero.types.d.ts +5 -1
  168. package/dist/components/blocks/product-hero/ProductHero.types.js +1 -0
  169. package/dist/components/blocks/product-hero/product-hero-impl.css +43 -12
  170. package/dist/components/blocks/resource-banner/ResourceBanner.css +106 -0
  171. package/dist/components/blocks/resource-banner/ResourceBanner.d.ts +32 -0
  172. package/dist/components/blocks/resource-banner/ResourceBanner.js +51 -0
  173. package/dist/components/blocks/resource-banner/ResourceBanner.types.d.ts +44 -0
  174. package/dist/components/blocks/resource-banner/ResourceBanner.types.js +14 -0
  175. package/dist/components/blocks/resource-banner/resource-banner-impl.css +69 -0
  176. package/dist/components/blocks/scene-scroll/SceneScroll.css +93 -0
  177. package/dist/components/blocks/scene-scroll/SceneScroll.d.ts +36 -0
  178. package/dist/components/blocks/scene-scroll/SceneScroll.js +54 -0
  179. package/dist/components/blocks/scene-scroll/SceneScroll.types.d.ts +32 -0
  180. package/dist/components/blocks/scene-scroll/SceneScroll.types.js +15 -0
  181. package/dist/components/blocks/scene-scroll/scene-scroll-impl.css +275 -0
  182. package/dist/components/blocks/stats/Stats.css +139 -0
  183. package/dist/components/blocks/stats/Stats.d.ts +24 -0
  184. package/dist/components/blocks/stats/Stats.js +120 -0
  185. package/dist/components/blocks/stats/Stats.types.d.ts +36 -0
  186. package/dist/components/blocks/stats/Stats.types.js +19 -0
  187. package/dist/components/blocks/stats/stats-count.d.ts +34 -0
  188. package/dist/components/blocks/stats/stats-count.js +61 -0
  189. package/dist/components/blocks/stats/stats-impl.css +284 -0
  190. package/dist/components/blocks/stats/use-wheel.d.ts +37 -0
  191. package/dist/components/blocks/stats/use-wheel.js +126 -0
  192. package/dist/components/blocks/steps/Steps.css +202 -0
  193. package/dist/components/blocks/steps/Steps.d.ts +32 -0
  194. package/dist/components/blocks/steps/Steps.js +65 -0
  195. package/dist/components/blocks/steps/Steps.types.d.ts +48 -0
  196. package/dist/components/blocks/steps/Steps.types.js +21 -0
  197. package/dist/components/blocks/steps/steps-impl.css +216 -0
  198. package/dist/components/blocks/steps/use-turn.d.ts +33 -0
  199. package/dist/components/blocks/steps/use-turn.js +75 -0
  200. package/dist/components/blocks/sticky-cards/StickyCards.css +154 -0
  201. package/dist/components/blocks/sticky-cards/StickyCards.d.ts +35 -0
  202. package/dist/components/blocks/sticky-cards/StickyCards.js +153 -0
  203. package/dist/components/blocks/sticky-cards/StickyCards.types.d.ts +43 -0
  204. package/dist/components/blocks/sticky-cards/StickyCards.types.js +18 -0
  205. package/dist/components/blocks/sticky-cards/sticky-cards-impl.css +393 -0
  206. package/dist/components/blocks/team-grid/TeamGrid.css +159 -0
  207. package/dist/components/blocks/team-grid/TeamGrid.d.ts +28 -0
  208. package/dist/components/blocks/team-grid/TeamGrid.js +74 -0
  209. package/dist/components/blocks/team-grid/TeamGrid.types.d.ts +51 -0
  210. package/dist/components/blocks/team-grid/TeamGrid.types.js +20 -0
  211. package/dist/components/blocks/team-grid/team-grid-impl.css +129 -0
  212. package/dist/components/blocks/testimonial-row/TestimonialRow.css +1 -0
  213. package/dist/components/blocks/testimonial-row/TestimonialRow.d.ts +1 -1
  214. package/dist/components/blocks/testimonial-row/TestimonialRow.js +4 -3
  215. package/dist/components/blocks/testimonial-row/TestimonialRow.types.d.ts +3 -0
  216. package/dist/components/blocks/testimonial-row/TestimonialRow.types.js +1 -1
  217. package/dist/components/blocks/testimonial-row/testimonial-row-impl.css +8 -0
  218. package/dist/components/blocks/testimonial-slider/TestimonialSlider.css +1 -0
  219. package/dist/components/blocks/testimonial-slider/TestimonialSlider.d.ts +1 -1
  220. package/dist/components/blocks/testimonial-slider/TestimonialSlider.js +2 -2
  221. package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.d.ts +8 -0
  222. package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.js +1 -1
  223. package/dist/components/blocks/text-scroll/TextScroll.css +53 -0
  224. package/dist/components/blocks/text-scroll/TextScroll.d.ts +5 -0
  225. package/dist/components/blocks/text-scroll/TextScroll.js +71 -0
  226. package/dist/components/blocks/text-scroll/TextScroll.types.d.ts +22 -0
  227. package/dist/components/blocks/text-scroll/TextScroll.types.js +10 -0
  228. package/dist/components/blocks/text-scroll/text-scroll-impl.css +115 -0
  229. package/dist/components/blocks/tiers/Tiers.css +233 -0
  230. package/dist/components/blocks/tiers/Tiers.d.ts +32 -0
  231. package/dist/components/blocks/tiers/Tiers.js +68 -0
  232. package/dist/components/blocks/tiers/Tiers.types.d.ts +45 -0
  233. package/dist/components/blocks/tiers/Tiers.types.js +25 -0
  234. package/dist/components/blocks/tiers/tiers-impl.css +185 -0
  235. package/dist/components/blocks/use-rotation.d.ts +12 -2
  236. package/dist/components/blocks/use-rotation.js +6 -28
  237. package/dist/components/comparison-cards-data.d.ts +59 -0
  238. package/dist/components/comparison-cards-data.js +12 -0
  239. package/dist/components/comparison-table-data.d.ts +39 -0
  240. package/dist/components/comparison-table-data.js +11 -0
  241. package/dist/components/core/accordion-item/AccordionItem.css +1 -5
  242. package/dist/components/core/background/Background.css +92 -0
  243. package/dist/components/core/background/Background.d.ts +27 -0
  244. package/dist/components/core/background/Background.js +45 -0
  245. package/dist/components/core/background/Background.types.d.ts +39 -0
  246. package/dist/components/core/background/Background.types.js +11 -0
  247. package/dist/components/core/background/background-impl.css +760 -0
  248. package/dist/components/core/background/halftone.d.ts +134 -0
  249. package/dist/components/core/background/halftone.js +722 -0
  250. package/dist/components/core/background/patterns.d.ts +66 -0
  251. package/dist/components/core/background/patterns.js +244 -0
  252. package/dist/components/core/background/shader.d.ts +44 -0
  253. package/dist/components/core/background/shader.js +307 -0
  254. package/dist/components/core/background/use-halftone.d.ts +15 -0
  255. package/dist/components/core/background/use-halftone.js +27 -0
  256. package/dist/components/core/background/use-offscreen.d.ts +10 -0
  257. package/dist/components/core/background/use-offscreen.js +30 -0
  258. package/dist/components/core/background/use-shader.d.ts +11 -0
  259. package/dist/components/core/background/use-shader.js +25 -0
  260. package/dist/components/core/background/use-spotlight.d.ts +14 -0
  261. package/dist/components/core/background/use-spotlight.js +73 -0
  262. package/dist/components/core/bottom-sheet/BottomSheet.js +2 -2
  263. package/dist/components/core/bottom-sheet/BottomSheet.types.d.ts +3 -1
  264. package/dist/components/core/breadcrumb/Breadcrumb.d.ts +1 -0
  265. package/dist/components/core/breadcrumb/Breadcrumb.js +1 -0
  266. package/dist/components/core/breadcrumb/breadcrumb-impl.css +11 -0
  267. package/dist/components/core/button/button-impl.css +14 -1
  268. package/dist/components/core/illustration-card/IllustrationCard.css +40 -0
  269. package/dist/components/core/illustration-card/IllustrationCard.d.ts +22 -0
  270. package/dist/components/core/illustration-card/IllustrationCard.js +82 -0
  271. package/dist/components/core/illustration-card/IllustrationCard.types.d.ts +23 -0
  272. package/dist/components/core/illustration-card/IllustrationCard.types.js +8 -0
  273. package/dist/components/core/illustration-card/illustration-card-impl.css +47 -0
  274. package/dist/components/core/illustration-scene/IllustrationScene.css +41 -0
  275. package/dist/components/core/illustration-scene/IllustrationScene.d.ts +14 -0
  276. package/dist/components/core/illustration-scene/IllustrationScene.js +16 -0
  277. package/dist/components/core/illustration-scene/IllustrationScene.types.d.ts +32 -0
  278. package/dist/components/core/illustration-scene/IllustrationScene.types.js +8 -0
  279. package/dist/components/core/illustration-scene/illustration-scene-impl.css +46 -0
  280. package/dist/components/core/link/Link.js +7 -3
  281. package/dist/components/core/link/link-impl.css +29 -2
  282. package/dist/components/core/navbar/Navbar.css +2 -2
  283. package/dist/components/core/navbar/Navbar.types.d.ts +1 -1
  284. package/dist/components/core/navbar-item/NavbarItem.d.ts +2 -1
  285. package/dist/components/core/navbar-item/NavbarItem.js +3 -10
  286. package/dist/components/core/navbar-item/NavbarItem.types.d.ts +4 -1
  287. package/dist/components/core/navbar-item/NavbarItem.types.js +1 -1
  288. package/dist/components/core/navbar-item/navbar-item-impl.css +10 -0
  289. package/dist/components/core/navbar-menu/navbar-menu-impl.css +9 -0
  290. package/dist/components/core/navbar-switcher/navbar-switcher-impl.css +19 -0
  291. package/dist/components/core/pagination/Pagination.js +1 -1
  292. package/dist/components/core/pagination/pagination-impl.css +9 -0
  293. package/dist/components/core/pagination-dots/PaginationDots.d.ts +1 -1
  294. package/dist/components/core/pagination-dots/PaginationDots.js +3 -3
  295. package/dist/components/core/pagination-dots/PaginationDots.types.d.ts +3 -1
  296. package/dist/components/core/segmented-control/SegmentedControl.css +4 -3
  297. package/dist/components/core/segmented-control/SegmentedControl.js +17 -3
  298. package/dist/components/core/segmented-control-item/SegmentedControlItem.css +2 -1
  299. package/dist/components/core/select/Select.js +3 -3
  300. package/dist/components/core/select/Select.types.d.ts +11 -1
  301. package/dist/components/core/select/Select.types.js +1 -1
  302. package/dist/components/core/tab-list/TabList.js +9 -1
  303. package/dist/components/core/table-header-cell/TableHeaderCell.d.ts +1 -1
  304. package/dist/components/core/table-header-cell/TableHeaderCell.js +5 -2
  305. package/dist/components/core/table-header-cell/TableHeaderCell.types.d.ts +7 -1
  306. package/dist/components/core/table-header-cell/TableHeaderCell.types.js +1 -1
  307. package/dist/components/core/text-area/TextArea.d.ts +1 -1
  308. package/dist/components/core/text-area/TextArea.js +2 -2
  309. package/dist/components/core/text-area/TextArea.types.d.ts +9 -1
  310. package/dist/components/core/text-area/TextArea.types.js +1 -1
  311. package/dist/components/core/text-input/TextInput.d.ts +1 -1
  312. package/dist/components/core/text-input/TextInput.js +2 -2
  313. package/dist/components/core/text-input/TextInput.types.d.ts +9 -1
  314. package/dist/components/core/text-input/TextInput.types.js +1 -1
  315. package/dist/components/data-table-data.d.ts +33 -0
  316. package/dist/components/data-table-data.js +12 -0
  317. package/dist/components/download-banner-data.d.ts +52 -0
  318. package/dist/components/download-banner-data.js +11 -0
  319. package/dist/components/index.d.ts +51 -0
  320. package/dist/components/index.js +38 -0
  321. package/dist/components/resource-banner-data.d.ts +34 -0
  322. package/dist/components/resource-banner-data.js +13 -0
  323. package/dist/components/scene-scroll-data.d.ts +24 -0
  324. package/dist/components/scene-scroll-data.js +9 -0
  325. package/dist/components/stats-data.d.ts +28 -0
  326. package/dist/components/stats-data.js +11 -0
  327. package/dist/components/steps-data.d.ts +38 -0
  328. package/dist/components/steps-data.js +13 -0
  329. package/dist/components/sticky-cards-data.d.ts +43 -0
  330. package/dist/components/sticky-cards-data.js +12 -0
  331. package/dist/components/team-grid-data.d.ts +38 -0
  332. package/dist/components/team-grid-data.js +11 -0
  333. package/dist/components/tiers-data.d.ts +47 -0
  334. package/dist/components/tiers-data.js +13 -0
  335. package/dist/marketing.css +101 -28
  336. package/package.json +1 -1
@@ -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' };
@@ -0,0 +1,222 @@
1
+ /*
2
+ * Scoped to this package, like the generated sheet beside it.
3
+ */
4
+
5
+ /*
6
+ * The header starts on a phone and is centred from the fold — FeatureCards' arrangement and its
7
+ * reason: centred text starts every line at a different edge, which costs little across a wide
8
+ * measure and a great deal across a narrow one. The header is capped narrower than the column, so
9
+ * `margin-inline: auto` is what centres the box rather than its words inside a box left at the
10
+ * start edge.
11
+ *
12
+ * `48rem` longhand because `var()` is not permitted in a container query condition, and it is the
13
+ * width the rest of this package folds at.
14
+ */
15
+ @container (min-width: 48rem) {
16
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__header {
17
+ align-items: center;
18
+ margin-inline: auto;
19
+ text-align: center;
20
+ }
21
+ }
22
+
23
+ /* A laurel keeps its own proportions at the width it is given. */
24
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__laurel {
25
+ block-size: auto;
26
+ }
27
+
28
+ /*
29
+ * The words take what the two laurels leave, from a zero basis so a long award wraps inside the
30
+ * badge rather than pushing a laurel out of it. Here rather than in the contract, whose static CSS
31
+ * holds keywords and a flex shorthand is three numbers.
32
+ */
33
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__copy {
34
+ flex: 1 1 0;
35
+ }
36
+
37
+ /*
38
+ * The laurels turn in toward the words.
39
+ *
40
+ * The drawing is the left-hand branch, its leaves curling toward whatever stands to its right, so
41
+ * the trailing one is mirrored. In a right-to-left page the row is laid from the other edge — the
42
+ * leading laurel on the right — and the mirroring swaps with it. `scale` rather than a transform,
43
+ * so nothing else that might move the laurel has to know about it.
44
+ */
45
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__laurel[data-side="trailing"],
46
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__laurel[data-side="leading"]:dir(rtl) {
47
+ scale: -1 1;
48
+ }
49
+
50
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__laurel[data-side="trailing"]:dir(rtl) {
51
+ scale: none;
52
+ }
53
+
54
+ /*
55
+ * On a phone, one row across the band.
56
+ *
57
+ * This is the row as it stands still — swiped, the browser's own scrolling coming to rest on a
58
+ * badge. It is what a reader who asked for less motion gets, and what every reader gets until the
59
+ * running row below takes it over.
60
+ *
61
+ * It runs out to the band's edges while its first badge lines up with the heading — TestimonialRow's
62
+ * breakout. `cqi` is the band's width, the root declaring `container-type`, and the bleed is how far
63
+ * the column stands in from the band's edge: half of whatever the band has beyond the content
64
+ * measure, plus the gutter. A negative margin of that measure takes the row out to both edges, and a
65
+ * leading padding of it brings the first badge back. The padding is on the row that scrolls, so it
66
+ * scrolls away with the badges and a badge is cut off by the band rather than by the column, which
67
+ * is the sign that there is more. `scroll-padding-inline` matches it, or a browser reads the resting
68
+ * position as short of the first badge's snap point and scrolls the gutter away on load.
69
+ *
70
+ * The block padding is room for the row's focus ring and for each badge's arrival, which starts a
71
+ * step below where it lands and which a scroll container would otherwise clip; the negative margin
72
+ * gives it back.
73
+ *
74
+ * The scrollbar stays — Scroller's reasoning: with no arrows under the row it is the standing sign
75
+ * that the row moves.
76
+ *
77
+ * `47.9375rem` is the last width below the fold, LogoRows' bound.
78
+ */
79
+ @container (max-width: 47.9375rem) {
80
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__list {
81
+ --dds-awards-bleed: calc((100cqi - min(100cqi, var(--size-content-max))) / 2 + var(--space-inset-page));
82
+ flex-wrap: nowrap;
83
+ margin-block: calc(-1 * var(--space-gap-sm));
84
+ margin-inline: calc(-1 * var(--dds-awards-bleed));
85
+ overflow-x: auto;
86
+ overflow-y: hidden;
87
+ overscroll-behavior-x: contain;
88
+ padding-block: var(--space-gap-sm);
89
+ padding-inline-start: var(--dds-awards-bleed);
90
+ scroll-padding-inline: var(--dds-awards-bleed);
91
+ scroll-snap-type: x proximity;
92
+ }
93
+
94
+ /*
95
+ * The trailing gutter, as a spacer rather than a padding — TestimonialRow's. A scroll container
96
+ * leaves its end padding out of what it scrolls to once its content overflows, so the last badge
97
+ * would come to rest against the band's edge. A generated box is a flex item like a badge, and its
98
+ * width counts; the negative margin takes back the gap the row puts before it.
99
+ */
100
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__list::after {
101
+ content: '';
102
+ flex: none;
103
+ inline-size: var(--dds-awards-bleed);
104
+ margin-inline-start: calc(-1 * var(--space-grid-gutter));
105
+ }
106
+
107
+ /*
108
+ * A badge on the row keeps its width and does not shrink: a flex item shrinks to fit before it
109
+ * overflows, and a row of squeezed badges is the one thing this is not. size.grid.track-md, its
110
+ * ceiling from the fold, so a badge is one width at every size and an award wraps the same way.
111
+ */
112
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__award {
113
+ flex: none;
114
+ inline-size: var(--size-grid-track-md);
115
+ scroll-snap-align: start;
116
+ }
117
+
118
+ /*
119
+ * The row's focus ring is drawn inside it. The row runs out to the band's edges and the band clips
120
+ * its overflow, so a ring drawn outside would lose its two sides to the band.
121
+ */
122
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__list:focus-visible {
123
+ outline-offset: calc(-1 * var(--border-width-focus));
124
+ }
125
+ }
126
+
127
+ /*
128
+ * The running row's second set is drawn only while the row runs.
129
+ */
130
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__award[data-copy] {
131
+ display: none;
132
+ }
133
+
134
+ /*
135
+ * On a phone, for a reader who has not asked for less motion, the row runs on its own — the
136
+ * reference's marquee.
137
+ *
138
+ * The awards are drawn twice, the second set hidden from assistive technology, and the row is moved
139
+ * along by one set's width and starts again, which lands each award exactly where its copy was: the
140
+ * loop has no seam. One set is half the row less half a gutter — the row is both sets and the
141
+ * gutters between them, one fewer gutter than it has badges.
142
+ *
143
+ * The row stops being a scroller while it runs, so nothing is scrolled under it, and starts at the
144
+ * band's edge rather than in line with the heading: a running row has no first badge to line up.
145
+ * The band clips it.
146
+ *
147
+ * It takes motion.duration.ticker per award for one loop, so a long set runs at the pace of a short
148
+ * one, and it holds still while the reader hovers on it, focuses inside it — the row is a tab stop
149
+ * while it runs past the band — or presses on it: the way to read an award that is moving, and the
150
+ * way to stop it.
151
+ *
152
+ * In a right-to-left page the row runs the other way, towards the edge it starts from.
153
+ */
154
+ @container (max-width: 47.9375rem) {
155
+ @media (prefers-reduced-motion: no-preference) {
156
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__list {
157
+ animation: dds-awards-run calc(var(--motion-duration-ticker) * var(--dds-awards-count, 1)) linear
158
+ infinite;
159
+ inline-size: max-content;
160
+ overflow: visible;
161
+ padding-inline-start: 0;
162
+ scroll-snap-type: none;
163
+ }
164
+
165
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__list:dir(rtl) {
166
+ animation-name: dds-awards-run-rtl;
167
+ }
168
+
169
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__list:is(:hover, :focus-within, :active) {
170
+ animation-play-state: paused;
171
+ }
172
+
173
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__list::after {
174
+ content: none;
175
+ }
176
+
177
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__award[data-copy] {
178
+ display: flex;
179
+ }
180
+ }
181
+ }
182
+
183
+ @keyframes dds-awards-run {
184
+ to {
185
+ translate: calc(-50% - var(--space-grid-gutter) / 2) 0;
186
+ }
187
+ }
188
+
189
+ @keyframes dds-awards-run-rtl {
190
+ to {
191
+ translate: calc(50% + var(--space-grid-gutter) / 2) 0;
192
+ }
193
+ }
194
+
195
+ /* Said again for the sheet's own sake: a reader who asked for less motion never gets the running row. */
196
+ @media (prefers-reduced-motion: reduce) {
197
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__list {
198
+ animation: none;
199
+ }
200
+ }
201
+
202
+ /*
203
+ * From the fold, centred rows of five at most.
204
+ *
205
+ * Each badge grows from a shared basis and stops at size.grid.track-md, so a row holds as many as fit
206
+ * and a short one is not stretched across the band; `justify-content` centres the rows, the short
207
+ * last one included. The basis is a fifth of the row — the space five badges and their four gutters
208
+ * leave — so a sixth never fits, however wide the band, and it never falls below
209
+ * size.grid.track-sm, the narrowest a badge's words survive at: as the band narrows the row drops to
210
+ * four, three, two. Column count read from the room rather than from a breakpoint, the
211
+ * gap-names-its-relationship rule's last paragraph.
212
+ */
213
+ @container (min-width: 48rem) {
214
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__list {
215
+ flex-wrap: wrap;
216
+ justify-content: center;
217
+ }
218
+
219
+ :where([data-dds-context="marketing"]) .dds-awards .dds-awards__award {
220
+ flex: 1 1 max(var(--size-grid-track-sm), calc((100% - 4 * var(--space-grid-gutter)) / 5));
221
+ }
222
+ }
@@ -0,0 +1,16 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * The cards a block was handed, with any fragment opened out.
4
+ *
5
+ * `Children.toArray` flattens arrays and leaves a fragment whole, so a page writing
6
+ * `<>{cards}</>` handed over one child: every card in a single cell, and the block reading the set
7
+ * as one card alone. A fragment is the page grouping its own markup, never a card, so it is opened
8
+ * out here and the block counts what is inside it.
9
+ *
10
+ * Shared because two blocks lay out the page's own cards, FeatureCards and FeatureCardsCarousel,
11
+ * and both have to count them the same way.
12
+ */
13
+ export declare function cardsOf(children: ReactNode, within?: string): {
14
+ key: string;
15
+ card: ReactNode;
16
+ }[];
@@ -0,0 +1,23 @@
1
+ import { Children, Fragment, isValidElement } from 'react';
2
+ /**
3
+ * The cards a block was handed, with any fragment opened out.
4
+ *
5
+ * `Children.toArray` flattens arrays and leaves a fragment whole, so a page writing
6
+ * `<>{cards}</>` handed over one child: every card in a single cell, and the block reading the set
7
+ * as one card alone. A fragment is the page grouping its own markup, never a card, so it is opened
8
+ * out here and the block counts what is inside it.
9
+ *
10
+ * Shared because two blocks lay out the page's own cards, FeatureCards and FeatureCardsCarousel,
11
+ * and both have to count them the same way.
12
+ */
13
+ export function cardsOf(children, within = '') {
14
+ return Children.toArray(children).flatMap((child, at) => {
15
+ // `toArray` keys a fragment's children afresh — `.0`, `.1` — so a card is keyed by the
16
+ // fragment it came out of as well as its own place, or two cards from different groups share a
17
+ // key and React reconciles one into the other's cell.
18
+ const key = `${within}${isValidElement(child) && child.key !== null ? child.key : at}`;
19
+ return isValidElement(child) && child.type === Fragment
20
+ ? cardsOf(child.props.children, `${key}/`)
21
+ : [{ key, card: child }];
22
+ });
23
+ }
@@ -0,0 +1,195 @@
1
+ /* GENERATED from comparisoncards.contract.json. Do not edit. */
2
+
3
+ :where([data-dds-context="marketing"]) .dds-comparisoncards {
4
+ box-sizing: border-box;
5
+ container-type: inline-size;
6
+ display: flex;
7
+ inline-size: 100%;
8
+ justify-content: center;
9
+ overflow-wrap: anywhere;
10
+ }
11
+
12
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__inner {
13
+ box-sizing: border-box;
14
+ display: flex;
15
+ flex-direction: column;
16
+ inline-size: 100%;
17
+ min-inline-size: 0;
18
+ max-inline-size: var(--size-content-max);
19
+ padding-block: var(--space-section-default);
20
+ padding-inline: var(--space-inset-page);
21
+ row-gap: var(--space-heading-content);
22
+ }
23
+
24
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__header {
25
+ display: flex;
26
+ flex-direction: column;
27
+ min-inline-size: 0;
28
+ max-inline-size: var(--size-measure-heading);
29
+ row-gap: var(--space-gap-none);
30
+ }
31
+
32
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__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
+ margin-block-end: var(--space-heading-title-description);
41
+ }
42
+
43
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__description {
44
+ margin-block: 0;
45
+ font-family: var(--font-body-md-family);
46
+ font-size: var(--font-body-md-size);
47
+ font-weight: var(--font-body-md-weight);
48
+ letter-spacing: var(--font-body-md-letter-spacing);
49
+ line-height: var(--font-body-md-line-height);
50
+ max-inline-size: var(--size-measure-description);
51
+ }
52
+
53
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid {
54
+ display: grid;
55
+ list-style: none;
56
+ margin: 0;
57
+ min-inline-size: 0;
58
+ padding: 0;
59
+ column-gap: var(--space-grid-gutter);
60
+ row-gap: var(--space-grid-gutter);
61
+ }
62
+
63
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__item {
64
+ display: grid;
65
+ min-inline-size: 0;
66
+ }
67
+
68
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__body {
69
+ box-sizing: border-box;
70
+ display: flex;
71
+ flex: auto;
72
+ flex-direction: column;
73
+ min-inline-size: 0;
74
+ padding-block: var(--space-inset-card);
75
+ padding-inline: var(--space-inset-card);
76
+ }
77
+
78
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__intro {
79
+ display: flex;
80
+ flex-direction: column;
81
+ margin-block-end: var(--space-gap-md);
82
+ row-gap: var(--space-heading-title-description-compact);
83
+ }
84
+
85
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__card-head {
86
+ align-items: flex-start;
87
+ display: flex;
88
+ justify-content: space-between;
89
+ column-gap: var(--space-gap-md);
90
+ }
91
+
92
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__card-title {
93
+ margin-block: 0;
94
+ font-family: var(--font-h5-family);
95
+ font-size: var(--font-h5-size);
96
+ font-weight: var(--font-h5-weight);
97
+ letter-spacing: var(--font-h5-letter-spacing);
98
+ line-height: var(--font-h5-line-height);
99
+ }
100
+
101
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__highlight {
102
+ display: flex;
103
+ position: absolute;
104
+ padding-inline: var(--space-gap-none);
105
+ }
106
+
107
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__card-description {
108
+ margin-block: 0;
109
+ font-family: var(--font-body-md-family);
110
+ font-size: var(--font-body-md-size);
111
+ font-weight: var(--font-body-md-weight);
112
+ letter-spacing: var(--font-body-md-letter-spacing);
113
+ line-height: var(--font-body-md-line-height);
114
+ }
115
+
116
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__rows {
117
+ display: flex;
118
+ flex-direction: column;
119
+ margin-block: 0;
120
+ margin-inline: 0;
121
+ padding-block: 0;
122
+ padding-inline: 0;
123
+ row-gap: var(--space-gap-none);
124
+ }
125
+
126
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__row {
127
+ align-items: baseline;
128
+ border-block-end-style: solid;
129
+ display: flex;
130
+ justify-content: space-between;
131
+ border-block-end-width: var(--border-width-default);
132
+ column-gap: var(--space-gap-md);
133
+ padding-block: var(--space-inset-md);
134
+ }
135
+
136
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__row-label {
137
+ margin-inline: 0;
138
+ min-inline-size: 0;
139
+ font-family: var(--font-body-md-family);
140
+ font-size: var(--font-body-md-size);
141
+ font-weight: var(--font-body-md-weight);
142
+ letter-spacing: var(--font-body-md-letter-spacing);
143
+ line-height: var(--font-body-md-line-height);
144
+ }
145
+
146
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__row-value {
147
+ margin-inline: 0;
148
+ min-inline-size: 0;
149
+ text-align: end;
150
+ font-family: var(--font-label-md-family);
151
+ font-size: var(--font-label-md-size);
152
+ font-weight: var(--font-label-md-weight);
153
+ letter-spacing: var(--font-label-md-letter-spacing);
154
+ line-height: var(--font-label-md-line-height);
155
+ }
156
+
157
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__footer {
158
+ align-items: flex-start;
159
+ display: flex;
160
+ flex-direction: column;
161
+ margin-block-start: var(--space-gap-md);
162
+ row-gap: var(--space-gap-md);
163
+ }
164
+
165
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__footnote {
166
+ font-style: italic;
167
+ margin-block: 0;
168
+ font-family: var(--font-body-sm-family);
169
+ font-size: var(--font-body-sm-size);
170
+ font-weight: var(--font-body-sm-weight);
171
+ letter-spacing: var(--font-body-sm-letter-spacing);
172
+ line-height: var(--font-body-sm-line-height);
173
+ }
174
+
175
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__action {
176
+ display: flex;
177
+ margin-block-start: var(--space-gap-none);
178
+ }
179
+
180
+ :where([data-dds-context="marketing"]) .dds-comparisoncards[data-ground="page"] {
181
+ background-color: var(--color-bg-page);
182
+ color: var(--color-fg-default);
183
+ }
184
+
185
+ :where([data-dds-context="marketing"]) .dds-comparisoncards[data-ground="strong"] {
186
+ background-color: var(--color-bg-brand-strong);
187
+ color: var(--color-fg-on-brand-strong);
188
+ }
189
+
190
+ :where([data-dds-context="marketing"]) .dds-comparisoncards[data-ground="subtle"] {
191
+ background-color: var(--color-bg-page);
192
+ background-image: linear-gradient(var(--color-bg-band-subtle), var(--color-bg-band-subtle));
193
+ color: var(--color-fg-default);
194
+ }
195
+
@@ -0,0 +1,24 @@
1
+ import './ComparisonCards.css';
2
+ import './comparison-cards-impl.css';
3
+ import '../block-reveal.css';
4
+ import { type ComparisonCardsProps } from './ComparisonCards.types.js';
5
+ export type { ComparisonCardsProps };
6
+ /**
7
+ * A heading over two or three cards that repeat the same rows — the reference site's
8
+ * ComparisonCards.
9
+ *
10
+ * The cards are records rather than children, the one place a block here takes its cards that way.
11
+ * What a comparison is made of is structured — a name, a sentence, and labels each answered with a
12
+ * value — and the block has to lay each card's rows against its neighbour's, which it cannot do
13
+ * inside a Card it was handed whole. The surface is still the page's own Card, so a light or a coral
14
+ * card here is the same fill and corner as anywhere else on the page.
15
+ *
16
+ * Side by side, every card shares the grid's rows: one for the intros, one per line of the
17
+ * comparison, one for the footnotes. The count of those rows is the one thing the stylesheet cannot
18
+ * read from the markup — it is the longest card's, not any one card's — so it is handed over as a
19
+ * custom property, FeatureScroll's way of passing a count.
20
+ *
21
+ * It arrives the way every block does: the heading and the line, then each card a step behind the
22
+ * one before. `'use client'` for that and for `useId`, which names the region by its heading.
23
+ */
24
+ export declare function ComparisonCards({ ground, variant, title, description, cards, }: ComparisonCardsProps): import("react").JSX.Element | null;