@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
@@ -383,3 +383,57 @@
383
383
  padding-block: var(--space-section-compact);
384
384
  }
385
385
  }
386
+
387
+ /*
388
+ * `shade`: a shade behind the words, for a bright photograph.
389
+ *
390
+ * The photograph is shown as it is, and a bright one — the daylight sky the brand's heroes ask for —
391
+ * leaves the description and the actions below AA. Darkening the whole photograph fixes the number
392
+ * and loses the day. So the shade is drawn from the words themselves: a box of color.bg.overlay under
393
+ * the text and another under the actions, each reaching space.inset.2xl past the words and blurred by
394
+ * space.inset.xl, so it is full strength under every word and fades to clear in the margin round them.
395
+ * It follows the words wherever they sit — at the start on a phone, centred from the fold — and leaves
396
+ * the rest of the photograph its light.
397
+ *
398
+ * The two boxes meet rather than overlap: the text's runs down across the step to the actions, the
399
+ * actions' starts at their top edge. Overlapping, the two layers of shade doubled into a darker band
400
+ * between the words and the buttons; meeting, their blurred edges add back up to the one strength.
401
+ * A blur rather than a gradient because a gradient fills a box to its edge, and the edge then shows.
402
+ *
403
+ * Under the words, inside their own stacking context, so it can never be drawn over a word or a
404
+ * button.
405
+ */
406
+ :where([data-dds-context="marketing"]) .dds-producthero[data-shade] :is(.dds-producthero__text, .dds-producthero__actions) {
407
+ isolation: isolate;
408
+ position: relative;
409
+ }
410
+
411
+ :where([data-dds-context="marketing"]) .dds-producthero[data-shade] :is(.dds-producthero__text, .dds-producthero__actions)::before {
412
+ background-color: var(--color-bg-overlay);
413
+ content: '';
414
+ filter: blur(var(--space-inset-xl));
415
+ inset: calc(-1 * var(--space-inset-2xl));
416
+ pointer-events: none;
417
+ position: absolute;
418
+ z-index: -1;
419
+ }
420
+
421
+ :where([data-dds-context="marketing"]) .dds-producthero[data-shade] .dds-producthero__text:has(+ .dds-producthero__actions)::before {
422
+ inset-block-end: calc(-1 * var(--space-heading-description-actions));
423
+ }
424
+
425
+ :where([data-dds-context="marketing"]) .dds-producthero[data-shade] .dds-producthero__actions::before {
426
+ inset-block-start: 0;
427
+ }
428
+
429
+ /*
430
+ * From the fold, where the words are centred, the text's box is the band's whole width while its
431
+ * balanced lines take much less of it, so a shade the box's width was a veil across the band. It is
432
+ * held to size.heading-group.max — the width a centred title and its line may run as a block — and
433
+ * the margin round that, centred with the words.
434
+ */
435
+ @container (min-width: 48rem) {
436
+ :where([data-dds-context="marketing"]) .dds-producthero[data-shade] .dds-producthero__text::before {
437
+ inset-inline: max(calc(-1 * var(--space-inset-2xl)), calc(50% - var(--size-heading-group-max) / 2 - var(--space-inset-2xl)));
438
+ }
439
+ }
@@ -91,7 +91,7 @@
91
91
  }
92
92
 
93
93
  :where([data-dds-context="marketing"]) .dds-resourcebanner[data-ground="strong"] .dds-resourcebanner__panel {
94
- background-color: var(--color-bg-surface-card-strong);
94
+ background-color: var(--color-bg-surface-card-strong-on-brand-strong);
95
95
  }
96
96
 
97
97
  :where([data-dds-context="marketing"]) .dds-resourcebanner[data-ground="subtle"] {
@@ -68,7 +68,7 @@
68
68
  max-inline-size: var(--size-measure-description);
69
69
  }
70
70
 
