@deriv-com/dds-marketing 1.1.3 → 1.2.1

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 (289) hide show
  1. package/.llm/components/accordion.md +6 -0
  2. package/.llm/components/accordionitem.md +6 -0
  3. package/.llm/components/aspectratio.md +6 -0
  4. package/.llm/components/awards.md +6 -0
  5. package/.llm/components/background.md +49 -10
  6. package/.llm/components/badge.md +6 -0
  7. package/.llm/components/bottomsheet.md +6 -0
  8. package/.llm/components/breadcrumb.md +6 -0
  9. package/.llm/components/breadcrumbitem.md +6 -0
  10. package/.llm/components/button.md +9 -3
  11. package/.llm/components/buttonicon.md +7 -1
  12. package/.llm/components/card.md +6 -0
  13. package/.llm/components/cardbody.md +7 -1
  14. package/.llm/components/cardbutton.md +6 -0
  15. package/.llm/components/checkbox.md +6 -0
  16. package/.llm/components/comparisoncards.md +9 -3
  17. package/.llm/components/comparisontable.md +6 -0
  18. package/.llm/components/ctabanner.md +6 -0
  19. package/.llm/components/ctabannerslider.md +6 -0
  20. package/.llm/components/datatable.md +6 -0
  21. package/.llm/components/divider.md +6 -0
  22. package/.llm/components/documentlink.md +237 -0
  23. package/.llm/components/documents.md +268 -0
  24. package/.llm/components/downloadbanner.md +7 -1
  25. package/.llm/components/dropdownmenu.md +6 -0
  26. package/.llm/components/estimator.md +6 -0
  27. package/.llm/components/faqaccordion.md +6 -0
  28. package/.llm/components/featurebullets.md +6 -0
  29. package/.llm/components/featurecards.md +42 -2
  30. package/.llm/components/featurecardscarousel.md +7 -1
  31. package/.llm/components/featurescroll.md +6 -0
  32. package/.llm/components/featuresplit.md +6 -0
  33. package/.llm/components/featurestack.md +6 -0
  34. package/.llm/components/featuretabs.md +369 -0
  35. package/.llm/components/filterchip.md +6 -0
  36. package/.llm/components/footer.md +6 -0
  37. package/.llm/components/footergroup.md +6 -0
  38. package/.llm/components/grid.md +30 -1
  39. package/.llm/components/icon.md +6 -0
  40. package/.llm/components/illustrationcard.md +52 -2
  41. package/.llm/components/illustrationcheck.md +193 -0
  42. package/.llm/components/illustrationchoice.md +187 -0
  43. package/.llm/components/illustrationcode.md +192 -0
  44. package/.llm/components/illustrationlist.md +175 -0
  45. package/.llm/components/illustrationscene.md +29 -3
  46. package/.llm/components/imagebanner.md +30 -5
  47. package/.llm/components/landinghero.md +6 -0
  48. package/.llm/components/link.md +7 -1
  49. package/.llm/components/logocolumns.md +7 -1
  50. package/.llm/components/logorows.md +42 -2
  51. package/.llm/components/menuitem.md +6 -0
  52. package/.llm/components/navbar.md +6 -0
  53. package/.llm/components/navbaritem.md +6 -0
  54. package/.llm/components/navbarmenu.md +6 -0
  55. package/.llm/components/navbarmenugroup.md +6 -0
  56. package/.llm/components/navbarpanel.md +6 -0
  57. package/.llm/components/navbarswitcher.md +6 -0
  58. package/.llm/components/navbarswitcheroption.md +6 -0
  59. package/.llm/components/option.md +6 -0
  60. package/.llm/components/pageheader.md +6 -0
  61. package/.llm/components/pagination.md +6 -0
  62. package/.llm/components/paginationdots.md +6 -0
  63. package/.llm/components/producthero.md +6 -0
  64. package/.llm/components/progressbar.md +305 -0
  65. package/.llm/components/removablechip.md +6 -0
  66. package/.llm/components/resourcebanner.md +6 -0
  67. package/.llm/components/row.md +6 -0
  68. package/.llm/components/scenescroll.md +38 -24
  69. package/.llm/components/scenescrollword.md +267 -0
  70. package/.llm/components/scroller.md +6 -0
  71. package/.llm/components/searchinput.md +6 -0
  72. package/.llm/components/segmentedcontrol.md +28 -1
  73. package/.llm/components/segmentedcontrolitem.md +6 -0
  74. package/.llm/components/select.md +6 -0
  75. package/.llm/components/selectchip.md +6 -0
  76. package/.llm/components/spinner.md +6 -0
  77. package/.llm/components/stack.md +6 -0
  78. package/.llm/components/stats.md +46 -1
  79. package/.llm/components/statscarousel.md +227 -0
  80. package/.llm/components/statusdot.md +41 -1
  81. package/.llm/components/steps.md +6 -0
  82. package/.llm/components/stickycards.md +6 -0
  83. package/.llm/components/subdomainnavbar.md +6 -0
  84. package/.llm/components/tab.md +6 -0
  85. package/.llm/components/table.md +6 -0
  86. package/.llm/components/tablebody.md +6 -0
  87. package/.llm/components/tablecell.md +6 -0
  88. package/.llm/components/tablehead.md +6 -0
  89. package/.llm/components/tableheadercell.md +6 -0
  90. package/.llm/components/tablerow.md +6 -0
  91. package/.llm/components/tablist.md +6 -0
  92. package/.llm/components/teamgrid.md +6 -0
  93. package/.llm/components/testimonialrow.md +43 -3
  94. package/.llm/components/testimonialslider.md +8 -2
  95. package/.llm/components/textarea.md +6 -0
  96. package/.llm/components/textinput.md +6 -0
  97. package/.llm/components/textscroll.md +6 -0
  98. package/.llm/components/tiers.md +13 -7
  99. package/.llm/components/tooltip.md +6 -0
  100. package/.llm/components/typography.md +63 -1
  101. package/.llm/digest/background.md +14 -6
  102. package/.llm/digest/button.md +1 -1
  103. package/.llm/digest/buttonicon.md +1 -1
  104. package/.llm/digest/documentlink.md +52 -0
  105. package/.llm/digest/documents.md +51 -0
  106. package/.llm/digest/downloadbanner.md +1 -1
  107. package/.llm/digest/featurecards.md +7 -0
  108. package/.llm/digest/featuretabs.md +50 -0
  109. package/.llm/digest/grid.md +1 -0
  110. package/.llm/digest/illustrationcard.md +6 -1
  111. package/.llm/digest/illustrationcheck.md +42 -0
  112. package/.llm/digest/illustrationchoice.md +43 -0
  113. package/.llm/digest/illustrationcode.md +41 -0
  114. package/.llm/digest/illustrationlist.md +38 -0
  115. package/.llm/digest/illustrationscene.md +4 -2
  116. package/.llm/digest/imagebanner.md +9 -3
  117. package/.llm/digest/logocolumns.md +1 -1
  118. package/.llm/digest/logorows.md +8 -1
  119. package/.llm/digest/progressbar.md +56 -0
  120. package/.llm/digest/scenescroll.md +6 -5
  121. package/.llm/digest/scenescrollword.md +56 -0
  122. package/.llm/digest/segmentedcontrol.md +3 -0
  123. package/.llm/digest/stats.md +8 -0
  124. package/.llm/digest/statscarousel.md +48 -0
  125. package/.llm/digest/statusdot.md +7 -0
  126. package/.llm/digest/testimonialrow.md +8 -1
  127. package/.llm/digest/testimonialslider.md +1 -1
  128. package/.llm/digest/typography.md +18 -0
  129. package/.llm/index.md +14 -4
  130. package/.llm/rules.md +10 -0
  131. package/.llm/tokens.md +12 -3
  132. package/AGENTS.md +13 -2
  133. package/dist/components/arrival.d.ts +32 -0
  134. package/dist/components/arrival.js +140 -0
  135. package/dist/components/arrives.d.ts +17 -0
  136. package/dist/components/arrives.js +14 -0
  137. package/dist/components/blocks/awards/Awards.js +2 -27
  138. package/dist/components/blocks/block-pattern.css +23 -0
  139. package/dist/components/blocks/comparison-cards/comparison-cards-impl.css +29 -0
  140. package/dist/components/blocks/documents/Documents.css +90 -0
  141. package/dist/components/blocks/documents/Documents.d.ts +22 -0
  142. package/dist/components/blocks/documents/Documents.js +30 -0
  143. package/dist/components/blocks/documents/Documents.types.d.ts +37 -0
  144. package/dist/components/blocks/documents/Documents.types.js +14 -0
  145. package/dist/components/blocks/documents/documents-impl.css +103 -0
  146. package/dist/components/blocks/download-banner/DownloadBanner.css +1 -1
  147. package/dist/components/blocks/download-banner/DownloadBanner.types.d.ts +1 -1
  148. package/dist/components/blocks/feature-cards/FeatureCards.d.ts +2 -1
  149. package/dist/components/blocks/feature-cards/FeatureCards.js +10 -7
  150. package/dist/components/blocks/feature-cards/FeatureCards.types.d.ts +9 -1
  151. package/dist/components/blocks/feature-cards/feature-cards-impl.css +15 -3
  152. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.d.ts +1 -1
  153. package/dist/components/blocks/feature-cards-carousel/feature-cards-carousel-impl.css +12 -0
  154. package/dist/components/blocks/feature-tabs/FeatureTabs.css +100 -0
  155. package/dist/components/blocks/feature-tabs/FeatureTabs.d.ts +23 -0
  156. package/dist/components/blocks/feature-tabs/FeatureTabs.js +38 -0
  157. package/dist/components/blocks/feature-tabs/FeatureTabs.types.d.ts +35 -0
  158. package/dist/components/blocks/feature-tabs/FeatureTabs.types.js +14 -0
  159. package/dist/components/blocks/feature-tabs/feature-tabs-impl.css +53 -0
  160. package/dist/components/blocks/image-banner/ImageBanner.css +1 -1
  161. package/dist/components/blocks/image-banner/ImageBanner.d.ts +1 -1
  162. package/dist/components/blocks/image-banner/ImageBanner.js +2 -2
  163. package/dist/components/blocks/image-banner/ImageBanner.types.d.ts +9 -7
  164. package/dist/components/blocks/image-banner/ImageBanner.types.js +1 -1
  165. package/dist/components/blocks/image-banner/image-banner-impl.css +107 -29
  166. package/dist/components/blocks/laurel.d.ts +16 -0
  167. package/dist/components/blocks/laurel.js +28 -0
  168. package/dist/components/blocks/logo-columns/LogoColumns.css +1 -1
  169. package/dist/components/blocks/logo-columns/LogoColumns.types.d.ts +1 -1
  170. package/dist/components/blocks/logo-rows/LogoRows.css +1 -1
  171. package/dist/components/blocks/logo-rows/LogoRows.d.ts +2 -1
  172. package/dist/components/blocks/logo-rows/LogoRows.js +7 -4
  173. package/dist/components/blocks/logo-rows/LogoRows.types.d.ts +9 -1
  174. package/dist/components/blocks/pattern-tone.d.ts +11 -0
  175. package/dist/components/blocks/pattern-tone.js +7 -0
  176. package/dist/components/blocks/resource-banner/ResourceBanner.css +1 -1
  177. package/dist/components/blocks/scene-scroll/SceneScroll.css +1 -1
  178. package/dist/components/blocks/scene-scroll/SceneScroll.d.ts +7 -5
  179. package/dist/components/blocks/scene-scroll/SceneScroll.js +9 -7
  180. package/dist/components/blocks/scene-scroll/SceneScroll.types.d.ts +5 -5
  181. package/dist/components/blocks/scene-scroll/SceneScroll.types.js +1 -1
  182. package/dist/components/blocks/scene-scroll/scene-scroll-impl.css +139 -41
  183. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.css +105 -0
  184. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.d.ts +31 -0
  185. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.js +67 -0
  186. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.types.d.ts +39 -0
  187. package/dist/components/blocks/scene-scroll-word/SceneScrollWord.types.js +18 -0
  188. package/dist/components/blocks/scene-scroll-word/scene-scroll-word-impl.css +370 -0
  189. package/dist/components/blocks/stats/Stats.d.ts +2 -1
  190. package/dist/components/blocks/stats/Stats.js +17 -14
  191. package/dist/components/blocks/stats/Stats.types.d.ts +8 -0
  192. package/dist/components/blocks/stats/stats-impl.css +31 -2
  193. package/dist/components/blocks/stats/use-wheel.d.ts +1 -1
  194. package/dist/components/blocks/stats/use-wheel.js +8 -4
  195. package/dist/components/blocks/stats-carousel/StatsCarousel.css +209 -0
  196. package/dist/components/blocks/stats-carousel/StatsCarousel.d.ts +20 -0
  197. package/dist/components/blocks/stats-carousel/StatsCarousel.js +48 -0
  198. package/dist/components/blocks/stats-carousel/StatsCarousel.types.d.ts +43 -0
  199. package/dist/components/blocks/stats-carousel/StatsCarousel.types.js +23 -0
  200. package/dist/components/blocks/stats-carousel/stats-carousel-impl.css +233 -0
  201. package/dist/components/blocks/sticky-cards/sticky-cards-impl.css +8 -0
  202. package/dist/components/blocks/testimonial-row/TestimonialRow.css +1 -1
  203. package/dist/components/blocks/testimonial-row/TestimonialRow.d.ts +2 -1
  204. package/dist/components/blocks/testimonial-row/TestimonialRow.js +16 -13
  205. package/dist/components/blocks/testimonial-row/TestimonialRow.types.d.ts +9 -1
  206. package/dist/components/blocks/testimonial-slider/TestimonialSlider.css +1 -1
  207. package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.d.ts +1 -1
  208. package/dist/components/blocks/tiers/Tiers.types.d.ts +1 -1
  209. package/dist/components/core/background/Background.css +19 -0
  210. package/dist/components/core/background/Background.types.d.ts +2 -1
  211. package/dist/components/core/background/background-impl.css +47 -15
  212. package/dist/components/core/background/halftone.js +1 -1
  213. package/dist/components/core/button/Button.css +5 -5
  214. package/dist/components/core/button-icon/ButtonIcon.types.d.ts +1 -1
  215. package/dist/components/core/card-body/CardBody.css +5 -0
  216. package/dist/components/core/card-body/CardBody.types.d.ts +1 -1
  217. package/dist/components/core/document-link/DocumentLink.css +59 -0
  218. package/dist/components/core/document-link/DocumentLink.d.ts +19 -0
  219. package/dist/components/core/document-link/DocumentLink.js +21 -0
  220. package/dist/components/core/document-link/DocumentLink.types.d.ts +41 -0
  221. package/dist/components/core/document-link/DocumentLink.types.js +11 -0
  222. package/dist/components/core/document-link/document-link-impl.css +23 -0
  223. package/dist/components/core/illustration-card/IllustrationCard.css +7 -0
  224. package/dist/components/core/illustration-card/IllustrationCard.d.ts +5 -1
  225. package/dist/components/core/illustration-card/IllustrationCard.js +34 -8
  226. package/dist/components/core/illustration-card/IllustrationCard.types.d.ts +8 -1
  227. package/dist/components/core/illustration-card/IllustrationCard.types.js +1 -0
  228. package/dist/components/core/illustration-card/illustration-card-impl.css +117 -3
  229. package/dist/components/core/illustration-check/IllustrationCheck.css +25 -0
  230. package/dist/components/core/illustration-check/IllustrationCheck.d.ts +16 -0
  231. package/dist/components/core/illustration-check/IllustrationCheck.js +22 -0
  232. package/dist/components/core/illustration-check/IllustrationCheck.types.d.ts +25 -0
  233. package/dist/components/core/illustration-check/IllustrationCheck.types.js +9 -0
  234. package/dist/components/core/illustration-check/illustration-check-impl.css +76 -0
  235. package/dist/components/core/illustration-choice/IllustrationChoice.css +62 -0
  236. package/dist/components/core/illustration-choice/IllustrationChoice.d.ts +16 -0
  237. package/dist/components/core/illustration-choice/IllustrationChoice.js +31 -0
  238. package/dist/components/core/illustration-choice/IllustrationChoice.types.d.ts +25 -0
  239. package/dist/components/core/illustration-choice/IllustrationChoice.types.js +11 -0
  240. package/dist/components/core/illustration-choice/illustration-choice-impl.css +103 -0
  241. package/dist/components/core/illustration-code/IllustrationCode.css +25 -0
  242. package/dist/components/core/illustration-code/IllustrationCode.d.ts +12 -0
  243. package/dist/components/core/illustration-code/IllustrationCode.js +20 -0
  244. package/dist/components/core/illustration-code/IllustrationCode.types.d.ts +23 -0
  245. package/dist/components/core/illustration-code/IllustrationCode.types.js +8 -0
  246. package/dist/components/core/illustration-code/illustration-code-impl.css +42 -0
  247. package/dist/components/core/illustration-list/IllustrationList.css +19 -0
  248. package/dist/components/core/illustration-list/IllustrationList.d.ts +16 -0
  249. package/dist/components/core/illustration-list/IllustrationList.js +18 -0
  250. package/dist/components/core/illustration-list/IllustrationList.types.d.ts +15 -0
  251. package/dist/components/core/illustration-list/IllustrationList.types.js +6 -0
  252. package/dist/components/core/illustration-list/illustration-list-impl.css +52 -0
  253. package/dist/components/core/illustration-scene/IllustrationScene.css +6 -0
  254. package/dist/components/core/illustration-scene/IllustrationScene.d.ts +3 -2
  255. package/dist/components/core/illustration-scene/IllustrationScene.js +4 -3
  256. package/dist/components/core/illustration-scene/IllustrationScene.types.d.ts +5 -1
  257. package/dist/components/core/illustration-scene/IllustrationScene.types.js +2 -1
  258. package/dist/components/core/illustration-scene/illustration-scene-impl.css +65 -0
  259. package/dist/components/core/link/link-impl.css +5 -19
  260. package/dist/components/core/progress-bar/ProgressBar.css +101 -0
  261. package/dist/components/core/progress-bar/ProgressBar.d.ts +5 -0
  262. package/dist/components/core/progress-bar/ProgressBar.js +34 -0
  263. package/dist/components/core/progress-bar/ProgressBar.types.d.ts +52 -0
  264. package/dist/components/core/progress-bar/ProgressBar.types.js +12 -0
  265. package/dist/components/core/progress-bar/progress-bar-impl.css +45 -0
  266. package/dist/components/core/segmented-control/SegmentedControl.d.ts +1 -1
  267. package/dist/components/core/segmented-control/SegmentedControl.js +13 -5
  268. package/dist/components/core/segmented-control/SegmentedControl.types.d.ts +5 -1
  269. package/dist/components/core/segmented-control/segmented-control-impl.css +35 -0
  270. package/dist/components/core/status-dot/StatusDot.d.ts +1 -1
  271. package/dist/components/core/status-dot/StatusDot.js +7 -4
  272. package/dist/components/core/status-dot/StatusDot.types.d.ts +9 -1
  273. package/dist/components/core/status-dot/status-dot-impl.css +101 -0
  274. package/dist/components/core/typography/Typography.d.ts +3 -283
  275. package/dist/components/core/typography/Typography.js +9 -1
  276. package/dist/components/core/typography/Typography.types.d.ts +9 -15
  277. package/dist/components/core/typography/TypographyMotion.d.ts +28 -0
  278. package/dist/components/core/typography/TypographyMotion.js +43 -0
  279. package/dist/components/core/typography/typography-impl.css +106 -0
  280. package/dist/components/illustration-data.d.ts +15 -0
  281. package/dist/components/illustration-data.js +7 -0
  282. package/dist/components/index.d.ts +22 -1
  283. package/dist/components/index.js +20 -0
  284. package/dist/components/layout/grid/Grid.css +5 -0
  285. package/dist/components/layout/grid/Grid.types.d.ts +2 -1
  286. package/dist/components/scene-scroll-data.d.ts +35 -0
  287. package/dist/components/tiers-data.d.ts +3 -2
  288. package/dist/marketing.css +24 -6
  289. package/package.json +1 -1
