@deriv-com/dds-marketing 1.1.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.llm/components/accordion.md +10 -0
- package/.llm/components/accordionitem.md +10 -0
- package/.llm/components/aspectratio.md +10 -0
- package/.llm/components/awards.md +10 -0
- package/.llm/components/background.md +52 -9
- package/.llm/components/badge.md +13 -3
- package/.llm/components/bottomsheet.md +13 -3
- package/.llm/components/breadcrumb.md +10 -0
- package/.llm/components/breadcrumbitem.md +10 -0
- package/.llm/components/button.md +13 -3
- package/.llm/components/buttonicon.md +17 -7
- package/.llm/components/card.md +11 -1
- package/.llm/components/cardbody.md +12 -2
- package/.llm/components/cardbutton.md +10 -0
- package/.llm/components/checkbox.md +7 -1
- package/.llm/components/comparisoncards.md +13 -3
- package/.llm/components/comparisontable.md +10 -0
- package/.llm/components/ctabanner.md +10 -0
- package/.llm/components/ctabannerslider.md +10 -0
- package/.llm/components/datatable.md +10 -0
- package/.llm/components/divider.md +10 -0
- package/.llm/components/documentlink.md +237 -0
- package/.llm/components/documents.md +268 -0
- package/.llm/components/downloadbanner.md +11 -1
- package/.llm/components/dropdownmenu.md +15 -5
- package/.llm/components/estimator.md +342 -0
- package/.llm/components/faqaccordion.md +10 -0
- package/.llm/components/featurebullets.md +10 -0
- package/.llm/components/featurecards.md +47 -3
- package/.llm/components/featurecardscarousel.md +11 -1
- package/.llm/components/featurescroll.md +10 -0
- package/.llm/components/featuresplit.md +10 -0
- package/.llm/components/featurestack.md +10 -0
- package/.llm/components/featuretabs.md +369 -0
- package/.llm/components/filterchip.md +11 -1
- package/.llm/components/footer.md +10 -0
- package/.llm/components/footergroup.md +10 -0
- package/.llm/components/grid.md +34 -1
- package/.llm/components/icon.md +15 -5
- package/.llm/components/illustrationcard.md +56 -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 +33 -3
- package/.llm/components/imagebanner.md +35 -6
- package/.llm/components/landinghero.md +10 -0
- package/.llm/components/link.md +12 -2
- package/.llm/components/logocolumns.md +11 -1
- package/.llm/components/logorows.md +46 -2
- package/.llm/components/menuitem.md +12 -2
- package/.llm/components/navbar.md +11 -1
- package/.llm/components/navbaritem.md +10 -0
- package/.llm/components/navbarmenu.md +10 -0
- package/.llm/components/navbarmenugroup.md +10 -0
- package/.llm/components/navbarpanel.md +10 -0
- package/.llm/components/navbarswitcher.md +16 -6
- package/.llm/components/navbarswitcheroption.md +10 -0
- package/.llm/components/option.md +11 -1
- package/.llm/components/pageheader.md +10 -0
- package/.llm/components/pagination.md +10 -0
- package/.llm/components/paginationdots.md +10 -0
- package/.llm/components/producthero.md +33 -4
- package/.llm/components/progressbar.md +305 -0
- package/.llm/components/removablechip.md +11 -1
- package/.llm/components/resourcebanner.md +10 -0
- package/.llm/components/row.md +10 -0
- package/.llm/components/scenescroll.md +42 -24
- package/.llm/components/scenescrollword.md +267 -0
- package/.llm/components/scroller.md +10 -0
- package/.llm/components/searchinput.md +10 -0
- package/.llm/components/segmentedcontrol.md +33 -2
- package/.llm/components/segmentedcontrolitem.md +12 -2
- package/.llm/components/select.md +10 -0
- package/.llm/components/selectchip.md +10 -0
- package/.llm/components/spinner.md +10 -0
- package/.llm/components/stack.md +10 -0
- package/.llm/components/stats.md +50 -1
- package/.llm/components/statscarousel.md +227 -0
- package/.llm/components/statusdot.md +45 -1
- package/.llm/components/steps.md +10 -0
- package/.llm/components/stickycards.md +10 -0
- package/.llm/components/subdomainnavbar.md +11 -1
- package/.llm/components/tab.md +12 -2
- package/.llm/components/table.md +10 -0
- package/.llm/components/tablebody.md +10 -0
- package/.llm/components/tablecell.md +10 -0
- package/.llm/components/tablehead.md +10 -0
- package/.llm/components/tableheadercell.md +10 -0
- package/.llm/components/tablerow.md +10 -0
- package/.llm/components/tablist.md +10 -0
- package/.llm/components/teamgrid.md +10 -0
- package/.llm/components/testimonialrow.md +47 -3
- package/.llm/components/testimonialslider.md +12 -2
- package/.llm/components/textarea.md +10 -0
- package/.llm/components/textinput.md +11 -1
- package/.llm/components/textscroll.md +10 -0
- package/.llm/components/tiers.md +17 -7
- package/.llm/components/tooltip.md +6 -0
- package/.llm/components/typography.md +67 -1
- package/.llm/digest/accordion.md +1 -1
- package/.llm/digest/accordionitem.md +1 -1
- package/.llm/digest/aspectratio.md +1 -1
- package/.llm/digest/awards.md +1 -1
- package/.llm/digest/background.md +14 -6
- package/.llm/digest/badge.md +1 -1
- package/.llm/digest/bottomsheet.md +1 -1
- package/.llm/digest/breadcrumb.md +1 -1
- package/.llm/digest/breadcrumbitem.md +1 -1
- package/.llm/digest/button.md +2 -2
- package/.llm/digest/buttonicon.md +2 -2
- package/.llm/digest/card.md +1 -1
- package/.llm/digest/cardbody.md +1 -1
- package/.llm/digest/cardbutton.md +1 -1
- package/.llm/digest/checkbox.md +1 -1
- package/.llm/digest/comparisoncards.md +1 -1
- package/.llm/digest/comparisontable.md +1 -1
- package/.llm/digest/ctabanner.md +1 -1
- package/.llm/digest/ctabannerslider.md +1 -1
- package/.llm/digest/datatable.md +1 -1
- package/.llm/digest/divider.md +1 -1
- package/.llm/digest/documentlink.md +52 -0
- package/.llm/digest/documents.md +51 -0
- package/.llm/digest/downloadbanner.md +2 -2
- package/.llm/digest/dropdownmenu.md +1 -1
- package/.llm/digest/estimator.md +66 -0
- package/.llm/digest/faqaccordion.md +1 -1
- package/.llm/digest/featurebullets.md +1 -1
- package/.llm/digest/featurecards.md +8 -1
- package/.llm/digest/featurecardscarousel.md +1 -1
- package/.llm/digest/featurescroll.md +1 -1
- package/.llm/digest/featuresplit.md +1 -1
- package/.llm/digest/featurestack.md +1 -1
- package/.llm/digest/featuretabs.md +50 -0
- package/.llm/digest/filterchip.md +1 -1
- package/.llm/digest/footer.md +1 -1
- package/.llm/digest/footergroup.md +1 -1
- package/.llm/digest/grid.md +2 -1
- package/.llm/digest/icon.md +1 -1
- package/.llm/digest/illustrationcard.md +7 -2
- 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 +5 -3
- package/.llm/digest/imagebanner.md +11 -5
- package/.llm/digest/landinghero.md +1 -1
- package/.llm/digest/link.md +1 -1
- package/.llm/digest/logocolumns.md +2 -2
- package/.llm/digest/logorows.md +9 -2
- package/.llm/digest/menuitem.md +1 -1
- package/.llm/digest/navbar.md +1 -1
- package/.llm/digest/navbaritem.md +1 -1
- package/.llm/digest/navbarmenu.md +1 -1
- package/.llm/digest/navbarmenugroup.md +1 -1
- package/.llm/digest/navbarpanel.md +1 -1
- package/.llm/digest/navbarswitcher.md +1 -1
- package/.llm/digest/navbarswitcheroption.md +1 -1
- package/.llm/digest/option.md +1 -1
- package/.llm/digest/pageheader.md +1 -1
- package/.llm/digest/pagination.md +1 -1
- package/.llm/digest/paginationdots.md +1 -1
- package/.llm/digest/producthero.md +9 -3
- package/.llm/digest/progressbar.md +56 -0
- package/.llm/digest/removablechip.md +1 -1
- package/.llm/digest/resourcebanner.md +1 -1
- package/.llm/digest/row.md +1 -1
- package/.llm/digest/scenescroll.md +7 -6
- package/.llm/digest/scenescrollword.md +56 -0
- package/.llm/digest/scroller.md +1 -1
- package/.llm/digest/searchinput.md +1 -1
- package/.llm/digest/segmentedcontrol.md +4 -1
- package/.llm/digest/segmentedcontrolitem.md +2 -2
- package/.llm/digest/select.md +1 -1
- package/.llm/digest/selectchip.md +1 -1
- package/.llm/digest/spinner.md +1 -1
- package/.llm/digest/stack.md +1 -1
- package/.llm/digest/stats.md +9 -1
- package/.llm/digest/statscarousel.md +48 -0
- package/.llm/digest/statusdot.md +8 -1
- package/.llm/digest/steps.md +1 -1
- package/.llm/digest/stickycards.md +1 -1
- package/.llm/digest/subdomainnavbar.md +1 -1
- package/.llm/digest/tab.md +1 -1
- package/.llm/digest/table.md +1 -1
- package/.llm/digest/tablebody.md +1 -1
- package/.llm/digest/tablecell.md +1 -1
- package/.llm/digest/tablehead.md +1 -1
- package/.llm/digest/tableheadercell.md +1 -1
- package/.llm/digest/tablerow.md +1 -1
- package/.llm/digest/tablist.md +1 -1
- package/.llm/digest/teamgrid.md +1 -1
- package/.llm/digest/testimonialrow.md +9 -2
- package/.llm/digest/testimonialslider.md +2 -2
- package/.llm/digest/textarea.md +1 -1
- package/.llm/digest/textinput.md +1 -1
- package/.llm/digest/textscroll.md +1 -1
- package/.llm/digest/tiers.md +1 -1
- package/.llm/digest/typography.md +19 -1
- package/.llm/index.md +15 -4
- package/.llm/rules.md +10 -0
- package/.llm/tokens.md +13 -3
- package/AGENTS.md +14 -2
- package/README.md +28 -3
- 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 -12
- 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/estimator/Estimator.css +206 -0
- package/dist/components/blocks/estimator/Estimator.d.ts +27 -0
- package/dist/components/blocks/estimator/Estimator.js +61 -0
- package/dist/components/blocks/estimator/Estimator.types.d.ts +63 -0
- package/dist/components/blocks/estimator/Estimator.types.js +25 -0
- package/dist/components/blocks/estimator/estimator-impl.css +159 -0
- 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 +2 -1
- package/dist/components/blocks/image-banner/ImageBanner.js +3 -2
- package/dist/components/blocks/image-banner/ImageBanner.types.d.ts +10 -8
- package/dist/components/blocks/image-banner/ImageBanner.types.js +1 -1
- package/dist/components/blocks/image-banner/image-banner-impl.css +78 -71
- package/dist/components/blocks/laurel.d.ts +16 -0
- package/dist/components/blocks/laurel.js +28 -0
- package/dist/components/blocks/logo-columns/LogoColumns.css +1 -1
- package/dist/components/blocks/logo-columns/LogoColumns.types.d.ts +1 -1
- package/dist/components/blocks/logo-rows/LogoRows.css +1 -1
- package/dist/components/blocks/logo-rows/LogoRows.d.ts +2 -1
- package/dist/components/blocks/logo-rows/LogoRows.js +7 -4
- package/dist/components/blocks/logo-rows/LogoRows.types.d.ts +9 -1
- package/dist/components/blocks/pattern-tone.d.ts +11 -0
- package/dist/components/blocks/pattern-tone.js +7 -0
- package/dist/components/blocks/product-hero/ProductHero.d.ts +1 -1
- package/dist/components/blocks/product-hero/ProductHero.js +2 -2
- package/dist/components/blocks/product-hero/ProductHero.types.d.ts +8 -3
- package/dist/components/blocks/product-hero/ProductHero.types.js +1 -1
- package/dist/components/blocks/product-hero/product-hero-impl.css +54 -0
- package/dist/components/blocks/resource-banner/ResourceBanner.css +1 -1
- package/dist/components/blocks/scene-scroll/SceneScroll.css +1 -1
- package/dist/components/blocks/scene-scroll/SceneScroll.d.ts +6 -5
- package/dist/components/blocks/scene-scroll/SceneScroll.js +8 -7
- package/dist/components/blocks/scene-scroll/SceneScroll.types.d.ts +5 -5
- package/dist/components/blocks/scene-scroll/SceneScroll.types.js +1 -1
- package/dist/components/blocks/scene-scroll/scene-scroll-impl.css +61 -44
- package/dist/components/blocks/scene-scroll-word/SceneScrollWord.css +105 -0
- package/dist/components/blocks/scene-scroll-word/SceneScrollWord.d.ts +31 -0
- package/dist/components/blocks/scene-scroll-word/SceneScrollWord.js +67 -0
- package/dist/components/blocks/scene-scroll-word/SceneScrollWord.types.d.ts +39 -0
- package/dist/components/blocks/scene-scroll-word/SceneScrollWord.types.js +18 -0
- package/dist/components/blocks/scene-scroll-word/scene-scroll-word-impl.css +370 -0
- package/dist/components/blocks/stats/Stats.d.ts +2 -1
- package/dist/components/blocks/stats/Stats.js +17 -14
- package/dist/components/blocks/stats/Stats.types.d.ts +8 -0
- package/dist/components/blocks/stats/stats-impl.css +4 -1
- package/dist/components/blocks/stats/use-wheel.d.ts +1 -1
- package/dist/components/blocks/stats/use-wheel.js +8 -4
- package/dist/components/blocks/stats-carousel/StatsCarousel.css +209 -0
- package/dist/components/blocks/stats-carousel/StatsCarousel.d.ts +20 -0
- package/dist/components/blocks/stats-carousel/StatsCarousel.js +48 -0
- package/dist/components/blocks/stats-carousel/StatsCarousel.types.d.ts +43 -0
- package/dist/components/blocks/stats-carousel/StatsCarousel.types.js +23 -0
- package/dist/components/blocks/stats-carousel/stats-carousel-impl.css +233 -0
- package/dist/components/blocks/sticky-cards/sticky-cards-impl.css +8 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.css +1 -1
- package/dist/components/blocks/testimonial-row/TestimonialRow.d.ts +2 -1
- package/dist/components/blocks/testimonial-row/TestimonialRow.js +16 -13
- package/dist/components/blocks/testimonial-row/TestimonialRow.types.d.ts +9 -1
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.css +1 -1
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.d.ts +1 -1
- package/dist/components/blocks/tiers/Tiers.types.d.ts +1 -1
- package/dist/components/core/background/Background.css +19 -0
- package/dist/components/core/background/Background.types.d.ts +2 -1
- package/dist/components/core/background/background-impl.css +47 -15
- package/dist/components/core/background/halftone.js +1 -1
- package/dist/components/core/button/Button.css +5 -5
- package/dist/components/core/button-icon/ButtonIcon.types.d.ts +1 -1
- package/dist/components/core/card-body/CardBody.css +5 -0
- package/dist/components/core/card-body/CardBody.types.d.ts +1 -1
- package/dist/components/core/document-link/DocumentLink.css +59 -0
- package/dist/components/core/document-link/DocumentLink.d.ts +19 -0
- package/dist/components/core/document-link/DocumentLink.js +21 -0
- package/dist/components/core/document-link/DocumentLink.types.d.ts +41 -0
- package/dist/components/core/document-link/DocumentLink.types.js +11 -0
- package/dist/components/core/document-link/document-link-impl.css +23 -0
- package/dist/components/core/illustration-card/IllustrationCard.css +7 -0
- package/dist/components/core/illustration-card/IllustrationCard.d.ts +5 -1
- package/dist/components/core/illustration-card/IllustrationCard.js +34 -8
- package/dist/components/core/illustration-card/IllustrationCard.types.d.ts +8 -1
- package/dist/components/core/illustration-card/IllustrationCard.types.js +1 -0
- package/dist/components/core/illustration-card/illustration-card-impl.css +113 -0
- package/dist/components/core/illustration-check/IllustrationCheck.css +25 -0
- package/dist/components/core/illustration-check/IllustrationCheck.d.ts +16 -0
- package/dist/components/core/illustration-check/IllustrationCheck.js +22 -0
- package/dist/components/core/illustration-check/IllustrationCheck.types.d.ts +25 -0
- package/dist/components/core/illustration-check/IllustrationCheck.types.js +9 -0
- package/dist/components/core/illustration-check/illustration-check-impl.css +76 -0
- package/dist/components/core/illustration-choice/IllustrationChoice.css +62 -0
- package/dist/components/core/illustration-choice/IllustrationChoice.d.ts +16 -0
- package/dist/components/core/illustration-choice/IllustrationChoice.js +31 -0
- package/dist/components/core/illustration-choice/IllustrationChoice.types.d.ts +25 -0
- package/dist/components/core/illustration-choice/IllustrationChoice.types.js +11 -0
- package/dist/components/core/illustration-choice/illustration-choice-impl.css +103 -0
- package/dist/components/core/illustration-code/IllustrationCode.css +25 -0
- package/dist/components/core/illustration-code/IllustrationCode.d.ts +12 -0
- package/dist/components/core/illustration-code/IllustrationCode.js +20 -0
- package/dist/components/core/illustration-code/IllustrationCode.types.d.ts +23 -0
- package/dist/components/core/illustration-code/IllustrationCode.types.js +8 -0
- package/dist/components/core/illustration-code/illustration-code-impl.css +42 -0
- package/dist/components/core/illustration-list/IllustrationList.css +19 -0
- package/dist/components/core/illustration-list/IllustrationList.d.ts +16 -0
- package/dist/components/core/illustration-list/IllustrationList.js +18 -0
- package/dist/components/core/illustration-list/IllustrationList.types.d.ts +15 -0
- package/dist/components/core/illustration-list/IllustrationList.types.js +6 -0
- package/dist/components/core/illustration-list/illustration-list-impl.css +52 -0
- package/dist/components/core/illustration-scene/IllustrationScene.css +6 -0
- package/dist/components/core/illustration-scene/IllustrationScene.d.ts +3 -2
- package/dist/components/core/illustration-scene/IllustrationScene.js +4 -3
- package/dist/components/core/illustration-scene/IllustrationScene.types.d.ts +5 -1
- package/dist/components/core/illustration-scene/IllustrationScene.types.js +2 -1
- package/dist/components/core/illustration-scene/illustration-scene-impl.css +65 -0
- package/dist/components/core/link/link-impl.css +5 -19
- package/dist/components/core/progress-bar/ProgressBar.css +101 -0
- package/dist/components/core/progress-bar/ProgressBar.d.ts +5 -0
- package/dist/components/core/progress-bar/ProgressBar.js +34 -0
- package/dist/components/core/progress-bar/ProgressBar.types.d.ts +52 -0
- package/dist/components/core/progress-bar/ProgressBar.types.js +12 -0
- package/dist/components/core/progress-bar/progress-bar-impl.css +45 -0
- package/dist/components/core/segmented-control/SegmentedControl.d.ts +1 -1
- package/dist/components/core/segmented-control/SegmentedControl.js +13 -5
- package/dist/components/core/segmented-control/SegmentedControl.types.d.ts +5 -1
- package/dist/components/core/segmented-control/segmented-control-impl.css +35 -0
- package/dist/components/core/segmented-control-item/SegmentedControlItem.types.d.ts +1 -1
- package/dist/components/core/select/Select.css +2 -0
- package/dist/components/core/select/select-impl.css +58 -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/text-area/TextArea.css +2 -0
- package/dist/components/core/text-area/text-area-impl.css +54 -0
- package/dist/components/core/text-input/TextInput.css +2 -0
- package/dist/components/core/text-input/text-input-impl.css +63 -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/estimator-data.d.ts +29 -0
- package/dist/components/estimator-data.js +12 -0
- package/dist/components/illustration-data.d.ts +15 -0
- package/dist/components/illustration-data.js +7 -0
- package/dist/components/index.d.ts +25 -1
- package/dist/components/index.js +22 -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/icons/accounts.d.ts +1 -0
- package/dist/icons/accounts.js +1 -0
- package/dist/icons/app-stores.d.ts +1 -0
- package/dist/icons/app-stores.js +1 -0
- package/dist/icons/currency.d.ts +1 -0
- package/dist/icons/currency.js +1 -0
- package/dist/icons/flag.d.ts +1 -0
- package/dist/icons/flag.js +1 -0
- package/dist/icons/illustrative.d.ts +1 -0
- package/dist/icons/illustrative.js +1 -0
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +4 -0
- package/dist/icons/markets.d.ts +1 -0
- package/dist/icons/markets.js +1 -0
- package/dist/icons/social.d.ts +1 -0
- package/dist/icons/social.js +1 -0
- package/dist/icons/system.d.ts +1 -0
- package/dist/icons/system.js +1 -0
- package/dist/icons/trade.d.ts +1 -0
- package/dist/icons/trade.js +1 -0
- package/dist/marketing.css +26 -6
- package/package.json +44 -2
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/* GENERATED from progressbar.contract.json. Do not edit. */
|
|
2
|
+
|
|
3
|
+
:where([data-dds-context="marketing"]) .dds-progressbar {
|
|
4
|
+
display: flex;
|
|
5
|
+
flex-direction: column;
|
|
6
|
+
gap: var(--space-gap-xs);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
:where([data-dds-context="marketing"]) .dds-progressbar .dds-progressbar__track {
|
|
10
|
+
overflow: hidden;
|
|
11
|
+
position: relative;
|
|
12
|
+
background-color: var(--color-bg-track);
|
|
13
|
+
border-radius: var(--radius-pill);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
:where([data-dds-context="marketing"]) .dds-progressbar .dds-progressbar__value-label {
|
|
17
|
+
font-variant-numeric: tabular-nums;
|
|
18
|
+
color: var(--color-fg-muted);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
:where([data-dds-context="marketing"]) .dds-progressbar .dds-progressbar__description-text {
|
|
22
|
+
color: var(--color-fg-muted);
|
|
23
|
+
font-family: var(--font-body-sm-family);
|
|
24
|
+
font-size: var(--font-body-sm-size);
|
|
25
|
+
font-weight: var(--font-body-sm-weight);
|
|
26
|
+
line-height: var(--font-body-sm-line-height);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
:where([data-dds-context="marketing"]) .dds-progressbar .dds-progressbar__fill {
|
|
30
|
+
border-radius: var(--radius-pill);
|
|
31
|
+
transition-duration: var(--motion-duration-normal);
|
|
32
|
+
transition-timing-function: var(--motion-easing-standard);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
:where([data-dds-context="marketing"]) .dds-progressbar .dds-progressbar__label {
|
|
36
|
+
color: var(--color-fg-default);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
:where([data-dds-context="marketing"]) .dds-progressbar[data-size="md"] .dds-progressbar__label {
|
|
40
|
+
font-family: var(--font-label-md-family);
|
|
41
|
+
font-size: var(--font-label-md-size);
|
|
42
|
+
font-weight: var(--font-label-md-weight);
|
|
43
|
+
line-height: var(--font-label-md-line-height);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
:where([data-dds-context="marketing"]) .dds-progressbar[data-size="md"] .dds-progressbar__track {
|
|
47
|
+
height: var(--size-progressbar-track-md);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
:where([data-dds-context="marketing"]) .dds-progressbar[data-size="md"] .dds-progressbar__value-label {
|
|
51
|
+
font-family: var(--font-label-md-family);
|
|
52
|
+
font-size: var(--font-label-md-size);
|
|
53
|
+
line-height: var(--font-label-md-line-height);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
:where([data-dds-context="marketing"]) .dds-progressbar[data-size="sm"] .dds-progressbar__label {
|
|
57
|
+
font-family: var(--font-label-sm-family);
|
|
58
|
+
font-size: var(--font-label-sm-size);
|
|
59
|
+
font-weight: var(--font-label-sm-weight);
|
|
60
|
+
line-height: var(--font-label-sm-line-height);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
:where([data-dds-context="marketing"]) .dds-progressbar[data-size="sm"] .dds-progressbar__track {
|
|
64
|
+
height: var(--size-progressbar-track-sm);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
:where([data-dds-context="marketing"]) .dds-progressbar[data-size="sm"] .dds-progressbar__value-label {
|
|
68
|
+
font-family: var(--font-label-sm-family);
|
|
69
|
+
font-size: var(--font-label-sm-size);
|
|
70
|
+
line-height: var(--font-label-sm-line-height);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
:where([data-dds-context="marketing"]) .dds-progressbar[data-variant="accent"] .dds-progressbar__fill {
|
|
74
|
+
background-color: var(--color-bg-brand);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
:where([data-dds-context="marketing"]) .dds-progressbar[data-variant="default"] .dds-progressbar__fill {
|
|
78
|
+
background-color: var(--color-bg-strong);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
:where([data-dds-context="marketing"]) .dds-progressbar[data-variant="error"] .dds-progressbar__fill {
|
|
82
|
+
background-color: var(--color-bg-danger);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
:where([data-dds-context="marketing"]) .dds-progressbar[data-variant="info"] .dds-progressbar__fill {
|
|
86
|
+
background-color: var(--color-bg-info);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
:where([data-dds-context="marketing"]) .dds-progressbar[data-variant="success"] .dds-progressbar__fill {
|
|
90
|
+
background-color: var(--color-bg-success);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
:where([data-dds-context="marketing"]) .dds-progressbar[data-variant="warning"] .dds-progressbar__fill {
|
|
94
|
+
background-color: var(--color-bg-warning);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
@media (prefers-reduced-motion: reduce) {
|
|
98
|
+
:where([data-dds-context="marketing"]) .dds-progressbar,
|
|
99
|
+
:where([data-dds-context="marketing"]) .dds-progressbar * { transition: none !important; }
|
|
100
|
+
}
|
|
101
|
+
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import './ProgressBar.css';
|
|
2
|
+
import './progress-bar-impl.css';
|
|
3
|
+
import { type ProgressBarProps } from './ProgressBar.types.js';
|
|
4
|
+
export type { ProgressBarProps };
|
|
5
|
+
export declare function ProgressBar({ size, variant, value, max, label, showLabel, showValueLabel, description, motion, ...rest }: ProgressBarProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import './ProgressBar.css';
|
|
3
|
+
import { visuallyHidden } from '../../visually-hidden.js';
|
|
4
|
+
import './progress-bar-impl.css';
|
|
5
|
+
import { given } from '../../given.js';
|
|
6
|
+
import { Arrives } from '../../arrives.js';
|
|
7
|
+
import { progressBarDefaults, progressBarParts } from './ProgressBar.types.js';
|
|
8
|
+
export function ProgressBar({ size = progressBarDefaults.size, variant = progressBarDefaults.variant, value = progressBarDefaults.value, max = progressBarDefaults.max, label, showLabel = progressBarDefaults.showLabel, showValueLabel = progressBarDefaults.showValueLabel, description, motion, ...rest }) {
|
|
9
|
+
/**
|
|
10
|
+
* How far along, as a percentage of max.
|
|
11
|
+
*
|
|
12
|
+
* Three lines shorter than it was, and none of what went was doing any work of its own.
|
|
13
|
+
* `value` and `max` were declared as strings because the contract had no number to
|
|
14
|
+
* declare, so this converted them, guarded the NaN a conversion can produce, and kept a
|
|
15
|
+
* second copy of max's default for when the conversion failed. All three existed to undo
|
|
16
|
+
* a declaration rather than to describe a progress bar.
|
|
17
|
+
*
|
|
18
|
+
* What stays is the one clamp that is a real decision: a value above max reads as full
|
|
19
|
+
* rather than overflowing its own track. It is applied to the number rather than to the
|
|
20
|
+
* percentage now, because it was only ever applied to the width — so a bar given 150 of 100
|
|
21
|
+
* was drawn full and announced as "150 of 100", the eye and the ear disagreeing about a
|
|
22
|
+
* control whose whole job is to report one number. A value below nought was worse: `width:
|
|
23
|
+
* -10%` is not a width, so the fill kept whatever the track gave it and the reading went out
|
|
24
|
+
* as -10.
|
|
25
|
+
*
|
|
26
|
+
* A max of nought or less has no percentage to state — nothing can be a fraction of nothing —
|
|
27
|
+
* and it read as complete, which is the one answer that is certainly wrong.
|
|
28
|
+
*/
|
|
29
|
+
const bounded = Math.min(Math.max(value, 0), Math.max(max, 0));
|
|
30
|
+
const percent = max > 0 ? (bounded / max) * 100 : 0;
|
|
31
|
+
const bar = (_jsxs("div", { className: progressBarParts.root, role: "progressbar", "aria-label": given(label) ? label : undefined, "aria-valuenow": bounded, "aria-valuemin": 0, "aria-valuemax": max, "data-size": size, "data-variant": variant, "data-motion": motion, ...rest, children: [given(label) || showValueLabel ? (_jsxs("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'baseline' }, children: [given(label) ? (_jsx("span", { className: progressBarParts.label, style: showLabel ? undefined : visuallyHidden, children: label })) : null, showValueLabel ? (_jsx("span", { className: progressBarParts['value-label'], children: `${Math.round(percent)}%` })) : null] })) : null, _jsx("div", { className: progressBarParts.track, children: _jsx("div", { className: progressBarParts.fill, style: { height: '100%', width: `${percent}%` } }) }), given(description) ? (_jsx("p", { className: progressBarParts['description-text'], children: description })) : null] }));
|
|
32
|
+
// A bar that fills on arrival moves once, so only then does it take a script.
|
|
33
|
+
return motion === undefined ? bar : _jsx(Arrives, { children: bar });
|
|
34
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { HTMLAttributes } from 'react';
|
|
2
|
+
export interface ProgressBarOwnProps {
|
|
3
|
+
/**
|
|
4
|
+
* `sm` — Dense layouts or inline indicators where vertical space is limited
|
|
5
|
+
* `md` — Default for standalone progress indicators in forms or dialogs
|
|
6
|
+
*/
|
|
7
|
+
size?: 'sm' | 'md';
|
|
8
|
+
/**
|
|
9
|
+
* `default` — The default, and neutral: no status and no brand. Most progress is merely progress — a step count filling as a form is completed, a bar moving while a file uploads — and the fact that work is moving is all the colour has to say. StepperItem is named and defaults the same way, and the two draw the same neutral, so a stepper and a bar reporting one task agree.
|
|
10
|
+
* `accent` — Brand-coloured, and asked for rather than arrived at. Reach for it where the page is drawing attention to this progress — the one thing on screen a reader is waiting on. It carries no status: what it adds over the neutral is prominence, not meaning, so a page reaching for it everywhere has spent the emphasis it buys.
|
|
11
|
+
* `success` — Indicating completion or a successful process
|
|
12
|
+
* `warning` — Progress that needs attention, such as approaching a limit
|
|
13
|
+
* `error` — Progress of a process that has encountered a problem
|
|
14
|
+
* `info` — Informational progress such as downloads, syncing, or data loading
|
|
15
|
+
*/
|
|
16
|
+
variant?: 'default' | 'accent' | 'success' | 'warning' | 'error' | 'info';
|
|
17
|
+
/** The amount of work completed — a number between 0 and max. Defaults to 0, which is the honest rendering of nothing started */
|
|
18
|
+
value?: number;
|
|
19
|
+
/** The total amount of work differs from the default of 100 */
|
|
20
|
+
max?: number;
|
|
21
|
+
/** Naming what is in progress, when the bar is not already named by what surrounds it. Omit it for a bar that is part of a labelled flow — an onboarding stepper under its own heading — and name the bar with aria-labelledby instead */
|
|
22
|
+
label?: string;
|
|
23
|
+
/** The label is visible. When false, the label is visually hidden but remains accessible to screen readers */
|
|
24
|
+
showLabel?: boolean;
|
|
25
|
+
/** The numeric progress value is visible alongside the bar */
|
|
26
|
+
showValueLabel?: boolean;
|
|
27
|
+
/** Freeform context below the bar, such as a step count, status message, or time remaining */
|
|
28
|
+
description?: string;
|
|
29
|
+
/**
|
|
30
|
+
* `fill` — The bar fills from empty to its value once, on arrival, over motion.duration.dramatic — an account set-up three steps in, shown in a pane
|
|
31
|
+
*/
|
|
32
|
+
motion?: 'fill';
|
|
33
|
+
}
|
|
34
|
+
export type ProgressBarProps = ProgressBarOwnProps & Omit<HTMLAttributes<HTMLDivElement>, 'className' | 'size' | 'variant' | 'value' | 'max' | 'label' | 'showLabel' | 'showValueLabel' | 'description' | 'motion'>;
|
|
35
|
+
/** The class each part carries. Apply these — do not retype them. */
|
|
36
|
+
export declare const progressBarParts: {
|
|
37
|
+
readonly root: "dds-progressbar";
|
|
38
|
+
readonly track: "dds-progressbar__track";
|
|
39
|
+
readonly fill: "dds-progressbar__fill";
|
|
40
|
+
readonly label: "dds-progressbar__label";
|
|
41
|
+
readonly 'value-label': "dds-progressbar__value-label";
|
|
42
|
+
readonly 'description-text': "dds-progressbar__description-text";
|
|
43
|
+
};
|
|
44
|
+
/** Generated so defaults cannot drift from the contract. */
|
|
45
|
+
export declare const progressBarDefaults: {
|
|
46
|
+
readonly size: "md";
|
|
47
|
+
readonly variant: "default";
|
|
48
|
+
readonly value: 0;
|
|
49
|
+
readonly max: 100;
|
|
50
|
+
readonly showLabel: true;
|
|
51
|
+
readonly showValueLabel: true;
|
|
52
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// GENERATED from progress-bar.contract.json. Do not edit.
|
|
2
|
+
/** The class each part carries. Apply these — do not retype them. */
|
|
3
|
+
export const progressBarParts = {
|
|
4
|
+
root: 'dds-progressbar',
|
|
5
|
+
track: 'dds-progressbar__track',
|
|
6
|
+
fill: 'dds-progressbar__fill',
|
|
7
|
+
label: 'dds-progressbar__label',
|
|
8
|
+
'value-label': 'dds-progressbar__value-label',
|
|
9
|
+
'description-text': 'dds-progressbar__description-text',
|
|
10
|
+
};
|
|
11
|
+
/** Generated so defaults cannot drift from the contract. */
|
|
12
|
+
export const progressBarDefaults = { size: 'md', variant: 'default', value: 0, max: 100, showLabel: true, showValueLabel: true };
|
|
@@ -0,0 +1,45 @@
|
|
|
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
|
|
6
|
+
* before — several here are written a class deeper than they look in order to
|
|
7
|
+
* match generated CSS, and a scope that carried weight would break all of them.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/* Implementation CSS that the contract's staticCss cannot express. */
|
|
11
|
+
|
|
12
|
+
:where([data-dds-context="marketing"]) .dds-progressbar {
|
|
13
|
+
width: 100%;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
:where([data-dds-context="marketing"]) .dds-progressbar__description-text {
|
|
17
|
+
margin: 0;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/*
|
|
21
|
+
* `motion="fill"`: the bar fills from empty to where the task has got to, once, on arrival — over
|
|
22
|
+
* motion.duration.dramatic, a step of motion.duration.fast after the bar has landed. `data-arrival`
|
|
23
|
+
* is the bar's own answer from useArrival (arrival.ts): `waiting` holds it empty, `playing` fills
|
|
24
|
+
* it, and no attribute — a server, a reader who asked for less movement — is the bar at its value.
|
|
25
|
+
* The value itself, and what is read out, never moves.
|
|
26
|
+
*/
|
|
27
|
+
@keyframes dds-progressbar-fill {
|
|
28
|
+
from {
|
|
29
|
+
width: 0;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
:where([data-dds-context="marketing"]) .dds-progressbar[data-motion='fill'][data-arrival] .dds-progressbar__fill {
|
|
34
|
+
animation: dds-progressbar-fill var(--motion-duration-dramatic) var(--motion-easing-reveal) var(--motion-duration-fast) both;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
:where([data-dds-context="marketing"]) .dds-progressbar[data-motion='fill'][data-arrival='waiting'] .dds-progressbar__fill {
|
|
38
|
+
animation-play-state: paused !important;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@media (prefers-reduced-motion: reduce) {
|
|
42
|
+
:where([data-dds-context="marketing"]) .dds-progressbar[data-motion='fill'][data-arrival] .dds-progressbar__fill {
|
|
43
|
+
animation: none;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -34,4 +34,4 @@ export type { SegmentedControlProps };
|
|
|
34
34
|
* the reader a value is in force that the page never set, and hide whatever caused the
|
|
35
35
|
* mismatch — a stale piece of state, a segment that has not loaded yet.
|
|
36
36
|
*/
|
|
37
|
-
export declare function SegmentedControl({ layout, size, disabled, label, value, onChange, children, ...rest }: SegmentedControlProps): import("react").JSX.Element;
|
|
37
|
+
export declare function SegmentedControl({ layout, size, disabled, label, value, onChange, motion, children, ...rest }: SegmentedControlProps): import("react").JSX.Element;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { Children, cloneElement, isValidElement, useCallback, useEffect, useLayoutEffect,
|
|
3
|
+
import { Children, cloneElement, isValidElement, useCallback, useEffect, useLayoutEffect, useState, } from "react";
|
|
4
4
|
import "./SegmentedControl.css";
|
|
5
5
|
import "./segmented-control-impl.css";
|
|
6
|
+
import { useArrival } from "../../arrival.js";
|
|
6
7
|
import { segmentedControlItemParts } from "../segmented-control-item/SegmentedControlItem.types.js";
|
|
7
8
|
import { segmentedControlDefaults, segmentedControlParts, } from "./SegmentedControl.types.js";
|
|
8
9
|
/**
|
|
@@ -70,8 +71,9 @@ function chain(theirs, ours) {
|
|
|
70
71
|
export function SegmentedControl({ layout = segmentedControlDefaults.layout, size = segmentedControlDefaults.size, disabled = segmentedControlDefaults.disabled,
|
|
71
72
|
// No fallback, because there is no default to fall back to. The contract requires it:
|
|
72
73
|
// the question the segments are answers to is the one thing nothing else can supply.
|
|
73
|
-
label, value, onChange, children, ...rest }) {
|
|
74
|
-
|
|
74
|
+
label, value, onChange, motion, children, ...rest }) {
|
|
75
|
+
// The row's own element, and — under `motion="slide"` — where its arrival has got to.
|
|
76
|
+
const [rootRef, arrival] = useArrival(motion === "slide");
|
|
75
77
|
const segments = Children.toArray(children).filter((isValidElement));
|
|
76
78
|
/**
|
|
77
79
|
* Whether the consumer owns which value is in force.
|
|
@@ -154,11 +156,15 @@ label, value, onChange, children, ...rest }) {
|
|
|
154
156
|
on, and every segment's pill landed one row-width minus a segment to the right of it.
|
|
155
157
|
*/
|
|
156
158
|
const rtl = getComputedStyle(root).direction === "rtl";
|
|
159
|
+
const at = (each) => rtl ? each.offsetLeft + each.offsetWidth - root.clientWidth : each.offsetLeft;
|
|
160
|
+
const first = root.querySelector(`:scope > .${segmentedControlItemParts.root}`) ?? box;
|
|
157
161
|
setPill({
|
|
158
|
-
x:
|
|
162
|
+
x: at(box),
|
|
159
163
|
y: box.offsetTop,
|
|
160
164
|
w: box.offsetWidth,
|
|
161
165
|
h: box.offsetHeight,
|
|
166
|
+
fromX: at(first),
|
|
167
|
+
fromW: first.offsetWidth,
|
|
162
168
|
});
|
|
163
169
|
}, [active]);
|
|
164
170
|
// Layout rather than a plain effect: between the two the pill would be painted at its
|
|
@@ -244,12 +250,14 @@ label, value, onChange, children, ...rest }) {
|
|
|
244
250
|
target?.focus();
|
|
245
251
|
target?.click();
|
|
246
252
|
};
|
|
247
|
-
return (_jsxs("div", { ...rest, ref: rootRef, className: segmentedControlParts.root, role: "radiogroup", "aria-label": label, "aria-disabled": disabled ? true : undefined, "data-layout": layout, "data-size": size, "data-disabled": String(disabled), onKeyDown: onKeyDown, children: [_jsx("span", { className: segmentedControlParts.indicator, hidden: pill === null, style: pill === null
|
|
253
|
+
return (_jsxs("div", { ...rest, ref: rootRef, className: segmentedControlParts.root, role: "radiogroup", "aria-label": label, "aria-disabled": disabled ? true : undefined, "data-layout": layout, "data-size": size, "data-disabled": String(disabled), "data-motion": motion, "data-arrival": arrival === "still" ? undefined : arrival, onKeyDown: onKeyDown, children: [_jsx("span", { className: segmentedControlParts.indicator, hidden: pill === null, style: pill === null
|
|
248
254
|
? undefined
|
|
249
255
|
: {
|
|
250
256
|
blockSize: `${pill.h}px`,
|
|
251
257
|
inlineSize: `${pill.w}px`,
|
|
252
258
|
translate: `${pill.x}px ${pill.y}px`,
|
|
259
|
+
["--dds-segmentedcontrol-from"]: `${pill.fromX}px ${pill.y}px`,
|
|
260
|
+
["--dds-segmentedcontrol-from-size"]: `${pill.fromW}px`,
|
|
253
261
|
} }), segments.map((segment, index) => cloneElement(segment, {
|
|
254
262
|
// Both are the row's to decide, and both overwrite whatever the segment was
|
|
255
263
|
// given: one chosen value, one height. Availability is the segment's own — the
|
|
@@ -21,10 +21,14 @@ export interface SegmentedControlOwnProps {
|
|
|
21
21
|
value?: string;
|
|
22
22
|
/** Whenever value is — together they are how a page holds the choice. It is called with the chosen segment's value after that segment's own onSelect, so a segment that reports its own presses keeps doing so inside a row */
|
|
23
23
|
onChange?: (value: string) => void;
|
|
24
|
+
/**
|
|
25
|
+
* `slide` — The pill starts on the first segment and slides to the chosen one once, on arrival — a trade ticket set to Sell showing it was Buy first. It holds for motion.duration.hold, then slides over motion.duration.shift
|
|
26
|
+
*/
|
|
27
|
+
motion?: 'slide';
|
|
24
28
|
/** Allowed: SegmentedControlItem */
|
|
25
29
|
children: ReactNode;
|
|
26
30
|
}
|
|
27
|
-
export type SegmentedControlProps = SegmentedControlOwnProps & Omit<HTMLAttributes<HTMLDivElement>, 'className' | 'layout' | 'size' | 'disabled' | 'label' | 'value' | 'onChange'>;
|
|
31
|
+
export type SegmentedControlProps = SegmentedControlOwnProps & Omit<HTMLAttributes<HTMLDivElement>, 'className' | 'layout' | 'size' | 'disabled' | 'label' | 'value' | 'onChange' | 'motion'>;
|
|
28
32
|
/** The class each part carries. Apply these — do not retype them. */
|
|
29
33
|
export declare const segmentedControlParts: {
|
|
30
34
|
readonly root: "dds-segmentedcontrol";
|
|
@@ -55,3 +55,38 @@
|
|
|
55
55
|
.dds-segmentedcontrol__indicator {
|
|
56
56
|
transition-property: translate, inline-size, block-size;
|
|
57
57
|
}
|
|
58
|
+
|
|
59
|
+
/*
|
|
60
|
+
* `motion="slide"`: the pill starts on the first segment and slides to the chosen one once, on
|
|
61
|
+
* arrival — Buy to Sell — over motion.duration.shift on its easing, after holding where it started
|
|
62
|
+
* for motion.duration.hold. Where it starts is measured with where it lands (the first segment's
|
|
63
|
+
* place and width, set on the pill as custom properties), so the slide is the stylesheet's.
|
|
64
|
+
* `data-arrival` is the row's own answer from useArrival (arrival.ts): `waiting` holds the pill on
|
|
65
|
+
* the first segment, `playing` slides it, and no attribute is the pill where it belongs.
|
|
66
|
+
*/
|
|
67
|
+
@keyframes dds-segmentedcontrol-slide {
|
|
68
|
+
from {
|
|
69
|
+
inline-size: var(--dds-segmentedcontrol-from-size);
|
|
70
|
+
translate: var(--dds-segmentedcontrol-from);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
:where([data-dds-context="marketing"])
|
|
75
|
+
.dds-segmentedcontrol[data-motion='slide'][data-arrival]
|
|
76
|
+
.dds-segmentedcontrol__indicator {
|
|
77
|
+
animation: dds-segmentedcontrol-slide var(--motion-duration-shift) var(--motion-easing-shift) var(--motion-duration-hold) both;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
:where([data-dds-context="marketing"])
|
|
81
|
+
.dds-segmentedcontrol[data-motion='slide'][data-arrival='waiting']
|
|
82
|
+
.dds-segmentedcontrol__indicator {
|
|
83
|
+
animation-play-state: paused !important;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@media (prefers-reduced-motion: reduce) {
|
|
87
|
+
:where([data-dds-context="marketing"])
|
|
88
|
+
.dds-segmentedcontrol[data-motion='slide'][data-arrival]
|
|
89
|
+
.dds-segmentedcontrol__indicator {
|
|
90
|
+
animation: none;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -10,7 +10,7 @@ export interface SegmentedControlItemOwnProps {
|
|
|
10
10
|
value: string;
|
|
11
11
|
/** Always — it is the segment's accessible name as well as its words, and a radio with no name is announced as a control with nothing in it. One or two words: a row is scanned across, and the segment that needs a phrase is a choice that wanted a list */
|
|
12
12
|
label: string;
|
|
13
|
-
/** The glyph tells the modes apart faster than the words do — a card and a bank beside two payment methods. Import it from @deriv-com/
|
|
13
|
+
/** The glyph tells the modes apart faster than the words do — a card and a bank beside two payment methods. Import it from @deriv-com/dds-marketing/icons and pass the element */
|
|
14
14
|
icon?: ReactNode;
|
|
15
15
|
/** This segment reports its own presses — logging which plan a visitor looked at, say. It is called with this segment's value, and SegmentedControl chains its own handler after it rather than replacing it */
|
|
16
16
|
onSelect?: (value: string) => void;
|
|
@@ -151,6 +151,8 @@
|
|
|
151
151
|
gap: var(--space-gap-xs);
|
|
152
152
|
letter-spacing: var(--font-body-sm-letter-spacing);
|
|
153
153
|
line-height: var(--font-body-sm-line-height);
|
|
154
|
+
transition-duration: var(--motion-duration-fast);
|
|
155
|
+
transition-timing-function: var(--motion-easing-standard);
|
|
154
156
|
}
|
|
155
157
|
|
|
156
158
|
:where([data-dds-context="marketing"]) .dds-select .dds-select__message-icon {
|
|
@@ -112,3 +112,61 @@
|
|
|
112
112
|
animation: none;
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
|
+
|
|
116
|
+
/*
|
|
117
|
+
* The status message fades in when it arrives.
|
|
118
|
+
*
|
|
119
|
+
* A contract binds transitions, and a transition needs a value to move from: the message is not
|
|
120
|
+
* in the DOM until a status is reported, so only a keyframe can bring it in. Opacity alone — the
|
|
121
|
+
* message takes the helper's place rather than pushing the row down, so there is no distance to
|
|
122
|
+
* travel, and moving it would shift the words being read. A status changing while the message is
|
|
123
|
+
* showing keeps the same element, and its colour moves with the transition the contract binds.
|
|
124
|
+
*/
|
|
125
|
+
@keyframes dds-select-message-in {
|
|
126
|
+
from {
|
|
127
|
+
opacity: 0;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
:where([data-dds-context="marketing"]) .dds-select .dds-select__message {
|
|
132
|
+
animation: dds-select-message-in var(--motion-duration-normal) var(--motion-easing-enter);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/*
|
|
136
|
+
* The box shakes once when the field turns to an error, as TextInput's does.
|
|
137
|
+
*
|
|
138
|
+
* Once, on arrival: the animation is attached by the error status, so it plays when the status
|
|
139
|
+
* becomes error and not again while it stays one. Only the box moves; the label and the
|
|
140
|
+
* message hold still, so the words saying what went wrong can be read while it settles.
|
|
141
|
+
*
|
|
142
|
+
* Not while the list is open. The popup is drawn inside the box, so shaking the box would shake
|
|
143
|
+
* the answers being read along with it. A status that arrives while it is open shakes the box
|
|
144
|
+
* as the list closes, which is the moment the answer is handed in.
|
|
145
|
+
*/
|
|
146
|
+
@keyframes dds-select-shake {
|
|
147
|
+
20% {
|
|
148
|
+
translate: calc(var(--motion-distance-shake) * -1) 0;
|
|
149
|
+
}
|
|
150
|
+
40% {
|
|
151
|
+
translate: var(--motion-distance-shake) 0;
|
|
152
|
+
}
|
|
153
|
+
60% {
|
|
154
|
+
translate: calc(var(--motion-distance-shake) * -0.5) 0;
|
|
155
|
+
}
|
|
156
|
+
80% {
|
|
157
|
+
translate: calc(var(--motion-distance-shake) * 0.5) 0;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
:where([data-dds-context="marketing"]) .dds-select[data-status="error"]:not(:has([aria-expanded="true"])) .dds-select__control {
|
|
162
|
+
animation: dds-select-shake var(--motion-duration-slow) var(--motion-easing-standard);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/* The generated reduce block is written from the token bindings and these are not. A reader who
|
|
166
|
+
has asked for less movement has asked for this too. */
|
|
167
|
+
@media (prefers-reduced-motion: reduce) {
|
|
168
|
+
:where([data-dds-context="marketing"]) .dds-select .dds-select__message,
|
|
169
|
+
:where([data-dds-context="marketing"]) .dds-select[data-status="error"]:not(:has([aria-expanded="true"])) .dds-select__control {
|
|
170
|
+
animation: none;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -32,4 +32,4 @@ export type { StatusDotProps };
|
|
|
32
32
|
* carrying a tooltip must have — a tooltip makes it a tab stop, and a focusable thing
|
|
33
33
|
* with no name is announced as nothing at all.
|
|
34
34
|
*/
|
|
35
|
-
export declare function StatusDot({ variant, pulse, label, tooltip, ...rest }: StatusDotProps): import("react").JSX.Element;
|
|
35
|
+
export declare function StatusDot({ variant, pulse, from, label, tooltip, ...rest }: StatusDotProps): import("react").JSX.Element;
|
|
@@ -2,6 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import './StatusDot.css';
|
|
3
3
|
import './status-dot-impl.css';
|
|
4
4
|
import { TooltipAnchor } from '../tooltip/TooltipAnchor.js';
|
|
5
|
+
import { Arrives } from '../../arrives.js';
|
|
5
6
|
import { given } from '../../given.js';
|
|
6
7
|
import { statusDotDefaults, statusDotParts } from './StatusDot.types.js';
|
|
7
8
|
/**
|
|
@@ -34,13 +35,15 @@ import { statusDotDefaults, statusDotParts } from './StatusDot.types.js';
|
|
|
34
35
|
* carrying a tooltip must have — a tooltip makes it a tab stop, and a focusable thing
|
|
35
36
|
* with no name is announced as nothing at all.
|
|
36
37
|
*/
|
|
37
|
-
export function StatusDot({ variant = statusDotDefaults.variant, pulse = statusDotDefaults.pulse, label, tooltip, ...rest }) {
|
|
38
|
+
export function StatusDot({ variant = statusDotDefaults.variant, pulse = statusDotDefaults.pulse, from, label, tooltip, ...rest }) {
|
|
38
39
|
const described = given(tooltip);
|
|
39
|
-
const dot = (_jsx("span", { className: statusDotParts.root, "aria-label": label, "aria-hidden": label === undefined || undefined, "data-variant": variant, "data-pulse": pulse || undefined, tabIndex: described ? 0 : undefined, ...rest }));
|
|
40
|
+
const dot = (_jsx("span", { className: statusDotParts.root, "aria-label": label, "aria-hidden": label === undefined || undefined, "data-variant": variant, "data-pulse": pulse || undefined, "data-from": from, tabIndex: described ? 0 : undefined, ...rest }));
|
|
41
|
+
// A dot that starts as another state moves once on arrival, so only then does it take a script.
|
|
42
|
+
const drawn = from === undefined ? dot : _jsx(Arrives, { children: dot });
|
|
40
43
|
if (!described)
|
|
41
|
-
return
|
|
44
|
+
return drawn;
|
|
42
45
|
// The anchor clones the dot to attach its handlers and the aria-describedby, so the
|
|
43
46
|
// description belongs to the element carrying the role — not to the wrapper, which
|
|
44
47
|
// no assistive technology has any reason to visit.
|
|
45
|
-
return _jsx(TooltipAnchor, { content: tooltip, children:
|
|
48
|
+
return _jsx(TooltipAnchor, { content: tooltip, children: drawn });
|
|
46
49
|
}
|
|
@@ -10,8 +10,16 @@ export interface StatusDotOwnProps {
|
|
|
10
10
|
variant?: 'accent' | 'success' | 'warning' | 'error' | 'info';
|
|
11
11
|
/** The status is live or actively changing — draws attention to an ongoing state */
|
|
12
12
|
pulse?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* `accent` — Starts as accent before becoming its own state.
|
|
15
|
+
* `success` — Starts as success before becoming its own state.
|
|
16
|
+
* `warning` — Starts as warning before becoming its own state.
|
|
17
|
+
* `error` — Starts as error before becoming its own state.
|
|
18
|
+
* `info` — Starts as info before becoming its own state.
|
|
19
|
+
*/
|
|
20
|
+
from?: 'accent' | 'success' | 'warning' | 'error' | 'info';
|
|
13
21
|
}
|
|
14
|
-
export type StatusDotProps = StatusDotOwnProps & Omit<HTMLAttributes<HTMLSpanElement>, 'className' | 'variant' | 'pulse' | 'label' | 'tooltip'> & ({
|
|
22
|
+
export type StatusDotProps = StatusDotOwnProps & Omit<HTMLAttributes<HTMLSpanElement>, 'className' | 'variant' | 'pulse' | 'label' | 'tooltip' | 'from'> & ({
|
|
15
23
|
tooltip?: string;
|
|
16
24
|
label: string;
|
|
17
25
|
} | {
|
|
@@ -40,3 +40,104 @@
|
|
|
40
40
|
:where([data-dds-context="marketing"]) .dds-tooltip-anchor:has(> .dds-statusdot) {
|
|
41
41
|
flex-shrink: 0;
|
|
42
42
|
}
|
|
43
|
+
|
|
44
|
+
/*
|
|
45
|
+
* `from`: the dot starts as another state and becomes its own once, on arrival — "Opening…" in
|
|
46
|
+
* info's blue becoming "Position open" in success's green. `data-arrival` is the dot's own answer
|
|
47
|
+
* from useArrival (arrival.ts): `waiting` holds it in its first state, `playing` runs it, and no
|
|
48
|
+
* attribute — a server, a reader who asked for less movement — is the dot in its own state.
|
|
49
|
+
*
|
|
50
|
+
* It holds the first state for motion.duration.hold — the same hold Typography's `from` gives its
|
|
51
|
+
* words, so a dot and the words beside it change together — then turns in one step, and a dot that
|
|
52
|
+
* pulses starts pulsing only then: a live state loops; the state before it was not live.
|
|
53
|
+
*/
|
|
54
|
+
/* One keyframe per state the dot can start in, each naming its own colour token. */
|
|
55
|
+
@keyframes dds-statusdot-from-accent {
|
|
56
|
+
from {
|
|
57
|
+
background-color: var(--color-bg-brand);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@keyframes dds-statusdot-from-error {
|
|
62
|
+
from {
|
|
63
|
+
background-color: var(--color-bg-danger);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@keyframes dds-statusdot-from-info {
|
|
68
|
+
from {
|
|
69
|
+
background-color: var(--color-bg-info);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@keyframes dds-statusdot-from-success {
|
|
74
|
+
from {
|
|
75
|
+
background-color: var(--color-bg-success);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@keyframes dds-statusdot-from-warning {
|
|
80
|
+
from {
|
|
81
|
+
background-color: var(--color-bg-warning);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
:where([data-dds-context="marketing"]) .dds-statusdot[data-from='accent'][data-arrival] {
|
|
86
|
+
animation: dds-statusdot-from-accent var(--motion-duration-hold) steps(1, end) both;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
:where([data-dds-context="marketing"]) .dds-statusdot[data-from='accent'][data-pulse][data-arrival] {
|
|
90
|
+
animation:
|
|
91
|
+
dds-statusdot-from-accent var(--motion-duration-hold) steps(1, end) both,
|
|
92
|
+
dds-statusdot-pulse var(--motion-duration-pulse) var(--motion-easing-enter) var(--motion-duration-hold) infinite;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
:where([data-dds-context="marketing"]) .dds-statusdot[data-from='error'][data-arrival] {
|
|
96
|
+
animation: dds-statusdot-from-error var(--motion-duration-hold) steps(1, end) both;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
:where([data-dds-context="marketing"]) .dds-statusdot[data-from='error'][data-pulse][data-arrival] {
|
|
100
|
+
animation:
|
|
101
|
+
dds-statusdot-from-error var(--motion-duration-hold) steps(1, end) both,
|
|
102
|
+
dds-statusdot-pulse var(--motion-duration-pulse) var(--motion-easing-enter) var(--motion-duration-hold) infinite;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
:where([data-dds-context="marketing"]) .dds-statusdot[data-from='info'][data-arrival] {
|
|
106
|
+
animation: dds-statusdot-from-info var(--motion-duration-hold) steps(1, end) both;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
:where([data-dds-context="marketing"]) .dds-statusdot[data-from='info'][data-pulse][data-arrival] {
|
|
110
|
+
animation:
|
|
111
|
+
dds-statusdot-from-info var(--motion-duration-hold) steps(1, end) both,
|
|
112
|
+
dds-statusdot-pulse var(--motion-duration-pulse) var(--motion-easing-enter) var(--motion-duration-hold) infinite;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
:where([data-dds-context="marketing"]) .dds-statusdot[data-from='success'][data-arrival] {
|
|
116
|
+
animation: dds-statusdot-from-success var(--motion-duration-hold) steps(1, end) both;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
:where([data-dds-context="marketing"]) .dds-statusdot[data-from='success'][data-pulse][data-arrival] {
|
|
120
|
+
animation:
|
|
121
|
+
dds-statusdot-from-success var(--motion-duration-hold) steps(1, end) both,
|
|
122
|
+
dds-statusdot-pulse var(--motion-duration-pulse) var(--motion-easing-enter) var(--motion-duration-hold) infinite;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
:where([data-dds-context="marketing"]) .dds-statusdot[data-from='warning'][data-arrival] {
|
|
126
|
+
animation: dds-statusdot-from-warning var(--motion-duration-hold) steps(1, end) both;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
:where([data-dds-context="marketing"]) .dds-statusdot[data-from='warning'][data-pulse][data-arrival] {
|
|
130
|
+
animation:
|
|
131
|
+
dds-statusdot-from-warning var(--motion-duration-hold) steps(1, end) both,
|
|
132
|
+
dds-statusdot-pulse var(--motion-duration-pulse) var(--motion-easing-enter) var(--motion-duration-hold) infinite;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
:where([data-dds-context="marketing"]) .dds-statusdot[data-from][data-arrival='waiting'] {
|
|
136
|
+
animation-play-state: paused !important;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
@media (prefers-reduced-motion: reduce) {
|
|
140
|
+
:where([data-dds-context="marketing"]) .dds-statusdot[data-from][data-arrival] {
|
|
141
|
+
animation: none;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
@@ -92,6 +92,8 @@
|
|
|
92
92
|
gap: var(--space-gap-xs);
|
|
93
93
|
letter-spacing: var(--font-body-sm-letter-spacing);
|
|
94
94
|
line-height: var(--font-body-sm-line-height);
|
|
95
|
+
transition-duration: var(--motion-duration-fast);
|
|
96
|
+
transition-timing-function: var(--motion-easing-standard);
|
|
95
97
|
}
|
|
96
98
|
|
|
97
99
|
:where([data-dds-context="marketing"]) .dds-textarea .dds-textarea__message-icon {
|