71
- :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__link {
71
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__action {
72
72
  display: flex;
73
73
  position: relative;
74
74
  padding-block-end: var(--space-section-default);
@@ -24,13 +24,14 @@ export type { SceneScrollProps };
24
24
  * translate and keep in step. The second scene's title sits one level under it, as the second half
25
25
  * of the section the first one names.
26
26
  *
27
- * The words are white over a scrim, in both scenes and both modes, rather than the reference's text
28
- * colour running black to white with the scroll: a colour that changes with the photograph has to
29
- * be checked against every frame of the dissolve, and white over color.bg.overlay is legible over
30
- * any photograph at every frame, a pale one included.
27
+ * The words sit straight on the photographs, as the reference's do, with nothing laid between: each
28
+ * scene names its ink — near-black over a daylight photograph, white over a night one — and the
29
+ * scene carries it as `data-ink`, so the stylesheet sets it. Each scene's words fade as a whole, so
30
+ * the two inks are never drawn over each other; what the reference ran as one colour interpolating
31
+ * with the scroll is here two sets of words, each in its own ink, one giving way to the other.
31
32
  *
32
33
  * `'use client'` for `useId`, which names the region by its heading. There is no arrival: every
33
34
  * other block comes up on `useReveal`, and that arrival is an opacity of its own on the parts that
34
35
  * make it — on these words it would fight the scrub. The change-over is this block's entrance.
35
36
  */
36
- export declare function SceneScroll({ first, second, link, headingLevel, }: SceneScrollProps): import("react").JSX.Element | null;
37
+ export declare function SceneScroll({ first, second, action, headingLevel, }: SceneScrollProps): import("react").JSX.Element | null;
@@ -29,26 +29,27 @@ const under = { h1: 'h2', h2: 'h3' };
29
29
  * translate and keep in step. The second scene's title sits one level under it, as the second half
30
30
  * of the section the first one names.
31
31
  *
32
- * The words are white over a scrim, in both scenes and both modes, rather than the reference's text
33
- * colour running black to white with the scroll: a colour that changes with the photograph has to
34
- * be checked against every frame of the dissolve, and white over color.bg.overlay is legible over
35
- * any photograph at every frame, a pale one included.
32
+ * The words sit straight on the photographs, as the reference's do, with nothing laid between: each
33
+ * scene names its ink — near-black over a daylight photograph, white over a night one — and the
34
+ * scene carries it as `data-ink`, so the stylesheet sets it. Each scene's words fade as a whole, so
35
+ * the two inks are never drawn over each other; what the reference ran as one colour interpolating
36
+ * with the scroll is here two sets of words, each in its own ink, one giving way to the other.
36
37
  *
37
38
  * `'use client'` for `useId`, which names the region by its heading. There is no arrival: every
38
39
  * other block comes up on `useReveal`, and that arrival is an opacity of its own on the parts that
39
40
  * make it — on these words it would fight the scrub. The change-over is this block's entrance.
40
41
  */
41
- export function SceneScroll({ first, second, link, headingLevel = sceneScrollDefaults.headingLevel, }) {
42
+ export function SceneScroll({ first, second, action, headingLevel = sceneScrollDefaults.headingLevel, }) {
42
43
  const titleId = useId();
43
44
  // Both scenes are required, but a record from a feed or an editor is not typed: one that never
44
45
  // arrived draws nothing rather than taking the page down, and a section with half its change-over
45
46
  // missing is not the section, so neither scene is drawn alone.
46
47
  if (!first || !second)
47
48
  return null;
48
- return (_jsx("section", { className: sceneScrollParts.root, "data-heading-level": headingLevel, "aria-labelledby": titleId, children: _jsxs("div", { className: sceneScrollParts.stage, children: [_jsx(Scene, { which: "first", scene: first, level: headingLevel, titleId: titleId, eager: headingLevel === 'h1' }), _jsx(Scene, { which: "second", scene: second, level: under[headingLevel] }), link ? _jsx("div", { className: sceneScrollParts.link, children: link }) : null] }) }));
49
+ return (_jsx("section", { className: sceneScrollParts.root, "data-heading-level": headingLevel, "aria-labelledby": titleId, children: _jsxs("div", { className: sceneScrollParts.stage, children: [_jsx(Scene, { which: "first", scene: first, level: headingLevel, titleId: titleId, eager: headingLevel === 'h1' }), _jsx(Scene, { which: "second", scene: second, level: under[headingLevel] }), action ? _jsx("div", { className: sceneScrollParts.action, children: action }) : null] }) }));
49
50
  }
50
51
  function Scene({ which, scene, level, titleId, eager = false }) {
51
52
  const Title = level;
52
53
  const { image } = scene;
53
- return (_jsxs("div", { className: sceneScrollParts.scene, "data-scene": which, children: [_jsx("div", { className: sceneScrollParts.media, children: image ? (_jsx("img", { className: sceneScrollParts.image, src: image.src, alt: image.alt ?? '', width: image.width, height: image.height, loading: eager ? 'eager' : 'lazy', decoding: "async" })) : null }), _jsxs("div", { className: sceneScrollParts.content, children: [_jsx(Title, { className: sceneScrollParts.title, id: titleId, children: scene.title }), given(scene.description) ? _jsx("p", { className: sceneScrollParts.description, children: scene.description }) : null] })] }));
54
+ return (_jsxs("div", { className: sceneScrollParts.scene, "data-scene": which, "data-ink": scene.ink ?? 'light', children: [_jsx("div", { className: sceneScrollParts.media, children: image ? (_jsx("img", { className: sceneScrollParts.image, src: image.src, alt: image.alt ?? '', width: image.width, height: image.height, loading: eager ? 'eager' : 'lazy', decoding: "async" })) : null }), _jsxs("div", { className: sceneScrollParts.content, children: [_jsx(Title, { className: sceneScrollParts.title, id: titleId, children: scene.title }), given(scene.description) ? _jsx("p", { className: sceneScrollParts.description, children: scene.description }) : null] })] }));
54
55
  }
@@ -6,12 +6,12 @@ export interface SceneScrollOwnProps {
6
6
  * `h1` — The section opens a campaign page and the first scene's title is the page's heading — the reference design's hero use. Drawn at font.h1, the opening band's size
7
7
  */
8
8
  headingLevel?: 'h2' | 'h1';
9
- /** Always. The scene the section opens on: a title in a few words, a line under it where the title needs one, and the photograph filling the band behind them. Its title names the section, so it is the one to write as the section's heading. Give the photograph's width and height; `alt` empty unless it shows something the words do not. */
9
+ /** Always. The scene the section opens on: a title in a few words, a line under it where the title needs one, and the photograph filling the band behind them. Its title names the section, so it is the one to write as the section's heading. Give its `ink` — `dark` over a light photograph, `light` over a dark one — and the photograph's width and height; `alt` empty unless it shows something the words do not. */
10
10
  first: SceneScrollScene;
11
- /** Always. The scene the section changes over to, in the same shape as the first. A title of about the same length as the first, so the words change in place rather than jumping, and a photograph of the same composition where there is one, so the dissolve reads as one place changing rather than a cut. */
11
+ /** Always. The scene the section changes over to, in the same shape as the first. A title of about the same length as the first, so the words change in place rather than jumping, and a photograph of the same composition where there is one, so the dissolve reads as one place changing rather than a cut. Its `ink` is its own, so a daylight first scene in dark words can change over to a night one in white. */
12
12
  second: SceneScrollScene;
13
- /** A way on for the reader who wants more — "See trading hours", "Learn more". A standalone Link under the words, and it stays put through the change-over: it belongs to the section rather than to either scene, so it never fades while the reader is reaching for it. */
14
- link?: ReactNode;
13
+ /** One thing for the reader to do or a way on — "Trade now", "See trading hours" — under the words. It belongs to the section rather than to either scene, so it holds still through the change-over and never fades while the reader is reaching for it. A primary Button, or a standalone Link at its brand tone: either reads over both photographs, where a Link taking the ink around it would take the band's white over a light photograph. */
14
+ action?: ReactNode;
15
15
  }
16
16
  export type SceneScrollProps = SceneScrollOwnProps;
17
17
  /** The class each part carries. Apply these — do not retype them. */
@@ -24,7 +24,7 @@ export declare const sceneScrollParts: {
24
24
  readonly content: "dds-scenescroll__content";
25
25
  readonly title: "dds-scenescroll__title";
26
26
  readonly description: "dds-scenescroll__description";
27
- readonly link: "dds-scenescroll__link";
27
+ readonly action: "dds-scenescroll__action";
28
28
  };
29
29
  /** Generated so defaults cannot drift from the contract. */
30
30
  export declare const sceneScrollDefaults: {
@@ -9,7 +9,7 @@ export const sceneScrollParts = {
9
9
  content: 'dds-scenescroll__content',
10
10
  title: 'dds-scenescroll__title',
11
11
  description: 'dds-scenescroll__description',
12
- link: 'dds-scenescroll__link',
12
+ action: 'dds-scenescroll__action',
13
13
  };
14
14
  /** Generated so defaults cannot drift from the contract. */
15
15
  export const sceneScrollDefaults = { headingLevel: 'h2' };
@@ -50,23 +50,19 @@
50
50
  }
51
51
 
52
52
  /*
53
- * The scrim, the same over the whole scene.
53
+ * The words sit straight on the photograph, in the ink the scene names.
54
54
  *
55
- * color.bg.overlay is ImageBanner cover's scrim, held here across the whole photograph rather than
56
- * fading to clear: the words are centred over the scene from the fold and run its width on a phone,
57
- * so there is no clear side to leave. White over it keeps AA over any photograph, a pale one
58
- * included — a white photograph comes out a mid grey, which white words clear comfortably — so the
59
- * words never depend on the photograph being dark, and neither scene's words change colour.
55
+ * No scrim: the photograph is shown as it was taken, and the words are drawn in whichever ink it
56
+ * leaves room for — color.fg.on-media-light, near-black in both modes, over a light photograph such
57
+ * as a daylight sky, and the section's own color.fg.on-brand-strong, white, over a dark one. The
58
+ * photograph does not change with the theme, so neither ink does. The block cannot see the
59
+ * photograph, so the scene says which, and the author answers for the contrast.
60
60
  *
61
- * A pseudo-element of the photograph's frame, so it dissolves in with the second photograph rather
62
- * than being laid over the first a second time.
61
+ * On the scene, so its title and its line take it together, and inherited through the scene even
62
+ * where the scroll lays the scenes out as `display: contents`.
63
63
  */
64
- :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__media::after {
65
- background-color: var(--color-bg-overlay);
66
- content: '';
67
- inset: 0;
68
- pointer-events: none;
69
- position: absolute;
64
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__scene[data-ink="dark"] {
65
+ color: var(--color-fg-on-media-light);
70
66
  }
71
67
 
72
68
  /*
@@ -81,10 +77,11 @@
81
77
  *
82
78
  * Below 62rem — the reference's 992px, the same bound FeatureCards takes from it — the words are at
83
79
  * the top of the stage and start at the edge, under the room a navigation bar takes: size.bar-height
84
- * and the section's own step over it, about the reference's 112. From 62rem they are centred in
85
- * the stage, across and down — a centred title wraps to ragged lines whose edge the eye loses on a
86
- * narrow screen, which is the section-title rule's reason too. The group and its line are capped
87
- * narrower than the column, so `margin-inline: auto` centres those boxes as well as their words.
80
+ * and the section's own step over it, about the reference's 112. From 62rem they are centred down
81
+ * the stage and still start at the edge, in a column capped at the heading group's measure: the
82
+ * reference design's later arrangement, which leaves the far side of the photograph to its subject
83
+ * rather than writing over the middle of it. On either side of the bound the words start, so the
84
+ * eye finds the same edge on every line and a photograph composed for one width holds at the other.
88
85
  *
89
86
  * Longhand because `var()` is not permitted in a container query condition; `61.9375rem` is the last
90
87
  * width below that bound. The section declares the container, and these are rules on what is inside
@@ -97,16 +94,26 @@
97
94
  }
98
95
  }
99
96
 
100
- @container (min-width: 62rem) {
101
- :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__content {
102
- align-items: center;
103
- margin-inline: auto;
104
- text-align: center;
105
- }
106
97
 
107
- :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__description {
108
- margin-inline: auto;
109
- }
98
+ /*
99
+ * The words keep to the page's content column.
100
+ *
101
+ * They start, from 62rem as below it, so on a wide window they would otherwise sit at the page's
102
+ * gutter while every section around them starts at the edge of size.content.max. The photograph
103
+ * still fills the band edge to edge; only the words and the action are inset, by the page's gutter or
104
+ * by however much the window is wider than the content column on each side, whichever is more —
105
+ * where the column starts in ImageBanner, FeatureCards and the rest.
106
+ *
107
+ * Named once on the section, because three boxes take it: each scene and the action in the plain
108
+ * fallback, and the stage, which carries the insets while the scroll drives the change-over.
109
+ */
110
+ :where([data-dds-context="marketing"]) .dds-scenescroll {
111
+ --dds-scenescroll-column-inset: max(var(--space-inset-page), calc((100% - var(--size-content-max)) / 2));
112
+ }
113
+
114
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__scene,
115
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__action {
116
+ padding-inline: var(--dds-scenescroll-column-inset);
110
117
  }
111
118
 
112
119
  /*
@@ -129,7 +136,7 @@
129
136
  * The section names a view timeline, and three things run down it over `contain` — the stretch in
130
137
  * which the track covers the whole window, which is exactly the stretch the stage is pinned for:
131
138
  *
132
- * the second photograph, and its scrim with it, dissolves in from 20% to 80%;
139
+ * the second photograph dissolves in from 20% to 80%;
133
140
  * the first scene's words fade out from 20% to 45%;
134
141
  * the second scene's words fade in from 55% to 80%.
135
142
  *
@@ -200,39 +207,33 @@
200
207
  }
201
208
 
202
209
  /*
203
- * The link sits right under the words, whichever scene's words are showing.
210
+ * The action sits right under the words, whichever scene's words are showing.
204
211
  *
205
212
  * It belongs to the section rather than to a scene, so it does not fade with either. While the
206
213
  * scenes change over, both scenes' words are laid into one grid area of the stage — the scenes
207
214
  * themselves step out of the way (`display: contents`), so their photographs and their words become
208
- * the stage's own items — and that area is as tall as the taller of the two. The link is the row
215
+ * the stage's own items — and that area is as tall as the taller of the two. The action is the row
209
216
  * under it, at space.heading.description-actions, the step from words to what a reader can do: under
210
217
  * the text on every screen, and still while the text changes over it.
211
218
  *
212
- * Below 62rem the words and the link sit at the top of the stage, under the room a navigation bar
219
+ * Below 62rem the words and the action sit at the top of the stage, under the room a navigation bar
213
220
  * takes; from 62rem they are centred down the stage, the empty rows above and below sharing what is
214
- * left. The stage carries the section's insets here, since the scenes that held them are contents.
221
+ * left, and start at the edge with the words on both sides of the bound. The stage carries the section's insets here, since the scenes that held them are contents.
215
222
  *
216
- * In the plain fallback, where the scenes stack, the link is the stage's last row, under the second
223
+ * In the plain fallback, where the scenes stack, the action is the stage's last row, under the second
217
224
  * scene, on the band's own ground, with its own insets.
218
225
  */
219
- @container (min-width: 62rem) {
220
- :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__link {
221
- justify-content: center;
222
- }
223
- }
224
-
225
226
  @supports (animation-timeline: view()) {
226
227
  @media (prefers-reduced-motion: no-preference) {
227
228
  :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__stage {
228
229
  grid-template-areas:
229
230
  'words'
230
- 'link'
231
+ 'action'
231
232
  '.';
232
233
  grid-template-columns: minmax(0, 1fr);
233
234
  grid-template-rows: auto auto 1fr;
234
235
  padding-block: calc(var(--size-bar-height) + var(--space-section-default)) var(--space-section-default);
235
- padding-inline: var(--space-inset-page);
236
+ padding-inline: var(--dds-scenescroll-column-inset);
236
237
  }
237
238
 
238
239
  :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__scene {
@@ -249,8 +250,8 @@
249
250
  z-index: 1;
250
251
  }
251
252
 
252
- :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__link {
253
- grid-area: link;
253
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__action {
254
+ grid-area: action;
254
255
  margin-block-start: var(--space-heading-description-actions);
255
256
  padding: 0;
256
257
  z-index: 1;
@@ -265,7 +266,7 @@
265
266
  grid-template-areas:
266
267
  '.'
267
268
  'words'
268
- 'link'
269
+ 'action'
269
270
  '.';
270
271
  grid-template-rows: 1fr auto auto 1fr;
271
272
  padding-block: var(--space-section-default);
@@ -273,3 +274,19 @@
273
274
  }
274
275
  }
275
276
  }
277
+
278
+ /*
279
+ * From 62rem the words keep to half the stage.
280
+ *
281
+ * The words start at the edge and the photograph's subject is on the far side, but the heading
282
+ * group's measure alone is most of a laptop's width: a title in a few words ran three quarters of
283
+ * the way across and over the face it was meant to sit beside. Held to half the stage, or the
284
+ * heading group's measure where that is narrower, the title wraps in the words' own half and the
285
+ * other half is the subject's — the reference design's left column. Below 62rem the words run the
286
+ * width, at the top of a photograph whose subject is below them.
287
+ */
288
+ @container (min-width: 62rem) {
289
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__content {
290
+ max-inline-size: min(var(--size-heading-group-max), 50%);
291
+ }
292
+ }
@@ -0,0 +1,105 @@
1
+ /* GENERATED from scenescrollword.contract.json. Do not edit. */
2
+
3
+ :where([data-dds-context="marketing"]) .dds-scenescrollword {
4
+ box-sizing: border-box;
5
+ container-type: inline-size;
6
+ display: block;
7
+ inline-size: 100%;
8
+ overflow-wrap: anywhere;
9
+ background-color: var(--color-bg-brand-strong);
10
+ color: var(--color-fg-on-brand-strong);
11
+ }
12
+
13
+ :where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__stage {
14
+ box-sizing: border-box;
15
+ display: grid;
16
+ inline-size: 100%;
17
+ min-inline-size: 0;
18
+ row-gap: var(--space-gap-none);
19
+ }
20
+
21
+ :where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__scene {
22
+ box-sizing: border-box;
23
+ display: flex;
24
+ flex-direction: column;
25
+ isolation: isolate;
26
+ justify-content: center;
27
+ min-inline-size: 0;
28
+ position: relative;
29
+ padding-block: var(--space-section-default);
30
+ padding-inline: var(--space-inset-page);
31
+ }
32
+
33
+ :where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__media {
34
+ overflow: clip;
35
+ position: absolute;
36
+ border-radius: var(--radius-none);
37
+ }
38
+
39
+ :where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__image {
40
+ display: block;
41
+ object-fit: cover;
42
+ border-radius: var(--radius-none);
43
+ }
44
+
45
+ :where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__content {
46
+ box-sizing: border-box;
47
+ display: flex;
48
+ flex-direction: column;
49
+ min-inline-size: 0;
50
+ position: relative;
51
+ max-inline-size: var(--size-heading-group-max);
52
+ row-gap: var(--space-gap-none);
53
+ }
54
+
55
+ :where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__title {
56
+ margin-block: 0;
57
+ text-wrap: balance;
58
+ margin-block-end: var(--space-heading-title-description);
59
+ }
60
+
61
+ :where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__before {
62
+ display: inline;
63
+ }
64
+
65
+ :where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__word {
66
+ display: inline-grid;
67
+ }
68
+
69
+ :where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__after {
70
+ display: inline;
71
+ }
72
+
73
+ :where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__description {
74
+ margin-block: 0;
75
+ font-family: var(--font-body-lg-family);
76
+ font-size: var(--font-body-lg-size);
77
+ font-weight: var(--font-body-lg-weight);
78
+ letter-spacing: var(--font-body-lg-letter-spacing);
79
+ line-height: var(--font-body-lg-line-height);
80
+ max-inline-size: var(--size-measure-description);
81
+ }
82
+
83
+ :where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__action {
84
+ display: flex;
85
+ position: relative;
86
+ padding-block-end: var(--space-section-default);
87
+ padding-inline: var(--space-inset-page);
88
+ }
89
+
90
+ :where([data-dds-context="marketing"]) .dds-scenescrollword[data-heading-level="h1"] .dds-scenescrollword__title {
91
+ font-family: var(--font-h1-family);
92
+ font-size: var(--font-h1-size);
93
+ font-weight: var(--font-h1-weight);
94
+ letter-spacing: var(--font-h1-letter-spacing);
95
+ line-height: var(--font-h1-line-height);
96
+ }
97
+
98
+ :where([data-dds-context="marketing"]) .dds-scenescrollword[data-heading-level="h2"] .dds-scenescrollword__title {
99
+ font-family: var(--font-h2-family);
100
+ font-size: var(--font-h2-size);
101
+ font-weight: var(--font-h2-weight);
102
+ letter-spacing: var(--font-h2-letter-spacing);
103
+ line-height: var(--font-h2-line-height);
104
+ }
105
+
@@ -0,0 +1,31 @@
1
+ import './SceneScrollWord.css';
2
+ import './scene-scroll-word-impl.css';
3
+ import { type SceneScrollWordProps } from './SceneScrollWord.types.js';
4
+ export type { SceneScrollWordProps };
5
+ /**
6
+ * SceneScroll's change-over told as one claim with one word changed — "Trade all day", then
7
+ * "Trade all night": the reference design's inline day-and-night headline, made generic.
8
+ *
9
+ * The same track, pin and view timeline as SceneScroll, and nothing here runs a script. Each scene
10
+ * draws its whole heading — the shared words and its own word — so the outline, a screen reader and
11
+ * the stacked fallback all read "Trade all day" then "Trade all night". The stylesheet lays the
12
+ * second heading exactly over the first, keeps the second's shared words undrawn, and changes the
13
+ * words over alone.
14
+ *
15
+ * The changing word falls where the language puts it, so the shared words come as what is before it
16
+ * and what is after it, either or both, and nothing here adds a space: Japanese has none to add, and
17
+ * a language that has them writes them into the strings.
18
+ *
19
+ * Each word sits in a slot holding the other scene's word too, undrawn: the slot is as wide as the
20
+ * wider of the two, so both titles wrap alike and the second's word lands exactly where the first's
21
+ * was. That duplicate is the one thing kept from assistive technology, since the heading it belongs
22
+ * to is read in full.
23
+ *
24
+ * The words sit straight on the photographs in the ink each scene names, as SceneScroll's do. Where
25
+ * the two inks differ the shared words cross over with the word, so the claim changes colour as one
26
+ * piece; the section says so as `data-ink-change`.
27
+ *
28
+ * `'use client'` for `useId`, which names the region by its heading. There is no arrival, for
29
+ * SceneScroll's reason: the change-over is this block's entrance.
30
+ */
31
+ export declare function SceneScrollWord({ titleBefore, titleAfter, first, second, action, headingLevel, }: SceneScrollWordProps): import("react").JSX.Element | null;
@@ -0,0 +1,67 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useId } from 'react';
4
+ import './SceneScrollWord.css';
5
+ import './scene-scroll-word-impl.css';
6
+ import { given } from '../../given.js';
7
+ import { sceneScrollWordDefaults, sceneScrollWordParts, } from './SceneScrollWord.types.js';
8
+ /**
9
+ * The spaces an author wrote at either edge of the shared words, set apart from them.
10
+ *
11
+ * Written into the strings rather than added here, because a language without spaces between words
12
+ * has none to add — but drawn between the parts rather than inside them. An accessible name is put
13
+ * together from each element's text with its edges trimmed, so "Trade all " in a span beside "day"
14
+ * was announced "Trade allday"; as text between the two it is the space it was written as.
15
+ */
16
+ function edge(text) {
17
+ const start = /^\s*/.exec(text)[0];
18
+ const end = /\s*$/.exec(text)[0];
19
+ return { start, end, words: text.slice(start.length, text.length - end.length) };
20
+ }
21
+ /** The level under the first scene's, for the second scene's title. */
22
+ const under = { h1: 'h2', h2: 'h3' };
23
+ /**
24
+ * SceneScroll's change-over told as one claim with one word changed — "Trade all day", then
25
+ * "Trade all night": the reference design's inline day-and-night headline, made generic.
26
+ *
27
+ * The same track, pin and view timeline as SceneScroll, and nothing here runs a script. Each scene
28
+ * draws its whole heading — the shared words and its own word — so the outline, a screen reader and
29
+ * the stacked fallback all read "Trade all day" then "Trade all night". The stylesheet lays the
30
+ * second heading exactly over the first, keeps the second's shared words undrawn, and changes the
31
+ * words over alone.
32
+ *
33
+ * The changing word falls where the language puts it, so the shared words come as what is before it
34
+ * and what is after it, either or both, and nothing here adds a space: Japanese has none to add, and
35
+ * a language that has them writes them into the strings.
36
+ *
37
+ * Each word sits in a slot holding the other scene's word too, undrawn: the slot is as wide as the
38
+ * wider of the two, so both titles wrap alike and the second's word lands exactly where the first's
39
+ * was. That duplicate is the one thing kept from assistive technology, since the heading it belongs
40
+ * to is read in full.
41
+ *
42
+ * The words sit straight on the photographs in the ink each scene names, as SceneScroll's do. Where
43
+ * the two inks differ the shared words cross over with the word, so the claim changes colour as one
44
+ * piece; the section says so as `data-ink-change`.
45
+ *
46
+ * `'use client'` for `useId`, which names the region by its heading. There is no arrival, for
47
+ * SceneScroll's reason: the change-over is this block's entrance.
48
+ */
49
+ export function SceneScrollWord({ titleBefore, titleAfter, first, second, action, headingLevel = sceneScrollWordDefaults.headingLevel, }) {
50
+ const titleId = useId();
51
+ // Both scenes are required, but a record from a feed or an editor is not typed: one that never
52
+ // arrived draws nothing rather than taking the page down, and a change-over missing a scene is not
53
+ // the section. Shared words missing on both sides still leave each scene a heading — its word —
54
+ // so that is drawn rather than the section vanishing over copy still being written.
55
+ if (!first || !second)
56
+ return null;
57
+ const before = given(titleBefore) ? titleBefore : undefined;
58
+ const after = given(titleAfter) ? titleAfter : undefined;
59
+ return (_jsx("section", { className: sceneScrollWordParts.root, "data-heading-level": headingLevel, "data-ink-change": (first.ink ?? 'light') === (second.ink ?? 'light') ? undefined : '', "aria-labelledby": titleId, children: _jsxs("div", { className: sceneScrollWordParts.stage, children: [_jsx(Scene, { which: "first", scene: first, other: second.word, before: before, after: after, level: headingLevel, titleId: titleId, eager: headingLevel === 'h1' }), _jsx(Scene, { which: "second", scene: second, other: first.word, before: before, after: after, level: under[headingLevel] }), action ? _jsx("div", { className: sceneScrollWordParts.action, children: action }) : null] }) }));
60
+ }
61
+ function Scene({ which, scene, other, before, after, level, titleId, eager = false }) {
62
+ const Title = level;
63
+ const { image } = scene;
64
+ const lead = before !== undefined ? edge(before) : undefined;
65
+ const tail = after !== undefined ? edge(after) : undefined;
66
+ return (_jsxs("div", { className: sceneScrollWordParts.scene, "data-scene": which, "data-ink": scene.ink ?? 'light', children: [_jsx("div", { className: sceneScrollWordParts.media, children: image ? (_jsx("img", { className: sceneScrollWordParts.image, src: image.src, alt: image.alt ?? '', width: image.width, height: image.height, loading: eager ? 'eager' : 'lazy', decoding: "async" })) : null }), _jsxs("div", { className: sceneScrollWordParts.content, children: [_jsxs(Title, { className: sceneScrollWordParts.title, id: titleId, children: [lead !== undefined ? (_jsxs(_Fragment, { children: [_jsx("span", { className: sceneScrollWordParts.before, children: lead.words }), lead.end] })) : null, _jsxs("span", { className: sceneScrollWordParts.word, children: [_jsx("span", { "data-word": "own", children: scene.word }), _jsx("span", { "data-word": "other", "aria-hidden": "true", children: other })] }), tail !== undefined ? (_jsxs(_Fragment, { children: [tail.start, _jsx("span", { className: sceneScrollWordParts.after, children: tail.words })] })) : null] }), given(scene.description) ? _jsx("p", { className: sceneScrollWordParts.description, children: scene.description }) : null] })] }));
67
+ }
@@ -0,0 +1,39 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { SceneScrollWordScene } from '../../scene-scroll-data.js';
3
+ export interface SceneScrollWordOwnProps {
4
+ /**
5
+ * `h2` — The default: the section sits under the page's own h1, and the scenes' titles are drawn at font.h2
6
+ * `h1` — The section opens a campaign page and the first scene's title is the page's heading — the reference design's hero use. Drawn at font.h1, the opening band's size
7
+ */
8
+ headingLevel?: 'h2' | 'h1';
9
+ /** The words of the title that come before the changing word, the same in both scenes — "Trade all ", for "Trade all day" and "Trade all night". With the space that separates them from the word written in, where the language uses one: the block adds none. Give this, `titleAfter`, or both; a title with neither is SceneScroll's. */
10
+ titleBefore?: string;
11
+ /** The words of the title that come after the changing word, the same in both scenes — " handeln", for German "Den ganzen Tag handeln" and "Die ganze Nacht handeln"; "取引" for Japanese "一日中取引" and "夜通し取引", with no space. With the space written in where the language uses one: the block adds none. */
12
+ titleAfter?: string;
13
+ /** Always. The scene the section opens on: the word that completes the title, a line under it where the title needs one, and the photograph filling the band behind them. With the shared words around it, it names the section. Give its `ink` — `dark` over a light photograph, `light` over a dark one — and the photograph's width and height; `alt` empty unless it shows something the words do not. */
14
+ first: SceneScrollWordScene;
15
+ /** Always. The scene the section changes over to, in the same shape as the first. A word of about the same length as the first, so the words after it do not move as one replaces the other, and a photograph of the same composition where there is one, so the dissolve reads as one place changing rather than a cut. Its `ink` is its own, so a daylight first scene in dark words can change over to a night one in white. */
16
+ second: SceneScrollWordScene;
17
+ /** One thing for the reader to do or a way on — "Trade now", "See trading hours" — under the words. It belongs to the section rather than to either scene, so it holds still through the change-over and never fades while the reader is reaching for it. A primary Button, or a standalone Link at its brand tone: either reads over both photographs, where a Link taking the ink around it would take the band's white over a light photograph. */
18
+ action?: ReactNode;
19
+ }
20
+ export type SceneScrollWordProps = SceneScrollWordOwnProps;
21
+ /** The class each part carries. Apply these — do not retype them. */
22
+ export declare const sceneScrollWordParts: {
23
+ readonly root: "dds-scenescrollword";
24
+ readonly stage: "dds-scenescrollword__stage";
25
+ readonly scene: "dds-scenescrollword__scene";
26
+ readonly media: "dds-scenescrollword__media";
27
+ readonly image: "dds-scenescrollword__image";
28
+ readonly content: "dds-scenescrollword__content";
29
+ readonly title: "dds-scenescrollword__title";
30
+ readonly before: "dds-scenescrollword__before";
31
+ readonly word: "dds-scenescrollword__word";
32
+ readonly after: "dds-scenescrollword__after";
33
+ readonly description: "dds-scenescrollword__description";
34
+ readonly action: "dds-scenescrollword__action";
35
+ };
36
+ /** Generated so defaults cannot drift from the contract. */
37
+ export declare const sceneScrollWordDefaults: {
38
+ readonly headingLevel: "h2";
39
+ };
@@ -0,0 +1,18 @@
1
+ // GENERATED from scene-scroll-word.contract.json. Do not edit.
2
+ /** The class each part carries. Apply these — do not retype them. */
3
+ export const sceneScrollWordParts = {
4
+ root: 'dds-scenescrollword',
5
+ stage: 'dds-scenescrollword__stage',
6
+ scene: 'dds-scenescrollword__scene',
7
+ media: 'dds-scenescrollword__media',
8
+ image: 'dds-scenescrollword__image',
9
+ content: 'dds-scenescrollword__content',
10
+ title: 'dds-scenescrollword__title',
11
+ before: 'dds-scenescrollword__before',
12
+ word: 'dds-scenescrollword__word',
13
+ after: 'dds-scenescrollword__after',
14
+ description: 'dds-scenescrollword__description',
15
+ action: 'dds-scenescrollword__action',
16
+ };
17
+ /** Generated so defaults cannot drift from the contract. */
18
+ export const sceneScrollWordDefaults = { headingLevel: 'h2' };