@deriv-com/dds-marketing 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.llm/components/awards.md +209 -0
- package/.llm/components/background.md +420 -0
- package/.llm/components/bottomsheet.md +5 -0
- package/.llm/components/comparisoncards.md +257 -0
- package/.llm/components/comparisontable.md +231 -0
- package/.llm/components/ctabanner.md +22 -0
- package/.llm/components/ctabannerslider.md +36 -2
- package/.llm/components/datatable.md +273 -0
- package/.llm/components/downloadbanner.md +283 -0
- package/.llm/components/featurecards.md +41 -3
- package/.llm/components/featurecardscarousel.md +311 -0
- package/.llm/components/featuresplit.md +5 -0
- package/.llm/components/featurestack.md +227 -0
- package/.llm/components/illustrationcard.md +236 -0
- package/.llm/components/illustrationscene.md +229 -0
- package/.llm/components/imagebanner.md +278 -0
- package/.llm/components/landinghero.md +24 -0
- package/.llm/components/navbar.md +1 -1
- package/.llm/components/navbaritem.md +4 -0
- package/.llm/components/pageheader.md +22 -0
- package/.llm/components/paginationdots.md +6 -1
- package/.llm/components/producthero.md +35 -11
- package/.llm/components/resourcebanner.md +247 -0
- package/.llm/components/scenescroll.md +222 -0
- package/.llm/components/select.md +17 -0
- package/.llm/components/stats.md +219 -0
- package/.llm/components/steps.md +286 -0
- package/.llm/components/stickycards.md +251 -0
- package/.llm/components/tableheadercell.md +19 -0
- package/.llm/components/teamgrid.md +243 -0
- package/.llm/components/testimonialrow.md +5 -0
- package/.llm/components/testimonialslider.md +14 -1
- package/.llm/components/textarea.md +13 -0
- package/.llm/components/textinput.md +13 -0
- package/.llm/components/textscroll.md +187 -0
- package/.llm/components/tiers.md +227 -0
- package/.llm/digest/awards.md +45 -0
- package/.llm/digest/background.md +53 -0
- package/.llm/digest/bottomsheet.md +2 -0
- package/.llm/digest/comparisoncards.md +51 -0
- package/.llm/digest/comparisontable.md +53 -0
- package/.llm/digest/ctabanner.md +4 -0
- package/.llm/digest/ctabannerslider.md +7 -0
- package/.llm/digest/datatable.md +65 -0
- package/.llm/digest/downloadbanner.md +65 -0
- package/.llm/digest/featurecards.md +1 -1
- package/.llm/digest/featurecardscarousel.md +54 -0
- package/.llm/digest/featuresplit.md +1 -0
- package/.llm/digest/featurestack.md +48 -0
- package/.llm/digest/illustrationcard.md +46 -0
- package/.llm/digest/illustrationscene.md +50 -0
- package/.llm/digest/imagebanner.md +64 -0
- package/.llm/digest/landinghero.md +7 -0
- package/.llm/digest/navbaritem.md +1 -0
- package/.llm/digest/pageheader.md +4 -0
- package/.llm/digest/paginationdots.md +3 -1
- package/.llm/digest/producthero.md +4 -2
- package/.llm/digest/resourcebanner.md +53 -0
- package/.llm/digest/scenescroll.md +49 -0
- package/.llm/digest/select.md +5 -0
- package/.llm/digest/stats.md +46 -0
- package/.llm/digest/steps.md +55 -0
- package/.llm/digest/stickycards.md +52 -0
- package/.llm/digest/tableheadercell.md +4 -0
- package/.llm/digest/teamgrid.md +53 -0
- package/.llm/digest/testimonialrow.md +2 -0
- package/.llm/digest/testimonialslider.md +4 -0
- package/.llm/digest/textarea.md +4 -0
- package/.llm/digest/textinput.md +4 -0
- package/.llm/digest/textscroll.md +43 -0
- package/.llm/digest/tiers.md +50 -0
- package/.llm/index.md +25 -2
- package/.llm/tokens.md +37 -1
- package/AGENTS.md +20 -1
- package/dist/components/awards-data.d.ts +24 -0
- package/dist/components/awards-data.js +11 -0
- package/dist/components/block-image-data.d.ts +24 -0
- package/dist/components/block-image-data.js +9 -0
- package/dist/components/blocks/awards/Awards.css +134 -0
- package/dist/components/blocks/awards/Awards.d.ts +24 -0
- package/dist/components/blocks/awards/Awards.js +114 -0
- package/dist/components/blocks/awards/Awards.types.d.ts +31 -0
- package/dist/components/blocks/awards/Awards.types.js +16 -0
- package/dist/components/blocks/awards/awards-impl.css +222 -0
- package/dist/components/blocks/cards-of.d.ts +16 -0
- package/dist/components/blocks/cards-of.js +23 -0
- package/dist/components/blocks/comparison-cards/ComparisonCards.css +195 -0
- package/dist/components/blocks/comparison-cards/ComparisonCards.d.ts +24 -0
- package/dist/components/blocks/comparison-cards/ComparisonCards.js +75 -0
- package/dist/components/blocks/comparison-cards/ComparisonCards.types.d.ts +49 -0
- package/dist/components/blocks/comparison-cards/ComparisonCards.types.js +26 -0
- package/dist/components/blocks/comparison-cards/comparison-cards-impl.css +262 -0
- package/dist/components/blocks/comparison-table/ComparisonTable.css +111 -0
- package/dist/components/blocks/comparison-table/ComparisonTable.d.ts +25 -0
- package/dist/components/blocks/comparison-table/ComparisonTable.js +100 -0
- package/dist/components/blocks/comparison-table/ComparisonTable.types.d.ts +36 -0
- package/dist/components/blocks/comparison-table/ComparisonTable.types.js +15 -0
- package/dist/components/blocks/comparison-table/comparison-table-impl.css +143 -0
- package/dist/components/blocks/cta-banner/CtaBanner.css +1 -0
- package/dist/components/blocks/cta-banner/CtaBanner.d.ts +1 -1
- package/dist/components/blocks/cta-banner/CtaBanner.js +3 -2
- package/dist/components/blocks/cta-banner/CtaBanner.types.d.ts +6 -0
- package/dist/components/blocks/cta-banner/CtaBanner.types.js +1 -1
- package/dist/components/blocks/cta-banner/cta-banner-impl.css +8 -0
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.css +1 -0
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.d.ts +1 -1
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.js +10 -5
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.d.ts +12 -0
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.js +1 -1
- package/dist/components/blocks/cta-banner-slider/cta-banner-slider-impl.css +8 -0
- package/dist/components/blocks/data-table/DataTable.css +170 -0
- package/dist/components/blocks/data-table/DataTable.d.ts +29 -0
- package/dist/components/blocks/data-table/DataTable.js +84 -0
- package/dist/components/blocks/data-table/DataTable.types.d.ts +69 -0
- package/dist/components/blocks/data-table/DataTable.types.js +19 -0
- package/dist/components/blocks/data-table/data-table-impl.css +155 -0
- package/dist/components/blocks/download-banner/DownloadBanner.css +228 -0
- package/dist/components/blocks/download-banner/DownloadBanner.d.ts +28 -0
- package/dist/components/blocks/download-banner/DownloadBanner.js +75 -0
- package/dist/components/blocks/download-banner/DownloadBanner.types.d.ts +56 -0
- package/dist/components/blocks/download-banner/DownloadBanner.types.js +23 -0
- package/dist/components/blocks/download-banner/download-banner-impl.css +216 -0
- package/dist/components/blocks/faq-accordion/FaqAccordion.css +1 -0
- package/dist/components/blocks/faq-accordion/faq-accordion-impl.css +3 -7
- package/dist/components/blocks/feature-bullets/FeatureBullets.css +1 -0
- package/dist/components/blocks/feature-bullets/feature-bullets-impl.css +14 -1
- package/dist/components/blocks/feature-cards/FeatureCards.css +1 -0
- package/dist/components/blocks/feature-cards/FeatureCards.d.ts +2 -1
- package/dist/components/blocks/feature-cards/FeatureCards.js +4 -21
- package/dist/components/blocks/feature-cards/feature-cards-impl.css +10 -9
- package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.css +115 -0
- package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.d.ts +30 -0
- package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.js +160 -0
- package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.d.ts +52 -0
- package/dist/components/blocks/feature-cards-carousel/FeatureCardsCarousel.types.js +17 -0
- package/dist/components/blocks/feature-cards-carousel/feature-cards-carousel-impl.css +207 -0
- package/dist/components/blocks/feature-scroll/FeatureScroll.css +1 -0
- package/dist/components/blocks/feature-split/FeatureSplit.css +1 -0
- package/dist/components/blocks/feature-split/feature-split-impl.css +14 -1
- package/dist/components/blocks/feature-stack/FeatureStack.css +86 -0
- package/dist/components/blocks/feature-stack/FeatureStack.d.ts +19 -0
- package/dist/components/blocks/feature-stack/FeatureStack.js +27 -0
- package/dist/components/blocks/feature-stack/FeatureStack.types.d.ts +34 -0
- package/dist/components/blocks/feature-stack/FeatureStack.types.js +14 -0
- package/dist/components/blocks/feature-stack/feature-stack-impl.css +87 -0
- package/dist/components/blocks/image-banner/ImageBanner.css +133 -0
- package/dist/components/blocks/image-banner/ImageBanner.d.ts +32 -0
- package/dist/components/blocks/image-banner/ImageBanner.js +41 -0
- package/dist/components/blocks/image-banner/ImageBanner.types.d.ts +54 -0
- package/dist/components/blocks/image-banner/ImageBanner.types.js +14 -0
- package/dist/components/blocks/image-banner/image-banner-impl.css +281 -0
- package/dist/components/blocks/landing-hero/LandingHero.css +1 -0
- package/dist/components/blocks/landing-hero/LandingHero.d.ts +1 -1
- package/dist/components/blocks/landing-hero/LandingHero.js +4 -3
- package/dist/components/blocks/landing-hero/LandingHero.types.d.ts +7 -3
- package/dist/components/blocks/logo-columns/LogoColumns.css +1 -0
- package/dist/components/blocks/logo-rows/LogoRows.css +1 -0
- package/dist/components/blocks/page-header/PageHeader.css +1 -0
- package/dist/components/blocks/page-header/PageHeader.d.ts +1 -1
- package/dist/components/blocks/page-header/PageHeader.js +3 -2
- package/dist/components/blocks/page-header/PageHeader.types.d.ts +6 -0
- package/dist/components/blocks/page-header/PageHeader.types.js +1 -1
- package/dist/components/blocks/page-header/page-header-impl.css +10 -0
- package/dist/components/blocks/product-hero/ProductHero.css +8 -3
- package/dist/components/blocks/product-hero/ProductHero.d.ts +1 -1
- package/dist/components/blocks/product-hero/ProductHero.js +5 -2
- package/dist/components/blocks/product-hero/ProductHero.types.d.ts +5 -1
- package/dist/components/blocks/product-hero/ProductHero.types.js +1 -0
- package/dist/components/blocks/product-hero/product-hero-impl.css +43 -12
- package/dist/components/blocks/resource-banner/ResourceBanner.css +106 -0
- package/dist/components/blocks/resource-banner/ResourceBanner.d.ts +32 -0
- package/dist/components/blocks/resource-banner/ResourceBanner.js +51 -0
- package/dist/components/blocks/resource-banner/ResourceBanner.types.d.ts +44 -0
- package/dist/components/blocks/resource-banner/ResourceBanner.types.js +14 -0
- package/dist/components/blocks/resource-banner/resource-banner-impl.css +69 -0
- package/dist/components/blocks/scene-scroll/SceneScroll.css +93 -0
- package/dist/components/blocks/scene-scroll/SceneScroll.d.ts +36 -0
- package/dist/components/blocks/scene-scroll/SceneScroll.js +54 -0
- package/dist/components/blocks/scene-scroll/SceneScroll.types.d.ts +32 -0
- package/dist/components/blocks/scene-scroll/SceneScroll.types.js +15 -0
- package/dist/components/blocks/scene-scroll/scene-scroll-impl.css +275 -0
- package/dist/components/blocks/stats/Stats.css +139 -0
- package/dist/components/blocks/stats/Stats.d.ts +24 -0
- package/dist/components/blocks/stats/Stats.js +120 -0
- package/dist/components/blocks/stats/Stats.types.d.ts +36 -0
- package/dist/components/blocks/stats/Stats.types.js +19 -0
- package/dist/components/blocks/stats/stats-count.d.ts +34 -0
- package/dist/components/blocks/stats/stats-count.js +61 -0
- package/dist/components/blocks/stats/stats-impl.css +284 -0
- package/dist/components/blocks/stats/use-wheel.d.ts +37 -0
- package/dist/components/blocks/stats/use-wheel.js +126 -0
- package/dist/components/blocks/steps/Steps.css +202 -0
- package/dist/components/blocks/steps/Steps.d.ts +32 -0
- package/dist/components/blocks/steps/Steps.js +65 -0
- package/dist/components/blocks/steps/Steps.types.d.ts +48 -0
- package/dist/components/blocks/steps/Steps.types.js +21 -0
- package/dist/components/blocks/steps/steps-impl.css +216 -0
- package/dist/components/blocks/steps/use-turn.d.ts +33 -0
- package/dist/components/blocks/steps/use-turn.js +75 -0
- package/dist/components/blocks/sticky-cards/StickyCards.css +154 -0
- package/dist/components/blocks/sticky-cards/StickyCards.d.ts +35 -0
- package/dist/components/blocks/sticky-cards/StickyCards.js +153 -0
- package/dist/components/blocks/sticky-cards/StickyCards.types.d.ts +43 -0
- package/dist/components/blocks/sticky-cards/StickyCards.types.js +18 -0
- package/dist/components/blocks/sticky-cards/sticky-cards-impl.css +393 -0
- package/dist/components/blocks/team-grid/TeamGrid.css +159 -0
- package/dist/components/blocks/team-grid/TeamGrid.d.ts +28 -0
- package/dist/components/blocks/team-grid/TeamGrid.js +74 -0
- package/dist/components/blocks/team-grid/TeamGrid.types.d.ts +51 -0
- package/dist/components/blocks/team-grid/TeamGrid.types.js +20 -0
- package/dist/components/blocks/team-grid/team-grid-impl.css +129 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.css +1 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.d.ts +1 -1
- package/dist/components/blocks/testimonial-row/TestimonialRow.js +4 -3
- package/dist/components/blocks/testimonial-row/TestimonialRow.types.d.ts +3 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.types.js +1 -1
- package/dist/components/blocks/testimonial-row/testimonial-row-impl.css +8 -0
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.css +1 -0
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.d.ts +1 -1
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.js +2 -2
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.d.ts +8 -0
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.js +1 -1
- package/dist/components/blocks/text-scroll/TextScroll.css +53 -0
- package/dist/components/blocks/text-scroll/TextScroll.d.ts +5 -0
- package/dist/components/blocks/text-scroll/TextScroll.js +71 -0
- package/dist/components/blocks/text-scroll/TextScroll.types.d.ts +22 -0
- package/dist/components/blocks/text-scroll/TextScroll.types.js +10 -0
- package/dist/components/blocks/text-scroll/text-scroll-impl.css +115 -0
- package/dist/components/blocks/tiers/Tiers.css +233 -0
- package/dist/components/blocks/tiers/Tiers.d.ts +32 -0
- package/dist/components/blocks/tiers/Tiers.js +68 -0
- package/dist/components/blocks/tiers/Tiers.types.d.ts +45 -0
- package/dist/components/blocks/tiers/Tiers.types.js +25 -0
- package/dist/components/blocks/tiers/tiers-impl.css +185 -0
- package/dist/components/blocks/use-rotation.d.ts +12 -2
- package/dist/components/blocks/use-rotation.js +6 -28
- package/dist/components/comparison-cards-data.d.ts +59 -0
- package/dist/components/comparison-cards-data.js +12 -0
- package/dist/components/comparison-table-data.d.ts +39 -0
- package/dist/components/comparison-table-data.js +11 -0
- package/dist/components/core/accordion-item/AccordionItem.css +1 -5
- package/dist/components/core/background/Background.css +92 -0
- package/dist/components/core/background/Background.d.ts +27 -0
- package/dist/components/core/background/Background.js +45 -0
- package/dist/components/core/background/Background.types.d.ts +39 -0
- package/dist/components/core/background/Background.types.js +11 -0
- package/dist/components/core/background/background-impl.css +760 -0
- package/dist/components/core/background/halftone.d.ts +134 -0
- package/dist/components/core/background/halftone.js +722 -0
- package/dist/components/core/background/patterns.d.ts +66 -0
- package/dist/components/core/background/patterns.js +244 -0
- package/dist/components/core/background/shader.d.ts +44 -0
- package/dist/components/core/background/shader.js +307 -0
- package/dist/components/core/background/use-halftone.d.ts +15 -0
- package/dist/components/core/background/use-halftone.js +27 -0
- package/dist/components/core/background/use-offscreen.d.ts +10 -0
- package/dist/components/core/background/use-offscreen.js +30 -0
- package/dist/components/core/background/use-shader.d.ts +11 -0
- package/dist/components/core/background/use-shader.js +25 -0
- package/dist/components/core/background/use-spotlight.d.ts +14 -0
- package/dist/components/core/background/use-spotlight.js +73 -0
- package/dist/components/core/bottom-sheet/BottomSheet.js +2 -2
- package/dist/components/core/bottom-sheet/BottomSheet.types.d.ts +3 -1
- package/dist/components/core/breadcrumb/Breadcrumb.d.ts +1 -0
- package/dist/components/core/breadcrumb/Breadcrumb.js +1 -0
- package/dist/components/core/breadcrumb/breadcrumb-impl.css +11 -0
- package/dist/components/core/button/button-impl.css +14 -1
- package/dist/components/core/illustration-card/IllustrationCard.css +40 -0
- package/dist/components/core/illustration-card/IllustrationCard.d.ts +22 -0
- package/dist/components/core/illustration-card/IllustrationCard.js +82 -0
- package/dist/components/core/illustration-card/IllustrationCard.types.d.ts +23 -0
- package/dist/components/core/illustration-card/IllustrationCard.types.js +8 -0
- package/dist/components/core/illustration-card/illustration-card-impl.css +47 -0
- package/dist/components/core/illustration-scene/IllustrationScene.css +41 -0
- package/dist/components/core/illustration-scene/IllustrationScene.d.ts +14 -0
- package/dist/components/core/illustration-scene/IllustrationScene.js +16 -0
- package/dist/components/core/illustration-scene/IllustrationScene.types.d.ts +32 -0
- package/dist/components/core/illustration-scene/IllustrationScene.types.js +8 -0
- package/dist/components/core/illustration-scene/illustration-scene-impl.css +46 -0
- package/dist/components/core/link/Link.js +7 -3
- package/dist/components/core/link/link-impl.css +29 -2
- package/dist/components/core/navbar/Navbar.css +2 -2
- package/dist/components/core/navbar/Navbar.types.d.ts +1 -1
- package/dist/components/core/navbar-item/NavbarItem.d.ts +2 -1
- package/dist/components/core/navbar-item/NavbarItem.js +3 -10
- package/dist/components/core/navbar-item/NavbarItem.types.d.ts +4 -1
- package/dist/components/core/navbar-item/NavbarItem.types.js +1 -1
- package/dist/components/core/navbar-item/navbar-item-impl.css +10 -0
- package/dist/components/core/navbar-menu/navbar-menu-impl.css +9 -0
- package/dist/components/core/navbar-switcher/navbar-switcher-impl.css +19 -0
- package/dist/components/core/pagination/Pagination.js +1 -1
- package/dist/components/core/pagination/pagination-impl.css +9 -0
- package/dist/components/core/pagination-dots/PaginationDots.d.ts +1 -1
- package/dist/components/core/pagination-dots/PaginationDots.js +3 -3
- package/dist/components/core/pagination-dots/PaginationDots.types.d.ts +3 -1
- package/dist/components/core/segmented-control/SegmentedControl.css +4 -3
- package/dist/components/core/segmented-control/SegmentedControl.js +17 -3
- package/dist/components/core/segmented-control-item/SegmentedControlItem.css +2 -1
- package/dist/components/core/select/Select.js +3 -3
- package/dist/components/core/select/Select.types.d.ts +11 -1
- package/dist/components/core/select/Select.types.js +1 -1
- package/dist/components/core/tab-list/TabList.js +9 -1
- package/dist/components/core/table-header-cell/TableHeaderCell.d.ts +1 -1
- package/dist/components/core/table-header-cell/TableHeaderCell.js +5 -2
- package/dist/components/core/table-header-cell/TableHeaderCell.types.d.ts +7 -1
- package/dist/components/core/table-header-cell/TableHeaderCell.types.js +1 -1
- package/dist/components/core/text-area/TextArea.d.ts +1 -1
- package/dist/components/core/text-area/TextArea.js +2 -2
- package/dist/components/core/text-area/TextArea.types.d.ts +9 -1
- package/dist/components/core/text-area/TextArea.types.js +1 -1
- package/dist/components/core/text-input/TextInput.d.ts +1 -1
- package/dist/components/core/text-input/TextInput.js +2 -2
- package/dist/components/core/text-input/TextInput.types.d.ts +9 -1
- package/dist/components/core/text-input/TextInput.types.js +1 -1
- package/dist/components/data-table-data.d.ts +33 -0
- package/dist/components/data-table-data.js +12 -0
- package/dist/components/download-banner-data.d.ts +52 -0
- package/dist/components/download-banner-data.js +11 -0
- package/dist/components/index.d.ts +51 -0
- package/dist/components/index.js +38 -0
- package/dist/components/resource-banner-data.d.ts +34 -0
- package/dist/components/resource-banner-data.js +13 -0
- package/dist/components/scene-scroll-data.d.ts +24 -0
- package/dist/components/scene-scroll-data.js +9 -0
- package/dist/components/stats-data.d.ts +28 -0
- package/dist/components/stats-data.js +11 -0
- package/dist/components/steps-data.d.ts +38 -0
- package/dist/components/steps-data.js +13 -0
- package/dist/components/sticky-cards-data.d.ts +43 -0
- package/dist/components/sticky-cards-data.js +12 -0
- package/dist/components/team-grid-data.d.ts +38 -0
- package/dist/components/team-grid-data.js +11 -0
- package/dist/components/tiers-data.d.ts +47 -0
- package/dist/components/tiers-data.js +13 -0
- package/dist/marketing.css +101 -28
- package/package.json +1 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import './IllustrationCard.css';
|
|
2
|
+
import './illustration-card-impl.css';
|
|
3
|
+
import { type IllustrationCardProps } from './IllustrationCard.types.js';
|
|
4
|
+
export type { IllustrationCardProps };
|
|
5
|
+
/**
|
|
6
|
+
* A pane of glass holding a picture of the product, in one of three shapes.
|
|
7
|
+
*
|
|
8
|
+
* The shape and the surface are this component's and nobody else's — that is the whole reason it
|
|
9
|
+
* exists. Every picture of this kind across a site is four by three, square or three by four, and is
|
|
10
|
+
* the same glass, because those are the two things each page would otherwise decide for itself and
|
|
11
|
+
* decide differently. What the pane shows is the page's.
|
|
12
|
+
*
|
|
13
|
+
* Everything inside is illustrative. The pane is one image to assistive technology, described by
|
|
14
|
+
* `label`, and its contents are `inert`: real components draw it, so it looks exactly like the
|
|
15
|
+
* product, and none of them can be focused, pressed or typed into.
|
|
16
|
+
*
|
|
17
|
+
* And it scales like a picture. The UI is laid out at its own size and, where the pane is too small
|
|
18
|
+
* to hold it, scaled down as a whole to fit — never up — so a pane on a phone shows the same picture
|
|
19
|
+
* smaller rather than text overlapping or cut off. The scale is worked out when the pane changes
|
|
20
|
+
* size and at no other time.
|
|
21
|
+
*/
|
|
22
|
+
export declare function IllustrationCard({ ratio, label, children, ...rest }: IllustrationCardProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useLayoutEffect, useRef } from 'react';
|
|
4
|
+
import './IllustrationCard.css';
|
|
5
|
+
import './illustration-card-impl.css';
|
|
6
|
+
import { illustrationCardDefaults, illustrationCardParts, } from './IllustrationCard.types.js';
|
|
7
|
+
/**
|
|
8
|
+
* A pane of glass holding a picture of the product, in one of three shapes.
|
|
9
|
+
*
|
|
10
|
+
* The shape and the surface are this component's and nobody else's — that is the whole reason it
|
|
11
|
+
* exists. Every picture of this kind across a site is four by three, square or three by four, and is
|
|
12
|
+
* the same glass, because those are the two things each page would otherwise decide for itself and
|
|
13
|
+
* decide differently. What the pane shows is the page's.
|
|
14
|
+
*
|
|
15
|
+
* Everything inside is illustrative. The pane is one image to assistive technology, described by
|
|
16
|
+
* `label`, and its contents are `inert`: real components draw it, so it looks exactly like the
|
|
17
|
+
* product, and none of them can be focused, pressed or typed into.
|
|
18
|
+
*
|
|
19
|
+
* And it scales like a picture. The UI is laid out at its own size and, where the pane is too small
|
|
20
|
+
* to hold it, scaled down as a whole to fit — never up — so a pane on a phone shows the same picture
|
|
21
|
+
* smaller rather than text overlapping or cut off. The scale is worked out when the pane changes
|
|
22
|
+
* size and at no other time.
|
|
23
|
+
*/
|
|
24
|
+
export function IllustrationCard({ ratio = illustrationCardDefaults.ratio, label, children, ...rest }) {
|
|
25
|
+
const pane = useRef(null);
|
|
26
|
+
const content = useRef(null);
|
|
27
|
+
useLayoutEffect(() => {
|
|
28
|
+
const root = pane.current;
|
|
29
|
+
const inner = content.current;
|
|
30
|
+
if (root === null || inner === null || typeof ResizeObserver === 'undefined')
|
|
31
|
+
return undefined;
|
|
32
|
+
const fit = () => {
|
|
33
|
+
const style = getComputedStyle(root);
|
|
34
|
+
const across = root.clientWidth - Number.parseFloat(style.paddingInlineStart) - Number.parseFloat(style.paddingInlineEnd);
|
|
35
|
+
const down = root.clientHeight - Number.parseFloat(style.paddingBlockStart) - Number.parseFloat(style.paddingBlockEnd);
|
|
36
|
+
if (across <= 0 || down <= 0)
|
|
37
|
+
return;
|
|
38
|
+
// Laid out unscaled at the pane's own width, to see how much room the UI wants there — down,
|
|
39
|
+
// and across, since a line that cannot wrap (a large figure) overflows sideways.
|
|
40
|
+
inner.style.transform = '';
|
|
41
|
+
inner.style.inlineSize = `${across}px`;
|
|
42
|
+
const tall = inner.scrollHeight;
|
|
43
|
+
const wide = inner.scrollWidth;
|
|
44
|
+
const scale = Math.min(1, down / tall, across / wide);
|
|
45
|
+
if (scale >= 1) {
|
|
46
|
+
inner.style.inlineSize = '';
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// Scaled, the UI is narrower than the pane too; laying it out wider by the same factor gives
|
|
50
|
+
// the width back, so the picture fills the pane across as well as down. Wider, it can only
|
|
51
|
+
// wrap less and so be shorter, which keeps it inside the pane.
|
|
52
|
+
inner.style.inlineSize = `${across / scale}px`;
|
|
53
|
+
inner.style.transformOrigin = style.direction === 'rtl' ? 'top right' : 'top left';
|
|
54
|
+
inner.style.transform = `scale(${scale})`;
|
|
55
|
+
};
|
|
56
|
+
// Fitted again only when something can have changed: the pane's size, the size of what it
|
|
57
|
+
// holds, or the typeface arriving — before it does, the UI is measured in a fallback face of a
|
|
58
|
+
// different size. Batched to one fit a frame; scaling is a transform and does not resize what
|
|
59
|
+
// is observed, so a fit does not set off another.
|
|
60
|
+
let queued = 0;
|
|
61
|
+
const refit = () => {
|
|
62
|
+
if (queued !== 0)
|
|
63
|
+
return;
|
|
64
|
+
queued = requestAnimationFrame(() => {
|
|
65
|
+
queued = 0;
|
|
66
|
+
fit();
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
const watch = new ResizeObserver(refit);
|
|
70
|
+
watch.observe(root);
|
|
71
|
+
for (const child of Array.from(inner.children))
|
|
72
|
+
watch.observe(child);
|
|
73
|
+
void document.fonts?.ready.then(refit);
|
|
74
|
+
fit();
|
|
75
|
+
return () => {
|
|
76
|
+
watch.disconnect();
|
|
77
|
+
if (queued !== 0)
|
|
78
|
+
cancelAnimationFrame(queued);
|
|
79
|
+
};
|
|
80
|
+
}, []);
|
|
81
|
+
return (_jsx("div", { ...rest, ref: pane, className: illustrationCardParts.root, "data-ratio": ratio, "data-theme": "dark", role: "img", "aria-label": label, children: _jsx("div", { ref: content, className: illustrationCardParts.content, inert: true, children: children }) }));
|
|
82
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { HTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
export interface IllustrationCardOwnProps {
|
|
3
|
+
/**
|
|
4
|
+
* `landscape` — Four by three, and the default. For a panel beside words in a wide section
|
|
5
|
+
* `square` — One by one. For a grid of panels, or a column no wider than it is tall
|
|
6
|
+
* `upright` — Three by four. For a phone, or a narrow column beside a tall run of words
|
|
7
|
+
*/
|
|
8
|
+
ratio?: 'landscape' | 'square' | 'upright';
|
|
9
|
+
/** Always. What the picture shows, in a sentence — "Trade ticket: buy Gold to rise over 5 minutes, staking 10 USD". The pane is one image to assistive technology and this is its whole description; nothing inside it is read out on its own */
|
|
10
|
+
label: string;
|
|
11
|
+
/** Allowed: any content */
|
|
12
|
+
children: ReactNode;
|
|
13
|
+
}
|
|
14
|
+
export type IllustrationCardProps = IllustrationCardOwnProps & Omit<HTMLAttributes<HTMLDivElement>, 'className' | 'ratio' | 'label'>;
|
|
15
|
+
/** The class each part carries. Apply these — do not retype them. */
|
|
16
|
+
export declare const illustrationCardParts: {
|
|
17
|
+
readonly root: "dds-illustrationcard";
|
|
18
|
+
readonly content: "dds-illustrationcard__content";
|
|
19
|
+
};
|
|
20
|
+
/** Generated so defaults cannot drift from the contract. */
|
|
21
|
+
export declare const illustrationCardDefaults: {
|
|
22
|
+
readonly ratio: "landscape";
|
|
23
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// GENERATED from illustration-card.contract.json. Do not edit.
|
|
2
|
+
/** The class each part carries. Apply these — do not retype them. */
|
|
3
|
+
export const illustrationCardParts = {
|
|
4
|
+
root: 'dds-illustrationcard',
|
|
5
|
+
content: 'dds-illustrationcard__content',
|
|
6
|
+
};
|
|
7
|
+
/** Generated so defaults cannot drift from the contract. */
|
|
8
|
+
export const illustrationCardDefaults = { ratio: 'landscape' };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Scoped to this package, like the generated sheet beside it.
|
|
3
|
+
*
|
|
4
|
+
* `:where([data-dds-context="marketing"])` confines these rules without contributing
|
|
5
|
+
* specificity, so every override below still ties or beats exactly what it did before.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* The glass: whatever is behind the pane, blurred. The fill is bound in the contract —
|
|
10
|
+
* color.bg.surface-glass — and the blur is here because `blur()` is a function no binding can
|
|
11
|
+
* name, the same division navbar-material.css makes. size.backdrop-blur is enough that what is
|
|
12
|
+
* behind stops reading as detail, so the UI on the pane stays legible.
|
|
13
|
+
*/
|
|
14
|
+
:where([data-dds-context="marketing"]) .dds-illustrationcard {
|
|
15
|
+
-webkit-backdrop-filter: blur(var(--size-backdrop-blur));
|
|
16
|
+
backdrop-filter: blur(var(--size-backdrop-blur));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/*
|
|
20
|
+
* Standing on its own, the glass is laid over the dark page rather than over whatever page it is on.
|
|
21
|
+
*
|
|
22
|
+
* The pane is dark in both themes — see `data-theme` in IllustrationCard.tsx — and the dark glass is
|
|
23
|
+
* a faint white, which is only the charcoal pane it is meant to be over the dark page's near-black.
|
|
24
|
+
* Over a light page the same glass came out near-white, behind the dark theme's white ink. So the
|
|
25
|
+
* dark page's ground goes under it, and the card is the same charcoal on every page.
|
|
26
|
+
*
|
|
27
|
+
* Not in a scene, where the glass is there to show the photograph through it.
|
|
28
|
+
*/
|
|
29
|
+
:where([data-dds-context="marketing"]) .dds-illustrationcard {
|
|
30
|
+
background-color: var(--color-bg-page);
|
|
31
|
+
background-image: linear-gradient(var(--color-bg-surface-glass), var(--color-bg-surface-glass));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
:where([data-dds-context="marketing"]) .dds-illustrationscene .dds-illustrationcard {
|
|
35
|
+
background-color: var(--color-bg-surface-glass);
|
|
36
|
+
background-image: none;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/*
|
|
40
|
+
* What the pane holds keeps its own size: nothing in it shrinks to make room, because a shrunk item
|
|
41
|
+
* in a flex column overlaps the next one. Where the UI is taller than the pane, IllustrationCard
|
|
42
|
+
* scales the whole of it down to fit, as a picture would be; until that has run — on a server
|
|
43
|
+
* render — whatever does not fit is clipped at the pane's edge.
|
|
44
|
+
*/
|
|
45
|
+
:where([data-dds-context="marketing"]) .dds-illustrationcard .dds-illustrationcard__content > * {
|
|
46
|
+
flex-shrink: 0;
|
|
47
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/* GENERATED from illustrationscene.contract.json. Do not edit. */
|
|
2
|
+
|
|
3
|
+
:where([data-dds-context="marketing"]) .dds-illustrationscene {
|
|
4
|
+
align-items: center;
|
|
5
|
+
box-sizing: border-box;
|
|
6
|
+
display: grid;
|
|
7
|
+
inline-size: 100%;
|
|
8
|
+
isolation: isolate;
|
|
9
|
+
overflow: hidden;
|
|
10
|
+
position: relative;
|
|
11
|
+
border-radius: var(--radius-surface);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
:where([data-dds-context="marketing"]) .dds-illustrationscene .dds-illustrationscene__image {
|
|
15
|
+
block-size: 100%;
|
|
16
|
+
inline-size: 100%;
|
|
17
|
+
object-fit: cover;
|
|
18
|
+
background-color: var(--color-bg-surface);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
:where([data-dds-context="marketing"]) .dds-illustrationscene[data-placement="bottom"] {
|
|
22
|
+
align-items: end;
|
|
23
|
+
justify-items: center;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
:where([data-dds-context="marketing"]) .dds-illustrationscene[data-placement="center"] {
|
|
27
|
+
justify-items: center;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
:where([data-dds-context="marketing"]) .dds-illustrationscene[data-ratio="landscape"] {
|
|
31
|
+
aspect-ratio: var(--aspect-landscape);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
:where([data-dds-context="marketing"]) .dds-illustrationscene[data-ratio="square"] {
|
|
35
|
+
aspect-ratio: var(--aspect-square);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
:where([data-dds-context="marketing"]) .dds-illustrationscene[data-ratio="upright"] {
|
|
39
|
+
aspect-ratio: var(--aspect-upright);
|
|
40
|
+
}
|
|
41
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import './IllustrationScene.css';
|
|
2
|
+
import './illustration-scene-impl.css';
|
|
3
|
+
import { type IllustrationSceneProps } from './IllustrationScene.types.js';
|
|
4
|
+
export type { IllustrationSceneProps };
|
|
5
|
+
/**
|
|
6
|
+
* A photograph with an IllustrationCard laid over it, in one of three shapes.
|
|
7
|
+
*
|
|
8
|
+
* The scene owns how the two meet — the shape, the card's share of the frame, where it sits — so
|
|
9
|
+
* every picture of the product in use is composed the same way across a site. The photograph is
|
|
10
|
+
* decoration unless `alt` says otherwise; the card's own label describes the whole picture.
|
|
11
|
+
*
|
|
12
|
+
* No state and no script, so it renders on a server as it is.
|
|
13
|
+
*/
|
|
14
|
+
export declare function IllustrationScene({ ratio, placement, src, alt, children, ...rest }: IllustrationSceneProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import './IllustrationScene.css';
|
|
3
|
+
import './illustration-scene-impl.css';
|
|
4
|
+
import { illustrationSceneDefaults, illustrationSceneParts, } from './IllustrationScene.types.js';
|
|
5
|
+
/**
|
|
6
|
+
* A photograph with an IllustrationCard laid over it, in one of three shapes.
|
|
7
|
+
*
|
|
8
|
+
* The scene owns how the two meet — the shape, the card's share of the frame, where it sits — so
|
|
9
|
+
* every picture of the product in use is composed the same way across a site. The photograph is
|
|
10
|
+
* decoration unless `alt` says otherwise; the card's own label describes the whole picture.
|
|
11
|
+
*
|
|
12
|
+
* No state and no script, so it renders on a server as it is.
|
|
13
|
+
*/
|
|
14
|
+
export function IllustrationScene({ ratio = illustrationSceneDefaults.ratio, placement = illustrationSceneDefaults.placement, src, alt = illustrationSceneDefaults.alt, children, ...rest }) {
|
|
15
|
+
return (_jsxs("div", { ...rest, className: illustrationSceneParts.root, "data-ratio": ratio, "data-placement": placement, children: [_jsx("img", { className: illustrationSceneParts.image, src: src, alt: alt }), children] }));
|
|
16
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { HTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
export interface IllustrationSceneOwnProps {
|
|
3
|
+
/**
|
|
4
|
+
* `landscape` — Four by three. A scene beside words in a wide section; the card takes a little under half the width
|
|
5
|
+
* `square` — One by one, and the default — the shape most such scenes are drawn in. The card takes a little over half the width
|
|
6
|
+
* `upright` — Three by four. A scene on a phone or in a narrow column; the card takes most of the width
|
|
7
|
+
*/
|
|
8
|
+
ratio?: 'landscape' | 'square' | 'upright';
|
|
9
|
+
/**
|
|
10
|
+
* `center` — The default: the card in the middle of the frame. For a photograph whose subject frames the middle — a person looking down at what the card shows
|
|
11
|
+
* `bottom` — The card centred along the foot of the frame, held off it by the card's own inset — for a photograph whose subject fills the top: a face, a person reaching up, a skyline
|
|
12
|
+
*/
|
|
13
|
+
placement?: 'center' | 'bottom';
|
|
14
|
+
/** Always. The photograph the scene is set in */
|
|
15
|
+
src: string;
|
|
16
|
+
/** Empty by default, because the card's `label` describes the whole picture and the photograph is decoration. Write one only where the photograph says something the label does not */
|
|
17
|
+
alt?: string;
|
|
18
|
+
/** Allowed: IllustrationCard */
|
|
19
|
+
children: ReactNode;
|
|
20
|
+
}
|
|
21
|
+
export type IllustrationSceneProps = IllustrationSceneOwnProps & Omit<HTMLAttributes<HTMLDivElement>, 'className' | 'ratio' | 'placement' | 'src' | 'alt'>;
|
|
22
|
+
/** The class each part carries. Apply these — do not retype them. */
|
|
23
|
+
export declare const illustrationSceneParts: {
|
|
24
|
+
readonly root: "dds-illustrationscene";
|
|
25
|
+
readonly image: "dds-illustrationscene__image";
|
|
26
|
+
};
|
|
27
|
+
/** Generated so defaults cannot drift from the contract. */
|
|
28
|
+
export declare const illustrationSceneDefaults: {
|
|
29
|
+
readonly ratio: "square";
|
|
30
|
+
readonly placement: "center";
|
|
31
|
+
readonly alt: "";
|
|
32
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// GENERATED from illustration-scene.contract.json. Do not edit.
|
|
2
|
+
/** The class each part carries. Apply these — do not retype them. */
|
|
3
|
+
export const illustrationSceneParts = {
|
|
4
|
+
root: 'dds-illustrationscene',
|
|
5
|
+
image: 'dds-illustrationscene__image',
|
|
6
|
+
};
|
|
7
|
+
/** Generated so defaults cannot drift from the contract. */
|
|
8
|
+
export const illustrationSceneDefaults = { ratio: 'square', placement: 'center', alt: '' };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Scoped to this package, like the generated sheet beside it.
|
|
3
|
+
*
|
|
4
|
+
* `:where([data-dds-context="marketing"])` confines these rules without contributing
|
|
5
|
+
* specificity, so every override below still ties or beats exactly what it did before.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* The photograph fills the frame behind everything; the card sits in the frame's one grid cell
|
|
10
|
+
* over it. Both share the cell, so the card is placed by the grid's own alignment — centred, or
|
|
11
|
+
* to one edge — and the photograph is laid underneath by coming first.
|
|
12
|
+
*/
|
|
13
|
+
:where([data-dds-context="marketing"]) .dds-illustrationscene > * {
|
|
14
|
+
grid-area: 1 / 1;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
:where([data-dds-context="marketing"]) .dds-illustrationscene .dds-illustrationscene__image {
|
|
18
|
+
align-self: stretch;
|
|
19
|
+
justify-self: stretch;
|
|
20
|
+
display: block;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/*
|
|
24
|
+
* The card's share of the frame, per shape: a little under half of a wide frame, a little over half
|
|
25
|
+
* of a square one, most of a tall one. Proportions of the frame rather than measures — a scene is
|
|
26
|
+
* drawn at whatever width its column gives it, and the composition has to hold at all of them.
|
|
27
|
+
* Held off the frame's edges by space.inset.card, so it never touches them.
|
|
28
|
+
*/
|
|
29
|
+
:where([data-dds-context="marketing"]) .dds-illustrationscene > .dds-illustrationcard {
|
|
30
|
+
inline-size: 46%;
|
|
31
|
+
margin-inline: var(--space-inset-card);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* At the foot, the same inset below the card as either side of it. Only there: under a centred card
|
|
35
|
+
a margin would lift it off the middle by half the inset. */
|
|
36
|
+
:where([data-dds-context="marketing"]) .dds-illustrationscene[data-placement='bottom'] > .dds-illustrationcard {
|
|
37
|
+
margin-block-end: var(--space-inset-card);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
:where([data-dds-context="marketing"]) .dds-illustrationscene[data-ratio='square'] > .dds-illustrationcard {
|
|
41
|
+
inline-size: 58%;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
:where([data-dds-context="marketing"]) .dds-illustrationscene[data-ratio='upright'] > .dds-illustrationcard {
|
|
45
|
+
inline-size: 78%;
|
|
46
|
+
}
|
|
@@ -123,9 +123,13 @@ export function Link({ variant = linkDefaults.variant, tone = linkDefaults.tone,
|
|
|
123
123
|
same distance measured along the diagonal rather than four pixels twice.
|
|
124
124
|
*/
|
|
125
125
|
style: {
|
|
126
|
+
/*
|
|
127
|
+
The two axes apart, so the stylesheet can turn the inline one round in a
|
|
128
|
+
right-to-left line — where the arrow is mirrored and travels the other way.
|
|
129
|
+
*/
|
|
126
130
|
...(external
|
|
127
|
-
? { '--dds-link-arrow-travel': '18% -18%' }
|
|
128
|
-
: { '--dds-link-arrow-travel': '25% 0' }),
|
|
131
|
+
? { '--dds-link-arrow-travel-x': '18%', '--dds-link-arrow-travel-y': '-18%' }
|
|
132
|
+
: { '--dds-link-arrow-travel-x': '25%', '--dds-link-arrow-travel-y': '0%' }),
|
|
129
133
|
/*
|
|
130
134
|
A list link's mark rests displaced and at zero, and the pointer
|
|
131
135
|
brings it to where it belongs — the arrival and the nudge are the
|
|
@@ -135,7 +139,7 @@ export function Link({ variant = linkDefaults.variant, tone = linkDefaults.tone,
|
|
|
135
139
|
them.
|
|
136
140
|
*/
|
|
137
141
|
...(revealOnHover
|
|
138
|
-
? { '--dds-link-arrow-rest-travel': '-60%
|
|
142
|
+
? { '--dds-link-arrow-rest-travel-x': '-60%', '--dds-link-arrow-rest': '0' }
|
|
139
143
|
: {}),
|
|
140
144
|
}, children: _jsx(Icon, { size: "xs", children: trailing }) }))] }));
|
|
141
145
|
}
|
|
@@ -144,14 +144,28 @@
|
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
:where([data-dds-context="marketing"]) .dds-link__icon-trailing .dds-icon {
|
|
147
|
-
translate: var(--dds-link-arrow-rest-travel, 0 0
|
|
147
|
+
translate: calc(var(--dds-link-arrow-rest-travel-x, 0%) * var(--dds-link-arrow-sign, 1)) 0;
|
|
148
148
|
transition-property: translate;
|
|
149
149
|
transition-duration: var(--motion-duration-normal);
|
|
150
150
|
transition-timing-function: var(--motion-easing-standard);
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
:where([data-dds-context="marketing"]) .dds-link:hover .dds-link__icon-trailing .dds-icon {
|
|
154
|
-
translate: var(--dds-link-arrow-travel, 0 0);
|
|
154
|
+
translate: calc(var(--dds-link-arrow-travel-x, 0%) * var(--dds-link-arrow-sign, 1)) var(--dds-link-arrow-travel-y, 0%);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/*
|
|
158
|
+
* A right-to-left line reads the other way, so the arrow points the other way: mirrored, and
|
|
159
|
+
* travelling along the line it now points down. Mirroring the glyph and not the box around it,
|
|
160
|
+
* because the box carries the gap to the words as padding on its inline start, and a mirrored box
|
|
161
|
+
* would draw the arrow against the words with the gap on its far side.
|
|
162
|
+
*
|
|
163
|
+
* The external arrow mirrors too — up and to the start of the line, which is where "out of this
|
|
164
|
+
* page" points in a script that reads leftward.
|
|
165
|
+
*/
|
|
166
|
+
:where([data-dds-context="marketing"]) .dds-link__icon-trailing .dds-icon:dir(rtl) {
|
|
167
|
+
--dds-link-arrow-sign: -1;
|
|
168
|
+
scale: -1 1;
|
|
155
169
|
}
|
|
156
170
|
|
|
157
171
|
/*
|
|
@@ -166,3 +180,16 @@
|
|
|
166
180
|
translate: none;
|
|
167
181
|
}
|
|
168
182
|
}
|
|
183
|
+
|
|
184
|
+
/*
|
|
185
|
+
* A link that inherits its ink draws its focus ring in that ink.
|
|
186
|
+
*
|
|
187
|
+
* `tone="inherit"` is the link a page puts on a ground of its own — a dark panel, the brand's
|
|
188
|
+
* band — where color.border.focus, the page's near-black in light mode, sat on a near-black panel
|
|
189
|
+
* at about 1.2:1 and the ring vanished: ResourceBanner's links in light mode, TeamGrid's on the dark
|
|
190
|
+
* band. The words already contrast with whatever they sit on, which is what `inherit` is for, so
|
|
191
|
+
* the ring takes the words' colour and reads wherever they do.
|
|
192
|
+
*/
|
|
193
|
+
:where([data-dds-context="marketing"]) .dds-link[data-tone="inherit"]:focus-visible {
|
|
194
|
+
outline-color: currentcolor;
|
|
195
|
+
}
|
|
@@ -121,11 +121,11 @@
|
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
:where([data-dds-context="marketing"]) .dds-navbar[data-tone="inverse"] .dds-navbar__cluster {
|
|
124
|
-
background-color: var(--color-bg-surface-translucent-on-brand-strong);
|
|
124
|
+
background-color: var(--color-bg-surface-translucent-tint-on-brand-strong);
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
:where([data-dds-context="marketing"]) .dds-navbar[data-tone="inverse"] .dds-navbar__ground {
|
|
128
|
-
background-color: var(--color-bg-surface-translucent-on-brand-strong);
|
|
128
|
+
background-color: var(--color-bg-surface-translucent-tint-on-brand-strong);
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
:where([data-dds-context="marketing"]) .dds-navbar[data-tone="inverse"] .dds-navbar__trigger:focus-visible {
|
|
@@ -2,7 +2,7 @@ import type { HTMLAttributes, ReactNode } from 'react';
|
|
|
2
2
|
export interface NavbarOwnProps {
|
|
3
3
|
/**
|
|
4
4
|
* `default` — The page begins on a light ground, which is most marketing pages. The bar paints in ink and the pill is paper
|
|
5
|
-
* `inverse` — The first section of the page paints its own dark ground and the bar stands on it — a dark hero, a photograph, a brand-coloured takeover. The bar's ink runs light, and the pill and the collapsed bar take
|
|
5
|
+
* `inverse` — The first section of the page paints its own dark ground and the bar stands on it — a dark hero, a photograph, a brand-coloured takeover. The bar's ink runs light, and the pill and the collapsed bar take a frosted white glass — a faint white base, a white tint over it and a blur — so the dark ground or the photograph shows through it, lightened, rather than a black slab standing on it. Choose a photograph dark where the bar sits: the glass lightens what is behind it and does not darken it
|
|
6
6
|
*/
|
|
7
7
|
tone?: 'default' | 'inverse';
|
|
8
8
|
/** Always — it names the navigation landmark, and a page with an unnamed one tells a screen-reader user there is navigation here without saying which navigation. Name the set rather than the act: 'Main', not 'Main navigation' — the role already supplies the word, and a name carrying it is announced as 'main navigation navigation' */
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import './NavbarItem.css';
|
|
2
|
+
import './navbar-item-impl.css';
|
|
2
3
|
import { type NavbarItemProps } from './NavbarItem.types.js';
|
|
3
4
|
export type { NavbarItemProps };
|
|
4
5
|
/**
|
|
@@ -19,4 +20,4 @@ export type { NavbarItemProps };
|
|
|
19
20
|
* section you are in is one you can return to the top of, and a reader who lands
|
|
20
21
|
* on it should hear which section that is rather than meet a dead stop.
|
|
21
22
|
*/
|
|
22
|
-
export declare function NavbarItem({ current, tone, href, icon, external, children, ...rest }: NavbarItemProps): import("react").JSX.Element;
|
|
23
|
+
export declare function NavbarItem({ current, tone, href, icon, external, externalLabel, children, ...rest }: NavbarItemProps): import("react").JSX.Element;
|
|
@@ -2,17 +2,10 @@
|
|
|
2
2
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { ArrowUpRightRegularIcon } from '@deriv-com/quill-icons-web';
|
|
4
4
|
import './NavbarItem.css';
|
|
5
|
+
import './navbar-item-impl.css';
|
|
5
6
|
import { Icon } from '../icon/Icon.js';
|
|
6
7
|
import { visuallyHidden } from '../../visually-hidden.js';
|
|
7
8
|
import { navbarItemDefaults, navbarItemParts } from './NavbarItem.types.js';
|
|
8
|
-
/**
|
|
9
|
-
* What the words become when the destination leaves the site.
|
|
10
|
-
*
|
|
11
|
-
* Appended to the content rather than replacing it with an `aria-label`: a label
|
|
12
|
-
* replaces the words a sighted reader is looking at, and somebody using both
|
|
13
|
-
* hears one thing and sees another. This keeps them the same sentence.
|
|
14
|
-
*/
|
|
15
|
-
const OPENS_ELSEWHERE = '(opens in a new tab)';
|
|
16
9
|
/**
|
|
17
10
|
* One place the site has, in the bar across the top of it.
|
|
18
11
|
*
|
|
@@ -31,10 +24,10 @@ const OPENS_ELSEWHERE = '(opens in a new tab)';
|
|
|
31
24
|
* section you are in is one you can return to the top of, and a reader who lands
|
|
32
25
|
* on it should hear which section that is rather than meet a dead stop.
|
|
33
26
|
*/
|
|
34
|
-
export function NavbarItem({ current = navbarItemDefaults.current, tone = navbarItemDefaults.tone, href, icon, external = navbarItemDefaults.external, children, ...rest }) {
|
|
27
|
+
export function NavbarItem({ current = navbarItemDefaults.current, tone = navbarItemDefaults.tone, href, icon, external = navbarItemDefaults.external, externalLabel = navbarItemDefaults.externalLabel, children, ...rest }) {
|
|
35
28
|
return (_jsxs("a", { ...rest, href: href, className: navbarItemParts.root, "data-current": String(current), "data-tone": tone, "aria-current": current ? 'page' : undefined,
|
|
36
29
|
// Both, or neither. `target` without `rel` hands the opened document a live
|
|
37
30
|
// reference back to this one; `rel` without `target` guards a navigation
|
|
38
31
|
// that never leaves.
|
|
39
|
-
target: external ? '_blank' : undefined, rel: external ? 'noreferrer' : undefined, children: [icon !== undefined && icon !== null && (_jsx("span", { className: navbarItemParts.icon, children: icon })), _jsx("span", { className: navbarItemParts.label, children: children }), external && (_jsxs(_Fragment, { children: [_jsx("span", { className: navbarItemParts.external, "aria-hidden": "true", children: _jsx(Icon, { size: "xs", children: _jsx(ArrowUpRightRegularIcon, {}) }) }), _jsx("span", { style: visuallyHidden, children: ` ${
|
|
32
|
+
target: external ? '_blank' : undefined, rel: external ? 'noreferrer' : undefined, children: [icon !== undefined && icon !== null && (_jsx("span", { className: navbarItemParts.icon, children: icon })), _jsx("span", { className: navbarItemParts.label, children: children }), external && (_jsxs(_Fragment, { children: [_jsx("span", { className: navbarItemParts.external, "aria-hidden": "true", children: _jsx(Icon, { size: "xs", children: _jsx(ArrowUpRightRegularIcon, {}) }) }), _jsx("span", { style: visuallyHidden, children: ` ${externalLabel}` })] }))] }));
|
|
40
33
|
}
|
|
@@ -9,10 +9,12 @@ export interface NavbarItemOwnProps {
|
|
|
9
9
|
href: string;
|
|
10
10
|
/** The bar's sections are quicker to tell apart by a mark than by reading them, which is rare on a marketing site and usual in an application */
|
|
11
11
|
icon?: ReactNode;
|
|
12
|
+
/** What a screen reader hears after an external destination's name, since the arrow that shows it to everyone else is hidden. Translate it with the page. */
|
|
13
|
+
externalLabel?: string;
|
|
12
14
|
/** Allowed: text */
|
|
13
15
|
children: ReactNode;
|
|
14
16
|
}
|
|
15
|
-
export type NavbarItemProps = NavbarItemOwnProps & Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'className' | 'current' | 'tone' | 'href' | 'icon' | 'external'> & ({
|
|
17
|
+
export type NavbarItemProps = NavbarItemOwnProps & Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'className' | 'current' | 'tone' | 'href' | 'icon' | 'external' | 'externalLabel'> & ({
|
|
16
18
|
current?: boolean;
|
|
17
19
|
external?: false;
|
|
18
20
|
} | {
|
|
@@ -31,4 +33,5 @@ export declare const navbarItemDefaults: {
|
|
|
31
33
|
readonly current: false;
|
|
32
34
|
readonly tone: "default";
|
|
33
35
|
readonly external: false;
|
|
36
|
+
readonly externalLabel: "(opens in a new tab)";
|
|
34
37
|
};
|
|
@@ -7,4 +7,4 @@ export const navbarItemParts = {
|
|
|
7
7
|
external: 'dds-navbaritem__external',
|
|
8
8
|
};
|
|
9
9
|
/** Generated so defaults cannot drift from the contract. */
|
|
10
|
-
export const navbarItemDefaults = { current: false, tone: 'default', external: false };
|
|
10
|
+
export const navbarItemDefaults = { current: false, tone: 'default', external: false, externalLabel: '(opens in a new tab)' };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* What the contract cannot hold: a reading direction.
|
|
3
|
+
*
|
|
4
|
+
* The external mark points out of the page along the line, up and to its end. In a right-to-left
|
|
5
|
+
* line the end is on the left, so the arrow is mirrored to point there; as it ships it pointed
|
|
6
|
+
* back into the words it qualifies.
|
|
7
|
+
*/
|
|
8
|
+
:where([data-dds-context="marketing"]) .dds-navbaritem .dds-navbaritem__external .dds-icon:dir(rtl) {
|
|
9
|
+
scale: -1 1;
|
|
10
|
+
}
|
|
@@ -34,6 +34,15 @@
|
|
|
34
34
|
translate: -50%;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
/*
|
|
38
|
+
* Centred in a right-to-left line too. `inset-inline-start: 50%` is the right edge there, while a
|
|
39
|
+
* translate is physical and still pulled the panel leftward — so it opened a whole panel-width to
|
|
40
|
+
* the left of where it hangs. Half its width back towards the inline start, which is rightward.
|
|
41
|
+
*/
|
|
42
|
+
:where([data-dds-context="marketing"]) .dds-navbarmenu .dds-navbarmenu__surface:dir(rtl) {
|
|
43
|
+
translate: 50%;
|
|
44
|
+
}
|
|
45
|
+
|
|
37
46
|
/*
|
|
38
47
|
* Above the bar it hangs from, which a contract cannot hold: an integer with no unit.
|
|
39
48
|
*
|
|
@@ -30,6 +30,15 @@
|
|
|
30
30
|
z-index: var(--layer-popup);
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
/*
|
|
34
|
+
* Centred in a right-to-left line too. `inset-inline-start: 50%` is the right edge there, while a
|
|
35
|
+
* translate is physical and still pulled the panel leftward — so it opened a whole panel-width to
|
|
36
|
+
* the left of where it hangs. Half its width back towards the inline start, which is rightward.
|
|
37
|
+
*/
|
|
38
|
+
:where([data-dds-context="marketing"]) .dds-navbarswitcher[data-presentation='floating'] .dds-navbarswitcher__surface:dir(rtl) {
|
|
39
|
+
translate: 50%;
|
|
40
|
+
}
|
|
41
|
+
|
|
33
42
|
/*
|
|
34
43
|
* And in the panel it is a page rather than a panel.
|
|
35
44
|
*
|
|
@@ -177,3 +186,13 @@
|
|
|
177
186
|
block-size: 100%;
|
|
178
187
|
inline-size: auto;
|
|
179
188
|
}
|
|
189
|
+
|
|
190
|
+
/*
|
|
191
|
+
* In the panel, the chevron points to the page that opens beside it and the back mark to the one
|
|
192
|
+
* it came from — both along the line. Mirrored in a right-to-left line, where beside is leftward.
|
|
193
|
+
* The trigger's own chevron points down and is left alone.
|
|
194
|
+
*/
|
|
195
|
+
:where([data-dds-context="marketing"]) .dds-navbarswitcher .dds-navbarswitcher__chevron .dds-icon:dir(rtl),
|
|
196
|
+
:where([data-dds-context="marketing"]) .dds-navbarswitcher .dds-navbarswitcher__back .dds-icon:dir(rtl) {
|
|
197
|
+
scale: -1 1;
|
|
198
|
+
}
|
|
@@ -362,5 +362,5 @@ export function Pagination({ variant = paginationDefaults.variant, page = pagina
|
|
|
362
362
|
return (_jsx("a", { className: paginationParts.page, href: pageHref(slot), "aria-current": isCurrent ? 'page' : undefined, "data-current": isCurrent ? 'true' : undefined, onClick: go(slot), children: slot }, slot));
|
|
363
363
|
}
|
|
364
364
|
return (_jsx("button", { className: paginationParts.page, type: "button", "aria-current": isCurrent ? 'page' : undefined, "data-current": isCurrent ? 'true' : undefined, onClick: go(slot), children: slot }, slot));
|
|
365
|
-
}) })), variant === 'compact' && (_jsx("span", { className: paginationParts.summary, children: readout(current, last) })), stepControl(current + 1, nextLabel, atEnd, _jsx(ChevronRightRegularIcon, {}))] }));
|
|
365
|
+
}) })), variant === 'compact' && (_jsx("span", { className: paginationParts.summary, dir: "ltr", children: readout(current, last) })), stepControl(current + 1, nextLabel, atEnd, _jsx(ChevronRightRegularIcon, {}))] }));
|
|
366
366
|
}
|
|
@@ -15,3 +15,12 @@
|
|
|
15
15
|
:where([data-dds-context="marketing"]) .dds-pagination .dds-pagination__list:has([aria-expanded='true']) {
|
|
16
16
|
overflow: visible;
|
|
17
17
|
}
|
|
18
|
+
|
|
19
|
+
/*
|
|
20
|
+
* The step chevrons point along the row: previous towards its start, next towards its end. A
|
|
21
|
+
* right-to-left row puts previous on the right, so both are mirrored; as they ship, previous
|
|
22
|
+
* pointed outward and next pointed back across the pages.
|
|
23
|
+
*/
|
|
24
|
+
:where([data-dds-context="marketing"]) .dds-pagination .dds-pagination__step .dds-icon:dir(rtl) {
|
|
25
|
+
scale: -1 1;
|
|
26
|
+
}
|
|
@@ -22,4 +22,4 @@ export type { PaginationDotsProps };
|
|
|
22
22
|
* There is no pause control, by decision: a press is the way to stop it, and the contract says what
|
|
23
23
|
* that does and does not give WCAG 2.2.2.
|
|
24
24
|
*/
|
|
25
|
-
export declare function PaginationDots({ variant, page, totalPages, onPageChange, autoplay, paused, label, itemLabel, }: PaginationDotsProps): import("react").JSX.Element;
|
|
25
|
+
export declare function PaginationDots({ variant, page, totalPages, onPageChange, autoplay, paused, label, itemLabel, positionLabel, }: PaginationDotsProps): import("react").JSX.Element;
|