@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
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
/**
|
|
27
|
+
* Inline loading indicator that renders a top-border shimmer animation.
|
|
28
|
+
*
|
|
29
|
+
* A lightweight loading bar displayed as a thin horizontal line at the top
|
|
30
|
+
* of its container. Useful for page-level or section-level loading states
|
|
31
|
+
* where a full overlay would be too intrusive.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```tsx
|
|
35
|
+
* import { LoadingLine } from "@react-fabric/core";
|
|
36
|
+
*
|
|
37
|
+
* // Page-level loading indicator
|
|
38
|
+
* <div>
|
|
39
|
+
* <LoadingLine />
|
|
40
|
+
* <p>Content loads below...</p>
|
|
41
|
+
* </div>
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export function LoadingLine() {
|
|
45
|
+
// Renders a thin shimmer bar at the top of the container using CSS animations
|
|
46
|
+
return (
|
|
47
|
+
<div className="fabric-loader area-loader relative overflow-x-clip h-0" data-ref="loading">
|
|
48
|
+
<div className="absolute inset-x-0 top-0 z-10 py-px overflow-hidden after:absolute after:block after:inset-0" />
|
|
49
|
+
</div>
|
|
50
|
+
);
|
|
51
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
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 type { CustomColors } from "../../types";
|
|
27
|
+
import { AnimationLoader } from "./Loader";
|
|
28
|
+
|
|
29
|
+
export interface LoadingSpinnerProps {
|
|
30
|
+
/**
|
|
31
|
+
* Spinner color. Accepts palette tokens or any CSS color.
|
|
32
|
+
*/
|
|
33
|
+
color?: CustomColors;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Spinner size. Accepts CSS size values (px, em, rem).
|
|
37
|
+
*/
|
|
38
|
+
size?: number | string;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Blur intensity for the background mask. Defaults to no blur.
|
|
42
|
+
*/
|
|
43
|
+
maskBlur?: "sm" | "md" | "lg";
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Animated loading indicator that renders an "eclipse" spinner.
|
|
48
|
+
*
|
|
49
|
+
* A thin wrapper around `AnimationLoader` that provides a pre-configured
|
|
50
|
+
* circular loading animation. Useful for inline loading indicators in
|
|
51
|
+
* images, charts, and data cards.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```tsx
|
|
55
|
+
* import { LoadingSpinner } from "@react-fabric/core";
|
|
56
|
+
*
|
|
57
|
+
* // Basic spinner
|
|
58
|
+
* <LoadingSpinner />
|
|
59
|
+
*
|
|
60
|
+
* // Custom color and size
|
|
61
|
+
* <LoadingSpinner color="primary-500" size="2rem" />
|
|
62
|
+
*
|
|
63
|
+
* // With backdrop blur
|
|
64
|
+
* <LoadingSpinner maskBlur="sm" />
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export function LoadingSpinner(props: LoadingSpinnerProps) {
|
|
68
|
+
// Delegate to AnimationLoader with a pre-configured eclipse spinner icon
|
|
69
|
+
return <AnimationLoader icon="icon-[svg-spinners--eclipse]" {...props} />;
|
|
70
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
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 type { ColorTints, CssPropWithMap, CustomColors } from "../../types";
|
|
28
|
+
import { getColor } from "../../utils";
|
|
29
|
+
|
|
30
|
+
type SkeletonSlotNames = {
|
|
31
|
+
root?: string;
|
|
32
|
+
iconPlaceholder?: string;
|
|
33
|
+
titlePlaceholder?: string;
|
|
34
|
+
linePlaceholder?: string;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export interface SkeletonProps extends CssPropWithMap<SkeletonSlotNames> {
|
|
38
|
+
/**
|
|
39
|
+
* Background color for all skeleton slots. Accepts palette tokens or any CSS color.
|
|
40
|
+
* Defaults to `"tint-100"`.
|
|
41
|
+
*/
|
|
42
|
+
color?: CustomColors<ColorTints>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Content placeholder that renders a grayed-out card mockup with icon, title, and line slots.
|
|
47
|
+
*
|
|
48
|
+
* Displays a pre-styled skeleton card layout (icon area + title + two rows of text lines)
|
|
49
|
+
* to occupy space while real content loads. Useful for list items, cards, panels, and
|
|
50
|
+
* virtualized lists.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```tsx
|
|
54
|
+
* import { Skeleton } from "@react-fabric/core";
|
|
55
|
+
*
|
|
56
|
+
* // Basic skeleton placeholder
|
|
57
|
+
* <Skeleton />
|
|
58
|
+
*
|
|
59
|
+
* // Custom color
|
|
60
|
+
* <Skeleton color="primary-100" />
|
|
61
|
+
*
|
|
62
|
+
* // Custom slot styling
|
|
63
|
+
* <Skeleton classNames={{ titlePlaceholder: "w-2/3" }} />
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export function Skeleton({ className, classNames, color = "tint-200", ...rest }: SkeletonProps) {
|
|
67
|
+
const bgColor = getColor(color);
|
|
68
|
+
return (
|
|
69
|
+
<div
|
|
70
|
+
className={cn("fabric-skeleton", "p-2 animate-fade flex gap-2 max-w-lg", className, classNames?.root)}
|
|
71
|
+
data-ref="skeleton"
|
|
72
|
+
{...rest}
|
|
73
|
+
>
|
|
74
|
+
<div className={cn("rounded aspect-square h-12", classNames?.iconPlaceholder)} style={{ backgroundColor: bgColor }} />
|
|
75
|
+
<div className="flex-1 flex flex-col gap-2">
|
|
76
|
+
<div className={cn("h-3 rounded-full", classNames?.titlePlaceholder)} style={{ backgroundColor: bgColor }} />
|
|
77
|
+
<div className="flex gap-2">
|
|
78
|
+
<div
|
|
79
|
+
className={cn("h-2 rounded-full basis-[30%]", classNames?.linePlaceholder)}
|
|
80
|
+
style={{ backgroundColor: bgColor }}
|
|
81
|
+
/>
|
|
82
|
+
<div
|
|
83
|
+
className={cn("h-2 rounded-full basis-[60%]", classNames?.linePlaceholder)}
|
|
84
|
+
style={{ backgroundColor: bgColor }}
|
|
85
|
+
/>
|
|
86
|
+
</div>
|
|
87
|
+
<div className="flex gap-2">
|
|
88
|
+
<div
|
|
89
|
+
className={cn("h-2 rounded-full basis-[30%]", classNames?.linePlaceholder)}
|
|
90
|
+
style={{ backgroundColor: bgColor }}
|
|
91
|
+
/>
|
|
92
|
+
<div
|
|
93
|
+
className={cn("h-2 rounded-full basis-[60%]", classNames?.linePlaceholder)}
|
|
94
|
+
style={{ backgroundColor: bgColor }}
|
|
95
|
+
/>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
);
|
|
100
|
+
}
|
|
@@ -1,82 +1,88 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
2
|
* React Fabric
|
|
3
|
-
* @version
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* The MIT License (MIT)
|
|
7
|
-
* Copyright (c) 2024 Adarsh Pastakia
|
|
3
|
+
* @version 1.0.0
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @copyright 2024 Adarsh Pastakia
|
|
8
6
|
*
|
|
9
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
10
|
-
* and associated documentation files (the "Software"), to deal
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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:
|
|
14
13
|
*
|
|
15
|
-
* The above copyright notice and this permission notice shall be included in all
|
|
16
|
-
* portions of the Software.
|
|
14
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
* copies or substantial portions of the Software.
|
|
17
16
|
*
|
|
18
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
19
|
-
* TO THE WARRANTIES OF MERCHANTABILITY,
|
|
20
|
-
*
|
|
21
|
-
*
|
|
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.
|
|
22
24
|
*/
|
|
23
25
|
|
|
24
|
-
import { isSvgPath } from "@react-fabric/utilities";
|
|
26
|
+
import { cn, isSvgPath } from "@react-fabric/utilities";
|
|
25
27
|
import BoringAvatar from "boring-avatars";
|
|
26
|
-
import classNames from "classnames";
|
|
27
28
|
import { useMemo, useState } from "react";
|
|
28
|
-
import {
|
|
29
|
-
|
|
30
|
-
type ColorType,
|
|
31
|
-
type CssProp,
|
|
32
|
-
type RefProp,
|
|
33
|
-
type SizeType,
|
|
34
|
-
type TestProps,
|
|
35
|
-
} from "../../types";
|
|
36
|
-
import { getBgClass, getColor, getColorClass } from "../../utils";
|
|
37
|
-
import classes from "./Avatar.module.css";
|
|
29
|
+
import type { CssProp, CustomColors, HtmlEvents, RefProp, SizeType, TestProps } from "../../types";
|
|
30
|
+
import { getColor } from "../../utils";
|
|
38
31
|
|
|
39
|
-
export interface AvatarProps extends CssProp,
|
|
32
|
+
export interface AvatarProps extends CssProp, TestProps, RefProp, HtmlEvents {
|
|
40
33
|
/**
|
|
41
|
-
*
|
|
34
|
+
* Display name used for generating the fallback avatar (required).
|
|
35
|
+
* When no `avatar` image is provided, this name is used to generate
|
|
36
|
+
* a Boring Avatar pattern or extract text initials as a placeholder.
|
|
42
37
|
*/
|
|
43
38
|
name: string;
|
|
44
39
|
/**
|
|
45
|
-
*
|
|
40
|
+
* SVG path string or CSS class name for a custom fallback icon.
|
|
41
|
+
* Used when no `avatar` image is provided and the variant is not `"text"`.
|
|
46
42
|
*/
|
|
47
43
|
fallbackIcon?: string;
|
|
48
44
|
/**
|
|
49
|
-
* avatar image
|
|
45
|
+
* URL of the avatar image to display.
|
|
46
|
+
* Falls back to a Boring Avatar, text initials, or custom icon when
|
|
47
|
+
* the image fails to load or is not provided.
|
|
50
48
|
*/
|
|
51
49
|
avatar?: string;
|
|
52
50
|
/**
|
|
53
|
-
* avatar
|
|
51
|
+
* Fallback avatar style applied when no `avatar` image is provided.
|
|
52
|
+
* Defaults to `"beam"`. Options: `"text"` (text initials), `"beam"`,
|
|
53
|
+
* `"pixel"`, `"bauhaus"` (Boring Avatar variants).
|
|
54
54
|
*/
|
|
55
55
|
variant?: "text" | "beam" | "pixel" | "bauhaus";
|
|
56
56
|
/**
|
|
57
|
-
*
|
|
57
|
+
* Background color applied to the avatar container.
|
|
58
|
+
* Accepts Tailwind palette tokens or any CSS color.
|
|
58
59
|
*/
|
|
59
|
-
bg?:
|
|
60
|
+
bg?: CustomColors;
|
|
60
61
|
/**
|
|
61
|
-
* icon color
|
|
62
|
+
* Text/icon color applied to the avatar.
|
|
63
|
+
* Accepts Tailwind palette tokens or any CSS color.
|
|
62
64
|
*/
|
|
63
|
-
color?:
|
|
65
|
+
color?: CustomColors;
|
|
64
66
|
/**
|
|
65
|
-
*
|
|
67
|
+
* Avatar size. Accepts predefined tokens `"xs"`–`"xl"` or a custom CSS size value.
|
|
66
68
|
*/
|
|
67
|
-
size?: SizeType | number | string;
|
|
69
|
+
size?: SizeType | number | (string & {});
|
|
68
70
|
/**
|
|
69
|
-
*
|
|
71
|
+
* SVG viewBox attribute for `fallbackIcon` when it is an SVG path.
|
|
72
|
+
* Defaults to `"0 0 24 24"`.
|
|
70
73
|
*/
|
|
71
74
|
viewBox?: string;
|
|
72
75
|
/**
|
|
73
|
-
* rounded
|
|
76
|
+
* When true, applies a fully rounded (circular) shape to the avatar.
|
|
77
|
+
* Otherwise, a standard rounded rectangle is used.
|
|
74
78
|
*/
|
|
75
79
|
rounded?: boolean;
|
|
76
80
|
/**
|
|
77
|
-
* click
|
|
81
|
+
* When true, prevents the default click action on the avatar.
|
|
82
|
+
* Useful when the avatar is nested inside an `<a>` element to avoid
|
|
83
|
+
* navigating away from the page.
|
|
78
84
|
*/
|
|
79
|
-
|
|
85
|
+
preventDefault?: boolean;
|
|
80
86
|
}
|
|
81
87
|
|
|
82
88
|
const SizeMap: KeyValue<string> = {
|
|
@@ -88,9 +94,24 @@ const SizeMap: KeyValue<string> = {
|
|
|
88
94
|
};
|
|
89
95
|
|
|
90
96
|
/**
|
|
91
|
-
*
|
|
97
|
+
* User avatar that renders an image with a Boring Avatar fallback.
|
|
98
|
+
*
|
|
99
|
+
* Displays a user image, falling back to a Boring Avatar (or text initials)
|
|
100
|
+
* when no image is provided or the image fails to load. Supports four
|
|
101
|
+
* Boring Avatar variants (beam, text, pixel, bauhaus) and custom SVG/icon fallbacks.
|
|
102
|
+
*
|
|
103
|
+
* @see {@link https://boringavatars.com/}
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```tsx
|
|
107
|
+
* import { Avatar } from "@react-fabric/core";
|
|
108
|
+
*
|
|
109
|
+
* <Avatar name="Ada Lovelace" avatar="/ada.jpg" />
|
|
110
|
+
* <Avatar name="John Doe" variant="pixel" size="lg" />
|
|
111
|
+
* <Avatar name="Jane" fallbackIcon="icon-[mdi--user]" variant="text" />
|
|
112
|
+
* ```
|
|
92
113
|
*/
|
|
93
|
-
export
|
|
114
|
+
export function Avatar({
|
|
94
115
|
ref,
|
|
95
116
|
name,
|
|
96
117
|
avatar,
|
|
@@ -102,12 +123,13 @@ export const Avatar = ({
|
|
|
102
123
|
variant = "beam",
|
|
103
124
|
className,
|
|
104
125
|
viewBox = "0 0 24 24",
|
|
126
|
+
preventDefault,
|
|
105
127
|
onClick,
|
|
106
|
-
...
|
|
107
|
-
}: AvatarProps)
|
|
128
|
+
...props
|
|
129
|
+
}: AvatarProps) {
|
|
108
130
|
const [fallback, setFallback] = useState(true);
|
|
109
131
|
|
|
110
|
-
|
|
132
|
+
// Compute inline styles from props (memoized to prevent re-renders)
|
|
111
133
|
const styles = useMemo(() => {
|
|
112
134
|
const s: KeyValue = {};
|
|
113
135
|
if (bg) {
|
|
@@ -125,18 +147,13 @@ export const Avatar = ({
|
|
|
125
147
|
return s;
|
|
126
148
|
}, [bg, color, size]);
|
|
127
149
|
|
|
128
|
-
|
|
150
|
+
// Render avatar image with a fade-in placeholder behind it
|
|
129
151
|
const avatarImage = useMemo(() => {
|
|
130
152
|
setFallback(!avatar);
|
|
131
153
|
return (
|
|
132
154
|
avatar && (
|
|
133
155
|
<div className="contents">
|
|
134
|
-
<div
|
|
135
|
-
className={classNames(
|
|
136
|
-
classes.imgPlaceholder,
|
|
137
|
-
"absolute inset-0 bg-gray animate-pulse",
|
|
138
|
-
)}
|
|
139
|
-
/>
|
|
156
|
+
<div className="fabric-imgPlaceholder absolute inset-0 bg-gray animate-fade -z-1" />
|
|
140
157
|
<img
|
|
141
158
|
src={avatar}
|
|
142
159
|
alt={avatar}
|
|
@@ -149,10 +166,11 @@ export const Avatar = ({
|
|
|
149
166
|
);
|
|
150
167
|
}, [avatar]);
|
|
151
168
|
|
|
169
|
+
// Render fallback: custom icon, text initials, or Boring Avatar
|
|
152
170
|
const fallbackAvatar = useMemo(() => {
|
|
153
171
|
if (fallbackIcon) {
|
|
154
172
|
return isSvgPath(fallbackIcon) ? (
|
|
155
|
-
<svg viewBox={viewBox}>
|
|
173
|
+
<svg viewBox={viewBox} className="p-[0.125em]">
|
|
156
174
|
<path fill="currentColor" d={fallbackIcon.toString()} />
|
|
157
175
|
</svg>
|
|
158
176
|
) : (
|
|
@@ -160,8 +178,8 @@ export const Avatar = ({
|
|
|
160
178
|
);
|
|
161
179
|
}
|
|
162
180
|
if (variant === "text") {
|
|
163
|
-
|
|
164
|
-
|
|
181
|
+
// Extract initials: "John Doe" -> "JD", "Jane" -> "JA"
|
|
182
|
+
const [, first, second, group] = name.match(/(?=(\w).* (\w).*)|(?=(\w\w).*)/) as string[];
|
|
165
183
|
return (
|
|
166
184
|
<svg role="img">
|
|
167
185
|
<text
|
|
@@ -177,29 +195,30 @@ export const Avatar = ({
|
|
|
177
195
|
</svg>
|
|
178
196
|
);
|
|
179
197
|
}
|
|
198
|
+
// Default: generate a Boring Avatar from the name
|
|
180
199
|
return <BoringAvatar square size={64} variant={variant} name={name} />;
|
|
181
|
-
}, [
|
|
200
|
+
}, [fallbackIcon, variant, name, viewBox]);
|
|
182
201
|
|
|
183
202
|
return (
|
|
184
203
|
<dfn
|
|
185
204
|
role="presentation"
|
|
186
|
-
className={
|
|
187
|
-
|
|
205
|
+
className={cn(
|
|
206
|
+
"fabric-avatar",
|
|
207
|
+
rounded ? "rounded-full" : "rounded",
|
|
208
|
+
"select-none relative overflow-hidden inline-block box-content leading-none not-italic text-center is-clickable:cursor-pointer",
|
|
188
209
|
className,
|
|
189
|
-
"select-none relative overflow-hidden inline-block box-content leading-none not-italic text-center",
|
|
190
|
-
bg && getBgClass(bg),
|
|
191
|
-
color && getColorClass(color),
|
|
192
|
-
!rounded && "rounded",
|
|
193
|
-
rounded && "rounded-full",
|
|
194
210
|
)}
|
|
195
|
-
onClick={
|
|
211
|
+
onClick={(e) => {
|
|
212
|
+
if (preventDefault) e.preventDefault();
|
|
213
|
+
onClick?.(e);
|
|
214
|
+
}}
|
|
196
215
|
style={styles}
|
|
197
216
|
data-clickable={!!onClick}
|
|
198
217
|
ref={ref}
|
|
199
|
-
{...
|
|
218
|
+
{...props}
|
|
200
219
|
>
|
|
201
220
|
{!fallback && avatarImage}
|
|
202
221
|
{fallback && fallbackAvatar}
|
|
203
222
|
</dfn>
|
|
204
223
|
);
|
|
205
|
-
}
|
|
224
|
+
}
|
|
@@ -1,57 +1,48 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
2
|
* React Fabric
|
|
3
|
-
* @version
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* The MIT License (MIT)
|
|
7
|
-
* Copyright (c) 2024 Adarsh Pastakia
|
|
3
|
+
* @version 1.0.0
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @copyright 2024 Adarsh Pastakia
|
|
8
6
|
*
|
|
9
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
10
|
-
* and associated documentation files (the "Software"), to deal
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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:
|
|
14
13
|
*
|
|
15
|
-
* The above copyright notice and this permission notice shall be included in all
|
|
16
|
-
* portions of the Software.
|
|
14
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
* copies or substantial portions of the Software.
|
|
17
16
|
*
|
|
18
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
19
|
-
* TO THE WARRANTIES OF MERCHANTABILITY,
|
|
20
|
-
*
|
|
21
|
-
*
|
|
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.
|
|
22
24
|
*/
|
|
23
25
|
|
|
24
|
-
import
|
|
25
|
-
import { Children, useMemo
|
|
26
|
+
import { cn } from "@react-fabric/utilities";
|
|
27
|
+
import { Children, useMemo } from "react";
|
|
26
28
|
import { useMemoDebugger } from "../../hooks/useEffectDebugger";
|
|
27
|
-
import {
|
|
28
|
-
|
|
29
|
-
type CssProp,
|
|
30
|
-
type RefProp,
|
|
31
|
-
type SizeType,
|
|
32
|
-
} from "../../types";
|
|
33
|
-
import { type AvatarProps } from "./Avatar";
|
|
34
|
-
import classes from "./Avatar.module.css";
|
|
29
|
+
import type { ChildrenProp, CssProp, RefProp, SizeType } from "../../types";
|
|
30
|
+
import type { AvatarProps } from "./Avatar";
|
|
35
31
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
| false
|
|
39
|
-
| undefined;
|
|
40
|
-
|
|
41
|
-
export interface AvatarGroupProps extends CssProp, RefProp, AriaProps {
|
|
42
|
-
children: AvatarChild | AvatarChild[];
|
|
32
|
+
export interface AvatarGroupProps
|
|
33
|
+
extends CssProp, RefProp<HTMLDivElement>, ChildrenProp<Omit<AvatarProps, "size" | "rounded">> {
|
|
43
34
|
/**
|
|
44
|
-
* rounded
|
|
35
|
+
* Whether to apply a fully rounded shape to all avatars and the group container.
|
|
45
36
|
*/
|
|
46
37
|
rounded?: boolean;
|
|
47
38
|
/**
|
|
48
|
-
*
|
|
39
|
+
* Avatar size. Accepts `"xs"`–`"xl"` tokens or a custom CSS size value.
|
|
49
40
|
*/
|
|
50
|
-
size?: SizeType | number | string;
|
|
41
|
+
size?: SizeType | number | (string & {});
|
|
51
42
|
/**
|
|
52
|
-
*
|
|
43
|
+
* Maximum number of avatars to display before showing a "+N" overflow badge.
|
|
53
44
|
*/
|
|
54
|
-
|
|
45
|
+
max?: number;
|
|
55
46
|
}
|
|
56
47
|
|
|
57
48
|
const SizeMap: KeyValue<string> = {
|
|
@@ -63,18 +54,27 @@ const SizeMap: KeyValue<string> = {
|
|
|
63
54
|
};
|
|
64
55
|
|
|
65
56
|
/**
|
|
66
|
-
*
|
|
57
|
+
* Horizontal group of avatars with an overflow count badge.
|
|
58
|
+
*
|
|
59
|
+
* Renders its avatar children in a flex row, truncating to `max` visible
|
|
60
|
+
* avatars and appending a "+N" badge for the remainder. Each avatar is
|
|
61
|
+
* sized according to the `size` prop.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```tsx
|
|
65
|
+
* import { Avatar, AvatarGroup } from "@react-fabric/core";
|
|
66
|
+
*
|
|
67
|
+
* <AvatarGroup max={3} size="md">
|
|
68
|
+
* <Avatar name="John Doe" avatar="/john.jpg" />
|
|
69
|
+
* <Avatar name="Jane Smith" avatar="/jane.jpg" />
|
|
70
|
+
* <Avatar name="Alice Johnson" avatar="/alice.jpg" />
|
|
71
|
+
* <Avatar name="Bob Brown" avatar="/bob.jpg" />
|
|
72
|
+
* </AvatarGroup>
|
|
73
|
+
* // Renders 3 avatars + a "+1" badge
|
|
74
|
+
* ```
|
|
67
75
|
*/
|
|
68
|
-
export
|
|
69
|
-
|
|
70
|
-
children,
|
|
71
|
-
className,
|
|
72
|
-
totalCount,
|
|
73
|
-
rounded,
|
|
74
|
-
size,
|
|
75
|
-
...aria
|
|
76
|
-
}: AvatarGroupProps) => {
|
|
77
|
-
/** ***************** style map *******************/
|
|
76
|
+
export function AvatarGroup({ ref, children, className, max, rounded, size, ...props }: AvatarGroupProps) {
|
|
77
|
+
// Compute inline styles from size prop (memoized to prevent re-renders)
|
|
78
78
|
const styles = useMemoDebugger(
|
|
79
79
|
() => {
|
|
80
80
|
const s: KeyValue = {};
|
|
@@ -90,35 +90,26 @@ export const AvatarGroup = ({
|
|
|
90
90
|
"Icon styles",
|
|
91
91
|
);
|
|
92
92
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
)
|
|
97
|
-
const diff = useMemo(
|
|
98
|
-
() =>
|
|
99
|
-
totalCount && totalCount > avatars.length && totalCount - avatars.length,
|
|
100
|
-
[avatars, totalCount],
|
|
101
|
-
);
|
|
93
|
+
// Normalize children to an array, filtering out falsy values
|
|
94
|
+
// eslint-disable-next-line @eslint-react/no-children-to-array
|
|
95
|
+
const avatars = useMemo(() => Children.toArray(children).filter(Boolean), [children]);
|
|
96
|
+
// Calculate how many avatars exceed the max (0 if none)
|
|
97
|
+
const diff = useMemo(() => max && avatars.length > max && avatars.length - max, [avatars, max]);
|
|
102
98
|
return (
|
|
103
99
|
<div
|
|
104
|
-
{...
|
|
105
|
-
ref={ref
|
|
106
|
-
className={
|
|
107
|
-
classes.avatarGroup,
|
|
108
|
-
className,
|
|
109
|
-
"inline-flex flex-nowrap",
|
|
110
|
-
!rounded && "rounded",
|
|
111
|
-
rounded && "rounded-full",
|
|
112
|
-
)}
|
|
100
|
+
{...props}
|
|
101
|
+
ref={ref}
|
|
102
|
+
className={cn("fabric-avatarGroup", "inline-flex flex-nowrap", className, rounded ? "rounded-full" : "rounded")}
|
|
113
103
|
style={styles}
|
|
114
104
|
>
|
|
115
|
-
{avatars}
|
|
105
|
+
{avatars.slice(0, max)}
|
|
116
106
|
{!!diff && (
|
|
117
107
|
<dfn
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
"
|
|
121
|
-
|
|
108
|
+
data-ref="avatarCount"
|
|
109
|
+
className={cn(
|
|
110
|
+
"fabric-avatar",
|
|
111
|
+
"fabric-avatarGroup--extra",
|
|
112
|
+
"select-none relative overflow-hidden inline-block box-content bg-muted leading-none not-italic text-center",
|
|
122
113
|
)}
|
|
123
114
|
>
|
|
124
115
|
<svg>
|
|
@@ -137,4 +128,4 @@ export const AvatarGroup = ({
|
|
|
137
128
|
)}
|
|
138
129
|
</div>
|
|
139
130
|
);
|
|
140
|
-
}
|
|
131
|
+
}
|