@deriv-com/dds-marketing 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/.llm/components/awards.md +209 -0
  2. package/.llm/components/background.md +420 -0
  3. package/.llm/components/bottomsheet.md +5 -0
  4. package/.llm/components/comparisoncards.md +257 -0
  5. package/.llm/components/comparisontable.md +231 -0
  6. package/.llm/components/ctabanner.md +22 -0
  7. package/.llm/components/ctabannerslider.md +36 -2
  8. package/.llm/components/datatable.md +273 -0
  9. package/.llm/components/downloadbanner.md +283 -0
  10. package/.llm/components/featurecards.md +41 -3
  11. package/.llm/components/featurecardscarousel.md +311 -0
  12. package/.llm/components/featuresplit.md +5 -0
  13. package/.llm/components/featurestack.md +227 -0
  14. package/.llm/components/illustrationcard.md +236 -0
  15. package/.llm/components/illustrationscene.md +229 -0
  16. package/.llm/components/imagebanner.md +278 -0
  17. package/.llm/components/landinghero.md +24 -0
  18. package/.llm/components/navbar.md +1 -1
  19. package/.llm/components/navbaritem.md +4 -0
  20. package/.llm/components/pageheader.md +22 -0
  21. package/.llm/components/paginationdots.md +6 -1
  22. package/.llm/components/producthero.md +35 -11
  23. package/.llm/components/resourcebanner.md +247 -0
  24. package/.llm/components/scenescroll.md +222 -0
  25. package/.llm/components/select.md +17 -0
  26. package/.llm/components/stats.md +219 -0
  27. package/.llm/components/steps.md +286 -0
  28. package/.llm/components/stickycards.md +251 -0
  29. package/.llm/components/tableheadercell.md +19 -0
  30. package/.llm/components/teamgrid.md +243 -0
  31. package/.llm/components/testimonialrow.md +5 -0
  32. package/.llm/components/testimonialslider.md +14 -1
  33. package/.llm/components/textarea.md +13 -0
  34. package/.llm/components/textinput.md +13 -0
  35. package/.llm/components/textscroll.md +187 -0
  36. package/.llm/components/tiers.md +227 -0
  37. package/.llm/digest/awards.md +45 -0
  38. package/.llm/digest/background.md +53 -0
  39. package/.llm/digest/bottomsheet.md +2 -0
  40. package/.llm/digest/comparisoncards.md +51 -0
  41. package/.llm/digest/comparisontable.md +53 -0
  42. package/.llm/digest/ctabanner.md +4 -0
  43. package/.llm/digest/ctabannerslider.md +7 -0
  44. package/.llm/digest/datatable.md +65 -0
  45. package/.llm/digest/downloadbanner.md +65 -0
  46. package/.llm/digest/featurecards.md +1 -1
  47. package/.llm/digest/featurecardscarousel.md +54 -0
  48. package/.llm/digest/featuresplit.md +1 -0
  49. package/.llm/digest/featurestack.md +48 -0
  50. package/.llm/digest/illustrationcard.md +46 -0
  51. package/.llm/digest/illustrationscene.md +50 -0
  52. package/.llm/digest/imagebanner.md +64 -0
  53. package/.llm/digest/landinghero.md +7 -0
  54. package/.llm/digest/navbaritem.md +1 -0
  55. package/.llm/digest/pageheader.md +4 -0
  56. package/.llm/digest/paginationdots.md +3 -1
  57. package/.llm/digest/producthero.md +4 -2
  58. package/.llm/digest/resourcebanner.md +53 -0
  59. package/.llm/digest/scenescroll.md +49 -0
  60. package/.llm/digest/select.md +5 -0
  61. package/.llm/digest/stats.md +46 -0
  62. package/.llm/digest/steps.md +55 -0
  63. package/.llm/digest/stickycards.md +52 -0
  64. package/.llm/digest/tableheadercell.md +4 -0
  65. package/.llm/digest/teamgrid.md +53 -0
  66. package/.llm/digest/testimonialrow.md +2 -0
  67. package/.llm/digest/testimonialslider.md +4 -0
  68. package/.llm/digest/textarea.md +4 -0
  69. package/.llm/digest/textinput.md +4 -0
  70. package/.llm/digest/textscroll.md +43 -0
  71. package/.llm/digest/tiers.md +50 -0
  72. package/.llm/index.md +25 -2
  73. package/.llm/tokens.md +37 -1
  74. package/AGENTS.md +20 -1
  75. package/dist/components/awards-data.d.ts +24 -0
  76. package/dist/components/awards-data.js +11 -0
  77. package/dist/components/block-image-data.d.ts +24 -0
  78. package/dist/components/block-image-data.js +9 -0
  79. package/dist/components/blocks/awards/Awards.css +134 -0
  80. package/dist/components/blocks/awards/Awards.d.ts +24 -0
  81. package/dist/components/blocks/awards/Awards.js +114 -0
  82. package/dist/components/blocks/awards/Awards.types.d.ts +31 -0
  83. package/dist/components/blocks/awards/Awards.types.js +16 -0
  84. package/dist/components/blocks/awards/awards-impl.css +222 -0
  85. package/dist/components/blocks/cards-of.d.ts +16 -0
  86. package/dist/components/blocks/cards-of.js +23 -0
  87. package/dist/components/blocks/comparison-cards/ComparisonCards.css +195 -0
  88. package/dist/components/blocks/comparison-cards/ComparisonCards.d.ts +24 -0
  89. package/dist/components/blocks/comparison-cards/ComparisonCards.js +75 -0
  90. package/dist/components/blocks/comparison-cards/ComparisonCards.types.d.ts +49 -0
  91. package/dist/components/blocks/comparison-cards/ComparisonCards.types.js +26 -0
  92. package/dist/components/blocks/comparison-cards/comparison-cards-impl.css +262 -0
  93. package/dist/components/blocks/comparison-table/ComparisonTable.css +111 -0
  94. package/dist/components/blocks/comparison-table/ComparisonTable.d.ts +25 -0
  95. package/dist/components/blocks/comparison-table/ComparisonTable.js +100 -0
  96. package/dist/components/blocks/comparison-table/ComparisonTable.types.d.ts +36 -0
  97. package/dist/components/blocks/comparison-table/ComparisonTable.types.js +15 -0
  98. package/dist/components/blocks/comparison-table/comparison-table-impl.css +143 -0
  99. package/dist/components/blocks/cta-banner/CtaBanner.css +1 -0
  100. package/dist/components/blocks/cta-banner/CtaBanner.d.ts +1 -1
  101. package/dist/components/blocks/cta-banner/CtaBanner.js +3 -2
  102. package/dist/components/blocks/cta-banner/CtaBanner.types.d.ts +6 -0
  103. package/dist/components/blocks/cta-banner/CtaBanner.types.js +1 -1
  104. package/dist/components/blocks/cta-banner/cta-banner-impl.css +8 -0
  105. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.css +1 -0
  106. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.d.ts +1 -1
  107. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.js +10 -5
  108. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.d.ts +12 -0
  109. package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.js +1 -1
  110. package/dist/components/blocks/cta-banner-slider/cta-banner-slider-impl.css +8 -0
  111. package/dist/components/blocks/data-table/DataTable.css +170 -0
  112. package/dist/components/blocks/data-table/DataTable.d.ts +29 -0
  113. package/dist/components/blocks/data-table/DataTable.js +84 -0
  114. package/dist/components/blocks/data-table/DataTable.types.d.ts +69 -0
  115. package/dist/components/blocks/data-table/DataTable.types.js +19 -0
  116. package/dist/components/blocks/data-table/data-table-impl.css +155 -0
  117. package/dist/components/blocks/download-banner/DownloadBanner.css +228 -0
  118. package/dist/components/blocks/download-banner/DownloadBanner.d.ts +28 -0
  119. package/dist/components/blocks/download-banner/DownloadBanner.js +75 -0
  120. package/dist/components/blocks/download-banner/DownloadBanner.types.d.ts +56 -0
  121. package/dist/components/blocks/download-banner/DownloadBanner.types.js +23 -0
  122. package/dist/components/blocks/download-banner/download-banner-impl.css +216 -0
  123. package/dist/components/blocks/faq-accordion/FaqAccordion.css +1 -0
  124. package/dist/components/blocks/faq-accordion/faq-accordion-impl.css +3 -7
  125. package/dist/components/blocks/feature-bullets/FeatureBullets.css +1 -0
  126. package/dist/components/blocks/feature-bullets/feature-bullets-impl.css +14 -1
  127. package/dist/components/blocks/feature-cards/FeatureCards.css +1 -0
  128. package/dist/components/blocks/feature-cards/FeatureCards.d.ts +2 -1
  129. package/dist/components/blocks/feature-cards/FeatureCards.js +4 -21
  130. package/dist/components/blocks/feature-cards/feature-cards-impl.css +10 -9
  131. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.css +115 -0
  132. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.d.ts +30 -0
  133. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.js +160 -0
  134. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.d.ts +52 -0
  135. package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.js +17 -0
  136. package/dist/components/blocks/feature-cards-carousel/feature-cards-carousel-impl.css +207 -0
  137. package/dist/components/blocks/feature-scroll/FeatureScroll.css +1 -0
  138. package/dist/components/blocks/feature-split/FeatureSplit.css +1 -0
  139. package/dist/components/blocks/feature-split/feature-split-impl.css +14 -1
  140. package/dist/components/blocks/feature-stack/FeatureStack.css +86 -0
  141. package/dist/components/blocks/feature-stack/FeatureStack.d.ts +19 -0
  142. package/dist/components/blocks/feature-stack/FeatureStack.js +27 -0
  143. package/dist/components/blocks/feature-stack/FeatureStack.types.d.ts +34 -0
  144. package/dist/components/blocks/feature-stack/FeatureStack.types.js +14 -0
  145. package/dist/components/blocks/feature-stack/feature-stack-impl.css +87 -0
  146. package/dist/components/blocks/image-banner/ImageBanner.css +133 -0
  147. package/dist/components/blocks/image-banner/ImageBanner.d.ts +32 -0
  148. package/dist/components/blocks/image-banner/ImageBanner.js +41 -0
  149. package/dist/components/blocks/image-banner/ImageBanner.types.d.ts +54 -0
  150. package/dist/components/blocks/image-banner/ImageBanner.types.js +14 -0
  151. package/dist/components/blocks/image-banner/image-banner-impl.css +281 -0
  152. package/dist/components/blocks/landing-hero/LandingHero.css +1 -0
  153. package/dist/components/blocks/landing-hero/LandingHero.d.ts +1 -1
  154. package/dist/components/blocks/landing-hero/LandingHero.js +4 -3
  155. package/dist/components/blocks/landing-hero/LandingHero.types.d.ts +7 -3
  156. package/dist/components/blocks/logo-columns/LogoColumns.css +1 -0
  157. package/dist/components/blocks/logo-rows/LogoRows.css +1 -0
  158. package/dist/components/blocks/page-header/PageHeader.css +1 -0
  159. package/dist/components/blocks/page-header/PageHeader.d.ts +1 -1
  160. package/dist/components/blocks/page-header/PageHeader.js +3 -2
  161. package/dist/components/blocks/page-header/PageHeader.types.d.ts +6 -0
  162. package/dist/components/blocks/page-header/PageHeader.types.js +1 -1
  163. package/dist/components/blocks/page-header/page-header-impl.css +10 -0
  164. package/dist/components/blocks/product-hero/ProductHero.css +8 -3
  165. package/dist/components/blocks/product-hero/ProductHero.d.ts +1 -1
  166. package/dist/components/blocks/product-hero/ProductHero.js +5 -2
  167. package/dist/components/blocks/product-hero/ProductHero.types.d.ts +5 -1
  168. package/dist/components/blocks/product-hero/ProductHero.types.js +1 -0
  169. package/dist/components/blocks/product-hero/product-hero-impl.css +43 -12
  170. package/dist/components/blocks/resource-banner/ResourceBanner.css +106 -0
  171. package/dist/components/blocks/resource-banner/ResourceBanner.d.ts +32 -0
  172. package/dist/components/blocks/resource-banner/ResourceBanner.js +51 -0
  173. package/dist/components/blocks/resource-banner/ResourceBanner.types.d.ts +44 -0
  174. package/dist/components/blocks/resource-banner/ResourceBanner.types.js +14 -0
  175. package/dist/components/blocks/resource-banner/resource-banner-impl.css +69 -0
  176. package/dist/components/blocks/scene-scroll/SceneScroll.css +93 -0
  177. package/dist/components/blocks/scene-scroll/SceneScroll.d.ts +36 -0
  178. package/dist/components/blocks/scene-scroll/SceneScroll.js +54 -0
  179. package/dist/components/blocks/scene-scroll/SceneScroll.types.d.ts +32 -0
  180. package/dist/components/blocks/scene-scroll/SceneScroll.types.js +15 -0
  181. package/dist/components/blocks/scene-scroll/scene-scroll-impl.css +275 -0
  182. package/dist/components/blocks/stats/Stats.css +139 -0
  183. package/dist/components/blocks/stats/Stats.d.ts +24 -0
  184. package/dist/components/blocks/stats/Stats.js +120 -0
  185. package/dist/components/blocks/stats/Stats.types.d.ts +36 -0
  186. package/dist/components/blocks/stats/Stats.types.js +19 -0
  187. package/dist/components/blocks/stats/stats-count.d.ts +34 -0
  188. package/dist/components/blocks/stats/stats-count.js +61 -0
  189. package/dist/components/blocks/stats/stats-impl.css +284 -0
  190. package/dist/components/blocks/stats/use-wheel.d.ts +37 -0
  191. package/dist/components/blocks/stats/use-wheel.js +126 -0
  192. package/dist/components/blocks/steps/Steps.css +202 -0
  193. package/dist/components/blocks/steps/Steps.d.ts +32 -0
  194. package/dist/components/blocks/steps/Steps.js +65 -0
  195. package/dist/components/blocks/steps/Steps.types.d.ts +48 -0
  196. package/dist/components/blocks/steps/Steps.types.js +21 -0
  197. package/dist/components/blocks/steps/steps-impl.css +216 -0
  198. package/dist/components/blocks/steps/use-turn.d.ts +33 -0
  199. package/dist/components/blocks/steps/use-turn.js +75 -0
  200. package/dist/components/blocks/sticky-cards/StickyCards.css +154 -0
  201. package/dist/components/blocks/sticky-cards/StickyCards.d.ts +35 -0
  202. package/dist/components/blocks/sticky-cards/StickyCards.js +153 -0
  203. package/dist/components/blocks/sticky-cards/StickyCards.types.d.ts +43 -0
  204. package/dist/components/blocks/sticky-cards/StickyCards.types.js +18 -0
  205. package/dist/components/blocks/sticky-cards/sticky-cards-impl.css +393 -0
  206. package/dist/components/blocks/team-grid/TeamGrid.css +159 -0
  207. package/dist/components/blocks/team-grid/TeamGrid.d.ts +28 -0
  208. package/dist/components/blocks/team-grid/TeamGrid.js +74 -0
  209. package/dist/components/blocks/team-grid/TeamGrid.types.d.ts +51 -0
  210. package/dist/components/blocks/team-grid/TeamGrid.types.js +20 -0
  211. package/dist/components/blocks/team-grid/team-grid-impl.css +129 -0
  212. package/dist/components/blocks/testimonial-row/TestimonialRow.css +1 -0
  213. package/dist/components/blocks/testimonial-row/TestimonialRow.d.ts +1 -1
  214. package/dist/components/blocks/testimonial-row/TestimonialRow.js +4 -3
  215. package/dist/components/blocks/testimonial-row/TestimonialRow.types.d.ts +3 -0
  216. package/dist/components/blocks/testimonial-row/TestimonialRow.types.js +1 -1
  217. package/dist/components/blocks/testimonial-row/testimonial-row-impl.css +8 -0
  218. package/dist/components/blocks/testimonial-slider/TestimonialSlider.css +1 -0
  219. package/dist/components/blocks/testimonial-slider/TestimonialSlider.d.ts +1 -1
  220. package/dist/components/blocks/testimonial-slider/TestimonialSlider.js +2 -2
  221. package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.d.ts +8 -0
  222. package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.js +1 -1
  223. package/dist/components/blocks/text-scroll/TextScroll.css +53 -0
  224. package/dist/components/blocks/text-scroll/TextScroll.d.ts +5 -0
  225. package/dist/components/blocks/text-scroll/TextScroll.js +71 -0
  226. package/dist/components/blocks/text-scroll/TextScroll.types.d.ts +22 -0
  227. package/dist/components/blocks/text-scroll/TextScroll.types.js +10 -0
  228. package/dist/components/blocks/text-scroll/text-scroll-impl.css +115 -0
  229. package/dist/components/blocks/tiers/Tiers.css +233 -0
  230. package/dist/components/blocks/tiers/Tiers.d.ts +32 -0
  231. package/dist/components/blocks/tiers/Tiers.js +68 -0
  232. package/dist/components/blocks/tiers/Tiers.types.d.ts +45 -0
  233. package/dist/components/blocks/tiers/Tiers.types.js +25 -0
  234. package/dist/components/blocks/tiers/tiers-impl.css +185 -0
  235. package/dist/components/blocks/use-rotation.d.ts +12 -2
  236. package/dist/components/blocks/use-rotation.js +6 -28
  237. package/dist/components/comparison-cards-data.d.ts +59 -0
  238. package/dist/components/comparison-cards-data.js +12 -0
  239. package/dist/components/comparison-table-data.d.ts +39 -0
  240. package/dist/components/comparison-table-data.js +11 -0
  241. package/dist/components/core/accordion-item/AccordionItem.css +1 -5
  242. package/dist/components/core/background/Background.css +92 -0
  243. package/dist/components/core/background/Background.d.ts +27 -0
  244. package/dist/components/core/background/Background.js +45 -0
  245. package/dist/components/core/background/Background.types.d.ts +39 -0
  246. package/dist/components/core/background/Background.types.js +11 -0
  247. package/dist/components/core/background/background-impl.css +760 -0
  248. package/dist/components/core/background/halftone.d.ts +134 -0
  249. package/dist/components/core/background/halftone.js +722 -0
  250. package/dist/components/core/background/patterns.d.ts +66 -0
  251. package/dist/components/core/background/patterns.js +244 -0
  252. package/dist/components/core/background/shader.d.ts +44 -0
  253. package/dist/components/core/background/shader.js +307 -0
  254. package/dist/components/core/background/use-halftone.d.ts +15 -0
  255. package/dist/components/core/background/use-halftone.js +27 -0
  256. package/dist/components/core/background/use-offscreen.d.ts +10 -0
  257. package/dist/components/core/background/use-offscreen.js +30 -0
  258. package/dist/components/core/background/use-shader.d.ts +11 -0
  259. package/dist/components/core/background/use-shader.js +25 -0
  260. package/dist/components/core/background/use-spotlight.d.ts +14 -0
  261. package/dist/components/core/background/use-spotlight.js +73 -0
  262. package/dist/components/core/bottom-sheet/BottomSheet.js +2 -2
  263. package/dist/components/core/bottom-sheet/BottomSheet.types.d.ts +3 -1
  264. package/dist/components/core/breadcrumb/Breadcrumb.d.ts +1 -0
  265. package/dist/components/core/breadcrumb/Breadcrumb.js +1 -0
  266. package/dist/components/core/breadcrumb/breadcrumb-impl.css +11 -0
  267. package/dist/components/core/button/button-impl.css +14 -1
  268. package/dist/components/core/illustration-card/IllustrationCard.css +40 -0
  269. package/dist/components/core/illustration-card/IllustrationCard.d.ts +22 -0
  270. package/dist/components/core/illustration-card/IllustrationCard.js +82 -0
  271. package/dist/components/core/illustration-card/IllustrationCard.types.d.ts +23 -0
  272. package/dist/components/core/illustration-card/IllustrationCard.types.js +8 -0
  273. package/dist/components/core/illustration-card/illustration-card-impl.css +47 -0
  274. package/dist/components/core/illustration-scene/IllustrationScene.css +41 -0
  275. package/dist/components/core/illustration-scene/IllustrationScene.d.ts +14 -0
  276. package/dist/components/core/illustration-scene/IllustrationScene.js +16 -0
  277. package/dist/components/core/illustration-scene/IllustrationScene.types.d.ts +32 -0
  278. package/dist/components/core/illustration-scene/IllustrationScene.types.js +8 -0
  279. package/dist/components/core/illustration-scene/illustration-scene-impl.css +46 -0
  280. package/dist/components/core/link/Link.js +7 -3
  281. package/dist/components/core/link/link-impl.css +29 -2
  282. package/dist/components/core/navbar/Navbar.css +2 -2
  283. package/dist/components/core/navbar/Navbar.types.d.ts +1 -1
  284. package/dist/components/core/navbar-item/NavbarItem.d.ts +2 -1
  285. package/dist/components/core/navbar-item/NavbarItem.js +3 -10
  286. package/dist/components/core/navbar-item/NavbarItem.types.d.ts +4 -1
  287. package/dist/components/core/navbar-item/NavbarItem.types.js +1 -1
  288. package/dist/components/core/navbar-item/navbar-item-impl.css +10 -0
  289. package/dist/components/core/navbar-menu/navbar-menu-impl.css +9 -0
  290. package/dist/components/core/navbar-switcher/navbar-switcher-impl.css +19 -0
  291. package/dist/components/core/pagination/Pagination.js +1 -1
  292. package/dist/components/core/pagination/pagination-impl.css +9 -0
  293. package/dist/components/core/pagination-dots/PaginationDots.d.ts +1 -1
  294. package/dist/components/core/pagination-dots/PaginationDots.js +3 -3
  295. package/dist/components/core/pagination-dots/PaginationDots.types.d.ts +3 -1
  296. package/dist/components/core/segmented-control/SegmentedControl.css +4 -3
  297. package/dist/components/core/segmented-control/SegmentedControl.js +17 -3
  298. package/dist/components/core/segmented-control-item/SegmentedControlItem.css +2 -1
  299. package/dist/components/core/select/Select.js +3 -3
  300. package/dist/components/core/select/Select.types.d.ts +11 -1
  301. package/dist/components/core/select/Select.types.js +1 -1
  302. package/dist/components/core/tab-list/TabList.js +9 -1
  303. package/dist/components/core/table-header-cell/TableHeaderCell.d.ts +1 -1
  304. package/dist/components/core/table-header-cell/TableHeaderCell.js +5 -2
  305. package/dist/components/core/table-header-cell/TableHeaderCell.types.d.ts +7 -1
  306. package/dist/components/core/table-header-cell/TableHeaderCell.types.js +1 -1
  307. package/dist/components/core/text-area/TextArea.d.ts +1 -1
  308. package/dist/components/core/text-area/TextArea.js +2 -2
  309. package/dist/components/core/text-area/TextArea.types.d.ts +9 -1
  310. package/dist/components/core/text-area/TextArea.types.js +1 -1
  311. package/dist/components/core/text-input/TextInput.d.ts +1 -1
  312. package/dist/components/core/text-input/TextInput.js +2 -2
  313. package/dist/components/core/text-input/TextInput.types.d.ts +9 -1
  314. package/dist/components/core/text-input/TextInput.types.js +1 -1
  315. package/dist/components/data-table-data.d.ts +33 -0
  316. package/dist/components/data-table-data.js +12 -0
  317. package/dist/components/download-banner-data.d.ts +52 -0
  318. package/dist/components/download-banner-data.js +11 -0
  319. package/dist/components/index.d.ts +51 -0
  320. package/dist/components/index.js +38 -0
  321. package/dist/components/resource-banner-data.d.ts +34 -0
  322. package/dist/components/resource-banner-data.js +13 -0
  323. package/dist/components/scene-scroll-data.d.ts +24 -0
  324. package/dist/components/scene-scroll-data.js +9 -0
  325. package/dist/components/stats-data.d.ts +28 -0
  326. package/dist/components/stats-data.js +11 -0
  327. package/dist/components/steps-data.d.ts +38 -0
  328. package/dist/components/steps-data.js +13 -0
  329. package/dist/components/sticky-cards-data.d.ts +43 -0
  330. package/dist/components/sticky-cards-data.js +12 -0
  331. package/dist/components/team-grid-data.d.ts +38 -0
  332. package/dist/components/team-grid-data.js +11 -0
  333. package/dist/components/tiers-data.d.ts +47 -0
  334. package/dist/components/tiers-data.js +13 -0
  335. package/dist/marketing.css +101 -28
  336. package/package.json +1 -1
