@deriv-com/dds-marketing 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/.llm/components/awards.md +209 -0
  2. package/.llm/components/background.md +89 -40
  3. package/.llm/components/bottomsheet.md +5 -0
  4. package/.llm/components/comparisoncards.md +257 -0
  5. package/.llm/components/comparisontable.md +231 -0
  6. package/.llm/components/ctabanner.md +9 -12
  7. package/.llm/components/ctabannerslider.md +15 -2
  8. package/.llm/components/datatable.md +273 -0
  9. package/.llm/components/downloadbanner.md +283 -0
  10. package/.llm/components/featurecards.md +41 -3
  11. package/.llm/components/featurecardscarousel.md +311 -0
  12. package/.llm/components/featuresplit.md +5 -0
  13. package/.llm/components/featurestack.md +227 -0
  14. package/.llm/components/illustrationcard.md +2 -2
  15. package/.llm/components/illustrationscene.md +6 -10
  16. package/.llm/components/imagebanner.md +278 -0
  17. package/.llm/components/navbar.md +1 -1
  18. package/.llm/components/navbaritem.md +4 -0
  19. package/.llm/components/pageheader.md +4 -3
  20. package/.llm/components/paginationdots.md +6 -1
  21. package/.llm/components/producthero.md +35 -11
  22. package/.llm/components/resourcebanner.md +247 -0
  23. package/.llm/components/scenescroll.md +222 -0
  24. package/.llm/components/select.md +17 -0
  25. package/.llm/components/stats.md +219 -0
  26. package/.llm/components/steps.md +286 -0
  27. package/.llm/components/stickycards.md +251 -0
  28. package/.llm/components/tableheadercell.md +19 -0
  29. package/.llm/components/teamgrid.md +243 -0
  30. package/.llm/components/testimonialrow.md +5 -0
  31. package/.llm/components/testimonialslider.md +14 -1
  32. package/.llm/components/textarea.md +13 -0
  33. package/.llm/components/textinput.md +13 -0
  34. package/.llm/components/textscroll.md +187 -0
  35. package/.llm/components/tiers.md +227 -0
  36. package/.llm/digest/awards.md +45 -0
  37. package/.llm/digest/background.md +11 -10
  38. package/.llm/digest/bottomsheet.md +2 -0
  39. package/.llm/digest/comparisoncards.md +51 -0
  40. package/.llm/digest/comparisontable.md +53 -0
  41. package/.llm/digest/ctabanner.md +4 -4
  42. package/.llm/digest/ctabannerslider.md +4 -0
  43. package/.llm/digest/datatable.md +65 -0
  44. package/.llm/digest/downloadbanner.md +65 -0
  45. package/.llm/digest/featurecards.md +1 -1
  46. package/.llm/digest/featurecardscarousel.md +54 -0
  47. package/.llm/digest/featuresplit.md +1 -0
  48. package/.llm/digest/featurestack.md +48 -0
  49. package/.llm/digest/illustrationscene.md +2 -3
  50. package/.llm/digest/imagebanner.md +64 -0
  51. package/.llm/digest/navbaritem.md +1 -0
  52. package/.llm/digest/pageheader.md +2 -1
  53. package/.llm/digest/paginationdots.md +3 -1
  54. package/.llm/digest/producthero.md +4 -2
  55. package/.llm/digest/resourcebanner.md +53 -0
  56. package/.llm/digest/scenescroll.md +49 -0
  57. package/.llm/digest/select.md +5 -0
  58. package/.llm/digest/stats.md +46 -0
  59. package/.llm/digest/steps.md +55 -0
  60. package/.llm/digest/stickycards.md +52 -0
  61. package/.llm/digest/tableheadercell.md +4 -0
  62. package/.llm/digest/teamgrid.md +53 -0
  63. package/.llm/digest/testimonialrow.md +2 -0
  64. package/.llm/digest/testimonialslider.md +4 -0
  65. package/.llm/digest/textarea.md +4 -0
  66. package/.llm/digest/textinput.md +4 -0
  67. package/.llm/digest/textscroll.md +43 -0
  68. package/.llm/digest/tiers.md +50 -0
  69. package/.llm/index.md +19 -3
  70. package/.llm/tokens.md +26 -1
  71. package/AGENTS.md +17 -1
  72. package/dist/components/awards-data.d.ts +24 -0
  73. package/dist/components/awards-data.js +11 -0
  74. package/dist/components/block-image-data.d.ts +24 -0
  75. package/dist/components/block-image-data.js +9 -0
  76. package/dist/components/blocks/awards/Awards.css +134 -0
  77. package/dist/components/blocks/awards/Awards.d.ts +24 -0
  78. package/dist/components/blocks/awards/Awards.js +114 -0
  79. package/dist/components/blocks/awards/Awards.types.d.ts +31 -0
  80. package/dist/components/blocks/awards/Awards.types.js +16 -0
  81. package/dist/components/blocks/awards/awards-impl.css +222 -0
  82. package/dist/components/blocks/cards-of.d.ts +16 -0
  83. package/dist/components/blocks/cards-of.js +23 -0
  84. package/dist/components/blocks/comparison-cards/ComparisonCards.css +195 -0
  85. package/dist/components/blocks/comparison-cards/ComparisonCards.d.ts +24 -0
  86. package/dist/components/blocks/comparison-cards/ComparisonCards.js +75 -0
  87. package/dist/components/blocks/comparison-cards/ComparisonCards.types.d.ts +49 -0
  88. package/dist/components/blocks/comparison-cards/ComparisonCards.types.js +26 -0
  89. package/dist/components/blocks/comparison-cards/comparison-cards-impl.css +262 -0
  90. package/dist/components/blocks/comparison-table/ComparisonTable.css +111 -0
  91. package/dist/components/blocks/comparison-table/ComparisonTable.d.ts +25 -0
  92. package/dist/components/blocks/comparison-table/ComparisonTable.js +100 -0
  93. package/dist/components/blocks/comparison-table/ComparisonTable.types.d.ts +36 -0
  94. package/dist/components/blocks/comparison-table/ComparisonTable.types.js +15 -0
  95. package/dist/components/blocks/comparison-table/comparison-table-impl.css +143 -0
  96. package/dist/components/blocks/cta-banner/CtaBanner.css +1 -0
  97. package/dist/components/blocks/cta-banner/CtaBanner.js +2 -2
  98. package/dist/components/blocks/cta-banner/CtaBanner.types.d.ts +4 -3
  99. package/dist/components/blocks/cta-banner/CtaBanner.types.js +1 -1
  100. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.css +1 -0
  101. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.d.ts +1 -1
  102. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.js +6 -2
  103. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.d.ts +8 -0
  104. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.js +1 -1
  105. package/dist/components/blocks/data-table/DataTable.css +170 -0
  106. package/dist/components/blocks/data-table/DataTable.d.ts +29 -0
  107. package/dist/components/blocks/data-table/DataTable.js +84 -0
  108. package/dist/components/blocks/data-table/DataTable.types.d.ts +69 -0
  109. package/dist/components/blocks/data-table/DataTable.types.js +19 -0
  110. package/dist/components/blocks/data-table/data-table-impl.css +155 -0
  111. package/dist/components/blocks/download-banner/DownloadBanner.css +228 -0
  112. package/dist/components/blocks/download-banner/DownloadBanner.d.ts +28 -0
  113. package/dist/components/blocks/download-banner/DownloadBanner.js +75 -0
  114. package/dist/components/blocks/download-banner/DownloadBanner.types.d.ts +56 -0
  115. package/dist/components/blocks/download-banner/DownloadBanner.types.js +23 -0
  116. package/dist/components/blocks/download-banner/download-banner-impl.css +216 -0
  117. package/dist/components/blocks/faq-accordion/FaqAccordion.css +1 -0
  118. package/dist/components/blocks/faq-accordion/faq-accordion-impl.css +3 -7
  119. package/dist/components/blocks/feature-bullets/FeatureBullets.css +1 -0
  120. package/dist/components/blocks/feature-bullets/feature-bullets-impl.css +14 -1
  121. package/dist/components/blocks/feature-cards/FeatureCards.css +1 -0
  122. package/dist/components/blocks/feature-cards/FeatureCards.d.ts +2 -1
  123. package/dist/components/blocks/feature-cards/FeatureCards.js +4 -21
  124. package/dist/components/blocks/feature-cards/feature-cards-impl.css +10 -9
  125. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.css +115 -0
  126. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.d.ts +30 -0
  127. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.js +160 -0
  128. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.d.ts +52 -0
  129. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.js +17 -0
  130. package/dist/components/blocks/feature-cards-carousel/feature-cards-carousel-impl.css +207 -0
  131. package/dist/components/blocks/feature-scroll/FeatureScroll.css +1 -0
  132. package/dist/components/blocks/feature-split/FeatureSplit.css +1 -0
  133. package/dist/components/blocks/feature-split/feature-split-impl.css +14 -1
  134. package/dist/components/blocks/feature-stack/FeatureStack.css +86 -0
  135. package/dist/components/blocks/feature-stack/FeatureStack.d.ts +19 -0
  136. package/dist/components/blocks/feature-stack/FeatureStack.js +27 -0
  137. package/dist/components/blocks/feature-stack/FeatureStack.types.d.ts +34 -0
  138. package/dist/components/blocks/feature-stack/FeatureStack.types.js +14 -0
  139. package/dist/components/blocks/feature-stack/feature-stack-impl.css +87 -0
  140. package/dist/components/blocks/image-banner/ImageBanner.css +133 -0
  141. package/dist/components/blocks/image-banner/ImageBanner.d.ts +32 -0
  142. package/dist/components/blocks/image-banner/ImageBanner.js +41 -0
  143. package/dist/components/blocks/image-banner/ImageBanner.types.d.ts +54 -0
  144. package/dist/components/blocks/image-banner/ImageBanner.types.js +14 -0
  145. package/dist/components/blocks/image-banner/image-banner-impl.css +281 -0
  146. package/dist/components/blocks/landing-hero/LandingHero.css +1 -0
  147. package/dist/components/blocks/logo-columns/LogoColumns.css +1 -0
  148. package/dist/components/blocks/logo-rows/LogoRows.css +1 -0
  149. package/dist/components/blocks/page-header/PageHeader.css +1 -0
  150. package/dist/components/blocks/page-header/PageHeader.js +2 -2
  151. package/dist/components/blocks/page-header/PageHeader.types.d.ts +4 -2
  152. package/dist/components/blocks/page-header/PageHeader.types.js +1 -1
  153. package/dist/components/blocks/page-header/page-header-impl.css +5 -3
  154. package/dist/components/blocks/product-hero/ProductHero.css +8 -3
  155. package/dist/components/blocks/product-hero/ProductHero.d.ts +1 -1
  156. package/dist/components/blocks/product-hero/ProductHero.js +5 -2
  157. package/dist/components/blocks/product-hero/ProductHero.types.d.ts +5 -1
  158. package/dist/components/blocks/product-hero/ProductHero.types.js +1 -0
  159. package/dist/components/blocks/product-hero/product-hero-impl.css +43 -12
  160. package/dist/components/blocks/resource-banner/ResourceBanner.css +106 -0
  161. package/dist/components/blocks/resource-banner/ResourceBanner.d.ts +32 -0
  162. package/dist/components/blocks/resource-banner/ResourceBanner.js +51 -0
  163. package/dist/components/blocks/resource-banner/ResourceBanner.types.d.ts +44 -0
  164. package/dist/components/blocks/resource-banner/ResourceBanner.types.js +14 -0
  165. package/dist/components/blocks/resource-banner/resource-banner-impl.css +69 -0
  166. package/dist/components/blocks/scene-scroll/SceneScroll.css +93 -0
  167. package/dist/components/blocks/scene-scroll/SceneScroll.d.ts +36 -0
  168. package/dist/components/blocks/scene-scroll/SceneScroll.js +54 -0
  169. package/dist/components/blocks/scene-scroll/SceneScroll.types.d.ts +32 -0
  170. package/dist/components/blocks/scene-scroll/SceneScroll.types.js +15 -0
  171. package/dist/components/blocks/scene-scroll/scene-scroll-impl.css +275 -0
  172. package/dist/components/blocks/stats/Stats.css +139 -0
  173. package/dist/components/blocks/stats/Stats.d.ts +24 -0
  174. package/dist/components/blocks/stats/Stats.js +120 -0
  175. package/dist/components/blocks/stats/Stats.types.d.ts +36 -0
  176. package/dist/components/blocks/stats/Stats.types.js +19 -0
  177. package/dist/components/blocks/stats/stats-count.d.ts +34 -0
  178. package/dist/components/blocks/stats/stats-count.js +61 -0
  179. package/dist/components/blocks/stats/stats-impl.css +284 -0
  180. package/dist/components/blocks/stats/use-wheel.d.ts +37 -0
  181. package/dist/components/blocks/stats/use-wheel.js +126 -0
  182. package/dist/components/blocks/steps/Steps.css +202 -0
  183. package/dist/components/blocks/steps/Steps.d.ts +32 -0
  184. package/dist/components/blocks/steps/Steps.js +65 -0
  185. package/dist/components/blocks/steps/Steps.types.d.ts +48 -0
  186. package/dist/components/blocks/steps/Steps.types.js +21 -0
  187. package/dist/components/blocks/steps/steps-impl.css +216 -0
  188. package/dist/components/blocks/steps/use-turn.d.ts +33 -0
  189. package/dist/components/blocks/steps/use-turn.js +75 -0
  190. package/dist/components/blocks/sticky-cards/StickyCards.css +154 -0
  191. package/dist/components/blocks/sticky-cards/StickyCards.d.ts +35 -0
  192. package/dist/components/blocks/sticky-cards/StickyCards.js +153 -0
  193. package/dist/components/blocks/sticky-cards/StickyCards.types.d.ts +43 -0
  194. package/dist/components/blocks/sticky-cards/StickyCards.types.js +18 -0
  195. package/dist/components/blocks/sticky-cards/sticky-cards-impl.css +393 -0
  196. package/dist/components/blocks/team-grid/TeamGrid.css +159 -0
  197. package/dist/components/blocks/team-grid/TeamGrid.d.ts +28 -0
  198. package/dist/components/blocks/team-grid/TeamGrid.js +74 -0
  199. package/dist/components/blocks/team-grid/TeamGrid.types.d.ts +51 -0
  200. package/dist/components/blocks/team-grid/TeamGrid.types.js +20 -0
  201. package/dist/components/blocks/team-grid/team-grid-impl.css +129 -0
  202. package/dist/components/blocks/testimonial-row/TestimonialRow.css +1 -0
  203. package/dist/components/blocks/testimonial-row/TestimonialRow.d.ts +1 -1
  204. package/dist/components/blocks/testimonial-row/TestimonialRow.js +4 -3
  205. package/dist/components/blocks/testimonial-row/TestimonialRow.types.d.ts +3 -0
  206. package/dist/components/blocks/testimonial-row/TestimonialRow.types.js +1 -1
  207. package/dist/components/blocks/testimonial-row/testimonial-row-impl.css +8 -0
  208. package/dist/components/blocks/testimonial-slider/TestimonialSlider.css +1 -0
  209. package/dist/components/blocks/testimonial-slider/TestimonialSlider.d.ts +1 -1
  210. package/dist/components/blocks/testimonial-slider/TestimonialSlider.js +2 -2
  211. package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.d.ts +8 -0
  212. package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.js +1 -1
  213. package/dist/components/blocks/text-scroll/TextScroll.css +53 -0
  214. package/dist/components/blocks/text-scroll/TextScroll.d.ts +5 -0
  215. package/dist/components/blocks/text-scroll/TextScroll.js +71 -0
  216. package/dist/components/blocks/text-scroll/TextScroll.types.d.ts +22 -0
  217. package/dist/components/blocks/text-scroll/TextScroll.types.js +10 -0
  218. package/dist/components/blocks/text-scroll/text-scroll-impl.css +115 -0
  219. package/dist/components/blocks/tiers/Tiers.css +233 -0
  220. package/dist/components/blocks/tiers/Tiers.d.ts +32 -0
  221. package/dist/components/blocks/tiers/Tiers.js +68 -0
  222. package/dist/components/blocks/tiers/Tiers.types.d.ts +45 -0
  223. package/dist/components/blocks/tiers/Tiers.types.js +25 -0
  224. package/dist/components/blocks/tiers/tiers-impl.css +185 -0
  225. package/dist/components/blocks/use-rotation.d.ts +12 -2
  226. package/dist/components/blocks/use-rotation.js +6 -28
  227. package/dist/components/comparison-cards-data.d.ts +59 -0
  228. package/dist/components/comparison-cards-data.js +12 -0
  229. package/dist/components/comparison-table-data.d.ts +39 -0
  230. package/dist/components/comparison-table-data.js +11 -0
  231. package/dist/components/core/accordion-item/AccordionItem.css +1 -5
  232. package/dist/components/core/background/Background.css +23 -0
  233. package/dist/components/core/background/Background.d.ts +10 -4
  234. package/dist/components/core/background/Background.js +16 -7
  235. package/dist/components/core/background/Background.types.d.ts +11 -8
  236. package/dist/components/core/background/Background.types.js +3 -1
  237. package/dist/components/core/background/background-impl.css +334 -1
  238. package/dist/components/core/background/halftone.d.ts +11 -0
  239. package/dist/components/core/background/halftone.js +43 -3
  240. package/dist/components/core/background/patterns.d.ts +66 -0
  241. package/dist/components/core/background/patterns.js +244 -0
  242. package/dist/components/core/background/shader.d.ts +44 -0
  243. package/dist/components/core/background/shader.js +307 -0
  244. package/dist/components/core/background/use-shader.d.ts +11 -0
  245. package/dist/components/core/background/use-shader.js +25 -0
  246. package/dist/components/core/background/use-spotlight.d.ts +2 -1
  247. package/dist/components/core/background/use-spotlight.js +9 -1
  248. package/dist/components/core/bottom-sheet/BottomSheet.js +2 -2
  249. package/dist/components/core/bottom-sheet/BottomSheet.types.d.ts +3 -1
  250. package/dist/components/core/breadcrumb/Breadcrumb.d.ts +1 -0
  251. package/dist/components/core/breadcrumb/Breadcrumb.js +1 -0
  252. package/dist/components/core/breadcrumb/breadcrumb-impl.css +11 -0
  253. package/dist/components/core/button/button-impl.css +14 -1
  254. package/dist/components/core/illustration-card/IllustrationCard.js +1 -1
  255. package/dist/components/core/illustration-card/illustration-card-impl.css +20 -0
  256. package/dist/components/core/illustration-scene/IllustrationScene.css +4 -7
  257. package/dist/components/core/illustration-scene/IllustrationScene.types.d.ts +2 -3
  258. package/dist/components/core/illustration-scene/illustration-scene-impl.css +7 -1
  259. package/dist/components/core/link/Link.js +7 -3
  260. package/dist/components/core/link/link-impl.css +29 -2
  261. package/dist/components/core/navbar/Navbar.css +2 -2
  262. package/dist/components/core/navbar/Navbar.types.d.ts +1 -1
  263. package/dist/components/core/navbar-item/NavbarItem.d.ts +2 -1
  264. package/dist/components/core/navbar-item/NavbarItem.js +3 -10
  265. package/dist/components/core/navbar-item/NavbarItem.types.d.ts +4 -1
  266. package/dist/components/core/navbar-item/NavbarItem.types.js +1 -1
  267. package/dist/components/core/navbar-item/navbar-item-impl.css +10 -0
  268. package/dist/components/core/navbar-menu/navbar-menu-impl.css +9 -0
  269. package/dist/components/core/navbar-switcher/navbar-switcher-impl.css +19 -0
  270. package/dist/components/core/pagination/Pagination.js +1 -1
  271. package/dist/components/core/pagination/pagination-impl.css +9 -0
  272. package/dist/components/core/pagination-dots/PaginationDots.d.ts +1 -1
  273. package/dist/components/core/pagination-dots/PaginationDots.js +3 -3
  274. package/dist/components/core/pagination-dots/PaginationDots.types.d.ts +3 -1
  275. package/dist/components/core/segmented-control/SegmentedControl.css +4 -3
  276. package/dist/components/core/segmented-control/SegmentedControl.js +17 -3
  277. package/dist/components/core/segmented-control-item/SegmentedControlItem.css +2 -1
  278. package/dist/components/core/select/Select.js +3 -3
  279. package/dist/components/core/select/Select.types.d.ts +11 -1
  280. package/dist/components/core/select/Select.types.js +1 -1
  281. package/dist/components/core/tab-list/TabList.js +9 -1
  282. package/dist/components/core/table-header-cell/TableHeaderCell.d.ts +1 -1
  283. package/dist/components/core/table-header-cell/TableHeaderCell.js +5 -2
  284. package/dist/components/core/table-header-cell/TableHeaderCell.types.d.ts +7 -1
  285. package/dist/components/core/table-header-cell/TableHeaderCell.types.js +1 -1
  286. package/dist/components/core/text-area/TextArea.d.ts +1 -1
  287. package/dist/components/core/text-area/TextArea.js +2 -2
  288. package/dist/components/core/text-area/TextArea.types.d.ts +9 -1
  289. package/dist/components/core/text-area/TextArea.types.js +1 -1
  290. package/dist/components/core/text-input/TextInput.d.ts +1 -1
  291. package/dist/components/core/text-input/TextInput.js +2 -2
  292. package/dist/components/core/text-input/TextInput.types.d.ts +9 -1
  293. package/dist/components/core/text-input/TextInput.types.js +1 -1
  294. package/dist/components/data-table-data.d.ts +33 -0
  295. package/dist/components/data-table-data.js +12 -0
  296. package/dist/components/download-banner-data.d.ts +52 -0
  297. package/dist/components/download-banner-data.js +11 -0
  298. package/dist/components/index.d.ts +45 -0
  299. package/dist/components/index.js +32 -0
  300. package/dist/components/resource-banner-data.d.ts +34 -0
  301. package/dist/components/resource-banner-data.js +13 -0
  302. package/dist/components/scene-scroll-data.d.ts +24 -0
  303. package/dist/components/scene-scroll-data.js +9 -0
  304. package/dist/components/stats-data.d.ts +28 -0
  305. package/dist/components/stats-data.js +11 -0
  306. package/dist/components/steps-data.d.ts +38 -0
  307. package/dist/components/steps-data.js +13 -0
  308. package/dist/components/sticky-cards-data.d.ts +43 -0
  309. package/dist/components/sticky-cards-data.js +12 -0
  310. package/dist/components/team-grid-data.d.ts +38 -0
  311. package/dist/components/team-grid-data.js +11 -0
  312. package/dist/components/tiers-data.d.ts +47 -0
  313. package/dist/components/tiers-data.js +13 -0
  314. package/dist/marketing.css +77 -28
  315. package/package.json +1 -1
