@deriv-com/dds-marketing 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/.llm/components/awards.md +209 -0
  2. package/.llm/components/background.md +420 -0
  3. package/.llm/components/bottomsheet.md +5 -0
  4. package/.llm/components/comparisoncards.md +257 -0
  5. package/.llm/components/comparisontable.md +231 -0
  6. package/.llm/components/ctabanner.md +22 -0
  7. package/.llm/components/ctabannerslider.md +36 -2
  8. package/.llm/components/datatable.md +273 -0
  9. package/.llm/components/downloadbanner.md +283 -0
  10. package/.llm/components/featurecards.md +41 -3
  11. package/.llm/components/featurecardscarousel.md +311 -0
  12. package/.llm/components/featuresplit.md +5 -0
  13. package/.llm/components/featurestack.md +227 -0
  14. package/.llm/components/illustrationcard.md +236 -0
  15. package/.llm/components/illustrationscene.md +229 -0
  16. package/.llm/components/imagebanner.md +278 -0
  17. package/.llm/components/landinghero.md +24 -0
  18. package/.llm/components/navbar.md +1 -1
  19. package/.llm/components/navbaritem.md +4 -0
  20. package/.llm/components/pageheader.md +22 -0
  21. package/.llm/components/paginationdots.md +6 -1
  22. package/.llm/components/producthero.md +35 -11
  23. package/.llm/components/resourcebanner.md +247 -0
  24. package/.llm/components/scenescroll.md +222 -0
  25. package/.llm/components/select.md +17 -0
  26. package/.llm/components/stats.md +219 -0
  27. package/.llm/components/steps.md +286 -0
  28. package/.llm/components/stickycards.md +251 -0
  29. package/.llm/components/tableheadercell.md +19 -0
  30. package/.llm/components/teamgrid.md +243 -0
  31. package/.llm/components/testimonialrow.md +5 -0
  32. package/.llm/components/testimonialslider.md +14 -1
  33. package/.llm/components/textarea.md +13 -0
  34. package/.llm/components/textinput.md +13 -0
  35. package/.llm/components/textscroll.md +187 -0
  36. package/.llm/components/tiers.md +227 -0
  37. package/.llm/digest/awards.md +45 -0
  38. package/.llm/digest/background.md +53 -0
  39. package/.llm/digest/bottomsheet.md +2 -0
  40. package/.llm/digest/comparisoncards.md +51 -0
  41. package/.llm/digest/comparisontable.md +53 -0
  42. package/.llm/digest/ctabanner.md +4 -0
  43. package/.llm/digest/ctabannerslider.md +7 -0
  44. package/.llm/digest/datatable.md +65 -0
  45. package/.llm/digest/downloadbanner.md +65 -0
  46. package/.llm/digest/featurecards.md +1 -1
  47. package/.llm/digest/featurecardscarousel.md +54 -0
  48. package/.llm/digest/featuresplit.md +1 -0
  49. package/.llm/digest/featurestack.md +48 -0
  50. package/.llm/digest/illustrationcard.md +46 -0
  51. package/.llm/digest/illustrationscene.md +50 -0
  52. package/.llm/digest/imagebanner.md +64 -0
  53. package/.llm/digest/landinghero.md +7 -0
  54. package/.llm/digest/navbaritem.md +1 -0
  55. package/.llm/digest/pageheader.md +4 -0
  56. package/.llm/digest/paginationdots.md +3 -1
  57. package/.llm/digest/producthero.md +4 -2
  58. package/.llm/digest/resourcebanner.md +53 -0
  59. package/.llm/digest/scenescroll.md +49 -0
  60. package/.llm/digest/select.md +5 -0
  61. package/.llm/digest/stats.md +46 -0
  62. package/.llm/digest/steps.md +55 -0
  63. package/.llm/digest/stickycards.md +52 -0
  64. package/.llm/digest/tableheadercell.md +4 -0
  65. package/.llm/digest/teamgrid.md +53 -0
  66. package/.llm/digest/testimonialrow.md +2 -0
  67. package/.llm/digest/testimonialslider.md +4 -0
  68. package/.llm/digest/textarea.md +4 -0
  69. package/.llm/digest/textinput.md +4 -0
  70. package/.llm/digest/textscroll.md +43 -0
  71. package/.llm/digest/tiers.md +50 -0
  72. package/.llm/index.md +25 -2
  73. package/.llm/tokens.md +37 -1
  74. package/AGENTS.md +20 -1
  75. package/dist/components/awards-data.d.ts +24 -0
  76. package/dist/components/awards-data.js +11 -0
  77. package/dist/components/block-image-data.d.ts +24 -0
  78. package/dist/components/block-image-data.js +9 -0
  79. package/dist/components/blocks/awards/Awards.css +134 -0
  80. package/dist/components/blocks/awards/Awards.d.ts +24 -0
  81. package/dist/components/blocks/awards/Awards.js +114 -0
  82. package/dist/components/blocks/awards/Awards.types.d.ts +31 -0
  83. package/dist/components/blocks/awards/Awards.types.js +16 -0
  84. package/dist/components/blocks/awards/awards-impl.css +222 -0
  85. package/dist/components/blocks/cards-of.d.ts +16 -0
  86. package/dist/components/blocks/cards-of.js +23 -0
  87. package/dist/components/blocks/comparison-cards/ComparisonCards.css +195 -0
  88. package/dist/components/blocks/comparison-cards/ComparisonCards.d.ts +24 -0
  89. package/dist/components/blocks/comparison-cards/ComparisonCards.js +75 -0
  90. package/dist/components/blocks/comparison-cards/ComparisonCards.types.d.ts +49 -0
  91. package/dist/components/blocks/comparison-cards/ComparisonCards.types.js +26 -0
  92. package/dist/components/blocks/comparison-cards/comparison-cards-impl.css +262 -0
  93. package/dist/components/blocks/comparison-table/ComparisonTable.css +111 -0
  94. package/dist/components/blocks/comparison-table/ComparisonTable.d.ts +25 -0
  95. package/dist/components/blocks/comparison-table/ComparisonTable.js +100 -0
  96. package/dist/components/blocks/comparison-table/ComparisonTable.types.d.ts +36 -0
  97. package/dist/components/blocks/comparison-table/ComparisonTable.types.js +15 -0
  98. package/dist/components/blocks/comparison-table/comparison-table-impl.css +143 -0
  99. package/dist/components/blocks/cta-banner/CtaBanner.css +1 -0
  100. package/dist/components/blocks/cta-banner/CtaBanner.d.ts +1 -1
  101. package/dist/components/blocks/cta-banner/CtaBanner.js +3 -2
  102. package/dist/components/blocks/cta-banner/CtaBanner.types.d.ts +6 -0
  103. package/dist/components/blocks/cta-banner/CtaBanner.types.js +1 -1
  104. package/dist/components/blocks/cta-banner/cta-banner-impl.css +8 -0
  105. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.css +1 -0
  106. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.d.ts +1 -1
  107. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.js +10 -5
  108. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.d.ts +12 -0
  109. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.js +1 -1
  110. package/dist/components/blocks/cta-banner-slider/cta-banner-slider-impl.css +8 -0
  111. package/dist/components/blocks/data-table/DataTable.css +170 -0
  112. package/dist/components/blocks/data-table/DataTable.d.ts +29 -0
  113. package/dist/components/blocks/data-table/DataTable.js +84 -0
  114. package/dist/components/blocks/data-table/DataTable.types.d.ts +69 -0
  115. package/dist/components/blocks/data-table/DataTable.types.js +19 -0
  116. package/dist/components/blocks/data-table/data-table-impl.css +155 -0
  117. package/dist/components/blocks/download-banner/DownloadBanner.css +228 -0
  118. package/dist/components/blocks/download-banner/DownloadBanner.d.ts +28 -0
  119. package/dist/components/blocks/download-banner/DownloadBanner.js +75 -0
  120. package/dist/components/blocks/download-banner/DownloadBanner.types.d.ts +56 -0
  121. package/dist/components/blocks/download-banner/DownloadBanner.types.js +23 -0
  122. package/dist/components/blocks/download-banner/download-banner-impl.css +216 -0
  123. package/dist/components/blocks/faq-accordion/FaqAccordion.css +1 -0
  124. package/dist/components/blocks/faq-accordion/faq-accordion-impl.css +3 -7
  125. package/dist/components/blocks/feature-bullets/FeatureBullets.css +1 -0
  126. package/dist/components/blocks/feature-bullets/feature-bullets-impl.css +14 -1
  127. package/dist/components/blocks/feature-cards/FeatureCards.css +1 -0
  128. package/dist/components/blocks/feature-cards/FeatureCards.d.ts +2 -1
  129. package/dist/components/blocks/feature-cards/FeatureCards.js +4 -21
  130. package/dist/components/blocks/feature-cards/feature-cards-impl.css +10 -9
  131. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.css +115 -0
  132. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.d.ts +30 -0
  133. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.js +160 -0
  134. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.d.ts +52 -0
  135. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.js +17 -0
  136. package/dist/components/blocks/feature-cards-carousel/feature-cards-carousel-impl.css +207 -0
  137. package/dist/components/blocks/feature-scroll/FeatureScroll.css +1 -0
  138. package/dist/components/blocks/feature-split/FeatureSplit.css +1 -0
  139. package/dist/components/blocks/feature-split/feature-split-impl.css +14 -1
  140. package/dist/components/blocks/feature-stack/FeatureStack.css +86 -0
  141. package/dist/components/blocks/feature-stack/FeatureStack.d.ts +19 -0
  142. package/dist/components/blocks/feature-stack/FeatureStack.js +27 -0
  143. package/dist/components/blocks/feature-stack/FeatureStack.types.d.ts +34 -0
  144. package/dist/components/blocks/feature-stack/FeatureStack.types.js +14 -0
  145. package/dist/components/blocks/feature-stack/feature-stack-impl.css +87 -0
  146. package/dist/components/blocks/image-banner/ImageBanner.css +133 -0
  147. package/dist/components/blocks/image-banner/ImageBanner.d.ts +32 -0
  148. package/dist/components/blocks/image-banner/ImageBanner.js +41 -0
  149. package/dist/components/blocks/image-banner/ImageBanner.types.d.ts +54 -0
  150. package/dist/components/blocks/image-banner/ImageBanner.types.js +14 -0
  151. package/dist/components/blocks/image-banner/image-banner-impl.css +281 -0
  152. package/dist/components/blocks/landing-hero/LandingHero.css +1 -0
  153. package/dist/components/blocks/landing-hero/LandingHero.d.ts +1 -1
  154. package/dist/components/blocks/landing-hero/LandingHero.js +4 -3
  155. package/dist/components/blocks/landing-hero/LandingHero.types.d.ts +7 -3
  156. package/dist/components/blocks/logo-columns/LogoColumns.css +1 -0
  157. package/dist/components/blocks/logo-rows/LogoRows.css +1 -0
  158. package/dist/components/blocks/page-header/PageHeader.css +1 -0
  159. package/dist/components/blocks/page-header/PageHeader.d.ts +1 -1
  160. package/dist/components/blocks/page-header/PageHeader.js +3 -2
  161. package/dist/components/blocks/page-header/PageHeader.types.d.ts +6 -0
  162. package/dist/components/blocks/page-header/PageHeader.types.js +1 -1
  163. package/dist/components/blocks/page-header/page-header-impl.css +10 -0
  164. package/dist/components/blocks/product-hero/ProductHero.css +8 -3
  165. package/dist/components/blocks/product-hero/ProductHero.d.ts +1 -1
  166. package/dist/components/blocks/product-hero/ProductHero.js +5 -2
  167. package/dist/components/blocks/product-hero/ProductHero.types.d.ts +5 -1
  168. package/dist/components/blocks/product-hero/ProductHero.types.js +1 -0
  169. package/dist/components/blocks/product-hero/product-hero-impl.css +43 -12
  170. package/dist/components/blocks/resource-banner/ResourceBanner.css +106 -0
  171. package/dist/components/blocks/resource-banner/ResourceBanner.d.ts +32 -0
  172. package/dist/components/blocks/resource-banner/ResourceBanner.js +51 -0
  173. package/dist/components/blocks/resource-banner/ResourceBanner.types.d.ts +44 -0
  174. package/dist/components/blocks/resource-banner/ResourceBanner.types.js +14 -0
  175. package/dist/components/blocks/resource-banner/resource-banner-impl.css +69 -0
  176. package/dist/components/blocks/scene-scroll/SceneScroll.css +93 -0
  177. package/dist/components/blocks/scene-scroll/SceneScroll.d.ts +36 -0
  178. package/dist/components/blocks/scene-scroll/SceneScroll.js +54 -0
  179. package/dist/components/blocks/scene-scroll/SceneScroll.types.d.ts +32 -0
  180. package/dist/components/blocks/scene-scroll/SceneScroll.types.js +15 -0
  181. package/dist/components/blocks/scene-scroll/scene-scroll-impl.css +275 -0
  182. package/dist/components/blocks/stats/Stats.css +139 -0
  183. package/dist/components/blocks/stats/Stats.d.ts +24 -0
  184. package/dist/components/blocks/stats/Stats.js +120 -0
  185. package/dist/components/blocks/stats/Stats.types.d.ts +36 -0
  186. package/dist/components/blocks/stats/Stats.types.js +19 -0
  187. package/dist/components/blocks/stats/stats-count.d.ts +34 -0
  188. package/dist/components/blocks/stats/stats-count.js +61 -0
  189. package/dist/components/blocks/stats/stats-impl.css +284 -0
  190. package/dist/components/blocks/stats/use-wheel.d.ts +37 -0
  191. package/dist/components/blocks/stats/use-wheel.js +126 -0
  192. package/dist/components/blocks/steps/Steps.css +202 -0
  193. package/dist/components/blocks/steps/Steps.d.ts +32 -0
  194. package/dist/components/blocks/steps/Steps.js +65 -0
  195. package/dist/components/blocks/steps/Steps.types.d.ts +48 -0
  196. package/dist/components/blocks/steps/Steps.types.js +21 -0
  197. package/dist/components/blocks/steps/steps-impl.css +216 -0
  198. package/dist/components/blocks/steps/use-turn.d.ts +33 -0
  199. package/dist/components/blocks/steps/use-turn.js +75 -0
  200. package/dist/components/blocks/sticky-cards/StickyCards.css +154 -0
  201. package/dist/components/blocks/sticky-cards/StickyCards.d.ts +35 -0
  202. package/dist/components/blocks/sticky-cards/StickyCards.js +153 -0
  203. package/dist/components/blocks/sticky-cards/StickyCards.types.d.ts +43 -0
  204. package/dist/components/blocks/sticky-cards/StickyCards.types.js +18 -0
  205. package/dist/components/blocks/sticky-cards/sticky-cards-impl.css +393 -0
  206. package/dist/components/blocks/team-grid/TeamGrid.css +159 -0
  207. package/dist/components/blocks/team-grid/TeamGrid.d.ts +28 -0
  208. package/dist/components/blocks/team-grid/TeamGrid.js +74 -0
  209. package/dist/components/blocks/team-grid/TeamGrid.types.d.ts +51 -0
  210. package/dist/components/blocks/team-grid/TeamGrid.types.js +20 -0
  211. package/dist/components/blocks/team-grid/team-grid-impl.css +129 -0
  212. package/dist/components/blocks/testimonial-row/TestimonialRow.css +1 -0
  213. package/dist/components/blocks/testimonial-row/TestimonialRow.d.ts +1 -1
  214. package/dist/components/blocks/testimonial-row/TestimonialRow.js +4 -3
  215. package/dist/components/blocks/testimonial-row/TestimonialRow.types.d.ts +3 -0
  216. package/dist/components/blocks/testimonial-row/TestimonialRow.types.js +1 -1
  217. package/dist/components/blocks/testimonial-row/testimonial-row-impl.css +8 -0
  218. package/dist/components/blocks/testimonial-slider/TestimonialSlider.css +1 -0
  219. package/dist/components/blocks/testimonial-slider/TestimonialSlider.d.ts +1 -1
  220. package/dist/components/blocks/testimonial-slider/TestimonialSlider.js +2 -2
  221. package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.d.ts +8 -0
  222. package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.js +1 -1
  223. package/dist/components/blocks/text-scroll/TextScroll.css +53 -0
  224. package/dist/components/blocks/text-scroll/TextScroll.d.ts +5 -0
  225. package/dist/components/blocks/text-scroll/TextScroll.js +71 -0
  226. package/dist/components/blocks/text-scroll/TextScroll.types.d.ts +22 -0
  227. package/dist/components/blocks/text-scroll/TextScroll.types.js +10 -0
  228. package/dist/components/blocks/text-scroll/text-scroll-impl.css +115 -0
  229. package/dist/components/blocks/tiers/Tiers.css +233 -0
  230. package/dist/components/blocks/tiers/Tiers.d.ts +32 -0
  231. package/dist/components/blocks/tiers/Tiers.js +68 -0
  232. package/dist/components/blocks/tiers/Tiers.types.d.ts +45 -0
  233. package/dist/components/blocks/tiers/Tiers.types.js +25 -0
  234. package/dist/components/blocks/tiers/tiers-impl.css +185 -0
  235. package/dist/components/blocks/use-rotation.d.ts +12 -2
  236. package/dist/components/blocks/use-rotation.js +6 -28
  237. package/dist/components/comparison-cards-data.d.ts +59 -0
  238. package/dist/components/comparison-cards-data.js +12 -0
  239. package/dist/components/comparison-table-data.d.ts +39 -0
  240. package/dist/components/comparison-table-data.js +11 -0
  241. package/dist/components/core/accordion-item/AccordionItem.css +1 -5
  242. package/dist/components/core/background/Background.css +92 -0
  243. package/dist/components/core/background/Background.d.ts +27 -0
  244. package/dist/components/core/background/Background.js +45 -0
  245. package/dist/components/core/background/Background.types.d.ts +39 -0
  246. package/dist/components/core/background/Background.types.js +11 -0
  247. package/dist/components/core/background/background-impl.css +760 -0
  248. package/dist/components/core/background/halftone.d.ts +134 -0
  249. package/dist/components/core/background/halftone.js +722 -0
  250. package/dist/components/core/background/patterns.d.ts +66 -0
  251. package/dist/components/core/background/patterns.js +244 -0
  252. package/dist/components/core/background/shader.d.ts +44 -0
  253. package/dist/components/core/background/shader.js +307 -0
  254. package/dist/components/core/background/use-halftone.d.ts +15 -0
  255. package/dist/components/core/background/use-halftone.js +27 -0
  256. package/dist/components/core/background/use-offscreen.d.ts +10 -0
  257. package/dist/components/core/background/use-offscreen.js +30 -0
  258. package/dist/components/core/background/use-shader.d.ts +11 -0
  259. package/dist/components/core/background/use-shader.js +25 -0
  260. package/dist/components/core/background/use-spotlight.d.ts +14 -0
  261. package/dist/components/core/background/use-spotlight.js +73 -0
  262. package/dist/components/core/bottom-sheet/BottomSheet.js +2 -2
  263. package/dist/components/core/bottom-sheet/BottomSheet.types.d.ts +3 -1
  264. package/dist/components/core/breadcrumb/Breadcrumb.d.ts +1 -0
  265. package/dist/components/core/breadcrumb/Breadcrumb.js +1 -0
  266. package/dist/components/core/breadcrumb/breadcrumb-impl.css +11 -0
  267. package/dist/components/core/button/button-impl.css +14 -1
  268. package/dist/components/core/illustration-card/IllustrationCard.css +40 -0
  269. package/dist/components/core/illustration-card/IllustrationCard.d.ts +22 -0
  270. package/dist/components/core/illustration-card/IllustrationCard.js +82 -0
  271. package/dist/components/core/illustration-card/IllustrationCard.types.d.ts +23 -0
  272. package/dist/components/core/illustration-card/IllustrationCard.types.js +8 -0
  273. package/dist/components/core/illustration-card/illustration-card-impl.css +47 -0
  274. package/dist/components/core/illustration-scene/IllustrationScene.css +41 -0
  275. package/dist/components/core/illustration-scene/IllustrationScene.d.ts +14 -0
  276. package/dist/components/core/illustration-scene/IllustrationScene.js +16 -0
  277. package/dist/components/core/illustration-scene/IllustrationScene.types.d.ts +32 -0
  278. package/dist/components/core/illustration-scene/IllustrationScene.types.js +8 -0
  279. package/dist/components/core/illustration-scene/illustration-scene-impl.css +46 -0
  280. package/dist/components/core/link/Link.js +7 -3
  281. package/dist/components/core/link/link-impl.css +29 -2
  282. package/dist/components/core/navbar/Navbar.css +2 -2
  283. package/dist/components/core/navbar/Navbar.types.d.ts +1 -1
  284. package/dist/components/core/navbar-item/NavbarItem.d.ts +2 -1
  285. package/dist/components/core/navbar-item/NavbarItem.js +3 -10
  286. package/dist/components/core/navbar-item/NavbarItem.types.d.ts +4 -1
  287. package/dist/components/core/navbar-item/NavbarItem.types.js +1 -1
  288. package/dist/components/core/navbar-item/navbar-item-impl.css +10 -0
  289. package/dist/components/core/navbar-menu/navbar-menu-impl.css +9 -0
  290. package/dist/components/core/navbar-switcher/navbar-switcher-impl.css +19 -0
  291. package/dist/components/core/pagination/Pagination.js +1 -1
  292. package/dist/components/core/pagination/pagination-impl.css +9 -0
  293. package/dist/components/core/pagination-dots/PaginationDots.d.ts +1 -1
  294. package/dist/components/core/pagination-dots/PaginationDots.js +3 -3
  295. package/dist/components/core/pagination-dots/PaginationDots.types.d.ts +3 -1
  296. package/dist/components/core/segmented-control/SegmentedControl.css +4 -3
  297. package/dist/components/core/segmented-control/SegmentedControl.js +17 -3
  298. package/dist/components/core/segmented-control-item/SegmentedControlItem.css +2 -1
  299. package/dist/components/core/select/Select.js +3 -3
  300. package/dist/components/core/select/Select.types.d.ts +11 -1
  301. package/dist/components/core/select/Select.types.js +1 -1
  302. package/dist/components/core/tab-list/TabList.js +9 -1
  303. package/dist/components/core/table-header-cell/TableHeaderCell.d.ts +1 -1
  304. package/dist/components/core/table-header-cell/TableHeaderCell.js +5 -2
  305. package/dist/components/core/table-header-cell/TableHeaderCell.types.d.ts +7 -1
  306. package/dist/components/core/table-header-cell/TableHeaderCell.types.js +1 -1
  307. package/dist/components/core/text-area/TextArea.d.ts +1 -1
  308. package/dist/components/core/text-area/TextArea.js +2 -2
  309. package/dist/components/core/text-area/TextArea.types.d.ts +9 -1
  310. package/dist/components/core/text-area/TextArea.types.js +1 -1
  311. package/dist/components/core/text-input/TextInput.d.ts +1 -1
  312. package/dist/components/core/text-input/TextInput.js +2 -2
  313. package/dist/components/core/text-input/TextInput.types.d.ts +9 -1
  314. package/dist/components/core/text-input/TextInput.types.js +1 -1
  315. package/dist/components/data-table-data.d.ts +33 -0
  316. package/dist/components/data-table-data.js +12 -0
  317. package/dist/components/download-banner-data.d.ts +52 -0
  318. package/dist/components/download-banner-data.js +11 -0
  319. package/dist/components/index.d.ts +51 -0
  320. package/dist/components/index.js +38 -0
  321. package/dist/components/resource-banner-data.d.ts +34 -0
  322. package/dist/components/resource-banner-data.js +13 -0
  323. package/dist/components/scene-scroll-data.d.ts +24 -0
  324. package/dist/components/scene-scroll-data.js +9 -0
  325. package/dist/components/stats-data.d.ts +28 -0
  326. package/dist/components/stats-data.js +11 -0
  327. package/dist/components/steps-data.d.ts +38 -0
  328. package/dist/components/steps-data.js +13 -0
  329. package/dist/components/sticky-cards-data.d.ts +43 -0
  330. package/dist/components/sticky-cards-data.js +12 -0
  331. package/dist/components/team-grid-data.d.ts +38 -0
  332. package/dist/components/team-grid-data.js +11 -0
  333. package/dist/components/tiers-data.d.ts +47 -0
  334. package/dist/components/tiers-data.js +13 -0
  335. package/dist/marketing.css +101 -28
  336. package/package.json +1 -1
