@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,202 @@
1
+ /* GENERATED from steps.contract.json. Do not edit. */
2
+
3
+ :where([data-dds-context="marketing"]) .dds-steps {
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-steps .dds-steps__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
+ }
22
+
23
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__split {
24
+ align-items: stretch;
25
+ display: flex;
26
+ min-inline-size: 0;
27
+ column-gap: var(--space-gap-3xl);
28
+ row-gap: var(--space-gap-2xl);
29
+ }
30
+
31
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__media {
32
+ min-inline-size: 0;
33
+ overflow: hidden;
34
+ position: relative;
35
+ aspect-ratio: var(--aspect-square);
36
+ border-radius: var(--radius-container);
37
+ }
38
+
39
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__image {
40
+ display: block;
41
+ transition-duration: var(--motion-duration-shift);
42
+ transition-timing-function: var(--motion-easing-standard);
43
+ }
44
+
45
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__content {
46
+ display: flex;
47
+ flex-direction: column;
48
+ min-inline-size: 0;
49
+ row-gap: var(--space-gap-none);
50
+ }
51
+
52
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__title {
53
+ margin-block: 0;
54
+ text-wrap: balance;
55
+ font-family: var(--font-h2-family);
56
+ font-size: var(--font-h2-size);
57
+ font-weight: var(--font-h2-weight);
58
+ letter-spacing: var(--font-h2-letter-spacing);
59
+ line-height: var(--font-h2-line-height);
60
+ margin-block-end: var(--space-heading-content);
61
+ }
62
+
63
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__list {
64
+ display: flex;
65
+ flex-direction: column;
66
+ list-style: none;
67
+ margin-block: 0;
68
+ padding-inline-start: 0;
69
+ row-gap: var(--space-gap-none);
70
+ }
71
+
72
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__step {
73
+ align-items: flex-start;
74
+ border-block-start-style: solid;
75
+ box-sizing: border-box;
76
+ display: flex;
77
+ position: relative;
78
+ border-width: var(--border-width-default);
79
+ column-gap: var(--space-gap-md);
80
+ padding-block: var(--space-inset-md);
81
+ }
82
+
83
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__number {
84
+ flex: none;
85
+ font-variant-numeric: tabular-nums;
86
+ font-family: var(--font-h4-family);
87
+ font-size: var(--font-h4-size);
88
+ font-weight: var(--font-h4-weight);
89
+ letter-spacing: var(--font-h4-letter-spacing);
90
+ line-height: var(--font-h4-line-height);
91
+ }
92
+
93
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__body {
94
+ display: flex;
95
+ flex-direction: column;
96
+ min-inline-size: 0;
97
+ row-gap: var(--space-heading-title-description-compact);
98
+ }
99
+
100
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__step-title {
101
+ margin-block: 0;
102
+ font-family: var(--font-h5-family);
103
+ font-size: var(--font-h5-size);
104
+ font-weight: var(--font-h5-weight);
105
+ letter-spacing: var(--font-h5-letter-spacing);
106
+ line-height: var(--font-h5-line-height);
107
+ min-block-size: var(--size-target-min);
108
+ }
109
+
110
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__trigger {
111
+ transition-property: outline-color, outline-width;
112
+ appearance: none;
113
+ background: none;
114
+ border-style: none;
115
+ color: inherit;
116
+ cursor: pointer;
117
+ font: inherit;
118
+ letter-spacing: inherit;
119
+ outline-style: solid;
120
+ padding: 0;
121
+ text-align: start;
122
+ border-radius: var(--radius-subtle);
123
+ min-block-size: var(--size-target-min);
124
+ min-inline-size: var(--size-target-min);
125
+ outline-width: var(--border-width-none);
126
+ }
127
+
128
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__step-description {
129
+ margin-block: 0;
130
+ font-family: var(--font-body-md-family);
131
+ font-size: var(--font-body-md-size);
132
+ font-weight: var(--font-body-md-weight);
133
+ letter-spacing: var(--font-body-md-letter-spacing);
134
+ line-height: var(--font-body-md-line-height);
135
+ }
136
+
137
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__progress {
138
+ display: none;
139
+ pointer-events: none;
140
+ position: absolute;
141
+ background-color: var(--color-bg-brand);
142
+ block-size: var(--border-width-strong);
143
+ }
144
+
145
+ :where([data-dds-context="marketing"]) .dds-steps[data-media-position="end"] .dds-steps__split {
146
+ flex-direction: row-reverse;
147
+ }
148
+
149
+ :where([data-dds-context="marketing"]) .dds-steps[data-media-position="start"] .dds-steps__split {
150
+ flex-direction: row;
151
+ }
152
+
153
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__trigger:focus-visible {
154
+ outline-color: var(--color-border-focus);
155
+ outline-width: var(--border-width-focus);
156
+ }
157
+
158
+ :where([data-dds-context="marketing"]) .dds-steps[data-ground="page"] {
159
+ background-color: var(--color-bg-page);
160
+ color: var(--color-fg-default);
161
+ }
162
+
163
+ :where([data-dds-context="marketing"]) .dds-steps[data-ground="page"] .dds-steps__number {
164
+ color: var(--color-fg-brand-accent);
165
+ }
166
+
167
+ :where([data-dds-context="marketing"]) .dds-steps[data-ground="page"] .dds-steps__step {
168
+ border-color: var(--color-border-subtle);
169
+ }
170
+
171
+ :where([data-dds-context="marketing"]) .dds-steps[data-ground="strong"] {
172
+ background-color: var(--color-bg-brand-strong);
173
+ color: var(--color-fg-on-brand-strong);
174
+ }
175
+
176
+ :where([data-dds-context="marketing"]) .dds-steps[data-ground="strong"] .dds-steps__number {
177
+ color: var(--color-fg-on-brand-strong);
178
+ }
179
+
180
+ :where([data-dds-context="marketing"]) .dds-steps[data-ground="strong"] .dds-steps__step {
181
+ border-color: var(--color-border-subtle-inverse);
182
+ }
183
+
184
+ :where([data-dds-context="marketing"]) .dds-steps[data-ground="subtle"] {
185
+ background-color: var(--color-bg-page);
186
+ background-image: linear-gradient(var(--color-bg-band-subtle), var(--color-bg-band-subtle));
187
+ color: var(--color-fg-default);
188
+ }
189
+
190
+ :where([data-dds-context="marketing"]) .dds-steps[data-ground="subtle"] .dds-steps__number {
191
+ color: var(--color-fg-brand);
192
+ }
193
+
194
+ :where([data-dds-context="marketing"]) .dds-steps[data-ground="subtle"] .dds-steps__step {
195
+ border-color: var(--color-border-subtle);
196
+ }
197
+
198
+ @media (prefers-reduced-motion: reduce) {
199
+ :where([data-dds-context="marketing"]) .dds-steps,
200
+ :where([data-dds-context="marketing"]) .dds-steps * { transition: none !important; }
201
+ }
202
+
@@ -0,0 +1,32 @@
1
+ import './Steps.css';
2
+ import './steps-impl.css';
3
+ import '../block-reveal.css';
4
+ import { type StepsProps } from './Steps.types.js';
5
+ export type { StepsProps };
6
+ /**
7
+ * A how-it-works section: one picture beside a numbered list of the steps a reader takes.
8
+ *
9
+ * The numbers are the argument. They say the order matters and how far there is to go, which is
10
+ * what separates this from FeatureBullets — the same split, where every line is included rather
11
+ * than one coming after another. So the list is an `<ol>`, and a screen reader announces the count
12
+ * and each step's place without being told; the large number drawn beside each step is the
13
+ * section's own decoration, hidden from assistive technology so the place is not read twice.
14
+ *
15
+ * The steps are records rather than children, because the number in front of each is drawn from
16
+ * its place in the list and a page composing its own would be a page retyping the order.
17
+ *
18
+ * The picture comes first in the markup and on a phone, which is the reference design's order and
19
+ * the one a sequence reads in: the picture sets the scene the steps then walk through. At full
20
+ * width `mediaPosition` puts it on either side.
21
+ *
22
+ * The reference template also carried `embedded`, which dropped the section for a plain `<div>`
23
+ * inside an article's body, and `titleId`, which let a table of contents target the heading. Both
24
+ * are gone: this package has no article layout to embed into, and a section here is named by its
25
+ * own heading through `aria-labelledby` — a `<section>` is only a region landmark once it has one.
26
+ *
27
+ * With `autoplay` the steps take their turn: one is current, its rule fills, and the next takes
28
+ * over — see `useTurn`. Each title becomes a button that makes its step current, and where every
29
+ * step carries a picture the one beside the list is the current step's. The list is still the
30
+ * ordered list it always is; only which step is drawn as current moves.
31
+ */
32
+ export declare function Steps({ ground, mediaPosition, autoplay, title, steps, media, }: StepsProps): import("react").JSX.Element;
@@ -0,0 +1,65 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useId } from 'react';
4
+ import './Steps.css';
5
+ import './steps-impl.css';
6
+ import '../block-reveal.css';
7
+ import { arriving, useReveal } from '../use-reveal.js';
8
+ import { given } from '../../given.js';
9
+ import { useTurn } from './use-turn.js';
10
+ import { stepsDefaults, stepsParts } from './Steps.types.js';
11
+ /**
12
+ * A how-it-works section: one picture beside a numbered list of the steps a reader takes.
13
+ *
14
+ * The numbers are the argument. They say the order matters and how far there is to go, which is
15
+ * what separates this from FeatureBullets — the same split, where every line is included rather
16
+ * than one coming after another. So the list is an `<ol>`, and a screen reader announces the count
17
+ * and each step's place without being told; the large number drawn beside each step is the
18
+ * section's own decoration, hidden from assistive technology so the place is not read twice.
19
+ *
20
+ * The steps are records rather than children, because the number in front of each is drawn from
21
+ * its place in the list and a page composing its own would be a page retyping the order.
22
+ *
23
+ * The picture comes first in the markup and on a phone, which is the reference design's order and
24
+ * the one a sequence reads in: the picture sets the scene the steps then walk through. At full
25
+ * width `mediaPosition` puts it on either side.
26
+ *
27
+ * The reference template also carried `embedded`, which dropped the section for a plain `<div>`
28
+ * inside an article's body, and `titleId`, which let a table of contents target the heading. Both
29
+ * are gone: this package has no article layout to embed into, and a section here is named by its
30
+ * own heading through `aria-labelledby` — a `<section>` is only a region landmark once it has one.
31
+ *
32
+ * With `autoplay` the steps take their turn: one is current, its rule fills, and the next takes
33
+ * over — see `useTurn`. Each title becomes a button that makes its step current, and where every
34
+ * step carries a picture the one beside the list is the current step's. The list is still the
35
+ * ordered list it always is; only which step is drawn as current moves.
36
+ */
37
+ export function Steps({ ground = stepsDefaults.ground, mediaPosition = stepsDefaults.mediaPosition, autoplay = stepsDefaults.autoplay, title, steps, media, }) {
38
+ const titleId = useId();
39
+ const [band, revealed] = useReveal();
40
+ // A step with no name is somebody mid-sentence, not a step. The workbench's own control emits
41
+ // records as they are typed, and a number against nothing is a step the page did not write — so
42
+ // it is dropped before the count is taken, and the numbers close up rather than skipping one.
43
+ const shown = steps.filter((step) => given(step.title));
44
+ const { current, turning, playing, next, choose, section, hold } = useTurn(shown.length, autoplay);
45
+ // The steps' own pictures replace the one picture only where every step has one: a turn that
46
+ // reached a step without a picture would show nothing beside it.
47
+ const pictured = shown.length > 0 && shown.every((step) => given(step.image?.src));
48
+ return (_jsx("section", { className: stepsParts.root, ref: section, "data-ground": ground, "data-media-position": mediaPosition, "data-autoplay": autoplay || undefined, "aria-labelledby": titleId, ...(autoplay ? hold : {}), children: _jsx("div", { className: stepsParts.inner, ref: band, "data-revealed": revealed, children: _jsxs("div", { className: stepsParts.split, children: [_jsx("div", { className: stepsParts.media, ...arriving(0), "aria-hidden": "true", children: pictured
49
+ ? shown.map((step, at) => (_jsx("img", { className: stepsParts.image, src: step.image?.src, alt: "", width: step.image?.width, height: step.image?.height, "data-current": at === current, loading: at === 0 ? undefined : 'lazy' }, `${at}:${step.title}`)))
50
+ : media }), _jsxs("div", { className: stepsParts.content, children: [_jsx("h2", { className: stepsParts.title, ...arriving(0), id: titleId, children: title }), _jsx("ol", { className: stepsParts.list, role: "list", "data-turning": autoplay ? turning : undefined, "data-playing": autoplay ? playing : undefined, children: shown.map((step, at) => (
51
+ /* Keyed by the step's own name. An index would key the list by position, so
52
+ removing a step would renumber every row under it and React would reconcile
53
+ the wrong ones; two steps with one name are one step written twice.
54
+
55
+ The position is still what decides the number and when a row arrives — the
56
+ steps come up in the order they are taken, behind the title and the picture. */
57
+ _jsxs("li", { className: stepsParts.step, "data-current": autoplay ? at === current : undefined, ...arriving(2 + at), children: [_jsx("span", { className: stepsParts.number, "aria-hidden": "true", children: at + 1 }), _jsxs("div", { className: stepsParts.body, children: [_jsx("h3", { className: stepsParts['step-title'], children: autoplay ? (_jsx("button", { type: "button", className: stepsParts.trigger, "aria-current": at === current ? 'step' : undefined, onClick: () => choose(at), children: step.title })) : (step.title) }), _jsx("p", { className: stepsParts['step-description'], children: step.description })] }), _jsx("span", { className: stepsParts.progress, "aria-hidden": "true", ref: at === current && playing
58
+ ? (element) => {
59
+ if (!element)
60
+ return;
61
+ element.addEventListener('animationend', next);
62
+ return () => element.removeEventListener('animationend', next);
63
+ }
64
+ : undefined })] }, `${at}:${step.title}`))) })] })] }) }) }));
65
+ }
@@ -0,0 +1,48 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { StepsItem } from '../../steps-data.js';
3
+ export interface StepsOwnProps {
4
+ /**
5
+ * `page` — The default, and the page's own white. A section that has nothing to separate itself from what is above it — most of them
6
+ * `subtle` — A quiet step off the page, for a band that wants to read as its own section without changing the page's voice. The reference design paints this section grey, and a page following it closely takes this. Painted as the band's tint laid over the page's own ground, so it is the same grey whatever is behind the section.
7
+ * `strong` — `color.bg.brand-strong`, the dark band. It stops the page rather than dividing it, so it is for a section a reader should arrive at — and one per page is usually one more than enough
8
+ */
9
+ ground?: 'page' | 'subtle' | 'strong';
10
+ /**
11
+ * `start` — The default, and the reference design's: the picture first, then the steps it introduces
12
+ * `end` — The steps first, for a section sitting under a split whose picture is already at the start
13
+ */
14
+ mediaPosition?: 'start' | 'end';
15
+ /** Whether the steps take their turn on their own: one step is current, its rule fills over motion.duration.dwell, then the next takes over, and back to the first after the last. The current step's number is drawn at full strength and the rest recede; with an `image` on each step the picture changes to the current one's. Each step's title becomes a button that makes it current. Off by default, so a list nobody configured stays still. On, it holds while the pointer is over the section or focus is inside it, waits until the section is on screen, never moves for a reader who asked for less motion, and stops for good once the reader presses a step — the WAI carousel rule CtaBannerSlider follows: a reader who has chosen a step is reading it. That gives a reader a way to stop it, which WCAG 2.2.2 asks for, but not a visible one, so a page that needs 2.2.2 met plainly should leave it off. */
16
+ autoplay?: boolean;
17
+ /** Always. What the steps get a reader to, in the fewest words that say it — 'Get started in 3 steps' */
18
+ title: string;
19
+ /** Always. The steps, in the order a reader takes them — three or four is right, six the most. Each is a short imperative and a sentence under about two hundred characters. The number in front of each is drawn from its place in the list, so reordering the list renumbers it. Give each step an `image` — a screenshot of that step — and the picture beside the list is the current step's: the first while the list is still, and each in turn under `autoplay`. */
20
+ steps: StepsItem[];
21
+ /** The one picture beside the steps, where they have no pictures of their own — a screenshot, a photograph. The section is a split and the picture is one half of it: give this or an `image` on each step, because without either the list runs to a measure it was never sized for. Steps that carry their own pictures win over this. */
22
+ media?: ReactNode;
23
+ }
24
+ export type StepsProps = StepsOwnProps;
25
+ /** The class each part carries. Apply these — do not retype them. */
26
+ export declare const stepsParts: {
27
+ readonly root: "dds-steps";
28
+ readonly inner: "dds-steps__inner";
29
+ readonly split: "dds-steps__split";
30
+ readonly media: "dds-steps__media";
31
+ readonly image: "dds-steps__image";
32
+ readonly content: "dds-steps__content";
33
+ readonly title: "dds-steps__title";
34
+ readonly list: "dds-steps__list";
35
+ readonly step: "dds-steps__step";
36
+ readonly number: "dds-steps__number";
37
+ readonly body: "dds-steps__body";
38
+ readonly 'step-title': "dds-steps__step-title";
39
+ readonly trigger: "dds-steps__trigger";
40
+ readonly 'step-description': "dds-steps__step-description";
41
+ readonly progress: "dds-steps__progress";
42
+ };
43
+ /** Generated so defaults cannot drift from the contract. */
44
+ export declare const stepsDefaults: {
45
+ readonly ground: "page";
46
+ readonly mediaPosition: "start";
47
+ readonly autoplay: false;
48
+ };
@@ -0,0 +1,21 @@
1
+ // GENERATED from steps.contract.json. Do not edit.
2
+ /** The class each part carries. Apply these — do not retype them. */
3
+ export const stepsParts = {
4
+ root: 'dds-steps',
5
+ inner: 'dds-steps__inner',
6
+ split: 'dds-steps__split',
7
+ media: 'dds-steps__media',
8
+ image: 'dds-steps__image',
9
+ content: 'dds-steps__content',
10
+ title: 'dds-steps__title',
11
+ list: 'dds-steps__list',
12
+ step: 'dds-steps__step',
13
+ number: 'dds-steps__number',
14
+ body: 'dds-steps__body',
15
+ 'step-title': 'dds-steps__step-title',
16
+ trigger: 'dds-steps__trigger',
17
+ 'step-description': 'dds-steps__step-description',
18
+ progress: 'dds-steps__progress',
19
+ };
20
+ /** Generated so defaults cannot drift from the contract. */
21
+ export const stepsDefaults = { ground: 'page', mediaPosition: 'start', autoplay: false };
@@ -0,0 +1,216 @@
1
+ /*
2
+ * Scoped to this package, like the generated sheet beside it.
3
+ *
4
+ * `:where([data-dds-context="marketing"])` confines these rules without contributing specificity,
5
+ * so each is decided against the generated rule on its own terms.
6
+ */
7
+
8
+ /*
9
+ * The first step is not ruled off from what is above it, because nothing is.
10
+ *
11
+ * Every step carries a rule on its start edge, which is what puts a line between each pair and
12
+ * none under the last. The cost is one at the top of the list, where it reads as a lid rather than
13
+ * a separator — and the list is already bounded by the title's own step above it.
14
+ *
15
+ * `:first-child` is the condition itself. Nothing about a step knows it is first, and a prop
16
+ * standing in for the question would be the page answering something the DOM already has.
17
+ */
18
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__step:first-child {
19
+ border-block-start-width: 0;
20
+ padding-block-start: 0;
21
+ }
22
+
23
+ /*
24
+ * One column below the fold, and the picture leads it.
25
+ *
26
+ * The row direction is the contract's to say — it varies by a styling axis, which is what
27
+ * `structure[]` is for, and the generated sheet carries both values. What is left here is the
28
+ * fold, which a binding cannot express: `structure` has no width to attach a rule to.
29
+ *
30
+ * `column` rather than `column-reverse` for both positions, because the picture is first in the
31
+ * markup: the reference design stacks it above the steps on a phone whichever side it takes on a
32
+ * desktop, and a sequence reads that way — the scene, then the steps through it.
33
+ *
34
+ * Written a class deeper than it looks so it wins against the generated
35
+ * `.dds-steps[data-media-position="end"] .dds-steps__split`, which a plainer selector here would
36
+ * lose to however late it is loaded — the fault FeatureBullets shipped with for an afternoon.
37
+ *
38
+ * `48rem` longhand because `var()` is not permitted in a container query condition, and it is the
39
+ * width the rest of this package folds at.
40
+ */
41
+ @container (max-width: 47.9375rem) {
42
+ :where([data-dds-context="marketing"]) .dds-steps[data-media-position] .dds-steps__split {
43
+ flex-direction: column;
44
+ }
45
+ }
46
+
47
+ /*
48
+ * At full width the steps take a measure and the picture takes the rest.
49
+ *
50
+ * The reference design splits the row evenly at its own breakpoint. A share holds everywhere, and
51
+ * it is the one FeatureSplit and FeatureBullets take, so three splits down a page put their
52
+ * pictures on the same line; the picture growing into whatever is left is what keeps the square
53
+ * square without either half naming a height.
54
+ */
55
+ @container (min-width: 48rem) {
56
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__split {
57
+ align-items: center;
58
+ }
59
+
60
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__content {
61
+ flex: 0 0 45%;
62
+ }
63
+
64
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__media {
65
+ flex: 1 1 0;
66
+ }
67
+ }
68
+
69
+ /*
70
+ * Whatever the page put in the picture fills the square.
71
+ *
72
+ * The slot takes a node rather than a source, so what arrives is the page's element and this
73
+ * cannot know whether it carries dimensions. `cover` rather than `contain`, because the slot is a
74
+ * square the section decided on and a picture letterboxed inside it would show the ground through
75
+ * a corner the section rounded.
76
+ */
77
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__media > *,
78
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__media img {
79
+ block-size: 100%;
80
+ inline-size: 100%;
81
+ object-fit: cover;
82
+ }
83
+
84
+ /*
85
+ * Bare media is a block; a component keeps its own display.
86
+ *
87
+ * `display: block` is for what arrives as a raw element — an image, a video, an inline SVG — which
88
+ * sits on a text baseline otherwise and leaves a gap under it. Written at no weight at all, so a
89
+ * component the page placed here — an IllustrationScene, whose grid lays its pane over its photo —
90
+ * keeps the display its own sheet gives it. In the rule above, a class deeper than the component's
91
+ * root, it turned the scene's grid into a block, and the pane fell below the photo and was clipped.
92
+ */
93
+ :where([data-dds-context="marketing"] .dds-steps .dds-steps__media > *, [data-dds-context="marketing"] .dds-steps .dds-steps__media img) {
94
+ display: block;
95
+ }
96
+
97
+
98
+ /*
99
+ * The number's line is the title's line, so the figure is centred on it.
100
+ *
101
+ * Top-aligned in the row, the number and the title each start their own line box; a line of the
102
+ * same height for both puts the larger figure's middle on the title's first line, overhanging it
103
+ * evenly above and below. The height is the title's own type, font.h5's size by its leading, so it
104
+ * follows the title down to a phone's sizes without a number here.
105
+ *
106
+ * Written a class deeper than it looks, so it wins against the generated `line-height` from the
107
+ * number's font.h4 binding on weight rather than on load order.
108
+ */
109
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__step > .dds-steps__number {
110
+ line-height: calc(var(--font-h5-size) * var(--font-h5-line-height));
111
+ }
112
+
113
+ /*
114
+ * Under `autoplay`: the steps take their turn.
115
+ *
116
+ * Every step keeps its rule, the first included — the current step's fill runs along it, and the
117
+ * first step's turn needs a rule to run on as much as the others'.
118
+ */
119
+ :where([data-dds-context="marketing"]) .dds-steps[data-autoplay] .dds-steps__step:first-child {
120
+ border-block-start-width: var(--border-width-default);
121
+ padding-block-start: var(--space-inset-md);
122
+ }
123
+
124
+ /*
125
+ * The current step's number at full strength, the others receded: opacity.dot-current against
126
+ * opacity.dot-rest, the pagination dots' pair, because the numbers are doing the dots' job here —
127
+ * saying where in the set the reader is. Only the number recedes. The titles and lines stay at full
128
+ * ink, so every step is as readable while it waits as when it is current.
129
+ */
130
+ :where([data-dds-context="marketing"]) .dds-steps[data-autoplay] .dds-steps__number {
131
+ opacity: var(--opacity-dot-rest);
132
+ transition: opacity var(--motion-duration-shift) var(--motion-easing-standard);
133
+ }
134
+
135
+ :where([data-dds-context="marketing"]) .dds-steps[data-autoplay] .dds-steps__step[data-current="true"] .dds-steps__number {
136
+ opacity: var(--opacity-dot-current);
137
+ }
138
+
139
+ /*
140
+ * The whole row is the step's button, not only its title: the title's box stretched over the row,
141
+ * which the row's `position: relative` holds. The text stays where it is and a press anywhere on the
142
+ * step chooses it.
143
+ */
144
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__trigger::after {
145
+ content: '';
146
+ inset: 0;
147
+ position: absolute;
148
+ }
149
+
150
+ :where([data-dds-context="marketing"]) .dds-steps[data-ground="strong"] .dds-steps__trigger:focus-visible {
151
+ outline-color: var(--color-border-focus-on-brand-strong);
152
+ }
153
+
154
+ /*
155
+ * The fill: the current step's rule, drawn from the start edge over motion.duration.dwell. When it
156
+ * ends the next step takes over — the component listens for the end, so the bar and the turn are
157
+ * one clock. Paused wherever the turn is held; full and still where the turn has stopped or never
158
+ * runs, so the current step is still marked.
159
+ */
160
+ @keyframes dds-steps-fill {
161
+ from {
162
+ scale: 0 1;
163
+ }
164
+ }
165
+
166
+ :where([data-dds-context="marketing"]) .dds-steps[data-autoplay] .dds-steps__step[data-current="true"] > .dds-steps__progress {
167
+ display: block;
168
+ inset-block-start: calc(-1 * var(--border-width-default));
169
+ inset-inline: 0;
170
+ transform-origin: left center;
171
+ }
172
+
173
+ :where([data-dds-context="marketing"]) .dds-steps[data-autoplay]:dir(rtl) .dds-steps__step > .dds-steps__progress {
174
+ transform-origin: right center;
175
+ }
176
+
177
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__list[data-turning="true"] > .dds-steps__step[data-current="true"] > .dds-steps__progress {
178
+ animation: dds-steps-fill var(--motion-duration-dwell) linear;
179
+ }
180
+
181
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__list[data-playing="false"] > .dds-steps__step[data-current="true"] > .dds-steps__progress {
182
+ animation-play-state: paused;
183
+ }
184
+
185
+ /*
186
+ * The steps' own pictures share the media cell, and the current step's is the one shown — the
187
+ * first while the list is still. They cross over rather than cut, in motion.duration.shift.
188
+ */
189
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__media:has(> .dds-steps__image) {
190
+ display: grid;
191
+ }
192
+
193
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__media > .dds-steps__image {
194
+ grid-area: 1 / 1;
195
+ opacity: 0;
196
+ transition-property: opacity;
197
+ }
198
+
199
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__media > .dds-steps__image[data-current="true"] {
200
+ opacity: 1;
201
+ }
202
+
203
+ /*
204
+ * A reader who asked for less motion: no fill, no crossing over. The list never turns for them — the
205
+ * component asks too, but only once it runs, and the server's first paint is drawn before it does.
206
+ */
207
+ @media (prefers-reduced-motion: reduce) {
208
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__list[data-turning] > .dds-steps__step[data-current] > .dds-steps__progress {
209
+ animation: none;
210
+ }
211
+
212
+ :where([data-dds-context="marketing"]) .dds-steps .dds-steps__media > .dds-steps__image,
213
+ :where([data-dds-context="marketing"]) .dds-steps[data-autoplay] .dds-steps__number {
214
+ transition: none;
215
+ }
216
+ }
@@ -0,0 +1,33 @@
1
+ import { type FocusEvent, type PointerEvent } from 'react';
2
+ /**
3
+ * The steps taking their turn under `autoplay`: which step is current, and whether the turn is
4
+ * running.
5
+ *
6
+ * The timing is not here. The current step's rule fills over motion.duration.dwell as a CSS
7
+ * animation, and the turn moves on when that animation ends (`next`), so the bar a reader watches
8
+ * and the step changing are one clock rather than two that drift. Holding the turn is pausing that
9
+ * animation, which is what `playing` is for: the stylesheet pauses the fill wherever it is false.
10
+ *
11
+ * It turns only where every condition for it holds:
12
+ * - `autoplay` is on and there are two steps or more;
13
+ * - the reader has not asked for less motion — asked live, so turning it on mid-visit stops it;
14
+ * - the section is on screen. A turn nobody can see does not run, and starts again where it was;
15
+ * - nothing holds it: a pointer over the section or focus inside it holds it for as long as it
16
+ * lasts, and pressing a step stops it for good — CtaBannerSlider's rule, by way of the WAI
17
+ * carousel pattern: a reader who has chosen a step is reading it. The pointer's way, the
18
+ * keyboard's and a touch screen's, which WCAG 2.2.2 asks for of anything that moves on its own.
19
+ */
20
+ export declare function useTurn(count: number, autoplay: boolean): {
21
+ current: number;
22
+ turning: boolean;
23
+ playing: boolean;
24
+ next: () => void;
25
+ choose: (at: number) => void;
26
+ section: import("react").RefObject<HTMLElement | null>;
27
+ hold: {
28
+ onPointerEnter: (event: PointerEvent<HTMLElement>) => void;
29
+ onPointerLeave: (event: PointerEvent<HTMLElement>) => void;
30
+ onFocus: () => void;
31
+ onBlur: (event: FocusEvent<HTMLElement>) => void;
32
+ };
33
+ };