@deriv-com/dds-marketing 1.1.2 → 1.2.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.
- package/.llm/components/accordion.md +10 -0
- package/.llm/components/accordionitem.md +10 -0
- package/.llm/components/aspectratio.md +10 -0
- package/.llm/components/awards.md +10 -0
- package/.llm/components/background.md +52 -9
- package/.llm/components/badge.md +13 -3
- package/.llm/components/bottomsheet.md +13 -3
- package/.llm/components/breadcrumb.md +10 -0
- package/.llm/components/breadcrumbitem.md +10 -0
- package/.llm/components/button.md +13 -3
- package/.llm/components/buttonicon.md +17 -7
- package/.llm/components/card.md +11 -1
- package/.llm/components/cardbody.md +12 -2
- package/.llm/components/cardbutton.md +10 -0
- package/.llm/components/checkbox.md +7 -1
- package/.llm/components/comparisoncards.md +13 -3
- package/.llm/components/comparisontable.md +10 -0
- package/.llm/components/ctabanner.md +10 -0
- package/.llm/components/ctabannerslider.md +10 -0
- package/.llm/components/datatable.md +10 -0
- package/.llm/components/divider.md +10 -0
- package/.llm/components/documentlink.md +237 -0
- package/.llm/components/documents.md +268 -0
- package/.llm/components/downloadbanner.md +11 -1
- package/.llm/components/dropdownmenu.md +15 -5
- package/.llm/components/estimator.md +342 -0
- package/.llm/components/faqaccordion.md +10 -0
- package/.llm/components/featurebullets.md +10 -0
- package/.llm/components/featurecards.md +47 -3
- package/.llm/components/featurecardscarousel.md +11 -1
- package/.llm/components/featurescroll.md +10 -0
- package/.llm/components/featuresplit.md +10 -0
- package/.llm/components/featurestack.md +10 -0
- package/.llm/components/featuretabs.md +369 -0
- package/.llm/components/filterchip.md +11 -1
- package/.llm/components/footer.md +10 -0
- package/.llm/components/footergroup.md +10 -0
- package/.llm/components/grid.md +34 -1
- package/.llm/components/icon.md +15 -5
- package/.llm/components/illustrationcard.md +56 -2
- package/.llm/components/illustrationcheck.md +193 -0
- package/.llm/components/illustrationchoice.md +187 -0
- package/.llm/components/illustrationcode.md +192 -0
- package/.llm/components/illustrationlist.md +175 -0
- package/.llm/components/illustrationscene.md +33 -3
- package/.llm/components/imagebanner.md +35 -6
- package/.llm/components/landinghero.md +10 -0
- package/.llm/components/link.md +12 -2
- package/.llm/components/logocolumns.md +11 -1
- package/.llm/components/logorows.md +46 -2
- package/.llm/components/menuitem.md +12 -2
- package/.llm/components/navbar.md +11 -1
- package/.llm/components/navbaritem.md +10 -0
- package/.llm/components/navbarmenu.md +10 -0
- package/.llm/components/navbarmenugroup.md +10 -0
- package/.llm/components/navbarpanel.md +10 -0
- package/.llm/components/navbarswitcher.md +16 -6
- package/.llm/components/navbarswitcheroption.md +10 -0
- package/.llm/components/option.md +11 -1
- package/.llm/components/pageheader.md +10 -0
- package/.llm/components/pagination.md +10 -0
- package/.llm/components/paginationdots.md +10 -0
- package/.llm/components/producthero.md +33 -4
- package/.llm/components/progressbar.md +305 -0
- package/.llm/components/removablechip.md +11 -1
- package/.llm/components/resourcebanner.md +10 -0
- package/.llm/components/row.md +10 -0
- package/.llm/components/scenescroll.md +42 -24
- package/.llm/components/scenescrollword.md +267 -0
- package/.llm/components/scroller.md +10 -0
- package/.llm/components/searchinput.md +10 -0
- package/.llm/components/segmentedcontrol.md +33 -2
- package/.llm/components/segmentedcontrolitem.md +12 -2
- package/.llm/components/select.md +10 -0
- package/.llm/components/selectchip.md +10 -0
- package/.llm/components/spinner.md +10 -0
- package/.llm/components/stack.md +10 -0
- package/.llm/components/stats.md +50 -1
- package/.llm/components/statscarousel.md +227 -0
- package/.llm/components/statusdot.md +45 -1
- package/.llm/components/steps.md +10 -0
- package/.llm/components/stickycards.md +10 -0
- package/.llm/components/subdomainnavbar.md +11 -1
- package/.llm/components/tab.md +12 -2
- package/.llm/components/table.md +10 -0
- package/.llm/components/tablebody.md +10 -0
- package/.llm/components/tablecell.md +10 -0
- package/.llm/components/tablehead.md +10 -0
- package/.llm/components/tableheadercell.md +10 -0
- package/.llm/components/tablerow.md +10 -0
- package/.llm/components/tablist.md +10 -0
- package/.llm/components/teamgrid.md +10 -0
- package/.llm/components/testimonialrow.md +47 -3
- package/.llm/components/testimonialslider.md +12 -2
- package/.llm/components/textarea.md +10 -0
- package/.llm/components/textinput.md +11 -1
- package/.llm/components/textscroll.md +10 -0
- package/.llm/components/tiers.md +17 -7
- package/.llm/components/tooltip.md +6 -0
- package/.llm/components/typography.md +67 -1
- package/.llm/digest/accordion.md +1 -1
- package/.llm/digest/accordionitem.md +1 -1
- package/.llm/digest/aspectratio.md +1 -1
- package/.llm/digest/awards.md +1 -1
- package/.llm/digest/background.md +14 -6
- package/.llm/digest/badge.md +1 -1
- package/.llm/digest/bottomsheet.md +1 -1
- package/.llm/digest/breadcrumb.md +1 -1
- package/.llm/digest/breadcrumbitem.md +1 -1
- package/.llm/digest/button.md +2 -2
- package/.llm/digest/buttonicon.md +2 -2
- package/.llm/digest/card.md +1 -1
- package/.llm/digest/cardbody.md +1 -1
- package/.llm/digest/cardbutton.md +1 -1
- package/.llm/digest/checkbox.md +1 -1
- package/.llm/digest/comparisoncards.md +1 -1
- package/.llm/digest/comparisontable.md +1 -1
- package/.llm/digest/ctabanner.md +1 -1
- package/.llm/digest/ctabannerslider.md +1 -1
- package/.llm/digest/datatable.md +1 -1
- package/.llm/digest/divider.md +1 -1
- package/.llm/digest/documentlink.md +52 -0
- package/.llm/digest/documents.md +51 -0
- package/.llm/digest/downloadbanner.md +2 -2
- package/.llm/digest/dropdownmenu.md +1 -1
- package/.llm/digest/estimator.md +66 -0
- package/.llm/digest/faqaccordion.md +1 -1
- package/.llm/digest/featurebullets.md +1 -1
- package/.llm/digest/featurecards.md +8 -1
- package/.llm/digest/featurecardscarousel.md +1 -1
- package/.llm/digest/featurescroll.md +1 -1
- package/.llm/digest/featuresplit.md +1 -1
- package/.llm/digest/featurestack.md +1 -1
- package/.llm/digest/featuretabs.md +50 -0
- package/.llm/digest/filterchip.md +1 -1
- package/.llm/digest/footer.md +1 -1
- package/.llm/digest/footergroup.md +1 -1
- package/.llm/digest/grid.md +2 -1
- package/.llm/digest/icon.md +1 -1
- package/.llm/digest/illustrationcard.md +7 -2
- package/.llm/digest/illustrationcheck.md +42 -0
- package/.llm/digest/illustrationchoice.md +43 -0
- package/.llm/digest/illustrationcode.md +41 -0
- package/.llm/digest/illustrationlist.md +38 -0
- package/.llm/digest/illustrationscene.md +5 -3
- package/.llm/digest/imagebanner.md +11 -5
- package/.llm/digest/landinghero.md +1 -1
- package/.llm/digest/link.md +1 -1
- package/.llm/digest/logocolumns.md +2 -2
- package/.llm/digest/logorows.md +9 -2
- package/.llm/digest/menuitem.md +1 -1
- package/.llm/digest/navbar.md +1 -1
- package/.llm/digest/navbaritem.md +1 -1
- package/.llm/digest/navbarmenu.md +1 -1
- package/.llm/digest/navbarmenugroup.md +1 -1
- package/.llm/digest/navbarpanel.md +1 -1
- package/.llm/digest/navbarswitcher.md +1 -1
- package/.llm/digest/navbarswitcheroption.md +1 -1
- package/.llm/digest/option.md +1 -1
- package/.llm/digest/pageheader.md +1 -1
- package/.llm/digest/pagination.md +1 -1
- package/.llm/digest/paginationdots.md +1 -1
- package/.llm/digest/producthero.md +9 -3
- package/.llm/digest/progressbar.md +56 -0
- package/.llm/digest/removablechip.md +1 -1
- package/.llm/digest/resourcebanner.md +1 -1
- package/.llm/digest/row.md +1 -1
- package/.llm/digest/scenescroll.md +7 -6
- package/.llm/digest/scenescrollword.md +56 -0
- package/.llm/digest/scroller.md +1 -1
- package/.llm/digest/searchinput.md +1 -1
- package/.llm/digest/segmentedcontrol.md +4 -1
- package/.llm/digest/segmentedcontrolitem.md +2 -2
- package/.llm/digest/select.md +1 -1
- package/.llm/digest/selectchip.md +1 -1
- package/.llm/digest/spinner.md +1 -1
- package/.llm/digest/stack.md +1 -1
- package/.llm/digest/stats.md +9 -1
- package/.llm/digest/statscarousel.md +48 -0
- package/.llm/digest/statusdot.md +8 -1
- package/.llm/digest/steps.md +1 -1
- package/.llm/digest/stickycards.md +1 -1
- package/.llm/digest/subdomainnavbar.md +1 -1
- package/.llm/digest/tab.md +1 -1
- package/.llm/digest/table.md +1 -1
- package/.llm/digest/tablebody.md +1 -1
- package/.llm/digest/tablecell.md +1 -1
- package/.llm/digest/tablehead.md +1 -1
- package/.llm/digest/tableheadercell.md +1 -1
- package/.llm/digest/tablerow.md +1 -1
- package/.llm/digest/tablist.md +1 -1
- package/.llm/digest/teamgrid.md +1 -1
- package/.llm/digest/testimonialrow.md +9 -2
- package/.llm/digest/testimonialslider.md +2 -2
- package/.llm/digest/textarea.md +1 -1
- package/.llm/digest/textinput.md +1 -1
- package/.llm/digest/textscroll.md +1 -1
- package/.llm/digest/tiers.md +1 -1
- package/.llm/digest/typography.md +19 -1
- package/.llm/index.md +15 -4
- package/.llm/rules.md +10 -0
- package/.llm/tokens.md +13 -3
- package/AGENTS.md +14 -2
- package/README.md +28 -3
- package/dist/components/arrival.d.ts +32 -0
- package/dist/components/arrival.js +140 -0
- package/dist/components/arrives.d.ts +17 -0
- package/dist/components/arrives.js +14 -0
- package/dist/components/blocks/awards/Awards.js +2 -27
- package/dist/components/blocks/block-pattern.css +23 -0
- package/dist/components/blocks/comparison-cards/comparison-cards-impl.css +29 -12
- package/dist/components/blocks/documents/Documents.css +90 -0
- package/dist/components/blocks/documents/Documents.d.ts +22 -0
- package/dist/components/blocks/documents/Documents.js +30 -0
- package/dist/components/blocks/documents/Documents.types.d.ts +37 -0
- package/dist/components/blocks/documents/Documents.types.js +14 -0
- package/dist/components/blocks/documents/documents-impl.css +103 -0
- package/dist/components/blocks/download-banner/DownloadBanner.css +1 -1
- package/dist/components/blocks/download-banner/DownloadBanner.types.d.ts +1 -1
- package/dist/components/blocks/estimator/Estimator.css +206 -0
- package/dist/components/blocks/estimator/Estimator.d.ts +27 -0
- package/dist/components/blocks/estimator/Estimator.js +61 -0
- package/dist/components/blocks/estimator/Estimator.types.d.ts +63 -0
- package/dist/components/blocks/estimator/Estimator.types.js +25 -0
- package/dist/components/blocks/estimator/estimator-impl.css +159 -0
- package/dist/components/blocks/feature-cards/FeatureCards.d.ts +2 -1
- package/dist/components/blocks/feature-cards/FeatureCards.js +10 -7
- package/dist/components/blocks/feature-cards/FeatureCards.types.d.ts +9 -1
- package/dist/components/blocks/feature-cards/feature-cards-impl.css +15 -3
- package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.d.ts +1 -1
- package/dist/components/blocks/feature-cards-carousel/feature-cards-carousel-impl.css +12 -0
- package/dist/components/blocks/feature-tabs/FeatureTabs.css +100 -0
- package/dist/components/blocks/feature-tabs/FeatureTabs.d.ts +23 -0
- package/dist/components/blocks/feature-tabs/FeatureTabs.js +38 -0
- package/dist/components/blocks/feature-tabs/FeatureTabs.types.d.ts +35 -0
- package/dist/components/blocks/feature-tabs/FeatureTabs.types.js +14 -0
- package/dist/components/blocks/feature-tabs/feature-tabs-impl.css +53 -0
- package/dist/components/blocks/image-banner/ImageBanner.css +1 -1
- package/dist/components/blocks/image-banner/ImageBanner.d.ts +2 -1
- package/dist/components/blocks/image-banner/ImageBanner.js +3 -2
- package/dist/components/blocks/image-banner/ImageBanner.types.d.ts +10 -8
- package/dist/components/blocks/image-banner/ImageBanner.types.js +1 -1
- package/dist/components/blocks/image-banner/image-banner-impl.css +78 -71
- package/dist/components/blocks/laurel.d.ts +16 -0
- package/dist/components/blocks/laurel.js +28 -0
- package/dist/components/blocks/logo-columns/LogoColumns.css +1 -1
- package/dist/components/blocks/logo-columns/LogoColumns.types.d.ts +1 -1
- package/dist/components/blocks/logo-rows/LogoRows.css +1 -1
- package/dist/components/blocks/logo-rows/LogoRows.d.ts +2 -1
- package/dist/components/blocks/logo-rows/LogoRows.js +7 -4
- package/dist/components/blocks/logo-rows/LogoRows.types.d.ts +9 -1
- package/dist/components/blocks/pattern-tone.d.ts +11 -0
- package/dist/components/blocks/pattern-tone.js +7 -0
- package/dist/components/blocks/product-hero/ProductHero.d.ts +1 -1
- package/dist/components/blocks/product-hero/ProductHero.js +2 -2
- package/dist/components/blocks/product-hero/ProductHero.types.d.ts +8 -3
- package/dist/components/blocks/product-hero/ProductHero.types.js +1 -1
- package/dist/components/blocks/product-hero/product-hero-impl.css +54 -0
- package/dist/components/blocks/resource-banner/ResourceBanner.css +1 -1
- package/dist/components/blocks/scene-scroll/SceneScroll.css +1 -1
- package/dist/components/blocks/scene-scroll/SceneScroll.d.ts +6 -5
- package/dist/components/blocks/scene-scroll/SceneScroll.js +8 -7
- package/dist/components/blocks/scene-scroll/SceneScroll.types.d.ts +5 -5
- package/dist/components/blocks/scene-scroll/SceneScroll.types.js +1 -1
- package/dist/components/blocks/scene-scroll/scene-scroll-impl.css +61 -44
- package/dist/components/blocks/scene-scroll-word/SceneScrollWord.css +105 -0
- package/dist/components/blocks/scene-scroll-word/SceneScrollWord.d.ts +31 -0
- package/dist/components/blocks/scene-scroll-word/SceneScrollWord.js +67 -0
- package/dist/components/blocks/scene-scroll-word/SceneScrollWord.types.d.ts +39 -0
- package/dist/components/blocks/scene-scroll-word/SceneScrollWord.types.js +18 -0
- package/dist/components/blocks/scene-scroll-word/scene-scroll-word-impl.css +370 -0
- package/dist/components/blocks/stats/Stats.d.ts +2 -1
- package/dist/components/blocks/stats/Stats.js +17 -14
- package/dist/components/blocks/stats/Stats.types.d.ts +8 -0
- package/dist/components/blocks/stats/stats-impl.css +4 -1
- package/dist/components/blocks/stats/use-wheel.d.ts +1 -1
- package/dist/components/blocks/stats/use-wheel.js +8 -4
- package/dist/components/blocks/stats-carousel/StatsCarousel.css +209 -0
- package/dist/components/blocks/stats-carousel/StatsCarousel.d.ts +20 -0
- package/dist/components/blocks/stats-carousel/StatsCarousel.js +48 -0
- package/dist/components/blocks/stats-carousel/StatsCarousel.types.d.ts +43 -0
- package/dist/components/blocks/stats-carousel/StatsCarousel.types.js +23 -0
- package/dist/components/blocks/stats-carousel/stats-carousel-impl.css +233 -0
- package/dist/components/blocks/sticky-cards/sticky-cards-impl.css +8 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.css +1 -1
- package/dist/components/blocks/testimonial-row/TestimonialRow.d.ts +2 -1
- package/dist/components/blocks/testimonial-row/TestimonialRow.js +16 -13
- package/dist/components/blocks/testimonial-row/TestimonialRow.types.d.ts +9 -1
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.css +1 -1
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.d.ts +1 -1
- package/dist/components/blocks/tiers/Tiers.types.d.ts +1 -1
- package/dist/components/core/background/Background.css +19 -0
- package/dist/components/core/background/Background.types.d.ts +2 -1
- package/dist/components/core/background/background-impl.css +47 -15
- package/dist/components/core/background/halftone.js +1 -1
- package/dist/components/core/button/Button.css +5 -5
- package/dist/components/core/button-icon/ButtonIcon.types.d.ts +1 -1
- package/dist/components/core/card-body/CardBody.css +5 -0
- package/dist/components/core/card-body/CardBody.types.d.ts +1 -1
- package/dist/components/core/document-link/DocumentLink.css +59 -0
- package/dist/components/core/document-link/DocumentLink.d.ts +19 -0
- package/dist/components/core/document-link/DocumentLink.js +21 -0
- package/dist/components/core/document-link/DocumentLink.types.d.ts +41 -0
- package/dist/components/core/document-link/DocumentLink.types.js +11 -0
- package/dist/components/core/document-link/document-link-impl.css +23 -0
- package/dist/components/core/illustration-card/IllustrationCard.css +7 -0
- package/dist/components/core/illustration-card/IllustrationCard.d.ts +5 -1
- package/dist/components/core/illustration-card/IllustrationCard.js +34 -8
- package/dist/components/core/illustration-card/IllustrationCard.types.d.ts +8 -1
- package/dist/components/core/illustration-card/IllustrationCard.types.js +1 -0
- package/dist/components/core/illustration-card/illustration-card-impl.css +113 -0
- package/dist/components/core/illustration-check/IllustrationCheck.css +25 -0
- package/dist/components/core/illustration-check/IllustrationCheck.d.ts +16 -0
- package/dist/components/core/illustration-check/IllustrationCheck.js +22 -0
- package/dist/components/core/illustration-check/IllustrationCheck.types.d.ts +25 -0
- package/dist/components/core/illustration-check/IllustrationCheck.types.js +9 -0
- package/dist/components/core/illustration-check/illustration-check-impl.css +76 -0
- package/dist/components/core/illustration-choice/IllustrationChoice.css +62 -0
- package/dist/components/core/illustration-choice/IllustrationChoice.d.ts +16 -0
- package/dist/components/core/illustration-choice/IllustrationChoice.js +31 -0
- package/dist/components/core/illustration-choice/IllustrationChoice.types.d.ts +25 -0
- package/dist/components/core/illustration-choice/IllustrationChoice.types.js +11 -0
- package/dist/components/core/illustration-choice/illustration-choice-impl.css +103 -0
- package/dist/components/core/illustration-code/IllustrationCode.css +25 -0
- package/dist/components/core/illustration-code/IllustrationCode.d.ts +12 -0
- package/dist/components/core/illustration-code/IllustrationCode.js +20 -0
- package/dist/components/core/illustration-code/IllustrationCode.types.d.ts +23 -0
- package/dist/components/core/illustration-code/IllustrationCode.types.js +8 -0
- package/dist/components/core/illustration-code/illustration-code-impl.css +42 -0
- package/dist/components/core/illustration-list/IllustrationList.css +19 -0
- package/dist/components/core/illustration-list/IllustrationList.d.ts +16 -0
- package/dist/components/core/illustration-list/IllustrationList.js +18 -0
- package/dist/components/core/illustration-list/IllustrationList.types.d.ts +15 -0
- package/dist/components/core/illustration-list/IllustrationList.types.js +6 -0
- package/dist/components/core/illustration-list/illustration-list-impl.css +52 -0
- package/dist/components/core/illustration-scene/IllustrationScene.css +6 -0
- package/dist/components/core/illustration-scene/IllustrationScene.d.ts +3 -2
- package/dist/components/core/illustration-scene/IllustrationScene.js +4 -3
- package/dist/components/core/illustration-scene/IllustrationScene.types.d.ts +5 -1
- package/dist/components/core/illustration-scene/IllustrationScene.types.js +2 -1
- package/dist/components/core/illustration-scene/illustration-scene-impl.css +65 -0
- package/dist/components/core/link/link-impl.css +5 -19
- package/dist/components/core/progress-bar/ProgressBar.css +101 -0
- package/dist/components/core/progress-bar/ProgressBar.d.ts +5 -0
- package/dist/components/core/progress-bar/ProgressBar.js +34 -0
- package/dist/components/core/progress-bar/ProgressBar.types.d.ts +52 -0
- package/dist/components/core/progress-bar/ProgressBar.types.js +12 -0
- package/dist/components/core/progress-bar/progress-bar-impl.css +45 -0
- package/dist/components/core/segmented-control/SegmentedControl.d.ts +1 -1
- package/dist/components/core/segmented-control/SegmentedControl.js +13 -5
- package/dist/components/core/segmented-control/SegmentedControl.types.d.ts +5 -1
- package/dist/components/core/segmented-control/segmented-control-impl.css +35 -0
- package/dist/components/core/segmented-control-item/SegmentedControlItem.types.d.ts +1 -1
- package/dist/components/core/select/Select.css +2 -0
- package/dist/components/core/select/select-impl.css +58 -0
- package/dist/components/core/status-dot/StatusDot.d.ts +1 -1
- package/dist/components/core/status-dot/StatusDot.js +7 -4
- package/dist/components/core/status-dot/StatusDot.types.d.ts +9 -1
- package/dist/components/core/status-dot/status-dot-impl.css +101 -0
- package/dist/components/core/text-area/TextArea.css +2 -0
- package/dist/components/core/text-area/text-area-impl.css +54 -0
- package/dist/components/core/text-input/TextInput.css +2 -0
- package/dist/components/core/text-input/text-input-impl.css +63 -0
- package/dist/components/core/typography/Typography.d.ts +3 -283
- package/dist/components/core/typography/Typography.js +9 -1
- package/dist/components/core/typography/Typography.types.d.ts +9 -15
- package/dist/components/core/typography/TypographyMotion.d.ts +28 -0
- package/dist/components/core/typography/TypographyMotion.js +43 -0
- package/dist/components/core/typography/typography-impl.css +106 -0
- package/dist/components/estimator-data.d.ts +29 -0
- package/dist/components/estimator-data.js +12 -0
- package/dist/components/illustration-data.d.ts +15 -0
- package/dist/components/illustration-data.js +7 -0
- package/dist/components/index.d.ts +25 -1
- package/dist/components/index.js +22 -0
- package/dist/components/layout/grid/Grid.css +5 -0
- package/dist/components/layout/grid/Grid.types.d.ts +2 -1
- package/dist/components/scene-scroll-data.d.ts +35 -0
- package/dist/components/tiers-data.d.ts +3 -2
- package/dist/icons/accounts.d.ts +1 -0
- package/dist/icons/accounts.js +1 -0
- package/dist/icons/app-stores.d.ts +1 -0
- package/dist/icons/app-stores.js +1 -0
- package/dist/icons/currency.d.ts +1 -0
- package/dist/icons/currency.js +1 -0
- package/dist/icons/flag.d.ts +1 -0
- package/dist/icons/flag.js +1 -0
- package/dist/icons/illustrative.d.ts +1 -0
- package/dist/icons/illustrative.js +1 -0
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +4 -0
- package/dist/icons/markets.d.ts +1 -0
- package/dist/icons/markets.js +1 -0
- package/dist/icons/social.d.ts +1 -0
- package/dist/icons/social.js +1 -0
- package/dist/icons/system.d.ts +1 -0
- package/dist/icons/system.js +1 -0
- package/dist/icons/trade.d.ts +1 -0
- package/dist/icons/trade.js +1 -0
- package/dist/marketing.css +26 -6
- package/package.json +44 -2
package/.llm/tokens.md
CHANGED
|
@@ -11,6 +11,8 @@ one value at every width.
|
|
|
11
11
|
|
|
12
12
|
## color
|
|
13
13
|
|
|
14
|
+
- `--color-bg-accent-slate` — Decorative surface, no status meaning, e.g. a category badge. The dark, cool accent; it sits close to color.bg.brand-strong, so keep it off dark bands. Never the sole carrier of a distinction. Pair with color.fg.on-solid for text.
|
|
15
|
+
- `--color-bg-accent-slate-subtle` — Lightweight decorative fill, e.g. a category badge, a tinted panel. No status reading. Pair with color.fg.accent-slate for text.
|
|
14
16
|
- `--color-bg-active` — Pressed state for interactive elements. Alpha-based like the hover and one step heavier, so it tints whatever surface it lands on — ink on light and paper on dark.
|
|
15
17
|
- `--color-bg-active-inverse` — Pressed state for an interactive element on a surface that runs against the mode, one step heavier than color.bg.hover-inverse. The mirror of color.bg.active, and paired with it on the same reasoning.
|
|
16
18
|
- `--color-bg-active-on-brand-strong` — Pressed state for an interactive element standing on color.bg.brand-strong, one step heavier than color.bg.hover-on-brand-strong. White at eight in both modes. For a surface that flips with the mode use color.bg.active-inverse.
|
|
@@ -19,7 +21,7 @@ one value at every width.
|
|
|
19
21
|
- `--color-bg-brand-active` — Pressed state for color.bg.brand. One step further along the ramp than the hover, in the same direction, so a press reads as more of what the hover began.
|
|
20
22
|
- `--color-bg-brand-deep` — The brand's darkest red, the same in both themes — a shade in a pattern drawn in the brand's reds, e.g. the deepest pool of Background's mesh. Not a ground for words: color.bg.brand-subtle is the tint that turns with the theme.
|
|
21
23
|
- `--color-bg-brand-hover` — Hover state for color.bg.brand.
|
|
22
|
-
- `--color-bg-brand-strong` — A dark
|
|
24
|
+
- `--color-bg-brand-strong` — A dark band breaking a long page, or a weightier card, e.g. a feature band, the footer. slate.900 in light, slate.950 in dark so it sits into a dark page. Pair with color.fg.on-brand-strong.
|
|
23
25
|
- `--color-bg-brand-subtle` — A brand ground quiet enough to read dark ink on. The solid coral takes white at 3.39:1 and is waived for a word; this pairs with color.fg.brand well past the bar, so a mark can be brand-coloured without spending the waiver.
|
|
24
26
|
- `--color-bg-danger` — Destructive action surface, e.g. cancel subscription, delete account. Pair with color.fg.on-solid for text.
|
|
25
27
|
- `--color-bg-danger-subtle` — Lightweight danger fill, e.g. error banners, danger badges. Pair with color.fg.danger for text.
|
|
@@ -45,8 +47,9 @@ one value at every width.
|
|
|
45
47
|
- `--color-bg-surface-card-light` — A light card that stays light whatever the theme, e.g. a surface-light Card or CardButton set among dark ones. gray.50 in both modes. Pair with color.fg.on-surface-card-light; for a card that follows the theme use color.bg.surface.
|
|
46
48
|
- `--color-bg-surface-card-light-raised` — The light card on a subtle band. White in light mode, where the band is the light card's own gray.50 and it would vanish; gray.50 in dark, where the band is a tint over near-black. Pair with color.fg.on-surface-card-light.
|
|
47
49
|
- `--color-bg-surface-card-raised` — A card lifting off the ground behind it, e.g. a Card or CardButton on a color.bg.subtle band. White in light, white at six in dark, so a dark card tints the band instead of sitting on it as grey. Menus and popovers take color.bg.surface-raised.
|
|
48
|
-
- `--color-bg-surface-card-strong` — The dark fill of a card weightier than its neighbours, e.g. an accent-strong Card or CardButton.
|
|
49
|
-
- `--color-bg-surface-card-strong-
|
|
50
|
+
- `--color-bg-surface-card-strong` — The dark fill of a card weightier than its neighbours, e.g. an accent-strong Card or CardButton. slate.900 in both modes, the same as color.bg.brand-strong, so on a dark band it reads by its media and edge rather than by a step of fill.
|
|
51
|
+
- `--color-bg-surface-card-strong-on-brand-strong` — The strong card on a color.bg.brand-strong band, e.g. a logo tile. A step above the band: slate.850 in light, slate.900 in dark. On the page use color.bg.surface-card-strong.
|
|
52
|
+
- `--color-bg-surface-card-strong-raised` — The strong card on a subtle band. slate.900 in light mode, the strong card's own fill, which already stands off the gray.50 band; slate.800 in dark, where the band is a near-black tint the strong card would blend into. Pair with color.fg.on-brand-strong.
|
|
50
53
|
- `--color-bg-surface-glass` — A pane of glass over whatever is behind it, e.g. an IllustrationCard on a band. Light glass in light mode, a faint frosted white in dark, with a blur behind it in both; ink is color.fg.default.
|
|
51
54
|
- `--color-bg-surface-inverse` — The quieter of the two surfaces on a dark ground, for a panel rather than a pill. color.bg.surface-raised-inverse is the stronger lift and is right on a control the size of a navbar's; at that weight a card-sized box reads as a pale patch rather than a surface.
|
|
52
55
|
- `--color-bg-surface-modal` — A surface that covers the page behind a scrim — dialogs, drawers, bottom sheets. The topmost plane there is, so it stays white in light where color.bg.surface is recessed. For one that floats without dimming what is under it use color.bg.surface-raised.
|
|
@@ -63,6 +66,7 @@ one value at every width.
|
|
|
63
66
|
- `--color-bg-transparent` — A fill that is declared and not seen, for an element whose own surface must show through rather than whatever a page happens to sit it on. Needed because omitting the background would leave that surface showing instead.
|
|
64
67
|
- `--color-bg-warning` — Caution surface, e.g. limited offer, expiring promotion. Pair with color.fg.on-solid for text.
|
|
65
68
|
- `--color-bg-warning-subtle` — Lightweight warning fill, e.g. warning banners, warning badges. Pair with color.fg.warning for text.
|
|
69
|
+
- `--color-border-accent-slate` — Decorative edge, no status meaning, e.g. an accent container's outline.
|
|
66
70
|
- `--color-border-danger` — Error validation border, e.g. input with failed validation, error banner edge.
|
|
67
71
|
- `--color-border-default` — Standard border for containers and controls, e.g. input outlines, grouped sections.
|
|
68
72
|
- `--color-border-focus` — The keyboard focus indicator — a border on some controls, a ring on others. Never remove: required for accessibility. Neutral rather than blue, so it is never mistaken for the danger a control is also able to show. Inverts by mode.
|
|
@@ -72,10 +76,12 @@ one value at every width.
|
|
|
72
76
|
- `--color-border-pattern` — The resting lines of a decorative rule grid on the page's ground. A step above color.border.subtle, which a hairline across a whole band thins to nothing; well below the default border, so the grid reads as texture.
|
|
73
77
|
- `--color-border-pattern-inverse` — The resting lines of a decorative rule grid on a dark or coral ground. White at a quarter in both modes, as those grounds are; a step above color.border.subtle-inverse, which a hairline grid thins to nothing.
|
|
74
78
|
- `--color-border-strong` — Emphasised border for active or prominent elements, e.g. active input, selected card edge.
|
|
79
|
+
- `--color-border-strong-inverse` — An emphasised edge on a dark or coral ground, e.g. a secondary button's outline on color.bg.brand-strong or the brand band. The counterpart to color.border.strong; white at 64% in both modes, as the band is the same in both.
|
|
75
80
|
- `--color-border-subtle` — A quiet separator, e.g. dividers, table rules. Alpha-based — works on any surface.
|
|
76
81
|
- `--color-border-subtle-inverse` — A quiet rule on a dark ground. The counterpart to color.border.subtle, which is black at 5% and invisible on one.
|
|
77
82
|
- `--color-border-success` — Success validation border, e.g. confirmed input, success banner edge.
|
|
78
83
|
- `--color-border-warning` — Warning validation border, e.g. approaching-limit input, warning banner edge.
|
|
84
|
+
- `--color-fg-accent-slate` — Decorative text and icons, no status meaning, e.g. a category label. Reads on the page and on color.bg.accent-slate-subtle.
|
|
79
85
|
- `--color-fg-brand` — Brand-coloured text, for a mark or a line on color.bg.brand-subtle. Not for text on the page: the brand is a colour a page uses to point at something, and copy set in it is a page pointing at all of itself.
|
|
80
86
|
- `--color-fg-brand-accent` — The brand label at full saturation — the brand fill's own red, the same in both modes, so a label and a fill agree. For the one row a reader is already on. Only on the bare page, never a tint. 3.11:1 as text, under AA: never the only thing saying it.
|
|
81
87
|
- `--color-fg-danger` — Error and destructive text on neutral surfaces, e.g. validation messages, negative values.
|
|
@@ -86,6 +92,7 @@ one value at every width.
|
|
|
86
92
|
- `--color-fg-muted-inverse` — Supporting copy on a dark ground, e.g. a footer's group labels. White at sixty-four, so it takes the hue of whatever the band is painted rather than sitting cool against a warm one — and so it stays muted on any dark ground instead of on one.
|
|
87
93
|
- `--color-fg-on-brand` — Text and marks on color.bg.brand, e.g. a primary button's label, a checked accent checkbox's tick. White in light and dark alike, because the brand fill does not change with the theme. For other solid fills — danger, success, info — use color.fg.on-solid.
|
|
88
94
|
- `--color-fg-on-brand-strong` — Text and glyphs on color.bg.brand-strong. White in both modes, that surface being dark in both — unlike color.fg.on-solid, which follows the theme.
|
|
95
|
+
- `--color-fg-on-media-light` — Text set straight on a light photograph with no scrim, e.g. a SceneScroll scene over a daylight sky. gray.950 in both modes, because the photograph does not change. Over a dark photograph use color.fg.on-brand-strong.
|
|
89
96
|
- `--color-fg-on-solid` — Text on solid status fills, e.g. danger, success, info buttons and badges. For text on color.bg.brand use color.fg.on-brand; on neutral surfaces use color.fg.default.
|
|
90
97
|
- `--color-fg-on-strong` — Text on color.bg.strong. The opposite extreme from the fill, so the pair is always near-black on white or white on near-black.
|
|
91
98
|
- `--color-fg-on-strong-on-brand` — Text and glyphs on color.bg.strong-on-brand, the near-black fill on the coral band. White in both modes, because the fill does not change — unlike color.fg.on-strong, which follows the theme.
|
|
@@ -172,6 +179,8 @@ one value at every width.
|
|
|
172
179
|
- `--size-menu-panel-min` — The shortest a section's menu panel gets, whatever it holds. A bar's sections rarely have the same number of destinations, and panels that each took their own height would change size as the reader moved along the row.
|
|
173
180
|
- `--size-menu-max` — The tallest a menu's surface gets before its commands scroll. Product's measure, and counted in rows: five whole and part of a sixth at either size. Neither lands on a row boundary — a ceiling cutting clean at the last full row looks like the whole set.
|
|
174
181
|
- `--size-mesh-blur` — How far a mesh background blurs its pools into one another. Enough that no pool keeps an edge, so the reds read as one liquid rather than shapes.
|
|
182
|
+
- `--size-progressbar-track-md` — Track height at size md. Default for standalone progress indicators.
|
|
183
|
+
- `--size-progressbar-track-sm` — Track height at size sm. Thin enough for dense layouts and inline indicators.
|
|
175
184
|
- `--size-review-card-min` — The shortest a TestimonialRow card gets. A floor, not a height: a one-line review keeps a card's shape, and a longer one still grows it.
|
|
176
185
|
- `--size-rings-pitch` — How far apart the rings on a band sit, counted out from the middle of its foot. A pitch, as size.rule-grid.pitch is; tighter than the grid's, because rings spaced that wide read as a target rather than a ripple.
|
|
177
186
|
- `--size-rings-spotlight` — How far the pointer's light reaches on the rings: the radius within which they brighten around the pointer and fade to the resting rings. The rule grid's reach, so the two answer the pointer alike.
|
|
@@ -378,6 +387,7 @@ one value at every width.
|
|
|
378
387
|
## motion
|
|
379
388
|
|
|
380
389
|
- `--motion-distance-drift` — How far decoration travels against the scroll while its section passes through the view, one way or the other. Far enough to be seen moving as the reader scrolls past, so it reads as depth.
|
|
390
|
+
- `--motion-distance-shake` — How far a field swings each way when it shakes to say a value was refused. Small on purpose: the field has to stay readable mid-swing, and a reader who has just been told no does not need to be shoved as well.
|
|
381
391
|
- `--motion-duration-dramatic` — Editorial hero entrances for visual impact, e.g. hero headline revealing, landing page title appearing. Not for scroll reveals — use motion.duration.reveal.
|
|
382
392
|
- `--motion-duration-drift` — One way of a slow drift that runs while something is on screen — an aurora wandering along a band's foot and back. Ten seconds, so the movement is felt rather than watched.
|
|
383
393
|
- `--motion-duration-dwell` — How long a rotating message holds before the next one moves in, e.g. a CTA banner's slides. Long enough to read a headline and a line under it; the reference site's 2000 moved before a reader reached the button.
|
package/AGENTS.md
CHANGED
|
@@ -55,6 +55,7 @@ a component you give `onChange` or `onClick` to goes in a file of your own that
|
|
|
55
55
|
|
|
56
56
|
- **A component is written along the reading axis, not along the page's left and right**
|
|
57
57
|
- **A navigation bar holds at most two buttons: one primary, and one secondary beside it**
|
|
58
|
+
- **A page has at most one patterned band, between its hero and its closing call to action**
|
|
58
59
|
- **A section that paints a ground sets the ink to go with it**
|
|
59
60
|
- **A section's title is centred over stacked content, starts beside content in columns, and starts on a phone**
|
|
60
61
|
- **Anything a pointer has to hit is at least 24px in both directions**
|
|
@@ -80,7 +81,7 @@ screen is built in is not something to reach for while building a control.
|
|
|
80
81
|
|
|
81
82
|
- **Accordion** — Questions a reader asks near a decision
|
|
82
83
|
- **AccordionItem** — One row inside an Accordion
|
|
83
|
-
- **Background** —
|
|
84
|
+
- **Background** — The page's one patterned band, between its hero and its closing call to action, on a section built by hand rather than from a block
|
|
84
85
|
- **Badge** — One of a set is the one the page wants read first
|
|
85
86
|
- **BottomSheet** — A task needs the screen's full width and the reader's undivided attention
|
|
86
87
|
- **Breadcrumb** — The page sits inside a section hierarchy, and the levels above it are places the visitor can navigate to
|
|
@@ -92,12 +93,17 @@ screen is built in is not something to reach for while building a control.
|
|
|
92
93
|
- **CardButton** — The whole card is the target rather than a link buried in it
|
|
93
94
|
- **Checkbox** — A choice the user makes now and confirms later
|
|
94
95
|
- **Divider** — Two groups inside one container that nothing else is separating
|
|
96
|
+
- **DocumentLink** — A document on a legal, regulatory or help page
|
|
95
97
|
- **DropdownMenu** — A set of destinations too long for the navigation bar and too short to be a page of its own
|
|
96
98
|
- **FilterChip** — An index is long enough to be worth cutting down and its categories are few enough to show in full
|
|
97
99
|
- **Footer** — A marketing page needs its closing band
|
|
98
100
|
- **FooterGroup** — A set of a footer's destinations belong under one word
|
|
99
101
|
- **Icon** — A glyph stands beside words to speed recognition
|
|
100
102
|
- **IllustrationCard** — Product information laid over a photograph or a piece of art
|
|
103
|
+
- **IllustrationCheck** — A pane, or any picture of the product, showing that something has gone through
|
|
104
|
+
- **IllustrationChoice** — A pane, or any picture of the product, showing a choice
|
|
105
|
+
- **IllustrationCode** — A pane, or any picture of the product, showing a verification step
|
|
106
|
+
- **IllustrationList** — A pane, or any picture of the product, listing a few things
|
|
101
107
|
- **IllustrationScene** — Product information shown over a photograph
|
|
102
108
|
- **Link** — A term inside running copy has a page of its own
|
|
103
109
|
- **MenuItem** — A row in a menu of destinations
|
|
@@ -111,6 +117,7 @@ screen is built in is not something to reach for while building a control.
|
|
|
111
117
|
- **Option** — An answer inside a control that opens a list
|
|
112
118
|
- **Pagination** — An index or archive has been split across pages and the reader needs to move through it
|
|
113
119
|
- **PaginationDots** — Showing where the reader is in a short sequence they move through
|
|
120
|
+
- **ProgressBar** — A task has measurable completion and the user needs to see how much is done
|
|
114
121
|
- **RemovableChip** — An index shows the narrowings currently applied above its results, and each has to come off on its own without clearing the rest
|
|
115
122
|
- **SearchInput** — A help centre, a knowledge base, or documentation
|
|
116
123
|
- **SegmentedControl** — Two to four alternatives that exclude one another, where the whole set is worth showing at once and the reader decides by weighing them side by side rather than recalling which exist
|
|
@@ -149,7 +156,9 @@ screen is built in is not something to reach for while building a control.
|
|
|
149
156
|
- **CtaBanner** — A short, high-contrast promotion with one clear action
|
|
150
157
|
- **CtaBannerSlider** — Rotating between two or three genuinely different promotions without a hero's weight
|
|
151
158
|
- **DataTable** — Trading instruments and their specifications
|
|
159
|
+
- **Documents** — A legal or regulatory page's documents
|
|
152
160
|
- **DownloadBanner** — Promoting an app across the stores and platforms it ships on
|
|
161
|
+
- **Estimator** — A page lets a reader work something out before they act
|
|
153
162
|
- **FaqAccordion** — The questions a reader asks before acting
|
|
154
163
|
- **FeatureBullets** — A page has to list what a product or a plan includes, and the list is the argument
|
|
155
164
|
- **FeatureCards** — Three or four things a product does, each a card with a heading, a line and a picture under them, read side by side and compared at a glance
|
|
@@ -157,6 +166,7 @@ screen is built in is not something to reach for while building a control.
|
|
|
157
166
|
- **FeatureScroll** — A page has three or more things of the same kind to explain, each with a picture worth a screen
|
|
158
167
|
- **FeatureSplit** — A page needs one more point about something it has already introduced, with a picture to carry it
|
|
159
168
|
- **FeatureStack** — A statement with a picture that carries it
|
|
169
|
+
- **FeatureTabs** — Several versions of one thing a reader takes one at a time
|
|
160
170
|
- **ImageBanner** — Driving a single mid-page or end-of-page action with a photograph to carry it
|
|
161
171
|
- **LandingHero** — A main landing page needs its opening band
|
|
162
172
|
- **LogoColumns** — Showing the partners, integrations or payment methods behind a claim
|
|
@@ -165,7 +175,9 @@ screen is built in is not something to reach for while building a control.
|
|
|
165
175
|
- **ProductHero** — A product or a market page needs its opening band
|
|
166
176
|
- **ResourceBanner** — Pointing readers at related guides, policies, or reference pages at the end of an informational section
|
|
167
177
|
- **SceneScroll** — Two states of one thing a page wants felt rather than listed
|
|
178
|
+
- **SceneScrollWord** — Two states of one thing that one claim covers with one word changed
|
|
168
179
|
- **Stats** — Three to five headline numbers that prove scale or credibility
|
|
180
|
+
- **StatsCarousel** — A trust band where each figure is a moment rather than a column to compare
|
|
169
181
|
- **Steps** — A page explains a get-started or onboarding flow
|
|
170
182
|
- **StickyCards** — A set of markets, products or benefits a page wants read one at a time as the reader scrolls
|
|
171
183
|
- **TeamGrid** — A leadership team, an advisory board or a regional management list on an about page
|
|
@@ -186,7 +198,7 @@ saying what to mount and where.
|
|
|
186
198
|
## Reading order
|
|
187
199
|
|
|
188
200
|
1. This file.
|
|
189
|
-
2. `.llm/rules.md` before writing anything — 5,
|
|
201
|
+
2. `.llm/rules.md` before writing anything — 5,500 tokens, and it is where the constraints
|
|
190
202
|
that no single component can state live.
|
|
191
203
|
3. `.llm/digest/<name>.md` for every component you are using — **all of it, not the part
|
|
192
204
|
you were looking for**. Around 1,400 tokens each: what it is for, what to reach for
|
package/README.md
CHANGED
|
@@ -19,13 +19,15 @@ on when to reach for it. Product apps want
|
|
|
19
19
|
npm install @deriv-com/dds-marketing
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
React 19
|
|
23
|
-
|
|
22
|
+
React 19 is a peer dependency, so install it alongside if your app does not already have
|
|
23
|
+
it:
|
|
24
24
|
|
|
25
25
|
```bash
|
|
26
|
-
npm install react react-dom
|
|
26
|
+
npm install react react-dom
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
+
The Quill icon set comes with the package — there is nothing else to install.
|
|
30
|
+
|
|
29
31
|
## Use
|
|
30
32
|
|
|
31
33
|
Import the stylesheet once, at the root of your app. It defines every token this package's
|
|
@@ -60,6 +62,29 @@ export function Home() {
|
|
|
60
62
|
|
|
61
63
|
Each component brings its own stylesheet with it, so nothing else needs importing.
|
|
62
64
|
|
|
65
|
+
## Icons
|
|
66
|
+
|
|
67
|
+
Every [Quill](https://github.com/deriv-com/product-design-quill-icons) icon is re-exported
|
|
68
|
+
from `@deriv-com/dds-marketing/icons`, under the name Quill gives it:
|
|
69
|
+
|
|
70
|
+
```tsx
|
|
71
|
+
import { Icon } from '@deriv-com/dds-marketing'
|
|
72
|
+
import { CircleCheckSolidIcon } from '@deriv-com/dds-marketing/icons'
|
|
73
|
+
import { UsdIcon } from '@deriv-com/dds-marketing/icons/currency'
|
|
74
|
+
|
|
75
|
+
<Icon label="Verified"><CircleCheckSolidIcon /></Icon>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Each Quill group has a subpath of its own — `accounts`, `app-stores`, `currency`, `flag`,
|
|
79
|
+
`illustrative`, `markets`, `social`, `system` and `trade`. Production builds tree-shake either
|
|
80
|
+
form to the icons you use; a dev server does not, so the group subpaths keep it from loading
|
|
81
|
+
all ~1,850 at once. Raw SVG files are not re-exported; for those, install
|
|
82
|
+
`@deriv-com/quill-icons-web` and use its `svg/` folder.
|
|
83
|
+
|
|
84
|
+
An app that already imports from `@deriv-com/quill-icons-web` keeps working. It is the same
|
|
85
|
+
module, so the two can be mixed while you migrate — but drop the direct dependency when you
|
|
86
|
+
are done, or pin it to the range this package uses, so the app does not bundle two copies.
|
|
87
|
+
|
|
63
88
|
## Fonts
|
|
64
89
|
|
|
65
90
|
The system is designed for [Inter](https://rsms.me/inter/) (all text) and
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type RefObject } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Where a part that moves once on arrival has got to.
|
|
4
|
+
*
|
|
5
|
+
* `still` is the resting answer and the part's final state: what a server draws, what a reader who
|
|
6
|
+
* asked for less movement sees, and what a part with no motion turned on is. `waiting` holds the
|
|
7
|
+
* motion at its first frame; `playing` runs it, once.
|
|
8
|
+
*/
|
|
9
|
+
export type Arrival = 'still' | 'waiting' | 'playing';
|
|
10
|
+
/**
|
|
11
|
+
* When a part with a motion of its own — a figure that rolls, a word that swaps, a bar that fills —
|
|
12
|
+
* plays it. The part sets the answer on itself as `data-arrival`, and its stylesheet holds its
|
|
13
|
+
* animation paused while that reads `waiting` and lets it run at `playing`. Nothing about the
|
|
14
|
+
* motion itself is here: the steps, the timings and the easing are the stylesheet's, in the
|
|
15
|
+
* package's motion tokens.
|
|
16
|
+
*
|
|
17
|
+
* A part plays where it is, which is what makes the same motion usable anywhere:
|
|
18
|
+
*
|
|
19
|
+
* - inside a host that is itself arriving — an IllustrationCard, which marks itself
|
|
20
|
+
* `data-arrival-host` — it follows that, so a pane's parts play when the pane has landed rather
|
|
21
|
+
* than each on its own;
|
|
22
|
+
* - inside a block's reveal (`data-revealed`, see use-reveal.ts) it waits for the block to bring
|
|
23
|
+
* it in, and for the part of the block that holds it to finish moving, so it plays on something
|
|
24
|
+
* that has come to rest;
|
|
25
|
+
* - anywhere else it plays once it is well into view — six tenths of it showing — so a figure at
|
|
26
|
+
* the foot of a section is not over before a reader reaches it.
|
|
27
|
+
*
|
|
28
|
+
* It answers `still` until it is running, for use-reveal's reason: a motion that held a part at
|
|
29
|
+
* its first frame until a script arrived would leave a reader with no script looking at zeros and
|
|
30
|
+
* empty boxes. And it fires once, then lets go.
|
|
31
|
+
*/
|
|
32
|
+
export declare function useArrival<T extends HTMLElement>(enabled?: boolean): [ref: RefObject<T | null>, arrival: Arrival];
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useLayoutEffect, useRef, useState } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* When a part with a motion of its own — a figure that rolls, a word that swaps, a bar that fills —
|
|
5
|
+
* plays it. The part sets the answer on itself as `data-arrival`, and its stylesheet holds its
|
|
6
|
+
* animation paused while that reads `waiting` and lets it run at `playing`. Nothing about the
|
|
7
|
+
* motion itself is here: the steps, the timings and the easing are the stylesheet's, in the
|
|
8
|
+
* package's motion tokens.
|
|
9
|
+
*
|
|
10
|
+
* A part plays where it is, which is what makes the same motion usable anywhere:
|
|
11
|
+
*
|
|
12
|
+
* - inside a host that is itself arriving — an IllustrationCard, which marks itself
|
|
13
|
+
* `data-arrival-host` — it follows that, so a pane's parts play when the pane has landed rather
|
|
14
|
+
* than each on its own;
|
|
15
|
+
* - inside a block's reveal (`data-revealed`, see use-reveal.ts) it waits for the block to bring
|
|
16
|
+
* it in, and for the part of the block that holds it to finish moving, so it plays on something
|
|
17
|
+
* that has come to rest;
|
|
18
|
+
* - anywhere else it plays once it is well into view — six tenths of it showing — so a figure at
|
|
19
|
+
* the foot of a section is not over before a reader reaches it.
|
|
20
|
+
*
|
|
21
|
+
* It answers `still` until it is running, for use-reveal's reason: a motion that held a part at
|
|
22
|
+
* its first frame until a script arrived would leave a reader with no script looking at zeros and
|
|
23
|
+
* empty boxes. And it fires once, then lets go.
|
|
24
|
+
*/
|
|
25
|
+
export function useArrival(enabled = true) {
|
|
26
|
+
const held = useRef(null);
|
|
27
|
+
const [arrival, setArrival] = useState('still');
|
|
28
|
+
useLayoutEffect(() => {
|
|
29
|
+
const element = held.current;
|
|
30
|
+
if (!enabled || element === null)
|
|
31
|
+
return undefined;
|
|
32
|
+
if (typeof window.matchMedia === 'function' && window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
if (typeof IntersectionObserver === 'undefined' || typeof MutationObserver === 'undefined')
|
|
36
|
+
return undefined;
|
|
37
|
+
if (element.getClientRects().length === 0)
|
|
38
|
+
return undefined;
|
|
39
|
+
let cancelled = false;
|
|
40
|
+
const cleanups = [];
|
|
41
|
+
const play = () => {
|
|
42
|
+
// The next frame, for use-reveal's reason: a transition or an animation needs its first
|
|
43
|
+
// frame painted before it has anything to move from.
|
|
44
|
+
const frame = requestAnimationFrame(() => {
|
|
45
|
+
if (!cancelled)
|
|
46
|
+
setArrival('playing');
|
|
47
|
+
});
|
|
48
|
+
cleanups.push(() => cancelAnimationFrame(frame));
|
|
49
|
+
};
|
|
50
|
+
// Following something that is itself arriving — a pane — its answer is this part's answer. The
|
|
51
|
+
// host is found by a mark it carries from its first render, because its own answer is set in a
|
|
52
|
+
// layout effect that runs after this one: a child's effects run before its parent's.
|
|
53
|
+
const leader = element.parentElement?.closest('[data-arrival-host]') ?? null;
|
|
54
|
+
if (leader !== null) {
|
|
55
|
+
// No frame put off here, unlike playing on its own below: a part following its host has been
|
|
56
|
+
// painted waiting beside it all along, so it has its first frame already — and a frame asked
|
|
57
|
+
// for from inside the host's own switch can be one the browser never draws.
|
|
58
|
+
const follow = () => {
|
|
59
|
+
if (leader.dataset['arrival'] !== 'playing')
|
|
60
|
+
return false;
|
|
61
|
+
if (!cancelled)
|
|
62
|
+
setArrival('playing');
|
|
63
|
+
return true;
|
|
64
|
+
};
|
|
65
|
+
setArrival('waiting');
|
|
66
|
+
if (!follow()) {
|
|
67
|
+
const watch = new MutationObserver(() => {
|
|
68
|
+
if (follow())
|
|
69
|
+
watch.disconnect();
|
|
70
|
+
});
|
|
71
|
+
watch.observe(leader, { attributes: true, attributeFilter: ['data-arrival'] });
|
|
72
|
+
cleanups.push(() => watch.disconnect());
|
|
73
|
+
}
|
|
74
|
+
return () => {
|
|
75
|
+
cancelled = true;
|
|
76
|
+
cleanups.forEach((clean) => clean());
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
setArrival('waiting');
|
|
80
|
+
const landed = () => {
|
|
81
|
+
// Inside a block's reveal, the part of the block that holds this one — or this one itself —
|
|
82
|
+
// is moving in on a transition. The motion starts when that has come to rest.
|
|
83
|
+
const mover = element.closest('[data-reveal-at]');
|
|
84
|
+
const settle = Math.max(restingIn(element), mover === null ? 0 : restingIn(mover));
|
|
85
|
+
if (settle === 0) {
|
|
86
|
+
play();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const timer = window.setTimeout(play, settle);
|
|
90
|
+
cleanups.push(() => window.clearTimeout(timer));
|
|
91
|
+
};
|
|
92
|
+
const watchReveal = () => {
|
|
93
|
+
const block = element.closest('[data-revealed]');
|
|
94
|
+
if (block === null || block.dataset['revealed'] === 'true') {
|
|
95
|
+
landed();
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const watch = new MutationObserver(() => {
|
|
99
|
+
if (block.dataset['revealed'] === 'true') {
|
|
100
|
+
watch.disconnect();
|
|
101
|
+
landed();
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
watch.observe(block, { attributes: true, attributeFilter: ['data-revealed'] });
|
|
105
|
+
cleanups.push(() => watch.disconnect());
|
|
106
|
+
};
|
|
107
|
+
// Seen once most of it is on screen — or, for a part taller than the screen, once it fills most
|
|
108
|
+
// of the screen. Six-tenths of a part three screens tall is never on screen at once, and a part
|
|
109
|
+
// that waited for that would wait at its first frame forever. The finer thresholds are what let
|
|
110
|
+
// the callback hear a tall part fill the screen, which no single crossing of 0.6 would report.
|
|
111
|
+
const seen = new IntersectionObserver((entries) => {
|
|
112
|
+
const landedOnScreen = entries.some((entry) => entry.isIntersecting &&
|
|
113
|
+
(entry.intersectionRatio >= 0.6 ||
|
|
114
|
+
(entry.rootBounds !== null && entry.intersectionRect.height >= entry.rootBounds.height * 0.6)));
|
|
115
|
+
if (!landedOnScreen)
|
|
116
|
+
return;
|
|
117
|
+
seen.disconnect();
|
|
118
|
+
watchReveal();
|
|
119
|
+
}, { threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6] });
|
|
120
|
+
seen.observe(element);
|
|
121
|
+
cleanups.push(() => seen.disconnect());
|
|
122
|
+
return () => {
|
|
123
|
+
cancelled = true;
|
|
124
|
+
cleanups.forEach((clean) => clean());
|
|
125
|
+
};
|
|
126
|
+
}, [enabled]);
|
|
127
|
+
return [held, arrival];
|
|
128
|
+
}
|
|
129
|
+
/** How long an element's own transition takes to finish from now: its first delay and duration. */
|
|
130
|
+
function restingIn(element) {
|
|
131
|
+
const style = getComputedStyle(element);
|
|
132
|
+
const seconds = (value) => {
|
|
133
|
+
const first = value.split(',')[0]?.trim() ?? '0s';
|
|
134
|
+
const amount = Number.parseFloat(first);
|
|
135
|
+
if (!Number.isFinite(amount))
|
|
136
|
+
return 0;
|
|
137
|
+
return first.endsWith('ms') ? amount : amount * 1000;
|
|
138
|
+
};
|
|
139
|
+
return seconds(style.transitionDelay) + seconds(style.transitionDuration);
|
|
140
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ReactElement, type Ref } from 'react';
|
|
2
|
+
type Element = ReactElement<Record<string, unknown> & {
|
|
3
|
+
ref?: Ref<HTMLElement>;
|
|
4
|
+
}>;
|
|
5
|
+
/**
|
|
6
|
+
* Gives one element its arrival — `data-arrival`, from useArrival — so a component with no script
|
|
7
|
+
* of its own can move once on arrival without becoming a client component: it wraps the element it
|
|
8
|
+
* draws only when a motion has been asked for. The element keeps everything it was given, and
|
|
9
|
+
* anything handed to this wrapper — a tooltip's handlers, cloned onto what it holds — is passed on
|
|
10
|
+
* to it.
|
|
11
|
+
*/
|
|
12
|
+
export declare function Arrives({ children, ...handed }: {
|
|
13
|
+
children: Element;
|
|
14
|
+
} & Record<string, unknown>): ReactElement<Record<string, unknown> & {
|
|
15
|
+
ref?: Ref<HTMLElement>;
|
|
16
|
+
}, string | import("react").JSXElementConstructor<any>>;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { cloneElement } from 'react';
|
|
3
|
+
import { useArrival } from './arrival.js';
|
|
4
|
+
/**
|
|
5
|
+
* Gives one element its arrival — `data-arrival`, from useArrival — so a component with no script
|
|
6
|
+
* of its own can move once on arrival without becoming a client component: it wraps the element it
|
|
7
|
+
* draws only when a motion has been asked for. The element keeps everything it was given, and
|
|
8
|
+
* anything handed to this wrapper — a tooltip's handlers, cloned onto what it holds — is passed on
|
|
9
|
+
* to it.
|
|
10
|
+
*/
|
|
11
|
+
export function Arrives({ children, ...handed }) {
|
|
12
|
+
const [held, arrival] = useArrival();
|
|
13
|
+
return cloneElement(children, { ...handed, ref: held, 'data-arrival': arrival === 'still' ? undefined : arrival });
|
|
14
|
+
}
|
|
@@ -5,6 +5,7 @@ import './Awards.css';
|
|
|
5
5
|
import './awards-impl.css';
|
|
6
6
|
import '../block-reveal.css';
|
|
7
7
|
import { arriving, useReveal } from '../use-reveal.js';
|
|
8
|
+
import { Laurel } from '../laurel.js';
|
|
8
9
|
import { awardsDefaults, awardsParts, } from './Awards.types.js';
|
|
9
10
|
/**
|
|
10
11
|
* Where an award comes in the arrival, capped so a long list does not keep a reader waiting.
|
|
@@ -15,32 +16,6 @@ import { awardsDefaults, awardsParts, } from './Awards.types.js';
|
|
|
15
16
|
*/
|
|
16
17
|
const FIRST_AWARD = 1;
|
|
17
18
|
const LAST_STEP = FIRST_AWARD + 4;
|
|
18
|
-
/**
|
|
19
|
-
* The reference design's laurel, the vector its Stats section draws, in one colour.
|
|
20
|
-
*
|
|
21
|
-
* The left-hand branch: its leaves curl up and in toward whatever stands to its right. The second
|
|
22
|
-
* branch is this one mirrored, by the stylesheet, so one drawing serves both sides and a right-to-left
|
|
23
|
-
* page can swap which side is mirrored without a second picture. The reference laid it at a fifth of
|
|
24
|
-
* its strength; here it takes the band's quieter ink instead, a colour role rather than an alpha, so
|
|
25
|
-
* it follows the ground the way every other quiet thing in the package does.
|
|
26
|
-
*/
|
|
27
|
-
const LAUREL_PATHS = [
|
|
28
|
-
'M20.8655 76.0151C21.3631 78.5487 22.4577 80.4673 23.4245 81.7447C23.7945 82.2337 24.145 82.6275 24.4343 82.9245C24.5003 81.0424 24.5392 77.0209 23.854 73.543C23.3836 71.2282 22.6189 69.4263 21.9723 68.1997C21.7486 67.7754 21.539 67.42 21.3608 67.1361C21.2158 67.6487 21.042 68.3446 20.8935 69.1718C20.5634 71.0111 20.3623 73.4782 20.8655 76.0151Z',
|
|
29
|
-
'M9.19518 69.4464C8.5612 69.2311 8.01354 69.0792 7.6041 68.9776C7.77674 69.5261 8.03563 70.2542 8.40971 71.0711C9.16156 72.713 10.3603 74.6729 12.1472 76.0342C13.9141 77.3864 15.8077 77.7752 17.2669 77.8239C17.9963 77.8483 18.6126 77.7873 19.0419 77.7209C18.3715 76.5307 16.6347 73.8279 14.0892 71.9349C12.4167 70.7081 10.6015 69.924 9.19518 69.4464Z',
|
|
30
|
-
'M14.1789 62.4853C14.1095 65.0056 14.7018 67.1343 15.3106 68.6265C15.5268 69.1563 15.7445 69.6045 15.9342 69.9597C16.0737 69.4242 16.2473 68.7196 16.4239 67.9038C16.8294 66.0308 17.2467 63.5892 17.309 61.2688C17.3584 58.9612 17.0322 57.019 16.6942 55.65C16.5809 55.1908 16.4663 54.7965 16.3643 54.4749C16.1414 54.8952 15.8702 55.4487 15.5956 56.1107C14.9268 57.7233 14.2444 59.9642 14.1789 62.4853Z',
|
|
31
|
-
'M6.16644 56.5363L5.92729 56.2113C4.18123 53.9739 2.10237 52.4221 0.99942 51.685C1.0448 52.2219 1.13195 52.9558 1.29599 53.7969C1.6458 55.5904 2.33816 57.834 3.68889 59.699C5.02796 61.5534 6.66938 62.5331 7.97363 63.0496C8.56984 63.2857 9.09434 63.4244 9.48448 63.5049C9.08235 62.1271 8.06278 59.1136 6.16644 56.5363Z',
|
|
32
|
-
'M12.9202 41.9556C12.9103 41.468 12.8857 41.0438 12.8578 40.6964C12.5852 41.0139 12.2554 41.4254 11.9043 41.9234C10.9787 43.2365 9.91222 45.1415 9.34811 47.5086L9.21888 48.0509C8.78948 50.2094 8.89878 52.2002 9.13088 53.6853C9.21855 54.2463 9.32345 54.7333 9.42253 55.1275C10.2101 53.5777 11.6117 50.5783 12.3444 47.5177C12.8519 45.3454 12.9491 43.3817 12.9202 41.9556Z',
|
|
33
|
-
'M4.26838 40.1575C3.16507 37.3338 1.55966 35.0449 0.658674 33.8839C0.595099 34.3962 0.53299 35.0674 0.509766 35.8425C0.454879 37.6743 0.618233 40.0556 1.46849 42.2871C2.30759 44.5064 3.60611 45.9871 4.68907 46.9107C5.12959 47.2864 5.53393 47.5694 5.85602 47.7717C5.82536 47.3041 5.77132 46.6715 5.67501 45.9295C5.46619 44.3205 5.06044 42.211 4.27156 40.1569L4.26838 40.1575Z',
|
|
34
|
-
'M12.6632 27.4606C11.6314 28.3597 10.3804 29.7129 9.40352 31.5834L9.20135 32.004C8.19489 34.0975 7.83678 36.2499 7.73379 37.8807C7.69736 38.4576 7.693 38.9667 7.70264 39.3814C7.98105 39.0479 8.31846 38.6306 8.68777 38.1462C9.68653 36.8365 10.9078 35.0512 11.829 33.1204C12.7356 31.1936 13.238 29.3215 13.5154 27.9233C13.6157 27.4178 13.6864 26.9753 13.7361 26.6158C13.4324 26.8302 13.0648 27.1106 12.6632 27.4606Z',
|
|
35
|
-
'M7.15889 23.0454L7.23043 22.5253C7.54518 19.6881 7.36017 17.0948 7.19664 15.6517C6.9244 16.0575 6.59747 16.5777 6.25738 17.1905C5.37216 18.7855 4.41002 20.986 4.07631 23.4177C3.74032 25.8399 4.108 27.8499 4.55657 29.25C4.7215 29.7648 4.89717 30.1965 5.05235 30.5349C5.64762 29.1157 6.71893 26.2445 7.15889 23.0454Z',
|
|
36
|
-
'M20.7056 14.8951C19.4372 15.269 17.7724 15.9875 16.1554 17.3693L16.021 17.4932C14.3576 18.9542 13.2217 20.7665 12.5041 22.2202C12.2403 22.7546 12.0346 23.2374 11.8812 23.6318C12.2297 23.4596 12.6507 23.2423 13.1195 22.9822C14.4495 22.2442 16.1506 21.1686 17.6705 19.808C19.177 18.446 20.3493 16.9414 21.1512 15.7693C21.4549 15.3255 21.7047 14.9307 21.8987 14.6109C21.5673 14.6707 21.1626 14.7604 20.7056 14.8951Z',
|
|
37
|
-
'M15.246 9.89451L15.3989 9.48769C16.3817 6.71545 16.8681 4.08928 17.0948 2.56556C16.7641 2.88544 16.3703 3.28963 15.9481 3.76978C14.7583 5.12276 13.3571 7.06214 12.4902 9.40367C11.6163 11.7394 11.483 13.8564 11.5665 15.3854C11.595 15.9081 11.6489 16.3613 11.7069 16.7298C11.9415 16.3768 12.2271 15.9318 12.5414 15.4103C13.3841 14.0121 14.4266 12.0747 15.246 9.89451Z',
|
|
38
|
-
'M24.236 2.86551C22.4046 4.24716 21.0854 6.09763 20.225 7.6144C19.8673 8.24502 19.5916 8.81333 19.3933 9.25894C19.765 9.11933 20.2233 8.93634 20.7396 8.70812C22.1292 8.09394 23.9267 7.15785 25.5896 5.86671C27.2408 4.56435 28.6049 3.04428 29.5633 1.84034C29.9762 1.32163 30.3123 0.863542 30.5622 0.509562C30.206 0.526204 29.7564 0.567871 29.2396 0.659382C27.8788 0.900297 26.0564 1.48555 24.236 2.86551Z',
|
|
39
|
-
];
|
|
40
|
-
/** One laurel branch. Decoration: hidden from assistive technology and never focusable. */
|
|
41
|
-
function Laurel({ side }) {
|
|
42
|
-
return (_jsx("svg", { className: awardsParts.laurel, "data-side": side, viewBox: "0 0 32 84", fill: "none", "aria-hidden": "true", focusable: "false", children: LAUREL_PATHS.map((d) => (_jsx("path", { d: d, fill: "currentColor", stroke: "currentColor" }, d))) }));
|
|
43
|
-
}
|
|
44
19
|
/**
|
|
45
20
|
* Whether the list is wider than the room it has — the phone's row, and only while it runs on past
|
|
46
21
|
* the band's edge.
|
|
@@ -78,7 +53,7 @@ function useOverflowing(list) {
|
|
|
78
53
|
}
|
|
79
54
|
/** One award's badge: the award's words between its two laurels. */
|
|
80
55
|
function Badge({ award }) {
|
|
81
|
-
return (_jsxs(_Fragment, { children: [_jsx(Laurel, { side: "leading" }), _jsxs("div", { className: awardsParts.copy, children: [_jsx("p", { className: awardsParts.name, children: award.title }), _jsx("p", { className: awardsParts.issuer, children: award.issuer })] }), _jsx(Laurel, { side: "trailing" })] }));
|
|
56
|
+
return (_jsxs(_Fragment, { children: [_jsx(Laurel, { className: awardsParts.laurel, side: "leading" }), _jsxs("div", { className: awardsParts.copy, children: [_jsx("p", { className: awardsParts.name, children: award.title }), _jsx("p", { className: awardsParts.issuer, children: award.issuer })] }), _jsx(Laurel, { className: awardsParts.laurel, side: "trailing" })] }));
|
|
82
57
|
}
|
|
83
58
|
/**
|
|
84
59
|
* A heading over the awards a company has won, each between two laurels — the reference design's
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The page's one patterned band, drawn as a block's first layer.
|
|
3
|
+
*
|
|
4
|
+
* A block that offers `background` places a Background with nothing to hold as its section's first
|
|
5
|
+
* child, and Background, as a layer, fills its positioned parent behind that parent's content. So
|
|
6
|
+
* the section is positioned and isolated, and its own content is lifted over the layer by being
|
|
7
|
+
* positioned after it: the pattern is under the content and over nothing — the section's first
|
|
8
|
+
* layer, not a wrapper round it.
|
|
9
|
+
*
|
|
10
|
+
* Defined once, as block-reveal.css is, and imported by each block that offers the pattern, so a fix
|
|
11
|
+
* to how the layer stacks lands in every one of them. Keyed on the layer being there rather than on
|
|
12
|
+
* each block's name, so a block that comes to offer the pattern needs nothing added here — and not
|
|
13
|
+
* on `data-background` alone, which CtaBanner, LandingHero and PageHeader set too, for a ground of
|
|
14
|
+
* their own: this sheet is global once any block loads it, and theirs must not be repositioned.
|
|
15
|
+
*/
|
|
16
|
+
:where([data-dds-context="marketing"]) [data-background]:has(> .dds-background[data-layer='true']) {
|
|
17
|
+
isolation: isolate;
|
|
18
|
+
position: relative;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
:where([data-dds-context="marketing"]) [data-background]:has(> .dds-background[data-layer='true']) > :not(.dds-background) {
|
|
22
|
+
position: relative;
|
|
23
|
+
}
|
|
@@ -209,6 +209,35 @@
|
|
|
209
209
|
color: var(--color-fg-on-brand-strong);
|
|
210
210
|
}
|
|
211
211
|
|
|
212
|
+
/*
|
|
213
|
+
* The standard card's supporting words recede, so its title and its values read first.
|
|
214
|
+
*
|
|
215
|
+
* The line under the card's title, each row's label and the footnote take the muted ink — the
|
|
216
|
+
* answers are what a reader compares across the cards, and the labels only say which question each
|
|
217
|
+
* answers. On the page and the subtle band that is color.fg.muted, which follows the theme as the
|
|
218
|
+
* standard card's surface does; on the dark band, where that card has turned to the inverse surface
|
|
219
|
+
* and white ink above, it is color.fg.muted-inverse. CardBody's eyebrow takes the same two.
|
|
220
|
+
*
|
|
221
|
+
* Only the standard card, which is Card's own `surface`. The highlighted set's light card is gray.50
|
|
222
|
+
* in both themes and the page's muted grey turns pale with dark mode, and the coral card's white is
|
|
223
|
+
* already at the edge of its contrast, so neither has a muted ink to recede to and both keep their own.
|
|
224
|
+
*/
|
|
225
|
+
:where([data-dds-context="marketing"])
|
|
226
|
+
.dds-comparisoncards:is([data-ground="page"], [data-ground="subtle"])
|
|
227
|
+
.dds-comparisoncards__item
|
|
228
|
+
> .dds-card[data-variant="surface"]
|
|
229
|
+
:is(.dds-comparisoncards__card-description, .dds-comparisoncards__row-label, .dds-comparisoncards__footnote) {
|
|
230
|
+
color: var(--color-fg-muted);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
:where([data-dds-context="marketing"])
|
|
234
|
+
.dds-comparisoncards[data-ground="strong"]
|
|
235
|
+
.dds-comparisoncards__item
|
|
236
|
+
> .dds-card[data-variant="surface"]
|
|
237
|
+
:is(.dds-comparisoncards__card-description, .dds-comparisoncards__row-label, .dds-comparisoncards__footnote) {
|
|
238
|
+
color: var(--color-fg-muted-inverse);
|
|
239
|
+
}
|
|
240
|
+
|
|
212
241
|
/*
|
|
213
242
|
* The highlighted variant: the recommended card lifted off the page.
|
|
214
243
|
*
|
|
@@ -248,15 +277,3 @@
|
|
|
248
277
|
:where([data-dds-context="marketing"]) .dds-comparisoncards[data-variant='highlighted'] .dds-comparisoncards__item[data-recommended]:has(.dds-comparisoncards__highlight) .dds-comparisoncards__card-head {
|
|
249
278
|
padding-block-start: var(--space-inset-md);
|
|
250
279
|
}
|
|
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
|
-
}
|