@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,297 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import './Typography.css';
|
|
3
|
+
import { type TypographyProps } from './Typography.types.js';
|
|
4
|
+
export type { TypographyProps };
|
|
5
|
+
/**
|
|
6
|
+
* Copy, set in one of the page's type roles.
|
|
7
|
+
*
|
|
8
|
+
* The element comes from `as` and the scale from `variant`, and the two are separate props
|
|
9
|
+
* because they are separate decisions. Every heading role in this package carries the same
|
|
10
|
+
* sentence — a size, not an instruction — and this is the component that makes it true rather
|
|
11
|
+
* than advisory: `as="h2" variant="h1"` is a section heading drawn at hero scale, and a page
|
|
12
|
+
* cannot reach for a size and receive a document structure it did not ask for.
|
|
13
|
+
*/
|
|
14
|
+
export declare function Typography({ variant, as, children, ...rest }: TypographyProps & {
|
|
15
|
+
children?: ReactNode;
|
|
16
|
+
}): import("react").DetailedReactHTMLElement<{
|
|
17
|
+
className: "dds-typography";
|
|
18
|
+
'data-variant': "figure" | "h1" | "h2" | "h3" | "h4" | "h5" | "eyebrow" | "subtitle" | "body-lg" | "body-md" | "body-sm";
|
|
19
|
+
defaultChecked?: boolean | undefined | undefined;
|
|
20
|
+
defaultValue?: string | number | readonly string[] | undefined;
|
|
21
|
+
suppressContentEditableWarning?: boolean | undefined | undefined;
|
|
22
|
+
suppressHydrationWarning?: boolean | undefined | undefined;
|
|
23
|
+
accessKey?: string | undefined | undefined;
|
|
24
|
+
autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {}) | undefined;
|
|
25
|
+
autoFocus?: boolean | undefined | undefined;
|
|
26
|
+
contentEditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
|
|
27
|
+
contextMenu?: string | undefined | undefined;
|
|
28
|
+
dir?: string | undefined | undefined;
|
|
29
|
+
draggable?: (boolean | "true" | "false") | undefined;
|
|
30
|
+
enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
|
|
31
|
+
hidden?: boolean | undefined | undefined;
|
|
32
|
+
id?: string | undefined | undefined;
|
|
33
|
+
lang?: string | undefined | undefined;
|
|
34
|
+
nonce?: string | undefined | undefined;
|
|
35
|
+
slot?: string | undefined | undefined;
|
|
36
|
+
spellCheck?: (boolean | "true" | "false") | undefined;
|
|
37
|
+
style?: import("react").CSSProperties | undefined;
|
|
38
|
+
tabIndex?: number | undefined | undefined;
|
|
39
|
+
title?: string | undefined | undefined;
|
|
40
|
+
translate?: "yes" | "no" | undefined | undefined;
|
|
41
|
+
radioGroup?: string | undefined | undefined;
|
|
42
|
+
role?: import("react").AriaRole | undefined;
|
|
43
|
+
about?: string | undefined | undefined;
|
|
44
|
+
content?: string | undefined | undefined;
|
|
45
|
+
datatype?: string | undefined | undefined;
|
|
46
|
+
inlist?: any;
|
|
47
|
+
prefix?: string | undefined | undefined;
|
|
48
|
+
property?: string | undefined | undefined;
|
|
49
|
+
rel?: string | undefined | undefined;
|
|
50
|
+
resource?: string | undefined | undefined;
|
|
51
|
+
rev?: string | undefined | undefined;
|
|
52
|
+
typeof?: string | undefined | undefined;
|
|
53
|
+
vocab?: string | undefined | undefined;
|
|
54
|
+
autoCorrect?: string | undefined | undefined;
|
|
55
|
+
autoSave?: string | undefined | undefined;
|
|
56
|
+
color?: string | undefined | undefined;
|
|
57
|
+
itemProp?: string | undefined | undefined;
|
|
58
|
+
itemScope?: boolean | undefined | undefined;
|
|
59
|
+
itemType?: string | undefined | undefined;
|
|
60
|
+
itemID?: string | undefined | undefined;
|
|
61
|
+
itemRef?: string | undefined | undefined;
|
|
62
|
+
results?: number | undefined | undefined;
|
|
63
|
+
security?: string | undefined | undefined;
|
|
64
|
+
unselectable?: "on" | "off" | undefined | undefined;
|
|
65
|
+
popover?: "" | "auto" | "manual" | "hint" | undefined | undefined;
|
|
66
|
+
popoverTargetAction?: "toggle" | "show" | "hide" | undefined | undefined;
|
|
67
|
+
popoverTarget?: string | undefined | undefined;
|
|
68
|
+
inert?: boolean | undefined | undefined;
|
|
69
|
+
inputMode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined | undefined;
|
|
70
|
+
is?: string | undefined | undefined;
|
|
71
|
+
exportparts?: string | undefined | undefined;
|
|
72
|
+
part?: string | undefined | undefined;
|
|
73
|
+
"aria-activedescendant"?: string | undefined | undefined;
|
|
74
|
+
"aria-atomic"?: (boolean | "true" | "false") | undefined;
|
|
75
|
+
"aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined | undefined;
|
|
76
|
+
"aria-braillelabel"?: string | undefined | undefined;
|
|
77
|
+
"aria-brailleroledescription"?: string | undefined | undefined;
|
|
78
|
+
"aria-busy"?: (boolean | "true" | "false") | undefined;
|
|
79
|
+
"aria-checked"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
|
|
80
|
+
"aria-colcount"?: number | undefined | undefined;
|
|
81
|
+
"aria-colindex"?: number | undefined | undefined;
|
|
82
|
+
"aria-colindextext"?: string | undefined | undefined;
|
|
83
|
+
"aria-colspan"?: number | undefined | undefined;
|
|
84
|
+
"aria-controls"?: string | undefined | undefined;
|
|
85
|
+
"aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined | undefined;
|
|
86
|
+
"aria-describedby"?: string | undefined | undefined;
|
|
87
|
+
"aria-description"?: string | undefined | undefined;
|
|
88
|
+
"aria-details"?: string | undefined | undefined;
|
|
89
|
+
"aria-disabled"?: (boolean | "true" | "false") | undefined;
|
|
90
|
+
"aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined | undefined;
|
|
91
|
+
"aria-errormessage"?: string | undefined | undefined;
|
|
92
|
+
"aria-expanded"?: (boolean | "true" | "false") | undefined;
|
|
93
|
+
"aria-flowto"?: string | undefined | undefined;
|
|
94
|
+
"aria-grabbed"?: (boolean | "true" | "false") | undefined;
|
|
95
|
+
"aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined | undefined;
|
|
96
|
+
"aria-hidden"?: (boolean | "true" | "false") | undefined;
|
|
97
|
+
"aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined | undefined;
|
|
98
|
+
"aria-keyshortcuts"?: string | undefined | undefined;
|
|
99
|
+
"aria-label"?: string | undefined | undefined;
|
|
100
|
+
"aria-labelledby"?: string | undefined | undefined;
|
|
101
|
+
"aria-level"?: number | undefined | undefined;
|
|
102
|
+
"aria-live"?: "off" | "assertive" | "polite" | undefined | undefined;
|
|
103
|
+
"aria-modal"?: (boolean | "true" | "false") | undefined;
|
|
104
|
+
"aria-multiline"?: (boolean | "true" | "false") | undefined;
|
|
105
|
+
"aria-multiselectable"?: (boolean | "true" | "false") | undefined;
|
|
106
|
+
"aria-orientation"?: "horizontal" | "vertical" | undefined | undefined;
|
|
107
|
+
"aria-owns"?: string | undefined | undefined;
|
|
108
|
+
"aria-placeholder"?: string | undefined | undefined;
|
|
109
|
+
"aria-posinset"?: number | undefined | undefined;
|
|
110
|
+
"aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
|
|
111
|
+
"aria-readonly"?: (boolean | "true" | "false") | undefined;
|
|
112
|
+
"aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined | undefined;
|
|
113
|
+
"aria-required"?: (boolean | "true" | "false") | undefined;
|
|
114
|
+
"aria-roledescription"?: string | undefined | undefined;
|
|
115
|
+
"aria-rowcount"?: number | undefined | undefined;
|
|
116
|
+
"aria-rowindex"?: number | undefined | undefined;
|
|
117
|
+
"aria-rowindextext"?: string | undefined | undefined;
|
|
118
|
+
"aria-rowspan"?: number | undefined | undefined;
|
|
119
|
+
"aria-selected"?: (boolean | "true" | "false") | undefined;
|
|
120
|
+
"aria-setsize"?: number | undefined | undefined;
|
|
121
|
+
"aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined | undefined;
|
|
122
|
+
"aria-valuemax"?: number | undefined | undefined;
|
|
123
|
+
"aria-valuemin"?: number | undefined | undefined;
|
|
124
|
+
"aria-valuenow"?: number | undefined | undefined;
|
|
125
|
+
"aria-valuetext"?: string | undefined | undefined;
|
|
126
|
+
dangerouslySetInnerHTML?: {
|
|
127
|
+
__html: string | TrustedHTML;
|
|
128
|
+
} | undefined | undefined;
|
|
129
|
+
onCopy?: import("react").ClipboardEventHandler<HTMLElement> | undefined;
|
|
130
|
+
onCopyCapture?: import("react").ClipboardEventHandler<HTMLElement> | undefined;
|
|
131
|
+
onCut?: import("react").ClipboardEventHandler<HTMLElement> | undefined;
|
|
132
|
+
onCutCapture?: import("react").ClipboardEventHandler<HTMLElement> | undefined;
|
|
133
|
+
onPaste?: import("react").ClipboardEventHandler<HTMLElement> | undefined;
|
|
134
|
+
onPasteCapture?: import("react").ClipboardEventHandler<HTMLElement> | undefined;
|
|
135
|
+
onCompositionEnd?: import("react").CompositionEventHandler<HTMLElement> | undefined;
|
|
136
|
+
onCompositionEndCapture?: import("react").CompositionEventHandler<HTMLElement> | undefined;
|
|
137
|
+
onCompositionStart?: import("react").CompositionEventHandler<HTMLElement> | undefined;
|
|
138
|
+
onCompositionStartCapture?: import("react").CompositionEventHandler<HTMLElement> | undefined;
|
|
139
|
+
onCompositionUpdate?: import("react").CompositionEventHandler<HTMLElement> | undefined;
|
|
140
|
+
onCompositionUpdateCapture?: import("react").CompositionEventHandler<HTMLElement> | undefined;
|
|
141
|
+
onFocus?: import("react").FocusEventHandler<HTMLElement> | undefined;
|
|
142
|
+
onFocusCapture?: import("react").FocusEventHandler<HTMLElement> | undefined;
|
|
143
|
+
onBlur?: import("react").FocusEventHandler<HTMLElement> | undefined;
|
|
144
|
+
onBlurCapture?: import("react").FocusEventHandler<HTMLElement> | undefined;
|
|
145
|
+
onChange?: import("react").ChangeEventHandler<HTMLElement, Element> | undefined;
|
|
146
|
+
onChangeCapture?: import("react").ChangeEventHandler<HTMLElement, Element> | undefined;
|
|
147
|
+
onBeforeInput?: import("react").InputEventHandler<HTMLElement> | undefined;
|
|
148
|
+
onBeforeInputCapture?: import("react").InputEventHandler<HTMLElement> | undefined;
|
|
149
|
+
onInput?: import("react").InputEventHandler<HTMLElement> | undefined;
|
|
150
|
+
onInputCapture?: import("react").InputEventHandler<HTMLElement> | undefined;
|
|
151
|
+
onReset?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
152
|
+
onResetCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
153
|
+
onSubmit?: import("react").SubmitEventHandler<HTMLElement> | undefined;
|
|
154
|
+
onSubmitCapture?: import("react").SubmitEventHandler<HTMLElement> | undefined;
|
|
155
|
+
onInvalid?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
156
|
+
onInvalidCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
157
|
+
onLoad?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
158
|
+
onLoadCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
159
|
+
onError?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
160
|
+
onErrorCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
161
|
+
onKeyDown?: import("react").KeyboardEventHandler<HTMLElement> | undefined;
|
|
162
|
+
onKeyDownCapture?: import("react").KeyboardEventHandler<HTMLElement> | undefined;
|
|
163
|
+
onKeyPress?: import("react").KeyboardEventHandler<HTMLElement> | undefined;
|
|
164
|
+
onKeyPressCapture?: import("react").KeyboardEventHandler<HTMLElement> | undefined;
|
|
165
|
+
onKeyUp?: import("react").KeyboardEventHandler<HTMLElement> | undefined;
|
|
166
|
+
onKeyUpCapture?: import("react").KeyboardEventHandler<HTMLElement> | undefined;
|
|
167
|
+
onAbort?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
168
|
+
onAbortCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
169
|
+
onCanPlay?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
170
|
+
onCanPlayCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
171
|
+
onCanPlayThrough?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
172
|
+
onCanPlayThroughCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
173
|
+
onDurationChange?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
174
|
+
onDurationChangeCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
175
|
+
onEmptied?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
176
|
+
onEmptiedCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
177
|
+
onEncrypted?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
178
|
+
onEncryptedCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
179
|
+
onEnded?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
180
|
+
onEndedCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
181
|
+
onLoadedData?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
182
|
+
onLoadedDataCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
183
|
+
onLoadedMetadata?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
184
|
+
onLoadedMetadataCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
185
|
+
onLoadStart?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
186
|
+
onLoadStartCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
187
|
+
onPause?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
188
|
+
onPauseCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
189
|
+
onPlay?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
190
|
+
onPlayCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
191
|
+
onPlaying?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
192
|
+
onPlayingCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
193
|
+
onProgress?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
194
|
+
onProgressCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
195
|
+
onRateChange?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
196
|
+
onRateChangeCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
197
|
+
onSeeked?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
198
|
+
onSeekedCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
199
|
+
onSeeking?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
200
|
+
onSeekingCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
201
|
+
onStalled?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
202
|
+
onStalledCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
203
|
+
onSuspend?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
204
|
+
onSuspendCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
205
|
+
onTimeUpdate?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
206
|
+
onTimeUpdateCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
207
|
+
onVolumeChange?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
208
|
+
onVolumeChangeCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
209
|
+
onWaiting?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
210
|
+
onWaitingCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
211
|
+
onAuxClick?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
212
|
+
onAuxClickCapture?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
213
|
+
onClick?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
214
|
+
onClickCapture?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
215
|
+
onContextMenu?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
216
|
+
onContextMenuCapture?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
217
|
+
onDoubleClick?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
218
|
+
onDoubleClickCapture?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
219
|
+
onDrag?: import("react").DragEventHandler<HTMLElement> | undefined;
|
|
220
|
+
onDragCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
|
|
221
|
+
onDragEnd?: import("react").DragEventHandler<HTMLElement> | undefined;
|
|
222
|
+
onDragEndCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
|
|
223
|
+
onDragEnter?: import("react").DragEventHandler<HTMLElement> | undefined;
|
|
224
|
+
onDragEnterCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
|
|
225
|
+
onDragExit?: import("react").DragEventHandler<HTMLElement> | undefined;
|
|
226
|
+
onDragExitCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
|
|
227
|
+
onDragLeave?: import("react").DragEventHandler<HTMLElement> | undefined;
|
|
228
|
+
onDragLeaveCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
|
|
229
|
+
onDragOver?: import("react").DragEventHandler<HTMLElement> | undefined;
|
|
230
|
+
onDragOverCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
|
|
231
|
+
onDragStart?: import("react").DragEventHandler<HTMLElement> | undefined;
|
|
232
|
+
onDragStartCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
|
|
233
|
+
onDrop?: import("react").DragEventHandler<HTMLElement> | undefined;
|
|
234
|
+
onDropCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
|
|
235
|
+
onMouseDown?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
236
|
+
onMouseDownCapture?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
237
|
+
onMouseEnter?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
238
|
+
onMouseLeave?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
239
|
+
onMouseMove?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
240
|
+
onMouseMoveCapture?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
241
|
+
onMouseOut?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
242
|
+
onMouseOutCapture?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
243
|
+
onMouseOver?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
244
|
+
onMouseOverCapture?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
245
|
+
onMouseUp?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
246
|
+
onMouseUpCapture?: import("react").MouseEventHandler<HTMLElement> | undefined;
|
|
247
|
+
onSelect?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
248
|
+
onSelectCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
|
|
249
|
+
onTouchCancel?: import("react").TouchEventHandler<HTMLElement> | undefined;
|
|
250
|
+
onTouchCancelCapture?: import("react").TouchEventHandler<HTMLElement> | undefined;
|
|
251
|
+
onTouchEnd?: import("react").TouchEventHandler<HTMLElement> | undefined;
|
|
252
|
+
onTouchEndCapture?: import("react").TouchEventHandler<HTMLElement> | undefined;
|
|
253
|
+
onTouchMove?: import("react").TouchEventHandler<HTMLElement> | undefined;
|
|
254
|
+
onTouchMoveCapture?: import("react").TouchEventHandler<HTMLElement> | undefined;
|
|
255
|
+
onTouchStart?: import("react").TouchEventHandler<HTMLElement> | undefined;
|
|
256
|
+
onTouchStartCapture?: import("react").TouchEventHandler<HTMLElement> | undefined;
|
|
257
|
+
onPointerDown?: import("react").PointerEventHandler<HTMLElement> | undefined;
|
|
258
|
+
onPointerDownCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
|
|
259
|
+
onPointerMove?: import("react").PointerEventHandler<HTMLElement> | undefined;
|
|
260
|
+
onPointerMoveCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
|
|
261
|
+
onPointerUp?: import("react").PointerEventHandler<HTMLElement> | undefined;
|
|
262
|
+
onPointerUpCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
|
|
263
|
+
onPointerCancel?: import("react").PointerEventHandler<HTMLElement> | undefined;
|
|
264
|
+
onPointerCancelCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
|
|
265
|
+
onPointerEnter?: import("react").PointerEventHandler<HTMLElement> | undefined;
|
|
266
|
+
onPointerLeave?: import("react").PointerEventHandler<HTMLElement> | undefined;
|
|
267
|
+
onPointerOver?: import("react").PointerEventHandler<HTMLElement> | undefined;
|
|
268
|
+
onPointerOverCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
|
|
269
|
+
onPointerOut?: import("react").PointerEventHandler<HTMLElement> | undefined;
|
|
270
|
+
onPointerOutCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
|
|
271
|
+
onGotPointerCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
|
|
272
|
+
onGotPointerCaptureCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
|
|
273
|
+
onLostPointerCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
|
|
274
|
+
onLostPointerCaptureCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
|
|
275
|
+
onScroll?: import("react").UIEventHandler<HTMLElement> | undefined;
|
|
276
|
+
onScrollCapture?: import("react").UIEventHandler<HTMLElement> | undefined;
|
|
277
|
+
onScrollEnd?: import("react").UIEventHandler<HTMLElement> | undefined;
|
|
278
|
+
onScrollEndCapture?: import("react").UIEventHandler<HTMLElement> | undefined;
|
|
279
|
+
onWheel?: import("react").WheelEventHandler<HTMLElement> | undefined;
|
|
280
|
+
onWheelCapture?: import("react").WheelEventHandler<HTMLElement> | undefined;
|
|
281
|
+
onAnimationStart?: import("react").AnimationEventHandler<HTMLElement> | undefined;
|
|
282
|
+
onAnimationStartCapture?: import("react").AnimationEventHandler<HTMLElement> | undefined;
|
|
283
|
+
onAnimationEnd?: import("react").AnimationEventHandler<HTMLElement> | undefined;
|
|
284
|
+
onAnimationEndCapture?: import("react").AnimationEventHandler<HTMLElement> | undefined;
|
|
285
|
+
onAnimationIteration?: import("react").AnimationEventHandler<HTMLElement> | undefined;
|
|
286
|
+
onAnimationIterationCapture?: import("react").AnimationEventHandler<HTMLElement> | undefined;
|
|
287
|
+
onToggle?: import("react").ToggleEventHandler<HTMLElement> | undefined;
|
|
288
|
+
onBeforeToggle?: import("react").ToggleEventHandler<HTMLElement> | undefined;
|
|
289
|
+
onTransitionCancel?: import("react").TransitionEventHandler<HTMLElement> | undefined;
|
|
290
|
+
onTransitionCancelCapture?: import("react").TransitionEventHandler<HTMLElement> | undefined;
|
|
291
|
+
onTransitionEnd?: import("react").TransitionEventHandler<HTMLElement> | undefined;
|
|
292
|
+
onTransitionEndCapture?: import("react").TransitionEventHandler<HTMLElement> | undefined;
|
|
293
|
+
onTransitionRun?: import("react").TransitionEventHandler<HTMLElement> | undefined;
|
|
294
|
+
onTransitionRunCapture?: import("react").TransitionEventHandler<HTMLElement> | undefined;
|
|
295
|
+
onTransitionStart?: import("react").TransitionEventHandler<HTMLElement> | undefined;
|
|
296
|
+
onTransitionStartCapture?: import("react").TransitionEventHandler<HTMLElement> | undefined;
|
|
297
|
+
}, HTMLElement>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { createElement } from 'react';
|
|
2
|
+
import './Typography.css';
|
|
3
|
+
import { typographyDefaults, typographyParts } from './Typography.types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Copy, set in one of the page's type roles.
|
|
6
|
+
*
|
|
7
|
+
* The element comes from `as` and the scale from `variant`, and the two are separate props
|
|
8
|
+
* because they are separate decisions. Every heading role in this package carries the same
|
|
9
|
+
* sentence — a size, not an instruction — and this is the component that makes it true rather
|
|
10
|
+
* than advisory: `as="h2" variant="h1"` is a section heading drawn at hero scale, and a page
|
|
11
|
+
* cannot reach for a size and receive a document structure it did not ask for.
|
|
12
|
+
*/
|
|
13
|
+
export function Typography({ variant = typographyDefaults.variant, as = typographyDefaults.as, children, ...rest }) {
|
|
14
|
+
/**
|
|
15
|
+
* `createElement` rather than a component variable.
|
|
16
|
+
*
|
|
17
|
+
* `const As = as` and `<As …>` reads better and is the usual recipe, but it recreates the
|
|
18
|
+
* element type on every render from the caller's point of view, and it obliges the tag to be
|
|
19
|
+
* capitalised to escape JSX's lowercase-is-an-intrinsic rule. This takes the string straight,
|
|
20
|
+
* which is what it already is.
|
|
21
|
+
*
|
|
22
|
+
* `rest` is spread before the class so a consumer cannot replace it: the stylesheet and this
|
|
23
|
+
* component are written by different processes, and a part rendered without its class renders
|
|
24
|
+
* bare with its rule sitting unused. `className` is stripped from the props by the generated
|
|
25
|
+
* type, so nothing here is being taken away that the contract offered.
|
|
26
|
+
*/
|
|
27
|
+
return createElement(as, { ...rest, className: typographyParts.root, 'data-variant': variant }, children);
|
|
28
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { HTMLAttributes, ReactNode } from 'react';
|
|
2
|
+
export interface TypographyOwnProps {
|
|
3
|
+
/**
|
|
4
|
+
* `h1` — The line a landing page is built around, and there is one of them
|
|
5
|
+
* `h2` — A headline opening a major section of a long page
|
|
6
|
+
* `h3` — A section heading under an h1 and h2
|
|
7
|
+
* `h4` — A subsection heading, the first step below the extrabold the larger headings carry
|
|
8
|
+
* `h5` — A label over a group of cards, a list, or a short block of copy
|
|
9
|
+
* `subtitle` — A secondary title under a heading — a pricing plan's name, a sub-feature group
|
|
10
|
+
* `body-lg` — An introductory paragraph under a headline, a hero description, a section intro
|
|
11
|
+
* `body-md` — The default, and most of the copy on a page — feature descriptions, article text
|
|
12
|
+
* `body-sm` — De-emphasised copy: legal lines, disclaimers, help text
|
|
13
|
+
* `eyebrow` — A category label above a headline — a section tag, a plan badge. Drawn in capitals by this component, so write it in the case it should be read in
|
|
14
|
+
* `figure` — A number that is the point of its block — a count, a total, a span of time — with a label under it
|
|
15
|
+
*/
|
|
16
|
+
variant?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'subtitle' | 'body-lg' | 'body-md' | 'body-sm' | 'eyebrow' | 'figure';
|
|
17
|
+
/**
|
|
18
|
+
* `p` — The default, and any block of prose
|
|
19
|
+
* `span` — Text inside a sentence, or inside something that is already a block
|
|
20
|
+
* `h1` — The page's one document-level heading
|
|
21
|
+
* `h2` — A section heading
|
|
22
|
+
* `h3` — A heading under an h2
|
|
23
|
+
* `h4` — A heading under an h3
|
|
24
|
+
* `h5` — A heading under an h4
|
|
25
|
+
* `h6` — The deepest heading level
|
|
26
|
+
*/
|
|
27
|
+
as?: 'p' | 'span' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
|
|
28
|
+
/** Allowed: text */
|
|
29
|
+
children: ReactNode;
|
|
30
|
+
}
|
|
31
|
+
export type TypographyProps = TypographyOwnProps & Omit<HTMLAttributes<HTMLElement>, 'className' | 'variant' | 'as'>;
|
|
32
|
+
/** The class each part carries. Apply these — do not retype them. */
|
|
33
|
+
export declare const typographyParts: {
|
|
34
|
+
readonly root: "dds-typography";
|
|
35
|
+
};
|
|
36
|
+
/** Generated so defaults cannot drift from the contract. */
|
|
37
|
+
export declare const typographyDefaults: {
|
|
38
|
+
readonly variant: "body-md";
|
|
39
|
+
readonly as: "p";
|
|
40
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// GENERATED from typography.contract.json. Do not edit.
|
|
2
|
+
/** The class each part carries. Apply these — do not retype them. */
|
|
3
|
+
export const typographyParts = {
|
|
4
|
+
root: 'dds-typography',
|
|
5
|
+
};
|
|
6
|
+
/** Generated so defaults cannot drift from the contract. */
|
|
7
|
+
export const typographyDefaults = { variant: 'body-md', as: 'p' };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A CSS time, read as milliseconds.
|
|
3
|
+
*
|
|
4
|
+
* `Element.animate` takes a number and reads it as milliseconds. A custom property holds a CSS
|
|
5
|
+
* time, which carries its unit, and the two are equal only by accident: the same token arrives
|
|
6
|
+
* here as `400ms` from a dev server and as `.4s` once a minifier has been over it, because a
|
|
7
|
+
* minifier is free to pick whichever spelling is shorter and both mean the same thing to CSS.
|
|
8
|
+
*
|
|
9
|
+
* Reading the number alone and handing it to `animate` therefore worked in development and failed
|
|
10
|
+
* in every production build — `.4s` parsed to `0.4`, the keyframes ran for four tenths of a
|
|
11
|
+
* millisecond, and everything they moved snapped into place instead of travelling. Nothing looked
|
|
12
|
+
* broken: the animation was running, correct in every other respect, and over before a frame could
|
|
13
|
+
* show it. It survived a build that is byte-identical from a clean checkout, a passing test suite,
|
|
14
|
+
* and every check this repo runs, because none of them watch a transition happen.
|
|
15
|
+
*
|
|
16
|
+
* So the unit is read rather than assumed. `ms` is tested before `s`, since `ms` ends in one.
|
|
17
|
+
* A value this cannot make sense of returns `null` rather than a guess, leaving the caller to say
|
|
18
|
+
* what it wants when the role is missing — a number here would be this file inventing timing.
|
|
19
|
+
*/
|
|
20
|
+
export declare function milliseconds(value: string): number | null;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A CSS time, read as milliseconds.
|
|
3
|
+
*
|
|
4
|
+
* `Element.animate` takes a number and reads it as milliseconds. A custom property holds a CSS
|
|
5
|
+
* time, which carries its unit, and the two are equal only by accident: the same token arrives
|
|
6
|
+
* here as `400ms` from a dev server and as `.4s` once a minifier has been over it, because a
|
|
7
|
+
* minifier is free to pick whichever spelling is shorter and both mean the same thing to CSS.
|
|
8
|
+
*
|
|
9
|
+
* Reading the number alone and handing it to `animate` therefore worked in development and failed
|
|
10
|
+
* in every production build — `.4s` parsed to `0.4`, the keyframes ran for four tenths of a
|
|
11
|
+
* millisecond, and everything they moved snapped into place instead of travelling. Nothing looked
|
|
12
|
+
* broken: the animation was running, correct in every other respect, and over before a frame could
|
|
13
|
+
* show it. It survived a build that is byte-identical from a clean checkout, a passing test suite,
|
|
14
|
+
* and every check this repo runs, because none of them watch a transition happen.
|
|
15
|
+
*
|
|
16
|
+
* So the unit is read rather than assumed. `ms` is tested before `s`, since `ms` ends in one.
|
|
17
|
+
* A value this cannot make sense of returns `null` rather than a guess, leaving the caller to say
|
|
18
|
+
* what it wants when the role is missing — a number here would be this file inventing timing.
|
|
19
|
+
*/
|
|
20
|
+
export function milliseconds(value) {
|
|
21
|
+
const time = value.trim();
|
|
22
|
+
const amount = Number.parseFloat(time);
|
|
23
|
+
if (!Number.isFinite(amount))
|
|
24
|
+
return null;
|
|
25
|
+
if (/ms$/i.test(time))
|
|
26
|
+
return amount;
|
|
27
|
+
if (/s$/i.test(time))
|
|
28
|
+
return amount * 1000;
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a string prop was supplied, for the props whose presence is the switch.
|
|
3
|
+
*
|
|
4
|
+
* Absence is the switch — which means an empty string has to count as absent,
|
|
5
|
+
* and so does whitespace.
|
|
6
|
+
*/
|
|
7
|
+
export declare function given(value: string | undefined): boolean;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a string prop was supplied, for the props whose presence is the switch.
|
|
3
|
+
*
|
|
4
|
+
* Absence is the switch — which means an empty string has to count as absent,
|
|
5
|
+
* and so does whitespace.
|
|
6
|
+
*/
|
|
7
|
+
export function given(value) {
|
|
8
|
+
return value !== undefined && value.trim() !== '';
|
|
9
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type PointerEvent as ReactPointerEvent } from 'react';
|
|
2
|
+
export interface HoverOpen {
|
|
3
|
+
onPointerEnter: (event: ReactPointerEvent<HTMLElement>) => void;
|
|
4
|
+
onPointerLeave: (event: ReactPointerEvent<HTMLElement>) => void;
|
|
5
|
+
/** Called when a press takes over: the pointer's intention is no longer the one in force. */
|
|
6
|
+
release: () => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Opening on hover, where hovering is something a reader can do.
|
|
10
|
+
*
|
|
11
|
+
* Shared because two components in this package want the identical behaviour and the behaviour is
|
|
12
|
+
* subtle in three separate ways — each of which has already been got wrong once. A second copy
|
|
13
|
+
* would be a second place to fix them, and the copies would agree only until one of them was
|
|
14
|
+
* touched.
|
|
15
|
+
*
|
|
16
|
+
* `pointerType === 'mouse'`, because a tap fires this too: a touch reports `touch` and a stylus
|
|
17
|
+
* `pen`, so asking the event what kind of pointer it is answers per gesture rather than per device
|
|
18
|
+
* — the only answer that holds on a laptop with a touchscreen, where a media query has to commit to
|
|
19
|
+
* one for the whole session.
|
|
20
|
+
*
|
|
21
|
+
* Only what hover opened may be closed by hover. Opened from the keyboard and then brushed by a
|
|
22
|
+
* mouse on its way elsewhere, a menu would otherwise close under a reader who never asked — the
|
|
23
|
+
* pointer leaving says nothing about a reader who is not using one.
|
|
24
|
+
*
|
|
25
|
+
* And a pending close is dropped the moment the thing closes for any other reason. Crossing from
|
|
26
|
+
* one menu to the next is two events in order: this one's leave, which arms a close, and the next
|
|
27
|
+
* one's enter, which opens it — and a bar holding one open at a time closes this one on the spot.
|
|
28
|
+
* The armed timer then reports `false` for something already shut, which a governing parent reads
|
|
29
|
+
* as "nothing is open", and the menu the reader actually moved to closes under them.
|
|
30
|
+
*
|
|
31
|
+
* Hover opens; it does not take over. Whatever this is attached to stays a button: Enter and Space
|
|
32
|
+
* work where no pointer exists at all, and the press still toggles for a reader who uses both.
|
|
33
|
+
*/
|
|
34
|
+
export declare function useHoverOpen(enabled: boolean, open: boolean, setOpen: (next: boolean) => void): HoverOpen;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* How long a surface waits before a pointer that has left it is believed.
|
|
5
|
+
*
|
|
6
|
+
* What opens on hover hangs a step below what opened it, and that step is real estate the pointer
|
|
7
|
+
* has to cross: for those few pixels it is over neither, which the DOM reports as having left
|
|
8
|
+
* entirely. Closing on that would make the panel unreachable by the one gesture that opened it.
|
|
9
|
+
*
|
|
10
|
+
* A constant rather than a token, which is worth naming rather than hiding. `motion.duration.*`
|
|
11
|
+
* holds how long things take to move; this is how long a component waits before believing an
|
|
12
|
+
* intention, and reading a duration role for it would tie the two together — retuning an animation
|
|
13
|
+
* would change how forgiving a menu is, which is not a relationship anybody would predict from
|
|
14
|
+
* either name.
|
|
15
|
+
*/
|
|
16
|
+
const GRACE_MS = 150;
|
|
17
|
+
/**
|
|
18
|
+
* Opening on hover, where hovering is something a reader can do.
|
|
19
|
+
*
|
|
20
|
+
* Shared because two components in this package want the identical behaviour and the behaviour is
|
|
21
|
+
* subtle in three separate ways — each of which has already been got wrong once. A second copy
|
|
22
|
+
* would be a second place to fix them, and the copies would agree only until one of them was
|
|
23
|
+
* touched.
|
|
24
|
+
*
|
|
25
|
+
* `pointerType === 'mouse'`, because a tap fires this too: a touch reports `touch` and a stylus
|
|
26
|
+
* `pen`, so asking the event what kind of pointer it is answers per gesture rather than per device
|
|
27
|
+
* — the only answer that holds on a laptop with a touchscreen, where a media query has to commit to
|
|
28
|
+
* one for the whole session.
|
|
29
|
+
*
|
|
30
|
+
* Only what hover opened may be closed by hover. Opened from the keyboard and then brushed by a
|
|
31
|
+
* mouse on its way elsewhere, a menu would otherwise close under a reader who never asked — the
|
|
32
|
+
* pointer leaving says nothing about a reader who is not using one.
|
|
33
|
+
*
|
|
34
|
+
* And a pending close is dropped the moment the thing closes for any other reason. Crossing from
|
|
35
|
+
* one menu to the next is two events in order: this one's leave, which arms a close, and the next
|
|
36
|
+
* one's enter, which opens it — and a bar holding one open at a time closes this one on the spot.
|
|
37
|
+
* The armed timer then reports `false` for something already shut, which a governing parent reads
|
|
38
|
+
* as "nothing is open", and the menu the reader actually moved to closes under them.
|
|
39
|
+
*
|
|
40
|
+
* Hover opens; it does not take over. Whatever this is attached to stays a button: Enter and Space
|
|
41
|
+
* work where no pointer exists at all, and the press still toggles for a reader who uses both.
|
|
42
|
+
*/
|
|
43
|
+
export function useHoverOpen(enabled, open, setOpen) {
|
|
44
|
+
const timer = useRef(undefined);
|
|
45
|
+
const opened = useRef(false);
|
|
46
|
+
const cancel = useCallback(() => {
|
|
47
|
+
if (timer.current === undefined)
|
|
48
|
+
return;
|
|
49
|
+
window.clearTimeout(timer.current);
|
|
50
|
+
timer.current = undefined;
|
|
51
|
+
}, []);
|
|
52
|
+
// A pending close outlives the element without this: the callback would run against something
|
|
53
|
+
// unmounted, and in controlled use would report a state change for a menu its owner no longer has.
|
|
54
|
+
useEffect(() => cancel, [cancel]);
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
if (open)
|
|
57
|
+
return;
|
|
58
|
+
opened.current = false;
|
|
59
|
+
cancel();
|
|
60
|
+
}, [open, cancel]);
|
|
61
|
+
const release = useCallback(() => {
|
|
62
|
+
opened.current = false;
|
|
63
|
+
cancel();
|
|
64
|
+
}, [cancel]);
|
|
65
|
+
return {
|
|
66
|
+
onPointerEnter: (event) => {
|
|
67
|
+
if (!enabled || event.pointerType !== 'mouse')
|
|
68
|
+
return;
|
|
69
|
+
// Back inside before the grace ran out — the pointer was crossing the gap, not leaving.
|
|
70
|
+
cancel();
|
|
71
|
+
if (open)
|
|
72
|
+
return;
|
|
73
|
+
opened.current = true;
|
|
74
|
+
setOpen(true);
|
|
75
|
+
},
|
|
76
|
+
onPointerLeave: (event) => {
|
|
77
|
+
if (!enabled || event.pointerType !== 'mouse')
|
|
78
|
+
return;
|
|
79
|
+
if (!open || !opened.current)
|
|
80
|
+
return;
|
|
81
|
+
cancel();
|
|
82
|
+
timer.current = window.setTimeout(() => {
|
|
83
|
+
timer.current = undefined;
|
|
84
|
+
opened.current = false;
|
|
85
|
+
setOpen(false);
|
|
86
|
+
}, GRACE_MS);
|
|
87
|
+
},
|
|
88
|
+
release,
|
|
89
|
+
};
|
|
90
|
+
}
|