@@ -0,0 +1,75 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useId } from 'react';
4
+ import './ComparisonCards.css';
5
+ import './comparison-cards-impl.css';
6
+ import '../block-reveal.css';
7
+ import { given } from '../../given.js';
8
+ import { Badge } from '../../core/badge/Badge.js';
9
+ import { Button } from '../../core/button/Button.js';
10
+ import { Card } from '../../core/card/Card.js';
11
+ import { Link } from '../../core/link/Link.js';
12
+ import { arriving, useReveal } from '../use-reveal.js';
13
+ import { comparisonCardsDefaults, comparisonCardsParts, } from './ComparisonCards.types.js';
14
+ /** The most cards drawn. A fifth column of label and value is too narrow to read. */
15
+ const MOST = 4;
16
+ /**
17
+ * The page's own Card for each surface. The standard card is Card's own `surface`, which follows the
18
+ * theme — the recessed grey on a light page, a dark grey in dark mode — so a set of equals reads as
19
+ * part of the page in either. Highlighted, the cards are gray.50 with dark ink in both themes, set
20
+ * against the brand's coral with white for the one the variant recommends.
21
+ */
22
+ const SURFACE = { surface: 'surface', light: 'surface-light', coral: 'accent' };
23
+ /**
24
+ * A heading over two or three cards that repeat the same rows — the reference site's
25
+ * ComparisonCards.
26
+ *
27
+ * The cards are records rather than children, the one place a block here takes its cards that way.
28
+ * What a comparison is made of is structured — a name, a sentence, and labels each answered with a
29
+ * value — and the block has to lay each card's rows against its neighbour's, which it cannot do
30
+ * inside a Card it was handed whole. The surface is still the page's own Card, so a light or a coral
31
+ * card here is the same fill and corner as anywhere else on the page.
32
+ *
33
+ * Side by side, every card shares the grid's rows: one for the intros, one per line of the
34
+ * comparison, one for the footnotes. The count of those rows is the one thing the stylesheet cannot
35
+ * read from the markup — it is the longest card's, not any one card's — so it is handed over as a
36
+ * custom property, FeatureScroll's way of passing a count.
37
+ *
38
+ * It arrives the way every block does: the heading and the line, then each card a step behind the
39
+ * one before. `'use client'` for that and for `useId`, which names the region by its heading.
40
+ */
41
+ export function ComparisonCards({ ground = comparisonCardsDefaults.ground, variant = comparisonCardsDefaults.variant, title, description, cards, }) {
42
+ const titleId = useId();
43
+ const [band, revealed] = useReveal();
44
+ const shown = cards.slice(0, MOST);
45
+ // Nothing to compare is nothing drawn: a named region holding no option leads nowhere.
46
+ if (shown.length === 0)
47
+ return null;
48
+ // The recommended card, in the highlighted variant: the first one marked so. One only — a
49
+ // recommendation made twice is no recommendation.
50
+ const recommended = variant === 'highlighted' ? shown.findIndex((card) => card.recommended === true) : -1;
51
+ // One track for the intros, one per row of the longest card, one for the feet.
52
+ const rows = Math.max(...shown.map((card) => card.rows.length));
53
+ const tracks = { '--dds-comparisoncards-tracks': rows + 2 };
54
+ return (_jsx("section", { className: comparisonCardsParts.root, "data-ground": ground, "data-variant": variant, "aria-labelledby": titleId, children: _jsxs("div", { className: comparisonCardsParts.inner, ref: band, "data-revealed": revealed, children: [_jsxs("div", { className: comparisonCardsParts.header, children: [_jsx("h2", { className: comparisonCardsParts.title, id: titleId, ...arriving(0), children: title }), given(description) ? (_jsx("p", { className: comparisonCardsParts.description, ...arriving(1), children: description })) : null] }), _jsx("ul", { className: comparisonCardsParts.grid, style: tracks, children: shown.map((card, at) => {
55
+ // Standard, every card is the page's own surface, so the options read as equals; highlighted,
56
+ // the recommended card alone is coral against light ones, the one card asking to be read
57
+ // first.
58
+ const chosen = at === recommended;
59
+ const tone = variant === 'standard' ? 'surface' : chosen ? 'coral' : 'light';
60
+ const footed = given(card.footnote) || card.action !== undefined;
61
+ return (
62
+ /* A card's place is its identity: the set is a list, and nothing reorders it. The cell
63
+ is what arrives, so the Card inside keeps its own transitions. */
64
+ _jsx("li", { className: comparisonCardsParts.item, "data-tone": tone, "data-recommended": chosen || undefined, ...arriving(2 + at), children: _jsx(Card, { variant: SURFACE[tone], children: _jsxs("div", { className: comparisonCardsParts.body, children: [_jsxs("div", { className: comparisonCardsParts.intro, children: [_jsxs("div", { className: comparisonCardsParts['card-head'], children: [_jsx("h3", { className: comparisonCardsParts['card-title'], children: card.title }), chosen && given(card.badge) ? (_jsx("div", { className: comparisonCardsParts.highlight, children: _jsx(Badge, { label: card.badge ?? '' }) })) : null] }), given(card.description) ? (_jsx("p", { className: comparisonCardsParts['card-description'], children: card.description })) : null] }), card.rows.length > 0 ? (_jsx("dl", { className: comparisonCardsParts.rows, children: card.rows.map((row, line) => (
65
+ // A wrapping div per pair is what a description list allows, and what
66
+ // lets the label and the value share a line and a rule.
67
+ _jsxs("div", { className: comparisonCardsParts.row, children: [_jsx("dt", { className: comparisonCardsParts['row-label'], children: row.label }), _jsx("dd", { className: comparisonCardsParts['row-value'], children: _jsx("bdi", { children: row.value }) })] }, line))) })) : null, footed ? (_jsxs("div", { className: comparisonCardsParts.footer, children: [given(card.footnote) ? (_jsx("p", { className: comparisonCardsParts.footnote, children: card.footnote })) : null, card.action === undefined ? null : (_jsx("div", { className: comparisonCardsParts.action, children: chosen ? (
68
+ /* The recommended card's way on is the band's one solid button: the
69
+ dark one CtaBanner puts on the coral. */
70
+ _jsx(Button, { variant: "inverse", tone: "brand", href: card.action.href, children: card.action.label })) : (
71
+ /* The card's own ink rather than the brand's: coral words on a coral
72
+ card would vanish, and one tone serves every card. */
73
+ _jsx(Link, { variant: "standalone", tone: "inherit", href: card.action.href, children: card.action.label })) }))] })) : null] }) }) }, at));
74
+ }) })] }) }));
75
+ }
@@ -0,0 +1,49 @@
1
+ import type { ComparisonCardsCard } from '../../comparison-cards-data.js';
2
+ export interface ComparisonCardsOwnProps {
3
+ /**
4
+ * `page` — The default, and the page's own white. The standard card is the recessed surface on it, the highlighted set's light card gray.50, so both have an edge
5
+ * `subtle` — The grey band, the reference design's ground for this section. The standard card is raised to color.bg.surface-card-raised on it and the light card turns white, color.bg.surface-card-light-raised, because their own fills are the band's grey. Painted as the band's tint 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, for a section a reader should arrive at. The heading and the line under it turn white; the standard card turns to Card's inverse surface with white ink, since its own would be dark words on near-black; the light and coral cards keep their own grounds and ink
7
+ */
8
+ ground?: 'page' | 'subtle' | 'strong';
9
+ /**
10
+ * `standard` — The default: options set side by side as equals — every card Card's own `surface`, which follows the theme, the recessed grey on a light page and a dark grey in dark mode, nothing pointing at one of them. A card marked `recommended` is drawn like the rest here.
11
+ * `highlighted` — One option is the one the page recommends: the card marked `recommended` is drawn coral and lifted off the page, every other card on the light card, gray.50 in both themes, quiet beside it. Where the recommended card has a `badge`, its word stands on a badge pinned to the card's top end corner; where it has an `action`, the action is a solid button. For account and plan comparisons where the page has a recommendation and says so. A known exception: white running copy on the coral is about 3.4:1, under the 4.5:1 body text asks for — the package's ground rule keeps the coral to a headline and an action, and this card carries rows. Recorded rather than recoloured, as CtaBanner's band is; where the copy is long or the contrast matters, use the standard variant.
12
+ */
13
+ variant?: 'standard' | 'highlighted';
14
+ /** Always. What is being compared, in the fewest words that name it — "What you can trade", "Choose your account". */
15
+ title: string;
16
+ /** A line saying what the options have in common, or what the reader is choosing between, when the title alone does not. */
17
+ description?: string;
18
+ /** Always. The options, in reading order — two to four, each with its `title`, a `description`, its `rows` and, where it has them, a `footnote` and an `action`. Every card is drawn the same card. Keep the same labels in the same order on every card, so each row lines up with its counterpart. Two sit side by side from the fold; three stay stacked until full width; four are two rows of two from the fold and one row of four at full width. Only the first four are drawn, and an empty list draws nothing. With `variant="highlighted"`, the card marked `recommended` is the one drawn coral; give it a `badge` — "Most popular", "Recommended" — only where the page wants to say why. */
19
+ cards: ComparisonCardsCard[];
20
+ }
21
+ export type ComparisonCardsProps = ComparisonCardsOwnProps;
22
+ /** The class each part carries. Apply these — do not retype them. */
23
+ export declare const comparisonCardsParts: {
24
+ readonly root: "dds-comparisoncards";
25
+ readonly inner: "dds-comparisoncards__inner";
26
+ readonly header: "dds-comparisoncards__header";
27
+ readonly title: "dds-comparisoncards__title";
28
+ readonly description: "dds-comparisoncards__description";
29
+ readonly grid: "dds-comparisoncards__grid";
30
+ readonly item: "dds-comparisoncards__item";
31
+ readonly body: "dds-comparisoncards__body";
32
+ readonly intro: "dds-comparisoncards__intro";
33
+ readonly 'card-head': "dds-comparisoncards__card-head";
34
+ readonly 'card-title': "dds-comparisoncards__card-title";
35
+ readonly highlight: "dds-comparisoncards__highlight";
36
+ readonly 'card-description': "dds-comparisoncards__card-description";
37
+ readonly rows: "dds-comparisoncards__rows";
38
+ readonly row: "dds-comparisoncards__row";
39
+ readonly 'row-label': "dds-comparisoncards__row-label";
40
+ readonly 'row-value': "dds-comparisoncards__row-value";
41
+ readonly footer: "dds-comparisoncards__footer";
42
+ readonly footnote: "dds-comparisoncards__footnote";
43
+ readonly action: "dds-comparisoncards__action";
44
+ };
45
+ /** Generated so defaults cannot drift from the contract. */
46
+ export declare const comparisonCardsDefaults: {
47
+ readonly ground: "page";
48
+ readonly variant: "standard";
49
+ };
@@ -0,0 +1,26 @@
1
+ // GENERATED from comparison-cards.contract.json. Do not edit.
2
+ /** The class each part carries. Apply these — do not retype them. */
3
+ export const comparisonCardsParts = {
4
+ root: 'dds-comparisoncards',
5
+ inner: 'dds-comparisoncards__inner',
6
+ header: 'dds-comparisoncards__header',
7
+ title: 'dds-comparisoncards__title',
8
+ description: 'dds-comparisoncards__description',
9
+ grid: 'dds-comparisoncards__grid',
10
+ item: 'dds-comparisoncards__item',
11
+ body: 'dds-comparisoncards__body',
12
+ intro: 'dds-comparisoncards__intro',
13
+ 'card-head': 'dds-comparisoncards__card-head',
14
+ 'card-title': 'dds-comparisoncards__card-title',
15
+ highlight: 'dds-comparisoncards__highlight',
16
+ 'card-description': 'dds-comparisoncards__card-description',
17
+ rows: 'dds-comparisoncards__rows',
18
+ row: 'dds-comparisoncards__row',
19
+ 'row-label': 'dds-comparisoncards__row-label',
20
+ 'row-value': 'dds-comparisoncards__row-value',
21
+ footer: 'dds-comparisoncards__footer',
22
+ footnote: 'dds-comparisoncards__footnote',
23
+ action: 'dds-comparisoncards__action',
24
+ };
25
+ /** Generated so defaults cannot drift from the contract. */
26
+ export const comparisonCardsDefaults = { ground: 'page', variant: 'standard' };
@@ -0,0 +1,262 @@
1
+ /*
2
+ * Scoped to this package, like the generated sheet beside it.
3
+ */
4
+
5
+ /*
6
+ * The header starts on a phone and is centred once the band is wide enough to hold a line.
7
+ *
8
+ * FeatureCards' rule and its reason: the cards are stacked content under the heading, so a centred
9
+ * heading is symmetric with them — but centred text starts every line at a different edge, which
10
+ * costs a great deal across a phone's measure. The header and its line are capped narrower than the
11
+ * column, so `margin-inline: auto` is what centres those boxes rather than their words.
12
+ *
13
+ * `48rem` longhand because `var()` is not permitted in a container query condition, and it is the
14
+ * width the rest of this package folds at.
15
+ */
16
+ @container (min-width: 48rem) {
17
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__header {
18
+ align-items: center;
19
+ margin-inline: auto;
20
+ text-align: center;
21
+ }
22
+
23
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__description {
24
+ margin-inline: auto;
25
+ }
26
+ }
27
+
28
+ /*
29
+ * One column on a phone. `minmax(0, 1fr)` rather than `1fr`, so a long unbroken value shrinks to
30
+ * the column instead of pushing the grid past the page.
31
+ */
32
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid {
33
+ grid-template-columns: minmax(0, 1fr);
34
+ }
35
+
36
+ /*
37
+ * A rule under every row but the last, in the card's own ink receded to opacity.track.
38
+ *
39
+ * The cards are several grounds — the page's own surface, which follows the theme, the fixed light
40
+ * surface and the coral of the highlighted set — and no one border role reads on all of them: the
41
+ * page's rules follow the theme, so color.border.default is white at sixteen on the fixed light card
42
+ * in dark mode and gone. The card's ink is the one colour certain to read on its own ground, so the
43
+ * rule is that ink, receded the way a track recedes behind the mark it carries. One rule for every
44
+ * card, and nothing to keep in step with the card's tone.
45
+ */
46
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__row {
47
+ border-block-end-color: color-mix(in srgb, currentColor calc(var(--opacity-track) * 100%), transparent);
48
+ }
49
+
50
+ /*
51
+ * A long value wraps before it squeezes its label.
52
+ *
53
+ * Both halves of a row start at the width of their words and shrink in proportion to it, so a value
54
+ * a sentence long took the whole line and broke a two-word label over two lines. The value is held
55
+ * to three fifths of the row, the reference design's own cap give or take, and wraps at the end
56
+ * edge inside it; the label keeps the rest.
57
+ */
58
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__row-value {
59
+ max-inline-size: 60%;
60
+ }
61
+
62
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__row:last-child {
63
+ border-block-end-width: var(--border-width-none);
64
+ }
65
+
66
+ /*
67
+ * Side by side, the cards share the grid's rows.
68
+ *
69
+ * Two cards from the fold and three at full width — and three stay stacked until then, because a
70
+ * third card under a pair is compared with nothing beside it. Four are two rows of two from the
71
+ * fold, every card with a neighbour, and one row of four at full width. `:has()` asks the markup how many
72
+ * there are, FeatureCards' way; 64rem is where three columns of label and value have room.
73
+ *
74
+ * What lines the rows up is subgrid. Each cell spans the same run of the grid's rows — one for the
75
+ * intro, one per row of the longest card, one for the foot, a count the component hands over as
76
+ * `--dds-comparisoncards-tracks` — and the cell, the Card, the body and the list each pass those rows
77
+ * down rather than starting their own. So an intro two lines long in one card makes the intro row
78
+ * two lines long in all of them, and every card's first row starts level; a value that wraps in one
79
+ * card makes that row taller in every card, and the rules under it stay level too. Every card is as
80
+ * tall as the tallest for the same reason.
81
+ *
82
+ * The grid's row gap goes to nothing here, because its rows are now the cards' own lines rather than
83
+ * rows of cards: a gutter between them would open inside every card. Side by side there is only one
84
+ * row of cards, so the gutter has nothing else to separate.
85
+ *
86
+ * Written twice, once for each width, because a container query cannot be shared and the pair's
87
+ * rules have to hold from the fold while the three's start at full width. Where subgrid is not
88
+ * supported the cards still sit side by side, stretched to one height, and only the rows go unaligned.
89
+ */
90
+ @container (min-width: 48rem) {
91
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid:is(:has(> :nth-child(2):last-child), :has(> :nth-child(4):last-child)) {
92
+ grid-template-columns: repeat(2, minmax(0, 1fr));
93
+ row-gap: var(--space-gap-none);
94
+ }
95
+
96
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid:is(:has(> :nth-child(2):last-child), :has(> :nth-child(4):last-child)) > .dds-comparisoncards__item {
97
+ grid-row: span var(--dds-comparisoncards-tracks);
98
+ grid-template-rows: subgrid;
99
+ }
100
+
101
+ /* The Card is a flex column of its own; here it is a grid passing the cell's rows on. */
102
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid:is(:has(> :nth-child(2):last-child), :has(> :nth-child(4):last-child)) > .dds-comparisoncards__item > .dds-card,
103
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid:is(:has(> :nth-child(2):last-child), :has(> :nth-child(4):last-child)) .dds-comparisoncards__body {
104
+ display: grid;
105
+ grid-row: 1 / -1;
106
+ grid-template-rows: subgrid;
107
+ }
108
+
109
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid:is(:has(> :nth-child(2):last-child), :has(> :nth-child(4):last-child)) .dds-comparisoncards__intro {
110
+ grid-row: 1;
111
+ }
112
+
113
+ /* Every row but the first and the last, so a card with fewer rows than its neighbour leaves the
114
+ rest empty and its foot still lands in the last row with the others. */
115
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid:is(:has(> :nth-child(2):last-child), :has(> :nth-child(4):last-child)) .dds-comparisoncards__rows {
116
+ display: grid;
117
+ grid-row: 2 / -2;
118
+ grid-template-rows: subgrid;
119
+ }
120
+
121
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid:is(:has(> :nth-child(2):last-child), :has(> :nth-child(4):last-child)) .dds-comparisoncards__footer {
122
+ grid-row: -2 / -1;
123
+ }
124
+
125
+ /* Four make two rows of two, and the second pair stands a gutter below the first. The grid's own
126
+ row gap is spent — it would open inside every card — so the gap is the lower cells' margin,
127
+ which a subgrid adds to the rows at its edge and keeps out of the rows inside it. */
128
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid:has(> :nth-child(4):last-child) > .dds-comparisoncards__item:nth-child(n + 3) {
129
+ margin-block-start: var(--space-grid-gutter);
130
+ }
131
+ }
132
+
133
+ @container (min-width: 64rem) {
134
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid:has(> :nth-child(3):last-child) {
135
+ grid-template-columns: repeat(3, minmax(0, 1fr));
136
+ row-gap: var(--space-gap-none);
137
+ }
138
+
139
+ /* And four in one row of four: the second pair back level with the first. */
140
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid:has(> :nth-child(4):last-child) {
141
+ grid-template-columns: repeat(4, minmax(0, 1fr));
142
+ }
143
+
144
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid:has(> :nth-child(4):last-child) > .dds-comparisoncards__item:nth-child(n + 3) {
145
+ margin-block-start: 0;
146
+ }
147
+
148
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid:is(:has(> :nth-child(3):last-child), :has(> :nth-child(4):last-child)) > .dds-comparisoncards__item {
149
+ grid-row: span var(--dds-comparisoncards-tracks);
150
+ grid-template-rows: subgrid;
151
+ }
152
+
153
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid:is(:has(> :nth-child(3):last-child), :has(> :nth-child(4):last-child)) > .dds-comparisoncards__item > .dds-card,
154
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid:is(:has(> :nth-child(3):last-child), :has(> :nth-child(4):last-child)) .dds-comparisoncards__body {
155
+ display: grid;
156
+ grid-row: 1 / -1;
157
+ grid-template-rows: subgrid;
158
+ }
159
+
160
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid:is(:has(> :nth-child(3):last-child), :has(> :nth-child(4):last-child)) .dds-comparisoncards__intro {
161
+ grid-row: 1;
162
+ }
163
+
164
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid:is(:has(> :nth-child(3):last-child), :has(> :nth-child(4):last-child)) .dds-comparisoncards__rows {
165
+ display: grid;
166
+ grid-row: 2 / -2;
167
+ grid-template-rows: subgrid;
168
+ }
169
+
170
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid:is(:has(> :nth-child(3):last-child), :has(> :nth-child(4):last-child)) .dds-comparisoncards__footer {
171
+ grid-row: -2 / -1;
172
+ }
173
+ }
174
+
175
+ /*
176
+ * The light card turns white on the subtle band.
177
+ *
178
+ * FeatureCards' answer and its reason. surface-light is gray.50 in both themes, and so is the subtle
179
+ * band in light mode, so the card had no edge there: it takes color.bg.surface-card-light-raised,
180
+ * white in light and its own gray.50 in dark. The block knows its ground and the card does not, so
181
+ * the answer is here rather than in Card; the ink is the card's own and does not change.
182
+ */
183
+ :where([data-dds-context="marketing"])
184
+ .dds-comparisoncards[data-ground="subtle"]
185
+ .dds-comparisoncards__item
186
+ > .dds-card[data-variant="surface-light"] {
187
+ background-color: var(--color-bg-surface-card-light-raised);
188
+ }
189
+
190
+ /*
191
+ * And the standard card — Card's own surface, which follows the theme — on the painted grounds,
192
+ * FeatureCards' rules for the same card. On the grey band its recessed fill is the band's grey and
193
+ * vanishes, so it takes the raised fill, color.bg.surface-card-raised. On the dark band its fill and
194
+ * ink are made for a light page, dark words on near-black, so it turns round to the inverse surface
195
+ * and white ink, the values Card's own inverse uses.
196
+ */
197
+ :where([data-dds-context="marketing"])
198
+ .dds-comparisoncards[data-ground="subtle"]
199
+ .dds-comparisoncards__item
200
+ > .dds-card[data-variant="surface"] {
201
+ background-color: var(--color-bg-surface-card-raised);
202
+ }
203
+
204
+ :where([data-dds-context="marketing"])
205
+ .dds-comparisoncards[data-ground="strong"]
206
+ .dds-comparisoncards__item
207
+ > .dds-card[data-variant="surface"] {
208
+ background-color: var(--color-bg-surface-inverse);
209
+ color: var(--color-fg-on-brand-strong);
210
+ }
211
+
212
+ /*
213
+ * The highlighted variant: the recommended card lifted off the page.
214
+ *
215
+ * The lift is elevation.surface.raised rather than movement — a card moved up would move its rows
216
+ * off their neighbours', and the rows lining up is the point of the block.
217
+ *
218
+ * Its badge is pinned to the card's top end corner, space.inset.xs in from the top and from the
219
+ * end edge, out of the card's flow so it moves no row; the card is what it is placed against.
220
+ */
221
+ :where([data-dds-context="marketing"]) .dds-comparisoncards[data-variant='highlighted'] .dds-comparisoncards__item[data-recommended] > .dds-card {
222
+ box-shadow: var(--elevation-surface-raised);
223
+ position: relative;
224
+ }
225
+
226
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__highlight {
227
+ inset-block-start: var(--space-inset-xs);
228
+ inset-inline-end: var(--space-inset-xs);
229
+ }
230
+
231
+ /*
232
+ * A heading with no line under it closes up: its bound step is the distance to the line, and with
233
+ * nothing there it would only add to the step from the header to what follows. `:last-child` is the
234
+ * condition itself, DataTable's way, rather than a prop standing in for it.
235
+ */
236
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__title:last-child {
237
+ margin-block-end: 0;
238
+ }
239
+
240
+ /*
241
+ * A recommended card with a badge starts its title below the badge.
242
+ *
243
+ * The badge is pinned into the card's top end corner, out of the flow, and the title runs under it
244
+ * — a long title on a narrow card ran beneath the badge. The head steps down by space.inset.md, so
245
+ * the title's first line clears the badge however long it runs, and the rows below still line up
246
+ * with the other cards', the head being the row the subgrid lets grow.
247
+ */
248
+ :where([data-dds-context="marketing"]) .dds-comparisoncards[data-variant='highlighted'] .dds-comparisoncards__item[data-recommended]:has(.dds-comparisoncards__highlight) .dds-comparisoncards__card-head {
249
+ padding-block-start: var(--space-inset-md);
250
+ }
251
+
252
+ /*
253
+ * A pair holds to two thirds of the row from full width, centred — FeatureCards' rule and its
254
+ * reason: two cards across the whole width put each label half a page from its value.
255
+ */
256
+ @container (min-width: 64rem) {
257
+ :where([data-dds-context="marketing"]) .dds-comparisoncards .dds-comparisoncards__grid:has(> :nth-child(2):last-child) {
258
+ inline-size: 100%;
259
+ margin-inline: auto;
260
+ max-inline-size: calc((100% - 2 * var(--space-grid-gutter)) * 2 / 3 + var(--space-grid-gutter));
261
+ }
262
+ }
@@ -0,0 +1,111 @@
1
+ /* GENERATED from comparisontable.contract.json. Do not edit. */
2
+
3
+ :where([data-dds-context="marketing"]) .dds-comparisontable {
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-comparisontable .dds-comparisontable__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-comparisontable .dds-comparisontable__header {
25
+ display: flex;
26
+ flex-direction: column;
27
+ min-inline-size: 0;
28
+ max-inline-size: var(--size-measure-heading);
29
+ row-gap: var(--space-gap-none);
30
+ }
31
+
32
+ :where([data-dds-context="marketing"]) .dds-comparisontable .dds-comparisontable__title {
33
+ margin-block: 0;
34
+ text-wrap: balance;
35
+ font-family: var(--font-h2-family);
36
+ font-size: var(--font-h2-size);
37
+ font-weight: var(--font-h2-weight);
38
+ letter-spacing: var(--font-h2-letter-spacing);
39
+ line-height: var(--font-h2-line-height);
40
+ margin-block-end: var(--space-heading-title-description);
41
+ }
42
+
43
+ :where([data-dds-context="marketing"]) .dds-comparisontable .dds-comparisontable__description {
44
+ margin: 0;
45
+ font-family: var(--font-body-md-family);
46
+ font-size: var(--font-body-md-size);
47
+ font-weight: var(--font-body-md-weight);
48
+ letter-spacing: var(--font-body-md-letter-spacing);
49
+ line-height: var(--font-body-md-line-height);
50
+ max-inline-size: var(--size-measure-description);
51
+ }
52
+
53
+ :where([data-dds-context="marketing"]) .dds-comparisontable .dds-comparisontable__body {
54
+ display: flex;
55
+ flex-direction: column;
56
+ min-inline-size: 0;
57
+ row-gap: var(--space-gap-md);
58
+ }
59
+
60
+ :where([data-dds-context="marketing"]) .dds-comparisontable .dds-comparisontable__cell-list {
61
+ display: flex;
62
+ flex-direction: column;
63
+ list-style: none;
64
+ margin: 0;
65
+ padding: 0;
66
+ row-gap: var(--space-gap-xs);
67
+ }
68
+
69
+ :where([data-dds-context="marketing"]) .dds-comparisontable .dds-comparisontable__footnote {
70
+ margin: 0;
71
+ font-family: var(--font-body-sm-family);
72
+ font-size: var(--font-body-sm-size);
73
+ font-weight: var(--font-body-sm-weight);
74
+ letter-spacing: var(--font-body-sm-letter-spacing);
75
+ line-height: var(--font-body-sm-line-height);
76
+ max-inline-size: var(--size-measure-description);
77
+ }
78
+
79
+ :where([data-dds-context="marketing"]) .dds-comparisontable .dds-comparisontable__row-header {
80
+ font-weight: var(--font-label-md-weight);
81
+ letter-spacing: var(--font-label-md-letter-spacing);
82
+ }
83
+
84
+ :where([data-dds-context="marketing"]) .dds-comparisontable[data-ground="page"] {
85
+ background-color: var(--color-bg-page);
86
+ color: var(--color-fg-default);
87
+ }
88
+
89
+ :where([data-dds-context="marketing"]) .dds-comparisontable[data-ground="page"] .dds-comparisontable__footnote {
90
+ color: var(--color-fg-muted);
91
+ }
92
+
93
+ :where([data-dds-context="marketing"]) .dds-comparisontable[data-ground="strong"] {
94
+ background-color: var(--color-bg-brand-strong);
95
+ color: var(--color-fg-on-brand-strong);
96
+ }
97
+
98
+ :where([data-dds-context="marketing"]) .dds-comparisontable[data-ground="strong"] .dds-comparisontable__footnote {
99
+ color: var(--color-fg-muted-inverse);
100
+ }
101
+
102
+ :where([data-dds-context="marketing"]) .dds-comparisontable[data-ground="subtle"] {
103
+ background-color: var(--color-bg-page);
104
+ background-image: linear-gradient(var(--color-bg-band-subtle), var(--color-bg-band-subtle));
105
+ color: var(--color-fg-default);
106
+ }
107
+
108
+ :where([data-dds-context="marketing"]) .dds-comparisontable[data-ground="subtle"] .dds-comparisontable__footnote {
109
+ color: var(--color-fg-muted);
110
+ }
111
+
@@ -0,0 +1,25 @@
1
+ import './ComparisonTable.css';
2
+ import './comparison-table-impl.css';
3
+ import '../block-reveal.css';
4
+ import { type ComparisonTableProps } from './ComparisonTable.types.js';
5
+ export type { ComparisonTableProps };
6
+ /**
7
+ * A heading over a short comparison table — the reference site's DynamicTable, named for its job.
8
+ *
9
+ * Nothing is drawn here that the page already has. The card is the page's own Card and the grid is
10
+ * the page's own Table — its head, body, rows and cells — so the corner, the rules, a cell's inset
11
+ * and the scroll on a phone are theirs. What is this block's is the section around them and the
12
+ * three things the reference asks of the table that its props do not reach: the light band under
13
+ * the column names, the bold first column, and the columns' share of a card that scrolls rather
14
+ * than squeezes. The first is the impl sheet's, the second the row header above, the third a column
15
+ * count handed to the sheet as a custom property, FeatureScroll's way of passing a count.
16
+ *
17
+ * Its columns and rows are records rather than children, the way ComparisonCards takes its cards:
18
+ * every row has to be drawn against the same columns, which the block cannot check inside rows it
19
+ * was handed whole. Only the first four columns are drawn, the reference's own ceiling.
20
+ *
21
+ * It arrives the way every block does: the heading and the line, then the table, then its note.
22
+ * `'use client'` for that, for `useId`, which names the region by its heading — and because Table,
23
+ * which it composes, is a client component already.
24
+ */
25
+ export declare function ComparisonTable({ ground, title, description, columns, rows, footnote, }: ComparisonTableProps): import("react").JSX.Element | null;