@deriv-com/dds-marketing 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/.llm/components/awards.md +209 -0
  2. package/.llm/components/background.md +89 -40
  3. package/.llm/components/bottomsheet.md +5 -0
  4. package/.llm/components/comparisoncards.md +257 -0
  5. package/.llm/components/comparisontable.md +231 -0
  6. package/.llm/components/ctabanner.md +9 -12
  7. package/.llm/components/ctabannerslider.md +15 -2
  8. package/.llm/components/datatable.md +273 -0
  9. package/.llm/components/downloadbanner.md +283 -0
  10. package/.llm/components/featurecards.md +41 -3
  11. package/.llm/components/featurecardscarousel.md +311 -0
  12. package/.llm/components/featuresplit.md +5 -0
  13. package/.llm/components/featurestack.md +227 -0
  14. package/.llm/components/illustrationcard.md +2 -2
  15. package/.llm/components/illustrationscene.md +6 -10
  16. package/.llm/components/imagebanner.md +278 -0
  17. package/.llm/components/navbar.md +1 -1
  18. package/.llm/components/navbaritem.md +4 -0
  19. package/.llm/components/pageheader.md +4 -3
  20. package/.llm/components/paginationdots.md +6 -1
  21. package/.llm/components/producthero.md +35 -11
  22. package/.llm/components/resourcebanner.md +247 -0
  23. package/.llm/components/scenescroll.md +222 -0
  24. package/.llm/components/select.md +17 -0
  25. package/.llm/components/stats.md +219 -0
  26. package/.llm/components/steps.md +286 -0
  27. package/.llm/components/stickycards.md +251 -0
  28. package/.llm/components/tableheadercell.md +19 -0
  29. package/.llm/components/teamgrid.md +243 -0
  30. package/.llm/components/testimonialrow.md +5 -0
  31. package/.llm/components/testimonialslider.md +14 -1
  32. package/.llm/components/textarea.md +13 -0
  33. package/.llm/components/textinput.md +13 -0
  34. package/.llm/components/textscroll.md +187 -0
  35. package/.llm/components/tiers.md +227 -0
  36. package/.llm/digest/awards.md +45 -0
  37. package/.llm/digest/background.md +11 -10
  38. package/.llm/digest/bottomsheet.md +2 -0
  39. package/.llm/digest/comparisoncards.md +51 -0
  40. package/.llm/digest/comparisontable.md +53 -0
  41. package/.llm/digest/ctabanner.md +4 -4
  42. package/.llm/digest/ctabannerslider.md +4 -0
  43. package/.llm/digest/datatable.md +65 -0
  44. package/.llm/digest/downloadbanner.md +65 -0
  45. package/.llm/digest/featurecards.md +1 -1
  46. package/.llm/digest/featurecardscarousel.md +54 -0
  47. package/.llm/digest/featuresplit.md +1 -0
  48. package/.llm/digest/featurestack.md +48 -0
  49. package/.llm/digest/illustrationscene.md +2 -3
  50. package/.llm/digest/imagebanner.md +64 -0
  51. package/.llm/digest/navbaritem.md +1 -0
  52. package/.llm/digest/pageheader.md +2 -1
  53. package/.llm/digest/paginationdots.md +3 -1
  54. package/.llm/digest/producthero.md +4 -2
  55. package/.llm/digest/resourcebanner.md +53 -0
  56. package/.llm/digest/scenescroll.md +49 -0
  57. package/.llm/digest/select.md +5 -0
  58. package/.llm/digest/stats.md +46 -0
  59. package/.llm/digest/steps.md +55 -0
  60. package/.llm/digest/stickycards.md +52 -0
  61. package/.llm/digest/tableheadercell.md +4 -0
  62. package/.llm/digest/teamgrid.md +53 -0
  63. package/.llm/digest/testimonialrow.md +2 -0
  64. package/.llm/digest/testimonialslider.md +4 -0
  65. package/.llm/digest/textarea.md +4 -0
  66. package/.llm/digest/textinput.md +4 -0
  67. package/.llm/digest/textscroll.md +43 -0
  68. package/.llm/digest/tiers.md +50 -0
  69. package/.llm/index.md +19 -3
  70. package/.llm/tokens.md +26 -1
  71. package/AGENTS.md +17 -1
  72. package/dist/components/awards-data.d.ts +24 -0
  73. package/dist/components/awards-data.js +11 -0
  74. package/dist/components/block-image-data.d.ts +24 -0
  75. package/dist/components/block-image-data.js +9 -0
  76. package/dist/components/blocks/awards/Awards.css +134 -0
  77. package/dist/components/blocks/awards/Awards.d.ts +24 -0
  78. package/dist/components/blocks/awards/Awards.js +114 -0
  79. package/dist/components/blocks/awards/Awards.types.d.ts +31 -0
  80. package/dist/components/blocks/awards/Awards.types.js +16 -0
  81. package/dist/components/blocks/awards/awards-impl.css +222 -0
  82. package/dist/components/blocks/cards-of.d.ts +16 -0
  83. package/dist/components/blocks/cards-of.js +23 -0
  84. package/dist/components/blocks/comparison-cards/ComparisonCards.css +195 -0
  85. package/dist/components/blocks/comparison-cards/ComparisonCards.d.ts +24 -0
  86. package/dist/components/blocks/comparison-cards/ComparisonCards.js +75 -0
  87. package/dist/components/blocks/comparison-cards/ComparisonCards.types.d.ts +49 -0
  88. package/dist/components/blocks/comparison-cards/ComparisonCards.types.js +26 -0
  89. package/dist/components/blocks/comparison-cards/comparison-cards-impl.css +262 -0
  90. package/dist/components/blocks/comparison-table/ComparisonTable.css +111 -0
  91. package/dist/components/blocks/comparison-table/ComparisonTable.d.ts +25 -0
  92. package/dist/components/blocks/comparison-table/ComparisonTable.js +100 -0
  93. package/dist/components/blocks/comparison-table/ComparisonTable.types.d.ts +36 -0
  94. package/dist/components/blocks/comparison-table/ComparisonTable.types.js +15 -0
  95. package/dist/components/blocks/comparison-table/comparison-table-impl.css +143 -0
  96. package/dist/components/blocks/cta-banner/CtaBanner.css +1 -0
  97. package/dist/components/blocks/cta-banner/CtaBanner.js +2 -2
  98. package/dist/components/blocks/cta-banner/CtaBanner.types.d.ts +4 -3
  99. package/dist/components/blocks/cta-banner/CtaBanner.types.js +1 -1
  100. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.css +1 -0
  101. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.d.ts +1 -1
  102. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.js +6 -2
  103. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.d.ts +8 -0
  104. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.js +1 -1
  105. package/dist/components/blocks/data-table/DataTable.css +170 -0
  106. package/dist/components/blocks/data-table/DataTable.d.ts +29 -0
  107. package/dist/components/blocks/data-table/DataTable.js +84 -0
  108. package/dist/components/blocks/data-table/DataTable.types.d.ts +69 -0
  109. package/dist/components/blocks/data-table/DataTable.types.js +19 -0
  110. package/dist/components/blocks/data-table/data-table-impl.css +155 -0
  111. package/dist/components/blocks/download-banner/DownloadBanner.css +228 -0
  112. package/dist/components/blocks/download-banner/DownloadBanner.d.ts +28 -0
  113. package/dist/components/blocks/download-banner/DownloadBanner.js +75 -0
  114. package/dist/components/blocks/download-banner/DownloadBanner.types.d.ts +56 -0
  115. package/dist/components/blocks/download-banner/DownloadBanner.types.js +23 -0
  116. package/dist/components/blocks/download-banner/download-banner-impl.css +216 -0
  117. package/dist/components/blocks/faq-accordion/FaqAccordion.css +1 -0
  118. package/dist/components/blocks/faq-accordion/faq-accordion-impl.css +3 -7
  119. package/dist/components/blocks/feature-bullets/FeatureBullets.css +1 -0
  120. package/dist/components/blocks/feature-bullets/feature-bullets-impl.css +14 -1
  121. package/dist/components/blocks/feature-cards/FeatureCards.css +1 -0
  122. package/dist/components/blocks/feature-cards/FeatureCards.d.ts +2 -1
  123. package/dist/components/blocks/feature-cards/FeatureCards.js +4 -21
  124. package/dist/components/blocks/feature-cards/feature-cards-impl.css +10 -9
  125. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.css +115 -0
  126. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.d.ts +30 -0
  127. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.js +160 -0
  128. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.d.ts +52 -0
  129. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.js +17 -0
  130. package/dist/components/blocks/feature-cards-carousel/feature-cards-carousel-impl.css +207 -0
  131. package/dist/components/blocks/feature-scroll/FeatureScroll.css +1 -0
  132. package/dist/components/blocks/feature-split/FeatureSplit.css +1 -0
  133. package/dist/components/blocks/feature-split/feature-split-impl.css +14 -1
  134. package/dist/components/blocks/feature-stack/FeatureStack.css +86 -0
  135. package/dist/components/blocks/feature-stack/FeatureStack.d.ts +19 -0
  136. package/dist/components/blocks/feature-stack/FeatureStack.js +27 -0
  137. package/dist/components/blocks/feature-stack/FeatureStack.types.d.ts +34 -0
  138. package/dist/components/blocks/feature-stack/FeatureStack.types.js +14 -0
  139. package/dist/components/blocks/feature-stack/feature-stack-impl.css +87 -0
  140. package/dist/components/blocks/image-banner/ImageBanner.css +133 -0
  141. package/dist/components/blocks/image-banner/ImageBanner.d.ts +32 -0
  142. package/dist/components/blocks/image-banner/ImageBanner.js +41 -0
  143. package/dist/components/blocks/image-banner/ImageBanner.types.d.ts +54 -0
  144. package/dist/components/blocks/image-banner/ImageBanner.types.js +14 -0
  145. package/dist/components/blocks/image-banner/image-banner-impl.css +281 -0
  146. package/dist/components/blocks/landing-hero/LandingHero.css +1 -0
  147. package/dist/components/blocks/logo-columns/LogoColumns.css +1 -0
  148. package/dist/components/blocks/logo-rows/LogoRows.css +1 -0
  149. package/dist/components/blocks/page-header/PageHeader.css +1 -0
  150. package/dist/components/blocks/page-header/PageHeader.js +2 -2
  151. package/dist/components/blocks/page-header/PageHeader.types.d.ts +4 -2
  152. package/dist/components/blocks/page-header/PageHeader.types.js +1 -1
  153. package/dist/components/blocks/page-header/page-header-impl.css +5 -3
  154. package/dist/components/blocks/product-hero/ProductHero.css +8 -3
  155. package/dist/components/blocks/product-hero/ProductHero.d.ts +1 -1
  156. package/dist/components/blocks/product-hero/ProductHero.js +5 -2
  157. package/dist/components/blocks/product-hero/ProductHero.types.d.ts +5 -1
  158. package/dist/components/blocks/product-hero/ProductHero.types.js +1 -0
  159. package/dist/components/blocks/product-hero/product-hero-impl.css +43 -12
  160. package/dist/components/blocks/resource-banner/ResourceBanner.css +106 -0
  161. package/dist/components/blocks/resource-banner/ResourceBanner.d.ts +32 -0
  162. package/dist/components/blocks/resource-banner/ResourceBanner.js +51 -0
  163. package/dist/components/blocks/resource-banner/ResourceBanner.types.d.ts +44 -0
  164. package/dist/components/blocks/resource-banner/ResourceBanner.types.js +14 -0
  165. package/dist/components/blocks/resource-banner/resource-banner-impl.css +69 -0
  166. package/dist/components/blocks/scene-scroll/SceneScroll.css +93 -0
  167. package/dist/components/blocks/scene-scroll/SceneScroll.d.ts +36 -0
  168. package/dist/components/blocks/scene-scroll/SceneScroll.js +54 -0
  169. package/dist/components/blocks/scene-scroll/SceneScroll.types.d.ts +32 -0
  170. package/dist/components/blocks/scene-scroll/SceneScroll.types.js +15 -0
  171. package/dist/components/blocks/scene-scroll/scene-scroll-impl.css +275 -0
  172. package/dist/components/blocks/stats/Stats.css +139 -0
  173. package/dist/components/blocks/stats/Stats.d.ts +24 -0
  174. package/dist/components/blocks/stats/Stats.js +120 -0
  175. package/dist/components/blocks/stats/Stats.types.d.ts +36 -0
  176. package/dist/components/blocks/stats/Stats.types.js +19 -0
  177. package/dist/components/blocks/stats/stats-count.d.ts +34 -0
  178. package/dist/components/blocks/stats/stats-count.js +61 -0
  179. package/dist/components/blocks/stats/stats-impl.css +284 -0
  180. package/dist/components/blocks/stats/use-wheel.d.ts +37 -0
  181. package/dist/components/blocks/stats/use-wheel.js +126 -0
  182. package/dist/components/blocks/steps/Steps.css +202 -0
  183. package/dist/components/blocks/steps/Steps.d.ts +32 -0
  184. package/dist/components/blocks/steps/Steps.js +65 -0
  185. package/dist/components/blocks/steps/Steps.types.d.ts +48 -0
  186. package/dist/components/blocks/steps/Steps.types.js +21 -0
  187. package/dist/components/blocks/steps/steps-impl.css +216 -0
  188. package/dist/components/blocks/steps/use-turn.d.ts +33 -0
  189. package/dist/components/blocks/steps/use-turn.js +75 -0
  190. package/dist/components/blocks/sticky-cards/StickyCards.css +154 -0
  191. package/dist/components/blocks/sticky-cards/StickyCards.d.ts +35 -0
  192. package/dist/components/blocks/sticky-cards/StickyCards.js +153 -0
  193. package/dist/components/blocks/sticky-cards/StickyCards.types.d.ts +43 -0
  194. package/dist/components/blocks/sticky-cards/StickyCards.types.js +18 -0
  195. package/dist/components/blocks/sticky-cards/sticky-cards-impl.css +393 -0
  196. package/dist/components/blocks/team-grid/TeamGrid.css +159 -0
  197. package/dist/components/blocks/team-grid/TeamGrid.d.ts +28 -0
  198. package/dist/components/blocks/team-grid/TeamGrid.js +74 -0
  199. package/dist/components/blocks/team-grid/TeamGrid.types.d.ts +51 -0
  200. package/dist/components/blocks/team-grid/TeamGrid.types.js +20 -0
  201. package/dist/components/blocks/team-grid/team-grid-impl.css +129 -0
  202. package/dist/components/blocks/testimonial-row/TestimonialRow.css +1 -0
  203. package/dist/components/blocks/testimonial-row/TestimonialRow.d.ts +1 -1
  204. package/dist/components/blocks/testimonial-row/TestimonialRow.js +4 -3
  205. package/dist/components/blocks/testimonial-row/TestimonialRow.types.d.ts +3 -0
  206. package/dist/components/blocks/testimonial-row/TestimonialRow.types.js +1 -1
  207. package/dist/components/blocks/testimonial-row/testimonial-row-impl.css +8 -0
  208. package/dist/components/blocks/testimonial-slider/TestimonialSlider.css +1 -0
  209. package/dist/components/blocks/testimonial-slider/TestimonialSlider.d.ts +1 -1
  210. package/dist/components/blocks/testimonial-slider/TestimonialSlider.js +2 -2
  211. package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.d.ts +8 -0
  212. package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.js +1 -1
  213. package/dist/components/blocks/text-scroll/TextScroll.css +53 -0
  214. package/dist/components/blocks/text-scroll/TextScroll.d.ts +5 -0
  215. package/dist/components/blocks/text-scroll/TextScroll.js +71 -0
  216. package/dist/components/blocks/text-scroll/TextScroll.types.d.ts +22 -0
  217. package/dist/components/blocks/text-scroll/TextScroll.types.js +10 -0
  218. package/dist/components/blocks/text-scroll/text-scroll-impl.css +115 -0
  219. package/dist/components/blocks/tiers/Tiers.css +233 -0
  220. package/dist/components/blocks/tiers/Tiers.d.ts +32 -0
  221. package/dist/components/blocks/tiers/Tiers.js +68 -0
  222. package/dist/components/blocks/tiers/Tiers.types.d.ts +45 -0
  223. package/dist/components/blocks/tiers/Tiers.types.js +25 -0
  224. package/dist/components/blocks/tiers/tiers-impl.css +185 -0
  225. package/dist/components/blocks/use-rotation.d.ts +12 -2
  226. package/dist/components/blocks/use-rotation.js +6 -28
  227. package/dist/components/comparison-cards-data.d.ts +59 -0
  228. package/dist/components/comparison-cards-data.js +12 -0
  229. package/dist/components/comparison-table-data.d.ts +39 -0
  230. package/dist/components/comparison-table-data.js +11 -0
  231. package/dist/components/core/accordion-item/AccordionItem.css +1 -5
  232. package/dist/components/core/background/Background.css +23 -0
  233. package/dist/components/core/background/Background.d.ts +10 -4
  234. package/dist/components/core/background/Background.js +16 -7
  235. package/dist/components/core/background/Background.types.d.ts +11 -8
  236. package/dist/components/core/background/Background.types.js +3 -1
  237. package/dist/components/core/background/background-impl.css +334 -1
  238. package/dist/components/core/background/halftone.d.ts +11 -0
  239. package/dist/components/core/background/halftone.js +43 -3
  240. package/dist/components/core/background/patterns.d.ts +66 -0
  241. package/dist/components/core/background/patterns.js +244 -0
  242. package/dist/components/core/background/shader.d.ts +44 -0
  243. package/dist/components/core/background/shader.js +307 -0
  244. package/dist/components/core/background/use-shader.d.ts +11 -0
  245. package/dist/components/core/background/use-shader.js +25 -0
  246. package/dist/components/core/background/use-spotlight.d.ts +2 -1
  247. package/dist/components/core/background/use-spotlight.js +9 -1
  248. package/dist/components/core/bottom-sheet/BottomSheet.js +2 -2
  249. package/dist/components/core/bottom-sheet/BottomSheet.types.d.ts +3 -1
  250. package/dist/components/core/breadcrumb/Breadcrumb.d.ts +1 -0
  251. package/dist/components/core/breadcrumb/Breadcrumb.js +1 -0
  252. package/dist/components/core/breadcrumb/breadcrumb-impl.css +11 -0
  253. package/dist/components/core/button/button-impl.css +14 -1
  254. package/dist/components/core/illustration-card/IllustrationCard.js +1 -1
  255. package/dist/components/core/illustration-card/illustration-card-impl.css +20 -0
  256. package/dist/components/core/illustration-scene/IllustrationScene.css +4 -7
  257. package/dist/components/core/illustration-scene/IllustrationScene.types.d.ts +2 -3
  258. package/dist/components/core/illustration-scene/illustration-scene-impl.css +7 -1
  259. package/dist/components/core/link/Link.js +7 -3
  260. package/dist/components/core/link/link-impl.css +29 -2
  261. package/dist/components/core/navbar/Navbar.css +2 -2
  262. package/dist/components/core/navbar/Navbar.types.d.ts +1 -1
  263. package/dist/components/core/navbar-item/NavbarItem.d.ts +2 -1
  264. package/dist/components/core/navbar-item/NavbarItem.js +3 -10
  265. package/dist/components/core/navbar-item/NavbarItem.types.d.ts +4 -1
  266. package/dist/components/core/navbar-item/NavbarItem.types.js +1 -1
  267. package/dist/components/core/navbar-item/navbar-item-impl.css +10 -0
  268. package/dist/components/core/navbar-menu/navbar-menu-impl.css +9 -0
  269. package/dist/components/core/navbar-switcher/navbar-switcher-impl.css +19 -0
  270. package/dist/components/core/pagination/Pagination.js +1 -1
  271. package/dist/components/core/pagination/pagination-impl.css +9 -0
  272. package/dist/components/core/pagination-dots/PaginationDots.d.ts +1 -1
  273. package/dist/components/core/pagination-dots/PaginationDots.js +3 -3
  274. package/dist/components/core/pagination-dots/PaginationDots.types.d.ts +3 -1
  275. package/dist/components/core/segmented-control/SegmentedControl.css +4 -3
  276. package/dist/components/core/segmented-control/SegmentedControl.js +17 -3
  277. package/dist/components/core/segmented-control-item/SegmentedControlItem.css +2 -1
  278. package/dist/components/core/select/Select.js +3 -3
  279. package/dist/components/core/select/Select.types.d.ts +11 -1
  280. package/dist/components/core/select/Select.types.js +1 -1
  281. package/dist/components/core/tab-list/TabList.js +9 -1
  282. package/dist/components/core/table-header-cell/TableHeaderCell.d.ts +1 -1
  283. package/dist/components/core/table-header-cell/TableHeaderCell.js +5 -2
  284. package/dist/components/core/table-header-cell/TableHeaderCell.types.d.ts +7 -1
  285. package/dist/components/core/table-header-cell/TableHeaderCell.types.js +1 -1
  286. package/dist/components/core/text-area/TextArea.d.ts +1 -1
  287. package/dist/components/core/text-area/TextArea.js +2 -2
  288. package/dist/components/core/text-area/TextArea.types.d.ts +9 -1
  289. package/dist/components/core/text-area/TextArea.types.js +1 -1
  290. package/dist/components/core/text-input/TextInput.d.ts +1 -1
  291. package/dist/components/core/text-input/TextInput.js +2 -2
  292. package/dist/components/core/text-input/TextInput.types.d.ts +9 -1
  293. package/dist/components/core/text-input/TextInput.types.js +1 -1
  294. package/dist/components/data-table-data.d.ts +33 -0
  295. package/dist/components/data-table-data.js +12 -0
  296. package/dist/components/download-banner-data.d.ts +52 -0
  297. package/dist/components/download-banner-data.js +11 -0
  298. package/dist/components/index.d.ts +45 -0
  299. package/dist/components/index.js +32 -0
  300. package/dist/components/resource-banner-data.d.ts +34 -0
  301. package/dist/components/resource-banner-data.js +13 -0
  302. package/dist/components/scene-scroll-data.d.ts +24 -0
  303. package/dist/components/scene-scroll-data.js +9 -0
  304. package/dist/components/stats-data.d.ts +28 -0
  305. package/dist/components/stats-data.js +11 -0
  306. package/dist/components/steps-data.d.ts +38 -0
  307. package/dist/components/steps-data.js +13 -0
  308. package/dist/components/sticky-cards-data.d.ts +43 -0
  309. package/dist/components/sticky-cards-data.js +12 -0
  310. package/dist/components/team-grid-data.d.ts +38 -0
  311. package/dist/components/team-grid-data.js +11 -0
  312. package/dist/components/tiers-data.d.ts +47 -0
  313. package/dist/components/tiers-data.js +13 -0
  314. package/dist/marketing.css +77 -28
  315. package/package.json +1 -1
