@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Layout.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,29 @@
|
|
|
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 Main_module = require('./Main.module.css.cjs');
|
|
8
|
+
const jsxRuntime = require('react/jsx-runtime');
|
|
9
|
+
|
|
10
|
+
const MAIN_CONTENT_ID = 'main-content';
|
|
11
|
+
/** Page landmark that SkipLink targets; grows to push Footer down. */
|
|
12
|
+
const Main = /*#__PURE__*/react.forwardRef((_ref, ref) => {
|
|
13
|
+
let {
|
|
14
|
+
id = MAIN_CONTENT_ID,
|
|
15
|
+
className,
|
|
16
|
+
...rest
|
|
17
|
+
} = _ref;
|
|
18
|
+
return /*#__PURE__*/jsxRuntime.jsx("main", {
|
|
19
|
+
ref: ref,
|
|
20
|
+
id: id,
|
|
21
|
+
className: cn(Main_module.root, className),
|
|
22
|
+
...rest
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
Main.displayName = 'Main';
|
|
26
|
+
|
|
27
|
+
exports.MAIN_CONTENT_ID = MAIN_CONTENT_ID;
|
|
28
|
+
exports.Main = Main;
|
|
29
|
+
//# sourceMappingURL=Main.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Main.cjs","sources":["../../../src/page-layout/Main.tsx"],"sourcesContent":["import { forwardRef, type ComponentPropsWithoutRef } from 'react'\n\nimport cn from 'classnames'\n\nimport styles from './Main.module.css'\n\nexport const MAIN_CONTENT_ID = 'main-content'\n\nexport type MainProps = ComponentPropsWithoutRef<'main'>\n\n/** Page landmark that SkipLink targets; grows to push Footer down. */\nexport const Main = forwardRef<HTMLElement, MainProps>(\n ({ id = MAIN_CONTENT_ID, className, ...rest }, ref) => (\n <main ref={ref} id={id} className={cn(styles.root, className)} {...rest} />\n ),\n)\n\nMain.displayName = 'Main'\n"],"names":["MAIN_CONTENT_ID","Main","forwardRef","_ref","ref","id","className","rest","_jsx","cn","styles","root","displayName"],"mappings":";;;;;;;;;AAMO,MAAMA,eAAe,GAAG,eAAc;AAI7C;AACO,MAAMC,IAAI,gBAAGC,gBAAU,CAC5B,CAAAC,IAAA,EAA+CC,GAAG,KAAA;EAAA,IAAjD;AAAEC,IAAAA,EAAE,GAAGL,eAAe;IAAEM,SAAS;IAAE,GAAGC,IAAAA;AAAK,GAAC,GAAAJ,IAAA,CAAA;AAAA,EAAA,oBAC3CK,cAAA,CAAA,MAAA,EAAA;AAAMJ,IAAAA,GAAG,EAAEA,GAAI;AAACC,IAAAA,EAAE,EAAEA,EAAG;IAACC,SAAS,EAAEG,EAAE,CAACC,WAAM,CAACC,IAAI,EAAEL,SAAS,CAAE;IAAA,GAAKC,IAAAA;AAAI,GAAG,CAAC,CAAA;AAAA,CAE/E,EAAC;AAEDN,IAAI,CAACW,WAAW,GAAG,MAAM;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Main.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
|
|
5
|
+
const cn = require('classnames');
|
|
6
|
+
const PageContent_module = require('./PageContent.module.css.cjs');
|
|
7
|
+
const jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
const PageContent = _ref => {
|
|
10
|
+
let {
|
|
11
|
+
variant = 'default',
|
|
12
|
+
className,
|
|
13
|
+
...rest
|
|
14
|
+
} = _ref;
|
|
15
|
+
return /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
16
|
+
className: cn(PageContent_module.root, PageContent_module[variant], className),
|
|
17
|
+
...rest
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
exports.PageContent = PageContent;
|
|
22
|
+
//# sourceMappingURL=PageContent.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageContent.cjs","sources":["../../../src/page-layout/PageContent.tsx"],"sourcesContent":["import type { HTMLAttributes } from 'react'\n\nimport cn from 'classnames'\n\nimport styles from './PageContent.module.css'\n\nexport type PageContentVariant = 'default' | 'narrow'\n\nexport type PageContentProps = HTMLAttributes<HTMLDivElement> & {\n variant?: PageContentVariant\n}\n\nexport const PageContent = ({\n variant = 'default',\n className,\n ...rest\n}: PageContentProps) => (\n <div className={cn(styles.root, styles[variant], className)} {...rest} />\n)\n"],"names":["PageContent","_ref","variant","className","rest","_jsx","cn","styles","root"],"mappings":";;;;;;;;AAYO,MAAMA,WAAW,GAAGC,IAAA,IAAA;EAAA,IAAC;AAC1BC,IAAAA,OAAO,GAAG,SAAS;IACnBC,SAAS;IACT,GAAGC,IAAAA;AACa,GAAC,GAAAH,IAAA,CAAA;AAAA,EAAA,oBACjBI,cAAA,CAAA,KAAA,EAAA;AAAKF,IAAAA,SAAS,EAAEG,EAAE,CAACC,kBAAM,CAACC,IAAI,EAAED,kBAAM,CAACL,OAAO,CAAC,EAAEC,SAAS,CAAE;IAAA,GAAKC,IAAAA;AAAI,GAAG,CAAC,CAAA;AAAA;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageContent.module.css.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -18,10 +18,13 @@ const DEFAULT_LABELS = {
|
|
|
18
18
|
records: 'Records',
|
|
19
19
|
of: 'of',
|
|
20
20
|
page: 'Page number',
|
|
21
|
+
pageSize: 'Records per page',
|
|
21
22
|
previous: 'Previous page',
|
|
22
23
|
next: 'Next page'
|
|
23
24
|
};
|
|
24
25
|
const clamp = (value, min, max) => Math.min(Math.max(value, min), max);
|
|
26
|
+
|
|
27
|
+
/** Page-size selector on the left, page input with previous/next controls on the right; Enter or blur jumps to the typed page and out-of-range values are clamped. */
|
|
25
28
|
const Pagination = _ref => {
|
|
26
29
|
let {
|
|
27
30
|
page,
|
|
@@ -42,23 +45,24 @@ const Pagination = _ref => {
|
|
|
42
45
|
const lastPage = Math.max(pageCount, 1);
|
|
43
46
|
// `null` while the input is not being edited — it then mirrors `page`.
|
|
44
47
|
const [draft, setDraft] = react.useState(null);
|
|
48
|
+
const cancelledRef = react.useRef(false);
|
|
45
49
|
const goTo = next => {
|
|
46
50
|
const target = clamp(next, 1, lastPage);
|
|
47
51
|
if (target !== page) onPageChange(target);
|
|
48
52
|
};
|
|
49
53
|
const commitDraft = () => {
|
|
50
|
-
if (draft !== null && draft !== '')
|
|
54
|
+
if (!cancelledRef.current && draft !== null && draft !== '') {
|
|
55
|
+
goTo(Number(draft));
|
|
56
|
+
}
|
|
57
|
+
cancelledRef.current = false;
|
|
51
58
|
setDraft(null);
|
|
52
59
|
};
|
|
53
60
|
const handleInputChange = event => {
|
|
54
61
|
setDraft(event.target.value.replace(/\D/g, ''));
|
|
55
62
|
};
|
|
56
63
|
const handleInputKeyDown = event => {
|
|
57
|
-
if (event.key === '
|
|
58
|
-
|
|
59
|
-
event.currentTarget.blur();
|
|
60
|
-
} else if (event.key === 'Escape') {
|
|
61
|
-
setDraft(null);
|
|
64
|
+
if (event.key === 'Escape') cancelledRef.current = true;
|
|
65
|
+
if (event.key === 'Enter' || event.key === 'Escape') {
|
|
62
66
|
event.currentTarget.blur();
|
|
63
67
|
}
|
|
64
68
|
};
|
|
@@ -91,6 +95,7 @@ const Pagination = _ref => {
|
|
|
91
95
|
size: "small",
|
|
92
96
|
options: sizeOptions,
|
|
93
97
|
value: String(pageSize),
|
|
98
|
+
listLabel: text.pageSize,
|
|
94
99
|
onChange: value => onPageSizeChange?.(Number(value)),
|
|
95
100
|
dataTestId: {
|
|
96
101
|
trigger: dataTestId?.pageSize
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pagination.cjs","sources":["../../../src/pagination/Pagination.tsx"],"sourcesContent":["import {\n useState,\n type ChangeEvent,\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\n\nimport cn from 'classnames'\n\nimport { IconButton } from '../icon-button'\nimport { IconChevronLeft, IconChevronRight } from '../icons'\nimport { Input } from '../input'\nimport { TokenSelector } from '../token-selector'\nimport styles from './Pagination.module.css'\n\nexport type PaginationLabels = {\n show?: ReactNode\n records?: ReactNode\n of?: ReactNode\n page?: string\n previous?: string\n next?: string\n}\n\nexport type PaginationDataTestId = {\n root?: string\n pageSize?: string\n pageInput?: string\n previous?: string\n next?: string\n}\n\nexport type PaginationProps = Omit<\n ComponentPropsWithoutRef<'div'>,\n 'onChange'\n> & {\n /** Current page, 1-based. The component is controlled. */\n page: number\n pageCount: number\n onPageChange: (page: number) => void\n /** Current page size. The \"Show N Records\" block renders only when set. */\n pageSize?: number\n pageSizeOptions?: number[]\n onPageSizeChange?: (pageSize: number) => void\n labels?: PaginationLabels\n dataTestId?: PaginationDataTestId\n}\n\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100]\n\nconst DEFAULT_LABELS: Required<PaginationLabels> = {\n show: 'Show',\n records: 'Records',\n of: 'of',\n page: 'Page number',\n previous: 'Previous page',\n next: 'Next page',\n}\n\nconst clamp = (value: number, min: number, max: number) =>\n Math.min(Math.max(value, min), max)\n\nexport const Pagination = ({\n page,\n pageCount,\n onPageChange,\n pageSize,\n pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,\n onPageSizeChange,\n labels,\n className,\n dataTestId,\n ...rest\n}: PaginationProps) => {\n const text = { ...DEFAULT_LABELS, ...labels }\n const lastPage = Math.max(pageCount, 1)\n // `null` while the input is not being edited — it then mirrors `page`.\n const [draft, setDraft] = useState<string | null>(null)\n\n const goTo = (next: number) => {\n const target = clamp(next, 1, lastPage)\n if (target !== page) onPageChange(target)\n }\n\n const commitDraft = () => {\n if (draft !== null && draft !== '') goTo(Number(draft))\n setDraft(null)\n }\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n setDraft(event.target.value.replace(/\\D/g, ''))\n }\n\n const handleInputKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n commitDraft()\n event.currentTarget.blur()\n } else if (event.key === 'Escape') {\n setDraft(null)\n event.currentTarget.blur()\n }\n }\n\n const handleInputFocus = (event: FocusEvent<HTMLInputElement>) => {\n setDraft(String(page))\n event.currentTarget.select()\n }\n\n const sizeOptions = (\n pageSize != null && !pageSizeOptions.includes(pageSize)\n ? [...pageSizeOptions, pageSize].sort((a, b) => a - b)\n : pageSizeOptions\n ).map((size) => ({\n value: String(size),\n label: <span className={styles.pageSizeLabel}>{size}</span>,\n }))\n\n const fieldStyle = {\n '--local-digits': String(lastPage).length,\n } as CSSProperties\n\n return (\n <div\n className={cn(styles.pagination, className)}\n data-testid={dataTestId?.root}\n {...rest}\n >\n {pageSize != null ? (\n <div className={styles.group}>\n <span className={styles.text}>{text.show}</span>\n <span className={styles.pageSize}>\n <TokenSelector\n size='small'\n options={sizeOptions}\n value={String(pageSize)}\n onChange={(value) => onPageSizeChange?.(Number(value))}\n dataTestId={{ trigger: dataTestId?.pageSize }}\n />\n </span>\n <span className={styles.text}>{text.records}</span>\n </div>\n ) : null}\n <div className={styles.group}>\n <IconButton\n variant='ghost'\n icon={<IconChevronLeft />}\n aria-label={text.previous}\n disabled={page <= 1}\n onClick={() => goTo(page - 1)}\n dataTestId={{ root: dataTestId?.previous }}\n />\n <span className={styles.pageField} style={fieldStyle}>\n <Input\n size='small'\n type='text'\n inputMode='numeric'\n aria-label={text.page}\n value={draft ?? String(page)}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onBlur={commitDraft}\n onKeyDown={handleInputKeyDown}\n dataTestId={{ input: dataTestId?.pageInput }}\n />\n </span>\n <span className={styles.text}>\n {text.of} {lastPage}\n </span>\n <IconButton\n variant='ghost'\n icon={<IconChevronRight />}\n aria-label={text.next}\n disabled={page >= lastPage}\n onClick={() => goTo(page + 1)}\n dataTestId={{ root: dataTestId?.next }}\n />\n </div>\n </div>\n )\n}\n"],"names":["DEFAULT_PAGE_SIZE_OPTIONS","DEFAULT_LABELS","show","records","of","page","previous","next","clamp","value","min","max","Math","Pagination","_ref","pageCount","onPageChange","pageSize","pageSizeOptions","onPageSizeChange","labels","className","dataTestId","rest","text","lastPage","draft","setDraft","useState","goTo","target","commitDraft","Number","handleInputChange","event","replace","handleInputKeyDown","key","currentTarget","blur","handleInputFocus","String","select","sizeOptions","includes","sort","a","b","map","size","label","_jsx","styles","pageSizeLabel","children","fieldStyle","length","_jsxs","cn","pagination","root","group","TokenSelector","options","onChange","trigger","IconButton","variant","icon","IconChevronLeft","disabled","onClick","pageField","style","Input","type","inputMode","onFocus","onBlur","onKeyDown","input","pageInput","IconChevronRight"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Pagination.cjs","sources":["../../../src/pagination/Pagination.tsx"],"sourcesContent":["import {\n useRef,\n useState,\n type ChangeEvent,\n type ComponentPropsWithoutRef,\n type CSSProperties,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\n\nimport cn from 'classnames'\n\nimport { IconButton } from '../icon-button'\nimport { IconChevronLeft, IconChevronRight } from '../icons'\nimport { Input } from '../input'\nimport { TokenSelector } from '../token-selector'\nimport styles from './Pagination.module.css'\n\nexport type PaginationLabels = {\n show?: ReactNode\n records?: ReactNode\n of?: ReactNode\n page?: string\n pageSize?: string\n previous?: string\n next?: string\n}\n\nexport type PaginationDataTestId = {\n root?: string\n pageSize?: string\n pageInput?: string\n previous?: string\n next?: string\n}\n\nexport type PaginationProps = Omit<\n ComponentPropsWithoutRef<'div'>,\n 'onChange'\n> & {\n /** Current page, 1-based. The component is controlled. */\n page: number\n pageCount: number\n onPageChange: (page: number) => void\n /** Current page size. The \"Show N Records\" block renders only when set. */\n pageSize?: number\n pageSizeOptions?: number[]\n onPageSizeChange?: (pageSize: number) => void\n /** Visible texts and `aria-label`s, for i18n. */\n labels?: PaginationLabels\n dataTestId?: PaginationDataTestId\n}\n\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100]\n\nconst DEFAULT_LABELS: Required<PaginationLabels> = {\n show: 'Show',\n records: 'Records',\n of: 'of',\n page: 'Page number',\n pageSize: 'Records per page',\n previous: 'Previous page',\n next: 'Next page',\n}\n\nconst clamp = (value: number, min: number, max: number) =>\n Math.min(Math.max(value, min), max)\n\n/** Page-size selector on the left, page input with previous/next controls on the right; Enter or blur jumps to the typed page and out-of-range values are clamped. */\nexport const Pagination = ({\n page,\n pageCount,\n onPageChange,\n pageSize,\n pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,\n onPageSizeChange,\n labels,\n className,\n dataTestId,\n ...rest\n}: PaginationProps) => {\n const text = { ...DEFAULT_LABELS, ...labels }\n const lastPage = Math.max(pageCount, 1)\n // `null` while the input is not being edited — it then mirrors `page`.\n const [draft, setDraft] = useState<string | null>(null)\n const cancelledRef = useRef(false)\n\n const goTo = (next: number) => {\n const target = clamp(next, 1, lastPage)\n if (target !== page) onPageChange(target)\n }\n\n const commitDraft = () => {\n if (!cancelledRef.current && draft !== null && draft !== '') {\n goTo(Number(draft))\n }\n cancelledRef.current = false\n setDraft(null)\n }\n\n const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {\n setDraft(event.target.value.replace(/\\D/g, ''))\n }\n\n const handleInputKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Escape') cancelledRef.current = true\n if (event.key === 'Enter' || event.key === 'Escape') {\n event.currentTarget.blur()\n }\n }\n\n const handleInputFocus = (event: FocusEvent<HTMLInputElement>) => {\n setDraft(String(page))\n event.currentTarget.select()\n }\n\n const sizeOptions = (\n pageSize != null && !pageSizeOptions.includes(pageSize)\n ? [...pageSizeOptions, pageSize].sort((a, b) => a - b)\n : pageSizeOptions\n ).map((size) => ({\n value: String(size),\n label: <span className={styles.pageSizeLabel}>{size}</span>,\n }))\n\n const fieldStyle = {\n '--local-digits': String(lastPage).length,\n } as CSSProperties\n\n return (\n <div\n className={cn(styles.pagination, className)}\n data-testid={dataTestId?.root}\n {...rest}\n >\n {pageSize != null ? (\n <div className={styles.group}>\n <span className={styles.text}>{text.show}</span>\n <span className={styles.pageSize}>\n <TokenSelector\n size='small'\n options={sizeOptions}\n value={String(pageSize)}\n listLabel={text.pageSize}\n onChange={(value) => onPageSizeChange?.(Number(value))}\n dataTestId={{ trigger: dataTestId?.pageSize }}\n />\n </span>\n <span className={styles.text}>{text.records}</span>\n </div>\n ) : null}\n <div className={styles.group}>\n <IconButton\n variant='ghost'\n icon={<IconChevronLeft />}\n aria-label={text.previous}\n disabled={page <= 1}\n onClick={() => goTo(page - 1)}\n dataTestId={{ root: dataTestId?.previous }}\n />\n <span className={styles.pageField} style={fieldStyle}>\n <Input\n size='small'\n type='text'\n inputMode='numeric'\n aria-label={text.page}\n value={draft ?? String(page)}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onBlur={commitDraft}\n onKeyDown={handleInputKeyDown}\n dataTestId={{ input: dataTestId?.pageInput }}\n />\n </span>\n <span className={styles.text}>\n {text.of} {lastPage}\n </span>\n <IconButton\n variant='ghost'\n icon={<IconChevronRight />}\n aria-label={text.next}\n disabled={page >= lastPage}\n onClick={() => goTo(page + 1)}\n dataTestId={{ root: dataTestId?.next }}\n />\n </div>\n </div>\n )\n}\n"],"names":["DEFAULT_PAGE_SIZE_OPTIONS","DEFAULT_LABELS","show","records","of","page","pageSize","previous","next","clamp","value","min","max","Math","Pagination","_ref","pageCount","onPageChange","pageSizeOptions","onPageSizeChange","labels","className","dataTestId","rest","text","lastPage","draft","setDraft","useState","cancelledRef","useRef","goTo","target","commitDraft","current","Number","handleInputChange","event","replace","handleInputKeyDown","key","currentTarget","blur","handleInputFocus","String","select","sizeOptions","includes","sort","a","b","map","size","label","_jsx","styles","pageSizeLabel","children","fieldStyle","length","_jsxs","cn","pagination","root","group","TokenSelector","options","listLabel","onChange","trigger","IconButton","variant","icon","IconChevronLeft","disabled","onClick","pageField","style","Input","type","inputMode","onFocus","onBlur","onKeyDown","input","pageInput","IconChevronRight"],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ const useFocusTrap = require('../hooks/useFocusTrap.cjs');
|
|
|
12
12
|
const useEscape = require('../hooks/useEscape.cjs');
|
|
13
13
|
const useOutsideClick = require('../hooks/useOutsideClick.cjs');
|
|
14
14
|
|
|
15
|
-
const POSITION_KEYS = ['top', 'bottom', 'left', 'right', 'width'];
|
|
15
|
+
const POSITION_KEYS = ['top', 'bottom', 'left', 'right', 'width', 'maxHeight', 'maxWidth'];
|
|
16
16
|
const samePosition = (a, b) => a != null && a.placement === b.placement && POSITION_KEYS.every(key => a.coordinates[key] === b.coordinates[key]);
|
|
17
17
|
const VIEWPORT_MARGIN = 8;
|
|
18
18
|
const clamp = (value, max) => Math.max(VIEWPORT_MARGIN, Math.min(value, max));
|
|
@@ -24,13 +24,17 @@ const computePosition = (anchor, alignEl, panel, placement, align, offset, width
|
|
|
24
24
|
const fixedWidth = typeof width === 'number' ? width : width === 'anchor' ? anchorRect.width : width === 'align' ? alignRect.width : undefined;
|
|
25
25
|
const panelWidth = fixedWidth ?? panel?.getBoundingClientRect().width ?? 0;
|
|
26
26
|
const maxEdge = viewportWidth - VIEWPORT_MARGIN - panelWidth;
|
|
27
|
-
|
|
27
|
+
|
|
28
|
+
// Natural height, not the capped rect, so a capped panel can still flip to the bigger side.
|
|
29
|
+
const panelHeight = panel ? Math.max(panel.getBoundingClientRect().height, panel.scrollHeight + panel.offsetHeight - panel.clientHeight) : 0;
|
|
28
30
|
const roomBelow = viewportHeight - anchorRect.bottom - offset - VIEWPORT_MARGIN;
|
|
29
31
|
const roomAbove = anchorRect.top - offset - VIEWPORT_MARGIN;
|
|
30
32
|
const [room, opposite] = placement === 'top' ? [roomAbove, roomBelow] : [roomBelow, roomAbove];
|
|
31
33
|
const resolved = panelHeight > room && opposite > room ? placement === 'top' ? 'bottom' : 'top' : placement;
|
|
32
34
|
const coordinates = {};
|
|
33
35
|
if (fixedWidth != null) coordinates.width = fixedWidth;
|
|
36
|
+
coordinates.maxWidth = viewportWidth - 2 * VIEWPORT_MARGIN;
|
|
37
|
+
coordinates.maxHeight = Math.max(resolved === 'top' ? roomAbove : roomBelow, 0);
|
|
34
38
|
if (resolved === 'top') {
|
|
35
39
|
coordinates.bottom = viewportHeight - anchorRect.top + offset;
|
|
36
40
|
} else {
|
|
@@ -48,22 +52,25 @@ const computePosition = (anchor, alignEl, panel, placement, align, offset, width
|
|
|
48
52
|
coordinates
|
|
49
53
|
};
|
|
50
54
|
};
|
|
51
|
-
const PopoverPanel = _ref => {
|
|
55
|
+
const PopoverPanel = /*#__PURE__*/react.forwardRef((_ref, ref) => {
|
|
52
56
|
let {
|
|
53
57
|
onClose,
|
|
54
58
|
anchorRef,
|
|
55
59
|
alignRef,
|
|
56
|
-
placement
|
|
57
|
-
align
|
|
58
|
-
offset
|
|
60
|
+
placement,
|
|
61
|
+
align,
|
|
62
|
+
offset,
|
|
59
63
|
width,
|
|
60
|
-
modal
|
|
64
|
+
modal,
|
|
61
65
|
className,
|
|
62
66
|
style,
|
|
63
67
|
children,
|
|
68
|
+
onFocus,
|
|
69
|
+
dataTestId,
|
|
64
70
|
...rest
|
|
65
71
|
} = _ref;
|
|
66
72
|
const [panel, setPanel] = react.useState(null);
|
|
73
|
+
react.useImperativeHandle(ref, () => panel, [panel]);
|
|
67
74
|
const [position, setPosition] = react.useState(null);
|
|
68
75
|
useIsomorphicLayoutEffect.useIsomorphicLayoutEffect(() => {
|
|
69
76
|
const update = () => {
|
|
@@ -82,7 +89,8 @@ const PopoverPanel = _ref => {
|
|
|
82
89
|
window.addEventListener('resize', schedule);
|
|
83
90
|
window.addEventListener('scroll', schedule, true);
|
|
84
91
|
const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(schedule);
|
|
85
|
-
|
|
92
|
+
const observed = [anchorRef.current, alignRef?.current, panel];
|
|
93
|
+
observed.forEach(el => el && observer?.observe(el));
|
|
86
94
|
return () => {
|
|
87
95
|
observer?.disconnect();
|
|
88
96
|
cancelAnimationFrame(frame);
|
|
@@ -90,26 +98,34 @@ const PopoverPanel = _ref => {
|
|
|
90
98
|
window.removeEventListener('scroll', schedule, true);
|
|
91
99
|
};
|
|
92
100
|
}, [anchorRef, alignRef, panel, placement, align, offset, width]);
|
|
93
|
-
useFocusTrap.useFocusTrap(panel,
|
|
101
|
+
useFocusTrap.useFocusTrap(panel, {
|
|
102
|
+
enabled: modal && position != null,
|
|
94
103
|
restoreFocus: false
|
|
95
104
|
});
|
|
96
|
-
useEscape.useEscape(
|
|
105
|
+
useEscape.useEscape(onClose);
|
|
97
106
|
useOutsideClick.useOutsideClick(panel, event => {
|
|
98
107
|
// Anchor clicks are left to the anchor's own toggle handler.
|
|
99
108
|
if (event.target instanceof Node && anchorRef.current?.contains(event.target)) return;
|
|
100
109
|
onClose();
|
|
101
|
-
}
|
|
110
|
+
});
|
|
102
111
|
|
|
103
112
|
// Passive cleanup runs after the panel left the DOM; focus is on body unless the user moved it elsewhere.
|
|
113
|
+
// Only when focus was inside the panel, so a non-modal hover close doesn't pull focus to the anchor.
|
|
114
|
+
const hadFocus = react.useRef(false);
|
|
104
115
|
react.useEffect(() => () => {
|
|
105
116
|
const active = document.activeElement;
|
|
106
|
-
if (!active || active === document.body) anchorRef.current?.focus();
|
|
117
|
+
if (hadFocus.current && (!active || active === document.body)) anchorRef.current?.focus();
|
|
107
118
|
}, [anchorRef]);
|
|
119
|
+
const handleFocus = event => {
|
|
120
|
+
hadFocus.current = true;
|
|
121
|
+
onFocus?.(event);
|
|
122
|
+
};
|
|
108
123
|
return /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
109
124
|
ref: setPanel,
|
|
110
125
|
role: "dialog",
|
|
111
126
|
"aria-modal": modal || undefined,
|
|
112
127
|
"data-placement": position?.placement,
|
|
128
|
+
"data-testid": dataTestId?.root,
|
|
113
129
|
className: cn(Popover_module.panel, className),
|
|
114
130
|
style: {
|
|
115
131
|
...position?.coordinates,
|
|
@@ -117,20 +133,60 @@ const PopoverPanel = _ref => {
|
|
|
117
133
|
visibility: position ? undefined : 'hidden'
|
|
118
134
|
},
|
|
119
135
|
...rest,
|
|
136
|
+
onFocus: handleFocus,
|
|
120
137
|
children: children
|
|
121
138
|
});
|
|
139
|
+
});
|
|
140
|
+
PopoverPanel.displayName = 'PopoverPanel';
|
|
141
|
+
|
|
142
|
+
// Attributes the consumer already set on the anchor stay theirs; only missing ones are managed here.
|
|
143
|
+
const useAnchorAria = (anchorRef, open, panelId) => {
|
|
144
|
+
react.useEffect(() => {
|
|
145
|
+
const anchor = anchorRef.current;
|
|
146
|
+
if (!anchor) return;
|
|
147
|
+
const managed = {
|
|
148
|
+
'aria-haspopup': 'dialog',
|
|
149
|
+
'aria-expanded': String(open)
|
|
150
|
+
};
|
|
151
|
+
if (open) managed['aria-controls'] = panelId;
|
|
152
|
+
const owned = Object.keys(managed).filter(name => !anchor.hasAttribute(name));
|
|
153
|
+
owned.forEach(name => anchor.setAttribute(name, managed[name]));
|
|
154
|
+
return () => owned.forEach(name => anchor.removeAttribute(name));
|
|
155
|
+
}, [anchorRef, open, panelId]);
|
|
122
156
|
};
|
|
123
|
-
|
|
157
|
+
|
|
158
|
+
/** Floating panel in a portal, positioned against `anchorRef`; modal by default (focus moves in and is trapped), name it with `aria-label` or `aria-labelledby`. */
|
|
159
|
+
const Popover = /*#__PURE__*/react.forwardRef((_ref2, ref) => {
|
|
124
160
|
let {
|
|
125
161
|
open,
|
|
162
|
+
placement = 'bottom',
|
|
163
|
+
align = 'start',
|
|
164
|
+
offset = 8,
|
|
165
|
+
modal = true,
|
|
126
166
|
...props
|
|
127
167
|
} = _ref2;
|
|
168
|
+
const generatedId = react.useId();
|
|
169
|
+
const id = props.id ?? generatedId;
|
|
170
|
+
useAnchorAria(props.anchorRef, open, id);
|
|
171
|
+
const named = Boolean(props['aria-label'] || props['aria-labelledby']);
|
|
172
|
+
react.useEffect(() => {
|
|
173
|
+
if (process.env.NODE_ENV !== 'production' && open && !named) {
|
|
174
|
+
console.warn('Popover: role="dialog" needs aria-label or aria-labelledby.');
|
|
175
|
+
}
|
|
176
|
+
}, [open, named]);
|
|
128
177
|
return open ? /*#__PURE__*/jsxRuntime.jsx(Portal.Portal, {
|
|
129
178
|
children: /*#__PURE__*/jsxRuntime.jsx(PopoverPanel, {
|
|
130
|
-
|
|
179
|
+
ref: ref,
|
|
180
|
+
...props,
|
|
181
|
+
placement: placement,
|
|
182
|
+
align: align,
|
|
183
|
+
offset: offset,
|
|
184
|
+
modal: modal,
|
|
185
|
+
id: id
|
|
131
186
|
})
|
|
132
187
|
}) : null;
|
|
133
|
-
};
|
|
188
|
+
});
|
|
189
|
+
Popover.displayName = 'Popover';
|
|
134
190
|
|
|
135
191
|
exports.Popover = Popover;
|
|
136
192
|
//# sourceMappingURL=Popover.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Popover.cjs","sources":["../../../src/popover/Popover.tsx"],"sourcesContent":["import { useEffect, useState, type HTMLAttributes, type RefObject } from 'react'\n\nimport cn from 'classnames'\n\nimport {\n Portal,\n useEscape,\n useFocusTrap,\n useIsomorphicLayoutEffect,\n useOutsideClick,\n} from '../hooks'\nimport styles from './Popover.module.css'\n\nexport type PopoverPlacement = 'top' | 'bottom'\nexport type PopoverAlign = 'start' | 'center' | 'end'\nexport type PopoverOffset = 0 | 2 | 4 | 8 | 12 | 16 | 20 | 24 | 32 | 40 | 52\n\nexport type PopoverProps = HTMLAttributes<HTMLDivElement> & {\n open: boolean\n onClose: () => void\n anchorRef: RefObject<HTMLElement | null>\n /** Element whose edge the panel aligns to; defaults to the anchor. */\n alignRef?: RefObject<HTMLElement | null>\n placement?: PopoverPlacement\n align?: PopoverAlign\n /** Gap in px between the anchor and the panel. */\n offset?: PopoverOffset\n /** Px, or match the width of the anchor / align element. */\n width?: number | 'anchor' | 'align'\n /** When false, focus stays where it is and isn't trapped, e.g. for menus opened by hover. */\n modal?: boolean\n}\n\nconst POSITION_KEYS = ['top', 'bottom', 'left', 'right', 'width'] as const\ntype Coordinates = Partial<Record<(typeof POSITION_KEYS)[number], number>>\ntype Position = { placement: PopoverPlacement; coordinates: Coordinates }\n\nconst samePosition = (a: Position | null, b: Position) =>\n a != null &&\n a.placement === b.placement &&\n POSITION_KEYS.every((key) => a.coordinates[key] === b.coordinates[key])\n\nconst VIEWPORT_MARGIN = 8\n\nconst clamp = (value: number, max: number) =>\n Math.max(VIEWPORT_MARGIN, Math.min(value, max))\n\nconst computePosition = (\n anchor: HTMLElement,\n alignEl: HTMLElement,\n panel: HTMLElement | null,\n placement: PopoverPlacement,\n align: PopoverAlign,\n offset: number,\n width: PopoverProps['width'],\n): Position => {\n const anchorRect = anchor.getBoundingClientRect()\n const alignRect =\n alignEl === anchor ? anchorRect : alignEl.getBoundingClientRect()\n const viewportWidth = document.documentElement.clientWidth\n const viewportHeight = document.documentElement.clientHeight\n\n const fixedWidth =\n typeof width === 'number'\n ? width\n : width === 'anchor'\n ? anchorRect.width\n : width === 'align'\n ? alignRect.width\n : undefined\n const panelWidth = fixedWidth ?? panel?.getBoundingClientRect().width ?? 0\n const maxEdge = viewportWidth - VIEWPORT_MARGIN - panelWidth\n\n const panelHeight = panel?.getBoundingClientRect().height ?? 0\n const roomBelow =\n viewportHeight - anchorRect.bottom - offset - VIEWPORT_MARGIN\n const roomAbove = anchorRect.top - offset - VIEWPORT_MARGIN\n const [room, opposite] =\n placement === 'top' ? [roomAbove, roomBelow] : [roomBelow, roomAbove]\n const resolved: PopoverPlacement =\n panelHeight > room && opposite > room\n ? placement === 'top'\n ? 'bottom'\n : 'top'\n : placement\n\n const coordinates: Coordinates = {}\n if (fixedWidth != null) coordinates.width = fixedWidth\n if (resolved === 'top') {\n coordinates.bottom = viewportHeight - anchorRect.top + offset\n } else {\n coordinates.top = anchorRect.bottom + offset\n }\n if (align === 'end') {\n coordinates.right = clamp(viewportWidth - alignRect.right, maxEdge)\n } else if (align === 'center') {\n coordinates.left = clamp(\n alignRect.left + alignRect.width / 2 - panelWidth / 2,\n maxEdge,\n )\n } else {\n coordinates.left = clamp(alignRect.left, maxEdge)\n }\n return { placement: resolved, coordinates }\n}\n\nconst PopoverPanel = ({\n onClose,\n anchorRef,\n alignRef,\n placement = 'bottom',\n align = 'start',\n offset = 8,\n width,\n modal = true,\n className,\n style,\n children,\n ...rest\n}: Omit<PopoverProps, 'open'>) => {\n const [panel, setPanel] = useState<HTMLDivElement | null>(null)\n const [position, setPosition] = useState<Position | null>(null)\n\n useIsomorphicLayoutEffect(() => {\n const update = () => {\n const anchor = anchorRef.current\n if (!anchor) return\n const next = computePosition(\n anchor,\n alignRef?.current ?? anchor,\n panel,\n placement,\n align,\n offset,\n width,\n )\n // Keeps the previous object so unchanged scroll/resize frames skip a re-render.\n setPosition((prev) => (samePosition(prev, next) ? prev : next))\n }\n update()\n let frame = 0\n const schedule = () => {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(update)\n }\n window.addEventListener('resize', schedule)\n window.addEventListener('scroll', schedule, true)\n const observer =\n typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(schedule)\n if (anchorRef.current) observer?.observe(anchorRef.current)\n return () => {\n observer?.disconnect()\n cancelAnimationFrame(frame)\n window.removeEventListener('resize', schedule)\n window.removeEventListener('scroll', schedule, true)\n }\n }, [anchorRef, alignRef, panel, placement, align, offset, width])\n\n useFocusTrap(panel, modal && position != null, { restoreFocus: false })\n useEscape(true, onClose)\n useOutsideClick(\n panel,\n (event) => {\n // Anchor clicks are left to the anchor's own toggle handler.\n if (\n event.target instanceof Node &&\n anchorRef.current?.contains(event.target)\n )\n return\n onClose()\n },\n true,\n )\n\n // Passive cleanup runs after the panel left the DOM; focus is on body unless the user moved it elsewhere.\n useEffect(\n () => () => {\n const active = document.activeElement\n if (!active || active === document.body) anchorRef.current?.focus()\n },\n [anchorRef],\n )\n\n return (\n <div\n ref={setPanel}\n role='dialog'\n aria-modal={modal || undefined}\n data-placement={position?.placement}\n className={cn(styles.panel, className)}\n style={{\n ...position?.coordinates,\n ...style,\n visibility: position ? undefined : 'hidden',\n }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nexport const Popover = ({ open, ...props }: PopoverProps) =>\n open ? (\n <Portal>\n <PopoverPanel {...props} />\n </Portal>\n ) : null\n"],"names":["POSITION_KEYS","samePosition","a","b","placement","every","key","coordinates","VIEWPORT_MARGIN","clamp","value","max","Math","min","computePosition","anchor","alignEl","panel","align","offset","width","anchorRect","getBoundingClientRect","alignRect","viewportWidth","document","documentElement","clientWidth","viewportHeight","clientHeight","fixedWidth","undefined","panelWidth","maxEdge","panelHeight","height","roomBelow","bottom","roomAbove","top","room","opposite","resolved","right","left","PopoverPanel","_ref","onClose","anchorRef","alignRef","modal","className","style","children","rest","setPanel","useState","position","setPosition","useIsomorphicLayoutEffect","update","current","next","prev","frame","schedule","cancelAnimationFrame","requestAnimationFrame","window","addEventListener","observer","ResizeObserver","observe","disconnect","removeEventListener","useFocusTrap","restoreFocus","useEscape","useOutsideClick","event","target","Node","contains","useEffect","active","activeElement","body","focus","_jsx","ref","role","cn","styles","visibility","Popover","_ref2","open","props","Portal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Popover.cjs","sources":["../../../src/popover/Popover.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useId,\n useImperativeHandle,\n useRef,\n useState,\n type FocusEvent,\n type HTMLAttributes,\n type RefObject,\n} from 'react'\n\nimport cn from 'classnames'\n\nimport {\n Portal,\n useEscape,\n useFocusTrap,\n useIsomorphicLayoutEffect,\n useOutsideClick,\n} from '../hooks'\nimport styles from './Popover.module.css'\n\nexport type PopoverPlacement = 'top' | 'bottom'\nexport type PopoverAlign = 'start' | 'center' | 'end'\nexport type PopoverOffset = number\nexport type PopoverDataTestId = { root?: string }\n\nexport type PopoverProps = HTMLAttributes<HTMLDivElement> & {\n open: boolean\n /** Called on Escape and outside clicks; clicks on the anchor are ignored so it can toggle. */\n onClose: () => void\n /** Element the panel is positioned against; gets `aria-haspopup`, `aria-expanded` and `aria-controls` unless it sets them. */\n anchorRef: RefObject<HTMLElement | null>\n /** Element whose edge the panel aligns to; defaults to the anchor. */\n alignRef?: RefObject<HTMLElement | null>\n /** Preferred side; flips when the panel does not fit. */\n placement?: PopoverPlacement\n /** Edge of the anchor (or `alignRef`) the panel lines up with. */\n align?: PopoverAlign\n /** Gap in px between the anchor and the panel. */\n offset?: number\n /** Px, or match the width of the anchor / align element. */\n width?: number | 'anchor' | 'align'\n /** false: focus isn't moved into or trapped in the panel. Only for content that never needs focus, e.g. hover previews that also have a click/keyboard path, or listboxes anchored to an input. Not for menus. */\n modal?: boolean\n dataTestId?: PopoverDataTestId\n}\n\nconst POSITION_KEYS = [\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'width',\n 'maxHeight',\n 'maxWidth',\n] as const\ntype Coordinates = Partial<Record<(typeof POSITION_KEYS)[number], number>>\ntype Position = { placement: PopoverPlacement; coordinates: Coordinates }\n\nconst samePosition = (a: Position | null, b: Position) =>\n a != null &&\n a.placement === b.placement &&\n POSITION_KEYS.every((key) => a.coordinates[key] === b.coordinates[key])\n\nconst VIEWPORT_MARGIN = 8\n\nconst clamp = (value: number, max: number) =>\n Math.max(VIEWPORT_MARGIN, Math.min(value, max))\n\nconst computePosition = (\n anchor: HTMLElement,\n alignEl: HTMLElement,\n panel: HTMLElement | null,\n placement: PopoverPlacement,\n align: PopoverAlign,\n offset: number,\n width: PopoverProps['width'],\n): Position => {\n const anchorRect = anchor.getBoundingClientRect()\n const alignRect =\n alignEl === anchor ? anchorRect : alignEl.getBoundingClientRect()\n const viewportWidth = document.documentElement.clientWidth\n const viewportHeight = document.documentElement.clientHeight\n\n const fixedWidth =\n typeof width === 'number'\n ? width\n : width === 'anchor'\n ? anchorRect.width\n : width === 'align'\n ? alignRect.width\n : undefined\n const panelWidth = fixedWidth ?? panel?.getBoundingClientRect().width ?? 0\n const maxEdge = viewportWidth - VIEWPORT_MARGIN - panelWidth\n\n // Natural height, not the capped rect, so a capped panel can still flip to the bigger side.\n const panelHeight = panel\n ? Math.max(\n panel.getBoundingClientRect().height,\n panel.scrollHeight + panel.offsetHeight - panel.clientHeight,\n )\n : 0\n const roomBelow =\n viewportHeight - anchorRect.bottom - offset - VIEWPORT_MARGIN\n const roomAbove = anchorRect.top - offset - VIEWPORT_MARGIN\n const [room, opposite] =\n placement === 'top' ? [roomAbove, roomBelow] : [roomBelow, roomAbove]\n const resolved: PopoverPlacement =\n panelHeight > room && opposite > room\n ? placement === 'top'\n ? 'bottom'\n : 'top'\n : placement\n\n const coordinates: Coordinates = {}\n if (fixedWidth != null) coordinates.width = fixedWidth\n coordinates.maxWidth = viewportWidth - 2 * VIEWPORT_MARGIN\n coordinates.maxHeight = Math.max(\n resolved === 'top' ? roomAbove : roomBelow,\n 0,\n )\n if (resolved === 'top') {\n coordinates.bottom = viewportHeight - anchorRect.top + offset\n } else {\n coordinates.top = anchorRect.bottom + offset\n }\n if (align === 'end') {\n coordinates.right = clamp(viewportWidth - alignRect.right, maxEdge)\n } else if (align === 'center') {\n coordinates.left = clamp(\n alignRect.left + alignRect.width / 2 - panelWidth / 2,\n maxEdge,\n )\n } else {\n coordinates.left = clamp(alignRect.left, maxEdge)\n }\n return { placement: resolved, coordinates }\n}\n\nconst PopoverPanel = forwardRef<\n HTMLDivElement,\n Omit<PopoverProps, 'open'> &\n Required<Pick<PopoverProps, 'placement' | 'align' | 'offset' | 'modal'>>\n>(\n (\n {\n onClose,\n anchorRef,\n alignRef,\n placement,\n align,\n offset,\n width,\n modal,\n className,\n style,\n children,\n onFocus,\n dataTestId,\n ...rest\n },\n ref,\n ) => {\n const [panel, setPanel] = useState<HTMLDivElement | null>(null)\n useImperativeHandle(ref, () => panel as HTMLDivElement, [panel])\n const [position, setPosition] = useState<Position | null>(null)\n\n useIsomorphicLayoutEffect(() => {\n const update = () => {\n const anchor = anchorRef.current\n if (!anchor) return\n const next = computePosition(\n anchor,\n alignRef?.current ?? anchor,\n panel,\n placement,\n align,\n offset,\n width,\n )\n // Keeps the previous object so unchanged scroll/resize frames skip a re-render.\n setPosition((prev) => (samePosition(prev, next) ? prev : next))\n }\n update()\n let frame = 0\n const schedule = () => {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(update)\n }\n window.addEventListener('resize', schedule)\n window.addEventListener('scroll', schedule, true)\n const observer =\n typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(schedule)\n const observed = [anchorRef.current, alignRef?.current, panel]\n observed.forEach((el) => el && observer?.observe(el))\n return () => {\n observer?.disconnect()\n cancelAnimationFrame(frame)\n window.removeEventListener('resize', schedule)\n window.removeEventListener('scroll', schedule, true)\n }\n }, [anchorRef, alignRef, panel, placement, align, offset, width])\n\n useFocusTrap(panel, {\n enabled: modal && position != null,\n restoreFocus: false,\n })\n useEscape(onClose)\n useOutsideClick(panel, (event) => {\n // Anchor clicks are left to the anchor's own toggle handler.\n if (\n event.target instanceof Node &&\n anchorRef.current?.contains(event.target)\n )\n return\n onClose()\n })\n\n // Passive cleanup runs after the panel left the DOM; focus is on body unless the user moved it elsewhere.\n // Only when focus was inside the panel, so a non-modal hover close doesn't pull focus to the anchor.\n const hadFocus = useRef(false)\n useEffect(\n () => () => {\n const active = document.activeElement\n if (hadFocus.current && (!active || active === document.body))\n anchorRef.current?.focus()\n },\n [anchorRef],\n )\n\n const handleFocus = (event: FocusEvent<HTMLDivElement>) => {\n hadFocus.current = true\n onFocus?.(event)\n }\n\n return (\n <div\n ref={setPanel}\n role='dialog'\n aria-modal={modal || undefined}\n data-placement={position?.placement}\n data-testid={dataTestId?.root}\n className={cn(styles.panel, className)}\n style={{\n ...position?.coordinates,\n ...style,\n visibility: position ? undefined : 'hidden',\n }}\n {...rest}\n onFocus={handleFocus}\n >\n {children}\n </div>\n )\n },\n)\n\nPopoverPanel.displayName = 'PopoverPanel'\n\n// Attributes the consumer already set on the anchor stay theirs; only missing ones are managed here.\nconst useAnchorAria = (\n anchorRef: RefObject<HTMLElement | null>,\n open: boolean,\n panelId: string,\n) => {\n useEffect(() => {\n const anchor = anchorRef.current\n if (!anchor) return\n const managed: Record<string, string> = {\n 'aria-haspopup': 'dialog',\n 'aria-expanded': String(open),\n }\n if (open) managed['aria-controls'] = panelId\n const owned = Object.keys(managed).filter(\n (name) => !anchor.hasAttribute(name),\n )\n owned.forEach((name) => anchor.setAttribute(name, managed[name]))\n return () => owned.forEach((name) => anchor.removeAttribute(name))\n }, [anchorRef, open, panelId])\n}\n\n/** Floating panel in a portal, positioned against `anchorRef`; modal by default (focus moves in and is trapped), name it with `aria-label` or `aria-labelledby`. */\nexport const Popover = forwardRef<HTMLDivElement, PopoverProps>(\n (\n {\n open,\n placement = 'bottom',\n align = 'start',\n offset = 8,\n modal = true,\n ...props\n },\n ref,\n ) => {\n const generatedId = useId()\n const id = props.id ?? generatedId\n useAnchorAria(props.anchorRef, open, id)\n\n const named = Boolean(props['aria-label'] || props['aria-labelledby'])\n useEffect(() => {\n if (process.env.NODE_ENV !== 'production' && open && !named) {\n console.warn(\n 'Popover: role=\"dialog\" needs aria-label or aria-labelledby.',\n )\n }\n }, [open, named])\n\n return open ? (\n <Portal>\n <PopoverPanel\n ref={ref}\n {...props}\n placement={placement}\n align={align}\n offset={offset}\n modal={modal}\n id={id}\n />\n </Portal>\n ) : null\n },\n)\n\nPopover.displayName = 'Popover'\n"],"names":["POSITION_KEYS","samePosition","a","b","placement","every","key","coordinates","VIEWPORT_MARGIN","clamp","value","max","Math","min","computePosition","anchor","alignEl","panel","align","offset","width","anchorRect","getBoundingClientRect","alignRect","viewportWidth","document","documentElement","clientWidth","viewportHeight","clientHeight","fixedWidth","undefined","panelWidth","maxEdge","panelHeight","height","scrollHeight","offsetHeight","roomBelow","bottom","roomAbove","top","room","opposite","resolved","maxWidth","maxHeight","right","left","PopoverPanel","forwardRef","_ref","ref","onClose","anchorRef","alignRef","modal","className","style","children","onFocus","dataTestId","rest","setPanel","useState","useImperativeHandle","position","setPosition","useIsomorphicLayoutEffect","update","current","next","prev","frame","schedule","cancelAnimationFrame","requestAnimationFrame","window","addEventListener","observer","ResizeObserver","observed","forEach","el","observe","disconnect","removeEventListener","useFocusTrap","enabled","restoreFocus","useEscape","useOutsideClick","event","target","Node","contains","hadFocus","useRef","useEffect","active","activeElement","body","focus","handleFocus","_jsx","role","root","cn","styles","visibility","displayName","useAnchorAria","open","panelId","managed","String","owned","Object","keys","filter","name","hasAttribute","setAttribute","removeAttribute","Popover","_ref2","props","generatedId","useId","id","named","Boolean","process","env","NODE_ENV","console","warn","Portal"],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ const cn = require('classnames');
|
|
|
7
7
|
const RadioButton_module = require('./RadioButton.module.css.cjs');
|
|
8
8
|
const jsxRuntime = require('react/jsx-runtime');
|
|
9
9
|
|
|
10
|
+
/** 24px radio wrapped in a `<label>` so the text is clickable; forwards every native input prop, group radios with a shared `name`. */
|
|
10
11
|
const RadioButton = /*#__PURE__*/react.forwardRef((_ref, ref) => {
|
|
11
12
|
let {
|
|
12
13
|
label,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RadioButton.cjs","sources":["../../../src/radio-button/RadioButton.tsx"],"sourcesContent":["import { forwardRef, type InputHTMLAttributes, type ReactNode } from 'react'\n\nimport cn from 'classnames'\n\nimport styles from './RadioButton.module.css'\n\nexport type RadioButtonDataTestId = {\n root?: string\n input?: string\n label?: string\n}\n\nexport type RadioButtonProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type'\n> & {\n label?: ReactNode\n dataTestId?: RadioButtonDataTestId\n}\n\nexport const RadioButton = forwardRef<HTMLInputElement, RadioButtonProps>(\n ({ label, className, disabled, dataTestId, ...rest }, ref) => (\n <label\n className={cn(styles.container, className, {\n [styles.containerDisabled]: disabled,\n })}\n data-testid={dataTestId?.root}\n >\n <span className={styles.control}>\n <input\n ref={ref}\n type='radio'\n className={styles.input}\n disabled={disabled}\n data-testid={dataTestId?.input}\n {...rest}\n />\n <span className={styles.dot} />\n </span>\n {label ? (\n <span\n className={cn(styles.label, { [styles.labelDisabled]: disabled })}\n data-testid={dataTestId?.label}\n >\n {label}\n </span>\n ) : null}\n </label>\n ),\n)\n\nRadioButton.displayName = 'RadioButton'\n"],"names":["RadioButton","forwardRef","_ref","ref","label","className","disabled","dataTestId","rest","_jsxs","cn","styles","container","containerDisabled","root","children","control","_jsx","type","input","dot","labelDisabled","displayName"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"RadioButton.cjs","sources":["../../../src/radio-button/RadioButton.tsx"],"sourcesContent":["import { forwardRef, type InputHTMLAttributes, type ReactNode } from 'react'\n\nimport cn from 'classnames'\n\nimport styles from './RadioButton.module.css'\n\nexport type RadioButtonDataTestId = {\n root?: string\n input?: string\n label?: string\n}\n\nexport type RadioButtonProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type'\n> & {\n /** Text next to the circle; omit for a bare radio. */\n label?: ReactNode\n dataTestId?: RadioButtonDataTestId\n}\n\n/** 24px radio wrapped in a `<label>` so the text is clickable; forwards every native input prop, group radios with a shared `name`. */\nexport const RadioButton = forwardRef<HTMLInputElement, RadioButtonProps>(\n ({ label, className, disabled, dataTestId, ...rest }, ref) => (\n <label\n className={cn(styles.container, className, {\n [styles.containerDisabled]: disabled,\n })}\n data-testid={dataTestId?.root}\n >\n <span className={styles.control}>\n <input\n ref={ref}\n type='radio'\n className={styles.input}\n disabled={disabled}\n data-testid={dataTestId?.input}\n {...rest}\n />\n <span className={styles.dot} />\n </span>\n {label ? (\n <span\n className={cn(styles.label, { [styles.labelDisabled]: disabled })}\n data-testid={dataTestId?.label}\n >\n {label}\n </span>\n ) : null}\n </label>\n ),\n)\n\nRadioButton.displayName = 'RadioButton'\n"],"names":["RadioButton","forwardRef","_ref","ref","label","className","disabled","dataTestId","rest","_jsxs","cn","styles","container","containerDisabled","root","children","control","_jsx","type","input","dot","labelDisabled","displayName"],"mappings":";;;;;;;;;AAqBA;AACO,MAAMA,WAAW,gBAAGC,gBAAU,CACnC,CAAAC,IAAA,EAAsDC,GAAG,KAAA;EAAA,IAAxD;IAAEC,KAAK;IAAEC,SAAS;IAAEC,QAAQ;IAAEC,UAAU;IAAE,GAAGC,IAAAA;AAAK,GAAC,GAAAN,IAAA,CAAA;AAAA,EAAA,oBAClDO,eAAA,CAAA,OAAA,EAAA;IACEJ,SAAS,EAAEK,EAAE,CAACC,kBAAM,CAACC,SAAS,EAAEP,SAAS,EAAE;MACzC,CAACM,kBAAM,CAACE,iBAAiB,GAAGP,QAAAA;AAC9B,KAAC,CAAE;IACH,aAAaC,EAAAA,UAAU,EAAEO,IAAK;AAAAC,IAAAA,QAAA,gBAE9BN,eAAA,CAAA,MAAA,EAAA;MAAMJ,SAAS,EAAEM,kBAAM,CAACK,OAAQ;AAAAD,MAAAA,QAAA,gBAC9BE,cAAA,CAAA,OAAA,EAAA;AACEd,QAAAA,GAAG,EAAEA,GAAI;AACTe,QAAAA,IAAI,EAAC,OAAO;QACZb,SAAS,EAAEM,kBAAM,CAACQ,KAAM;AACxBb,QAAAA,QAAQ,EAAEA,QAAS;QACnB,aAAaC,EAAAA,UAAU,EAAEY,KAAM;QAAA,GAC3BX,IAAAA;OACL,CAAC,eACFS,cAAA,CAAA,MAAA,EAAA;QAAMZ,SAAS,EAAEM,kBAAM,CAACS,GAAAA;AAAI,OAAE,CAAC,CAAA;AAAA,KAC3B,CAAC,EACNhB,KAAK,gBACJa,cAAA,CAAA,MAAA,EAAA;AACEZ,MAAAA,SAAS,EAAEK,EAAE,CAACC,kBAAM,CAACP,KAAK,EAAE;QAAE,CAACO,kBAAM,CAACU,aAAa,GAAGf,QAAAA;AAAS,OAAC,CAAE;MAClE,aAAaC,EAAAA,UAAU,EAAEH,KAAM;AAAAW,MAAAA,QAAA,EAE9BX,KAAAA;KACG,CAAC,GACL,IAAI,CAAA;AAAA,GACH,CAAC,CAAA;AAAA,CAEZ,EAAC;AAEDJ,WAAW,CAACsB,WAAW,GAAG,aAAa;;;;"}
|
|
@@ -6,32 +6,9 @@ const react = require('react');
|
|
|
6
6
|
const cn = require('classnames');
|
|
7
7
|
const RichInput_module = require('./RichInput.module.css.cjs');
|
|
8
8
|
const jsxRuntime = require('react/jsx-runtime');
|
|
9
|
+
const Tag = require('../tag/Tag.cjs');
|
|
9
10
|
const InfoTooltip = require('../info-tooltip/InfoTooltip.cjs');
|
|
10
11
|
const Tooltip = require('../tooltip/Tooltip.cjs');
|
|
11
|
-
const Tag = require('../tag/Tag.cjs');
|
|
12
|
-
|
|
13
|
-
const MaxTag = _ref => {
|
|
14
|
-
let {
|
|
15
|
-
onClick,
|
|
16
|
-
className,
|
|
17
|
-
disabled,
|
|
18
|
-
...rest
|
|
19
|
-
} = _ref;
|
|
20
|
-
return /*#__PURE__*/jsxRuntime.jsx(Tag.Tag, {
|
|
21
|
-
role: "button",
|
|
22
|
-
tabIndex: disabled ? -1 : 0,
|
|
23
|
-
"aria-disabled": disabled || undefined,
|
|
24
|
-
className: cn(RichInput_module.maxTag, disabled && RichInput_module.maxTagDisabled, className),
|
|
25
|
-
onClick: disabled ? undefined : onClick,
|
|
26
|
-
onKeyDown: event => {
|
|
27
|
-
if (disabled) return;
|
|
28
|
-
if (event.key !== 'Enter' && event.key !== ' ') return;
|
|
29
|
-
event.preventDefault();
|
|
30
|
-
onClick?.(event);
|
|
31
|
-
},
|
|
32
|
-
...rest
|
|
33
|
-
});
|
|
34
|
-
};
|
|
35
12
|
|
|
36
13
|
// Keep only digits and a single decimal point; comma is treated as the
|
|
37
14
|
// decimal separator and normalized to a dot (en-US canonical form).
|
|
@@ -43,7 +20,10 @@ const sanitizeDecimal = raw => {
|
|
|
43
20
|
const tail = normalized.slice(firstDot + 1).replace(/\./g, '');
|
|
44
21
|
return head + tail;
|
|
45
22
|
};
|
|
46
|
-
const
|
|
23
|
+
const noop = () => undefined;
|
|
24
|
+
|
|
25
|
+
/** Amount field for supply and borrow forms: token picker, fiat equivalent, balance and a Max shortcut in one card; input is filtered to decimals as you type. `disabled` dims the card and hides Max. */
|
|
26
|
+
const RichInput = _ref => {
|
|
47
27
|
let {
|
|
48
28
|
label,
|
|
49
29
|
labelTooltip,
|
|
@@ -63,7 +43,7 @@ const RichInput = _ref2 => {
|
|
|
63
43
|
disabled,
|
|
64
44
|
dataTestId,
|
|
65
45
|
...inputProps
|
|
66
|
-
} =
|
|
46
|
+
} = _ref;
|
|
67
47
|
const inputRef = react.useRef(null);
|
|
68
48
|
const fallbackId = react.useId();
|
|
69
49
|
const inputId = id ?? fallbackId;
|
|
@@ -72,6 +52,15 @@ const RichInput = _ref2 => {
|
|
|
72
52
|
const errorId = `${inputId}-error`;
|
|
73
53
|
const showMax = showMaxButton && !disabled;
|
|
74
54
|
const hasBottomRow = secondaryValue != null || balance != null || showMax;
|
|
55
|
+
const maxTag = /*#__PURE__*/jsxRuntime.jsx(Tag.Tag, {
|
|
56
|
+
as: "button",
|
|
57
|
+
dataTestId: {
|
|
58
|
+
root: dataTestId?.maxButton
|
|
59
|
+
},
|
|
60
|
+
onClick: onMaxClick ?? noop,
|
|
61
|
+
disabled: maxDisabled,
|
|
62
|
+
children: "Max"
|
|
63
|
+
});
|
|
75
64
|
const handleChange = event => {
|
|
76
65
|
const {
|
|
77
66
|
value: rawValue,
|
|
@@ -143,22 +132,12 @@ const RichInput = _ref2 => {
|
|
|
143
132
|
className: RichInput_module.balance,
|
|
144
133
|
"data-testid": dataTestId?.balance,
|
|
145
134
|
children: balance
|
|
146
|
-
}) : null, showMax
|
|
135
|
+
}) : null, showMax && maxTooltip != null ? /*#__PURE__*/jsxRuntime.jsx(Tooltip.Tooltip, {
|
|
147
136
|
content: maxTooltip,
|
|
148
137
|
position: maxTooltipPosition,
|
|
149
138
|
width: 240,
|
|
150
|
-
children:
|
|
151
|
-
|
|
152
|
-
onClick: onMaxClick,
|
|
153
|
-
disabled: maxDisabled,
|
|
154
|
-
children: "Max"
|
|
155
|
-
})
|
|
156
|
-
}) : /*#__PURE__*/jsxRuntime.jsx(MaxTag, {
|
|
157
|
-
"data-testid": dataTestId?.maxButton,
|
|
158
|
-
onClick: onMaxClick,
|
|
159
|
-
disabled: maxDisabled,
|
|
160
|
-
children: "Max"
|
|
161
|
-
}) : null]
|
|
139
|
+
children: maxTag
|
|
140
|
+
}) : showMax ? maxTag : null]
|
|
162
141
|
})]
|
|
163
142
|
}) : null]
|
|
164
143
|
}), showErrorMessage ? /*#__PURE__*/jsxRuntime.jsx("div", {
|