@@ -0,0 +1,100 @@
1
+ /* GENERATED from featuretabs.contract.json. Do not edit. */
2
+
3
+ :where([data-dds-context="marketing"]) .dds-featuretabs {
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-featuretabs .dds-featuretabs__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-featuretabs .dds-featuretabs__header {
25
+ display: flex;
26
+ flex-direction: column;
27
+ min-inline-size: 0;
28
+ row-gap: var(--space-heading-title-description);
29
+ }
30
+
31
+ :where([data-dds-context="marketing"]) .dds-featuretabs .dds-featuretabs__title {
32
+ margin-block: 0;
33
+ text-wrap: balance;
34
+ font-family: var(--font-h2-family);
35
+ font-size: var(--font-h2-size);
36
+ font-weight: var(--font-h2-weight);
37
+ letter-spacing: var(--font-h2-letter-spacing);
38
+ line-height: var(--font-h2-line-height);
39
+ max-inline-size: var(--size-measure-heading);
40
+ }
41
+
42
+ :where([data-dds-context="marketing"]) .dds-featuretabs .dds-featuretabs__description {
43
+ margin-block: 0;
44
+ font-family: var(--font-body-md-family);
45
+ font-size: var(--font-body-md-size);
46
+ font-weight: var(--font-body-md-weight);
47
+ letter-spacing: var(--font-body-md-letter-spacing);
48
+ line-height: var(--font-body-md-line-height);
49
+ max-inline-size: var(--size-measure-description);
50
+ }
51
+
52
+ :where([data-dds-context="marketing"]) .dds-featuretabs .dds-featuretabs__tabs {
53
+ display: flex;
54
+ max-inline-size: 100%;
55
+ min-inline-size: 0;
56
+ margin-block-start: var(--space-heading-description-actions);
57
+ }
58
+
59
+ :where([data-dds-context="marketing"]) .dds-featuretabs .dds-featuretabs__panel {
60
+ min-inline-size: 0;
61
+ row-gap: var(--space-gap-none);
62
+ }
63
+
64
+ :where([data-dds-context="marketing"]) .dds-featuretabs .dds-featuretabs__footnote {
65
+ margin-block: 0;
66
+ font-family: var(--font-body-sm-family);
67
+ font-size: var(--font-body-sm-size);
68
+ font-weight: var(--font-body-sm-weight);
69
+ letter-spacing: var(--font-body-sm-letter-spacing);
70
+ line-height: var(--font-body-sm-line-height);
71
+ }
72
+
73
+ :where([data-dds-context="marketing"]) .dds-featuretabs[data-ground="page"] {
74
+ background-color: var(--color-bg-page);
75
+ color: var(--color-fg-default);
76
+ }
77
+
78
+ :where([data-dds-context="marketing"]) .dds-featuretabs[data-ground="page"] .dds-featuretabs__footnote {
79
+ color: var(--color-fg-muted);
80
+ }
81
+
82
+ :where([data-dds-context="marketing"]) .dds-featuretabs[data-ground="strong"] {
83
+ background-color: var(--color-bg-brand-strong);
84
+ color: var(--color-fg-on-brand-strong);
85
+ }
86
+
87
+ :where([data-dds-context="marketing"]) .dds-featuretabs[data-ground="strong"] .dds-featuretabs__footnote {
88
+ color: var(--color-fg-muted-inverse);
89
+ }
90
+
91
+ :where([data-dds-context="marketing"]) .dds-featuretabs[data-ground="subtle"] {
92
+ background-color: var(--color-bg-page);
93
+ background-image: linear-gradient(var(--color-bg-band-subtle), var(--color-bg-band-subtle));
94
+ color: var(--color-fg-default);
95
+ }
96
+
97
+ :where([data-dds-context="marketing"]) .dds-featuretabs[data-ground="subtle"] .dds-featuretabs__footnote {
98
+ color: var(--color-fg-muted);
99
+ }
100
+
@@ -0,0 +1,23 @@
1
+ import { type ReactNode } from 'react';
2
+ import './FeatureTabs.css';
3
+ import './feature-tabs-impl.css';
4
+ import '../block-reveal.css';
5
+ import { type FeatureTabsProps } from './FeatureTabs.types.js';
6
+ export type { FeatureTabsProps };
7
+ /**
8
+ * Versions of one thing, one at a time — the reference design's OptionsTypes, made general.
9
+ *
10
+ * The section owns what the versions share — the heading, the tab strip and which tab is showing —
11
+ * and the page composes what each tab shows, one child per name in `labels`. A name without a child
12
+ * is not drawn, and neither is a child without a name. Two or more tabs get the strip; one is drawn
13
+ * with nothing to choose.
14
+ *
15
+ * Only the tab showing is in the page, so a picture playing in one stops when the reader turns to
16
+ * another — the reference stops its animations by hand, and an unmounted one has nothing to stop.
17
+ *
18
+ * It arrives the way every block does: the heading, its line, the tabs, then the content.
19
+ * `'use client'` for that, the selected tab, and `useId`, which names the region by its heading.
20
+ */
21
+ export declare function FeatureTabs({ ground, title, description, labels, footnote, children, }: FeatureTabsProps & {
22
+ children?: ReactNode;
23
+ }): import("react").JSX.Element;
@@ -0,0 +1,38 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Children, useId, useState } from 'react';
4
+ import './FeatureTabs.css';
5
+ import './feature-tabs-impl.css';
6
+ import '../block-reveal.css';
7
+ import { Tab } from '../../core/tab/Tab.js';
8
+ import { TabList } from '../../core/tab-list/TabList.js';
9
+ import { given } from '../../given.js';
10
+ import { arriving, useReveal } from '../use-reveal.js';
11
+ import { featureTabsDefaults, featureTabsParts } from './FeatureTabs.types.js';
12
+ /**
13
+ * Versions of one thing, one at a time — the reference design's OptionsTypes, made general.
14
+ *
15
+ * The section owns what the versions share — the heading, the tab strip and which tab is showing —
16
+ * and the page composes what each tab shows, one child per name in `labels`. A name without a child
17
+ * is not drawn, and neither is a child without a name. Two or more tabs get the strip; one is drawn
18
+ * with nothing to choose.
19
+ *
20
+ * Only the tab showing is in the page, so a picture playing in one stops when the reader turns to
21
+ * another — the reference stops its animations by hand, and an unmounted one has nothing to stop.
22
+ *
23
+ * It arrives the way every block does: the heading, its line, the tabs, then the content.
24
+ * `'use client'` for that, the selected tab, and `useId`, which names the region by its heading.
25
+ */
26
+ export function FeatureTabs({ ground = featureTabsDefaults.ground, title, description, labels, footnote, children, }) {
27
+ const titleId = useId();
28
+ const [band, revealed] = useReveal();
29
+ // The selected tab by its name rather than its place, so a list of names that changes under it
30
+ // keeps the reader on the same tab where it is still there, and goes to the first where it is not.
31
+ const [selected, setSelected] = useState(null);
32
+ // A record from a feed or an editor is not typed, so the names are checked rather than trusted.
33
+ const names = Array.isArray(labels) ? labels : [];
34
+ const panels = Children.toArray(children);
35
+ const count = Math.min(names.length, panels.length);
36
+ const at = Math.max(0, selected === null ? 0 : names.slice(0, count).indexOf(selected));
37
+ return (_jsx("section", { className: featureTabsParts.root, "data-ground": ground, "aria-labelledby": titleId, children: _jsxs("div", { className: featureTabsParts.inner, ref: band, "data-revealed": revealed, children: [_jsxs("div", { className: featureTabsParts.header, children: [_jsx("h2", { className: featureTabsParts.title, id: titleId, ...arriving(0), children: title }), given(description) ? (_jsx("p", { className: featureTabsParts.description, ...arriving(1), children: description })) : null, _jsx("div", { className: featureTabsParts.tabs, ...arriving(2), children: count > 1 ? (_jsx(TabList, { label: title, value: String(at), onChange: (value) => setSelected(names[Number(value)] ?? null), children: names.slice(0, count).map((name, index) => (_jsx(Tab, { value: String(index), label: name }, index))) })) : null })] }), _jsx("div", { className: featureTabsParts.panel, ...arriving(3), children: count > 0 ? panels[at] : null }), given(footnote) ? (_jsx("p", { className: featureTabsParts.footnote, ...arriving(4), children: footnote })) : null] }) }));
38
+ }
@@ -0,0 +1,35 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface FeatureTabsOwnProps {
3
+ /**
4
+ * `page` — The default, and the page's own white. A section that has nothing to separate itself from what is above it — most of them — and the ground a reader is already on
5
+ * `subtle` — A quiet step off the page, for a band that wants to read as its own section without changing the page's voice — the reference design's slate FAQ. 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. It stops the page rather than dividing it, so it is for a section a reader should arrive at — and one per page is usually one more than enough. The tab strip turns round with it: white names, a rule in the band's own veil and a focus ring drawn for the dark, fixed like the band
7
+ */
8
+ ground?: 'page' | 'subtle' | 'strong';
9
+ /** Always. What the versions are of, in a few words — "Types of digital options". It names the section and the tabs */
10
+ title: string;
11
+ /** A line under the heading saying what the tabs have in common */
12
+ description?: string;
13
+ /** Always. The tabs' names, in a word or two each, in the order of the children they choose between — the first names the first child. A name without a child is not drawn */
14
+ labels: string[];
15
+ /** Small print every tab shares — that what is offered varies by platform or device */
16
+ footnote?: string;
17
+ /** Allowed: any content */
18
+ children: ReactNode;
19
+ }
20
+ export type FeatureTabsProps = FeatureTabsOwnProps;
21
+ /** The class each part carries. Apply these — do not retype them. */
22
+ export declare const featureTabsParts: {
23
+ readonly root: "dds-featuretabs";
24
+ readonly inner: "dds-featuretabs__inner";
25
+ readonly header: "dds-featuretabs__header";
26
+ readonly title: "dds-featuretabs__title";
27
+ readonly description: "dds-featuretabs__description";
28
+ readonly tabs: "dds-featuretabs__tabs";
29
+ readonly panel: "dds-featuretabs__panel";
30
+ readonly footnote: "dds-featuretabs__footnote";
31
+ };
32
+ /** Generated so defaults cannot drift from the contract. */
33
+ export declare const featureTabsDefaults: {
34
+ readonly ground: "page";
35
+ };
@@ -0,0 +1,14 @@
1
+ // GENERATED from feature-tabs.contract.json. Do not edit.
2
+ /** The class each part carries. Apply these — do not retype them. */
3
+ export const featureTabsParts = {
4
+ root: 'dds-featuretabs',
5
+ inner: 'dds-featuretabs__inner',
6
+ header: 'dds-featuretabs__header',
7
+ title: 'dds-featuretabs__title',
8
+ description: 'dds-featuretabs__description',
9
+ tabs: 'dds-featuretabs__tabs',
10
+ panel: 'dds-featuretabs__panel',
11
+ footnote: 'dds-featuretabs__footnote',
12
+ };
13
+ /** Generated so defaults cannot drift from the contract. */
14
+ export const featureTabsDefaults = { ground: 'page' };
@@ -0,0 +1,53 @@
1
+ /*
2
+ * Scoped to this package, like the generated sheet beside it.
3
+ *
4
+ * The heading, the tabs and the footnote start on a phone, as every block's heading does there, and
5
+ * are centred from 48rem over the content they choose — Documents' and FaqAccordion's rule. `48rem`
6
+ * longhand because `var()` is not permitted in a container query condition.
7
+ */
8
+ @container (min-width: 48rem) {
9
+ :where([data-dds-context="marketing"]) .dds-featuretabs .dds-featuretabs__header {
10
+ align-items: center;
11
+ text-align: center;
12
+ }
13
+
14
+ :where([data-dds-context="marketing"]) .dds-featuretabs .dds-featuretabs__tabs {
15
+ justify-content: center;
16
+ }
17
+
18
+ :where([data-dds-context="marketing"]) .dds-featuretabs .dds-featuretabs__footnote {
19
+ text-align: center;
20
+ }
21
+ }
22
+
23
+ /*
24
+ * A lone tab has no strip, and the strip it would have held is not left as a step in the
25
+ * header's rhythm: an empty part with a margin is a gap with nothing in it.
26
+ */
27
+ :where([data-dds-context="marketing"]) .dds-featuretabs .dds-featuretabs__tabs:empty {
28
+ display: none;
29
+ }
30
+
31
+ /*
32
+ * On the strong band the tab strip takes the band's inks, as Documents' accordion does: TabList is
33
+ * drawn for a light ground, so a selected tab's near-black text would vanish on the dark one.
34
+ */
35
+ :where([data-dds-context="marketing"]) .dds-featuretabs[data-ground="strong"] .dds-tablist {
36
+ border-color: var(--color-border-subtle-inverse);
37
+ }
38
+
39
+ :where([data-dds-context="marketing"]) .dds-featuretabs[data-ground="strong"] .dds-tab[data-selected="true"] :is(.dds-tab__label, .dds-tab__icon, .dds-tab__trailing-icon) {
40
+ color: var(--color-fg-on-brand-strong);
41
+ }
42
+
43
+ :where([data-dds-context="marketing"]) .dds-featuretabs[data-ground="strong"] .dds-tab[data-selected="false"] :is(.dds-tab__label, .dds-tab__icon, .dds-tab__trailing-icon) {
44
+ color: var(--color-fg-muted-inverse);
45
+ }
46
+
47
+ :where([data-dds-context="marketing"]) .dds-featuretabs[data-ground="strong"] .dds-tab .dds-tab__surface:hover {
48
+ background-color: var(--color-bg-hover-on-brand-strong);
49
+ }
50
+
51
+ :where([data-dds-context="marketing"]) .dds-featuretabs[data-ground="strong"] .dds-tab:focus-visible {
52
+ outline-color: var(--color-border-focus-on-brand-strong);
53
+ }
@@ -96,7 +96,7 @@
96
96
  }
