@react-fabric/core 1.0.0-beta.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/LICENSE +21 -0
- package/README.md +10 -0
- package/css/flags.rect.css +1607 -0
- package/css/flags.wavy.css +1606 -0
- package/css/index.js +250 -0
- package/css/reset/_gradients.css +51 -0
- package/css/reset/_reset.css +407 -0
- package/css/reset/_text.css +179 -0
- package/css/reset/_theme.css +110 -0
- package/css/reset/index.css +27 -0
- package/css/styles.css +31 -0
- package/css/tailwind/colors.ts +158 -0
- package/dist/cjs/components/actionLabel/ActionLabel.js +56 -0
- package/dist/cjs/components/actionLabel/ActionLabel.module.css +1 -0
- package/dist/cjs/components/animations/Animations.js +135 -0
- package/dist/cjs/components/animations/Animations.module.css +1 -0
- package/dist/cjs/components/avatar/Avatar.js +144 -0
- package/dist/cjs/components/avatar/Avatar.module.css +1 -0
- package/dist/cjs/components/avatar/AvatarGroup.js +74 -0
- package/dist/cjs/components/badge/Badge.js +82 -0
- package/dist/cjs/components/badge/Badge.module.css +1 -0
- package/dist/cjs/components/breadcrumbs/Breadcrumbs.js +71 -0
- package/dist/cjs/components/breadcrumbs/Breadcrumbs.module.css +1 -0
- package/dist/cjs/components/button/Button.js +170 -0
- package/dist/cjs/components/button/Button.module.css +1 -0
- package/dist/cjs/components/button/ButtonGroup.js +41 -0
- package/dist/cjs/components/button/ConfirmButton.js +166 -0
- package/dist/cjs/components/button/ToggleButtonGroup.js +68 -0
- package/dist/cjs/components/callout/Callout.js +54 -0
- package/dist/cjs/components/card/Card.js +62 -0
- package/dist/cjs/components/card/Card.module.css +1 -0
- package/dist/cjs/components/card/CardCover.js +48 -0
- package/dist/cjs/components/chip/Chip.js +94 -0
- package/dist/cjs/components/chip/Chip.module.css +1 -0
- package/dist/cjs/components/collapsable/Collapsable.js +84 -0
- package/dist/cjs/components/collapsable/Collapsable.module.css +1 -0
- package/dist/cjs/components/divider/Divider.js +65 -0
- package/dist/cjs/components/dropdown/Dropdown.js +180 -0
- package/dist/cjs/components/dropdown/Dropdown.module.css +1 -0
- package/dist/cjs/components/dropdown/DropdownTool.js +26 -0
- package/dist/cjs/components/empty/EmptyContent.js +92 -0
- package/dist/cjs/components/icon/Icon.js +106 -0
- package/dist/cjs/components/icon/Icon.module.css +1 -0
- package/dist/cjs/components/media/Media.js +149 -0
- package/dist/cjs/components/media/Media.module.css +1 -0
- package/dist/cjs/components/menu/ContextMenu.js +84 -0
- package/dist/cjs/components/menu/Menu.js +204 -0
- package/dist/cjs/components/menu/Menu.module.css +1 -0
- package/dist/cjs/components/menu/MenuItem.js +119 -0
- package/dist/cjs/components/meter/Meter.js +41 -0
- package/dist/cjs/components/meter/Meter.module.css +1 -0
- package/dist/cjs/components/navigator/Navigator.js +54 -0
- package/dist/cjs/components/panel/Panel.js +125 -0
- package/dist/cjs/components/panel/Panel.module.css +1 -0
- package/dist/cjs/components/panel/PanelGroup.js +50 -0
- package/dist/cjs/components/panel/PanelStack.js +85 -0
- package/dist/cjs/components/progress/Progress.module.css +1 -0
- package/dist/cjs/components/progress/ProgressBar.js +62 -0
- package/dist/cjs/components/progress/ProgressCircle.js +96 -0
- package/dist/cjs/components/tabpanel/Tab.js +78 -0
- package/dist/cjs/components/tabpanel/TabPanel.js +77 -0
- package/dist/cjs/components/tabpanel/TabPanel.module.css +1 -0
- package/dist/cjs/context/Global.js +169 -0
- package/dist/cjs/context/NotificationCenter.js +254 -0
- package/dist/cjs/core/aside/Aside.js +152 -0
- package/dist/cjs/core/aside/Aside.module.css +1 -0
- package/dist/cjs/core/boundary/ErrorBoundary.js +140 -0
- package/dist/cjs/core/boundary/ErrorBoundary.module.css +1 -0
- package/dist/cjs/core/boundary/ErrorIcon.js +51 -0
- package/dist/cjs/core/content/Content.js +70 -0
- package/dist/cjs/core/content/Content.module.css +1 -0
- package/dist/cjs/core/headfoot/HeadFoot.js +62 -0
- package/dist/cjs/core/headfoot/HeadFoot.module.css +1 -0
- package/dist/cjs/core/page/Page.js +65 -0
- package/dist/cjs/core/page/Page.module.css +1 -0
- package/dist/cjs/core/responsive/Responsive.js +64 -0
- package/dist/cjs/core/responsive/Responsive.module.css +1 -0
- package/dist/cjs/core/section/Section.js +44 -0
- package/dist/cjs/core/section/Section.module.css +1 -0
- package/dist/cjs/core/theme/Theme.module.css +1 -0
- package/dist/cjs/core/theme/ThemeProvider.js +74 -0
- package/dist/cjs/core/viewport/Viewport.js +39 -0
- package/dist/cjs/core/viewport/Viewport.module.css +1 -0
- package/dist/cjs/hooks/useClientService.js +30 -0
- package/dist/cjs/hooks/useControlledValue.js +22 -0
- package/dist/cjs/hooks/useDebounce.js +56 -0
- package/dist/cjs/hooks/useEffectDebugger.js +113 -0
- package/dist/cjs/hooks/useIsDark.js +33 -0
- package/dist/cjs/hooks/useIsRtl.js +27 -0
- package/dist/cjs/hooks/useNavigator.js +36 -0
- package/dist/cjs/hooks/useOverlayService.js +55 -0
- package/dist/cjs/hooks/usePropToggle.js +40 -0
- package/dist/cjs/hooks/useResize.js +75 -0
- package/dist/cjs/hooks/useResizeObserver.js +38 -0
- package/dist/cjs/hooks/useStorage.js +44 -0
- package/dist/cjs/hotkeys/HotKey.js +47 -0
- package/dist/cjs/hotkeys/HotKeyLabel.js +52 -0
- package/dist/cjs/hotkeys/HotKeyWrapper.js +98 -0
- package/dist/cjs/hotkeys/commons.js +56 -0
- package/dist/cjs/i18n/ar.json.js +31 -0
- package/dist/cjs/i18n/en.json.js +46 -0
- package/dist/cjs/i18n/index.js +55 -0
- package/dist/cjs/index.js +162 -0
- package/dist/cjs/overlays/alert/Alert.js +163 -0
- package/dist/cjs/overlays/alert/Alert.module.css +1 -0
- package/dist/cjs/overlays/flyout/Flyout.js +152 -0
- package/dist/cjs/overlays/flyout/Flyout.module.css +1 -0
- package/dist/cjs/overlays/message/Message.js +84 -0
- package/dist/cjs/overlays/message/Message.module.css +1 -0
- package/dist/cjs/overlays/modal/Modal.js +132 -0
- package/dist/cjs/overlays/modal/Modal.module.css +1 -0
- package/dist/cjs/overlays/toast/Toast.js +166 -0
- package/dist/cjs/overlays/toast/Toast.module.css +1 -0
- package/dist/cjs/overlays/tooltip/Tooltip.js +133 -0
- package/dist/cjs/overlays/tooltip/Tooltip.module.css +1 -0
- package/dist/cjs/types/icons.js +197 -0
- package/dist/cjs/typography/Abbr.js +108 -0
- package/dist/cjs/typography/Copy.js +59 -0
- package/dist/cjs/typography/Link.js +55 -0
- package/dist/cjs/typography/Mark.js +86 -0
- package/dist/cjs/typography/Text.js +121 -0
- package/dist/cjs/typography/Title.js +58 -0
- package/dist/cjs/typography/Typography.module.css +1 -0
- package/dist/cjs/typography/types.js +42 -0
- package/dist/cjs/utils/calculateDimensions.js +51 -0
- package/dist/cjs/utils/getColor.js +52 -0
- package/dist/cjs/utils/nodeCheck.js +35 -0
- package/dist/esm/components/actionLabel/ActionLabel.js +56 -0
- package/dist/esm/components/actionLabel/ActionLabel.module.css +1 -0
- package/dist/esm/components/animations/Animations.js +131 -0
- package/dist/esm/components/animations/Animations.module.css +1 -0
- package/dist/esm/components/avatar/Avatar.js +144 -0
- package/dist/esm/components/avatar/Avatar.module.css +1 -0
- package/dist/esm/components/avatar/AvatarGroup.js +74 -0
- package/dist/esm/components/badge/Badge.js +81 -0
- package/dist/esm/components/badge/Badge.module.css +1 -0
- package/dist/esm/components/breadcrumbs/Breadcrumbs.js +71 -0
- package/dist/esm/components/breadcrumbs/Breadcrumbs.module.css +1 -0
- package/dist/esm/components/button/Button.js +170 -0
- package/dist/esm/components/button/Button.module.css +1 -0
- package/dist/esm/components/button/ButtonGroup.js +41 -0
- package/dist/esm/components/button/ConfirmButton.js +166 -0
- package/dist/esm/components/button/ToggleButtonGroup.js +68 -0
- package/dist/esm/components/callout/Callout.js +54 -0
- package/dist/esm/components/card/Card.js +62 -0
- package/dist/esm/components/card/Card.module.css +1 -0
- package/dist/esm/components/card/CardCover.js +48 -0
- package/dist/esm/components/chip/Chip.js +94 -0
- package/dist/esm/components/chip/Chip.module.css +1 -0
- package/dist/esm/components/collapsable/Collapsable.js +84 -0
- package/dist/esm/components/collapsable/Collapsable.module.css +1 -0
- package/dist/esm/components/divider/Divider.js +65 -0
- package/dist/esm/components/dropdown/Dropdown.js +179 -0
- package/dist/esm/components/dropdown/Dropdown.module.css +1 -0
- package/dist/esm/components/dropdown/DropdownTool.js +26 -0
- package/dist/esm/components/empty/EmptyContent.js +92 -0
- package/dist/esm/components/icon/Icon.js +106 -0
- package/dist/esm/components/icon/Icon.module.css +1 -0
- package/dist/esm/components/media/Media.js +148 -0
- package/dist/esm/components/media/Media.module.css +1 -0
- package/dist/esm/components/menu/ContextMenu.js +84 -0
- package/dist/esm/components/menu/Menu.js +204 -0
- package/dist/esm/components/menu/Menu.module.css +1 -0
- package/dist/esm/components/menu/MenuItem.js +119 -0
- package/dist/esm/components/meter/Meter.js +41 -0
- package/dist/esm/components/meter/Meter.module.css +1 -0
- package/dist/esm/components/navigator/Navigator.js +54 -0
- package/dist/esm/components/panel/Panel.js +125 -0
- package/dist/esm/components/panel/Panel.module.css +1 -0
- package/dist/esm/components/panel/PanelGroup.js +50 -0
- package/dist/esm/components/panel/PanelStack.js +85 -0
- package/dist/esm/components/progress/Progress.module.css +1 -0
- package/dist/esm/components/progress/ProgressBar.js +62 -0
- package/dist/esm/components/progress/ProgressCircle.js +96 -0
- package/dist/esm/components/tabpanel/Tab.js +78 -0
- package/dist/esm/components/tabpanel/TabPanel.js +77 -0
- package/dist/esm/components/tabpanel/TabPanel.module.css +1 -0
- package/dist/esm/context/Global.js +165 -0
- package/dist/esm/context/NotificationCenter.js +254 -0
- package/dist/esm/core/aside/Aside.js +152 -0
- package/dist/esm/core/aside/Aside.module.css +1 -0
- package/dist/esm/core/boundary/ErrorBoundary.js +140 -0
- package/dist/esm/core/boundary/ErrorBoundary.module.css +1 -0
- package/dist/esm/core/boundary/ErrorIcon.js +51 -0
- package/dist/esm/core/content/Content.js +70 -0
- package/dist/esm/core/content/Content.module.css +1 -0
- package/dist/esm/core/headfoot/HeadFoot.js +61 -0
- package/dist/esm/core/headfoot/HeadFoot.module.css +1 -0
- package/dist/esm/core/page/Page.js +65 -0
- package/dist/esm/core/page/Page.module.css +1 -0
- package/dist/esm/core/responsive/Responsive.js +62 -0
- package/dist/esm/core/responsive/Responsive.module.css +1 -0
- package/dist/esm/core/section/Section.js +44 -0
- package/dist/esm/core/section/Section.module.css +1 -0
- package/dist/esm/core/theme/Theme.module.css +1 -0
- package/dist/esm/core/theme/ThemeProvider.js +74 -0
- package/dist/esm/core/viewport/Viewport.js +39 -0
- package/dist/esm/core/viewport/Viewport.module.css +1 -0
- package/dist/esm/hooks/useClientService.js +30 -0
- package/dist/esm/hooks/useControlledValue.js +22 -0
- package/dist/esm/hooks/useDebounce.js +56 -0
- package/dist/esm/hooks/useEffectDebugger.js +111 -0
- package/dist/esm/hooks/useIsDark.js +33 -0
- package/dist/esm/hooks/useIsRtl.js +27 -0
- package/dist/esm/hooks/useNavigator.js +36 -0
- package/dist/esm/hooks/useOverlayService.js +55 -0
- package/dist/esm/hooks/usePropToggle.js +40 -0
- package/dist/esm/hooks/useResize.js +75 -0
- package/dist/esm/hooks/useResizeObserver.js +38 -0
- package/dist/esm/hooks/useStorage.js +43 -0
- package/dist/esm/hotkeys/HotKey.js +47 -0
- package/dist/esm/hotkeys/HotKeyLabel.js +52 -0
- package/dist/esm/hotkeys/HotKeyWrapper.js +96 -0
- package/dist/esm/hotkeys/commons.js +56 -0
- package/dist/esm/i18n/ar.json.js +27 -0
- package/dist/esm/i18n/en.json.js +41 -0
- package/dist/esm/i18n/index.js +55 -0
- package/dist/esm/index.js +75 -0
- package/dist/esm/overlays/alert/Alert.js +163 -0
- package/dist/esm/overlays/alert/Alert.module.css +1 -0
- package/dist/esm/overlays/flyout/Flyout.js +152 -0
- package/dist/esm/overlays/flyout/Flyout.module.css +1 -0
- package/dist/esm/overlays/message/Message.js +84 -0
- package/dist/esm/overlays/message/Message.module.css +1 -0
- package/dist/esm/overlays/modal/Modal.js +132 -0
- package/dist/esm/overlays/modal/Modal.module.css +1 -0
- package/dist/esm/overlays/toast/Toast.js +166 -0
- package/dist/esm/overlays/toast/Toast.module.css +1 -0
- package/dist/esm/overlays/tooltip/Tooltip.js +132 -0
- package/dist/esm/overlays/tooltip/Tooltip.module.css +1 -0
- package/dist/esm/types/icons.js +199 -0
- package/dist/esm/typography/Abbr.js +108 -0
- package/dist/esm/typography/Copy.js +59 -0
- package/dist/esm/typography/Link.js +55 -0
- package/dist/esm/typography/Mark.js +86 -0
- package/dist/esm/typography/Text.js +121 -0
- package/dist/esm/typography/Title.js +58 -0
- package/dist/esm/typography/Typography.module.css +1 -0
- package/dist/esm/typography/types.js +41 -0
- package/dist/esm/utils/calculateDimensions.js +50 -0
- package/dist/esm/utils/getColor.js +49 -0
- package/dist/esm/utils/nodeCheck.js +35 -0
- package/dist/types/components/actionLabel/ActionLabel.d.ts +21 -0
- package/dist/types/components/animations/Animations.d.ts +23 -0
- package/dist/types/components/avatar/Avatar.d.ts +48 -0
- package/dist/types/components/avatar/AvatarGroup.d.ts +24 -0
- package/dist/types/components/badge/Badge.d.ts +25 -0
- package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +17 -0
- package/dist/types/components/button/Button.d.ts +94 -0
- package/dist/types/components/button/ButtonGroup.d.ts +34 -0
- package/dist/types/components/button/ConfirmButton.d.ts +27 -0
- package/dist/types/components/button/ToggleButtonGroup.d.ts +56 -0
- package/dist/types/components/callout/Callout.d.ts +28 -0
- package/dist/types/components/card/Card.d.ts +39 -0
- package/dist/types/components/card/CardCover.d.ts +16 -0
- package/dist/types/components/chip/Chip.d.ts +41 -0
- package/dist/types/components/collapsable/Collapsable.d.ts +43 -0
- package/dist/types/components/divider/Divider.d.ts +20 -0
- package/dist/types/components/dropdown/Dropdown.d.ts +50 -0
- package/dist/types/components/dropdown/DropdownTool.d.ts +8 -0
- package/dist/types/components/empty/EmptyContent.d.ts +21 -0
- package/dist/types/components/icon/Icon.d.ts +44 -0
- package/dist/types/components/index.d.ts +33 -0
- package/dist/types/components/media/Media.d.ts +37 -0
- package/dist/types/components/menu/ContextMenu.d.ts +7 -0
- package/dist/types/components/menu/Menu.d.ts +2 -0
- package/dist/types/components/menu/MenuItem.d.ts +4 -0
- package/dist/types/components/menu/types.d.ts +59 -0
- package/dist/types/components/meter/Meter.d.ts +12 -0
- package/dist/types/components/navigator/Navigator.d.ts +12 -0
- package/dist/types/components/panel/Panel.d.ts +59 -0
- package/dist/types/components/panel/PanelGroup.d.ts +12 -0
- package/dist/types/components/panel/PanelStack.d.ts +16 -0
- package/dist/types/components/progress/ProgressBar.d.ts +24 -0
- package/dist/types/components/progress/ProgressCircle.d.ts +16 -0
- package/dist/types/components/tabpanel/Tab.d.ts +41 -0
- package/dist/types/components/tabpanel/TabPanel.d.ts +41 -0
- package/dist/types/context/Global.d.ts +81 -0
- package/dist/types/context/NotificationCenter.d.ts +11 -0
- package/dist/types/core/aside/Aside.d.ts +52 -0
- package/dist/types/core/boundary/ErrorBoundary.d.ts +26 -0
- package/dist/types/core/boundary/ErrorIcon.d.ts +1 -0
- package/dist/types/core/content/Content.d.ts +15 -0
- package/dist/types/core/headfoot/HeadFoot.d.ts +24 -0
- package/dist/types/core/index.d.ts +9 -0
- package/dist/types/core/page/Page.d.ts +23 -0
- package/dist/types/core/responsive/Responsive.d.ts +53 -0
- package/dist/types/core/section/Section.d.ts +7 -0
- package/dist/types/core/theme/ThemeProvider.d.ts +37 -0
- package/dist/types/core/viewport/Viewport.d.ts +5 -0
- package/dist/types/hooks/useClientService.d.ts +1 -0
- package/dist/types/hooks/useControlledValue.d.ts +5 -0
- package/dist/types/hooks/useDebounce.d.ts +4 -0
- package/dist/types/hooks/useEffectDebugger.d.ts +4 -0
- package/dist/types/hooks/useIsDark.d.ts +1 -0
- package/dist/types/hooks/useIsRtl.d.ts +1 -0
- package/dist/types/hooks/useNavigator.d.ts +7 -0
- package/dist/types/hooks/useOverlayService.d.ts +10 -0
- package/dist/types/hooks/usePropToggle.d.ts +9 -0
- package/dist/types/hooks/useResize.d.ts +27 -0
- package/dist/types/hooks/useResizeObserver.d.ts +3 -0
- package/dist/types/hooks/useStorage.d.ts +2 -0
- package/dist/types/hotkeys/HotKey.d.ts +2 -0
- package/dist/types/hotkeys/HotKeyLabel.d.ts +2 -0
- package/dist/types/hotkeys/HotKeyWrapper.d.ts +11 -0
- package/dist/types/hotkeys/commons.d.ts +28 -0
- package/dist/types/i18n/index.d.ts +6 -0
- package/dist/types/index.d.ts +19 -0
- package/dist/types/overlays/alert/Alert.d.ts +33 -0
- package/dist/types/overlays/flyout/Flyout.d.ts +57 -0
- package/dist/types/overlays/index.d.ts +6 -0
- package/dist/types/overlays/message/Message.d.ts +21 -0
- package/dist/types/overlays/modal/Modal.d.ts +53 -0
- package/dist/types/overlays/toast/Toast.d.ts +33 -0
- package/dist/types/overlays/tooltip/Tooltip.d.ts +18 -0
- package/dist/types/types/icons.d.ts +194 -0
- package/dist/types/types/index.d.ts +140 -0
- package/dist/types/typography/Abbr.d.ts +22 -0
- package/dist/types/typography/Copy.d.ts +9 -0
- package/dist/types/typography/Link.d.ts +24 -0
- package/dist/types/typography/Mark.d.ts +18 -0
- package/dist/types/typography/Text.d.ts +35 -0
- package/dist/types/typography/Title.d.ts +29 -0
- package/dist/types/typography/index.d.ts +6 -0
- package/dist/types/typography/types.d.ts +2 -0
- package/dist/types/utils/calculateDimensions.d.ts +6 -0
- package/dist/types/utils/getColor.d.ts +4 -0
- package/dist/types/utils/index.d.ts +3 -0
- package/dist/types/utils/nodeCheck.d.ts +2 -0
- package/package.json +60 -0
- package/src/components/actionLabel/ActionLabel.module.css +38 -0
- package/src/components/actionLabel/ActionLabel.tsx +97 -0
- package/src/components/animations/Animations.module.css +253 -0
- package/src/components/animations/Animations.tsx +190 -0
- package/src/components/avatar/Avatar.module.css +90 -0
- package/src/components/avatar/Avatar.tsx +218 -0
- package/src/components/avatar/AvatarGroup.tsx +140 -0
- package/src/components/badge/Badge.module.css +165 -0
- package/src/components/badge/Badge.tsx +148 -0
- package/src/components/breadcrumbs/Breadcrumbs.module.css +189 -0
- package/src/components/breadcrumbs/Breadcrumbs.tsx +109 -0
- package/src/components/button/Button.module.css +375 -0
- package/src/components/button/Button.tsx +323 -0
- package/src/components/button/ButtonGroup.tsx +112 -0
- package/src/components/button/ConfirmButton.tsx +221 -0
- package/src/components/button/ToggleButtonGroup.tsx +161 -0
- package/src/components/callout/Callout.tsx +104 -0
- package/src/components/card/Card.module.css +152 -0
- package/src/components/card/Card.tsx +154 -0
- package/src/components/card/CardCover.tsx +87 -0
- package/src/components/chip/Chip.module.css +118 -0
- package/src/components/chip/Chip.tsx +201 -0
- package/src/components/collapsable/Collapsable.module.css +30 -0
- package/src/components/collapsable/Collapsable.tsx +153 -0
- package/src/components/divider/Divider.tsx +105 -0
- package/src/components/dropdown/Dropdown.module.css +39 -0
- package/src/components/dropdown/Dropdown.tsx +307 -0
- package/src/components/dropdown/DropdownTool.tsx +56 -0
- package/src/components/empty/EmptyContent.tsx +141 -0
- package/src/components/icon/Icon.module.css +71 -0
- package/src/components/icon/Icon.tsx +188 -0
- package/src/components/index.ts +61 -0
- package/src/components/media/Media.module.css +112 -0
- package/src/components/media/Media.tsx +224 -0
- package/src/components/menu/ContextMenu.tsx +116 -0
- package/src/components/menu/Menu.module.css +109 -0
- package/src/components/menu/Menu.tsx +278 -0
- package/src/components/menu/MenuItem.tsx +162 -0
- package/src/components/menu/types.ts +100 -0
- package/src/components/meter/Meter.module.css +116 -0
- package/src/components/meter/Meter.tsx +80 -0
- package/src/components/navigator/Navigator.tsx +77 -0
- package/src/components/panel/Panel.module.css +86 -0
- package/src/components/panel/Panel.tsx +254 -0
- package/src/components/panel/PanelGroup.tsx +99 -0
- package/src/components/panel/PanelStack.tsx +133 -0
- package/src/components/progress/Progress.module.css +70 -0
- package/src/components/progress/ProgressBar.tsx +122 -0
- package/src/components/progress/ProgressCircle.tsx +118 -0
- package/src/components/tabpanel/Tab.tsx +175 -0
- package/src/components/tabpanel/TabPanel.module.css +200 -0
- package/src/components/tabpanel/TabPanel.tsx +155 -0
- package/src/context/Global.tsx +241 -0
- package/src/context/NotificationCenter.tsx +223 -0
- package/src/core/aside/Aside.module.css +231 -0
- package/src/core/aside/Aside.tsx +262 -0
- package/src/core/boundary/ErrorBoundary.module.css +65 -0
- package/src/core/boundary/ErrorBoundary.tsx +146 -0
- package/src/core/boundary/ErrorIcon.tsx +50 -0
- package/src/core/content/Content.module.css +40 -0
- package/src/core/content/Content.tsx +91 -0
- package/src/core/headfoot/HeadFoot.module.css +38 -0
- package/src/core/headfoot/HeadFoot.tsx +114 -0
- package/src/core/index.ts +32 -0
- package/src/core/page/Page.module.css +46 -0
- package/src/core/page/Page.tsx +100 -0
- package/src/core/responsive/Responsive.module.css +85 -0
- package/src/core/responsive/Responsive.tsx +172 -0
- package/src/core/section/Section.module.css +28 -0
- package/src/core/section/Section.tsx +48 -0
- package/src/core/theme/Theme.module.css +30 -0
- package/src/core/theme/ThemeProvider.tsx +112 -0
- package/src/core/viewport/Viewport.module.css +32 -0
- package/src/core/viewport/Viewport.tsx +43 -0
- package/src/hooks/useClientService.tsx +29 -0
- package/src/hooks/useControlledValue.tsx +43 -0
- package/src/hooks/useDebounce.ts +52 -0
- package/src/hooks/useEffectDebugger.ts +154 -0
- package/src/hooks/useIsDark.ts +50 -0
- package/src/hooks/useIsRtl.ts +46 -0
- package/src/hooks/useNavigator.tsx +54 -0
- package/src/hooks/useOverlayService.tsx +51 -0
- package/src/hooks/usePropToggle.ts +61 -0
- package/src/hooks/useResize.ts +90 -0
- package/src/hooks/useResizeObserver.ts +55 -0
- package/src/hooks/useStorage.ts +76 -0
- package/src/hotkeys/HotKey.tsx +39 -0
- package/src/hotkeys/HotKeyLabel.tsx +61 -0
- package/src/hotkeys/HotKeyWrapper.tsx +137 -0
- package/src/hotkeys/commons.ts +74 -0
- package/src/i18n/ar.json +21 -0
- package/src/i18n/en.json +34 -0
- package/src/i18n/index.ts +50 -0
- package/src/index.ts +51 -0
- package/src/overlays/alert/Alert.module.css +44 -0
- package/src/overlays/alert/Alert.tsx +229 -0
- package/src/overlays/flyout/Flyout.module.css +52 -0
- package/src/overlays/flyout/Flyout.tsx +283 -0
- package/src/overlays/index.ts +29 -0
- package/src/overlays/message/Message.module.css +37 -0
- package/src/overlays/message/Message.tsx +107 -0
- package/src/overlays/modal/Modal.module.css +53 -0
- package/src/overlays/modal/Modal.tsx +244 -0
- package/src/overlays/toast/Toast.module.css +37 -0
- package/src/overlays/toast/Toast.tsx +216 -0
- package/src/overlays/tooltip/Tooltip.module.css +53 -0
- package/src/overlays/tooltip/Tooltip.tsx +200 -0
- package/src/types/global.d.ts +83 -0
- package/src/types/icons.ts +420 -0
- package/src/types/index.ts +238 -0
- package/src/typography/Abbr.tsx +152 -0
- package/src/typography/Copy.tsx +61 -0
- package/src/typography/Link.tsx +110 -0
- package/src/typography/Mark.tsx +122 -0
- package/src/typography/Text.tsx +194 -0
- package/src/typography/Title.tsx +126 -0
- package/src/typography/Typography.module.css +68 -0
- package/src/typography/index.ts +29 -0
- package/src/typography/types.ts +38 -0
- package/src/utils/calculateDimensions.ts +72 -0
- package/src/utils/getColor.ts +49 -0
- package/src/utils/index.ts +28 -0
- package/src/utils/nodeCheck.ts +34 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* React Fabric
|
|
3
|
+
* @version: 1.0.0
|
|
4
|
+
*
|
|
5
|
+
*
|
|
6
|
+
* The MIT License (MIT)
|
|
7
|
+
* Copyright (c) 2024 Adarsh Pastakia
|
|
8
|
+
*
|
|
9
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
|
10
|
+
* and associated documentation files (the "Software"), to deal in the Software without restriction,
|
|
11
|
+
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
12
|
+
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
|
13
|
+
* subject to the following conditions:
|
|
14
|
+
*
|
|
15
|
+
* The above copyright notice and this permission notice shall be included in all copies or substantial
|
|
16
|
+
* portions of the Software.
|
|
17
|
+
*
|
|
18
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
19
|
+
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
20
|
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
21
|
+
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
@layer comp {
|
|
25
|
+
.collapsable {
|
|
26
|
+
& + & {
|
|
27
|
+
border-top: 1px solid theme(borderColor.base);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* React Fabric
|
|
3
|
+
* @version: 1.0.0
|
|
4
|
+
*
|
|
5
|
+
*
|
|
6
|
+
* The MIT License (MIT)
|
|
7
|
+
* Copyright (c) 2024 Adarsh Pastakia
|
|
8
|
+
*
|
|
9
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
|
10
|
+
* and associated documentation files (the "Software"), to deal in the Software without restriction,
|
|
11
|
+
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
12
|
+
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
|
13
|
+
* subject to the following conditions:
|
|
14
|
+
*
|
|
15
|
+
* The above copyright notice and this permission notice shall be included in all copies or substantial
|
|
16
|
+
* portions of the Software.
|
|
17
|
+
*
|
|
18
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
19
|
+
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
20
|
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
21
|
+
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import classNames from "classnames";
|
|
25
|
+
import {
|
|
26
|
+
Children,
|
|
27
|
+
useEffect,
|
|
28
|
+
useImperativeHandle,
|
|
29
|
+
useMemo,
|
|
30
|
+
useRef,
|
|
31
|
+
useState,
|
|
32
|
+
type RefObject,
|
|
33
|
+
} from "react";
|
|
34
|
+
import {
|
|
35
|
+
type AriaProps,
|
|
36
|
+
type ChildrenProp,
|
|
37
|
+
type CssProp,
|
|
38
|
+
type RefProp,
|
|
39
|
+
type TestProps,
|
|
40
|
+
} from "../../types";
|
|
41
|
+
import { CoreIcons } from "../../types/icons";
|
|
42
|
+
import { Icon } from "../icon/Icon";
|
|
43
|
+
import classes from "./Collapsable.module.css";
|
|
44
|
+
|
|
45
|
+
interface CollapsableRef {
|
|
46
|
+
button: RefObject<HTMLElement>;
|
|
47
|
+
body: RefObject<HTMLElement>;
|
|
48
|
+
open: boolean;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface CollapsableProps
|
|
52
|
+
extends CssProp,
|
|
53
|
+
AriaProps,
|
|
54
|
+
TestProps,
|
|
55
|
+
RefProp<CollapsableRef>,
|
|
56
|
+
ChildrenProp {
|
|
57
|
+
/**
|
|
58
|
+
* expand icon alignment
|
|
59
|
+
*/
|
|
60
|
+
iconAlign?: "start" | "end";
|
|
61
|
+
/**
|
|
62
|
+
* panel body className
|
|
63
|
+
*/
|
|
64
|
+
bodyClassName?: string;
|
|
65
|
+
/**
|
|
66
|
+
* header button className
|
|
67
|
+
*/
|
|
68
|
+
headerClassName?: string;
|
|
69
|
+
/**
|
|
70
|
+
* open state icon
|
|
71
|
+
*/
|
|
72
|
+
iconOpen?: string;
|
|
73
|
+
/**
|
|
74
|
+
* closed state icon
|
|
75
|
+
*/
|
|
76
|
+
iconClosed?: string;
|
|
77
|
+
/**
|
|
78
|
+
* open state
|
|
79
|
+
*/
|
|
80
|
+
open?: boolean;
|
|
81
|
+
/**
|
|
82
|
+
* open handler
|
|
83
|
+
*/
|
|
84
|
+
onOpen?: () => void;
|
|
85
|
+
/**
|
|
86
|
+
* open handler
|
|
87
|
+
*/
|
|
88
|
+
onClose?: () => void;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export const Collapsable = ({
|
|
92
|
+
ref,
|
|
93
|
+
className,
|
|
94
|
+
bodyClassName,
|
|
95
|
+
headerClassName,
|
|
96
|
+
children,
|
|
97
|
+
iconAlign,
|
|
98
|
+
iconClosed = CoreIcons.chevronRight,
|
|
99
|
+
iconOpen = CoreIcons.chevronDown,
|
|
100
|
+
open,
|
|
101
|
+
onClose,
|
|
102
|
+
onOpen,
|
|
103
|
+
...aria
|
|
104
|
+
}: CollapsableProps) => {
|
|
105
|
+
const [openState, setOpenState] = useState(open);
|
|
106
|
+
const headRef = useRef(null);
|
|
107
|
+
const bodyRef = useRef(null);
|
|
108
|
+
|
|
109
|
+
useImperativeHandle(
|
|
110
|
+
ref,
|
|
111
|
+
() => ({
|
|
112
|
+
button: headRef,
|
|
113
|
+
body: bodyRef,
|
|
114
|
+
open: !!openState,
|
|
115
|
+
}),
|
|
116
|
+
[openState],
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
useEffect(() => {
|
|
120
|
+
setOpenState(open);
|
|
121
|
+
}, [open]);
|
|
122
|
+
|
|
123
|
+
const [head, body] = useMemo(() => {
|
|
124
|
+
const [h, ...b] = Children.toArray(children);
|
|
125
|
+
return [h, b];
|
|
126
|
+
}, [children]);
|
|
127
|
+
return (
|
|
128
|
+
<div className={classNames(classes.collapsable, className)} {...aria}>
|
|
129
|
+
<div
|
|
130
|
+
role="none"
|
|
131
|
+
ref={headRef}
|
|
132
|
+
className={classNames(
|
|
133
|
+
classes.collapsableHead,
|
|
134
|
+
"flex gap-1 flex-nowrap py-2 font-medium cursor-pointer items-center select-none hover:opacity-70",
|
|
135
|
+
headerClassName,
|
|
136
|
+
iconAlign === "end" ? "flex-row-reverse" : "flex-row",
|
|
137
|
+
)}
|
|
138
|
+
onClick={() => setOpenState(!openState)}
|
|
139
|
+
>
|
|
140
|
+
<Icon size="1.125em" icon={openState ? iconOpen : iconClosed} rtlFlip />
|
|
141
|
+
<div className="flex-1 px-2">{head}</div>
|
|
142
|
+
</div>
|
|
143
|
+
{openState && (
|
|
144
|
+
<div
|
|
145
|
+
ref={bodyRef}
|
|
146
|
+
className={classNames(classes.collapsableBody, bodyClassName)}
|
|
147
|
+
>
|
|
148
|
+
{body}
|
|
149
|
+
</div>
|
|
150
|
+
)}
|
|
151
|
+
</div>
|
|
152
|
+
);
|
|
153
|
+
};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* React Fabric
|
|
3
|
+
* @version: 1.0.0
|
|
4
|
+
*
|
|
5
|
+
*
|
|
6
|
+
* The MIT License (MIT)
|
|
7
|
+
* Copyright (c) 2024 Adarsh Pastakia
|
|
8
|
+
*
|
|
9
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
|
10
|
+
* and associated documentation files (the "Software"), to deal in the Software without restriction,
|
|
11
|
+
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
12
|
+
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
|
13
|
+
* subject to the following conditions:
|
|
14
|
+
*
|
|
15
|
+
* The above copyright notice and this permission notice shall be included in all copies or substantial
|
|
16
|
+
* portions of the Software.
|
|
17
|
+
*
|
|
18
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
19
|
+
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
20
|
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
21
|
+
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import classNames from "classnames";
|
|
25
|
+
import { useCallback } from "react";
|
|
26
|
+
import {
|
|
27
|
+
type CssProp,
|
|
28
|
+
type ChildProp,
|
|
29
|
+
type ColorType,
|
|
30
|
+
type PaletteType,
|
|
31
|
+
} from "../../types";
|
|
32
|
+
import { getBgClass, getBorderClass, getColorClass } from "../../utils";
|
|
33
|
+
|
|
34
|
+
export interface DividerProps extends CssProp, Partial<ChildProp> {
|
|
35
|
+
/**
|
|
36
|
+
* apply text bg
|
|
37
|
+
*/
|
|
38
|
+
fill?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* vertical rule
|
|
41
|
+
*/
|
|
42
|
+
vertical?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* rule color
|
|
45
|
+
*/
|
|
46
|
+
color?: ColorType | PaletteType | "tint";
|
|
47
|
+
/**
|
|
48
|
+
* text alignment
|
|
49
|
+
*/
|
|
50
|
+
align?: "start" | "end" | "center";
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export const Divider = ({
|
|
54
|
+
children,
|
|
55
|
+
color,
|
|
56
|
+
vertical,
|
|
57
|
+
fill,
|
|
58
|
+
align = "start",
|
|
59
|
+
className,
|
|
60
|
+
}: DividerProps) => {
|
|
61
|
+
const Rule = useCallback(
|
|
62
|
+
({ flex, className }: KeyValue) => {
|
|
63
|
+
return (
|
|
64
|
+
<hr
|
|
65
|
+
style={{ flex }}
|
|
66
|
+
className={classNames(
|
|
67
|
+
className,
|
|
68
|
+
vertical && "vertical",
|
|
69
|
+
!flex && "self-stretch",
|
|
70
|
+
vertical ? "mx-1" : "my-1",
|
|
71
|
+
color && getBorderClass(color + "-200"),
|
|
72
|
+
)}
|
|
73
|
+
/>
|
|
74
|
+
);
|
|
75
|
+
},
|
|
76
|
+
[color, vertical],
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
return children ? (
|
|
80
|
+
<div
|
|
81
|
+
className={classNames(
|
|
82
|
+
"flex flex-nowrap items-center",
|
|
83
|
+
vertical && "flex-col",
|
|
84
|
+
className,
|
|
85
|
+
)}
|
|
86
|
+
>
|
|
87
|
+
<Rule flex={align === "start" ? "0 0 1rem" : "1 1 1em"} />
|
|
88
|
+
<div
|
|
89
|
+
className={classNames(
|
|
90
|
+
"px-2 whitespace-nowrap",
|
|
91
|
+
vertical ? "mx-1" : "my-1",
|
|
92
|
+
fill && getBgClass((color ?? "tint") + "-200"),
|
|
93
|
+
!fill && getColorClass((color ?? "tint") + "-600"),
|
|
94
|
+
"rounded-full text-[0.75em]",
|
|
95
|
+
vertical && "origin-center -rotate-90 z-1",
|
|
96
|
+
)}
|
|
97
|
+
>
|
|
98
|
+
{children}
|
|
99
|
+
</div>
|
|
100
|
+
<Rule flex={align === "end" ? "0 0 1rem" : "1 1 1em"} />
|
|
101
|
+
</div>
|
|
102
|
+
) : (
|
|
103
|
+
<Rule className={className} />
|
|
104
|
+
);
|
|
105
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* React Fabric
|
|
3
|
+
* @version: 1.0.0
|
|
4
|
+
*
|
|
5
|
+
*
|
|
6
|
+
* The MIT License (MIT)
|
|
7
|
+
* Copyright (c) 2024 Adarsh Pastakia
|
|
8
|
+
*
|
|
9
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
|
10
|
+
* and associated documentation files (the "Software"), to deal in the Software without restriction,
|
|
11
|
+
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
12
|
+
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
|
13
|
+
* subject to the following conditions:
|
|
14
|
+
*
|
|
15
|
+
* The above copyright notice and this permission notice shall be included in all copies or substantial
|
|
16
|
+
* portions of the Software.
|
|
17
|
+
*
|
|
18
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
19
|
+
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
20
|
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
21
|
+
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
@layer var {
|
|
25
|
+
.dropdownBody {
|
|
26
|
+
grid-template: 1fr /1fr;
|
|
27
|
+
|
|
28
|
+
& [data-ref="card"],
|
|
29
|
+
& [data-ref="panel"],
|
|
30
|
+
& [data-ref="panelGroup"] {
|
|
31
|
+
grid-area: unset;
|
|
32
|
+
|
|
33
|
+
border-top: 0;
|
|
34
|
+
border-inline: 0;
|
|
35
|
+
outline: 0;
|
|
36
|
+
box-shadow: none;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* React Fabric
|
|
3
|
+
* @version: 1.0.0
|
|
4
|
+
*
|
|
5
|
+
*
|
|
6
|
+
* The MIT License (MIT)
|
|
7
|
+
* Copyright (c) 2024 Adarsh Pastakia
|
|
8
|
+
*
|
|
9
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
|
10
|
+
* and associated documentation files (the "Software"), to deal in the Software without restriction,
|
|
11
|
+
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
12
|
+
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
|
13
|
+
* subject to the following conditions:
|
|
14
|
+
*
|
|
15
|
+
* The above copyright notice and this permission notice shall be included in all copies or substantial
|
|
16
|
+
* portions of the Software.
|
|
17
|
+
*
|
|
18
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
19
|
+
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
20
|
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
21
|
+
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import {
|
|
25
|
+
FloatingArrow,
|
|
26
|
+
FloatingFocusManager,
|
|
27
|
+
FloatingOverlay,
|
|
28
|
+
FloatingPortal,
|
|
29
|
+
FloatingTree,
|
|
30
|
+
arrow,
|
|
31
|
+
autoUpdate,
|
|
32
|
+
flip,
|
|
33
|
+
offset,
|
|
34
|
+
safePolygon,
|
|
35
|
+
shift,
|
|
36
|
+
useClick,
|
|
37
|
+
useDismiss,
|
|
38
|
+
useFloating,
|
|
39
|
+
useFloatingTree,
|
|
40
|
+
useHover,
|
|
41
|
+
useInteractions,
|
|
42
|
+
type Placement,
|
|
43
|
+
} from "@floating-ui/react";
|
|
44
|
+
import { mergeRefs } from "@react-fabric/utilities";
|
|
45
|
+
import classNames from "classnames";
|
|
46
|
+
import {
|
|
47
|
+
Children,
|
|
48
|
+
Fragment,
|
|
49
|
+
cloneElement,
|
|
50
|
+
useCallback,
|
|
51
|
+
useEffect,
|
|
52
|
+
useMemo,
|
|
53
|
+
useRef,
|
|
54
|
+
useState,
|
|
55
|
+
} from "react";
|
|
56
|
+
import { type ChildProp, type RefProp } from "../../types";
|
|
57
|
+
import classes from "./Dropdown.module.css";
|
|
58
|
+
|
|
59
|
+
export interface DropdownProps extends RefProp {
|
|
60
|
+
children: [React.ReactNode, React.ReactNode];
|
|
61
|
+
/**
|
|
62
|
+
* dropdown placement
|
|
63
|
+
*/
|
|
64
|
+
placement?: Placement;
|
|
65
|
+
/**
|
|
66
|
+
* show dropdown arrow
|
|
67
|
+
*/
|
|
68
|
+
showArrow?: boolean;
|
|
69
|
+
/**
|
|
70
|
+
* fit with to anchor' parent element
|
|
71
|
+
*/
|
|
72
|
+
fitToParent?: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* close dropdown on click
|
|
75
|
+
*/
|
|
76
|
+
closeOnClick?: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* disable dropdown
|
|
79
|
+
*/
|
|
80
|
+
disabled?: boolean;
|
|
81
|
+
/**
|
|
82
|
+
* plain dropdown body
|
|
83
|
+
*/
|
|
84
|
+
plainDropdown?: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* dropdown body className
|
|
87
|
+
*/
|
|
88
|
+
dropdownClassName?: string;
|
|
89
|
+
/**
|
|
90
|
+
* dropdown event
|
|
91
|
+
*/
|
|
92
|
+
dropdownEvent?: "click" | "hover";
|
|
93
|
+
/**
|
|
94
|
+
* open handler
|
|
95
|
+
*/
|
|
96
|
+
onOpen?: () => void;
|
|
97
|
+
/**
|
|
98
|
+
* close handler
|
|
99
|
+
*/
|
|
100
|
+
onClose?: () => void;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const DropdownElement = ({
|
|
104
|
+
ref,
|
|
105
|
+
children,
|
|
106
|
+
showArrow,
|
|
107
|
+
closeOnClick,
|
|
108
|
+
fitToParent = true,
|
|
109
|
+
placement = "bottom",
|
|
110
|
+
onClose,
|
|
111
|
+
onOpen,
|
|
112
|
+
disabled,
|
|
113
|
+
plainDropdown,
|
|
114
|
+
dropdownEvent,
|
|
115
|
+
dropdownClassName,
|
|
116
|
+
}: DropdownProps) => {
|
|
117
|
+
const arrowRef = useRef(null);
|
|
118
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
119
|
+
const tree = useFloatingTree();
|
|
120
|
+
|
|
121
|
+
const [anchor, panel] = useMemo<AnyObject[]>(
|
|
122
|
+
() => Children.toArray(children as AnyObject),
|
|
123
|
+
[children],
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
const { refs, floatingStyles, context } = useFloating({
|
|
127
|
+
open: isOpen,
|
|
128
|
+
onOpenChange: (open, _, reason) => {
|
|
129
|
+
if (reason === "reference-press") return;
|
|
130
|
+
setIsOpen(open);
|
|
131
|
+
(open ? onOpen : onClose)?.();
|
|
132
|
+
},
|
|
133
|
+
strategy: "fixed",
|
|
134
|
+
placement,
|
|
135
|
+
whileElementsMounted: autoUpdate,
|
|
136
|
+
middleware: [
|
|
137
|
+
shift({ padding: 8 }),
|
|
138
|
+
flip(),
|
|
139
|
+
showArrow && offset(9),
|
|
140
|
+
showArrow &&
|
|
141
|
+
arrow({
|
|
142
|
+
element: arrowRef,
|
|
143
|
+
}),
|
|
144
|
+
],
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
const handler = dropdownEvent === "hover" ? useHover : useClick;
|
|
148
|
+
const click = handler(context, {
|
|
149
|
+
enabled: !disabled,
|
|
150
|
+
handleClose: safePolygon({ blockPointerEvents: true }),
|
|
151
|
+
});
|
|
152
|
+
const dismiss = useDismiss(context, {
|
|
153
|
+
referencePress: true,
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
const { getReferenceProps, getFloatingProps } = useInteractions([
|
|
157
|
+
dismiss,
|
|
158
|
+
click,
|
|
159
|
+
]);
|
|
160
|
+
|
|
161
|
+
const minWidth = useMemo(() => {
|
|
162
|
+
if (fitToParent) {
|
|
163
|
+
const el: HTMLElement =
|
|
164
|
+
// @ts-expect-error ignore
|
|
165
|
+
refs.reference.current?.closest('[data-ref="buttonGroup"]') ??
|
|
166
|
+
refs.reference.current;
|
|
167
|
+
return el?.offsetWidth;
|
|
168
|
+
}
|
|
169
|
+
return undefined;
|
|
170
|
+
}, [refs, isOpen, fitToParent]);
|
|
171
|
+
|
|
172
|
+
const tryClosing = useCallback(
|
|
173
|
+
(e: React.MouseEvent) => {
|
|
174
|
+
if (
|
|
175
|
+
!refs.floating.current?.contains(
|
|
176
|
+
(e.target as HTMLElement).closest("[data-dropdown-dismiss='false']"),
|
|
177
|
+
) &&
|
|
178
|
+
(!!closeOnClick ||
|
|
179
|
+
refs.floating.current?.contains(
|
|
180
|
+
(e.target as HTMLElement).closest("[data-dropdown-dismiss='true']"),
|
|
181
|
+
))
|
|
182
|
+
) {
|
|
183
|
+
setTimeout(() => {
|
|
184
|
+
setIsOpen(false);
|
|
185
|
+
onClose?.();
|
|
186
|
+
}, 100);
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
[closeOnClick, onClose],
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
const innerRef = useMemo(
|
|
193
|
+
() => mergeRefs(ref, anchor.props.ref, refs.setReference),
|
|
194
|
+
[ref, anchor.props.ref, refs.setReference],
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
useEffect(() => {
|
|
198
|
+
disabled && setIsOpen(false);
|
|
199
|
+
}, [disabled]);
|
|
200
|
+
|
|
201
|
+
useEffect(() => {
|
|
202
|
+
if (!tree) return;
|
|
203
|
+
|
|
204
|
+
function handleTreeClick() {
|
|
205
|
+
setIsOpen(false);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
tree.events.on("close", handleTreeClick);
|
|
209
|
+
|
|
210
|
+
return () => {
|
|
211
|
+
tree.events.off("close", handleTreeClick);
|
|
212
|
+
};
|
|
213
|
+
}, [tree]);
|
|
214
|
+
|
|
215
|
+
if (!anchor || !panel)
|
|
216
|
+
throw Error("Dropdown requires two elements [Anchor, Panel]");
|
|
217
|
+
|
|
218
|
+
return (
|
|
219
|
+
<Fragment>
|
|
220
|
+
{cloneElement(anchor, {
|
|
221
|
+
...getReferenceProps({
|
|
222
|
+
onClick: (e) => {
|
|
223
|
+
anchor.props.onClick?.(e);
|
|
224
|
+
e.stopPropagation();
|
|
225
|
+
},
|
|
226
|
+
}),
|
|
227
|
+
"data-dropdown-open": isOpen ? true : undefined,
|
|
228
|
+
ref: innerRef,
|
|
229
|
+
})}
|
|
230
|
+
{isOpen && (
|
|
231
|
+
<FloatingPortal
|
|
232
|
+
root={
|
|
233
|
+
refs.domReference.current?.closest<HTMLElement>(".theme-base") ??
|
|
234
|
+
undefined
|
|
235
|
+
}
|
|
236
|
+
>
|
|
237
|
+
<FloatingOverlay />
|
|
238
|
+
<FloatingFocusManager context={context} modal>
|
|
239
|
+
<div
|
|
240
|
+
ref={(el) => {
|
|
241
|
+
refs.setFloating(el);
|
|
242
|
+
el
|
|
243
|
+
?.querySelector<HTMLElement>("input,textarea,button")
|
|
244
|
+
?.focus();
|
|
245
|
+
}}
|
|
246
|
+
style={{
|
|
247
|
+
minWidth,
|
|
248
|
+
zIndex: "var(--z-popover)",
|
|
249
|
+
...floatingStyles,
|
|
250
|
+
}}
|
|
251
|
+
{...getFloatingProps({
|
|
252
|
+
onClick: (e) => e.stopPropagation(),
|
|
253
|
+
})}
|
|
254
|
+
>
|
|
255
|
+
<div
|
|
256
|
+
role="none"
|
|
257
|
+
className={classNames(
|
|
258
|
+
classes.dropdownBody,
|
|
259
|
+
dropdownClassName,
|
|
260
|
+
!plainDropdown && "shadow-lg bg-base ring-1 ring-tint-100",
|
|
261
|
+
"rounded-capped overflow-auto scroll-thin grid max-h-[70vh]",
|
|
262
|
+
)}
|
|
263
|
+
onMouseUpCapture={tryClosing}
|
|
264
|
+
>
|
|
265
|
+
{panel}
|
|
266
|
+
</div>
|
|
267
|
+
{showArrow && (
|
|
268
|
+
<FloatingArrow
|
|
269
|
+
ref={arrowRef}
|
|
270
|
+
context={context}
|
|
271
|
+
strokeWidth={0.5}
|
|
272
|
+
className="fill-base stroke-muted"
|
|
273
|
+
/>
|
|
274
|
+
)}
|
|
275
|
+
</div>
|
|
276
|
+
</FloatingFocusManager>
|
|
277
|
+
</FloatingPortal>
|
|
278
|
+
)}
|
|
279
|
+
</Fragment>
|
|
280
|
+
);
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
export const Dropdown = (props: DropdownProps) => (
|
|
284
|
+
<FloatingTree>
|
|
285
|
+
<DropdownElement {...props} />
|
|
286
|
+
</FloatingTree>
|
|
287
|
+
);
|
|
288
|
+
|
|
289
|
+
export const DropdownDismiss = ({
|
|
290
|
+
children,
|
|
291
|
+
dismiss = true,
|
|
292
|
+
}: ChildProp & { dismiss?: boolean }) => {
|
|
293
|
+
const tree = useFloatingTree();
|
|
294
|
+
|
|
295
|
+
return (
|
|
296
|
+
<div
|
|
297
|
+
role="none"
|
|
298
|
+
className="contents"
|
|
299
|
+
data-dropdown-dismiss={dismiss}
|
|
300
|
+
onMouseUp={() =>
|
|
301
|
+
dismiss && setTimeout(() => tree?.events.emit("close"), 50)
|
|
302
|
+
}
|
|
303
|
+
>
|
|
304
|
+
{children}
|
|
305
|
+
</div>
|
|
306
|
+
);
|
|
307
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* React Fabric
|
|
3
|
+
* @version: 1.0.0
|
|
4
|
+
*
|
|
5
|
+
*
|
|
6
|
+
* The MIT License (MIT)
|
|
7
|
+
* Copyright (c) 2024 Adarsh Pastakia
|
|
8
|
+
*
|
|
9
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
|
10
|
+
* and associated documentation files (the "Software"), to deal in the Software without restriction,
|
|
11
|
+
* including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
12
|
+
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
|
13
|
+
* subject to the following conditions:
|
|
14
|
+
*
|
|
15
|
+
* The above copyright notice and this permission notice shall be included in all copies or substantial
|
|
16
|
+
* portions of the Software.
|
|
17
|
+
*
|
|
18
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
19
|
+
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
20
|
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
21
|
+
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import classNames from "classnames";
|
|
25
|
+
import { type ChildProp, type CssProp } from "../../types";
|
|
26
|
+
import { Icon } from "../icon/Icon";
|
|
27
|
+
import { Dropdown, type DropdownProps } from "./Dropdown";
|
|
28
|
+
|
|
29
|
+
export const DropdownTool = ({
|
|
30
|
+
children,
|
|
31
|
+
className,
|
|
32
|
+
groupHover,
|
|
33
|
+
...props
|
|
34
|
+
}: ChildProp &
|
|
35
|
+
CssProp &
|
|
36
|
+
Omit<DropdownProps, "children"> & {
|
|
37
|
+
/**
|
|
38
|
+
* hide until group hovered
|
|
39
|
+
*/
|
|
40
|
+
groupHover?: boolean;
|
|
41
|
+
}) => {
|
|
42
|
+
return (
|
|
43
|
+
<Dropdown {...props}>
|
|
44
|
+
<Icon
|
|
45
|
+
icon="mdi mdi-menu-down"
|
|
46
|
+
className={classNames(
|
|
47
|
+
className,
|
|
48
|
+
"outline bg-base flex-content pointer-events-auto cursor-pointer",
|
|
49
|
+
groupHover &&
|
|
50
|
+
"hidden group-hover:inline-block data-[dropdown-open]:inline-block",
|
|
51
|
+
)}
|
|
52
|
+
/>
|
|
53
|
+
{children}
|
|
54
|
+
</Dropdown>
|
|
55
|
+
);
|
|
56
|
+
};
|