@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,32 @@
1
+ import './ImageBanner.css';
2
+ import './image-banner-impl.css';
3
+ import '../block-reveal.css';
4
+ import { type ImageBannerProps } from './ImageBanner.types.js';
5
+ export type { ImageBannerProps };
6
+ /**
7
+ * A dark card in the middle of a page, pairing a headline and a line under it with a photograph.
8
+ *
9
+ * The reference site's ImageBanner, and two of its layouts are `variant`: the photograph beside the
10
+ * words (split) or behind them (cover), each with one action. The reference's third, a collage
11
+ * beside a row of checked features with no action, is not offered: a set of features is a list a
12
+ * page composes, and FeatureBullets is that.
13
+ *
14
+ * The reference wrote each layout twice, `-left` and `-right`. Here that is `mediaPosition`, start
15
+ * and end, which is the axis FeatureSplit already names and the one a mirrored page reads without
16
+ * translating. The reference also ranged the words to the far edge on its right-hand layouts; they
17
+ * start here on either side, because a heading beside its content starts with it.
18
+ *
19
+ * The card is dark on every ground, which is what the block is for. `ground` paints the band around
20
+ * it the way every block's does, and on the dark band the card steps up to the strong card fill so
21
+ * it still reads as a card.
22
+ *
23
+ *
24
+ * The photograph is the page's. It is not hidden from assistive technology the way FeatureSplit's
25
+ * is: the reference asks for alt text where the photograph means something, so the page says
26
+ * whether it does, with an empty alt where it does not.
27
+ *
28
+ * It arrives the way every block does — the headline, the line, then the action, and
29
+ * the photograph after them. A cover photograph is the card's ground rather than a part of what it
30
+ * says, so it is there from the start and only the words arrive over it.
31
+ */
32
+ export declare function ImageBanner({ ground, variant, mediaPosition, parallax, title, headingLevel, description, action, media, }: ImageBannerProps): import("react").JSX.Element;
@@ -0,0 +1,41 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useId } from 'react';
4
+ import './ImageBanner.css';
5
+ import './image-banner-impl.css';
6
+ import '../block-reveal.css';
7
+ import { arriving, useReveal } from '../use-reveal.js';
8
+ import { given } from '../../given.js';
9
+ import { imageBannerDefaults, imageBannerParts } from './ImageBanner.types.js';
10
+ /**
11
+ * A dark card in the middle of a page, pairing a headline and a line under it with a photograph.
12
+ *
13
+ * The reference site's ImageBanner, and two of its layouts are `variant`: the photograph beside the
14
+ * words (split) or behind them (cover), each with one action. The reference's third, a collage
15
+ * beside a row of checked features with no action, is not offered: a set of features is a list a
16
+ * page composes, and FeatureBullets is that.
17
+ *
18
+ * The reference wrote each layout twice, `-left` and `-right`. Here that is `mediaPosition`, start
19
+ * and end, which is the axis FeatureSplit already names and the one a mirrored page reads without
20
+ * translating. The reference also ranged the words to the far edge on its right-hand layouts; they
21
+ * start here on either side, because a heading beside its content starts with it.
22
+ *
23
+ * The card is dark on every ground, which is what the block is for. `ground` paints the band around
24
+ * it the way every block's does, and on the dark band the card steps up to the strong card fill so
25
+ * it still reads as a card.
26
+ *
27
+ *
28
+ * The photograph is the page's. It is not hidden from assistive technology the way FeatureSplit's
29
+ * is: the reference asks for alt text where the photograph means something, so the page says
30
+ * whether it does, with an empty alt where it does not.
31
+ *
32
+ * It arrives the way every block does — the headline, the line, then the action, and
33
+ * the photograph after them. A cover photograph is the card's ground rather than a part of what it
34
+ * says, so it is there from the start and only the words arrive over it.
35
+ */
36
+ export function ImageBanner({ ground = imageBannerDefaults.ground, variant = imageBannerDefaults.variant, mediaPosition = imageBannerDefaults.mediaPosition, parallax = imageBannerDefaults.parallax, title, headingLevel = imageBannerDefaults.headingLevel, description, action, media, }) {
37
+ const titleId = useId();
38
+ const Title = headingLevel;
39
+ const [band, revealed] = useReveal();
40
+ return (_jsx("section", { className: imageBannerParts.root, "data-ground": ground, "data-variant": variant, "data-media-position": mediaPosition, "data-parallax": parallax, "aria-labelledby": titleId, children: _jsx("div", { className: imageBannerParts.inner, ref: band, "data-revealed": revealed, children: _jsxs("div", { className: imageBannerParts.card, children: [_jsxs("div", { className: imageBannerParts.content, children: [_jsx(Title, { className: imageBannerParts.title, id: titleId, ...arriving(0), children: title }), given(description) ? (_jsx("p", { className: imageBannerParts.description, ...arriving(1), children: description })) : null, action ? (_jsx("div", { className: imageBannerParts.action, ...arriving(2), children: action })) : null] }), _jsx("div", { className: imageBannerParts.media, ...(variant === 'cover' ? {} : arriving(3)), children: media })] }) }) }));
41
+ }
@@ -0,0 +1,54 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface ImageBannerOwnProps {
3
+ /**
4
+ * `page` — The default, and the page's own white, with the dark card set into it. Most of the time: the card is already the break
5
+ * `subtle` — The grey band, for a card that follows a white section the page wants told apart from this one. Painted as the band's tint laid over the page's own ground, so it is the same grey whatever is behind the section
6
+ * `strong` — `color.bg.brand-strong`, the dark band, with the card a step lighter at color.bg.surface-card-strong so it still reads as a card. For a page whose dark band is already here and wants the card inside it
7
+ */
8
+ ground?: 'page' | 'subtle' | 'strong';
9
+ /**
10
+ * `split` — The default. The words in one half and the photograph filling the other, edge to edge, with one action under the words. On a phone the card runs the width of the screen and the photograph stacks with the words
11
+ * `cover` — The photograph fills the whole card, with the words over it behind a scrim that darkens the side they are on and leaves the photograph clear on the other. For a photograph wide enough to be the band rather than half of it
12
+ */
13
+ variant?: 'split' | 'cover';
14
+ /**
15
+ * `end` — The default. The words lead and the photograph follows, which is the order the card argues in
16
+ * `start` — The photograph leads — the second of two cards on a page, or a photograph whose subject faces the words. A split card puts it above the words on a phone as well, as the reference design does
17
+ */
18
+ mediaPosition?: 'end' | 'start';
19
+ /** Always. The one thing the card says, in under eight words — "Join our global community". */
20
+ title: string;
21
+ /**
22
+ * `h2` — The default: the card is a section of the page, under the page's own h1
23
+ * `h3` — The card sits inside a section that already carries the h2 it belongs to
24
+ */
25
+ headingLevel?: 'h2' | 'h3';
26
+ /** The line under the headline saying what it means for the reader, in one or two sentences. */
27
+ description?: string;
28
+ /** The one thing the card asks for. The card is dark in both themes, so a Button here takes tone="inverse": the primary is the coral fill and it is the card's one primary. On a phone it fills the width of the card. */
29
+ action?: ReactNode;
30
+ /** Always. The page's photograph, through AspectRatio or as an image — people or product. Split and cover crop it to fill the space they give it. Alt text is the page's to give, empty where the photograph is decoration. */
31
+ media: ReactNode;
32
+ /** The photograph drifts against the scroll as the card passes through the view, by motion.distance.drift over the whole pass, so it reads as further away than the card — the reference design's ParallaxBanner, which this replaces. For a careers or about page, where the photograph of the people is the point. Off by default: a card selling one action does not need its picture moving under the button. */
33
+ parallax?: boolean;
34
+ }
35
+ export type ImageBannerProps = ImageBannerOwnProps;
36
+ /** The class each part carries. Apply these — do not retype them. */
37
+ export declare const imageBannerParts: {
38
+ readonly root: "dds-imagebanner";
39
+ readonly inner: "dds-imagebanner__inner";
40
+ readonly card: "dds-imagebanner__card";
41
+ readonly content: "dds-imagebanner__content";
42
+ readonly title: "dds-imagebanner__title";
43
+ readonly description: "dds-imagebanner__description";
44
+ readonly action: "dds-imagebanner__action";
45
+ readonly media: "dds-imagebanner__media";
46
+ };
47
+ /** Generated so defaults cannot drift from the contract. */
48
+ export declare const imageBannerDefaults: {
49
+ readonly ground: "page";
50
+ readonly variant: "split";
51
+ readonly mediaPosition: "end";
52
+ readonly headingLevel: "h2";
53
+ readonly parallax: false;
54
+ };
@@ -0,0 +1,14 @@
1
+ // GENERATED from image-banner.contract.json. Do not edit.
2
+ /** The class each part carries. Apply these — do not retype them. */
3
+ export const imageBannerParts = {
4
+ root: 'dds-imagebanner',
5
+ inner: 'dds-imagebanner__inner',
6
+ card: 'dds-imagebanner__card',
7
+ content: 'dds-imagebanner__content',
8
+ title: 'dds-imagebanner__title',
9
+ description: 'dds-imagebanner__description',
10
+ action: 'dds-imagebanner__action',
11
+ media: 'dds-imagebanner__media',
12
+ };
13
+ /** Generated so defaults cannot drift from the contract. */
14
+ export const imageBannerDefaults = { ground: 'page', variant: 'split', mediaPosition: 'end', headingLevel: 'h2', parallax: false };
@@ -0,0 +1,281 @@
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
+ * A title with nothing under it carries no step under it.
10
+ *
11
+ * The steps inside the column sit on each part's own `margin-block-end`, as FeatureSplit's do,
12
+ * because title-to-description and description-to-what-follows are two roles. With nothing after
13
+ * the title or the line, that step is measured against nothing, so the last of them drops it.
14
+ */
15
+ :where([data-dds-context="marketing"]) .dds-imagebanner .dds-imagebanner__title:last-child,
16
+ :where([data-dds-context="marketing"]) .dds-imagebanner .dds-imagebanner__description:last-child {
17
+ margin-block-end: 0;
18
+ }
19
+
20
+ /*
21
+ * One column below the fold.
22
+ *
23
+ * The row direction is the contract's to say, and the generated sheet carries both values. What is
24
+ * left here is the fold, which `structure` has no width to attach to. Written an attribute deeper
25
+ * than the generated rule — `.dds-imagebanner[data-media-position="end"] .dds-imagebanner__card` —
26
+ * so it wins however the two sheets are ordered.
27
+ *
28
+ * The words lead, except on a split card whose photograph was asked to lead: the reference design
29
+ * puts that photograph above the words on a phone as well, which is the one place this block
30
+ * differs from FeatureSplit's words-first fold.
31
+ *
32
+ * `48rem` longhand because `var()` is not permitted in a container query condition, and it is the
33
+ * width the rest of this package folds at.
34
+ */
35
+ @container (max-width: 47.9375rem) {
36
+ :where([data-dds-context="marketing"])
37
+ .dds-imagebanner[data-variant][data-media-position]
38
+ .dds-imagebanner__card {
39
+ flex-direction: column;
40
+ }
41
+
42
+ :where([data-dds-context="marketing"])
43
+ .dds-imagebanner[data-variant="split"][data-media-position="start"]
44
+ .dds-imagebanner__card {
45
+ flex-direction: column-reverse;
46
+ }
47
+
48
+ /*
49
+ * A split or cover card runs the width of a phone, as the reference design's does: the gutter
50
+ * goes, and so do the corners, which at the screen's edge would round into nothing.
51
+ */
52
+ :where([data-dds-context="marketing"]) .dds-imagebanner .dds-imagebanner__inner {
53
+ padding-inline: 0;
54
+ }
55
+
56
+ :where([data-dds-context="marketing"]) .dds-imagebanner .dds-imagebanner__card {
57
+ border-radius: var(--radius-none);
58
+ }
59
+
60
+ /*
61
+ * The action fills the card's width on a phone, and the row is what does it: it becomes a column
62
+ * and stretches what it holds, so the Button is full width here and its own size from the fold.
63
+ * That is the package's rule for a section's actions, a single one included.
64
+ */
65
+ :where([data-dds-context="marketing"]) .dds-imagebanner .dds-imagebanner__action {
66
+ align-items: stretch;
67
+ flex-direction: column;
68
+ }
69
+
70
+ :where([data-dds-context="marketing"]) .dds-imagebanner .dds-imagebanner__action > * {
71
+ inline-size: 100%;
72
+ }
73
+
74
+ }
75
+
76
+ /*
77
+ * The words take half the card at full width and the photograph the rest.
78
+ *
79
+ * Split is side by side from the fold. It stretches the photograph to the card's height and asks a
80
+ * height of the card, size.image-banner.card, so a short line beside a wide photograph is still a
81
+ * band rather than a strip; the landscape ratio the phone uses is let go, since the card now decides
82
+ * the photograph's shape.
83
+ */
84
+ @container (min-width: 48rem) {
85
+ :where([data-dds-context="marketing"]) .dds-imagebanner .dds-imagebanner__content {
86
+ flex: 1 1 0;
87
+ }
88
+
89
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="split"] .dds-imagebanner__card {
90
+ min-block-size: var(--size-image-banner-card);
91
+ }
92
+
93
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant] .dds-imagebanner__media {
94
+ flex: 1 1 0;
95
+ }
96
+
97
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="split"] .dds-imagebanner__media {
98
+ aspect-ratio: auto;
99
+ }
100
+
101
+ /*
102
+ * The cover card's words hold three fifths of it, on the side away from where the photograph
103
+ * shows clear — the reference design's measure.
104
+ */
105
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"] .dds-imagebanner__content {
106
+ flex: 0 1 60%;
107
+ }
108
+
109
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant] .dds-imagebanner__action {
110
+ align-items: center;
111
+ flex-direction: row;
112
+ }
113
+ }
114
+
115
+ /*
116
+ * More room inside the card once it is a desktop's width, as the reference design gives it.
117
+ */
118
+ @container (min-width: 64rem) {
119
+ :where([data-dds-context="marketing"]) .dds-imagebanner .dds-imagebanner__content {
120
+ padding: var(--space-inset-2xl);
121
+ }
122
+ }
123
+
124
+ /*
125
+ * Whatever the page put in a split photograph fills it.
126
+ *
127
+ * The slot takes a node, so what arrives is the page's element — an AspectRatio box or an image —
128
+ * and this cannot know whether it carries dimensions. `cover`, because the half is a shape the card
129
+ * decided on and a photograph letterboxed in it would show the card through the gaps.
130
+ */
131
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="split"] .dds-imagebanner__media > *,
132
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="split"] .dds-imagebanner__media img,
133
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"] .dds-imagebanner__media > *,
134
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"] .dds-imagebanner__media img {
135
+ block-size: 100%;
136
+ inline-size: 100%;
137
+ object-fit: cover;
138
+ }
139
+
140
+ /*
141
+ * Bare media is a block; a component keeps its own display.
142
+ *
143
+ * `display: block` is for what arrives as a raw element — an image, a video, an inline SVG — which
144
+ * sits on a text baseline otherwise and leaves a gap under it. Written at no weight at all, so a
145
+ * component the page placed here — an IllustrationScene, whose grid lays its pane over its photo —
146
+ * keeps the display its own sheet gives it. In the rule above, a class deeper than the component's
147
+ * root, it turned the scene's grid into a block, and the pane fell below the photo and was clipped.
148
+ */
149
+ :where([data-dds-context="marketing"] .dds-imagebanner .dds-imagebanner__media > *, [data-dds-context="marketing"] .dds-imagebanner .dds-imagebanner__media img) {
150
+ display: block;
151
+ }
152
+
153
+
154
+ /*
155
+ * The cover photograph is the card's ground: it fills the card behind the words, and the words are
156
+ * stacked over it. A stacking order is an integer, which is why it is here rather than bound.
157
+ *
158
+ * The card asks a height so the photograph has somewhere to show, size.image-banner.card at every
159
+ * width — the reference design's band.
160
+ */
161
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"] .dds-imagebanner__card {
162
+ min-block-size: var(--size-image-banner-card);
163
+ }
164
+
165
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"] .dds-imagebanner__media {
166
+ inset: 0;
167
+ position: absolute;
168
+ z-index: 0;
169
+ }
170
+
171
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"] .dds-imagebanner__content {
172
+ z-index: 1;
173
+ }
174
+
175
+ /*
176
+ * The scrim over the cover photograph, darkest where the words are.
177
+ *
178
+ * color.bg.overlay held across the whole of the words' column — three fifths of the card, the
179
+ * content's share — so white body copy keeps AA over even a pale photograph; then
180
+ * color.bg.overlay-subtle, the role for an image overlay, and clear at the far side, so the
181
+ * photograph shows where nothing is written on it. Darkest only at the words' edge was not enough:
182
+ * over a light photograph the end of a line of copy sat at about 2:1.
183
+ * On a phone the words are at the top across the whole width, so the scrim runs down rather than
184
+ * across.
185
+ *
186
+ * A gradient takes a physical direction — there is no `to inline-end` — so the direction is a
187
+ * custom property set once per case: toward the photograph's side, and mirrored under `:dir(rtl)`,
188
+ * which is the package's rule for a pattern that must follow the reading direction. Set on the
189
+ * photograph rather than the section, because a container query styles what is inside the
190
+ * container and never the container itself.
191
+ *
192
+ * The words need no rule to change sides: the photograph is out of flow behind them, so the row
193
+ * `mediaPosition` sets holds the words alone, at the start or, reversed, at the end.
194
+ */
195
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"] .dds-imagebanner__media::after {
196
+ background-image: linear-gradient(
197
+ var(--dds-imagebanner-scrim-toward, to bottom),
198
+ var(--color-bg-overlay),
199
+ var(--color-bg-overlay) 60%,
200
+ var(--color-bg-overlay-subtle) 80%,
201
+ transparent
202
+ );
203
+ content: '';
204
+ inset: 0;
205
+ pointer-events: none;
206
+ position: absolute;
207
+ }
208
+
209
+ @container (min-width: 48rem) {
210
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"][data-media-position="end"] .dds-imagebanner__media {
211
+ --dds-imagebanner-scrim-toward: to right;
212
+ }
213
+
214
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"][data-media-position="start"] .dds-imagebanner__media {
215
+ --dds-imagebanner-scrim-toward: to left;
216
+ }
217
+
218
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"][data-media-position="end"]:dir(rtl) .dds-imagebanner__media {
219
+ --dds-imagebanner-scrim-toward: to left;
220
+ }
221
+
222
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"][data-media-position="start"]:dir(rtl) .dds-imagebanner__media {
223
+ --dds-imagebanner-scrim-toward: to right;
224
+ }
225
+ }
226
+
227
+ /*
228
+ * `parallax`: the photograph drifts against the scroll as the card passes through the view — the
229
+ * reference design's ParallaxBanner, folded in here as an option on the split and cover cards.
230
+ *
231
+ * The photograph is drawn taller than its frame by the drift, half above and half below, so the
232
+ * movement never shows an edge at either end; the frame clips it. The image itself is the thing
233
+ * that moves, so the frame keeps its size and the card its layout.
234
+ *
235
+ * Scroll-driven, the way LogoColumns moves its wall: the frame names a view timeline and the image
236
+ * runs down it from half the drift above centre to half below, over the whole pass (`cover`), so as
237
+ * the page carries the card up the photograph falls behind a little and reads as further away.
238
+ * Linear, because the scroll is the easing. The card and the frame clip with `overflow: clip`, not
239
+ * `hidden`: `hidden` makes a box a scroll container, and a view timeline measured against one that
240
+ * never scrolls stands still.
241
+ *
242
+ * A browser with no scroll timeline, and a reader who asked for less motion, get the photograph
243
+ * still and centred, as with `parallax` off.
244
+ */
245
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-parallax="true"]:is([data-variant="split"], [data-variant="cover"]) .dds-imagebanner__media img {
246
+ block-size: calc(100% + var(--motion-distance-drift));
247
+ margin-block-start: calc(var(--motion-distance-drift) / -2);
248
+ object-position: center top;
249
+ }
250
+
251
+ @keyframes dds-imagebanner-drift {
252
+ from {
253
+ translate: 0 calc(var(--motion-distance-drift) / -2);
254
+ }
255
+ to {
256
+ translate: 0 calc(var(--motion-distance-drift) / 2);
257
+ }
258
+ }
259
+
260
+ @supports (animation-timeline: view()) {
261
+ :where([data-dds-context="marketing"]) .dds-imagebanner .dds-imagebanner__media {
262
+ view-timeline: --dds-imagebanner-frame block;
263
+ }
264
+
265
+ /* Only for a reader who has not asked for less motion — asked here, around the rule, rather than
266
+ undone after it: the drift's selector outweighs any plain reset, and a reset that loses to it
267
+ leaves the photograph moving for exactly the reader who asked it not to. */
268
+ @media (prefers-reduced-motion: no-preference) {
269
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-parallax="true"]:is([data-variant="split"], [data-variant="cover"]) .dds-imagebanner__media img {
270
+ animation: dds-imagebanner-drift linear both;
271
+ animation-range: cover;
272
+ animation-timeline: --dds-imagebanner-frame;
273
+ }
274
+ }
275
+ }
276
+
277
+ @media (prefers-reduced-motion: reduce) {
278
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-parallax="true"]:is([data-variant="split"], [data-variant="cover"]) .dds-imagebanner__media img {
279
+ animation: none;
280
+ }
281
+ }
@@ -7,6 +7,7 @@
7
7
  inline-size: 100%;