97
97
 
98
98
  :where([data-dds-context="marketing"]) .dds-imagebanner[data-ground="strong"] .dds-imagebanner__card {
99
- background-color: var(--color-bg-surface-card-strong);
99
+ background-color: var(--color-bg-surface-card-strong-on-brand-strong);
100
100
  }
101
101
 
102
102
  :where([data-dds-context="marketing"]) .dds-imagebanner[data-ground="subtle"] {
@@ -30,4 +30,4 @@ export type { ImageBannerProps };
30
30
  * the photograph after them. A cover photograph is the card's ground rather than a part of what it
31
31
  * says, so it is there from the start and only the words arrive over it.
32
32
  */
33
- export declare function ImageBanner({ ground, variant, mediaPosition, parallax, title, headingLevel, description, action, media, }: ImageBannerProps): import("react").JSX.Element;
33
+ export declare function ImageBanner({ ground, variant, mediaPosition, parallax, stackOnPhone, title, headingLevel, description, action, media, }: ImageBannerProps): import("react").JSX.Element;
@@ -34,9 +34,9 @@ import { imageBannerDefaults, imageBannerParts } from './ImageBanner.types.js';
34
34
  * the photograph after them. A cover photograph is the card's ground rather than a part of what it
35
35
  * says, so it is there from the start and only the words arrive over it.
36
36
  */
37
- export function ImageBanner({ ground = imageBannerDefaults.ground, variant = imageBannerDefaults.variant, mediaPosition = imageBannerDefaults.mediaPosition, parallax = imageBannerDefaults.parallax, title, headingLevel = imageBannerDefaults.headingLevel, description, action, media, }) {
37
+ export function ImageBanner({ ground = imageBannerDefaults.ground, variant = imageBannerDefaults.variant, mediaPosition = imageBannerDefaults.mediaPosition, parallax = imageBannerDefaults.parallax, stackOnPhone = imageBannerDefaults.stackOnPhone, title, headingLevel = imageBannerDefaults.headingLevel, description, action, media, }) {
38
38
  const titleId = useId();
39
39
  const Title = headingLevel;
40
40
  const [band, revealed] = useReveal();
41
- 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, "data-dds-parallax": parallax ? '' : undefined, ...(variant === 'cover' ? {} : arriving(3)), children: media })] }) }) }));
41
+ return (_jsx("section", { className: imageBannerParts.root, "data-ground": ground, "data-variant": variant, "data-media-position": mediaPosition, "data-parallax": parallax, "data-stack-on-phone": variant === 'cover' && stackOnPhone ? '' : undefined, "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, "data-dds-parallax": parallax ? '' : undefined, ...(variant === 'cover' ? {} : arriving(3)), children: media })] }) }) }));
42
42
  }
@@ -3,14 +3,9 @@ export interface ImageBannerOwnProps {
3
3
  /**
4
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
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
6
+ * `strong` — `color.bg.brand-strong`, the dark band, with the card a step lighter at color.bg.surface-card-strong-on-brand-strong so it still reads as a card. For a page whose dark band is already here and wants the card inside it
7
7
  */
8
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
9
  /**
15
10
  * `end` — The default. The words lead and the photograph follows, which is the order the card argues in
16
11
  * `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
@@ -32,7 +27,13 @@ export interface ImageBannerOwnProps {
32
27
  /** The photograph drifts against the scroll as the card passes through the view, the drift every block's picture shares — drawn at motion.scale.parallax and moved from motion.translate.parallax-from to motion.translate.parallax-to over the whole pass — so it reads as further away than the card — the reference design's ParallaxBanner, which this replaces. On by default, as every block's picture drifts: pass false for a card whose photograph must hold still under its button. */
33
28
  parallax?: boolean;
34
29
  }
35
- export type ImageBannerProps = ImageBannerOwnProps;
30
+ export type ImageBannerProps = ImageBannerOwnProps & ({
31
+ variant?: 'split' | 'cover';
32
+ stackOnPhone?: false;
33
+ } | {
34
+ variant: Exclude<'split' | 'cover', 'split'>;
35
+ stackOnPhone?: boolean;
36
+ });
36
37
  /** The class each part carries. Apply these — do not retype them. */
37
38
  export declare const imageBannerParts: {
38
39
  readonly root: "dds-imagebanner";
@@ -51,4 +52,5 @@ export declare const imageBannerDefaults: {
51
52
  readonly mediaPosition: "end";
52
53
  readonly headingLevel: "h2";
53
54
  readonly parallax: true;
55
+ readonly stackOnPhone: false;
54
56
  };
@@ -11,4 +11,4 @@ export const imageBannerParts = {
11
11
  media: 'dds-imagebanner__media',
12
12
  };
13
13
  /** Generated so defaults cannot drift from the contract. */
14
- export const imageBannerDefaults = { ground: 'page', variant: 'split', mediaPosition: 'end', headingLevel: 'h2', parallax: true };
14
+ export const imageBannerDefaults = { ground: 'page', variant: 'split', mediaPosition: 'end', headingLevel: 'h2', parallax: true, stackOnPhone: false };
@@ -99,11 +99,13 @@
99
99
  }
100
100
 
101
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.
102
+ * The cover card's words hold half of it, on the side away from where the photograph shows
103
+ * clear, and the photograph's subject has the other half. Three fifths left the subject two, and
104
+ * the shade's fade past the words took much of those. Written as a share rather than `1 1 0`: the
105
+ * photograph is out of flow behind, so the words would have the whole row to grow into.
104
106
  */
105
107
  :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"] .dds-imagebanner__content {
106
- flex: 0 1 60%;
108
+ flex: 0 1 50%;
107
109
  }
108
110
 
109
111
  :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant] .dds-imagebanner__action {
@@ -173,54 +175,130 @@
173
175
  }