@@ -0,0 +1,393 @@
1
+ /*
2
+ * Scoped to this package, like the generated sheet beside it.
3
+ *
4
+ * `:where([data-dds-context="marketing"])` confines these rules without contributing specificity,
5
+ * so each is decided against the generated rule on its own terms.
6
+ */
7
+
8
+ /*
9
+ * The header starts on a phone and is centred from the fold.
10
+ *
11
+ * FeatureCards' rule and its reason: the cards are stacked under the heading, so the heading is
12
+ * centred over them — and both references turn at 768px. The header and its line are capped
13
+ * narrower than the column, so `margin-inline: auto` centres those boxes as well as their words.
14
+ *
15
+ * `48rem` longhand because `var()` is not permitted in a container query condition.
16
+ */
17
+ @container (min-width: 48rem) {
18
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__header {
19
+ align-items: center;
20
+ margin-inline: auto;
21
+ text-align: center;
22
+ }
23
+
24
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__description {
25
+ margin-inline: auto;
26
+ }
27
+ }
28
+
29
+ /*
30
+ * A heading with nothing under it closes up: its bound step is the distance to the line.
31
+ */
32
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__title:last-child {
33
+ margin-block-end: 0;
34
+ }
35
+
36
+ /*
37
+ * One column, and every row as tall as the tallest card.
38
+ *
39
+ * Equal rows are what let a card hide the one under it completely: a shorter card arriving over a
40
+ * taller one would leave the taller one's foot showing under it, words and all. The reference
41
+ * measured every card with a script and wrote the tallest height onto each, again on resize and
42
+ * again once the fonts arrived; `1fr` rows in a list whose height is its content are the same
43
+ * answer, given by the layout before anything runs. `minmax(0, 1fr)` across, so a long word or a
44
+ * wide picture shrinks to the column rather than pushing the list past the page.
45
+ */
46
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__list {
47
+ grid-auto-rows: 1fr;
48
+ grid-template-columns: minmax(0, 1fr);
49
+ }
50
+
51
+ /* The Card fills its place, so a short card in a tall row is drawn the row's height. */
52
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__item > .dds-card {
53
+ flex: auto;
54
+ }
55
+
56
+ /*
57
+ * A light and a dark card are raised a step on the subtle band — FeatureCards' answer, and its
58
+ * reason: surface-light is gray.50, the band's own colour in light mode, and accent-strong lands
59
+ * within a shade of the band in dark mode. Both raised fills are opaque in both themes, which a
60
+ * card in a pile has to be: a see-through card would show the one it covers.
61
+ */
62
+ :where([data-dds-context="marketing"])
63
+ .dds-stickycards[data-ground="subtle"]
64
+ .dds-stickycards__item
65
+ > .dds-card[data-variant="surface-light"] {
66
+ background-color: var(--color-bg-surface-card-light-raised);
67
+ }
68
+
69
+ :where([data-dds-context="marketing"])
70
+ .dds-stickycards[data-ground="subtle"]
71
+ .dds-stickycards__item
72
+ > .dds-card[data-variant="accent-strong"] {
73
+ background-color: var(--color-bg-surface-card-strong-raised);
74
+ }
75
+
76
+ /*
77
+ * ── compact ──────────────────────────────────────────────────────────────────────────────────
78
+ *
79
+ * The picture is inset from the card's edges, under the words on a phone: CardBody's own inset
80
+ * holds the words, and the picture takes the same inset on its three open sides — the words' foot
81
+ * padding is already the step between the two.
82
+ */
83
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"] .dds-stickycards__media {
84
+ margin-block-end: var(--space-inset-card);
85
+ margin-inline: var(--space-inset-card);
86
+ }
87
+
88
+ /*
89
+ * The container: a landscape panel, aspect.landscape, whatever the page puts in it — the reference
90
+ * design's animation panel, and the same panel for a picture. The picture fills it, cropped to fill;
91
+ * a player the page mounts stretches to it, a grid of one cell so it does not collapse to nothing in
92
+ * a box with no height of its own. A panel of one shape down the pile is what keeps the set reading
93
+ * as a set.
94
+ */
95
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"] .dds-stickycards__media {
96
+ aspect-ratio: var(--aspect-landscape);
97
+ display: grid;
98
+ }
99
+
100
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"] .dds-stickycards__image {
101
+ block-size: 100%;
102
+ inline-size: 100%;
103
+ object-fit: cover;
104
+ }
105
+
106
+ /*
107
+ * A card's background photograph, under a wash of the card's own fill at opacity.muted (72%) — the
108
+ * reference design's market cards, which washed at 85%: at that strength a photograph barely showed
109
+ * through, and the card read as plain fill. At 72% the photograph reads as texture and the words keep
110
+ * their contrast over the brightest photograph — about 9:1 dark on the light card, 7:1 white on the
111
+ * dark one; the coral card was under body contrast on its plain fill already, and stays the
112
+ * recorded exception. The wash is the fill the card already paints, mixed toward transparent, so it
113
+ * follows the variant and the ground's raised fills with nothing to keep in step. The words and the
114
+ * container sit above it.
115
+ */
116
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__item > .dds-card {
117
+ position: relative;
118
+ }
119
+
120
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__backdrop {
121
+ border-radius: inherit;
122
+ z-index: 0;
123
+ }
124
+
125
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__backdrop > img {
126
+ block-size: 100%;
127
+ display: block;
128
+ inline-size: 100%;
129
+ object-fit: cover;
130
+ }
131
+
132
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__backdrop::after {
133
+ background-color: color-mix(in srgb, var(--dds-stickycards-fill) calc(var(--opacity-muted) * 100%), transparent);
134
+ content: '';
135
+ inset: 0;
136
+ position: absolute;
137
+ }
138
+
139
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-card { --dds-stickycards-fill: var(--color-bg-surface-card-strong); }
140
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-card[data-variant="accent"] { --dds-stickycards-fill: var(--color-bg-brand); }
141
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-card[data-variant="surface-light"] { --dds-stickycards-fill: var(--color-bg-surface-card-light); }
142
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-ground="subtle"] .dds-card[data-variant="accent-strong"] { --dds-stickycards-fill: var(--color-bg-surface-card-strong-raised); }
143
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-ground="subtle"] .dds-card[data-variant="surface-light"] { --dds-stickycards-fill: var(--color-bg-surface-card-light-raised); }
144
+
145
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__body {
146
+ position: relative;
147
+ z-index: 1;
148
+ }
149
+
150
+ /*
151
+ * A pile of words alone stands each card's words in the middle of its height, the reference's
152
+ * alignment. Only where no card in the pile has a picture: in a pile where some do, a card without one
153
+ * keeps its words stacked at the top like the rest, so the set reads as one set.
154
+ */
155
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"][data-pile="words"] [data-media="none"] .dds-cardbody {
156
+ justify-content: center;
157
+ }
158
+
159
+ @container (min-width: 48rem) {
160
+ /*
161
+ * From the fold the words and the picture sit side by side, halves of the card, the words at the
162
+ * start and both at the top. The picture's inset moves to its open sides: the words' own end
163
+ * padding is the step between the halves. The words keep the card's height, so a card of words
164
+ * alone can still stand them in its middle; the container keeps its landscape shape.
165
+ */
166
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"] .dds-stickycards__body {
167
+ flex-direction: row;
168
+ }
169
+
170
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"] .dds-stickycards__media {
171
+ align-self: flex-start;
172
+ }
173
+
174
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"] .dds-stickycards__body > :is(.dds-cardbody, .dds-stickycards__media) {
175
+ flex: 1 1 0;
176
+ min-inline-size: 0;
177
+ }
178
+
179
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"] .dds-stickycards__media {
180
+ margin-block: var(--space-inset-card);
181
+ margin-inline: 0 var(--space-inset-card);
182
+ }
183
+
184
+ /* In a pile where other cards have a picture, a card without one keeps its words to the same half
185
+ the others' take, so the words line up down the pile and wrap the same way; the other half is
186
+ the card's own fill. */
187
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"][data-pile="pictured"] [data-media="none"] .dds-stickycards__body > .dds-cardbody {
188
+ flex: 0 1 50%;
189
+ }
190
+
191
+ /*
192
+ * And a card of words alone sets its title beside its sentence — the reference design's two
193
+ * columns, the sentence the wider. The two are a heading and the content it introduces turned on
194
+ * its side, so the step between them is space.heading.content, the rule's measure for that.
195
+ */
196
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"][data-pile="words"] [data-media="none"] .dds-cardbody__content {
197
+ align-items: center;
198
+ column-gap: var(--space-heading-content);
199
+ display: grid;
200
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1.25fr);
201
+ }
202
+ }
203
+
204
+ /*
205
+ * ── feature ──────────────────────────────────────────────────────────────────────────────────
206
+ *
207
+ * The picture reaches the card's edges and fills its slot, cropped to fill — the reference's hero
208
+ * image, which a card the width of the page holds as half of itself rather than as an inset
209
+ * thumbnail. Landscape under the words on a phone, aspect.landscape; from the fold the right half
210
+ * of the card, at least landscape tall and as tall as the words if they run longer.
211
+ */
212
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-layout="feature"] .dds-stickycards__media {
213
+ aspect-ratio: var(--aspect-landscape);
214
+ display: grid;
215
+ position: relative;
216
+ }
217
+
218
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-layout="feature"] .dds-stickycards__image {
219
+ block-size: 100%;
220
+ inline-size: 100%;
221
+ inset: 0;
222
+ object-fit: cover;
223
+ position: absolute;
224
+ }
225
+
226
+ /*
227
+ * The title at the h3 step: a card the width of the page is a chapter rather than a tile, and the
228
+ * reference sets it there. CardBody draws its title at the card's h5; the block, which knows how
229
+ * big its cards are, is what can say so.
230
+ */
231
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-layout="feature"] .dds-cardbody__title {
232
+ font-family: var(--font-h3-family);
233
+ font-size: var(--font-h3-size);
234
+ font-weight: var(--font-h3-weight);
235
+ letter-spacing: var(--font-h3-letter-spacing);
236
+ line-height: var(--font-h3-line-height);
237
+ }
238
+
239
+ @container (min-width: 48rem) {
240
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-layout="feature"] .dds-stickycards__body {
241
+ align-items: stretch;
242
+ flex-direction: row;
243
+ }
244
+
245
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-layout="feature"] .dds-stickycards__body > :is(.dds-cardbody, .dds-stickycards__media) {
246
+ flex: 1 1 0;
247
+ min-inline-size: 0;
248
+ }
249
+ }
250
+
251
+ /*
252
+ * ── the pile ─────────────────────────────────────────────────────────────────────────────────
253
+ *
254
+ * Each card's place sticks under the room a navigation bar takes — size.bar-height and the page's
255
+ * own gutter — and each a step of space.pile.peek lower than the one before, so the top edge of
256
+ * every covered card shows over the card laid on it. The step is the component's: only the last
257
+ * four cards are given one (`--dds-stickycards-depth`), so a long set never shows more than four
258
+ * edges. Later cards are later in the list, so they paint over the earlier ones with no stacking
259
+ * order of their own.
260
+ *
261
+ * Only for a reader who has not asked for less motion, and only in a window tall enough to hold a
262
+ * card under the bar — `40rem`, a laptop's short screen and a phone held upright, and not a phone
263
+ * held on its side. A card taller than the window it is pinned in would be covered before its foot
264
+ * was ever on screen, which is words a reader cannot reach. Everywhere else the cards are a plain
265
+ * column, each in full. Asked around the rule rather than undone after it, so no reset has to win.
266
+ *
267
+ * Sticky is decided by the nearest scroll container, which is why nothing between this section and
268
+ * the page may clip with `overflow: hidden`.
269
+ *
270
+ * While anything in a card has focus, that card comes to the top of the pile: a focused control
271
+ * under the next card is one the eye cannot find. Only what a page renders through `media` can take
272
+ * focus here.
273
+ *
274
+ * …and only while every card fits the window below the bar. The 40rem floor is a guess at a card's
275
+ * height, and a translation is what breaks it: German runs a third longer, and a card of it on an
276
+ * upright phone grew past the window and was covered before its foot was on screen. The component
277
+ * measures and marks the list `data-tall` when the tallest card would not fit, and the pile steps
278
+ * aside for a plain column — every card in full.
279
+ */
280
+ @media (prefers-reduced-motion: no-preference) and (min-height: 40rem) {
281
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__list:not([data-tall]) > .dds-stickycards__item {
282
+ --dds-stickycards-top: calc(var(--size-bar-height) + var(--space-inset-page) + var(--dds-stickycards-head, var(--space-gap-none)));
283
+ inset-block-start: calc(var(--dds-stickycards-top) + var(--dds-stickycards-depth, 0) * var(--space-pile-peek));
284
+ position: sticky;
285
+ }
286
+
287
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__list:not([data-tall]) > .dds-stickycards__item:focus-within {
288
+ z-index: 1;
289
+ }
290
+
291
+ /*
292
+ * The heading pins above the pile, so a reader halfway down the stack still knows what it is a
293
+ * stack of. It stops at the bar's foot, where the cards used to, and they now stop under it — at
294
+ * its measured height, which the component hands over as --dds-stickycards-head. It leaves with
295
+ * the last card, because a sticky box is held only inside its parent, and the inner box ends
296
+ * where the pile does.
297
+ *
298
+ * Only once that height is known (`data-head-pinned`), so no card can come to rest over the
299
+ * words, and never when the cards are a plain column (`data-tall`).
300
+ *
301
+ * And it leaves when the pile does. A sticky box is held until its margin box reaches the end of
302
+ * its parent, which is the list's foot — a whole card later than the pile lets go, so the cards
303
+ * scrolled up over a heading still pinned. The heading's margin reaches as far below it as the
304
+ * card on top does (--dds-stickycards-tail, measured), and the list comes back up by the same
305
+ * amount, so nothing moves on the page and the two let go together.
306
+ */
307
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-head-pinned]:not(:has(.dds-stickycards__list[data-tall])) .dds-stickycards__header {
308
+ inset-block-start: calc(var(--size-bar-height) + var(--space-inset-page));
309
+ margin-block-end: var(--dds-stickycards-tail, var(--space-gap-none));
310
+ position: sticky;
311
+ }
312
+
313
+ :where([data-dds-context="marketing"]) .dds-stickycards[data-head-pinned]:not(:has(.dds-stickycards__list[data-tall])) .dds-stickycards__list {
314
+ margin-block-start: calc(-1 * var(--dds-stickycards-tail, var(--space-gap-none)));
315
+ }
316
+ }
317
+
318
+ /*
319
+ * The covered card draws back and darkens, scrubbed by the scroll.
320
+ *
321
+ * The reference measured, on every scroll, how far the next card had come over this one, and drew
322
+ * this one back by that fraction. Said as a range: every card's place names a view timeline
323
+ * (`--dds-stickycards-own`, unique per card and per section, set by the component and brought into
324
+ * scope on the list), and each card but the last runs down the *next* card's timeline. It starts
325
+ * when the next card's top reaches this card's foot — the window's height less this card's sticky
326
+ * top and the card's own height, which is `100%` of the timeline's `entry` range — and ends when the
327
+ * next card reaches its own sticky top. Every card is the same height, so the next card's height is
328
+ * this one's. `100cqh` is the window's height: with no ancestor declaring size containment a
329
+ * container query length falls back to the small viewport, LandingHero's and SceneScroll's reason
330
+ * for it over `vh`, and a frame that does declare one — the preview's — is measured instead.
331
+ *
332
+ * Over that stretch the card draws back to motion.scale.pile-covered from its top edge, and the
333
+ * scrim over it fades in from opacity.hidden to color.bg.overlay at full strength. Linear, because
334
+ * the scroll is the easing. Both hold once the next card lands, and run back as the reader scrolls
335
+ * up.
336
+ *
337
+ * Only where a scroll timeline exists, and only where the pile runs at all — the same two questions
338
+ * asked around the rules. Without a timeline the cards still pile, without drawing back; the scrim
339
+ * is not drawn, so no card is ever left dark.
340
+ *
341
+ * A card holding focus stands at full size with no scrim, at the top of the pile.
342
+ */
343
+ @keyframes dds-stickycards-recede {
344
+ to {
345
+ scale: var(--motion-scale-pile-covered);
346
+ }
347
+ }
348
+
349
+ @keyframes dds-stickycards-darken {
350
+ from {
351
+ opacity: var(--opacity-hidden);
352
+ }
353
+ }
354
+
355
+ @supports (animation-timeline: view()) {
356
+ @media (prefers-reduced-motion: no-preference) and (min-height: 40rem) {
357
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__list:not([data-tall]) {
358
+ timeline-scope: var(--dds-stickycards-scope, none);
359
+ }
360
+
361
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__list:not([data-tall]) > .dds-stickycards__item {
362
+ --dds-stickycards-next-top: calc(var(--dds-stickycards-top) + var(--dds-stickycards-next-depth, 0) * var(--space-pile-peek));
363
+ view-timeline: var(--dds-stickycards-own, none) block;
364
+ }
365
+
366
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__list:not([data-tall]) > .dds-stickycards__item:not(:last-child) {
367
+ animation: dds-stickycards-recede linear both;
368
+ animation-range:
369
+ entry calc(100cqh - 100% - var(--dds-stickycards-top) - var(--dds-stickycards-depth, 0) * var(--space-pile-peek))
370
+ cover calc(100cqh - var(--dds-stickycards-next-top));
371
+ animation-timeline: var(--dds-stickycards-next);
372
+ transform-origin: 50% 0;
373
+ }
374
+
375
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__list:not([data-tall]) > .dds-stickycards__item:not(:last-child) > .dds-stickycards__scrim {
376
+ animation: dds-stickycards-darken linear both;
377
+ animation-range:
378
+ entry calc(100cqh - 100% - var(--dds-stickycards-top) - var(--dds-stickycards-depth, 0) * var(--space-pile-peek))
379
+ cover calc(100cqh - var(--dds-stickycards-next-top));
380
+ animation-timeline: var(--dds-stickycards-next);
381
+ display: block;
382
+ }
383
+
384
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__list:not([data-tall]) > .dds-stickycards__item:focus-within {
385
+ animation: none;
386
+ }
387
+
388
+ :where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__list:not([data-tall]) > .dds-stickycards__item:focus-within > .dds-stickycards__scrim {
389
+ animation: none;
390
+ display: none;
391
+ }
392
+ }
393
+ }
@@ -0,0 +1,159 @@
1
+ /* GENERATED from teamgrid.contract.json. Do not edit. */
2
+
3
+ :where([data-dds-context="marketing"]) .dds-teamgrid {
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-teamgrid .dds-teamgrid__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-teamgrid .dds-teamgrid__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-teamgrid .dds-teamgrid__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-teamgrid .dds-teamgrid__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-teamgrid .dds-teamgrid__people {
54
+ display: flex;
55
+ flex-direction: column;
56
+ min-inline-size: 0;
57
+ row-gap: var(--space-gap-xl);
58
+ }
59
+
60
+ :where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__list {
61
+ display: grid;
62
+ list-style: none;
63
+ margin: 0;
64
+ min-inline-size: 0;
65
+ padding: 0;
66
+ column-gap: var(--space-grid-gutter);
67
+ row-gap: var(--space-grid-gutter);
68
+ }
69
+
70
+ :where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__item {
71
+ display: flex;
72
+ flex-direction: column;
73
+ min-inline-size: 0;
74
+ row-gap: var(--space-gap-md);
75
+ }
76
+
77
+ :where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__media {
78
+ overflow: clip;
79
+ border-radius: var(--radius-surface);
80
+ }
81
+
82
+ :where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__text {
83
+ align-items: flex-start;
84
+ display: flex;
85
+ flex-direction: column;
86
+ min-inline-size: 0;
87
+ row-gap: var(--space-gap-xs);
88
+ }
89
+
90
+ :where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__name {
91
+ margin-block: 0;
92
+ font-family: var(--font-h5-family);
93
+ font-size: var(--font-h5-size);
94
+ font-weight: var(--font-h5-weight);
95
+ letter-spacing: var(--font-h5-letter-spacing);
96
+ line-height: var(--font-h5-line-height);
97
+ }
98
+
99
+ :where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__role {
100
+ margin-block: 0;
101
+ font-family: var(--font-body-md-family);
102
+ font-size: var(--font-body-md-size);
103
+ font-weight: var(--font-body-md-weight);
104
+ letter-spacing: var(--font-body-md-letter-spacing);
105
+ line-height: var(--font-body-md-line-height);
106
+ }
107
+
108
+ :where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__profile {
109
+ align-items: center;
110
+ display: flex;
111
+ min-block-size: var(--size-target-min);
112
+ }
113
+
114
+ :where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__actions {
115
+ display: flex;
116
+ flex-direction: column;
117
+ column-gap: var(--space-actions-gap);
118
+ }
119
+
120
+ :where([data-dds-context="marketing"]) .dds-teamgrid[data-ground="page"] {
121
+ background-color: var(--color-bg-page);
122
+ color: var(--color-fg-default);
123
+ }
124
+
125
+ :where([data-dds-context="marketing"]) .dds-teamgrid[data-ground="page"] .dds-teamgrid__media {
126
+ background-color: var(--color-bg-surface);
127
+ }
128
+
129
+ :where([data-dds-context="marketing"]) .dds-teamgrid[data-ground="page"] .dds-teamgrid__role {
130
+ color: var(--color-fg-muted);
131
+ }
132
+
133
+ :where([data-dds-context="marketing"]) .dds-teamgrid[data-ground="strong"] {
134
+ background-color: var(--color-bg-brand-strong);
135
+ color: var(--color-fg-on-brand-strong);
136
+ }
137
+
138
+ :where([data-dds-context="marketing"]) .dds-teamgrid[data-ground="strong"] .dds-teamgrid__media {
139
+ background-color: var(--color-bg-subtle-on-brand-strong);
140
+ }
141
+
142
+ :where([data-dds-context="marketing"]) .dds-teamgrid[data-ground="strong"] .dds-teamgrid__role {
143
+ color: var(--color-fg-muted-inverse);
144
+ }
145
+
146
+ :where([data-dds-context="marketing"]) .dds-teamgrid[data-ground="subtle"] {
147
+ background-color: var(--color-bg-page);
148
+ background-image: linear-gradient(var(--color-bg-band-subtle), var(--color-bg-band-subtle));
149
+ color: var(--color-fg-default);
150
+ }
151
+
152
+ :where([data-dds-context="marketing"]) .dds-teamgrid[data-ground="subtle"] .dds-teamgrid__media {
153
+ background-color: var(--color-bg-surface-card-raised);
154
+ }
155
+
156
+ :where([data-dds-context="marketing"]) .dds-teamgrid[data-ground="subtle"] .dds-teamgrid__role {
157
+ color: var(--color-fg-muted);
158
+ }
159
+
@@ -0,0 +1,28 @@
1
+ import './TeamGrid.css';
2
+ import './team-grid-impl.css';
3
+ import '../block-reveal.css';
4
+ import { type TeamGridProps } from './TeamGrid.types.js';
5
+ export type { TeamGridProps };
6
+ /**
7
+ * A heading over a grid of people — the reference design's Leaders template, AvatarGrid in its
8
+ * source.
9
+ *
10
+ * Each person is a square photograph over their name, their role and, where they have one, a link
11
+ * to a profile of theirs elsewhere. The people are records rather than cards the page composes: a
12
+ * person here is words and a picture, and the grid is what decides how each one is drawn.
13
+ *
14
+ * The first `collapsedCount` show at once and the rest wait behind a button under the grid. One
15
+ * list rather than the reference's two grids, so a screen reader counts the whole set and the
16
+ * order is the same whether it is open or not; the people past the count are in the markup from
17
+ * the first render and `hidden` until asked for, which takes them out of the accessibility tree
18
+ * and the tab order as well as off the page. The reference marked its hidden half `aria-hidden`
19
+ * only, and left their links in the tab order behind a collapsed row.
20
+ *
21
+ * Pressing the button leaves focus on it. The people it shows sit straight before it in reading
22
+ * order, so they are the next thing a reader moving back meets, and the people it hides take any
23
+ * focus they could have held away with them — which they cannot be holding, the button having it.
24
+ *
25
+ * `'use client'` for the button's state, for the arrival, and for `useId`, which names the region
26
+ * by its heading and gives the button the list's id to control.
27
+ */
28
+ export declare function TeamGrid({ ground, title, description, people, collapsedCount, expandLabel, collapseLabel, profileName, externalLabel, }: TeamGridProps): import("react").JSX.Element;
@@ -0,0 +1,74 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useId, useState } from 'react';
4
+ import './TeamGrid.css';
5
+ import './team-grid-impl.css';
6
+ import '../block-reveal.css';
7
+ import { given } from '../../given.js';
8
+ import { Button } from '../../core/button/Button.js';
9
+ import { Link } from '../../core/link/Link.js';
10
+ import { AspectRatio } from '../../layout/aspect-ratio/AspectRatio.js';
11
+ import { arriving, useReveal } from '../use-reveal.js';
12
+ import { teamGridDefaults, teamGridParts } from './TeamGrid.types.js';
13
+ /**
14
+ * A profile link's accessible name when the page gives none: the visible word, then whose it is.
15
+ *
16
+ * The word first, because it is what a reader using speech sees and says — "click LinkedIn" has to
17
+ * match — and the name after it, because "LinkedIn" alone is the same on every card and a list of
18
+ * links heard out of context would be one word repeated.
19
+ */
20
+ const profileNameOf = (person) => `${person.profile?.label ?? ''}, ${person.name}`;
21
+ /**
22
+ * Where a person comes in the arrival, capped so a long set does not keep a reader waiting.
23
+ *
24
+ * The heading and the line under it take the first two steps; the people showing follow a step
25
+ * apart up to the fourth, and the button arrives a step after the last of them. FeatureCards' cap,
26
+ * for its reason: block-reveal.css keeps a block's trail inside its own movement.
27
+ */
28
+ const FIRST_PERSON = 2;
29
+ const LAST_STEP = FIRST_PERSON + 3;
30
+ /**
31
+ * A heading over a grid of people — the reference design's Leaders template, AvatarGrid in its
32
+ * source.
33
+ *
34
+ * Each person is a square photograph over their name, their role and, where they have one, a link
35
+ * to a profile of theirs elsewhere. The people are records rather than cards the page composes: a
36
+ * person here is words and a picture, and the grid is what decides how each one is drawn.
37
+ *
38
+ * The first `collapsedCount` show at once and the rest wait behind a button under the grid. One
39
+ * list rather than the reference's two grids, so a screen reader counts the whole set and the
40
+ * order is the same whether it is open or not; the people past the count are in the markup from
41
+ * the first render and `hidden` until asked for, which takes them out of the accessibility tree
42
+ * and the tab order as well as off the page. The reference marked its hidden half `aria-hidden`
43
+ * only, and left their links in the tab order behind a collapsed row.
44
+ *
45
+ * Pressing the button leaves focus on it. The people it shows sit straight before it in reading
46
+ * order, so they are the next thing a reader moving back meets, and the people it hides take any
47
+ * focus they could have held away with them — which they cannot be holding, the button having it.
48
+ *
49
+ * `'use client'` for the button's state, for the arrival, and for `useId`, which names the region
50
+ * by its heading and gives the button the list's id to control.
51
+ */
52
+ export function TeamGrid({ ground = teamGridDefaults.ground, title, description, people, collapsedCount = teamGridDefaults.collapsedCount, expandLabel = teamGridDefaults.expandLabel, collapseLabel = teamGridDefaults.collapseLabel, profileName = profileNameOf, externalLabel = teamGridDefaults.externalLabel, }) {
53
+ const titleId = useId();
54
+ const listId = useId();
55
+ const [band, revealed] = useReveal();
56
+ const [expanded, setExpanded] = useState(false);
57
+ // A count below one would hide everyone behind the button; a fraction is not a number of people.
58
+ const shown = Math.max(1, Math.floor(collapsedCount));
59
+ const longer = people.length > shown;
60
+ const inverse = ground === 'strong';
61
+ return (_jsx("section", { className: teamGridParts.root, "data-ground": ground, "aria-labelledby": titleId, children: _jsxs("div", { className: teamGridParts.inner, ref: band, "data-revealed": revealed, children: [_jsxs("div", { className: teamGridParts.header, children: [_jsx("h2", { className: teamGridParts.title, id: titleId, ...arriving(0), children: title }), given(description) ? (_jsx("p", { className: teamGridParts.description, ...arriving(1), children: description })) : null] }), _jsxs("div", { className: teamGridParts.people, children: [_jsx("ul", { className: teamGridParts.list, id: listId, children: people.map((person, at) => {
62
+ const extra = at >= shown;
63
+ /* A person showing from the start arrives with the block. One past the count arrives
64
+ when the button shows them, by the stylesheet's own animation, a step behind the
65
+ one before — so it carries its place among the extras rather than the block's. */
66
+ const motion = extra
67
+ ? {
68
+ 'data-extra': '',
69
+ style: { '--dds-teamgrid-extra-at': at - shown },
70
+ }
71
+ : arriving(Math.min(FIRST_PERSON + at, LAST_STEP));
72
+ return (_jsxs("li", { className: teamGridParts.item, hidden: extra && !expanded, ...motion, children: [_jsx("div", { className: teamGridParts.media, children: _jsx(AspectRatio, { ratio: "square", children: _jsx("img", { src: person.image.src, alt: person.image.alt, loading: "lazy", decoding: "async" }) }) }), _jsxs("div", { className: teamGridParts.text, children: [_jsx("h3", { className: teamGridParts.name, children: person.name }), _jsx("p", { className: teamGridParts.role, children: person.role }), person.profile !== undefined ? (_jsx("div", { className: teamGridParts.profile, children: _jsx(Link, { href: person.profile.href, external: true, tone: inverse ? 'inherit' : 'brand', "aria-label": `${profileName(person)} ${externalLabel}`, children: person.profile.label }) })) : null] })] }, `${person.name}-${at}`));
73
+ }) }), longer ? (_jsx("div", { className: teamGridParts.actions, ...arriving(Math.min(FIRST_PERSON + shown, LAST_STEP + 1)), children: _jsx(Button, { variant: "secondary", size: "md", tone: inverse ? 'inverse' : 'default', "aria-expanded": expanded, "aria-controls": listId, onClick: () => setExpanded((open) => !open), children: expanded ? collapseLabel : expandLabel }) })) : null] })] }) }));
74
+ }