@deriv-com/dds-marketing 0.2.0 → 1.0.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 +8 -0
- package/.llm/components/accordionitem.md +8 -0
- package/.llm/components/aspectratio.md +8 -0
- package/.llm/components/badge.md +8 -0
- package/.llm/components/bottomsheet.md +8 -0
- package/.llm/components/breadcrumb.md +8 -0
- package/.llm/components/breadcrumbitem.md +8 -0
- package/.llm/components/button.md +46 -22
- package/.llm/components/buttonicon.md +14 -6
- package/.llm/components/card.md +15 -1
- package/.llm/components/cardbody.md +28 -2
- package/.llm/components/cardbutton.md +15 -1
- package/.llm/components/checkbox.md +8 -0
- package/.llm/components/ctabanner.md +186 -0
- package/.llm/components/ctabannerslider.md +204 -0
- package/.llm/components/divider.md +8 -0
- package/.llm/components/dropdownmenu.md +13 -5
- package/.llm/components/faqaccordion.md +217 -0
- package/.llm/components/featurebullets.md +254 -0
- package/.llm/components/featurecards.md +313 -0
- package/.llm/components/featurescroll.md +284 -0
- package/.llm/components/featuresplit.md +249 -0
- package/.llm/components/filterchip.md +8 -0
- package/.llm/components/footer.md +8 -0
- package/.llm/components/footergroup.md +8 -0
- package/.llm/components/grid.md +8 -0
- package/.llm/components/icon.md +8 -0
- package/.llm/components/landinghero.md +254 -0
- package/.llm/components/link.md +9 -1
- package/.llm/components/logocolumns.md +235 -0
- package/.llm/components/logorows.md +212 -0
- package/.llm/components/menuitem.md +8 -0
- package/.llm/components/navbar.md +79 -15
- package/.llm/components/navbaritem.md +9 -1
- package/.llm/components/navbarmenu.md +8 -0
- package/.llm/components/navbarmenugroup.md +8 -0
- package/.llm/components/navbarpanel.md +9 -1
- package/.llm/components/navbarswitcher.md +9 -1
- package/.llm/components/navbarswitcheroption.md +8 -0
- package/.llm/components/option.md +8 -0
- package/.llm/components/pageheader.md +231 -0
- package/.llm/components/pagination.md +26 -89
- package/.llm/components/paginationdots.md +215 -0
- package/.llm/components/producthero.md +248 -0
- package/.llm/components/removablechip.md +8 -0
- package/.llm/components/row.md +8 -0
- package/.llm/components/scroller.md +8 -0
- package/.llm/components/searchinput.md +8 -0
- package/.llm/components/segmentedcontrol.md +8 -0
- package/.llm/components/segmentedcontrolitem.md +8 -0
- package/.llm/components/select.md +8 -0
- package/.llm/components/selectchip.md +56 -15
- package/.llm/components/spinner.md +8 -0
- package/.llm/components/stack.md +8 -0
- package/.llm/components/statusdot.md +8 -0
- package/.llm/components/subdomainnavbar.md +8 -0
- package/.llm/components/tab.md +8 -0
- package/.llm/components/table.md +8 -0
- package/.llm/components/tablebody.md +8 -0
- package/.llm/components/tablecell.md +8 -0
- package/.llm/components/tablehead.md +8 -0
- package/.llm/components/tableheadercell.md +8 -0
- package/.llm/components/tablerow.md +8 -0
- package/.llm/components/tablist.md +8 -0
- package/.llm/components/testimonialrow.md +235 -0
- package/.llm/components/testimonialslider.md +254 -0
- package/.llm/components/textarea.md +8 -0
- package/.llm/components/textinput.md +8 -0
- package/.llm/components/tooltip.md +8 -0
- package/.llm/components/typography.md +8 -0
- package/.llm/digest/button.md +11 -6
- package/.llm/digest/buttonicon.md +2 -2
- package/.llm/digest/card.md +1 -0
- package/.llm/digest/cardbody.md +3 -1
- package/.llm/digest/cardbutton.md +1 -0
- package/.llm/digest/ctabanner.md +44 -0
- package/.llm/digest/ctabannerslider.md +45 -0
- package/.llm/digest/dropdownmenu.md +1 -1
- package/.llm/digest/faqaccordion.md +43 -0
- package/.llm/digest/featurebullets.md +52 -0
- package/.llm/digest/featurecards.md +49 -0
- package/.llm/digest/featurescroll.md +52 -0
- package/.llm/digest/featuresplit.md +54 -0
- package/.llm/digest/landinghero.md +53 -0
- package/.llm/digest/logocolumns.md +55 -0
- package/.llm/digest/logorows.md +48 -0
- package/.llm/digest/navbar.md +18 -3
- package/.llm/digest/pageheader.md +49 -0
- package/.llm/digest/pagination.md +6 -17
- package/.llm/digest/paginationdots.md +43 -0
- package/.llm/digest/producthero.md +53 -0
- package/.llm/digest/selectchip.md +6 -1
- package/.llm/digest/testimonialrow.md +51 -0
- package/.llm/digest/testimonialslider.md +51 -0
- package/.llm/index.md +24 -3
- package/.llm/rules.md +24 -0
- package/.llm/tokens.md +56 -12
- package/AGENTS.md +28 -3
- package/README.md +41 -21
- package/dist/components/banner-data.d.ts +38 -0
- package/dist/components/banner-data.js +15 -0
- package/dist/components/blocks/block-reveal.css +90 -0
- package/dist/components/blocks/cta-banner/CtaBanner.css +66 -0
- package/dist/components/blocks/cta-banner/CtaBanner.d.ts +22 -0
- package/dist/components/blocks/cta-banner/CtaBanner.js +31 -0
- package/dist/components/blocks/cta-banner/CtaBanner.types.d.ts +29 -0
- package/dist/components/blocks/cta-banner/CtaBanner.types.js +13 -0
- package/dist/components/blocks/cta-banner/cta-banner-impl.css +29 -0
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.css +90 -0
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.d.ts +39 -0
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.js +60 -0
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.d.ts +41 -0
- package/dist/components/blocks/cta-banner-slider/CtaBannerSlider.types.js +15 -0
- package/dist/components/blocks/cta-banner-slider/cta-banner-slider-impl.css +73 -0
- package/dist/components/blocks/faq-accordion/FaqAccordion.css +54 -0
- package/dist/components/blocks/faq-accordion/FaqAccordion.d.ts +20 -0
- package/dist/components/blocks/faq-accordion/FaqAccordion.js +28 -0
- package/dist/components/blocks/faq-accordion/FaqAccordion.types.d.ts +25 -0
- package/dist/components/blocks/faq-accordion/FaqAccordion.types.js +10 -0
- package/dist/components/blocks/faq-accordion/faq-accordion-impl.css +54 -0
- package/dist/components/blocks/feature-bullets/FeatureBullets.css +139 -0
- package/dist/components/blocks/feature-bullets/FeatureBullets.d.ts +31 -0
- package/dist/components/blocks/feature-bullets/FeatureBullets.js +55 -0
- package/dist/components/blocks/feature-bullets/FeatureBullets.types.d.ts +39 -0
- package/dist/components/blocks/feature-bullets/FeatureBullets.types.js +16 -0
- package/dist/components/blocks/feature-bullets/feature-bullets-impl.css +104 -0
- package/dist/components/blocks/feature-cards/FeatureCards.css +84 -0
- package/dist/components/blocks/feature-cards/FeatureCards.d.ts +24 -0
- package/dist/components/blocks/feature-cards/FeatureCards.js +66 -0
- package/dist/components/blocks/feature-cards/FeatureCards.types.d.ts +33 -0
- package/dist/components/blocks/feature-cards/FeatureCards.types.js +14 -0
- package/dist/components/blocks/feature-cards/feature-cards-impl.css +245 -0
- package/dist/components/blocks/feature-scroll/FeatureScroll.css +137 -0
- package/dist/components/blocks/feature-scroll/FeatureScroll.d.ts +39 -0
- package/dist/components/blocks/feature-scroll/FeatureScroll.js +167 -0
- package/dist/components/blocks/feature-scroll/FeatureScroll.types.d.ts +40 -0
- package/dist/components/blocks/feature-scroll/FeatureScroll.types.js +17 -0
- package/dist/components/blocks/feature-scroll/feature-scroll-impl.css +292 -0
- package/dist/components/blocks/feature-split/FeatureSplit.css +95 -0
- package/dist/components/blocks/feature-split/FeatureSplit.d.ts +30 -0
- package/dist/components/blocks/feature-split/FeatureSplit.js +38 -0
- package/dist/components/blocks/feature-split/FeatureSplit.types.d.ts +39 -0
- package/dist/components/blocks/feature-split/FeatureSplit.types.js +14 -0
- package/dist/components/blocks/feature-split/feature-split-impl.css +83 -0
- package/dist/components/blocks/landing-hero/LandingHero.css +85 -0
- package/dist/components/blocks/landing-hero/LandingHero.d.ts +41 -0
- package/dist/components/blocks/landing-hero/LandingHero.js +54 -0
- package/dist/components/blocks/landing-hero/LandingHero.types.d.ts +37 -0
- package/dist/components/blocks/landing-hero/LandingHero.types.js +15 -0
- package/dist/components/blocks/landing-hero/landing-hero-impl.css +355 -0
- package/dist/components/blocks/logo-columns/LogoColumns.css +161 -0
- package/dist/components/blocks/logo-columns/LogoColumns.d.ts +23 -0
- package/dist/components/blocks/logo-columns/LogoColumns.js +46 -0
- package/dist/components/blocks/logo-columns/LogoColumns.types.d.ts +46 -0
- package/dist/components/blocks/logo-columns/LogoColumns.types.js +18 -0
- package/dist/components/blocks/logo-columns/logo-columns-impl.css +188 -0
- package/dist/components/blocks/logo-rows/LogoRows.css +122 -0
- package/dist/components/blocks/logo-rows/LogoRows.d.ts +20 -0
- package/dist/components/blocks/logo-rows/LogoRows.js +43 -0
- package/dist/components/blocks/logo-rows/LogoRows.types.d.ts +36 -0
- package/dist/components/blocks/logo-rows/LogoRows.types.js +16 -0
- package/dist/components/blocks/logo-rows/logo-rows-impl.css +179 -0
- package/dist/components/blocks/page-header/PageHeader.css +79 -0
- package/dist/components/blocks/page-header/PageHeader.d.ts +34 -0
- package/dist/components/blocks/page-header/PageHeader.js +43 -0
- package/dist/components/blocks/page-header/PageHeader.types.d.ts +32 -0
- package/dist/components/blocks/page-header/PageHeader.types.js +14 -0
- package/dist/components/blocks/page-header/page-header-impl.css +176 -0
- package/dist/components/blocks/product-hero/ProductHero.css +86 -0
- package/dist/components/blocks/product-hero/ProductHero.d.ts +35 -0
- package/dist/components/blocks/product-hero/ProductHero.js +48 -0
- package/dist/components/blocks/product-hero/ProductHero.types.d.ts +37 -0
- package/dist/components/blocks/product-hero/ProductHero.types.js +15 -0
- package/dist/components/blocks/product-hero/product-hero-impl.css +354 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.css +245 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.d.ts +20 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.js +128 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.types.d.ts +54 -0
- package/dist/components/blocks/testimonial-row/TestimonialRow.types.js +26 -0
- package/dist/components/blocks/testimonial-row/testimonial-row-impl.css +195 -0
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.css +181 -0
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.d.ts +22 -0
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.js +36 -0
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.d.ts +49 -0
- package/dist/components/blocks/testimonial-slider/TestimonialSlider.types.js +21 -0
- package/dist/components/blocks/testimonial-slider/testimonial-slider-impl.css +202 -0
- package/dist/components/blocks/use-reveal.d.ts +46 -0
- package/dist/components/blocks/use-reveal.js +120 -0
- package/dist/components/blocks/use-rotation.d.ts +62 -0
- package/dist/components/blocks/use-rotation.js +176 -0
- package/dist/components/core/accordion-item/AccordionItem.css +6 -5
- package/dist/components/core/bottom-sheet/BottomSheet.css +1 -1
- package/dist/components/core/button/Button.css +63 -16
- package/dist/components/core/button/Button.d.ts +14 -12
- package/dist/components/core/button/Button.js +43 -14
- package/dist/components/core/button/Button.types.d.ts +9 -14
- package/dist/components/core/button/button-impl.css +25 -0
- package/dist/components/core/button-icon/ButtonIcon.css +31 -15
- package/dist/components/core/button-icon/ButtonIcon.d.ts +2 -2
- package/dist/components/core/button-icon/ButtonIcon.js +2 -2
- package/dist/components/core/button-icon/ButtonIcon.types.d.ts +4 -4
- package/dist/components/core/card/Card.css +13 -4
- package/dist/components/core/card/Card.types.d.ts +2 -1
- package/dist/components/core/card-body/CardBody.css +11 -6
- package/dist/components/core/card-body/CardBody.d.ts +1 -1
- package/dist/components/core/card-body/CardBody.js +2 -2
- package/dist/components/core/card-body/CardBody.types.d.ts +4 -1
- package/dist/components/core/card-body/CardBody.types.js +1 -0
- package/dist/components/core/card-button/CardButton.css +13 -4
- package/dist/components/core/card-button/CardButton.types.d.ts +2 -1
- package/dist/components/core/checkbox/Checkbox.css +8 -1
- package/dist/components/core/dropdown-menu/DropdownMenu.css +13 -12
- package/dist/components/core/dropdown-menu/DropdownMenu.d.ts +5 -3
- package/dist/components/core/dropdown-menu/DropdownMenu.js +5 -3
- package/dist/components/core/filter-chip/FilterChip.css +2 -1
- package/dist/components/core/footer/footer-impl.css +1 -1
- package/dist/components/core/footer-group/FooterGroup.css +8 -7
- package/dist/components/core/icon/Icon.css +1 -1
- package/dist/components/core/link/Link.css +1 -1
- package/dist/components/core/menu-item/MenuItem.css +1 -1
- package/dist/components/core/navbar/Navbar.css +7 -8
- package/dist/components/core/navbar/Navbar.d.ts +17 -1
- package/dist/components/core/navbar/Navbar.js +139 -12
- package/dist/components/core/navbar/Navbar.types.d.ts +23 -4
- package/dist/components/core/navbar/Navbar.types.js +1 -1
- package/dist/components/core/navbar/navbar-impl.css +10 -3
- package/dist/components/core/navbar/navbar-material.css +96 -0
- package/dist/components/core/navbar-item/NavbarItem.css +4 -4
- package/dist/components/core/navbar-menu/NavbarMenu.css +7 -5
- package/dist/components/core/navbar-menu/NavbarMenu.d.ts +1 -0
- package/dist/components/core/navbar-menu/NavbarMenu.js +1 -0
- package/dist/components/core/navbar-menu/navbar-menu-impl.css +7 -7
- package/dist/components/core/navbar-switcher/NavbarSwitcher.css +6 -5
- package/dist/components/core/navbar-switcher/NavbarSwitcher.d.ts +1 -0
- package/dist/components/core/navbar-switcher/NavbarSwitcher.js +2 -1
- package/dist/components/core/option/Option.css +1 -1
- package/dist/components/core/pagination/Pagination.css +1 -75
- package/dist/components/core/pagination/Pagination.d.ts +4 -4
- package/dist/components/core/pagination/Pagination.js +11 -51
- package/dist/components/core/pagination/Pagination.types.d.ts +5 -17
- package/dist/components/core/pagination/Pagination.types.js +1 -3
- package/dist/components/core/pagination-dots/PaginationDots.css +60 -0
- package/dist/components/core/pagination-dots/PaginationDots.d.ts +25 -0
- package/dist/components/core/pagination-dots/PaginationDots.js +104 -0
- package/dist/components/core/pagination-dots/PaginationDots.types.d.ts +38 -0
- package/dist/components/core/pagination-dots/PaginationDots.types.js +9 -0
- package/dist/components/core/removable-chip/RemovableChip.css +3 -3
- package/dist/components/core/search-input/SearchInput.css +1 -1
- package/dist/components/core/segmented-control/SegmentedControl.css +1 -1
- package/dist/components/core/segmented-control-item/SegmentedControlItem.css +1 -1
- package/dist/components/core/select/Select.css +2 -1
- package/dist/components/core/select-chip/SelectChip.css +14 -7
- package/dist/components/core/select-chip/SelectChip.d.ts +1 -1
- package/dist/components/core/select-chip/SelectChip.js +7 -4
- package/dist/components/core/select-chip/SelectChip.types.d.ts +7 -1
- package/dist/components/core/select-chip/SelectChip.types.js +1 -1
- package/dist/components/core/select-chip/select-chip-impl.css +14 -3
- package/dist/components/core/status-dot/StatusDot.css +1 -1
- package/dist/components/core/subdomain-navbar/SubdomainNavbar.css +3 -3
- package/dist/components/core/tab/Tab.css +1 -1
- package/dist/components/core/tab-list/TabList.css +1 -1
- package/dist/components/core/table/table-impl.css +36 -14
- package/dist/components/core/table-header-cell/TableHeaderCell.css +5 -5
- package/dist/components/core/text-area/TextArea.css +1 -1
- package/dist/components/core/text-input/TextInput.css +1 -1
- package/dist/components/core/tooltip/Tooltip.css +1 -1
- package/dist/components/core/typography/Typography.css +5 -5
- package/dist/components/index.d.ts +35 -0
- package/dist/components/index.js +30 -0
- package/dist/components/logo-data.d.ts +24 -0
- package/dist/components/logo-data.js +11 -0
- package/dist/components/scroll-data.d.ts +64 -0
- package/dist/components/scroll-data.js +17 -0
- package/dist/components/testimonial-row-data.d.ts +51 -0
- package/dist/components/testimonial-row-data.js +11 -0
- package/dist/components/testimonial-slider-data.d.ts +26 -0
- package/dist/components/testimonial-slider-data.js +10 -0
- package/dist/marketing.css +385 -14
- package/package.json +1 -6
|
@@ -169,6 +169,14 @@ The target and the mark are separate decisions, and conflating them is what prod
|
|
|
169
169
|
|
|
170
170
|
Declared rather than emergent. Padding plus contents does clear 24px in several components today, and it is the weaker statement: it is a size nobody wrote down, so it moves when the type scale or the glyph does, and nothing says it was meant to be a target at all.
|
|
171
171
|
Guidance only — cannot be checked automatically.
|
|
172
|
+
- **A component is written along the reading axis, not along the page's left and right** — Every measure, inset and placement in this package names an axis rather than a side: inline-size and block-size, padding-inline and padding-block, inset-inline-start and inset-block-end, margin-inline: auto, text-align: start. Written that way a component follows whichever direction the page is read in, and a band whose claim ranges to the leading edge with its subject on the trailing one is the same composition in Arabic as in English, mirrored, with nothing restated. Written as left and right it is the same pixels in both, which is a layout nobody designed for the second language.
|
|
173
|
+
|
|
174
|
+
The enum values follow the same rule and for the same reason. A prop that names where a picture sits takes start and end, never left and right — FeatureSplit, FeatureBullets and FeatureScroll all declare mediaPosition that way, and the flex directions they generate flip on their own because row already means the reading order. A value called left would have to be re-read as right by every author working in a mirrored page, which is a translation this system should be doing rather than asking for.
|
|
175
|
+
|
|
176
|
+
The guidance a contract carries is part of the component, so it follows too. Describing a claim as ranging left is describing one of the two languages, and it was written that way here for a while: three of the opening bands said so in their own intent. A reader in a mirrored page meets that sentence and has to decide whether the component is wrong or the sentence is, and neither answer is one documentation should force.
|
|
177
|
+
|
|
178
|
+
Two things genuinely have no logical form and are not covered by this. A CSS gradient takes a physical direction — there is no to inline-end — so a pattern that must mirror has to be stated twice under a direction query, and one that is periodic and centred, like PageHeader's rule grid, does not need to. A glyph that points the way onward is the other: an arrow is a picture of a direction, and mirroring it belongs to the icon set rather than to the component holding it.
|
|
179
|
+
Guidance only — cannot be checked automatically.
|
|
172
180
|
|
|
173
181
|
## Anti-examples
|
|
174
182
|
|
|
@@ -142,6 +142,14 @@ The target and the mark are separate decisions, and conflating them is what prod
|
|
|
142
142
|
|
|
143
143
|
Declared rather than emergent. Padding plus contents does clear 24px in several components today, and it is the weaker statement: it is a size nobody wrote down, so it moves when the type scale or the glyph does, and nothing says it was meant to be a target at all.
|
|
144
144
|
Guidance only — cannot be checked automatically.
|
|
145
|
+
- **A component is written along the reading axis, not along the page's left and right** — Every measure, inset and placement in this package names an axis rather than a side: inline-size and block-size, padding-inline and padding-block, inset-inline-start and inset-block-end, margin-inline: auto, text-align: start. Written that way a component follows whichever direction the page is read in, and a band whose claim ranges to the leading edge with its subject on the trailing one is the same composition in Arabic as in English, mirrored, with nothing restated. Written as left and right it is the same pixels in both, which is a layout nobody designed for the second language.
|
|
146
|
+
|
|
147
|
+
The enum values follow the same rule and for the same reason. A prop that names where a picture sits takes start and end, never left and right — FeatureSplit, FeatureBullets and FeatureScroll all declare mediaPosition that way, and the flex directions they generate flip on their own because row already means the reading order. A value called left would have to be re-read as right by every author working in a mirrored page, which is a translation this system should be doing rather than asking for.
|
|
148
|
+
|
|
149
|
+
The guidance a contract carries is part of the component, so it follows too. Describing a claim as ranging left is describing one of the two languages, and it was written that way here for a while: three of the opening bands said so in their own intent. A reader in a mirrored page meets that sentence and has to decide whether the component is wrong or the sentence is, and neither answer is one documentation should force.
|
|
150
|
+
|
|
151
|
+
Two things genuinely have no logical form and are not covered by this. A CSS gradient takes a physical direction — there is no to inline-end — so a pattern that must mirror has to be stated twice under a direction query, and one that is periodic and centred, like PageHeader's rule grid, does not need to. A glyph that points the way onward is the other: an arrow is a picture of a direction, and mirroring it belongs to the icon set rather than to the component holding it.
|
|
152
|
+
Guidance only — cannot be checked automatically.
|
|
145
153
|
|
|
146
154
|
## Anti-examples
|
|
147
155
|
|
package/.llm/digest/button.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# Button
|
|
4
4
|
|
|
5
|
-
Drives a visitor toward a conversion goal
|
|
5
|
+
Drives a visitor toward a conversion goal — a signup page, a pricing page, a demo booking — or performs the one action a section asks for, such as sending a newsletter form or opening a video. …
|
|
6
6
|
|
|
7
7
|
`import { Button } from '@deriv-com/dds-marketing'`
|
|
8
8
|
|
|
@@ -14,8 +14,8 @@ Drives a visitor toward a conversion goal by navigating them to the next step in
|
|
|
14
14
|
|
|
15
15
|
## Something else, when
|
|
16
16
|
|
|
17
|
-
- The action
|
|
18
|
-
- The words belong inside a sentence or a paragraph of body copy → **
|
|
17
|
+
- The action belongs to an application surface — a trade form, a settings panel, a confirmation that removes something → **nothing in this system does this**
|
|
18
|
+
- The words belong inside a sentence or a paragraph of body copy → **Link**
|
|
19
19
|
- The control is a glyph alone, with no words → **ButtonIcon**
|
|
20
20
|
|
|
21
21
|
## Props
|
|
@@ -31,12 +31,17 @@ Drives a visitor toward a conversion goal by navigating them to the next step in
|
|
|
31
31
|
- `lg` — A hero, or a full-width conversion band that is the only control in view. …
|
|
32
32
|
- **tone** `enum` · default "default"
|
|
33
33
|
- `default` — The page's own ground, which sets the ink this component was drawn against — every button on a white page
|
|
34
|
-
- `
|
|
35
|
-
-
|
|
36
|
-
|
|
34
|
+
- `inverse` — The control stands on the dark band, color.bg.brand-strong — a hero, a navigation bar at the top of one, a footer — which is the same near-black in light and dark. …
|
|
35
|
+
- `brand` — The control stands on the coral band, color.bg.brand — CtaBanner and CtaBannerSlider — which is the same coral in light and dark, so nothing on it switches either. …
|
|
36
|
+
- **href** `string` · optional — The press goes somewhere with a URL of its own — the ordinary case for a call to action on a marketing page. It makes this an anchor rather than a button, which is what gives a visitor cmd-click, a visible destination and a copyable link. …
|
|
37
|
+
- never: A placeholder while the destination is undecided — a # or an empty string is a control that looks live, takes focus and goes nowhere. Nor javascript: or a handler dressed as a URL: leave href out and pass onClick, and this renders a button that does the work in place
|
|
37
38
|
- **showIcon** `boolean` · default false — Where the destination continues a sequence rather than being simply somewhere else to go — the hero CTA that starts a signup, the button at the foot of a step. …
|
|
38
39
|
- never: Every button in a section. The mark says "this continues" and is worth something only while it points at the one control that does; on four at once it is decoration and the reader stops reading it
|
|
39
40
|
|
|
41
|
+
## The type refuses
|
|
42
|
+
|
|
43
|
+
- variant="primary" with tone="brand" — The primary is the coral fill, and tone="brand" says the button stands on the coral band: coral on coral is a button nobody can see. On the band the primary action is variant="inverse"
|
|
44
|
+
|
|
40
45
|
## Inside it
|
|
41
46
|
|
|
42
47
|
- Takes only text.
|
|
@@ -34,7 +34,7 @@ One press carried by a glyph alone, in the space a label would need. …
|
|
|
34
34
|
- `primary` — The one glyph-alone press a section is built around — a play control over a hero, the single action a band exists for. …
|
|
35
35
|
- `secondary` — The ordinary case for these, because they usually arrive several at a time — a footer's social row, a carousel's two directions, a bar's dismiss. …
|
|
36
36
|
- `inverse` — A section that paints its own ground — a brand-coloured band, a photo, a dark takeover. …
|
|
37
|
-
- `plain` — The control sits on a surface that has already said what it is — the exit on a sheet, a step in a set of marks — and a
|
|
37
|
+
- `plain` — The control sits on a surface that has already said what it is — the exit on a sheet, a step in a set of marks — and a tint behind it would be the loudest thing there. …
|
|
38
38
|
- never: Ranking a row of these against each other. A footer's five social links are peers; one of them drawn heavier says the other four are lesser, which is not a thing anybody meant to say. …
|
|
39
39
|
- **size** `enum` · default "md" — Matching the control to the density of the band it sits in, which on a marketing page is set by the section rather than by the control
|
|
40
40
|
- `sm` — A dense row of controls — a filter bar, a utility strip, a compact carousel. A square of size.control.sm holding a mark at icon.control.sm. …
|
|
@@ -43,7 +43,7 @@ One press carried by a glyph alone, in the space a label would need. …
|
|
|
43
43
|
- never: Making one of a set stand out. Two of these side by side at different steps read as a control and its afterthought, and a carousel whose next is larger than its previous has said the path runs one way
|
|
44
44
|
- **tone** `enum` · default "default"
|
|
45
45
|
- `default` — The control is on a light ground, which is every surface this package paints by default
|
|
46
|
-
- `inverse` — The control
|
|
46
|
+
- `inverse` — The control stands on the dark band, color.bg.brand-strong — a mark in a navigation bar on a hero, a social mark in a footer — which is the same near-black in light and dark. …
|
|
47
47
|
- **icon** `node` · required — Always — the glyph is the whole control, so it is required rather than a slot that may be empty. …
|
|
48
48
|
- never: A glyph whose meaning the visitor has to be taught, and never a second glyph — one control, one action, one shape. …
|
|
49
49
|
- **label** `string` · required — Always. It is the entire accessible name, because nothing on screen carries one — the words that would have been the label if there had been room for one. …
|
package/.llm/digest/card.md
CHANGED
|
@@ -29,6 +29,7 @@ A surface that holds content belonging together. …
|
|
|
29
29
|
|
|
30
30
|
- **variant** `enum` · default "surface"
|
|
31
31
|
- `surface` — The default, and right for a card on the page. …
|
|
32
|
+
- `surface-light` — A light card among dark ones that has to stay light in both themes — a row mixing a dark, a coral and a grey card, where the grey one flipping to dark in dark mode would make two dark cards and break the set. …
|
|
32
33
|
- `surface-raised` — The card sits on a color.bg.subtle band rather than on the page. …
|
|
33
34
|
- `plain` — An editorial card — an article, a post, a story — where the picture and the headline are what separate one card from the next. …
|
|
34
35
|
- `accent` — One card in a set is the promotional one and the page has already earned the colour. The coral is the loudest ground here, so a row of them is a row of nothing louder than the rest
|
package/.llm/digest/cardbody.md
CHANGED
|
@@ -46,6 +46,8 @@ Everything a card holds: the words inset from its edges and the picture that rea
|
|
|
46
46
|
- never: The sentence explaining the card. That is description, which sits under this at a gap close enough that the two read as one block. A title that runs to a sentence leaves the copy with nothing to add
|
|
47
47
|
- **description** `string` · optional — What the title means, usually a sentence or two. It takes the default body step, because a card's copy is copy rather than a caption. …
|
|
48
48
|
- never: A control. This body holds two regions and neither is a place to act from — a card with a call to action puts it in the Card beneath this, where it is not wearing the body's copy styling
|
|
49
|
+
- **link** `node` · optional — The card's own way on — "Learn more" — under the line, for a card in a Card rather than a CardButton: the card is read and the link is what is pressed. A standalone Link. …
|
|
50
|
+
- never: A card inside a CardButton. The whole card is already the link there, and a link inside a link is two destinations under one press — invalid HTML, and a screen reader announces both. Nor a Button: a card's way on is a destination, not an action
|
|
49
51
|
- **mark** `node` · optional — The card leads with a glyph — a badge, a shield, a small piece of art that makes the feature recognisable before the title is read. …
|
|
50
52
|
- never: A picture that should reach the card's edges. This is inset with the copy and sized to sit above a heading; a photograph put through it is a stamp in the corner of a wide margin. That is src, which renders the media region below or above this whole block rather than inside it
|
|
51
53
|
- **src** `string` · optional — The card shows a picture — a photograph, a product render, a screenshot of the thing being described. Absent is the ordinary case: most cards are words
|
|
@@ -61,7 +63,7 @@ Everything a card holds: the words inset from its edges and the picture that rea
|
|
|
61
63
|
## Inside it
|
|
62
64
|
|
|
63
65
|
- 2 components are refused inside it; the list and the reasons are in the long document.
|
|
64
|
-
- Renders
|
|
66
|
+
- Renders 10 parts: root, scrim, content, mark, eyebrow, title, description, link, media-frame, media.
|
|
65
67
|
|
|
66
68
|
---
|
|
67
69
|
|
|
@@ -28,6 +28,7 @@ A card that responds to a press. …
|
|
|
28
28
|
|
|
29
29
|
- **variant** `enum` · default "surface"
|
|
30
30
|
- `surface` — The default, and right for a pressable card on the page. The same recessed step off the white page that Card takes, so a row mixing pressable and plain cards reads as one row
|
|
31
|
+
- `surface-light` — A light card among dark ones that has to stay light in both themes — a row mixing a dark, a coral and a grey card, where the grey one flipping to dark in dark mode would make two dark cards. …
|
|
31
32
|
- `surface-raised` — The card sits on a color.bg.subtle band rather than on the page, where the recessed fill all but disappears and this one lifts off the band instead
|
|
32
33
|
- `accent` — One card in a set is the promotional one and the page has already earned the colour
|
|
33
34
|
- `accent-strong` — A card carrying more weight than its neighbours. The darkest of the four, and the one that takes white at 20.55:1 — the most legible ground a marketing card has
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<!-- GENERATED from ctabanner.contract.json. Do not edit. -->
|
|
2
|
+
|
|
3
|
+
# CtaBanner
|
|
4
|
+
|
|
5
|
+
A full-bleed coral band carrying one short promotion and the action it asks for — the strip that breaks a long page with the one thing the page wants done, or closes it. …
|
|
6
|
+
|
|
7
|
+
`import { CtaBanner } from '@deriv-com/dds-marketing'`
|
|
8
|
+
|
|
9
|
+
## Reach for it when
|
|
10
|
+
|
|
11
|
+
- A short, high-contrast promotion with one clear action — open an account, start trading, download the app
|
|
12
|
+
- The band that closes a page, or breaks a long one, on the action the page exists to produce
|
|
13
|
+
|
|
14
|
+
## Something else, when
|
|
15
|
+
|
|
16
|
+
- Two or three promotions to rotate between → **CtaBannerSlider**
|
|
17
|
+
- The band that opens the page → **LandingHero**
|
|
18
|
+
- A message that needs a picture beside it → **FeatureSplit**
|
|
19
|
+
|
|
20
|
+
## Never
|
|
21
|
+
|
|
22
|
+
- Two banners in one view — two coral strips are two demands, and the second makes the first one ordinary
|
|
23
|
+
- More than a headline, a line and two buttons
|
|
24
|
+
|
|
25
|
+
## Props
|
|
26
|
+
|
|
27
|
+
- **title** `string` · required — Always — the message, in a few words. Short enough to take in at a glance; a line break goes where the words pause, not where the box runs out
|
|
28
|
+
- never: A sentence. The description is for the sentence; the title is what a reader takes in on the way past
|
|
29
|
+
- **headingLevel** `enum` · default "h2" — Matching the outline of the page around the banner. Size does not change with it — the headline is drawn at font.h1 at either level, the scale and the level being separate decisions
|
|
30
|
+
- `h2` — The default: a banner is a section of the page, under the page's own h1
|
|
31
|
+
- `h3` — A banner nested inside a section that already carries the h2 it belongs to
|
|
32
|
+
- **description** `string` · optional — A line saying why the action is worth taking — what the reader gets, or how little it costs them
|
|
33
|
+
- never: A paragraph. A banner is read at a glance, on the way down a page; copy a reader has to work through is copy they scroll past
|
|
34
|
+
- **actions** `node` · optional — The one action the message asks for, or two at most. …
|
|
35
|
+
- never: A third action, or a primary Button: coral on the coral ground is a button nobody can see
|
|
36
|
+
|
|
37
|
+
## Inside it
|
|
38
|
+
|
|
39
|
+
- 7 components are refused inside it; the list and the reasons are in the long document.
|
|
40
|
+
- Renders 7 parts: root, inner, content, text, title, description, actions.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/ctabanner.md`.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<!-- GENERATED from ctabannerslider.contract.json. Do not edit. -->
|
|
2
|
+
|
|
3
|
+
# CtaBannerSlider
|
|
4
|
+
|
|
5
|
+
CtaBanner's layout with a slider in it: the same full-bleed coral band, rotating between two or three short promotions. …
|
|
6
|
+
|
|
7
|
+
`import { CtaBannerSlider } from '@deriv-com/dds-marketing'`
|
|
8
|
+
|
|
9
|
+
## Reach for it when
|
|
10
|
+
|
|
11
|
+
- Rotating between two or three genuinely different promotions without a hero's weight — open an account, try a tool, download the app
|
|
12
|
+
|
|
13
|
+
## Something else, when
|
|
14
|
+
|
|
15
|
+
- One promotion → **CtaBanner**
|
|
16
|
+
- The band that opens the page → **LandingHero**
|
|
17
|
+
- A message with more than a headline, a line and a button or two → **FeatureSplit**
|
|
18
|
+
|
|
19
|
+
## Never
|
|
20
|
+
|
|
21
|
+
- A single message — that is CtaBanner
|
|
22
|
+
- Messages that say the same thing twice, rotated to look like more
|
|
23
|
+
- A slider beside a CtaBanner in the same view — two coral strips are two demands
|
|
24
|
+
|
|
25
|
+
## Props
|
|
26
|
+
|
|
27
|
+
- **slides** `data` · required — Always. The messages, in the order they rotate — two or three. …
|
|
28
|
+
- never: One message — that is CtaBanner — or a set padded out to rotate. Every slide is a few seconds of a reader's attention, and one that says what another said is a few seconds taken for nothing
|
|
29
|
+
- **headingLevel** `enum` · default "h2" — Matching the outline of the page around the banner, for every slide's headline at once. Size does not change with it — every headline is drawn at font.h1, the scale and the level being separate decisions
|
|
30
|
+
- `h2` — The default: a banner is a section of the page, under the page's own h1
|
|
31
|
+
- `h3` — A banner nested inside a section that already carries the h2 it belongs to
|
|
32
|
+
- **autoplay** `boolean` · default false — Whether it advances on its own, holding each slide for motion.duration.dwell. Off by default, so a slider nobody configured stays still. …
|
|
33
|
+
- never: A banner whose slides carry more than a reader can take in during motion.duration.dwell — turn it off rather than shorten the copy to fit the timer
|
|
34
|
+
- **label** `string` · default "Promotions" — The name the banner is announced by — a region a screen reader can jump to and skip. Name what it holds, not that it is a banner: 'Promotions', 'Offers'. Translate it with the page
|
|
35
|
+
- **controlsLabel** `string` · default "Slides" — The name the dots are announced by, as a group inside the banner. Its own name rather than the banner's, so a screen reader moving into the dots hears what they are rather than 'Promotions' a second time. …
|
|
36
|
+
- **slideLabel** `string` · default "Slide" — The word each dot is announced by, before its number — 'Slide 2'. Translate it with the page, as controlsLabel is; a page that translates only the group's name still has every dot announced in English
|
|
37
|
+
|
|
38
|
+
## Inside it
|
|
39
|
+
|
|
40
|
+
- 7 components are refused inside it; the list and the reasons are in the long document.
|
|
41
|
+
- Renders 9 parts: root, inner, track, slide, text, title, description, actions, controls.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/ctabannerslider.md`.
|
|
@@ -48,7 +48,7 @@ A button that opens a short set of destinations. Pressing one goes somewhere and
|
|
|
48
48
|
- **openOnHover** `boolean` · default false — The menu is one of several things on a bar that open, and the others open on hover — a switcher beside a row of navigation sections, where a reader who has learned that the sections open under the pointer meets one control that does not and reads it as broken. …
|
|
49
49
|
- never: A menu whose rows do something on the spot rather than go somewhere. Hover is an accident as often as it is an intention, and a set opened by accident is one a reader can act on by accident
|
|
50
50
|
- **trigger** `node` · optional — A control this component should open rather than draw — one whose mark is the whole of it, with no words to read. …
|
|
51
|
-
- never: Anything that is not a button. A menu opened by a div is a menu a keyboard cannot reach, and one opened by this package's Button is a link that does not navigate — Button
|
|
51
|
+
- never: Anything that is not a button. A menu opened by a div is a menu a keyboard cannot reach, and one opened by this package's Button with an href is a link that does not navigate — Button was an anchor always when this component drew its own trigger, which is why it did. …
|
|
52
52
|
- **open** `boolean` · optional — The page holds whether the menu is open, and this component stops holding it. For the case where something outside has to shut it — a navigation bar that closes its menu when another one opens. …
|
|
53
53
|
- never: Opening it on arrival. A menu that opens itself is a panel the visitor did not ask for, over content they came to read — and the browser scrolls whatever takes focus into view, so it moves the page as well
|
|
54
54
|
- **defaultOpen** `boolean` · optional — A specimen — a documentation page, the preview's own stage — where the menu has to be on screen to be looked at. This component still holds the state afterwards
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<!-- GENERATED from faqaccordion.contract.json. Do not edit. -->
|
|
2
|
+
|
|
3
|
+
# FaqAccordion
|
|
4
|
+
|
|
5
|
+
A section of questions and answers: a heading over an Accordion, one question open at a time. …
|
|
6
|
+
|
|
7
|
+
`import { FaqAccordion } from '@deriv-com/dds-marketing'`
|
|
8
|
+
|
|
9
|
+
## Reach for it when
|
|
10
|
+
|
|
11
|
+
- The questions a reader asks before acting — fees, limits, how long a withdrawal takes — near the end of a landing page or on a help page
|
|
12
|
+
- Objections a page has to answer without making every reader read every answer
|
|
13
|
+
|
|
14
|
+
## Something else, when
|
|
15
|
+
|
|
16
|
+
- The answers are short enough to read all at once → **FeatureBullets**
|
|
17
|
+
- Each item is a feature, not a question → **FeatureCards**
|
|
18
|
+
|
|
19
|
+
## Never
|
|
20
|
+
|
|
21
|
+
- Content a reader must see — terms, risk warnings, anything the page is obliged to show. A folded answer is one most readers never open
|
|
22
|
+
- Navigation. A row that opens to a list of links is a menu wearing a question
|
|
23
|
+
|
|
24
|
+
## Props
|
|
25
|
+
|
|
26
|
+
- **ground** `enum` · default "page" — Which of the page's three grounds this section paints. A marketing page is white, and a band that wants to be seen as a band takes one of the other two — so this is how a page builds its rhythm: white, white, grey, white, dark. …
|
|
27
|
+
- `page` — The default, and the page's own white. A section that has nothing to separate itself from what is above it — most of them — and the ground a reader is already on
|
|
28
|
+
- `subtle` — A quiet step off the page, for a band that wants to read as its own section without changing the page's voice — the reference design's slate FAQ. …
|
|
29
|
+
- `strong` — `color.bg.brand-strong`, the dark band. It stops the page rather than dividing it, so it is for a section a reader should arrive at — and one per page is usually one more than enough. …
|
|
30
|
+
- never: Marking importance. Every section on a page painted a ground is a page with no emphasis left
|
|
31
|
+
- **title** `string` · required — Always. What the questions are about, in the fewest words — "Frequently asked questions", "Withdrawals"
|
|
32
|
+
- never: A question. The rows are the questions; the heading is what they share
|
|
33
|
+
|
|
34
|
+
## Inside it
|
|
35
|
+
|
|
36
|
+
- Takes only AccordionItem.
|
|
37
|
+
- At least 2, no ceiling — fewer is not this component and more is a different one.
|
|
38
|
+
- 7 components are refused inside it; the list and the reasons are in the long document.
|
|
39
|
+
- Renders 4 parts: root, inner, title, list.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/faqaccordion.md`.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<!-- GENERATED from featurebullets.contract.json. Do not edit. -->
|
|
2
|
+
|
|
3
|
+
# FeatureBullets
|
|
4
|
+
|
|
5
|
+
A section pairing a claim with a ruled list of what something includes, beside one picture. …
|
|
6
|
+
|
|
7
|
+
`import { FeatureBullets } from '@deriv-com/dds-marketing'`
|
|
8
|
+
|
|
9
|
+
## Reach for it when
|
|
10
|
+
|
|
11
|
+
- A page has to list what a product or a plan includes, and the list is the argument
|
|
12
|
+
- Several benefits are each one line long and are read by scanning rather than reading
|
|
13
|
+
- A claim needs something beside it, and a picture is the only thing there is to put there
|
|
14
|
+
|
|
15
|
+
## Something else, when
|
|
16
|
+
|
|
17
|
+
- The items are two or three words and belong on one line → **Badge**
|
|
18
|
+
- Each item needs a heading and a paragraph of its own → **Card**
|
|
19
|
+
- The section opens the page → **ProductHero**
|
|
20
|
+
|
|
21
|
+
## Never
|
|
22
|
+
|
|
23
|
+
- A comparison. Every line here is included and marked so; a list where some items are absent needs a mark for absence, which this has no way to say
|
|
24
|
+
- Running prose broken into lines. A check against a sentence claims the sentence is a feature
|
|
25
|
+
- The page's opening or closing band. This is a section in the middle of a page and carries no navigation of its own
|
|
26
|
+
|
|
27
|
+
## Props
|
|
28
|
+
|
|
29
|
+
- **ground** `enum` · default "page" — Which of the page's three grounds this section paints. A marketing page is white, and a band that wants to be seen as a band takes one of the other two — so this is how a page builds its rhythm: white, white, grey, white, dark. …
|
|
30
|
+
- `page` — The default, and the page's own white. A section that has nothing to separate itself from what is above it — most of them — and the ground a reader is already on
|
|
31
|
+
- `subtle` — A quiet step off the page, for a band that wants to read as its own section without changing the page's voice. The one to reach for first when two sections need telling apart. …
|
|
32
|
+
- `strong` — `color.bg.brand-strong`, the dark band. It stops the page rather than dividing it, so it is for a section a reader should arrive at — and one per page is usually one more than enough
|
|
33
|
+
- never: Marking importance. Every section on a page painted dark is a page with no emphasis left, and a reader stops reading the grounds as meaning anything. Alternating for its own sake is the same mistake more slowly. And never the brand's own coral, `color.bg.brand`, which is not offered here. …
|
|
34
|
+
- **mediaPosition** `enum` · default "end" — Which side the picture takes at full width. Alternating it down a page is what stops three of these in a row reading as one long column, and it is the page's decision rather than this section's — which is why it is a prop and not a rule. …
|
|
35
|
+
- `end` — The default. The list is read first, which is the order the section argues in
|
|
36
|
+
- `start` — The second of two on a page, so the two do not read as one column with a picture stuck to one side
|
|
37
|
+
- never: Moving the picture on a phone. There is one column there and the list leads it
|
|
38
|
+
- **title** `string` · required — Always. What the list is a list of, in the fewest words that say it
|
|
39
|
+
- never: A sentence. The list underneath is the argument; this only has to name it
|
|
40
|
+
- **bullets** `data` · required — Always. One line per thing included, each short enough to take in at a glance. Strings rather than nodes, because every line is marked the same way and a line free to bring its own mark is a list that stops being one
|
|
41
|
+
- never: A sentence per line, or a line that is not included in what the title names. The mark against each one is a claim the page is making
|
|
42
|
+
- **media** `node` · required — Always. The picture that sits beside the list — a screenshot, a photograph, an illustration. …
|
|
43
|
+
- never: Anything a reader has to read or press. It is held to a square and cropped to fill it, so words in it are cropped too
|
|
44
|
+
|
|
45
|
+
## Inside it
|
|
46
|
+
|
|
47
|
+
- 8 components are refused inside it; the list and the reasons are in the long document.
|
|
48
|
+
- Renders 10 parts: root, inner, split, content, title, list, item, mark, text, media.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/featurebullets.md`.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<!-- GENERATED from featurecards.contract.json. Do not edit. -->
|
|
2
|
+
|
|
3
|
+
# FeatureCards
|
|
4
|
+
|
|
5
|
+
A section that opens with a heading and sets a grid of cards under it — the shape a marketing page uses for “why choose us” and “what you get”. …
|
|
6
|
+
|
|
7
|
+
`import { FeatureCards } from '@deriv-com/dds-marketing'`
|
|
8
|
+
|
|
9
|
+
## Reach for it when
|
|
10
|
+
|
|
11
|
+
- Three or four things a product does, each a heading and a sentence, read side by side and compared at a glance
|
|
12
|
+
- A set of destinations — markets, platforms, tools — each a card a reader presses to go there
|
|
13
|
+
- One feature that deserves the whole row in a card of its own — the words beside a large picture, carded on the section's ground
|
|
14
|
+
|
|
15
|
+
## Something else, when
|
|
16
|
+
|
|
17
|
+
- Each item is one line, and the list is the argument → **FeatureBullets**
|
|
18
|
+
- One claim beside a picture, with no card around it → **FeatureSplit**
|
|
19
|
+
- The items are read in order, one leading to the next → **FeatureScroll**
|
|
20
|
+
|
|
21
|
+
## Never
|
|
22
|
+
|
|
23
|
+
- More than eight cards. Past two rows a grid stops being compared and starts being scanned, and that is a page of its own
|
|
24
|
+
- The page's opening band. This sits under the page's heading, never in place of it
|
|
25
|
+
|
|
26
|
+
## Props
|
|
27
|
+
|
|
28
|
+
- **ground** `enum` · default "page" — Which of the page's three grounds this section paints. A marketing page is white, and a band that wants to be seen as a band takes one of the other two — so this is how a page builds its rhythm: white, white, grey, white, dark. …
|
|
29
|
+
- `page` — The default, and the page's own white. A section that has nothing to separate itself from what is above it — most of them — and the ground a reader is already on
|
|
30
|
+
- `subtle` — A quiet step off the page, for a band that wants to read as its own section without changing the page's voice. The one to reach for first when two sections need telling apart. …
|
|
31
|
+
- `strong` — `color.bg.brand-strong`, the dark band. It stops the page rather than dividing it, so it is for a section a reader should arrive at — and one per page is usually one more than enough. …
|
|
32
|
+
- never: Marking importance. Every section on a page painted dark is a page with no emphasis left, and a reader stops reading the grounds as meaning anything. Alternating for its own sake is the same mistake more slowly. And never the brand's own coral, `color.bg.brand`, which is not offered here. …
|
|
33
|
+
- **title** `string` · required — Always. What the cards are, in the fewest words that name them — "Why trade with Deriv", "Markets you can trade"
|
|
34
|
+
- never: A sentence. The line under it is for the sentence
|
|
35
|
+
- **description** `string` · optional — A line saying what the set has in common, when the title alone does not
|
|
36
|
+
- never: A paragraph, or a summary of every card. The cards say what they are; this only says why they are together
|
|
37
|
+
- **link** `node` · optional — A way on to the page the whole set belongs to — "See all markets". A standalone Link, under the line
|
|
38
|
+
- never: A button. The cards are the actions here, and a Button over them would be a second, louder one
|
|
39
|
+
|
|
40
|
+
## Inside it
|
|
41
|
+
|
|
42
|
+
- Takes only Card, CardButton.
|
|
43
|
+
- At least 1, at most 8 — fewer is not this component and more is a different one.
|
|
44
|
+
- 6 components are refused inside it; the list and the reasons are in the long document.
|
|
45
|
+
- Renders 8 parts: root, inner, header, title, description, link, grid, item.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/featurecards.md`.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<!-- GENERATED from featurescroll.contract.json. Do not edit. -->
|
|
2
|
+
|
|
3
|
+
# FeatureScroll
|
|
4
|
+
|
|
5
|
+
A section that gives a set of things one screen each, with the picture pinned beside the words while a reader is on them. …
|
|
6
|
+
|
|
7
|
+
`import { FeatureScroll } from '@deriv-com/dds-marketing'`
|
|
8
|
+
|
|
9
|
+
## Reach for it when
|
|
10
|
+
|
|
11
|
+
- A page has three or more things of the same kind to explain, each with a picture worth a screen — the markets a broker offers, the platforms it runs, the steps of an account opening …
|
|
12
|
+
- The set is meant to be walked through rather than compared, and a reader is expected to scroll it
|
|
13
|
+
- The set comes from somewhere — a CMS, a registry, a filtered list — rather than being written out by hand
|
|
14
|
+
|
|
15
|
+
## Something else, when
|
|
16
|
+
|
|
17
|
+
- There are three or four items a reader is meant to compare → **FeatureCards**
|
|
18
|
+
- The set is lines rather than things — what an account includes → **FeatureBullets**
|
|
19
|
+
- There is one point to make → **FeatureSplit**
|
|
20
|
+
- The section opens the page → **LandingHero**
|
|
21
|
+
|
|
22
|
+
## Never
|
|
23
|
+
|
|
24
|
+
- Two items. A set given a screen each has to be worth the travel, and a pair is worth one screen with both on it
|
|
25
|
+
- A list of links. The stops are things with pictures and sentences; a set of destinations belongs in a navigation panel or a footer's columns
|
|
26
|
+
- Anything a reader has to act on. This is a walk through a set, and a form or a price in the middle of it is a decision asked at the point a reader is least ready to make one
|
|
27
|
+
- A set whose stops each need their own arrangement. Every stop here is the same shape by construction, which is what makes the set a set — a page wanting one stop to differ wants several FeatureSplits instead
|
|
28
|
+
|
|
29
|
+
## Props
|
|
30
|
+
|
|
31
|
+
- **ground** `enum` · default "page" — Which of the page's three grounds this section paints. A marketing page is white, and a band that wants to be seen as a band takes one of the other two — so this is how a page builds its rhythm: white, white, grey, white, dark. …
|
|
32
|
+
- `page` — The default, and the page's own white. A section that has nothing to separate itself from what is above it — most of them — and the ground a reader is already on
|
|
33
|
+
- `subtle` — A quiet step off the page, for a band that wants to read as its own section without changing the page's voice. The one to reach for first when two sections need telling apart. …
|
|
34
|
+
- `strong` — `color.bg.brand-strong`, the dark band. It stops the page rather than dividing it, so it is for a section a reader should arrive at — and one per page is usually one more than enough
|
|
35
|
+
- never: Marking importance. Every section on a page painted dark is a page with no emphasis left, and a reader stops reading the grounds as meaning anything. Alternating for its own sake is the same mistake more slowly. And never the brand's own coral, `color.bg.brand`, which is not offered here. …
|
|
36
|
+
- **mediaPosition** `enum` · default "end" — Which side the pictures pin to, for every stop at once. …
|
|
37
|
+
- `end` — The default. The words are read first, which is the order a reader’s eye takes a two-up row in
|
|
38
|
+
- `start` — The pictures lead, for a section following one that put its own the other way — two scrolls facing the same way read as one very long column
|
|
39
|
+
- never: Moving the pictures on a phone. There is one column there, and the picture sits under each name whichever side this names
|
|
40
|
+
- **title** `string` · required — Always. What the set is a set of, in the fewest words that say it — 'All your markets in one place'. It is the only thing a reader sees before committing to several screens of scrolling, so it has to say what is coming
|
|
41
|
+
- never: A claim about the first stop. The heading is over the whole set; an argument belongs in the stop it argues for
|
|
42
|
+
- **steps** `data` · required — Always. The stops, in the order a reader meets them. Three at least — the section is built on each one having a screen, and a pair is worth one screen with both on it. …
|
|
43
|
+
- never: A set assembled to fill the section. Each stop costs a reader a screen of scrolling, so a stop that is there for symmetry is a screen nobody wanted
|
|
44
|
+
|
|
45
|
+
## Inside it
|
|
46
|
+
|
|
47
|
+
- 10 components are refused inside it; the list and the reasons are in the long document.
|
|
48
|
+
- Renders 11 parts: root, inner, heading, steps, step, content, title, description, link, media, picture.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/featurescroll.md`.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<!-- GENERATED from featuresplit.contract.json. Do not edit. -->
|
|
2
|
+
|
|
3
|
+
# FeatureSplit
|
|
4
|
+
|
|
5
|
+
A section putting one claim, a line explaining it and a way onward beside a single picture. …
|
|
6
|
+
|
|
7
|
+
`import { FeatureSplit } from '@deriv-com/dds-marketing'`
|
|
8
|
+
|
|
9
|
+
## Reach for it when
|
|
10
|
+
|
|
11
|
+
- A page needs one more point about something it has already introduced, with a picture to carry it
|
|
12
|
+
- The point is a sentence rather than a list, and does not earn a set of cards
|
|
13
|
+
- A section needs a way onward that is not a call to action — a link to the page that says more
|
|
14
|
+
|
|
15
|
+
## Something else, when
|
|
16
|
+
|
|
17
|
+
- The point is several things the reader gets, each one line long → **FeatureBullets**
|
|
18
|
+
- There are three or four points and each needs its own picture → **FeatureCards**
|
|
19
|
+
- The section opens the page → **ProductHero**
|
|
20
|
+
|
|
21
|
+
## Never
|
|
22
|
+
|
|
23
|
+
- A list. Two sentences separated by a full stop is not a list, and a reader scanning for several things will miss the second — that is what FeatureBullets is for
|
|
24
|
+
- The page's opening or closing band. This is a section in the middle of a page and carries no navigation of its own
|
|
25
|
+
- A call to action. The way onward here is a link to somewhere that says more, not the thing the page wants a reader to do
|
|
26
|
+
|
|
27
|
+
## Props
|
|
28
|
+
|
|
29
|
+
- **ground** `enum` · default "page" — Which of the page's three grounds this section paints. A marketing page is white, and a band that wants to be seen as a band takes one of the other two — so this is how a page builds its rhythm: white, white, grey, white, dark. …
|
|
30
|
+
- `page` — The default, and the page's own white. A section that has nothing to separate itself from what is above it — most of them — and the ground a reader is already on
|
|
31
|
+
- `subtle` — A quiet step off the page, for a band that wants to read as its own section without changing the page's voice. The one to reach for first when two sections need telling apart. …
|
|
32
|
+
- `strong` — `color.bg.brand-strong`, the dark band. It stops the page rather than dividing it, so it is for a section a reader should arrive at — and one per page is usually one more than enough
|
|
33
|
+
- never: Marking importance. Every section on a page painted dark is a page with no emphasis left, and a reader stops reading the grounds as meaning anything. Alternating for its own sake is the same mistake more slowly. And never the brand's own coral, `color.bg.brand`, which is not offered here. …
|
|
34
|
+
- **mediaPosition** `enum` · default "end" — Which side the picture takes at full width. Alternating it down a page is what stops three of these in a row reading as one long column, and it is the page's decision rather than this section's — which is why it is a prop and not a rule. …
|
|
35
|
+
- `end` — The default. The claim is read first, which is the order the section argues in
|
|
36
|
+
- `start` — The second of two on a page, so the two do not read as one column with a picture stuck to one side
|
|
37
|
+
- never: Moving the picture on a phone. There is one column there and the words lead it
|
|
38
|
+
- **title** `string` · required — Always. The one claim the section makes, in the fewest words that say it
|
|
39
|
+
- never: A sentence. The description underneath carries the argument; this only has to name it
|
|
40
|
+
- **description** `string` · optional — The lines under the title that say what the claim above means, for a reader not convinced by the claim alone. …
|
|
41
|
+
- never: A paragraph. Past about two hundred characters the text column runs longer than the square beside it and the two halves stop lining up, which is the one thing a split has to get right. The reference design caps it at exactly that
|
|
42
|
+
- **link** `node` · optional — The section has somewhere to send a reader who wants more than it says — the page this one is a summary of. …
|
|
43
|
+
- never: The page's main call to action. This is a way onward from a supporting point, and a primary button here competes with the one the page actually wants pressed
|
|
44
|
+
- **media** `node` · required — Always. The picture that sits beside the claim — a screenshot, a photograph, an illustration. The section is a split and the picture is one half of it: without one the claim runs to a measure it was never sized for
|
|
45
|
+
- never: Anything a reader has to read or press. It is held to a square and cropped to fill it, so words in it are cropped too
|
|
46
|
+
|
|
47
|
+
## Inside it
|
|
48
|
+
|
|
49
|
+
- 9 components are refused inside it; the list and the reasons are in the long document.
|
|
50
|
+
- Renders 8 parts: root, inner, split, content, title, description, link, media.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/featuresplit.md`.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<!-- GENERATED from landinghero.contract.json. Do not edit. -->
|
|
2
|
+
|
|
3
|
+
# LandingHero
|
|
4
|
+
|
|
5
|
+
The band that opens a main landing page: the one thing the page is about, said once, at the top, over a ground dark enough that nothing above it competes. One of three opening bands, and the widest. …
|
|
6
|
+
|
|
7
|
+
`import { LandingHero } from '@deriv-com/dds-marketing'`
|
|
8
|
+
|
|
9
|
+
## Reach for it when
|
|
10
|
+
|
|
11
|
+
- A main landing page needs its opening band — the front page, or a campaign page under it
|
|
12
|
+
- The claim has room to range to the reading edge with a subject beside it, which is what the landing tier is for
|
|
13
|
+
- The steps between an eyebrow, a title, a description and the actions under them have to be the same on every landing page
|
|
14
|
+
|
|
15
|
+
## Something else, when
|
|
16
|
+
|
|
17
|
+
- The page is a product or a market page → **ProductHero**
|
|
18
|
+
- The page is a company or a legal one — contact, about, terms → **PageHeader**
|
|
19
|
+
- The band closes the page rather than opening it → **Footer**
|
|
20
|
+
|
|
21
|
+
## Never
|
|
22
|
+
|
|
23
|
+
- A product, market, company or legal page. Each tier has its own band, and the reason they are separate components is so that this cannot be overridden
|
|
24
|
+
- A second band further down the page. This is the page's opening and its `h1`; a page with two is a page that has told a reader twice what it is about
|
|
25
|
+
- The navigation above it or the trail beneath that. The bar is a fixed layer the page mounts once and every band scrolls under; the breadcrumb is the page saying where it sits. Both are the page's and neither is the band's
|
|
26
|
+
|
|
27
|
+
## Props
|
|
28
|
+
|
|
29
|
+
- **eyebrow** `string` · optional — A word or two placing the page before its title names it — a product family, a market, a campaign
|
|
30
|
+
- never: A second sentence. This is the line a reader takes in without reading; at the length of a clause it is a description in the wrong place and at the wrong weight
|
|
31
|
+
- **title** `string` · required — Always. The one thing the page is about, in the fewest words that still say it. It is the page's leading heading and the band's accessible name
|
|
32
|
+
- never: A sentence with a full stop. A title that reads as prose is a description that has been set at eighty pixels
|
|
33
|
+
- **headingLevel** `enum` · default "h1" — Which heading element the title renders as. The default is right for the band a page opens with, which is the only place this belongs. …
|
|
34
|
+
- `h1` — The default, and correct whenever the hero opens the page — which is what a hero is for
|
|
35
|
+
- `h2` — The rare page that already carries its `h1` elsewhere, and would otherwise have two
|
|
36
|
+
- never: Making the title look smaller. The level is what a screen reader builds its outline from, and nothing about it reaches the type
|
|
37
|
+
- **description** `string` · optional — The sentence under the title that says what the claim above it means, for the reader who is not yet convinced by the claim alone
|
|
38
|
+
- never: A paragraph. It is held to a readable measure and set at body size; past a couple of sentences a reader scrolls rather than reads, and the actions go under the fold
|
|
39
|
+
- **actions** `node` · optional — The one or two things the page wants a reader to do. Composed by the page rather than described to this component, so a call to action is the same Button here as anywhere else on the site
|
|
40
|
+
- never: A row of destinations. Three or more controls under a title is a menu, and a reader who has to choose between five things chooses none
|
|
41
|
+
- **media** `node` · optional — The band's visual — the subject standing beside the claim, cropped by the band's own inline edge rather than floating clear of it
|
|
42
|
+
- never: The background. A photograph filling the band is `backgroundImage`; this sits in front of it and is placed against the band's edge
|
|
43
|
+
- **backgroundImage** `string` · optional — A photograph filling the whole band. It is shown as it is — nothing is painted over it, so choose one already dark enough that the title reads on it
|
|
44
|
+
- never: A flat colour, or a bright photograph. The band already paints its ground, and nothing here darkens an image on the page's behalf — a pale one leaves the claim unreadable
|
|
45
|
+
|
|
46
|
+
## Inside it
|
|
47
|
+
|
|
48
|
+
- 7 components are refused inside it; the list and the reasons are in the long document.
|
|
49
|
+
- Renders 9 parts: root, inner, content, text, eyebrow, title, description, actions, media.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
The reasoning behind each of these, the parts this renders, its states and snippets that compile: `.llm/components/landinghero.md`.
|