174
176
 
175
177
  /*
176
- * The scrim over the cover photograph, darkest where the words are.
178
+ * The shade under a cover card's words: their column, and just past it.
177
179
  *
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.
180
+ * White body copy has to keep AA over even a pale photograph, so the words' column is
181
+ * color.bg.overlay at full strength — darkest only at the words' edge was tried and left the end of a
182
+ * line at about 2:1. But the shade is the words', not the photograph's: it is drawn by the column the
183
+ * words take and fades to clear across the column's own margin and past its edge — a long fade, so
184
+ * it never reads as an edge on the photograph — and the rest of the
185
+ * photograph is shown as it was taken. It once held across three fifths of the card and then thinned
186
+ * out to the far edge, which turned a bright photograph slate grey nearly all the way across; on a
187
+ * phone it ran down three fifths of the card's height however short the words were.
185
188
  *
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.
189
+ * Under the words inside their own stacking context — the column is lifted over the photograph — so
190
+ * it is always behind them and always over the photograph. Toward the photograph: across from the
191
+ * fold, mirrored for a photograph at the start and under `:dir(rtl)`, and downward on a phone, where
192
+ * the words are at the top across the whole width. A gradient takes a physical direction — there is
193
+ * no `to inline-end` — so the direction is a custom property set once per case, the package's rule for
194
+ * a pattern that must follow the reading direction.
191
195
  *
192
196
  * The words need no rule to change sides: the photograph is out of flow behind them, so the row
193
197
  * `mediaPosition` sets holds the words alone, at the start or, reversed, at the end.
194
198
  */
