@react-fabric/core 1.0.0-beta.5 → 1.0.0-beta.52
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/{src/components/actionLabel/ActionLabel.module.css → css/components/_actionLabel.css} +4 -4
- package/{src/overlays/alert/Alert.module.css → css/components/_alert.css} +3 -3
- package/{src/components/animations/Animations.module.css → css/components/_animations.css} +9 -9
- package/{src/components/avatar/Avatar.module.css → css/components/_avatar.css} +11 -11
- package/{src/components/badge/Badge.module.css → css/components/_badge.css} +19 -17
- package/{src/components/breadcrumbs/Breadcrumbs.module.css → css/components/_breadcrumbs.css} +49 -44
- package/{src/components/button/Button.module.css → css/components/_button.css} +69 -79
- package/{src/components/card/Card.module.css → css/components/_card.css} +50 -28
- package/{src/components/chip/Chip.module.css → css/components/_chip.css} +14 -10
- package/{src/components/collapsable/Collapsable.module.css → css/components/_collapsable.css} +3 -3
- package/css/components/_divider.css +38 -0
- package/{src/components/dropdown/Dropdown.module.css → css/components/_dropdown.css} +2 -2
- package/{src/overlays/flyout/Flyout.module.css → css/components/_flyout.css} +6 -6
- package/{src/components/icon/Icon.module.css → css/components/_icon.css} +8 -5
- package/{src/components/media/Media.module.css → css/components/_media.css} +17 -17
- package/{src/components/menu/Menu.module.css → css/components/_menu.css} +19 -20
- package/{src/overlays/message/Message.module.css → css/components/_message.css} +2 -2
- package/{src/components/meter/Meter.module.css → css/components/_meter.css} +10 -10
- package/{src/overlays/modal/Modal.module.css → css/components/_modal.css} +8 -8
- package/{src/components/panel/Panel.module.css → css/components/_panel.css} +17 -17
- package/{src/components/progress/Progress.module.css → css/components/_progress.css} +7 -10
- package/{src/components/tabpanel/TabPanel.module.css → css/components/_tabPanel.css} +73 -84
- package/{src/overlays/toast/Toast.module.css → css/components/_toast.css} +2 -2
- package/css/components/_tooltip.css +29 -0
- package/{src/core/content/Content.module.css → css/components/index.css} +25 -18
- package/{src/core/aside/Aside.module.css → css/core/_aside.css} +56 -42
- package/{src/core/section/Section.module.css → css/core/_content.css} +5 -3
- package/{src/core/boundary/ErrorBoundary.module.css → css/core/_errorboundary.css} +9 -9
- package/{src/core/headfoot/HeadFoot.module.css → css/core/_headfoot.css} +4 -10
- package/{src/core/page/Page.module.css → css/core/_page.css} +10 -14
- package/{src/core/responsive/Responsive.module.css → css/core/_responsive.css} +10 -10
- package/css/core/_section.css +28 -0
- package/{src/core/theme/Theme.module.css → css/core/_theme.css} +3 -3
- package/{src/typography/Typography.module.css → css/core/_typography.css} +14 -12
- package/{src/core/viewport/Viewport.module.css → css/core/_viewport.css} +7 -3
- package/css/core/index.css +33 -0
- package/css/reset/_gradients.css +8 -8
- package/css/reset/_reset.css +42 -224
- package/css/reset/_text.css +14 -29
- package/css/reset/_theme.css +331 -52
- package/css/reset/index.css +4 -4
- package/css/styles.css +7 -6
- package/css/theme/_colors.css +320 -0
- package/css/theme/_utilities.css +530 -0
- package/css/theme/index.css +45 -0
- package/dist/cjs/components/actionLabel/ActionLabel.js +26 -8
- package/dist/cjs/components/animations/Animations.js +118 -24
- package/dist/cjs/components/avatar/Avatar.js +43 -16
- package/dist/cjs/components/avatar/AvatarGroup.js +22 -4
- package/dist/cjs/components/badge/Badge.js +35 -6
- package/dist/cjs/components/breadcrumbs/Breadcrumbs.js +39 -8
- package/dist/cjs/components/button/Button.js +42 -15
- package/dist/cjs/components/button/ButtonGroup.js +30 -3
- package/dist/cjs/components/button/ConfirmButton.js +32 -4
- package/dist/cjs/components/button/ToggleButtonGroup.js +41 -15
- package/dist/cjs/components/callout/Callout.js +44 -4
- package/dist/cjs/components/card/Card.js +48 -10
- package/dist/cjs/components/card/CardCover.js +36 -5
- package/dist/cjs/components/card/FlipContent.js +56 -0
- package/dist/cjs/components/chip/Chip.js +32 -7
- package/dist/cjs/components/collapsable/Collapsable.js +32 -6
- package/dist/cjs/components/divider/Divider.js +30 -7
- package/dist/cjs/components/dropdown/Dropdown.js +48 -9
- package/dist/cjs/components/dropdown/DropdownTool.js +4 -3
- package/dist/cjs/components/empty/EmptyContent.js +35 -5
- package/dist/cjs/components/icon/Icon.js +44 -16
- package/dist/cjs/components/media/Media.js +172 -75
- package/dist/cjs/components/menu/ContextMenu.js +49 -10
- package/dist/cjs/components/menu/Menu.js +74 -21
- package/dist/cjs/components/menu/MenuItem.js +51 -16
- package/dist/cjs/components/meter/Meter.js +26 -3
- package/dist/cjs/components/navigator/Navigator.js +48 -13
- package/dist/cjs/components/panel/Panel.js +47 -9
- package/dist/cjs/components/panel/PanelGroup.js +25 -2
- package/dist/cjs/components/panel/PanelStack.js +31 -0
- package/dist/cjs/components/progress/ProgressBar.js +31 -9
- package/dist/cjs/components/progress/ProgressCircle.js +29 -7
- package/dist/cjs/components/tabpanel/Tab.js +89 -38
- package/dist/cjs/components/tabpanel/TabPanel.js +53 -16
- package/dist/cjs/context/Global.js +28 -1
- package/dist/cjs/context/NotificationCenter.js +3 -3
- package/dist/cjs/core/aside/Aside.js +49 -11
- package/dist/cjs/core/boundary/ErrorBoundary.js +23 -8
- package/dist/cjs/core/boundary/ErrorIcon.js +1 -2
- package/dist/cjs/core/content/Content.js +15 -8
- package/dist/cjs/core/headfoot/HeadFoot.js +44 -20
- package/dist/cjs/core/page/Page.js +40 -29
- package/dist/cjs/core/responsive/Responsive.js +59 -6
- package/dist/cjs/core/section/Section.js +1 -2
- package/dist/cjs/core/theme/ThemeProvider.js +32 -10
- package/dist/cjs/core/viewport/Viewport.js +18 -2
- package/dist/cjs/hooks/useControlledValue.js +12 -0
- package/dist/cjs/hooks/useDebounce.js +14 -1
- package/dist/cjs/hooks/useEffectDebugger.js +54 -2
- package/dist/cjs/hooks/useIsDark.js +8 -0
- package/dist/cjs/hooks/useIsRtl.js +12 -0
- package/dist/cjs/hooks/useNavigator.js +6 -4
- package/dist/cjs/hooks/useOverlayService.js +24 -0
- package/dist/cjs/hooks/usePropToggle.js +16 -5
- package/dist/cjs/hooks/useResize.js +18 -0
- package/dist/cjs/hooks/useResizeObserver.js +20 -1
- package/dist/cjs/hooks/useStorage.js +39 -0
- package/dist/cjs/hotkeys/HotKeyLabel.js +1 -1
- package/dist/cjs/hotkeys/HotKeyWrapper.js +3 -1
- package/dist/cjs/index.js +8 -2
- package/dist/cjs/overlays/alert/Alert.js +20 -14
- package/dist/cjs/overlays/flyout/Flyout.js +49 -60
- package/dist/cjs/overlays/message/Message.js +6 -3
- package/dist/cjs/overlays/modal/Modal.js +16 -12
- package/dist/cjs/overlays/toast/Toast.js +17 -9
- package/dist/cjs/overlays/tooltip/Tooltip.js +24 -11
- package/dist/cjs/types/icons.js +10 -1
- package/dist/cjs/typography/Abbr.js +32 -6
- package/dist/cjs/typography/{Link.js → Anchor.js} +23 -5
- package/dist/cjs/typography/Mark.js +22 -4
- package/dist/cjs/typography/Text.js +30 -5
- package/dist/cjs/typography/Title.js +19 -4
- package/dist/cjs/utils/cloneElement.js +47 -0
- package/dist/cjs/utils/getColor.js +1 -18
- package/dist/esm/components/actionLabel/ActionLabel.js +26 -8
- package/dist/esm/components/animations/Animations.js +119 -25
- package/dist/esm/components/avatar/Avatar.js +44 -17
- package/dist/esm/components/avatar/AvatarGroup.js +22 -4
- package/dist/esm/components/badge/Badge.js +36 -7
- package/dist/esm/components/breadcrumbs/Breadcrumbs.js +39 -8
- package/dist/esm/components/button/Button.js +42 -15
- package/dist/esm/components/button/ButtonGroup.js +31 -4
- package/dist/esm/components/button/ConfirmButton.js +32 -4
- package/dist/esm/components/button/ToggleButtonGroup.js +42 -16
- package/dist/esm/components/callout/Callout.js +44 -4
- package/dist/esm/components/card/Card.js +49 -11
- package/dist/esm/components/card/CardCover.js +36 -5
- package/dist/esm/components/card/FlipContent.js +56 -0
- package/dist/esm/components/chip/Chip.js +33 -8
- package/dist/esm/components/collapsable/Collapsable.js +32 -6
- package/dist/esm/components/divider/Divider.js +31 -8
- package/dist/esm/components/dropdown/Dropdown.js +48 -9
- package/dist/esm/components/dropdown/DropdownTool.js +4 -3
- package/dist/esm/components/empty/EmptyContent.js +35 -5
- package/dist/esm/components/icon/Icon.js +44 -16
- package/dist/esm/components/media/Media.js +173 -76
- package/dist/esm/components/menu/ContextMenu.js +51 -12
- package/dist/esm/components/menu/Menu.js +76 -23
- package/dist/esm/components/menu/MenuItem.js +45 -10
- package/dist/esm/components/meter/Meter.js +26 -3
- package/dist/esm/components/navigator/Navigator.js +48 -13
- package/dist/esm/components/panel/Panel.js +47 -9
- package/dist/esm/components/panel/PanelGroup.js +25 -2
- package/dist/esm/components/panel/PanelStack.js +31 -0
- package/dist/esm/components/progress/ProgressBar.js +31 -9
- package/dist/esm/components/progress/ProgressCircle.js +29 -7
- package/dist/esm/components/tabpanel/Tab.js +90 -39
- package/dist/esm/components/tabpanel/TabPanel.js +53 -16
- package/dist/esm/context/Global.js +28 -1
- package/dist/esm/context/NotificationCenter.js +3 -3
- package/dist/esm/core/aside/Aside.js +49 -11
- package/dist/esm/core/boundary/ErrorBoundary.js +23 -8
- package/dist/esm/core/boundary/ErrorIcon.js +1 -2
- package/dist/esm/core/content/Content.js +15 -8
- package/dist/esm/core/headfoot/HeadFoot.js +44 -20
- package/dist/esm/core/page/Page.js +40 -29
- package/dist/esm/core/responsive/Responsive.js +59 -6
- package/dist/esm/core/section/Section.js +1 -2
- package/dist/esm/core/theme/ThemeProvider.js +32 -10
- package/dist/esm/core/viewport/Viewport.js +18 -2
- package/dist/esm/hooks/useControlledValue.js +12 -0
- package/dist/esm/hooks/useDebounce.js +14 -1
- package/dist/esm/hooks/useEffectDebugger.js +54 -2
- package/dist/esm/hooks/useIsDark.js +8 -0
- package/dist/esm/hooks/useIsRtl.js +12 -0
- package/dist/esm/hooks/useNavigator.js +7 -5
- package/dist/esm/hooks/useOverlayService.js +24 -0
- package/dist/esm/hooks/usePropToggle.js +16 -5
- package/dist/esm/hooks/useResize.js +18 -0
- package/dist/esm/hooks/useResizeObserver.js +20 -1
- package/dist/esm/hooks/useStorage.js +39 -0
- package/dist/esm/hotkeys/HotKeyLabel.js +1 -1
- package/dist/esm/hotkeys/HotKeyWrapper.js +3 -1
- package/dist/esm/index.js +4 -1
- package/dist/esm/overlays/alert/Alert.js +21 -15
- package/dist/esm/overlays/flyout/Flyout.js +52 -63
- package/dist/esm/overlays/message/Message.js +7 -4
- package/dist/esm/overlays/modal/Modal.js +17 -13
- package/dist/esm/overlays/toast/Toast.js +18 -10
- package/dist/esm/overlays/tooltip/Tooltip.js +24 -11
- package/dist/esm/types/icons.js +10 -1
- package/dist/esm/typography/Abbr.js +32 -6
- package/dist/esm/typography/{Link.js → Anchor.js} +24 -6
- package/dist/esm/typography/Mark.js +22 -4
- package/dist/esm/typography/Text.js +31 -6
- package/dist/esm/typography/Title.js +20 -5
- package/dist/esm/utils/cloneElement.js +47 -0
- package/dist/esm/utils/getColor.js +2 -16
- package/dist/types/components/actionLabel/ActionLabel.d.ts +23 -4
- package/dist/types/components/animations/Animations.d.ts +84 -5
- package/dist/types/components/avatar/Avatar.d.ts +29 -5
- package/dist/types/components/avatar/AvatarGroup.d.ts +19 -1
- package/dist/types/components/badge/Badge.d.ts +30 -1
- package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +31 -2
- package/dist/types/components/button/Button.d.ts +29 -6
- package/dist/types/components/button/ButtonGroup.d.ts +28 -3
- package/dist/types/components/button/ConfirmButton.d.ts +28 -3
- package/dist/types/components/button/ToggleButtonGroup.d.ts +39 -11
- package/dist/types/components/callout/Callout.d.ts +29 -3
- package/dist/types/components/card/Card.d.ts +42 -4
- package/dist/types/components/card/CardCover.d.ts +25 -0
- package/dist/types/components/card/FlipContent.d.ts +28 -0
- package/dist/types/components/chip/Chip.d.ts +24 -4
- package/dist/types/components/collapsable/Collapsable.d.ts +33 -3
- package/dist/types/components/divider/Divider.d.ts +30 -7
- package/dist/types/components/dropdown/Dropdown.d.ts +40 -1
- package/dist/types/components/dropdown/DropdownTool.d.ts +27 -1
- package/dist/types/components/empty/EmptyContent.d.ts +32 -3
- package/dist/types/components/icon/Icon.d.ts +32 -6
- package/dist/types/components/index.d.ts +2 -1
- package/dist/types/components/media/Media.d.ts +56 -2
- package/dist/types/components/menu/ContextMenu.d.ts +21 -2
- package/dist/types/components/menu/Menu.d.ts +29 -0
- package/dist/types/components/menu/MenuItem.d.ts +22 -2
- package/dist/types/components/menu/types.d.ts +3 -2
- package/dist/types/components/meter/Meter.d.ts +24 -0
- package/dist/types/components/navigator/Navigator.d.ts +29 -4
- package/dist/types/components/panel/Panel.d.ts +37 -1
- package/dist/types/components/panel/PanelGroup.d.ts +24 -0
- package/dist/types/components/panel/PanelStack.d.ts +31 -0
- package/dist/types/components/progress/ProgressBar.d.ts +23 -3
- package/dist/types/components/progress/ProgressCircle.d.ts +22 -3
- package/dist/types/components/tabpanel/Tab.d.ts +36 -5
- package/dist/types/components/tabpanel/TabPanel.d.ts +43 -1
- package/dist/types/context/Global.d.ts +24 -1
- package/dist/types/core/aside/Aside.d.ts +38 -1
- package/dist/types/core/boundary/ErrorBoundary.d.ts +18 -2
- package/dist/types/core/content/Content.d.ts +9 -3
- package/dist/types/core/headfoot/HeadFoot.d.ts +41 -9
- package/dist/types/core/page/Page.d.ts +29 -4
- package/dist/types/core/responsive/Responsive.d.ts +58 -3
- package/dist/types/core/section/Section.d.ts +16 -1
- package/dist/types/core/theme/ThemeProvider.d.ts +25 -5
- package/dist/types/core/viewport/Viewport.d.ts +15 -1
- package/dist/types/hooks/useControlledValue.d.ts +13 -2
- package/dist/types/hooks/useDebounce.d.ts +12 -0
- package/dist/types/hooks/useEffectDebugger.d.ts +49 -0
- package/dist/types/hooks/useIsDark.d.ts +8 -0
- package/dist/types/hooks/useIsRtl.d.ts +12 -0
- package/dist/types/hooks/useNavigator.d.ts +18 -1
- package/dist/types/hooks/useOverlayService.d.ts +28 -9
- package/dist/types/hooks/usePropToggle.d.ts +16 -5
- package/dist/types/hooks/useResize.d.ts +19 -1
- package/dist/types/hooks/useResizeObserver.d.ts +20 -1
- package/dist/types/hooks/useStorage.d.ts +38 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/overlays/alert/Alert.d.ts +2 -3
- package/dist/types/overlays/flyout/Flyout.d.ts +3 -2
- package/dist/types/overlays/message/Message.d.ts +2 -3
- package/dist/types/overlays/modal/Modal.d.ts +12 -3
- package/dist/types/overlays/toast/Toast.d.ts +2 -3
- package/dist/types/overlays/tooltip/Tooltip.d.ts +2 -2
- package/dist/types/types/icons.d.ts +10 -1
- package/dist/types/types/index.d.ts +26 -6
- package/dist/types/typography/Abbr.d.ts +34 -4
- package/dist/types/typography/Anchor.d.ts +42 -0
- package/dist/types/typography/Copy.d.ts +15 -0
- package/dist/types/typography/Mark.d.ts +22 -4
- package/dist/types/typography/Text.d.ts +27 -1
- package/dist/types/typography/Title.d.ts +16 -1
- package/dist/types/typography/index.d.ts +1 -1
- package/dist/types/utils/cloneElement.d.ts +2 -0
- package/dist/types/utils/getColor.d.ts +1 -4
- package/dist/types/utils/index.d.ts +1 -0
- package/package.json +11 -13
- package/src/components/actionLabel/ActionLabel.tsx +38 -11
- package/src/components/animations/Animations.tsx +118 -33
- package/src/components/avatar/Avatar.tsx +106 -91
- package/src/components/avatar/AvatarGroup.tsx +23 -5
- package/src/components/badge/Badge.tsx +41 -9
- package/src/components/breadcrumbs/Breadcrumbs.tsx +42 -9
- package/src/components/button/Button.tsx +50 -23
- package/src/components/button/ButtonGroup.tsx +33 -7
- package/src/components/button/ConfirmButton.tsx +41 -7
- package/src/components/button/ToggleButtonGroup.tsx +74 -47
- package/src/components/callout/Callout.tsx +55 -12
- package/src/components/card/Card.tsx +64 -15
- package/src/components/card/CardCover.tsx +36 -6
- package/src/components/card/FlipContent.tsx +90 -0
- package/src/components/chip/Chip.tsx +39 -13
- package/src/components/collapsable/Collapsable.tsx +38 -7
- package/src/components/divider/Divider.tsx +42 -16
- package/src/components/dropdown/Dropdown.tsx +46 -11
- package/src/components/dropdown/DropdownTool.tsx +30 -3
- package/src/components/empty/EmptyContent.tsx +47 -6
- package/src/components/icon/Icon.tsx +85 -68
- package/src/components/index.ts +2 -1
- package/src/components/media/Media.tsx +195 -106
- package/src/components/menu/ContextMenu.tsx +55 -11
- package/src/components/menu/Menu.tsx +85 -30
- package/src/components/menu/MenuItem.tsx +40 -9
- package/src/components/menu/types.ts +3 -2
- package/src/components/meter/Meter.tsx +26 -3
- package/src/components/navigator/Navigator.tsx +58 -7
- package/src/components/panel/Panel.tsx +47 -9
- package/src/components/panel/PanelGroup.tsx +25 -2
- package/src/components/panel/PanelStack.tsx +31 -0
- package/src/components/progress/ProgressBar.tsx +33 -14
- package/src/components/progress/ProgressCircle.tsx +29 -13
- package/src/components/tabpanel/Tab.tsx +112 -64
- package/src/components/tabpanel/TabPanel.tsx +67 -12
- package/src/context/Global.tsx +28 -1
- package/src/context/NotificationCenter.tsx +3 -3
- package/src/core/aside/Aside.tsx +50 -12
- package/src/core/boundary/ErrorBoundary.tsx +25 -8
- package/src/core/boundary/ErrorIcon.tsx +1 -2
- package/src/core/content/Content.tsx +23 -13
- package/src/core/headfoot/HeadFoot.tsx +42 -35
- package/src/core/page/Page.tsx +44 -6
- package/src/core/responsive/Responsive.tsx +66 -8
- package/src/core/section/Section.tsx +17 -3
- package/src/core/theme/ThemeProvider.tsx +35 -14
- package/src/core/viewport/Viewport.tsx +16 -3
- package/src/hooks/useControlledValue.tsx +12 -0
- package/src/hooks/useDebounce.ts +13 -1
- package/src/hooks/useEffectDebugger.ts +50 -2
- package/src/hooks/useIsDark.ts +8 -0
- package/src/hooks/useIsRtl.ts +12 -0
- package/src/hooks/useNavigator.tsx +28 -5
- package/src/hooks/useOverlayService.tsx +36 -6
- package/src/hooks/usePropToggle.ts +16 -5
- package/src/hooks/useResize.ts +19 -1
- package/src/hooks/useResizeObserver.ts +32 -9
- package/src/hooks/useStorage.ts +38 -0
- package/src/hotkeys/HotKeyLabel.tsx +1 -1
- package/src/hotkeys/HotKeyWrapper.tsx +3 -1
- package/src/index.ts +4 -0
- package/src/overlays/alert/Alert.tsx +28 -32
- package/src/overlays/flyout/Flyout.tsx +71 -84
- package/src/overlays/message/Message.tsx +10 -7
- package/src/overlays/modal/Modal.tsx +37 -15
- package/src/overlays/toast/Toast.tsx +18 -27
- package/src/overlays/tooltip/Tooltip.tsx +43 -18
- package/src/types/icons.ts +18 -3
- package/src/types/index.ts +268 -27
- package/src/typography/Abbr.tsx +44 -11
- package/src/typography/{Link.tsx → Anchor.tsx} +26 -14
- package/src/typography/Copy.tsx +15 -0
- package/src/typography/Mark.tsx +24 -10
- package/src/typography/Text.tsx +31 -13
- package/src/typography/Title.tsx +18 -7
- package/src/typography/index.ts +1 -1
- package/src/{overlays/tooltip/Tooltip.module.css → utils/cloneElement.ts} +21 -27
- package/src/utils/getColor.ts +1 -17
- package/src/utils/index.ts +1 -0
- package/css/index.js +0 -250
- package/css/tailwind/colors.ts +0 -158
- package/dist/cjs/components/actionLabel/ActionLabel.module.css +0 -1
- package/dist/cjs/components/animations/Animations.module.css +0 -1
- package/dist/cjs/components/avatar/Avatar.module.css +0 -1
- package/dist/cjs/components/badge/Badge.module.css +0 -1
- package/dist/cjs/components/breadcrumbs/Breadcrumbs.module.css +0 -1
- package/dist/cjs/components/button/Button.module.css +0 -1
- package/dist/cjs/components/card/Card.module.css +0 -1
- package/dist/cjs/components/chip/Chip.module.css +0 -1
- package/dist/cjs/components/collapsable/Collapsable.module.css +0 -1
- package/dist/cjs/components/dropdown/Dropdown.module.css +0 -1
- package/dist/cjs/components/icon/Icon.module.css +0 -1
- package/dist/cjs/components/media/Media.module.css +0 -1
- package/dist/cjs/components/menu/Menu.module.css +0 -1
- package/dist/cjs/components/meter/Meter.module.css +0 -1
- package/dist/cjs/components/panel/Panel.module.css +0 -1
- package/dist/cjs/components/progress/Progress.module.css +0 -1
- package/dist/cjs/components/tabpanel/TabPanel.module.css +0 -1
- package/dist/cjs/core/aside/Aside.module.css +0 -1
- package/dist/cjs/core/boundary/ErrorBoundary.module.css +0 -1
- package/dist/cjs/core/content/Content.module.css +0 -1
- package/dist/cjs/core/headfoot/HeadFoot.module.css +0 -1
- package/dist/cjs/core/page/Page.module.css +0 -1
- package/dist/cjs/core/responsive/Responsive.module.css +0 -1
- package/dist/cjs/core/section/Section.module.css +0 -1
- package/dist/cjs/core/theme/Theme.module.css +0 -1
- package/dist/cjs/core/viewport/Viewport.module.css +0 -1
- package/dist/cjs/overlays/alert/Alert.module.css +0 -1
- package/dist/cjs/overlays/flyout/Flyout.module.css +0 -1
- package/dist/cjs/overlays/message/Message.module.css +0 -1
- package/dist/cjs/overlays/modal/Modal.module.css +0 -1
- package/dist/cjs/overlays/toast/Toast.module.css +0 -1
- package/dist/cjs/overlays/tooltip/Tooltip.module.css +0 -1
- package/dist/cjs/typography/Typography.module.css +0 -1
- package/dist/esm/components/actionLabel/ActionLabel.module.css +0 -1
- package/dist/esm/components/animations/Animations.module.css +0 -1
- package/dist/esm/components/avatar/Avatar.module.css +0 -1
- package/dist/esm/components/badge/Badge.module.css +0 -1
- package/dist/esm/components/breadcrumbs/Breadcrumbs.module.css +0 -1
- package/dist/esm/components/button/Button.module.css +0 -1
- package/dist/esm/components/card/Card.module.css +0 -1
- package/dist/esm/components/chip/Chip.module.css +0 -1
- package/dist/esm/components/collapsable/Collapsable.module.css +0 -1
- package/dist/esm/components/dropdown/Dropdown.module.css +0 -1
- package/dist/esm/components/icon/Icon.module.css +0 -1
- package/dist/esm/components/media/Media.module.css +0 -1
- package/dist/esm/components/menu/Menu.module.css +0 -1
- package/dist/esm/components/meter/Meter.module.css +0 -1
- package/dist/esm/components/panel/Panel.module.css +0 -1
- package/dist/esm/components/progress/Progress.module.css +0 -1
- package/dist/esm/components/tabpanel/TabPanel.module.css +0 -1
- package/dist/esm/core/aside/Aside.module.css +0 -1
- package/dist/esm/core/boundary/ErrorBoundary.module.css +0 -1
- package/dist/esm/core/content/Content.module.css +0 -1
- package/dist/esm/core/headfoot/HeadFoot.module.css +0 -1
- package/dist/esm/core/page/Page.module.css +0 -1
- package/dist/esm/core/responsive/Responsive.module.css +0 -1
- package/dist/esm/core/section/Section.module.css +0 -1
- package/dist/esm/core/theme/Theme.module.css +0 -1
- package/dist/esm/core/viewport/Viewport.module.css +0 -1
- package/dist/esm/overlays/alert/Alert.module.css +0 -1
- package/dist/esm/overlays/flyout/Flyout.module.css +0 -1
- package/dist/esm/overlays/message/Message.module.css +0 -1
- package/dist/esm/overlays/modal/Modal.module.css +0 -1
- package/dist/esm/overlays/toast/Toast.module.css +0 -1
- package/dist/esm/overlays/tooltip/Tooltip.module.css +0 -1
- package/dist/esm/typography/Typography.module.css +0 -1
- package/dist/types/typography/Link.d.ts +0 -25
|
@@ -23,13 +23,13 @@
|
|
|
23
23
|
|
|
24
24
|
import { getImageColorset } from "@react-fabric/utilities";
|
|
25
25
|
import classNames from "classnames";
|
|
26
|
-
import {
|
|
27
|
-
import { type AriaProps, type CssProp } from "../../types";
|
|
26
|
+
import { Fragment, useEffect, useRef, useState } from "react";
|
|
27
|
+
import { type AriaProps, type CssProp, type TestProps } from "../../types";
|
|
28
28
|
import { CoreIcons } from "../../types/icons";
|
|
29
29
|
import { Button } from "../button/Button";
|
|
30
|
-
import
|
|
30
|
+
import { Icon } from "../icon/Icon";
|
|
31
31
|
|
|
32
|
-
export interface BaseProps extends CssProp, AriaProps {
|
|
32
|
+
export interface BaseProps extends CssProp, TestProps, AriaProps {
|
|
33
33
|
/**
|
|
34
34
|
* media source
|
|
35
35
|
*/
|
|
@@ -44,6 +44,12 @@ export interface BaseProps extends CssProp, AriaProps {
|
|
|
44
44
|
fit?: "cover" | "contain" | "fill";
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
+
const cover = {
|
|
48
|
+
fill: "object-fill",
|
|
49
|
+
cover: "object-cover",
|
|
50
|
+
contain: "object-contain",
|
|
51
|
+
};
|
|
52
|
+
|
|
47
53
|
export interface ImageProps extends BaseProps {
|
|
48
54
|
/**
|
|
49
55
|
* image alt text
|
|
@@ -65,6 +71,41 @@ export interface VideoProps extends BaseProps {
|
|
|
65
71
|
playOnHover?: boolean;
|
|
66
72
|
}
|
|
67
73
|
|
|
74
|
+
const loadIndicator = (
|
|
75
|
+
<div
|
|
76
|
+
className={classNames(
|
|
77
|
+
"fabric-mediaPlaceholder",
|
|
78
|
+
"absolute z-1 top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 text-4xl text-gray animate-pulse",
|
|
79
|
+
)}
|
|
80
|
+
>
|
|
81
|
+
●●●
|
|
82
|
+
</div>
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Component for displaying images with optional reel decoration.
|
|
87
|
+
* A versatile media component that supports images and videos with various display options.
|
|
88
|
+
* It can display images with a reel decoration, handle loading states, and show error icons if the media fails to load.
|
|
89
|
+
* This component is useful for displaying images in a visually appealing way, with support for lazy loading and error handling.
|
|
90
|
+
* It automatically adjusts the display based on the provided fit property, allowing for different styles such as cover, contain, or fill.
|
|
91
|
+
*
|
|
92
|
+
* @param {ImageProps | VideoProps} props - The properties for the Media component.
|
|
93
|
+
* @returns {JSX.Element} The rendered Media component.
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```jsx
|
|
97
|
+
* <Image
|
|
98
|
+
* src="image.jpg"
|
|
99
|
+
* alt="Example Image"
|
|
100
|
+
* reel={true}
|
|
101
|
+
* fit="cover"
|
|
102
|
+
* className="custom-class"
|
|
103
|
+
* />
|
|
104
|
+
* // Renders an image with reel decoration, cover fit, and a custom class name.
|
|
105
|
+
* ```
|
|
106
|
+
*
|
|
107
|
+
* @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/core-components-media--docs} for more details.
|
|
108
|
+
*/
|
|
68
109
|
export const Image = ({
|
|
69
110
|
src,
|
|
70
111
|
alt,
|
|
@@ -74,51 +115,84 @@ export const Image = ({
|
|
|
74
115
|
...aria
|
|
75
116
|
}: ImageProps) => {
|
|
76
117
|
const [colorSet, setColorSet] = useState("light");
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
)}
|
|
84
|
-
>
|
|
85
|
-
●●●
|
|
86
|
-
</div>
|
|
87
|
-
),
|
|
88
|
-
[src],
|
|
89
|
-
);
|
|
118
|
+
const [loaded, setLoaded] = useState(false);
|
|
119
|
+
const [errored, setErrored] = useState(false);
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
setLoaded(false);
|
|
122
|
+
setErrored(false);
|
|
123
|
+
}, [src]);
|
|
90
124
|
return (
|
|
91
125
|
<div
|
|
92
126
|
data-ref="image"
|
|
93
127
|
className={classNames(
|
|
94
|
-
|
|
95
|
-
"relative overflow-hidden
|
|
96
|
-
reel &&
|
|
128
|
+
"fabric-mediaContainer",
|
|
129
|
+
"relative overflow-hidden inline-block",
|
|
130
|
+
reel && "fabric-mediaReel",
|
|
97
131
|
className,
|
|
98
132
|
)}
|
|
99
133
|
data-colorset={colorSet}
|
|
100
134
|
{...aria}
|
|
101
135
|
>
|
|
102
|
-
{loadIndicator}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
e
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
136
|
+
{!loaded && !errored && loadIndicator}
|
|
137
|
+
{!errored && (
|
|
138
|
+
<img
|
|
139
|
+
alt={alt ?? src}
|
|
140
|
+
src={src}
|
|
141
|
+
loading="lazy"
|
|
142
|
+
crossOrigin="anonymous"
|
|
143
|
+
className={classNames(
|
|
144
|
+
"fabric-media",
|
|
145
|
+
"pointer-events-none w-full h-full",
|
|
146
|
+
cover[fit],
|
|
147
|
+
)}
|
|
148
|
+
onLoad={(e) => {
|
|
149
|
+
setLoaded(true);
|
|
150
|
+
setColorSet(getImageColorset(e.currentTarget));
|
|
151
|
+
}}
|
|
152
|
+
onError={() => setErrored(true)}
|
|
153
|
+
/>
|
|
154
|
+
)}
|
|
155
|
+
{errored && (
|
|
156
|
+
<Icon
|
|
157
|
+
size="2rem"
|
|
158
|
+
className="absolute text-tint-300 top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2"
|
|
159
|
+
icon={CoreIcons.mediaImageBroken}
|
|
160
|
+
/>
|
|
161
|
+
)}
|
|
118
162
|
</div>
|
|
119
163
|
);
|
|
120
164
|
};
|
|
121
165
|
|
|
166
|
+
/**
|
|
167
|
+
* Component for displaying videos with optional controls and reel decoration.
|
|
168
|
+
* A versatile video component that supports autoplay, hover play, and various display options.
|
|
169
|
+
* It can display videos with a reel decoration, handle loading states, and show error icons if the video fails to load.
|
|
170
|
+
* This component is useful for displaying videos in a visually appealing way, with support for controls, autoplay, and error handling.
|
|
171
|
+
* It automatically adjusts the display based on the provided fit property, allowing for different styles such as cover, contain, or fill.
|
|
172
|
+
* It also includes controls for play/pause and volume, enhancing user interaction with the video content.
|
|
173
|
+
* This component is ideal for media-rich applications where video content needs to be displayed with user-friendly controls and visual effects.
|
|
174
|
+
* It supports features like autoplay, play on hover, and custom fit options for the video display.
|
|
175
|
+
* It also includes a reel decoration for a more engaging visual presentation.
|
|
176
|
+
*
|
|
177
|
+
* @param {VideoProps} props - The properties for the Video component.
|
|
178
|
+
* @returns {JSX.Element} The rendered Video component.
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* ```jsx
|
|
182
|
+
* <Video
|
|
183
|
+
* src="video.mp4"
|
|
184
|
+
* poster="poster.jpg"
|
|
185
|
+
* reel={true}
|
|
186
|
+
* autoPlay={true}
|
|
187
|
+
* playOnHover={true}
|
|
188
|
+
* fit="cover"
|
|
189
|
+
* className="custom-class"
|
|
190
|
+
* />
|
|
191
|
+
* // Renders a video with reel decoration, autoplay, play on hover, cover fit, and a custom class name.
|
|
192
|
+
* ```
|
|
193
|
+
*
|
|
194
|
+
* @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/core-components-video--docs} for more details.
|
|
195
|
+
*/
|
|
122
196
|
export const Video = ({
|
|
123
197
|
src,
|
|
124
198
|
poster,
|
|
@@ -130,17 +204,27 @@ export const Video = ({
|
|
|
130
204
|
...aria
|
|
131
205
|
}: VideoProps) => {
|
|
132
206
|
const videoRef = useRef<HTMLVideoElement>(null);
|
|
207
|
+
const [loaded, setLoaded] = useState(false);
|
|
208
|
+
const [errored, setErrored] = useState(false);
|
|
209
|
+
useEffect(() => {
|
|
210
|
+
setLoaded(false);
|
|
211
|
+
setErrored(false);
|
|
212
|
+
}, [src]);
|
|
133
213
|
|
|
134
214
|
const [state, setState] = useState(true);
|
|
135
215
|
const [volume, setVolume] = useState(false);
|
|
136
216
|
|
|
217
|
+
useEffect(() => {
|
|
218
|
+
setErrored(false);
|
|
219
|
+
}, [src]);
|
|
220
|
+
|
|
137
221
|
return (
|
|
138
222
|
<div
|
|
139
223
|
data-ref="video"
|
|
140
224
|
className={classNames(
|
|
141
|
-
|
|
142
|
-
"relative overflow-hidden
|
|
143
|
-
reel &&
|
|
225
|
+
"fabric-mediaContainer",
|
|
226
|
+
"relative overflow-hidden inline-block",
|
|
227
|
+
reel && "fabric-mediaReel",
|
|
144
228
|
className,
|
|
145
229
|
)}
|
|
146
230
|
onMouseEnter={() => {
|
|
@@ -151,74 +235,79 @@ export const Video = ({
|
|
|
151
235
|
}}
|
|
152
236
|
{...aria}
|
|
153
237
|
>
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
238
|
+
{!loaded && !errored && loadIndicator}
|
|
239
|
+
{!errored && (
|
|
240
|
+
<Fragment>
|
|
241
|
+
<video
|
|
242
|
+
loop
|
|
243
|
+
ref={videoRef}
|
|
244
|
+
controls={false}
|
|
245
|
+
poster={poster}
|
|
246
|
+
autoPlay={autoPlay}
|
|
247
|
+
className={classNames(
|
|
248
|
+
"fabric-media",
|
|
249
|
+
"pointer-events-none w-full h-full",
|
|
250
|
+
fit && `object-${fit}`,
|
|
251
|
+
)}
|
|
252
|
+
onPlay={() => setState(true)}
|
|
253
|
+
onPause={() => setState(false)}
|
|
254
|
+
onVolumeChange={(e) => setVolume(!!e.currentTarget.volume)}
|
|
255
|
+
onLoadedData={(e) => {
|
|
256
|
+
e.currentTarget.volume = 0;
|
|
257
|
+
setLoaded(true);
|
|
258
|
+
}}
|
|
259
|
+
onError={() => setErrored(true)}
|
|
260
|
+
>
|
|
261
|
+
<source src={src} />
|
|
262
|
+
<track kind="captions" />
|
|
263
|
+
</video>
|
|
264
|
+
<div
|
|
265
|
+
data-inner-clickable
|
|
266
|
+
className={classNames(
|
|
267
|
+
"fabric-mediaControls",
|
|
268
|
+
"absolute bottom-6 end-6 rounded-full flex flex-col",
|
|
269
|
+
)}
|
|
270
|
+
>
|
|
271
|
+
<Button
|
|
272
|
+
rounded
|
|
273
|
+
variant="link"
|
|
274
|
+
className={"fabric-mediaControlPlaceholder"}
|
|
275
|
+
icon={CoreIcons.ellipsis}
|
|
276
|
+
aria-label="controls"
|
|
277
|
+
/>
|
|
278
|
+
<Button
|
|
279
|
+
rounded
|
|
280
|
+
variant="link"
|
|
281
|
+
aria-label="controls"
|
|
282
|
+
className={"fabric-mediaControlAction"}
|
|
283
|
+
onClick={() => {
|
|
284
|
+
videoRef.current &&
|
|
285
|
+
(videoRef.current.volume = videoRef.current.volume ? 0 : 1);
|
|
286
|
+
}}
|
|
287
|
+
icon={volume ? CoreIcons.volumeOn : CoreIcons.volumeOff}
|
|
288
|
+
/>
|
|
289
|
+
<Button
|
|
290
|
+
rounded
|
|
291
|
+
variant="link"
|
|
292
|
+
aria-label="controls"
|
|
293
|
+
className={"fabric-mediaControlAction"}
|
|
294
|
+
onClick={() => {
|
|
295
|
+
videoRef.current?.paused
|
|
296
|
+
? videoRef.current?.play()
|
|
297
|
+
: videoRef.current?.pause();
|
|
298
|
+
}}
|
|
299
|
+
icon={state ? CoreIcons.pause : CoreIcons.play}
|
|
300
|
+
/>
|
|
301
|
+
</div>
|
|
302
|
+
</Fragment>
|
|
303
|
+
)}
|
|
304
|
+
{errored && (
|
|
305
|
+
<Icon
|
|
306
|
+
size="2rem"
|
|
307
|
+
className="absolute text-tint-300 top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2"
|
|
308
|
+
icon={CoreIcons.mediaVideoBroken}
|
|
220
309
|
/>
|
|
221
|
-
|
|
310
|
+
)}
|
|
222
311
|
</div>
|
|
223
312
|
);
|
|
224
313
|
};
|
|
@@ -29,30 +29,60 @@ import {
|
|
|
29
29
|
useClick,
|
|
30
30
|
useDismiss,
|
|
31
31
|
useFloating,
|
|
32
|
+
useFloatingNodeId,
|
|
32
33
|
useInteractions,
|
|
33
34
|
} from "@floating-ui/react";
|
|
34
|
-
import { cloneElement, useRef, useState } from "react";
|
|
35
|
+
import { cloneElement, useEffect, useRef, useState } from "react";
|
|
35
36
|
import { type ChildrenProp } from "../../types";
|
|
36
37
|
import { type Menu } from "./Menu";
|
|
37
38
|
|
|
38
39
|
export interface ContextMenuProps extends ChildrenProp {
|
|
39
40
|
menu: React.ReactElement<typeof Menu>;
|
|
41
|
+
|
|
42
|
+
disabled?: boolean;
|
|
40
43
|
}
|
|
41
44
|
|
|
42
|
-
|
|
45
|
+
/**
|
|
46
|
+
* A component that provides a context menu that appears on right-click.
|
|
47
|
+
* It uses the Floating UI library to manage the positioning and interactions of the menu.
|
|
48
|
+
* This component is useful for creating custom context menus that can be triggered by right-clicking on elements.
|
|
49
|
+
*
|
|
50
|
+
* @param {ContextMenuProps} props - The properties for the ContextMenu component.
|
|
51
|
+
* @returns {JSX.Element} The rendered ContextMenu component.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```jsx
|
|
55
|
+
* <ContextMenu
|
|
56
|
+
* menu={<Menu items={[{ label: "Option 1" }, { label: "Option 2" }]} />}
|
|
57
|
+
* >
|
|
58
|
+
* <div className="context-menu-target">Right-click me!</div>
|
|
59
|
+
* </ContextMenu>
|
|
60
|
+
* ```
|
|
61
|
+
*
|
|
62
|
+
* @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/core-components-menu--docs}
|
|
63
|
+
*/
|
|
64
|
+
export const ContextMenu = ({ children, menu, disabled }: ContextMenuProps) => {
|
|
43
65
|
const [isOpen, setIsOpen] = useState(false);
|
|
66
|
+
const nodeId = useFloatingNodeId();
|
|
44
67
|
|
|
45
68
|
const { refs, floatingStyles, context } = useFloating({
|
|
46
69
|
open: isOpen,
|
|
47
|
-
|
|
70
|
+
nodeId,
|
|
71
|
+
onOpenChange: (open, evt, reason) => {
|
|
72
|
+
const target = evt?.target as HTMLElement;
|
|
73
|
+
if (!target?.closest(".menu-list")) setIsOpen(open);
|
|
74
|
+
},
|
|
48
75
|
strategy: "fixed",
|
|
49
76
|
placement: "bottom-start",
|
|
50
77
|
whileElementsMounted: autoUpdate,
|
|
51
78
|
middleware: [offset(8), flip()],
|
|
52
79
|
});
|
|
53
80
|
|
|
54
|
-
const click = useClick(context, {
|
|
55
|
-
|
|
81
|
+
const click = useClick(context, {
|
|
82
|
+
toggle: true,
|
|
83
|
+
ignoreMouse: true,
|
|
84
|
+
});
|
|
85
|
+
const dismiss = useDismiss(context, { bubbles: true });
|
|
56
86
|
|
|
57
87
|
const { getFloatingProps } = useInteractions([dismiss, click]);
|
|
58
88
|
|
|
@@ -78,10 +108,19 @@ export const ContextMenu = ({ children, menu }: ContextMenuProps) => {
|
|
|
78
108
|
return false;
|
|
79
109
|
});
|
|
80
110
|
|
|
81
|
-
const wrapperRef = useRef(
|
|
82
|
-
|
|
83
|
-
el
|
|
84
|
-
|
|
111
|
+
const wrapperRef = useRef<HTMLDivElement>(null);
|
|
112
|
+
useEffect(() => {
|
|
113
|
+
const el = wrapperRef.current;
|
|
114
|
+
if (el && !disabled) {
|
|
115
|
+
el?.parentElement?.addEventListener("contextmenu", handleClick.current);
|
|
116
|
+
return () => {
|
|
117
|
+
el?.parentElement?.removeEventListener(
|
|
118
|
+
"contextmenu",
|
|
119
|
+
handleClick.current,
|
|
120
|
+
);
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}, [disabled]);
|
|
85
124
|
|
|
86
125
|
const tryClosing = useRef((e: React.MouseEvent) => {
|
|
87
126
|
if ((e.target as HTMLElement)?.closest("[data-dropdown-dismiss='true']"))
|
|
@@ -91,12 +130,17 @@ export const ContextMenu = ({ children, menu }: ContextMenuProps) => {
|
|
|
91
130
|
return (
|
|
92
131
|
<div
|
|
93
132
|
className="contents"
|
|
94
|
-
ref={wrapperRef
|
|
133
|
+
ref={wrapperRef}
|
|
95
134
|
onMouseUpCapture={tryClosing.current}
|
|
96
135
|
>
|
|
97
136
|
{children}
|
|
98
137
|
{isOpen && (
|
|
99
|
-
<FloatingPortal
|
|
138
|
+
<FloatingPortal
|
|
139
|
+
root={
|
|
140
|
+
refs.domReference.current?.closest<HTMLElement>(".theme-base") ??
|
|
141
|
+
undefined
|
|
142
|
+
}
|
|
143
|
+
>
|
|
100
144
|
{cloneElement(menu as AnyObject, {
|
|
101
145
|
...getFloatingProps(),
|
|
102
146
|
style: {
|
|
@@ -48,7 +48,6 @@ import {
|
|
|
48
48
|
import { mergeRefs } from "@react-fabric/utilities";
|
|
49
49
|
import classNames from "classnames";
|
|
50
50
|
import {
|
|
51
|
-
Children,
|
|
52
51
|
cloneElement,
|
|
53
52
|
Fragment,
|
|
54
53
|
useCallback,
|
|
@@ -56,8 +55,9 @@ import {
|
|
|
56
55
|
useRef,
|
|
57
56
|
useState,
|
|
58
57
|
} from "react";
|
|
58
|
+
import { HotKeyWrapper } from "../../hotkeys/HotKeyWrapper";
|
|
59
59
|
import { CoreIcons } from "../../types/icons";
|
|
60
|
-
import { nodeCheck } from "../../utils";
|
|
60
|
+
import { cloneChildren, nodeCheck } from "../../utils";
|
|
61
61
|
import { MenuItem } from "./MenuItem";
|
|
62
62
|
import { type MenuProps } from "./types";
|
|
63
63
|
|
|
@@ -69,6 +69,8 @@ const MenuComponent = ({
|
|
|
69
69
|
menuClassName,
|
|
70
70
|
onClick,
|
|
71
71
|
// @ts-expect-error ignore
|
|
72
|
+
trigger = "hover",
|
|
73
|
+
// @ts-expect-error ignore
|
|
72
74
|
ref,
|
|
73
75
|
...rest
|
|
74
76
|
}: Partial<MenuProps>) => {
|
|
@@ -89,6 +91,8 @@ const MenuComponent = ({
|
|
|
89
91
|
open: !isNested || isOpen,
|
|
90
92
|
onOpenChange(open, event, reason) {
|
|
91
93
|
isNested && setIsOpen(open);
|
|
94
|
+
if (reason === "outside-press" && trigger === "click")
|
|
95
|
+
tree?.events.emit("close");
|
|
92
96
|
},
|
|
93
97
|
placement: isNested ? "right-start" : "bottom-start",
|
|
94
98
|
middleware: [
|
|
@@ -100,12 +104,14 @@ const MenuComponent = ({
|
|
|
100
104
|
});
|
|
101
105
|
|
|
102
106
|
const hover = useHover(context, {
|
|
107
|
+
enabled: trigger === "hover",
|
|
103
108
|
delay: { open: 75 },
|
|
104
109
|
handleClose: safePolygon({ blockPointerEvents: true }),
|
|
105
110
|
});
|
|
106
111
|
const click = useClick(context, {
|
|
107
|
-
|
|
108
|
-
|
|
112
|
+
event: "mousedown",
|
|
113
|
+
toggle: trigger === "click" || !isNested,
|
|
114
|
+
ignoreMouse: trigger === "hover" && !isNested,
|
|
109
115
|
});
|
|
110
116
|
const role = useRole(context, { role: "menu" });
|
|
111
117
|
const dismiss = useDismiss(context, { bubbles: true });
|
|
@@ -187,6 +193,16 @@ const MenuComponent = ({
|
|
|
187
193
|
);
|
|
188
194
|
}, [isOpen]);
|
|
189
195
|
|
|
196
|
+
useEffect(() => {
|
|
197
|
+
if ((!isNested || isOpen) && activeIndex) {
|
|
198
|
+
setTimeout(() => {
|
|
199
|
+
elementsRef.current[activeIndex]?.scrollIntoView({
|
|
200
|
+
block: "nearest",
|
|
201
|
+
});
|
|
202
|
+
}, 100);
|
|
203
|
+
}
|
|
204
|
+
}, [isOpen, activeIndex]);
|
|
205
|
+
|
|
190
206
|
return (
|
|
191
207
|
<FloatingNode id={nodeId}>
|
|
192
208
|
{isNested && (
|
|
@@ -210,29 +226,29 @@ const MenuComponent = ({
|
|
|
210
226
|
{(!isNested || isOpen) && (
|
|
211
227
|
<Wrapper {...wrapperProps}>
|
|
212
228
|
{isNested && <FloatingOverlay />}
|
|
213
|
-
<
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
<div
|
|
220
|
-
className={classNames(
|
|
221
|
-
menuClassName,
|
|
222
|
-
"flex flex-col bg-base p-1 menu-list",
|
|
223
|
-
isNested &&
|
|
224
|
-
"outline shadow-lg rounded-capped max-h-96 overflow-auto scroll-thin z-[var(--z-popover)]",
|
|
225
|
-
)}
|
|
226
|
-
autoFocus
|
|
227
|
-
ref={mergeRefs(refs.setFloating, isNested ? undefined : ref)}
|
|
228
|
-
{...getFloatingProps({
|
|
229
|
-
onClick: isNested ? undefined : handleClick,
|
|
230
|
-
})}
|
|
231
|
-
// @ts-expect-error ignore
|
|
232
|
-
{...{ style: !isNested ? rest.style : floatingStyles }}
|
|
229
|
+
<HotKeyWrapper>
|
|
230
|
+
<FloatingFocusManager
|
|
231
|
+
context={context}
|
|
232
|
+
modal={!isNested}
|
|
233
|
+
initialFocus={isNested ? -1 : 0}
|
|
234
|
+
returnFocus={!isNested}
|
|
233
235
|
>
|
|
234
|
-
|
|
235
|
-
|
|
236
|
+
<div
|
|
237
|
+
className={classNames(
|
|
238
|
+
menuClassName,
|
|
239
|
+
"flex flex-col bg-base p-1 menu-list",
|
|
240
|
+
isNested &&
|
|
241
|
+
"outline shadow-lg rounded-capped max-h-96 overflow-auto scroll-thin z-(--z-popover)",
|
|
242
|
+
)}
|
|
243
|
+
autoFocus
|
|
244
|
+
ref={mergeRefs(isNested ? refs.setFloating : ref)}
|
|
245
|
+
{...getFloatingProps({
|
|
246
|
+
onClick: isNested ? undefined : handleClick,
|
|
247
|
+
})}
|
|
248
|
+
// @ts-expect-error ignore
|
|
249
|
+
{...{ style: !isNested ? rest.style : floatingStyles }}
|
|
250
|
+
>
|
|
251
|
+
{cloneChildren(children, (child: AnyObject, index) => {
|
|
236
252
|
labelsRef.current[index] = child.props.label;
|
|
237
253
|
return cloneElement(
|
|
238
254
|
child,
|
|
@@ -249,10 +265,10 @@ const MenuComponent = ({
|
|
|
249
265
|
}
|
|
250
266
|
: {},
|
|
251
267
|
);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
</
|
|
255
|
-
</
|
|
268
|
+
})}
|
|
269
|
+
</div>
|
|
270
|
+
</FloatingFocusManager>
|
|
271
|
+
</HotKeyWrapper>
|
|
256
272
|
</Wrapper>
|
|
257
273
|
)}
|
|
258
274
|
</FloatingList>
|
|
@@ -260,8 +276,47 @@ const MenuComponent = ({
|
|
|
260
276
|
);
|
|
261
277
|
};
|
|
262
278
|
|
|
279
|
+
/**
|
|
280
|
+
* A component that displays a menu with items, supports nested menus and various interactions.
|
|
281
|
+
* It can be triggered by hover or click events, and allows for custom styling and behavior.
|
|
282
|
+
* This component is designed to be used within a Floating UI context, allowing for dynamic positioning and interaction handling.
|
|
283
|
+
* It can be nested within other menus to create complex menu structures.
|
|
284
|
+
*
|
|
285
|
+
* @param {MenuProps} props - The properties for the Menu component.
|
|
286
|
+
* @returns {JSX.Element} The rendered Menu component.
|
|
287
|
+
*
|
|
288
|
+
* @example
|
|
289
|
+
* ```jsx
|
|
290
|
+
* <Menu
|
|
291
|
+
* className="my-menu"
|
|
292
|
+
* trigger="click"
|
|
293
|
+
* onClick={(id) => console.log(`Clicked item with id: ${id}`)}
|
|
294
|
+
* >
|
|
295
|
+
* <MenuItem id="item1" label="Item 1" />
|
|
296
|
+
* <MenuItem id="item2" label="Item 2" />
|
|
297
|
+
* <MenuItem id="item3" label="Item 3">
|
|
298
|
+
* <Menu>
|
|
299
|
+
* <MenuItem id="subitem1" label="Sub Item 1" />
|
|
300
|
+
* <MenuItem id="subitem2" label="Sub Item 2" />
|
|
301
|
+
* </Menu>
|
|
302
|
+
* </MenuItem>
|
|
303
|
+
* </Menu>
|
|
304
|
+
* ```
|
|
305
|
+
*
|
|
306
|
+
* @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/core-components-menu--docs} for more details.
|
|
307
|
+
*/
|
|
263
308
|
export const Menu = (props: MenuProps) => {
|
|
264
309
|
const parentId = useFloatingParentNodeId();
|
|
310
|
+
const tree = useFloatingTree();
|
|
311
|
+
|
|
312
|
+
if (tree) {
|
|
313
|
+
return (
|
|
314
|
+
<MenuComponent
|
|
315
|
+
{...(props as AnyObject)}
|
|
316
|
+
menuClassName={props.className}
|
|
317
|
+
/>
|
|
318
|
+
);
|
|
319
|
+
}
|
|
265
320
|
|
|
266
321
|
if (parentId === null) {
|
|
267
322
|
return (
|