@deriv-com/dds-marketing 1.1.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (401) hide show
  1. package/.llm/components/accordion.md +10 -0
  2. package/.llm/components/accordionitem.md +10 -0
  3. package/.llm/components/aspectratio.md +10 -0
  4. package/.llm/components/awards.md +10 -0
  5. package/.llm/components/background.md +52 -9
  6. package/.llm/components/badge.md +13 -3
  7. package/.llm/components/bottomsheet.md +13 -3
  8. package/.llm/components/breadcrumb.md +10 -0
  9. package/.llm/components/breadcrumbitem.md +10 -0
  10. package/.llm/components/button.md +13 -3
  11. package/.llm/components/buttonicon.md +17 -7
  12. package/.llm/components/card.md +11 -1
  13. package/.llm/components/cardbody.md +12 -2
  14. package/.llm/components/cardbutton.md +10 -0
  15. package/.llm/components/checkbox.md +7 -1
  16. package/.llm/components/comparisoncards.md +13 -3
  17. package/.llm/components/comparisontable.md +10 -0
  18. package/.llm/components/ctabanner.md +10 -0
  19. package/.llm/components/ctabannerslider.md +10 -0
  20. package/.llm/components/datatable.md +10 -0
  21. package/.llm/components/divider.md +10 -0
  22. package/.llm/components/documentlink.md +237 -0
  23. package/.llm/components/documents.md +268 -0
  24. package/.llm/components/downloadbanner.md +11 -1
  25. package/.llm/components/dropdownmenu.md +15 -5
  26. package/.llm/components/estimator.md +342 -0
  27. package/.llm/components/faqaccordion.md +10 -0
  28. package/.llm/components/featurebullets.md +10 -0
  29. package/.llm/components/featurecards.md +47 -3
  30. package/.llm/components/featurecardscarousel.md +11 -1
  31. package/.llm/components/featurescroll.md +10 -0
  32. package/.llm/components/featuresplit.md +10 -0
  33. package/.llm/components/featurestack.md +10 -0
  34. package/.llm/components/featuretabs.md +369 -0
  35. package/.llm/components/filterchip.md +11 -1
  36. package/.llm/components/footer.md +10 -0
  37. package/.llm/components/footergroup.md +10 -0
  38. package/.llm/components/grid.md +34 -1
  39. package/.llm/components/icon.md +15 -5
  40. package/.llm/components/illustrationcard.md +56 -2
  41. package/.llm/components/illustrationcheck.md +193 -0
  42. package/.llm/components/illustrationchoice.md +187 -0
  43. package/.llm/components/illustrationcode.md +192 -0
  44. package/.llm/components/illustrationlist.md +175 -0
  45. package/.llm/components/illustrationscene.md +33 -3
  46. package/.llm/components/imagebanner.md +35 -6
  47. package/.llm/components/landinghero.md +10 -0
  48. package/.llm/components/link.md +12 -2
  49. package/.llm/components/logocolumns.md +11 -1
  50. package/.llm/components/logorows.md +46 -2
  51. package/.llm/components/menuitem.md +12 -2
  52. package/.llm/components/navbar.md +11 -1
  53. package/.llm/components/navbaritem.md +10 -0
  54. package/.llm/components/navbarmenu.md +10 -0
  55. package/.llm/components/navbarmenugroup.md +10 -0
  56. package/.llm/components/navbarpanel.md +10 -0
  57. package/.llm/components/navbarswitcher.md +16 -6
  58. package/.llm/components/navbarswitcheroption.md +10 -0
  59. package/.llm/components/option.md +11 -1
  60. package/.llm/components/pageheader.md +10 -0
  61. package/.llm/components/pagination.md +10 -0
  62. package/.llm/components/paginationdots.md +10 -0
  63. package/.llm/components/producthero.md +33 -4
  64. package/.llm/components/progressbar.md +305 -0
  65. package/.llm/components/removablechip.md +11 -1
  66. package/.llm/components/resourcebanner.md +10 -0
  67. package/.llm/components/row.md +10 -0
  68. package/.llm/components/scenescroll.md +42 -24
  69. package/.llm/components/scenescrollword.md +267 -0
  70. package/.llm/components/scroller.md +10 -0
  71. package/.llm/components/searchinput.md +10 -0
  72. package/.llm/components/segmentedcontrol.md +33 -2
  73. package/.llm/components/segmentedcontrolitem.md +12 -2
  74. package/.llm/components/select.md +10 -0
  75. package/.llm/components/selectchip.md +10 -0
  76. package/.llm/components/spinner.md +10 -0
  77. package/.llm/components/stack.md +10 -0
  78. package/.llm/components/stats.md +50 -1
  79. package/.llm/components/statscarousel.md +227 -0
  80. package/.llm/components/statusdot.md +45 -1
  81. package/.llm/components/steps.md +10 -0
  82. package/.llm/components/stickycards.md +10 -0
  83. package/.llm/components/subdomainnavbar.md +11 -1
  84. package/.llm/components/tab.md +12 -2
  85. package/.llm/components/table.md +10 -0
  86. package/.llm/components/tablebody.md +10 -0
  87. package/.llm/components/tablecell.md +10 -0
  88. package/.llm/components/tablehead.md +10 -0
  89. package/.llm/components/tableheadercell.md +10 -0
  90. package/.llm/components/tablerow.md +10 -0
  91. package/.llm/components/tablist.md +10 -0
  92. package/.llm/components/teamgrid.md +10 -0
  93. package/.llm/components/testimonialrow.md +47 -3
  94. package/.llm/components/testimonialslider.md +12 -2
  95. package/.llm/components/textarea.md +10 -0
  96. package/.llm/components/textinput.md +11 -1
  97. package/.llm/components/textscroll.md +10 -0
  98. package/.llm/components/tiers.md +17 -7
  99. package/.llm/components/tooltip.md +6 -0
  100. package/.llm/components/typography.md +67 -1
  101. package/.llm/digest/accordion.md +1 -1
  102. package/.llm/digest/accordionitem.md +1 -1
  103. package/.llm/digest/aspectratio.md +1 -1
  104. package/.llm/digest/awards.md +1 -1
  105. package/.llm/digest/background.md +14 -6
  106. package/.llm/digest/badge.md +1 -1
  107. package/.llm/digest/bottomsheet.md +1 -1
  108. package/.llm/digest/breadcrumb.md +1 -1
  109. package/.llm/digest/breadcrumbitem.md +1 -1
  110. package/.llm/digest/button.md +2 -2
  111. package/.llm/digest/buttonicon.md +2 -2
  112. package/.llm/digest/card.md +1 -1
  113. package/.llm/digest/cardbody.md +1 -1
  114. package/.llm/digest/cardbutton.md +1 -1
  115. package/.llm/digest/checkbox.md +1 -1
  116. package/.llm/digest/comparisoncards.md +1 -1
  117. package/.llm/digest/comparisontable.md +1 -1
  118. package/.llm/digest/ctabanner.md +1 -1
  119. package/.llm/digest/ctabannerslider.md +1 -1
  120. package/.llm/digest/datatable.md +1 -1
  121. package/.llm/digest/divider.md +1 -1
  122. package/.llm/digest/documentlink.md +52 -0
  123. package/.llm/digest/documents.md +51 -0
  124. package/.llm/digest/downloadbanner.md +2 -2
  125. package/.llm/digest/dropdownmenu.md +1 -1
  126. package/.llm/digest/estimator.md +66 -0
  127. package/.llm/digest/faqaccordion.md +1 -1
  128. package/.llm/digest/featurebullets.md +1 -1
  129. package/.llm/digest/featurecards.md +8 -1
  130. package/.llm/digest/featurecardscarousel.md +1 -1
  131. package/.llm/digest/featurescroll.md +1 -1
  132. package/.llm/digest/featuresplit.md +1 -1
  133. package/.llm/digest/featurestack.md +1 -1
  134. package/.llm/digest/featuretabs.md +50 -0
  135. package/.llm/digest/filterchip.md +1 -1
  136. package/.llm/digest/footer.md +1 -1
  137. package/.llm/digest/footergroup.md +1 -1
  138. package/.llm/digest/grid.md +2 -1
  139. package/.llm/digest/icon.md +1 -1
  140. package/.llm/digest/illustrationcard.md +7 -2
  141. package/.llm/digest/illustrationcheck.md +42 -0
  142. package/.llm/digest/illustrationchoice.md +43 -0
  143. package/.llm/digest/illustrationcode.md +41 -0
  144. package/.llm/digest/illustrationlist.md +38 -0
  145. package/.llm/digest/illustrationscene.md +5 -3
  146. package/.llm/digest/imagebanner.md +11 -5
  147. package/.llm/digest/landinghero.md +1 -1
  148. package/.llm/digest/link.md +1 -1
  149. package/.llm/digest/logocolumns.md +2 -2
  150. package/.llm/digest/logorows.md +9 -2
  151. package/.llm/digest/menuitem.md +1 -1
  152. package/.llm/digest/navbar.md +1 -1
  153. package/.llm/digest/navbaritem.md +1 -1
  154. package/.llm/digest/navbarmenu.md +1 -1
  155. package/.llm/digest/navbarmenugroup.md +1 -1
  156. package/.llm/digest/navbarpanel.md +1 -1
  157. package/.llm/digest/navbarswitcher.md +1 -1
  158. package/.llm/digest/navbarswitcheroption.md +1 -1
  159. package/.llm/digest/option.md +1 -1
  160. package/.llm/digest/pageheader.md +1 -1
  161. package/.llm/digest/pagination.md +1 -1
  162. package/.llm/digest/paginationdots.md +1 -1
  163. package/.llm/digest/producthero.md +9 -3
  164. package/.llm/digest/progressbar.md +56 -0
  165. package/.llm/digest/removablechip.md +1 -1
  166. package/.llm/digest/resourcebanner.md +1 -1
  167. package/.llm/digest/row.md +1 -1
  168. package/.llm/digest/scenescroll.md +7 -6
  169. package/.llm/digest/scenescrollword.md +56 -0
  170. package/.llm/digest/scroller.md +1 -1
  171. package/.llm/digest/searchinput.md +1 -1
  172. package/.llm/digest/segmentedcontrol.md +4 -1
  173. package/.llm/digest/segmentedcontrolitem.md +2 -2
  174. package/.llm/digest/select.md +1 -1
  175. package/.llm/digest/selectchip.md +1 -1
  176. package/.llm/digest/spinner.md +1 -1
  177. package/.llm/digest/stack.md +1 -1
  178. package/.llm/digest/stats.md +9 -1
  179. package/.llm/digest/statscarousel.md +48 -0
  180. package/.llm/digest/statusdot.md +8 -1
  181. package/.llm/digest/steps.md +1 -1
  182. package/.llm/digest/stickycards.md +1 -1
  183. package/.llm/digest/subdomainnavbar.md +1 -1
  184. package/.llm/digest/tab.md +1 -1
  185. package/.llm/digest/table.md +1 -1
  186. package/.llm/digest/tablebody.md +1 -1
  187. package/.llm/digest/tablecell.md +1 -1
  188. package/.llm/digest/tablehead.md +1 -1
  189. package/.llm/digest/tableheadercell.md +1 -1
  190. package/.llm/digest/tablerow.md +1 -1
  191. package/.llm/digest/tablist.md +1 -1
  192. package/.llm/digest/teamgrid.md +1 -1
  193. package/.llm/digest/testimonialrow.md +9 -2
  194. package/.llm/digest/testimonialslider.md +2 -2
  195. package/.llm/digest/textarea.md +1 -1
  196. package/.llm/digest/textinput.md +1 -1
  197. package/.llm/digest/textscroll.md +1 -1
  198. package/.llm/digest/tiers.md +1 -1
  199. package/.llm/digest/typography.md +19 -1
  200. package/.llm/index.md +15 -4
  201. package/.llm/rules.md +10 -0
  202. package/.llm/tokens.md +13 -3
  203. package/AGENTS.md +14 -2
  204. package/README.md +28 -3
  205. package/dist/components/arrival.d.ts +32 -0
  206. package/dist/components/arrival.js +140 -0
  207. package/dist/components/arrives.d.ts +17 -0
  208. package/dist/components/arrives.js +14 -0
  209. package/dist/components/blocks/awards/Awards.js +2 -27
  210. package/dist/components/blocks/block-pattern.css +23 -0
  211. package/dist/components/blocks/comparison-cards/comparison-cards-impl.css +29 -12
  212. package/dist/components/blocks/documents/Documents.css +90 -0
  213. package/dist/components/blocks/documents/Documents.d.ts +22 -0
  214. package/dist/components/blocks/documents/Documents.js +30 -0
  215. package/dist/components/blocks/documents/Documents.types.d.ts +37 -0
  216. package/dist/components/blocks/documents/Documents.types.js +14 -0
  217. package/dist/components/blocks/documents/documents-impl.css +103 -0
  218. package/dist/components/blocks/download-banner/DownloadBanner.css +1 -1
  219. package/dist/components/blocks/download-banner/DownloadBanner.types.d.ts +1 -1
  220. package/dist/components/blocks/estimator/Estimator.css +206 -0
  221. package/dist/components/blocks/estimator/Estimator.d.ts +27 -0
  222. package/dist/components/blocks/estimator/Estimator.js +61 -0
  223. package/dist/components/blocks/estimator/Estimator.types.d.ts +63 -0
  224. package/dist/components/blocks/estimator/Estimator.types.js +25 -0
  225. package/dist/components/blocks/estimator/estimator-impl.css +159 -0
  226. package/dist/components/blocks/feature-cards/FeatureCards.d.ts +2 -1
  227. package/dist/components/blocks/feature-cards/FeatureCards.js +10 -7
  228. package/dist/components/blocks/feature-cards/FeatureCards.types.d.ts +9 -1
  229. package/dist/components/blocks/feature-cards/feature-cards-impl.css +15 -3
  230. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.d.ts +1 -1
  231. package/dist/components/blocks/feature-cards-carousel/feature-cards-carousel-impl.css +12 -0
  232. package/dist/components/blocks/feature-tabs/FeatureTabs.css +100 -0
  233. package/dist/components/blocks/feature-tabs/FeatureTabs.d.ts +23 -0
  234. package/dist/components/blocks/feature-tabs/FeatureTabs.js +38 -0
  235. package/dist/components/blocks/feature-tabs/FeatureTabs.types.d.ts +35 -0
  236. package/dist/components/blocks/feature-tabs/FeatureTabs.types.js +14 -0
  237. package/dist/components/blocks/feature-tabs/feature-tabs-impl.css +53 -0
  238. package/dist/components/blocks/image-banner/ImageBanner.css +1 -1
  239. package/dist/components/blocks/image-banner/ImageBanner.d.ts +2 -1
  240. package/dist/components/blocks/image-banner/ImageBanner.js +3 -2
  241. package/dist/components/blocks/image-banner/ImageBanner.types.d.ts +10 -8
  242. package/dist/components/blocks/image-banner/ImageBanner.types.js +1 -1
  243. package/dist/components/blocks/image-banner/image-banner-impl.css +78 -71
  244. package/dist/components/blocks/laurel.d.ts +16 -0
  245. package/dist/components/blocks/laurel.js +28 -0
  246. package/dist/components/blocks/logo-columns/LogoColumns.css +1 -1
  247. package/dist/components/blocks/logo-columns/LogoColumns.types.d.ts +1 -1
  248. package/dist/components/blocks/logo-rows/LogoRows.css +1 -1
  249. package/dist/components/blocks/logo-rows/LogoRows.d.ts +2 -1
  250. package/dist/components/blocks/logo-rows/LogoRows.js +7 -4
  251. package/dist/components/blocks/logo-rows/LogoRows.types.d.ts +9 -1
  252. package/dist/components/blocks/pattern-tone.d.ts +11 -0
  253. package/dist/components/blocks/pattern-tone.js +7 -0
  254. package/dist/components/blocks/product-hero/ProductHero.d.ts +1 -1
  255. package/dist/components/blocks/product-hero/ProductHero.js +2 -2
  256. package/dist/components/blocks/product-hero/ProductHero.types.d.ts +8 -3
  257. package/dist/components/blocks/product-hero/ProductHero.types.js +1 -1
  258. package/dist/components/blocks/product-hero/product-hero-impl.css +54 -0
  259. package/dist/components/blocks/resource-banner/ResourceBanner.css +1 -1
  260. package/dist/components/blocks/scene-scroll/SceneScroll.css +1 -1
  261. package/dist/components/blocks/scene-scroll/SceneScroll.d.ts +6 -5
  262. package/dist/components/blocks/scene-scroll/SceneScroll.js +8 -7
  263. package/dist/components/blocks/scene-scroll/SceneScroll.types.d.ts +5 -5
  264. package/dist/components/blocks/scene-scroll/SceneScroll.types.js +1 -1
  265. package/dist/components/blocks/scene-scroll/scene-scroll-impl.css +61 -44
  266. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.css +105 -0
  267. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.d.ts +31 -0
  268. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.js +67 -0
  269. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.types.d.ts +39 -0
  270. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.types.js +18 -0
  271. package/dist/components/blocks/scene-scroll-word/scene-scroll-word-impl.css +370 -0
  272. package/dist/components/blocks/stats/Stats.d.ts +2 -1
  273. package/dist/components/blocks/stats/Stats.js +17 -14
  274. package/dist/components/blocks/stats/Stats.types.d.ts +8 -0
  275. package/dist/components/blocks/stats/stats-impl.css +4 -1
  276. package/dist/components/blocks/stats/use-wheel.d.ts +1 -1
  277. package/dist/components/blocks/stats/use-wheel.js +8 -4
  278. package/dist/components/blocks/stats-carousel/StatsCarousel.css +209 -0
  279. package/dist/components/blocks/stats-carousel/StatsCarousel.d.ts +20 -0
  280. package/dist/components/blocks/stats-carousel/StatsCarousel.js +48 -0
  281. package/dist/components/blocks/stats-carousel/StatsCarousel.types.d.ts +43 -0
  282. package/dist/components/blocks/stats-carousel/StatsCarousel.types.js +23 -0
  283. package/dist/components/blocks/stats-carousel/stats-carousel-impl.css +233 -0
  284. package/dist/components/blocks/sticky-cards/sticky-cards-impl.css +8 -0
  285. package/dist/components/blocks/testimonial-row/TestimonialRow.css +1 -1
  286. package/dist/components/blocks/testimonial-row/TestimonialRow.d.ts +2 -1
  287. package/dist/components/blocks/testimonial-row/TestimonialRow.js +16 -13
  288. package/dist/components/blocks/testimonial-row/TestimonialRow.types.d.ts +9 -1
  289. package/dist/components/blocks/testimonial-slider/TestimonialSlider.css +1 -1
  290. package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.d.ts +1 -1
  291. package/dist/components/blocks/tiers/Tiers.types.d.ts +1 -1
  292. package/dist/components/core/background/Background.css +19 -0
  293. package/dist/components/core/background/Background.types.d.ts +2 -1
  294. package/dist/components/core/background/background-impl.css +47 -15
  295. package/dist/components/core/background/halftone.js +1 -1
  296. package/dist/components/core/button/Button.css +5 -5
  297. package/dist/components/core/button-icon/ButtonIcon.types.d.ts +1 -1
  298. package/dist/components/core/card-body/CardBody.css +5 -0
  299. package/dist/components/core/card-body/CardBody.types.d.ts +1 -1
  300. package/dist/components/core/document-link/DocumentLink.css +59 -0
  301. package/dist/components/core/document-link/DocumentLink.d.ts +19 -0
  302. package/dist/components/core/document-link/DocumentLink.js +21 -0
  303. package/dist/components/core/document-link/DocumentLink.types.d.ts +41 -0
  304. package/dist/components/core/document-link/DocumentLink.types.js +11 -0
  305. package/dist/components/core/document-link/document-link-impl.css +23 -0
  306. package/dist/components/core/illustration-card/IllustrationCard.css +7 -0
  307. package/dist/components/core/illustration-card/IllustrationCard.d.ts +5 -1
  308. package/dist/components/core/illustration-card/IllustrationCard.js +34 -8
  309. package/dist/components/core/illustration-card/IllustrationCard.types.d.ts +8 -1
  310. package/dist/components/core/illustration-card/IllustrationCard.types.js +1 -0
  311. package/dist/components/core/illustration-card/illustration-card-impl.css +113 -0
  312. package/dist/components/core/illustration-check/IllustrationCheck.css +25 -0
  313. package/dist/components/core/illustration-check/IllustrationCheck.d.ts +16 -0
  314. package/dist/components/core/illustration-check/IllustrationCheck.js +22 -0
  315. package/dist/components/core/illustration-check/IllustrationCheck.types.d.ts +25 -0
  316. package/dist/components/core/illustration-check/IllustrationCheck.types.js +9 -0
  317. package/dist/components/core/illustration-check/illustration-check-impl.css +76 -0
  318. package/dist/components/core/illustration-choice/IllustrationChoice.css +62 -0
  319. package/dist/components/core/illustration-choice/IllustrationChoice.d.ts +16 -0
  320. package/dist/components/core/illustration-choice/IllustrationChoice.js +31 -0
  321. package/dist/components/core/illustration-choice/IllustrationChoice.types.d.ts +25 -0
  322. package/dist/components/core/illustration-choice/IllustrationChoice.types.js +11 -0
  323. package/dist/components/core/illustration-choice/illustration-choice-impl.css +103 -0
  324. package/dist/components/core/illustration-code/IllustrationCode.css +25 -0
  325. package/dist/components/core/illustration-code/IllustrationCode.d.ts +12 -0
  326. package/dist/components/core/illustration-code/IllustrationCode.js +20 -0
  327. package/dist/components/core/illustration-code/IllustrationCode.types.d.ts +23 -0
  328. package/dist/components/core/illustration-code/IllustrationCode.types.js +8 -0
  329. package/dist/components/core/illustration-code/illustration-code-impl.css +42 -0
  330. package/dist/components/core/illustration-list/IllustrationList.css +19 -0
  331. package/dist/components/core/illustration-list/IllustrationList.d.ts +16 -0
  332. package/dist/components/core/illustration-list/IllustrationList.js +18 -0
  333. package/dist/components/core/illustration-list/IllustrationList.types.d.ts +15 -0
  334. package/dist/components/core/illustration-list/IllustrationList.types.js +6 -0
  335. package/dist/components/core/illustration-list/illustration-list-impl.css +52 -0
  336. package/dist/components/core/illustration-scene/IllustrationScene.css +6 -0
  337. package/dist/components/core/illustration-scene/IllustrationScene.d.ts +3 -2
  338. package/dist/components/core/illustration-scene/IllustrationScene.js +4 -3
  339. package/dist/components/core/illustration-scene/IllustrationScene.types.d.ts +5 -1
  340. package/dist/components/core/illustration-scene/IllustrationScene.types.js +2 -1
  341. package/dist/components/core/illustration-scene/illustration-scene-impl.css +65 -0
  342. package/dist/components/core/link/link-impl.css +5 -19
  343. package/dist/components/core/progress-bar/ProgressBar.css +101 -0
  344. package/dist/components/core/progress-bar/ProgressBar.d.ts +5 -0
  345. package/dist/components/core/progress-bar/ProgressBar.js +34 -0
  346. package/dist/components/core/progress-bar/ProgressBar.types.d.ts +52 -0
  347. package/dist/components/core/progress-bar/ProgressBar.types.js +12 -0
  348. package/dist/components/core/progress-bar/progress-bar-impl.css +45 -0
  349. package/dist/components/core/segmented-control/SegmentedControl.d.ts +1 -1
  350. package/dist/components/core/segmented-control/SegmentedControl.js +13 -5
  351. package/dist/components/core/segmented-control/SegmentedControl.types.d.ts +5 -1
  352. package/dist/components/core/segmented-control/segmented-control-impl.css +35 -0
  353. package/dist/components/core/segmented-control-item/SegmentedControlItem.types.d.ts +1 -1
  354. package/dist/components/core/select/Select.css +2 -0
  355. package/dist/components/core/select/select-impl.css +58 -0
  356. package/dist/components/core/status-dot/StatusDot.d.ts +1 -1
  357. package/dist/components/core/status-dot/StatusDot.js +7 -4
  358. package/dist/components/core/status-dot/StatusDot.types.d.ts +9 -1
  359. package/dist/components/core/status-dot/status-dot-impl.css +101 -0
  360. package/dist/components/core/text-area/TextArea.css +2 -0
  361. package/dist/components/core/text-area/text-area-impl.css +54 -0
  362. package/dist/components/core/text-input/TextInput.css +2 -0
  363. package/dist/components/core/text-input/text-input-impl.css +63 -0
  364. package/dist/components/core/typography/Typography.d.ts +3 -283
  365. package/dist/components/core/typography/Typography.js +9 -1
  366. package/dist/components/core/typography/Typography.types.d.ts +9 -15
  367. package/dist/components/core/typography/TypographyMotion.d.ts +28 -0
  368. package/dist/components/core/typography/TypographyMotion.js +43 -0
  369. package/dist/components/core/typography/typography-impl.css +106 -0
  370. package/dist/components/estimator-data.d.ts +29 -0
  371. package/dist/components/estimator-data.js +12 -0
  372. package/dist/components/illustration-data.d.ts +15 -0
  373. package/dist/components/illustration-data.js +7 -0
  374. package/dist/components/index.d.ts +25 -1
  375. package/dist/components/index.js +22 -0
  376. package/dist/components/layout/grid/Grid.css +5 -0
  377. package/dist/components/layout/grid/Grid.types.d.ts +2 -1
  378. package/dist/components/scene-scroll-data.d.ts +35 -0
  379. package/dist/components/tiers-data.d.ts +3 -2
  380. package/dist/icons/accounts.d.ts +1 -0
  381. package/dist/icons/accounts.js +1 -0
  382. package/dist/icons/app-stores.d.ts +1 -0
  383. package/dist/icons/app-stores.js +1 -0
  384. package/dist/icons/currency.d.ts +1 -0
  385. package/dist/icons/currency.js +1 -0
  386. package/dist/icons/flag.d.ts +1 -0
  387. package/dist/icons/flag.js +1 -0
  388. package/dist/icons/illustrative.d.ts +1 -0
  389. package/dist/icons/illustrative.js +1 -0
  390. package/dist/icons/index.d.ts +1 -0
  391. package/dist/icons/index.js +4 -0
  392. package/dist/icons/markets.d.ts +1 -0
  393. package/dist/icons/markets.js +1 -0
  394. package/dist/icons/social.d.ts +1 -0
  395. package/dist/icons/social.js +1 -0
  396. package/dist/icons/system.d.ts +1 -0
  397. package/dist/icons/system.js +1 -0
  398. package/dist/icons/trade.d.ts +1 -0
  399. package/dist/icons/trade.js +1 -0
  400. package/dist/marketing.css +26 -6
  401. package/package.json +44 -2
