@shipfox/react-ui 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.storybook/preview.tsx +1 -1
- package/.turbo/turbo-build.log +2 -2
- package/.turbo/turbo-check.log +3 -3
- package/.turbo/turbo-type.log +1 -1
- package/CHANGELOG.md +17 -0
- package/dist/components/alert/alert.d.ts +18 -0
- package/dist/components/alert/alert.d.ts.map +1 -0
- package/dist/components/alert/alert.js +123 -0
- package/dist/components/alert/alert.js.map +1 -0
- package/dist/components/alert/alert.stories.js +112 -0
- package/dist/components/alert/alert.stories.js.map +1 -0
- package/dist/components/alert/index.d.ts +2 -0
- package/dist/components/alert/index.d.ts.map +1 -0
- package/dist/components/alert/index.js +3 -0
- package/dist/components/alert/index.js.map +1 -0
- package/dist/components/avatar/avatar-group.d.ts +18 -0
- package/dist/components/avatar/avatar-group.d.ts.map +1 -0
- package/dist/components/avatar/avatar-group.js +132 -0
- package/dist/components/avatar/avatar-group.js.map +1 -0
- package/dist/components/avatar/avatar.d.ts +24 -0
- package/dist/components/avatar/avatar.d.ts.map +1 -0
- package/dist/components/avatar/avatar.js +165 -0
- package/dist/components/avatar/avatar.js.map +1 -0
- package/dist/components/avatar/avatar.stories.js +267 -0
- package/dist/components/avatar/avatar.stories.js.map +1 -0
- package/dist/components/avatar/index.d.ts +3 -0
- package/dist/components/avatar/index.d.ts.map +1 -0
- package/dist/components/avatar/index.js +4 -0
- package/dist/components/avatar/index.js.map +1 -0
- package/dist/components/badge/badge.d.ts +48 -0
- package/dist/components/badge/badge.d.ts.map +1 -0
- package/dist/components/badge/badge.js +72 -0
- package/dist/components/badge/badge.js.map +1 -0
- package/dist/components/badge/badge.stories.js +802 -0
- package/dist/components/badge/badge.stories.js.map +1 -0
- package/dist/components/badge/icon-badge.d.ts +9 -0
- package/dist/components/badge/icon-badge.d.ts.map +1 -0
- package/dist/components/badge/icon-badge.js +32 -0
- package/dist/components/badge/icon-badge.js.map +1 -0
- package/dist/components/badge/index.d.ts +5 -0
- package/dist/components/badge/index.d.ts.map +1 -0
- package/dist/components/badge/index.js +6 -0
- package/dist/components/badge/index.js.map +1 -0
- package/dist/components/badge/status-badge.d.ts +9 -0
- package/dist/components/badge/status-badge.d.ts.map +1 -0
- package/dist/components/badge/status-badge.js +29 -0
- package/dist/components/badge/status-badge.js.map +1 -0
- package/dist/components/badge/user-badge.d.ts +8 -0
- package/dist/components/badge/user-badge.d.ts.map +1 -0
- package/dist/components/badge/user-badge.js +24 -0
- package/dist/components/badge/user-badge.js.map +1 -0
- package/dist/components/{button.d.ts → button/button.d.ts} +1 -1
- package/dist/components/button/button.d.ts.map +1 -0
- package/dist/components/{button.js → button/button.js} +2 -2
- package/dist/components/button/button.js.map +1 -0
- package/dist/components/{button.stories.js → button/button.stories.js} +1 -1
- package/dist/components/button/button.stories.js.map +1 -0
- package/dist/components/button/index.d.ts +2 -0
- package/dist/components/button/index.d.ts.map +1 -0
- package/dist/components/button/index.js +3 -0
- package/dist/components/button/index.js.map +1 -0
- package/dist/components/checkbox/checkbox-label.d.ts +14 -0
- package/dist/components/checkbox/checkbox-label.d.ts.map +1 -0
- package/dist/components/checkbox/checkbox-label.js +82 -0
- package/dist/components/checkbox/checkbox-label.js.map +1 -0
- package/dist/components/checkbox/checkbox-links.d.ts +18 -0
- package/dist/components/checkbox/checkbox-links.d.ts.map +1 -0
- package/dist/components/checkbox/checkbox-links.js +58 -0
- package/dist/components/checkbox/checkbox-links.js.map +1 -0
- package/dist/components/checkbox/checkbox.d.ts +9 -0
- package/dist/components/checkbox/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox/checkbox.js +49 -0
- package/dist/components/checkbox/checkbox.js.map +1 -0
- package/dist/components/checkbox/checkbox.stories.js +566 -0
- package/dist/components/checkbox/checkbox.stories.js.map +1 -0
- package/dist/components/checkbox/index.d.ts +4 -0
- package/dist/components/checkbox/index.d.ts.map +1 -0
- package/dist/components/checkbox/index.js +5 -0
- package/dist/components/checkbox/index.js.map +1 -0
- package/dist/components/code-block/code-block-footer.d.ts +26 -0
- package/dist/components/code-block/code-block-footer.d.ts.map +1 -0
- package/dist/components/code-block/code-block-footer.js +86 -0
- package/dist/components/code-block/code-block-footer.js.map +1 -0
- package/dist/components/code-block/code-block.d.ts +50 -0
- package/dist/components/code-block/code-block.d.ts.map +1 -0
- package/dist/components/code-block/code-block.js +142 -0
- package/dist/components/code-block/code-block.js.map +1 -0
- package/dist/components/code-block/code-block.stories.js +341 -0
- package/dist/components/code-block/code-block.stories.js.map +1 -0
- package/dist/components/code-block/code-content.d.ts +11 -0
- package/dist/components/code-block/code-content.d.ts.map +1 -0
- package/dist/components/code-block/code-content.js +29 -0
- package/dist/components/code-block/code-content.js.map +1 -0
- package/dist/components/code-block/code-copy-button.d.ts +11 -0
- package/dist/components/code-block/code-copy-button.d.ts.map +1 -0
- package/dist/components/code-block/code-copy-button.js +49 -0
- package/dist/components/code-block/code-copy-button.js.map +1 -0
- package/dist/components/code-block/code-tabs.d.ts +16 -0
- package/dist/components/code-block/code-tabs.d.ts.map +1 -0
- package/dist/components/code-block/code-tabs.js +98 -0
- package/dist/components/code-block/code-tabs.js.map +1 -0
- package/dist/components/code-block/index.d.ts +4 -0
- package/dist/components/code-block/index.d.ts.map +1 -0
- package/dist/components/code-block/index.js +5 -0
- package/dist/components/code-block/index.js.map +1 -0
- package/dist/components/dynamic-item/dynamic-item.d.ts +13 -0
- package/dist/components/dynamic-item/dynamic-item.d.ts.map +1 -0
- package/dist/components/dynamic-item/dynamic-item.js +43 -0
- package/dist/components/dynamic-item/dynamic-item.js.map +1 -0
- package/dist/components/dynamic-item/dynamic-item.stories.js +375 -0
- package/dist/components/dynamic-item/dynamic-item.stories.js.map +1 -0
- package/dist/components/dynamic-item/index.d.ts +2 -0
- package/dist/components/dynamic-item/index.d.ts.map +1 -0
- package/dist/components/dynamic-item/index.js +3 -0
- package/dist/components/dynamic-item/index.js.map +1 -0
- package/dist/components/icon/custom/index.d.ts +3 -0
- package/dist/components/icon/custom/index.d.ts.map +1 -1
- package/dist/components/icon/custom/index.js +3 -0
- package/dist/components/icon/custom/index.js.map +1 -1
- package/dist/components/icon/custom/shipfox-logo.d.ts +8 -0
- package/dist/components/icon/custom/shipfox-logo.d.ts.map +1 -0
- package/dist/components/icon/custom/shipfox-logo.js +22 -0
- package/dist/components/icon/custom/shipfox-logo.js.map +1 -0
- package/dist/components/icon/custom/slack-logo.d.ts +6 -0
- package/dist/components/icon/custom/slack-logo.d.ts.map +1 -0
- package/dist/components/icon/custom/slack-logo.js +34 -0
- package/dist/components/icon/custom/slack-logo.js.map +1 -0
- package/dist/components/icon/custom/stripe-logo.d.ts +8 -0
- package/dist/components/icon/custom/stripe-logo.d.ts.map +1 -0
- package/dist/components/icon/custom/stripe-logo.js +24 -0
- package/dist/components/icon/custom/stripe-logo.js.map +1 -0
- package/dist/components/icon/icon.d.ts +13 -1
- package/dist/components/icon/icon.d.ts.map +1 -1
- package/dist/components/icon/icon.js +15 -3
- package/dist/components/icon/icon.js.map +1 -1
- package/dist/components/icon/icon.stories.js +6 -3
- package/dist/components/icon/icon.stories.js.map +1 -1
- package/dist/components/index.d.ts +12 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +13 -2
- package/dist/components/index.js.map +1 -1
- package/dist/components/inline-tips/index.d.ts +2 -0
- package/dist/components/inline-tips/index.d.ts.map +1 -0
- package/dist/components/inline-tips/index.js +3 -0
- package/dist/components/inline-tips/index.js.map +1 -0
- package/dist/components/inline-tips/inline-tips.d.ts +19 -0
- package/dist/components/inline-tips/inline-tips.d.ts.map +1 -0
- package/dist/components/inline-tips/inline-tips.js +98 -0
- package/dist/components/inline-tips/inline-tips.js.map +1 -0
- package/dist/components/inline-tips/inline-tips.stories.js +214 -0
- package/dist/components/inline-tips/inline-tips.stories.js.map +1 -0
- package/dist/components/input/index.d.ts +2 -0
- package/dist/components/input/index.d.ts.map +1 -0
- package/dist/components/input/index.js +3 -0
- package/dist/components/input/index.js.map +1 -0
- package/dist/components/input/input.d.ts.map +1 -0
- package/dist/components/{input.js → input/input.js} +2 -2
- package/dist/components/input/input.js.map +1 -0
- package/dist/components/{input.stories.js → input/input.stories.js} +1 -1
- package/dist/components/input/input.stories.js.map +1 -0
- package/dist/components/item/index.d.ts +2 -0
- package/dist/components/item/index.d.ts.map +1 -0
- package/dist/components/item/index.js +3 -0
- package/dist/components/item/index.js.map +1 -0
- package/dist/components/item/item.d.ts +32 -0
- package/dist/components/item/item.d.ts.map +1 -0
- package/dist/components/item/item.js +120 -0
- package/dist/components/item/item.js.map +1 -0
- package/dist/components/item/item.stories.js +232 -0
- package/dist/components/item/item.stories.js.map +1 -0
- package/dist/components/label/index.d.ts +2 -0
- package/dist/components/label/index.d.ts.map +1 -0
- package/dist/components/label/index.js +3 -0
- package/dist/components/label/index.js.map +1 -0
- package/dist/components/label/label.d.ts +7 -0
- package/dist/components/label/label.d.ts.map +1 -0
- package/dist/components/label/label.js +13 -0
- package/dist/components/label/label.js.map +1 -0
- package/dist/components/label/label.stories.js +105 -0
- package/dist/components/label/label.stories.js.map +1 -0
- package/dist/components/moving-border/moving-border.d.ts +9 -0
- package/dist/components/moving-border/moving-border.d.ts.map +1 -0
- package/dist/components/moving-border/moving-border.js +54 -0
- package/dist/components/moving-border/moving-border.js.map +1 -0
- package/dist/components/textarea/textarea.js +1 -1
- package/dist/components/textarea/textarea.js.map +1 -1
- package/dist/components/theme/index.d.ts +2 -0
- package/dist/components/theme/index.d.ts.map +1 -0
- package/dist/components/theme/index.js +3 -0
- package/dist/components/theme/index.js.map +1 -0
- package/dist/components/{theme-provider.d.ts → theme/theme-provider.d.ts} +1 -1
- package/dist/components/theme/theme-provider.d.ts.map +1 -0
- package/dist/components/{theme-provider.js → theme/theme-provider.js} +1 -1
- package/dist/components/theme/theme-provider.js.map +1 -0
- package/dist/components/toast/index.d.ts +3 -0
- package/dist/components/toast/index.d.ts.map +1 -0
- package/dist/components/toast/index.js +4 -0
- package/dist/components/toast/index.js.map +1 -0
- package/dist/components/toast/toast-custom.d.ts +19 -0
- package/dist/components/toast/toast-custom.d.ts.map +1 -0
- package/dist/components/toast/toast-custom.js +134 -0
- package/dist/components/toast/toast-custom.js.map +1 -0
- package/dist/components/toast/toast.d.ts +5 -0
- package/dist/components/toast/toast.d.ts.map +1 -0
- package/dist/components/toast/toast.js +40 -0
- package/dist/components/toast/toast.js.map +1 -0
- package/dist/components/toast/toast.stories.js +326 -0
- package/dist/components/toast/toast.stories.js.map +1 -0
- package/dist/components/tooltip/index.d.ts +2 -0
- package/dist/components/tooltip/index.d.ts.map +1 -0
- package/dist/components/tooltip/index.js +3 -0
- package/dist/components/tooltip/index.js.map +1 -0
- package/dist/components/tooltip/tooltip.d.ts +20 -0
- package/dist/components/tooltip/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip/tooltip.js +98 -0
- package/dist/components/tooltip/tooltip.js.map +1 -0
- package/dist/components/tooltip/tooltip.stories.js +560 -0
- package/dist/components/tooltip/tooltip.stories.js.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useResolvedTheme.d.ts +2 -0
- package/dist/hooks/useResolvedTheme.d.ts.map +1 -0
- package/dist/hooks/useResolvedTheme.js +24 -0
- package/dist/hooks/useResolvedTheme.js.map +1 -0
- package/dist/hooks/useShikiHighlight.d.ts +28 -0
- package/dist/hooks/useShikiHighlight.d.ts.map +1 -0
- package/dist/hooks/useShikiHighlight.js +106 -0
- package/dist/hooks/useShikiHighlight.js.map +1 -0
- package/dist/hooks/useShikiStyleInjection.d.ts +2 -0
- package/dist/hooks/useShikiStyleInjection.d.ts.map +1 -0
- package/dist/hooks/useShikiStyleInjection.js +34 -0
- package/dist/hooks/useShikiStyleInjection.js.map +1 -0
- package/dist/utils/avatar.d.ts +3 -0
- package/dist/utils/avatar.d.ts.map +1 -0
- package/dist/utils/avatar.js +32 -0
- package/dist/utils/avatar.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/index.css +130 -7
- package/package.json +7 -4
- package/src/assets/illustration-1.svg +92 -0
- package/src/assets/illustration-2.svg +14 -0
- package/src/assets/illustration-gradient.svg +7049 -0
- package/src/components/alert/alert.stories.tsx +77 -0
- package/src/components/alert/alert.tsx +144 -0
- package/src/components/alert/index.ts +1 -0
- package/src/components/avatar/avatar-group.tsx +186 -0
- package/src/components/avatar/avatar.stories.tsx +179 -0
- package/src/components/avatar/avatar.tsx +219 -0
- package/src/components/avatar/index.ts +2 -0
- package/src/components/badge/badge.stories.tsx +468 -0
- package/src/components/badge/badge.tsx +147 -0
- package/src/components/badge/icon-badge.tsx +43 -0
- package/src/components/badge/index.ts +4 -0
- package/src/components/badge/status-badge.tsx +43 -0
- package/src/components/badge/user-badge.tsx +34 -0
- package/src/components/{button.tsx → button/button.tsx} +1 -1
- package/src/components/button/index.ts +1 -0
- package/src/components/checkbox/checkbox-label.tsx +125 -0
- package/src/components/checkbox/checkbox-links.tsx +90 -0
- package/src/components/checkbox/checkbox.stories.tsx +375 -0
- package/src/components/checkbox/checkbox.tsx +71 -0
- package/src/components/checkbox/index.ts +3 -0
- package/src/components/code-block/code-block-footer.tsx +173 -0
- package/src/components/code-block/code-block.stories.tsx +323 -0
- package/src/components/code-block/code-block.tsx +283 -0
- package/src/components/code-block/code-content.tsx +60 -0
- package/src/components/code-block/code-copy-button.tsx +73 -0
- package/src/components/code-block/code-tabs.tsx +170 -0
- package/src/components/code-block/index.ts +3 -0
- package/src/components/dynamic-item/dynamic-item.stories.tsx +261 -0
- package/src/components/dynamic-item/dynamic-item.tsx +68 -0
- package/src/components/dynamic-item/index.ts +1 -0
- package/src/components/icon/custom/index.ts +3 -0
- package/src/components/icon/custom/shipfox-logo.tsx +20 -0
- package/src/components/icon/custom/slack-logo.tsx +35 -0
- package/src/components/icon/custom/stripe-logo.tsx +27 -0
- package/src/components/icon/icon.stories.tsx +3 -1
- package/src/components/icon/icon.tsx +29 -1
- package/src/components/index.ts +12 -1
- package/src/components/inline-tips/index.ts +1 -0
- package/src/components/inline-tips/inline-tips.stories.tsx +126 -0
- package/src/components/inline-tips/inline-tips.tsx +132 -0
- package/src/components/input/index.ts +1 -0
- package/src/components/{input.tsx → input/input.tsx} +1 -1
- package/src/components/item/index.ts +1 -0
- package/src/components/item/item.stories.tsx +150 -0
- package/src/components/item/item.tsx +182 -0
- package/src/components/label/index.ts +1 -0
- package/src/components/label/label.stories.tsx +67 -0
- package/src/components/label/label.tsx +15 -0
- package/src/components/moving-border/moving-border.tsx +67 -0
- package/src/components/textarea/textarea.tsx +1 -1
- package/src/components/theme/index.ts +1 -0
- package/src/components/toast/index.ts +2 -0
- package/src/components/toast/toast-custom.tsx +154 -0
- package/src/components/toast/toast.stories.tsx +369 -0
- package/src/components/toast/toast.tsx +41 -0
- package/src/components/tooltip/index.ts +1 -0
- package/src/components/tooltip/tooltip.stories.tsx +284 -0
- package/src/components/tooltip/tooltip.tsx +121 -0
- package/src/hooks/index.ts +3 -0
- package/src/hooks/useResolvedTheme.ts +34 -0
- package/src/hooks/useShikiHighlight.ts +140 -0
- package/src/hooks/useShikiStyleInjection.ts +34 -0
- package/src/utils/avatar.ts +27 -0
- package/src/utils/index.ts +1 -0
- package/dist/components/button.d.ts.map +0 -1
- package/dist/components/button.js.map +0 -1
- package/dist/components/button.stories.js.map +0 -1
- package/dist/components/input.d.ts.map +0 -1
- package/dist/components/input.js.map +0 -1
- package/dist/components/input.stories.js.map +0 -1
- package/dist/components/theme-provider.d.ts.map +0 -1
- package/dist/components/theme-provider.js.map +0 -1
- /package/dist/components/{input.d.ts → input/input.d.ts} +0 -0
- /package/src/components/{button.stories.tsx → button/button.stories.tsx} +0 -0
- /package/src/components/{input.stories.tsx → input/input.stories.tsx} +0 -0
- /package/src/components/{theme-provider.tsx → theme/theme-provider.tsx} +0 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import * as AvatarPrimitive from '@radix-ui/react-avatar';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { getInitial, getPlaceholderImageUrl } from '../../utils/index.js';
|
|
5
|
+
import { cn } from '../../utils/cn.js';
|
|
6
|
+
import { Icon } from '../icon/icon.js';
|
|
7
|
+
export const avatarVariants = cva('relative flex shrink-0 overflow-hidden bg-background-button-neutral-default text-foreground-neutral-base ring-1 ring-border-neutral-base-component ring-offset-1 ring-offset-background-neutral-base shadow-button-neutral', {
|
|
8
|
+
variants: {
|
|
9
|
+
radius: {
|
|
10
|
+
full: 'rounded-full',
|
|
11
|
+
rounded: 'rounded-6'
|
|
12
|
+
},
|
|
13
|
+
size: {
|
|
14
|
+
'3xs': 'size-[18px]',
|
|
15
|
+
'2xs': 'size-[20px]',
|
|
16
|
+
xs: 'size-[24px]',
|
|
17
|
+
sm: 'size-[28px]',
|
|
18
|
+
md: 'size-[32px]',
|
|
19
|
+
lg: 'size-[36px]',
|
|
20
|
+
xl: 'size-[40px]',
|
|
21
|
+
'2xl': 'size-[80px]',
|
|
22
|
+
'3xl': 'size-[120px]'
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
defaultVariants: {
|
|
26
|
+
radius: 'full',
|
|
27
|
+
size: 'md'
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
const avatarInnerVariants = cva('flex h-full w-full items-center justify-center', {
|
|
31
|
+
variants: {
|
|
32
|
+
size: {
|
|
33
|
+
'3xs': 'text-[10px] leading-[10px]',
|
|
34
|
+
'2xs': 'text-[11px] leading-[11px]',
|
|
35
|
+
xs: 'text-xs leading-4',
|
|
36
|
+
sm: 'text-xs leading-5',
|
|
37
|
+
md: 'text-sm leading-5',
|
|
38
|
+
lg: 'text-sm leading-5',
|
|
39
|
+
xl: 'text-base leading-6',
|
|
40
|
+
'2xl': 'text-2xl leading-8',
|
|
41
|
+
'3xl': 'text-4xl leading-[56px]'
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
defaultVariants: {
|
|
45
|
+
size: 'md'
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
const UPLOAD_ICON_SIZE_MAP = {
|
|
49
|
+
'3xs': 'size-[10px]',
|
|
50
|
+
'2xs': 'size-[12px]',
|
|
51
|
+
xs: 'size-[14px]',
|
|
52
|
+
sm: 'size-[16px]',
|
|
53
|
+
md: 'size-[18px]',
|
|
54
|
+
lg: 'size-[20px]',
|
|
55
|
+
xl: 'size-[24px]',
|
|
56
|
+
'2xl': 'size-[40px]',
|
|
57
|
+
'3xl': 'size-[60px]'
|
|
58
|
+
};
|
|
59
|
+
function AvatarRoot({ className, radius, size, ...props }) {
|
|
60
|
+
return /*#__PURE__*/ _jsx(AvatarPrimitive.Root, {
|
|
61
|
+
"data-slot": "avatar",
|
|
62
|
+
className: cn(avatarVariants({
|
|
63
|
+
radius,
|
|
64
|
+
size
|
|
65
|
+
}), className),
|
|
66
|
+
...props
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function AvatarImage({ className, ...props }) {
|
|
70
|
+
return /*#__PURE__*/ _jsx(AvatarPrimitive.Image, {
|
|
71
|
+
"data-slot": "avatar-image",
|
|
72
|
+
className: cn('aspect-square size-full', className),
|
|
73
|
+
...props
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function AvatarFallback({ className, ...props }) {
|
|
77
|
+
return /*#__PURE__*/ _jsx(AvatarPrimitive.Fallback, {
|
|
78
|
+
"data-slot": "avatar-name",
|
|
79
|
+
className: cn('flex size-full items-center justify-center', className),
|
|
80
|
+
...props
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
export function Avatar({ className, radius, size = 'md', content = 'letters', src, alt, fallback, animateOnHover = false, logoName = 'shipfox', logoClassName, ...props }) {
|
|
84
|
+
const innerClassName = 'flex h-full w-full items-center justify-center rounded-inherit relative bg-background-neutral-base dark:bg-background-components-base text-foreground-neutral-subtle';
|
|
85
|
+
const renderContent = ()=>{
|
|
86
|
+
if (content === 'image') {
|
|
87
|
+
const imageSrc = src || getPlaceholderImageUrl(fallback);
|
|
88
|
+
return /*#__PURE__*/ _jsxs(_Fragment, {
|
|
89
|
+
children: [
|
|
90
|
+
/*#__PURE__*/ _jsx(AvatarImage, {
|
|
91
|
+
src: imageSrc,
|
|
92
|
+
alt: alt || 'Avatar image',
|
|
93
|
+
className: "object-scale-down rounded-inherit"
|
|
94
|
+
}),
|
|
95
|
+
/*#__PURE__*/ _jsx(AvatarFallback, {
|
|
96
|
+
className: innerClassName,
|
|
97
|
+
children: /*#__PURE__*/ _jsx("div", {
|
|
98
|
+
className: cn('absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2', avatarInnerVariants({
|
|
99
|
+
size
|
|
100
|
+
})),
|
|
101
|
+
children: /*#__PURE__*/ _jsx("span", {
|
|
102
|
+
className: "font-medium",
|
|
103
|
+
children: getInitial(fallback)
|
|
104
|
+
})
|
|
105
|
+
})
|
|
106
|
+
})
|
|
107
|
+
]
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
if (content === 'logo') {
|
|
111
|
+
return /*#__PURE__*/ _jsx(AvatarFallback, {
|
|
112
|
+
className: cn(innerClassName, logoClassName ?? 'p-[15%]'),
|
|
113
|
+
children: /*#__PURE__*/ _jsx(Icon, {
|
|
114
|
+
name: logoName,
|
|
115
|
+
className: "h-full w-full"
|
|
116
|
+
})
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
if (content === 'logoPlaceholder') {
|
|
120
|
+
return /*#__PURE__*/ _jsx(AvatarFallback, {
|
|
121
|
+
className: cn(innerClassName, logoClassName ?? 'p-[15%]'),
|
|
122
|
+
children: /*#__PURE__*/ _jsx(Icon, {
|
|
123
|
+
name: logoName,
|
|
124
|
+
color: "var(--foreground-neutral-subtle, #a1a1aa)",
|
|
125
|
+
className: "h-full w-full opacity-50"
|
|
126
|
+
})
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
if (content === 'letters') {
|
|
130
|
+
return /*#__PURE__*/ _jsx(AvatarFallback, {
|
|
131
|
+
className: innerClassName,
|
|
132
|
+
children: /*#__PURE__*/ _jsx("div", {
|
|
133
|
+
className: cn('absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2', avatarInnerVariants({
|
|
134
|
+
size
|
|
135
|
+
})),
|
|
136
|
+
children: /*#__PURE__*/ _jsx("span", {
|
|
137
|
+
className: "font-medium",
|
|
138
|
+
children: getInitial(fallback)
|
|
139
|
+
})
|
|
140
|
+
})
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
if (content === 'upload') {
|
|
144
|
+
const iconSizeClass = UPLOAD_ICON_SIZE_MAP[size];
|
|
145
|
+
return /*#__PURE__*/ _jsx(AvatarFallback, {
|
|
146
|
+
className: innerClassName,
|
|
147
|
+
children: /*#__PURE__*/ _jsx(Icon, {
|
|
148
|
+
name: "imageAdd",
|
|
149
|
+
className: cn('text-foreground-neutral-subtle', iconSizeClass)
|
|
150
|
+
})
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
};
|
|
155
|
+
return /*#__PURE__*/ _jsx(AvatarRoot, {
|
|
156
|
+
className: cn(animateOnHover ? 'hover:-translate-y-8 transition-transform duration-300 ease-out' : '', className),
|
|
157
|
+
radius: radius,
|
|
158
|
+
size: size,
|
|
159
|
+
...props,
|
|
160
|
+
children: renderContent()
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
export { AvatarRoot, AvatarImage, AvatarFallback };
|
|
164
|
+
|
|
165
|
+
//# sourceMappingURL=avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/avatar/avatar.tsx"],"sourcesContent":["import * as AvatarPrimitive from '@radix-ui/react-avatar';\nimport {cva, type VariantProps} from 'class-variance-authority';\nimport type {ComponentProps, ReactNode} from 'react';\nimport {getInitial, getPlaceholderImageUrl} from 'utils';\nimport {cn} from 'utils/cn';\nimport {Icon, type IconName} from '../icon/icon';\n\nexport const avatarVariants = cva(\n 'relative flex shrink-0 overflow-hidden bg-background-button-neutral-default text-foreground-neutral-base ring-1 ring-border-neutral-base-component ring-offset-1 ring-offset-background-neutral-base shadow-button-neutral',\n {\n variants: {\n radius: {\n full: 'rounded-full',\n rounded: 'rounded-6',\n },\n size: {\n '3xs': 'size-[18px]',\n '2xs': 'size-[20px]',\n xs: 'size-[24px]',\n sm: 'size-[28px]',\n md: 'size-[32px]',\n lg: 'size-[36px]',\n xl: 'size-[40px]',\n '2xl': 'size-[80px]',\n '3xl': 'size-[120px]',\n },\n },\n defaultVariants: {\n radius: 'full',\n size: 'md',\n },\n },\n);\n\nconst avatarInnerVariants = cva('flex h-full w-full items-center justify-center', {\n variants: {\n size: {\n '3xs': 'text-[10px] leading-[10px]',\n '2xs': 'text-[11px] leading-[11px]',\n xs: 'text-xs leading-4',\n sm: 'text-xs leading-5',\n md: 'text-sm leading-5',\n lg: 'text-sm leading-5',\n xl: 'text-base leading-6',\n '2xl': 'text-2xl leading-8',\n '3xl': 'text-4xl leading-[56px]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\nexport type AvatarContent = 'letters' | 'logo' | 'logoPlaceholder' | 'image' | 'upload';\n\nconst UPLOAD_ICON_SIZE_MAP: Record<\n NonNullable<VariantProps<typeof avatarVariants>['size']>,\n string\n> = {\n '3xs': 'size-[10px]',\n '2xs': 'size-[12px]',\n xs: 'size-[14px]',\n sm: 'size-[16px]',\n md: 'size-[18px]',\n lg: 'size-[20px]',\n xl: 'size-[24px]',\n '2xl': 'size-[40px]',\n '3xl': 'size-[60px]',\n} as const;\n\nfunction AvatarRoot({\n className,\n radius,\n size,\n ...props\n}: ComponentProps<typeof AvatarPrimitive.Root> & VariantProps<typeof avatarVariants>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(avatarVariants({radius, size}), className)}\n {...props}\n />\n );\n}\n\nfunction AvatarImage({className, ...props}: ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn('aspect-square size-full', className)}\n {...props}\n />\n );\n}\n\nfunction AvatarFallback({className, ...props}: ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-name\"\n className={cn('flex size-full items-center justify-center', className)}\n {...props}\n />\n );\n}\n\nexport type AvatarProps = ComponentProps<typeof AvatarPrimitive.Root> &\n VariantProps<typeof avatarVariants> & {\n content?: AvatarContent;\n src?: string;\n alt?: string;\n fallback?: string;\n animateOnHover?: boolean;\n logoName?: IconName;\n logoClassName?: string;\n };\n\nexport function Avatar({\n className,\n radius,\n size = 'md',\n content = 'letters',\n src,\n alt,\n fallback,\n animateOnHover = false,\n logoName = 'shipfox',\n logoClassName,\n ...props\n}: AvatarProps) {\n const innerClassName =\n 'flex h-full w-full items-center justify-center rounded-inherit relative bg-background-neutral-base dark:bg-background-components-base text-foreground-neutral-subtle';\n\n const renderContent = (): ReactNode => {\n if (content === 'image') {\n const imageSrc = src || getPlaceholderImageUrl(fallback);\n return (\n <>\n <AvatarImage\n src={imageSrc}\n alt={alt || 'Avatar image'}\n className=\"object-scale-down rounded-inherit\"\n />\n <AvatarFallback className={innerClassName}>\n <div\n className={cn(\n 'absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2',\n avatarInnerVariants({size}),\n )}\n >\n <span className=\"font-medium\">{getInitial(fallback)}</span>\n </div>\n </AvatarFallback>\n </>\n );\n }\n\n if (content === 'logo') {\n return (\n <AvatarFallback className={cn(innerClassName, logoClassName ?? 'p-[15%]')}>\n <Icon name={logoName} className=\"h-full w-full\" />\n </AvatarFallback>\n );\n }\n\n if (content === 'logoPlaceholder') {\n return (\n <AvatarFallback className={cn(innerClassName, logoClassName ?? 'p-[15%]')}>\n <Icon\n name={logoName}\n color=\"var(--foreground-neutral-subtle, #a1a1aa)\"\n className=\"h-full w-full opacity-50\"\n />\n </AvatarFallback>\n );\n }\n\n if (content === 'letters') {\n return (\n <AvatarFallback className={innerClassName}>\n <div\n className={cn(\n 'absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2',\n avatarInnerVariants({size}),\n )}\n >\n <span className=\"font-medium\">{getInitial(fallback)}</span>\n </div>\n </AvatarFallback>\n );\n }\n\n if (content === 'upload') {\n const iconSizeClass = UPLOAD_ICON_SIZE_MAP[size as keyof typeof UPLOAD_ICON_SIZE_MAP];\n return (\n <AvatarFallback className={innerClassName}>\n <Icon name=\"imageAdd\" className={cn('text-foreground-neutral-subtle', iconSizeClass)} />\n </AvatarFallback>\n );\n }\n\n return null;\n };\n\n return (\n <AvatarRoot\n className={cn(\n animateOnHover ? 'hover:-translate-y-8 transition-transform duration-300 ease-out' : '',\n className,\n )}\n radius={radius}\n size={size}\n {...props}\n >\n {renderContent()}\n </AvatarRoot>\n );\n}\n\nexport {AvatarRoot, AvatarImage, AvatarFallback};\n"],"names":["AvatarPrimitive","cva","getInitial","getPlaceholderImageUrl","cn","Icon","avatarVariants","variants","radius","full","rounded","size","xs","sm","md","lg","xl","defaultVariants","avatarInnerVariants","UPLOAD_ICON_SIZE_MAP","AvatarRoot","className","props","Root","data-slot","AvatarImage","Image","AvatarFallback","Fallback","Avatar","content","src","alt","fallback","animateOnHover","logoName","logoClassName","innerClassName","renderContent","imageSrc","div","span","name","color","iconSizeClass"],"mappings":"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"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Code } from '../../components/typography/index.js';
|
|
3
|
+
import { Avatar } from './avatar.js';
|
|
4
|
+
import { AvatarGroup, AvatarGroupTooltip } from './avatar-group.js';
|
|
5
|
+
const contentOptions = [
|
|
6
|
+
'letters',
|
|
7
|
+
'logo',
|
|
8
|
+
'logoPlaceholder',
|
|
9
|
+
'image',
|
|
10
|
+
'upload'
|
|
11
|
+
];
|
|
12
|
+
const radiusOptions = [
|
|
13
|
+
'full',
|
|
14
|
+
'rounded'
|
|
15
|
+
];
|
|
16
|
+
const sizeOptions = [
|
|
17
|
+
'3xs',
|
|
18
|
+
'2xs',
|
|
19
|
+
'xs',
|
|
20
|
+
'sm',
|
|
21
|
+
'md',
|
|
22
|
+
'lg',
|
|
23
|
+
'xl',
|
|
24
|
+
'2xl',
|
|
25
|
+
'3xl'
|
|
26
|
+
];
|
|
27
|
+
const logoNameOptions = [
|
|
28
|
+
'shipfox',
|
|
29
|
+
'slack',
|
|
30
|
+
'stripe',
|
|
31
|
+
'github'
|
|
32
|
+
];
|
|
33
|
+
const meta = {
|
|
34
|
+
title: 'Components/Avatar',
|
|
35
|
+
component: Avatar,
|
|
36
|
+
tags: [
|
|
37
|
+
'autodocs'
|
|
38
|
+
],
|
|
39
|
+
argTypes: {
|
|
40
|
+
content: {
|
|
41
|
+
control: 'select',
|
|
42
|
+
options: contentOptions
|
|
43
|
+
},
|
|
44
|
+
radius: {
|
|
45
|
+
control: 'select',
|
|
46
|
+
options: radiusOptions
|
|
47
|
+
},
|
|
48
|
+
size: {
|
|
49
|
+
control: 'select',
|
|
50
|
+
options: sizeOptions
|
|
51
|
+
},
|
|
52
|
+
fallback: {
|
|
53
|
+
control: 'text'
|
|
54
|
+
},
|
|
55
|
+
src: {
|
|
56
|
+
control: 'text'
|
|
57
|
+
},
|
|
58
|
+
alt: {
|
|
59
|
+
control: 'text'
|
|
60
|
+
},
|
|
61
|
+
logoName: {
|
|
62
|
+
control: 'select',
|
|
63
|
+
options: logoNameOptions,
|
|
64
|
+
description: 'Logo icon name to display when content is "logo" or "logoPlaceholder"'
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
args: {
|
|
68
|
+
content: 'letters',
|
|
69
|
+
radius: 'full',
|
|
70
|
+
size: 'md',
|
|
71
|
+
fallback: 'John Doe',
|
|
72
|
+
logoName: 'shipfox'
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
export default meta;
|
|
76
|
+
export const Default = {
|
|
77
|
+
args: {
|
|
78
|
+
content: 'logo',
|
|
79
|
+
fallback: 'Shipfox'
|
|
80
|
+
},
|
|
81
|
+
render: (args)=>/*#__PURE__*/ _jsx("div", {
|
|
82
|
+
className: "flex flex-wrap items-end gap-16",
|
|
83
|
+
children: sizeOptions.map((size)=>/*#__PURE__*/ _jsxs("div", {
|
|
84
|
+
className: "flex flex-col items-center gap-8",
|
|
85
|
+
children: [
|
|
86
|
+
/*#__PURE__*/ _jsx(Avatar, {
|
|
87
|
+
...args,
|
|
88
|
+
size: size
|
|
89
|
+
}),
|
|
90
|
+
/*#__PURE__*/ _jsx(Code, {
|
|
91
|
+
variant: "label",
|
|
92
|
+
className: "text-foreground-neutral-base",
|
|
93
|
+
children: size
|
|
94
|
+
})
|
|
95
|
+
]
|
|
96
|
+
}, size))
|
|
97
|
+
})
|
|
98
|
+
};
|
|
99
|
+
// AvatarGroup Stories
|
|
100
|
+
const avatarGroupMeta = {
|
|
101
|
+
title: 'Components/AvatarGroup',
|
|
102
|
+
component: AvatarGroup,
|
|
103
|
+
tags: [
|
|
104
|
+
'autodocs'
|
|
105
|
+
],
|
|
106
|
+
argTypes: {
|
|
107
|
+
size: {
|
|
108
|
+
control: 'select',
|
|
109
|
+
options: sizeOptions
|
|
110
|
+
},
|
|
111
|
+
maxVisible: {
|
|
112
|
+
control: 'number'
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
args: {
|
|
116
|
+
size: 'md',
|
|
117
|
+
children: []
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
export const AvatarGroupDefault = {
|
|
121
|
+
args: {
|
|
122
|
+
children: []
|
|
123
|
+
},
|
|
124
|
+
render: ()=>{
|
|
125
|
+
const avatars = [
|
|
126
|
+
{
|
|
127
|
+
name: 'John Doe',
|
|
128
|
+
content: 'image'
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
name: 'Jane Smith',
|
|
132
|
+
content: 'image'
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
name: 'Bob Johnson',
|
|
136
|
+
content: 'image'
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
name: 'Alice Brown',
|
|
140
|
+
content: 'image'
|
|
141
|
+
}
|
|
142
|
+
];
|
|
143
|
+
return /*#__PURE__*/ _jsx("div", {
|
|
144
|
+
className: "flex flex-col gap-16",
|
|
145
|
+
children: /*#__PURE__*/ _jsxs("div", {
|
|
146
|
+
className: "flex flex-col gap-8",
|
|
147
|
+
children: [
|
|
148
|
+
/*#__PURE__*/ _jsx(Code, {
|
|
149
|
+
variant: "label",
|
|
150
|
+
className: "text-foreground-neutral-base",
|
|
151
|
+
children: "Default (without tooltips)"
|
|
152
|
+
}),
|
|
153
|
+
/*#__PURE__*/ _jsx(AvatarGroup, {
|
|
154
|
+
size: "md",
|
|
155
|
+
children: avatars.map((avatar)=>/*#__PURE__*/ _jsx(Avatar, {
|
|
156
|
+
content: avatar.content,
|
|
157
|
+
fallback: avatar.name
|
|
158
|
+
}, avatar.name))
|
|
159
|
+
})
|
|
160
|
+
]
|
|
161
|
+
})
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
export const AvatarGroupWithTooltips = {
|
|
166
|
+
args: {
|
|
167
|
+
children: []
|
|
168
|
+
},
|
|
169
|
+
render: ()=>{
|
|
170
|
+
const avatars = [
|
|
171
|
+
{
|
|
172
|
+
name: 'John Doe',
|
|
173
|
+
content: 'image'
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
name: 'Jane Smith',
|
|
177
|
+
content: 'image'
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
name: 'Bob Johnson',
|
|
181
|
+
content: 'image'
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
name: 'Alice Brown',
|
|
185
|
+
content: 'image'
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
name: 'Carlos Vega',
|
|
189
|
+
content: 'image'
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
name: 'Linda Tran',
|
|
193
|
+
content: 'image'
|
|
194
|
+
}
|
|
195
|
+
];
|
|
196
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
197
|
+
className: "flex flex-col gap-16",
|
|
198
|
+
children: [
|
|
199
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
200
|
+
className: "flex flex-col gap-8",
|
|
201
|
+
children: [
|
|
202
|
+
/*#__PURE__*/ _jsx(Code, {
|
|
203
|
+
variant: "label",
|
|
204
|
+
className: "text-foreground-neutral-base",
|
|
205
|
+
children: "With Tooltips"
|
|
206
|
+
}),
|
|
207
|
+
/*#__PURE__*/ _jsx(AvatarGroup, {
|
|
208
|
+
size: "md",
|
|
209
|
+
children: avatars.map((avatar)=>/*#__PURE__*/ _jsx(Avatar, {
|
|
210
|
+
content: avatar.content,
|
|
211
|
+
fallback: avatar.name,
|
|
212
|
+
children: /*#__PURE__*/ _jsx(AvatarGroupTooltip, {
|
|
213
|
+
children: avatar.name
|
|
214
|
+
})
|
|
215
|
+
}, avatar.name))
|
|
216
|
+
})
|
|
217
|
+
]
|
|
218
|
+
}),
|
|
219
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
220
|
+
className: "flex flex-col gap-8",
|
|
221
|
+
children: [
|
|
222
|
+
/*#__PURE__*/ _jsx(Code, {
|
|
223
|
+
variant: "label",
|
|
224
|
+
className: "text-foreground-neutral-base",
|
|
225
|
+
children: "With Tooltips (maxVisible: 4)"
|
|
226
|
+
}),
|
|
227
|
+
/*#__PURE__*/ _jsx(AvatarGroup, {
|
|
228
|
+
size: "md",
|
|
229
|
+
maxVisible: 4,
|
|
230
|
+
children: avatars.map((avatar)=>/*#__PURE__*/ _jsx(Avatar, {
|
|
231
|
+
content: avatar.content,
|
|
232
|
+
fallback: avatar.name,
|
|
233
|
+
children: /*#__PURE__*/ _jsx(AvatarGroupTooltip, {
|
|
234
|
+
children: avatar.name
|
|
235
|
+
})
|
|
236
|
+
}, avatar.name))
|
|
237
|
+
})
|
|
238
|
+
]
|
|
239
|
+
}),
|
|
240
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
241
|
+
className: "flex flex-col gap-8",
|
|
242
|
+
children: [
|
|
243
|
+
/*#__PURE__*/ _jsx(Code, {
|
|
244
|
+
variant: "label",
|
|
245
|
+
className: "text-foreground-neutral-base",
|
|
246
|
+
children: "With Tooltips and Hover Animation"
|
|
247
|
+
}),
|
|
248
|
+
/*#__PURE__*/ _jsx(AvatarGroup, {
|
|
249
|
+
size: "md",
|
|
250
|
+
maxVisible: 4,
|
|
251
|
+
animateOnHover: true,
|
|
252
|
+
children: avatars.map((avatar)=>/*#__PURE__*/ _jsx(Avatar, {
|
|
253
|
+
content: avatar.content,
|
|
254
|
+
fallback: avatar.name,
|
|
255
|
+
children: /*#__PURE__*/ _jsx(AvatarGroupTooltip, {
|
|
256
|
+
children: avatar.name
|
|
257
|
+
})
|
|
258
|
+
}, avatar.name))
|
|
259
|
+
})
|
|
260
|
+
]
|
|
261
|
+
})
|
|
262
|
+
]
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
//# sourceMappingURL=avatar.stories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/avatar/avatar.stories.tsx"],"sourcesContent":["import type {Meta, StoryObj} from '@storybook/react';\nimport {Code} from 'components/typography';\nimport {Avatar} from './avatar';\nimport {AvatarGroup, AvatarGroupTooltip} from './avatar-group';\n\nconst contentOptions = ['letters', 'logo', 'logoPlaceholder', 'image', 'upload'] as const;\nconst radiusOptions = ['full', 'rounded'] as const;\nconst sizeOptions = ['3xs', '2xs', 'xs', 'sm', 'md', 'lg', 'xl', '2xl', '3xl'] as const;\nconst logoNameOptions = ['shipfox', 'slack', 'stripe', 'github'] as const;\n\nconst meta = {\n title: 'Components/Avatar',\n component: Avatar,\n tags: ['autodocs'],\n argTypes: {\n content: {\n control: 'select',\n options: contentOptions,\n },\n radius: {\n control: 'select',\n options: radiusOptions,\n },\n size: {\n control: 'select',\n options: sizeOptions,\n },\n fallback: {\n control: 'text',\n },\n src: {\n control: 'text',\n },\n alt: {\n control: 'text',\n },\n logoName: {\n control: 'select',\n options: logoNameOptions,\n description: 'Logo icon name to display when content is \"logo\" or \"logoPlaceholder\"',\n },\n },\n args: {\n content: 'letters',\n radius: 'full',\n size: 'md',\n fallback: 'John Doe',\n logoName: 'shipfox',\n },\n} satisfies Meta<typeof Avatar>;\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n\nexport const Default: Story = {\n args: {\n content: 'logo',\n fallback: 'Shipfox',\n },\n\n render: (args) => (\n <div className=\"flex flex-wrap items-end gap-16\">\n {sizeOptions.map((size) => (\n <div key={size} className=\"flex flex-col items-center gap-8\">\n <Avatar {...args} size={size} />\n <Code variant=\"label\" className=\"text-foreground-neutral-base\">\n {size}\n </Code>\n </div>\n ))}\n </div>\n ),\n};\n\n// AvatarGroup Stories\nconst avatarGroupMeta = {\n title: 'Components/AvatarGroup',\n component: AvatarGroup,\n tags: ['autodocs'],\n argTypes: {\n size: {\n control: 'select',\n options: sizeOptions,\n },\n maxVisible: {\n control: 'number',\n },\n },\n args: {\n size: 'md',\n children: [],\n },\n} satisfies Meta<typeof AvatarGroup>;\n\nexport const AvatarGroupDefault: StoryObj<typeof avatarGroupMeta> = {\n args: {\n children: [],\n },\n render: () => {\n const avatars = [\n {name: 'John Doe', content: 'image'},\n {name: 'Jane Smith', content: 'image'},\n {name: 'Bob Johnson', content: 'image'},\n {name: 'Alice Brown', content: 'image'},\n ] as const;\n\n return (\n <div className=\"flex flex-col gap-16\">\n <div className=\"flex flex-col gap-8\">\n <Code variant=\"label\" className=\"text-foreground-neutral-base\">\n Default (without tooltips)\n </Code>\n <AvatarGroup size=\"md\">\n {avatars.map((avatar) => (\n <Avatar key={avatar.name} content={avatar.content} fallback={avatar.name} />\n ))}\n </AvatarGroup>\n </div>\n </div>\n );\n },\n};\n\nexport const AvatarGroupWithTooltips: StoryObj<typeof avatarGroupMeta> = {\n args: {\n children: [],\n },\n render: () => {\n const avatars = [\n {name: 'John Doe', content: 'image'},\n {name: 'Jane Smith', content: 'image'},\n {name: 'Bob Johnson', content: 'image'},\n {name: 'Alice Brown', content: 'image'},\n {name: 'Carlos Vega', content: 'image'},\n {name: 'Linda Tran', content: 'image'},\n ] as const;\n\n return (\n <div className=\"flex flex-col gap-16\">\n <div className=\"flex flex-col gap-8\">\n <Code variant=\"label\" className=\"text-foreground-neutral-base\">\n With Tooltips\n </Code>\n <AvatarGroup size=\"md\">\n {avatars.map((avatar) => (\n <Avatar key={avatar.name} content={avatar.content} fallback={avatar.name}>\n <AvatarGroupTooltip>{avatar.name}</AvatarGroupTooltip>\n </Avatar>\n ))}\n </AvatarGroup>\n </div>\n <div className=\"flex flex-col gap-8\">\n <Code variant=\"label\" className=\"text-foreground-neutral-base\">\n With Tooltips (maxVisible: 4)\n </Code>\n <AvatarGroup size=\"md\" maxVisible={4}>\n {avatars.map((avatar) => (\n <Avatar key={avatar.name} content={avatar.content} fallback={avatar.name}>\n <AvatarGroupTooltip>{avatar.name}</AvatarGroupTooltip>\n </Avatar>\n ))}\n </AvatarGroup>\n </div>\n <div className=\"flex flex-col gap-8\">\n <Code variant=\"label\" className=\"text-foreground-neutral-base\">\n With Tooltips and Hover Animation\n </Code>\n <AvatarGroup size=\"md\" maxVisible={4} animateOnHover>\n {avatars.map((avatar) => (\n <Avatar key={avatar.name} content={avatar.content} fallback={avatar.name}>\n <AvatarGroupTooltip>{avatar.name}</AvatarGroupTooltip>\n </Avatar>\n ))}\n </AvatarGroup>\n </div>\n </div>\n );\n },\n};\n"],"names":["Code","Avatar","AvatarGroup","AvatarGroupTooltip","contentOptions","radiusOptions","sizeOptions","logoNameOptions","meta","title","component","tags","argTypes","content","control","options","radius","size","fallback","src","alt","logoName","description","args","Default","render","div","className","map","variant","avatarGroupMeta","maxVisible","children","AvatarGroupDefault","avatars","name","avatar","AvatarGroupWithTooltips","animateOnHover"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/avatar/index.ts"],"sourcesContent":["export * from './avatar';\nexport * from './avatar-group';\n"],"names":[],"mappings":"AAAA,cAAc,WAAW;AACzB,cAAc,iBAAiB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type VariantProps } from 'class-variance-authority';
|
|
2
|
+
import { type IconName } from '../../components/icon';
|
|
3
|
+
import type { ComponentProps } from 'react';
|
|
4
|
+
export declare const badgeVariants: (props?: ({
|
|
5
|
+
variant?: "info" | "success" | "warning" | "error" | "neutral" | "feature" | null | undefined;
|
|
6
|
+
size?: "2xs" | "xs" | null | undefined;
|
|
7
|
+
radius?: "default" | "rounded" | null | undefined;
|
|
8
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
9
|
+
export type BadgeVariant = VariantProps<typeof badgeVariants>['variant'];
|
|
10
|
+
type BaseBadgeProps = ComponentProps<'span'> & VariantProps<typeof badgeVariants> & {
|
|
11
|
+
asChild?: boolean;
|
|
12
|
+
};
|
|
13
|
+
type BadgePropsWithLeftClick = BaseBadgeProps & {
|
|
14
|
+
iconLeft: IconName;
|
|
15
|
+
onIconLeftClick: (e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
16
|
+
iconLeftAriaLabel: string;
|
|
17
|
+
iconRight?: IconName;
|
|
18
|
+
onIconRightClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
19
|
+
iconRightAriaLabel?: string;
|
|
20
|
+
};
|
|
21
|
+
type BadgePropsWithRightClick = BaseBadgeProps & {
|
|
22
|
+
iconRight: IconName;
|
|
23
|
+
onIconRightClick: (e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
24
|
+
iconRightAriaLabel: string;
|
|
25
|
+
iconLeft?: IconName;
|
|
26
|
+
onIconLeftClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
27
|
+
iconLeftAriaLabel?: string;
|
|
28
|
+
};
|
|
29
|
+
type BadgePropsWithBothClicks = BaseBadgeProps & {
|
|
30
|
+
iconLeft: IconName;
|
|
31
|
+
onIconLeftClick: (e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
32
|
+
iconLeftAriaLabel: string;
|
|
33
|
+
iconRight: IconName;
|
|
34
|
+
onIconRightClick: (e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
35
|
+
iconRightAriaLabel: string;
|
|
36
|
+
};
|
|
37
|
+
type BadgePropsWithoutClicks = BaseBadgeProps & {
|
|
38
|
+
iconLeft?: IconName;
|
|
39
|
+
iconRight?: IconName;
|
|
40
|
+
onIconLeftClick?: never;
|
|
41
|
+
onIconRightClick?: never;
|
|
42
|
+
iconLeftAriaLabel?: never;
|
|
43
|
+
iconRightAriaLabel?: never;
|
|
44
|
+
};
|
|
45
|
+
export type BadgeProps = BadgePropsWithLeftClick | BadgePropsWithRightClick | BadgePropsWithBothClicks | BadgePropsWithoutClicks;
|
|
46
|
+
export declare function Badge({ className, variant, size, radius, asChild, children, iconLeft, iconRight, onIconLeftClick, onIconRightClick, iconLeftAriaLabel, iconRightAriaLabel, ...props }: BadgeProps): import("react/jsx-runtime").JSX.Element;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=badge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../../src/components/badge/badge.tsx"],"names":[],"mappings":"AACA,OAAO,EAAM,KAAK,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAO,KAAK,QAAQ,EAAC,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,OAAO,CAAC;AAG1C,eAAO,MAAM,aAAa;;;;8EAgCzB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC;AAEzE,KAAK,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,GAC1C,YAAY,CAAC,OAAO,aAAa,CAAC,GAAG;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEJ,KAAK,uBAAuB,GAAG,cAAc,GAAG;IAC9C,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAClE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB,gBAAgB,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACpE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,KAAK,wBAAwB,GAAG,cAAc,GAAG;IAC/C,SAAS,EAAE,QAAQ,CAAC;IACpB,gBAAgB,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACnE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,eAAe,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACnE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,KAAK,wBAAwB,GAAG,cAAc,GAAG;IAC/C,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAClE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,QAAQ,CAAC;IACpB,gBAAgB,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACnE,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,KAAK,uBAAuB,GAAG,cAAc,GAAG;IAC9C,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB,eAAe,CAAC,EAAE,KAAK,CAAC;IACxB,gBAAgB,CAAC,EAAE,KAAK,CAAC;IACzB,iBAAiB,CAAC,EAAE,KAAK,CAAC;IAC1B,kBAAkB,CAAC,EAAE,KAAK,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB,uBAAuB,GACvB,wBAAwB,GACxB,wBAAwB,GACxB,uBAAuB,CAAC;AAE5B,wBAAgB,KAAK,CAAC,EACpB,SAAS,EACT,OAAO,EACP,IAAI,EACJ,MAAM,EACN,OAAe,EACf,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,GAAG,KAAK,EACT,EAAE,UAAU,2CA2CZ"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { Icon } from '../../components/icon/index.js';
|
|
5
|
+
import { cn } from '../../utils/cn.js';
|
|
6
|
+
export const badgeVariants = cva('inline-flex select-none items-center justify-center font-medium transition-colors shrink-0 leading-20', {
|
|
7
|
+
variants: {
|
|
8
|
+
variant: {
|
|
9
|
+
neutral: 'bg-tag-neutral-bg text-tag-neutral-text border border-tag-neutral-border hover:bg-tag-neutral-bg-hover',
|
|
10
|
+
info: 'bg-tag-blue-bg text-tag-blue-text border border-tag-blue-border hover:bg-tag-blue-bg-hover',
|
|
11
|
+
feature: 'bg-tag-purple-bg text-tag-purple-text border border-tag-purple-border hover:bg-tag-purple-bg-hover',
|
|
12
|
+
success: 'bg-tag-success-bg text-tag-success-text border border-tag-success-border hover:bg-tag-success-bg-hover',
|
|
13
|
+
warning: 'bg-tag-warning-bg text-tag-warning-text border border-tag-warning-border hover:bg-tag-warning-bg-hover',
|
|
14
|
+
error: 'bg-tag-error-bg text-tag-error-text border border-tag-error-border hover:bg-tag-error-bg-hover'
|
|
15
|
+
},
|
|
16
|
+
size: {
|
|
17
|
+
'2xs': 'h-20 px-6 text-xs gap-4',
|
|
18
|
+
xs: 'h-24 px-8 text-xs gap-6'
|
|
19
|
+
},
|
|
20
|
+
radius: {
|
|
21
|
+
default: 'rounded-6',
|
|
22
|
+
rounded: 'rounded-full'
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
defaultVariants: {
|
|
26
|
+
variant: 'neutral',
|
|
27
|
+
size: '2xs',
|
|
28
|
+
radius: 'default'
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
export function Badge({ className, variant, size, radius, asChild = false, children, iconLeft, iconRight, onIconLeftClick, onIconRightClick, iconLeftAriaLabel, iconRightAriaLabel, ...props }) {
|
|
32
|
+
const Comp = asChild ? Slot : 'span';
|
|
33
|
+
const renderIcon = (iconName, position, onClick, ariaLabel)=>{
|
|
34
|
+
const isInteractive = Boolean(onClick);
|
|
35
|
+
if (isInteractive) {
|
|
36
|
+
if (!ariaLabel) {
|
|
37
|
+
// biome-ignore lint/suspicious/noConsole: Development warning for accessibility
|
|
38
|
+
console.warn(`Badge: Missing aria-label for interactive ${position} icon. Please provide icon${position === 'left' ? 'Left' : 'Right'}AriaLabel prop.`);
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return /*#__PURE__*/ _jsx("button", {
|
|
42
|
+
type: "button",
|
|
43
|
+
onClick: onClick,
|
|
44
|
+
className: "inline-flex items-center justify-center transition-colors shrink-0 hover:opacity-70 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-blue-500",
|
|
45
|
+
"aria-label": ariaLabel,
|
|
46
|
+
children: /*#__PURE__*/ _jsx(Icon, {
|
|
47
|
+
name: iconName,
|
|
48
|
+
className: "size-12"
|
|
49
|
+
})
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return /*#__PURE__*/ _jsx(Icon, {
|
|
53
|
+
name: iconName,
|
|
54
|
+
className: "size-12"
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
return /*#__PURE__*/ _jsxs(Comp, {
|
|
58
|
+
className: cn(badgeVariants({
|
|
59
|
+
variant,
|
|
60
|
+
size,
|
|
61
|
+
radius
|
|
62
|
+
}), className),
|
|
63
|
+
...props,
|
|
64
|
+
children: [
|
|
65
|
+
iconLeft && renderIcon(iconLeft, 'left', onIconLeftClick, iconLeftAriaLabel),
|
|
66
|
+
children,
|
|
67
|
+
iconRight && renderIcon(iconRight, 'right', onIconRightClick, iconRightAriaLabel)
|
|
68
|
+
]
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/badge/badge.tsx"],"sourcesContent":["import {Slot} from '@radix-ui/react-slot';\nimport {cva, type VariantProps} from 'class-variance-authority';\nimport {Icon, type IconName} from 'components/icon';\nimport type {ComponentProps} from 'react';\nimport {cn} from 'utils/cn';\n\nexport const badgeVariants = cva(\n 'inline-flex select-none items-center justify-center font-medium transition-colors shrink-0 leading-20',\n {\n variants: {\n variant: {\n neutral:\n 'bg-tag-neutral-bg text-tag-neutral-text border border-tag-neutral-border hover:bg-tag-neutral-bg-hover',\n info: 'bg-tag-blue-bg text-tag-blue-text border border-tag-blue-border hover:bg-tag-blue-bg-hover',\n feature:\n 'bg-tag-purple-bg text-tag-purple-text border border-tag-purple-border hover:bg-tag-purple-bg-hover',\n success:\n 'bg-tag-success-bg text-tag-success-text border border-tag-success-border hover:bg-tag-success-bg-hover',\n warning:\n 'bg-tag-warning-bg text-tag-warning-text border border-tag-warning-border hover:bg-tag-warning-bg-hover',\n error:\n 'bg-tag-error-bg text-tag-error-text border border-tag-error-border hover:bg-tag-error-bg-hover',\n },\n size: {\n '2xs': 'h-20 px-6 text-xs gap-4',\n xs: 'h-24 px-8 text-xs gap-6',\n },\n radius: {\n default: 'rounded-6',\n rounded: 'rounded-full',\n },\n },\n defaultVariants: {\n variant: 'neutral',\n size: '2xs',\n radius: 'default',\n },\n },\n);\n\nexport type BadgeVariant = VariantProps<typeof badgeVariants>['variant'];\n\ntype BaseBadgeProps = ComponentProps<'span'> &\n VariantProps<typeof badgeVariants> & {\n asChild?: boolean;\n };\n\ntype BadgePropsWithLeftClick = BaseBadgeProps & {\n iconLeft: IconName;\n onIconLeftClick: (e: React.MouseEvent<HTMLButtonElement>) => void;\n iconLeftAriaLabel: string;\n iconRight?: IconName;\n onIconRightClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n iconRightAriaLabel?: string;\n};\n\ntype BadgePropsWithRightClick = BaseBadgeProps & {\n iconRight: IconName;\n onIconRightClick: (e: React.MouseEvent<HTMLButtonElement>) => void;\n iconRightAriaLabel: string;\n iconLeft?: IconName;\n onIconLeftClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n iconLeftAriaLabel?: string;\n};\n\ntype BadgePropsWithBothClicks = BaseBadgeProps & {\n iconLeft: IconName;\n onIconLeftClick: (e: React.MouseEvent<HTMLButtonElement>) => void;\n iconLeftAriaLabel: string;\n iconRight: IconName;\n onIconRightClick: (e: React.MouseEvent<HTMLButtonElement>) => void;\n iconRightAriaLabel: string;\n};\n\ntype BadgePropsWithoutClicks = BaseBadgeProps & {\n iconLeft?: IconName;\n iconRight?: IconName;\n onIconLeftClick?: never;\n onIconRightClick?: never;\n iconLeftAriaLabel?: never;\n iconRightAriaLabel?: never;\n};\n\nexport type BadgeProps =\n | BadgePropsWithLeftClick\n | BadgePropsWithRightClick\n | BadgePropsWithBothClicks\n | BadgePropsWithoutClicks;\n\nexport function Badge({\n className,\n variant,\n size,\n radius,\n asChild = false,\n children,\n iconLeft,\n iconRight,\n onIconLeftClick,\n onIconRightClick,\n iconLeftAriaLabel,\n iconRightAriaLabel,\n ...props\n}: BadgeProps) {\n const Comp = asChild ? Slot : 'span';\n\n const renderIcon = (\n iconName: IconName,\n position: 'left' | 'right',\n onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void,\n ariaLabel?: string,\n ) => {\n const isInteractive = Boolean(onClick);\n\n if (isInteractive) {\n if (!ariaLabel) {\n // biome-ignore lint/suspicious/noConsole: Development warning for accessibility\n console.warn(\n `Badge: Missing aria-label for interactive ${position} icon. Please provide icon${position === 'left' ? 'Left' : 'Right'}AriaLabel prop.`,\n );\n\n return null;\n }\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"inline-flex items-center justify-center transition-colors shrink-0 hover:opacity-70 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-blue-500\"\n aria-label={ariaLabel}\n >\n <Icon name={iconName} className=\"size-12\" />\n </button>\n );\n }\n\n return <Icon name={iconName} className=\"size-12\" />;\n };\n\n return (\n <Comp className={cn(badgeVariants({variant, size, radius}), className)} {...props}>\n {iconLeft && renderIcon(iconLeft, 'left', onIconLeftClick, iconLeftAriaLabel)}\n {children}\n {iconRight && renderIcon(iconRight, 'right', onIconRightClick, iconRightAriaLabel)}\n </Comp>\n );\n}\n"],"names":["Slot","cva","Icon","cn","badgeVariants","variants","variant","neutral","info","feature","success","warning","error","size","xs","radius","default","rounded","defaultVariants","Badge","className","asChild","children","iconLeft","iconRight","onIconLeftClick","onIconRightClick","iconLeftAriaLabel","iconRightAriaLabel","props","Comp","renderIcon","iconName","position","onClick","ariaLabel","isInteractive","Boolean","console","warn","button","type","aria-label","name"],"mappings":";AAAA,SAAQA,IAAI,QAAO,uBAAuB;AAC1C,SAAQC,GAAG,QAA0B,2BAA2B;AAChE,SAAQC,IAAI,QAAsB,kBAAkB;AAEpD,SAAQC,EAAE,QAAO,WAAW;AAE5B,OAAO,MAAMC,gBAAgBH,IAC3B,yGACA;IACEI,UAAU;QACRC,SAAS;YACPC,SACE;YACFC,MAAM;YACNC,SACE;YACFC,SACE;YACFC,SACE;YACFC,OACE;QACJ;QACAC,MAAM;YACJ,OAAO;YACPC,IAAI;QACN;QACAC,QAAQ;YACNC,SAAS;YACTC,SAAS;QACX;IACF;IACAC,iBAAiB;QACfZ,SAAS;QACTO,MAAM;QACNE,QAAQ;IACV;AACF,GACA;AAmDF,OAAO,SAASI,MAAM,EACpBC,SAAS,EACTd,OAAO,EACPO,IAAI,EACJE,MAAM,EACNM,UAAU,KAAK,EACfC,QAAQ,EACRC,QAAQ,EACRC,SAAS,EACTC,eAAe,EACfC,gBAAgB,EAChBC,iBAAiB,EACjBC,kBAAkB,EAClB,GAAGC,OACQ;IACX,MAAMC,OAAOT,UAAUrB,OAAO;IAE9B,MAAM+B,aAAa,CACjBC,UACAC,UACAC,SACAC;QAEA,MAAMC,gBAAgBC,QAAQH;QAE9B,IAAIE,eAAe;YACjB,IAAI,CAACD,WAAW;gBACd,gFAAgF;gBAChFG,QAAQC,IAAI,CACV,CAAC,0CAA0C,EAAEN,SAAS,0BAA0B,EAAEA,aAAa,SAAS,SAAS,QAAQ,eAAe,CAAC;gBAG3I,OAAO;YACT;YAEA,qBACE,KAACO;gBACCC,MAAK;gBACLP,SAASA;gBACTd,WAAU;gBACVsB,cAAYP;0BAEZ,cAAA,KAACjC;oBAAKyC,MAAMX;oBAAUZ,WAAU;;;QAGtC;QAEA,qBAAO,KAAClB;YAAKyC,MAAMX;YAAUZ,WAAU;;IACzC;IAEA,qBACE,MAACU;QAAKV,WAAWjB,GAAGC,cAAc;YAACE;YAASO;YAAME;QAAM,IAAIK;QAAa,GAAGS,KAAK;;YAC9EN,YAAYQ,WAAWR,UAAU,QAAQE,iBAAiBE;YAC1DL;YACAE,aAAaO,WAAWP,WAAW,SAASE,kBAAkBE;;;AAGrE"}
|