@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.
- package/.llm/components/awards.md +209 -0
- package/.llm/components/background.md +420 -0
- package/.llm/components/bottomsheet.md +5 -0
- package/.llm/components/comparisoncards.md +257 -0
- package/.llm/components/comparisontable.md +231 -0
- package/.llm/components/ctabanner.md +22 -0
- package/.llm/components/ctabannerslider.md +36 -2
- package/.llm/components/datatable.md +273 -0
- package/.llm/components/downloadbanner.md +283 -0
- package/.llm/components/featurecards.md +41 -3
- package/.llm/components/featurecardscarousel.md +311 -0
- package/.llm/components/featuresplit.md +5 -0
- package/.llm/components/featurestack.md +227 -0
- package/.llm/components/illustrationcard.md +236 -0
- package/.llm/components/illustrationscene.md +229 -0
- package/.llm/components/imagebanner.md +278 -0
- package/.llm/components/landinghero.md +24 -0
- package/.llm/components/navbar.md +1 -1
- package/.llm/components/navbaritem.md +4 -0
- package/.llm/components/pageheader.md +22 -0
- package/.llm/components/paginationdots.md +6 -1
- package/.llm/components/producthero.md +35 -11
- package/.llm/components/resourcebanner.md +247 -0
- package/.llm/components/scenescroll.md +222 -0
- package/.llm/components/select.md +17 -0
- package/.llm/components/stats.md +219 -0
- package/.llm/components/steps.md +286 -0
- package/.llm/components/stickycards.md +251 -0
- package/.llm/components/tableheadercell.md +19 -0
- package/.llm/components/teamgrid.md +243 -0
- package/.llm/components/testimonialrow.md +5 -0
- package/.llm/components/testimonialslider.md +14 -1
- package/.llm/components/textarea.md +13 -0
- package/.llm/components/textinput.md +13 -0
- package/.llm/components/textscroll.md +187 -0
- package/.llm/components/tiers.md +227 -0
- package/.llm/digest/awards.md +45 -0
- package/.llm/digest/background.md +53 -0
- package/.llm/digest/bottomsheet.md +2 -0
- package/.llm/digest/comparisoncards.md +51 -0
- package/.llm/digest/comparisontable.md +53 -0
- package/.llm/digest/ctabanner.md +4 -0
- package/.llm/digest/ctabannerslider.md +7 -0
- package/.llm/digest/datatable.md +65 -0
- package/.llm/digest/downloadbanner.md +65 -0
- package/.llm/digest/featurecards.md +1 -1
- package/.llm/digest/featurecardscarousel.md +54 -0
- package/.llm/digest/featuresplit.md +1 -0
- package/.llm/digest/featurestack.md +48 -0
- package/.llm/digest/illustrationcard.md +46 -0
- package/.llm/digest/illustrationscene.md +50 -0
- package/.llm/digest/imagebanner.md +64 -0
- package/.llm/digest/landinghero.md +7 -0
- package/.llm/digest/navbaritem.md +1 -0
- package/.llm/digest/pageheader.md +4 -0
- package/.llm/digest/paginationdots.md +3 -1
- package/.llm/digest/producthero.md +4 -2
- package/.llm/digest/resourcebanner.md +53 -0
- package/.llm/digest/scenescroll.md +49 -0
- package/.llm/digest/select.md +5 -0
- package/.llm/digest/stats.md +46 -0
- package/.llm/digest/steps.md +55 -0
- package/.llm/digest/stickycards.md +52 -0
- package/.llm/digest/tableheadercell.md +4 -0
- package/.llm/digest/teamgrid.md +53 -0
- package/.llm/digest/testimonialrow.md +2 -0
- package/.llm/digest/testimonialslider.md +4 -0
- package/.llm/digest/textarea.md +4 -0
- package/.llm/digest/textinput.md +4 -0
- package/.llm/digest/textscroll.md +43 -0
- package/.llm/digest/tiers.md +50 -0
- package/.llm/index.md +25 -2
- package/.llm/tokens.md +37 -1
- package/AGENTS.md +20 -1
- package/dist/components/awards-data.d.ts +24 -0
- package/dist/components/awards-data.js +11 -0
- package/dist/components/block-image-data.d.ts +24 -0
- package/dist/components/block-image-data.js +9 -0
- package/dist/components/blocks/awards/Awards.css +134 -0
- package/dist/components/blocks/awards/Awards.d.ts +24 -0
- package/dist/components/blocks/awards/Awards.js +114 -0
- package/dist/components/blocks/awards/Awards.types.d.ts +31 -0
- package/dist/components/blocks/awards/Awards.types.js +16 -0
- package/dist/components/blocks/awards/awards-impl.css +222 -0
- package/dist/components/blocks/cards-of.d.ts +16 -0
- package/dist/components/blocks/cards-of.js +23 -0
- package/dist/components/blocks/comparison-cards/ComparisonCards.css +195 -0
- package/dist/components/blocks/comparison-cards/ComparisonCards.d.ts +24 -0
- package/dist/components/blocks/comparison-cards/ComparisonCards.js +75 -0
- package/dist/components/blocks/comparison-cards/ComparisonCards.types.d.ts +49 -0
- package/dist/components/blocks/comparison-cards/ComparisonCards.types.js +26 -0
- package/dist/components/blocks/comparison-cards/comparison-cards-impl.css +262 -0
- package/dist/components/blocks/comparison-table/ComparisonTable.css +111 -0
- package/dist/components/blocks/comparison-table/ComparisonTable.d.ts +25 -0
- package/dist/components/blocks/comparison-table/ComparisonTable.js +100 -0
- package/dist/components/blocks/comparison-table/ComparisonTable.types.d.ts +36 -0
- package/dist/components/blocks/comparison-table/ComparisonTable.types.js +15 -0
- package/dist/components/blocks/comparison-table/comparison-table-impl.css +143 -0
- package/dist/components/blocks/cta-banner/CtaBanner.css +1 -0
- package/dist/components/blocks/cta-banner/CtaBanner.d.ts +1 -1
- package/dist/components/blocks/cta-banner/CtaBanner.js +3 -2
- package/dist/components/blocks/cta-banner/CtaBanner.types.d.ts +6 -0
- package/dist/components/blocks/cta-banner/CtaBanner.types.js +1 -1
- package/dist/components/blocks/cta-banner/cta-banner-impl.css +8 -0
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.css +1 -0
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.d.ts +1 -1
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.js +10 -5
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.d.ts +12 -0
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.js +1 -1
- package/dist/components/blocks/cta-banner-slider/cta-banner-slider-impl.css +8 -0
- package/dist/components/blocks/data-table/DataTable.css +170 -0
- package/dist/components/blocks/data-table/DataTable.d.ts +29 -0
- package/dist/components/blocks/data-table/DataTable.js +84 -0
- package/dist/components/blocks/data-table/DataTable.types.d.ts +69 -0
- package/dist/components/blocks/data-table/DataTable.types.js +19 -0
- package/dist/components/blocks/data-table/data-table-impl.css +155 -0
- package/dist/components/blocks/download-banner/DownloadBanner.css +228 -0
- package/dist/components/blocks/download-banner/DownloadBanner.d.ts +28 -0
- package/dist/components/blocks/download-banner/DownloadBanner.js +75 -0
- package/dist/components/blocks/download-banner/DownloadBanner.types.d.ts +56 -0
- package/dist/components/blocks/download-banner/DownloadBanner.types.js +23 -0
- package/dist/components/blocks/download-banner/download-banner-impl.css +216 -0
- package/dist/components/blocks/faq-accordion/FaqAccordion.css +1 -0
- package/dist/components/blocks/faq-accordion/faq-accordion-impl.css +3 -7
- package/dist/components/blocks/feature-bullets/FeatureBullets.css +1 -0
- package/dist/components/blocks/feature-bullets/feature-bullets-impl.css +14 -1
- package/dist/components/blocks/feature-cards/FeatureCards.css +1 -0
- package/dist/components/blocks/feature-cards/FeatureCards.d.ts +2 -1
- package/dist/components/blocks/feature-cards/FeatureCards.js +4 -21
- package/dist/components/blocks/feature-cards/feature-cards-impl.css +10 -9
- package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.css +115 -0
- package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.d.ts +30 -0
- package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.js +160 -0
- package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.d.ts +52 -0
- package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.js +17 -0
- package/dist/components/blocks/feature-cards-carousel/feature-cards-carousel-impl.css +207 -0
- package/dist/components/blocks/feature-scroll/FeatureScroll.css +1 -0
- package/dist/components/blocks/feature-split/FeatureSplit.css +1 -0
- package/dist/components/blocks/feature-split/feature-split-impl.css +14 -1
- package/dist/components/blocks/feature-stack/FeatureStack.css +86 -0
- package/dist/components/blocks/feature-stack/FeatureStack.d.ts +19 -0
- package/dist/components/blocks/feature-stack/FeatureStack.js +27 -0
- package/dist/components/blocks/feature-stack/FeatureStack.types.d.ts +34 -0
- package/dist/components/blocks/feature-stack/FeatureStack.types.js +14 -0
- package/dist/components/blocks/feature-stack/feature-stack-impl.css +87 -0
- package/dist/components/blocks/image-banner/ImageBanner.css +133 -0
- package/dist/components/blocks/image-banner/ImageBanner.d.ts +32 -0
- package/dist/components/blocks/image-banner/ImageBanner.js +41 -0
- package/dist/components/blocks/image-banner/ImageBanner.types.d.ts +54 -0
- package/dist/components/blocks/image-banner/ImageBanner.types.js +14 -0
- package/dist/components/blocks/image-banner/image-banner-impl.css +281 -0
- package/dist/components/blocks/landing-hero/LandingHero.css +1 -0
- package/dist/components/blocks/landing-hero/LandingHero.d.ts +1 -1
- package/dist/components/blocks/landing-hero/LandingHero.js +4 -3
- package/dist/components/blocks/landing-hero/LandingHero.types.d.ts +7 -3
- package/dist/components/blocks/logo-columns/LogoColumns.css +1 -0
- package/dist/components/blocks/logo-rows/LogoRows.css +1 -0
- package/dist/components/blocks/page-header/PageHeader.css +1 -0
- package/dist/components/blocks/page-header/PageHeader.d.ts +1 -1
- package/dist/components/blocks/page-header/PageHeader.js +3 -2
- package/dist/components/blocks/page-header/PageHeader.types.d.ts +6 -0
- package/dist/components/blocks/page-header/PageHeader.types.js +1 -1
- package/dist/components/blocks/page-header/page-header-impl.css +10 -0
- package/dist/components/blocks/product-hero/ProductHero.css +8 -3
- package/dist/components/blocks/product-hero/ProductHero.d.ts +1 -1
- package/dist/components/blocks/product-hero/ProductHero.js +5 -2
- package/dist/components/blocks/product-hero/ProductHero.types.d.ts +5 -1
- package/dist/components/blocks/product-hero/ProductHero.types.js +1 -0
- package/dist/components/blocks/product-hero/product-hero-impl.css +43 -12
- package/dist/components/blocks/resource-banner/ResourceBanner.css +106 -0
- package/dist/components/blocks/resource-banner/ResourceBanner.d.ts +32 -0
- package/dist/components/blocks/resource-banner/ResourceBanner.js +51 -0
- package/dist/components/blocks/resource-banner/ResourceBanner.types.d.ts +44 -0
- package/dist/components/blocks/resource-banner/ResourceBanner.types.js +14 -0
- package/dist/components/blocks/resource-banner/resource-banner-impl.css +69 -0
- package/dist/components/blocks/scene-scroll/SceneScroll.css +93 -0
- package/dist/components/blocks/scene-scroll/SceneScroll.d.ts +36 -0
- package/dist/components/blocks/scene-scroll/SceneScroll.js +54 -0
- package/dist/components/blocks/scene-scroll/SceneScroll.types.d.ts +32 -0
- package/dist/components/blocks/scene-scroll/SceneScroll.types.js +15 -0
- package/dist/components/blocks/scene-scroll/scene-scroll-impl.css +275 -0
- package/dist/components/blocks/stats/Stats.css +139 -0
- package/dist/components/blocks/stats/Stats.d.ts +24 -0
- package/dist/components/blocks/stats/Stats.js +120 -0
- package/dist/components/blocks/stats/Stats.types.d.ts +36 -0
- package/dist/components/blocks/stats/Stats.types.js +19 -0
- package/dist/components/blocks/stats/stats-count.d.ts +34 -0
- package/dist/components/blocks/stats/stats-count.js +61 -0
- package/dist/components/blocks/stats/stats-impl.css +284 -0
- package/dist/components/blocks/stats/use-wheel.d.ts +37 -0
- package/dist/components/blocks/stats/use-wheel.js +126 -0
- package/dist/components/blocks/steps/Steps.css +202 -0
- package/dist/components/blocks/steps/Steps.d.ts +32 -0
- package/dist/components/blocks/steps/Steps.js +65 -0
- package/dist/components/blocks/steps/Steps.types.d.ts +48 -0
- package/dist/components/blocks/steps/Steps.types.js +21 -0
- package/dist/components/blocks/steps/steps-impl.css +216 -0
- package/dist/components/blocks/steps/use-turn.d.ts +33 -0
- package/dist/components/blocks/steps/use-turn.js +75 -0
- package/dist/components/blocks/sticky-cards/StickyCards.css +154 -0
- package/dist/components/blocks/sticky-cards/StickyCards.d.ts +35 -0
- package/dist/components/blocks/sticky-cards/StickyCards.js +153 -0
- package/dist/components/blocks/sticky-cards/StickyCards.types.d.ts +43 -0
- package/dist/components/blocks/sticky-cards/StickyCards.types.js +18 -0
- package/dist/components/blocks/sticky-cards/sticky-cards-impl.css +393 -0
- package/dist/components/blocks/team-grid/TeamGrid.css +159 -0
- package/dist/components/blocks/team-grid/TeamGrid.d.ts +28 -0
- package/dist/components/blocks/team-grid/TeamGrid.js +74 -0
- package/dist/components/blocks/team-grid/TeamGrid.types.d.ts +51 -0
- package/dist/components/blocks/team-grid/TeamGrid.types.js +20 -0
- package/dist/components/blocks/team-grid/team-grid-impl.css +129 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.css +1 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.d.ts +1 -1
- package/dist/components/blocks/testimonial-row/TestimonialRow.js +4 -3
- package/dist/components/blocks/testimonial-row/TestimonialRow.types.d.ts +3 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.types.js +1 -1
- package/dist/components/blocks/testimonial-row/testimonial-row-impl.css +8 -0
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.css +1 -0
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.d.ts +1 -1
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.js +2 -2
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.d.ts +8 -0
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.js +1 -1
- package/dist/components/blocks/text-scroll/TextScroll.css +53 -0
- package/dist/components/blocks/text-scroll/TextScroll.d.ts +5 -0
- package/dist/components/blocks/text-scroll/TextScroll.js +71 -0
- package/dist/components/blocks/text-scroll/TextScroll.types.d.ts +22 -0
- package/dist/components/blocks/text-scroll/TextScroll.types.js +10 -0
- package/dist/components/blocks/text-scroll/text-scroll-impl.css +115 -0
- package/dist/components/blocks/tiers/Tiers.css +233 -0
- package/dist/components/blocks/tiers/Tiers.d.ts +32 -0
- package/dist/components/blocks/tiers/Tiers.js +68 -0
- package/dist/components/blocks/tiers/Tiers.types.d.ts +45 -0
- package/dist/components/blocks/tiers/Tiers.types.js +25 -0
- package/dist/components/blocks/tiers/tiers-impl.css +185 -0
- package/dist/components/blocks/use-rotation.d.ts +12 -2
- package/dist/components/blocks/use-rotation.js +6 -28
- package/dist/components/comparison-cards-data.d.ts +59 -0
- package/dist/components/comparison-cards-data.js +12 -0
- package/dist/components/comparison-table-data.d.ts +39 -0
- package/dist/components/comparison-table-data.js +11 -0
- package/dist/components/core/accordion-item/AccordionItem.css +1 -5
- package/dist/components/core/background/Background.css +92 -0
- package/dist/components/core/background/Background.d.ts +27 -0
- package/dist/components/core/background/Background.js +45 -0
- package/dist/components/core/background/Background.types.d.ts +39 -0
- package/dist/components/core/background/Background.types.js +11 -0
- package/dist/components/core/background/background-impl.css +760 -0
- package/dist/components/core/background/halftone.d.ts +134 -0
- package/dist/components/core/background/halftone.js +722 -0
- package/dist/components/core/background/patterns.d.ts +66 -0
- package/dist/components/core/background/patterns.js +244 -0
- package/dist/components/core/background/shader.d.ts +44 -0
- package/dist/components/core/background/shader.js +307 -0
- package/dist/components/core/background/use-halftone.d.ts +15 -0
- package/dist/components/core/background/use-halftone.js +27 -0
- package/dist/components/core/background/use-offscreen.d.ts +10 -0
- package/dist/components/core/background/use-offscreen.js +30 -0
- package/dist/components/core/background/use-shader.d.ts +11 -0
- package/dist/components/core/background/use-shader.js +25 -0
- package/dist/components/core/background/use-spotlight.d.ts +14 -0
- package/dist/components/core/background/use-spotlight.js +73 -0
- package/dist/components/core/bottom-sheet/BottomSheet.js +2 -2
- package/dist/components/core/bottom-sheet/BottomSheet.types.d.ts +3 -1
- package/dist/components/core/breadcrumb/Breadcrumb.d.ts +1 -0
- package/dist/components/core/breadcrumb/Breadcrumb.js +1 -0
- package/dist/components/core/breadcrumb/breadcrumb-impl.css +11 -0
- package/dist/components/core/button/button-impl.css +14 -1
- package/dist/components/core/illustration-card/IllustrationCard.css +40 -0
- package/dist/components/core/illustration-card/IllustrationCard.d.ts +22 -0
- package/dist/components/core/illustration-card/IllustrationCard.js +82 -0
- package/dist/components/core/illustration-card/IllustrationCard.types.d.ts +23 -0
- package/dist/components/core/illustration-card/IllustrationCard.types.js +8 -0
- package/dist/components/core/illustration-card/illustration-card-impl.css +47 -0
- package/dist/components/core/illustration-scene/IllustrationScene.css +41 -0
- package/dist/components/core/illustration-scene/IllustrationScene.d.ts +14 -0
- package/dist/components/core/illustration-scene/IllustrationScene.js +16 -0
- package/dist/components/core/illustration-scene/IllustrationScene.types.d.ts +32 -0
- package/dist/components/core/illustration-scene/IllustrationScene.types.js +8 -0
- package/dist/components/core/illustration-scene/illustration-scene-impl.css +46 -0
- package/dist/components/core/link/Link.js +7 -3
- package/dist/components/core/link/link-impl.css +29 -2
- package/dist/components/core/navbar/Navbar.css +2 -2
- package/dist/components/core/navbar/Navbar.types.d.ts +1 -1
- package/dist/components/core/navbar-item/NavbarItem.d.ts +2 -1
- package/dist/components/core/navbar-item/NavbarItem.js +3 -10
- package/dist/components/core/navbar-item/NavbarItem.types.d.ts +4 -1
- package/dist/components/core/navbar-item/NavbarItem.types.js +1 -1
- package/dist/components/core/navbar-item/navbar-item-impl.css +10 -0
- package/dist/components/core/navbar-menu/navbar-menu-impl.css +9 -0
- package/dist/components/core/navbar-switcher/navbar-switcher-impl.css +19 -0
- package/dist/components/core/pagination/Pagination.js +1 -1
- package/dist/components/core/pagination/pagination-impl.css +9 -0
- package/dist/components/core/pagination-dots/PaginationDots.d.ts +1 -1
- package/dist/components/core/pagination-dots/PaginationDots.js +3 -3
- package/dist/components/core/pagination-dots/PaginationDots.types.d.ts +3 -1
- package/dist/components/core/segmented-control/SegmentedControl.css +4 -3
- package/dist/components/core/segmented-control/SegmentedControl.js +17 -3
- package/dist/components/core/segmented-control-item/SegmentedControlItem.css +2 -1
- package/dist/components/core/select/Select.js +3 -3
- package/dist/components/core/select/Select.types.d.ts +11 -1
- package/dist/components/core/select/Select.types.js +1 -1
- package/dist/components/core/tab-list/TabList.js +9 -1
- package/dist/components/core/table-header-cell/TableHeaderCell.d.ts +1 -1
- package/dist/components/core/table-header-cell/TableHeaderCell.js +5 -2
- package/dist/components/core/table-header-cell/TableHeaderCell.types.d.ts +7 -1
- package/dist/components/core/table-header-cell/TableHeaderCell.types.js +1 -1
- package/dist/components/core/text-area/TextArea.d.ts +1 -1
- package/dist/components/core/text-area/TextArea.js +2 -2
- package/dist/components/core/text-area/TextArea.types.d.ts +9 -1
- package/dist/components/core/text-area/TextArea.types.js +1 -1
- package/dist/components/core/text-input/TextInput.d.ts +1 -1
- package/dist/components/core/text-input/TextInput.js +2 -2
- package/dist/components/core/text-input/TextInput.types.d.ts +9 -1
- package/dist/components/core/text-input/TextInput.types.js +1 -1
- package/dist/components/data-table-data.d.ts +33 -0
- package/dist/components/data-table-data.js +12 -0
- package/dist/components/download-banner-data.d.ts +52 -0
- package/dist/components/download-banner-data.js +11 -0
- package/dist/components/index.d.ts +51 -0
- package/dist/components/index.js +38 -0
- package/dist/components/resource-banner-data.d.ts +34 -0
- package/dist/components/resource-banner-data.js +13 -0
- package/dist/components/scene-scroll-data.d.ts +24 -0
- package/dist/components/scene-scroll-data.js +9 -0
- package/dist/components/stats-data.d.ts +28 -0
- package/dist/components/stats-data.js +11 -0
- package/dist/components/steps-data.d.ts +38 -0
- package/dist/components/steps-data.js +13 -0
- package/dist/components/sticky-cards-data.d.ts +43 -0
- package/dist/components/sticky-cards-data.js +12 -0
- package/dist/components/team-grid-data.d.ts +38 -0
- package/dist/components/team-grid-data.js +11 -0
- package/dist/components/tiers-data.d.ts +47 -0
- package/dist/components/tiers-data.js +13 -0
- package/dist/marketing.css +101 -28
- package/package.json +1 -1
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/* GENERATED from downloadbanner.contract.json. Do not edit. */
|
|
2
|
+
|
|
3
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner {
|
|
4
|
+
box-sizing: border-box;
|
|
5
|
+
container-type: inline-size;
|
|
6
|
+
display: flex;
|
|
7
|
+
inline-size: 100%;
|
|
8
|
+
justify-content: center;
|
|
9
|
+
overflow-wrap: anywhere;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__inner {
|
|
13
|
+
box-sizing: border-box;
|
|
14
|
+
display: flex;
|
|
15
|
+
flex-direction: column;
|
|
16
|
+
inline-size: 100%;
|
|
17
|
+
min-inline-size: 0;
|
|
18
|
+
max-inline-size: var(--size-content-max);
|
|
19
|
+
padding-block: var(--space-section-default);
|
|
20
|
+
padding-inline: var(--space-inset-page);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__card {
|
|
24
|
+
box-sizing: border-box;
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-direction: column;
|
|
27
|
+
min-inline-size: 0;
|
|
28
|
+
border-radius: var(--radius-container);
|
|
29
|
+
column-gap: var(--space-heading-content);
|
|
30
|
+
padding-block: var(--space-inset-card);
|
|
31
|
+
padding-inline: var(--space-inset-card);
|
|
32
|
+
row-gap: var(--space-heading-content);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__lead {
|
|
36
|
+
align-items: center;
|
|
37
|
+
display: flex;
|
|
38
|
+
min-inline-size: 0;
|
|
39
|
+
column-gap: var(--space-gap-xl);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__qr-tile {
|
|
43
|
+
display: none;
|
|
44
|
+
flex-shrink: 0;
|
|
45
|
+
background-color: var(--color-bg-surface-card-light-raised);
|
|
46
|
+
border-radius: var(--radius-container-item);
|
|
47
|
+
padding-block: var(--space-inset-sm);
|
|
48
|
+
padding-inline: var(--space-inset-sm);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__qr {
|
|
52
|
+
display: block;
|
|
53
|
+
object-fit: cover;
|
|
54
|
+
block-size: var(--size-download-banner-qr);
|
|
55
|
+
border-radius: var(--radius-subtle);
|
|
56
|
+
inline-size: var(--size-download-banner-qr);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__text {
|
|
60
|
+
display: flex;
|
|
61
|
+
flex-direction: column;
|
|
62
|
+
min-inline-size: 0;
|
|
63
|
+
row-gap: var(--space-gap-none);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__qr-label {
|
|
67
|
+
display: none;
|
|
68
|
+
margin-block: 0;
|
|
69
|
+
font-family: var(--font-body-lg-family);
|
|
70
|
+
font-size: var(--font-body-lg-size);
|
|
71
|
+
font-weight: var(--font-body-lg-weight);
|
|
72
|
+
letter-spacing: var(--font-body-lg-letter-spacing);
|
|
73
|
+
line-height: var(--font-body-lg-line-height);
|
|
74
|
+
margin-block-end: var(--space-heading-eyebrow-title);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__eyebrow {
|
|
78
|
+
margin: 0;
|
|
79
|
+
font-family: var(--font-label-md-family);
|
|
80
|
+
font-size: var(--font-label-md-size);
|
|
81
|
+
font-weight: var(--font-label-md-weight);
|
|
82
|
+
letter-spacing: var(--font-label-md-letter-spacing);
|
|
83
|
+
line-height: var(--font-label-md-line-height);
|
|
84
|
+
margin-block-end: var(--space-heading-eyebrow-title);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__title {
|
|
88
|
+
margin-block: 0;
|
|
89
|
+
text-wrap: balance;
|
|
90
|
+
font-family: var(--font-h3-family);
|
|
91
|
+
font-size: var(--font-h3-size);
|
|
92
|
+
font-weight: var(--font-h3-weight);
|
|
93
|
+
letter-spacing: var(--font-h3-letter-spacing);
|
|
94
|
+
line-height: var(--font-h3-line-height);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__description {
|
|
98
|
+
margin: 0;
|
|
99
|
+
font-family: var(--font-body-md-family);
|
|
100
|
+
font-size: var(--font-body-md-size);
|
|
101
|
+
font-weight: var(--font-body-md-weight);
|
|
102
|
+
letter-spacing: var(--font-body-md-letter-spacing);
|
|
103
|
+
line-height: var(--font-body-md-line-height);
|
|
104
|
+
margin-block-start: var(--space-heading-title-description-compact);
|
|
105
|
+
max-inline-size: var(--size-measure-description);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__disclaimer {
|
|
109
|
+
margin-block: 0;
|
|
110
|
+
font-family: var(--font-body-sm-family);
|
|
111
|
+
font-size: var(--font-body-sm-size);
|
|
112
|
+
font-weight: var(--font-body-sm-weight);
|
|
113
|
+
letter-spacing: var(--font-body-sm-letter-spacing);
|
|
114
|
+
line-height: var(--font-body-sm-line-height);
|
|
115
|
+
margin-block-start: var(--space-heading-title-description-compact);
|
|
116
|
+
max-inline-size: var(--size-measure-description);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__badges {
|
|
120
|
+
display: grid;
|
|
121
|
+
list-style: none;
|
|
122
|
+
margin: 0;
|
|
123
|
+
min-inline-size: 0;
|
|
124
|
+
padding: 0;
|
|
125
|
+
column-gap: var(--space-actions-gap);
|
|
126
|
+
row-gap: var(--space-actions-gap);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__badge {
|
|
130
|
+
display: flex;
|
|
131
|
+
min-inline-size: 0;
|
|
132
|
+
min-block-size: var(--size-target-min);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__badge-link {
|
|
136
|
+
transition-property: outline-color, outline-width, translate;
|
|
137
|
+
align-items: center;
|
|
138
|
+
box-sizing: border-box;
|
|
139
|
+
display: flex;
|
|
140
|
+
justify-content: center;
|
|
141
|
+
max-inline-size: 100%;
|
|
142
|
+
outline-style: solid;
|
|
143
|
+
background-color: var(--color-bg-store-badge);
|
|
144
|
+
block-size: var(--size-control-lg);
|
|
145
|
+
border-radius: var(--radius-subtle);
|
|
146
|
+
inline-size: var(--size-download-banner-badge);
|
|
147
|
+
outline-width: var(--border-width-none);
|
|
148
|
+
padding-block: var(--space-gap-xs);
|
|
149
|
+
padding-inline: var(--space-inset-sm);
|
|
150
|
+
transition-duration: var(--motion-duration-normal);
|
|
151
|
+
transition-timing-function: var(--motion-easing-standard);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__mark {
|
|
155
|
+
block-size: 100%;
|
|
156
|
+
display: block;
|
|
157
|
+
inline-size: 100%;
|
|
158
|
+
max-block-size: var(--size-control-md);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__media {
|
|
162
|
+
display: flex;
|
|
163
|
+
justify-content: center;
|
|
164
|
+
overflow: clip;
|
|
165
|
+
border-start-end-radius: var(--radius-container);
|
|
166
|
+
border-start-start-radius: var(--radius-container);
|
|
167
|
+
inline-size: var(--size-download-banner-media);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__badge-link:hover {
|
|
171
|
+
translate: var(--motion-translate-hover);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__badge-link:focus-visible {
|
|
175
|
+
outline-color: var(--color-border-focus);
|
|
176
|
+
outline-width: var(--border-width-focus);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="page"] {
|
|
180
|
+
background-color: var(--color-bg-page);
|
|
181
|
+
color: var(--color-fg-default);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="page"] .dds-downloadbanner__card {
|
|
185
|
+
background-color: var(--color-bg-surface);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="page"] .dds-downloadbanner__disclaimer {
|
|
189
|
+
color: var(--color-fg-muted);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="strong"] {
|
|
193
|
+
background-color: var(--color-bg-brand-strong);
|
|
194
|
+
color: var(--color-fg-on-brand-strong);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="strong"] .dds-downloadbanner__card {
|
|
198
|
+
background-color: var(--color-bg-surface-card-strong);
|
|
199
|
+
color: var(--color-fg-on-brand-strong);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="strong"] .dds-downloadbanner__disclaimer {
|
|
203
|
+
color: var(--color-fg-muted-inverse);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="subtle"] {
|
|
207
|
+
background-color: var(--color-bg-page);
|
|
208
|
+
background-image: linear-gradient(var(--color-bg-band-subtle), var(--color-bg-band-subtle));
|
|
209
|
+
color: var(--color-fg-default);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="subtle"] .dds-downloadbanner__card {
|
|
213
|
+
background-color: var(--color-bg-surface-card-raised);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="subtle"] .dds-downloadbanner__disclaimer {
|
|
217
|
+
color: var(--color-fg-muted);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-ground="strong"] .dds-downloadbanner__badge-link:focus-visible {
|
|
221
|
+
outline-color: var(--color-border-focus-on-brand-strong);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
@media (prefers-reduced-motion: reduce) {
|
|
225
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner,
|
|
226
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner * { transition: none !important; }
|
|
227
|
+
}
|
|
228
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import './DownloadBanner.css';
|
|
2
|
+
import './download-banner-impl.css';
|
|
3
|
+
import '../block-reveal.css';
|
|
4
|
+
import { type DownloadBannerProps } from './DownloadBanner.types.js';
|
|
5
|
+
export type { DownloadBannerProps };
|
|
6
|
+
/**
|
|
7
|
+
* A card promoting the app's downloads — the reference site's DownloadBanner.
|
|
8
|
+
*
|
|
9
|
+
* A heading and the stores' badges, and from the fold a QR code beside the heading with a line
|
|
10
|
+
* telling the reader to scan it. On a phone the code and its line are not drawn: the reader is
|
|
11
|
+
* already holding the device the code would open on, so the heading stands alone over the badges,
|
|
12
|
+
* two to a row. The reference swapped in a second heading there; this keeps the one, so the region
|
|
13
|
+
* is named the same at every width.
|
|
14
|
+
*
|
|
15
|
+
* The badges are records rather than elements: a platform and a link. The component picks the
|
|
16
|
+
* artwork from the platform, so a page cannot hand over a redrawn or outdated store badge, and names
|
|
17
|
+
* each link by the words its artwork carries unless the record gives a label of its own.
|
|
18
|
+
*
|
|
19
|
+
* Two ways to draw the card. The standard card takes the ground's fill. The featured card is for a
|
|
20
|
+
* page promoting an app: the brand's coral, with a Background pattern drawn inside it as a layer
|
|
21
|
+
* under its content — the aurora unless the page names the mesh — laid out as a split, the app's
|
|
22
|
+
* name, the heading and the badges with the code beside them on one side and the app's own image on
|
|
23
|
+
* the other, rising out of the card. Its words are white, and the pattern answers the pointer.
|
|
24
|
+
*
|
|
25
|
+
* It arrives the way every block does: the code, then the words, then the badges. `'use client'`
|
|
26
|
+
* for that and for `useId`, which names the region by its heading.
|
|
27
|
+
*/
|
|
28
|
+
export declare function DownloadBanner({ ground, variant, pattern, eyebrow, media, title, description, badges, qr, disclaimer, }: DownloadBannerProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useId } from 'react';
|
|
4
|
+
import { AndroidApkFillColoredIcon, AppleAppStoreFillColoredIcon, AppleDmgFillColoredIcon, AppleMacAppStoreFillColoredIcon, GooglePlayFillColoredIcon, HuaweiAppGalleryFillColoredIcon, LinuxFillColoredIcon, WebBrowserFillColoredIcon, WindowsExeFillColoredIcon, WindowsStoreFillColoredIcon, } from '@deriv-com/quill-icons-web';
|
|
5
|
+
import './DownloadBanner.css';
|
|
6
|
+
import './download-banner-impl.css';
|
|
7
|
+
import '../block-reveal.css';
|
|
8
|
+
import { Background } from '../../core/background/Background.js';
|
|
9
|
+
import { given } from '../../given.js';
|
|
10
|
+
import { arriving, useReveal } from '../use-reveal.js';
|
|
11
|
+
import { downloadBannerDefaults, downloadBannerParts } from './DownloadBanner.types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Each platform's artwork, and the words that artwork carries.
|
|
14
|
+
*
|
|
15
|
+
* The artwork is the store's own badge from Quill's app-store set, never redrawn here: a store's
|
|
16
|
+
* badge is a trademark with rules about how it is shown, and the set is where those rules were
|
|
17
|
+
* already kept. The filled, coloured form, because it carries its own black ground — the outline
|
|
18
|
+
* form is dark ink with no ground, which vanishes on the dark band and in dark mode.
|
|
19
|
+
*
|
|
20
|
+
* The words are what the artwork says, so the name a screen reader hears and the name a speech-input
|
|
21
|
+
* user says are the ones on the badge.
|
|
22
|
+
*/
|
|
23
|
+
const BADGES = {
|
|
24
|
+
'app-store': { Mark: AppleAppStoreFillColoredIcon, name: 'Download on the App Store' },
|
|
25
|
+
'google-play': { Mark: GooglePlayFillColoredIcon, name: 'Get it on Google Play' },
|
|
26
|
+
'app-gallery': { Mark: HuaweiAppGalleryFillColoredIcon, name: 'Explore it on AppGallery' },
|
|
27
|
+
'android-apk': { Mark: AndroidApkFillColoredIcon, name: 'Direct download APK file' },
|
|
28
|
+
'mac-app-store': { Mark: AppleMacAppStoreFillColoredIcon, name: 'Download on the Mac App Store' },
|
|
29
|
+
'macos-dmg': { Mark: AppleDmgFillColoredIcon, name: 'Download for macOS .dmg' },
|
|
30
|
+
'windows-store': { Mark: WindowsStoreFillColoredIcon, name: 'Download app for Windows' },
|
|
31
|
+
'windows-exe': { Mark: WindowsExeFillColoredIcon, name: 'Download for Windows .exe' },
|
|
32
|
+
linux: { Mark: LinuxFillColoredIcon, name: 'Installation on Linux. Download' },
|
|
33
|
+
web: { Mark: WebBrowserFillColoredIcon, name: 'Use it on your web browser' },
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* A card promoting the app's downloads — the reference site's DownloadBanner.
|
|
37
|
+
*
|
|
38
|
+
* A heading and the stores' badges, and from the fold a QR code beside the heading with a line
|
|
39
|
+
* telling the reader to scan it. On a phone the code and its line are not drawn: the reader is
|
|
40
|
+
* already holding the device the code would open on, so the heading stands alone over the badges,
|
|
41
|
+
* two to a row. The reference swapped in a second heading there; this keeps the one, so the region
|
|
42
|
+
* is named the same at every width.
|
|
43
|
+
*
|
|
44
|
+
* The badges are records rather than elements: a platform and a link. The component picks the
|
|
45
|
+
* artwork from the platform, so a page cannot hand over a redrawn or outdated store badge, and names
|
|
46
|
+
* each link by the words its artwork carries unless the record gives a label of its own.
|
|
47
|
+
*
|
|
48
|
+
* Two ways to draw the card. The standard card takes the ground's fill. The featured card is for a
|
|
49
|
+
* page promoting an app: the brand's coral, with a Background pattern drawn inside it as a layer
|
|
50
|
+
* under its content — the aurora unless the page names the mesh — laid out as a split, the app's
|
|
51
|
+
* name, the heading and the badges with the code beside them on one side and the app's own image on
|
|
52
|
+
* the other, rising out of the card. Its words are white, and the pattern answers the pointer.
|
|
53
|
+
*
|
|
54
|
+
* It arrives the way every block does: the code, then the words, then the badges. `'use client'`
|
|
55
|
+
* for that and for `useId`, which names the region by its heading.
|
|
56
|
+
*/
|
|
57
|
+
export function DownloadBanner({ ground = downloadBannerDefaults.ground, variant = downloadBannerDefaults.variant, pattern, eyebrow, media, title, description, badges, qr, disclaimer, }) {
|
|
58
|
+
const titleId = useId();
|
|
59
|
+
/* The code is the standard card's: the featured card promotes the app with its image instead. */
|
|
60
|
+
const code = variant === 'standard' ? qr : undefined;
|
|
61
|
+
const [band, revealed] = useReveal();
|
|
62
|
+
return (_jsx("section", { className: downloadBannerParts.root, "data-ground": ground, "data-variant": variant, "aria-labelledby": titleId, children: _jsx("div", { className: downloadBannerParts.inner, ref: band, "data-revealed": revealed, children: _jsxs("div", { className: downloadBannerParts.card, children: [variant === 'featured' ? (_jsx(Background, { tone: "brand", pattern: pattern ?? 'aurora', children: null })) : null, _jsxs("div", { className: downloadBannerParts.lead, children: [code ? (_jsx("div", { className: downloadBannerParts['qr-tile'], ...arriving(0), children: _jsx("img", { className: downloadBannerParts.qr, src: code.src, alt: code.alt }) })) : null, _jsxs("div", { className: downloadBannerParts.text, ...arriving(1), children: [code ? _jsx("p", { className: downloadBannerParts['qr-label'], children: code.label }) : null, variant === 'featured' && given(eyebrow) ? (_jsx("p", { className: downloadBannerParts.eyebrow, children: eyebrow })) : null, _jsx("h2", { className: downloadBannerParts.title, id: titleId, children: title }), given(description) ? _jsx("p", { className: downloadBannerParts.description, children: description }) : null, given(disclaimer) ? _jsx("p", { className: downloadBannerParts.disclaimer, children: disclaimer }) : null] })] }), badges.length > 0 ? (_jsx("ul", { className: downloadBannerParts.badges, ...arriving(2), children: badges.map(({ platform, href, label }, at) => {
|
|
63
|
+
/* A platform this has no artwork for draws nothing rather than a blank link: the
|
|
64
|
+
type rules it out, and a record from a feed or an editor is not typed. */
|
|
65
|
+
const badge = BADGES[platform];
|
|
66
|
+
if (badge === undefined)
|
|
67
|
+
return null;
|
|
68
|
+
const { Mark, name } = badge;
|
|
69
|
+
return (
|
|
70
|
+
/* Keyed by place as well as platform: a page may list one platform twice — two
|
|
71
|
+
builds of the same desktop app — and a key repeated is a badge React confuses
|
|
72
|
+
with the other. */
|
|
73
|
+
_jsx("li", { className: downloadBannerParts.badge, children: _jsx("a", { className: downloadBannerParts['badge-link'], href: href, "aria-label": given(label) ? label : name, children: _jsx(Mark, { className: downloadBannerParts.mark, width: undefined, height: undefined, "aria-hidden": "true", focusable: "false" }) }) }, `${platform}-${at}`));
|
|
74
|
+
}) })) : null, variant === 'featured' && media !== undefined && media !== null ? (_jsx("div", { className: downloadBannerParts.media, ...arriving(3), children: media })) : null] }) }) }));
|
|
75
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { DownloadBannerBadge, DownloadBannerQr } from '../../download-banner-data.js';
|
|
3
|
+
export interface DownloadBannerOwnProps {
|
|
4
|
+
/**
|
|
5
|
+
* `page` — The default, and the page's own white. The card is the recessed gray that sets it off — the reference design's light-2
|
|
6
|
+
* `subtle` — The grey band, with the card white on it — the reference design's light. Painted as the band's tint laid over the page's own ground, so it is the same grey whatever is behind the section
|
|
7
|
+
* `strong` — `color.bg.brand-strong`, the dark band, with the card at color.bg.surface-card-strong and white words on it — the reference design's dark. For a download section a reader should arrive at; the badges are black and keep their own edge on it
|
|
8
|
+
*/
|
|
9
|
+
ground?: 'page' | 'subtle' | 'strong';
|
|
10
|
+
/** The featured card only: the app itself — a screenshot of it in a phone, the page's own image. It stands at the card's end, rising out of the card's top edge and resting on its bottom one, so the card reads as the app being held out to the reader. On a phone it sits under the badges. */
|
|
11
|
+
media?: ReactNode;
|
|
12
|
+
/** The featured card only: the app's name, or what kind of app it is, small above the heading — "Deriv GO", "Mobile app". */
|
|
13
|
+
eyebrow?: string;
|
|
14
|
+
/** Always. Where the app can be had, in a few words — "Trade on the go", "Available on". The section's heading at every width: under the scan line beside the code from the fold, and alone over the badges on a phone. */
|
|
15
|
+
title: string;
|
|
16
|
+
/** A line under the heading saying what the app gives a reader — "Trade on the go with the same account, markets and tools." One sentence. */
|
|
17
|
+
description?: string;
|
|
18
|
+
/** Always. The stores and downloads the app is in, in the order a reader should meet them — mobile stores first, then desktop, then the web. Each names its `platform`, which picks the store's own artwork, and the `href` that reaches the product in it. An empty list draws no badges. */
|
|
19
|
+
badges: DownloadBannerBadge[];
|
|
20
|
+
/** A QR code reaching the same app the badges do, so a reader at a desktop can take it to their phone. The page's image, with the words it is read as and the line telling the reader to scan it. Drawn from the fold and never on a phone, where the reader is already holding the device it would open on, and only on the standard card: the featured card promotes an app with its image, and the badges are its one way in. Leave it out and the heading stands alone at every width. */
|
|
21
|
+
qr?: DownloadBannerQr;
|
|
22
|
+
/** One line of small print under the heading — which versions the desktop app runs on, or where the app is not offered. */
|
|
23
|
+
disclaimer?: string;
|
|
24
|
+
}
|
|
25
|
+
export type DownloadBannerProps = DownloadBannerOwnProps & ({
|
|
26
|
+
variant?: 'standard' | 'featured';
|
|
27
|
+
pattern?: undefined;
|
|
28
|
+
} | {
|
|
29
|
+
variant: Exclude<'standard' | 'featured', 'standard'>;
|
|
30
|
+
pattern?: 'aurora' | 'mesh';
|
|
31
|
+
});
|
|
32
|
+
/** The class each part carries. Apply these — do not retype them. */
|
|
33
|
+
export declare const downloadBannerParts: {
|
|
34
|
+
readonly root: "dds-downloadbanner";
|
|
35
|
+
readonly inner: "dds-downloadbanner__inner";
|
|
36
|
+
readonly card: "dds-downloadbanner__card";
|
|
37
|
+
readonly lead: "dds-downloadbanner__lead";
|
|
38
|
+
readonly 'qr-tile': "dds-downloadbanner__qr-tile";
|
|
39
|
+
readonly qr: "dds-downloadbanner__qr";
|
|
40
|
+
readonly text: "dds-downloadbanner__text";
|
|
41
|
+
readonly 'qr-label': "dds-downloadbanner__qr-label";
|
|
42
|
+
readonly eyebrow: "dds-downloadbanner__eyebrow";
|
|
43
|
+
readonly title: "dds-downloadbanner__title";
|
|
44
|
+
readonly description: "dds-downloadbanner__description";
|
|
45
|
+
readonly disclaimer: "dds-downloadbanner__disclaimer";
|
|
46
|
+
readonly badges: "dds-downloadbanner__badges";
|
|
47
|
+
readonly badge: "dds-downloadbanner__badge";
|
|
48
|
+
readonly 'badge-link': "dds-downloadbanner__badge-link";
|
|
49
|
+
readonly mark: "dds-downloadbanner__mark";
|
|
50
|
+
readonly media: "dds-downloadbanner__media";
|
|
51
|
+
};
|
|
52
|
+
/** Generated so defaults cannot drift from the contract. */
|
|
53
|
+
export declare const downloadBannerDefaults: {
|
|
54
|
+
readonly ground: "page";
|
|
55
|
+
readonly variant: "standard";
|
|
56
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// GENERATED from download-banner.contract.json. Do not edit.
|
|
2
|
+
/** The class each part carries. Apply these — do not retype them. */
|
|
3
|
+
export const downloadBannerParts = {
|
|
4
|
+
root: 'dds-downloadbanner',
|
|
5
|
+
inner: 'dds-downloadbanner__inner',
|
|
6
|
+
card: 'dds-downloadbanner__card',
|
|
7
|
+
lead: 'dds-downloadbanner__lead',
|
|
8
|
+
'qr-tile': 'dds-downloadbanner__qr-tile',
|
|
9
|
+
qr: 'dds-downloadbanner__qr',
|
|
10
|
+
text: 'dds-downloadbanner__text',
|
|
11
|
+
'qr-label': 'dds-downloadbanner__qr-label',
|
|
12
|
+
eyebrow: 'dds-downloadbanner__eyebrow',
|
|
13
|
+
title: 'dds-downloadbanner__title',
|
|
14
|
+
description: 'dds-downloadbanner__description',
|
|
15
|
+
disclaimer: 'dds-downloadbanner__disclaimer',
|
|
16
|
+
badges: 'dds-downloadbanner__badges',
|
|
17
|
+
badge: 'dds-downloadbanner__badge',
|
|
18
|
+
'badge-link': 'dds-downloadbanner__badge-link',
|
|
19
|
+
mark: 'dds-downloadbanner__mark',
|
|
20
|
+
media: 'dds-downloadbanner__media',
|
|
21
|
+
};
|
|
22
|
+
/** Generated so defaults cannot drift from the contract. */
|
|
23
|
+
export const downloadBannerDefaults = { ground: 'page', variant: 'standard' };
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Scoped to this package, like the generated sheet beside it.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
* Two badges to a row on a phone, each chip filling its column, so every badge is the same size
|
|
7
|
+
* there as it is from the fold. `minmax(0, 1fr)` rather than `1fr`, so a column narrower than the
|
|
8
|
+
* artwork narrows the artwork — it keeps its proportions inside the chip — instead of pushing the
|
|
9
|
+
* grid past the card.
|
|
10
|
+
*/
|
|
11
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__badges {
|
|
12
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__badge-link {
|
|
16
|
+
inline-size: 100%;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/*
|
|
20
|
+
* The code and its line from the fold, and the badges a row that wraps.
|
|
21
|
+
*
|
|
22
|
+
* On a phone the generated sheet draws neither the code nor the line telling the reader to scan
|
|
23
|
+
* it — the reference design's swap, and its reason: a code is for a reader on a device other than
|
|
24
|
+
* the one it opens on, and on a phone the reader is holding that device. The heading stays, so the
|
|
25
|
+
* region keeps one name at every width. The badges there are two to a row, each filling its
|
|
26
|
+
* column, the reference's phone grid.
|
|
27
|
+
*
|
|
28
|
+
* From the fold there is room for the code beside the words, and the badges sit in a row that
|
|
29
|
+
* wraps, each chip size.download-banner.badge wide — one width for every store, whatever the shape
|
|
30
|
+
* of its artwork.
|
|
31
|
+
*
|
|
32
|
+
* `48rem` longhand because `var()` is not permitted in a container query condition, and it is the
|
|
33
|
+
* width the rest of this package folds at.
|
|
34
|
+
*/
|
|
35
|
+
@container (min-width: 48rem) {
|
|
36
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__qr-tile,
|
|
37
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__qr-label {
|
|
38
|
+
display: block;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__badges {
|
|
42
|
+
display: flex;
|
|
43
|
+
flex-wrap: wrap;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__badge-link {
|
|
47
|
+
inline-size: var(--size-download-banner-badge);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/*
|
|
52
|
+
* From 64rem the heading and the badges side by side.
|
|
53
|
+
*
|
|
54
|
+
* The reference's desktop card: the code and its words at the start, the badges ranged to the end
|
|
55
|
+
* and wrapping there when there are more than the row holds. The words keep their own width and the
|
|
56
|
+
* badges take what is left, so a long set wraps under itself rather than pushing the heading into a
|
|
57
|
+
* column a word wide. `end` rather than right, so a mirrored page ranges them the other way.
|
|
58
|
+
*/
|
|
59
|
+
@container (min-width: 64rem) {
|
|
60
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__card {
|
|
61
|
+
align-items: center;
|
|
62
|
+
flex-direction: row;
|
|
63
|
+
justify-content: space-between;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__lead {
|
|
67
|
+
flex: 0 1 auto;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner .dds-downloadbanner__badges {
|
|
71
|
+
flex: 1 1 0;
|
|
72
|
+
justify-content: flex-end;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/*
|
|
77
|
+
* The featured card: the brand's coral, with its pattern inside it.
|
|
78
|
+
*
|
|
79
|
+
* color.bg.brand, the same in both themes, with the pattern on Background's brand tone — the mesh
|
|
80
|
+
* there is the design system's own front page. Every word on it is white, color.fg.on-brand, the
|
|
81
|
+
* line under the heading and the small print included: the quieter white the dark band uses is too
|
|
82
|
+
* faint on the coral, as CtaBanner found. The badges keep their own black, which reads on the coral.
|
|
83
|
+
* The featured card draws no QR code: it promotes the app with the app's own image, and the badges
|
|
84
|
+
* are its one way in.
|
|
85
|
+
*
|
|
86
|
+
* The pattern is held inside the card's own corners by its own layer, rounded as the card is, rather
|
|
87
|
+
* than by the card clipping everything it holds — the app's image rises out of the card's top edge,
|
|
88
|
+
* and a card that clipped would cut it off. The pattern stacks under the words.
|
|
89
|
+
*/
|
|
90
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-variant='featured'] .dds-downloadbanner__card {
|
|
91
|
+
background-color: var(--color-bg-brand);
|
|
92
|
+
color: var(--color-fg-on-brand);
|
|
93
|
+
isolation: isolate;
|
|
94
|
+
position: relative;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-variant='featured'] .dds-downloadbanner__card > .dds-background {
|
|
98
|
+
border-radius: inherit;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-variant='featured'] :is(.dds-downloadbanner__description, .dds-downloadbanner__disclaimer) {
|
|
102
|
+
color: var(--color-fg-on-brand);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-variant='featured'] :is(.dds-downloadbanner__lead, .dds-downloadbanner__badges) {
|
|
106
|
+
position: relative;
|
|
107
|
+
z-index: 1;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
/*
|
|
112
|
+
* The featured card's layout: a page promoting an app.
|
|
113
|
+
*
|
|
114
|
+
* A grid rather than the standard card's row. On a phone it stacks — the app's name, the heading
|
|
115
|
+
* and the line, the badges, and the app's image under them, resting on the card's foot.
|
|
116
|
+
*
|
|
117
|
+
* The lead is opened out (`display: contents`) so the words are placed on the card's grid
|
|
118
|
+
* themselves, beside the app's image from the fold.
|
|
119
|
+
*/
|
|
120
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-variant='featured'] .dds-downloadbanner__card {
|
|
121
|
+
align-items: center;
|
|
122
|
+
display: grid;
|
|
123
|
+
grid-template-areas:
|
|
124
|
+
'text'
|
|
125
|
+
'badges'
|
|
126
|
+
'media';
|
|
127
|
+
grid-template-columns: minmax(0, 1fr);
|
|
128
|
+
justify-content: normal;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-variant='featured'] .dds-downloadbanner__lead {
|
|
132
|
+
display: contents;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* Opened out, the lead stacks nothing above the pattern any more, so its words are
|
|
136
|
+
lifted over the pattern themselves — and the app's image with them. */
|
|
137
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-variant='featured'] :is(.dds-downloadbanner__text, .dds-downloadbanner__media) {
|
|
138
|
+
position: relative;
|
|
139
|
+
z-index: 1;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-variant='featured'] .dds-downloadbanner__text {
|
|
143
|
+
grid-area: text;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-variant='featured'] .dds-downloadbanner__badges {
|
|
147
|
+
grid-area: badges;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/*
|
|
151
|
+
* The app's image rests on the card's foot: it reaches down through the card's own padding to the
|
|
152
|
+
* bottom edge, so the phone stands on the card rather than floating in it. The image is the page's,
|
|
153
|
+
* at its own proportions, never wider than its column.
|
|
154
|
+
*/
|
|
155
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-variant='featured'] .dds-downloadbanner__media {
|
|
156
|
+
align-self: end;
|
|
157
|
+
grid-area: media;
|
|
158
|
+
justify-self: center;
|
|
159
|
+
max-inline-size: 100%;
|
|
160
|
+
margin-block-end: calc(-1 * var(--space-inset-card));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-variant='featured'] .dds-downloadbanner__media > * {
|
|
164
|
+
block-size: auto;
|
|
165
|
+
inline-size: 100%;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/*
|
|
169
|
+
* Bare media is a block; a component keeps its own display.
|
|
170
|
+
*
|
|
171
|
+
* `display: block` is for what arrives as a raw element — an image, a video, an inline SVG — which
|
|
172
|
+
* sits on a text baseline otherwise and leaves a gap under it. Written at no weight at all, so a
|
|
173
|
+
* component the page placed here — an IllustrationScene, whose grid lays its pane over its photo —
|
|
174
|
+
* keeps the display its own sheet gives it. In the rule above, a class deeper than the component's
|
|
175
|
+
* root, it turned the scene's grid into a block, and the pane fell below the photo and was clipped.
|
|
176
|
+
*/
|
|
177
|
+
:where([data-dds-context="marketing"] .dds-downloadbanner[data-variant='featured'] .dds-downloadbanner__media > *) {
|
|
178
|
+
display: block;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
/*
|
|
183
|
+
* At full width, the split: the words over the badges on one side, the app on the other at its own
|
|
184
|
+
* width (size.download-banner.media, a phone held out rather than a slab). The app rises out of the
|
|
185
|
+
* card's top edge by the step a heading keeps from its content, so the card reads as the app being
|
|
186
|
+
* held out to the reader.
|
|
187
|
+
*
|
|
188
|
+
* At 64rem rather than the fold. Between the two the words column is narrow, its heading wraps and
|
|
189
|
+
* its badges stack, so the words stand taller than the app: the app, resting on the card's foot,
|
|
190
|
+
* then sat well below the top edge with coral above it and never rose. Stacked, as on a phone, until
|
|
191
|
+
* there is room for the split to look like one.
|
|
192
|
+
*/
|
|
193
|
+
@container (min-width: 64rem) {
|
|
194
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-variant='featured'] .dds-downloadbanner__card {
|
|
195
|
+
grid-template-areas:
|
|
196
|
+
'text media'
|
|
197
|
+
'badges media';
|
|
198
|
+
grid-template-columns: minmax(0, 1fr) auto;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* The badges start under the words, where the standard card ranges them to the end. The app is
|
|
202
|
+
taller than the words, and its two rows share what it adds; the words sit at the foot of theirs
|
|
203
|
+
and the badges at the head of theirs, so the two stay together in the middle of the card. */
|
|
204
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-variant='featured'] .dds-downloadbanner__text {
|
|
205
|
+
align-self: end;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-variant='featured'] .dds-downloadbanner__badges {
|
|
209
|
+
align-self: start;
|
|
210
|
+
justify-content: flex-start;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
:where([data-dds-context="marketing"]) .dds-downloadbanner[data-variant='featured'] .dds-downloadbanner__media {
|
|
214
|
+
margin-block-start: calc(-1 * (var(--space-inset-card) + var(--space-heading-content)));
|
|
215
|
+
}
|
|
216
|
+
}
|
|
@@ -23,11 +23,11 @@
|
|
|
23
23
|
/*
|
|
24
24
|
* The questions turn round on the dark band.
|
|
25
25
|
*
|
|
26
|
-
* AccordionItem draws its question in color.fg.default, its chevron
|
|
26
|
+
* AccordionItem draws its question in color.fg.default, its chevron in color.fg.muted,
|
|
27
27
|
* its rules in color.border.subtle and its focus ring in color.border.focus — every one of them made
|
|
28
28
|
* for a light page, and every one dark on near-black. It has no tone to answer with, so the block,
|
|
29
|
-
* which knows its ground, gives it the dark band's fixed roles: white questions, a chevron
|
|
30
|
-
*
|
|
29
|
+
* which knows its ground, gives it the dark band's fixed roles: white questions, a chevron at
|
|
30
|
+
* fg.muted-inverse, rules at the band's veil, the band's own focus ring. The answers need
|
|
31
31
|
* nothing: they take the section's ink, which is already white.
|
|
32
32
|
*/
|
|
33
33
|
:where([data-dds-context="marketing"]) .dds-faqaccordion[data-ground="strong"] .dds-accordionitem {
|
|
@@ -38,10 +38,6 @@
|
|
|
38
38
|
color: var(--color-fg-on-brand-strong);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
:where([data-dds-context="marketing"])
|
|
42
|
-
.dds-faqaccordion[data-ground="strong"]
|
|
43
|
-
.dds-accordionitem
|
|
44
|
-
.dds-accordionitem__trigger:hover:where(:not(:disabled)),
|
|
45
41
|
:where([data-dds-context="marketing"]) .dds-faqaccordion[data-ground="strong"] .dds-accordionitem .dds-accordionitem__marker {
|
|
46
42
|
color: var(--color-fg-muted-inverse);
|
|
47
43
|
}
|