@@ -0,0 +1,155 @@
1
+ /*
2
+ * Scoped to this package, like the generated sheet beside it.
3
+ */
4
+
5
+ /*
6
+ * The frame's fill: the stack the table's pinned column paints.
7
+ *
8
+ * Table's pinned first column cannot be see-through — the values slide under it — so it paints a
9
+ * ground of its own, and that ground is a fixed stack: the page as an opaque floor, the grey band
10
+ * over it and a raised card over that. In light all three are opaque and the stack is white; in
11
+ * dark the band and the card are each white at six, so the stack is a lifted grey. The frame
12
+ * paints the same stack, which is what makes the pinned cells the frame's own colour on every
13
+ * ground and in both themes rather than a strip of a slightly different grey down the table.
14
+ *
15
+ * The floor is the contract's binding; the two layers over it are here because a binding holds
16
+ * one layer and this is two. Listed topmost first, as Table lists them.
17
+ */
18
+ :where([data-dds-context="marketing"]) .dds-datatable .dds-datatable__frame {
19
+ background-image:
20
+ linear-gradient(var(--color-bg-surface-card-raised), var(--color-bg-surface-card-raised)),
21
+ linear-gradient(var(--color-bg-band-subtle), var(--color-bg-band-subtle));
22
+ }
23
+
24
+ /*
25
+ * A part waiting for its state is out of the layout, not merely empty.
26
+ *
27
+ * The empty line and the pager are always in the markup and `hidden` until they are wanted. The
28
+ * browser's own `[hidden]` is `display: none` at the lowest weight there is, and the generated
29
+ * sheet's `display: flex` on the pager beats it — so it is said again here, a class deeper.
30
+ */
31
+ :where([data-dds-context="marketing"]) .dds-datatable .dds-datatable__empty[hidden],
32
+ :where([data-dds-context="marketing"]) .dds-datatable .dds-datatable__pager[hidden] {
33
+ display: none;
34
+ }
35
+
36
+ /*
37
+ * The table's name is the heading's, already on screen.
38
+ *
39
+ * Table names its grid and its scroller from its caption and from nothing else, so the heading's
40
+ * words are handed to it as one — and clipped here rather than drawn a second time an inch under
41
+ * the first. Clipped, not hidden: `display: none` would take the name out of the accessibility
42
+ * tree with the pixels, which is the half that was wanted.
43
+ *
44
+ * SegmentedControlItem's recipe: `clip-path: inset(50%)` clips the caption to nothing without the
45
+ * one-pixel box of the older one, which needs a raw dimension no token covers, and `position:
46
+ * absolute` takes it out of the flow so the grid starts at the frame's rule. The frame is the
47
+ * positioned box it is held in — see its `position` in the contract — so it cannot stray to the
48
+ * foot of the document and widen it.
49
+ */
50
+ :where([data-dds-context="marketing"]) .dds-datatable .dds-table .dds-table__caption {
51
+ clip-path: inset(50%);
52
+ padding: 0;
53
+ position: absolute;
54
+ white-space: nowrap;
55
+ }
56
+
57
+ /*
58
+ * The scroller's focus ring, drawn inside its edge.
59
+ *
60
+ * The table runs the frame's full width and the frame clips to keep its corner, so a ring drawn
61
+ * outside the scroller — Table's own — would be cut off down both sides, which is a ring a keyboard
62
+ * reader sees only half of. Pulled in by its own width, it is whole.
63
+ */
64
+ :where([data-dds-context="marketing"]) .dds-datatable .dds-table {
65
+ outline-offset: calc(-1 * var(--border-width-focus));
66
+ }
67
+
68
+ /*
69
+ * Values on one line, so the table is as wide as its values and scrolls.
70
+ *
71
+ * A specification table's values are short — "1:1000", "-3.00", "Mon–Fri 00:00–21:00" — and one
72
+ * broken over two lines is one a reader misreads down the column. Held to a line, the columns take
73
+ * the room their values need, and the scroller takes the rest: the reference's `max-content` table.
74
+ *
75
+ * Written against the cell's `data-overflow` so it outweighs TableCell's own `wrap` rule, which
76
+ * would otherwise tie with it and win on order — TableCell's sheet arrives after this one.
77
+ */
78
+ :where([data-dds-context="marketing"]) .dds-datatable .dds-tablecell[data-overflow] {
79
+ white-space: nowrap;
80
+ }
81
+
82
+ /*
83
+ * The row's name: a row header that reads as the row's name rather than as a column's.
84
+ *
85
+ * TableHeaderCell is drawn for the header row — muted, ranged to the foot of the cell, at a
86
+ * label's tight leading — and two of those are wrong down the side of the table. The name is the
87
+ * strongest thing in its row, so it takes the default ink; and it sits at the top of the row at the
88
+ * values' leading, as the values beside it do, so the first lines share a baseline.
89
+ *
90
+ * It keeps the header's single line. Allowed to wrap, the one column that could was the one the
91
+ * table squeezed whenever it nearly fitted — "Boom 1000 Index" over three lines beside values with
92
+ * room to spare — so the name holds its width and the values scroll under it instead.
93
+ */
94
+ :where([data-dds-context="marketing"]) .dds-datatable .dds-tableheadercell[scope='row'] {
95
+ color: var(--color-fg-default);
96
+ line-height: var(--font-body-sm-line-height);
97
+ vertical-align: top;
98
+ }
99
+
100
+ /*
101
+ * From the fold, the heading group is centred over the table, the small print centred under it,
102
+ * and the pages move to the end edge.
103
+ *
104
+ * Stats' rule and its reason for the header: content stacked under a heading takes a centred
105
+ * heading, and the header and its line are capped narrower than the column, so `margin-inline:
106
+ * auto` is what centres those boxes rather than their words inside a box left at the start edge.
107
+ * The note under the table follows the reference, centred under the frame. The pages are centred
108
+ * on a phone, where they are the width of the frame, and go to the end edge beside nothing once
109
+ * there is room — the reference's footer.
110
+ *
111
+ * `48rem` longhand because `var()` is not permitted in a container query condition, and it is the
112
+ * width the rest of this package folds at.
113
+ */
114
+ @container (min-width: 48rem) {
115
+ :where([data-dds-context="marketing"]) .dds-datatable .dds-datatable__header {
116
+ align-items: center;
117
+ margin-inline: auto;
118
+ text-align: center;
119
+ }
120
+
121
+ :where([data-dds-context="marketing"]) .dds-datatable .dds-datatable__description {
122
+ margin-inline: auto;
123
+ }
124
+
125
+ :where([data-dds-context="marketing"]) .dds-datatable .dds-datatable__pager {
126
+ justify-content: flex-end;
127
+ }
128
+
129
+ /* The small print centres under the table with the heading over it; on a phone both start at the edge. */
130
+ :where([data-dds-context="marketing"]) .dds-datatable .dds-datatable__footnote {
131
+ margin-inline: auto;
132
+ text-align: center;
133
+ }
134
+ }
135
+
136
+ /*
137
+ * A heading with no line under it closes up, Stats' way: its bound step is the distance to the
138
+ * line, and with nothing there it would only add to the step from the header to the table.
139
+ */
140
+ :where([data-dds-context="marketing"]) .dds-datatable .dds-datatable__title:last-child {
141
+ margin-block-end: 0;
142
+ }
143
+
144
+ /*
145
+ * On a phone the search takes the row, as size.data-table.search says: the cap is for the fold,
146
+ * where the search shares its row with the count. Below it the count wraps underneath, and a search
147
+ * stopped short of the edge is room thrown away on the narrowest screen.
148
+ *
149
+ * `47.9375rem` is the last width below the fold, LogoRows' bound.
150
+ */
151
+ @container (max-width: 47.9375rem) {
152
+ :where([data-dds-context="marketing"]) .dds-datatable .dds-datatable__search {
153
+ max-inline-size: none;
154
+ }
155
+ }
@@ -0,0 +1,228 @@
1
+ /* GENERATED from downloadbanner.contract.json. Do not edit. */
2
+
3
+ :where([data-dds-context="marketing"]) .dds-downloadbanner {
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-downloadbanner .dds-downloadbanner__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
+ }
22
+
23
+ :where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__card {
24
+ box-sizing: border-box;
25
+ display: flex;
26
+ flex-direction: column;
27
+ min-inline-size: 0;
28
+ border-radius: var(--radius-container);
29
+ column-gap: var(--space-heading-content);
30
+ padding-block: var(--space-inset-card);
31
+ padding-inline: var(--space-inset-card);
32
+ row-gap: var(--space-heading-content);
33
+ }
34
+
35
+ :where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__lead {
36
+ align-items: center;
37
+ display: flex;
38
+ min-inline-size: 0;
39
+ column-gap: var(--space-gap-xl);
40
+ }
41
+
42
+ :where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__qr-tile {
43
+ display: none;
44
+ flex-shrink: 0;
45
+ background-color: var(--color-bg-surface-card-light-raised);
46
+ border-radius: var(--radius-container-item);
47
+ padding-block: var(--space-inset-sm);
48
+ padding-inline: var(--space-inset-sm);
49
+ }
50
+
51
+ :where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__qr {
52
+ display: block;
53
+ object-fit: cover;
54
+ block-size: var(--size-download-banner-qr);
55
+ border-radius: var(--radius-subtle);
56
+ inline-size: var(--size-download-banner-qr);
57
+ }
58
+
59
+ :where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__text {
60
+ display: flex;
61
+ flex-direction: column;
62
+ min-inline-size: 0;
63
+ row-gap: var(--space-gap-none);
64
+ }
65
+
66
+ :where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__qr-label {
67
+ display: none;
68
+ margin-block: 0;
69
+ font-family: var(--font-body-lg-family);
70
+ font-size: var(--font-body-lg-size);
71
+ font-weight: var(--font-body-lg-weight);
72
+ letter-spacing: var(--font-body-lg-letter-spacing);
73
+ line-height: var(--font-body-lg-line-height);
74
+ margin-block-end: var(--space-heading-eyebrow-title);
75
+ }
76
+
77
+ :where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__eyebrow {
78
+ margin: 0;
79
+ font-family: var(--font-label-md-family);
80
+ font-size: var(--font-label-md-size);
81
+ font-weight: var(--font-label-md-weight);
82
+ letter-spacing: var(--font-label-md-letter-spacing);
83
+ line-height: var(--font-label-md-line-height);
84
+ margin-block-end: var(--space-heading-eyebrow-title);
85
+ }
86
+
87
+ :where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__title {
88
+ margin-block: 0;
89
+ text-wrap: balance;
90
+ font-family: var(--font-h3-family);
91
+ font-size: var(--font-h3-size);
92
+ font-weight: var(--font-h3-weight);
93
+ letter-spacing: var(--font-h3-letter-spacing);
94
+ line-height: var(--font-h3-line-height);
95
+ }
96
+
97
+ :where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__description {
98
+ margin: 0;
99
+ font-family: var(--font-body-md-family);
100
+ font-size: var(--font-body-md-size);
101
+ font-weight: var(--font-body-md-weight);
102
+ letter-spacing: var(--font-body-md-letter-spacing);
103
+ line-height: var(--font-body-md-line-height);
104
+ margin-block-start: var(--space-heading-title-description-compact);
105
+ max-inline-size: var(--size-measure-description);
106
+ }
107
+
108
+ :where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__disclaimer {
109
+ margin-block: 0;
110
+ font-family: var(--font-body-sm-family);
111
+ font-size: var(--font-body-sm-size);
112
+ font-weight: var(--font-body-sm-weight);
113
+ letter-spacing: var(--font-body-sm-letter-spacing);
114
+ line-height: var(--font-body-sm-line-height);
115
+ margin-block-start: var(--space-heading-title-description-compact);
116
+ max-inline-size: var(--size-measure-description);
117
+ }
118
+
119
+ :where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__badges {
120
+ display: grid;
121
+ list-style: none;
122
+ margin: 0;
123
+ min-inline-size: 0;
124
+ padding: 0;
125
+ column-gap: var(--space-actions-gap);
126
+ row-gap: var(--space-actions-gap);
127
+ }
128
+
129
+ :where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__badge {
130
+ display: flex;
131
+ min-inline-size: 0;
132
+ min-block-size: var(--size-target-min);
133
+ }
134
+
135
+ :where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__badge-link {
136
+ transition-property: outline-color, outline-width, translate;
137
+ align-items: center;
138
+ box-sizing: border-box;
139
+ display: flex;
140
+ justify-content: center;
141
+ max-inline-size: 100%;
142
+ outline-style: solid;
143
+ background-color: var(--color-bg-store-badge);
144
+ block-size: var(--size-control-lg);
145
+ border-radius: var(--radius-subtle);
146
+ inline-size: var(--size-download-banner-badge);
147
+ outline-width: var(--border-width-none);
148
+ padding-block: var(--space-gap-xs);
149
+ padding-inline: var(--space-inset-sm);
150
+ transition-duration: var(--motion-duration-normal);
151
+ transition-timing-function: var(--motion-easing-standard);
152
+ }
153
+
154
+ :where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__mark {
155
+ block-size: 100%;
156
+ display: block;
157
+ inline-size: 100%;
158
+ max-block-size: var(--size-control-md);
159
+ }
160
+
161
+ :where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__media {
162
+ display: flex;
163
+ justify-content: center;
164
+ overflow: clip;
165
+ border-start-end-radius: var(--radius-container);
166
+ border-start-start-radius: var(--radius-container);
167
+ inline-size: var(--size-download-banner-media);
168
+ }
169
+
170
+ :where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__badge-link:hover {
171
+ translate: var(--motion-translate-hover);
172
+ }
173
+
174
+ :where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__badge-link:focus-visible {
175
+ outline-color: var(--color-border-focus);
176
+ outline-width: var(--border-width-focus);
177
+ }
178
+
179
+ :where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="page"] {
180
+ background-color: var(--color-bg-page);
181
+ color: var(--color-fg-default);
182
+ }
183
+
184
+ :where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="page"] .dds-downloadbanner__card {
185
+ background-color: var(--color-bg-surface);
186
+ }
187
+
188
+ :where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="page"] .dds-downloadbanner__disclaimer {
189
+ color: var(--color-fg-muted);
190
+ }
191
+
192
+ :where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="strong"] {
193
+ background-color: var(--color-bg-brand-strong);
194
+ color: var(--color-fg-on-brand-strong);
195
+ }
196
+
197
+ :where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="strong"] .dds-downloadbanner__card {
198
+ background-color: var(--color-bg-surface-card-strong);
199
+ color: var(--color-fg-on-brand-strong);
200
+ }
201
+
202
+ :where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="strong"] .dds-downloadbanner__disclaimer {
203
+ color: var(--color-fg-muted-inverse);
204
+ }
205
+
206
+ :where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="subtle"] {
207
+ background-color: var(--color-bg-page);
208
+ background-image: linear-gradient(var(--color-bg-band-subtle), var(--color-bg-band-subtle));
209
+ color: var(--color-fg-default);
210
+ }
211
+
212
+ :where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="subtle"] .dds-downloadbanner__card {
213
+ background-color: var(--color-bg-surface-card-raised);
214
+ }
215
+
216
+ :where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="subtle"] .dds-downloadbanner__disclaimer {
217
+ color: var(--color-fg-muted);
218
+ }
219
+
220
+ :where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="strong"] .dds-downloadbanner__badge-link:focus-visible {
221
+ outline-color: var(--color-border-focus-on-brand-strong);
222
+ }
223
+
224
+ @media (prefers-reduced-motion: reduce) {
225
+ :where([data-dds-context="marketing"]) .dds-downloadbanner,
226
+ :where([data-dds-context="marketing"]) .dds-downloadbanner * { transition: none !important; }
227
+ }
228
+
@@ -0,0 +1,28 @@
1
+ import './DownloadBanner.css';
2
+ import './download-banner-impl.css';
3
+ import '../block-reveal.css';
4
+ import { type DownloadBannerProps } from './DownloadBanner.types.js';
5
+ export type { DownloadBannerProps };
6
+ /**
7
+ * A card promoting the app's downloads — the reference site's DownloadBanner.
8
+ *
9
+ * A heading and the stores' badges, and from the fold a QR code beside the heading with a line
10
+ * telling the reader to scan it. On a phone the code and its line are not drawn: the reader is
11
+ * already holding the device the code would open on, so the heading stands alone over the badges,
12
+ * two to a row. The reference swapped in a second heading there; this keeps the one, so the region
13
+ * is named the same at every width.
14
+ *
15
+ * The badges are records rather than elements: a platform and a link. The component picks the
16
+ * artwork from the platform, so a page cannot hand over a redrawn or outdated store badge, and names
17
+ * each link by the words its artwork carries unless the record gives a label of its own.
18
+ *
19
+ * Two ways to draw the card. The standard card takes the ground's fill. The featured card is for a
20
+ * page promoting an app: the brand's coral, with a Background pattern drawn inside it as a layer
21
+ * under its content — the aurora unless the page names the mesh — laid out as a split, the app's
22
+ * name, the heading and the badges with the code beside them on one side and the app's own image on
23
+ * the other, rising out of the card. Its words are white, and the pattern answers the pointer.
24
+ *
25
+ * It arrives the way every block does: the code, then the words, then the badges. `'use client'`
26
+ * for that and for `useId`, which names the region by its heading.
27
+ */
28
+ export declare function DownloadBanner({ ground, variant, pattern, eyebrow, media, title, description, badges, qr, disclaimer, }: DownloadBannerProps): import("react").JSX.Element;
@@ -0,0 +1,75 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useId } from 'react';
4
+ import { AndroidApkFillColoredIcon, AppleAppStoreFillColoredIcon, AppleDmgFillColoredIcon, AppleMacAppStoreFillColoredIcon, GooglePlayFillColoredIcon, HuaweiAppGalleryFillColoredIcon, LinuxFillColoredIcon, WebBrowserFillColoredIcon, WindowsExeFillColoredIcon, WindowsStoreFillColoredIcon, } from '@deriv-com/quill-icons-web';
5
+ import './DownloadBanner.css';
6
+ import './download-banner-impl.css';
7
+ import '../block-reveal.css';
8
+ import { Background } from '../../core/background/Background.js';
9
+ import { given } from '../../given.js';
10
+ import { arriving, useReveal } from '../use-reveal.js';
11
+ import { downloadBannerDefaults, downloadBannerParts } from './DownloadBanner.types.js';
12
+ /**
13
+ * Each platform's artwork, and the words that artwork carries.
14
+ *
15
+ * The artwork is the store's own badge from Quill's app-store set, never redrawn here: a store's
16
+ * badge is a trademark with rules about how it is shown, and the set is where those rules were
17
+ * already kept. The filled, coloured form, because it carries its own black ground — the outline
18
+ * form is dark ink with no ground, which vanishes on the dark band and in dark mode.
19
+ *
20
+ * The words are what the artwork says, so the name a screen reader hears and the name a speech-input
21
+ * user says are the ones on the badge.
22
+ */
23
+ const BADGES = {
24
+ 'app-store': { Mark: AppleAppStoreFillColoredIcon, name: 'Download on the App Store' },
25
+ 'google-play': { Mark: GooglePlayFillColoredIcon, name: 'Get it on Google Play' },
26
+ 'app-gallery': { Mark: HuaweiAppGalleryFillColoredIcon, name: 'Explore it on AppGallery' },
27
+ 'android-apk': { Mark: AndroidApkFillColoredIcon, name: 'Direct download APK file' },
28
+ 'mac-app-store': { Mark: AppleMacAppStoreFillColoredIcon, name: 'Download on the Mac App Store' },
29
+ 'macos-dmg': { Mark: AppleDmgFillColoredIcon, name: 'Download for macOS .dmg' },
30
+ 'windows-store': { Mark: WindowsStoreFillColoredIcon, name: 'Download app for Windows' },
31
+ 'windows-exe': { Mark: WindowsExeFillColoredIcon, name: 'Download for Windows .exe' },
32
+ linux: { Mark: LinuxFillColoredIcon, name: 'Installation on Linux. Download' },
33
+ web: { Mark: WebBrowserFillColoredIcon, name: 'Use it on your web browser' },
34
+ };
35
+ /**
36
+ * A card promoting the app's downloads — the reference site's DownloadBanner.
37
+ *
38
+ * A heading and the stores' badges, and from the fold a QR code beside the heading with a line
39
+ * telling the reader to scan it. On a phone the code and its line are not drawn: the reader is
40
+ * already holding the device the code would open on, so the heading stands alone over the badges,
41
+ * two to a row. The reference swapped in a second heading there; this keeps the one, so the region
42
+ * is named the same at every width.
43
+ *
44
+ * The badges are records rather than elements: a platform and a link. The component picks the
45
+ * artwork from the platform, so a page cannot hand over a redrawn or outdated store badge, and names
46
+ * each link by the words its artwork carries unless the record gives a label of its own.
47
+ *
48
+ * Two ways to draw the card. The standard card takes the ground's fill. The featured card is for a
49
+ * page promoting an app: the brand's coral, with a Background pattern drawn inside it as a layer
50
+ * under its content — the aurora unless the page names the mesh — laid out as a split, the app's
51
+ * name, the heading and the badges with the code beside them on one side and the app's own image on
52
+ * the other, rising out of the card. Its words are white, and the pattern answers the pointer.
53
+ *
54
+ * It arrives the way every block does: the code, then the words, then the badges. `'use client'`
55
+ * for that and for `useId`, which names the region by its heading.
56
+ */
57
+ export function DownloadBanner({ ground = downloadBannerDefaults.ground, variant = downloadBannerDefaults.variant, pattern, eyebrow, media, title, description, badges, qr, disclaimer, }) {
58
+ const titleId = useId();
59
+ /* The code is the standard card's: the featured card promotes the app with its image instead. */
60
+ const code = variant === 'standard' ? qr : undefined;
61
+ const [band, revealed] = useReveal();
62
+ return (_jsx("section", { className: downloadBannerParts.root, "data-ground": ground, "data-variant": variant, "aria-labelledby": titleId, children: _jsx("div", { className: downloadBannerParts.inner, ref: band, "data-revealed": revealed, children: _jsxs("div", { className: downloadBannerParts.card, children: [variant === 'featured' ? (_jsx(Background, { tone: "brand", pattern: pattern ?? 'aurora', children: null })) : null, _jsxs("div", { className: downloadBannerParts.lead, children: [code ? (_jsx("div", { className: downloadBannerParts['qr-tile'], ...arriving(0), children: _jsx("img", { className: downloadBannerParts.qr, src: code.src, alt: code.alt }) })) : null, _jsxs("div", { className: downloadBannerParts.text, ...arriving(1), children: [code ? _jsx("p", { className: downloadBannerParts['qr-label'], children: code.label }) : null, variant === 'featured' && given(eyebrow) ? (_jsx("p", { className: downloadBannerParts.eyebrow, children: eyebrow })) : null, _jsx("h2", { className: downloadBannerParts.title, id: titleId, children: title }), given(description) ? _jsx("p", { className: downloadBannerParts.description, children: description }) : null, given(disclaimer) ? _jsx("p", { className: downloadBannerParts.disclaimer, children: disclaimer }) : null] })] }), badges.length > 0 ? (_jsx("ul", { className: downloadBannerParts.badges, ...arriving(2), children: badges.map(({ platform, href, label }, at) => {
63
+ /* A platform this has no artwork for draws nothing rather than a blank link: the
64
+ type rules it out, and a record from a feed or an editor is not typed. */
65
+ const badge = BADGES[platform];
66
+ if (badge === undefined)
67
+ return null;
68
+ const { Mark, name } = badge;
69
+ return (
70
+ /* Keyed by place as well as platform: a page may list one platform twice — two
71
+ builds of the same desktop app — and a key repeated is a badge React confuses
72
+ with the other. */
73
+ _jsx("li", { className: downloadBannerParts.badge, children: _jsx("a", { className: downloadBannerParts['badge-link'], href: href, "aria-label": given(label) ? label : name, children: _jsx(Mark, { className: downloadBannerParts.mark, width: undefined, height: undefined, "aria-hidden": "true", focusable: "false" }) }) }, `${platform}-${at}`));
74
+ }) })) : null, variant === 'featured' && media !== undefined && media !== null ? (_jsx("div", { className: downloadBannerParts.media, ...arriving(3), children: media })) : null] }) }) }));
75
+ }
@@ -0,0 +1,56 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { DownloadBannerBadge, DownloadBannerQr } from '../../download-banner-data.js';
3
+ export interface DownloadBannerOwnProps {
4
+ /**
5
+ * `page` — The default, and the page's own white. The card is the recessed gray that sets it off — the reference design's light-2
6
+ * `subtle` — The grey band, with the card white on it — the reference design's light. Painted as the band's tint laid over the page's own ground, so it is the same grey whatever is behind the section
7
+ * `strong` — `color.bg.brand-strong`, the dark band, with the card at color.bg.surface-card-strong and white words on it — the reference design's dark. For a download section a reader should arrive at; the badges are black and keep their own edge on it
8
+ */
9
+ ground?: 'page' | 'subtle' | 'strong';
10
+ /** The featured card only: the app itself — a screenshot of it in a phone, the page's own image. It stands at the card's end, rising out of the card's top edge and resting on its bottom one, so the card reads as the app being held out to the reader. On a phone it sits under the badges. */
11
+ media?: ReactNode;
12
+ /** The featured card only: the app's name, or what kind of app it is, small above the heading — "Deriv GO", "Mobile app". */
13
+ eyebrow?: string;
14
+ /** Always. Where the app can be had, in a few words — "Trade on the go", "Available on". The section's heading at every width: under the scan line beside the code from the fold, and alone over the badges on a phone. */
15
+ title: string;
16
+ /** A line under the heading saying what the app gives a reader — "Trade on the go with the same account, markets and tools." One sentence. */
17
+ description?: string;
18
+ /** Always. The stores and downloads the app is in, in the order a reader should meet them — mobile stores first, then desktop, then the web. Each names its `platform`, which picks the store's own artwork, and the `href` that reaches the product in it. An empty list draws no badges. */
19
+ badges: DownloadBannerBadge[];
20
+ /** A QR code reaching the same app the badges do, so a reader at a desktop can take it to their phone. The page's image, with the words it is read as and the line telling the reader to scan it. Drawn from the fold and never on a phone, where the reader is already holding the device it would open on, and only on the standard card: the featured card promotes an app with its image, and the badges are its one way in. Leave it out and the heading stands alone at every width. */
21
+ qr?: DownloadBannerQr;
22
+ /** One line of small print under the heading — which versions the desktop app runs on, or where the app is not offered. */
23
+ disclaimer?: string;
24
+ }
25
+ export type DownloadBannerProps = DownloadBannerOwnProps & ({
26
+ variant?: 'standard' | 'featured';
27
+ pattern?: undefined;
28
+ } | {
29
+ variant: Exclude<'standard' | 'featured', 'standard'>;
30
+ pattern?: 'aurora' | 'mesh';
31
+ });
32
+ /** The class each part carries. Apply these — do not retype them. */
33
+ export declare const downloadBannerParts: {
34
+ readonly root: "dds-downloadbanner";
35
+ readonly inner: "dds-downloadbanner__inner";
36
+ readonly card: "dds-downloadbanner__card";
37
+ readonly lead: "dds-downloadbanner__lead";
38
+ readonly 'qr-tile': "dds-downloadbanner__qr-tile";
39
+ readonly qr: "dds-downloadbanner__qr";
40
+ readonly text: "dds-downloadbanner__text";
41
+ readonly 'qr-label': "dds-downloadbanner__qr-label";
42
+ readonly eyebrow: "dds-downloadbanner__eyebrow";
43
+ readonly title: "dds-downloadbanner__title";
44
+ readonly description: "dds-downloadbanner__description";
45
+ readonly disclaimer: "dds-downloadbanner__disclaimer";
46
+ readonly badges: "dds-downloadbanner__badges";
47
+ readonly badge: "dds-downloadbanner__badge";
48
+ readonly 'badge-link': "dds-downloadbanner__badge-link";
49
+ readonly mark: "dds-downloadbanner__mark";
50
+ readonly media: "dds-downloadbanner__media";
51
+ };
52
+ /** Generated so defaults cannot drift from the contract. */
53
+ export declare const downloadBannerDefaults: {
54
+ readonly ground: "page";
55
+ readonly variant: "standard";
56
+ };
@@ -0,0 +1,23 @@
1
+ // GENERATED from download-banner.contract.json. Do not edit.
2
+ /** The class each part carries. Apply these — do not retype them. */
3
+ export const downloadBannerParts = {
4
+ root: 'dds-downloadbanner',
5
+ inner: 'dds-downloadbanner__inner',
6
+ card: 'dds-downloadbanner__card',
7
+ lead: 'dds-downloadbanner__lead',
8
+ 'qr-tile': 'dds-downloadbanner__qr-tile',
9
+ qr: 'dds-downloadbanner__qr',
10
+ text: 'dds-downloadbanner__text',
11
+ 'qr-label': 'dds-downloadbanner__qr-label',
12
+ eyebrow: 'dds-downloadbanner__eyebrow',
13
+ title: 'dds-downloadbanner__title',
14
+ description: 'dds-downloadbanner__description',
15
+ disclaimer: 'dds-downloadbanner__disclaimer',
16
+ badges: 'dds-downloadbanner__badges',
17
+ badge: 'dds-downloadbanner__badge',
18
+ 'badge-link': 'dds-downloadbanner__badge-link',
19
+ mark: 'dds-downloadbanner__mark',
20
+ media: 'dds-downloadbanner__media',
21
+ };
22
+ /** Generated so defaults cannot drift from the contract. */
23
+ export const downloadBannerDefaults = { ground: 'page', variant: 'standard' };