195
- :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"] .dds-imagebanner__media::after {
199
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"] .dds-imagebanner__content {
200
+ --dds-imagebanner-shade-fade: var(--space-section-default);
201
+ /* The column's own inset, which the words end inside: space.inset.card, and space.inset.2xl from
202
+ 64rem, where the column is given more room. The shade holds full strength to there. */
203
+ --dds-imagebanner-words-inset: var(--space-inset-card);
204
+ position: relative;
205
+ }
206
+
207
+ /* Across from the fold, three times space.section.default. Eased over the shorter fade, the step
208
+ from full strength to clear still read as a band on the photograph, beside the words where the
209
+ eye lands; spread over three it reads as light falling off. Down on a phone it stays one, where a
210
+ longer tail would grey most of a short card. */
211
+ @container (min-width: 48rem) {
212
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"] .dds-imagebanner__content {
213
+ --dds-imagebanner-shade-fade: calc(var(--space-section-default) * 3);
214
+ }
215
+ }
216
+
217
+ @container (min-width: 64rem) {
218
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"] .dds-imagebanner__content {
219
+ --dds-imagebanner-words-inset: var(--space-inset-2xl);
220
+ }
221
+ }
222
+
223
+ /*
224
+ * The fade is eased: its strength follows a smoothstep curve rather than a straight line, which is
225
+ * what made the first one read as a seam on the photograph — a linear fade has its sharpest change at
226
+ * both of its ends, where it leaves full strength and where it lands on clear. The stops are the
227
+ * curve sampled across the fade, which runs the words' inset and the fade's length past it; a
228
+ * gradient between two stops is still linear, so the curve is in how many there are.
229
+ */
230
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"] .dds-imagebanner__content::before {
231
+ --dds-imagebanner-shade-ramp: calc(var(--dds-imagebanner-shade-fade) + var(--dds-imagebanner-words-inset));
196
232
  background-image: linear-gradient(
197
- var(--dds-imagebanner-scrim-toward, to bottom),
233
+ var(--dds-imagebanner-shade-toward, to bottom),
198
234
  var(--color-bg-overlay),
199
- var(--color-bg-overlay) 60%,
200
- var(--color-bg-overlay-subtle) 80%,
235
+ var(--color-bg-overlay) calc(100% - var(--dds-imagebanner-shade-ramp) * 1.0),
236
+ color-mix(in srgb, var(--color-bg-overlay) 95.7%, transparent) calc(100% - var(--dds-imagebanner-shade-ramp) * 0.875),
237
+ color-mix(in srgb, var(--color-bg-overlay) 84.4%, transparent) calc(100% - var(--dds-imagebanner-shade-ramp) * 0.75),
238
+ color-mix(in srgb, var(--color-bg-overlay) 68.4%, transparent) calc(100% - var(--dds-imagebanner-shade-ramp) * 0.625),
239
+ color-mix(in srgb, var(--color-bg-overlay) 50.0%, transparent) calc(100% - var(--dds-imagebanner-shade-ramp) * 0.5),
240
+ color-mix(in srgb, var(--color-bg-overlay) 31.6%, transparent) calc(100% - var(--dds-imagebanner-shade-ramp) * 0.375),
241
+ color-mix(in srgb, var(--color-bg-overlay) 15.6%, transparent) calc(100% - var(--dds-imagebanner-shade-ramp) * 0.25),
242
+ color-mix(in srgb, var(--color-bg-overlay) 4.3%, transparent) calc(100% - var(--dds-imagebanner-shade-ramp) * 0.125),
201
243
  transparent
202
244
  );
