@deriv-com/dds-marketing 1.1.3 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.llm/components/accordion.md +6 -0
- package/.llm/components/accordionitem.md +6 -0
- package/.llm/components/aspectratio.md +6 -0
- package/.llm/components/awards.md +6 -0
- package/.llm/components/background.md +49 -10
- package/.llm/components/badge.md +6 -0
- package/.llm/components/bottomsheet.md +6 -0
- package/.llm/components/breadcrumb.md +6 -0
- package/.llm/components/breadcrumbitem.md +6 -0
- package/.llm/components/button.md +9 -3
- package/.llm/components/buttonicon.md +7 -1
- package/.llm/components/card.md +6 -0
- package/.llm/components/cardbody.md +7 -1
- package/.llm/components/cardbutton.md +6 -0
- package/.llm/components/checkbox.md +6 -0
- package/.llm/components/comparisoncards.md +9 -3
- package/.llm/components/comparisontable.md +6 -0
- package/.llm/components/ctabanner.md +6 -0
- package/.llm/components/ctabannerslider.md +6 -0
- package/.llm/components/datatable.md +6 -0
- package/.llm/components/divider.md +6 -0
- package/.llm/components/documentlink.md +237 -0
- package/.llm/components/documents.md +268 -0
- package/.llm/components/downloadbanner.md +7 -1
- package/.llm/components/dropdownmenu.md +6 -0
- package/.llm/components/estimator.md +6 -0
- package/.llm/components/faqaccordion.md +6 -0
- package/.llm/components/featurebullets.md +6 -0
- package/.llm/components/featurecards.md +42 -2
- package/.llm/components/featurecardscarousel.md +7 -1
- package/.llm/components/featurescroll.md +6 -0
- package/.llm/components/featuresplit.md +6 -0
- package/.llm/components/featurestack.md +6 -0
- package/.llm/components/featuretabs.md +369 -0
- package/.llm/components/filterchip.md +6 -0
- package/.llm/components/footer.md +6 -0
- package/.llm/components/footergroup.md +6 -0
- package/.llm/components/grid.md +30 -1
- package/.llm/components/icon.md +6 -0
- package/.llm/components/illustrationcard.md +52 -2
- package/.llm/components/illustrationcheck.md +193 -0
- package/.llm/components/illustrationchoice.md +187 -0
- package/.llm/components/illustrationcode.md +192 -0
- package/.llm/components/illustrationlist.md +175 -0
- package/.llm/components/illustrationscene.md +29 -3
- package/.llm/components/imagebanner.md +30 -5
- package/.llm/components/landinghero.md +6 -0
- package/.llm/components/link.md +7 -1
- package/.llm/components/logocolumns.md +7 -1
- package/.llm/components/logorows.md +42 -2
- package/.llm/components/menuitem.md +6 -0
- package/.llm/components/navbar.md +6 -0
- package/.llm/components/navbaritem.md +6 -0
- package/.llm/components/navbarmenu.md +6 -0
- package/.llm/components/navbarmenugroup.md +6 -0
- package/.llm/components/navbarpanel.md +6 -0
- package/.llm/components/navbarswitcher.md +6 -0
- package/.llm/components/navbarswitcheroption.md +6 -0
- package/.llm/components/option.md +6 -0
- package/.llm/components/pageheader.md +6 -0
- package/.llm/components/pagination.md +6 -0
- package/.llm/components/paginationdots.md +6 -0
- package/.llm/components/producthero.md +29 -4
- package/.llm/components/progressbar.md +305 -0
- package/.llm/components/removablechip.md +6 -0
- package/.llm/components/resourcebanner.md +6 -0
- package/.llm/components/row.md +6 -0
- package/.llm/components/scenescroll.md +38 -24
- package/.llm/components/scenescrollword.md +267 -0
- package/.llm/components/scroller.md +6 -0
- package/.llm/components/searchinput.md +6 -0
- package/.llm/components/segmentedcontrol.md +28 -1
- package/.llm/components/segmentedcontrolitem.md +6 -0
- package/.llm/components/select.md +6 -0
- package/.llm/components/selectchip.md +6 -0
- package/.llm/components/spinner.md +6 -0
- package/.llm/components/stack.md +6 -0
- package/.llm/components/stats.md +46 -1
- package/.llm/components/statscarousel.md +227 -0
- package/.llm/components/statusdot.md +41 -1
- package/.llm/components/steps.md +6 -0
- package/.llm/components/stickycards.md +6 -0
- package/.llm/components/subdomainnavbar.md +6 -0
- package/.llm/components/tab.md +6 -0
- package/.llm/components/table.md +6 -0
- package/.llm/components/tablebody.md +6 -0
- package/.llm/components/tablecell.md +6 -0
- package/.llm/components/tablehead.md +6 -0
- package/.llm/components/tableheadercell.md +6 -0
- package/.llm/components/tablerow.md +6 -0
- package/.llm/components/tablist.md +6 -0
- package/.llm/components/teamgrid.md +6 -0
- package/.llm/components/testimonialrow.md +43 -3
- package/.llm/components/testimonialslider.md +8 -2
- package/.llm/components/textarea.md +6 -0
- package/.llm/components/textinput.md +6 -0
- package/.llm/components/textscroll.md +6 -0
- package/.llm/components/tiers.md +13 -7
- package/.llm/components/tooltip.md +6 -0
- package/.llm/components/typography.md +63 -1
- package/.llm/digest/background.md +14 -6
- package/.llm/digest/button.md +1 -1
- package/.llm/digest/buttonicon.md +1 -1
- package/.llm/digest/documentlink.md +52 -0
- package/.llm/digest/documents.md +51 -0
- package/.llm/digest/downloadbanner.md +1 -1
- package/.llm/digest/featurecards.md +7 -0
- package/.llm/digest/featuretabs.md +50 -0
- package/.llm/digest/grid.md +1 -0
- package/.llm/digest/illustrationcard.md +6 -1
- package/.llm/digest/illustrationcheck.md +42 -0
- package/.llm/digest/illustrationchoice.md +43 -0
- package/.llm/digest/illustrationcode.md +41 -0
- package/.llm/digest/illustrationlist.md +38 -0
- package/.llm/digest/illustrationscene.md +4 -2
- package/.llm/digest/imagebanner.md +9 -3
- package/.llm/digest/logocolumns.md +1 -1
- package/.llm/digest/logorows.md +8 -1
- package/.llm/digest/producthero.md +8 -2
- package/.llm/digest/progressbar.md +56 -0
- package/.llm/digest/scenescroll.md +6 -5
- package/.llm/digest/scenescrollword.md +56 -0
- package/.llm/digest/segmentedcontrol.md +3 -0
- package/.llm/digest/stats.md +8 -0
- package/.llm/digest/statscarousel.md +48 -0
- package/.llm/digest/statusdot.md +7 -0
- package/.llm/digest/testimonialrow.md +8 -1
- package/.llm/digest/testimonialslider.md +1 -1
- package/.llm/digest/typography.md +18 -0
- package/.llm/index.md +14 -4
- package/.llm/rules.md +10 -0
- package/.llm/tokens.md +12 -3
- package/AGENTS.md +13 -2
- package/dist/components/arrival.d.ts +32 -0
- package/dist/components/arrival.js +140 -0
- package/dist/components/arrives.d.ts +17 -0
- package/dist/components/arrives.js +14 -0
- package/dist/components/blocks/awards/Awards.js +2 -27
- package/dist/components/blocks/block-pattern.css +23 -0
- package/dist/components/blocks/comparison-cards/comparison-cards-impl.css +29 -0
- package/dist/components/blocks/documents/Documents.css +90 -0
- package/dist/components/blocks/documents/Documents.d.ts +22 -0
- package/dist/components/blocks/documents/Documents.js +30 -0
- package/dist/components/blocks/documents/Documents.types.d.ts +37 -0
- package/dist/components/blocks/documents/Documents.types.js +14 -0
- package/dist/components/blocks/documents/documents-impl.css +103 -0
- package/dist/components/blocks/download-banner/DownloadBanner.css +1 -1
- package/dist/components/blocks/download-banner/DownloadBanner.types.d.ts +1 -1
- package/dist/components/blocks/feature-cards/FeatureCards.d.ts +2 -1
- package/dist/components/blocks/feature-cards/FeatureCards.js +10 -7
- package/dist/components/blocks/feature-cards/FeatureCards.types.d.ts +9 -1
- package/dist/components/blocks/feature-cards/feature-cards-impl.css +15 -3
- package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.d.ts +1 -1
- package/dist/components/blocks/feature-cards-carousel/feature-cards-carousel-impl.css +12 -0
- package/dist/components/blocks/feature-tabs/FeatureTabs.css +100 -0
- package/dist/components/blocks/feature-tabs/FeatureTabs.d.ts +23 -0
- package/dist/components/blocks/feature-tabs/FeatureTabs.js +38 -0
- package/dist/components/blocks/feature-tabs/FeatureTabs.types.d.ts +35 -0
- package/dist/components/blocks/feature-tabs/FeatureTabs.types.js +14 -0
- package/dist/components/blocks/feature-tabs/feature-tabs-impl.css +53 -0
- package/dist/components/blocks/image-banner/ImageBanner.css +1 -1
- package/dist/components/blocks/image-banner/ImageBanner.d.ts +1 -1
- package/dist/components/blocks/image-banner/ImageBanner.js +2 -2
- package/dist/components/blocks/image-banner/ImageBanner.types.d.ts +9 -7
- package/dist/components/blocks/image-banner/ImageBanner.types.js +1 -1
- package/dist/components/blocks/image-banner/image-banner-impl.css +77 -26
- package/dist/components/blocks/laurel.d.ts +16 -0
- package/dist/components/blocks/laurel.js +28 -0
- package/dist/components/blocks/logo-columns/LogoColumns.css +1 -1
- package/dist/components/blocks/logo-columns/LogoColumns.types.d.ts +1 -1
- package/dist/components/blocks/logo-rows/LogoRows.css +1 -1
- package/dist/components/blocks/logo-rows/LogoRows.d.ts +2 -1
- package/dist/components/blocks/logo-rows/LogoRows.js +7 -4
- package/dist/components/blocks/logo-rows/LogoRows.types.d.ts +9 -1
- package/dist/components/blocks/pattern-tone.d.ts +11 -0
- package/dist/components/blocks/pattern-tone.js +7 -0
- package/dist/components/blocks/product-hero/ProductHero.d.ts +1 -1
- package/dist/components/blocks/product-hero/ProductHero.js +2 -2
- package/dist/components/blocks/product-hero/ProductHero.types.d.ts +8 -3
- package/dist/components/blocks/product-hero/ProductHero.types.js +1 -1
- package/dist/components/blocks/product-hero/product-hero-impl.css +54 -0
- package/dist/components/blocks/resource-banner/ResourceBanner.css +1 -1
- package/dist/components/blocks/scene-scroll/SceneScroll.css +1 -1
- package/dist/components/blocks/scene-scroll/SceneScroll.d.ts +6 -5
- package/dist/components/blocks/scene-scroll/SceneScroll.js +8 -7
- package/dist/components/blocks/scene-scroll/SceneScroll.types.d.ts +5 -5
- package/dist/components/blocks/scene-scroll/SceneScroll.types.js +1 -1
- package/dist/components/blocks/scene-scroll/scene-scroll-impl.css +61 -44
- package/dist/components/blocks/scene-scroll-word/SceneScrollWord.css +105 -0
- package/dist/components/blocks/scene-scroll-word/SceneScrollWord.d.ts +31 -0
- package/dist/components/blocks/scene-scroll-word/SceneScrollWord.js +67 -0
- package/dist/components/blocks/scene-scroll-word/SceneScrollWord.types.d.ts +39 -0
- package/dist/components/blocks/scene-scroll-word/SceneScrollWord.types.js +18 -0
- package/dist/components/blocks/scene-scroll-word/scene-scroll-word-impl.css +370 -0
- package/dist/components/blocks/stats/Stats.d.ts +2 -1
- package/dist/components/blocks/stats/Stats.js +17 -14
- package/dist/components/blocks/stats/Stats.types.d.ts +8 -0
- package/dist/components/blocks/stats/stats-impl.css +4 -1
- package/dist/components/blocks/stats/use-wheel.d.ts +1 -1
- package/dist/components/blocks/stats/use-wheel.js +8 -4
- package/dist/components/blocks/stats-carousel/StatsCarousel.css +209 -0
- package/dist/components/blocks/stats-carousel/StatsCarousel.d.ts +20 -0
- package/dist/components/blocks/stats-carousel/StatsCarousel.js +48 -0
- package/dist/components/blocks/stats-carousel/StatsCarousel.types.d.ts +43 -0
- package/dist/components/blocks/stats-carousel/StatsCarousel.types.js +23 -0
- package/dist/components/blocks/stats-carousel/stats-carousel-impl.css +233 -0
- package/dist/components/blocks/sticky-cards/sticky-cards-impl.css +8 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.css +1 -1
- package/dist/components/blocks/testimonial-row/TestimonialRow.d.ts +2 -1
- package/dist/components/blocks/testimonial-row/TestimonialRow.js +16 -13
- package/dist/components/blocks/testimonial-row/TestimonialRow.types.d.ts +9 -1
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.css +1 -1
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.d.ts +1 -1
- package/dist/components/blocks/tiers/Tiers.types.d.ts +1 -1
- package/dist/components/core/background/Background.css +19 -0
- package/dist/components/core/background/Background.types.d.ts +2 -1
- package/dist/components/core/background/background-impl.css +47 -15
- package/dist/components/core/background/halftone.js +1 -1
- package/dist/components/core/button/Button.css +5 -5
- package/dist/components/core/button-icon/ButtonIcon.types.d.ts +1 -1
- package/dist/components/core/card-body/CardBody.css +5 -0
- package/dist/components/core/card-body/CardBody.types.d.ts +1 -1
- package/dist/components/core/document-link/DocumentLink.css +59 -0
- package/dist/components/core/document-link/DocumentLink.d.ts +19 -0
- package/dist/components/core/document-link/DocumentLink.js +21 -0
- package/dist/components/core/document-link/DocumentLink.types.d.ts +41 -0
- package/dist/components/core/document-link/DocumentLink.types.js +11 -0
- package/dist/components/core/document-link/document-link-impl.css +23 -0
- package/dist/components/core/illustration-card/IllustrationCard.css +7 -0
- package/dist/components/core/illustration-card/IllustrationCard.d.ts +5 -1
- package/dist/components/core/illustration-card/IllustrationCard.js +34 -8
- package/dist/components/core/illustration-card/IllustrationCard.types.d.ts +8 -1
- package/dist/components/core/illustration-card/IllustrationCard.types.js +1 -0
- package/dist/components/core/illustration-card/illustration-card-impl.css +113 -0
- package/dist/components/core/illustration-check/IllustrationCheck.css +25 -0
- package/dist/components/core/illustration-check/IllustrationCheck.d.ts +16 -0
- package/dist/components/core/illustration-check/IllustrationCheck.js +22 -0
- package/dist/components/core/illustration-check/IllustrationCheck.types.d.ts +25 -0
- package/dist/components/core/illustration-check/IllustrationCheck.types.js +9 -0
- package/dist/components/core/illustration-check/illustration-check-impl.css +76 -0
- package/dist/components/core/illustration-choice/IllustrationChoice.css +62 -0
- package/dist/components/core/illustration-choice/IllustrationChoice.d.ts +16 -0
- package/dist/components/core/illustration-choice/IllustrationChoice.js +31 -0
- package/dist/components/core/illustration-choice/IllustrationChoice.types.d.ts +25 -0
- package/dist/components/core/illustration-choice/IllustrationChoice.types.js +11 -0
- package/dist/components/core/illustration-choice/illustration-choice-impl.css +103 -0
- package/dist/components/core/illustration-code/IllustrationCode.css +25 -0
- package/dist/components/core/illustration-code/IllustrationCode.d.ts +12 -0
- package/dist/components/core/illustration-code/IllustrationCode.js +20 -0
- package/dist/components/core/illustration-code/IllustrationCode.types.d.ts +23 -0
- package/dist/components/core/illustration-code/IllustrationCode.types.js +8 -0
- package/dist/components/core/illustration-code/illustration-code-impl.css +42 -0
- package/dist/components/core/illustration-list/IllustrationList.css +19 -0
- package/dist/components/core/illustration-list/IllustrationList.d.ts +16 -0
- package/dist/components/core/illustration-list/IllustrationList.js +18 -0
- package/dist/components/core/illustration-list/IllustrationList.types.d.ts +15 -0
- package/dist/components/core/illustration-list/IllustrationList.types.js +6 -0
- package/dist/components/core/illustration-list/illustration-list-impl.css +52 -0
- package/dist/components/core/illustration-scene/IllustrationScene.css +6 -0
- package/dist/components/core/illustration-scene/IllustrationScene.d.ts +3 -2
- package/dist/components/core/illustration-scene/IllustrationScene.js +4 -3
- package/dist/components/core/illustration-scene/IllustrationScene.types.d.ts +5 -1
- package/dist/components/core/illustration-scene/IllustrationScene.types.js +2 -1
- package/dist/components/core/illustration-scene/illustration-scene-impl.css +65 -0
- package/dist/components/core/link/link-impl.css +5 -19
- package/dist/components/core/progress-bar/ProgressBar.css +101 -0
- package/dist/components/core/progress-bar/ProgressBar.d.ts +5 -0
- package/dist/components/core/progress-bar/ProgressBar.js +34 -0
- package/dist/components/core/progress-bar/ProgressBar.types.d.ts +52 -0
- package/dist/components/core/progress-bar/ProgressBar.types.js +12 -0
- package/dist/components/core/progress-bar/progress-bar-impl.css +45 -0
- package/dist/components/core/segmented-control/SegmentedControl.d.ts +1 -1
- package/dist/components/core/segmented-control/SegmentedControl.js +13 -5
- package/dist/components/core/segmented-control/SegmentedControl.types.d.ts +5 -1
- package/dist/components/core/segmented-control/segmented-control-impl.css +35 -0
- package/dist/components/core/status-dot/StatusDot.d.ts +1 -1
- package/dist/components/core/status-dot/StatusDot.js +7 -4
- package/dist/components/core/status-dot/StatusDot.types.d.ts +9 -1
- package/dist/components/core/status-dot/status-dot-impl.css +101 -0
- package/dist/components/core/typography/Typography.d.ts +3 -283
- package/dist/components/core/typography/Typography.js +9 -1
- package/dist/components/core/typography/Typography.types.d.ts +9 -15
- package/dist/components/core/typography/TypographyMotion.d.ts +28 -0
- package/dist/components/core/typography/TypographyMotion.js +43 -0
- package/dist/components/core/typography/typography-impl.css +106 -0
- package/dist/components/illustration-data.d.ts +15 -0
- package/dist/components/illustration-data.js +7 -0
- package/dist/components/index.d.ts +22 -1
- package/dist/components/index.js +20 -0
- package/dist/components/layout/grid/Grid.css +5 -0
- package/dist/components/layout/grid/Grid.types.d.ts +2 -1
- package/dist/components/scene-scroll-data.d.ts +35 -0
- package/dist/components/tiers-data.d.ts +3 -2
- package/dist/marketing.css +24 -6
- package/package.json +1 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The reference design's laurel, the vector its Stats section draws, in one colour — shared by the
|
|
3
|
+
* blocks that frame an award with it, so an award looks the same wherever a page shows one.
|
|
4
|
+
*
|
|
5
|
+
* The left-hand branch: its leaves curl up and in toward whatever stands to its right. The second
|
|
6
|
+
* branch is this one mirrored, by each block's stylesheet, so one drawing serves both sides and a
|
|
7
|
+
* right-to-left page can swap which side is mirrored without a second picture. The reference laid it
|
|
8
|
+
* at a fifth of its strength; here it takes the band's quieter ink instead, a colour role rather than
|
|
9
|
+
* an alpha, so it follows the ground the way every other quiet thing in the package does.
|
|
10
|
+
*/
|
|
11
|
+
export declare const LAUREL_PATHS: string[];
|
|
12
|
+
/** One laurel branch, carrying the class of the block that draws it. Decoration: hidden from assistive technology and never focusable. */
|
|
13
|
+
export declare function Laurel({ className, side }: {
|
|
14
|
+
className: string;
|
|
15
|
+
side: 'leading' | 'trailing';
|
|
16
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The reference design's laurel, the vector its Stats section draws, in one colour — shared by the
|
|
4
|
+
* blocks that frame an award with it, so an award looks the same wherever a page shows one.
|
|
5
|
+
*
|
|
6
|
+
* The left-hand branch: its leaves curl up and in toward whatever stands to its right. The second
|
|
7
|
+
* branch is this one mirrored, by each block's stylesheet, so one drawing serves both sides and a
|
|
8
|
+
* right-to-left page can swap which side is mirrored without a second picture. The reference laid it
|
|
9
|
+
* at a fifth of its strength; here it takes the band's quieter ink instead, a colour role rather than
|
|
10
|
+
* an alpha, so it follows the ground the way every other quiet thing in the package does.
|
|
11
|
+
*/
|
|
12
|
+
export const LAUREL_PATHS = [
|
|
13
|
+
'M20.8655 76.0151C21.3631 78.5487 22.4577 80.4673 23.4245 81.7447C23.7945 82.2337 24.145 82.6275 24.4343 82.9245C24.5003 81.0424 24.5392 77.0209 23.854 73.543C23.3836 71.2282 22.6189 69.4263 21.9723 68.1997C21.7486 67.7754 21.539 67.42 21.3608 67.1361C21.2158 67.6487 21.042 68.3446 20.8935 69.1718C20.5634 71.0111 20.3623 73.4782 20.8655 76.0151Z',
|
|
14
|
+
'M9.19518 69.4464C8.5612 69.2311 8.01354 69.0792 7.6041 68.9776C7.77674 69.5261 8.03563 70.2542 8.40971 71.0711C9.16156 72.713 10.3603 74.6729 12.1472 76.0342C13.9141 77.3864 15.8077 77.7752 17.2669 77.8239C17.9963 77.8483 18.6126 77.7873 19.0419 77.7209C18.3715 76.5307 16.6347 73.8279 14.0892 71.9349C12.4167 70.7081 10.6015 69.924 9.19518 69.4464Z',
|
|
15
|
+
'M14.1789 62.4853C14.1095 65.0056 14.7018 67.1343 15.3106 68.6265C15.5268 69.1563 15.7445 69.6045 15.9342 69.9597C16.0737 69.4242 16.2473 68.7196 16.4239 67.9038C16.8294 66.0308 17.2467 63.5892 17.309 61.2688C17.3584 58.9612 17.0322 57.019 16.6942 55.65C16.5809 55.1908 16.4663 54.7965 16.3643 54.4749C16.1414 54.8952 15.8702 55.4487 15.5956 56.1107C14.9268 57.7233 14.2444 59.9642 14.1789 62.4853Z',
|
|
16
|
+
'M6.16644 56.5363L5.92729 56.2113C4.18123 53.9739 2.10237 52.4221 0.99942 51.685C1.0448 52.2219 1.13195 52.9558 1.29599 53.7969C1.6458 55.5904 2.33816 57.834 3.68889 59.699C5.02796 61.5534 6.66938 62.5331 7.97363 63.0496C8.56984 63.2857 9.09434 63.4244 9.48448 63.5049C9.08235 62.1271 8.06278 59.1136 6.16644 56.5363Z',
|
|
17
|
+
'M12.9202 41.9556C12.9103 41.468 12.8857 41.0438 12.8578 40.6964C12.5852 41.0139 12.2554 41.4254 11.9043 41.9234C10.9787 43.2365 9.91222 45.1415 9.34811 47.5086L9.21888 48.0509C8.78948 50.2094 8.89878 52.2002 9.13088 53.6853C9.21855 54.2463 9.32345 54.7333 9.42253 55.1275C10.2101 53.5777 11.6117 50.5783 12.3444 47.5177C12.8519 45.3454 12.9491 43.3817 12.9202 41.9556Z',
|
|
18
|
+
'M4.26838 40.1575C3.16507 37.3338 1.55966 35.0449 0.658674 33.8839C0.595099 34.3962 0.53299 35.0674 0.509766 35.8425C0.454879 37.6743 0.618233 40.0556 1.46849 42.2871C2.30759 44.5064 3.60611 45.9871 4.68907 46.9107C5.12959 47.2864 5.53393 47.5694 5.85602 47.7717C5.82536 47.3041 5.77132 46.6715 5.67501 45.9295C5.46619 44.3205 5.06044 42.211 4.27156 40.1569L4.26838 40.1575Z',
|
|
19
|
+
'M12.6632 27.4606C11.6314 28.3597 10.3804 29.7129 9.40352 31.5834L9.20135 32.004C8.19489 34.0975 7.83678 36.2499 7.73379 37.8807C7.69736 38.4576 7.693 38.9667 7.70264 39.3814C7.98105 39.0479 8.31846 38.6306 8.68777 38.1462C9.68653 36.8365 10.9078 35.0512 11.829 33.1204C12.7356 31.1936 13.238 29.3215 13.5154 27.9233C13.6157 27.4178 13.6864 26.9753 13.7361 26.6158C13.4324 26.8302 13.0648 27.1106 12.6632 27.4606Z',
|
|
20
|
+
'M7.15889 23.0454L7.23043 22.5253C7.54518 19.6881 7.36017 17.0948 7.19664 15.6517C6.9244 16.0575 6.59747 16.5777 6.25738 17.1905C5.37216 18.7855 4.41002 20.986 4.07631 23.4177C3.74032 25.8399 4.108 27.8499 4.55657 29.25C4.7215 29.7648 4.89717 30.1965 5.05235 30.5349C5.64762 29.1157 6.71893 26.2445 7.15889 23.0454Z',
|
|
21
|
+
'M20.7056 14.8951C19.4372 15.269 17.7724 15.9875 16.1554 17.3693L16.021 17.4932C14.3576 18.9542 13.2217 20.7665 12.5041 22.2202C12.2403 22.7546 12.0346 23.2374 11.8812 23.6318C12.2297 23.4596 12.6507 23.2423 13.1195 22.9822C14.4495 22.2442 16.1506 21.1686 17.6705 19.808C19.177 18.446 20.3493 16.9414 21.1512 15.7693C21.4549 15.3255 21.7047 14.9307 21.8987 14.6109C21.5673 14.6707 21.1626 14.7604 20.7056 14.8951Z',
|
|
22
|
+
'M15.246 9.89451L15.3989 9.48769C16.3817 6.71545 16.8681 4.08928 17.0948 2.56556C16.7641 2.88544 16.3703 3.28963 15.9481 3.76978C14.7583 5.12276 13.3571 7.06214 12.4902 9.40367C11.6163 11.7394 11.483 13.8564 11.5665 15.3854C11.595 15.9081 11.6489 16.3613 11.7069 16.7298C11.9415 16.3768 12.2271 15.9318 12.5414 15.4103C13.3841 14.0121 14.4266 12.0747 15.246 9.89451Z',
|
|
23
|
+
'M24.236 2.86551C22.4046 4.24716 21.0854 6.09763 20.225 7.6144C19.8673 8.24502 19.5916 8.81333 19.3933 9.25894C19.765 9.11933 20.2233 8.93634 20.7396 8.70812C22.1292 8.09394 23.9267 7.15785 25.5896 5.86671C27.2408 4.56435 28.6049 3.04428 29.5633 1.84034C29.9762 1.32163 30.3123 0.863542 30.5622 0.509562C30.206 0.526204 29.7564 0.567871 29.2396 0.659382C27.8788 0.900297 26.0564 1.48555 24.236 2.86551Z',
|
|
24
|
+
];
|
|
25
|
+
/** One laurel branch, carrying the class of the block that draws it. Decoration: hidden from assistive technology and never focusable. */
|
|
26
|
+
export function Laurel({ className, side }) {
|
|
27
|
+
return (_jsx("svg", { className: className, "data-side": side, viewBox: "0 0 32 84", fill: "none", "aria-hidden": "true", focusable: "false", children: LAUREL_PATHS.map((d) => (_jsx("path", { d: d, fill: "currentColor", stroke: "currentColor" }, d))) }));
|
|
28
|
+
}
|
|
@@ -143,7 +143,7 @@
|
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
:where([data-dds-context="marketing"]) .dds-logocolumns[data-ground="strong"] .dds-logocolumns__logo {
|
|
146
|
-
background-color: var(--color-bg-surface-card-strong);
|
|
146
|
+
background-color: var(--color-bg-surface-card-strong-on-brand-strong);
|
|
147
147
|
}
|
|
148
148
|
|
|
149
149
|
:where([data-dds-context="marketing"]) .dds-logocolumns[data-ground="subtle"] {
|
|
@@ -4,7 +4,7 @@ export interface LogoColumnsOwnProps {
|
|
|
4
4
|
/**
|
|
5
5
|
* `page` — The page's own white, with tiles at the recessed gray. For full-colour logos drawn for a light ground
|
|
6
6
|
* `subtle` — The grey band, with white tiles on it. For full-colour logos, where the section needs setting apart from the ones around it. Painted as the band's tint over the page's own ground, so it is the same grey whatever is behind the section
|
|
7
|
-
* `strong` — The default. `color.bg.brand-strong`, the dark band, with white words and tiles at color.bg.surface-card-strong —
|
|
7
|
+
* `strong` — The default. `color.bg.brand-strong`, the dark band, with white words and tiles at color.bg.surface-card-strong-on-brand-strong — slate.850 in light and slate.900 in dark, a step above the band in both, so the wall is a set of tiles a step lighter than the band. The ground white wordmarks are drawn for
|
|
8
8
|
*/
|
|
9
9
|
ground?: 'page' | 'subtle' | 'strong';
|
|
10
10
|
/**
|
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
:where([data-dds-context="marketing"]) .dds-logorows[data-ground="strong"] .dds-logorows__logo {
|
|
111
|
-
background-color: var(--color-bg-surface-card-strong);
|
|
111
|
+
background-color: var(--color-bg-surface-card-strong-on-brand-strong);
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
:where([data-dds-context="marketing"]) .dds-logorows[data-ground="subtle"] {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import './LogoRows.css';
|
|
2
2
|
import './logo-rows-impl.css';
|
|
3
3
|
import '../block-reveal.css';
|
|
4
|
+
import '../block-pattern.css';
|
|
4
5
|
import { type LogoRowsProps } from './LogoRows.types.js';
|
|
5
6
|
export type { LogoRowsProps };
|
|
6
7
|
/**
|
|
@@ -17,4 +18,4 @@ export type { LogoRowsProps };
|
|
|
17
18
|
* the first set is announced, so a screen reader hears each name once. The title carries the
|
|
18
19
|
* section's accessible name through `aria-labelledby`.
|
|
19
20
|
*/
|
|
20
|
-
export declare function LogoRows({ ground, title, description, link, logos, }: LogoRowsProps): import("react").JSX.Element | null;
|
|
21
|
+
export declare function LogoRows({ ground, background, title, description, link, logos, }: LogoRowsProps): import("react").JSX.Element | null;
|
|
@@ -4,8 +4,11 @@ import { useId } from 'react';
|
|
|
4
4
|
import './LogoRows.css';
|
|
5
5
|
import './logo-rows-impl.css';
|
|
6
6
|
import '../block-reveal.css';
|
|
7
|
+
import '../block-pattern.css';
|
|
7
8
|
import { arriving, useReveal } from '../use-reveal.js';
|
|
8
9
|
import { given } from '../../given.js';
|
|
10
|
+
import { Background } from '../../core/background/Background.js';
|
|
11
|
+
import { PATTERN_TONE } from '../pattern-tone.js';
|
|
9
12
|
import { logoRowsDefaults, logoRowsParts, } from './LogoRows.types.js';
|
|
10
13
|
/**
|
|
11
14
|
* How many times each row is drawn. A row moves by one set across the rail's pass, so the end of
|
|
@@ -27,7 +30,7 @@ const SETS = 4;
|
|
|
27
30
|
* the first set is announced, so a screen reader hears each name once. The title carries the
|
|
28
31
|
* section's accessible name through `aria-labelledby`.
|
|
29
32
|
*/
|
|
30
|
-
export function LogoRows({ ground = logoRowsDefaults.ground, title, description, link, logos, }) {
|
|
33
|
+
export function LogoRows({ ground = logoRowsDefaults.ground, background, title, description, link, logos, }) {
|
|
31
34
|
const titleId = useId();
|
|
32
35
|
const [band, revealed] = useReveal();
|
|
33
36
|
// Nothing to show is nothing drawn: a row with no logo on it is a claim with no evidence.
|
|
@@ -37,7 +40,7 @@ export function LogoRows({ ground = logoRowsDefaults.ground, title, description,
|
|
|
37
40
|
logos.filter((_, at) => at % 2 === 0),
|
|
38
41
|
logos.filter((_, at) => at % 2 === 1),
|
|
39
42
|
];
|
|
40
|
-
return (
|
|
41
|
-
|
|
42
|
-
|
|
43
|
+
return (_jsxs("section", { className: logoRowsParts.root, "data-ground": ground, "data-background": background, "aria-labelledby": titleId, children: [background ? _jsx(Background, { tone: PATTERN_TONE[ground], pattern: background, children: null }) : null, _jsxs("div", { className: logoRowsParts.inner, ref: band, "data-revealed": revealed, children: [_jsxs("div", { className: logoRowsParts.header, children: [_jsx("h2", { className: logoRowsParts.title, id: titleId, ...arriving(0), children: title }), given(description) ? (_jsx("p", { className: logoRowsParts.description, ...arriving(1), children: description })) : null, link ? (_jsx("div", { className: logoRowsParts.link, ...arriving(2), children: link })) : null] }), _jsx("div", { className: logoRowsParts.rail, ...arriving(3), children: rows.map((row, at) => row.length === 0 ? null : (_jsx("ul", { className: logoRowsParts.track, "data-row": at === 0 ? 'leading' : 'trailing', children: Array.from({ length: SETS }, (_, set) => row.map((logo, index) => (
|
|
44
|
+
// A logo's place is its identity: the list is the page's, and nothing reorders it.
|
|
45
|
+
_jsx("li", { className: logoRowsParts.logo, "aria-hidden": set === 0 ? undefined : 'true', children: _jsx("img", { className: logoRowsParts['logo-image'], src: logo.src, alt: logo.name, draggable: false }) }, `${set}-${index}`)))) }, at))) })] })] }));
|
|
43
46
|
}
|
|
@@ -4,9 +4,17 @@ export interface LogoRowsOwnProps {
|
|
|
4
4
|
/**
|
|
5
5
|
* `page` — The page's own white, with tiles at the recessed gray. For full-colour logos drawn for a light ground
|
|
6
6
|
* `subtle` — The grey band, with white tiles on it. For full-colour logos, where the section needs setting apart from the ones around it. Painted as the band's tint over the page's own ground, so it is the same grey whatever is behind the section
|
|
7
|
-
* `strong` — The default. `color.bg.brand-strong`, the dark band, with white words and tiles at color.bg.surface-card-strong —
|
|
7
|
+
* `strong` — The default. `color.bg.brand-strong`, the dark band, with white words and tiles at color.bg.surface-card-strong-on-brand-strong — slate.850 in light and slate.900 in dark, a step above the band in both, so the row is a set of tiles a step lighter than the band. The ground white wordmarks are drawn for
|
|
8
8
|
*/
|
|
9
9
|
ground?: 'page' | 'subtle' | 'strong';
|
|
10
|
+
/**
|
|
11
|
+
* `halftone` — A field of coral dots that grow towards a soft glow at the band's foot and settle to a fine screen away from it.
|
|
12
|
+
* `aurora` — Curtains of the brand's light rising from the band's foot and swaying slowly.
|
|
13
|
+
* `mesh` — The band in the brand's reds folded into one another like a liquid — the loudest of the five, for a dark band.
|
|
14
|
+
* `grid` — Hairlines a pitch apart rising from a soft bloom at the band's foot — the quietest, and the one to reach for first.
|
|
15
|
+
* `rings` — Hairline circles spreading out from the middle of the band's foot.
|
|
16
|
+
*/
|
|
17
|
+
background?: 'halftone' | 'aurora' | 'mesh' | 'grid' | 'rings';
|
|
10
18
|
/** Always. The one claim the logos back, in the fewest words that say it — "Trusted by leading platforms worldwide". */
|
|
11
19
|
title: string;
|
|
12
20
|
/** The line under the heading: what the logos mean for the reader — which payment methods they can use, which platforms they can trade on. */
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Background tone that matches each ground, so the pattern is drawn on the ground the band paints.
|
|
3
|
+
*
|
|
4
|
+
* Shared because four blocks draw the page's one patterned band as their first layer — FeatureCards,
|
|
5
|
+
* Stats, TestimonialRow and LogoRows — and all of them have to pick the tone the same way.
|
|
6
|
+
*/
|
|
7
|
+
export declare const PATTERN_TONE: {
|
|
8
|
+
readonly page: "light";
|
|
9
|
+
readonly subtle: "subtle";
|
|
10
|
+
readonly strong: "dark";
|
|
11
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Background tone that matches each ground, so the pattern is drawn on the ground the band paints.
|
|
3
|
+
*
|
|
4
|
+
* Shared because four blocks draw the page's one patterned band as their first layer — FeatureCards,
|
|
5
|
+
* Stats, TestimonialRow and LogoRows — and all of them have to pick the tone the same way.
|
|
6
|
+
*/
|
|
7
|
+
export const PATTERN_TONE = { page: 'light', subtle: 'subtle', strong: 'dark' };
|
|
@@ -33,4 +33,4 @@ export type { ProductHeroProps };
|
|
|
33
33
|
* region landmark once it has a name, and a band that announced itself as an unnamed section is one
|
|
34
34
|
* more thing a screen reader user walks through rather than a place they can skip to.
|
|
35
35
|
*/
|
|
36
|
-
export declare function ProductHero({ eyebrow, title, headingLevel, description, actions, image, media, backgroundImage, }: ProductHeroProps): import("react").JSX.Element;
|
|
36
|
+
export declare function ProductHero({ eyebrow, title, headingLevel, description, actions, image, media, backgroundImage, shade, }: ProductHeroProps): import("react").JSX.Element;
|
|
@@ -37,11 +37,11 @@ import { productHeroDefaults, productHeroParts, } from './ProductHero.types.js';
|
|
|
37
37
|
* region landmark once it has a name, and a band that announced itself as an unnamed section is one
|
|
38
38
|
* more thing a screen reader user walks through rather than a place they can skip to.
|
|
39
39
|
*/
|
|
40
|
-
export function ProductHero({ eyebrow, title, headingLevel = productHeroDefaults.headingLevel, description, actions, image, media, backgroundImage, }) {
|
|
40
|
+
export function ProductHero({ eyebrow, title, headingLevel = productHeroDefaults.headingLevel, description, actions, image, media, backgroundImage, shade = productHeroDefaults.shade, }) {
|
|
41
41
|
const titleId = useId();
|
|
42
42
|
const [band, revealed] = useReveal();
|
|
43
43
|
const Title = headingLevel === 'h2' ? 'h2' : 'h1';
|
|
44
|
-
return (_jsx("section", { className: productHeroParts.root, "aria-labelledby": titleId,
|
|
44
|
+
return (_jsx("section", { className: productHeroParts.root, "aria-labelledby": titleId, "data-shade": shade && given(backgroundImage) ? '' : undefined,
|
|
45
45
|
/* The one inline style here, and it is a value rather than a decision: which photograph,
|
|
46
46
|
supplied by the page. How it is drawn — the cover fit and the position —
|
|
47
47
|
is in the stylesheet, where it can be reasoned about. */
|
|
@@ -18,10 +18,14 @@ export interface ProductHeroOwnProps {
|
|
|
18
18
|
image?: BlockImage;
|
|
19
19
|
/** A product picture in a shape the page fixes on purpose — an AspectRatio box, which keeps its ratio across the column. Prefer `image`, which keeps the picture's own shape and adapts to it. */
|
|
20
20
|
media?: ReactNode;
|
|
21
|
-
/** A photograph filling the whole band. It is shown as it is — nothing is painted over it, so choose one already dark enough that the title reads on it */
|
|
22
|
-
backgroundImage?: string;
|
|
23
21
|
}
|
|
24
|
-
export type ProductHeroProps = ProductHeroOwnProps
|
|
22
|
+
export type ProductHeroProps = ProductHeroOwnProps & ({
|
|
23
|
+
shade?: boolean;
|
|
24
|
+
backgroundImage: string;
|
|
25
|
+
} | {
|
|
26
|
+
shade?: false;
|
|
27
|
+
backgroundImage?: string;
|
|
28
|
+
});
|
|
25
29
|
/** The class each part carries. Apply these — do not retype them. */
|
|
26
30
|
export declare const productHeroParts: {
|
|
27
31
|
readonly root: "dds-producthero";
|
|
@@ -38,4 +42,5 @@ export declare const productHeroParts: {
|
|
|
38
42
|
/** Generated so defaults cannot drift from the contract. */
|
|
39
43
|
export declare const productHeroDefaults: {
|
|
40
44
|
readonly headingLevel: "h1";
|
|
45
|
+
readonly shade: false;
|
|
41
46
|
};
|
|
@@ -13,4 +13,4 @@ export const productHeroParts = {
|
|
|
13
13
|
image: 'dds-producthero__image',
|
|
14
14
|
};
|
|
15
15
|
/** Generated so defaults cannot drift from the contract. */
|
|
16
|
-
export const productHeroDefaults = { headingLevel: 'h1' };
|
|
16
|
+
export const productHeroDefaults = { headingLevel: 'h1', shade: false };
|
|
@@ -383,3 +383,57 @@
|
|
|
383
383
|
padding-block: var(--space-section-compact);
|
|
384
384
|
}
|
|
385
385
|
}
|
|
386
|
+
|
|
387
|
+
/*
|
|
388
|
+
* `shade`: a shade behind the words, for a bright photograph.
|
|
389
|
+
*
|
|
390
|
+
* The photograph is shown as it is, and a bright one — the daylight sky the brand's heroes ask for —
|
|
391
|
+
* leaves the description and the actions below AA. Darkening the whole photograph fixes the number
|
|
392
|
+
* and loses the day. So the shade is drawn from the words themselves: a box of color.bg.overlay under
|
|
393
|
+
* the text and another under the actions, each reaching space.inset.2xl past the words and blurred by
|
|
394
|
+
* space.inset.xl, so it is full strength under every word and fades to clear in the margin round them.
|
|
395
|
+
* It follows the words wherever they sit — at the start on a phone, centred from the fold — and leaves
|
|
396
|
+
* the rest of the photograph its light.
|
|
397
|
+
*
|
|
398
|
+
* The two boxes meet rather than overlap: the text's runs down across the step to the actions, the
|
|
399
|
+
* actions' starts at their top edge. Overlapping, the two layers of shade doubled into a darker band
|
|
400
|
+
* between the words and the buttons; meeting, their blurred edges add back up to the one strength.
|
|
401
|
+
* A blur rather than a gradient because a gradient fills a box to its edge, and the edge then shows.
|
|
402
|
+
*
|
|
403
|
+
* Under the words, inside their own stacking context, so it can never be drawn over a word or a
|
|
404
|
+
* button.
|
|
405
|
+
*/
|
|
406
|
+
:where([data-dds-context="marketing"]) .dds-producthero[data-shade] :is(.dds-producthero__text, .dds-producthero__actions) {
|
|
407
|
+
isolation: isolate;
|
|
408
|
+
position: relative;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
:where([data-dds-context="marketing"]) .dds-producthero[data-shade] :is(.dds-producthero__text, .dds-producthero__actions)::before {
|
|
412
|
+
background-color: var(--color-bg-overlay);
|
|
413
|
+
content: '';
|
|
414
|
+
filter: blur(var(--space-inset-xl));
|
|
415
|
+
inset: calc(-1 * var(--space-inset-2xl));
|
|
416
|
+
pointer-events: none;
|
|
417
|
+
position: absolute;
|
|
418
|
+
z-index: -1;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
:where([data-dds-context="marketing"]) .dds-producthero[data-shade] .dds-producthero__text:has(+ .dds-producthero__actions)::before {
|
|
422
|
+
inset-block-end: calc(-1 * var(--space-heading-description-actions));
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
:where([data-dds-context="marketing"]) .dds-producthero[data-shade] .dds-producthero__actions::before {
|
|
426
|
+
inset-block-start: 0;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/*
|
|
430
|
+
* From the fold, where the words are centred, the text's box is the band's whole width while its
|
|
431
|
+
* balanced lines take much less of it, so a shade the box's width was a veil across the band. It is
|
|
432
|
+
* held to size.heading-group.max — the width a centred title and its line may run as a block — and
|
|
433
|
+
* the margin round that, centred with the words.
|
|
434
|
+
*/
|
|
435
|
+
@container (min-width: 48rem) {
|
|
436
|
+
:where([data-dds-context="marketing"]) .dds-producthero[data-shade] .dds-producthero__text::before {
|
|
437
|
+
inset-inline: max(calc(-1 * var(--space-inset-2xl)), calc(50% - var(--size-heading-group-max) / 2 - var(--space-inset-2xl)));
|
|
438
|
+
}
|
|
439
|
+
}
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
:where([data-dds-context="marketing"]) .dds-resourcebanner[data-ground="strong"] .dds-resourcebanner__panel {
|
|
94
|
-
background-color: var(--color-bg-surface-card-strong);
|
|
94
|
+
background-color: var(--color-bg-surface-card-strong-on-brand-strong);
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
:where([data-dds-context="marketing"]) .dds-resourcebanner[data-ground="subtle"] {
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
max-inline-size: var(--size-measure-description);
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-
|
|
71
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__action {
|
|
72
72
|
display: flex;
|
|
73
73
|
position: relative;
|
|
74
74
|
padding-block-end: var(--space-section-default);
|
|
@@ -24,13 +24,14 @@ export type { SceneScrollProps };
|
|
|
24
24
|
* translate and keep in step. The second scene's title sits one level under it, as the second half
|
|
25
25
|
* of the section the first one names.
|
|
26
26
|
*
|
|
27
|
-
* The words
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
27
|
+
* The words sit straight on the photographs, as the reference's do, with nothing laid between: each
|
|
28
|
+
* scene names its ink — near-black over a daylight photograph, white over a night one — and the
|
|
29
|
+
* scene carries it as `data-ink`, so the stylesheet sets it. Each scene's words fade as a whole, so
|
|
30
|
+
* the two inks are never drawn over each other; what the reference ran as one colour interpolating
|
|
31
|
+
* with the scroll is here two sets of words, each in its own ink, one giving way to the other.
|
|
31
32
|
*
|
|
32
33
|
* `'use client'` for `useId`, which names the region by its heading. There is no arrival: every
|
|
33
34
|
* other block comes up on `useReveal`, and that arrival is an opacity of its own on the parts that
|
|
34
35
|
* make it — on these words it would fight the scrub. The change-over is this block's entrance.
|
|
35
36
|
*/
|
|
36
|
-
export declare function SceneScroll({ first, second,
|
|
37
|
+
export declare function SceneScroll({ first, second, action, headingLevel, }: SceneScrollProps): import("react").JSX.Element | null;
|
|
@@ -29,26 +29,27 @@ const under = { h1: 'h2', h2: 'h3' };
|
|
|
29
29
|
* translate and keep in step. The second scene's title sits one level under it, as the second half
|
|
30
30
|
* of the section the first one names.
|
|
31
31
|
*
|
|
32
|
-
* The words
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
32
|
+
* The words sit straight on the photographs, as the reference's do, with nothing laid between: each
|
|
33
|
+
* scene names its ink — near-black over a daylight photograph, white over a night one — and the
|
|
34
|
+
* scene carries it as `data-ink`, so the stylesheet sets it. Each scene's words fade as a whole, so
|
|
35
|
+
* the two inks are never drawn over each other; what the reference ran as one colour interpolating
|
|
36
|
+
* with the scroll is here two sets of words, each in its own ink, one giving way to the other.
|
|
36
37
|
*
|
|
37
38
|
* `'use client'` for `useId`, which names the region by its heading. There is no arrival: every
|
|
38
39
|
* other block comes up on `useReveal`, and that arrival is an opacity of its own on the parts that
|
|
39
40
|
* make it — on these words it would fight the scrub. The change-over is this block's entrance.
|
|
40
41
|
*/
|
|
41
|
-
export function SceneScroll({ first, second,
|
|
42
|
+
export function SceneScroll({ first, second, action, headingLevel = sceneScrollDefaults.headingLevel, }) {
|
|
42
43
|
const titleId = useId();
|
|
43
44
|
// Both scenes are required, but a record from a feed or an editor is not typed: one that never
|
|
44
45
|
// arrived draws nothing rather than taking the page down, and a section with half its change-over
|
|
45
46
|
// missing is not the section, so neither scene is drawn alone.
|
|
46
47
|
if (!first || !second)
|
|
47
48
|
return null;
|
|
48
|
-
return (_jsx("section", { className: sceneScrollParts.root, "data-heading-level": headingLevel, "aria-labelledby": titleId, children: _jsxs("div", { className: sceneScrollParts.stage, children: [_jsx(Scene, { which: "first", scene: first, level: headingLevel, titleId: titleId, eager: headingLevel === 'h1' }), _jsx(Scene, { which: "second", scene: second, level: under[headingLevel] }),
|
|
49
|
+
return (_jsx("section", { className: sceneScrollParts.root, "data-heading-level": headingLevel, "aria-labelledby": titleId, children: _jsxs("div", { className: sceneScrollParts.stage, children: [_jsx(Scene, { which: "first", scene: first, level: headingLevel, titleId: titleId, eager: headingLevel === 'h1' }), _jsx(Scene, { which: "second", scene: second, level: under[headingLevel] }), action ? _jsx("div", { className: sceneScrollParts.action, children: action }) : null] }) }));
|
|
49
50
|
}
|
|
50
51
|
function Scene({ which, scene, level, titleId, eager = false }) {
|
|
51
52
|
const Title = level;
|
|
52
53
|
const { image } = scene;
|
|
53
|
-
return (_jsxs("div", { className: sceneScrollParts.scene, "data-scene": which, children: [_jsx("div", { className: sceneScrollParts.media, children: image ? (_jsx("img", { className: sceneScrollParts.image, src: image.src, alt: image.alt ?? '', width: image.width, height: image.height, loading: eager ? 'eager' : 'lazy', decoding: "async" })) : null }), _jsxs("div", { className: sceneScrollParts.content, children: [_jsx(Title, { className: sceneScrollParts.title, id: titleId, children: scene.title }), given(scene.description) ? _jsx("p", { className: sceneScrollParts.description, children: scene.description }) : null] })] }));
|
|
54
|
+
return (_jsxs("div", { className: sceneScrollParts.scene, "data-scene": which, "data-ink": scene.ink ?? 'light', children: [_jsx("div", { className: sceneScrollParts.media, children: image ? (_jsx("img", { className: sceneScrollParts.image, src: image.src, alt: image.alt ?? '', width: image.width, height: image.height, loading: eager ? 'eager' : 'lazy', decoding: "async" })) : null }), _jsxs("div", { className: sceneScrollParts.content, children: [_jsx(Title, { className: sceneScrollParts.title, id: titleId, children: scene.title }), given(scene.description) ? _jsx("p", { className: sceneScrollParts.description, children: scene.description }) : null] })] }));
|
|
54
55
|
}
|
|
@@ -6,12 +6,12 @@ export interface SceneScrollOwnProps {
|
|
|
6
6
|
* `h1` — The section opens a campaign page and the first scene's title is the page's heading — the reference design's hero use. Drawn at font.h1, the opening band's size
|
|
7
7
|
*/
|
|
8
8
|
headingLevel?: 'h2' | 'h1';
|
|
9
|
-
/** Always. The scene the section opens on: a title in a few words, a line under it where the title needs one, and the photograph filling the band behind them. Its title names the section, so it is the one to write as the section's heading. Give the photograph's width and height; `alt` empty unless it shows something the words do not. */
|
|
9
|
+
/** Always. The scene the section opens on: a title in a few words, a line under it where the title needs one, and the photograph filling the band behind them. Its title names the section, so it is the one to write as the section's heading. Give its `ink` — `dark` over a light photograph, `light` over a dark one — and the photograph's width and height; `alt` empty unless it shows something the words do not. */
|
|
10
10
|
first: SceneScrollScene;
|
|
11
|
-
/** Always. The scene the section changes over to, in the same shape as the first. A title of about the same length as the first, so the words change in place rather than jumping, and a photograph of the same composition where there is one, so the dissolve reads as one place changing rather than a cut. */
|
|
11
|
+
/** Always. The scene the section changes over to, in the same shape as the first. A title of about the same length as the first, so the words change in place rather than jumping, and a photograph of the same composition where there is one, so the dissolve reads as one place changing rather than a cut. Its `ink` is its own, so a daylight first scene in dark words can change over to a night one in white. */
|
|
12
12
|
second: SceneScrollScene;
|
|
13
|
-
/**
|
|
14
|
-
|
|
13
|
+
/** One thing for the reader to do or a way on — "Trade now", "See trading hours" — under the words. It belongs to the section rather than to either scene, so it holds still through the change-over and never fades while the reader is reaching for it. A primary Button, or a standalone Link at its brand tone: either reads over both photographs, where a Link taking the ink around it would take the band's white over a light photograph. */
|
|
14
|
+
action?: ReactNode;
|
|
15
15
|
}
|
|
16
16
|
export type SceneScrollProps = SceneScrollOwnProps;
|
|
17
17
|
/** The class each part carries. Apply these — do not retype them. */
|
|
@@ -24,7 +24,7 @@ export declare const sceneScrollParts: {
|
|
|
24
24
|
readonly content: "dds-scenescroll__content";
|
|
25
25
|
readonly title: "dds-scenescroll__title";
|
|
26
26
|
readonly description: "dds-scenescroll__description";
|
|
27
|
-
readonly
|
|
27
|
+
readonly action: "dds-scenescroll__action";
|
|
28
28
|
};
|
|
29
29
|
/** Generated so defaults cannot drift from the contract. */
|
|
30
30
|
export declare const sceneScrollDefaults: {
|
|
@@ -9,7 +9,7 @@ export const sceneScrollParts = {
|
|
|
9
9
|
content: 'dds-scenescroll__content',
|
|
10
10
|
title: 'dds-scenescroll__title',
|
|
11
11
|
description: 'dds-scenescroll__description',
|
|
12
|
-
|
|
12
|
+
action: 'dds-scenescroll__action',
|
|
13
13
|
};
|
|
14
14
|
/** Generated so defaults cannot drift from the contract. */
|
|
15
15
|
export const sceneScrollDefaults = { headingLevel: 'h2' };
|
|
@@ -50,23 +50,19 @@
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
/*
|
|
53
|
-
* The
|
|
53
|
+
* The words sit straight on the photograph, in the ink the scene names.
|
|
54
54
|
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
55
|
+
* No scrim: the photograph is shown as it was taken, and the words are drawn in whichever ink it
|
|
56
|
+
* leaves room for — color.fg.on-media-light, near-black in both modes, over a light photograph such
|
|
57
|
+
* as a daylight sky, and the section's own color.fg.on-brand-strong, white, over a dark one. The
|
|
58
|
+
* photograph does not change with the theme, so neither ink does. The block cannot see the
|
|
59
|
+
* photograph, so the scene says which, and the author answers for the contrast.
|
|
60
60
|
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
61
|
+
* On the scene, so its title and its line take it together, and inherited through the scene even
|
|
62
|
+
* where the scroll lays the scenes out as `display: contents`.
|
|
63
63
|
*/
|
|
64
|
-
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-
|
|
65
|
-
|
|
66
|
-
content: '';
|
|
67
|
-
inset: 0;
|
|
68
|
-
pointer-events: none;
|
|
69
|
-
position: absolute;
|
|
64
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__scene[data-ink="dark"] {
|
|
65
|
+
color: var(--color-fg-on-media-light);
|
|
70
66
|
}
|
|
71
67
|
|
|
72
68
|
/*
|
|
@@ -81,10 +77,11 @@
|
|
|
81
77
|
*
|
|
82
78
|
* Below 62rem — the reference's 992px, the same bound FeatureCards takes from it — the words are at
|
|
83
79
|
* the top of the stage and start at the edge, under the room a navigation bar takes: size.bar-height
|
|
84
|
-
* and the section's own step over it, about the reference's 112. From 62rem they are centred
|
|
85
|
-
* the stage
|
|
86
|
-
*
|
|
87
|
-
*
|
|
80
|
+
* and the section's own step over it, about the reference's 112. From 62rem they are centred down
|
|
81
|
+
* the stage and still start at the edge, in a column capped at the heading group's measure: the
|
|
82
|
+
* reference design's later arrangement, which leaves the far side of the photograph to its subject
|
|
83
|
+
* rather than writing over the middle of it. On either side of the bound the words start, so the
|
|
84
|
+
* eye finds the same edge on every line and a photograph composed for one width holds at the other.
|
|
88
85
|
*
|
|
89
86
|
* Longhand because `var()` is not permitted in a container query condition; `61.9375rem` is the last
|
|
90
87
|
* width below that bound. The section declares the container, and these are rules on what is inside
|
|
@@ -97,16 +94,26 @@
|
|
|
97
94
|
}
|
|
98
95
|
}
|
|
99
96
|
|
|
100
|
-
@container (min-width: 62rem) {
|
|
101
|
-
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__content {
|
|
102
|
-
align-items: center;
|
|
103
|
-
margin-inline: auto;
|
|
104
|
-
text-align: center;
|
|
105
|
-
}
|
|
106
97
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
98
|
+
/*
|
|
99
|
+
* The words keep to the page's content column.
|
|
100
|
+
*
|
|
101
|
+
* They start, from 62rem as below it, so on a wide window they would otherwise sit at the page's
|
|
102
|
+
* gutter while every section around them starts at the edge of size.content.max. The photograph
|
|
103
|
+
* still fills the band edge to edge; only the words and the action are inset, by the page's gutter or
|
|
104
|
+
* by however much the window is wider than the content column on each side, whichever is more —
|
|
105
|
+
* where the column starts in ImageBanner, FeatureCards and the rest.
|
|
106
|
+
*
|
|
107
|
+
* Named once on the section, because three boxes take it: each scene and the action in the plain
|
|
108
|
+
* fallback, and the stage, which carries the insets while the scroll drives the change-over.
|
|
109
|
+
*/
|
|
110
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll {
|
|
111
|
+
--dds-scenescroll-column-inset: max(var(--space-inset-page), calc((100% - var(--size-content-max)) / 2));
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__scene,
|
|
115
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__action {
|
|
116
|
+
padding-inline: var(--dds-scenescroll-column-inset);
|
|
110
117
|
}
|
|
111
118
|
|
|
112
119
|
/*
|
|
@@ -129,7 +136,7 @@
|
|
|
129
136
|
* The section names a view timeline, and three things run down it over `contain` — the stretch in
|
|
130
137
|
* which the track covers the whole window, which is exactly the stretch the stage is pinned for:
|
|
131
138
|
*
|
|
132
|
-
* the second photograph
|
|
139
|
+
* the second photograph dissolves in from 20% to 80%;
|
|
133
140
|
* the first scene's words fade out from 20% to 45%;
|
|
134
141
|
* the second scene's words fade in from 55% to 80%.
|
|
135
142
|
*
|
|
@@ -200,39 +207,33 @@
|
|
|
200
207
|
}
|
|
201
208
|
|
|
202
209
|
/*
|
|
203
|
-
* The
|
|
210
|
+
* The action sits right under the words, whichever scene's words are showing.
|
|
204
211
|
*
|
|
205
212
|
* It belongs to the section rather than to a scene, so it does not fade with either. While the
|
|
206
213
|
* scenes change over, both scenes' words are laid into one grid area of the stage — the scenes
|
|
207
214
|
* themselves step out of the way (`display: contents`), so their photographs and their words become
|
|
208
|
-
* the stage's own items — and that area is as tall as the taller of the two. The
|
|
215
|
+
* the stage's own items — and that area is as tall as the taller of the two. The action is the row
|
|
209
216
|
* under it, at space.heading.description-actions, the step from words to what a reader can do: under
|
|
210
217
|
* the text on every screen, and still while the text changes over it.
|
|
211
218
|
*
|
|
212
|
-
* Below 62rem the words and the
|
|
219
|
+
* Below 62rem the words and the action sit at the top of the stage, under the room a navigation bar
|
|
213
220
|
* takes; from 62rem they are centred down the stage, the empty rows above and below sharing what is
|
|
214
|
-
* left. The stage carries the section's insets here, since the scenes that held them are contents.
|
|
221
|
+
* left, and start at the edge with the words on both sides of the bound. The stage carries the section's insets here, since the scenes that held them are contents.
|
|
215
222
|
*
|
|
216
|
-
* In the plain fallback, where the scenes stack, the
|
|
223
|
+
* In the plain fallback, where the scenes stack, the action is the stage's last row, under the second
|
|
217
224
|
* scene, on the band's own ground, with its own insets.
|
|
218
225
|
*/
|
|
219
|
-
@container (min-width: 62rem) {
|
|
220
|
-
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__link {
|
|
221
|
-
justify-content: center;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
|
|
225
226
|
@supports (animation-timeline: view()) {
|
|
226
227
|
@media (prefers-reduced-motion: no-preference) {
|
|
227
228
|
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__stage {
|
|
228
229
|
grid-template-areas:
|
|
229
230
|
'words'
|
|
230
|
-
'
|
|
231
|
+
'action'
|
|
231
232
|
'.';
|
|
232
233
|
grid-template-columns: minmax(0, 1fr);
|
|
233
234
|
grid-template-rows: auto auto 1fr;
|
|
234
235
|
padding-block: calc(var(--size-bar-height) + var(--space-section-default)) var(--space-section-default);
|
|
235
|
-
padding-inline: var(--
|
|
236
|
+
padding-inline: var(--dds-scenescroll-column-inset);
|
|
236
237
|
}
|
|
237
238
|
|
|
238
239
|
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__scene {
|
|
@@ -249,8 +250,8 @@
|
|
|
249
250
|
z-index: 1;
|
|
250
251
|
}
|
|
251
252
|
|
|
252
|
-
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-
|
|
253
|
-
grid-area:
|
|
253
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__action {
|
|
254
|
+
grid-area: action;
|
|
254
255
|
margin-block-start: var(--space-heading-description-actions);
|
|
255
256
|
padding: 0;
|
|
256
257
|
z-index: 1;
|
|
@@ -265,7 +266,7 @@
|
|
|
265
266
|
grid-template-areas:
|
|
266
267
|
'.'
|
|
267
268
|
'words'
|
|
268
|
-
'
|
|
269
|
+
'action'
|
|
269
270
|
'.';
|
|
270
271
|
grid-template-rows: 1fr auto auto 1fr;
|
|
271
272
|
padding-block: var(--space-section-default);
|
|
@@ -273,3 +274,19 @@
|
|
|
273
274
|
}
|
|
274
275
|
}
|
|
275
276
|
}
|
|
277
|
+
|
|
278
|
+
/*
|
|
279
|
+
* From 62rem the words keep to half the stage.
|
|
280
|
+
*
|
|
281
|
+
* The words start at the edge and the photograph's subject is on the far side, but the heading
|
|
282
|
+
* group's measure alone is most of a laptop's width: a title in a few words ran three quarters of
|
|
283
|
+
* the way across and over the face it was meant to sit beside. Held to half the stage, or the
|
|
284
|
+
* heading group's measure where that is narrower, the title wraps in the words' own half and the
|
|
285
|
+
* other half is the subject's — the reference design's left column. Below 62rem the words run the
|
|
286
|
+
* width, at the top of a photograph whose subject is below them.
|
|
287
|
+
*/
|
|
288
|
+
@container (min-width: 62rem) {
|
|
289
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__content {
|
|
290
|
+
max-inline-size: min(var(--size-heading-group-max), 50%);
|
|
291
|
+
}
|
|
292
|
+
}
|