8
8
  justify-content: center;
9
9
  overflow: hidden;
10
+ overflow-wrap: anywhere;
10
11
  position: relative;
11
12
  background-color: var(--color-bg-brand-strong);
12
13
  color: var(--color-fg-on-brand-strong);
@@ -38,4 +38,4 @@ export type { LandingHeroProps };
38
38
  * title and the description; a photograph that carried meaning they do not would be a hero that
39
39
  * reads as empty to anyone who cannot see it, and the contract says so.
40
40
  */
41
- export declare function LandingHero({ eyebrow, title, headingLevel, description, actions, media, backgroundImage, }: LandingHeroProps): import("react").JSX.Element;
41
+ export declare function LandingHero({ eyebrow, title, headingLevel, description, actions, media, backgroundImage, background, }: LandingHeroProps): import("react").JSX.Element;
@@ -6,6 +6,7 @@ import './landing-hero-impl.css';
6
6
  import '../block-reveal.css';
7
7
  import { arriving, useReveal } from '../use-reveal.js';
8
8
  import { given } from '../../given.js';
9
+ import { Background } from '../../core/background/Background.js';
9
10
  import { landingHeroDefaults, landingHeroParts, } from './LandingHero.types.js';
10
11
  /**
11
12
  * The band that opens a marketing page.
@@ -42,13 +43,13 @@ import { landingHeroDefaults, landingHeroParts, } from './LandingHero.types.js';
42
43
  * title and the description; a photograph that carried meaning they do not would be a hero that
43
44
  * reads as empty to anyone who cannot see it, and the contract says so.
44
45
  */