203
245
  content: '';
204
- inset: 0;
246
+ inset: 0 0 calc(-1 * var(--dds-imagebanner-shade-fade));
205
247
  pointer-events: none;
206
248
  position: absolute;
249
+ z-index: -1;
207
250
  }
208
251
 
209
252
  @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;
253
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"] .dds-imagebanner__content::before {
254
+ inset-block-end: 0;
255
+ inset-inline-end: calc(-1 * var(--dds-imagebanner-shade-fade));
212
256
  }
213
257
 
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;
258
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"][data-media-position="start"] .dds-imagebanner__content::before {
259
+ inset-inline-end: 0;
260
+ inset-inline-start: calc(-1 * var(--dds-imagebanner-shade-fade));
261
+ }
262
+
263
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"][data-media-position="end"] .dds-imagebanner__content {
264
+ --dds-imagebanner-shade-toward: to right;
265
+ }
266
+
267
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"][data-media-position="start"] .dds-imagebanner__content {
268
+ --dds-imagebanner-shade-toward: to left;
269
+ }
270
+
271
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"][data-media-position="end"]:dir(rtl) .dds-imagebanner__content {
272
+ --dds-imagebanner-shade-toward: to left;
273
+ }
274
+
275
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"][data-media-position="start"]:dir(rtl) .dds-imagebanner__content {
276
+ --dds-imagebanner-shade-toward: to right;
277
+ }
278
+ }
279
+
280
+ /*
281
+ * `stackOnPhone`: below the fold the cover card stacks, as a split card does.
282
+ *
283
+ * A cover photograph is cropped to a 2.53:1 strip on a desktop and a near-square on a phone, both
284
+ * held to the photograph's side, and the two crops share only a third of it — so a person framed for
285
+ * the strip loses their head on the phone, or stands under the words. Stacked, the words stand on the
286
+ * card's own dark ground and need no shade, and the photograph follows them whole at the landscape
287
+ * shape, in flow rather than behind. From the fold it is the cover card again.
288
+ */
289
+ @container (max-width: 47.9375rem) {
290
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"][data-stack-on-phone] .dds-imagebanner__card {
291
+ min-block-size: 0;
216
292
  }
