@deriv-com/dds-marketing 0.1.0 → 0.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 +193 -0
- package/.llm/components/accordionitem.md +236 -0
- package/.llm/components/aspectratio.md +212 -0
- package/.llm/components/badge.md +231 -0
- package/.llm/components/bottomsheet.md +404 -0
- package/.llm/components/breadcrumb.md +197 -0
- package/.llm/components/breadcrumbitem.md +178 -0
- package/.llm/components/button.md +271 -0
- package/.llm/components/buttonicon.md +313 -0
- package/.llm/components/card.md +313 -0
- package/.llm/components/cardbody.md +409 -0
- package/.llm/components/cardbutton.md +259 -0
- package/.llm/components/checkbox.md +285 -0
- package/.llm/components/divider.md +230 -0
- package/.llm/components/dropdownmenu.md +453 -0
- package/.llm/components/filterchip.md +314 -0
- package/.llm/components/footer.md +408 -0
- package/.llm/components/footergroup.md +241 -0
- package/.llm/components/grid.md +659 -0
- package/.llm/components/icon.md +194 -0
- package/.llm/components/link.md +354 -0
- package/.llm/components/menuitem.md +218 -0
- package/.llm/components/navbar.md +458 -0
- package/.llm/components/navbaritem.md +238 -0
- package/.llm/components/navbarmenu.md +319 -0
- package/.llm/components/navbarmenugroup.md +184 -0
- package/.llm/components/navbarpanel.md +255 -0
- package/.llm/components/navbarswitcher.md +343 -0
- package/.llm/components/navbarswitcheroption.md +156 -0
- package/.llm/components/option.md +268 -0
- package/.llm/components/pagination.md +361 -0
- package/.llm/components/removablechip.md +247 -0
- package/.llm/components/row.md +381 -0
- package/.llm/components/scroller.md +470 -0
- package/.llm/components/searchinput.md +279 -0
- package/.llm/components/segmentedcontrol.md +358 -0
- package/.llm/components/segmentedcontrolitem.md +272 -0
- package/.llm/components/select.md +509 -0
- package/.llm/components/selectchip.md +334 -0
- package/.llm/components/spinner.md +222 -0
- package/.llm/components/stack.md +334 -0
- package/.llm/components/statusdot.md +205 -0
- package/.llm/components/subdomainnavbar.md +327 -0
- package/.llm/components/tab.md +291 -0
- package/.llm/components/table.md +660 -0
- package/.llm/components/tablebody.md +258 -0
- package/.llm/components/tablecell.md +248 -0
- package/.llm/components/tablehead.md +248 -0
- package/.llm/components/tableheadercell.md +298 -0
- package/.llm/components/tablerow.md +285 -0
- package/.llm/components/tablist.md +210 -0
- package/.llm/components/textarea.md +362 -0
- package/.llm/components/textinput.md +467 -0
- package/.llm/components/tooltip.md +267 -0
- package/.llm/components/typography.md +245 -0
- package/.llm/digest/accordion.md +43 -0
- package/.llm/digest/accordionitem.md +47 -0
- package/.llm/digest/aspectratio.md +47 -0
- package/.llm/digest/badge.md +45 -0
- package/.llm/digest/bottomsheet.md +69 -0
- package/.llm/digest/breadcrumb.md +38 -0
- package/.llm/digest/breadcrumbitem.md +43 -0
- package/.llm/digest/button.md +48 -0
- package/.llm/digest/buttonicon.md +61 -0
- package/.llm/digest/card.md +50 -0
- package/.llm/digest/cardbody.md +68 -0
- package/.llm/digest/cardbutton.md +49 -0
- package/.llm/digest/checkbox.md +63 -0
- package/.llm/digest/divider.md +52 -0
- package/.llm/digest/dropdownmenu.md +67 -0
- package/.llm/digest/filterchip.md +68 -0
- package/.llm/digest/footer.md +57 -0
- package/.llm/digest/footergroup.md +42 -0
- package/.llm/digest/grid.md +62 -0
- package/.llm/digest/icon.md +45 -0
- package/.llm/digest/link.md +59 -0
- package/.llm/digest/menuitem.md +46 -0
- package/.llm/digest/navbar.md +60 -0
- package/.llm/digest/navbaritem.md +54 -0
- package/.llm/digest/navbarmenu.md +54 -0
- package/.llm/digest/navbarmenugroup.md +40 -0
- package/.llm/digest/navbarpanel.md +53 -0
- package/.llm/digest/navbarswitcher.md +51 -0
- package/.llm/digest/navbarswitcheroption.md +37 -0
- package/.llm/digest/option.md +54 -0
- package/.llm/digest/pagination.md +71 -0
- package/.llm/digest/removablechip.md +51 -0
- package/.llm/digest/row.md +60 -0
- package/.llm/digest/scroller.md +59 -0
- package/.llm/digest/searchinput.md +56 -0
- package/.llm/digest/segmentedcontrol.md +59 -0
- package/.llm/digest/segmentedcontrolitem.md +59 -0
- package/.llm/digest/select.md +92 -0
- package/.llm/digest/selectchip.md +68 -0
- package/.llm/digest/spinner.md +52 -0
- package/.llm/digest/stack.md +56 -0
- package/.llm/digest/statusdot.md +46 -0
- package/.llm/digest/subdomainnavbar.md +54 -0
- package/.llm/digest/tab.md +60 -0
- package/.llm/digest/table.md +71 -0
- package/.llm/digest/tablebody.md +49 -0
- package/.llm/digest/tablecell.md +55 -0
- package/.llm/digest/tablehead.md +50 -0
- package/.llm/digest/tableheadercell.md +65 -0
- package/.llm/digest/tablerow.md +56 -0
- package/.llm/digest/tablist.md +46 -0
- package/.llm/digest/textarea.md +78 -0
- package/.llm/digest/textinput.md +95 -0
- package/.llm/digest/tooltip.md +58 -0
- package/.llm/digest/typography.md +59 -0
- package/.llm/index.md +86 -0
- package/.llm/rules.md +122 -0
- package/.llm/tokens.md +341 -0
- package/AGENTS.md +164 -0
- package/LICENSE +21 -0
- package/README.md +63 -15
- package/dist/components/core/accordion/Accordion.css +10 -0
- package/dist/components/core/accordion/Accordion.d.ts +20 -0
- package/dist/components/core/accordion/Accordion.js +69 -0
- package/dist/components/core/accordion/Accordion.types.d.ts +20 -0
- package/dist/components/core/accordion/Accordion.types.js +7 -0
- package/dist/components/core/accordion-item/AccordionItem.css +98 -0
- package/dist/components/core/accordion-item/AccordionItem.d.ts +44 -0
- package/dist/components/core/accordion-item/AccordionItem.js +63 -0
- package/dist/components/core/accordion-item/AccordionItem.types.d.ts +32 -0
- package/dist/components/core/accordion-item/AccordionItem.types.js +13 -0
- package/dist/components/core/accordion-item/accordion-item-impl.css +107 -0
- package/dist/components/core/badge/Badge.css +37 -0
- package/dist/components/core/badge/Badge.d.ts +37 -0
- package/dist/components/core/badge/Badge.js +40 -0
- package/dist/components/core/badge/Badge.types.d.ts +24 -0
- package/dist/components/core/badge/Badge.types.js +8 -0
- package/dist/components/core/badge/badge-impl.css +32 -0
- package/dist/components/core/bottom-sheet/BottomSheet.css +178 -0
- package/dist/components/core/bottom-sheet/BottomSheet.d.ts +22 -0
- package/dist/components/core/bottom-sheet/BottomSheet.js +359 -0
- package/dist/components/core/bottom-sheet/BottomSheet.types.d.ts +67 -0
- package/dist/components/core/bottom-sheet/BottomSheet.types.js +18 -0
- package/dist/components/core/bottom-sheet/bottom-sheet-impl.css +57 -0
- package/dist/components/core/breadcrumb/Breadcrumb.css +19 -0
- package/dist/components/core/breadcrumb/Breadcrumb.d.ts +16 -0
- package/dist/components/core/breadcrumb/Breadcrumb.js +22 -0
- package/dist/components/core/breadcrumb/Breadcrumb.types.d.ts +18 -0
- package/dist/components/core/breadcrumb/Breadcrumb.types.js +9 -0
- package/dist/components/core/breadcrumb-item/BreadcrumbItem.css +34 -0
- package/dist/components/core/breadcrumb-item/BreadcrumbItem.d.ts +12 -0
- package/dist/components/core/breadcrumb-item/BreadcrumbItem.js +15 -0
- package/dist/components/core/breadcrumb-item/BreadcrumbItem.types.d.ts +22 -0
- package/dist/components/core/breadcrumb-item/BreadcrumbItem.types.js +9 -0
- package/dist/components/core/button/Button.css +141 -0
- package/dist/components/core/button/Button.d.ts +25 -0
- package/dist/components/core/button/Button.js +28 -0
- package/dist/components/core/button/Button.types.d.ts +40 -0
- package/dist/components/core/button/Button.types.js +9 -0
- package/dist/components/core/button/button-impl.css +46 -0
- package/dist/components/core/button-icon/ButtonIcon.css +135 -0
- package/dist/components/core/button-icon/ButtonIcon.d.ts +34 -0
- package/dist/components/core/button-icon/ButtonIcon.js +117 -0
- package/dist/components/core/button-icon/ButtonIcon.types.d.ts +41 -0
- package/dist/components/core/button-icon/ButtonIcon.types.js +8 -0
- package/dist/components/core/card/Card.css +65 -0
- package/dist/components/core/card/Card.d.ts +24 -0
- package/dist/components/core/card/Card.js +26 -0
- package/dist/components/core/card/Card.types.d.ts +33 -0
- package/dist/components/core/card/Card.types.js +7 -0
- package/dist/components/core/card-body/CardBody.css +139 -0
- package/dist/components/core/card-body/CardBody.d.ts +62 -0
- package/dist/components/core/card-body/CardBody.js +97 -0
- package/dist/components/core/card-body/CardBody.types.d.ts +61 -0
- package/dist/components/core/card-body/CardBody.types.js +15 -0
- package/dist/components/core/card-body/card-body-impl.css +87 -0
- package/dist/components/core/card-button/CardButton.css +73 -0
- package/dist/components/core/card-button/CardButton.d.ts +27 -0
- package/dist/components/core/card-button/CardButton.js +37 -0
- package/dist/components/core/card-button/CardButton.types.d.ts +24 -0
- package/dist/components/core/card-button/CardButton.types.js +7 -0
- package/dist/components/core/card-button/card-button-impl.css +39 -0
- package/dist/components/core/checkbox/Checkbox.css +149 -0
- package/dist/components/core/checkbox/Checkbox.d.ts +21 -0
- package/dist/components/core/checkbox/Checkbox.js +97 -0
- package/dist/components/core/checkbox/Checkbox.types.d.ts +46 -0
- package/dist/components/core/checkbox/Checkbox.types.js +15 -0
- package/dist/components/core/checkbox/checkbox-impl.css +90 -0
- package/dist/components/core/divider/Divider.css +41 -0
- package/dist/components/core/divider/Divider.d.ts +46 -0
- package/dist/components/core/divider/Divider.js +51 -0
- package/dist/components/core/divider/Divider.types.d.ts +25 -0
- package/dist/components/core/divider/Divider.types.js +9 -0
- package/dist/components/core/dropdown-menu/DropdownMenu.css +146 -0
- package/dist/components/core/dropdown-menu/DropdownMenu.d.ts +22 -0
- package/dist/components/core/dropdown-menu/DropdownMenu.js +309 -0
- package/dist/components/core/dropdown-menu/DropdownMenu.types.d.ts +62 -0
- package/dist/components/core/dropdown-menu/DropdownMenu.types.js +12 -0
- package/dist/components/core/dropdown-menu/dropdown-menu-impl.css +70 -0
- package/dist/components/core/filter-chip/FilterChip.css +149 -0
- package/dist/components/core/filter-chip/FilterChip.d.ts +23 -0
- package/dist/components/core/filter-chip/FilterChip.js +37 -0
- package/dist/components/core/filter-chip/FilterChip.types.d.ts +53 -0
- package/dist/components/core/filter-chip/FilterChip.types.js +12 -0
- package/dist/components/core/footer/Footer.css +104 -0
- package/dist/components/core/footer/Footer.d.ts +43 -0
- package/dist/components/core/footer/Footer.js +53 -0
- package/dist/components/core/footer/Footer.types.d.ts +47 -0
- package/dist/components/core/footer/Footer.types.js +18 -0
- package/dist/components/core/footer/footer-impl.css +218 -0
- package/dist/components/core/footer-group/FooterGroup.css +90 -0
- package/dist/components/core/footer-group/FooterGroup.d.ts +32 -0
- package/dist/components/core/footer-group/FooterGroup.js +64 -0
- package/dist/components/core/footer-group/FooterGroup.types.d.ts +25 -0
- package/dist/components/core/footer-group/FooterGroup.types.js +12 -0
- package/dist/components/core/footer-group/footer-group-impl.css +78 -0
- package/dist/components/core/icon/Icon.css +40 -0
- package/dist/components/core/icon/Icon.d.ts +23 -0
- package/dist/components/core/icon/Icon.js +79 -0
- package/dist/components/core/icon/Icon.types.d.ts +24 -0
- package/dist/components/core/icon/Icon.types.js +7 -0
- package/dist/components/core/link/Link.css +89 -0
- package/dist/components/core/link/Link.d.ts +37 -0
- package/dist/components/core/link/Link.js +141 -0
- package/dist/components/core/link/Link.types.d.ts +41 -0
- package/dist/components/core/link/Link.types.js +9 -0
- package/dist/components/core/link/link-impl.css +168 -0
- package/dist/components/core/menu-item/MenuItem.css +70 -0
- package/dist/components/core/menu-item/MenuItem.d.ts +11 -0
- package/dist/components/core/menu-item/MenuItem.js +26 -0
- package/dist/components/core/menu-item/MenuItem.types.d.ts +28 -0
- package/dist/components/core/menu-item/MenuItem.types.js +9 -0
- package/dist/components/core/navbar/Navbar.css +135 -0
- package/dist/components/core/navbar/Navbar.d.ts +36 -0
- package/dist/components/core/navbar/Navbar.js +371 -0
- package/dist/components/core/navbar/Navbar.types.d.ts +49 -0
- package/dist/components/core/navbar/Navbar.types.js +17 -0
- package/dist/components/core/navbar/navbar-impl.css +590 -0
- package/dist/components/core/navbar-item/NavbarItem.css +75 -0
- package/dist/components/core/navbar-item/NavbarItem.d.ts +22 -0
- package/dist/components/core/navbar-item/NavbarItem.js +40 -0
- package/dist/components/core/navbar-item/NavbarItem.types.d.ts +34 -0
- package/dist/components/core/navbar-item/NavbarItem.types.js +10 -0
- package/dist/components/core/navbar-menu/NavbarMenu.css +128 -0
- package/dist/components/core/navbar-menu/NavbarMenu.d.ts +5 -0
- package/dist/components/core/navbar-menu/NavbarMenu.js +186 -0
- package/dist/components/core/navbar-menu/NavbarMenu.types.d.ts +45 -0
- package/dist/components/core/navbar-menu/NavbarMenu.types.js +12 -0
- package/dist/components/core/navbar-menu/navbar-menu-impl.css +186 -0
- package/dist/components/core/navbar-menu-group/NavbarMenuGroup.css +26 -0
- package/dist/components/core/navbar-menu-group/NavbarMenuGroup.d.ts +17 -0
- package/dist/components/core/navbar-menu-group/NavbarMenuGroup.js +22 -0
- package/dist/components/core/navbar-menu-group/NavbarMenuGroup.types.d.ts +14 -0
- package/dist/components/core/navbar-menu-group/NavbarMenuGroup.types.js +7 -0
- package/dist/components/core/navbar-panel/NavbarPanel.css +87 -0
- package/dist/components/core/navbar-panel/NavbarPanel.d.ts +34 -0
- package/dist/components/core/navbar-panel/NavbarPanel.js +46 -0
- package/dist/components/core/navbar-panel/NavbarPanel.types.d.ts +29 -0
- package/dist/components/core/navbar-panel/NavbarPanel.types.js +12 -0
- package/dist/components/core/navbar-panel/navbar-panel-impl.css +104 -0
- package/dist/components/core/navbar-panel/use-navbar-panel.d.ts +26 -0
- package/dist/components/core/navbar-panel/use-navbar-panel.js +135 -0
- package/dist/components/core/navbar-switcher/NavbarSwitcher.css +117 -0
- package/dist/components/core/navbar-switcher/NavbarSwitcher.d.ts +20 -0
- package/dist/components/core/navbar-switcher/NavbarSwitcher.js +90 -0
- package/dist/components/core/navbar-switcher/NavbarSwitcher.types.d.ts +46 -0
- package/dist/components/core/navbar-switcher/NavbarSwitcher.types.js +13 -0
- package/dist/components/core/navbar-switcher/navbar-switcher-impl.css +179 -0
- package/dist/components/core/navbar-switcher-option/NavbarSwitcherOption.css +39 -0
- package/dist/components/core/navbar-switcher-option/NavbarSwitcherOption.d.ts +16 -0
- package/dist/components/core/navbar-switcher-option/NavbarSwitcherOption.js +19 -0
- package/dist/components/core/navbar-switcher-option/NavbarSwitcherOption.types.d.ts +18 -0
- package/dist/components/core/navbar-switcher-option/NavbarSwitcherOption.types.js +7 -0
- package/dist/components/core/option/Option.css +133 -0
- package/dist/components/core/option/Option.d.ts +25 -0
- package/dist/components/core/option/Option.js +31 -0
- package/dist/components/core/option/Option.types.d.ts +44 -0
- package/dist/components/core/option/Option.types.js +14 -0
- package/dist/components/core/pagination/Pagination.css +237 -0
- package/dist/components/core/pagination/Pagination.d.ts +30 -0
- package/dist/components/core/pagination/Pagination.js +406 -0
- package/dist/components/core/pagination/Pagination.types.d.ts +59 -0
- package/dist/components/core/pagination/Pagination.types.js +14 -0
- package/dist/components/core/pagination/pagination-impl.css +17 -0
- package/dist/components/core/removable-chip/RemovableChip.css +125 -0
- package/dist/components/core/removable-chip/RemovableChip.d.ts +25 -0
- package/dist/components/core/removable-chip/RemovableChip.js +36 -0
- package/dist/components/core/removable-chip/RemovableChip.types.d.ts +38 -0
- package/dist/components/core/removable-chip/RemovableChip.types.js +13 -0
- package/dist/components/core/search-input/SearchInput.css +205 -0
- package/dist/components/core/search-input/SearchInput.d.ts +5 -0
- package/dist/components/core/search-input/SearchInput.js +81 -0
- package/dist/components/core/search-input/SearchInput.types.d.ts +43 -0
- package/dist/components/core/search-input/SearchInput.types.js +13 -0
- package/dist/components/core/search-input/search-input-impl.css +20 -0
- package/dist/components/core/segmented-control/SegmentedControl.css +57 -0
- package/dist/components/core/segmented-control/SegmentedControl.d.ts +37 -0
- package/dist/components/core/segmented-control/SegmentedControl.js +269 -0
- package/dist/components/core/segmented-control/SegmentedControl.types.d.ts +38 -0
- package/dist/components/core/segmented-control/SegmentedControl.types.js +8 -0
- package/dist/components/core/segmented-control/segmented-control-impl.css +57 -0
- package/dist/components/core/segmented-control-item/SegmentedControlItem.css +151 -0
- package/dist/components/core/segmented-control-item/SegmentedControlItem.d.ts +50 -0
- package/dist/components/core/segmented-control-item/SegmentedControlItem.js +101 -0
- package/dist/components/core/segmented-control-item/SegmentedControlItem.types.d.ts +37 -0
- package/dist/components/core/segmented-control-item/SegmentedControlItem.types.js +10 -0
- package/dist/components/core/segmented-control-item/segmented-control-item-impl.css +69 -0
- package/dist/components/core/select/Select.css +400 -0
- package/dist/components/core/select/Select.d.ts +29 -0
- package/dist/components/core/select/Select.js +524 -0
- package/dist/components/core/select/Select.types.d.ts +96 -0
- package/dist/components/core/select/Select.types.js +26 -0
- package/dist/components/core/select/select-impl.css +114 -0
- package/dist/components/core/select-chip/SelectChip.css +155 -0
- package/dist/components/core/select-chip/SelectChip.d.ts +20 -0
- package/dist/components/core/select-chip/SelectChip.js +273 -0
- package/dist/components/core/select-chip/SelectChip.types.d.ts +56 -0
- package/dist/components/core/select-chip/SelectChip.types.js +14 -0
- package/dist/components/core/select-chip/select-chip-impl.css +38 -0
- package/dist/components/core/spinner/Spinner.css +76 -0
- package/dist/components/core/spinner/Spinner.d.ts +5 -0
- package/dist/components/core/spinner/Spinner.js +29 -0
- package/dist/components/core/spinner/Spinner.types.d.ts +37 -0
- package/dist/components/core/spinner/Spinner.types.js +10 -0
- package/dist/components/core/spinner/spinner-impl.css +27 -0
- package/dist/components/core/status-dot/StatusDot.css +43 -0
- package/dist/components/core/status-dot/StatusDot.d.ts +35 -0
- package/dist/components/core/status-dot/StatusDot.js +46 -0
- package/dist/components/core/status-dot/StatusDot.types.d.ts +29 -0
- package/dist/components/core/status-dot/StatusDot.types.js +7 -0
- package/dist/components/core/status-dot/status-dot-impl.css +42 -0
- package/dist/components/core/subdomain-navbar/SubdomainNavbar.css +89 -0
- package/dist/components/core/subdomain-navbar/SubdomainNavbar.d.ts +21 -0
- package/dist/components/core/subdomain-navbar/SubdomainNavbar.js +127 -0
- package/dist/components/core/subdomain-navbar/SubdomainNavbar.types.d.ts +43 -0
- package/dist/components/core/subdomain-navbar/SubdomainNavbar.types.js +13 -0
- package/dist/components/core/subdomain-navbar/subdomain-navbar-impl.css +147 -0
- package/dist/components/core/tab/Tab.css +113 -0
- package/dist/components/core/tab/Tab.d.ts +36 -0
- package/dist/components/core/tab/Tab.js +53 -0
- package/dist/components/core/tab/Tab.types.d.ts +42 -0
- package/dist/components/core/tab/Tab.types.js +13 -0
- package/dist/components/core/tab/tab-impl.css +49 -0
- package/dist/components/core/tab-list/TabList.css +40 -0
- package/dist/components/core/tab-list/TabList.d.ts +26 -0
- package/dist/components/core/tab-list/TabList.js +124 -0
- package/dist/components/core/tab-list/TabList.types.d.ts +20 -0
- package/dist/components/core/tab-list/TabList.types.js +7 -0
- package/dist/components/core/tab-list/tab-list-impl.css +56 -0
- package/dist/components/core/table/Table.css +40 -0
- package/dist/components/core/table/Table.d.ts +19 -0
- package/dist/components/core/table/Table.js +55 -0
- package/dist/components/core/table/Table.types.d.ts +59 -0
- package/dist/components/core/table/Table.types.js +9 -0
- package/dist/components/core/table/table-impl.css +75 -0
- package/dist/components/core/table/use-table-sort.d.ts +43 -0
- package/dist/components/core/table/use-table-sort.js +51 -0
- package/dist/components/core/table-body/TableBody.css +6 -0
- package/dist/components/core/table-body/TableBody.d.ts +12 -0
- package/dist/components/core/table-body/TableBody.js +26 -0
- package/dist/components/core/table-body/TableBody.types.d.ts +36 -0
- package/dist/components/core/table-body/TableBody.types.js +7 -0
- package/dist/components/core/table-cell/TableCell.css +76 -0
- package/dist/components/core/table-cell/TableCell.d.ts +21 -0
- package/dist/components/core/table-cell/TableCell.js +31 -0
- package/dist/components/core/table-cell/TableCell.types.d.ts +43 -0
- package/dist/components/core/table-cell/TableCell.types.js +7 -0
- package/dist/components/core/table-head/TableHead.css +6 -0
- package/dist/components/core/table-head/TableHead.d.ts +22 -0
- package/dist/components/core/table-head/TableHead.js +52 -0
- package/dist/components/core/table-head/TableHead.types.d.ts +39 -0
- package/dist/components/core/table-head/TableHead.types.js +7 -0
- package/dist/components/core/table-head/table-head-impl.css +51 -0
- package/dist/components/core/table-header-cell/TableHeaderCell.css +126 -0
- package/dist/components/core/table-header-cell/TableHeaderCell.d.ts +21 -0
- package/dist/components/core/table-header-cell/TableHeaderCell.js +34 -0
- package/dist/components/core/table-header-cell/TableHeaderCell.types.d.ts +56 -0
- package/dist/components/core/table-header-cell/TableHeaderCell.types.js +9 -0
- package/dist/components/core/table-header-cell/table-header-cell-impl.css +74 -0
- package/dist/components/core/table-row/TableRow.css +18 -0
- package/dist/components/core/table-row/TableRow.d.ts +17 -0
- package/dist/components/core/table-row/TableRow.js +32 -0
- package/dist/components/core/table-row/TableRow.types.d.ts +45 -0
- package/dist/components/core/table-row/TableRow.types.js +7 -0
- package/dist/components/core/table-row/table-row-impl.css +31 -0
- package/dist/components/core/text-area/TextArea.css +325 -0
- package/dist/components/core/text-area/TextArea.d.ts +13 -0
- package/dist/components/core/text-area/TextArea.js +133 -0
- package/dist/components/core/text-area/TextArea.types.d.ts +67 -0
- package/dist/components/core/text-area/TextArea.types.js +19 -0
- package/dist/components/core/text-area/text-area-impl.css +36 -0
- package/dist/components/core/text-input/TextInput.css +400 -0
- package/dist/components/core/text-input/TextInput.d.ts +5 -0
- package/dist/components/core/text-input/TextInput.js +130 -0
- package/dist/components/core/text-input/TextInput.types.d.ts +96 -0
- package/dist/components/core/text-input/TextInput.types.js +24 -0
- package/dist/components/core/text-input/text-input-impl.css +36 -0
- package/dist/components/core/tooltip/Tooltip.css +101 -0
- package/dist/components/core/tooltip/Tooltip.d.ts +51 -0
- package/dist/components/core/tooltip/Tooltip.js +87 -0
- package/dist/components/core/tooltip/Tooltip.types.d.ts +38 -0
- package/dist/components/core/tooltip/Tooltip.types.js +9 -0
- package/dist/components/core/tooltip/TooltipAnchor.d.ts +52 -0
- package/dist/components/core/tooltip/TooltipAnchor.js +69 -0
- package/dist/components/core/tooltip/tooltip-anchor.css +145 -0
- package/dist/components/core/tooltip/tooltip-impl.css +54 -0
- package/dist/components/core/tooltip/use-tooltip.d.ts +111 -0
- package/dist/components/core/tooltip/use-tooltip.js +189 -0
- package/dist/components/core/typography/Typography.css +96 -0
- package/dist/components/core/typography/Typography.d.ts +297 -0
- package/dist/components/core/typography/Typography.js +28 -0
- package/dist/components/core/typography/Typography.types.d.ts +40 -0
- package/dist/components/core/typography/Typography.types.js +7 -0
- package/dist/components/css-time.d.ts +20 -0
- package/dist/components/css-time.js +30 -0
- package/dist/components/given.d.ts +7 -0
- package/dist/components/given.js +9 -0
- package/dist/components/hover-open.d.ts +34 -0
- package/dist/components/hover-open.js +90 -0
- package/dist/components/index.d.ts +114 -1
- package/dist/components/index.js +115 -2
- package/dist/components/layout/aspect-ratio/AspectRatio.css +29 -0
- package/dist/components/layout/aspect-ratio/AspectRatio.d.ts +24 -0
- package/dist/components/layout/aspect-ratio/AspectRatio.js +26 -0
- package/dist/components/layout/aspect-ratio/AspectRatio.types.d.ts +22 -0
- package/dist/components/layout/aspect-ratio/AspectRatio.types.js +7 -0
- package/dist/components/layout/aspect-ratio/aspect-ratio-impl.css +44 -0
- package/dist/components/layout/grid/Grid.css +76 -0
- package/dist/components/layout/grid/Grid.d.ts +31 -0
- package/dist/components/layout/grid/Grid.js +33 -0
- package/dist/components/layout/grid/Grid.types.d.ts +48 -0
- package/dist/components/layout/grid/Grid.types.js +7 -0
- package/dist/components/layout/grid/grid-impl.css +62 -0
- package/dist/components/layout/row/Row.css +85 -0
- package/dist/components/layout/row/Row.d.ts +32 -0
- package/dist/components/layout/row/Row.js +34 -0
- package/dist/components/layout/row/Row.types.d.ts +45 -0
- package/dist/components/layout/row/Row.types.js +7 -0
- package/dist/components/layout/scroller/Scroller.css +59 -0
- package/dist/components/layout/scroller/Scroller.d.ts +34 -0
- package/dist/components/layout/scroller/Scroller.js +36 -0
- package/dist/components/layout/scroller/Scroller.types.d.ts +38 -0
- package/dist/components/layout/scroller/Scroller.types.js +7 -0
- package/dist/components/layout/scroller/scroller-impl.css +45 -0
- package/dist/components/layout/stack/Stack.css +73 -0
- package/dist/components/layout/stack/Stack.d.ts +28 -0
- package/dist/components/layout/stack/Stack.js +30 -0
- package/dist/components/layout/stack/Stack.types.d.ts +41 -0
- package/dist/components/layout/stack/Stack.types.js +7 -0
- package/dist/components/visually-hidden.d.ts +22 -0
- package/dist/components/visually-hidden.js +31 -0
- package/dist/fonts/LICENSE-inter.txt +93 -0
- package/dist/fonts/LICENSE-red-hat-mono.txt +93 -0
- package/dist/fonts/fonts.css +111 -0
- package/dist/fonts/inter-cyrillic-ext-wght-normal.woff2 +0 -0
- package/dist/fonts/inter-cyrillic-wght-normal.woff2 +0 -0
- package/dist/fonts/inter-greek-ext-wght-normal.woff2 +0 -0
- package/dist/fonts/inter-greek-wght-normal.woff2 +0 -0
- package/dist/fonts/inter-latin-ext-wght-normal.woff2 +0 -0
- package/dist/fonts/inter-latin-wght-normal.woff2 +0 -0
- package/dist/fonts/inter-vietnamese-wght-normal.woff2 +0 -0
- package/dist/fonts/red-hat-mono-latin-ext-wght-normal.woff2 +0 -0
- package/dist/fonts/red-hat-mono-latin-wght-normal.woff2 +0 -0
- package/dist/marketing.css +289 -241
- package/package.json +18 -4
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
<!-- GENERATED from footer.contract.json. Do not edit. -->
|
|
2
|
+
|
|
3
|
+
# Footer
|
|
4
|
+
|
|
5
|
+
The band that closes a marketing page, and the sections every one of them is made of: whose site this is, where else it goes, what the law obliges it to say, and the line that closes it.
|
|
6
|
+
|
|
7
|
+
It holds no destinations and no wording of its own. What goes in it is what the page composes — the links, the groups they fall into, the disclaimer's paragraphs — because the foot of a marketing site is written by the site, and a component that took an array of links would be a second router to keep in step with the first. What this owns is the band: the ground it paints, the measure it holds its content to, the order its sections come in, and the space between them.
|
|
8
|
+
|
|
9
|
+
The sections are the whole of it. A footer drawn by hand is a stack of divs whose gaps were chosen one at a time, and two pages built that way stop agreeing the first time one of them is tuned. Here each region is a declared part with a role token behind every gap, so a page fills the sections and the spacing is not its decision to make.
|
|
10
|
+
|
|
11
|
+
It paints a dark ground, which is what makes it the end of the page rather than another section of it: a reader scrolling reaches a band that is plainly not more page, and stops looking for more. The ground is `color.bg.brand-strong` — the role this package names for a band breaking a long page — and the ink that goes with it is set once on the root and inherited by everything inside, which is the package's rule about a section that paints a ground.
|
|
12
|
+
|
|
13
|
+
## Use when
|
|
14
|
+
|
|
15
|
+
- A marketing page needs its closing band — the mark, the site's other destinations, the regulatory text and the copyright line
|
|
16
|
+
- The same footer has to hold its content to the page's measure and gutter without the page restating either
|
|
17
|
+
- The regulatory or legal wording has to sit in a consistent place across every page of the site
|
|
18
|
+
|
|
19
|
+
## Do not use
|
|
20
|
+
|
|
21
|
+
- The content closes a card or a panel rather than the page → `Card`
|
|
22
|
+
- The navigation is the page's primary one, at the top → `Navbar`
|
|
23
|
+
- What is needed is a horizontal rule between two blocks of content → `Divider`
|
|
24
|
+
- A sticky bar of actions at the bottom of the viewport. This closes the document and scrolls away with it; an action rail that follows the reader is a different component and a different landmark
|
|
25
|
+
- A second navigation landmark competing with the top bar. The destinations here are the ones a reader looks down for rather than up for — the company, the legal pages, the secondary sections
|
|
26
|
+
- Page content. A band that closes the document is not a section to put a feature list in, and a reader who meets real content below the copyright line has been told the page ended and then found it had not
|
|
27
|
+
|
|
28
|
+
## Anatomy
|
|
29
|
+
|
|
30
|
+
Footer renders 12 elements. A token binding names the part it applies to.
|
|
31
|
+
|
|
32
|
+
- `root` — `<footer>`, class `dds-footer`. The band, and the one thing here that paints a ground. It spans the full width so the ground reaches both edges of the viewport, and centres what it holds rather than taking the measure itself — a band whose ground stopped at the measure would read as a card at the bottom of the page.
|
|
33
|
+
|
|
34
|
+
The ground is dark, and that is what ends the page. `color.bg.brand-strong` is the role this package names for a band breaking a long page, and `color.fg.on-brand-strong` is the ink that goes with it — set here and inherited, so the destinations, the labels and the small print are one decision rather than nine. Setting the ground without the ink is the failure the painted-ground rule exists to catch: the text keeps whatever the page was using and disappears.
|
|
35
|
+
|
|
36
|
+
It is the query container the groups ask. The band runs the full width, so the width it reports is the one a reader actually has — `inner` is capped and inset, and a threshold measured against it would fire two gutters late, leaving the footer in its phone layout at a width where the bar above it had already opened. A container and not a media query all the same: a footer placed in a narrow region of a wide page is a narrow footer, and only the container knows that.
|
|
37
|
+
- `inner` — `<div>`, class `dds-footer__inner`. The measure, and the order. It caps the content at the page's own maximum, holds the page gutter, and stacks the sections in the order they are read: the masthead, the destinations, and the block that closes the band. The gap between them is one step, because they are siblings of the same kind — blocks of the footer — and a stack that varied it would be ranking them.
|
|
38
|
+
- `masthead` — `<div>`, class `dds-footer__masthead`. The row the band opens on: the mark, the accounts the company keeps elsewhere, and whatever a third party awarded it.
|
|
39
|
+
|
|
40
|
+
A column first and a row once there is width for one. Stacked, the three read top to bottom and all range to the start — three regions at a phone's width laid out with `space-between` is a mark pinned to one edge and a badge to the other with a hole between them, which is a row pretending it still fits.
|
|
41
|
+
|
|
42
|
+
Wide enough it becomes three cells, `1fr auto 1fr`, with the mark at the start, the accounts in the middle and the borrowed mark at the far end. The outer two are equal whatever they hold, so the middle is centred on the band rather than on the space the other two leave — `space-between` centres it only when the flanking regions happen to match, and a wordmark against a badge never does.
|
|
43
|
+
|
|
44
|
+
The ends stay apart, which is the other half of the arrangement: a badge beside a logo is a badge the reader takes for part of the brand.
|
|
45
|
+
- `brand` — `<div>`, class `dds-footer__brand`. The leading section: whose site this is. A slot rather than a prop with a shape, because a mark is a logo on one site, a logo and a sentence on another, and a component that named its parts would be wrong on both. Optional, and absent on a page whose footer is links and law alone. Rendered only when `brand` is set.
|
|
46
|
+
- `social` — `<div>`, class `dds-footer__social`. The accounts the company keeps elsewhere, beside the mark rather than at the foot of the band.
|
|
47
|
+
|
|
48
|
+
A row of marks and no words, which works here and nowhere else in this package: these are logos a reader recognises rather than icons standing for actions, and a label under each would be seven words saying what seven shapes already said. Each is still a link with an accessible name of its own — the shape is what a sighted reader uses, never what a screen reader is given. Rendered only when `social` is set.
|
|
49
|
+
- `endorsement` — `<div>`, class `dds-footer__endorsement`. What somebody else said about the company, at the trailing end of the masthead.
|
|
50
|
+
|
|
51
|
+
Away from the mark deliberately. An accreditation drawn beside a logo is read as part of the logo, and a badge that looks like branding is a badge nobody credits to the body that issued it. Rendered only when `endorsement` is set.
|
|
52
|
+
- `body` — `<div>`, class `dds-footer__body`. The destinations and the rail beside them.
|
|
53
|
+
|
|
54
|
+
A column first, so on a phone the rail follows the sets rather than squeezing beside them. Wide enough it is five equal cells: the sets take four and the rail takes the fifth, so every region across the band is one width.
|
|
55
|
+
|
|
56
|
+
Its step is `space.gap.xl`, the same one the grid puts between columns, and that is the whole of what makes the five equal. With a narrower step between the rail and the sets, the rail's cell comes out nine pixels wider than a link column — near enough to look like a mistake and not near enough to look deliberate.
|
|
57
|
+
- `nav` — `<nav>`, class `dds-footer__nav`. The destinations, and the part that carries the accessible name. A landmark rather than a div, so a reader moving by landmark is told this is navigation and which navigation it is.
|
|
58
|
+
|
|
59
|
+
What arranges the columns inside it is a `Grid`, rendered here rather than asked of the page. The two halves of that are worth separating: the column count is the footer's decision, so it is a prop; the arithmetic that turns a count into tracks that fold as the room goes is Grid's, and it is a `repeat(auto-fit, minmax(min(100%, max(…))))` that is hard to get right once and should not exist twice. Composing it is how the footer has both — the same move Select makes with the SearchInput inside its list.
|
|
60
|
+
|
|
61
|
+
Before this, the page supplied the Grid and the groups were its grandchildren: the contract said Footer took FooterGroups and no page could give it one directly. Table never asks a caller to wrap its rows and Navbar never asks one to wrap its items.
|
|
62
|
+
|
|
63
|
+
The track floor is `min="md"` and it is what decides a phone. Grid fits as many tracks as clear the floor and drops the rest, so the count is arithmetic rather than a breakpoint: at 390 the band leaves 358 inside its gutter, two 240-pixel tracks and a gap cannot fit, and the sets become one column. At the `sm` floor they could — two tracks of 160 and a gap come to 344 — and a phone showed two columns with the long labels wrapping inside them.
|
|
64
|
+
|
|
65
|
+
A cell may hold a `Stack` of sets rather than a single one, and that is why `Stack` is allowed here when Table and Navbar allow nothing but their own. A real footer's columns are not one set each: Trade, Markets and Payments share the first, Platforms, Promotions and Tools the next, and which set lands in which column is a judgement about their lengths that changes the moment one is added. A grid cannot balance cells by height, and nothing in this component knows that Payments is one link and Platforms is nine — the page does, so the page groups them and the grid places what it is given.
|
|
66
|
+
- `aside` — `<div>`, class `dds-footer__aside`. The rail at the trailing end of the destinations: the app cards, a download, a partner mark.
|
|
67
|
+
|
|
68
|
+
One cell of the band's five, so it is exactly as wide as a column of destinations. It had a width of its own for a while — a track from the grid's scale — which was better than the nothing before it, when `flex: none` around a card sized by its own sentence took half the band. But a fixed width is still a fifth region that answers to a different number than the other four.
|
|
69
|
+
|
|
70
|
+
Outside the navigation landmark rather than a column of it, and that is why it is a slot and not a set. A reader running an eye down the columns is reading lists of links; a card with a picture and a button among them stops that read for something they were not looking for — and a screen reader moving by landmark would have it announced as a destination. Rendered only when `aside` is set.
|
|
71
|
+
- `bottom` — `<div>`, class `dds-footer__bottom`. The block that closes the band, and the only rule drawn in it. Its border is what separates the page's own destinations from the record that ends the document, which is a change of register rather than another gap.
|
|
72
|
+
|
|
73
|
+
A column rather than the row it was. What sits under the rule is the obliged text and then the closing line, read in that order — the accounts that used to sit opposite the copyright have moved up to the masthead, where they belong with the mark rather than with the law.
|
|
74
|
+
|
|
75
|
+
The rule is `color.border.subtle-inverse`, a role added with this component. It was `color.border.strong` for a while, which is described as an emphasised border for active or prominent elements — the value looked right on a dark band and the name said something else, and a borrowed role is a decision nobody can find later.
|
|
76
|
+
- `disclaimer` — `<div>`, class `dds-footer__disclaimer`. The regulatory text: what the page is obliged to say rather than what it wants to. Set small, because it is read by someone looking for it rather than offered to everyone, and run to the width of the band rather than held to a measure.
|
|
77
|
+
|
|
78
|
+
That is a decision against the usual one and worth recording as such. A paragraph the width of a page is a paragraph nobody finishes, which is why this was capped at `size.measure.long-form` to begin with. What is here is mostly not that: the entity list is a run of short independent sentences, one per licence, and a reader looking for theirs scans down them rather than reading through. The risk warning at the end is continuous prose and does pay the cost — if this block grows more of that than of the list, the measure is the thing to put back.
|
|
79
|
+
|
|
80
|
+
Set in the band's own ink rather than a muted one. On a light ground this was `color.fg.muted`, which is the role for supporting copy; on a dark ground there is no muted counterpart, and the nearest grey does not clear the contrast a paragraph needs. What makes this text recede here is its size and its place, not its colour. Rendered only when `disclaimer` is set.
|
|
81
|
+
- `copyright` — `<p>`, class `dds-footer__copyright`. The line that closes the document, where there is one.
|
|
82
|
+
|
|
83
|
+
Rendered only when the page passes it. It was unconditional and required, on the reading that every marketing page carries a notice — which is true of most and not of all, and a part that is always drawn around a string that may be empty is a blank line at the foot of the band. Rendered only when `copyright` is set.
|
|
84
|
+
|
|
85
|
+
Apply these classes from the generated `footerParts` constant rather than writing the strings by hand.
|
|
86
|
+
|
|
87
|
+
## Composition
|
|
88
|
+
|
|
89
|
+
- Can contain: `FooterGroup`, `Stack`, `Link`
|
|
90
|
+
- Never contains: `Footer`, `Navbar`, `SubdomainNavbar`, `BottomSheet`, `Table`, `Accordion`, `Card` — in children or in any prop that takes a node
|
|
91
|
+
|
|
92
|
+
## Props
|
|
93
|
+
|
|
94
|
+
### label — `string` **Required.**
|
|
95
|
+
|
|
96
|
+
Use when: Always — it names the navigation landmark, and a page with two unnamed ones tells a screen-reader user there is navigation in both places without saying how they differ. Name the set rather than the act: 'Footer', not 'Footer navigation' — the role already supplies the word, and a name carrying it is announced twice
|
|
97
|
+
Never for: A visible heading. Nothing draws this. The band needs no title, and a page that wants one composes a heading into the section itself
|
|
98
|
+
|
|
99
|
+
### columns — `2` | `3` | `4` (default `4`)
|
|
100
|
+
|
|
101
|
+
- `2` — A short footer, or one whose sets run long
|
|
102
|
+
- `3` — The middle case, and the one a site with a rail beside its columns often wants
|
|
103
|
+
- `4` — The default, and the widest the band goes. With the rail beside them that is five regions across
|
|
104
|
+
|
|
105
|
+
Use when: How many columns the destinations fall into at full width. Four is the ceiling, and with the rail beside them that is five regions across — which is as many as a band can hold before a reader stops scanning columns and starts reading a wall.
|
|
106
|
+
|
|
107
|
+
It is the count at full width and never the count on a phone. The grid behind it fits what it can and drops a track when the room goes, so this is the ceiling rather than a promise.
|
|
108
|
+
Never for: Forcing a layout on a phone. Nothing here holds at a phone's width — the grid drops to a single column and this value is not read
|
|
109
|
+
|
|
110
|
+
### copyright — `string`
|
|
111
|
+
|
|
112
|
+
Use when: The line the band closes on, where the site carries one. Pass the sentence the site uses, the year included: this formats nothing and computes nothing.
|
|
113
|
+
|
|
114
|
+
Optional, which it did not used to be. The argument for requiring it was that a marketing page has one whether or not anyone remembered to pass it, and a footer that rendered without it looks finished while missing the one sentence it exists to carry. That holds for a page that has a notice to give — it does not hold for a site that puts its ownership somewhere else, and a required prop is the component insisting on a sentence it cannot write.
|
|
115
|
+
Never for: The regulatory text. A disclaimer is paragraphs and belongs in `disclaimer`, where it is set at a readable measure; squeezed into the closing line it becomes a wall of small print across the foot of the strip
|
|
116
|
+
|
|
117
|
+
### brand — `node`
|
|
118
|
+
|
|
119
|
+
Use when: The footer opens with the site's mark, which is the common case — usually the logo, often with a line about the company under it
|
|
120
|
+
Never for: The page's heading. This is the site's mark, not the page's title
|
|
121
|
+
|
|
122
|
+
### social — `node`
|
|
123
|
+
|
|
124
|
+
Accepts: ButtonIcon, Link
|
|
125
|
+
Use when: The accounts the company keeps elsewhere, at the head of the band beside the mark. They are about the company rather than about the site, which is why they sit with the mark and not among the destinations
|
|
126
|
+
Never for: Destinations. Anything that goes to a section of the site belongs in the children, where the navigation landmark announces it as one
|
|
127
|
+
|
|
128
|
+
### endorsement — `node`
|
|
129
|
+
|
|
130
|
+
Accepts: *
|
|
131
|
+
Use when: A mark somebody else awarded — an accreditation, a standard the company holds. At the far end of the masthead, away from the company's own mark, because a badge beside a logo reads as part of the logo
|
|
132
|
+
Never for: The company's own mark, or anything that links into the site. This end of the row is for what a third party said, and a destination put here is one a reader will not look for
|
|
133
|
+
|
|
134
|
+
### aside — `node`
|
|
135
|
+
|
|
136
|
+
Accepts: *
|
|
137
|
+
Use when: The rail beside the destinations: the app cards, a download, a partner mark. The one part of the band that is an offer rather than a way onward, which is why it is kept out of the columns instead of being a set among them
|
|
138
|
+
Never for: Another set of links. A column of destinations belongs in the navigation landmark, where a screen reader announces it as one — put here it is outside the landmark and outside the order a reader is reading the columns in
|
|
139
|
+
|
|
140
|
+
### disclaimer — `node`
|
|
141
|
+
|
|
142
|
+
Accepts: Typography, Link
|
|
143
|
+
Use when: The site is obliged to carry regulatory or legal wording — the risk warning, the licensing statement, the entity that holds the licence. Passed as nodes rather than a string because it runs to paragraphs and usually carries links
|
|
144
|
+
Never for: Marketing copy. This section is set muted and small, which is right for text nobody chose to read and wrong for anything the page is trying to say
|
|
145
|
+
|
|
146
|
+
## Accessibility
|
|
147
|
+
|
|
148
|
+
Guaranteed by the component. Write none of it by hand: the ids these attributes point at are generated per instance, so an attribute set from outside either says the same thing twice or points at nothing.
|
|
149
|
+
|
|
150
|
+
- Announced as: `contentinfo`
|
|
151
|
+
- `Tab` — Moves through the band in reading order — the mark, then each destination, then whatever the disclaimer carries, then the closing strip. Nothing here is a composite widget, so there is no roving tabindex and no arrow keys: a reader uses the key they already have.
|
|
152
|
+
- accessible name from label, on the navigation landmark rather than on the band, so a reader meeting a second set of destinations is told which set it is
|
|
153
|
+
- The footer carries no explicit role. A <footer> that is not inside a sectioning element is already the contentinfo landmark, and writing the role as well says it twice — and says it wrongly if the element is ever nested, where the implicit landmark correctly disappears and a hand-written role would not.
|
|
154
|
+
- The band is the last thing in the document, not a bar pinned to the viewport. A footer that followed the reader would cover the end of every page and announce the document had finished while it had not.
|
|
155
|
+
|
|
156
|
+
## Rules
|
|
157
|
+
|
|
158
|
+
- **On a phone a section's actions stack and each fills the width, including when there is only one** — On a phone a page's actions stack, and each one fills the width. Not most of it, and not the width its label happens to need — the whole column.
|
|
159
|
+
|
|
160
|
+
Two side by side is what this replaces. On the narrowest screen each gets half a column minus the gap, which is rarely enough for a real label: the words wrap inside the pills, the two buttons come out different heights, and the pair reads as a broken row rather than as a choice. Stacked, each has the whole width and neither has to shorten its words to fit.
|
|
161
|
+
|
|
162
|
+
A single action fills too, and that is the part worth saying, because it is the one that looks unnecessary. A lone button has the room to sit at its natural width and still should not: a full-width control is the phone's convention for the thing the screen is asking you to do, and a pill hugging its label reads as one option among others that are not there. It also makes the target predictable — the whole width, wherever the thumb lands — which a centred pill does not.
|
|
163
|
+
|
|
164
|
+
Filling is the row's job rather than the button's. A button has no width of its own and is not given one; the row it sits in becomes a column and stretches its children, so nothing about the control changes and the same button is full width here and its own size on a desktop.
|
|
165
|
+
|
|
166
|
+
This is the phone's breakpoint, size.breakpoint.md, and not the wider one that decides whether a heading is centred. Those are different questions and they break at different widths: a heading stops being centred when the measure is the screen, while a button stops being full width much sooner than that — stretched across a tablet it is a long way from its own label, and a label centred in a metre of pill is harder to hit than one in a pill the size of the words.
|
|
167
|
+
|
|
168
|
+
What this is not about is every row of controls. A set of filter chips, a pagination strip, a toolbar, a link sitting after a sentence — none of these is the page asking for something, and stacking them to full width would turn a strip the eye skims into a list it has to read. The test is whether the row is the call to action the section was written for.
|
|
169
|
+
Guidance only — cannot be checked automatically.
|
|
170
|
+
- **Never nest one interactive element inside another** — Nested interactive elements produce ambiguous hit targets and an unreachable inner control for keyboard and screen-reader users. This is why the rule cannot live on any single component — it constrains Button, Link, Input and Switch simultaneously.
|
|
171
|
+
Guidance only — cannot be checked automatically.
|
|
172
|
+
- **A section that paints a ground sets the ink to go with it** — A page sits on color.bg.page, and a section that separates itself from it takes one of three grounds. color.bg.subtle is the light one and needs nothing further — the page's own ink still reads on it. The other two are dark and do not: color.bg.brand-strong takes color.fg.on-brand-strong, and color.bg.brand takes color.fg.on-solid. Both are white, and both are written as the role rather than the white they resolve to. Set one of those backgrounds without its ink and the text inherits whatever the page was already using, which is near-black on a dark band — legible to nobody, and invisible to every check here, because each pair passes contrast on its own and nothing can tell whether a section used both.
|
|
173
|
+
|
|
174
|
+
color.bg.brand carries a second limit that is not about forgetting. Its ink measures 3.39:1, which clears the 3:1 a heading needs and misses the 4.5:1 running copy needs. A coral band may carry a headline and a call to action; a paragraph on one is text the reader has to work through at a ratio the waiver on that role does not cover — the waiver says so itself. A section with copy in it takes color.bg.brand-strong, which is near-black and carries white at full contrast.
|
|
175
|
+
|
|
176
|
+
color.bg.strong is not a section ground. It is the inverted fill for an action that has to outrank what surrounds it, and the components that paint it — Button and ButtonIcon in their inverse form — already set both halves in one rule, which is the pattern a hand-painted section has to copy.
|
|
177
|
+
Guidance only — cannot be checked automatically.
|
|
178
|
+
- **Every gap inside a section names the relationship it expresses, and the same relationship keeps its measure when it turns on its side** — A section's spacing is named by the relationship it expresses, not chosen by size. Every gap in a section has a role token, and reaching for a step off the generic scale because it happens to be the right number is how two sections written by two people stop lining up: the numbers agree today and drift the first time one of them is tuned.
|
|
179
|
+
|
|
180
|
+
The heading group is three steps, not one gap. An eyebrow sits nearer its title than the title sits to its description, and the actions sit further from the description than either — space.heading.eyebrow-title, space.heading.title-description, space.heading.description-actions, in that order. A single `gap` on the group cannot say this; it sets all three the same and the block reads as evenly spaced lines rather than as a mark, a name and a paragraph. The eyebrow has to identify itself for this to work, because a group that opens with a title must not give its description the eyebrow's tighter step.
|
|
181
|
+
|
|
182
|
+
The step between a title and its description follows the size of the title, which is why there are two of it. What a reader sees is not the gap but the gap plus the leading above it, and leading scales with the type: under a display title the leading is most of the space, under a card's title it is half as deep. One value for both makes a card look loose at the size that made a section look right. So space.heading.title-description is the display step and space.heading.title-description-compact is the step at a card's size, and the choice is made by how big the title is rather than by what kind of block it sits in.
|
|
183
|
+
|
|
184
|
+
Every one of those steps is smaller than the gap below the group, and that ordering is what holds the group together as one thing. space.heading.content is the step between a heading group and the content it introduces, and it is the widest measure inside a section: the one gap the eye reads as a change of subject rather than as a continuation.
|
|
185
|
+
|
|
186
|
+
That step is the same whether the content is under the heading or beside it. A split is the same relationship turned on its side — a heading group and the content it introduces — so the space between the two halves is space.heading.content, not a gutter. When the split collapses to one column on a phone the gap becomes vertical again, which is where it started, and nothing has to change for that to be right.
|
|
187
|
+
|
|
188
|
+
space.grid.gutter is between two things of the same kind. Two cards in a row are the same kind; the two halves of a split are not, which is why the gutter is the wrong measure there even when the number would have looked acceptable. The gutter runs on both axes, so a grid reads as an even field rather than as rows with a seam down them.
|
|
189
|
+
|
|
190
|
+
space.inset.card is the card's, not the page's. A row of cards padded differently is a row of different cards, and the fill is the only edge they have. A page composing a row does not get to choose it.
|
|
191
|
+
|
|
192
|
+
Column count is not a breakpoint decision. A row holds as many columns as fit before a column would be narrower than size.grid.column-min, and drops one when they would not. Written as a fixed count that collapses at a breakpoint, a four-up row keeps four columns at every width above the phone and sets its copy two or three words to a line through the whole of the tablet range — and on a narrow desktop, which no breakpoint sits on at all. The threshold is a property of the row rather than of a card: a card fills whatever cell it is given.
|
|
193
|
+
|
|
194
|
+
What this does not cover is the space above and below a section, which is space.section.default and space.section.compact, and the page's own side margin, which is space.inset.page. Those are the section's outside; everything here is its inside.
|
|
195
|
+
Guidance only — cannot be checked automatically.
|
|
196
|
+
- **A section's title is centred over stacked content, starts beside content in columns, and starts on a phone** — Two arrangements, and the title's alignment is decided by which one it is introducing rather than chosen per section.
|
|
197
|
+
|
|
198
|
+
Content stacked under the title — a row of cards, an accordion, a set of steps — takes a centred title. The heading group and the block below it share one axis, so a centred title is symmetric with the thing it names, and the eye drops from the middle of the words to the middle of the set. A title starting at the left over a centred or full-width block reads as belonging to the first column rather than to all of them.
|
|
199
|
+
|
|
200
|
+
Content beside the title — a split, a picture in the other half, anything laid out in columns — takes a title that starts where its content starts. The two share a left edge, and that edge is what says they are one thing read across rather than two stacked. Centring the title there breaks the only alignment the reader has to hold the halves together, and it drifts further from its content the wider the page gets.
|
|
201
|
+
|
|
202
|
+
The heading group is what carries this, not the heading alone. An eyebrow, a title and a description are read as one block and align together; aligning the title without them leaves a centred heading over start-aligned copy, which reads as a mistake rather than as a choice.
|
|
203
|
+
|
|
204
|
+
Centred means all of it, not just the words. A badge, a row of actions, a picture — these are flex children, and a flex child is placed by align-items rather than by text-align, so a block that only sets the text leaves everything that is not text at the start. A hero is the case that shows it: its title and copy centred while its badge and its buttons did not.
|
|
205
|
+
|
|
206
|
+
A capped block centres itself as well as its words. A heading group takes size.heading-group.max, and a cap that is not centred leaves the measure at the start of the column with the words centred inside it — composed, and a long way left of the middle it appears to be in.
|
|
207
|
+
|
|
208
|
+
Both arrangements go to the start on a phone. A centred block reverts below the breakpoint, and the reason is the measure: on a phone the measure is the screen, so a centred title wraps to three or four ragged lines and the eye loses the left edge it was tracking — the same symmetry that reads as composure on a desktop is what makes it hard to scan on a phone. Centring there has to be asked for twice, and a section title is not one of the things that asks: it is centred because there is room for it, and on a phone there is not. Going back to the start means all of it too, and a capped block is the one that hides a leftover: its words go to the start while its measure stays in the middle of the column, which reads as a title still centred over a badge and buttons that are not — the box in the middle and the line inside it at the edge.
|
|
209
|
+
|
|
210
|
+
A hero is a section like any other: its badge, title, copy and actions are one stacked block, so it is centred on a desktop and starts on a phone with everything else.
|
|
211
|
+
|
|
212
|
+
What this is not about is a page whose body is a form or a document. A title over a sign-up form or a guide is not introducing a set of content — it is the first line of the thing itself, and it keeps the alignment the body has, which for running text is the start. The distinction is whether the block below is content the title names or content the title is part of.
|
|
213
|
+
Guidance only — cannot be checked automatically.
|
|
214
|
+
- **Anything a pointer has to hit is at least 24px in both directions** — A control sized by its contents is as big as its contents, and a glyph is chosen for how it reads rather than for how easily it is hit. An icon-only button with no padding is a 16px target — smaller than the pad of a finger, and smaller than the tremor of a hand using a mouse.
|
|
215
|
+
|
|
216
|
+
WCAG 2.2 asks for 24 by 24 CSS pixels at AA. The exceptions are narrower than they look: inline targets inside a sentence are exempt, and so is a small target with 24px of clear space around it — but a clear button sits against the field it empties, and a field is itself a target, so the spacing exemption does not apply to the case that keeps arising.
|
|
217
|
+
|
|
218
|
+
The target and the mark are separate decisions, and conflating them is what produces both faults. Growing the glyph to 24px makes it shout; leaving the button at 16px makes it hard to hit. So the glyph keeps the size that reads correctly beside its text, and the box around it declares a minimum of its own — which is what size.target.min is for.
|
|
219
|
+
|
|
220
|
+
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.
|
|
221
|
+
Guidance only — cannot be checked automatically.
|
|
222
|
+
|
|
223
|
+
## Anti-examples
|
|
224
|
+
|
|
225
|
+
❌ Footer for: The content closes a card or a panel rather than the page
|
|
226
|
+
→ use `Card` instead.
|
|
227
|
+
|
|
228
|
+
❌ Footer for: The navigation is the page's primary one, at the top
|
|
229
|
+
→ use `Navbar` instead.
|
|
230
|
+
|
|
231
|
+
❌ Footer for: What is needed is a horizontal rule between two blocks of content
|
|
232
|
+
→ use `Divider` instead.
|
|
233
|
+
|
|
234
|
+
## Example
|
|
235
|
+
|
|
236
|
+
```tsx
|
|
237
|
+
import { Footer, FooterGroup, Link, Typography } from '@deriv-com/dds-marketing'
|
|
238
|
+
import { DerivCoralWordmark } from '@deriv-com/quill-logos-web'
|
|
239
|
+
|
|
240
|
+
<Footer label="Footer" copyright="© 2026 Deriv. All rights reserved." brand={<DerivCoralWordmark />} social={<Link href="https://example.com/deriv" external>Follow us</Link>} endorsement={<Typography variant="body-sm" as="span">Investors in People · Platinum</Typography>} aside={<Typography variant="body-sm" as="span">Get the Deriv app — manage accounts and access markets anywhere.</Typography>} disclaimer={<Typography variant="body-sm" as="p">The products offered on our website are complex derivative products that carry a significant risk of potential loss. CFDs are complex instruments with a high risk of losing money rapidly due to leverage. You should consider whether you understand how these products work and whether you can afford to take the high risk of losing your money.</Typography>}>
|
|
241
|
+
<FooterGroup label="Trade" onExpandedChange={(expanded) => { /* your handler */ }}>
|
|
242
|
+
<Link href="/cfds">CFDs</Link>
|
|
243
|
+
<Link href="/options">Options</Link>
|
|
244
|
+
<Link href="/specs">Trading specifications</Link>
|
|
245
|
+
</FooterGroup>
|
|
246
|
+
<FooterGroup label="Markets" onExpandedChange={(expanded) => { /* your handler */ }}>
|
|
247
|
+
<Link href="/markets/forex">Forex</Link>
|
|
248
|
+
<Link href="/markets/stocks">Stocks</Link>
|
|
249
|
+
<Link href="/markets/commodities">Commodities</Link>
|
|
250
|
+
<Link href="/markets/crypto">Cryptocurrencies</Link>
|
|
251
|
+
</FooterGroup>
|
|
252
|
+
<FooterGroup label="About" onExpandedChange={(expanded) => { /* your handler */ }}>
|
|
253
|
+
<Link href="/who-we-are">Who we are</Link>
|
|
254
|
+
<Link href="/principles">Our principles</Link>
|
|
255
|
+
<Link href="/careers">Careers</Link>
|
|
256
|
+
<Link href="/newsroom">Newsroom</Link>
|
|
257
|
+
</FooterGroup>
|
|
258
|
+
<FooterGroup label="Legal" onExpandedChange={(expanded) => { /* your handler */ }}>
|
|
259
|
+
<Link href="/regulatory">Regulatory information</Link>
|
|
260
|
+
<Link href="/terms">Terms & conditions</Link>
|
|
261
|
+
<Link href="/privacy">Privacy policy</Link>
|
|
262
|
+
<Link href="/fraud">Fraud prevention</Link>
|
|
263
|
+
</FooterGroup>
|
|
264
|
+
</Footer>
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
## In use
|
|
268
|
+
|
|
269
|
+
Most rows below hold the same set, written once here:
|
|
270
|
+
|
|
271
|
+
```tsx
|
|
272
|
+
import { FooterGroup, Link } from '@deriv-com/dds-marketing'
|
|
273
|
+
|
|
274
|
+
const footergroups = (
|
|
275
|
+
<>
|
|
276
|
+
<FooterGroup label="Trade">
|
|
277
|
+
<Link href="/cfds">CFDs</Link>
|
|
278
|
+
<Link href="/options">Options</Link>
|
|
279
|
+
<Link href="/specs">Trading specifications</Link>
|
|
280
|
+
</FooterGroup>
|
|
281
|
+
<FooterGroup label="Markets">
|
|
282
|
+
<Link href="/markets/forex">Forex</Link>
|
|
283
|
+
<Link href="/markets/stocks">Stocks</Link>
|
|
284
|
+
<Link href="/markets/commodities">Commodities</Link>
|
|
285
|
+
<Link href="/markets/crypto">Cryptocurrencies</Link>
|
|
286
|
+
</FooterGroup>
|
|
287
|
+
<FooterGroup label="About">
|
|
288
|
+
<Link href="/who-we-are">Who we are</Link>
|
|
289
|
+
<Link href="/principles">Our principles</Link>
|
|
290
|
+
<Link href="/careers">Careers</Link>
|
|
291
|
+
<Link href="/newsroom">Newsroom</Link>
|
|
292
|
+
</FooterGroup>
|
|
293
|
+
<FooterGroup label="Legal">
|
|
294
|
+
<Link href="/regulatory">Regulatory information</Link>
|
|
295
|
+
<Link href="/terms">Terms & conditions</Link>
|
|
296
|
+
<Link href="/privacy">Privacy policy</Link>
|
|
297
|
+
<Link href="/fraud">Fraud prevention</Link>
|
|
298
|
+
</FooterGroup>
|
|
299
|
+
</>
|
|
300
|
+
)
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### The three blocks
|
|
304
|
+
|
|
305
|
+
The masthead, the destinations, and the record that ends the document — read in that order. Everything but the closing line is optional, and a footer is still a footer with any of it missing.
|
|
306
|
+
|
|
307
|
+
```tsx
|
|
308
|
+
import { Footer, FooterGroup, Link, Typography } from '@deriv-com/dds-marketing'
|
|
309
|
+
import { DerivCoralWordmark } from '@deriv-com/quill-logos-web'
|
|
310
|
+
|
|
311
|
+
// The shape a public page closes on
|
|
312
|
+
<Footer label="Footer" copyright="© 2026 Deriv. All rights reserved." brand={<DerivCoralWordmark />} disclaimer={<Typography variant="body-sm" as="p">The products offered on our website are complex derivative products that carry a significant risk of potential loss. CFDs are complex instruments with a high risk of losing money rapidly due to leverage. You should consider whether you understand how these products work and whether you can afford to take the high risk of losing your money.</Typography>}>{footergroups}</Footer>
|
|
313
|
+
|
|
314
|
+
// No mark — destinations and law alone
|
|
315
|
+
<Footer label="Footer" copyright="© 2026 Deriv. All rights reserved." disclaimer={<Typography variant="body-sm" as="p">The products offered on our website are complex derivative products that carry a significant risk of potential loss. CFDs are complex instruments with a high risk of losing money rapidly due to leverage. You should consider whether you understand how these products work and whether you can afford to take the high risk of losing your money.</Typography>}>
|
|
316
|
+
<FooterGroup label="Trade" onExpandedChange={(expanded) => { /* your handler */ }}>
|
|
317
|
+
<Link href="/cfds">CFDs</Link>
|
|
318
|
+
<Link href="/options">Options</Link>
|
|
319
|
+
<Link href="/specs">Trading specifications</Link>
|
|
320
|
+
</FooterGroup>
|
|
321
|
+
<FooterGroup label="Legal" onExpandedChange={(expanded) => { /* your handler */ }}>
|
|
322
|
+
<Link href="/regulatory">Regulatory information</Link>
|
|
323
|
+
<Link href="/terms">Terms & conditions</Link>
|
|
324
|
+
<Link href="/privacy">Privacy policy</Link>
|
|
325
|
+
<Link href="/fraud">Fraud prevention</Link>
|
|
326
|
+
</FooterGroup>
|
|
327
|
+
</Footer>
|
|
328
|
+
|
|
329
|
+
// Nothing it is obliged to say
|
|
330
|
+
<Footer label="Footer" copyright="© 2026 Deriv. All rights reserved." brand={<DerivCoralWordmark />}>
|
|
331
|
+
<FooterGroup label="Trade" onExpandedChange={(expanded) => { /* your handler */ }}>
|
|
332
|
+
<Link href="/cfds">CFDs</Link>
|
|
333
|
+
<Link href="/options">Options</Link>
|
|
334
|
+
<Link href="/specs">Trading specifications</Link>
|
|
335
|
+
</FooterGroup>
|
|
336
|
+
<FooterGroup label="Markets" onExpandedChange={(expanded) => { /* your handler */ }}>
|
|
337
|
+
<Link href="/markets/forex">Forex</Link>
|
|
338
|
+
<Link href="/markets/stocks">Stocks</Link>
|
|
339
|
+
<Link href="/markets/commodities">Commodities</Link>
|
|
340
|
+
<Link href="/markets/crypto">Cryptocurrencies</Link>
|
|
341
|
+
</FooterGroup>
|
|
342
|
+
</Footer>
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### Named sets, or none
|
|
346
|
+
|
|
347
|
+
A site with enough links names its sets; one with five destinations does not, and would be inventing a heading for a list of one. Both are allowed inside the landmark.
|
|
348
|
+
|
|
349
|
+
```tsx
|
|
350
|
+
import { Footer, Link } from '@deriv-com/dds-marketing'
|
|
351
|
+
|
|
352
|
+
// Grouped — the large-site shape
|
|
353
|
+
<Footer label="Footer" copyright="© 2026 Deriv. All rights reserved.">{footergroups}</Footer>
|
|
354
|
+
|
|
355
|
+
// Bare links — the small-site shape
|
|
356
|
+
<Footer label="Footer" copyright="© 2026 Deriv. All rights reserved.">
|
|
357
|
+
<Link href="/about">About us</Link>
|
|
358
|
+
<Link href="/contact">Contact us</Link>
|
|
359
|
+
<Link href="/terms">Terms and conditions</Link>
|
|
360
|
+
</Footer>
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### How many columns at full width
|
|
364
|
+
|
|
365
|
+
Four is the ceiling, and with the rail beside them that is five regions across. The count is a ceiling rather than a promise: the grid drops a track as the room goes, so a phone is one column.
|
|
366
|
+
|
|
367
|
+
```tsx
|
|
368
|
+
import { Footer, FooterGroup, Link } from '@deriv-com/dds-marketing'
|
|
369
|
+
|
|
370
|
+
// two — a short footer, or one whose sets run long
|
|
371
|
+
<Footer label="Footer" columns="2" copyright="© 2026 Deriv. All rights reserved.">
|
|
372
|
+
<FooterGroup label="Trade" onExpandedChange={(expanded) => { /* your handler */ }}>
|
|
373
|
+
<Link href="/cfds">CFDs</Link>
|
|
374
|
+
<Link href="/options">Options</Link>
|
|
375
|
+
<Link href="/specs">Trading specifications</Link>
|
|
376
|
+
</FooterGroup>
|
|
377
|
+
<FooterGroup label="Markets" onExpandedChange={(expanded) => { /* your handler */ }}>
|
|
378
|
+
<Link href="/markets/forex">Forex</Link>
|
|
379
|
+
<Link href="/markets/stocks">Stocks</Link>
|
|
380
|
+
<Link href="/markets/commodities">Commodities</Link>
|
|
381
|
+
<Link href="/markets/crypto">Cryptocurrencies</Link>
|
|
382
|
+
</FooterGroup>
|
|
383
|
+
</Footer>
|
|
384
|
+
|
|
385
|
+
// three — the case with a rail beside the columns
|
|
386
|
+
<Footer label="Footer" columns="3" copyright="© 2026 Deriv. All rights reserved.">
|
|
387
|
+
<FooterGroup label="Trade" onExpandedChange={(expanded) => { /* your handler */ }}>
|
|
388
|
+
<Link href="/cfds">CFDs</Link>
|
|
389
|
+
<Link href="/options">Options</Link>
|
|
390
|
+
<Link href="/specs">Trading specifications</Link>
|
|
391
|
+
</FooterGroup>
|
|
392
|
+
<FooterGroup label="Markets" onExpandedChange={(expanded) => { /* your handler */ }}>
|
|
393
|
+
<Link href="/markets/forex">Forex</Link>
|
|
394
|
+
<Link href="/markets/stocks">Stocks</Link>
|
|
395
|
+
<Link href="/markets/commodities">Commodities</Link>
|
|
396
|
+
<Link href="/markets/crypto">Cryptocurrencies</Link>
|
|
397
|
+
</FooterGroup>
|
|
398
|
+
<FooterGroup label="About" onExpandedChange={(expanded) => { /* your handler */ }}>
|
|
399
|
+
<Link href="/who-we-are">Who we are</Link>
|
|
400
|
+
<Link href="/principles">Our principles</Link>
|
|
401
|
+
<Link href="/careers">Careers</Link>
|
|
402
|
+
<Link href="/newsroom">Newsroom</Link>
|
|
403
|
+
</FooterGroup>
|
|
404
|
+
</Footer>
|
|
405
|
+
|
|
406
|
+
// four — the default, and the widest the band goes
|
|
407
|
+
<Footer label="Footer" columns="4" copyright="© 2026 Deriv. All rights reserved.">{footergroups}</Footer>
|
|
408
|
+
```
|