@react-fabric/core 1.0.0-beta.9 → 1.0.2
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/css/components/_animations.css +52 -0
- package/css/components/_avatar.css +89 -0
- package/css/components/_button.css +218 -0
- package/css/components/_buttonGroup.css +62 -0
- package/css/components/_callout.css +32 -0
- package/css/components/_card.css +167 -0
- package/css/components/_chip.css +125 -0
- package/css/components/_collapsable.css +32 -0
- package/{src/overlays/message/Message.module.css → css/components/_divider.css} +11 -10
- package/{src/components/dropdown/Dropdown.module.css → css/components/_dropdown.css} +3 -2
- package/{src/overlays/flyout/Flyout.module.css → css/components/_flyout.css} +15 -9
- package/css/components/_media.css +102 -0
- package/{src/components/menu/Menu.module.css → css/components/_menu.css} +21 -20
- package/{src/components/meter/Meter.module.css → css/components/_meter.css} +15 -20
- package/{src/overlays/modal/Modal.module.css → css/components/_modal.css} +9 -9
- package/{src/components/panel/Panel.module.css → css/components/_panel.css} +19 -19
- package/{src/components/progress/Progress.module.css → css/components/_progress.css} +7 -10
- package/css/components/_sonner.css +431 -0
- package/{src/components/tabpanel/TabPanel.module.css → css/components/_tabPanel.css} +125 -85
- package/css/components/_titlebar.css +48 -0
- package/css/components/index.css +47 -0
- package/css/core/_aside.css +176 -0
- package/css/core/_content.css +31 -0
- package/css/core/_errorboundary.css +55 -0
- package/css/core/_responsive.css +45 -0
- package/css/core/_typography.css +69 -0
- package/css/core/_viewport.css +33 -0
- package/{src/hooks/useClientService.tsx → css/core/index.css} +7 -7
- package/css/reset/_gradients.css +36 -33
- package/css/reset/_reset.css +206 -300
- package/css/reset/_text.css +31 -61
- package/css/reset/_theme.css +467 -81
- package/css/reset/index.css +23 -21
- package/css/styles.css +30 -23
- package/css/theme/_colors.css +445 -0
- package/css/theme/_utilities.css +528 -0
- package/css/theme/_variants.css +128 -0
- package/css/theme/index.css +55 -0
- package/dist/cjs/components/actionLabel/ActionLabel.js +25 -12
- package/dist/cjs/{overlays → components}/alert/Alert.js +76 -53
- package/dist/cjs/components/animations/Indicator.js +66 -0
- package/dist/cjs/components/animations/Loader.js +77 -0
- package/dist/cjs/components/animations/LoadingBars.js +37 -0
- package/dist/cjs/components/animations/LoadingLine.js +59 -0
- package/dist/cjs/components/animations/LoadingSpinner.js +37 -0
- package/dist/cjs/components/animations/Skeleton.js +88 -0
- package/dist/cjs/components/avatar/Avatar.js +41 -20
- package/dist/cjs/components/avatar/AvatarGroup.js +37 -16
- package/dist/cjs/components/badge/Badge.js +90 -68
- package/dist/cjs/components/button/Button.js +198 -136
- package/dist/cjs/components/button/ButtonGroup.js +86 -21
- package/dist/cjs/components/button/ConfirmButton.js +55 -41
- package/dist/cjs/components/button/ToggleButtonGroup.js +84 -32
- package/dist/cjs/components/callout/Callout.js +56 -25
- package/dist/cjs/components/card/Card.js +90 -42
- package/dist/cjs/components/card/CardCover.js +38 -27
- package/dist/cjs/components/card/FlipContent.js +47 -0
- package/dist/cjs/components/chip/Chip.js +80 -37
- package/dist/cjs/components/collapsable/Collapsable.js +62 -31
- package/dist/cjs/components/divider/Divider.js +58 -24
- package/dist/cjs/components/dropdown/Dropdown.js +92 -45
- package/dist/cjs/components/dropdown/DropdownTool.js +6 -7
- package/dist/cjs/components/effect/GlassEffect.js +259 -0
- package/dist/cjs/components/effect/MatteEffect.js +127 -0
- package/dist/cjs/components/effect/StyleEffect.js +43 -0
- package/dist/cjs/components/empty/EmptyContent.js +37 -49
- package/dist/cjs/components/flyout/Flyout.js +170 -0
- package/dist/cjs/components/hotkey/HotKey.js +42 -0
- package/dist/cjs/components/icon/Icon.js +81 -80
- package/dist/cjs/components/media/Media.js +154 -77
- package/dist/cjs/components/menu/ContextMenu.js +45 -20
- package/dist/cjs/components/menu/Menu.js +98 -38
- package/dist/cjs/components/menu/MenuItem.js +102 -74
- package/dist/cjs/components/meter/Meter.js +35 -12
- package/dist/cjs/components/modal/Modal.js +152 -0
- package/dist/cjs/components/navigator/Navigator.js +81 -36
- package/dist/cjs/components/panel/Panel.js +115 -60
- package/dist/cjs/components/panel/PanelGroup.js +42 -16
- package/dist/cjs/components/panel/PanelStack.js +47 -16
- package/dist/cjs/components/pillbox/Pillbox.js +118 -0
- package/dist/cjs/components/progress/ProgressBar.js +30 -14
- package/dist/cjs/components/progress/ProgressCircle.js +27 -11
- package/dist/cjs/components/tabpanel/Tab.js +53 -37
- package/dist/cjs/components/tabpanel/TabPanel.js +74 -28
- package/dist/cjs/components/titlebar/Titlebar.js +52 -0
- package/dist/cjs/components/tooltip/Tooltip.js +180 -0
- package/dist/cjs/context/Global.js +159 -80
- package/dist/cjs/context/ModalManager.js +60 -0
- package/dist/cjs/context/context.js +43 -0
- package/dist/cjs/core/areaToggle/AreaToggle.js +41 -0
- package/dist/cjs/core/aside/Aside.js +178 -83
- package/dist/cjs/core/boundary/ErrorBoundary.js +37 -34
- package/dist/cjs/core/boundary/ErrorIcon.js +32 -19
- package/dist/cjs/core/content/Content.js +26 -37
- package/dist/cjs/core/headfoot/HeadFoot.js +133 -35
- package/dist/cjs/core/layout/Layout.js +28 -0
- package/dist/cjs/core/responsive/Responsive.js +62 -26
- package/dist/cjs/core/theme/ThemeProvider.js +35 -41
- package/dist/cjs/core/viewport/Viewport.js +26 -22
- package/dist/cjs/hooks/useClientService.js +39 -18
- package/dist/cjs/hooks/useContextMenu.js +103 -0
- package/dist/cjs/hooks/useControlledValue.js +13 -7
- package/dist/cjs/hooks/useDebounce.js +37 -21
- package/dist/cjs/hooks/useEffectDebugger.js +79 -60
- package/dist/cjs/hooks/useIsDark.js +34 -26
- package/dist/cjs/hooks/useIsRtl.js +13 -3
- package/dist/cjs/hooks/useNavigator.js +12 -9
- package/dist/cjs/hooks/useNotificationService.js +199 -0
- package/dist/cjs/hooks/useOverlayService.js +82 -41
- package/dist/cjs/hooks/usePropState.js +41 -0
- package/dist/cjs/hooks/usePropToggle.js +32 -26
- package/dist/cjs/hooks/useResize.js +47 -38
- package/dist/cjs/hooks/useResizeObserver.js +26 -7
- package/dist/cjs/hooks/useStorage.js +29 -16
- package/dist/cjs/i18n/index.js +25 -23
- package/dist/cjs/index.js +142 -94
- package/dist/cjs/typography/Abbr.js +43 -20
- package/dist/cjs/typography/Anchor.js +39 -0
- package/dist/cjs/typography/Copy.js +28 -28
- package/dist/cjs/typography/Kbd.js +43 -0
- package/dist/cjs/typography/Mark.js +34 -17
- package/dist/cjs/typography/Text.js +36 -54
- package/dist/cjs/typography/Title.js +17 -40
- package/dist/cjs/utils/calculateDimensions.js +38 -23
- package/dist/cjs/utils/cloneElement.js +64 -0
- package/dist/cjs/{core/section/Section.js → utils/getBadgeProps.js} +25 -21
- package/dist/cjs/utils/getColor.js +42 -36
- package/dist/cjs/utils/getIconProps.js +63 -0
- package/dist/cjs/utils/getTooltipProps.js +66 -0
- package/dist/cjs/utils/nodeCheck.js +4 -4
- package/dist/esm/components/actionLabel/ActionLabel.js +25 -12
- package/dist/esm/{overlays → components}/alert/Alert.js +73 -50
- package/dist/esm/components/animations/Indicator.js +66 -0
- package/dist/esm/components/animations/Loader.js +77 -0
- package/dist/esm/components/animations/LoadingBars.js +37 -0
- package/dist/esm/components/animations/LoadingLine.js +59 -0
- package/dist/esm/components/animations/LoadingSpinner.js +37 -0
- package/dist/esm/components/animations/Skeleton.js +88 -0
- package/dist/esm/components/avatar/Avatar.js +42 -21
- package/dist/esm/components/avatar/AvatarGroup.js +37 -16
- package/dist/esm/components/badge/Badge.js +93 -70
- package/dist/esm/components/button/Button.js +199 -137
- package/dist/esm/components/button/ButtonGroup.js +87 -22
- package/dist/esm/components/button/ConfirmButton.js +58 -44
- package/dist/esm/components/button/ToggleButtonGroup.js +86 -34
- package/dist/esm/components/callout/Callout.js +56 -25
- package/dist/esm/components/card/Card.js +92 -44
- package/dist/esm/components/card/CardCover.js +38 -27
- package/dist/esm/components/card/FlipContent.js +47 -0
- package/dist/esm/components/chip/Chip.js +81 -38
- package/dist/esm/components/collapsable/Collapsable.js +63 -32
- package/dist/esm/components/divider/Divider.js +59 -25
- package/dist/esm/components/dropdown/Dropdown.js +95 -48
- package/dist/esm/components/dropdown/DropdownTool.js +6 -7
- package/dist/esm/components/effect/GlassEffect.js +259 -0
- package/dist/esm/components/effect/MatteEffect.js +127 -0
- package/dist/esm/components/effect/StyleEffect.js +43 -0
- package/dist/esm/components/empty/EmptyContent.js +38 -50
- package/dist/esm/components/flyout/Flyout.js +170 -0
- package/dist/esm/components/hotkey/HotKey.js +42 -0
- package/dist/esm/components/icon/Icon.js +83 -82
- package/dist/esm/components/media/Media.js +156 -79
- package/dist/esm/components/menu/ContextMenu.js +46 -21
- package/dist/esm/components/menu/Menu.js +101 -41
- package/dist/esm/components/menu/MenuItem.js +98 -70
- package/dist/esm/components/meter/Meter.js +36 -13
- package/dist/esm/components/modal/Modal.js +152 -0
- package/dist/esm/components/navigator/Navigator.js +81 -36
- package/dist/esm/components/panel/Panel.js +117 -62
- package/dist/esm/components/panel/PanelGroup.js +43 -17
- package/dist/esm/components/panel/PanelStack.js +48 -17
- package/dist/esm/components/pillbox/Pillbox.js +118 -0
- package/dist/esm/components/progress/ProgressBar.js +31 -15
- package/dist/esm/components/progress/ProgressCircle.js +28 -12
- package/dist/esm/components/tabpanel/Tab.js +54 -38
- package/dist/esm/components/tabpanel/TabPanel.js +75 -29
- package/dist/esm/components/titlebar/Titlebar.js +52 -0
- package/dist/esm/components/tooltip/Tooltip.js +180 -0
- package/dist/esm/context/Global.js +161 -78
- package/dist/esm/context/ModalManager.js +60 -0
- package/dist/esm/context/context.js +40 -0
- package/dist/esm/core/areaToggle/AreaToggle.js +41 -0
- package/dist/esm/core/aside/Aside.js +179 -84
- package/dist/esm/core/boundary/ErrorBoundary.js +38 -35
- package/dist/esm/core/boundary/ErrorIcon.js +32 -19
- package/dist/esm/core/content/Content.js +26 -37
- package/dist/esm/core/headfoot/HeadFoot.js +134 -36
- package/dist/esm/core/layout/Layout.js +28 -0
- package/dist/esm/core/responsive/Responsive.js +62 -26
- package/dist/esm/core/theme/ThemeProvider.js +36 -42
- package/dist/esm/core/viewport/Viewport.js +26 -22
- package/dist/esm/hooks/useClientService.js +39 -18
- package/dist/esm/hooks/useContextMenu.js +103 -0
- package/dist/esm/hooks/useControlledValue.js +14 -8
- package/dist/esm/hooks/useDebounce.js +37 -21
- package/dist/esm/hooks/useEffectDebugger.js +81 -62
- package/dist/esm/hooks/useIsDark.js +34 -26
- package/dist/esm/hooks/useIsRtl.js +13 -3
- package/dist/esm/hooks/useNavigator.js +13 -10
- package/dist/esm/hooks/useNotificationService.js +199 -0
- package/dist/esm/hooks/useOverlayService.js +83 -42
- package/dist/esm/hooks/usePropState.js +40 -0
- package/dist/esm/hooks/usePropToggle.js +33 -27
- package/dist/esm/hooks/useResize.js +48 -39
- package/dist/esm/hooks/useResizeObserver.js +27 -8
- package/dist/esm/hooks/useStorage.js +30 -17
- package/dist/esm/i18n/index.js +23 -21
- package/dist/esm/index.js +87 -44
- package/dist/esm/typography/Abbr.js +45 -22
- package/dist/esm/typography/Anchor.js +39 -0
- package/dist/esm/typography/Copy.js +28 -28
- package/dist/esm/typography/Kbd.js +43 -0
- package/dist/esm/typography/Mark.js +35 -18
- package/dist/esm/typography/Text.js +39 -57
- package/dist/esm/typography/Title.js +17 -40
- package/dist/esm/utils/calculateDimensions.js +38 -23
- package/dist/esm/utils/cloneElement.js +64 -0
- package/dist/esm/{core/section/Section.js → utils/getBadgeProps.js} +25 -21
- package/dist/esm/utils/getColor.js +43 -34
- package/dist/esm/utils/getIconProps.js +63 -0
- package/dist/esm/utils/getTooltipProps.js +66 -0
- package/dist/esm/utils/nodeCheck.js +4 -4
- package/dist/types/components/actionLabel/ActionLabel.d.ts +20 -7
- package/dist/types/components/alert/Alert.d.ts +74 -0
- package/dist/types/components/animations/Indicator.d.ts +57 -0
- package/dist/types/components/animations/Loader.d.ts +65 -0
- package/dist/types/components/animations/LoadingBars.d.ts +61 -0
- package/dist/types/components/animations/LoadingLine.d.ts +43 -0
- package/dist/types/components/animations/LoadingSpinner.d.ts +61 -0
- package/dist/types/components/animations/Skeleton.d.ts +61 -0
- package/dist/types/components/avatar/Avatar.d.ts +70 -19
- package/dist/types/components/avatar/AvatarGroup.d.ts +51 -14
- package/dist/types/components/badge/Badge.d.ts +64 -14
- package/dist/types/components/button/Button.d.ts +72 -55
- package/dist/types/components/button/ButtonGroup.d.ts +86 -24
- package/dist/types/components/button/ConfirmButton.d.ts +21 -7
- package/dist/types/components/button/ToggleButtonGroup.d.ts +88 -44
- package/dist/types/components/callout/Callout.d.ts +58 -7
- package/dist/types/components/card/Card.d.ts +66 -25
- package/dist/types/components/card/CardCover.d.ts +52 -7
- package/dist/types/components/card/FlipContent.d.ts +50 -0
- package/dist/types/components/chip/Chip.d.ts +72 -20
- package/dist/types/components/collapsable/Collapsable.d.ts +55 -15
- package/dist/types/components/divider/Divider.d.ts +25 -8
- package/dist/types/components/dropdown/Dropdown.d.ts +42 -9
- package/dist/types/components/dropdown/DropdownTool.d.ts +22 -4
- package/dist/types/components/effect/GlassEffect.d.ts +5 -0
- package/dist/types/components/effect/MatteEffect.d.ts +40 -0
- package/dist/types/components/effect/StyleEffect.d.ts +27 -0
- package/dist/types/components/empty/EmptyContent.d.ts +53 -9
- package/dist/types/components/flyout/Flyout.d.ts +60 -0
- package/dist/types/components/hotkey/HotKey.d.ts +41 -0
- package/dist/types/components/icon/Icon.d.ts +74 -24
- package/dist/types/components/media/Media.d.ts +72 -4
- package/dist/types/components/menu/ContextMenu.d.ts +22 -5
- package/dist/types/components/menu/Menu.d.ts +26 -2
- package/dist/types/components/menu/MenuItem.d.ts +19 -4
- package/dist/types/components/menu/types.d.ts +23 -14
- package/dist/types/components/meter/Meter.d.ts +23 -3
- package/dist/types/components/modal/Modal.d.ts +52 -0
- package/dist/types/components/navigator/Navigator.d.ts +30 -4
- package/dist/types/components/panel/Panel.d.ts +43 -23
- package/dist/types/components/panel/PanelGroup.d.ts +22 -3
- package/dist/types/components/panel/PanelStack.d.ts +28 -2
- package/dist/types/components/pillbox/Pillbox.d.ts +95 -0
- package/dist/types/components/progress/ProgressBar.d.ts +19 -4
- package/dist/types/components/progress/ProgressCircle.d.ts +18 -4
- package/dist/types/components/tabpanel/Tab.d.ts +42 -10
- package/dist/types/components/tabpanel/TabPanel.d.ts +47 -7
- package/dist/types/components/titlebar/Titlebar.d.ts +54 -0
- package/dist/types/components/tooltip/Tooltip.d.ts +76 -0
- package/dist/types/context/Global.d.ts +39 -69
- package/dist/types/context/ModalManager.d.ts +30 -0
- package/dist/types/context/context.d.ts +107 -0
- package/dist/types/core/areaToggle/AreaToggle.d.ts +33 -0
- package/dist/types/core/aside/Aside.d.ts +75 -20
- package/dist/types/core/boundary/ErrorBoundary.d.ts +43 -4
- package/dist/types/core/boundary/ErrorIcon.d.ts +38 -1
- package/dist/types/core/content/Content.d.ts +38 -6
- package/dist/types/core/headfoot/HeadFoot.d.ts +48 -14
- package/dist/types/core/layout/Layout.d.ts +38 -0
- package/dist/types/core/responsive/Responsive.d.ts +45 -15
- package/dist/types/core/theme/ThemeProvider.d.ts +35 -11
- package/dist/types/core/viewport/Viewport.d.ts +27 -3
- package/dist/types/hooks/useClientService.d.ts +43 -1
- package/dist/types/hooks/useContextMenu.d.ts +10 -0
- package/dist/types/hooks/useControlledValue.d.ts +28 -4
- package/dist/types/hooks/useDebounce.d.ts +38 -2
- package/dist/types/hooks/useEffectDebugger.d.ts +73 -4
- package/dist/types/hooks/useIsDark.d.ts +6 -0
- package/dist/types/hooks/useIsRtl.d.ts +35 -1
- package/dist/types/hooks/useNavigator.d.ts +37 -2
- package/dist/types/hooks/useNotificationService.d.ts +60 -0
- package/dist/types/hooks/useOverlayService.d.ts +28 -8
- package/dist/types/hooks/usePropState.d.ts +26 -0
- package/dist/types/hooks/usePropToggle.d.ts +41 -7
- package/dist/types/hooks/useResize.d.ts +46 -4
- package/dist/types/hooks/useResizeObserver.d.ts +45 -3
- package/dist/types/hooks/useStorage.d.ts +32 -2
- package/dist/types/i18n/index.d.ts +27 -3
- package/dist/types/index.d.ts +106 -18
- package/dist/types/types/colors.d.ts +29 -0
- package/dist/types/types/index.d.ts +216 -76
- package/dist/types/typography/Abbr.d.ts +51 -6
- package/dist/types/typography/Anchor.d.ts +41 -0
- package/dist/types/typography/Copy.d.ts +36 -2
- package/dist/types/typography/Kbd.d.ts +40 -0
- package/dist/types/typography/Mark.d.ts +44 -7
- package/dist/types/typography/Text.d.ts +40 -24
- package/dist/types/typography/Title.d.ts +37 -26
- package/dist/types/typography/types.d.ts +32 -0
- package/dist/types/utils/calculateDimensions.d.ts +50 -6
- package/dist/types/utils/cloneElement.d.ts +41 -0
- package/dist/types/utils/getBadgeProps.d.ts +16 -0
- package/dist/types/utils/getColor.d.ts +43 -4
- package/dist/types/utils/getIconProps.d.ts +45 -0
- package/dist/types/utils/getTooltipProps.d.ts +47 -0
- package/dist/types/utils/index.d.ts +28 -0
- package/dist/types/utils/nodeCheck.d.ts +1 -2
- package/package.json +30 -21
- package/src/components/actionLabel/ActionLabel.tsx +28 -39
- package/src/components/alert/Alert.tsx +261 -0
- package/src/components/animations/Indicator.tsx +75 -0
- package/src/components/animations/Loader.tsx +89 -0
- package/src/components/animations/LoadingBars.tsx +70 -0
- package/src/components/animations/LoadingLine.tsx +51 -0
- package/src/components/animations/LoadingSpinner.tsx +70 -0
- package/src/components/animations/Skeleton.tsx +100 -0
- package/src/components/avatar/Avatar.tsx +89 -70
- package/src/components/avatar/AvatarGroup.tsx +65 -74
- package/src/components/badge/Badge.tsx +141 -108
- package/src/components/button/Button.tsx +223 -238
- package/src/components/button/ButtonGroup.tsx +117 -77
- package/src/components/button/ConfirmButton.tsx +60 -90
- package/src/components/button/ToggleButtonGroup.tsx +134 -120
- package/src/components/callout/Callout.tsx +81 -59
- package/src/components/card/Card.tsx +131 -113
- package/src/components/card/CardCover.tsx +61 -61
- package/src/components/card/FlipContent.tsx +78 -0
- package/src/components/chip/Chip.tsx +139 -99
- package/src/components/collapsable/Collapsable.tsx +79 -77
- package/src/components/divider/Divider.tsx +74 -53
- package/src/components/dropdown/Dropdown.tsx +109 -106
- package/src/components/dropdown/DropdownTool.tsx +29 -12
- package/src/components/effect/GlassEffect.tsx +221 -0
- package/src/components/effect/MatteEffect.tsx +99 -0
- package/src/components/effect/StyleEffect.tsx +36 -0
- package/src/components/empty/EmptyContent.tsx +60 -99
- package/src/components/flyout/Flyout.tsx +257 -0
- package/src/components/hotkey/HotKey.tsx +57 -0
- package/src/components/icon/Icon.tsx +131 -130
- package/src/components/media/Media.tsx +184 -154
- package/src/components/menu/ContextMenu.tsx +56 -39
- package/src/components/menu/Menu.tsx +121 -84
- package/src/components/menu/MenuItem.tsx +87 -69
- package/src/components/menu/types.ts +23 -28
- package/src/components/meter/Meter.tsx +34 -17
- package/src/components/modal/Modal.tsx +226 -0
- package/src/components/navigator/Navigator.tsx +93 -38
- package/src/components/panel/Panel.tsx +123 -131
- package/src/components/panel/PanelGroup.tsx +49 -43
- package/src/components/panel/PanelStack.tsx +63 -62
- package/src/components/pillbox/Pillbox.tsx +208 -0
- package/src/components/progress/ProgressBar.tsx +33 -33
- package/src/components/progress/ProgressCircle.tsx +29 -37
- package/src/components/tabpanel/Tab.tsx +84 -73
- package/src/components/tabpanel/TabPanel.tsx +102 -51
- package/src/components/titlebar/Titlebar.tsx +115 -0
- package/src/components/tooltip/Tooltip.tsx +255 -0
- package/src/context/Global.tsx +148 -148
- package/src/context/ModalManager.tsx +68 -0
- package/src/context/context.ts +111 -0
- package/src/core/areaToggle/AreaToggle.tsx +45 -0
- package/src/core/aside/Aside.tsx +200 -155
- package/src/core/boundary/ErrorBoundary.tsx +50 -68
- package/src/core/boundary/ErrorIcon.tsx +34 -32
- package/src/core/content/Content.tsx +41 -50
- package/src/core/headfoot/HeadFoot.tsx +162 -81
- package/src/core/layout/Layout.tsx +54 -0
- package/src/core/responsive/Responsive.tsx +91 -98
- package/src/core/theme/ThemeProvider.tsx +45 -56
- package/src/core/viewport/Viewport.tsx +25 -27
- package/src/hooks/useClientService.ts +47 -0
- package/src/hooks/useContextMenu.tsx +131 -0
- package/src/hooks/useControlledValue.ts +47 -0
- package/src/hooks/useDebounce.ts +41 -24
- package/src/hooks/useEffectDebugger.ts +105 -94
- package/src/hooks/useIsDark.ts +10 -24
- package/src/hooks/useIsRtl.ts +32 -20
- package/src/hooks/useNavigator.tsx +41 -26
- package/src/hooks/useNotificationService.tsx +239 -0
- package/src/hooks/useOverlayService.tsx +67 -20
- package/src/hooks/usePropState.ts +52 -0
- package/src/hooks/usePropToggle.ts +54 -47
- package/src/hooks/useResize.ts +69 -45
- package/src/hooks/useResizeObserver.ts +59 -34
- package/src/hooks/useStorage.ts +40 -48
- package/src/i18n/index.ts +24 -25
- package/src/index.ts +115 -44
- package/src/types/colors.ts +49 -0
- package/src/types/global.d.ts +40 -17
- package/src/types/index.ts +243 -155
- package/src/typography/Abbr.tsx +62 -59
- package/src/typography/Anchor.tsx +63 -0
- package/src/typography/Copy.tsx +39 -29
- package/src/typography/Kbd.tsx +50 -0
- package/src/typography/Mark.tsx +56 -51
- package/src/typography/Text.tsx +57 -128
- package/src/typography/Title.tsx +36 -108
- package/src/typography/types.ts +27 -17
- package/src/utils/calculateDimensions.ts +50 -40
- package/src/utils/cloneElement.ts +61 -0
- package/src/{core/content/Content.module.css → utils/getBadgeProps.ts} +20 -15
- package/src/utils/getColor.ts +42 -36
- package/src/utils/getIconProps.ts +58 -0
- package/src/utils/getTooltipProps.ts +59 -0
- package/src/utils/index.ts +23 -17
- package/src/utils/nodeCheck.ts +4 -8
- package/css/flags.rect.css +0 -1607
- package/css/flags.wavy.css +0 -1606
- 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.js +0 -142
- 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.js +0 -71
- 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/context/NotificationCenter.js +0 -254
- 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.js +0 -66
- 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/hotkeys/HotKey.js +0 -47
- package/dist/cjs/hotkeys/HotKeyLabel.js +0 -52
- package/dist/cjs/hotkeys/HotKeyWrapper.js +0 -98
- package/dist/cjs/hotkeys/commons.js +0 -56
- package/dist/cjs/overlays/alert/Alert.module.css +0 -1
- package/dist/cjs/overlays/flyout/Flyout.js +0 -152
- package/dist/cjs/overlays/flyout/Flyout.module.css +0 -1
- package/dist/cjs/overlays/message/Message.js +0 -84
- package/dist/cjs/overlays/message/Message.module.css +0 -1
- package/dist/cjs/overlays/modal/Modal.js +0 -132
- package/dist/cjs/overlays/modal/Modal.module.css +0 -1
- package/dist/cjs/overlays/toast/Toast.js +0 -166
- package/dist/cjs/overlays/toast/Toast.module.css +0 -1
- package/dist/cjs/overlays/tooltip/Tooltip.js +0 -133
- package/dist/cjs/overlays/tooltip/Tooltip.module.css +0 -1
- package/dist/cjs/types/icons.js +0 -200
- package/dist/cjs/typography/Link.js +0 -55
- package/dist/cjs/typography/Typography.module.css +0 -1
- package/dist/cjs/typography/types.js +0 -42
- package/dist/esm/components/actionLabel/ActionLabel.module.css +0 -1
- package/dist/esm/components/animations/Animations.js +0 -138
- 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.js +0 -71
- 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/context/NotificationCenter.js +0 -254
- 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.js +0 -66
- 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/hotkeys/HotKey.js +0 -47
- package/dist/esm/hotkeys/HotKeyLabel.js +0 -52
- package/dist/esm/hotkeys/HotKeyWrapper.js +0 -96
- package/dist/esm/hotkeys/commons.js +0 -56
- package/dist/esm/overlays/alert/Alert.module.css +0 -1
- package/dist/esm/overlays/flyout/Flyout.js +0 -152
- package/dist/esm/overlays/flyout/Flyout.module.css +0 -1
- package/dist/esm/overlays/message/Message.js +0 -84
- package/dist/esm/overlays/message/Message.module.css +0 -1
- package/dist/esm/overlays/modal/Modal.js +0 -132
- package/dist/esm/overlays/modal/Modal.module.css +0 -1
- package/dist/esm/overlays/toast/Toast.js +0 -166
- package/dist/esm/overlays/toast/Toast.module.css +0 -1
- package/dist/esm/overlays/tooltip/Tooltip.js +0 -132
- package/dist/esm/overlays/tooltip/Tooltip.module.css +0 -1
- package/dist/esm/types/icons.js +0 -202
- package/dist/esm/typography/Link.js +0 -55
- package/dist/esm/typography/Typography.module.css +0 -1
- package/dist/esm/typography/types.js +0 -41
- package/dist/types/components/animations/Animations.d.ts +0 -23
- package/dist/types/components/breadcrumbs/Breadcrumbs.d.ts +0 -17
- package/dist/types/components/index.d.ts +0 -33
- package/dist/types/context/NotificationCenter.d.ts +0 -11
- package/dist/types/core/index.d.ts +0 -9
- package/dist/types/core/page/Page.d.ts +0 -23
- package/dist/types/core/section/Section.d.ts +0 -7
- package/dist/types/hotkeys/HotKey.d.ts +0 -2
- package/dist/types/hotkeys/HotKeyLabel.d.ts +0 -2
- package/dist/types/hotkeys/HotKeyWrapper.d.ts +0 -11
- package/dist/types/hotkeys/commons.d.ts +0 -28
- package/dist/types/overlays/alert/Alert.d.ts +0 -41
- package/dist/types/overlays/flyout/Flyout.d.ts +0 -57
- package/dist/types/overlays/index.d.ts +0 -6
- package/dist/types/overlays/message/Message.d.ts +0 -21
- package/dist/types/overlays/modal/Modal.d.ts +0 -53
- package/dist/types/overlays/toast/Toast.d.ts +0 -33
- package/dist/types/overlays/tooltip/Tooltip.d.ts +0 -18
- package/dist/types/types/icons.d.ts +0 -197
- package/dist/types/typography/Link.d.ts +0 -25
- package/dist/types/typography/index.d.ts +0 -6
- package/src/components/animations/Animations.module.css +0 -253
- package/src/components/animations/Animations.tsx +0 -196
- package/src/components/avatar/Avatar.module.css +0 -90
- package/src/components/badge/Badge.module.css +0 -165
- package/src/components/breadcrumbs/Breadcrumbs.module.css +0 -189
- package/src/components/breadcrumbs/Breadcrumbs.tsx +0 -109
- package/src/components/button/Button.module.css +0 -375
- package/src/components/card/Card.module.css +0 -152
- package/src/components/chip/Chip.module.css +0 -118
- package/src/components/collapsable/Collapsable.module.css +0 -30
- package/src/components/icon/Icon.module.css +0 -71
- package/src/components/index.ts +0 -62
- package/src/components/media/Media.module.css +0 -112
- package/src/context/NotificationCenter.tsx +0 -223
- package/src/core/aside/Aside.module.css +0 -231
- package/src/core/boundary/ErrorBoundary.module.css +0 -65
- package/src/core/headfoot/HeadFoot.module.css +0 -38
- package/src/core/index.ts +0 -32
- package/src/core/page/Page.module.css +0 -46
- package/src/core/page/Page.tsx +0 -101
- package/src/core/responsive/Responsive.module.css +0 -85
- package/src/core/section/Section.module.css +0 -28
- package/src/core/section/Section.tsx +0 -54
- package/src/core/theme/Theme.module.css +0 -30
- package/src/core/viewport/Viewport.module.css +0 -32
- package/src/hooks/useControlledValue.tsx +0 -43
- package/src/hotkeys/HotKey.tsx +0 -39
- package/src/hotkeys/HotKeyLabel.tsx +0 -61
- package/src/hotkeys/HotKeyWrapper.tsx +0 -137
- package/src/hotkeys/commons.ts +0 -74
- package/src/overlays/alert/Alert.tsx +0 -252
- package/src/overlays/flyout/Flyout.tsx +0 -283
- package/src/overlays/index.ts +0 -29
- package/src/overlays/message/Message.tsx +0 -107
- package/src/overlays/modal/Modal.tsx +0 -244
- package/src/overlays/toast/Toast.module.css +0 -37
- package/src/overlays/toast/Toast.tsx +0 -216
- package/src/overlays/tooltip/Tooltip.module.css +0 -53
- package/src/overlays/tooltip/Tooltip.tsx +0 -200
- package/src/types/icons.ts +0 -426
- package/src/typography/Link.tsx +0 -113
- package/src/typography/Typography.module.css +0 -68
- package/src/typography/index.ts +0 -29
- /package/dist/cjs/i18n/{ar.json.js → ar/core.json.js} +0 -0
- /package/dist/cjs/i18n/{en.json.js → en/core.json.js} +0 -0
- /package/dist/esm/i18n/{ar.json.js → ar/core.json.js} +0 -0
- /package/dist/esm/i18n/{en.json.js → en/core.json.js} +0 -0
- /package/src/i18n/{ar.json → ar/core.json} +0 -0
- /package/src/i18n/{en.json → en/core.json} +0 -0
|
@@ -21,21 +21,15 @@
|
|
|
21
21
|
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
-
import
|
|
25
|
-
import {
|
|
26
|
-
|
|
27
|
-
cloneElement,
|
|
28
|
-
useCallback,
|
|
29
|
-
useEffect,
|
|
30
|
-
useMemo,
|
|
31
|
-
useState,
|
|
32
|
-
} from "react";
|
|
33
|
-
import { type CallbackReturn, type ChildrenProp } from "../../types";
|
|
24
|
+
import { cn, getValue } from "@react-fabric/utilities";
|
|
25
|
+
import { Children, cloneElement, useEffect, useMemo, useState } from "react";
|
|
26
|
+
import type { CallbackReturn, ChildrenProp, CssPropWithMap } from "../../types";
|
|
34
27
|
import { nodeCheck } from "../../utils";
|
|
28
|
+
import type { TabProps } from "./Tab";
|
|
35
29
|
import { Tab } from "./Tab";
|
|
36
|
-
import classes from "./TabPanel.module.css";
|
|
37
30
|
|
|
38
|
-
export interface TabPanelProps
|
|
31
|
+
export interface TabPanelProps
|
|
32
|
+
extends ChildrenProp<TabProps>, CssPropWithMap<{ root: string; header: string; active: string }> {
|
|
39
33
|
/**
|
|
40
34
|
* tab list orientation
|
|
41
35
|
*/
|
|
@@ -47,11 +41,15 @@ export interface TabPanelProps extends ChildrenProp<typeof Tab> {
|
|
|
47
41
|
/**
|
|
48
42
|
* tab variations
|
|
49
43
|
*/
|
|
50
|
-
variant?: "soft" | "solid" | "outline";
|
|
44
|
+
variant?: "soft" | "solid" | "outline" | "pills";
|
|
51
45
|
/**
|
|
52
46
|
* tab button flex to fill tabs
|
|
53
47
|
*/
|
|
54
48
|
tabFlex?: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* rotate tab sideways for start/end orientation
|
|
51
|
+
*/
|
|
52
|
+
tabRotate?: boolean;
|
|
55
53
|
/**
|
|
56
54
|
* tab button gap
|
|
57
55
|
*/
|
|
@@ -61,9 +59,13 @@ export interface TabPanelProps extends ChildrenProp<typeof Tab> {
|
|
|
61
59
|
*/
|
|
62
60
|
activeTab?: string;
|
|
63
61
|
/**
|
|
64
|
-
*
|
|
62
|
+
* append element
|
|
63
|
+
*/
|
|
64
|
+
append?: React.ReactNode;
|
|
65
|
+
/**
|
|
66
|
+
* prepend element
|
|
65
67
|
*/
|
|
66
|
-
|
|
68
|
+
prepend?: React.ReactNode;
|
|
67
69
|
/**
|
|
68
70
|
* change handler
|
|
69
71
|
*/
|
|
@@ -76,24 +78,64 @@ export interface TabPanelProps extends ChildrenProp<typeof Tab> {
|
|
|
76
78
|
|
|
77
79
|
// TODO: implement append/prepend tab-bar items
|
|
78
80
|
|
|
79
|
-
|
|
81
|
+
function getFirstTab(tabs: React.ReactElement<TabProps>[]) {
|
|
82
|
+
return tabs.find((tab) => !tab.props.disabled)?.props.id || null;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* A component that provides a tabbed interface for displaying content.
|
|
87
|
+
* It allows users to switch between different tabs, each containing its own content.
|
|
88
|
+
* It supports various orientations, justify options, and variants for the tab header.
|
|
89
|
+
* It also provides hooks for handling tab changes before and after they occur.
|
|
90
|
+
* This component is useful for organizing content into separate sections that can be easily navigated by the user.
|
|
91
|
+
* It can be customized with different styles and behaviors to fit the needs of the application.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```jsx
|
|
95
|
+
* <TabPanel
|
|
96
|
+
* orientation="top"
|
|
97
|
+
* activeTab="tab1"
|
|
98
|
+
* justify="start"
|
|
99
|
+
* variant="solid"
|
|
100
|
+
* tabFlex={true}
|
|
101
|
+
* onBeforeChange={(nextTab, currentTab) => {
|
|
102
|
+
* console.log(`Switching from ${currentTab} to ${nextTab}`);
|
|
103
|
+
* return true; // or false to prevent change
|
|
104
|
+
* }}
|
|
105
|
+
* onChange={(id) => console.log(`Active tab changed to: ${id}`)}
|
|
106
|
+
* >
|
|
107
|
+
* <Tab id="tab1" label="Tab 1">Content for Tab 1</Tab>
|
|
108
|
+
* <Tab id="tab2" label="Tab 2">Content for Tab 2</Tab>
|
|
109
|
+
* <Tab id="tab3" label="Tab 3">Content for Tab 3</Tab>
|
|
110
|
+
* </TabPanel>
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
export function TabPanel({
|
|
80
114
|
children,
|
|
81
|
-
|
|
115
|
+
className,
|
|
116
|
+
classNames,
|
|
82
117
|
orientation = "top",
|
|
83
118
|
activeTab,
|
|
84
119
|
justify,
|
|
85
120
|
variant,
|
|
86
121
|
tabFlex,
|
|
122
|
+
append,
|
|
123
|
+
prepend,
|
|
124
|
+
tabRotate,
|
|
87
125
|
gap,
|
|
88
126
|
onBeforeChange,
|
|
89
127
|
onChange,
|
|
90
|
-
}: TabPanelProps)
|
|
128
|
+
}: TabPanelProps) {
|
|
91
129
|
const [active, setActive] = useState<string>();
|
|
92
130
|
|
|
93
131
|
const [tabs, rest] = useMemo(() => {
|
|
94
|
-
|
|
132
|
+
// eslint-disable-next-line @eslint-react/no-children-to-array
|
|
133
|
+
return Children.toArray(children as Array<React.ReactNode>).reduce<
|
|
134
|
+
[p: React.ReactElement<TabProps & { active: boolean }>[], o: React.ReactNode[]]
|
|
135
|
+
>(
|
|
95
136
|
(ret, node) => {
|
|
96
|
-
nodeCheck(node, Tab)
|
|
137
|
+
if (nodeCheck(node, Tab)) ret[0].push(node as React.ReactElement<TabProps & { active: boolean }>);
|
|
138
|
+
else ret[1].push(node);
|
|
97
139
|
return ret;
|
|
98
140
|
},
|
|
99
141
|
[[], []],
|
|
@@ -101,55 +143,64 @@ export const TabPanel = ({
|
|
|
101
143
|
}, [children]);
|
|
102
144
|
|
|
103
145
|
useEffect(() => {
|
|
104
|
-
|
|
146
|
+
// eslint-disable-next-line @eslint-react/set-state-in-effect
|
|
147
|
+
setActive(getValue<string>(`${activeTab ?? getFirstTab(tabs)}`));
|
|
148
|
+
// eslint-disable-next-line @eslint-react/exhaustive-deps
|
|
105
149
|
}, [activeTab]);
|
|
106
150
|
|
|
107
151
|
const activeTabPanel = useMemo(() => {
|
|
108
|
-
return tabs.find((tab
|
|
109
|
-
.children;
|
|
152
|
+
return tabs.find((tab) => tab.props.id === active)?.props.children;
|
|
110
153
|
}, [tabs, active]);
|
|
111
154
|
|
|
112
|
-
const handleClick =
|
|
113
|
-
(id
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
},
|
|
121
|
-
[onBeforeChange, onChange, active],
|
|
122
|
-
);
|
|
155
|
+
const handleClick = (id: string) => {
|
|
156
|
+
void Promise.resolve(onBeforeChange?.(id, active)).then((ret) => {
|
|
157
|
+
if (ret !== false) {
|
|
158
|
+
setActive(id);
|
|
159
|
+
onChange?.(id);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
};
|
|
123
163
|
|
|
124
164
|
return (
|
|
125
165
|
<div
|
|
126
|
-
className={classNames
|
|
127
|
-
classes.tabPanel,
|
|
128
|
-
"area-content grid bg-base overflow-hidden",
|
|
129
|
-
)}
|
|
166
|
+
className={cn("fabric-tabPanel", className, classNames?.root, "area-content grid bg-default overflow-hidden")}
|
|
130
167
|
data-orientation={orientation}
|
|
131
168
|
data-variant={variant ?? "default"}
|
|
132
169
|
>
|
|
133
170
|
<div
|
|
134
|
-
className={
|
|
135
|
-
|
|
136
|
-
|
|
171
|
+
className={cn(
|
|
172
|
+
"fabric-tabHeader",
|
|
173
|
+
classNames?.header,
|
|
174
|
+
tabRotate && "tab-rotate",
|
|
137
175
|
justify && `justify-${justify}`,
|
|
138
176
|
["start", "end"].includes(orientation) && "flex-col",
|
|
139
|
-
"flex flex-nowrap overflow-
|
|
177
|
+
"flex flex-nowrap overflow-hidden items-center",
|
|
140
178
|
)}
|
|
141
|
-
style={{ gap }}
|
|
142
179
|
>
|
|
143
|
-
{
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
180
|
+
{prepend}
|
|
181
|
+
<div
|
|
182
|
+
className={cn(
|
|
183
|
+
"fabric-tabList",
|
|
184
|
+
justify && `justify-${justify}`,
|
|
185
|
+
["start", "end"].includes(orientation) && "flex-col",
|
|
186
|
+
["bottom", "end"].includes(orientation) ? "self-start" : "self-end",
|
|
187
|
+
"flex flex-1 flex-nowrap overflow-auto scroll-thin",
|
|
188
|
+
)}
|
|
189
|
+
style={{ gap }}
|
|
190
|
+
>
|
|
191
|
+
{tabs.map((node) =>
|
|
192
|
+
cloneElement(node, {
|
|
193
|
+
tabFlex: node.props.tabFlex ?? tabFlex,
|
|
194
|
+
classNames: Object.assign({ active: classNames?.active }, node.props.classNames),
|
|
195
|
+
onClick: handleClick,
|
|
196
|
+
active: node.props.id === active,
|
|
197
|
+
}),
|
|
198
|
+
)}
|
|
199
|
+
</div>
|
|
200
|
+
{append}
|
|
150
201
|
</div>
|
|
151
202
|
{rest}
|
|
152
203
|
{activeTabPanel}
|
|
153
204
|
</div>
|
|
154
205
|
);
|
|
155
|
-
}
|
|
206
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React Fabric
|
|
3
|
+
* @version 1.0.0
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @copyright 2024 Adarsh Pastakia
|
|
6
|
+
*
|
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
* furnished to do so, subject to the following conditions:
|
|
13
|
+
*
|
|
14
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
* copies or substantial portions of the Software.
|
|
16
|
+
*
|
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
* SOFTWARE.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { cn } from "@react-fabric/utilities";
|
|
27
|
+
import { Fragment, isValidElement } from "react";
|
|
28
|
+
import type { CssPropWithMap } from "../../types";
|
|
29
|
+
import { getIconProps } from "../../utils";
|
|
30
|
+
import { StyleEffect } from "../effect/StyleEffect";
|
|
31
|
+
import type { IconProps } from "../icon/Icon";
|
|
32
|
+
import { Icon } from "../icon/Icon";
|
|
33
|
+
|
|
34
|
+
export interface TitlebarProps {
|
|
35
|
+
title?: string | React.ReactNode;
|
|
36
|
+
/**
|
|
37
|
+
* icon path or props
|
|
38
|
+
*/
|
|
39
|
+
icon?: IconProps;
|
|
40
|
+
/**
|
|
41
|
+
* header append actions
|
|
42
|
+
*/
|
|
43
|
+
actions?: React.ReactElement | false | null;
|
|
44
|
+
/**
|
|
45
|
+
* header prepend actions
|
|
46
|
+
*/
|
|
47
|
+
prepend?: React.ReactElement | false | null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Header bar with optional icon, title, and action elements.
|
|
52
|
+
* Renders as a semantic <header> element.
|
|
53
|
+
*/
|
|
54
|
+
export function Titlebar({
|
|
55
|
+
title,
|
|
56
|
+
className,
|
|
57
|
+
classNames,
|
|
58
|
+
icon,
|
|
59
|
+
actions,
|
|
60
|
+
prepend,
|
|
61
|
+
onClick,
|
|
62
|
+
}: TitlebarProps & { onClick?: () => void } & CssPropWithMap<{
|
|
63
|
+
root?: string;
|
|
64
|
+
title?: string;
|
|
65
|
+
icon?: string;
|
|
66
|
+
actions?: string;
|
|
67
|
+
prepend?: string;
|
|
68
|
+
}>) {
|
|
69
|
+
return (
|
|
70
|
+
<div
|
|
71
|
+
className={cn(
|
|
72
|
+
"fabric-titlebar",
|
|
73
|
+
"empty:hidden not-empty:border-b border-soft",
|
|
74
|
+
className,
|
|
75
|
+
classNames?.root,
|
|
76
|
+
"grid items-center rounded-t-[inherit] px-2 py-1 relative",
|
|
77
|
+
)}
|
|
78
|
+
data-ref="titlebar"
|
|
79
|
+
>
|
|
80
|
+
<StyleEffect showBorder={false} />
|
|
81
|
+
{isValidElement(title) ? (
|
|
82
|
+
title
|
|
83
|
+
) : (
|
|
84
|
+
<Fragment>
|
|
85
|
+
{prepend && (
|
|
86
|
+
<div data-ref="titlebar-actions" className={cn("fabric-titlebarActions", classNames?.prepend)}>
|
|
87
|
+
{prepend}
|
|
88
|
+
</div>
|
|
89
|
+
)}
|
|
90
|
+
{icon && (
|
|
91
|
+
<Icon
|
|
92
|
+
className={cn("fabric-titlebarIcon", classNames?.icon, "p-1 text-lg select-none pointer-events-none")}
|
|
93
|
+
{...getIconProps(icon)}
|
|
94
|
+
/>
|
|
95
|
+
)}
|
|
96
|
+
{title && (
|
|
97
|
+
<div
|
|
98
|
+
role="none"
|
|
99
|
+
data-ref="titlebar-title"
|
|
100
|
+
onClick={onClick}
|
|
101
|
+
className={cn("fabric-titlebarTitle", classNames?.title, "truncate py-0.5 px-1 select-none")}
|
|
102
|
+
>
|
|
103
|
+
{title}
|
|
104
|
+
</div>
|
|
105
|
+
)}
|
|
106
|
+
{actions && (
|
|
107
|
+
<div data-ref="titlebar-actions" className={cn("fabric-titlebarActions flex gap-px", classNames?.actions)}>
|
|
108
|
+
{actions}
|
|
109
|
+
</div>
|
|
110
|
+
)}
|
|
111
|
+
</Fragment>
|
|
112
|
+
)}
|
|
113
|
+
</div>
|
|
114
|
+
);
|
|
115
|
+
}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React Fabric
|
|
3
|
+
* @version 1.0.0
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @copyright 2024 Adarsh Pastakia
|
|
6
|
+
*
|
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
* furnished to do so, subject to the following conditions:
|
|
13
|
+
*
|
|
14
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
* copies or substantial portions of the Software.
|
|
16
|
+
*
|
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
* SOFTWARE.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import {
|
|
27
|
+
FloatingArrow,
|
|
28
|
+
FloatingPortal,
|
|
29
|
+
arrow,
|
|
30
|
+
autoUpdate,
|
|
31
|
+
flip,
|
|
32
|
+
offset,
|
|
33
|
+
safePolygon,
|
|
34
|
+
shift,
|
|
35
|
+
useFloating,
|
|
36
|
+
useHover,
|
|
37
|
+
useInteractions,
|
|
38
|
+
type Placement,
|
|
39
|
+
} from "@floating-ui/react";
|
|
40
|
+
import { cn, isString, mergeRefs } from "@react-fabric/utilities";
|
|
41
|
+
import { Fragment, cloneElement, isValidElement, useEffect, useMemo, useRef } from "react";
|
|
42
|
+
import { Icon } from "../../components/icon/Icon";
|
|
43
|
+
import { useIsRtl } from "../../hooks/useIsRtl";
|
|
44
|
+
import { usePropState } from "../../hooks/usePropState";
|
|
45
|
+
import type { ColorBase, CustomColors } from "../../types/colors";
|
|
46
|
+
|
|
47
|
+
export interface TooltipType {
|
|
48
|
+
/**
|
|
49
|
+
* tooltip content
|
|
50
|
+
*/
|
|
51
|
+
content?: string | React.ReactElement;
|
|
52
|
+
/**
|
|
53
|
+
* tooltip color
|
|
54
|
+
*/
|
|
55
|
+
color?: CustomColors<ColorBase>;
|
|
56
|
+
/**
|
|
57
|
+
* tooltip placement
|
|
58
|
+
*/
|
|
59
|
+
placement?: Placement;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface TooltipProps extends TooltipType {
|
|
63
|
+
/**
|
|
64
|
+
* force open
|
|
65
|
+
*/
|
|
66
|
+
open?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* show copy action, pass string as copy content
|
|
69
|
+
*/
|
|
70
|
+
copyContent?: boolean | string;
|
|
71
|
+
/**
|
|
72
|
+
* disable tooltip
|
|
73
|
+
*/
|
|
74
|
+
disabled?: boolean;
|
|
75
|
+
|
|
76
|
+
children: React.ReactElement<KeyValue>;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const COLOR_MAP: Record<string, string> = {
|
|
80
|
+
default: "bg-dimmed text-dimmed outline-default",
|
|
81
|
+
primary: "bg-primary-50 text-primary-700 outline-primary-100",
|
|
82
|
+
secondary: "bg-secondary-50 text-secondary-700 outline-secondary-100",
|
|
83
|
+
info: "bg-info-50 text-info-700 outline-info-100",
|
|
84
|
+
danger: "bg-danger-50 text-danger-700 outline-danger-100",
|
|
85
|
+
success: "bg-success-50 text-success-700 outline-success-100",
|
|
86
|
+
warning: "bg-warning-50 text-warning-700 outline-warning-100",
|
|
87
|
+
scarlet: "bg-scarlet-50 text-scarlet-700 outline-scarlet-100",
|
|
88
|
+
pumpkin: "bg-pumpkin-50 text-pumpkin-700 outline-pumpkin-100",
|
|
89
|
+
marigold: "bg-marigold-50 text-marigold-700 outline-marigold-100",
|
|
90
|
+
avacado: "bg-avacado-50 text-avacado-700 outline-avacado-100",
|
|
91
|
+
jade: "bg-jade-50 text-jade-700 outline-jade-100",
|
|
92
|
+
denim: "bg-denim-50 text-denim-700 outline-denim-100",
|
|
93
|
+
iris: "bg-iris-50 text-iris-700 outline-iris-100",
|
|
94
|
+
lilac: "bg-lilac-50 text-lilac-700 outline-lilac-100",
|
|
95
|
+
coral: "bg-coral-50 text-coral-700 outline-coral-100",
|
|
96
|
+
wood: "bg-wood-50 text-wood-700 outline-wood-100",
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const ARROW_COLOR_MAP: Record<string, string> = {
|
|
100
|
+
default: "fill-dimmed stroke-default",
|
|
101
|
+
primary: "fill-primary-50 stroke-primary-100",
|
|
102
|
+
secondary: "fill-secondary-50 stroke-secondary-100",
|
|
103
|
+
info: "fill-info-50 stroke-info-100",
|
|
104
|
+
danger: "fill-danger-50 stroke-danger-100",
|
|
105
|
+
success: "fill-success-50 stroke-success-100",
|
|
106
|
+
warning: "fill-warning-50 stroke-warning-100",
|
|
107
|
+
scarlet: "fill-scarlet-50 stroke-scarlet-100",
|
|
108
|
+
pumpkin: "fill-pumpkin-50 stroke-pumpkin-100",
|
|
109
|
+
marigold: "fill-marigold-50 stroke-marigold-100",
|
|
110
|
+
avacado: "fill-avacado-50 stroke-avacado-100",
|
|
111
|
+
jade: "fill-jade-50 stroke-jade-100",
|
|
112
|
+
denim: "fill-denim-50 stroke-denim-100",
|
|
113
|
+
iris: "fill-iris-50 stroke-iris-100",
|
|
114
|
+
lilac: "fill-lilac-50 stroke-lilac-100",
|
|
115
|
+
coral: "fill-coral-50 stroke-coral-100",
|
|
116
|
+
wood: "fill-wood-50 stroke-wood-100",
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Floating tooltip that displays content on hover.
|
|
121
|
+
*
|
|
122
|
+
* Renders a tooltip using Floating UI with an arrow, positioned relative
|
|
123
|
+
* to its child element. Supports color theming, copy-to-clipboard action,
|
|
124
|
+
* and RTL-aware placement flipping.
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* ```tsx
|
|
128
|
+
* import { Tooltip } from "@react-fabric/core";
|
|
129
|
+
*
|
|
130
|
+
* <Tooltip content="Hello world">
|
|
131
|
+
* <button>Hover me</button>
|
|
132
|
+
* </Tooltip>
|
|
133
|
+
*
|
|
134
|
+
* <Tooltip content="Copy me" copyContent="Copy me">
|
|
135
|
+
* <span>Copy this</span>
|
|
136
|
+
* </Tooltip>
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
139
|
+
export function Tooltip({
|
|
140
|
+
children,
|
|
141
|
+
color,
|
|
142
|
+
content,
|
|
143
|
+
open,
|
|
144
|
+
copyContent,
|
|
145
|
+
disabled,
|
|
146
|
+
placement: _placement,
|
|
147
|
+
...rest
|
|
148
|
+
}: TooltipProps) {
|
|
149
|
+
const arrowRef = useRef(null);
|
|
150
|
+
const isRtl = useIsRtl();
|
|
151
|
+
const [isOpen, setIsOpen] = usePropState(open);
|
|
152
|
+
|
|
153
|
+
const placement = useMemo<Placement>(() => {
|
|
154
|
+
if (isRtl)
|
|
155
|
+
return (
|
|
156
|
+
_placement?.includes("left") ? _placement.replace("left", "right") : (_placement?.replace("right", "left") ?? "top")
|
|
157
|
+
) as Placement;
|
|
158
|
+
|
|
159
|
+
return _placement ?? "top";
|
|
160
|
+
}, [_placement, isRtl]);
|
|
161
|
+
|
|
162
|
+
const { refs, floatingStyles, context } = useFloating({
|
|
163
|
+
open: isOpen,
|
|
164
|
+
strategy: "fixed",
|
|
165
|
+
onOpenChange: !!open || disabled ? undefined : setIsOpen,
|
|
166
|
+
whileElementsMounted: autoUpdate,
|
|
167
|
+
placement,
|
|
168
|
+
middleware: [
|
|
169
|
+
shift({ padding: 8 }),
|
|
170
|
+
flip(),
|
|
171
|
+
offset(9),
|
|
172
|
+
arrow({
|
|
173
|
+
element: arrowRef,
|
|
174
|
+
}),
|
|
175
|
+
],
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
const hover = useHover(context, {
|
|
179
|
+
restMs: 500,
|
|
180
|
+
delay: { open: 1000 },
|
|
181
|
+
handleClose: copyContent ? safePolygon({ buffer: 1 }) : undefined,
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
const { getReferenceProps, getFloatingProps } = useInteractions([open ? undefined : hover]);
|
|
185
|
+
|
|
186
|
+
useEffect(() => {
|
|
187
|
+
context.update();
|
|
188
|
+
// eslint-disable-next-line @eslint-react/exhaustive-deps
|
|
189
|
+
}, [content]);
|
|
190
|
+
|
|
191
|
+
const innerRef = useMemo(
|
|
192
|
+
() => mergeRefs(children.props.ref, (el: HTMLElement) => refs.setReference(el)),
|
|
193
|
+
[children.props.ref, refs],
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
const copyEl = useMemo(() => {
|
|
197
|
+
if (copyContent) {
|
|
198
|
+
const copyText: string = isString(copyContent) ? copyContent : isString(content) ? content : "";
|
|
199
|
+
const handler = (e: React.MouseEvent) => {
|
|
200
|
+
setIsOpen(false);
|
|
201
|
+
e.stopPropagation();
|
|
202
|
+
void navigator.clipboard.writeText(copyText);
|
|
203
|
+
};
|
|
204
|
+
return (
|
|
205
|
+
<span
|
|
206
|
+
role="none"
|
|
207
|
+
className="ms-2 cursor-pointer text-dimmed flex-content opacity-75 hover:opacity-90 active:opacity-60"
|
|
208
|
+
onClick={handler}
|
|
209
|
+
>
|
|
210
|
+
<Icon icon="icon-[mdi--content-copy]" />
|
|
211
|
+
</span>
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
return null;
|
|
215
|
+
// eslint-disable-next-line @eslint-react/exhaustive-deps
|
|
216
|
+
}, [copyContent, content]);
|
|
217
|
+
|
|
218
|
+
return (
|
|
219
|
+
<Fragment>
|
|
220
|
+
{cloneElement(children, {
|
|
221
|
+
ref: innerRef,
|
|
222
|
+
...(open ? {} : getReferenceProps(rest)),
|
|
223
|
+
})}
|
|
224
|
+
{isOpen && content && (
|
|
225
|
+
<FloatingPortal root={refs.domReference.current?.closest<HTMLElement>(".theme-base") ?? undefined}>
|
|
226
|
+
<dfn
|
|
227
|
+
data-ref="tooltip"
|
|
228
|
+
className={cn(
|
|
229
|
+
"fabric-tooltip z-(--z-tooltip)",
|
|
230
|
+
"select-none text-sm not-italic flex py-1 px-2 max-w-lg! rounded shadow-sm outline",
|
|
231
|
+
COLOR_MAP[color as string] ?? COLOR_MAP.default,
|
|
232
|
+
)}
|
|
233
|
+
ref={(el) => refs.setFloating(el)}
|
|
234
|
+
style={{
|
|
235
|
+
...floatingStyles,
|
|
236
|
+
}}
|
|
237
|
+
{...getFloatingProps()}
|
|
238
|
+
>
|
|
239
|
+
{isValidElement(content) && content}
|
|
240
|
+
{isString(content) && (
|
|
241
|
+
<span className={cn("font-medium flex-1 break-all whitespace-pre-wrap mixed-lang")}>{content}</span>
|
|
242
|
+
)}
|
|
243
|
+
{copyEl}
|
|
244
|
+
<FloatingArrow
|
|
245
|
+
ref={arrowRef}
|
|
246
|
+
context={context}
|
|
247
|
+
strokeWidth={0.5}
|
|
248
|
+
className={cn(ARROW_COLOR_MAP[color as string] ?? ARROW_COLOR_MAP.default)}
|
|
249
|
+
/>
|
|
250
|
+
</dfn>
|
|
251
|
+
</FloatingPortal>
|
|
252
|
+
)}
|
|
253
|
+
</Fragment>
|
|
254
|
+
);
|
|
255
|
+
}
|