217
293
 
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;
294
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"][data-stack-on-phone] .dds-imagebanner__media {
295
+ aspect-ratio: var(--aspect-landscape);
296
+ inset: auto;
297
+ position: relative;
220
298
  }
221
299
 
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;
300
+ :where([data-dds-context="marketing"]) .dds-imagebanner[data-variant="cover"][data-stack-on-phone] .dds-imagebanner__content::before {
301
+ content: none;
224
302
  }
225
303
  }
226
304
 
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The reference design's laurel, the vector its Stats section draws, in one colour — shared by the
3
+ * blocks that frame an award with it, so an award looks the same wherever a page shows one.
4
+ *
5
+ * The left-hand branch: its leaves curl up and in toward whatever stands to its right. The second
6
+ * branch is this one mirrored, by each block's stylesheet, so one drawing serves both sides and a
7
+ * right-to-left page can swap which side is mirrored without a second picture. The reference laid it
8
+ * at a fifth of its strength; here it takes the band's quieter ink instead, a colour role rather than
9
+ * an alpha, so it follows the ground the way every other quiet thing in the package does.
10
+ */
11
+ export declare const LAUREL_PATHS: string[];
12
+ /** One laurel branch, carrying the class of the block that draws it. Decoration: hidden from assistive technology and never focusable. */
13
+ export declare function Laurel({ className, side }: {
14
+ className: string;
15
+ side: 'leading' | 'trailing';
16
+ }): import("react").JSX.Element;
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * The reference design's laurel, the vector its Stats section draws, in one colour — shared by the
4
+ * blocks that frame an award with it, so an award looks the same wherever a page shows one.
5
+ *
6
+ * The left-hand branch: its leaves curl up and in toward whatever stands to its right. The second
7
+ * branch is this one mirrored, by each block's stylesheet, so one drawing serves both sides and a
8
+ * right-to-left page can swap which side is mirrored without a second picture. The reference laid it
9
+ * at a fifth of its strength; here it takes the band's quieter ink instead, a colour role rather than
10
+ * an alpha, so it follows the ground the way every other quiet thing in the package does.
11
+ */
12
+ export const LAUREL_PATHS = [
13
+ 'M20.8655 76.0151C21.3631 78.5487 22.4577 80.4673 23.4245 81.7447C23.7945 82.2337 24.145 82.6275 24.4343 82.9245C24.5003 81.0424 24.5392 77.0209 23.854 73.543C23.3836 71.2282 22.6189 69.4263 21.9723 68.1997C21.7486 67.7754 21.539 67.42 21.3608 67.1361C21.2158 67.6487 21.042 68.3446 20.8935 69.1718C20.5634 71.0111 20.3623 73.4782 20.8655 76.0151Z',
14
+ 'M9.19518 69.4464C8.5612 69.2311 8.01354 69.0792 7.6041 68.9776C7.77674 69.5261 8.03563 70.2542 8.40971 71.0711C9.16156 72.713 10.3603 74.6729 12.1472 76.0342C13.9141 77.3864 15.8077 77.7752 17.2669 77.8239C17.9963 77.8483 18.6126 77.7873 19.0419 77.7209C18.3715 76.5307 16.6347 73.8279 14.0892 71.9349C12.4167 70.7081 10.6015 69.924 9.19518 69.4464Z',
15
+ 'M14.1789 62.4853C14.1095 65.0056 14.7018 67.1343 15.3106 68.6265C15.5268 69.1563 15.7445 69.6045 15.9342 69.9597C16.0737 69.4242 16.2473 68.7196 16.4239 67.9038C16.8294 66.0308 17.2467 63.5892 17.309 61.2688C17.3584 58.9612 17.0322 57.019 16.6942 55.65C16.5809 55.1908 16.4663 54.7965 16.3643 54.4749C16.1414 54.8952 15.8702 55.4487 15.5956 56.1107C14.9268 57.7233 14.2444 59.9642 14.1789 62.4853Z',
16
+ 'M6.16644 56.5363L5.92729 56.2113C4.18123 53.9739 2.10237 52.4221 0.99942 51.685C1.0448 52.2219 1.13195 52.9558 1.29599 53.7969C1.6458 55.5904 2.33816 57.834 3.68889 59.699C5.02796 61.5534 6.66938 62.5331 7.97363 63.0496C8.56984 63.2857 9.09434 63.4244 9.48448 63.5049C9.08235 62.1271 8.06278 59.1136 6.16644 56.5363Z',
17
+ 'M12.9202 41.9556C12.9103 41.468 12.8857 41.0438 12.8578 40.6964C12.5852 41.0139 12.2554 41.4254 11.9043 41.9234C10.9787 43.2365 9.91222 45.1415 9.34811 47.5086L9.21888 48.0509C8.78948 50.2094 8.89878 52.2002 9.13088 53.6853C9.21855 54.2463 9.32345 54.7333 9.42253 55.1275C10.2101 53.5777 11.6117 50.5783 12.3444 47.5177C12.8519 45.3454 12.9491 43.3817 12.9202 41.9556Z',
18
+ 'M4.26838 40.1575C3.16507 37.3338 1.55966 35.0449 0.658674 33.8839C0.595099 34.3962 0.53299 35.0674 0.509766 35.8425C0.454879 37.6743 0.618233 40.0556 1.46849 42.2871C2.30759 44.5064 3.60611 45.9871 4.68907 46.9107C5.12959 47.2864 5.53393 47.5694 5.85602 47.7717C5.82536 47.3041 5.77132 46.6715 5.67501 45.9295C5.46619 44.3205 5.06044 42.211 4.27156 40.1569L4.26838 40.1575Z',
19
+ 'M12.6632 27.4606C11.6314 28.3597 10.3804 29.7129 9.40352 31.5834L9.20135 32.004C8.19489 34.0975 7.83678 36.2499 7.73379 37.8807C7.69736 38.4576 7.693 38.9667 7.70264 39.3814C7.98105 39.0479 8.31846 38.6306 8.68777 38.1462C9.68653 36.8365 10.9078 35.0512 11.829 33.1204C12.7356 31.1936 13.238 29.3215 13.5154 27.9233C13.6157 27.4178 13.6864 26.9753 13.7361 26.6158C13.4324 26.8302 13.0648 27.1106 12.6632 27.4606Z',
20
+ 'M7.15889 23.0454L7.23043 22.5253C7.54518 19.6881 7.36017 17.0948 7.19664 15.6517C6.9244 16.0575 6.59747 16.5777 6.25738 17.1905C5.37216 18.7855 4.41002 20.986 4.07631 23.4177C3.74032 25.8399 4.108 27.8499 4.55657 29.25C4.7215 29.7648 4.89717 30.1965 5.05235 30.5349C5.64762 29.1157 6.71893 26.2445 7.15889 23.0454Z',
21
+ 'M20.7056 14.8951C19.4372 15.269 17.7724 15.9875 16.1554 17.3693L16.021 17.4932C14.3576 18.9542 13.2217 20.7665 12.5041 22.2202C12.2403 22.7546 12.0346 23.2374 11.8812 23.6318C12.2297 23.4596 12.6507 23.2423 13.1195 22.9822C14.4495 22.2442 16.1506 21.1686 17.6705 19.808C19.177 18.446 20.3493 16.9414 21.1512 15.7693C21.4549 15.3255 21.7047 14.9307 21.8987 14.6109C21.5673 14.6707 21.1626 14.7604 20.7056 14.8951Z',
22
+ 'M15.246 9.89451L15.3989 9.48769C16.3817 6.71545 16.8681 4.08928 17.0948 2.56556C16.7641 2.88544 16.3703 3.28963 15.9481 3.76978C14.7583 5.12276 13.3571 7.06214 12.4902 9.40367C11.6163 11.7394 11.483 13.8564 11.5665 15.3854C11.595 15.9081 11.6489 16.3613 11.7069 16.7298C11.9415 16.3768 12.2271 15.9318 12.5414 15.4103C13.3841 14.0121 14.4266 12.0747 15.246 9.89451Z',
23
+ 'M24.236 2.86551C22.4046 4.24716 21.0854 6.09763 20.225 7.6144C19.8673 8.24502 19.5916 8.81333 19.3933 9.25894C19.765 9.11933 20.2233 8.93634 20.7396 8.70812C22.1292 8.09394 23.9267 7.15785 25.5896 5.86671C27.2408 4.56435 28.6049 3.04428 29.5633 1.84034C29.9762 1.32163 30.3123 0.863542 30.5622 0.509562C30.206 0.526204 29.7564 0.567871 29.2396 0.659382C27.8788 0.900297 26.0564 1.48555 24.236 2.86551Z',
24
+ ];
25
+ /** One laurel branch, carrying the class of the block that draws it. Decoration: hidden from assistive technology and never focusable. */
26
+ export function Laurel({ className, side }) {
27
+ return (_jsx("svg", { className: className, "data-side": side, viewBox: "0 0 32 84", fill: "none", "aria-hidden": "true", focusable: "false", children: LAUREL_PATHS.map((d) => (_jsx("path", { d: d, fill: "currentColor", stroke: "currentColor" }, d))) }));
28
+ }
@@ -143,7 +143,7 @@
143
143
  }