45
- export function LandingHero({ eyebrow, title, headingLevel = landingHeroDefaults.headingLevel, description, actions, media, backgroundImage, }) {
46
+ export function LandingHero({ eyebrow, title, headingLevel = landingHeroDefaults.headingLevel, description, actions, media, backgroundImage, background, }) {
46
47
  const titleId = useId();
47
48
  const [band, revealed] = useReveal();
48
49
  const Title = headingLevel === 'h2' ? 'h2' : 'h1';
49
- return (_jsxs("section", { className: landingHeroParts.root, "aria-labelledby": titleId,
50
+ return (_jsxs("section", { className: landingHeroParts.root, "data-background": background, "aria-labelledby": titleId,
50
51
  /* The one inline style here, and it is a value rather than a decision: which photograph,
51
52
  supplied by the page. Everything about how it is drawn — the cover fit and the position — is in the stylesheet, where it can be reasoned about. A background shorthand
52
53
  would have reset those four properties every time the page passed an image. */
53
- style: given(backgroundImage) ? { backgroundImage: `url(${backgroundImage})` } : undefined, children: [media ? (_jsx("div", { className: landingHeroParts.media, "aria-hidden": "true", children: media })) : null, _jsx("div", { className: landingHeroParts.inner, ref: band, "data-revealed": revealed, children: _jsxs("div", { className: landingHeroParts.content, children: [_jsxs("div", { className: landingHeroParts.text, children: [given(eyebrow) ? (_jsx("p", { className: landingHeroParts.eyebrow, ...arriving(0), children: eyebrow })) : null, _jsx(Title, { className: landingHeroParts.title, ...arriving(1), id: titleId, children: title }), given(description) ? (_jsx("p", { className: landingHeroParts.description, ...arriving(2), children: description })) : null] }), actions ? (_jsx("div", { className: landingHeroParts.actions, ...arriving(3), children: actions })) : null] }) })] }));
54
+ style: given(backgroundImage) ? { backgroundImage: `url(${backgroundImage})` } : undefined, children: [background === 'halftone' ? _jsx(Background, { tone: "dark", children: null }) : null, media ? (_jsx("div", { className: landingHeroParts.media, "aria-hidden": "true", children: media })) : null, _jsx("div", { className: landingHeroParts.inner, ref: band, "data-revealed": revealed, children: _jsxs("div", { className: landingHeroParts.content, children: [_jsxs("div", { className: landingHeroParts.text, children: [given(eyebrow) ? (_jsx("p", { className: landingHeroParts.eyebrow, ...arriving(0), children: eyebrow })) : null, _jsx(Title, { className: landingHeroParts.title, ...arriving(1), id: titleId, children: title }), given(description) ? (_jsx("p", { className: landingHeroParts.description, ...arriving(2), children: description })) : null] }), actions ? (_jsx("div", { className: landingHeroParts.actions, ...arriving(3), children: actions })) : null] }) })] }));
54
55
  }
@@ -15,10 +15,14 @@ export interface LandingHeroOwnProps {
15
15
  actions?: ReactNode;
16
16
  /** The band's visual — the subject standing beside the claim, cropped by the band's own inline edge rather than floating clear of it */
17
17
  media?: ReactNode;
18
- /** A photograph filling the whole band. It is shown as it is — nothing is painted over it, so choose one already dark enough that the title reads on it */
19
- backgroundImage?: string;
20
18
  }
21
- export type LandingHeroProps = LandingHeroOwnProps;
19
+ export type LandingHeroProps = LandingHeroOwnProps & ({
20
+ background?: 'halftone';
21
+ backgroundImage?: undefined;
22
+ } | {
23
+ background?: undefined;
24
+ backgroundImage?: string;
25
+ });
22
26
  /** The class each part carries. Apply these — do not retype them. */
23
27
  export declare const landingHeroParts: {
24
28
  readonly root: "dds-landinghero";
@@ -7,6 +7,7 @@
7
7
  inline-size: 100%;
8
8
  justify-content: center;
9
9
  overflow: clip;
10
+ overflow-wrap: anywhere;
10
11
  }
11
12
 
12
13
  :where([data-dds-context="marketing"]) .dds-logocolumns .dds-logocolumns__inner {
@@ -7,6 +7,7 @@
7
7
  inline-size: 100%;
8
8
  justify-content: center;
9
9
  overflow: clip;
10
+ overflow-wrap: anywhere;
10
11
  }
11
12
 
12
13
  :where([data-dds-context="marketing"]) .dds-logorows .dds-logorows__inner {
@@ -7,6 +7,7 @@
7
7
  inline-size: 100%;
8
8
  justify-content: center;
9
9
  overflow: hidden;
10
+ overflow-wrap: anywhere;
10
11
  position: relative;
11
12
  background-color: var(--color-bg-brand-strong);
12
13
  color: var(--color-fg-on-brand-strong);
@@ -31,4 +31,4 @@ export type { PageHeaderProps };
31
31
  * region landmark once it has a name, and a band that announced itself as an unnamed section is one
32
32
  * more thing a screen reader user walks through rather than a place they can skip to.
33
33
  */
34
- export declare function PageHeader({ eyebrow, title, headingLevel, description, actions, }: PageHeaderProps): import("react").JSX.Element;
34
+ export declare function PageHeader({ eyebrow, title, headingLevel, description, actions, background, }: PageHeaderProps): import("react").JSX.Element;
@@ -6,6 +6,7 @@ import './page-header-impl.css';
6
6
  import '../block-reveal.css';
7
7
  import { arriving, useReveal } from '../use-reveal.js';
8
8
  import { given } from '../../given.js';
9
+ import { Background } from '../../core/background/Background.js';
9
10
  import { pageHeaderDefaults, pageHeaderParts } from './PageHeader.types.js';
10
11
  /**
11
12
  * The band that opens a company or a legal page.
@@ -35,9 +36,9 @@ import { pageHeaderDefaults, pageHeaderParts } from './PageHeader.types.js';
35
36
  * region landmark once it has a name, and a band that announced itself as an unnamed section is one
36
37
  * more thing a screen reader user walks through rather than a place they can skip to.
37
38
  */
38
- export function PageHeader({ eyebrow, title, headingLevel = pageHeaderDefaults.headingLevel, description, actions, }) {
39
+ export function PageHeader({ eyebrow, title, headingLevel = pageHeaderDefaults.headingLevel, description, actions, background = pageHeaderDefaults.background, }) {
39
40
  const titleId = useId();
40
41
  const [band, revealed] = useReveal();
41
42
  const Title = headingLevel === 'h2' ? 'h2' : 'h1';
42
- return (_jsx("section", { className: pageHeaderParts.root, "aria-labelledby": titleId, children: _jsx("div", { className: pageHeaderParts.inner, ref: band, "data-revealed": revealed, children: _jsxs("div", { className: pageHeaderParts.content, children: [_jsxs("div", { className: pageHeaderParts.text, children: [given(eyebrow) ? (_jsx("p", { className: pageHeaderParts.eyebrow, ...arriving(0), children: eyebrow })) : null, _jsx(Title, { className: pageHeaderParts.title, ...arriving(1), id: titleId, children: title }), given(description) ? (_jsx("p", { className: pageHeaderParts.description, ...arriving(2), children: description })) : null] }), actions ? (_jsx("div", { className: pageHeaderParts.actions, ...arriving(3), children: actions })) : null] }) }) }));
43
+ return (_jsxs("section", { className: pageHeaderParts.root, "data-background": background, "aria-labelledby": titleId, children: [_jsx(Background, { tone: "dark", pattern: background, children: null }), _jsx("div", { className: pageHeaderParts.inner, ref: band, "data-revealed": revealed, children: _jsxs("div", { className: pageHeaderParts.content, children: [_jsxs("div", { className: pageHeaderParts.text, children: [given(eyebrow) ? (_jsx("p", { className: pageHeaderParts.eyebrow, ...arriving(0), children: eyebrow })) : null, _jsx(Title, { className: pageHeaderParts.title, ...arriving(1), id: titleId, children: title }), given(description) ? (_jsx("p", { className: pageHeaderParts.description, ...arriving(2), children: description })) : null] }), actions ? (_jsx("div", { className: pageHeaderParts.actions, ...arriving(3), children: actions })) : null] }) })] }));
43
44
  }
@@ -13,6 +13,11 @@ export interface PageHeaderOwnProps {
13
13
  description?: string;
14
14
  /** The one or two things the page wants a reader to do. Composed by the page rather than described to this component, so a call to action is the same Button here as anywhere else on the site */
15
15
  actions?: ReactNode;
16
+ /**
17
+ * `grid` — The default: the band's rule grid, lit — hairlines a pitch apart rising from a soft bloom at the band's foot, a brighter point where two lines cross and a short dash of light running along every few, brightening around the pointer. Drawn by Background as a layer under the content; before its shader has drawn, and where it cannot, the same rules painted by the stylesheet, so the band is never bare.
18
+ * `halftone` — A halftone drawn behind the band's content: coral dots blending to white at the glow's heart, on the band's own dark ground, following the pointer over the band. Drawn by Background, placed as a layer under the content, so the band's own layout is untouched. It replaces the grid rather than joining it: two patterns on one band are texture fighting texture.
19
+ */
20
+ background?: 'grid' | 'halftone';
16
21
  }
17
22
  export type PageHeaderProps = PageHeaderOwnProps;
18
23
  /** The class each part carries. Apply these — do not retype them. */
@@ -29,4 +34,5 @@ export declare const pageHeaderParts: {
29
34
  /** Generated so defaults cannot drift from the contract. */
30
35
  export declare const pageHeaderDefaults: {
31
36
  readonly headingLevel: "h1";
37
+ readonly background: "grid";
32
38
  };
@@ -11,4 +11,4 @@ export const pageHeaderParts = {
11
11
  actions: 'dds-pageheader__actions',
12
12
  };
13
13
  /** Generated so defaults cannot drift from the contract. */
14
- export const pageHeaderDefaults = { headingLevel: 'h1' };
14
+ export const pageHeaderDefaults = { headingLevel: 'h1', background: 'grid' };
@@ -174,3 +174,13 @@
174
174
  inline-size: auto;
175
175
  }
176
176
  }
177
+
178
+ /*
179
+ * With a pattern drawn the painted rule grid steps aside — which is always, now the lit grid is the
180
+ * band's default. The lit grid paints the same rules itself until its shader has drawn, and two
181
+ * patterns on one band are texture fighting texture. The rules above stay for a band rendered
182
+ * without the attribute, so it is never bare.
183
+ */
184
+ :where([data-dds-context="marketing"]) .dds-pageheader[data-background] {
185
+ background-image: none;
186
+ }
@@ -7,6 +7,7 @@
7
7
  inline-size: 100%;
8
8
  justify-content: center;
9
9
  overflow: hidden;
10
+ overflow-wrap: anywhere;
10
11
  position: relative;
11
12
  background-color: var(--color-bg-brand-strong);
12
13
  color: var(--color-fg-on-brand-strong);
@@ -78,9 +79,13 @@
78
79
 
79
80
  :where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__media {
80
81
  min-inline-size: 0;
81
- overflow: hidden;
82
+ overflow: clip;
82
83
  position: relative;
83
- aspect-ratio: var(--aspect-square);
84
- border-radius: var(--radius-none);
84
+ border-start-end-radius: var(--radius-container);
85
+ border-start-start-radius: var(--radius-container);
86
+ }
87
+
88
+ :where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__image {
89
+ display: block;
85
90
  }
86
91
 
@@ -32,4 +32,4 @@ export type { ProductHeroProps };
32
32
  * region landmark once it has a name, and a band that announced itself as an unnamed section is one
33
33
  * more thing a screen reader user walks through rather than a place they can skip to.
34
34
  */
35
- export declare function ProductHero({ eyebrow, title, headingLevel, description, actions, media, backgroundImage, }: ProductHeroProps): import("react").JSX.Element;
35
+ export declare function ProductHero({ eyebrow, title, headingLevel, description, actions, image, media, backgroundImage, }: ProductHeroProps): import("react").JSX.Element;