@@ -0,0 +1,93 @@
1
+ /* GENERATED from scenescroll.contract.json. Do not edit. */
2
+
3
+ :where([data-dds-context="marketing"]) .dds-scenescroll {
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-scenescroll .dds-scenescroll__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-scenescroll .dds-scenescroll__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-scenescroll .dds-scenescroll__media {
34
+ overflow: clip;
35
+ position: absolute;
36
+ border-radius: var(--radius-none);
37
+ }
38
+
39
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__image {
40
+ display: block;
41
+ object-fit: cover;
42
+ border-radius: var(--radius-none);
43
+ }
44
+
45
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__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-scenescroll .dds-scenescroll__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-scenescroll .dds-scenescroll__description {
62
+ margin-block: 0;
63
+ font-family: var(--font-body-lg-family);
64
+ font-size: var(--font-body-lg-size);
65
+ font-weight: var(--font-body-lg-weight);
66
+ letter-spacing: var(--font-body-lg-letter-spacing);
67
+ line-height: var(--font-body-lg-line-height);
68
+ max-inline-size: var(--size-measure-description);
69
+ }
70
+
71
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__link {
72
+ display: flex;
73
+ position: relative;
74
+ padding-block-end: var(--space-section-default);
75
+ padding-inline: var(--space-inset-page);
76
+ }
77
+
78
+ :where([data-dds-context="marketing"]) .dds-scenescroll[data-heading-level="h1"] .dds-scenescroll__title {
79
+ font-family: var(--font-h1-family);
80
+ font-size: var(--font-h1-size);
81
+ font-weight: var(--font-h1-weight);
82
+ letter-spacing: var(--font-h1-letter-spacing);
83
+ line-height: var(--font-h1-line-height);
84
+ }
85
+
86
+ :where([data-dds-context="marketing"]) .dds-scenescroll[data-heading-level="h2"] .dds-scenescroll__title {
87
+ font-family: var(--font-h2-family);
88
+ font-size: var(--font-h2-size);
89
+ font-weight: var(--font-h2-weight);
90
+ letter-spacing: var(--font-h2-letter-spacing);
91
+ line-height: var(--font-h2-line-height);
92
+ }
93
+
@@ -0,0 +1,36 @@
1
+ import './SceneScroll.css';
2
+ import './scene-scroll-impl.css';
3
+ import { type SceneScrollProps } from './SceneScroll.types.js';
4
+ export type { SceneScrollProps };
5
+ /**
6
+ * Two full-screen scenes that change over as the reader scrolls — the reference design's
7
+ * DayNightTransition, made generic: two photographs, each with a heading and a line, and the
8
+ * dissolve from one to the other.
9
+ *
10
+ * Nothing here runs a script. The reference tracked the section's scroll progress in Framer Motion,
11
+ * smoothed it with a spring and wrote opacities and an interpolated text colour inline every frame;
12
+ * a view timeline is the platform doing that, so the stylesheet does all of it. The section is the
13
+ * track and names the timeline, the stage pins inside it, and the second photograph and the two
14
+ * sets of words run down the timeline. Without one — an older browser, a reader who asked for less
15
+ * motion, the page before any script — the scenes are simply drawn one after the other.
16
+ *
17
+ * Both scenes' words are always in the DOM, in order, and neither is hidden from assistive
18
+ * technology. The reference hid the second state's words with `aria-hidden` while the first was
19
+ * showing, so a screen reader only ever heard half the section; here a reader hears both, first
20
+ * then second, which is the order the page tells them in.
21
+ *
22
+ * The section is named by the first scene's title rather than a label of its own: it is on screen,
23
+ * it is what the section is about, and a hidden name would be one more string for a page to
24
+ * translate and keep in step. The second scene's title sits one level under it, as the second half
25
+ * of the section the first one names.
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.
31
+ *
32
+ * `'use client'` for `useId`, which names the region by its heading. There is no arrival: every
33
+ * other block comes up on `useReveal`, and that arrival is an opacity of its own on the parts that
34
+ * make it — on these words it would fight the scrub. The change-over is this block's entrance.
35
+ */
36
+ export declare function SceneScroll({ first, second, link, headingLevel, }: SceneScrollProps): import("react").JSX.Element | null;
@@ -0,0 +1,54 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useId } from 'react';
4
+ import './SceneScroll.css';
5
+ import './scene-scroll-impl.css';
6
+ import { given } from '../../given.js';
7
+ import { sceneScrollDefaults, sceneScrollParts } from './SceneScroll.types.js';
8
+ /** The level under the first scene's, for the second scene's title. */
9
+ const under = { h1: 'h2', h2: 'h3' };
10
+ /**
11
+ * Two full-screen scenes that change over as the reader scrolls — the reference design's
12
+ * DayNightTransition, made generic: two photographs, each with a heading and a line, and the
13
+ * dissolve from one to the other.
14
+ *
15
+ * Nothing here runs a script. The reference tracked the section's scroll progress in Framer Motion,
16
+ * smoothed it with a spring and wrote opacities and an interpolated text colour inline every frame;
17
+ * a view timeline is the platform doing that, so the stylesheet does all of it. The section is the
18
+ * track and names the timeline, the stage pins inside it, and the second photograph and the two
19
+ * sets of words run down the timeline. Without one — an older browser, a reader who asked for less
20
+ * motion, the page before any script — the scenes are simply drawn one after the other.
21
+ *
22
+ * Both scenes' words are always in the DOM, in order, and neither is hidden from assistive
23
+ * technology. The reference hid the second state's words with `aria-hidden` while the first was
24
+ * showing, so a screen reader only ever heard half the section; here a reader hears both, first
25
+ * then second, which is the order the page tells them in.
26
+ *
27
+ * The section is named by the first scene's title rather than a label of its own: it is on screen,
28
+ * it is what the section is about, and a hidden name would be one more string for a page to
29
+ * translate and keep in step. The second scene's title sits one level under it, as the second half
30
+ * of the section the first one names.
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.
36
+ *
37
+ * `'use client'` for `useId`, which names the region by its heading. There is no arrival: every
38
+ * other block comes up on `useReveal`, and that arrival is an opacity of its own on the parts that
39
+ * make it — on these words it would fight the scrub. The change-over is this block's entrance.
40
+ */
41
+ export function SceneScroll({ first, second, link, headingLevel = sceneScrollDefaults.headingLevel, }) {
42
+ const titleId = useId();
43
+ // Both scenes are required, but a record from a feed or an editor is not typed: one that never
44
+ // arrived draws nothing rather than taking the page down, and a section with half its change-over
45
+ // missing is not the section, so neither scene is drawn alone.
46
+ if (!first || !second)
47
+ 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
+ }
50
+ function Scene({ which, scene, level, titleId, eager = false }) {
51
+ const Title = level;
52
+ 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
+ }
@@ -0,0 +1,32 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { SceneScrollScene } from '../../scene-scroll-data.js';
3
+ export interface SceneScrollOwnProps {
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
+ /** 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. */
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. */
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;
15
+ }
16
+ export type SceneScrollProps = SceneScrollOwnProps;
17
+ /** The class each part carries. Apply these — do not retype them. */
18
+ export declare const sceneScrollParts: {
19
+ readonly root: "dds-scenescroll";
20
+ readonly stage: "dds-scenescroll__stage";
21
+ readonly scene: "dds-scenescroll__scene";
22
+ readonly media: "dds-scenescroll__media";
23
+ readonly image: "dds-scenescroll__image";
24
+ readonly content: "dds-scenescroll__content";
25
+ readonly title: "dds-scenescroll__title";
26
+ readonly description: "dds-scenescroll__description";
27
+ readonly link: "dds-scenescroll__link";
28
+ };
29
+ /** Generated so defaults cannot drift from the contract. */
30
+ export declare const sceneScrollDefaults: {
31
+ readonly headingLevel: "h2";
32
+ };
@@ -0,0 +1,15 @@
1
+ // GENERATED from scene-scroll.contract.json. Do not edit.
2
+ /** The class each part carries. Apply these — do not retype them. */
3
+ export const sceneScrollParts = {
4
+ root: 'dds-scenescroll',
5
+ stage: 'dds-scenescroll__stage',
6
+ scene: 'dds-scenescroll__scene',
7
+ media: 'dds-scenescroll__media',
8
+ image: 'dds-scenescroll__image',
9
+ content: 'dds-scenescroll__content',
10
+ title: 'dds-scenescroll__title',
11
+ description: 'dds-scenescroll__description',
12
+ link: 'dds-scenescroll__link',
13
+ };
14
+ /** Generated so defaults cannot drift from the contract. */
15
+ export const sceneScrollDefaults = { headingLevel: 'h2' };
@@ -0,0 +1,275 @@
1
+ /*
2
+ * Scoped to this package, like the generated sheet beside it.
3
+ *
4
+ * `:where([data-dds-context="marketing"])` confines these rules without contributing specificity,
5
+ * so each is decided against the generated rule on its own terms.
6
+ */
7
+
8
+ /*
9
+ * Each scene is a screen tall, the photograph behind and the words over it.
10
+ *
11
+ * This is the whole of the layout wherever the scroll does not drive the change-over — a browser
12
+ * with no scroll timeline, a reader who asked for less motion, the page before any script: two
13
+ * scenes one after the other, each its own screen, every word at full strength and nothing pinned.
14
+ * The rules further down only add the track, the pin and the dissolve on top of it.
15
+ *
16
+ * `100cqh` rather than `100svh`, LandingHero's reason: with no ancestor declaring size containment
17
+ * a container query length falls back to the small viewport, so on a real page the two are the same
18
+ * number — the small viewport, measured with the browser's chrome showing, so a phone's address bar
19
+ * coming and going never resizes the scene mid-scroll as `vh` would. What the container unit adds
20
+ * is a frame standing in for a window: the preview's frame declares `container-type: size`, and the
21
+ * scene measures against that rather than escaping it. The section's own `container-type` is
22
+ * `inline-size`, which answers no question about height, so the unit passes straight through it.
23
+ * A screen is a length no token holds, which is why it is written here.
24
+ *
25
+ * `min-block-size`, so a scene whose words run long grows rather than clipping them.
26
+ */
27
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__scene {
28
+ min-block-size: 100cqh;
29
+ }
30
+
31
+ /*
32
+ * The photograph fills its scene, edge to edge, cropped to fill — the scene is a shape the screen
33
+ * decided, and a photograph letterboxed in it would show the band through the gaps.
34
+ *
35
+ * Stacking order inside the scene, which `isolation` on the scene keeps to itself: the photograph
36
+ * at the back, the words over it. An integer with no unit, which is why it is here.
37
+ */
38
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__media {
39
+ inset: 0;
40
+ z-index: 0;
41
+ }
42
+
43
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__image {
44
+ block-size: 100%;
45
+ inline-size: 100%;
46
+ }
47
+
48
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__content {
49
+ z-index: 1;
50
+ }
51
+
52
+ /*
53
+ * The scrim, the same over the whole scene.
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.
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.
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;
70
+ }
71
+
72
+ /*
73
+ * A title with nothing under it carries no step under it.
74
+ */
75
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__title:last-child {
76
+ margin-block-end: 0;
77
+ }
78
+
79
+ /*
80
+ * Where the words sit, the reference design's arrangement.
81
+ *
82
+ * Below 62rem — the reference's 992px, the same bound FeatureCards takes from it — the words are at
83
+ * 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.
88
+ *
89
+ * Longhand because `var()` is not permitted in a container query condition; `61.9375rem` is the last
90
+ * width below that bound. The section declares the container, and these are rules on what is inside
91
+ * it, which is the only thing a container query can style.
92
+ */
93
+ @container (max-width: 61.9375rem) {
94
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__scene {
95
+ justify-content: flex-start;
96
+ padding-block-start: calc(var(--size-bar-height) + var(--space-section-default));
97
+ }
98
+ }
99
+
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
+
107
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__description {
108
+ margin-inline: auto;
109
+ }
110
+ }
111
+
112
+ /*
113
+ * The photographs are anchored at their foot, as the reference's are, so a crop takes from the sky
114
+ * rather than from the ground the scene stands on.
115
+ */
116
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__image {
117
+ object-position: bottom;
118
+ }
119
+
120
+ /*
121
+ * The change-over, scrubbed by the scroll.
122
+ *
123
+ * The section becomes the track: two and a half screens tall, `250cqh` (the small viewport on a
124
+ * real page, for the reason above). The stage pins to the top of the window for the length of it,
125
+ * a screen tall, with both scenes stacked in its one cell, the second over the first. That leaves a
126
+ * screen and a half of scrolling while the stage holds still, which is the reference design's
127
+ * 250vh track and its 150vh of travel, without `vh`.
128
+ *
129
+ * The section names a view timeline, and three things run down it over `contain` — the stretch in
130
+ * which the track covers the whole window, which is exactly the stretch the stage is pinned for:
131
+ *
132
+ * the second photograph, and its scrim with it, dissolves in from 20% to 80%;
133
+ * the first scene's words fade out from 20% to 45%;
134
+ * the second scene's words fade in from 55% to 80%.
135
+ *
136
+ * The words change one after the other rather than crossing, so two titles are never on screen
137
+ * half-drawn over each other; the photograph takes the whole stretch, so the place changes under
138
+ * them while they do. A fifth of the stretch is held still at each end, so a reader arriving sees
139
+ * the first scene settled and one leaving sees the second. The reference ran the change over the
140
+ * middle third of the section's whole pass; this is the same middle, measured on the pin.
141
+ *
142
+ * Linear, because the scroll is the easing. Only one end of each fade is written — the other is
143
+ * the element's own resting opacity — so nothing here restates full strength as a number, and
144
+ * opacity.hidden is the role for what a reveal fades from.
145
+ *
146
+ * Only for a reader who has not asked for less motion, and only where a scroll timeline exists —
147
+ * asked around the rules rather than undone after them, because an undoing reset that loses to a
148
+ * more specific rule leaves the movement running for exactly the reader who asked it not to. Both
149
+ * conditions false is the layout at the top of this file: two scenes, one after the other.
150
+ *
151
+ * The timeline and the pin both measure against the nearest scroll container, which is why nothing
152
+ * between the section and the page may clip with `overflow: hidden`: `hidden` makes a box a scroll
153
+ * container even when it never scrolls, which freezes the dissolve and unpins the stage. The stage
154
+ * clips with `overflow: clip`, which does neither.
155
+ */
156
+ @keyframes dds-scenescroll-arrive {
157
+ from {
158
+ opacity: var(--opacity-hidden);
159
+ }
160
+ }
161
+
162
+ @keyframes dds-scenescroll-leave {
163
+ to {
164
+ opacity: var(--opacity-hidden);
165
+ }
166
+ }
167
+
168
+ @supports (animation-timeline: view()) {
169
+ @media (prefers-reduced-motion: no-preference) {
170
+ :where([data-dds-context="marketing"]) .dds-scenescroll {
171
+ block-size: 250cqh;
172
+ view-timeline: --dds-scenescroll-track block;
173
+ }
174
+
175
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__stage {
176
+ inset-block-start: 0;
177
+ min-block-size: 100cqh;
178
+ overflow: clip;
179
+ position: sticky;
180
+ }
181
+
182
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__scene[data-scene="second"] .dds-scenescroll__media {
183
+ animation: dds-scenescroll-arrive linear both;
184
+ animation-range: contain 20% contain 80%;
185
+ animation-timeline: --dds-scenescroll-track;
186
+ }
187
+
188
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__scene[data-scene="first"] .dds-scenescroll__content {
189
+ animation: dds-scenescroll-leave linear both;
190
+ animation-range: contain 20% contain 45%;
191
+ animation-timeline: --dds-scenescroll-track;
192
+ }
193
+
194
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__scene[data-scene="second"] .dds-scenescroll__content {
195
+ animation: dds-scenescroll-arrive linear both;
196
+ animation-range: contain 55% contain 80%;
197
+ animation-timeline: --dds-scenescroll-track;
198
+ }
199
+ }
200
+ }
201
+
202
+ /*
203
+ * The link sits right under the words, whichever scene's words are showing.
204
+ *
205
+ * It belongs to the section rather than to a scene, so it does not fade with either. While the
206
+ * scenes change over, both scenes' words are laid into one grid area of the stage — the scenes
207
+ * 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
209
+ * under it, at space.heading.description-actions, the step from words to what a reader can do: under
210
+ * the text on every screen, and still while the text changes over it.
211
+ *
212
+ * Below 62rem the words and the link sit at the top of the stage, under the room a navigation bar
213
+ * 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.
215
+ *
216
+ * In the plain fallback, where the scenes stack, the link is the stage's last row, under the second
217
+ * scene, on the band's own ground, with its own insets.
218
+ */
219
+ @container (min-width: 62rem) {
220
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__link {
221
+ justify-content: center;
222
+ }
223
+ }
224
+
225
+ @supports (animation-timeline: view()) {
226
+ @media (prefers-reduced-motion: no-preference) {
227
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__stage {
228
+ grid-template-areas:
229
+ 'words'
230
+ 'link'
231
+ '.';
232
+ grid-template-columns: minmax(0, 1fr);
233
+ grid-template-rows: auto auto 1fr;
234
+ padding-block: calc(var(--size-bar-height) + var(--space-section-default)) var(--space-section-default);
235
+ padding-inline: var(--space-inset-page);
236
+ }
237
+
238
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__scene {
239
+ display: contents;
240
+ }
241
+
242
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__media {
243
+ inset: 0;
244
+ z-index: 0;
245
+ }
246
+
247
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__content {
248
+ grid-area: words;
249
+ z-index: 1;
250
+ }
251
+
252
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__link {
253
+ grid-area: link;
254
+ margin-block-start: var(--space-heading-description-actions);
255
+ padding: 0;
256
+ z-index: 1;
257
+ }
258
+ }
259
+ }
260
+
261
+ @container (min-width: 62rem) {
262
+ @supports (animation-timeline: view()) {
263
+ @media (prefers-reduced-motion: no-preference) {
264
+ :where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__stage {
265
+ grid-template-areas:
266
+ '.'
267
+ 'words'
268
+ 'link'
269
+ '.';
270
+ grid-template-rows: 1fr auto auto 1fr;
271
+ padding-block: var(--space-section-default);
272
+ }
273
+ }
274
+ }
275
+ }
@@ -0,0 +1,139 @@
1
+ /* GENERATED from stats.contract.json. Do not edit. */
2
+
3
+ :where([data-dds-context="marketing"]) .dds-stats {
4
+ box-sizing: border-box;
5
+ container-type: inline-size;
6
+ display: flex;
7
+ inline-size: 100%;
8
+ justify-content: center;
9
+ overflow-wrap: anywhere;
10
+ }
11
+
12
+ :where([data-dds-context="marketing"]) .dds-stats .dds-stats__inner {
13
+ box-sizing: border-box;
14
+ display: flex;
15
+ flex-direction: column;
16
+ inline-size: 100%;
17
+ min-inline-size: 0;
18
+ max-inline-size: var(--size-content-max);
19
+ padding-block: var(--space-section-default);
20
+ padding-inline: var(--space-inset-page);
21
+ row-gap: var(--space-heading-content);
22
+ }
23
+
24
+ :where([data-dds-context="marketing"]) .dds-stats .dds-stats__header {
25
+ display: flex;
26
+ flex-direction: column;
27
+ min-inline-size: 0;
28
+ max-inline-size: var(--size-measure-heading);
29
+ row-gap: var(--space-gap-none);
30
+ }
31
+
32
+ :where([data-dds-context="marketing"]) .dds-stats .dds-stats__title {
33
+ margin-block: 0;
34
+ text-wrap: balance;
35
+ font-family: var(--font-h2-family);
36
+ font-size: var(--font-h2-size);
37
+ font-weight: var(--font-h2-weight);
38
+ letter-spacing: var(--font-h2-letter-spacing);
39
+ line-height: var(--font-h2-line-height);
40
+ margin-block-end: var(--space-heading-title-description);
41
+ }
42
+
43
+ :where([data-dds-context="marketing"]) .dds-stats .dds-stats__description {
44
+ margin-block: 0;
45
+ font-family: var(--font-body-md-family);
46
+ font-size: var(--font-body-md-size);
47
+ font-weight: var(--font-body-md-weight);
48
+ letter-spacing: var(--font-body-md-letter-spacing);
49
+ line-height: var(--font-body-md-line-height);
50
+ max-inline-size: var(--size-measure-description);
51
+ }
52
+
53
+ :where([data-dds-context="marketing"]) .dds-stats .dds-stats__list {
54
+ display: grid;
55
+ list-style: none;
56
+ margin: 0;
57
+ min-inline-size: 0;
58
+ padding: 0;
59
+ column-gap: var(--space-grid-gutter);
60
+ row-gap: var(--space-grid-gutter);
61
+ }
62
+
63
+ :where([data-dds-context="marketing"]) .dds-stats .dds-stats__dots {
64
+ display: none;
65
+ flex-direction: column;
66
+ row-gap: var(--space-gap-sm);
67
+ }
68
+
69
+ :where([data-dds-context="marketing"]) .dds-stats .dds-stats__dot {
70
+ background-color: currentcolor;
71
+ display: block;
72
+ block-size: var(--size-dot-diameter);
73
+ border-radius: var(--radius-pill);
74
+ inline-size: var(--size-dot-diameter);
75
+ opacity: var(--opacity-dot-rest);
76
+ }
77
+
78
+ :where([data-dds-context="marketing"]) .dds-stats .dds-stats__item {
79
+ display: flex;
80
+ flex-direction: column;
81
+ min-inline-size: 0;
82
+ row-gap: var(--space-gap-sm);
83
+ }
84
+
85
+ :where([data-dds-context="marketing"]) .dds-stats .dds-stats__value {
86
+ display: grid;
87
+ font-variant-numeric: tabular-nums;
88
+ font-family: var(--font-figure-family);
89
+ font-size: var(--font-figure-size);
90
+ font-weight: var(--font-figure-weight);
91
+ letter-spacing: var(--font-figure-letter-spacing);
92
+ line-height: var(--font-figure-line-height);
93
+ }
94
+
95
+ :where([data-dds-context="marketing"]) .dds-stats .dds-stats__amount {
96
+ display: block;
97
+ }
98
+
99
+ :where([data-dds-context="marketing"]) .dds-stats .dds-stats__count {
100
+ display: block;
101
+ }
102
+
103
+ :where([data-dds-context="marketing"]) .dds-stats .dds-stats__label {
104
+ display: block;
105
+ font-family: var(--font-body-md-family);
106
+ font-size: var(--font-body-md-size);
107
+ font-weight: var(--font-body-md-weight);
108
+ letter-spacing: var(--font-body-md-letter-spacing);
109
+ line-height: var(--font-body-md-line-height);
110
+ }
111
+
112
+ :where([data-dds-context="marketing"]) .dds-stats[data-ground="page"] {
113
+ background-color: var(--color-bg-page);
114
+ color: var(--color-fg-default);
115
+ }
116
+
117
+ :where([data-dds-context="marketing"]) .dds-stats[data-ground="page"] .dds-stats__label {
118
+ color: var(--color-fg-muted);
119
+ }
120
+
121
+ :where([data-dds-context="marketing"]) .dds-stats[data-ground="strong"] {
122
+ background-color: var(--color-bg-brand-strong);
123
+ color: var(--color-fg-on-brand-strong);
124
+ }
125
+
126
+ :where([data-dds-context="marketing"]) .dds-stats[data-ground="strong"] .dds-stats__label {
127
+ color: var(--color-fg-muted-inverse);
128
+ }
129
+
130
+ :where([data-dds-context="marketing"]) .dds-stats[data-ground="subtle"] {
131
+ background-color: var(--color-bg-page);
132
+ background-image: linear-gradient(var(--color-bg-band-subtle), var(--color-bg-band-subtle));
133
+ color: var(--color-fg-default);
134
+ }
135
+
136
+ :where([data-dds-context="marketing"]) .dds-stats[data-ground="subtle"] .dds-stats__label {
137
+ color: var(--color-fg-muted);
138
+ }
139
+
@@ -0,0 +1,24 @@
1
+ import './Stats.css';
2
+ import './stats-impl.css';
3
+ import '../block-reveal.css';
4
+ import { type StatsProps } from './Stats.types.js';
5
+ export type { StatsProps };
6
+ /**
7
+ * A heading over a row of key numbers, each counting up once as the section arrives — the reference
8
+ * site's StatsSimple.
9
+ *
10
+ * The count is decoration over a fact that is already written. Every figure is rendered as the page
11
+ * wrote it, from the first render — in the server's HTML, to a reader with no script, to a search
12
+ * engine — and that text is what assistive technology reads throughout. While a figure counts, the
13
+ * running number is laid over it in the same cell, hidden from assistive technology, and the figure
14
+ * beneath turns transparent rather than leaving: it still holds the cell's width, so nothing beside
15
+ * it moves as the digits change.
16
+ *
17
+ * The count is started by the arrival every block shares, `useReveal`, and only by that hook having
18
+ * hidden the section first. A reader who asked for less movement is never hidden, and so never
19
+ * counted at; nor is a renderer that cannot observe. Each figure starts as its own arrival does, a
20
+ * step behind the one before, and runs for motion.duration.reveal — the figure lands as it settles.
21
+ *
22
+ * `'use client'` for the count, the arrival, and `useId`, which names the region by its heading.
23
+ */
24
+ export declare function Stats({ ground, title, description, stats }: StatsProps): import("react").JSX.Element | null;