@deriv-com/dds-marketing 0.2.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.llm/components/accordion.md +9 -1
- package/.llm/components/accordionitem.md +9 -1
- package/.llm/components/aspectratio.md +9 -1
- package/.llm/components/badge.md +9 -1
- package/.llm/components/bottomsheet.md +9 -1
- package/.llm/components/breadcrumb.md +9 -1
- package/.llm/components/breadcrumbitem.md +9 -1
- package/.llm/components/button.md +55 -27
- package/.llm/components/buttonicon.md +16 -8
- package/.llm/components/card.md +16 -2
- package/.llm/components/cardbody.md +29 -3
- package/.llm/components/cardbutton.md +16 -2
- package/.llm/components/checkbox.md +9 -1
- package/.llm/components/ctabanner.md +186 -0
- package/.llm/components/ctabannerslider.md +204 -0
- package/.llm/components/divider.md +9 -1
- package/.llm/components/dropdownmenu.md +15 -7
- package/.llm/components/faqaccordion.md +217 -0
- package/.llm/components/featurebullets.md +254 -0
- package/.llm/components/featurecards.md +313 -0
- package/.llm/components/featurescroll.md +284 -0
- package/.llm/components/featuresplit.md +249 -0
- package/.llm/components/filterchip.md +9 -1
- package/.llm/components/footer.md +9 -1
- package/.llm/components/footergroup.md +9 -1
- package/.llm/components/grid.md +9 -1
- package/.llm/components/icon.md +21 -3
- package/.llm/components/landinghero.md +254 -0
- package/.llm/components/link.md +13 -5
- package/.llm/components/logocolumns.md +235 -0
- package/.llm/components/logorows.md +212 -0
- package/.llm/components/menuitem.md +9 -1
- package/.llm/components/navbar.md +80 -16
- package/.llm/components/navbaritem.md +10 -2
- package/.llm/components/navbarmenu.md +9 -1
- package/.llm/components/navbarmenugroup.md +9 -1
- package/.llm/components/navbarpanel.md +10 -2
- package/.llm/components/navbarswitcher.md +10 -2
- package/.llm/components/navbarswitcheroption.md +9 -1
- package/.llm/components/option.md +9 -1
- package/.llm/components/pageheader.md +231 -0
- package/.llm/components/pagination.md +27 -90
- package/.llm/components/paginationdots.md +215 -0
- package/.llm/components/producthero.md +248 -0
- package/.llm/components/removablechip.md +9 -1
- package/.llm/components/row.md +9 -1
- package/.llm/components/scroller.md +9 -1
- package/.llm/components/searchinput.md +9 -1
- package/.llm/components/segmentedcontrol.md +9 -1
- package/.llm/components/segmentedcontrolitem.md +9 -1
- package/.llm/components/select.md +9 -1
- package/.llm/components/selectchip.md +57 -16
- package/.llm/components/spinner.md +9 -1
- package/.llm/components/stack.md +9 -1
- package/.llm/components/statusdot.md +9 -1
- package/.llm/components/subdomainnavbar.md +9 -1
- package/.llm/components/tab.md +11 -3
- package/.llm/components/table.md +9 -1
- package/.llm/components/tablebody.md +9 -1
- package/.llm/components/tablecell.md +9 -1
- package/.llm/components/tablehead.md +9 -1
- package/.llm/components/tableheadercell.md +9 -1
- package/.llm/components/tablerow.md +9 -1
- package/.llm/components/tablist.md +9 -1
- package/.llm/components/testimonialrow.md +235 -0
- package/.llm/components/testimonialslider.md +254 -0
- package/.llm/components/textarea.md +9 -1
- package/.llm/components/textinput.md +9 -1
- package/.llm/components/tooltip.md +9 -1
- package/.llm/components/typography.md +9 -1
- package/.llm/digest/button.md +11 -6
- package/.llm/digest/buttonicon.md +2 -2
- package/.llm/digest/card.md +1 -0
- package/.llm/digest/cardbody.md +3 -1
- package/.llm/digest/cardbutton.md +1 -0
- package/.llm/digest/ctabanner.md +44 -0
- package/.llm/digest/ctabannerslider.md +45 -0
- package/.llm/digest/dropdownmenu.md +1 -1
- package/.llm/digest/faqaccordion.md +43 -0
- package/.llm/digest/featurebullets.md +52 -0
- package/.llm/digest/featurecards.md +49 -0
- package/.llm/digest/featurescroll.md +52 -0
- package/.llm/digest/featuresplit.md +54 -0
- package/.llm/digest/landinghero.md +53 -0
- package/.llm/digest/logocolumns.md +55 -0
- package/.llm/digest/logorows.md +48 -0
- package/.llm/digest/navbar.md +18 -3
- package/.llm/digest/pageheader.md +49 -0
- package/.llm/digest/pagination.md +6 -17
- package/.llm/digest/paginationdots.md +43 -0
- package/.llm/digest/producthero.md +53 -0
- package/.llm/digest/selectchip.md +6 -1
- package/.llm/digest/testimonialrow.md +51 -0
- package/.llm/digest/testimonialslider.md +51 -0
- package/.llm/index.md +24 -3
- package/.llm/rules.md +43 -9
- package/.llm/tokens.md +56 -12
- package/AGENTS.md +32 -8
- package/README.md +41 -21
- package/dist/components/banner-data.d.ts +38 -0
- package/dist/components/banner-data.js +15 -0
- package/dist/components/blocks/block-reveal.css +90 -0
- package/dist/components/blocks/cta-banner/CtaBanner.css +66 -0
- package/dist/components/blocks/cta-banner/CtaBanner.d.ts +22 -0
- package/dist/components/blocks/cta-banner/CtaBanner.js +31 -0
- package/dist/components/blocks/cta-banner/CtaBanner.types.d.ts +29 -0
- package/dist/components/blocks/cta-banner/CtaBanner.types.js +13 -0
- package/dist/components/blocks/cta-banner/cta-banner-impl.css +29 -0
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.css +90 -0
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.d.ts +39 -0
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.js +60 -0
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.d.ts +41 -0
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.js +15 -0
- package/dist/components/blocks/cta-banner-slider/cta-banner-slider-impl.css +73 -0
- package/dist/components/blocks/faq-accordion/FaqAccordion.css +54 -0
- package/dist/components/blocks/faq-accordion/FaqAccordion.d.ts +20 -0
- package/dist/components/blocks/faq-accordion/FaqAccordion.js +28 -0
- package/dist/components/blocks/faq-accordion/FaqAccordion.types.d.ts +25 -0
- package/dist/components/blocks/faq-accordion/FaqAccordion.types.js +10 -0
- package/dist/components/blocks/faq-accordion/faq-accordion-impl.css +54 -0
- package/dist/components/blocks/feature-bullets/FeatureBullets.css +139 -0
- package/dist/components/blocks/feature-bullets/FeatureBullets.d.ts +31 -0
- package/dist/components/blocks/feature-bullets/FeatureBullets.js +55 -0
- package/dist/components/blocks/feature-bullets/FeatureBullets.types.d.ts +39 -0
- package/dist/components/blocks/feature-bullets/FeatureBullets.types.js +16 -0
- package/dist/components/blocks/feature-bullets/feature-bullets-impl.css +104 -0
- package/dist/components/blocks/feature-cards/FeatureCards.css +84 -0
- package/dist/components/blocks/feature-cards/FeatureCards.d.ts +24 -0
- package/dist/components/blocks/feature-cards/FeatureCards.js +66 -0
- package/dist/components/blocks/feature-cards/FeatureCards.types.d.ts +33 -0
- package/dist/components/blocks/feature-cards/FeatureCards.types.js +14 -0
- package/dist/components/blocks/feature-cards/feature-cards-impl.css +245 -0
- package/dist/components/blocks/feature-scroll/FeatureScroll.css +137 -0
- package/dist/components/blocks/feature-scroll/FeatureScroll.d.ts +39 -0
- package/dist/components/blocks/feature-scroll/FeatureScroll.js +167 -0
- package/dist/components/blocks/feature-scroll/FeatureScroll.types.d.ts +40 -0
- package/dist/components/blocks/feature-scroll/FeatureScroll.types.js +17 -0
- package/dist/components/blocks/feature-scroll/feature-scroll-impl.css +292 -0
- package/dist/components/blocks/feature-split/FeatureSplit.css +95 -0
- package/dist/components/blocks/feature-split/FeatureSplit.d.ts +30 -0
- package/dist/components/blocks/feature-split/FeatureSplit.js +38 -0
- package/dist/components/blocks/feature-split/FeatureSplit.types.d.ts +39 -0
- package/dist/components/blocks/feature-split/FeatureSplit.types.js +14 -0
- package/dist/components/blocks/feature-split/feature-split-impl.css +83 -0
- package/dist/components/blocks/landing-hero/LandingHero.css +85 -0
- package/dist/components/blocks/landing-hero/LandingHero.d.ts +41 -0
- package/dist/components/blocks/landing-hero/LandingHero.js +54 -0
- package/dist/components/blocks/landing-hero/LandingHero.types.d.ts +37 -0
- package/dist/components/blocks/landing-hero/LandingHero.types.js +15 -0
- package/dist/components/blocks/landing-hero/landing-hero-impl.css +355 -0
- package/dist/components/blocks/logo-columns/LogoColumns.css +161 -0
- package/dist/components/blocks/logo-columns/LogoColumns.d.ts +23 -0
- package/dist/components/blocks/logo-columns/LogoColumns.js +46 -0
- package/dist/components/blocks/logo-columns/LogoColumns.types.d.ts +46 -0
- package/dist/components/blocks/logo-columns/LogoColumns.types.js +18 -0
- package/dist/components/blocks/logo-columns/logo-columns-impl.css +188 -0
- package/dist/components/blocks/logo-rows/LogoRows.css +122 -0
- package/dist/components/blocks/logo-rows/LogoRows.d.ts +20 -0
- package/dist/components/blocks/logo-rows/LogoRows.js +43 -0
- package/dist/components/blocks/logo-rows/LogoRows.types.d.ts +36 -0
- package/dist/components/blocks/logo-rows/LogoRows.types.js +16 -0
- package/dist/components/blocks/logo-rows/logo-rows-impl.css +179 -0
- package/dist/components/blocks/page-header/PageHeader.css +79 -0
- package/dist/components/blocks/page-header/PageHeader.d.ts +34 -0
- package/dist/components/blocks/page-header/PageHeader.js +43 -0
- package/dist/components/blocks/page-header/PageHeader.types.d.ts +32 -0
- package/dist/components/blocks/page-header/PageHeader.types.js +14 -0
- package/dist/components/blocks/page-header/page-header-impl.css +176 -0
- package/dist/components/blocks/product-hero/ProductHero.css +86 -0
- package/dist/components/blocks/product-hero/ProductHero.d.ts +35 -0
- package/dist/components/blocks/product-hero/ProductHero.js +48 -0
- package/dist/components/blocks/product-hero/ProductHero.types.d.ts +37 -0
- package/dist/components/blocks/product-hero/ProductHero.types.js +15 -0
- package/dist/components/blocks/product-hero/product-hero-impl.css +354 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.css +245 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.d.ts +20 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.js +128 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.types.d.ts +54 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.types.js +26 -0
- package/dist/components/blocks/testimonial-row/testimonial-row-impl.css +195 -0
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.css +181 -0
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.d.ts +22 -0
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.js +36 -0
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.d.ts +49 -0
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.js +21 -0
- package/dist/components/blocks/testimonial-slider/testimonial-slider-impl.css +202 -0
- package/dist/components/blocks/use-reveal.d.ts +46 -0
- package/dist/components/blocks/use-reveal.js +120 -0
- package/dist/components/blocks/use-rotation.d.ts +62 -0
- package/dist/components/blocks/use-rotation.js +176 -0
- package/dist/components/core/accordion-item/AccordionItem.css +6 -5
- package/dist/components/core/bottom-sheet/BottomSheet.css +1 -1
- package/dist/components/core/button/Button.css +63 -16
- package/dist/components/core/button/Button.d.ts +14 -12
- package/dist/components/core/button/Button.js +43 -14
- package/dist/components/core/button/Button.types.d.ts +9 -14
- package/dist/components/core/button/button-impl.css +25 -0
- package/dist/components/core/button-icon/ButtonIcon.css +31 -15
- package/dist/components/core/button-icon/ButtonIcon.d.ts +2 -2
- package/dist/components/core/button-icon/ButtonIcon.js +2 -2
- package/dist/components/core/button-icon/ButtonIcon.types.d.ts +4 -4
- package/dist/components/core/card/Card.css +13 -4
- package/dist/components/core/card/Card.types.d.ts +2 -1
- package/dist/components/core/card-body/CardBody.css +11 -6
- package/dist/components/core/card-body/CardBody.d.ts +1 -1
- package/dist/components/core/card-body/CardBody.js +2 -2
- package/dist/components/core/card-body/CardBody.types.d.ts +4 -1
- package/dist/components/core/card-body/CardBody.types.js +1 -0
- package/dist/components/core/card-button/CardButton.css +13 -4
- package/dist/components/core/card-button/CardButton.types.d.ts +2 -1
- package/dist/components/core/checkbox/Checkbox.css +8 -1
- package/dist/components/core/dropdown-menu/DropdownMenu.css +13 -12
- package/dist/components/core/dropdown-menu/DropdownMenu.d.ts +5 -3
- package/dist/components/core/dropdown-menu/DropdownMenu.js +5 -3
- package/dist/components/core/filter-chip/FilterChip.css +2 -1
- package/dist/components/core/footer/footer-impl.css +1 -1
- package/dist/components/core/footer-group/FooterGroup.css +8 -7
- package/dist/components/core/icon/Icon.css +1 -1
- package/dist/components/core/link/Link.css +1 -1
- package/dist/components/core/link/Link.js +5 -5
- package/dist/components/core/menu-item/MenuItem.css +1 -1
- package/dist/components/core/navbar/Navbar.css +7 -8
- package/dist/components/core/navbar/Navbar.d.ts +17 -1
- package/dist/components/core/navbar/Navbar.js +139 -12
- package/dist/components/core/navbar/Navbar.types.d.ts +23 -4
- package/dist/components/core/navbar/Navbar.types.js +1 -1
- package/dist/components/core/navbar/navbar-impl.css +10 -3
- package/dist/components/core/navbar/navbar-material.css +96 -0
- package/dist/components/core/navbar-item/NavbarItem.css +4 -4
- package/dist/components/core/navbar-menu/NavbarMenu.css +7 -5
- package/dist/components/core/navbar-menu/NavbarMenu.d.ts +1 -0
- package/dist/components/core/navbar-menu/NavbarMenu.js +1 -0
- package/dist/components/core/navbar-menu/navbar-menu-impl.css +7 -7
- package/dist/components/core/navbar-switcher/NavbarSwitcher.css +6 -5
- package/dist/components/core/navbar-switcher/NavbarSwitcher.d.ts +1 -0
- package/dist/components/core/navbar-switcher/NavbarSwitcher.js +2 -1
- package/dist/components/core/option/Option.css +1 -1
- package/dist/components/core/pagination/Pagination.css +1 -75
- package/dist/components/core/pagination/Pagination.d.ts +4 -4
- package/dist/components/core/pagination/Pagination.js +11 -51
- package/dist/components/core/pagination/Pagination.types.d.ts +5 -17
- package/dist/components/core/pagination/Pagination.types.js +1 -3
- package/dist/components/core/pagination-dots/PaginationDots.css +60 -0
- package/dist/components/core/pagination-dots/PaginationDots.d.ts +25 -0
- package/dist/components/core/pagination-dots/PaginationDots.js +104 -0
- package/dist/components/core/pagination-dots/PaginationDots.types.d.ts +38 -0
- package/dist/components/core/pagination-dots/PaginationDots.types.js +9 -0
- package/dist/components/core/removable-chip/RemovableChip.css +3 -3
- package/dist/components/core/search-input/SearchInput.css +1 -1
- package/dist/components/core/segmented-control/SegmentedControl.css +1 -1
- package/dist/components/core/segmented-control-item/SegmentedControlItem.css +1 -1
- package/dist/components/core/select/Select.css +2 -1
- package/dist/components/core/select-chip/SelectChip.css +14 -7
- package/dist/components/core/select-chip/SelectChip.d.ts +1 -1
- package/dist/components/core/select-chip/SelectChip.js +7 -4
- package/dist/components/core/select-chip/SelectChip.types.d.ts +7 -1
- package/dist/components/core/select-chip/SelectChip.types.js +1 -1
- package/dist/components/core/select-chip/select-chip-impl.css +14 -3
- package/dist/components/core/status-dot/StatusDot.css +1 -1
- package/dist/components/core/subdomain-navbar/SubdomainNavbar.css +3 -3
- package/dist/components/core/tab/Tab.css +1 -1
- package/dist/components/core/tab/Tab.types.d.ts +1 -1
- package/dist/components/core/tab-list/TabList.css +1 -1
- package/dist/components/core/table/table-impl.css +36 -14
- package/dist/components/core/table-header-cell/TableHeaderCell.css +5 -5
- package/dist/components/core/text-area/TextArea.css +1 -1
- package/dist/components/core/text-input/TextInput.css +1 -1
- package/dist/components/core/tooltip/Tooltip.css +1 -1
- package/dist/components/core/typography/Typography.css +5 -5
- package/dist/components/index.d.ts +35 -0
- package/dist/components/index.js +30 -0
- package/dist/components/logo-data.d.ts +24 -0
- package/dist/components/logo-data.js +11 -0
- package/dist/components/scroll-data.d.ts +64 -0
- package/dist/components/scroll-data.js +17 -0
- package/dist/components/testimonial-row-data.d.ts +51 -0
- package/dist/components/testimonial-row-data.js +11 -0
- package/dist/components/testimonial-slider-data.d.ts +26 -0
- package/dist/components/testimonial-slider-data.js +10 -0
- package/dist/marketing.css +385 -14
- package/package.json +1 -6
|
@@ -0,0 +1,354 @@
|
|
|
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 photograph, drawn the one way a band wants it.
|
|
10
|
+
*
|
|
11
|
+
* The page passes which image; how it is fitted is this component's decision and belongs here
|
|
12
|
+
* rather than in the inline style, where a page could not see it. `cover` because a band of fixed
|
|
13
|
+
* height letterboxing a photograph would show the ground through it.
|
|
14
|
+
*/
|
|
15
|
+
:where([data-dds-context="marketing"]) .dds-producthero {
|
|
16
|
+
background-position: center;
|
|
17
|
+
background-repeat: no-repeat;
|
|
18
|
+
background-size: cover;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/*
|
|
22
|
+
* A title with nothing under it carries no step under it.
|
|
23
|
+
*
|
|
24
|
+
* The steps inside the text block sit on each part's own `margin-block-end`, because eyebrow-to-
|
|
25
|
+
* title and title-to-description are two roles that agree at full width and part company on a
|
|
26
|
+
* phone. The cost is a trailing margin: with `description` absent the title is the last child and
|
|
27
|
+
* its step is measured against nothing.
|
|
28
|
+
*/
|
|
29
|
+
:where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__title:last-child {
|
|
30
|
+
margin-block-end: 0;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/*
|
|
34
|
+
* A screen tall, like the tier above it.
|
|
35
|
+
*
|
|
36
|
+
* `100cqh` rather than `100svh`, and the two are the same number on a real page: with no ancestor
|
|
37
|
+
* declaring size containment, a container query length falls back to the small viewport. What the
|
|
38
|
+
* container unit adds is an answer for a frame standing in for a window, which is what the preview
|
|
39
|
+
* gives a band — see `spansThePage`.
|
|
40
|
+
*
|
|
41
|
+
* `min-block-size` rather than `block-size`, so a band whose copy runs long grows instead of
|
|
42
|
+
* clipping it.
|
|
43
|
+
*/
|
|
44
|
+
:where([data-dds-context="marketing"]) .dds-producthero {
|
|
45
|
+
min-block-size: 100cqh;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/*
|
|
49
|
+
* Centred, and centred on the measure rather than on the band.
|
|
50
|
+
*
|
|
51
|
+
* `size.measure.hero-description` caps the line length; without `margin-inline: auto` the capped block
|
|
52
|
+
* sits at the column's leading edge while the text inside it is centred, which reads as a
|
|
53
|
+
* paragraph nudged toward the start of everything above it. The same correction the actions need, for the same
|
|
54
|
+
* reason: a wrapped row of buttons hugs its content and would otherwise sit at the start edge.
|
|
55
|
+
*/
|
|
56
|
+
/*
|
|
57
|
+
* Two calls to action stack on a phone and stand side by side once there is room.
|
|
58
|
+
*
|
|
59
|
+
* The reference design makes each one full width at the narrow end — a button that hugs its label
|
|
60
|
+
* on a phone is a tap target sized by how long the word happens to be, so "Try free demo" is an
|
|
61
|
+
* easier press than "Buy" for no reason a reader would agree with — and lets them hug once the
|
|
62
|
+
* band is wide enough to hold both on a line.
|
|
63
|
+
*
|
|
64
|
+
* Before the wide rules below, not after them: a container query adds no weight, so a phone rule
|
|
65
|
+
* written later at the same specificity wins at every width — which is how it stood once, with the
|
|
66
|
+
* actions stacked and stretched across a desktop band.
|
|
67
|
+
*/
|
|
68
|
+
:where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__actions {
|
|
69
|
+
align-items: stretch;
|
|
70
|
+
flex-direction: column;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
:where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__actions > * {
|
|
74
|
+
inline-size: 100%;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/*
|
|
78
|
+
* Whatever the page put in a visual slot fills the slot's width.
|
|
79
|
+
*
|
|
80
|
+
* The slots take a node rather than a source, so what arrives is the page's element — an `<img>`,
|
|
81
|
+
* a `<picture>`, or a ratio box holding one — and this cannot know whether it carries dimensions.
|
|
82
|
+
* Width only: the height is the visual's own business here, unlike the landing tier where the slot
|
|
83
|
+
* is a sized box and the subject has to fill it.
|
|
84
|
+
*
|
|
85
|
+
* The `<img>` rule reaches a level deeper on purpose, for the case where the page wraps its
|
|
86
|
+
* picture in something: `object-fit` does nothing on a `<div>`, so a rule aimed at the slot's
|
|
87
|
+
* immediate child was silently a no-op whenever that child was a ratio box.
|
|
88
|
+
*/
|
|
89
|
+
:where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__media > * {
|
|
90
|
+
inline-size: 100%;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/*
|
|
94
|
+
* Starts on a phone, centred once the band is wide enough to hold a line.
|
|
95
|
+
*
|
|
96
|
+
* The reference design does exactly this, and the reason is legibility rather than taste: centred
|
|
97
|
+
* text is read from a different starting edge on every line, which costs little across a wide
|
|
98
|
+
* measure and a great deal across a narrow one. The claim is centred where it is short relative to
|
|
99
|
+
* the band and ranged where it is not.
|
|
100
|
+
*/
|
|
101
|
+
@container (min-width: 48rem) {
|
|
102
|
+
:where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__content {
|
|
103
|
+
align-items: center;
|
|
104
|
+
text-align: center;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
:where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__description {
|
|
108
|
+
margin-inline: auto;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
:where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__actions {
|
|
112
|
+
align-items: center;
|
|
113
|
+
flex-direction: row;
|
|
114
|
+
justify-content: center;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
:where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__actions > * {
|
|
118
|
+
inline-size: auto;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/*
|
|
123
|
+
* The product, under the claim and narrower than it.
|
|
124
|
+
*
|
|
125
|
+
* In flow here, where the landing tier places its subject against the band's edge — so the rules
|
|
126
|
+
* that tier needs are wrong for this one. `block-size: 100%` on the child was carried over from it
|
|
127
|
+
* and is the reason the visual sat where it did: the slot has no height of its own, so the
|
|
128
|
+
* percentage resolved to auto and whatever was inside sized itself.
|
|
129
|
+
*
|
|
130
|
+
* Capped at sixty per cent of the column rather than filling it. A screenshot run to the measure's
|
|
131
|
+
* full width is taller than the band that holds it, and the claim above it goes off the top. The
|
|
132
|
+
* same percentage reasoning as the landing tier's half-measure text column, and a share rather
|
|
133
|
+
* than a token for the same reason: it is this arrangement's proportion, not a value the system
|
|
134
|
+
* names.
|
|
135
|
+
*/
|
|
136
|
+
/*
|
|
137
|
+
* The column fills the band, said outright rather than inherited.
|
|
138
|
+
*
|
|
139
|
+
* Everything about where this band's contents sit depends on it: the product is stood on the foot
|
|
140
|
+
* by the room left above it, and room only exists if the column is taller than what is in it. It
|
|
141
|
+
* should stretch on its own — it is the only item of a flex row that sets no cross size — and it
|
|
142
|
+
* was not, which is what left the claim at the top, the picture under it, and the rest of the band
|
|
143
|
+
* empty beneath both. `align-self` asks for it directly, so nothing between here and the band has
|
|
144
|
+
* to agree for the arrangement to hold.
|
|
145
|
+
*/
|
|
146
|
+
:where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__content {
|
|
147
|
+
align-self: stretch;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/*
|
|
151
|
+
* The product stands on the band's foot rather than floating above it, at every width.
|
|
152
|
+
*
|
|
153
|
+
* It is the last thing in the column, so what separates it from the band's edge is the section
|
|
154
|
+
* step `inner` carries. Dropped, the picture meets the foot and is cropped by it — which is what
|
|
155
|
+
* makes a product read as standing in the band rather than as a picture placed on it, and is the
|
|
156
|
+
* arrangement LandingHero's subject takes for the same reason.
|
|
157
|
+
*
|
|
158
|
+
* At every width, which is the correction. This sat inside the wide layout's query for a while and
|
|
159
|
+
* the phone kept its step: the picture was aligned to the foot of a column that stopped short of
|
|
160
|
+
* the band, so every arrangement above it was right and there was a hand's width of ground under
|
|
161
|
+
* it regardless. A band that clips its subject is not a decision about how wide the window is.
|
|
162
|
+
*
|
|
163
|
+
* Only where there is a product. `:has()` asks the band whether one was passed, because without it
|
|
164
|
+
* the claim and its actions would be the thing resting on the edge, and a band of words with no
|
|
165
|
+
* air under them is a band that looks cut off rather than composed.
|
|
166
|
+
*
|
|
167
|
+
* The step above is untouched: this is the distance from the picture down, not the rhythm of the
|
|
168
|
+
* column.
|
|
169
|
+
*/
|
|
170
|
+
:where([data-dds-context="marketing"])
|
|
171
|
+
.dds-producthero:has(.dds-producthero__media)
|
|
172
|
+
.dds-producthero__inner {
|
|
173
|
+
padding-block-end: 0;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
:where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__media {
|
|
177
|
+
inline-size: 100%;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/*
|
|
181
|
+
* Below the fold the whole column sits at the foot, rather than the picture alone.
|
|
182
|
+
*
|
|
183
|
+
* There is no bar to clear on a phone and nothing above the claim worth the space, so a band that
|
|
184
|
+
* put its words at the top and its picture at the bottom was a screen with a hole in the middle.
|
|
185
|
+
* Everything together at the base reads as one thing standing on the ground the page continues
|
|
186
|
+
* from.
|
|
187
|
+
*
|
|
188
|
+
* The auto margin has to go with it. Left on, it would take every pixel of the free space for
|
|
189
|
+
* itself and put the picture back at the foot on its own — which is the arrangement this rule
|
|
190
|
+
* exists to replace, not one to stack on top of.
|
|
191
|
+
*/
|
|
192
|
+
@container (max-width: 47.9375rem) {
|
|
193
|
+
:where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__content {
|
|
194
|
+
justify-content: flex-end;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
:where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__media {
|
|
198
|
+
margin-block-start: 0;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
@container (min-width: 48rem) {
|
|
206
|
+
/*
|
|
207
|
+
* Capped on both axes, and sized by width rather than height.
|
|
208
|
+
*
|
|
209
|
+
* `max-block-size` is what stops the band outgrowing the screen it is supposed to be one of. A
|
|
210
|
+
* sixty-per-cent-wide widescreen picture is four hundred tall on a wide band, and with the claim
|
|
211
|
+
* and the section step above it the band came to a thousand — taller than a viewport, so its own
|
|
212
|
+
* rounded bottom corners scrolled past the fold and the exit animation looked like it was only
|
|
213
|
+
* scaling. It is a `max-`, so it caps without demanding, which is the difference from the
|
|
214
|
+
* `block-size` that pushed the picture over its own button.
|
|
215
|
+
*
|
|
216
|
+
* The reference design writes this as `height: 50vh; aspect-ratio: 1/1`, and reading it across
|
|
217
|
+
* literally was wrong here: a definite block-size on a flex item in a column asks for that height
|
|
218
|
+
* whatever is above it, so the product demanded half the band while the claim and the actions had
|
|
219
|
+
* already spent it. The column overran and the visual rode up over its own button.
|
|
220
|
+
*
|
|
221
|
+
* A width cap cannot do that. The visual takes the height its ratio gives it from the room that
|
|
222
|
+
* is actually left, which is the same picture at every size the band is ever shown at — and the
|
|
223
|
+
* reference's 50vh square lands within a few per cent of it at the widths that matter.
|
|
224
|
+
*/
|
|
225
|
+
:where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__media {
|
|
226
|
+
/*
|
|
227
|
+
* Pushed to the foot of the band by the room left over.
|
|
228
|
+
*
|
|
229
|
+
* `margin-block-start: auto` is what stands the product on the edge: the column fills the band,
|
|
230
|
+
* the claim sits at the top of it under the bar's clearance, and every pixel between them goes
|
|
231
|
+
* above the picture. Aligning the whole column to the end instead would have bunched the claim
|
|
232
|
+
* onto the product with a screen of nothing over it.
|
|
233
|
+
*/
|
|
234
|
+
margin-block-start: auto;
|
|
235
|
+
/*
|
|
236
|
+
* One cap, on the axis the shape is measured from.
|
|
237
|
+
*
|
|
238
|
+
* Capping the height and the width separately is what flattened the portrait: the box took
|
|
239
|
+
* sixty per cent of the column, `aspect.portrait` asked for a height a quarter greater again,
|
|
240
|
+
* and `max-block-size` clamped that back — leaving the width where it was. A ratio clamped on
|
|
241
|
+
* one axis is not a ratio; it is a landscape box that used to be a portrait.
|
|
242
|
+
*
|
|
243
|
+
* So the height's limit is expressed as a width instead, which a square makes exact: the widest
|
|
244
|
+
* the picture may be is the tallest it may be, because `aspect.square` is one to one. A ratio
|
|
245
|
+
* that was not would have to restate itself here as a fraction, and that restatement is the one
|
|
246
|
+
* place the two could drift.
|
|
247
|
+
*
|
|
248
|
+
* Half the band, which is the reference design's own `height: 50vh` — reachable now that the
|
|
249
|
+
* slot is a square, where before it was two numbers that had to be reconciled. It was forty per
|
|
250
|
+
* cent while the picture could ride up over its own button; standing on the foot it cannot, and
|
|
251
|
+
* the band clips, so the ceiling can be what the design asked for.
|
|
252
|
+
*
|
|
253
|
+
* The width guard is the second half of the `min()`, for a window tall enough that half its
|
|
254
|
+
* height is wider than the measure — there the picture would outrun the claim above it.
|
|
255
|
+
*/
|
|
256
|
+
max-inline-size: min(80%, 50cqh);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/*
|
|
260
|
+
* The claim starts below where a navigation bar would be.
|
|
261
|
+
*
|
|
262
|
+
* The band is the first thing on the page and a bar sits over it, so the section's own step is
|
|
263
|
+
* measured from under the bar rather than from the top of the window — `size.bar-height` is what
|
|
264
|
+
* a collapsed one takes, and the step is the band's usual one on top of it. Without this the
|
|
265
|
+
* eyebrow began at the section step and the bar ate it.
|
|
266
|
+
*/
|
|
267
|
+
:where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__inner {
|
|
268
|
+
padding-block-start: calc(var(--size-bar-height) + var(--space-section-default));
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
/*
|
|
274
|
+
* The visual takes its height from that cap and its width from its own ratio, so a wide band
|
|
275
|
+
* does not make it taller. Without the second half of this the cap clipped the picture instead
|
|
276
|
+
* of resizing it.
|
|
277
|
+
*/
|
|
278
|
+
:where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__media > * {
|
|
279
|
+
block-size: 100%;
|
|
280
|
+
inline-size: auto;
|
|
281
|
+
margin-inline: auto;
|
|
282
|
+
max-inline-size: 100%;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
:where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__media img {
|
|
287
|
+
block-size: 100%;
|
|
288
|
+
display: block;
|
|
289
|
+
inline-size: 100%;
|
|
290
|
+
object-fit: cover;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/*
|
|
294
|
+
* The band rounds off as it leaves.
|
|
295
|
+
*
|
|
296
|
+
* Scroll-driven rather than timed: `view()` measures the band against the viewport, so the corner
|
|
297
|
+
* arrives as the reader scrolls and reverses when they scroll back. There is no element entering
|
|
298
|
+
* and no transition to hang it on, which is what puts a keyframed animation in this file rather
|
|
299
|
+
* than in a binding.
|
|
300
|
+
*
|
|
301
|
+
* `radius.expressive` is the corner — the role's own description names high-impact visual sections
|
|
302
|
+
* and banners. Only the two lower corners: the band starts at the top of the document with nothing
|
|
303
|
+
* above it to round away from.
|
|
304
|
+
*/
|
|
305
|
+
@keyframes dds-producthero-exit {
|
|
306
|
+
to {
|
|
307
|
+
border-end-end-radius: var(--radius-expressive);
|
|
308
|
+
border-end-start-radius: var(--radius-expressive);
|
|
309
|
+
scale: var(--motion-scale-band-exit);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
@supports (animation-timeline: view()) {
|
|
314
|
+
:where([data-dds-context="marketing"]) .dds-producthero {
|
|
315
|
+
animation: dds-producthero-exit linear both;
|
|
316
|
+
animation-range: exit 0% exit 40%;
|
|
317
|
+
animation-timeline: view();
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/*
|
|
322
|
+
* A reader who asked for less movement gets none of it.
|
|
323
|
+
*
|
|
324
|
+
* The generated sheet writes a reduced-motion block from its bindings, and this animation is not
|
|
325
|
+
* one of them — it is written here, so its own exception has to be too.
|
|
326
|
+
*/
|
|
327
|
+
@media (prefers-reduced-motion: reduce) {
|
|
328
|
+
:where([data-dds-context="marketing"]) .dds-producthero {
|
|
329
|
+
animation: none;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/*
|
|
334
|
+
* A band in a short container compacts, rather than clipping what it holds.
|
|
335
|
+
*
|
|
336
|
+
* `space.section.default` is 112 top and bottom — 224 of the band before a word is set, which is
|
|
337
|
+
* right at a screen's height and is most of an overview row. The band is as tall as the screen, so
|
|
338
|
+
* it is the screen's height that is asked: a `@media` query, on a real page. The band's own
|
|
339
|
+
* `container-type` is `inline-size`, which cannot answer a height, so a container query alone
|
|
340
|
+
* matched only inside a frame that measures its height — the preview's — and never in production.
|
|
341
|
+
* Both are written: the media query for a page, the container query for a frame. The role already
|
|
342
|
+
* exists for a band that has to be shorter; nothing new is named here.
|
|
343
|
+
*/
|
|
344
|
+
@container (max-height: 40rem) {
|
|
345
|
+
:where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__inner {
|
|
346
|
+
padding-block: var(--space-section-compact);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
@media (max-height: 40rem) {
|
|
351
|
+
:where([data-dds-context="marketing"]) .dds-producthero .dds-producthero__inner {
|
|
352
|
+
padding-block: var(--space-section-compact);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/* GENERATED from testimonialrow.contract.json. Do not edit. */
|
|
2
|
+
|
|
3
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow {
|
|
4
|
+
box-sizing: border-box;
|
|
5
|
+
container-type: inline-size;
|
|
6
|
+
display: flex;
|
|
7
|
+
inline-size: 100%;
|
|
8
|
+
justify-content: center;
|
|
9
|
+
overflow: clip;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__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-testimonialrow .dds-testimonialrow__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-testimonialrow .dds-testimonialrow__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
|
+
max-inline-size: var(--size-measure-heading);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__summary {
|
|
45
|
+
align-items: center;
|
|
46
|
+
display: flex;
|
|
47
|
+
flex-wrap: wrap;
|
|
48
|
+
justify-content: flex-start;
|
|
49
|
+
margin: 0;
|
|
50
|
+
column-gap: var(--space-gap-sm);
|
|
51
|
+
font-family: var(--font-body-md-family);
|
|
52
|
+
font-size: var(--font-body-md-size);
|
|
53
|
+
font-weight: var(--font-body-md-weight);
|
|
54
|
+
letter-spacing: var(--font-body-md-letter-spacing);
|
|
55
|
+
line-height: var(--font-body-md-line-height);
|
|
56
|
+
max-inline-size: var(--size-measure-description);
|
|
57
|
+
row-gap: var(--space-gap-xs);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__carousel {
|
|
61
|
+
display: flex;
|
|
62
|
+
flex-direction: column;
|
|
63
|
+
min-inline-size: 0;
|
|
64
|
+
row-gap: var(--space-gap-xl);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__track {
|
|
68
|
+
transition-property: outline-color, outline-width;
|
|
69
|
+
display: flex;
|
|
70
|
+
outline-style: solid;
|
|
71
|
+
column-gap: var(--space-grid-gutter);
|
|
72
|
+
outline-width: var(--border-width-none);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__review-link {
|
|
76
|
+
transition-property: outline-color, outline-width, translate;
|
|
77
|
+
box-sizing: border-box;
|
|
78
|
+
color: inherit;
|
|
79
|
+
display: flex;
|
|
80
|
+
outline-style: solid;
|
|
81
|
+
text-decoration: none;
|
|
82
|
+
transition-property: translate;
|
|
83
|
+
border-radius: var(--radius-container);
|
|
84
|
+
outline-width: var(--border-width-none);
|
|
85
|
+
transition-duration: var(--motion-duration-normal);
|
|
86
|
+
transition-timing-function: var(--motion-easing-standard);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__item {
|
|
90
|
+
align-items: flex-start;
|
|
91
|
+
box-sizing: border-box;
|
|
92
|
+
display: flex;
|
|
93
|
+
flex-direction: column;
|
|
94
|
+
margin: 0;
|
|
95
|
+
min-inline-size: 0;
|
|
96
|
+
position: relative;
|
|
97
|
+
border-radius: var(--radius-container);
|
|
98
|
+
min-block-size: var(--size-review-card-min);
|
|
99
|
+
padding-block: var(--space-inset-lg);
|
|
100
|
+
padding-inline: var(--space-inset-lg);
|
|
101
|
+
row-gap: var(--space-gap-md);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__rating {
|
|
105
|
+
display: inline-flex;
|
|
106
|
+
flex: none;
|
|
107
|
+
color: var(--color-fg-brand-accent);
|
|
108
|
+
column-gap: var(--space-gap-xs);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__star {
|
|
112
|
+
display: grid;
|
|
113
|
+
flex: none;
|
|
114
|
+
block-size: var(--icon-size-sm);
|
|
115
|
+
inline-size: var(--icon-size-sm);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__star-track {
|
|
119
|
+
display: block;
|
|
120
|
+
opacity: var(--opacity-track);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__star-fill {
|
|
124
|
+
display: block;
|
|
125
|
+
color: var(--color-fg-brand-accent);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__quote {
|
|
129
|
+
margin: 0;
|
|
130
|
+
font-family: var(--font-body-md-family);
|
|
131
|
+
font-size: var(--font-body-md-size);
|
|
132
|
+
font-weight: var(--font-body-md-weight);
|
|
133
|
+
letter-spacing: var(--font-body-md-letter-spacing);
|
|
134
|
+
line-height: var(--font-body-md-line-height);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__author {
|
|
138
|
+
align-items: center;
|
|
139
|
+
display: flex;
|
|
140
|
+
column-gap: var(--space-gap-md);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__name {
|
|
144
|
+
display: block;
|
|
145
|
+
font-family: var(--font-label-lg-family);
|
|
146
|
+
font-size: var(--font-label-lg-size);
|
|
147
|
+
font-weight: var(--font-label-lg-weight);
|
|
148
|
+
letter-spacing: var(--font-label-lg-letter-spacing);
|
|
149
|
+
line-height: var(--font-label-lg-line-height);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__detail {
|
|
153
|
+
display: block;
|
|
154
|
+
font-family: var(--font-body-md-family);
|
|
155
|
+
font-size: var(--font-body-md-size);
|
|
156
|
+
font-weight: var(--font-body-md-weight);
|
|
157
|
+
letter-spacing: var(--font-body-md-letter-spacing);
|
|
158
|
+
line-height: var(--font-body-md-line-height);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__footer {
|
|
162
|
+
align-items: center;
|
|
163
|
+
display: flex;
|
|
164
|
+
row-gap: var(--space-gap-lg);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__nav {
|
|
168
|
+
display: flex;
|
|
169
|
+
flex: none;
|
|
170
|
+
column-gap: var(--space-gap-md);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__nav-slot {
|
|
174
|
+
display: flex;
|
|
175
|
+
border-radius: var(--radius-pill);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__review-link:hover {
|
|
179
|
+
translate: var(--motion-translate-hover);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__review-link:focus-visible {
|
|
183
|
+
outline-color: var(--color-border-focus);
|
|
184
|
+
outline-width: var(--border-width-focus);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow .dds-testimonialrow__track:focus-visible {
|
|
188
|
+
outline-color: var(--color-border-focus);
|
|
189
|
+
outline-width: var(--border-width-focus);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow[data-ground="page"] {
|
|
193
|
+
background-color: var(--color-bg-page);
|
|
194
|
+
color: var(--color-fg-default);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow[data-ground="page"] .dds-testimonialrow__detail {
|
|
198
|
+
color: var(--color-fg-muted);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow[data-ground="page"] .dds-testimonialrow__item {
|
|
202
|
+
background-color: var(--color-bg-surface);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow[data-ground="strong"] {
|
|
206
|
+
background-color: var(--color-bg-brand-strong);
|
|
207
|
+
color: var(--color-fg-on-brand-strong);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow[data-ground="strong"] .dds-testimonialrow__detail {
|
|
211
|
+
color: var(--color-fg-muted-inverse);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow[data-ground="strong"] .dds-testimonialrow__item {
|
|
215
|
+
background-color: var(--color-bg-surface-card-strong);
|
|
216
|
+
color: var(--color-fg-on-brand-strong);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow[data-ground="subtle"] {
|
|
220
|
+
background-color: var(--color-bg-page);
|
|
221
|
+
background-image: linear-gradient(var(--color-bg-band-subtle), var(--color-bg-band-subtle));
|
|
222
|
+
color: var(--color-fg-default);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow[data-ground="subtle"] .dds-testimonialrow__detail {
|
|
226
|
+
color: var(--color-fg-muted);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow[data-ground="subtle"] .dds-testimonialrow__item {
|
|
230
|
+
background-color: var(--color-bg-surface-card-raised);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow[data-ground="strong"] .dds-testimonialrow__review-link:focus-visible {
|
|
234
|
+
outline-color: var(--color-border-focus-on-brand-strong);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow[data-ground="strong"] .dds-testimonialrow__track:focus-visible {
|
|
238
|
+
outline-color: var(--color-border-focus-on-brand-strong);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
@media (prefers-reduced-motion: reduce) {
|
|
242
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow,
|
|
243
|
+
:where([data-dds-context="marketing"]) .dds-testimonialrow * { transition: none !important; }
|
|
244
|
+
}
|
|
245
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import "./TestimonialRow.css";
|
|
2
|
+
import "./testimonial-row-impl.css";
|
|
3
|
+
import "../block-reveal.css";
|
|
4
|
+
import { type TestimonialRowProps } from "./TestimonialRow.types.js";
|
|
5
|
+
export type { TestimonialRowProps };
|
|
6
|
+
/**
|
|
7
|
+
* A heading over a row of rated reviews, stepped through by the reader — the reference site's
|
|
8
|
+
* Testimonial in its review-row form, named for no review service.
|
|
9
|
+
*
|
|
10
|
+
* The browser does the scrolling and the snapping; this only reads where the row is, so each arrow
|
|
11
|
+
* is offered while it has somewhere to go. Read on scroll and on resize — a row that grows wide
|
|
12
|
+
* enough to hold every card has nowhere to go in either direction, and the arrows go with it.
|
|
13
|
+
*
|
|
14
|
+
* Nothing here moves on its own, which is the difference from TestimonialSlider: several cards are in
|
|
15
|
+
* view at once, so there is no "next" for a timer to bring.
|
|
16
|
+
*
|
|
17
|
+
* `'use client'` for the row's scroll position, the arrival, and `useId`, which names the region
|
|
18
|
+
* by its heading.
|
|
19
|
+
*/
|
|
20
|
+
export declare function TestimonialRow({ ground, title, reviews, summary, ratingLabel, label, previousLabel, nextLabel, }: TestimonialRowProps): import("react").JSX.Element | null;
|