@deriv-com/dds-marketing 1.1.3 → 1.2.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 +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 +6 -0
- 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/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 +107 -29
- 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/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 +7 -5
- package/dist/components/blocks/scene-scroll/SceneScroll.js +9 -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 +139 -41
- 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 +31 -2
- 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 +117 -3
- 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
|
@@ -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' };
|
|
@@ -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,15 @@ 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
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
27
|
+
* Each scene names its ink — near-black over a daylight photograph, white over a night one — and the
|
|
28
|
+
* scene carries it as `data-ink`, so the stylesheet sets it. White words lay a shade under
|
|
29
|
+
* themselves, eased out toward the photograph's subject; near-black words sit straight on the
|
|
30
|
+
* photograph, as the reference's do, there being no light shade. Each scene's words fade as a whole, so
|
|
31
|
+
* the two inks are never drawn over each other; what the reference ran as one colour interpolating
|
|
32
|
+
* with the scroll is here two sets of words, each in its own ink, one giving way to the other.
|
|
31
33
|
*
|
|
32
34
|
* `'use client'` for `useId`, which names the region by its heading. There is no arrival: every
|
|
33
35
|
* other block comes up on `useReveal`, and that arrival is an opacity of its own on the parts that
|
|
34
36
|
* make it — on these words it would fight the scrub. The change-over is this block's entrance.
|
|
35
37
|
*/
|
|
36
|
-
export declare function SceneScroll({ first, second,
|
|
38
|
+
export declare function SceneScroll({ first, second, action, headingLevel, }: SceneScrollProps): import("react").JSX.Element | null;
|
|
@@ -29,26 +29,28 @@ 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
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
32
|
+
* Each scene names its ink — near-black over a daylight photograph, white over a night one — and the
|
|
33
|
+
* scene carries it as `data-ink`, so the stylesheet sets it. White words lay a shade under
|
|
34
|
+
* themselves, eased out toward the photograph's subject; near-black words sit straight on the
|
|
35
|
+
* photograph, as the reference's do, there being no light shade. Each scene's words fade as a whole, so
|
|
36
|
+
* the two inks are never drawn over each other; what the reference ran as one colour interpolating
|
|
37
|
+
* with the scroll is here two sets of words, each in its own ink, one giving way to the other.
|
|
36
38
|
*
|
|
37
39
|
* `'use client'` for `useId`, which names the region by its heading. There is no arrival: every
|
|
38
40
|
* other block comes up on `useReveal`, and that arrival is an opacity of its own on the parts that
|
|
39
41
|
* make it — on these words it would fight the scrub. The change-over is this block's entrance.
|
|
40
42
|
*/
|
|
41
|
-
export function SceneScroll({ first, second,
|
|
43
|
+
export function SceneScroll({ first, second, action, headingLevel = sceneScrollDefaults.headingLevel, }) {
|
|
42
44
|
const titleId = useId();
|
|
43
45
|
// Both scenes are required, but a record from a feed or an editor is not typed: one that never
|
|
44
46
|
// arrived draws nothing rather than taking the page down, and a section with half its change-over
|
|
45
47
|
// missing is not the section, so neither scene is drawn alone.
|
|
46
48
|
if (!first || !second)
|
|
47
49
|
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] }),
|
|
50
|
+
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
51
|
}
|
|
50
52
|
function Scene({ which, scene, level, titleId, eager = false }) {
|
|
51
53
|
const Title = level;
|
|
52
54
|
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] })] }));
|
|
55
|
+
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
56
|
}
|
|
@@ -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,84 @@
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
/*
|
|
53
|
-
* The
|
|
53
|
+
* The words are drawn in the ink the scene names.
|
|
54
54
|
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* words
|
|
55
|
+
* Whichever ink the photograph leaves room for — color.fg.on-media-light, near-black in both modes,
|
|
56
|
+
* over a light photograph such as a daylight sky, and the section's own color.fg.on-brand-strong,
|
|
57
|
+
* white, over a dark one. The photograph does not change with the theme, so neither ink does. The
|
|
58
|
+
* block cannot see the photograph, so the scene says which. White words have a shade behind them,
|
|
59
|
+
* below; near-black words sit straight on the photograph, and the author answers for that 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
|
-
|
|
64
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__scene[data-ink="dark"] {
|
|
65
|
+
color: var(--color-fg-on-media-light);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/*
|
|
69
|
+
* The shade under a white-ink scene's words, ImageBanner's cover shade on a full-screen scene.
|
|
70
|
+
*
|
|
71
|
+
* White words were left to the photograph, and a photograph bright anywhere behind them — a sky, a
|
|
72
|
+
* lit wall — took the line under the title below AA. So the words lay color.bg.overlay under
|
|
73
|
+
* themselves: full strength to the edge of their own column and then eased out past it, a
|
|
74
|
+
* smoothstep sampled as stops for the reason ImageBanner gives, so it never reads as a seam on the
|
|
75
|
+
* photograph. From 62rem it is a band the stage's height down the words' half, fading across
|
|
76
|
+
* three times space.section.default toward the subject; below 62rem the words run the width at the
|
|
77
|
+
* top, and it runs down from the top of the stage and out space.section.default under them.
|
|
78
|
+
*
|
|
79
|
+
* Drawn by the words rather than the photograph, so it fades with them through the change-over and
|
|
80
|
+
* is never over a scene whose words are not there. Only under white ink: there is no light shade
|
|
81
|
+
* for near-black words, which sit straight on a light photograph as they always did. It reaches
|
|
82
|
+
* past the stage's edges on purpose and is clipped there — by the stage while the scroll drives the
|
|
83
|
+
* change-over, and by its own scene in the plain fallback, with `clip` rather than `hidden` for the
|
|
84
|
+
* timeline's sake. A gradient takes a physical direction, so the direction is a custom property,
|
|
85
|
+
* mirrored under `:dir(rtl)`.
|
|
86
|
+
*/
|
|
87
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll {
|
|
88
|
+
--dds-scenescroll-shade-fade: var(--space-section-default);
|
|
89
|
+
--dds-scenescroll-shade-toward: to bottom;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__scene {
|
|
93
|
+
overflow: clip;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__scene[data-ink="light"] .dds-scenescroll__content::before {
|
|
97
|
+
background-image: linear-gradient(
|
|
98
|
+
var(--dds-scenescroll-shade-toward),
|
|
99
|
+
var(--color-bg-overlay),
|
|
100
|
+
var(--color-bg-overlay) calc(100% - var(--dds-scenescroll-shade-fade) * 1.0),
|
|
101
|
+
color-mix(in srgb, var(--color-bg-overlay) 95.7%, transparent) calc(100% - var(--dds-scenescroll-shade-fade) * 0.875),
|
|
102
|
+
color-mix(in srgb, var(--color-bg-overlay) 84.4%, transparent) calc(100% - var(--dds-scenescroll-shade-fade) * 0.75),
|
|
103
|
+
color-mix(in srgb, var(--color-bg-overlay) 68.4%, transparent) calc(100% - var(--dds-scenescroll-shade-fade) * 0.625),
|
|
104
|
+
color-mix(in srgb, var(--color-bg-overlay) 50.0%, transparent) calc(100% - var(--dds-scenescroll-shade-fade) * 0.5),
|
|
105
|
+
color-mix(in srgb, var(--color-bg-overlay) 31.6%, transparent) calc(100% - var(--dds-scenescroll-shade-fade) * 0.375),
|
|
106
|
+
color-mix(in srgb, var(--color-bg-overlay) 15.6%, transparent) calc(100% - var(--dds-scenescroll-shade-fade) * 0.25),
|
|
107
|
+
color-mix(in srgb, var(--color-bg-overlay) 4.3%, transparent) calc(100% - var(--dds-scenescroll-shade-fade) * 0.125),
|
|
108
|
+
transparent
|
|
109
|
+
);
|
|
66
110
|
content: '';
|
|
67
|
-
inset:
|
|
111
|
+
inset: calc(-1 * 100cqh) calc(-1 * 100cqw) calc(-1 * var(--dds-scenescroll-shade-fade));
|
|
68
112
|
pointer-events: none;
|
|
69
113
|
position: absolute;
|
|
114
|
+
z-index: -1;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
@container (min-width: 62rem) {
|
|
118
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll {
|
|
119
|
+
--dds-scenescroll-shade-fade: calc(var(--space-section-default) * 3);
|
|
120
|
+
--dds-scenescroll-shade-toward: to right;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll:dir(rtl) {
|
|
124
|
+
--dds-scenescroll-shade-toward: to left;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__scene[data-ink="light"] .dds-scenescroll__content::before {
|
|
128
|
+
inset-block: calc(-1 * 100cqh);
|
|
129
|
+
inset-inline: calc(-1 * 100cqw) calc(-1 * var(--dds-scenescroll-shade-fade));
|
|
130
|
+
}
|
|
70
131
|
}
|
|
71
132
|
|
|
72
133
|
/*
|
|
@@ -81,10 +142,11 @@
|
|
|
81
142
|
*
|
|
82
143
|
* Below 62rem — the reference's 992px, the same bound FeatureCards takes from it — the words are at
|
|
83
144
|
* 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
|
-
*
|
|
145
|
+
* and the section's own step over it, about the reference's 112. From 62rem they are centred down
|
|
146
|
+
* the stage and still start at the edge, in a column capped at the heading group's measure: the
|
|
147
|
+
* reference design's later arrangement, which leaves the far side of the photograph to its subject
|
|
148
|
+
* rather than writing over the middle of it. On either side of the bound the words start, so the
|
|
149
|
+
* eye finds the same edge on every line and a photograph composed for one width holds at the other.
|
|
88
150
|
*
|
|
89
151
|
* Longhand because `var()` is not permitted in a container query condition; `61.9375rem` is the last
|
|
90
152
|
* width below that bound. The section declares the container, and these are rules on what is inside
|
|
@@ -97,16 +159,26 @@
|
|
|
97
159
|
}
|
|
98
160
|
}
|
|
99
161
|
|
|
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
162
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
163
|
+
/*
|
|
164
|
+
* The words keep to the page's content column.
|
|
165
|
+
*
|
|
166
|
+
* They start, from 62rem as below it, so on a wide window they would otherwise sit at the page's
|
|
167
|
+
* gutter while every section around them starts at the edge of size.content.max. The photograph
|
|
168
|
+
* still fills the band edge to edge; only the words and the action are inset, by the page's gutter or
|
|
169
|
+
* by however much the window is wider than the content column on each side, whichever is more —
|
|
170
|
+
* where the column starts in ImageBanner, FeatureCards and the rest.
|
|
171
|
+
*
|
|
172
|
+
* Named once on the section, because three boxes take it: each scene and the action in the plain
|
|
173
|
+
* fallback, and the stage, which carries the insets while the scroll drives the change-over.
|
|
174
|
+
*/
|
|
175
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll {
|
|
176
|
+
--dds-scenescroll-column-inset: max(var(--space-inset-page), calc((100% - var(--size-content-max)) / 2));
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__scene,
|
|
180
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__action {
|
|
181
|
+
padding-inline: var(--dds-scenescroll-column-inset);
|
|
110
182
|
}
|
|
111
183
|
|
|
112
184
|
/*
|
|
@@ -117,6 +189,22 @@
|
|
|
117
189
|
object-position: bottom;
|
|
118
190
|
}
|
|
119
191
|
|
|
192
|
+
/*
|
|
193
|
+
* From 62rem the subject is on the far side from the words, so a crop takes from the words' side
|
|
194
|
+
* rather than the middle: on a window narrower than the photograph's shape, a centred crop cut into
|
|
195
|
+
* the subject at the edge and pushed it toward the words. Physical, since `object-position` has no
|
|
196
|
+
* logical form, and mirrored under `:dir(rtl)`, where the words are on the right.
|
|
197
|
+
*/
|
|
198
|
+
@container (min-width: 62rem) {
|
|
199
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__image {
|
|
200
|
+
object-position: right bottom;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll:dir(rtl) .dds-scenescroll__image {
|
|
204
|
+
object-position: left bottom;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
120
208
|
/*
|
|
121
209
|
* The change-over, scrubbed by the scroll.
|
|
122
210
|
*
|
|
@@ -129,7 +217,7 @@
|
|
|
129
217
|
* The section names a view timeline, and three things run down it over `contain` — the stretch in
|
|
130
218
|
* which the track covers the whole window, which is exactly the stretch the stage is pinned for:
|
|
131
219
|
*
|
|
132
|
-
* the second photograph
|
|
220
|
+
* the second photograph dissolves in from 20% to 80%;
|
|
133
221
|
* the first scene's words fade out from 20% to 45%;
|
|
134
222
|
* the second scene's words fade in from 55% to 80%.
|
|
135
223
|
*
|
|
@@ -200,39 +288,33 @@
|
|
|
200
288
|
}
|
|
201
289
|
|
|
202
290
|
/*
|
|
203
|
-
* The
|
|
291
|
+
* The action sits right under the words, whichever scene's words are showing.
|
|
204
292
|
*
|
|
205
293
|
* It belongs to the section rather than to a scene, so it does not fade with either. While the
|
|
206
294
|
* scenes change over, both scenes' words are laid into one grid area of the stage — the scenes
|
|
207
295
|
* 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
|
|
296
|
+
* the stage's own items — and that area is as tall as the taller of the two. The action is the row
|
|
209
297
|
* under it, at space.heading.description-actions, the step from words to what a reader can do: under
|
|
210
298
|
* the text on every screen, and still while the text changes over it.
|
|
211
299
|
*
|
|
212
|
-
* Below 62rem the words and the
|
|
300
|
+
* Below 62rem the words and the action sit at the top of the stage, under the room a navigation bar
|
|
213
301
|
* 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.
|
|
302
|
+
* 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
303
|
*
|
|
216
|
-
* In the plain fallback, where the scenes stack, the
|
|
304
|
+
* In the plain fallback, where the scenes stack, the action is the stage's last row, under the second
|
|
217
305
|
* scene, on the band's own ground, with its own insets.
|
|
218
306
|
*/
|
|
219
|
-
@container (min-width: 62rem) {
|
|
220
|
-
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__link {
|
|
221
|
-
justify-content: center;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
|
|
225
307
|
@supports (animation-timeline: view()) {
|
|
226
308
|
@media (prefers-reduced-motion: no-preference) {
|
|
227
309
|
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__stage {
|
|
228
310
|
grid-template-areas:
|
|
229
311
|
'words'
|
|
230
|
-
'
|
|
312
|
+
'action'
|
|
231
313
|
'.';
|
|
232
314
|
grid-template-columns: minmax(0, 1fr);
|
|
233
315
|
grid-template-rows: auto auto 1fr;
|
|
234
316
|
padding-block: calc(var(--size-bar-height) + var(--space-section-default)) var(--space-section-default);
|
|
235
|
-
padding-inline: var(--
|
|
317
|
+
padding-inline: var(--dds-scenescroll-column-inset);
|
|
236
318
|
}
|
|
237
319
|
|
|
238
320
|
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__scene {
|
|
@@ -249,8 +331,8 @@
|
|
|
249
331
|
z-index: 1;
|
|
250
332
|
}
|
|
251
333
|
|
|
252
|
-
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-
|
|
253
|
-
grid-area:
|
|
334
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__action {
|
|
335
|
+
grid-area: action;
|
|
254
336
|
margin-block-start: var(--space-heading-description-actions);
|
|
255
337
|
padding: 0;
|
|
256
338
|
z-index: 1;
|
|
@@ -265,7 +347,7 @@
|
|
|
265
347
|
grid-template-areas:
|
|
266
348
|
'.'
|
|
267
349
|
'words'
|
|
268
|
-
'
|
|
350
|
+
'action'
|
|
269
351
|
'.';
|
|
270
352
|
grid-template-rows: 1fr auto auto 1fr;
|
|
271
353
|
padding-block: var(--space-section-default);
|
|
@@ -273,3 +355,19 @@
|
|
|
273
355
|
}
|
|
274
356
|
}
|
|
275
357
|
}
|
|
358
|
+
|
|
359
|
+
/*
|
|
360
|
+
* From 62rem the words keep to half the stage.
|
|
361
|
+
*
|
|
362
|
+
* The words start at the edge and the photograph's subject is on the far side, but the heading
|
|
363
|
+
* group's measure alone is most of a laptop's width: a title in a few words ran three quarters of
|
|
364
|
+
* the way across and over the face it was meant to sit beside. Held to half the stage, or the
|
|
365
|
+
* heading group's measure where that is narrower, the title wraps in the words' own half and the
|
|
366
|
+
* other half is the subject's — the reference design's left column. Below 62rem the words run the
|
|
367
|
+
* width, at the top of a photograph whose subject is below them.
|
|
368
|
+
*/
|
|
369
|
+
@container (min-width: 62rem) {
|
|
370
|
+
:where([data-dds-context="marketing"]) .dds-scenescroll .dds-scenescroll__content {
|
|
371
|
+
max-inline-size: min(var(--size-heading-group-max), 50%);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/* GENERATED from scenescrollword.contract.json. Do not edit. */
|
|
2
|
+
|
|
3
|
+
:where([data-dds-context="marketing"]) .dds-scenescrollword {
|
|
4
|
+
box-sizing: border-box;
|
|
5
|
+
container-type: inline-size;
|
|
6
|
+
display: block;
|
|
7
|
+
inline-size: 100%;
|
|
8
|
+
overflow-wrap: anywhere;
|
|
9
|
+
background-color: var(--color-bg-brand-strong);
|
|
10
|
+
color: var(--color-fg-on-brand-strong);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
:where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__stage {
|
|
14
|
+
box-sizing: border-box;
|
|
15
|
+
display: grid;
|
|
16
|
+
inline-size: 100%;
|
|
17
|
+
min-inline-size: 0;
|
|
18
|
+
row-gap: var(--space-gap-none);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
:where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__scene {
|
|
22
|
+
box-sizing: border-box;
|
|
23
|
+
display: flex;
|
|
24
|
+
flex-direction: column;
|
|
25
|
+
isolation: isolate;
|
|
26
|
+
justify-content: center;
|
|
27
|
+
min-inline-size: 0;
|
|
28
|
+
position: relative;
|
|
29
|
+
padding-block: var(--space-section-default);
|
|
30
|
+
padding-inline: var(--space-inset-page);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
:where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__media {
|
|
34
|
+
overflow: clip;
|
|
35
|
+
position: absolute;
|
|
36
|
+
border-radius: var(--radius-none);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
:where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__image {
|
|
40
|
+
display: block;
|
|
41
|
+
object-fit: cover;
|
|
42
|
+
border-radius: var(--radius-none);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
:where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__content {
|
|
46
|
+
box-sizing: border-box;
|
|
47
|
+
display: flex;
|
|
48
|
+
flex-direction: column;
|
|
49
|
+
min-inline-size: 0;
|
|
50
|
+
position: relative;
|
|
51
|
+
max-inline-size: var(--size-heading-group-max);
|
|
52
|
+
row-gap: var(--space-gap-none);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
:where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__title {
|
|
56
|
+
margin-block: 0;
|
|
57
|
+
text-wrap: balance;
|
|
58
|
+
margin-block-end: var(--space-heading-title-description);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
:where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__before {
|
|
62
|
+
display: inline;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
:where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__word {
|
|
66
|
+
display: inline-grid;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
:where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__after {
|
|
70
|
+
display: inline;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
:where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__description {
|
|
74
|
+
margin-block: 0;
|
|
75
|
+
font-family: var(--font-body-lg-family);
|
|
76
|
+
font-size: var(--font-body-lg-size);
|
|
77
|
+
font-weight: var(--font-body-lg-weight);
|
|
78
|
+
letter-spacing: var(--font-body-lg-letter-spacing);
|
|
79
|
+
line-height: var(--font-body-lg-line-height);
|
|
80
|
+
max-inline-size: var(--size-measure-description);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
:where([data-dds-context="marketing"]) .dds-scenescrollword .dds-scenescrollword__action {
|
|
84
|
+
display: flex;
|
|
85
|
+
position: relative;
|
|
86
|
+
padding-block-end: var(--space-section-default);
|
|
87
|
+
padding-inline: var(--space-inset-page);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
:where([data-dds-context="marketing"]) .dds-scenescrollword[data-heading-level="h1"] .dds-scenescrollword__title {
|
|
91
|
+
font-family: var(--font-h1-family);
|
|
92
|
+
font-size: var(--font-h1-size);
|
|
93
|
+
font-weight: var(--font-h1-weight);
|
|
94
|
+
letter-spacing: var(--font-h1-letter-spacing);
|
|
95
|
+
line-height: var(--font-h1-line-height);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
:where([data-dds-context="marketing"]) .dds-scenescrollword[data-heading-level="h2"] .dds-scenescrollword__title {
|
|
99
|
+
font-family: var(--font-h2-family);
|
|
100
|
+
font-size: var(--font-h2-size);
|
|
101
|
+
font-weight: var(--font-h2-weight);
|
|
102
|
+
letter-spacing: var(--font-h2-letter-spacing);
|
|
103
|
+
line-height: var(--font-h2-line-height);
|
|
104
|
+
}
|
|
105
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import './SceneScrollWord.css';
|
|
2
|
+
import './scene-scroll-word-impl.css';
|
|
3
|
+
import { type SceneScrollWordProps } from './SceneScrollWord.types.js';
|
|
4
|
+
export type { SceneScrollWordProps };
|
|
5
|
+
/**
|
|
6
|
+
* SceneScroll's change-over told as one claim with one word changed — "Trade all day", then
|
|
7
|
+
* "Trade all night": the reference design's inline day-and-night headline, made generic.
|
|
8
|
+
*
|
|
9
|
+
* The same track, pin and view timeline as SceneScroll, and nothing here runs a script. Each scene
|
|
10
|
+
* draws its whole heading — the shared words and its own word — so the outline, a screen reader and
|
|
11
|
+
* the stacked fallback all read "Trade all day" then "Trade all night". The stylesheet lays the
|
|
12
|
+
* second heading exactly over the first, keeps the second's shared words undrawn, and changes the
|
|
13
|
+
* words over alone.
|
|
14
|
+
*
|
|
15
|
+
* The changing word falls where the language puts it, so the shared words come as what is before it
|
|
16
|
+
* and what is after it, either or both, and nothing here adds a space: Japanese has none to add, and
|
|
17
|
+
* a language that has them writes them into the strings.
|
|
18
|
+
*
|
|
19
|
+
* Each word sits in a slot holding the other scene's word too, undrawn: the slot is as wide as the
|
|
20
|
+
* wider of the two, so both titles wrap alike and the second's word lands exactly where the first's
|
|
21
|
+
* was. That duplicate is the one thing kept from assistive technology, since the heading it belongs
|
|
22
|
+
* to is read in full.
|
|
23
|
+
*
|
|
24
|
+
* The words sit straight on the photographs in the ink each scene names, as SceneScroll's do. Where
|
|
25
|
+
* the two inks differ the shared words cross over with the word, so the claim changes colour as one
|
|
26
|
+
* piece; the section says so as `data-ink-change`.
|
|
27
|
+
*
|
|
28
|
+
* `'use client'` for `useId`, which names the region by its heading. There is no arrival, for
|
|
29
|
+
* SceneScroll's reason: the change-over is this block's entrance.
|
|
30
|
+
*/
|
|
31
|
+
export declare function SceneScrollWord({ titleBefore, titleAfter, first, second, action, headingLevel, }: SceneScrollWordProps): import("react").JSX.Element | null;
|