@@ -0,0 +1,101 @@
1
+ /* GENERATED from progressbar.contract.json. Do not edit. */
2
+
3
+ :where([data-dds-context="marketing"]) .dds-progressbar {
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: var(--space-gap-xs);
7
+ }
8
+
9
+ :where([data-dds-context="marketing"]) .dds-progressbar .dds-progressbar__track {
10
+ overflow: hidden;
11
+ position: relative;
12
+ background-color: var(--color-bg-track);
13
+ border-radius: var(--radius-pill);
14
+ }
15
+
16
+ :where([data-dds-context="marketing"]) .dds-progressbar .dds-progressbar__value-label {
17
+ font-variant-numeric: tabular-nums;
18
+ color: var(--color-fg-muted);
19
+ }
20
+
21
+ :where([data-dds-context="marketing"]) .dds-progressbar .dds-progressbar__description-text {
22
+ color: var(--color-fg-muted);
23
+ font-family: var(--font-body-sm-family);
24
+ font-size: var(--font-body-sm-size);
25
+ font-weight: var(--font-body-sm-weight);
26
+ line-height: var(--font-body-sm-line-height);
27
+ }
28
+
29
+ :where([data-dds-context="marketing"]) .dds-progressbar .dds-progressbar__fill {
30
+ border-radius: var(--radius-pill);
31
+ transition-duration: var(--motion-duration-normal);
32
+ transition-timing-function: var(--motion-easing-standard);
33
+ }
34
+
35
+ :where([data-dds-context="marketing"]) .dds-progressbar .dds-progressbar__label {
36
+ color: var(--color-fg-default);
37
+ }
38
+
39
+ :where([data-dds-context="marketing"]) .dds-progressbar[data-size="md"] .dds-progressbar__label {
40
+ font-family: var(--font-label-md-family);
41
+ font-size: var(--font-label-md-size);
42
+ font-weight: var(--font-label-md-weight);
43
+ line-height: var(--font-label-md-line-height);
44
+ }
45
+
46
+ :where([data-dds-context="marketing"]) .dds-progressbar[data-size="md"] .dds-progressbar__track {
47
+ height: var(--size-progressbar-track-md);
48
+ }
49
+
50
+ :where([data-dds-context="marketing"]) .dds-progressbar[data-size="md"] .dds-progressbar__value-label {
51
+ font-family: var(--font-label-md-family);
52
+ font-size: var(--font-label-md-size);
53
+ line-height: var(--font-label-md-line-height);
54
+ }
55
+
56
+ :where([data-dds-context="marketing"]) .dds-progressbar[data-size="sm"] .dds-progressbar__label {
57
+ font-family: var(--font-label-sm-family);
58
+ font-size: var(--font-label-sm-size);
59
+ font-weight: var(--font-label-sm-weight);
60
+ line-height: var(--font-label-sm-line-height);
61
+ }
62
+
63
+ :where([data-dds-context="marketing"]) .dds-progressbar[data-size="sm"] .dds-progressbar__track {
64
+ height: var(--size-progressbar-track-sm);
65
+ }
66
+
67
+ :where([data-dds-context="marketing"]) .dds-progressbar[data-size="sm"] .dds-progressbar__value-label {
68
+ font-family: var(--font-label-sm-family);
69
+ font-size: var(--font-label-sm-size);
70
+ line-height: var(--font-label-sm-line-height);
71
+ }
72
+
73
+ :where([data-dds-context="marketing"]) .dds-progressbar[data-variant="accent"] .dds-progressbar__fill {
74
+ background-color: var(--color-bg-brand);
75
+ }
76
+
77
+ :where([data-dds-context="marketing"]) .dds-progressbar[data-variant="default"] .dds-progressbar__fill {
78
+ background-color: var(--color-bg-strong);
79
+ }
80
+
81
+ :where([data-dds-context="marketing"]) .dds-progressbar[data-variant="error"] .dds-progressbar__fill {
82
+ background-color: var(--color-bg-danger);
83
+ }
84
+
85
+ :where([data-dds-context="marketing"]) .dds-progressbar[data-variant="info"] .dds-progressbar__fill {
86
+ background-color: var(--color-bg-info);
87
+ }
88
+
89
+ :where([data-dds-context="marketing"]) .dds-progressbar[data-variant="success"] .dds-progressbar__fill {
90
+ background-color: var(--color-bg-success);
91
+ }
92
+
93
+ :where([data-dds-context="marketing"]) .dds-progressbar[data-variant="warning"] .dds-progressbar__fill {
94
+ background-color: var(--color-bg-warning);
95
+ }
96
+
97
+ @media (prefers-reduced-motion: reduce) {
98
+ :where([data-dds-context="marketing"]) .dds-progressbar,
99
+ :where([data-dds-context="marketing"]) .dds-progressbar * { transition: none !important; }
100
+ }
101
+
@@ -0,0 +1,5 @@
1
+ import './ProgressBar.css';
2
+ import './progress-bar-impl.css';
3
+ import { type ProgressBarProps } from './ProgressBar.types.js';
4
+ export type { ProgressBarProps };
5
+ export declare function ProgressBar({ size, variant, value, max, label, showLabel, showValueLabel, description, motion, ...rest }: ProgressBarProps): import("react").JSX.Element;
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import './ProgressBar.css';
3
+ import { visuallyHidden } from '../../visually-hidden.js';
4
+ import './progress-bar-impl.css';
5
+ import { given } from '../../given.js';
6
+ import { Arrives } from '../../arrives.js';
7
+ import { progressBarDefaults, progressBarParts } from './ProgressBar.types.js';
8
+ export function ProgressBar({ size = progressBarDefaults.size, variant = progressBarDefaults.variant, value = progressBarDefaults.value, max = progressBarDefaults.max, label, showLabel = progressBarDefaults.showLabel, showValueLabel = progressBarDefaults.showValueLabel, description, motion, ...rest }) {
9
+ /**
10
+ * How far along, as a percentage of max.
11
+ *
12
+ * Three lines shorter than it was, and none of what went was doing any work of its own.
13
+ * `value` and `max` were declared as strings because the contract had no number to
14
+ * declare, so this converted them, guarded the NaN a conversion can produce, and kept a
15
+ * second copy of max's default for when the conversion failed. All three existed to undo
16
+ * a declaration rather than to describe a progress bar.
17
+ *
18
+ * What stays is the one clamp that is a real decision: a value above max reads as full
19
+ * rather than overflowing its own track. It is applied to the number rather than to the
20
+ * percentage now, because it was only ever applied to the width — so a bar given 150 of 100
21
+ * was drawn full and announced as "150 of 100", the eye and the ear disagreeing about a
22
+ * control whose whole job is to report one number. A value below nought was worse: `width:
23
+ * -10%` is not a width, so the fill kept whatever the track gave it and the reading went out
24
+ * as -10.
25
+ *
26
+ * A max of nought or less has no percentage to state — nothing can be a fraction of nothing —
27
+ * and it read as complete, which is the one answer that is certainly wrong.
28
+ */
29
+ const bounded = Math.min(Math.max(value, 0), Math.max(max, 0));
30
+ const percent = max > 0 ? (bounded / max) * 100 : 0;
31
+ const bar = (_jsxs("div", { className: progressBarParts.root, role: "progressbar", "aria-label": given(label) ? label : undefined, "aria-valuenow": bounded, "aria-valuemin": 0, "aria-valuemax": max, "data-size": size, "data-variant": variant, "data-motion": motion, ...rest, children: [given(label) || showValueLabel ? (_jsxs("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'baseline' }, children: [given(label) ? (_jsx("span", { className: progressBarParts.label, style: showLabel ? undefined : visuallyHidden, children: label })) : null, showValueLabel ? (_jsx("span", { className: progressBarParts['value-label'], children: `${Math.round(percent)}%` })) : null] })) : null, _jsx("div", { className: progressBarParts.track, children: _jsx("div", { className: progressBarParts.fill, style: { height: '100%', width: `${percent}%` } }) }), given(description) ? (_jsx("p", { className: progressBarParts['description-text'], children: description })) : null] }));
32
+ // A bar that fills on arrival moves once, so only then does it take a script.
33
+ return motion === undefined ? bar : _jsx(Arrives, { children: bar });
34
+ }
@@ -0,0 +1,52 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ export interface ProgressBarOwnProps {
3
+ /**
4
+ * `sm` — Dense layouts or inline indicators where vertical space is limited
5
+ * `md` — Default for standalone progress indicators in forms or dialogs
6
+ */
7
+ size?: 'sm' | 'md';
8
+ /**
9
+ * `default` — The default, and neutral: no status and no brand. Most progress is merely progress — a step count filling as a form is completed, a bar moving while a file uploads — and the fact that work is moving is all the colour has to say. StepperItem is named and defaults the same way, and the two draw the same neutral, so a stepper and a bar reporting one task agree.
10
+ * `accent` — Brand-coloured, and asked for rather than arrived at. Reach for it where the page is drawing attention to this progress — the one thing on screen a reader is waiting on. It carries no status: what it adds over the neutral is prominence, not meaning, so a page reaching for it everywhere has spent the emphasis it buys.
11
+ * `success` — Indicating completion or a successful process
12
+ * `warning` — Progress that needs attention, such as approaching a limit
13
+ * `error` — Progress of a process that has encountered a problem
14
+ * `info` — Informational progress such as downloads, syncing, or data loading
15
+ */
16
+ variant?: 'default' | 'accent' | 'success' | 'warning' | 'error' | 'info';
17
+ /** The amount of work completed — a number between 0 and max. Defaults to 0, which is the honest rendering of nothing started */
18
+ value?: number;
19
+ /** The total amount of work differs from the default of 100 */
20
+ max?: number;
21
+ /** Naming what is in progress, when the bar is not already named by what surrounds it. Omit it for a bar that is part of a labelled flow — an onboarding stepper under its own heading — and name the bar with aria-labelledby instead */
22
+ label?: string;
23
+ /** The label is visible. When false, the label is visually hidden but remains accessible to screen readers */
24
+ showLabel?: boolean;
25
+ /** The numeric progress value is visible alongside the bar */
26
+ showValueLabel?: boolean;
27
+ /** Freeform context below the bar, such as a step count, status message, or time remaining */
28
+ description?: string;
29
+ /**
30
+ * `fill` — The bar fills from empty to its value once, on arrival, over motion.duration.dramatic — an account set-up three steps in, shown in a pane
31
+ */
32
+ motion?: 'fill';
33
+ }
34
+ export type ProgressBarProps = ProgressBarOwnProps & Omit<HTMLAttributes<HTMLDivElement>, 'className' | 'size' | 'variant' | 'value' | 'max' | 'label' | 'showLabel' | 'showValueLabel' | 'description' | 'motion'>;
35
+ /** The class each part carries. Apply these — do not retype them. */
36
+ export declare const progressBarParts: {
37
+ readonly root: "dds-progressbar";
38
+ readonly track: "dds-progressbar__track";
39
+ readonly fill: "dds-progressbar__fill";
40
+ readonly label: "dds-progressbar__label";
41
+ readonly 'value-label': "dds-progressbar__value-label";
42
+ readonly 'description-text': "dds-progressbar__description-text";
43
+ };
44
+ /** Generated so defaults cannot drift from the contract. */
45
+ export declare const progressBarDefaults: {
46
+ readonly size: "md";
47
+ readonly variant: "default";
48
+ readonly value: 0;
49
+ readonly max: 100;
50
+ readonly showLabel: true;
51
+ readonly showValueLabel: true;
52
+ };
@@ -0,0 +1,12 @@
1
+ // GENERATED from progress-bar.contract.json. Do not edit.
2
+ /** The class each part carries. Apply these — do not retype them. */
3
+ export const progressBarParts = {
4
+ root: 'dds-progressbar',
5
+ track: 'dds-progressbar__track',
6
+ fill: 'dds-progressbar__fill',
7
+ label: 'dds-progressbar__label',
8
+ 'value-label': 'dds-progressbar__value-label',
9
+ 'description-text': 'dds-progressbar__description-text',
10
+ };
11
+ /** Generated so defaults cannot drift from the contract. */
12
+ export const progressBarDefaults = { size: 'md', variant: 'default', value: 0, max: 100, showLabel: true, showValueLabel: true };
@@ -0,0 +1,45 @@
1
+ /*
2
+ * Scoped to this package, like the generated sheet beside it.
3
+ *
4
+ * `:where([data-dds-context="marketing"])` confines these rules without contributing
5
+ * specificity, so every override below still ties or beats exactly what it did
6
+ * before — several here are written a class deeper than they look in order to
7
+ * match generated CSS, and a scope that carried weight would break all of them.
8
+ */
9
+
10
+ /* Implementation CSS that the contract's staticCss cannot express. */
11
+
12
+ :where([data-dds-context="marketing"]) .dds-progressbar {
13
+ width: 100%;
14
+ }
15
+
16
+ :where([data-dds-context="marketing"]) .dds-progressbar__description-text {
17
+ margin: 0;
18
+ }
19
+
20
+ /*
21
+ * `motion="fill"`: the bar fills from empty to where the task has got to, once, on arrival — over
22
+ * motion.duration.dramatic, a step of motion.duration.fast after the bar has landed. `data-arrival`
23
+ * is the bar's own answer from useArrival (arrival.ts): `waiting` holds it empty, `playing` fills
24
+ * it, and no attribute — a server, a reader who asked for less movement — is the bar at its value.
25
+ * The value itself, and what is read out, never moves.
26
+ */
27
+ @keyframes dds-progressbar-fill {
28
+ from {
29
+ width: 0;
30
+ }
31
+ }
32
+
33
+ :where([data-dds-context="marketing"]) .dds-progressbar[data-motion='fill'][data-arrival] .dds-progressbar__fill {
34
+ animation: dds-progressbar-fill var(--motion-duration-dramatic) var(--motion-easing-reveal) var(--motion-duration-fast) both;
35
+ }
36
+
37
+ :where([data-dds-context="marketing"]) .dds-progressbar[data-motion='fill'][data-arrival='waiting'] .dds-progressbar__fill {
38
+ animation-play-state: paused !important;
39
+ }
40
+
41
+ @media (prefers-reduced-motion: reduce) {
42
+ :where([data-dds-context="marketing"]) .dds-progressbar[data-motion='fill'][data-arrival] .dds-progressbar__fill {
43
+ animation: none;
44
+ }
45
+ }
@@ -34,4 +34,4 @@ export type { SegmentedControlProps };
34
34
  * the reader a value is in force that the page never set, and hide whatever caused the
35
35
  * mismatch — a stale piece of state, a segment that has not loaded yet.
36
36
  */
37
- export declare function SegmentedControl({ layout, size, disabled, label, value, onChange, children, ...rest }: SegmentedControlProps): import("react").JSX.Element;
37
+ export declare function SegmentedControl({ layout, size, disabled, label, value, onChange, motion, children, ...rest }: SegmentedControlProps): import("react").JSX.Element;
@@ -1,8 +1,9 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { Children, cloneElement, isValidElement, useCallback, useEffect, useLayoutEffect, useRef, useState, } from "react";
3
+ import { Children, cloneElement, isValidElement, useCallback, useEffect, useLayoutEffect, useState, } from "react";
4
4
  import "./SegmentedControl.css";
5
5
  import "./segmented-control-impl.css";
6
+ import { useArrival } from "../../arrival.js";
6
7
  import { segmentedControlItemParts } from "../segmented-control-item/SegmentedControlItem.types.js";
7
8
  import { segmentedControlDefaults, segmentedControlParts, } from "./SegmentedControl.types.js";
8
9
  /**
@@ -70,8 +71,9 @@ function chain(theirs, ours) {
70
71
  export function SegmentedControl({ layout = segmentedControlDefaults.layout, size = segmentedControlDefaults.size, disabled = segmentedControlDefaults.disabled,
71
72
  // No fallback, because there is no default to fall back to. The contract requires it:
72
73
  // the question the segments are answers to is the one thing nothing else can supply.
73
- label, value, onChange, children, ...rest }) {
74
- const rootRef = useRef(null);
74
+ label, value, onChange, motion, children, ...rest }) {
75
+ // The row's own element, and — under `motion="slide"` — where its arrival has got to.
76
+ const [rootRef, arrival] = useArrival(motion === "slide");
75
77
  const segments = Children.toArray(children).filter((isValidElement));
76
78
  /**
77
79
  * Whether the consumer owns which value is in force.
@@ -154,11 +156,15 @@ label, value, onChange, children, ...rest }) {
154
156
  on, and every segment's pill landed one row-width minus a segment to the right of it.
155
157
  */
156
158
  const rtl = getComputedStyle(root).direction === "rtl";
159
+ const at = (each) => rtl ? each.offsetLeft + each.offsetWidth - root.clientWidth : each.offsetLeft;
160
+ const first = root.querySelector(`:scope > .${segmentedControlItemParts.root}`) ?? box;
157
161
  setPill({
158
- x: rtl ? box.offsetLeft + box.offsetWidth - root.clientWidth : box.offsetLeft,
162
+ x: at(box),
159
163
  y: box.offsetTop,
160
164
  w: box.offsetWidth,
161
165
  h: box.offsetHeight,
166
+ fromX: at(first),
167
+ fromW: first.offsetWidth,
162
168
  });
163
169
  }, [active]);
164
170
  // Layout rather than a plain effect: between the two the pill would be painted at its
@@ -244,12 +250,14 @@ label, value, onChange, children, ...rest }) {
244
250
  target?.focus();
245
251
  target?.click();
246
252
  };
247
- return (_jsxs("div", { ...rest, ref: rootRef, className: segmentedControlParts.root, role: "radiogroup", "aria-label": label, "aria-disabled": disabled ? true : undefined, "data-layout": layout, "data-size": size, "data-disabled": String(disabled), onKeyDown: onKeyDown, children: [_jsx("span", { className: segmentedControlParts.indicator, hidden: pill === null, style: pill === null
253
+ return (_jsxs("div", { ...rest, ref: rootRef, className: segmentedControlParts.root, role: "radiogroup", "aria-label": label, "aria-disabled": disabled ? true : undefined, "data-layout": layout, "data-size": size, "data-disabled": String(disabled), "data-motion": motion, "data-arrival": arrival === "still" ? undefined : arrival, onKeyDown: onKeyDown, children: [_jsx("span", { className: segmentedControlParts.indicator, hidden: pill === null, style: pill === null
248
254
  ? undefined
249
255
  : {
250
256
  blockSize: `${pill.h}px`,
251
257
  inlineSize: `${pill.w}px`,
252
258
  translate: `${pill.x}px ${pill.y}px`,
259
+ ["--dds-segmentedcontrol-from"]: `${pill.fromX}px ${pill.y}px`,
260
+ ["--dds-segmentedcontrol-from-size"]: `${pill.fromW}px`,
253
261
  } }), segments.map((segment, index) => cloneElement(segment, {
254
262
  // Both are the row's to decide, and both overwrite whatever the segment was
255
263
  // given: one chosen value, one height. Availability is the segment's own — the
@@ -21,10 +21,14 @@ export interface SegmentedControlOwnProps {
21
21
  value?: string;
22
22
  /** Whenever value is — together they are how a page holds the choice. It is called with the chosen segment's value after that segment's own onSelect, so a segment that reports its own presses keeps doing so inside a row */
23
23
  onChange?: (value: string) => void;
24
+ /**
25
+ * `slide` — The pill starts on the first segment and slides to the chosen one once, on arrival — a trade ticket set to Sell showing it was Buy first. It holds for motion.duration.hold, then slides over motion.duration.shift
26
+ */
27
+ motion?: 'slide';
24
28
  /** Allowed: SegmentedControlItem */
25
29
  children: ReactNode;
26
30
  }
27
- export type SegmentedControlProps = SegmentedControlOwnProps & Omit<HTMLAttributes<HTMLDivElement>, 'className' | 'layout' | 'size' | 'disabled' | 'label' | 'value' | 'onChange'>;
31
+ export type SegmentedControlProps = SegmentedControlOwnProps & Omit<HTMLAttributes<HTMLDivElement>, 'className' | 'layout' | 'size' | 'disabled' | 'label' | 'value' | 'onChange' | 'motion'>;
28
32
  /** The class each part carries. Apply these — do not retype them. */
29
33
  export declare const segmentedControlParts: {
30
34
  readonly root: "dds-segmentedcontrol";
@@ -55,3 +55,38 @@
55
55
  .dds-segmentedcontrol__indicator {
56
56
  transition-property: translate, inline-size, block-size;
57
57
  }
58
+
59
+ /*
60
+ * `motion="slide"`: the pill starts on the first segment and slides to the chosen one once, on
61
+ * arrival — Buy to Sell — over motion.duration.shift on its easing, after holding where it started
62
+ * for motion.duration.hold. Where it starts is measured with where it lands (the first segment's
63
+ * place and width, set on the pill as custom properties), so the slide is the stylesheet's.
64
+ * `data-arrival` is the row's own answer from useArrival (arrival.ts): `waiting` holds the pill on
65
+ * the first segment, `playing` slides it, and no attribute is the pill where it belongs.
66
+ */
67
+ @keyframes dds-segmentedcontrol-slide {
68
+ from {
69
+ inline-size: var(--dds-segmentedcontrol-from-size);
70
+ translate: var(--dds-segmentedcontrol-from);
71
+ }
72
+ }
73
+
74
+ :where([data-dds-context="marketing"])
75
+ .dds-segmentedcontrol[data-motion='slide'][data-arrival]
76
+ .dds-segmentedcontrol__indicator {
77
+ animation: dds-segmentedcontrol-slide var(--motion-duration-shift) var(--motion-easing-shift) var(--motion-duration-hold) both;
78
+ }
79
+
80
+ :where([data-dds-context="marketing"])
81
+ .dds-segmentedcontrol[data-motion='slide'][data-arrival='waiting']
82
+ .dds-segmentedcontrol__indicator {
83
+ animation-play-state: paused !important;
84
+ }
85
+
86
+ @media (prefers-reduced-motion: reduce) {
87
+ :where([data-dds-context="marketing"])
88
+ .dds-segmentedcontrol[data-motion='slide'][data-arrival]
89
+ .dds-segmentedcontrol__indicator {
90
+ animation: none;
91
+ }
92
+ }
@@ -10,7 +10,7 @@ export interface SegmentedControlItemOwnProps {
10
10
  value: string;
11
11
  /** Always — it is the segment's accessible name as well as its words, and a radio with no name is announced as a control with nothing in it. One or two words: a row is scanned across, and the segment that needs a phrase is a choice that wanted a list */
12
12
  label: string;
13
- /** The glyph tells the modes apart faster than the words do — a card and a bank beside two payment methods. Import it from @deriv-com/quill-icons-web and pass the element */
13
+ /** The glyph tells the modes apart faster than the words do — a card and a bank beside two payment methods. Import it from @deriv-com/dds-marketing/icons and pass the element */
14
14
  icon?: ReactNode;
15
15
  /** This segment reports its own presses — logging which plan a visitor looked at, say. It is called with this segment's value, and SegmentedControl chains its own handler after it rather than replacing it */
16
16
  onSelect?: (value: string) => void;
@@ -151,6 +151,8 @@
151
151
  gap: var(--space-gap-xs);
152
152
  letter-spacing: var(--font-body-sm-letter-spacing);
153
153
  line-height: var(--font-body-sm-line-height);
154
+ transition-duration: var(--motion-duration-fast);
155
+ transition-timing-function: var(--motion-easing-standard);
154
156
  }
155
157
 
156
158
  :where([data-dds-context="marketing"]) .dds-select .dds-select__message-icon {
@@ -112,3 +112,61 @@
112
112
  animation: none;
113
113
  }
114
114
  }
115
+
116
+ /*
117
+ * The status message fades in when it arrives.
118
+ *
119
+ * A contract binds transitions, and a transition needs a value to move from: the message is not
120
+ * in the DOM until a status is reported, so only a keyframe can bring it in. Opacity alone — the
121
+ * message takes the helper's place rather than pushing the row down, so there is no distance to
122
+ * travel, and moving it would shift the words being read. A status changing while the message is
123
+ * showing keeps the same element, and its colour moves with the transition the contract binds.
124
+ */
125
+ @keyframes dds-select-message-in {
126
+ from {
127
+ opacity: 0;
128
+ }
129
+ }
130
+
131
+ :where([data-dds-context="marketing"]) .dds-select .dds-select__message {
132
+ animation: dds-select-message-in var(--motion-duration-normal) var(--motion-easing-enter);
133
+ }
134
+
135
+ /*
136
+ * The box shakes once when the field turns to an error, as TextInput's does.
137
+ *
138
+ * Once, on arrival: the animation is attached by the error status, so it plays when the status
139
+ * becomes error and not again while it stays one. Only the box moves; the label and the
140
+ * message hold still, so the words saying what went wrong can be read while it settles.
141
+ *
142
+ * Not while the list is open. The popup is drawn inside the box, so shaking the box would shake
143
+ * the answers being read along with it. A status that arrives while it is open shakes the box
144
+ * as the list closes, which is the moment the answer is handed in.
145
+ */
146
+ @keyframes dds-select-shake {
147
+ 20% {
148
+ translate: calc(var(--motion-distance-shake) * -1) 0;
149
+ }
150
+ 40% {
151
+ translate: var(--motion-distance-shake) 0;
152
+ }
153
+ 60% {
154
+ translate: calc(var(--motion-distance-shake) * -0.5) 0;
155
+ }
156
+ 80% {
157
+ translate: calc(var(--motion-distance-shake) * 0.5) 0;
158
+ }
159
+ }
160
+
161
+ :where([data-dds-context="marketing"]) .dds-select[data-status="error"]:not(:has([aria-expanded="true"])) .dds-select__control {
162
+ animation: dds-select-shake var(--motion-duration-slow) var(--motion-easing-standard);
163
+ }
164
+
165
+ /* The generated reduce block is written from the token bindings and these are not. A reader who
166
+ has asked for less movement has asked for this too. */
167
+ @media (prefers-reduced-motion: reduce) {
168
+ :where([data-dds-context="marketing"]) .dds-select .dds-select__message,
169
+ :where([data-dds-context="marketing"]) .dds-select[data-status="error"]:not(:has([aria-expanded="true"])) .dds-select__control {
170
+ animation: none;
171
+ }
172
+ }
@@ -32,4 +32,4 @@ export type { StatusDotProps };
32
32
  * carrying a tooltip must have — a tooltip makes it a tab stop, and a focusable thing
33
33
  * with no name is announced as nothing at all.
34
34
  */
35
- export declare function StatusDot({ variant, pulse, label, tooltip, ...rest }: StatusDotProps): import("react").JSX.Element;
35
+ export declare function StatusDot({ variant, pulse, from, label, tooltip, ...rest }: StatusDotProps): import("react").JSX.Element;
@@ -2,6 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import './StatusDot.css';
3
3
  import './status-dot-impl.css';
4
4
  import { TooltipAnchor } from '../tooltip/TooltipAnchor.js';
5
+ import { Arrives } from '../../arrives.js';
5
6
  import { given } from '../../given.js';
6
7
  import { statusDotDefaults, statusDotParts } from './StatusDot.types.js';
7
8
  /**
@@ -34,13 +35,15 @@ import { statusDotDefaults, statusDotParts } from './StatusDot.types.js';
34
35
  * carrying a tooltip must have — a tooltip makes it a tab stop, and a focusable thing
35
36
  * with no name is announced as nothing at all.
36
37
  */
37
- export function StatusDot({ variant = statusDotDefaults.variant, pulse = statusDotDefaults.pulse, label, tooltip, ...rest }) {
38
+ export function StatusDot({ variant = statusDotDefaults.variant, pulse = statusDotDefaults.pulse, from, label, tooltip, ...rest }) {
38
39
  const described = given(tooltip);
39
- const dot = (_jsx("span", { className: statusDotParts.root, "aria-label": label, "aria-hidden": label === undefined || undefined, "data-variant": variant, "data-pulse": pulse || undefined, tabIndex: described ? 0 : undefined, ...rest }));
40
+ const dot = (_jsx("span", { className: statusDotParts.root, "aria-label": label, "aria-hidden": label === undefined || undefined, "data-variant": variant, "data-pulse": pulse || undefined, "data-from": from, tabIndex: described ? 0 : undefined, ...rest }));
41
+ // A dot that starts as another state moves once on arrival, so only then does it take a script.
42
+ const drawn = from === undefined ? dot : _jsx(Arrives, { children: dot });
40
43
  if (!described)
41
- return dot;
44
+ return drawn;
42
45
  // The anchor clones the dot to attach its handlers and the aria-describedby, so the
43
46
  // description belongs to the element carrying the role — not to the wrapper, which
44
47
  // no assistive technology has any reason to visit.
45
- return _jsx(TooltipAnchor, { content: tooltip, children: dot });
48
+ return _jsx(TooltipAnchor, { content: tooltip, children: drawn });
46
49
  }
@@ -10,8 +10,16 @@ export interface StatusDotOwnProps {
10
10
  variant?: 'accent' | 'success' | 'warning' | 'error' | 'info';
11
11
  /** The status is live or actively changing — draws attention to an ongoing state */
12
12
  pulse?: boolean;
13
+ /**
14
+ * `accent` — Starts as accent before becoming its own state.
15
+ * `success` — Starts as success before becoming its own state.
16
+ * `warning` — Starts as warning before becoming its own state.
17
+ * `error` — Starts as error before becoming its own state.
18
+ * `info` — Starts as info before becoming its own state.
19
+ */
20
+ from?: 'accent' | 'success' | 'warning' | 'error' | 'info';
13
21
  }
14
- export type StatusDotProps = StatusDotOwnProps & Omit<HTMLAttributes<HTMLSpanElement>, 'className' | 'variant' | 'pulse' | 'label' | 'tooltip'> & ({
22
+ export type StatusDotProps = StatusDotOwnProps & Omit<HTMLAttributes<HTMLSpanElement>, 'className' | 'variant' | 'pulse' | 'label' | 'tooltip' | 'from'> & ({
15
23
  tooltip?: string;
16
24
  label: string;
17
25
  } | {
@@ -40,3 +40,104 @@
40
40
  :where([data-dds-context="marketing"]) .dds-tooltip-anchor:has(> .dds-statusdot) {
41
41
  flex-shrink: 0;
42
42
  }
43
+
44
+ /*
45
+ * `from`: the dot starts as another state and becomes its own once, on arrival — "Opening…" in
46
+ * info's blue becoming "Position open" in success's green. `data-arrival` is the dot's own answer
47
+ * from useArrival (arrival.ts): `waiting` holds it in its first state, `playing` runs it, and no
48
+ * attribute — a server, a reader who asked for less movement — is the dot in its own state.
49
+ *
50
+ * It holds the first state for motion.duration.hold — the same hold Typography's `from` gives its
51
+ * words, so a dot and the words beside it change together — then turns in one step, and a dot that
52
+ * pulses starts pulsing only then: a live state loops; the state before it was not live.
53
+ */
54
+ /* One keyframe per state the dot can start in, each naming its own colour token. */
55
+ @keyframes dds-statusdot-from-accent {
56
+ from {
57
+ background-color: var(--color-bg-brand);
58
+ }
59
+ }
60
+
61
+ @keyframes dds-statusdot-from-error {
62
+ from {
63
+ background-color: var(--color-bg-danger);
64
+ }
65
+ }
66
+
67
+ @keyframes dds-statusdot-from-info {
68
+ from {
69
+ background-color: var(--color-bg-info);
70
+ }
71
+ }
72
+
73
+ @keyframes dds-statusdot-from-success {
74
+ from {
75
+ background-color: var(--color-bg-success);
76
+ }
77
+ }
78
+
79
+ @keyframes dds-statusdot-from-warning {
80
+ from {
81
+ background-color: var(--color-bg-warning);
82
+ }
83
+ }
84
+
85
+ :where([data-dds-context="marketing"]) .dds-statusdot[data-from='accent'][data-arrival] {
86
+ animation: dds-statusdot-from-accent var(--motion-duration-hold) steps(1, end) both;
87
+ }
88
+
89
+ :where([data-dds-context="marketing"]) .dds-statusdot[data-from='accent'][data-pulse][data-arrival] {
90
+ animation:
91
+ dds-statusdot-from-accent var(--motion-duration-hold) steps(1, end) both,
92
+ dds-statusdot-pulse var(--motion-duration-pulse) var(--motion-easing-enter) var(--motion-duration-hold) infinite;
93
+ }
94
+
95
+ :where([data-dds-context="marketing"]) .dds-statusdot[data-from='error'][data-arrival] {
96
+ animation: dds-statusdot-from-error var(--motion-duration-hold) steps(1, end) both;
97
+ }
98
+
99
+ :where([data-dds-context="marketing"]) .dds-statusdot[data-from='error'][data-pulse][data-arrival] {
100
+ animation:
101
+ dds-statusdot-from-error var(--motion-duration-hold) steps(1, end) both,
102
+ dds-statusdot-pulse var(--motion-duration-pulse) var(--motion-easing-enter) var(--motion-duration-hold) infinite;
103
+ }
104
+
105
+ :where([data-dds-context="marketing"]) .dds-statusdot[data-from='info'][data-arrival] {
106
+ animation: dds-statusdot-from-info var(--motion-duration-hold) steps(1, end) both;
107
+ }
108
+
109
+ :where([data-dds-context="marketing"]) .dds-statusdot[data-from='info'][data-pulse][data-arrival] {
110
+ animation:
111
+ dds-statusdot-from-info var(--motion-duration-hold) steps(1, end) both,
112
+ dds-statusdot-pulse var(--motion-duration-pulse) var(--motion-easing-enter) var(--motion-duration-hold) infinite;
113
+ }
114
+
115
+ :where([data-dds-context="marketing"]) .dds-statusdot[data-from='success'][data-arrival] {
116
+ animation: dds-statusdot-from-success var(--motion-duration-hold) steps(1, end) both;
117
+ }
118
+
119
+ :where([data-dds-context="marketing"]) .dds-statusdot[data-from='success'][data-pulse][data-arrival] {
120
+ animation:
121
+ dds-statusdot-from-success var(--motion-duration-hold) steps(1, end) both,
122
+ dds-statusdot-pulse var(--motion-duration-pulse) var(--motion-easing-enter) var(--motion-duration-hold) infinite;
123
+ }
124
+
125
+ :where([data-dds-context="marketing"]) .dds-statusdot[data-from='warning'][data-arrival] {
126
+ animation: dds-statusdot-from-warning var(--motion-duration-hold) steps(1, end) both;
127
+ }
128
+
129
+ :where([data-dds-context="marketing"]) .dds-statusdot[data-from='warning'][data-pulse][data-arrival] {
130
+ animation:
131
+ dds-statusdot-from-warning var(--motion-duration-hold) steps(1, end) both,
132
+ dds-statusdot-pulse var(--motion-duration-pulse) var(--motion-easing-enter) var(--motion-duration-hold) infinite;
133
+ }
134
+
135
+ :where([data-dds-context="marketing"]) .dds-statusdot[data-from][data-arrival='waiting'] {
136
+ animation-play-state: paused !important;
137
+ }
138
+
139
+ @media (prefers-reduced-motion: reduce) {
140
+ :where([data-dds-context="marketing"]) .dds-statusdot[data-from][data-arrival] {
141
+ animation: none;
142
+ }
143
+ }
@@ -92,6 +92,8 @@
92
92
  gap: var(--space-gap-xs);
93
93
  letter-spacing: var(--font-body-sm-letter-spacing);
94
94
  line-height: var(--font-body-sm-line-height);
95
+ transition-duration: var(--motion-duration-fast);
96
+ transition-timing-function: var(--motion-easing-standard);
95
97
  }
96
98
 
97
99
  :where([data-dds-context="marketing"]) .dds-textarea .dds-textarea__message-icon {