@zentauri-ui/zentauri-components 1.0.0 → 1.1.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/README.md CHANGED
@@ -26,29 +26,34 @@ The `<name>` segment matches the folder under `src/ui/` (for example `accordion`
26
26
 
27
27
  Each area is available from the barrel and from its own subpath (`…/ui/<subpath>`):
28
28
 
29
- | Area | Subpath `…/ui/…` |
30
- | ----------- | ---------------- |
31
- | Accordion | `accordion` |
32
- | Alert | `alert` |
33
- | Badge | `badge` |
34
- | Button | `buttons` |
35
- | Card | `card` |
36
- | Divider | `divider` |
37
- | Drawer | `drawer` |
38
- | Dropdown | `dropdown` |
39
- | Empty state | `empty-state` |
40
- | Input | `inputs` |
41
- | Modal | `modal` |
42
- | Pagination | `pagination` |
43
- | Progress | `progress` |
44
- | Select | `select` |
45
- | Skeleton | `skeleton` |
46
- | Spinner | `spinner` |
47
- | Table | `table` |
48
- | Tabs | `tabs` |
49
- | Toast | `toast` |
50
- | Toggle | `toggle` |
51
- | Tooltip | `tooltip` |
29
+ | Area | Subpath `…/ui/…` |
30
+ | -------------- | ---------------- |
31
+ | Accordion | `accordion` |
32
+ | Alert | `alert` |
33
+ | Avatar | `avatar` |
34
+ | Badge | `badge` |
35
+ | Breadcrumb | `breadcrumb` |
36
+ | Button | `buttons` |
37
+ | Card | `card` |
38
+ | Divider | `divider` |
39
+ | Drawer | `drawer` |
40
+ | Dropdown | `dropdown` |
41
+ | Empty state | `empty-state` |
42
+ | File upload | `file-upload` |
43
+ | Input | `inputs` |
44
+ | Modal | `modal` |
45
+ | Pagination | `pagination` |
46
+ | Progress | `progress` |
47
+ | Select | `select` |
48
+ | Skeleton | `skeleton` |
49
+ | Slider | `slider` |
50
+ | Spinner | `spinner` |
51
+ | Stepper | `stepper` |
52
+ | Table | `table` |
53
+ | Tabs | `tabs` |
54
+ | Toast | `toast` |
55
+ | Toggle | `toggle` |
56
+ | Tooltip | `tooltip` |
52
57
 
53
58
  ## Installation
54
59
 
@@ -0,0 +1,59 @@
1
+ import { HTMLMotionProps } from 'framer-motion';
2
+ import * as react_jsx_runtime from 'react/jsx-runtime';
3
+ import { VariantProps } from 'class-variance-authority';
4
+ import { ReactNode, ComponentPropsWithoutRef } from 'react';
5
+ import * as class_variance_authority_types from 'class-variance-authority/types';
6
+
7
+ type AvatarAnimation = "none" | "subtle";
8
+ type AvatarAnimationPresets = Record<AvatarAnimation, Pick<HTMLMotionProps<"span">, "whileHover" | "whileTap" | "transition" | "initial">>;
9
+ declare const avatarAnimationPresets: AvatarAnimationPresets;
10
+
11
+ declare const avatarVariants: (props?: ({
12
+ appearance?: "default" | "muted" | "sky" | "rose" | "purple" | "pink" | "orange" | "yellow" | "teal" | "indigo" | "emerald" | "gray" | "amber" | "violet" | "gradient-blue" | "gradient-green" | "gradient-red" | "gradient-yellow" | "gradient-purple" | "gradient-teal" | "gradient-indigo" | "gradient-pink" | "gradient-orange" | null | undefined;
13
+ size?: "sm" | "md" | "lg" | "xl" | null | undefined;
14
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
15
+ declare const avatarImageVariants: (props?: class_variance_authority_types.ClassProp | undefined) => string;
16
+ declare const avatarFallbackVariants: (props?: class_variance_authority_types.ClassProp | undefined) => string;
17
+ declare const avatarGroupVariants: (props?: class_variance_authority_types.ClassProp | undefined) => string;
18
+
19
+ type AvatarVariantProps = VariantProps<typeof avatarVariants>;
20
+ type AvatarProps = AvatarVariantProps & Omit<HTMLMotionProps<"span">, "children"> & {
21
+ animation?: AvatarAnimation;
22
+ appearance?: AvatarVariantProps["appearance"];
23
+ children?: ReactNode;
24
+ };
25
+ type AvatarImageProps = ComponentPropsWithoutRef<"img">;
26
+ type AvatarFallbackProps = ComponentPropsWithoutRef<"span"> & {
27
+ delayMs?: number;
28
+ };
29
+ type AvatarGroupProps = ComponentPropsWithoutRef<"div"> & {
30
+ /** Max avatars before +N overflow label */
31
+ max?: number;
32
+ };
33
+
34
+ declare function Avatar({ className, size, appearance, animation, children, ref, ...rest }: AvatarProps & {
35
+ ref?: React.Ref<HTMLSpanElement>;
36
+ }): react_jsx_runtime.JSX.Element;
37
+ declare namespace Avatar {
38
+ var displayName: string;
39
+ }
40
+ declare function AvatarImage({ className, onLoad, onError, ref, ...rest }: AvatarImageProps & {
41
+ ref?: React.Ref<HTMLImageElement>;
42
+ }): react_jsx_runtime.JSX.Element;
43
+ declare namespace AvatarImage {
44
+ var displayName: string;
45
+ }
46
+ declare function AvatarFallback({ className, delayMs, ref, ...rest }: AvatarFallbackProps & {
47
+ ref?: React.Ref<HTMLSpanElement>;
48
+ }): react_jsx_runtime.JSX.Element | null;
49
+ declare namespace AvatarFallback {
50
+ var displayName: string;
51
+ }
52
+ declare function AvatarGroup({ className, max, children, ref, ...rest }: AvatarGroupProps & {
53
+ ref?: React.Ref<HTMLDivElement>;
54
+ }): react_jsx_runtime.JSX.Element;
55
+ declare namespace AvatarGroup {
56
+ var displayName: string;
57
+ }
58
+
59
+ export { Avatar, type AvatarAnimation, type AvatarAnimationPresets, AvatarFallback, type AvatarFallbackProps, AvatarGroup, type AvatarGroupProps, AvatarImage, type AvatarImageProps, type AvatarProps, avatarAnimationPresets, avatarFallbackVariants, avatarGroupVariants, avatarImageVariants, avatarVariants };
@@ -0,0 +1,59 @@
1
+ import { HTMLMotionProps } from 'framer-motion';
2
+ import * as react_jsx_runtime from 'react/jsx-runtime';
3
+ import { VariantProps } from 'class-variance-authority';
4
+ import { ReactNode, ComponentPropsWithoutRef } from 'react';
5
+ import * as class_variance_authority_types from 'class-variance-authority/types';
6
+
7
+ type AvatarAnimation = "none" | "subtle";
8
+ type AvatarAnimationPresets = Record<AvatarAnimation, Pick<HTMLMotionProps<"span">, "whileHover" | "whileTap" | "transition" | "initial">>;
9
+ declare const avatarAnimationPresets: AvatarAnimationPresets;
10
+
11
+ declare const avatarVariants: (props?: ({
12
+ appearance?: "default" | "muted" | "sky" | "rose" | "purple" | "pink" | "orange" | "yellow" | "teal" | "indigo" | "emerald" | "gray" | "amber" | "violet" | "gradient-blue" | "gradient-green" | "gradient-red" | "gradient-yellow" | "gradient-purple" | "gradient-teal" | "gradient-indigo" | "gradient-pink" | "gradient-orange" | null | undefined;
13
+ size?: "sm" | "md" | "lg" | "xl" | null | undefined;
14
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
15
+ declare const avatarImageVariants: (props?: class_variance_authority_types.ClassProp | undefined) => string;
16
+ declare const avatarFallbackVariants: (props?: class_variance_authority_types.ClassProp | undefined) => string;
17
+ declare const avatarGroupVariants: (props?: class_variance_authority_types.ClassProp | undefined) => string;
18
+
19
+ type AvatarVariantProps = VariantProps<typeof avatarVariants>;
20
+ type AvatarProps = AvatarVariantProps & Omit<HTMLMotionProps<"span">, "children"> & {
21
+ animation?: AvatarAnimation;
22
+ appearance?: AvatarVariantProps["appearance"];
23
+ children?: ReactNode;
24
+ };
25
+ type AvatarImageProps = ComponentPropsWithoutRef<"img">;
26
+ type AvatarFallbackProps = ComponentPropsWithoutRef<"span"> & {
27
+ delayMs?: number;
28
+ };
29
+ type AvatarGroupProps = ComponentPropsWithoutRef<"div"> & {
30
+ /** Max avatars before +N overflow label */
31
+ max?: number;
32
+ };
33
+
34
+ declare function Avatar({ className, size, appearance, animation, children, ref, ...rest }: AvatarProps & {
35
+ ref?: React.Ref<HTMLSpanElement>;
36
+ }): react_jsx_runtime.JSX.Element;
37
+ declare namespace Avatar {
38
+ var displayName: string;
39
+ }
40
+ declare function AvatarImage({ className, onLoad, onError, ref, ...rest }: AvatarImageProps & {
41
+ ref?: React.Ref<HTMLImageElement>;
42
+ }): react_jsx_runtime.JSX.Element;
43
+ declare namespace AvatarImage {
44
+ var displayName: string;
45
+ }
46
+ declare function AvatarFallback({ className, delayMs, ref, ...rest }: AvatarFallbackProps & {
47
+ ref?: React.Ref<HTMLSpanElement>;
48
+ }): react_jsx_runtime.JSX.Element | null;
49
+ declare namespace AvatarFallback {
50
+ var displayName: string;
51
+ }
52
+ declare function AvatarGroup({ className, max, children, ref, ...rest }: AvatarGroupProps & {
53
+ ref?: React.Ref<HTMLDivElement>;
54
+ }): react_jsx_runtime.JSX.Element;
55
+ declare namespace AvatarGroup {
56
+ var displayName: string;
57
+ }
58
+
59
+ export { Avatar, type AvatarAnimation, type AvatarAnimationPresets, AvatarFallback, type AvatarFallbackProps, AvatarGroup, type AvatarGroupProps, AvatarImage, type AvatarImageProps, type AvatarProps, avatarAnimationPresets, avatarFallbackVariants, avatarGroupVariants, avatarImageVariants, avatarVariants };
@@ -0,0 +1,221 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkWZ2GOU2J_js = require('../chunk-WZ2GOU2J.js');
5
+ var react = require('react');
6
+ var framerMotion = require('framer-motion');
7
+ var classVarianceAuthority = require('class-variance-authority');
8
+ var jsxRuntime = require('react/jsx-runtime');
9
+
10
+ // src/ui/avatar/animations.ts
11
+ var avatarAnimationPresets = {
12
+ none: { initial: false },
13
+ subtle: {
14
+ initial: false,
15
+ whileHover: { scale: 1.03 },
16
+ whileTap: { scale: 0.98 },
17
+ transition: { type: "spring", stiffness: 420, damping: 28 }
18
+ }
19
+ };
20
+ var avatarVariants = classVarianceAuthority.cva(
21
+ "relative flex shrink-0 overflow-hidden rounded-full border border-white/10 bg-white/10 text-slate-200",
22
+ {
23
+ variants: {
24
+ appearance: {
25
+ default: "border-white/10 bg-white/10 text-slate-200",
26
+ muted: "border-black/40 bg-slate-950 dark:border-white/10 dark:bg-slate-950/40 text-slate-200",
27
+ sky: "border-sky-600 bg-sky-600/[0.03] text-slate-200",
28
+ rose: "border-rose-600 bg-rose-600/[0.03] text-slate-200",
29
+ purple: "border-purple-600 bg-purple-600/[0.03] text-slate-200",
30
+ pink: "border-pink-600 bg-pink-600/[0.03] text-slate-200",
31
+ orange: "border-orange-600 bg-orange-600/[0.03] text-slate-200",
32
+ yellow: "border-yellow-600 bg-yellow-600/[0.03] text-slate-200",
33
+ teal: "border-teal-600 bg-teal-600/[0.03] text-slate-200",
34
+ indigo: "border-indigo-600 bg-indigo-600/[0.03] text-slate-200",
35
+ emerald: "border-emerald-600 bg-emerald-600/[0.03] text-slate-200",
36
+ gray: "border-gray-600 bg-gray-600/[0.03] text-slate-200",
37
+ amber: "border-amber-600 bg-amber-600/[0.03] text-slate-200",
38
+ violet: "border-violet-600 bg-violet-600/[0.03] text-slate-200",
39
+ "gradient-blue": "border-gradient-to-r from-blue-600 to-purple-600 bg-gradient-to-r from-blue-950/70 to-purple-950/70 backdrop-blur-xl text-slate-200",
40
+ "gradient-green": "border-gradient-to-r from-green-600 to-lime-600 bg-gradient-to-r from-green-950/70 to-lime-950/70 backdrop-blur-xl text-slate-200",
41
+ "gradient-red": "border-gradient-to-r from-red-600 to-pink-600 bg-gradient-to-r from-red-950/70 to-pink-950/70 backdrop-blur-xl text-slate-200",
42
+ "gradient-yellow": "border-gradient-to-r from-yellow-600 to-orange-600 bg-gradient-to-r from-yellow-950/70 to-orange-950/70 backdrop-blur-xl text-slate-200",
43
+ "gradient-purple": "border-gradient-to-r from-purple-600 to-pink-600 bg-gradient-to-r from-purple-950/70 to-pink-950/70 backdrop-blur-xl text-slate-200",
44
+ "gradient-teal": "border-gradient-to-r from-teal-600 to-cyan-600 bg-gradient-to-r from-teal-950/70 to-cyan-950/70 backdrop-blur-xl text-slate-200",
45
+ "gradient-indigo": "border-gradient-to-r from-indigo-600 to-purple-600 bg-gradient-to-r from-indigo-950/70 to-purple-950/70 backdrop-blur-xl text-slate-200",
46
+ "gradient-pink": "border-gradient-to-r from-pink-600 to-rose-600 bg-gradient-to-r from-pink-950/70 to-rose-950/70 backdrop-blur-xl text-slate-200",
47
+ "gradient-orange": "border-gradient-to-r from-orange-600 to-red-600 bg-gradient-to-r from-orange-950/70 to-red-950/70 backdrop-blur-xl text-slate-200"
48
+ },
49
+ size: {
50
+ sm: "size-8 text-xs",
51
+ md: "size-10 text-sm",
52
+ lg: "size-12 text-base",
53
+ xl: "size-16 text-lg"
54
+ }
55
+ },
56
+ defaultVariants: {
57
+ size: "md",
58
+ appearance: "default"
59
+ }
60
+ }
61
+ );
62
+ var avatarImageVariants = classVarianceAuthority.cva("aspect-square size-full object-cover");
63
+ var avatarFallbackVariants = classVarianceAuthority.cva(
64
+ "flex size-full items-center justify-center bg-slate-800 font-medium text-slate-100"
65
+ );
66
+ var avatarGroupVariants = classVarianceAuthority.cva("flex items-center [&_[data-slot=avatar]]:-ml-2 [&_[data-slot=avatar]]:ring-2 [&_[data-slot=avatar]]:ring-slate-950 [&_[data-slot=avatar]]:first:ml-0");
67
+ var AvatarContext = react.createContext(null);
68
+ function useAvatarContext(component) {
69
+ const ctx = react.useContext(AvatarContext);
70
+ if (!ctx) {
71
+ throw new Error(`${component} must be used within <Avatar>`);
72
+ }
73
+ return ctx;
74
+ }
75
+ function Avatar({
76
+ className,
77
+ size,
78
+ appearance,
79
+ animation = "none",
80
+ children,
81
+ ref,
82
+ ...rest
83
+ }) {
84
+ const [imageStatus, setImageStatus] = react.useState("idle");
85
+ const motionProps = avatarAnimationPresets[animation];
86
+ const ctx = react.useMemo(
87
+ () => ({ imageStatus, setImageStatus }),
88
+ [imageStatus]
89
+ );
90
+ return /* @__PURE__ */ jsxRuntime.jsx(AvatarContext.Provider, { value: ctx, children: /* @__PURE__ */ jsxRuntime.jsx(
91
+ framerMotion.motion.span,
92
+ {
93
+ ref,
94
+ "data-slot": "avatar",
95
+ className: chunkWZ2GOU2J_js.cn(avatarVariants({ size, appearance }), className),
96
+ ...motionProps,
97
+ ...rest,
98
+ children
99
+ }
100
+ ) });
101
+ }
102
+ Avatar.displayName = "Avatar";
103
+ function AvatarImage({
104
+ className,
105
+ onLoad,
106
+ onError,
107
+ ref,
108
+ ...rest
109
+ }) {
110
+ const { setImageStatus } = useAvatarContext("AvatarImage");
111
+ return /* @__PURE__ */ jsxRuntime.jsx(
112
+ "img",
113
+ {
114
+ ref,
115
+ "data-slot": "avatar-image",
116
+ className: chunkWZ2GOU2J_js.cn(avatarImageVariants(), className),
117
+ onLoad: (e) => {
118
+ setImageStatus("loaded");
119
+ onLoad?.(e);
120
+ },
121
+ onError: (e) => {
122
+ setImageStatus("error");
123
+ onError?.(e);
124
+ },
125
+ ...rest
126
+ }
127
+ );
128
+ }
129
+ AvatarImage.displayName = "AvatarImage";
130
+ function AvatarFallback({
131
+ className,
132
+ delayMs = 0,
133
+ ref,
134
+ ...rest
135
+ }) {
136
+ const { imageStatus } = useAvatarContext("AvatarFallback");
137
+ const [show, setShow] = react.useState(delayMs === 0);
138
+ react.useEffect(() => {
139
+ if (imageStatus === "loaded") {
140
+ setShow(false);
141
+ return;
142
+ }
143
+ if (imageStatus === "error") {
144
+ setShow(true);
145
+ return;
146
+ }
147
+ if (delayMs <= 0) {
148
+ setShow(true);
149
+ return;
150
+ }
151
+ const t = window.setTimeout(() => setShow(true), delayMs);
152
+ return () => window.clearTimeout(t);
153
+ }, [delayMs, imageStatus]);
154
+ if (!show) {
155
+ return null;
156
+ }
157
+ return /* @__PURE__ */ jsxRuntime.jsx(
158
+ "span",
159
+ {
160
+ ref,
161
+ "data-slot": "avatar-fallback",
162
+ className: chunkWZ2GOU2J_js.cn(avatarFallbackVariants(), className),
163
+ ...rest
164
+ }
165
+ );
166
+ }
167
+ AvatarFallback.displayName = "AvatarFallback";
168
+ function AvatarGroup({
169
+ className,
170
+ max,
171
+ children,
172
+ ref,
173
+ ...rest
174
+ }) {
175
+ const childArray = react.useMemo(
176
+ () => react.Children.toArray(children).filter(react.isValidElement),
177
+ [children]
178
+ );
179
+ const visible = max !== void 0 ? childArray.slice(0, max) : childArray;
180
+ const overflow = max !== void 0 && childArray.length > max ? childArray.length - max : 0;
181
+ return /* @__PURE__ */ jsxRuntime.jsxs(
182
+ "div",
183
+ {
184
+ ref,
185
+ "data-slot": "avatar-group",
186
+ className: chunkWZ2GOU2J_js.cn(avatarGroupVariants(), className),
187
+ ...rest,
188
+ children: [
189
+ visible,
190
+ overflow > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(
191
+ "span",
192
+ {
193
+ "data-slot": "avatar-group-overflow",
194
+ className: chunkWZ2GOU2J_js.cn(
195
+ avatarVariants({ size: "md" }),
196
+ "z-10 grid place-items-center bg-slate-800 text-xs font-semibold text-white"
197
+ ),
198
+ "aria-label": `${overflow} more`,
199
+ children: [
200
+ "+",
201
+ overflow
202
+ ]
203
+ }
204
+ ) : null
205
+ ]
206
+ }
207
+ );
208
+ }
209
+ AvatarGroup.displayName = "AvatarGroup";
210
+
211
+ exports.Avatar = Avatar;
212
+ exports.AvatarFallback = AvatarFallback;
213
+ exports.AvatarGroup = AvatarGroup;
214
+ exports.AvatarImage = AvatarImage;
215
+ exports.avatarAnimationPresets = avatarAnimationPresets;
216
+ exports.avatarFallbackVariants = avatarFallbackVariants;
217
+ exports.avatarGroupVariants = avatarGroupVariants;
218
+ exports.avatarImageVariants = avatarImageVariants;
219
+ exports.avatarVariants = avatarVariants;
220
+ //# sourceMappingURL=avatar.js.map
221
+ //# sourceMappingURL=avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ui/avatar/animations.ts","../../src/ui/avatar/variants.ts","../../src/ui/avatar/avatar.tsx"],"names":["cva","createContext","useContext","useState","useMemo","jsx","motion","cn","useEffect","Children","isValidElement","jsxs"],"mappings":"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","file":"avatar.js","sourcesContent":["import type { HTMLMotionProps } from \"framer-motion\";\n\nexport type AvatarAnimation = \"none\" | \"subtle\";\n\nexport type AvatarAnimationPresets = Record<\n AvatarAnimation,\n Pick<\n HTMLMotionProps<\"span\">,\n \"whileHover\" | \"whileTap\" | \"transition\" | \"initial\"\n >\n>;\n\nexport const avatarAnimationPresets: AvatarAnimationPresets = {\n none: { initial: false },\n subtle: {\n initial: false,\n whileHover: { scale: 1.03 },\n whileTap: { scale: 0.98 },\n transition: { type: \"spring\", stiffness: 420, damping: 28 },\n },\n};\n","import { cva } from \"class-variance-authority\";\n\nexport const avatarVariants = cva(\n \"relative flex shrink-0 overflow-hidden rounded-full border border-white/10 bg-white/10 text-slate-200\",\n {\n variants: {\n appearance: {\n default: \"border-white/10 bg-white/10 text-slate-200\",\n muted: \"border-black/40 bg-slate-950 dark:border-white/10 dark:bg-slate-950/40 text-slate-200\",\n sky: \"border-sky-600 bg-sky-600/[0.03] text-slate-200\",\n rose: \"border-rose-600 bg-rose-600/[0.03] text-slate-200\",\n purple: \"border-purple-600 bg-purple-600/[0.03] text-slate-200\",\n pink: \"border-pink-600 bg-pink-600/[0.03] text-slate-200\",\n orange: \"border-orange-600 bg-orange-600/[0.03] text-slate-200\",\n yellow: \"border-yellow-600 bg-yellow-600/[0.03] text-slate-200\",\n teal: \"border-teal-600 bg-teal-600/[0.03] text-slate-200\",\n indigo: \"border-indigo-600 bg-indigo-600/[0.03] text-slate-200\",\n emerald: \"border-emerald-600 bg-emerald-600/[0.03] text-slate-200\",\n gray: \"border-gray-600 bg-gray-600/[0.03] text-slate-200\",\n amber: \"border-amber-600 bg-amber-600/[0.03] text-slate-200\",\n violet: \"border-violet-600 bg-violet-600/[0.03] text-slate-200\",\n \"gradient-blue\": \"border-gradient-to-r from-blue-600 to-purple-600 bg-gradient-to-r from-blue-950/70 to-purple-950/70 backdrop-blur-xl text-slate-200\",\n \"gradient-green\": \"border-gradient-to-r from-green-600 to-lime-600 bg-gradient-to-r from-green-950/70 to-lime-950/70 backdrop-blur-xl text-slate-200\",\n \"gradient-red\": \"border-gradient-to-r from-red-600 to-pink-600 bg-gradient-to-r from-red-950/70 to-pink-950/70 backdrop-blur-xl text-slate-200\",\n \"gradient-yellow\": \"border-gradient-to-r from-yellow-600 to-orange-600 bg-gradient-to-r from-yellow-950/70 to-orange-950/70 backdrop-blur-xl text-slate-200\",\n \"gradient-purple\": \"border-gradient-to-r from-purple-600 to-pink-600 bg-gradient-to-r from-purple-950/70 to-pink-950/70 backdrop-blur-xl text-slate-200\",\n \"gradient-teal\": \"border-gradient-to-r from-teal-600 to-cyan-600 bg-gradient-to-r from-teal-950/70 to-cyan-950/70 backdrop-blur-xl text-slate-200\",\n \"gradient-indigo\": \"border-gradient-to-r from-indigo-600 to-purple-600 bg-gradient-to-r from-indigo-950/70 to-purple-950/70 backdrop-blur-xl text-slate-200\",\n \"gradient-pink\": \"border-gradient-to-r from-pink-600 to-rose-600 bg-gradient-to-r from-pink-950/70 to-rose-950/70 backdrop-blur-xl text-slate-200\",\n \"gradient-orange\": \"border-gradient-to-r from-orange-600 to-red-600 bg-gradient-to-r from-orange-950/70 to-red-950/70 backdrop-blur-xl text-slate-200\",\n },\n size: {\n sm: \"size-8 text-xs\",\n md: \"size-10 text-sm\",\n lg: \"size-12 text-base\",\n xl: \"size-16 text-lg\",\n },\n },\n defaultVariants: {\n size: \"md\",\n appearance: \"default\",\n },\n },\n);\n\nexport const avatarImageVariants = cva(\"aspect-square size-full object-cover\");\n\nexport const avatarFallbackVariants = cva(\n \"flex size-full items-center justify-center bg-slate-800 font-medium text-slate-100\",\n);\n\nexport const avatarGroupVariants = cva(\"flex items-center [&_[data-slot=avatar]]:-ml-2 [&_[data-slot=avatar]]:ring-2 [&_[data-slot=avatar]]:ring-slate-950 [&_[data-slot=avatar]]:first:ml-0\");\n","\"use client\";\n\nimport {\n Children,\n createContext,\n isValidElement,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { motion } from \"framer-motion\";\n\nimport { cn } from \"../../lib/utils\";\n\nimport { avatarAnimationPresets } from \"./animations\";\nimport type {\n AvatarFallbackProps,\n AvatarGroupProps,\n AvatarImageProps,\n AvatarProps,\n} from \"./types\";\nimport {\n avatarFallbackVariants,\n avatarGroupVariants,\n avatarImageVariants,\n avatarVariants,\n} from \"./variants\";\n\ntype ImageStatus = \"idle\" | \"loaded\" | \"error\";\n\ntype AvatarCtx = {\n imageStatus: ImageStatus;\n setImageStatus: (v: ImageStatus) => void;\n};\n\nconst AvatarContext = createContext<AvatarCtx | null>(null);\n\nfunction useAvatarContext(component: string): AvatarCtx {\n const ctx = useContext(AvatarContext);\n if (!ctx) {\n throw new Error(`${component} must be used within <Avatar>`);\n }\n return ctx;\n}\n\nexport function Avatar({\n className,\n size,\n appearance,\n animation = \"none\",\n children,\n ref,\n ...rest\n}: AvatarProps & { ref?: React.Ref<HTMLSpanElement> }) {\n const [imageStatus, setImageStatus] = useState<ImageStatus>(\"idle\");\n const motionProps = avatarAnimationPresets[animation];\n const ctx = useMemo(\n () => ({ imageStatus, setImageStatus }),\n [imageStatus],\n );\n\n return (\n <AvatarContext.Provider value={ctx}>\n <motion.span\n ref={ref}\n data-slot=\"avatar\"\n className={cn(avatarVariants({ size, appearance }), className)}\n {...motionProps}\n {...rest}\n >\n {children}\n </motion.span>\n </AvatarContext.Provider>\n );\n}\n\nAvatar.displayName = \"Avatar\";\n\nexport function AvatarImage({\n className,\n onLoad,\n onError,\n ref,\n ...rest\n}: AvatarImageProps & { ref?: React.Ref<HTMLImageElement> }) {\n const { setImageStatus } = useAvatarContext(\"AvatarImage\");\n\n return (\n <img\n ref={ref}\n data-slot=\"avatar-image\"\n className={cn(avatarImageVariants(), className)}\n onLoad={(e) => {\n setImageStatus(\"loaded\");\n onLoad?.(e);\n }}\n onError={(e) => {\n setImageStatus(\"error\");\n onError?.(e);\n }}\n {...rest}\n />\n );\n}\n\nAvatarImage.displayName = \"AvatarImage\";\n\nexport function AvatarFallback({\n className,\n delayMs = 0,\n ref,\n ...rest\n}: AvatarFallbackProps & { ref?: React.Ref<HTMLSpanElement> }) {\n const { imageStatus } = useAvatarContext(\"AvatarFallback\");\n const [show, setShow] = useState(delayMs === 0);\n\n useEffect(() => {\n if (imageStatus === \"loaded\") {\n setShow(false);\n return;\n }\n if (imageStatus === \"error\") {\n setShow(true);\n return;\n }\n if (delayMs <= 0) {\n setShow(true);\n return;\n }\n const t = window.setTimeout(() => setShow(true), delayMs);\n return () => window.clearTimeout(t);\n }, [delayMs, imageStatus]);\n\n if (!show) {\n return null;\n }\n\n return (\n <span\n ref={ref}\n data-slot=\"avatar-fallback\"\n className={cn(avatarFallbackVariants(), className)}\n {...rest}\n />\n );\n}\n\nAvatarFallback.displayName = \"AvatarFallback\";\n\nexport function AvatarGroup({\n className,\n max,\n children,\n ref,\n ...rest\n}: AvatarGroupProps & { ref?: React.Ref<HTMLDivElement> }) {\n const childArray = useMemo(\n () => Children.toArray(children).filter(isValidElement),\n [children],\n );\n const visible = max !== undefined ? childArray.slice(0, max) : childArray;\n const overflow =\n max !== undefined && childArray.length > max\n ? childArray.length - max\n : 0;\n\n return (\n <div\n ref={ref}\n data-slot=\"avatar-group\"\n className={cn(avatarGroupVariants(), className)}\n {...rest}\n >\n {visible}\n {overflow > 0 ? (\n <span\n data-slot=\"avatar-group-overflow\"\n className={cn(\n avatarVariants({ size: \"md\" }),\n \"z-10 grid place-items-center bg-slate-800 text-xs font-semibold text-white\",\n )}\n aria-label={`${overflow} more`}\n >\n +{overflow}\n </span>\n ) : null}\n </div>\n );\n}\n\nAvatarGroup.displayName = \"AvatarGroup\";\n"]}
@@ -0,0 +1,211 @@
1
+ "use client";
2
+ import { cn } from '../chunk-B23TPTVG.mjs';
3
+ import { createContext, useState, useMemo, useEffect, Children, isValidElement, useContext } from 'react';
4
+ import { motion } from 'framer-motion';
5
+ import { cva } from 'class-variance-authority';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+
8
+ // src/ui/avatar/animations.ts
9
+ var avatarAnimationPresets = {
10
+ none: { initial: false },
11
+ subtle: {
12
+ initial: false,
13
+ whileHover: { scale: 1.03 },
14
+ whileTap: { scale: 0.98 },
15
+ transition: { type: "spring", stiffness: 420, damping: 28 }
16
+ }
17
+ };
18
+ var avatarVariants = cva(
19
+ "relative flex shrink-0 overflow-hidden rounded-full border border-white/10 bg-white/10 text-slate-200",
20
+ {
21
+ variants: {
22
+ appearance: {
23
+ default: "border-white/10 bg-white/10 text-slate-200",
24
+ muted: "border-black/40 bg-slate-950 dark:border-white/10 dark:bg-slate-950/40 text-slate-200",
25
+ sky: "border-sky-600 bg-sky-600/[0.03] text-slate-200",
26
+ rose: "border-rose-600 bg-rose-600/[0.03] text-slate-200",
27
+ purple: "border-purple-600 bg-purple-600/[0.03] text-slate-200",
28
+ pink: "border-pink-600 bg-pink-600/[0.03] text-slate-200",
29
+ orange: "border-orange-600 bg-orange-600/[0.03] text-slate-200",
30
+ yellow: "border-yellow-600 bg-yellow-600/[0.03] text-slate-200",
31
+ teal: "border-teal-600 bg-teal-600/[0.03] text-slate-200",
32
+ indigo: "border-indigo-600 bg-indigo-600/[0.03] text-slate-200",
33
+ emerald: "border-emerald-600 bg-emerald-600/[0.03] text-slate-200",
34
+ gray: "border-gray-600 bg-gray-600/[0.03] text-slate-200",
35
+ amber: "border-amber-600 bg-amber-600/[0.03] text-slate-200",
36
+ violet: "border-violet-600 bg-violet-600/[0.03] text-slate-200",
37
+ "gradient-blue": "border-gradient-to-r from-blue-600 to-purple-600 bg-gradient-to-r from-blue-950/70 to-purple-950/70 backdrop-blur-xl text-slate-200",
38
+ "gradient-green": "border-gradient-to-r from-green-600 to-lime-600 bg-gradient-to-r from-green-950/70 to-lime-950/70 backdrop-blur-xl text-slate-200",
39
+ "gradient-red": "border-gradient-to-r from-red-600 to-pink-600 bg-gradient-to-r from-red-950/70 to-pink-950/70 backdrop-blur-xl text-slate-200",
40
+ "gradient-yellow": "border-gradient-to-r from-yellow-600 to-orange-600 bg-gradient-to-r from-yellow-950/70 to-orange-950/70 backdrop-blur-xl text-slate-200",
41
+ "gradient-purple": "border-gradient-to-r from-purple-600 to-pink-600 bg-gradient-to-r from-purple-950/70 to-pink-950/70 backdrop-blur-xl text-slate-200",
42
+ "gradient-teal": "border-gradient-to-r from-teal-600 to-cyan-600 bg-gradient-to-r from-teal-950/70 to-cyan-950/70 backdrop-blur-xl text-slate-200",
43
+ "gradient-indigo": "border-gradient-to-r from-indigo-600 to-purple-600 bg-gradient-to-r from-indigo-950/70 to-purple-950/70 backdrop-blur-xl text-slate-200",
44
+ "gradient-pink": "border-gradient-to-r from-pink-600 to-rose-600 bg-gradient-to-r from-pink-950/70 to-rose-950/70 backdrop-blur-xl text-slate-200",
45
+ "gradient-orange": "border-gradient-to-r from-orange-600 to-red-600 bg-gradient-to-r from-orange-950/70 to-red-950/70 backdrop-blur-xl text-slate-200"
46
+ },
47
+ size: {
48
+ sm: "size-8 text-xs",
49
+ md: "size-10 text-sm",
50
+ lg: "size-12 text-base",
51
+ xl: "size-16 text-lg"
52
+ }
53
+ },
54
+ defaultVariants: {
55
+ size: "md",
56
+ appearance: "default"
57
+ }
58
+ }
59
+ );
60
+ var avatarImageVariants = cva("aspect-square size-full object-cover");
61
+ var avatarFallbackVariants = cva(
62
+ "flex size-full items-center justify-center bg-slate-800 font-medium text-slate-100"
63
+ );
64
+ var avatarGroupVariants = cva("flex items-center [&_[data-slot=avatar]]:-ml-2 [&_[data-slot=avatar]]:ring-2 [&_[data-slot=avatar]]:ring-slate-950 [&_[data-slot=avatar]]:first:ml-0");
65
+ var AvatarContext = createContext(null);
66
+ function useAvatarContext(component) {
67
+ const ctx = useContext(AvatarContext);
68
+ if (!ctx) {
69
+ throw new Error(`${component} must be used within <Avatar>`);
70
+ }
71
+ return ctx;
72
+ }
73
+ function Avatar({
74
+ className,
75
+ size,
76
+ appearance,
77
+ animation = "none",
78
+ children,
79
+ ref,
80
+ ...rest
81
+ }) {
82
+ const [imageStatus, setImageStatus] = useState("idle");
83
+ const motionProps = avatarAnimationPresets[animation];
84
+ const ctx = useMemo(
85
+ () => ({ imageStatus, setImageStatus }),
86
+ [imageStatus]
87
+ );
88
+ return /* @__PURE__ */ jsx(AvatarContext.Provider, { value: ctx, children: /* @__PURE__ */ jsx(
89
+ motion.span,
90
+ {
91
+ ref,
92
+ "data-slot": "avatar",
93
+ className: cn(avatarVariants({ size, appearance }), className),
94
+ ...motionProps,
95
+ ...rest,
96
+ children
97
+ }
98
+ ) });
99
+ }
100
+ Avatar.displayName = "Avatar";
101
+ function AvatarImage({
102
+ className,
103
+ onLoad,
104
+ onError,
105
+ ref,
106
+ ...rest
107
+ }) {
108
+ const { setImageStatus } = useAvatarContext("AvatarImage");
109
+ return /* @__PURE__ */ jsx(
110
+ "img",
111
+ {
112
+ ref,
113
+ "data-slot": "avatar-image",
114
+ className: cn(avatarImageVariants(), className),
115
+ onLoad: (e) => {
116
+ setImageStatus("loaded");
117
+ onLoad?.(e);
118
+ },
119
+ onError: (e) => {
120
+ setImageStatus("error");
121
+ onError?.(e);
122
+ },
123
+ ...rest
124
+ }
125
+ );
126
+ }
127
+ AvatarImage.displayName = "AvatarImage";
128
+ function AvatarFallback({
129
+ className,
130
+ delayMs = 0,
131
+ ref,
132
+ ...rest
133
+ }) {
134
+ const { imageStatus } = useAvatarContext("AvatarFallback");
135
+ const [show, setShow] = useState(delayMs === 0);
136
+ useEffect(() => {
137
+ if (imageStatus === "loaded") {
138
+ setShow(false);
139
+ return;
140
+ }
141
+ if (imageStatus === "error") {
142
+ setShow(true);
143
+ return;
144
+ }
145
+ if (delayMs <= 0) {
146
+ setShow(true);
147
+ return;
148
+ }
149
+ const t = window.setTimeout(() => setShow(true), delayMs);
150
+ return () => window.clearTimeout(t);
151
+ }, [delayMs, imageStatus]);
152
+ if (!show) {
153
+ return null;
154
+ }
155
+ return /* @__PURE__ */ jsx(
156
+ "span",
157
+ {
158
+ ref,
159
+ "data-slot": "avatar-fallback",
160
+ className: cn(avatarFallbackVariants(), className),
161
+ ...rest
162
+ }
163
+ );
164
+ }
165
+ AvatarFallback.displayName = "AvatarFallback";
166
+ function AvatarGroup({
167
+ className,
168
+ max,
169
+ children,
170
+ ref,
171
+ ...rest
172
+ }) {
173
+ const childArray = useMemo(
174
+ () => Children.toArray(children).filter(isValidElement),
175
+ [children]
176
+ );
177
+ const visible = max !== void 0 ? childArray.slice(0, max) : childArray;
178
+ const overflow = max !== void 0 && childArray.length > max ? childArray.length - max : 0;
179
+ return /* @__PURE__ */ jsxs(
180
+ "div",
181
+ {
182
+ ref,
183
+ "data-slot": "avatar-group",
184
+ className: cn(avatarGroupVariants(), className),
185
+ ...rest,
186
+ children: [
187
+ visible,
188
+ overflow > 0 ? /* @__PURE__ */ jsxs(
189
+ "span",
190
+ {
191
+ "data-slot": "avatar-group-overflow",
192
+ className: cn(
193
+ avatarVariants({ size: "md" }),
194
+ "z-10 grid place-items-center bg-slate-800 text-xs font-semibold text-white"
195
+ ),
196
+ "aria-label": `${overflow} more`,
197
+ children: [
198
+ "+",
199
+ overflow
200
+ ]
201
+ }
202
+ ) : null
203
+ ]
204
+ }
205
+ );
206
+ }
207
+ AvatarGroup.displayName = "AvatarGroup";
208
+
209
+ export { Avatar, AvatarFallback, AvatarGroup, AvatarImage, avatarAnimationPresets, avatarFallbackVariants, avatarGroupVariants, avatarImageVariants, avatarVariants };
210
+ //# sourceMappingURL=avatar.mjs.map
211
+ //# sourceMappingURL=avatar.mjs.map