@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,393 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Scoped to this package, like the generated sheet beside it.
|
|
3
|
+
*
|
|
4
|
+
* `:where([data-dds-context="marketing"])` confines these rules without contributing specificity,
|
|
5
|
+
* so each is decided against the generated rule on its own terms.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* The header starts on a phone and is centred from the fold.
|
|
10
|
+
*
|
|
11
|
+
* FeatureCards' rule and its reason: the cards are stacked under the heading, so the heading is
|
|
12
|
+
* centred over them — and both references turn at 768px. The header and its line are capped
|
|
13
|
+
* narrower than the column, so `margin-inline: auto` centres those boxes as well as their words.
|
|
14
|
+
*
|
|
15
|
+
* `48rem` longhand because `var()` is not permitted in a container query condition.
|
|
16
|
+
*/
|
|
17
|
+
@container (min-width: 48rem) {
|
|
18
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__header {
|
|
19
|
+
align-items: center;
|
|
20
|
+
margin-inline: auto;
|
|
21
|
+
text-align: center;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__description {
|
|
25
|
+
margin-inline: auto;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/*
|
|
30
|
+
* A heading with nothing under it closes up: its bound step is the distance to the line.
|
|
31
|
+
*/
|
|
32
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__title:last-child {
|
|
33
|
+
margin-block-end: 0;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/*
|
|
37
|
+
* One column, and every row as tall as the tallest card.
|
|
38
|
+
*
|
|
39
|
+
* Equal rows are what let a card hide the one under it completely: a shorter card arriving over a
|
|
40
|
+
* taller one would leave the taller one's foot showing under it, words and all. The reference
|
|
41
|
+
* measured every card with a script and wrote the tallest height onto each, again on resize and
|
|
42
|
+
* again once the fonts arrived; `1fr` rows in a list whose height is its content are the same
|
|
43
|
+
* answer, given by the layout before anything runs. `minmax(0, 1fr)` across, so a long word or a
|
|
44
|
+
* wide picture shrinks to the column rather than pushing the list past the page.
|
|
45
|
+
*/
|
|
46
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__list {
|
|
47
|
+
grid-auto-rows: 1fr;
|
|
48
|
+
grid-template-columns: minmax(0, 1fr);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* The Card fills its place, so a short card in a tall row is drawn the row's height. */
|
|
52
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__item > .dds-card {
|
|
53
|
+
flex: auto;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/*
|
|
57
|
+
* A light and a dark card are raised a step on the subtle band — FeatureCards' answer, and its
|
|
58
|
+
* reason: surface-light is gray.50, the band's own colour in light mode, and accent-strong lands
|
|
59
|
+
* within a shade of the band in dark mode. Both raised fills are opaque in both themes, which a
|
|
60
|
+
* card in a pile has to be: a see-through card would show the one it covers.
|
|
61
|
+
*/
|
|
62
|
+
:where([data-dds-context="marketing"])
|
|
63
|
+
.dds-stickycards[data-ground="subtle"]
|
|
64
|
+
.dds-stickycards__item
|
|
65
|
+
> .dds-card[data-variant="surface-light"] {
|
|
66
|
+
background-color: var(--color-bg-surface-card-light-raised);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
:where([data-dds-context="marketing"])
|
|
70
|
+
.dds-stickycards[data-ground="subtle"]
|
|
71
|
+
.dds-stickycards__item
|
|
72
|
+
> .dds-card[data-variant="accent-strong"] {
|
|
73
|
+
background-color: var(--color-bg-surface-card-strong-raised);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/*
|
|
77
|
+
* ── compact ──────────────────────────────────────────────────────────────────────────────────
|
|
78
|
+
*
|
|
79
|
+
* The picture is inset from the card's edges, under the words on a phone: CardBody's own inset
|
|
80
|
+
* holds the words, and the picture takes the same inset on its three open sides — the words' foot
|
|
81
|
+
* padding is already the step between the two.
|
|
82
|
+
*/
|
|
83
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"] .dds-stickycards__media {
|
|
84
|
+
margin-block-end: var(--space-inset-card);
|
|
85
|
+
margin-inline: var(--space-inset-card);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/*
|
|
89
|
+
* The container: a landscape panel, aspect.landscape, whatever the page puts in it — the reference
|
|
90
|
+
* design's animation panel, and the same panel for a picture. The picture fills it, cropped to fill;
|
|
91
|
+
* a player the page mounts stretches to it, a grid of one cell so it does not collapse to nothing in
|
|
92
|
+
* a box with no height of its own. A panel of one shape down the pile is what keeps the set reading
|
|
93
|
+
* as a set.
|
|
94
|
+
*/
|
|
95
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"] .dds-stickycards__media {
|
|
96
|
+
aspect-ratio: var(--aspect-landscape);
|
|
97
|
+
display: grid;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"] .dds-stickycards__image {
|
|
101
|
+
block-size: 100%;
|
|
102
|
+
inline-size: 100%;
|
|
103
|
+
object-fit: cover;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/*
|
|
107
|
+
* A card's background photograph, under a wash of the card's own fill at opacity.muted (72%) — the
|
|
108
|
+
* reference design's market cards, which washed at 85%: at that strength a photograph barely showed
|
|
109
|
+
* through, and the card read as plain fill. At 72% the photograph reads as texture and the words keep
|
|
110
|
+
* their contrast over the brightest photograph — about 9:1 dark on the light card, 7:1 white on the
|
|
111
|
+
* dark one; the coral card was under body contrast on its plain fill already, and stays the
|
|
112
|
+
* recorded exception. The wash is the fill the card already paints, mixed toward transparent, so it
|
|
113
|
+
* follows the variant and the ground's raised fills with nothing to keep in step. The words and the
|
|
114
|
+
* container sit above it.
|
|
115
|
+
*/
|
|
116
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__item > .dds-card {
|
|
117
|
+
position: relative;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__backdrop {
|
|
121
|
+
border-radius: inherit;
|
|
122
|
+
z-index: 0;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__backdrop > img {
|
|
126
|
+
block-size: 100%;
|
|
127
|
+
display: block;
|
|
128
|
+
inline-size: 100%;
|
|
129
|
+
object-fit: cover;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__backdrop::after {
|
|
133
|
+
background-color: color-mix(in srgb, var(--dds-stickycards-fill) calc(var(--opacity-muted) * 100%), transparent);
|
|
134
|
+
content: '';
|
|
135
|
+
inset: 0;
|
|
136
|
+
position: absolute;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-card { --dds-stickycards-fill: var(--color-bg-surface-card-strong); }
|
|
140
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-card[data-variant="accent"] { --dds-stickycards-fill: var(--color-bg-brand); }
|
|
141
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-card[data-variant="surface-light"] { --dds-stickycards-fill: var(--color-bg-surface-card-light); }
|
|
142
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-ground="subtle"] .dds-card[data-variant="accent-strong"] { --dds-stickycards-fill: var(--color-bg-surface-card-strong-raised); }
|
|
143
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-ground="subtle"] .dds-card[data-variant="surface-light"] { --dds-stickycards-fill: var(--color-bg-surface-card-light-raised); }
|
|
144
|
+
|
|
145
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__body {
|
|
146
|
+
position: relative;
|
|
147
|
+
z-index: 1;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/*
|
|
151
|
+
* A pile of words alone stands each card's words in the middle of its height, the reference's
|
|
152
|
+
* alignment. Only where no card in the pile has a picture: in a pile where some do, a card without one
|
|
153
|
+
* keeps its words stacked at the top like the rest, so the set reads as one set.
|
|
154
|
+
*/
|
|
155
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"][data-pile="words"] [data-media="none"] .dds-cardbody {
|
|
156
|
+
justify-content: center;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
@container (min-width: 48rem) {
|
|
160
|
+
/*
|
|
161
|
+
* From the fold the words and the picture sit side by side, halves of the card, the words at the
|
|
162
|
+
* start and both at the top. The picture's inset moves to its open sides: the words' own end
|
|
163
|
+
* padding is the step between the halves. The words keep the card's height, so a card of words
|
|
164
|
+
* alone can still stand them in its middle; the container keeps its landscape shape.
|
|
165
|
+
*/
|
|
166
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"] .dds-stickycards__body {
|
|
167
|
+
flex-direction: row;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"] .dds-stickycards__media {
|
|
171
|
+
align-self: flex-start;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"] .dds-stickycards__body > :is(.dds-cardbody, .dds-stickycards__media) {
|
|
175
|
+
flex: 1 1 0;
|
|
176
|
+
min-inline-size: 0;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"] .dds-stickycards__media {
|
|
180
|
+
margin-block: var(--space-inset-card);
|
|
181
|
+
margin-inline: 0 var(--space-inset-card);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/* In a pile where other cards have a picture, a card without one keeps its words to the same half
|
|
185
|
+
the others' take, so the words line up down the pile and wrap the same way; the other half is
|
|
186
|
+
the card's own fill. */
|
|
187
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"][data-pile="pictured"] [data-media="none"] .dds-stickycards__body > .dds-cardbody {
|
|
188
|
+
flex: 0 1 50%;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/*
|
|
192
|
+
* And a card of words alone sets its title beside its sentence — the reference design's two
|
|
193
|
+
* columns, the sentence the wider. The two are a heading and the content it introduces turned on
|
|
194
|
+
* its side, so the step between them is space.heading.content, the rule's measure for that.
|
|
195
|
+
*/
|
|
196
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-layout="compact"][data-pile="words"] [data-media="none"] .dds-cardbody__content {
|
|
197
|
+
align-items: center;
|
|
198
|
+
column-gap: var(--space-heading-content);
|
|
199
|
+
display: grid;
|
|
200
|
+
grid-template-columns: minmax(0, 1fr) minmax(0, 1.25fr);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/*
|
|
205
|
+
* ── feature ──────────────────────────────────────────────────────────────────────────────────
|
|
206
|
+
*
|
|
207
|
+
* The picture reaches the card's edges and fills its slot, cropped to fill — the reference's hero
|
|
208
|
+
* image, which a card the width of the page holds as half of itself rather than as an inset
|
|
209
|
+
* thumbnail. Landscape under the words on a phone, aspect.landscape; from the fold the right half
|
|
210
|
+
* of the card, at least landscape tall and as tall as the words if they run longer.
|
|
211
|
+
*/
|
|
212
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-layout="feature"] .dds-stickycards__media {
|
|
213
|
+
aspect-ratio: var(--aspect-landscape);
|
|
214
|
+
display: grid;
|
|
215
|
+
position: relative;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-layout="feature"] .dds-stickycards__image {
|
|
219
|
+
block-size: 100%;
|
|
220
|
+
inline-size: 100%;
|
|
221
|
+
inset: 0;
|
|
222
|
+
object-fit: cover;
|
|
223
|
+
position: absolute;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/*
|
|
227
|
+
* The title at the h3 step: a card the width of the page is a chapter rather than a tile, and the
|
|
228
|
+
* reference sets it there. CardBody draws its title at the card's h5; the block, which knows how
|
|
229
|
+
* big its cards are, is what can say so.
|
|
230
|
+
*/
|
|
231
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-layout="feature"] .dds-cardbody__title {
|
|
232
|
+
font-family: var(--font-h3-family);
|
|
233
|
+
font-size: var(--font-h3-size);
|
|
234
|
+
font-weight: var(--font-h3-weight);
|
|
235
|
+
letter-spacing: var(--font-h3-letter-spacing);
|
|
236
|
+
line-height: var(--font-h3-line-height);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
@container (min-width: 48rem) {
|
|
240
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-layout="feature"] .dds-stickycards__body {
|
|
241
|
+
align-items: stretch;
|
|
242
|
+
flex-direction: row;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-layout="feature"] .dds-stickycards__body > :is(.dds-cardbody, .dds-stickycards__media) {
|
|
246
|
+
flex: 1 1 0;
|
|
247
|
+
min-inline-size: 0;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/*
|
|
252
|
+
* ── the pile ─────────────────────────────────────────────────────────────────────────────────
|
|
253
|
+
*
|
|
254
|
+
* Each card's place sticks under the room a navigation bar takes — size.bar-height and the page's
|
|
255
|
+
* own gutter — and each a step of space.pile.peek lower than the one before, so the top edge of
|
|
256
|
+
* every covered card shows over the card laid on it. The step is the component's: only the last
|
|
257
|
+
* four cards are given one (`--dds-stickycards-depth`), so a long set never shows more than four
|
|
258
|
+
* edges. Later cards are later in the list, so they paint over the earlier ones with no stacking
|
|
259
|
+
* order of their own.
|
|
260
|
+
*
|
|
261
|
+
* Only for a reader who has not asked for less motion, and only in a window tall enough to hold a
|
|
262
|
+
* card under the bar — `40rem`, a laptop's short screen and a phone held upright, and not a phone
|
|
263
|
+
* held on its side. A card taller than the window it is pinned in would be covered before its foot
|
|
264
|
+
* was ever on screen, which is words a reader cannot reach. Everywhere else the cards are a plain
|
|
265
|
+
* column, each in full. Asked around the rule rather than undone after it, so no reset has to win.
|
|
266
|
+
*
|
|
267
|
+
* Sticky is decided by the nearest scroll container, which is why nothing between this section and
|
|
268
|
+
* the page may clip with `overflow: hidden`.
|
|
269
|
+
*
|
|
270
|
+
* While anything in a card has focus, that card comes to the top of the pile: a focused control
|
|
271
|
+
* under the next card is one the eye cannot find. Only what a page renders through `media` can take
|
|
272
|
+
* focus here.
|
|
273
|
+
*
|
|
274
|
+
* …and only while every card fits the window below the bar. The 40rem floor is a guess at a card's
|
|
275
|
+
* height, and a translation is what breaks it: German runs a third longer, and a card of it on an
|
|
276
|
+
* upright phone grew past the window and was covered before its foot was on screen. The component
|
|
277
|
+
* measures and marks the list `data-tall` when the tallest card would not fit, and the pile steps
|
|
278
|
+
* aside for a plain column — every card in full.
|
|
279
|
+
*/
|
|
280
|
+
@media (prefers-reduced-motion: no-preference) and (min-height: 40rem) {
|
|
281
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__list:not([data-tall]) > .dds-stickycards__item {
|
|
282
|
+
--dds-stickycards-top: calc(var(--size-bar-height) + var(--space-inset-page) + var(--dds-stickycards-head, var(--space-gap-none)));
|
|
283
|
+
inset-block-start: calc(var(--dds-stickycards-top) + var(--dds-stickycards-depth, 0) * var(--space-pile-peek));
|
|
284
|
+
position: sticky;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__list:not([data-tall]) > .dds-stickycards__item:focus-within {
|
|
288
|
+
z-index: 1;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/*
|
|
292
|
+
* The heading pins above the pile, so a reader halfway down the stack still knows what it is a
|
|
293
|
+
* stack of. It stops at the bar's foot, where the cards used to, and they now stop under it — at
|
|
294
|
+
* its measured height, which the component hands over as --dds-stickycards-head. It leaves with
|
|
295
|
+
* the last card, because a sticky box is held only inside its parent, and the inner box ends
|
|
296
|
+
* where the pile does.
|
|
297
|
+
*
|
|
298
|
+
* Only once that height is known (`data-head-pinned`), so no card can come to rest over the
|
|
299
|
+
* words, and never when the cards are a plain column (`data-tall`).
|
|
300
|
+
*
|
|
301
|
+
* And it leaves when the pile does. A sticky box is held until its margin box reaches the end of
|
|
302
|
+
* its parent, which is the list's foot — a whole card later than the pile lets go, so the cards
|
|
303
|
+
* scrolled up over a heading still pinned. The heading's margin reaches as far below it as the
|
|
304
|
+
* card on top does (--dds-stickycards-tail, measured), and the list comes back up by the same
|
|
305
|
+
* amount, so nothing moves on the page and the two let go together.
|
|
306
|
+
*/
|
|
307
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-head-pinned]:not(:has(.dds-stickycards__list[data-tall])) .dds-stickycards__header {
|
|
308
|
+
inset-block-start: calc(var(--size-bar-height) + var(--space-inset-page));
|
|
309
|
+
margin-block-end: var(--dds-stickycards-tail, var(--space-gap-none));
|
|
310
|
+
position: sticky;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
:where([data-dds-context="marketing"]) .dds-stickycards[data-head-pinned]:not(:has(.dds-stickycards__list[data-tall])) .dds-stickycards__list {
|
|
314
|
+
margin-block-start: calc(-1 * var(--dds-stickycards-tail, var(--space-gap-none)));
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/*
|
|
319
|
+
* The covered card draws back and darkens, scrubbed by the scroll.
|
|
320
|
+
*
|
|
321
|
+
* The reference measured, on every scroll, how far the next card had come over this one, and drew
|
|
322
|
+
* this one back by that fraction. Said as a range: every card's place names a view timeline
|
|
323
|
+
* (`--dds-stickycards-own`, unique per card and per section, set by the component and brought into
|
|
324
|
+
* scope on the list), and each card but the last runs down the *next* card's timeline. It starts
|
|
325
|
+
* when the next card's top reaches this card's foot — the window's height less this card's sticky
|
|
326
|
+
* top and the card's own height, which is `100%` of the timeline's `entry` range — and ends when the
|
|
327
|
+
* next card reaches its own sticky top. Every card is the same height, so the next card's height is
|
|
328
|
+
* this one's. `100cqh` is the window's height: with no ancestor declaring size containment a
|
|
329
|
+
* container query length falls back to the small viewport, LandingHero's and SceneScroll's reason
|
|
330
|
+
* for it over `vh`, and a frame that does declare one — the preview's — is measured instead.
|
|
331
|
+
*
|
|
332
|
+
* Over that stretch the card draws back to motion.scale.pile-covered from its top edge, and the
|
|
333
|
+
* scrim over it fades in from opacity.hidden to color.bg.overlay at full strength. Linear, because
|
|
334
|
+
* the scroll is the easing. Both hold once the next card lands, and run back as the reader scrolls
|
|
335
|
+
* up.
|
|
336
|
+
*
|
|
337
|
+
* Only where a scroll timeline exists, and only where the pile runs at all — the same two questions
|
|
338
|
+
* asked around the rules. Without a timeline the cards still pile, without drawing back; the scrim
|
|
339
|
+
* is not drawn, so no card is ever left dark.
|
|
340
|
+
*
|
|
341
|
+
* A card holding focus stands at full size with no scrim, at the top of the pile.
|
|
342
|
+
*/
|
|
343
|
+
@keyframes dds-stickycards-recede {
|
|
344
|
+
to {
|
|
345
|
+
scale: var(--motion-scale-pile-covered);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
@keyframes dds-stickycards-darken {
|
|
350
|
+
from {
|
|
351
|
+
opacity: var(--opacity-hidden);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
@supports (animation-timeline: view()) {
|
|
356
|
+
@media (prefers-reduced-motion: no-preference) and (min-height: 40rem) {
|
|
357
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__list:not([data-tall]) {
|
|
358
|
+
timeline-scope: var(--dds-stickycards-scope, none);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__list:not([data-tall]) > .dds-stickycards__item {
|
|
362
|
+
--dds-stickycards-next-top: calc(var(--dds-stickycards-top) + var(--dds-stickycards-next-depth, 0) * var(--space-pile-peek));
|
|
363
|
+
view-timeline: var(--dds-stickycards-own, none) block;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__list:not([data-tall]) > .dds-stickycards__item:not(:last-child) {
|
|
367
|
+
animation: dds-stickycards-recede linear both;
|
|
368
|
+
animation-range:
|
|
369
|
+
entry calc(100cqh - 100% - var(--dds-stickycards-top) - var(--dds-stickycards-depth, 0) * var(--space-pile-peek))
|
|
370
|
+
cover calc(100cqh - var(--dds-stickycards-next-top));
|
|
371
|
+
animation-timeline: var(--dds-stickycards-next);
|
|
372
|
+
transform-origin: 50% 0;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__list:not([data-tall]) > .dds-stickycards__item:not(:last-child) > .dds-stickycards__scrim {
|
|
376
|
+
animation: dds-stickycards-darken linear both;
|
|
377
|
+
animation-range:
|
|
378
|
+
entry calc(100cqh - 100% - var(--dds-stickycards-top) - var(--dds-stickycards-depth, 0) * var(--space-pile-peek))
|
|
379
|
+
cover calc(100cqh - var(--dds-stickycards-next-top));
|
|
380
|
+
animation-timeline: var(--dds-stickycards-next);
|
|
381
|
+
display: block;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__list:not([data-tall]) > .dds-stickycards__item:focus-within {
|
|
385
|
+
animation: none;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
:where([data-dds-context="marketing"]) .dds-stickycards .dds-stickycards__list:not([data-tall]) > .dds-stickycards__item:focus-within > .dds-stickycards__scrim {
|
|
389
|
+
animation: none;
|
|
390
|
+
display: none;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/* GENERATED from teamgrid.contract.json. Do not edit. */
|
|
2
|
+
|
|
3
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid {
|
|
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-teamgrid .dds-teamgrid__inner {
|
|
13
|
+
box-sizing: border-box;
|
|
14
|
+
display: flex;
|
|
15
|
+
flex-direction: column;
|
|
16
|
+
inline-size: 100%;
|
|
17
|
+
min-inline-size: 0;
|
|
18
|
+
max-inline-size: var(--size-content-max);
|
|
19
|
+
padding-block: var(--space-section-default);
|
|
20
|
+
padding-inline: var(--space-inset-page);
|
|
21
|
+
row-gap: var(--space-heading-content);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__header {
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-direction: column;
|
|
27
|
+
min-inline-size: 0;
|
|
28
|
+
max-inline-size: var(--size-measure-heading);
|
|
29
|
+
row-gap: var(--space-gap-none);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__title {
|
|
33
|
+
margin-block: 0;
|
|
34
|
+
text-wrap: balance;
|
|
35
|
+
font-family: var(--font-h2-family);
|
|
36
|
+
font-size: var(--font-h2-size);
|
|
37
|
+
font-weight: var(--font-h2-weight);
|
|
38
|
+
letter-spacing: var(--font-h2-letter-spacing);
|
|
39
|
+
line-height: var(--font-h2-line-height);
|
|
40
|
+
margin-block-end: var(--space-heading-title-description);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__description {
|
|
44
|
+
margin-block: 0;
|
|
45
|
+
font-family: var(--font-body-md-family);
|
|
46
|
+
font-size: var(--font-body-md-size);
|
|
47
|
+
font-weight: var(--font-body-md-weight);
|
|
48
|
+
letter-spacing: var(--font-body-md-letter-spacing);
|
|
49
|
+
line-height: var(--font-body-md-line-height);
|
|
50
|
+
max-inline-size: var(--size-measure-description);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__people {
|
|
54
|
+
display: flex;
|
|
55
|
+
flex-direction: column;
|
|
56
|
+
min-inline-size: 0;
|
|
57
|
+
row-gap: var(--space-gap-xl);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__list {
|
|
61
|
+
display: grid;
|
|
62
|
+
list-style: none;
|
|
63
|
+
margin: 0;
|
|
64
|
+
min-inline-size: 0;
|
|
65
|
+
padding: 0;
|
|
66
|
+
column-gap: var(--space-grid-gutter);
|
|
67
|
+
row-gap: var(--space-grid-gutter);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__item {
|
|
71
|
+
display: flex;
|
|
72
|
+
flex-direction: column;
|
|
73
|
+
min-inline-size: 0;
|
|
74
|
+
row-gap: var(--space-gap-md);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__media {
|
|
78
|
+
overflow: clip;
|
|
79
|
+
border-radius: var(--radius-surface);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__text {
|
|
83
|
+
align-items: flex-start;
|
|
84
|
+
display: flex;
|
|
85
|
+
flex-direction: column;
|
|
86
|
+
min-inline-size: 0;
|
|
87
|
+
row-gap: var(--space-gap-xs);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__name {
|
|
91
|
+
margin-block: 0;
|
|
92
|
+
font-family: var(--font-h5-family);
|
|
93
|
+
font-size: var(--font-h5-size);
|
|
94
|
+
font-weight: var(--font-h5-weight);
|
|
95
|
+
letter-spacing: var(--font-h5-letter-spacing);
|
|
96
|
+
line-height: var(--font-h5-line-height);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__role {
|
|
100
|
+
margin-block: 0;
|
|
101
|
+
font-family: var(--font-body-md-family);
|
|
102
|
+
font-size: var(--font-body-md-size);
|
|
103
|
+
font-weight: var(--font-body-md-weight);
|
|
104
|
+
letter-spacing: var(--font-body-md-letter-spacing);
|
|
105
|
+
line-height: var(--font-body-md-line-height);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__profile {
|
|
109
|
+
align-items: center;
|
|
110
|
+
display: flex;
|
|
111
|
+
min-block-size: var(--size-target-min);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid .dds-teamgrid__actions {
|
|
115
|
+
display: flex;
|
|
116
|
+
flex-direction: column;
|
|
117
|
+
column-gap: var(--space-actions-gap);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid[data-ground="page"] {
|
|
121
|
+
background-color: var(--color-bg-page);
|
|
122
|
+
color: var(--color-fg-default);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid[data-ground="page"] .dds-teamgrid__media {
|
|
126
|
+
background-color: var(--color-bg-surface);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid[data-ground="page"] .dds-teamgrid__role {
|
|
130
|
+
color: var(--color-fg-muted);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid[data-ground="strong"] {
|
|
134
|
+
background-color: var(--color-bg-brand-strong);
|
|
135
|
+
color: var(--color-fg-on-brand-strong);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid[data-ground="strong"] .dds-teamgrid__media {
|
|
139
|
+
background-color: var(--color-bg-subtle-on-brand-strong);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid[data-ground="strong"] .dds-teamgrid__role {
|
|
143
|
+
color: var(--color-fg-muted-inverse);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid[data-ground="subtle"] {
|
|
147
|
+
background-color: var(--color-bg-page);
|
|
148
|
+
background-image: linear-gradient(var(--color-bg-band-subtle), var(--color-bg-band-subtle));
|
|
149
|
+
color: var(--color-fg-default);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid[data-ground="subtle"] .dds-teamgrid__media {
|
|
153
|
+
background-color: var(--color-bg-surface-card-raised);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
:where([data-dds-context="marketing"]) .dds-teamgrid[data-ground="subtle"] .dds-teamgrid__role {
|
|
157
|
+
color: var(--color-fg-muted);
|
|
158
|
+
}
|
|
159
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import './TeamGrid.css';
|
|
2
|
+
import './team-grid-impl.css';
|
|
3
|
+
import '../block-reveal.css';
|
|
4
|
+
import { type TeamGridProps } from './TeamGrid.types.js';
|
|
5
|
+
export type { TeamGridProps };
|
|
6
|
+
/**
|
|
7
|
+
* A heading over a grid of people — the reference design's Leaders template, AvatarGrid in its
|
|
8
|
+
* source.
|
|
9
|
+
*
|
|
10
|
+
* Each person is a square photograph over their name, their role and, where they have one, a link
|
|
11
|
+
* to a profile of theirs elsewhere. The people are records rather than cards the page composes: a
|
|
12
|
+
* person here is words and a picture, and the grid is what decides how each one is drawn.
|
|
13
|
+
*
|
|
14
|
+
* The first `collapsedCount` show at once and the rest wait behind a button under the grid. One
|
|
15
|
+
* list rather than the reference's two grids, so a screen reader counts the whole set and the
|
|
16
|
+
* order is the same whether it is open or not; the people past the count are in the markup from
|
|
17
|
+
* the first render and `hidden` until asked for, which takes them out of the accessibility tree
|
|
18
|
+
* and the tab order as well as off the page. The reference marked its hidden half `aria-hidden`
|
|
19
|
+
* only, and left their links in the tab order behind a collapsed row.
|
|
20
|
+
*
|
|
21
|
+
* Pressing the button leaves focus on it. The people it shows sit straight before it in reading
|
|
22
|
+
* order, so they are the next thing a reader moving back meets, and the people it hides take any
|
|
23
|
+
* focus they could have held away with them — which they cannot be holding, the button having it.
|
|
24
|
+
*
|
|
25
|
+
* `'use client'` for the button's state, for the arrival, and for `useId`, which names the region
|
|
26
|
+
* by its heading and gives the button the list's id to control.
|
|
27
|
+
*/
|
|
28
|
+
export declare function TeamGrid({ ground, title, description, people, collapsedCount, expandLabel, collapseLabel, profileName, externalLabel, }: TeamGridProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useId, useState } from 'react';
|
|
4
|
+
import './TeamGrid.css';
|
|
5
|
+
import './team-grid-impl.css';
|
|
6
|
+
import '../block-reveal.css';
|
|
7
|
+
import { given } from '../../given.js';
|
|
8
|
+
import { Button } from '../../core/button/Button.js';
|
|
9
|
+
import { Link } from '../../core/link/Link.js';
|
|
10
|
+
import { AspectRatio } from '../../layout/aspect-ratio/AspectRatio.js';
|
|
11
|
+
import { arriving, useReveal } from '../use-reveal.js';
|
|
12
|
+
import { teamGridDefaults, teamGridParts } from './TeamGrid.types.js';
|
|
13
|
+
/**
|
|
14
|
+
* A profile link's accessible name when the page gives none: the visible word, then whose it is.
|
|
15
|
+
*
|
|
16
|
+
* The word first, because it is what a reader using speech sees and says — "click LinkedIn" has to
|
|
17
|
+
* match — and the name after it, because "LinkedIn" alone is the same on every card and a list of
|
|
18
|
+
* links heard out of context would be one word repeated.
|
|
19
|
+
*/
|
|
20
|
+
const profileNameOf = (person) => `${person.profile?.label ?? ''}, ${person.name}`;
|
|
21
|
+
/**
|
|
22
|
+
* Where a person comes in the arrival, capped so a long set does not keep a reader waiting.
|
|
23
|
+
*
|
|
24
|
+
* The heading and the line under it take the first two steps; the people showing follow a step
|
|
25
|
+
* apart up to the fourth, and the button arrives a step after the last of them. FeatureCards' cap,
|
|
26
|
+
* for its reason: block-reveal.css keeps a block's trail inside its own movement.
|
|
27
|
+
*/
|
|
28
|
+
const FIRST_PERSON = 2;
|
|
29
|
+
const LAST_STEP = FIRST_PERSON + 3;
|
|
30
|
+
/**
|
|
31
|
+
* A heading over a grid of people — the reference design's Leaders template, AvatarGrid in its
|
|
32
|
+
* source.
|
|
33
|
+
*
|
|
34
|
+
* Each person is a square photograph over their name, their role and, where they have one, a link
|
|
35
|
+
* to a profile of theirs elsewhere. The people are records rather than cards the page composes: a
|
|
36
|
+
* person here is words and a picture, and the grid is what decides how each one is drawn.
|
|
37
|
+
*
|
|
38
|
+
* The first `collapsedCount` show at once and the rest wait behind a button under the grid. One
|
|
39
|
+
* list rather than the reference's two grids, so a screen reader counts the whole set and the
|
|
40
|
+
* order is the same whether it is open or not; the people past the count are in the markup from
|
|
41
|
+
* the first render and `hidden` until asked for, which takes them out of the accessibility tree
|
|
42
|
+
* and the tab order as well as off the page. The reference marked its hidden half `aria-hidden`
|
|
43
|
+
* only, and left their links in the tab order behind a collapsed row.
|
|
44
|
+
*
|
|
45
|
+
* Pressing the button leaves focus on it. The people it shows sit straight before it in reading
|
|
46
|
+
* order, so they are the next thing a reader moving back meets, and the people it hides take any
|
|
47
|
+
* focus they could have held away with them — which they cannot be holding, the button having it.
|
|
48
|
+
*
|
|
49
|
+
* `'use client'` for the button's state, for the arrival, and for `useId`, which names the region
|
|
50
|
+
* by its heading and gives the button the list's id to control.
|
|
51
|
+
*/
|
|
52
|
+
export function TeamGrid({ ground = teamGridDefaults.ground, title, description, people, collapsedCount = teamGridDefaults.collapsedCount, expandLabel = teamGridDefaults.expandLabel, collapseLabel = teamGridDefaults.collapseLabel, profileName = profileNameOf, externalLabel = teamGridDefaults.externalLabel, }) {
|
|
53
|
+
const titleId = useId();
|
|
54
|
+
const listId = useId();
|
|
55
|
+
const [band, revealed] = useReveal();
|
|
56
|
+
const [expanded, setExpanded] = useState(false);
|
|
57
|
+
// A count below one would hide everyone behind the button; a fraction is not a number of people.
|
|
58
|
+
const shown = Math.max(1, Math.floor(collapsedCount));
|
|
59
|
+
const longer = people.length > shown;
|
|
60
|
+
const inverse = ground === 'strong';
|
|
61
|
+
return (_jsx("section", { className: teamGridParts.root, "data-ground": ground, "aria-labelledby": titleId, children: _jsxs("div", { className: teamGridParts.inner, ref: band, "data-revealed": revealed, children: [_jsxs("div", { className: teamGridParts.header, children: [_jsx("h2", { className: teamGridParts.title, id: titleId, ...arriving(0), children: title }), given(description) ? (_jsx("p", { className: teamGridParts.description, ...arriving(1), children: description })) : null] }), _jsxs("div", { className: teamGridParts.people, children: [_jsx("ul", { className: teamGridParts.list, id: listId, children: people.map((person, at) => {
|
|
62
|
+
const extra = at >= shown;
|
|
63
|
+
/* A person showing from the start arrives with the block. One past the count arrives
|
|
64
|
+
when the button shows them, by the stylesheet's own animation, a step behind the
|
|
65
|
+
one before — so it carries its place among the extras rather than the block's. */
|
|
66
|
+
const motion = extra
|
|
67
|
+
? {
|
|
68
|
+
'data-extra': '',
|
|
69
|
+
style: { '--dds-teamgrid-extra-at': at - shown },
|
|
70
|
+
}
|
|
71
|
+
: arriving(Math.min(FIRST_PERSON + at, LAST_STEP));
|
|
72
|
+
return (_jsxs("li", { className: teamGridParts.item, hidden: extra && !expanded, ...motion, children: [_jsx("div", { className: teamGridParts.media, children: _jsx(AspectRatio, { ratio: "square", children: _jsx("img", { src: person.image.src, alt: person.image.alt, loading: "lazy", decoding: "async" }) }) }), _jsxs("div", { className: teamGridParts.text, children: [_jsx("h3", { className: teamGridParts.name, children: person.name }), _jsx("p", { className: teamGridParts.role, children: person.role }), person.profile !== undefined ? (_jsx("div", { className: teamGridParts.profile, children: _jsx(Link, { href: person.profile.href, external: true, tone: inverse ? 'inherit' : 'brand', "aria-label": `${profileName(person)} ${externalLabel}`, children: person.profile.label }) })) : null] })] }, `${person.name}-${at}`));
|
|
73
|
+
}) }), longer ? (_jsx("div", { className: teamGridParts.actions, ...arriving(Math.min(FIRST_PERSON + shown, LAST_STEP + 1)), children: _jsx(Button, { variant: "secondary", size: "md", tone: inverse ? 'inverse' : 'default', "aria-expanded": expanded, "aria-controls": listId, onClick: () => setExpanded((open) => !open), children: expanded ? collapseLabel : expandLabel }) })) : null] })] }) }));
|
|
74
|
+
}
|