144
144
 
145
145
  :where([data-dds-context="marketing"]) .dds-logocolumns[data-ground="strong"] .dds-logocolumns__logo {
146
- background-color: var(--color-bg-surface-card-strong);
146
+ background-color: var(--color-bg-surface-card-strong-on-brand-strong);
147
147
  }
148
148
 
149
149
  :where([data-dds-context="marketing"]) .dds-logocolumns[data-ground="subtle"] {
@@ -4,7 +4,7 @@ export interface LogoColumnsOwnProps {
4
4
  /**
5
5
  * `page` — The page's own white, with tiles at the recessed gray. For full-colour logos drawn for a light ground
6
6
  * `subtle` — The grey band, with white tiles on it. For full-colour logos, where the section needs setting apart from the ones around it. Painted as the band's tint over the page's own ground, so it is the same grey whatever is behind the section
7
- * `strong` — The default. `color.bg.brand-strong`, the dark band, with white words and tiles at color.bg.surface-card-strong — gray.900 in both themes, so the wall is a set of tiles a step lighter than the band. The ground white wordmarks are drawn for
7
+ * `strong` — The default. `color.bg.brand-strong`, the dark band, with white words and tiles at color.bg.surface-card-strong-on-brand-strong — slate.850 in light and slate.900 in dark, a step above the band in both, so the wall is a set of tiles a step lighter than the band. The ground white wordmarks are drawn for
8
8
  */
9
9
  ground?: 'page' | 'subtle' | 'strong';
10
10
  /**
@@ -108,7 +108,7 @@
108
108
  }
109
109
 
110
110
  :where([data-dds-context="marketing"]) .dds-logorows[data-ground="strong"] .dds-logorows__logo {
111
- background-color: var(--color-bg-surface-card-strong);
111
+ background-color: var(--color-bg-surface-card-strong-on-brand-strong);
112
112
  }
113
113
 
114
114
  :where([data-dds-context="marketing"]) .dds-logorows[data-ground="subtle"] {
@@ -1,6 +1,7 @@
1
1
  import './LogoRows.css';
2
2
  import './logo-rows-impl.css';
3
3
  import '../block-reveal.css';
4
+ import '../block-pattern.css';
4
5
  import { type LogoRowsProps } from './LogoRows.types.js';
5
6
  export type { LogoRowsProps };
6
7
  /**
@@ -17,4 +18,4 @@ export type { LogoRowsProps };
17
18
  * the first set is announced, so a screen reader hears each name once. The title carries the
18
19
  * section's accessible name through `aria-labelledby`.
19
20
  */
20
- export declare function LogoRows({ ground, title, description, link, logos, }: LogoRowsProps): import("react").JSX.Element | null;
21
+ export declare function LogoRows({ ground, background, title, description, link, logos, }: LogoRowsProps): import("react").JSX.Element | null;