@lidofinance/lido-app-ui 1.13.0 → 1.14.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/README.md +85 -19
- package/dist/README.md +85 -19
- package/dist/cjs/accordion/Accordion.cjs +1 -0
- package/dist/cjs/accordion/Accordion.cjs.map +1 -1
- package/dist/cjs/badge/Badge.cjs +1 -0
- package/dist/cjs/badge/Badge.cjs.map +1 -1
- package/dist/cjs/banner/Banner.cjs +1 -0
- package/dist/cjs/banner/Banner.cjs.map +1 -1
- package/dist/cjs/breadcrumbs/Breadcrumbs.cjs +55 -26
- package/dist/cjs/breadcrumbs/Breadcrumbs.cjs.map +1 -1
- package/dist/cjs/breadcrumbs/Breadcrumbs.module.css.cjs +1 -1
- package/dist/cjs/button/Button.cjs +14 -23
- package/dist/cjs/button/Button.cjs.map +1 -1
- package/dist/cjs/button/ButtonContent.cjs +50 -0
- package/dist/cjs/button/ButtonContent.cjs.map +1 -0
- package/dist/cjs/button/LinkButton.cjs +46 -0
- package/dist/cjs/button/LinkButton.cjs.map +1 -0
- package/dist/cjs/card/Card.cjs +1 -0
- package/dist/cjs/card/Card.cjs.map +1 -1
- package/dist/cjs/checkbox/Checkbox.cjs +1 -0
- package/dist/cjs/checkbox/Checkbox.cjs.map +1 -1
- package/dist/cjs/counter/Counter.cjs +6 -2
- package/dist/cjs/counter/Counter.cjs.map +1 -1
- package/dist/cjs/counter/CounterSlot.cjs +19 -2
- package/dist/cjs/counter/CounterSlot.cjs.map +1 -1
- package/dist/cjs/counter/CounterSlot.module.css.cjs +1 -1
- package/dist/cjs/data-list/DataList.cjs +1 -0
- package/dist/cjs/data-list/DataList.cjs.map +1 -1
- package/dist/cjs/data-list/DataListRow.cjs +2 -0
- package/dist/cjs/data-list/DataListRow.cjs.map +1 -1
- package/dist/cjs/disclaimer/Disclaimer.cjs +10 -3
- package/dist/cjs/disclaimer/Disclaimer.cjs.map +1 -1
- package/dist/cjs/divider/Divider.cjs +5 -0
- package/dist/cjs/divider/Divider.cjs.map +1 -1
- package/dist/cjs/error-page/ErrorPage.cjs +14 -7
- package/dist/cjs/error-page/ErrorPage.cjs.map +1 -1
- package/dist/cjs/footer/Footer.cjs +10 -2
- package/dist/cjs/footer/Footer.cjs.map +1 -1
- package/dist/cjs/grid/Grid.cjs +7 -3
- package/dist/cjs/grid/Grid.cjs.map +1 -1
- package/dist/cjs/grid/Grid.module.css.cjs +1 -1
- package/dist/cjs/grid/GridItem.cjs +2 -0
- package/dist/cjs/grid/GridItem.cjs.map +1 -1
- package/dist/cjs/header/Header.cjs +10 -2
- package/dist/cjs/header/Header.cjs.map +1 -1
- package/dist/cjs/header/HeaderNav.cjs +33 -21
- package/dist/cjs/header/HeaderNav.cjs.map +1 -1
- package/dist/cjs/header/HeaderNav.module.css.cjs +1 -1
- package/dist/cjs/hidden/Hidden.cjs +10 -4
- package/dist/cjs/hidden/Hidden.cjs.map +1 -1
- package/dist/cjs/hooks/Portal.cjs +14 -11
- package/dist/cjs/hooks/Portal.cjs.map +1 -1
- package/dist/cjs/hooks/useBodyScrollLock.cjs +49 -13
- package/dist/cjs/hooks/useBodyScrollLock.cjs.map +1 -1
- package/dist/cjs/hooks/useEdgeFade.cjs +60 -0
- package/dist/cjs/hooks/useEdgeFade.cjs.map +1 -0
- package/dist/cjs/hooks/useEscape.cjs +8 -5
- package/dist/cjs/hooks/useEscape.cjs.map +1 -1
- package/dist/cjs/hooks/useFocusTrap.cjs +61 -24
- package/dist/cjs/hooks/useFocusTrap.cjs.map +1 -1
- package/dist/cjs/hooks/useHideOthers.cjs +51 -0
- package/dist/cjs/hooks/useHideOthers.cjs.map +1 -0
- package/dist/cjs/hooks/useOutsideClick.cjs +31 -4
- package/dist/cjs/hooks/useOutsideClick.cjs.map +1 -1
- package/dist/cjs/icon-button/IconButton.cjs +4 -0
- package/dist/cjs/icon-button/IconButton.cjs.map +1 -1
- package/dist/cjs/icons/TokenIcon.cjs +2 -0
- package/dist/cjs/icons/TokenIcon.cjs.map +1 -1
- package/dist/cjs/identicon/Identicon.cjs +2 -0
- package/dist/cjs/identicon/Identicon.cjs.map +1 -1
- package/dist/cjs/index.cjs +32 -4
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.css +12 -4
- package/dist/cjs/input/Input.cjs +1 -0
- package/dist/cjs/input/Input.cjs.map +1 -1
- package/dist/cjs/link-provider/Anchor.cjs +23 -2
- package/dist/cjs/link-provider/Anchor.cjs.map +1 -1
- package/dist/cjs/link-provider/LinkProvider.cjs +1 -1
- package/dist/cjs/link-provider/LinkProvider.cjs.map +1 -1
- package/dist/cjs/logo/Logo.cjs +8 -0
- package/dist/cjs/logo/Logo.cjs.map +1 -1
- package/dist/cjs/message-box/MessageBox.cjs +1 -0
- package/dist/cjs/message-box/MessageBox.cjs.map +1 -1
- package/dist/cjs/modal/Modal.cjs +71 -9
- package/dist/cjs/modal/Modal.cjs.map +1 -1
- package/dist/cjs/nav-link/NavLink.cjs +6 -4
- package/dist/cjs/nav-link/NavLink.cjs.map +1 -1
- package/dist/cjs/notification/Notification.cjs +12 -6
- package/dist/cjs/notification/Notification.cjs.map +1 -1
- package/dist/cjs/page-layout/Layout.cjs +25 -0
- package/dist/cjs/page-layout/Layout.cjs.map +1 -0
- package/dist/cjs/page-layout/Layout.module.css.cjs +6 -0
- package/dist/cjs/page-layout/Layout.module.css.cjs.map +1 -0
- package/dist/cjs/page-layout/Main.cjs +29 -0
- package/dist/cjs/page-layout/Main.cjs.map +1 -0
- package/dist/cjs/page-layout/Main.module.css.cjs +6 -0
- package/dist/cjs/page-layout/Main.module.css.cjs.map +1 -0
- package/dist/cjs/page-layout/PageContent.cjs +22 -0
- package/dist/cjs/page-layout/PageContent.cjs.map +1 -0
- package/dist/cjs/page-layout/PageContent.module.css.cjs +6 -0
- package/dist/cjs/page-layout/PageContent.module.css.cjs.map +1 -0
- package/dist/cjs/pagination/Pagination.cjs +11 -6
- package/dist/cjs/pagination/Pagination.cjs.map +1 -1
- package/dist/cjs/popover/Popover.cjs +71 -15
- package/dist/cjs/popover/Popover.cjs.map +1 -1
- package/dist/cjs/radio-button/RadioButton.cjs +1 -0
- package/dist/cjs/radio-button/RadioButton.cjs.map +1 -1
- package/dist/cjs/rich-input/RichInput.cjs +18 -39
- package/dist/cjs/rich-input/RichInput.cjs.map +1 -1
- package/dist/cjs/rich-input/RichInput.module.css.cjs +1 -1
- package/dist/cjs/section-title/SectionTitle.cjs +1 -0
- package/dist/cjs/section-title/SectionTitle.cjs.map +1 -1
- package/dist/cjs/segmented-control/SegmentedControl.cjs +1 -0
- package/dist/cjs/segmented-control/SegmentedControl.cjs.map +1 -1
- package/dist/cjs/segmented-control/SegmentedControlCard.cjs +1 -0
- package/dist/cjs/segmented-control/SegmentedControlCard.cjs.map +1 -1
- package/dist/cjs/sidebar/Sidebar.cjs +11 -4
- package/dist/cjs/sidebar/Sidebar.cjs.map +1 -1
- package/dist/cjs/sidebar/SidebarToggle.cjs +1 -1
- package/dist/cjs/sidebar/SidebarToggle.cjs.map +1 -1
- package/dist/cjs/skeleton/Skeleton.cjs +18 -20
- package/dist/cjs/skeleton/Skeleton.cjs.map +1 -1
- package/dist/cjs/skip-link/SkipLink.cjs +52 -0
- package/dist/cjs/skip-link/SkipLink.cjs.map +1 -0
- package/dist/cjs/skip-link/SkipLink.module.css.cjs +6 -0
- package/dist/cjs/skip-link/SkipLink.module.css.cjs.map +1 -0
- package/dist/cjs/slider/Slider.cjs +1 -0
- package/dist/cjs/slider/Slider.cjs.map +1 -1
- package/dist/cjs/small-card/SmallCard.cjs +6 -2
- package/dist/cjs/small-card/SmallCard.cjs.map +1 -1
- package/dist/cjs/stack/Stack.cjs +27 -7
- package/dist/cjs/stack/Stack.cjs.map +1 -1
- package/dist/cjs/stack/Stack.module.css.cjs +1 -1
- package/dist/cjs/stat-item/StatItem.cjs +1 -0
- package/dist/cjs/stat-item/StatItem.cjs.map +1 -1
- package/dist/cjs/switch/Switch.cjs +1 -0
- package/dist/cjs/switch/Switch.cjs.map +1 -1
- package/dist/cjs/tabs/Tabs.cjs +1 -0
- package/dist/cjs/tabs/Tabs.cjs.map +1 -1
- package/dist/cjs/tag/Tag.cjs +73 -8
- package/dist/cjs/tag/Tag.cjs.map +1 -1
- package/dist/cjs/tag/Tag.module.css.cjs +1 -1
- package/dist/cjs/text-link/TextLink.cjs +10 -13
- package/dist/cjs/text-link/TextLink.cjs.map +1 -1
- package/dist/cjs/text-link/TextLink.module.css.cjs +1 -1
- package/dist/cjs/theme-switcher/ThemeSwitcher.cjs +13 -5
- package/dist/cjs/theme-switcher/ThemeSwitcher.cjs.map +1 -1
- package/dist/cjs/theme-switcher/ThemeSwitcher.module.css.cjs +6 -0
- package/dist/cjs/theme-switcher/ThemeSwitcher.module.css.cjs.map +1 -0
- package/dist/cjs/token-amount/TokenAmount.cjs +1 -0
- package/dist/cjs/token-amount/TokenAmount.cjs.map +1 -1
- package/dist/cjs/token-selector/TokenSelector.cjs +56 -64
- package/dist/cjs/token-selector/TokenSelector.cjs.map +1 -1
- package/dist/cjs/tooltip/Tooltip.cjs +42 -27
- package/dist/cjs/tooltip/Tooltip.cjs.map +1 -1
- package/dist/cjs/tx-status/TxStatus.cjs +2 -0
- package/dist/cjs/tx-status/TxStatus.cjs.map +1 -1
- package/dist/cjs/typography/Typography.cjs +2 -0
- package/dist/cjs/typography/Typography.cjs.map +1 -1
- package/dist/cjs/utils/ActionElement.cjs +2 -13
- package/dist/cjs/utils/ActionElement.cjs.map +1 -1
- package/dist/cjs/utils/breakpoints.cjs +26 -0
- package/dist/cjs/utils/breakpoints.cjs.map +1 -0
- package/dist/cjs/utils/responsive.cjs +19 -30
- package/dist/cjs/utils/responsive.cjs.map +1 -1
- package/dist/esm/accordion/Accordion.mjs +1 -0
- package/dist/esm/accordion/Accordion.mjs.map +1 -1
- package/dist/esm/badge/Badge.mjs +1 -0
- package/dist/esm/badge/Badge.mjs.map +1 -1
- package/dist/esm/banner/Banner.mjs +1 -0
- package/dist/esm/banner/Banner.mjs.map +1 -1
- package/dist/esm/breadcrumbs/Breadcrumbs.mjs +56 -27
- package/dist/esm/breadcrumbs/Breadcrumbs.mjs.map +1 -1
- package/dist/esm/breadcrumbs/Breadcrumbs.module.css.mjs +1 -1
- package/dist/esm/button/Button.mjs +15 -24
- package/dist/esm/button/Button.mjs.map +1 -1
- package/dist/esm/button/ButtonContent.mjs +45 -0
- package/dist/esm/button/ButtonContent.mjs.map +1 -0
- package/dist/esm/button/LinkButton.mjs +42 -0
- package/dist/esm/button/LinkButton.mjs.map +1 -0
- package/dist/esm/card/Card.mjs +1 -0
- package/dist/esm/card/Card.mjs.map +1 -1
- package/dist/esm/checkbox/Checkbox.mjs +1 -0
- package/dist/esm/checkbox/Checkbox.mjs.map +1 -1
- package/dist/esm/counter/Counter.mjs +6 -2
- package/dist/esm/counter/Counter.mjs.map +1 -1
- package/dist/esm/counter/CounterSlot.mjs +19 -3
- package/dist/esm/counter/CounterSlot.mjs.map +1 -1
- package/dist/esm/counter/CounterSlot.module.css.mjs +1 -1
- package/dist/esm/data-list/DataList.mjs +1 -0
- package/dist/esm/data-list/DataList.mjs.map +1 -1
- package/dist/esm/data-list/DataListRow.mjs +2 -0
- package/dist/esm/data-list/DataListRow.mjs.map +1 -1
- package/dist/esm/disclaimer/Disclaimer.mjs +10 -3
- package/dist/esm/disclaimer/Disclaimer.mjs.map +1 -1
- package/dist/esm/divider/Divider.mjs +5 -0
- package/dist/esm/divider/Divider.mjs.map +1 -1
- package/dist/esm/error-page/ErrorPage.mjs +14 -7
- package/dist/esm/error-page/ErrorPage.mjs.map +1 -1
- package/dist/esm/footer/Footer.mjs +10 -2
- package/dist/esm/footer/Footer.mjs.map +1 -1
- package/dist/esm/grid/Grid.mjs +8 -4
- package/dist/esm/grid/Grid.mjs.map +1 -1
- package/dist/esm/grid/Grid.module.css.mjs +1 -1
- package/dist/esm/grid/GridItem.mjs +2 -0
- package/dist/esm/grid/GridItem.mjs.map +1 -1
- package/dist/esm/header/Header.mjs +10 -2
- package/dist/esm/header/Header.mjs.map +1 -1
- package/dist/esm/header/HeaderNav.mjs +34 -22
- package/dist/esm/header/HeaderNav.mjs.map +1 -1
- package/dist/esm/header/HeaderNav.module.css.mjs +1 -1
- package/dist/esm/hidden/Hidden.mjs +10 -4
- package/dist/esm/hidden/Hidden.mjs.map +1 -1
- package/dist/esm/hooks/Portal.mjs +16 -13
- package/dist/esm/hooks/Portal.mjs.map +1 -1
- package/dist/esm/hooks/useBodyScrollLock.mjs +49 -13
- package/dist/esm/hooks/useBodyScrollLock.mjs.map +1 -1
- package/dist/esm/hooks/useEdgeFade.mjs +56 -0
- package/dist/esm/hooks/useEdgeFade.mjs.map +1 -0
- package/dist/esm/hooks/useEscape.mjs +8 -5
- package/dist/esm/hooks/useEscape.mjs.map +1 -1
- package/dist/esm/hooks/useFocusTrap.mjs +61 -24
- package/dist/esm/hooks/useFocusTrap.mjs.map +1 -1
- package/dist/esm/hooks/useHideOthers.mjs +47 -0
- package/dist/esm/hooks/useHideOthers.mjs.map +1 -0
- package/dist/esm/hooks/useOutsideClick.mjs +31 -4
- package/dist/esm/hooks/useOutsideClick.mjs.map +1 -1
- package/dist/esm/icon-button/IconButton.mjs +4 -0
- package/dist/esm/icon-button/IconButton.mjs.map +1 -1
- package/dist/esm/icons/TokenIcon.mjs +2 -0
- package/dist/esm/icons/TokenIcon.mjs.map +1 -1
- package/dist/esm/identicon/Identicon.mjs +2 -0
- package/dist/esm/identicon/Identicon.mjs.map +1 -1
- package/dist/esm/index.css +12 -4
- package/dist/esm/index.mjs +13 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/input/Input.mjs +1 -0
- package/dist/esm/input/Input.mjs.map +1 -1
- package/dist/esm/link-provider/Anchor.mjs +23 -2
- package/dist/esm/link-provider/Anchor.mjs.map +1 -1
- package/dist/esm/link-provider/LinkProvider.mjs +1 -1
- package/dist/esm/link-provider/LinkProvider.mjs.map +1 -1
- package/dist/esm/logo/Logo.mjs +9 -1
- package/dist/esm/logo/Logo.mjs.map +1 -1
- package/dist/esm/message-box/MessageBox.mjs +1 -0
- package/dist/esm/message-box/MessageBox.mjs.map +1 -1
- package/dist/esm/modal/Modal.mjs +72 -11
- package/dist/esm/modal/Modal.mjs.map +1 -1
- package/dist/esm/nav-link/NavLink.mjs +6 -4
- package/dist/esm/nav-link/NavLink.mjs.map +1 -1
- package/dist/esm/notification/Notification.mjs +13 -7
- package/dist/esm/notification/Notification.mjs.map +1 -1
- package/dist/esm/page-layout/Layout.mjs +21 -0
- package/dist/esm/page-layout/Layout.mjs.map +1 -0
- package/dist/esm/page-layout/Layout.module.css.mjs +4 -0
- package/dist/esm/page-layout/Layout.module.css.mjs.map +1 -0
- package/dist/esm/page-layout/Main.mjs +24 -0
- package/dist/esm/page-layout/Main.mjs.map +1 -0
- package/dist/esm/page-layout/Main.module.css.mjs +4 -0
- package/dist/esm/page-layout/Main.module.css.mjs.map +1 -0
- package/dist/esm/page-layout/PageContent.mjs +18 -0
- package/dist/esm/page-layout/PageContent.mjs.map +1 -0
- package/dist/esm/page-layout/PageContent.module.css.mjs +4 -0
- package/dist/esm/page-layout/PageContent.module.css.mjs.map +1 -0
- package/dist/esm/pagination/Pagination.mjs +12 -7
- package/dist/esm/pagination/Pagination.mjs.map +1 -1
- package/dist/esm/popover/Popover.mjs +72 -16
- package/dist/esm/popover/Popover.mjs.map +1 -1
- package/dist/esm/radio-button/RadioButton.mjs +1 -0
- package/dist/esm/radio-button/RadioButton.mjs.map +1 -1
- package/dist/esm/rich-input/RichInput.mjs +19 -40
- package/dist/esm/rich-input/RichInput.mjs.map +1 -1
- package/dist/esm/rich-input/RichInput.module.css.mjs +1 -1
- package/dist/esm/section-title/SectionTitle.mjs +1 -0
- package/dist/esm/section-title/SectionTitle.mjs.map +1 -1
- package/dist/esm/segmented-control/SegmentedControl.mjs +1 -0
- package/dist/esm/segmented-control/SegmentedControl.mjs.map +1 -1
- package/dist/esm/segmented-control/SegmentedControlCard.mjs +1 -0
- package/dist/esm/segmented-control/SegmentedControlCard.mjs.map +1 -1
- package/dist/esm/sidebar/Sidebar.mjs +11 -4
- package/dist/esm/sidebar/Sidebar.mjs.map +1 -1
- package/dist/esm/sidebar/SidebarToggle.mjs +1 -1
- package/dist/esm/sidebar/SidebarToggle.mjs.map +1 -1
- package/dist/esm/skeleton/Skeleton.mjs +18 -20
- package/dist/esm/skeleton/Skeleton.mjs.map +1 -1
- package/dist/esm/skip-link/SkipLink.mjs +48 -0
- package/dist/esm/skip-link/SkipLink.mjs.map +1 -0
- package/dist/esm/skip-link/SkipLink.module.css.mjs +4 -0
- package/dist/esm/skip-link/SkipLink.module.css.mjs.map +1 -0
- package/dist/esm/slider/Slider.mjs +1 -0
- package/dist/esm/slider/Slider.mjs.map +1 -1
- package/dist/esm/small-card/SmallCard.mjs +6 -2
- package/dist/esm/small-card/SmallCard.mjs.map +1 -1
- package/dist/esm/stack/Stack.mjs +28 -9
- package/dist/esm/stack/Stack.mjs.map +1 -1
- package/dist/esm/stack/Stack.module.css.mjs +1 -1
- package/dist/esm/stat-item/StatItem.mjs +1 -0
- package/dist/esm/stat-item/StatItem.mjs.map +1 -1
- package/dist/esm/switch/Switch.mjs +1 -0
- package/dist/esm/switch/Switch.mjs.map +1 -1
- package/dist/esm/tabs/Tabs.mjs +1 -0
- package/dist/esm/tabs/Tabs.mjs.map +1 -1
- package/dist/esm/tag/Tag.mjs +74 -9
- package/dist/esm/tag/Tag.mjs.map +1 -1
- package/dist/esm/tag/Tag.module.css.mjs +1 -1
- package/dist/esm/text-link/TextLink.mjs +10 -13
- package/dist/esm/text-link/TextLink.mjs.map +1 -1
- package/dist/esm/text-link/TextLink.module.css.mjs +1 -1
- package/dist/esm/theme-switcher/ThemeSwitcher.mjs +14 -6
- package/dist/esm/theme-switcher/ThemeSwitcher.mjs.map +1 -1
- package/dist/esm/theme-switcher/ThemeSwitcher.module.css.mjs +4 -0
- package/dist/esm/theme-switcher/ThemeSwitcher.module.css.mjs.map +1 -0
- package/dist/esm/token-amount/TokenAmount.mjs +1 -0
- package/dist/esm/token-amount/TokenAmount.mjs.map +1 -1
- package/dist/esm/token-selector/TokenSelector.mjs +58 -66
- package/dist/esm/token-selector/TokenSelector.mjs.map +1 -1
- package/dist/esm/tooltip/Tooltip.mjs +42 -27
- package/dist/esm/tooltip/Tooltip.mjs.map +1 -1
- package/dist/esm/tx-status/TxStatus.mjs +2 -0
- package/dist/esm/tx-status/TxStatus.mjs.map +1 -1
- package/dist/esm/typography/Typography.mjs +2 -0
- package/dist/esm/typography/Typography.mjs.map +1 -1
- package/dist/esm/utils/ActionElement.mjs +2 -13
- package/dist/esm/utils/ActionElement.mjs.map +1 -1
- package/dist/esm/utils/breakpoints.mjs +19 -0
- package/dist/esm/utils/breakpoints.mjs.map +1 -0
- package/dist/esm/utils/responsive.mjs +17 -27
- package/dist/esm/utils/responsive.mjs.map +1 -1
- package/dist/index.css +12 -4
- package/dist/styles/breakpoints.css +16 -12
- package/dist/styles/typography-mixins.css +8 -0
- package/dist/types/accordion/Accordion.d.ts +3 -0
- package/dist/types/accordion/Accordion.d.ts.map +1 -1
- package/dist/types/badge/Badge.d.ts +1 -0
- package/dist/types/badge/Badge.d.ts.map +1 -1
- package/dist/types/banner/Banner.d.ts +1 -0
- package/dist/types/banner/Banner.d.ts.map +1 -1
- package/dist/types/breadcrumbs/Breadcrumbs.d.ts +17 -1
- package/dist/types/breadcrumbs/Breadcrumbs.d.ts.map +1 -1
- package/dist/types/breadcrumbs/index.d.ts +1 -1
- package/dist/types/breadcrumbs/index.d.ts.map +1 -1
- package/dist/types/button/Button.d.ts +6 -26
- package/dist/types/button/Button.d.ts.map +1 -1
- package/dist/types/button/ButtonContent.d.ts +10 -0
- package/dist/types/button/ButtonContent.d.ts.map +1 -0
- package/dist/types/button/LinkButton.d.ts +10 -0
- package/dist/types/button/LinkButton.d.ts.map +1 -0
- package/dist/types/button/index.d.ts +2 -0
- package/dist/types/button/index.d.ts.map +1 -1
- package/dist/types/button/types.d.ts +26 -0
- package/dist/types/button/types.d.ts.map +1 -0
- package/dist/types/card/Card.d.ts +1 -0
- package/dist/types/card/Card.d.ts.map +1 -1
- package/dist/types/checkbox/Checkbox.d.ts +3 -0
- package/dist/types/checkbox/Checkbox.d.ts.map +1 -1
- package/dist/types/colors/colorTokens.d.ts.map +1 -1
- package/dist/types/counter/Counter.d.ts +6 -2
- package/dist/types/counter/Counter.d.ts.map +1 -1
- package/dist/types/counter/CounterSlot.d.ts +3 -0
- package/dist/types/counter/CounterSlot.d.ts.map +1 -1
- package/dist/types/data-list/DataList.d.ts +1 -0
- package/dist/types/data-list/DataList.d.ts.map +1 -1
- package/dist/types/data-list/DataListRow.d.ts +1 -0
- package/dist/types/data-list/DataListRow.d.ts.map +1 -1
- package/dist/types/disclaimer/Disclaimer.d.ts +9 -2
- package/dist/types/disclaimer/Disclaimer.d.ts.map +1 -1
- package/dist/types/divider/Divider.d.ts +5 -0
- package/dist/types/divider/Divider.d.ts.map +1 -1
- package/dist/types/divider/index.d.ts +1 -1
- package/dist/types/divider/index.d.ts.map +1 -1
- package/dist/types/error-page/ErrorPage.d.ts +17 -4
- package/dist/types/error-page/ErrorPage.d.ts.map +1 -1
- package/dist/types/footer/Footer.d.ts +17 -2
- package/dist/types/footer/Footer.d.ts.map +1 -1
- package/dist/types/footer/index.d.ts +1 -1
- package/dist/types/footer/index.d.ts.map +1 -1
- package/dist/types/grid/Grid.d.ts +21 -22
- package/dist/types/grid/Grid.d.ts.map +1 -1
- package/dist/types/grid/GridItem.d.ts +14 -10
- package/dist/types/grid/GridItem.d.ts.map +1 -1
- package/dist/types/grid/index.d.ts +2 -2
- package/dist/types/grid/index.d.ts.map +1 -1
- package/dist/types/header/Header.d.ts +15 -2
- package/dist/types/header/Header.d.ts.map +1 -1
- package/dist/types/header/HeaderNav.d.ts +10 -2
- package/dist/types/header/HeaderNav.d.ts.map +1 -1
- package/dist/types/header/index.d.ts +2 -2
- package/dist/types/header/index.d.ts.map +1 -1
- package/dist/types/hidden/Hidden.d.ts +20 -6
- package/dist/types/hidden/Hidden.d.ts.map +1 -1
- package/dist/types/hidden/index.d.ts +1 -1
- package/dist/types/hidden/index.d.ts.map +1 -1
- package/dist/types/hooks/Portal.d.ts +2 -5
- package/dist/types/hooks/Portal.d.ts.map +1 -1
- package/dist/types/hooks/index.d.ts +2 -0
- package/dist/types/hooks/index.d.ts.map +1 -1
- package/dist/types/hooks/useBodyScrollLock.d.ts +4 -2
- package/dist/types/hooks/useBodyScrollLock.d.ts.map +1 -1
- package/dist/types/hooks/useEdgeFade.d.ts +7 -0
- package/dist/types/hooks/useEdgeFade.d.ts.map +1 -0
- package/dist/types/hooks/useEscape.d.ts +4 -2
- package/dist/types/hooks/useEscape.d.ts.map +1 -1
- package/dist/types/hooks/useFocusTrap.d.ts +7 -3
- package/dist/types/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/types/hooks/useHideOthers.d.ts +3 -0
- package/dist/types/hooks/useHideOthers.d.ts.map +1 -0
- package/dist/types/hooks/useOutsideClick.d.ts +4 -2
- package/dist/types/hooks/useOutsideClick.d.ts.map +1 -1
- package/dist/types/icon-button/IconButton.d.ts +15 -2
- package/dist/types/icon-button/IconButton.d.ts.map +1 -1
- package/dist/types/icons/TokenIcon.d.ts +1 -0
- package/dist/types/icons/TokenIcon.d.ts.map +1 -1
- package/dist/types/identicon/Identicon.d.ts +5 -0
- package/dist/types/identicon/Identicon.d.ts.map +1 -1
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/input/Input.d.ts +1 -0
- package/dist/types/input/Input.d.ts.map +1 -1
- package/dist/types/link-provider/Anchor.d.ts +17 -1
- package/dist/types/link-provider/Anchor.d.ts.map +1 -1
- package/dist/types/link-provider/LinkProvider.d.ts +8 -2
- package/dist/types/link-provider/LinkProvider.d.ts.map +1 -1
- package/dist/types/link-provider/index.d.ts +1 -1
- package/dist/types/link-provider/index.d.ts.map +1 -1
- package/dist/types/logo/Logo.d.ts +20 -3
- package/dist/types/logo/Logo.d.ts.map +1 -1
- package/dist/types/logo/index.d.ts +1 -1
- package/dist/types/logo/index.d.ts.map +1 -1
- package/dist/types/message-box/MessageBox.d.ts +3 -0
- package/dist/types/message-box/MessageBox.d.ts.map +1 -1
- package/dist/types/modal/Modal.d.ts +21 -3
- package/dist/types/modal/Modal.d.ts.map +1 -1
- package/dist/types/modal/index.d.ts +2 -2
- package/dist/types/modal/index.d.ts.map +1 -1
- package/dist/types/nav-link/NavLink.d.ts +17 -0
- package/dist/types/nav-link/NavLink.d.ts.map +1 -1
- package/dist/types/nav-link/index.d.ts +1 -1
- package/dist/types/nav-link/index.d.ts.map +1 -1
- package/dist/types/notification/Notification.d.ts +7 -2
- package/dist/types/notification/Notification.d.ts.map +1 -1
- package/dist/types/page-layout/Layout.d.ts +5 -0
- package/dist/types/page-layout/Layout.d.ts.map +1 -0
- package/dist/types/page-layout/Main.d.ts +6 -0
- package/dist/types/page-layout/Main.d.ts.map +1 -0
- package/dist/types/page-layout/PageContent.d.ts +7 -0
- package/dist/types/page-layout/PageContent.d.ts.map +1 -0
- package/dist/types/page-layout/index.d.ts +7 -0
- package/dist/types/page-layout/index.d.ts.map +1 -0
- package/dist/types/pagination/Pagination.d.ts +3 -0
- package/dist/types/pagination/Pagination.d.ts.map +1 -1
- package/dist/types/popover/Popover.d.ts +32 -4
- package/dist/types/popover/Popover.d.ts.map +1 -1
- package/dist/types/popover/index.d.ts +1 -1
- package/dist/types/popover/index.d.ts.map +1 -1
- package/dist/types/radio-button/RadioButton.d.ts +3 -0
- package/dist/types/radio-button/RadioButton.d.ts.map +1 -1
- package/dist/types/rich-input/RichInput.d.ts +8 -1
- package/dist/types/rich-input/RichInput.d.ts.map +1 -1
- package/dist/types/section-title/SectionTitle.d.ts +1 -0
- package/dist/types/section-title/SectionTitle.d.ts.map +1 -1
- package/dist/types/segmented-control/SegmentedControl.d.ts +1 -0
- package/dist/types/segmented-control/SegmentedControl.d.ts.map +1 -1
- package/dist/types/segmented-control/SegmentedControlCard.d.ts +1 -0
- package/dist/types/segmented-control/SegmentedControlCard.d.ts.map +1 -1
- package/dist/types/sidebar/Sidebar.d.ts +2 -2
- package/dist/types/sidebar/Sidebar.d.ts.map +1 -1
- package/dist/types/sidebar/SidebarToggle.d.ts +1 -1
- package/dist/types/skeleton/Skeleton.d.ts +17 -3
- package/dist/types/skeleton/Skeleton.d.ts.map +1 -1
- package/dist/types/skip-link/SkipLink.d.ts +11 -0
- package/dist/types/skip-link/SkipLink.d.ts.map +1 -0
- package/dist/types/skip-link/index.d.ts +3 -0
- package/dist/types/skip-link/index.d.ts.map +1 -0
- package/dist/types/slider/Slider.d.ts +1 -0
- package/dist/types/slider/Slider.d.ts.map +1 -1
- package/dist/types/small-card/SmallCard.d.ts +21 -2
- package/dist/types/small-card/SmallCard.d.ts.map +1 -1
- package/dist/types/stack/Stack.d.ts +24 -15
- package/dist/types/stack/Stack.d.ts.map +1 -1
- package/dist/types/stack/index.d.ts +1 -1
- package/dist/types/stack/index.d.ts.map +1 -1
- package/dist/types/stat-item/StatItem.d.ts +6 -0
- package/dist/types/stat-item/StatItem.d.ts.map +1 -1
- package/dist/types/switch/Switch.d.ts +3 -0
- package/dist/types/switch/Switch.d.ts.map +1 -1
- package/dist/types/tabs/Tabs.d.ts +1 -0
- package/dist/types/tabs/Tabs.d.ts.map +1 -1
- package/dist/types/tag/Tag.d.ts +31 -3
- package/dist/types/tag/Tag.d.ts.map +1 -1
- package/dist/types/text-link/TextLink.d.ts +25 -2
- package/dist/types/text-link/TextLink.d.ts.map +1 -1
- package/dist/types/text-link/index.d.ts +1 -1
- package/dist/types/text-link/index.d.ts.map +1 -1
- package/dist/types/theme-switcher/ThemeSwitcher.d.ts +9 -3
- package/dist/types/theme-switcher/ThemeSwitcher.d.ts.map +1 -1
- package/dist/types/token-amount/TokenAmount.d.ts +1 -0
- package/dist/types/token-amount/TokenAmount.d.ts.map +1 -1
- package/dist/types/token-selector/TokenSelector.d.ts +5 -1
- package/dist/types/token-selector/TokenSelector.d.ts.map +1 -1
- package/dist/types/tooltip/Tooltip.d.ts +2 -0
- package/dist/types/tooltip/Tooltip.d.ts.map +1 -1
- package/dist/types/tx-status/TxStatus.d.ts +3 -0
- package/dist/types/tx-status/TxStatus.d.ts.map +1 -1
- package/dist/types/typography/Typography.d.ts +4 -0
- package/dist/types/typography/Typography.d.ts.map +1 -1
- package/dist/types/utils/ActionElement.d.ts +4 -4
- package/dist/types/utils/ActionElement.d.ts.map +1 -1
- package/dist/types/utils/breakpoints.d.ts +16 -0
- package/dist/types/utils/breakpoints.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +5 -2
- package/dist/types/utils/index.d.ts.map +1 -1
- package/dist/types/utils/polymorphic.d.ts +15 -0
- package/dist/types/utils/polymorphic.d.ts.map +1 -0
- package/dist/types/utils/responsive.d.ts +29 -14
- package/dist/types/utils/responsive.d.ts.map +1 -1
- package/package.json +6 -2
|
@@ -17,13 +17,33 @@ const pickLink = (_ref, href, _ref2) => {
|
|
|
17
17
|
download
|
|
18
18
|
} = _ref2;
|
|
19
19
|
if (ABSOLUTE_URL.test(href)) return externalComponent;
|
|
20
|
-
if (href.startsWith('#') || target && target !== '_self' || download !==
|
|
20
|
+
if (href.startsWith('#') || target && target !== '_self' || download != null && download !== false) return undefined;
|
|
21
21
|
return component;
|
|
22
22
|
};
|
|
23
23
|
|
|
24
24
|
/** `<a>` that hands in-app hrefs to `LinkProvider`'s `component` and absolute URLs to its `externalComponent`. */
|
|
25
|
-
const Anchor = /*#__PURE__*/react.forwardRef((
|
|
25
|
+
const Anchor = /*#__PURE__*/react.forwardRef((_ref3, ref) => {
|
|
26
|
+
let {
|
|
27
|
+
external,
|
|
28
|
+
disabled,
|
|
29
|
+
linkProps,
|
|
30
|
+
...rest
|
|
31
|
+
} = _ref3;
|
|
26
32
|
const links = LinkProvider.useLinkComponents();
|
|
33
|
+
const props = {
|
|
34
|
+
...rest,
|
|
35
|
+
...(external && {
|
|
36
|
+
target: rest.target ?? '_blank',
|
|
37
|
+
rel: rest.rel ?? 'noopener noreferrer'
|
|
38
|
+
}),
|
|
39
|
+
...(disabled && {
|
|
40
|
+
href: undefined,
|
|
41
|
+
onClick: undefined,
|
|
42
|
+
tabIndex: undefined,
|
|
43
|
+
role: rest.role ?? 'link',
|
|
44
|
+
'aria-disabled': true
|
|
45
|
+
})
|
|
46
|
+
};
|
|
27
47
|
const {
|
|
28
48
|
href
|
|
29
49
|
} = props;
|
|
@@ -32,6 +52,7 @@ const Anchor = /*#__PURE__*/react.forwardRef((props, ref) => {
|
|
|
32
52
|
if (Link) return /*#__PURE__*/jsxRuntime.jsx(Link, {
|
|
33
53
|
ref: ref,
|
|
34
54
|
...props,
|
|
55
|
+
...linkProps,
|
|
35
56
|
href: href
|
|
36
57
|
});
|
|
37
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Anchor.cjs","sources":["../../../src/link-provider/Anchor.tsx"],"sourcesContent":["import { forwardRef, type AnchorHTMLAttributes } from 'react'\n\nimport {
|
|
1
|
+
{"version":3,"file":"Anchor.cjs","sources":["../../../src/link-provider/Anchor.tsx"],"sourcesContent":["import { forwardRef, type AnchorHTMLAttributes } from 'react'\n\nimport {\n useLinkComponents,\n type LinkComponents,\n type LinkRouterProps,\n} from './LinkProvider'\n\nconst ABSOLUTE_URL = /^([a-z][a-z\\d+.-]*:|\\/\\/)/i\n\nexport type AnchorProps = AnchorHTMLAttributes<HTMLAnchorElement> & {\n /** Opens in a new tab: defaults `target` to `_blank` and `rel` to `noopener noreferrer`; an explicit `rel` wins. */\n external?: boolean\n /** Renders an href-less `role='link'` with `aria-disabled`, and drops `onClick`. */\n disabled?: boolean\n /** Router-only props (e.g. `prefetch`), passed to `LinkProvider` components and never to a plain `<a>`. */\n linkProps?: LinkRouterProps\n}\n\nconst pickLink = (\n { component, externalComponent }: LinkComponents,\n href: string,\n { target, download }: AnchorHTMLAttributes<HTMLAnchorElement>,\n) => {\n if (ABSOLUTE_URL.test(href)) return externalComponent\n if (\n href.startsWith('#') ||\n (target && target !== '_self') ||\n (download != null && download !== false)\n )\n return undefined\n return component\n}\n\n/** `<a>` that hands in-app hrefs to `LinkProvider`'s `component` and absolute URLs to its `externalComponent`. */\nexport const Anchor = forwardRef<HTMLAnchorElement, AnchorProps>(\n ({ external, disabled, linkProps, ...rest }, ref) => {\n const links = useLinkComponents()\n const props: AnchorHTMLAttributes<HTMLAnchorElement> = {\n ...rest,\n ...(external && {\n target: rest.target ?? '_blank',\n rel: rest.rel ?? 'noopener noreferrer',\n }),\n ...(disabled && {\n href: undefined,\n onClick: undefined,\n tabIndex: undefined,\n role: rest.role ?? 'link',\n 'aria-disabled': true,\n }),\n }\n const { href } = props\n\n if (href !== undefined) {\n const Link = pickLink(links, href, props)\n if (Link) return <Link ref={ref} {...props} {...linkProps} href={href} />\n }\n\n // eslint-disable-next-line jsx-a11y/anchor-has-content -- children arrive via props\n return <a ref={ref} {...props} />\n },\n)\n\nAnchor.displayName = 'Anchor'\n"],"names":["ABSOLUTE_URL","pickLink","_ref","href","_ref2","component","externalComponent","target","download","test","startsWith","undefined","Anchor","forwardRef","_ref3","ref","external","disabled","linkProps","rest","links","useLinkComponents","props","rel","onClick","tabIndex","role","Link","_jsx","displayName"],"mappings":";;;;;;;;AAQA,MAAMA,YAAY,GAAG,4BAA4B,CAAA;AAWjD,MAAMC,QAAQ,GAAGA,CAAAC,IAAA,EAEfC,IAAY,EAAAC,KAAA,KAET;EAAA,IAHH;IAAEC,SAAS;AAAEC,IAAAA,iBAAAA;AAAkC,GAAC,GAAAJ,IAAA,CAAA;EAAA,IAEhD;IAAEK,MAAM;AAAEC,IAAAA,QAAAA;AAAkD,GAAC,GAAAJ,KAAA,CAAA;EAE7D,IAAIJ,YAAY,CAACS,IAAI,CAACN,IAAI,CAAC,EAAE,OAAOG,iBAAiB,CAAA;EACrD,IACEH,IAAI,CAACO,UAAU,CAAC,GAAG,CAAC,IACnBH,MAAM,IAAIA,MAAM,KAAK,OAAQ,IAC7BC,QAAQ,IAAI,IAAI,IAAIA,QAAQ,KAAK,KAAM,EAExC,OAAOG,SAAS,CAAA;AAClB,EAAA,OAAON,SAAS,CAAA;AAClB,CAAC,CAAA;;AAED;AACO,MAAMO,MAAM,gBAAGC,gBAAU,CAC9B,CAAAC,KAAA,EAA6CC,GAAG,KAAK;EAAA,IAApD;IAAEC,QAAQ;IAAEC,QAAQ;IAAEC,SAAS;IAAE,GAAGC,IAAAA;AAAK,GAAC,GAAAL,KAAA,CAAA;AACzC,EAAA,MAAMM,KAAK,GAAGC,8BAAiB,EAAE,CAAA;AACjC,EAAA,MAAMC,KAA8C,GAAG;AACrD,IAAA,GAAGH,IAAI;AACP,IAAA,IAAIH,QAAQ,IAAI;AACdT,MAAAA,MAAM,EAAEY,IAAI,CAACZ,MAAM,IAAI,QAAQ;AAC/BgB,MAAAA,GAAG,EAAEJ,IAAI,CAACI,GAAG,IAAI,qBAAA;AACnB,KAAC,CAAC;AACF,IAAA,IAAIN,QAAQ,IAAI;AACdd,MAAAA,IAAI,EAAEQ,SAAS;AACfa,MAAAA,OAAO,EAAEb,SAAS;AAClBc,MAAAA,QAAQ,EAAEd,SAAS;AACnBe,MAAAA,IAAI,EAAEP,IAAI,CAACO,IAAI,IAAI,MAAM;AACzB,MAAA,eAAe,EAAE,IAAA;KAClB,CAAA;GACF,CAAA;EACD,MAAM;AAAEvB,IAAAA,IAAAA;AAAK,GAAC,GAAGmB,KAAK,CAAA;EAEtB,IAAInB,IAAI,KAAKQ,SAAS,EAAE;IACtB,MAAMgB,IAAI,GAAG1B,QAAQ,CAACmB,KAAK,EAAEjB,IAAI,EAAEmB,KAAK,CAAC,CAAA;AACzC,IAAA,IAAIK,IAAI,EAAE,oBAAOC,cAAA,CAACD,IAAI,EAAA;AAACZ,MAAAA,GAAG,EAAEA,GAAI;AAAA,MAAA,GAAKO,KAAK;AAAA,MAAA,GAAMJ,SAAS;AAAEf,MAAAA,IAAI,EAAEA,IAAAA;AAAK,KAAE,CAAC,CAAA;AAC3E,GAAA;;AAEA;AACA,EAAA,oBAAOyB,cAAA,CAAA,GAAA,EAAA;AAAGb,IAAAA,GAAG,EAAEA,GAAI;IAAA,GAAKO,KAAAA;AAAK,GAAG,CAAC,CAAA;AACnC,CACF,EAAC;AAEDV,MAAM,CAACiB,WAAW,GAAG,QAAQ;;;;"}
|
|
@@ -6,7 +6,7 @@ const react = require('react');
|
|
|
6
6
|
const jsxRuntime = require('react/jsx-runtime');
|
|
7
7
|
|
|
8
8
|
const LinkContext = /*#__PURE__*/react.createContext({});
|
|
9
|
-
/** Renders app-ui links with your components: `component` for in-app hrefs (e.g. Next.js `Link`), `externalComponent` for absolute URLs; both must forward `ref` to an `<a>`. Pass stable references (module-level, not inline functions): inline ones remount every link on each render. */
|
|
9
|
+
/** Renders app-ui links with your components: `component` for in-app hrefs (e.g. Next.js `Link`), `externalComponent` for absolute URLs; both must be `forwardRef` components that forward `ref` to an `<a>`. Pass stable references (module-level, not inline functions): inline ones remount every link on each render. In-app hash links, `download` links and non-`_self` `target` links stay a plain `<a>`; absolute URLs always go to `externalComponent` when set. `TextLink`, `NavLink`, `SmallCard`, `LinkButton`, `Tag`, `Breadcrumbs` items and `Logo` with `href` use it. */
|
|
10
10
|
const LinkProvider = _ref => {
|
|
11
11
|
let {
|
|
12
12
|
component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinkProvider.cjs","sources":["../../../src/link-provider/LinkProvider.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useMemo,\n type AnchorHTMLAttributes,\n type ReactNode,\n type Ref,\n} from 'react'\n\nexport type LinkComponentProps = AnchorHTMLAttributes<HTMLAnchorElement> & {\n
|
|
1
|
+
{"version":3,"file":"LinkProvider.cjs","sources":["../../../src/link-provider/LinkProvider.tsx"],"sourcesContent":["import {\n createContext,\n useContext,\n useMemo,\n type AnchorHTMLAttributes,\n type ReactNode,\n type Ref,\n} from 'react'\n\n/** Augment via `declare module '@lidofinance/lido-app-ui'` to type router-only props (e.g. Next's `prefetch`), set per link with `linkProps`. */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface LinkRouterProps {}\n\nexport type LinkComponentProps = AnchorHTMLAttributes<HTMLAnchorElement> &\n LinkRouterProps & {\n href: string\n ref?: Ref<HTMLAnchorElement>\n }\n\n/** Wrap adapters in `forwardRef`: under React 18 `ref` arrives as the second argument, never as a prop. */\nexport type LinkComponent = (props: LinkComponentProps) => ReactNode\n\nexport type LinkComponents = {\n /** Renders in-app hrefs (relative, not hash, `download` or non-`_self` `target`). */\n component?: LinkComponent\n /** Renders absolute URLs, including `mailto:` and protocol-relative `//`. */\n externalComponent?: LinkComponent\n}\n\nconst LinkContext = createContext<LinkComponents>({})\n\nexport type LinkProviderProps = LinkComponents & {\n children?: ReactNode\n}\n\n/** Renders app-ui links with your components: `component` for in-app hrefs (e.g. Next.js `Link`), `externalComponent` for absolute URLs; both must be `forwardRef` components that forward `ref` to an `<a>`. Pass stable references (module-level, not inline functions): inline ones remount every link on each render. In-app hash links, `download` links and non-`_self` `target` links stay a plain `<a>`; absolute URLs always go to `externalComponent` when set. `TextLink`, `NavLink`, `SmallCard`, `LinkButton`, `Tag`, `Breadcrumbs` items and `Logo` with `href` use it. */\nexport const LinkProvider = ({\n component,\n externalComponent,\n children,\n}: LinkProviderProps) => {\n const value = useMemo(\n () => ({ component, externalComponent }),\n [component, externalComponent],\n )\n return <LinkContext.Provider value={value}>{children}</LinkContext.Provider>\n}\n\nexport const useLinkComponents = () => useContext(LinkContext)\n"],"names":["LinkContext","createContext","LinkProvider","_ref","component","externalComponent","children","value","useMemo","_jsx","Provider","useLinkComponents","useContext"],"mappings":";;;;;;;AA6BA,MAAMA,WAAW,gBAAGC,mBAAa,CAAiB,EAAE,CAAC,CAAA;AAMrD;AACaC,MAAAA,YAAY,GAAGC,IAAA,IAIH;EAAA,IAJI;IAC3BC,SAAS;IACTC,iBAAiB;AACjBC,IAAAA,QAAAA;AACiB,GAAC,GAAAH,IAAA,CAAA;AAClB,EAAA,MAAMI,KAAK,GAAGC,aAAO,CACnB,OAAO;IAAEJ,SAAS;AAAEC,IAAAA,iBAAAA;AAAkB,GAAC,CAAC,EACxC,CAACD,SAAS,EAAEC,iBAAiB,CAC/B,CAAC,CAAA;AACD,EAAA,oBAAOI,cAAA,CAACT,WAAW,CAACU,QAAQ,EAAA;AAACH,IAAAA,KAAK,EAAEA,KAAM;AAAAD,IAAAA,QAAA,EAAEA,QAAAA;AAAQ,GAAuB,CAAC,CAAA;AAC9E,EAAC;AAEM,MAAMK,iBAAiB,GAAGA,MAAMC,gBAAU,CAACZ,WAAW;;;;;"}
|
package/dist/cjs/logo/Logo.cjs
CHANGED
|
@@ -33,13 +33,17 @@ const WORDMARK = /*#__PURE__*/jsxRuntime.jsx("span", {
|
|
|
33
33
|
})
|
|
34
34
|
})
|
|
35
35
|
});
|
|
36
|
+
|
|
37
|
+
/** Lido droplet with wordmark and an optional product name. */
|
|
36
38
|
const Logo = /*#__PURE__*/react.forwardRef((_ref, ref) => {
|
|
37
39
|
let {
|
|
38
40
|
variant = 'full',
|
|
39
41
|
product,
|
|
40
42
|
href,
|
|
43
|
+
external,
|
|
41
44
|
onClick,
|
|
42
45
|
className,
|
|
46
|
+
dataTestId,
|
|
43
47
|
...rest
|
|
44
48
|
} = _ref;
|
|
45
49
|
const label = product ? `Lido ${product}` : 'Lido';
|
|
@@ -53,6 +57,7 @@ const Logo = /*#__PURE__*/react.forwardRef((_ref, ref) => {
|
|
|
53
57
|
"aria-hidden": "true"
|
|
54
58
|
}), /*#__PURE__*/jsxRuntime.jsx("span", {
|
|
55
59
|
className: Logo_module.product,
|
|
60
|
+
"data-testid": dataTestId?.product,
|
|
56
61
|
children: product
|
|
57
62
|
})]
|
|
58
63
|
}) : null]
|
|
@@ -63,7 +68,9 @@ const Logo = /*#__PURE__*/react.forwardRef((_ref, ref) => {
|
|
|
63
68
|
ref: ref,
|
|
64
69
|
className: cn(classes, Logo_module.interactive),
|
|
65
70
|
"aria-label": label,
|
|
71
|
+
"data-testid": dataTestId?.root,
|
|
66
72
|
href,
|
|
73
|
+
external: href ? external : undefined,
|
|
67
74
|
onClick,
|
|
68
75
|
...rest,
|
|
69
76
|
children: content
|
|
@@ -74,6 +81,7 @@ const Logo = /*#__PURE__*/react.forwardRef((_ref, ref) => {
|
|
|
74
81
|
role: "img",
|
|
75
82
|
"aria-label": label,
|
|
76
83
|
className: classes,
|
|
84
|
+
"data-testid": dataTestId?.root,
|
|
77
85
|
...rest,
|
|
78
86
|
children: content
|
|
79
87
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Logo.cjs","sources":["../../../src/logo/Logo.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"Logo.cjs","sources":["../../../src/logo/Logo.tsx"],"sourcesContent":["import {\n forwardRef,\n type AnchorHTMLAttributes,\n type HTMLAttributes,\n type Ref,\n} from 'react'\n\nimport cn from 'classnames'\n\nimport { ActionElement } from '../utils'\nimport styles from './Logo.module.css'\n\nexport type LogoVariant = 'full' | 'compact' | 'auto'\n\nexport type LogoDataTestId = { root?: string; product?: string }\n\nexport type LogoProps = Omit<HTMLAttributes<HTMLElement>, 'children'> &\n Pick<AnchorHTMLAttributes<HTMLAnchorElement>, 'target' | 'download'> & {\n /** `full` shows the wordmark, `compact` drops it, `auto` drops it below `--lido-app-ui-breakpoint-logo` (1024px), overridable per instance with `--lido-app-ui-logo-breakpoint`. */\n variant?: LogoVariant\n /** Product name shown after a divider and added to the accessible name. */\n product?: string\n /** Renders a link; with only `onClick` it renders a button, otherwise a plain `role=\"img\"` element. */\n href?: string\n /** Opens the link in a new tab; needs `href`. */\n external?: boolean\n dataTestId?: LogoDataTestId\n }\n\nconst DROPLET = (\n <svg\n className={styles.droplet}\n viewBox='38 26 23 32'\n fill='currentColor'\n aria-hidden='true'\n >\n <path\n fillRule='evenodd'\n clipRule='evenodd'\n d='M49.485 26L57.6 38.398l-8.116 4.613-8.117-4.613L49.485 26zM43.85 37.81l5.634-8.602 5.633 8.601-5.633 3.201-5.634-3.2z'\n />\n <path d='M49.478 45.736l-9.416-5.35-.255.39c-2.896 4.428-2.25 10.226 1.554 13.945 4.48 4.372 11.747 4.372 16.233 0 3.812-3.719 4.458-9.517 1.554-13.945l-.254-.39-9.416 5.35z' />\n </svg>\n)\n\nconst WORDMARK = (\n <span className={styles.wordmark}>\n <svg\n className={styles.wordmarkSvg}\n viewBox='61 26 101 32'\n fill='currentColor'\n aria-hidden='true'\n >\n <path d='M90.17 50.449H79.462V33.551h3.267v13.917h7.441v2.981zm16.422 0h-3.267V33.551h3.267V50.45zm13.242 0V33.551h5.597c.85 0 1.54.029 2.062.093 1.351.156 2.519.624 3.492 1.398.988.773 1.735 1.767 2.244 2.98.515 1.207.769 2.534.769 3.982 0 1.448-.254 2.775-.769 3.988-.516 1.207-1.264 2.193-2.244 2.967-.98.773-2.141 1.242-3.492 1.398-.53.064-1.219.092-2.062.092h-5.597zm5.597-3.002c.85 0 1.474-.043 1.873-.12a3.218 3.218 0 001.801-1.001 5.002 5.002 0 001.082-1.923 7.97 7.97 0 00.363-2.406 7.96 7.96 0 00-.371-2.442c-.239-.76-.602-1.398-1.096-1.916a3.123 3.123 0 00-1.779-.972c-.399-.078-1.023-.12-1.873-.12h-2.279V47.44h2.279v.007zm28.191 3.357c-1.707 0-3.188-.362-4.458-1.093a7.432 7.432 0 01-2.919-3.102c-.675-1.327-1.009-2.867-1.009-4.613 0-1.745.334-3.285 1.009-4.613.683-1.327 1.656-2.356 2.919-3.087 1.263-.738 2.751-1.1 4.458-1.1 1.706 0 3.187.37 4.457 1.1a7.27 7.27 0 012.904 3.087c.683 1.328 1.024 2.868 1.024 4.613 0 1.746-.341 3.286-1.024 4.613-.675 1.328-1.641 2.364-2.904 3.102-1.263.73-2.751 1.093-4.457 1.093zm.094-3.002c1.06 0 1.946-.242 2.664-.717.719-.476 1.264-1.15 1.619-2.016.363-.865.538-1.887.538-3.065 0-1.817-.422-3.237-1.271-4.259-.849-1.021-2.098-1.54-3.746-1.54-1.06 0-1.946.242-2.664.717-.719.476-1.264 1.15-1.619 2.016-.363.865-.538 1.887-.538 3.066 0 1.816.421 3.236 1.271 4.258.849 1.022 2.098 1.54 3.746 1.54z' />\n </svg>\n </span>\n)\n\n/** Lido droplet with wordmark and an optional product name. */\nexport const Logo = forwardRef<HTMLElement, LogoProps>(\n (\n {\n variant = 'full',\n product,\n href,\n external,\n onClick,\n className,\n dataTestId,\n ...rest\n },\n ref,\n ) => {\n const label = product ? `Lido ${product}` : 'Lido'\n const content = (\n <>\n <span className={styles.mark}>\n {DROPLET}\n {variant === 'compact' ? null : WORDMARK}\n </span>\n {product ? (\n <>\n <span className={styles.divider} aria-hidden='true' />\n <span className={styles.product} data-testid={dataTestId?.product}>\n {product}\n </span>\n </>\n ) : null}\n </>\n )\n const classes = cn(styles.root, styles[variant], className)\n\n if (href || onClick) {\n return (\n <ActionElement\n ref={ref as Ref<HTMLAnchorElement | HTMLButtonElement>}\n className={cn(classes, styles.interactive)}\n aria-label={label}\n data-testid={dataTestId?.root}\n {...{\n href,\n external: href ? external : undefined,\n onClick,\n ...rest,\n }}\n >\n {content}\n </ActionElement>\n )\n }\n\n return (\n <span\n ref={ref as Ref<HTMLSpanElement>}\n role='img'\n aria-label={label}\n className={classes}\n data-testid={dataTestId?.root}\n {...rest}\n >\n {content}\n </span>\n )\n },\n)\n\nLogo.displayName = 'Logo'\n"],"names":["DROPLET","_jsxs","className","styles","droplet","viewBox","fill","children","_jsx","fillRule","clipRule","d","WORDMARK","wordmark","wordmarkSvg","Logo","forwardRef","_ref","ref","variant","product","href","external","onClick","dataTestId","rest","label","content","_Fragment","mark","divider","classes","cn","root","ActionElement","interactive","undefined","role","displayName"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageBox.cjs","sources":["../../../src/message-box/MessageBox.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react'\n\nimport { IconCheck, IconInfo, IconShield, IconWarning } from '../icons'\nimport cn from 'classnames'\n\nimport styles from './MessageBox.module.css'\n\nexport type MessageBoxVariant =\n | 'default'\n | 'info'\n | 'warning'\n | 'error'\n | 'success'\n\nconst variantIcons = {\n default: IconInfo,\n info: IconShield,\n warning: IconWarning,\n error: IconWarning,\n success: IconCheck,\n}\n\nexport type MessageBoxDataTestId = {\n root?: string\n icon?: string\n headline?: string\n description?: string\n}\n\nexport type MessageBoxProps = HTMLAttributes<HTMLDivElement> & {\n variant?: MessageBoxVariant\n icon?: boolean\n headline?: ReactNode\n dataTestId?: MessageBoxDataTestId\n}\n\nexport const MessageBox = ({\n variant = 'default',\n icon = true,\n headline,\n className,\n children,\n dataTestId,\n ...rest\n}: MessageBoxProps) => {\n const Icon = variantIcons[variant]\n\n return (\n <div\n className={cn(styles.box, styles[variant], className)}\n data-testid={dataTestId?.root}\n {...rest}\n >\n {icon ? (\n <span\n className={styles.icon}\n aria-hidden='true'\n data-testid={dataTestId?.icon}\n >\n <Icon />\n </span>\n ) : null}\n <div className={styles.text}>\n {headline != null ? (\n <div className={styles.headline} data-testid={dataTestId?.headline}>\n {headline}\n </div>\n ) : null}\n <div\n className={styles.description}\n data-testid={dataTestId?.description}\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n"],"names":["variantIcons","default","IconInfo","info","IconShield","warning","IconWarning","error","success","IconCheck","MessageBox","_ref","variant","icon","headline","className","children","dataTestId","rest","Icon","_jsxs","cn","styles","box","root","_jsx","text","description"],"mappings":";;;;;;;;;;;;AAcA,MAAMA,YAAY,GAAG;AACnBC,EAAAA,OAAO,EAAEC,iBAAQ;AACjBC,EAAAA,IAAI,EAAEC,qBAAU;AAChBC,EAAAA,OAAO,EAAEC,uBAAW;AACpBC,EAAAA,KAAK,EAAED,uBAAW;AAClBE,EAAAA,OAAO,EAAEC,mBAAAA;AACX,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"MessageBox.cjs","sources":["../../../src/message-box/MessageBox.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from 'react'\n\nimport { IconCheck, IconInfo, IconShield, IconWarning } from '../icons'\nimport cn from 'classnames'\n\nimport styles from './MessageBox.module.css'\n\nexport type MessageBoxVariant =\n | 'default'\n | 'info'\n | 'warning'\n | 'error'\n | 'success'\n\nconst variantIcons = {\n default: IconInfo,\n info: IconShield,\n warning: IconWarning,\n error: IconWarning,\n success: IconCheck,\n}\n\nexport type MessageBoxDataTestId = {\n root?: string\n icon?: string\n headline?: string\n description?: string\n}\n\nexport type MessageBoxProps = HTMLAttributes<HTMLDivElement> & {\n /** `default` neutral, `info` blue, `warning` orange, `error` red, `success` green. */\n variant?: MessageBoxVariant\n /** Toggles the leading glyph, which is picked from the variant. */\n icon?: boolean\n headline?: ReactNode\n dataTestId?: MessageBoxDataTestId\n}\n\n/** Inline note in a form or card, e.g. to explain a delay, a fee or a risk. */\nexport const MessageBox = ({\n variant = 'default',\n icon = true,\n headline,\n className,\n children,\n dataTestId,\n ...rest\n}: MessageBoxProps) => {\n const Icon = variantIcons[variant]\n\n return (\n <div\n className={cn(styles.box, styles[variant], className)}\n data-testid={dataTestId?.root}\n {...rest}\n >\n {icon ? (\n <span\n className={styles.icon}\n aria-hidden='true'\n data-testid={dataTestId?.icon}\n >\n <Icon />\n </span>\n ) : null}\n <div className={styles.text}>\n {headline != null ? (\n <div className={styles.headline} data-testid={dataTestId?.headline}>\n {headline}\n </div>\n ) : null}\n <div\n className={styles.description}\n data-testid={dataTestId?.description}\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n"],"names":["variantIcons","default","IconInfo","info","IconShield","warning","IconWarning","error","success","IconCheck","MessageBox","_ref","variant","icon","headline","className","children","dataTestId","rest","Icon","_jsxs","cn","styles","box","root","_jsx","text","description"],"mappings":";;;;;;;;;;;;AAcA,MAAMA,YAAY,GAAG;AACnBC,EAAAA,OAAO,EAAEC,iBAAQ;AACjBC,EAAAA,IAAI,EAAEC,qBAAU;AAChBC,EAAAA,OAAO,EAAEC,uBAAW;AACpBC,EAAAA,KAAK,EAAED,uBAAW;AAClBE,EAAAA,OAAO,EAAEC,mBAAAA;AACX,CAAC,CAAA;AAkBD;AACaC,MAAAA,UAAU,GAAGC,IAAA,IAQH;EAAA,IARI;AACzBC,IAAAA,OAAO,GAAG,SAAS;AACnBC,IAAAA,IAAI,GAAG,IAAI;IACXC,QAAQ;IACRC,SAAS;IACTC,QAAQ;IACRC,UAAU;IACV,GAAGC,IAAAA;AACY,GAAC,GAAAP,IAAA,CAAA;AAChB,EAAA,MAAMQ,IAAI,GAAGnB,YAAY,CAACY,OAAO,CAAC,CAAA;AAElC,EAAA,oBACEQ,eAAA,CAAA,KAAA,EAAA;AACEL,IAAAA,SAAS,EAAEM,EAAE,CAACC,iBAAM,CAACC,GAAG,EAAED,iBAAM,CAACV,OAAO,CAAC,EAAEG,SAAS,CAAE;IACtD,aAAaE,EAAAA,UAAU,EAAEO,IAAK;AAAA,IAAA,GAC1BN,IAAI;IAAAF,QAAA,EAAA,CAEPH,IAAI,gBACHY,cAAA,CAAA,MAAA,EAAA;MACEV,SAAS,EAAEO,iBAAM,CAACT,IAAK;AACvB,MAAA,aAAA,EAAY,MAAM;MAClB,aAAaI,EAAAA,UAAU,EAAEJ,IAAK;AAAAG,MAAAA,QAAA,eAE9BS,cAAA,CAACN,IAAI,EAAE,EAAA,CAAA;AAAC,KACJ,CAAC,GACL,IAAI,eACRC,eAAA,CAAA,KAAA,EAAA;MAAKL,SAAS,EAAEO,iBAAM,CAACI,IAAK;AAAAV,MAAAA,QAAA,EACzBF,CAAAA,QAAQ,IAAI,IAAI,gBACfW,cAAA,CAAA,KAAA,EAAA;QAAKV,SAAS,EAAEO,iBAAM,CAACR,QAAS;QAAC,aAAaG,EAAAA,UAAU,EAAEH,QAAS;AAAAE,QAAAA,QAAA,EAChEF,QAAAA;AAAQ,OACN,CAAC,GACJ,IAAI,eACRW,cAAA,CAAA,KAAA,EAAA;QACEV,SAAS,EAAEO,iBAAM,CAACK,WAAY;QAC9B,aAAaV,EAAAA,UAAU,EAAEU,WAAY;AAAAX,QAAAA,QAAA,EAEpCA,QAAAA;AAAQ,OACN,CAAC,CAAA;AAAA,KACH,CAAC,CAAA;AAAA,GACH,CAAC,CAAA;AAEV;;;;"}
|
package/dist/cjs/modal/Modal.cjs
CHANGED
|
@@ -8,8 +8,10 @@ const Modal_module = require('./Modal.module.css.cjs');
|
|
|
8
8
|
const jsxRuntime = require('react/jsx-runtime');
|
|
9
9
|
const Portal = require('../hooks/Portal.cjs');
|
|
10
10
|
const useBodyScrollLock = require('../hooks/useBodyScrollLock.cjs');
|
|
11
|
+
const useHideOthers = require('../hooks/useHideOthers.cjs');
|
|
11
12
|
const useFocusTrap = require('../hooks/useFocusTrap.cjs');
|
|
12
13
|
const useEscape = require('../hooks/useEscape.cjs');
|
|
14
|
+
const useOutsideClick = require('../hooks/useOutsideClick.cjs');
|
|
13
15
|
const CloseButton = require('../icon-button/CloseButton.cjs');
|
|
14
16
|
|
|
15
17
|
const ModalDialog = /*#__PURE__*/react.forwardRef((_ref, ref) => {
|
|
@@ -18,46 +20,91 @@ const ModalDialog = /*#__PURE__*/react.forwardRef((_ref, ref) => {
|
|
|
18
20
|
subtitle,
|
|
19
21
|
onClose,
|
|
20
22
|
withOverlay = false,
|
|
23
|
+
inertOthers = false,
|
|
21
24
|
bodyFill = false,
|
|
22
25
|
lockScroll = true,
|
|
23
26
|
closeOnEscape = true,
|
|
24
27
|
closeOnOverlayClick = true,
|
|
28
|
+
initialFocus,
|
|
25
29
|
children,
|
|
26
30
|
className,
|
|
27
31
|
dataTestId,
|
|
28
32
|
...rest
|
|
29
33
|
} = _ref;
|
|
30
34
|
const titleId = react.useId();
|
|
35
|
+
const subtitleId = react.useId();
|
|
31
36
|
const [cardEl, setCardEl] = react.useState(null);
|
|
32
|
-
|
|
37
|
+
// Captured during render: a child's autoFocus is applied at commit, after this.
|
|
38
|
+
const [returnFocus] = react.useState(() => typeof document === 'undefined' ? null : document.activeElement);
|
|
39
|
+
const overlayRef = react.useRef(null);
|
|
40
|
+
const headerRef = react.useRef(null);
|
|
41
|
+
const pressedScrim = react.useRef(false);
|
|
33
42
|
react.useImperativeHandle(ref, () => cardEl, [cardEl]);
|
|
34
|
-
useBodyScrollLock.useBodyScrollLock(
|
|
35
|
-
|
|
43
|
+
useBodyScrollLock.useBodyScrollLock({
|
|
44
|
+
enabled: withOverlay && lockScroll
|
|
45
|
+
});
|
|
46
|
+
// Before the trap: cleanups run in order, so inert lifts before focus returns to the opener.
|
|
47
|
+
useHideOthers.useHideOthers(cardEl, withOverlay && inertOthers);
|
|
48
|
+
useFocusTrap.useFocusTrap(cardEl, {
|
|
49
|
+
enabled: withOverlay,
|
|
50
|
+
initialFocus,
|
|
51
|
+
returnFocus
|
|
52
|
+
});
|
|
36
53
|
// Stays registered with closeOnEscape={false} so Escape doesn't fall through to an underlying overlay.
|
|
37
|
-
useEscape.useEscape(
|
|
54
|
+
useEscape.useEscape(() => {
|
|
38
55
|
if (closeOnEscape) onClose?.();
|
|
56
|
+
}, {
|
|
57
|
+
enabled: withOverlay
|
|
39
58
|
});
|
|
40
|
-
|
|
41
|
-
|
|
59
|
+
|
|
60
|
+
// Sticky header on mobile: scroll-padding keeps focused fields from landing under it (WCAG 2.4.11).
|
|
61
|
+
react.useEffect(() => {
|
|
62
|
+
const overlay = overlayRef.current;
|
|
63
|
+
const header = headerRef.current;
|
|
64
|
+
if (!withOverlay || !overlay || !header) return;
|
|
65
|
+
if (typeof ResizeObserver === 'undefined') return;
|
|
66
|
+
const measure = () => overlay.style.setProperty('--local-header-height', `${header.offsetHeight + 8}px`);
|
|
67
|
+
measure();
|
|
68
|
+
const observer = new ResizeObserver(measure);
|
|
69
|
+
observer.observe(header);
|
|
70
|
+
return () => observer.disconnect();
|
|
71
|
+
}, [withOverlay, cardEl]);
|
|
72
|
+
|
|
73
|
+
// Joins the outside-click stack even with closeOnOverlayClick={false}, so presses here never reach an overlay underneath.
|
|
74
|
+
// Decided at pointerdown: the handler only runs while this is the top layer.
|
|
75
|
+
useOutsideClick.useOutsideClick(cardEl, event => {
|
|
76
|
+
pressedScrim.current = !(event.button > 0) && event.target === overlayRef.current;
|
|
77
|
+
}, {
|
|
78
|
+
enabled: withOverlay
|
|
79
|
+
});
|
|
80
|
+
const handleCardPointerDown = event => {
|
|
81
|
+
pressedScrim.current = false;
|
|
82
|
+
rest.onPointerDown?.(event);
|
|
42
83
|
};
|
|
43
84
|
const handleOverlayClick = event => {
|
|
44
|
-
if (closeOnOverlayClick &&
|
|
85
|
+
if (closeOnOverlayClick && pressedScrim.current && event.target === event.currentTarget) {
|
|
45
86
|
onClose?.();
|
|
46
87
|
}
|
|
88
|
+
pressedScrim.current = false;
|
|
47
89
|
};
|
|
48
90
|
const card = /*#__PURE__*/jsxRuntime.jsxs("div", {
|
|
49
91
|
role: "dialog",
|
|
50
92
|
"aria-modal": withOverlay || undefined,
|
|
51
93
|
"aria-labelledby": title ? titleId : undefined,
|
|
94
|
+
"aria-describedby": subtitle != null ? subtitleId : undefined,
|
|
52
95
|
"data-testid": dataTestId?.root,
|
|
53
96
|
...rest,
|
|
97
|
+
onPointerDown: handleCardPointerDown,
|
|
54
98
|
ref: setCardEl,
|
|
55
99
|
className: cn(Modal_module.card, bodyFill && Modal_module.cardBodyFill, className),
|
|
56
100
|
children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
|
|
101
|
+
ref: headerRef,
|
|
57
102
|
className: Modal_module.headerGroup,
|
|
58
103
|
children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
|
|
59
104
|
className: Modal_module.header,
|
|
60
105
|
children: [/*#__PURE__*/jsxRuntime.jsx("span", {
|
|
106
|
+
role: "heading",
|
|
107
|
+
"aria-level": 2,
|
|
61
108
|
id: titleId,
|
|
62
109
|
className: cn(Modal_module.title, !title && Modal_module.titleHidden),
|
|
63
110
|
"data-testid": dataTestId?.title,
|
|
@@ -69,6 +116,7 @@ const ModalDialog = /*#__PURE__*/react.forwardRef((_ref, ref) => {
|
|
|
69
116
|
}
|
|
70
117
|
}) : null]
|
|
71
118
|
}), subtitle != null ? /*#__PURE__*/jsxRuntime.jsx("p", {
|
|
119
|
+
id: subtitleId,
|
|
72
120
|
className: Modal_module.subtitle,
|
|
73
121
|
"data-testid": dataTestId?.subtitle,
|
|
74
122
|
children: subtitle
|
|
@@ -85,8 +133,8 @@ const ModalDialog = /*#__PURE__*/react.forwardRef((_ref, ref) => {
|
|
|
85
133
|
// Pointer-only: a focusable backdrop would add a tab stop before the dialog; keyboard closes via Escape.
|
|
86
134
|
// eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
|
|
87
135
|
jsxRuntime.jsx("div", {
|
|
136
|
+
ref: overlayRef,
|
|
88
137
|
className: Modal_module.overlay,
|
|
89
|
-
onMouseDown: handleOverlayMouseDown,
|
|
90
138
|
onClick: handleOverlayClick,
|
|
91
139
|
"data-testid": dataTestId?.overlay,
|
|
92
140
|
children: card
|
|
@@ -96,7 +144,13 @@ const ModalDialog = /*#__PURE__*/react.forwardRef((_ref, ref) => {
|
|
|
96
144
|
ModalDialog.displayName = 'ModalDialog';
|
|
97
145
|
|
|
98
146
|
// Hooks live in ModalDialog so they run once the portal has mounted its content.
|
|
99
|
-
|
|
147
|
+
/** Dialog card for supply, borrow and repay flows; with `withOverlay` it is portaled and closes on Escape and scrim click, traps focus and locks body scroll. `ModalCard` is the bare card. */
|
|
148
|
+
const Modal = /*#__PURE__*/react.forwardRef((_ref2, ref) => {
|
|
149
|
+
let {
|
|
150
|
+
open = true,
|
|
151
|
+
...props
|
|
152
|
+
} = _ref2;
|
|
153
|
+
if (!open) return null;
|
|
100
154
|
const dialog = /*#__PURE__*/jsxRuntime.jsx(ModalDialog, {
|
|
101
155
|
ref: ref,
|
|
102
156
|
...props
|
|
@@ -106,6 +160,14 @@ const Modal = /*#__PURE__*/react.forwardRef((props, ref) => {
|
|
|
106
160
|
}) : dialog;
|
|
107
161
|
});
|
|
108
162
|
Modal.displayName = 'Modal';
|
|
163
|
+
/** The bare dialog card with no portal or overlay behavior; you own positioning. */
|
|
164
|
+
const ModalCard = /*#__PURE__*/react.forwardRef((props, ref) => /*#__PURE__*/jsxRuntime.jsx(ModalDialog, {
|
|
165
|
+
ref: ref,
|
|
166
|
+
...props,
|
|
167
|
+
withOverlay: false
|
|
168
|
+
}));
|
|
169
|
+
ModalCard.displayName = 'ModalCard';
|
|
109
170
|
|
|
110
171
|
exports.Modal = Modal;
|
|
172
|
+
exports.ModalCard = ModalCard;
|
|
111
173
|
//# sourceMappingURL=Modal.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.cjs","sources":["../../../src/modal/Modal.tsx"],"sourcesContent":["import {\n forwardRef,\n useId,\n useImperativeHandle,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type MouseEvent,\n type ReactNode,\n} from 'react'\n\nimport { Portal, useBodyScrollLock, useEscape, useFocusTrap } from '../hooks'\nimport { CloseButton } from '../icon-button'\nimport cn from 'classnames'\n\nimport styles from './Modal.module.css'\n\nexport type ModalDataTestId = {\n root?: string\n title?: string\n subtitle?: string\n closeButton?: string\n body?: string\n overlay?: string\n}\n\nexport type ModalProps = Omit<\n ComponentPropsWithoutRef<'div'>,\n 'title' | 'children'\n> & {\n title?: ReactNode\n subtitle?: ReactNode\n onClose?: () => void\n /** Wraps the card in a portaled scrim; enables Escape, focus trap and scroll lock. */\n withOverlay?: boolean\n bodyFill?: boolean\n /** Opt out of body scroll lock (overlay only). Default true. */\n lockScroll?: boolean\n /** Opt out of Escape-to-close (overlay only). Default true. */\n closeOnEscape?: boolean\n /** Opt out of closing on scrim click (overlay only). Default true. */\n closeOnOverlayClick?: boolean\n children: ReactNode\n dataTestId?: ModalDataTestId\n}\n\nconst ModalDialog = forwardRef<HTMLDivElement, ModalProps>(\n (\n {\n title,\n subtitle,\n onClose,\n withOverlay = false,\n bodyFill = false,\n lockScroll = true,\n closeOnEscape = true,\n closeOnOverlayClick = true,\n children,\n className,\n dataTestId,\n ...rest\n },\n ref,\n ) => {\n const titleId = useId()\n const [cardEl, setCardEl] = useState<HTMLDivElement | null>(null)\n const backdropMouseDown = useRef(false)\n\n useImperativeHandle(ref, () => cardEl as HTMLDivElement, [cardEl])\n useBodyScrollLock(withOverlay && lockScroll)\n useFocusTrap(cardEl, withOverlay)\n // Stays registered with closeOnEscape={false} so Escape doesn't fall through to an underlying overlay.\n useEscape(withOverlay, () => {\n if (closeOnEscape) onClose?.()\n })\n\n const handleOverlayMouseDown = (event: MouseEvent<HTMLDivElement>) => {\n backdropMouseDown.current = event.target === event.currentTarget\n }\n\n const handleOverlayClick = (event: MouseEvent<HTMLDivElement>) => {\n if (\n closeOnOverlayClick &&\n backdropMouseDown.current &&\n event.target === event.currentTarget\n ) {\n onClose?.()\n }\n }\n\n const card = (\n <div\n role='dialog'\n aria-modal={withOverlay || undefined}\n aria-labelledby={title ? titleId : undefined}\n data-testid={dataTestId?.root}\n {...rest}\n ref={setCardEl}\n className={cn(styles.card, bodyFill && styles.cardBodyFill, className)}\n >\n <div className={styles.headerGroup}>\n <div className={styles.header}>\n <span\n id={titleId}\n className={cn(styles.title, !title && styles.titleHidden)}\n data-testid={dataTestId?.title}\n >\n {title}\n </span>\n {onClose ? (\n <CloseButton\n onClick={onClose}\n dataTestId={{ root: dataTestId?.closeButton }}\n />\n ) : null}\n </div>\n {subtitle != null ? (\n <p className={styles.subtitle} data-testid={dataTestId?.subtitle}>\n {subtitle}\n </p>\n ) : null}\n </div>\n <div className={styles.body} data-testid={dataTestId?.body}>\n {children}\n </div>\n </div>\n )\n\n if (!withOverlay) return card\n\n return (\n // Pointer-only: a focusable backdrop would add a tab stop before the dialog; keyboard closes via Escape.\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions\n <div\n className={styles.overlay}\n onMouseDown={handleOverlayMouseDown}\n onClick={handleOverlayClick}\n data-testid={dataTestId?.overlay}\n >\n {card}\n </div>\n )\n },\n)\n\nModalDialog.displayName = 'ModalDialog'\n\n// Hooks live in ModalDialog so they run once the portal has mounted its content.\nexport const Modal = forwardRef<HTMLDivElement, ModalProps>((props, ref) => {\n const dialog = <ModalDialog ref={ref} {...props} />\n return props.withOverlay ? <Portal>{dialog}</Portal> : dialog\n})\n\nModal.displayName = 'Modal'\n"],"names":["ModalDialog","forwardRef","_ref","ref","title","subtitle","onClose","withOverlay","bodyFill","lockScroll","closeOnEscape","closeOnOverlayClick","children","className","dataTestId","rest","titleId","useId","cardEl","setCardEl","useState","backdropMouseDown","useRef","useImperativeHandle","useBodyScrollLock","useFocusTrap","useEscape","handleOverlayMouseDown","event","current","target","currentTarget","handleOverlayClick","card","_jsxs","role","undefined","root","cn","styles","cardBodyFill","headerGroup","header","_jsx","id","titleHidden","CloseButton","onClick","closeButton","body","overlay","onMouseDown","displayName","Modal","props","dialog","Portal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Modal.cjs","sources":["../../../src/modal/Modal.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useId,\n useImperativeHandle,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type MouseEvent,\n type PointerEvent,\n type ReactNode,\n type RefObject,\n} from 'react'\n\nimport {\n Portal,\n useBodyScrollLock,\n useEscape,\n useFocusTrap,\n useHideOthers,\n useOutsideClick,\n} from '../hooks'\nimport { CloseButton } from '../icon-button'\nimport cn from 'classnames'\n\nimport styles from './Modal.module.css'\n\nexport type ModalDataTestId = {\n root?: string\n title?: string\n subtitle?: string\n closeButton?: string\n body?: string\n overlay?: string\n}\n\nexport type ModalProps = Omit<\n ComponentPropsWithoutRef<'div'>,\n 'title' | 'children'\n> & {\n title?: ReactNode\n subtitle?: ReactNode\n onClose?: () => void\n /** Controlled visibility; omitted means open, so mounting still opens it. */\n open?: boolean\n /** Wraps the card in a portaled scrim; enables Escape, focus trap, scroll lock. */\n withOverlay?: boolean\n /** With `withOverlay`, makes every other body child inert (including the app root); body-level roots (toasts, live regions) stay live with `data-lido-overlay-keep`. */\n inertOthers?: boolean\n /** Stretches the body; only matters full-screen on mobile. */\n bodyFill?: boolean\n /** Opt out of body scroll lock (overlay only). Default true. */\n lockScroll?: boolean\n /** Opt out of Escape-to-close (overlay only). Default true. */\n closeOnEscape?: boolean\n /** Opt out of closing on scrim click (overlay only). Default true. */\n closeOnOverlayClick?: boolean\n /** Element focused on open; defaults to the first tabbable (Close when `onClose` is set). An `autoFocus` child also keeps focus. */\n initialFocus?: RefObject<HTMLElement | null>\n children: ReactNode\n dataTestId?: ModalDataTestId\n}\n\nconst ModalDialog = forwardRef<HTMLDivElement, ModalProps>(\n (\n {\n title,\n subtitle,\n onClose,\n withOverlay = false,\n inertOthers = false,\n bodyFill = false,\n lockScroll = true,\n closeOnEscape = true,\n closeOnOverlayClick = true,\n initialFocus,\n children,\n className,\n dataTestId,\n ...rest\n },\n ref,\n ) => {\n const titleId = useId()\n const subtitleId = useId()\n const [cardEl, setCardEl] = useState<HTMLDivElement | null>(null)\n // Captured during render: a child's autoFocus is applied at commit, after this.\n const [returnFocus] = useState(() =>\n typeof document === 'undefined'\n ? null\n : (document.activeElement as HTMLElement | null),\n )\n const overlayRef = useRef<HTMLDivElement>(null)\n const headerRef = useRef<HTMLDivElement>(null)\n const pressedScrim = useRef(false)\n\n useImperativeHandle(ref, () => cardEl as HTMLDivElement, [cardEl])\n useBodyScrollLock({ enabled: withOverlay && lockScroll })\n // Before the trap: cleanups run in order, so inert lifts before focus returns to the opener.\n useHideOthers(cardEl, withOverlay && inertOthers)\n useFocusTrap(cardEl, { enabled: withOverlay, initialFocus, returnFocus })\n // Stays registered with closeOnEscape={false} so Escape doesn't fall through to an underlying overlay.\n useEscape(\n () => {\n if (closeOnEscape) onClose?.()\n },\n { enabled: withOverlay },\n )\n\n // Sticky header on mobile: scroll-padding keeps focused fields from landing under it (WCAG 2.4.11).\n useEffect(() => {\n const overlay = overlayRef.current\n const header = headerRef.current\n if (!withOverlay || !overlay || !header) return\n if (typeof ResizeObserver === 'undefined') return\n const measure = () =>\n overlay.style.setProperty(\n '--local-header-height',\n `${header.offsetHeight + 8}px`,\n )\n measure()\n const observer = new ResizeObserver(measure)\n observer.observe(header)\n return () => observer.disconnect()\n }, [withOverlay, cardEl])\n\n // Joins the outside-click stack even with closeOnOverlayClick={false}, so presses here never reach an overlay underneath.\n // Decided at pointerdown: the handler only runs while this is the top layer.\n useOutsideClick(\n cardEl,\n (event) => {\n pressedScrim.current =\n !(event.button > 0) && event.target === overlayRef.current\n },\n { enabled: withOverlay },\n )\n\n const handleCardPointerDown = (event: PointerEvent<HTMLDivElement>) => {\n pressedScrim.current = false\n rest.onPointerDown?.(event)\n }\n\n const handleOverlayClick = (event: MouseEvent<HTMLDivElement>) => {\n if (\n closeOnOverlayClick &&\n pressedScrim.current &&\n event.target === event.currentTarget\n ) {\n onClose?.()\n }\n pressedScrim.current = false\n }\n\n const card = (\n <div\n role='dialog'\n aria-modal={withOverlay || undefined}\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={subtitle != null ? subtitleId : undefined}\n data-testid={dataTestId?.root}\n {...rest}\n onPointerDown={handleCardPointerDown}\n ref={setCardEl}\n className={cn(styles.card, bodyFill && styles.cardBodyFill, className)}\n >\n <div ref={headerRef} className={styles.headerGroup}>\n <div className={styles.header}>\n <span\n role='heading'\n aria-level={2}\n id={titleId}\n className={cn(styles.title, !title && styles.titleHidden)}\n data-testid={dataTestId?.title}\n >\n {title}\n </span>\n {onClose ? (\n <CloseButton\n onClick={onClose}\n dataTestId={{ root: dataTestId?.closeButton }}\n />\n ) : null}\n </div>\n {subtitle != null ? (\n <p\n id={subtitleId}\n className={styles.subtitle}\n data-testid={dataTestId?.subtitle}\n >\n {subtitle}\n </p>\n ) : null}\n </div>\n <div className={styles.body} data-testid={dataTestId?.body}>\n {children}\n </div>\n </div>\n )\n\n if (!withOverlay) return card\n\n return (\n // Pointer-only: a focusable backdrop would add a tab stop before the dialog; keyboard closes via Escape.\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions\n <div\n ref={overlayRef}\n className={styles.overlay}\n onClick={handleOverlayClick}\n data-testid={dataTestId?.overlay}\n >\n {card}\n </div>\n )\n },\n)\n\nModalDialog.displayName = 'ModalDialog'\n\n// Hooks live in ModalDialog so they run once the portal has mounted its content.\n/** Dialog card for supply, borrow and repay flows; with `withOverlay` it is portaled and closes on Escape and scrim click, traps focus and locks body scroll. `ModalCard` is the bare card. */\nexport const Modal = forwardRef<HTMLDivElement, ModalProps>(\n ({ open = true, ...props }, ref) => {\n if (!open) return null\n const dialog = <ModalDialog ref={ref} {...props} />\n return props.withOverlay ? <Portal>{dialog}</Portal> : dialog\n },\n)\n\nModal.displayName = 'Modal'\n\nexport type ModalCardProps = Omit<\n ModalProps,\n | 'open'\n | 'withOverlay'\n | 'inertOthers'\n | 'lockScroll'\n | 'closeOnEscape'\n | 'closeOnOverlayClick'\n | 'initialFocus'\n>\n\n/** The bare dialog card with no portal or overlay behavior; you own positioning. */\nexport const ModalCard = forwardRef<HTMLDivElement, ModalCardProps>(\n (props, ref) => <ModalDialog ref={ref} {...props} withOverlay={false} />,\n)\n\nModalCard.displayName = 'ModalCard'\n"],"names":["ModalDialog","forwardRef","_ref","ref","title","subtitle","onClose","withOverlay","inertOthers","bodyFill","lockScroll","closeOnEscape","closeOnOverlayClick","initialFocus","children","className","dataTestId","rest","titleId","useId","subtitleId","cardEl","setCardEl","useState","returnFocus","document","activeElement","overlayRef","useRef","headerRef","pressedScrim","useImperativeHandle","useBodyScrollLock","enabled","useHideOthers","useFocusTrap","useEscape","useEffect","overlay","current","header","ResizeObserver","measure","style","setProperty","offsetHeight","observer","observe","disconnect","useOutsideClick","event","button","target","handleCardPointerDown","onPointerDown","handleOverlayClick","currentTarget","card","_jsxs","role","undefined","root","cn","styles","cardBodyFill","headerGroup","_jsx","id","titleHidden","CloseButton","onClick","closeButton","body","displayName","Modal","_ref2","open","props","dialog","Portal","ModalCard"],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ const NavLink_module = require('./NavLink.module.css.cjs');
|
|
|
9
9
|
const jsxRuntime = require('react/jsx-runtime');
|
|
10
10
|
const IconLink = require('../icons/components/base/IconLink.cjs');
|
|
11
11
|
|
|
12
|
+
/** Top-navigation link for a Header; pass `aria-current` for sections active on sub-routes (HeaderNav centers any truthy value). */
|
|
12
13
|
const NavLink = /*#__PURE__*/react.forwardRef((_ref, ref) => {
|
|
13
14
|
let {
|
|
14
15
|
active = false,
|
|
@@ -16,24 +17,25 @@ const NavLink = /*#__PURE__*/react.forwardRef((_ref, ref) => {
|
|
|
16
17
|
external = false,
|
|
17
18
|
className,
|
|
18
19
|
children,
|
|
19
|
-
|
|
20
|
-
rel,
|
|
20
|
+
dataTestId,
|
|
21
21
|
...rest
|
|
22
22
|
} = _ref;
|
|
23
23
|
return /*#__PURE__*/jsxRuntime.jsxs(Anchor.Anchor, {
|
|
24
24
|
ref: ref,
|
|
25
25
|
className: cn(NavLink_module.link, active && NavLink_module.active, className),
|
|
26
26
|
"aria-current": active ? 'page' : undefined,
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
external: external,
|
|
28
|
+
"data-testid": dataTestId?.root,
|
|
29
29
|
...rest,
|
|
30
30
|
children: [icon != null ? /*#__PURE__*/jsxRuntime.jsx("span", {
|
|
31
31
|
className: NavLink_module.icon,
|
|
32
32
|
"aria-hidden": "true",
|
|
33
|
+
"data-testid": dataTestId?.icon,
|
|
33
34
|
children: icon
|
|
34
35
|
}) : null, children, external ? /*#__PURE__*/jsxRuntime.jsx("span", {
|
|
35
36
|
className: NavLink_module.icon,
|
|
36
37
|
"aria-hidden": "true",
|
|
38
|
+
"data-testid": dataTestId?.externalIcon,
|
|
37
39
|
children: /*#__PURE__*/jsxRuntime.jsx(IconLink.IconLink, {})
|
|
38
40
|
}) : null]
|
|
39
41
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NavLink.cjs","sources":["../../../src/nav-link/NavLink.tsx"],"sourcesContent":["import { forwardRef, type AnchorHTMLAttributes, type ReactNode } from 'react'\n\nimport cn from 'classnames'\n\nimport { IconLink } from '../icons'\nimport { Anchor } from '../link-provider/Anchor'\nimport styles from './NavLink.module.css'\n\nexport type NavLinkProps = AnchorHTMLAttributes<HTMLAnchorElement> & {\n active?: boolean\n icon?: ReactNode\n external?: boolean\n}\n\nexport const NavLink = forwardRef<HTMLAnchorElement, NavLinkProps>(\n (\n {\n active = false,\n icon,\n external = false,\n className,\n children,\n
|
|
1
|
+
{"version":3,"file":"NavLink.cjs","sources":["../../../src/nav-link/NavLink.tsx"],"sourcesContent":["import { forwardRef, type AnchorHTMLAttributes, type ReactNode } from 'react'\n\nimport cn from 'classnames'\n\nimport { IconLink } from '../icons'\nimport { Anchor, type AnchorProps } from '../link-provider/Anchor'\nimport styles from './NavLink.module.css'\n\nexport type NavLinkDataTestId = {\n root?: string\n icon?: string\n externalIcon?: string\n}\n\nexport type NavLinkProps = AnchorHTMLAttributes<HTMLAnchorElement> & {\n /** Marks the current page: sets `aria-current=\"page\"` and the active style. */\n active?: boolean\n /** Leading icon. */\n icon?: ReactNode\n /** Opens in a new tab and appends the external-link arrow. */\n external?: boolean\n linkProps?: AnchorProps['linkProps']\n dataTestId?: NavLinkDataTestId\n}\n\n/** Top-navigation link for a Header; pass `aria-current` for sections active on sub-routes (HeaderNav centers any truthy value). */\nexport const NavLink = forwardRef<HTMLAnchorElement, NavLinkProps>(\n (\n {\n active = false,\n icon,\n external = false,\n className,\n children,\n dataTestId,\n ...rest\n },\n ref,\n ) => (\n <Anchor\n ref={ref}\n className={cn(styles.link, active && styles.active, className)}\n aria-current={active ? 'page' : undefined}\n external={external}\n data-testid={dataTestId?.root}\n {...rest}\n >\n {icon != null ? (\n <span\n className={styles.icon}\n aria-hidden='true'\n data-testid={dataTestId?.icon}\n >\n {icon}\n </span>\n ) : null}\n {children}\n {external ? (\n <span\n className={styles.icon}\n aria-hidden='true'\n data-testid={dataTestId?.externalIcon}\n >\n <IconLink />\n </span>\n ) : null}\n </Anchor>\n ),\n)\n\nNavLink.displayName = 'NavLink'\n"],"names":["NavLink","forwardRef","_ref","ref","active","icon","external","className","children","dataTestId","rest","_jsxs","Anchor","cn","styles","link","undefined","root","_jsx","externalIcon","IconLink","displayName"],"mappings":";;;;;;;;;;;AAyBA;AACO,MAAMA,OAAO,gBAAGC,gBAAU,CAC/B,CAAAC,IAAA,EAUEC,GAAG,KAAA;EAAA,IATH;AACEC,IAAAA,MAAM,GAAG,KAAK;IACdC,IAAI;AACJC,IAAAA,QAAQ,GAAG,KAAK;IAChBC,SAAS;IACTC,QAAQ;IACRC,UAAU;IACV,GAAGC,IAAAA;AACL,GAAC,GAAAR,IAAA,CAAA;EAAA,oBAGDS,eAAA,CAACC,aAAM,EAAA;AACLT,IAAAA,GAAG,EAAEA,GAAI;AACTI,IAAAA,SAAS,EAAEM,EAAE,CAACC,cAAM,CAACC,IAAI,EAAEX,MAAM,IAAIU,cAAM,CAACV,MAAM,EAAEG,SAAS,CAAE;AAC/D,IAAA,cAAA,EAAcH,MAAM,GAAG,MAAM,GAAGY,SAAU;AAC1CV,IAAAA,QAAQ,EAAEA,QAAS;IACnB,aAAaG,EAAAA,UAAU,EAAEQ,IAAK;AAAA,IAAA,GAC1BP,IAAI;AAAAF,IAAAA,QAAA,EAEPH,CAAAA,IAAI,IAAI,IAAI,gBACXa,cAAA,CAAA,MAAA,EAAA;MACEX,SAAS,EAAEO,cAAM,CAACT,IAAK;AACvB,MAAA,aAAA,EAAY,MAAM;MAClB,aAAaI,EAAAA,UAAU,EAAEJ,IAAK;AAAAG,MAAAA,QAAA,EAE7BH,IAAAA;KACG,CAAC,GACL,IAAI,EACPG,QAAQ,EACRF,QAAQ,gBACPY,cAAA,CAAA,MAAA,EAAA;MACEX,SAAS,EAAEO,cAAM,CAACT,IAAK;AACvB,MAAA,aAAA,EAAY,MAAM;MAClB,aAAaI,EAAAA,UAAU,EAAEU,YAAa;AAAAX,MAAAA,QAAA,eAEtCU,cAAA,CAACE,iBAAQ,EAAE,EAAA,CAAA;KACP,CAAC,GACL,IAAI,CAAA;AAAA,GACF,CAAC,CAAA;AAAA,CAEb,EAAC;AAEDpB,OAAO,CAACqB,WAAW,GAAG,SAAS;;;;"}
|
|
@@ -10,6 +10,9 @@ const jsxRuntime = require('react/jsx-runtime');
|
|
|
10
10
|
const IconButton = require('../icon-button/IconButton.cjs');
|
|
11
11
|
const IconCross = require('../icons/components/base/IconCross.cjs');
|
|
12
12
|
|
|
13
|
+
const isEmpty = node => node == null || node === false || node === '';
|
|
14
|
+
|
|
15
|
+
/** Dark toast that stays dark in both themes; `subheader` slots a `Tag`, `actions` takes small `Button`s, `onClose` adds a dismiss button. */
|
|
13
16
|
const Notification = /*#__PURE__*/react.forwardRef((_ref, ref) => {
|
|
14
17
|
let {
|
|
15
18
|
title,
|
|
@@ -17,11 +20,12 @@ const Notification = /*#__PURE__*/react.forwardRef((_ref, ref) => {
|
|
|
17
20
|
subheader,
|
|
18
21
|
actions,
|
|
19
22
|
onClose,
|
|
20
|
-
className,
|
|
21
23
|
role = 'alert',
|
|
24
|
+
className,
|
|
22
25
|
dataTestId,
|
|
23
26
|
...rest
|
|
24
27
|
} = _ref;
|
|
28
|
+
const titleId = react.useId();
|
|
25
29
|
return /*#__PURE__*/jsxRuntime.jsx(lidoSharedUi.ThemeProvider, {
|
|
26
30
|
themeName: lidoSharedUi.ThemeName.dark,
|
|
27
31
|
children: /*#__PURE__*/jsxRuntime.jsxs("div", {
|
|
@@ -31,27 +35,29 @@ const Notification = /*#__PURE__*/react.forwardRef((_ref, ref) => {
|
|
|
31
35
|
"data-testid": dataTestId?.root,
|
|
32
36
|
...rest,
|
|
33
37
|
children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
|
|
34
|
-
className: Notification_module.content,
|
|
35
|
-
children: [subheader
|
|
38
|
+
className: cn(Notification_module.content, onClose && Notification_module.closable),
|
|
39
|
+
children: [!isEmpty(subheader) ? /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
36
40
|
className: Notification_module.subheader,
|
|
37
41
|
"data-testid": dataTestId?.subheader,
|
|
38
42
|
children: subheader
|
|
39
43
|
}) : null, /*#__PURE__*/jsxRuntime.jsx("p", {
|
|
40
|
-
|
|
44
|
+
id: titleId,
|
|
45
|
+
className: Notification_module.title,
|
|
41
46
|
"data-testid": dataTestId?.title,
|
|
42
47
|
children: title
|
|
43
|
-
}), children
|
|
48
|
+
}), !isEmpty(children) ? /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
44
49
|
className: Notification_module.body,
|
|
45
50
|
"data-testid": dataTestId?.body,
|
|
46
51
|
children: children
|
|
47
52
|
}) : null]
|
|
48
|
-
}), actions
|
|
53
|
+
}), !isEmpty(actions) ? /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
49
54
|
className: Notification_module.actions,
|
|
50
55
|
"data-testid": dataTestId?.actions,
|
|
51
56
|
children: actions
|
|
52
57
|
}) : null, onClose ? /*#__PURE__*/jsxRuntime.jsx(IconButton.IconButton, {
|
|
53
58
|
variant: "ghost",
|
|
54
59
|
"aria-label": "Dismiss",
|
|
60
|
+
"aria-describedby": titleId,
|
|
55
61
|
icon: /*#__PURE__*/jsxRuntime.jsx(IconCross.IconCross, {}),
|
|
56
62
|
className: Notification_module.close,
|
|
57
63
|
onClick: onClose,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Notification.cjs","sources":["../../../src/notification/Notification.tsx"],"sourcesContent":["import {\n forwardRef,\n type ComponentPropsWithoutRef,\n type MouseEventHandler,\n type ReactNode,\n} from 'react'\n\nimport { ThemeName, ThemeProvider } from '@lidofinance/lido-shared-ui'\nimport cn from 'classnames'\n\nimport { IconButton } from '../icon-button'\nimport { IconCross } from '../icons'\nimport styles from './Notification.module.css'\n\nexport type NotificationDataTestId = {\n root?: string\n title?: string\n body?: string\n actions?: string\n subheader?: string\n closeButton?: string\n}\n\nexport type NotificationProps = Omit<\n ComponentPropsWithoutRef<'div'>,\n 'title'\n> & {\n title: ReactNode\n children?: ReactNode\n /** Slot above the title, usually a `Tag`. */\n subheader?: ReactNode\n actions?: ReactNode\n /** Renders a dismiss button when set. */\n onClose?: MouseEventHandler<HTMLButtonElement>\n dataTestId?: NotificationDataTestId\n}\n\nexport const Notification = forwardRef<HTMLDivElement, NotificationProps>(\n (\n {\n title,\n children,\n subheader,\n actions,\n onClose,\n
|
|
1
|
+
{"version":3,"file":"Notification.cjs","sources":["../../../src/notification/Notification.tsx"],"sourcesContent":["import {\n forwardRef,\n useId,\n type ComponentPropsWithoutRef,\n type MouseEventHandler,\n type ReactNode,\n} from 'react'\n\nimport { ThemeName, ThemeProvider } from '@lidofinance/lido-shared-ui'\nimport cn from 'classnames'\n\nimport { IconButton } from '../icon-button'\nimport { IconCross } from '../icons'\nimport styles from './Notification.module.css'\n\nexport type NotificationDataTestId = {\n root?: string\n title?: string\n body?: string\n actions?: string\n subheader?: string\n closeButton?: string\n}\n\nexport type NotificationProps = Omit<\n ComponentPropsWithoutRef<'div'>,\n 'title'\n> & {\n title: ReactNode\n children?: ReactNode\n /** Slot above the title, usually a `Tag`. */\n subheader?: ReactNode\n actions?: ReactNode\n /** Renders a dismiss button when set. A plain `() => void` handler is fine; the click event is rarely needed. */\n onClose?: MouseEventHandler<HTMLButtonElement>\n dataTestId?: NotificationDataTestId\n /** Defaults to `alert`, which is assertive (`undefined` also gives `alert`). Pass `none` inside a toast container that announces for you. */\n role?: ComponentPropsWithoutRef<'div'>['role']\n}\n\nconst isEmpty = (node: ReactNode) =>\n node == null || node === false || node === ''\n\n/** Dark toast that stays dark in both themes; `subheader` slots a `Tag`, `actions` takes small `Button`s, `onClose` adds a dismiss button. */\nexport const Notification = forwardRef<HTMLDivElement, NotificationProps>(\n (\n {\n title,\n children,\n subheader,\n actions,\n onClose,\n role = 'alert',\n className,\n dataTestId,\n ...rest\n },\n ref,\n ) => {\n const titleId = useId()\n\n return (\n <ThemeProvider themeName={ThemeName.dark}>\n <div\n ref={ref}\n role={role}\n className={cn(styles.notification, className)}\n data-testid={dataTestId?.root}\n {...rest}\n >\n <div className={cn(styles.content, onClose && styles.closable)}>\n {!isEmpty(subheader) ? (\n <div\n className={styles.subheader}\n data-testid={dataTestId?.subheader}\n >\n {subheader}\n </div>\n ) : null}\n <p\n id={titleId}\n className={styles.title}\n data-testid={dataTestId?.title}\n >\n {title}\n </p>\n {!isEmpty(children) ? (\n <div className={styles.body} data-testid={dataTestId?.body}>\n {children}\n </div>\n ) : null}\n </div>\n {!isEmpty(actions) ? (\n <div className={styles.actions} data-testid={dataTestId?.actions}>\n {actions}\n </div>\n ) : null}\n {onClose ? (\n <IconButton\n variant='ghost'\n aria-label='Dismiss'\n aria-describedby={titleId}\n icon={<IconCross />}\n className={styles.close}\n onClick={onClose}\n dataTestId={{ root: dataTestId?.closeButton }}\n />\n ) : null}\n </div>\n </ThemeProvider>\n )\n },\n)\n\nNotification.displayName = 'Notification'\n"],"names":["isEmpty","node","Notification","forwardRef","_ref","ref","title","children","subheader","actions","onClose","role","className","dataTestId","rest","titleId","useId","_jsx","ThemeProvider","themeName","ThemeName","dark","_jsxs","cn","styles","notification","root","content","closable","id","body","IconButton","variant","icon","IconCross","close","onClick","closeButton","displayName"],"mappings":";;;;;;;;;;;;AAwCA,MAAMA,OAAO,GAAIC,IAAe,IAC9BA,IAAI,IAAI,IAAI,IAAIA,IAAI,KAAK,KAAK,IAAIA,IAAI,KAAK,EAAE,CAAA;;AAE/C;AACO,MAAMC,YAAY,gBAAGC,gBAAU,CACpC,CAAAC,IAAA,EAYEC,GAAG,KACA;EAAA,IAZH;IACEC,KAAK;IACLC,QAAQ;IACRC,SAAS;IACTC,OAAO;IACPC,OAAO;AACPC,IAAAA,IAAI,GAAG,OAAO;IACdC,SAAS;IACTC,UAAU;IACV,GAAGC,IAAAA;AACL,GAAC,GAAAV,IAAA,CAAA;AAGD,EAAA,MAAMW,OAAO,GAAGC,WAAK,EAAE,CAAA;EAEvB,oBACEC,cAAA,CAACC,0BAAa,EAAA;IAACC,SAAS,EAAEC,sBAAS,CAACC,IAAK;AAAAd,IAAAA,QAAA,eACvCe,eAAA,CAAA,KAAA,EAAA;AACEjB,MAAAA,GAAG,EAAEA,GAAI;AACTM,MAAAA,IAAI,EAAEA,IAAK;MACXC,SAAS,EAAEW,EAAE,CAACC,mBAAM,CAACC,YAAY,EAAEb,SAAS,CAAE;MAC9C,aAAaC,EAAAA,UAAU,EAAEa,IAAK;AAAA,MAAA,GAC1BZ,IAAI;AAAAP,MAAAA,QAAA,gBAERe,eAAA,CAAA,KAAA,EAAA;AAAKV,QAAAA,SAAS,EAAEW,EAAE,CAACC,mBAAM,CAACG,OAAO,EAAEjB,OAAO,IAAIc,mBAAM,CAACI,QAAQ,CAAE;AAAArB,QAAAA,QAAA,GAC5D,CAACP,OAAO,CAACQ,SAAS,CAAC,gBAClBS,cAAA,CAAA,KAAA,EAAA;UACEL,SAAS,EAAEY,mBAAM,CAAChB,SAAU;UAC5B,aAAaK,EAAAA,UAAU,EAAEL,SAAU;AAAAD,UAAAA,QAAA,EAElCC,SAAAA;AAAS,SACP,CAAC,GACJ,IAAI,eACRS,cAAA,CAAA,GAAA,EAAA;AACEY,UAAAA,EAAE,EAAEd,OAAQ;UACZH,SAAS,EAAEY,mBAAM,CAAClB,KAAM;UACxB,aAAaO,EAAAA,UAAU,EAAEP,KAAM;AAAAC,UAAAA,QAAA,EAE9BD,KAAAA;SACA,CAAC,EACH,CAACN,OAAO,CAACO,QAAQ,CAAC,gBACjBU,cAAA,CAAA,KAAA,EAAA;UAAKL,SAAS,EAAEY,mBAAM,CAACM,IAAK;UAAC,aAAajB,EAAAA,UAAU,EAAEiB,IAAK;AAAAvB,UAAAA,QAAA,EACxDA,QAAAA;SACE,CAAC,GACJ,IAAI,CAAA;OACL,CAAC,EACL,CAACP,OAAO,CAACS,OAAO,CAAC,gBAChBQ,cAAA,CAAA,KAAA,EAAA;QAAKL,SAAS,EAAEY,mBAAM,CAACf,OAAQ;QAAC,aAAaI,EAAAA,UAAU,EAAEJ,OAAQ;AAAAF,QAAAA,QAAA,EAC9DE,OAAAA;OACE,CAAC,GACJ,IAAI,EACPC,OAAO,gBACNO,cAAA,CAACc,qBAAU,EAAA;AACTC,QAAAA,OAAO,EAAC,OAAO;AACf,QAAA,YAAA,EAAW,SAAS;AACpB,QAAA,kBAAA,EAAkBjB,OAAQ;AAC1BkB,QAAAA,IAAI,eAAEhB,cAAA,CAACiB,mBAAS,IAAE,CAAE;QACpBtB,SAAS,EAAEY,mBAAM,CAACW,KAAM;AACxBC,QAAAA,OAAO,EAAE1B,OAAQ;AACjBG,QAAAA,UAAU,EAAE;UAAEa,IAAI,EAAEb,UAAU,EAAEwB,WAAAA;AAAY,SAAA;OAC7C,CAAC,GACA,IAAI,CAAA;KACL,CAAA;AAAC,GACO,CAAC,CAAA;AAEpB,CACF,EAAC;AAEDnC,YAAY,CAACoC,WAAW,GAAG,cAAc;;;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
|
|
5
|
+
const react = require('react');
|
|
6
|
+
const cn = require('classnames');
|
|
7
|
+
const Layout_module = require('./Layout.module.css.cjs');
|
|
8
|
+
const jsxRuntime = require('react/jsx-runtime');
|
|
9
|
+
|
|
10
|
+
/** Page root column: banners, SidebarLayout or Header/Main/Footer stack inside; fills the viewport. */
|
|
11
|
+
const Layout = /*#__PURE__*/react.forwardRef((_ref, ref) => {
|
|
12
|
+
let {
|
|
13
|
+
className,
|
|
14
|
+
...rest
|
|
15
|
+
} = _ref;
|
|
16
|
+
return /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
17
|
+
ref: ref,
|
|
18
|
+
className: cn(Layout_module.root, className),
|
|
19
|
+
...rest
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
Layout.displayName = 'Layout';
|
|
23
|
+
|
|
24
|
+
exports.Layout = Layout;
|
|
25
|
+
//# sourceMappingURL=Layout.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Layout.cjs","sources":["../../../src/page-layout/Layout.tsx"],"sourcesContent":["import { forwardRef, type HTMLAttributes } from 'react'\n\nimport cn from 'classnames'\n\nimport styles from './Layout.module.css'\n\nexport type LayoutProps = HTMLAttributes<HTMLDivElement>\n\n/** Page root column: banners, SidebarLayout or Header/Main/Footer stack inside; fills the viewport. */\nexport const Layout = forwardRef<HTMLDivElement, LayoutProps>(\n ({ className, ...rest }, ref) => (\n <div ref={ref} className={cn(styles.root, className)} {...rest} />\n ),\n)\n\nLayout.displayName = 'Layout'\n"],"names":["Layout","forwardRef","_ref","ref","className","rest","_jsx","cn","styles","root","displayName"],"mappings":";;;;;;;;;AAQA;AACO,MAAMA,MAAM,gBAAGC,gBAAU,CAC9B,CAAAC,IAAA,EAAyBC,GAAG,KAAA;EAAA,IAA3B;IAAEC,SAAS;IAAE,GAAGC,IAAAA;AAAK,GAAC,GAAAH,IAAA,CAAA;AAAA,EAAA,oBACrBI,cAAA,CAAA,KAAA,EAAA;AAAKH,IAAAA,GAAG,EAAEA,GAAI;IAACC,SAAS,EAAEG,EAAE,CAACC,aAAM,CAACC,IAAI,EAAEL,SAAS,CAAE;IAAA,GAAKC,IAAAA;AAAI,GAAG,CAAC,CAAA;AAAA,CAEtE,EAAC;AAEDL,MAAM,CAACU,WAAW,GAAG,QAAQ;;;;"}
|