saha-ui 1.21.0 → 1.22.1

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.
@@ -6,7 +6,7 @@ declare const aspectRatioVariants: (props?: ({
6
6
  * Overlay gradient variants
7
7
  */
8
8
  declare const overlayVariants: (props?: ({
9
- position?: "top" | "left" | "center" | "right" | "bottom" | null | undefined;
9
+ position?: "top" | "left" | "right" | "bottom" | "center" | null | undefined;
10
10
  } & import('class-variance-authority/types').ClassProp) | undefined) => string;
11
11
  export { aspectRatioVariants, overlayVariants };
12
12
  //# sourceMappingURL=AspectRatio.styles.d.ts.map
@@ -2,16 +2,32 @@ import { default as React } from 'react';
2
2
  export type AvatarSize = "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
3
3
  export type AvatarShape = "circle" | "square" | "rounded";
4
4
  export type AvatarStatus = "online" | "offline" | "away" | "busy" | "none";
5
+ /**
6
+ * Avatar props - supports both compound component pattern and legacy props pattern
7
+ *
8
+ * Compound pattern:
9
+ * <Avatar>
10
+ * <AvatarImage src="..." alt="..." />
11
+ * <AvatarFallback>JB</AvatarFallback>
12
+ * </Avatar>
13
+ *
14
+ * Legacy pattern:
15
+ * <Avatar src="..." alt="..." initials="JB" />
16
+ */
5
17
  export interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {
6
18
  /**
7
- * Image source URL
19
+ * Image source URL (legacy pattern)
8
20
  */
9
- src: string;
21
+ src?: string;
10
22
  /**
11
- * Alt text for accessibility
23
+ * Alt text for accessibility (legacy pattern)
12
24
  * @default "Avatar"
13
25
  */
14
26
  alt?: string;
27
+ /**
28
+ * Fallback content (e.g., initials) to display when image fails to load (legacy pattern)
29
+ */
30
+ fallback?: string;
15
31
  /**
16
32
  * Size of the avatar
17
33
  * @default "md"
@@ -27,10 +43,6 @@ export interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {
27
43
  * @default "none"
28
44
  */
29
45
  status?: AvatarStatus;
30
- /**
31
- * Initials to display when image fails to load
32
- */
33
- initials?: string;
34
46
  /**
35
47
  * Whether to show a border
36
48
  * @default false
@@ -41,5 +53,40 @@ export interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {
41
53
  * @default false
42
54
  */
43
55
  ring?: boolean;
56
+ /**
57
+ * Children elements (AvatarImage, AvatarFallback) for compound pattern
58
+ */
59
+ children?: React.ReactNode;
60
+ }
61
+ /**
62
+ * Avatar image props
63
+ */
64
+ export interface AvatarImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {
65
+ /**
66
+ * Image source URL
67
+ */
68
+ src?: string;
69
+ /**
70
+ * Alt text for accessibility
71
+ */
72
+ alt?: string;
73
+ /**
74
+ * Callback when image fails to load
75
+ */
76
+ onLoadingStatusChange?: (status: "loading" | "loaded" | "error") => void;
77
+ }
78
+ /**
79
+ * Avatar fallback props
80
+ */
81
+ export interface AvatarFallbackProps extends React.HTMLAttributes<HTMLSpanElement> {
82
+ /**
83
+ * Delay before showing fallback (ms)
84
+ * @default 0
85
+ */
86
+ delayMs?: number;
87
+ /**
88
+ * Children content (typically initials)
89
+ */
90
+ children?: React.ReactNode;
44
91
  }
45
92
  //# sourceMappingURL=Avatar.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar.types.d.ts","sourceRoot":"","sources":["../../../src/components/Avatar/Avatar.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;AAClE,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3E,MAAM,WAAW,WAAY,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACvE;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAElB;;;OAGG;IACH,KAAK,CAAC,EAAE,WAAW,CAAC;IAEpB;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB"}
1
+ {"version":3,"file":"Avatar.types.d.ts","sourceRoot":"","sources":["../../../src/components/Avatar/Avatar.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;AAClE,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3E;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,WAAY,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACvE;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAElB;;;OAGG;IACH,KAAK,CAAC,EAAE,WAAW,CAAC;IAEpB;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,gBACf,SAAQ,KAAK,CAAC,iBAAiB,CAAC,gBAAgB,CAAC;IACjD;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,qBAAqB,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,KAAK,IAAI,CAAC;CAC1E;AAED;;GAEG;AACH,MAAM,WAAW,mBACf,SAAQ,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC;IAC7C;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B"}
@@ -1,5 +1,29 @@
1
1
  import { default as React } from 'react';
2
- import { AvatarProps } from './Avatar.types';
2
+ import { AvatarProps, AvatarImageProps, AvatarFallbackProps } from './Avatar.types';
3
+ /**
4
+ * Avatar Component
5
+ * Supports both compound component pattern and legacy props pattern
6
+ *
7
+ * Compound pattern:
8
+ * <Avatar>
9
+ * <AvatarImage src="..." alt="..." />
10
+ * <AvatarFallback>JB</AvatarFallback>
11
+ * </Avatar>
12
+ *
13
+ * Legacy pattern:
14
+ * <Avatar src="..." alt="..." initials="JB" />
15
+ */
3
16
  declare const Avatar: React.ForwardRefExoticComponent<AvatarProps & React.RefAttributes<HTMLDivElement>>;
17
+ /**
18
+ * AvatarImage Component
19
+ * Displays the avatar image with loading state handling
20
+ */
21
+ declare const AvatarImage: React.ForwardRefExoticComponent<AvatarImageProps & React.RefAttributes<HTMLImageElement>>;
22
+ /**
23
+ * AvatarFallback Component
24
+ * Displays fallback content when image fails or is loading
25
+ */
26
+ declare const AvatarFallback: React.ForwardRefExoticComponent<AvatarFallbackProps & React.RefAttributes<HTMLSpanElement>>;
4
27
  export default Avatar;
28
+ export { Avatar, AvatarImage, AvatarFallback };
5
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Avatar/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI7C,QAAA,MAAM,MAAM,oFA+EX,CAAC;AAIF,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Avatar/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAyD,MAAM,OAAO,CAAC;AAE9E,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAiBxB;;;;;;;;;;;;GAYG;AACH,QAAA,MAAM,MAAM,oFAoHX,CAAC;AAIF;;;GAGG;AACH,QAAA,MAAM,WAAW,2FA4DhB,CAAC;AAIF;;;GAGG;AACH,QAAA,MAAM,cAAc,6FAwDnB,CAAC;AAIF,eAAe,MAAM,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC"}
@@ -1,70 +1,166 @@
1
- import { jsxs as l, jsx as a, Fragment as N } from "react/jsx-runtime";
2
- import x from "react";
3
- import { cn as e } from "../../lib/utils.js";
4
- import { statusVariants as y, avatarVariants as A } from "./Avatar.styles.js";
5
- import { useAvatar as j } from "../../hooks/useAvatar.js";
6
- const k = x.forwardRef(
1
+ import { jsxs as h, jsx as e, Fragment as L } from "react/jsx-runtime";
2
+ import p, { createContext as F, useState as w, useEffect as S, useContext as T } from "react";
3
+ import { cn as d } from "../../lib/utils.js";
4
+ import { statusVariants as N, avatarVariants as A } from "./Avatar.styles.js";
5
+ import { useAvatar as B } from "../../hooks/useAvatar.js";
6
+ const k = F(null), I = () => T(k), P = p.forwardRef(
7
7
  ({
8
- src: o,
9
- alt: r = "Avatar",
10
- size: i = "md",
11
- shape: m = "circle",
12
- status: n = "none",
13
- initials: c,
14
- bordered: d = !1,
15
- ring: f = !1,
16
- className: p,
17
- ...h
18
- }, u) => {
19
- const {
20
- showInitials: t,
21
- bgColor: v,
22
- initialsText: g,
23
- imageLoaded: s,
24
- handleImageLoad: b,
25
- handleImageError: w
26
- } = j({
27
- src: o,
28
- alt: r,
29
- initials: c
8
+ src: t,
9
+ alt: c = "Avatar",
10
+ fallback: i,
11
+ size: a = "md",
12
+ shape: u = "circle",
13
+ status: o = "none",
14
+ bordered: r = !1,
15
+ ring: s = !1,
16
+ className: l,
17
+ children: m,
18
+ ...n
19
+ }, f) => {
20
+ const [g, v] = w("loading"), y = t !== void 0 || i !== void 0 && !m, {
21
+ showInitials: b,
22
+ bgColor: C,
23
+ initialsText: R,
24
+ imageLoaded: x,
25
+ handleImageLoad: j,
26
+ handleImageError: E
27
+ } = B({
28
+ src: t,
29
+ alt: c,
30
+ initials: i
30
31
  });
31
- return /* @__PURE__ */ l(
32
+ return y ? /* @__PURE__ */ h(
32
33
  "div",
33
34
  {
34
- ref: u,
35
- className: e(
36
- A({ size: i, shape: m, bordered: d, ring: f }),
37
- t && v,
38
- t && "text-white",
39
- p
35
+ ref: f,
36
+ className: d(
37
+ A({ size: a, shape: u, bordered: r, ring: s }),
38
+ b && C,
39
+ b && "text-white",
40
+ l
40
41
  ),
41
- ...h,
42
+ ...n,
42
43
  children: [
43
- !t && /* @__PURE__ */ l(N, { children: [
44
- /* @__PURE__ */ a(
44
+ !b && t && /* @__PURE__ */ h(L, { children: [
45
+ /* @__PURE__ */ e(
45
46
  "img",
46
47
  {
47
- src: o,
48
- alt: r,
49
- className: e(
48
+ src: t,
49
+ alt: c,
50
+ className: d(
50
51
  "w-full h-full object-cover transition-opacity duration-300",
51
- s ? "opacity-100" : "opacity-0"
52
+ x ? "opacity-100" : "opacity-0"
52
53
  ),
53
- onLoad: b,
54
- onError: w
54
+ onLoad: j,
55
+ onError: E
55
56
  }
56
57
  ),
57
- !s && /* @__PURE__ */ a("div", { className: "absolute inset-0 bg-muted animate-pulse" })
58
+ !x && /* @__PURE__ */ e("div", { className: "absolute inset-0 bg-muted animate-pulse" })
58
59
  ] }),
59
- t && /* @__PURE__ */ a("span", { className: "relative z-10 font-bold tracking-tight", children: g }),
60
- n !== "none" && /* @__PURE__ */ a("span", { className: e(y({ size: i, status: n })) }),
61
- /* @__PURE__ */ a("div", { className: "absolute inset-0 bg-gradient-to-br from-white/0 via-white/0 to-black/0 group-hover:from-white/10 group-hover:to-black/5 transition-all duration-300 pointer-events-none" })
60
+ b && /* @__PURE__ */ e("span", { className: "relative z-10 font-bold tracking-tight", children: R }),
61
+ o !== "none" && /* @__PURE__ */ e("span", { className: d(N({ size: a, status: o })) }),
62
+ /* @__PURE__ */ e("div", { className: "absolute inset-0 bg-gradient-to-br from-white/0 via-white/0 to-black/0 group-hover:from-white/10 group-hover:to-black/5 transition-all duration-300 pointer-events-none" })
62
63
  ]
63
64
  }
65
+ ) : /* @__PURE__ */ e(
66
+ k.Provider,
67
+ {
68
+ value: { imageLoadingStatus: g, setImageLoadingStatus: v },
69
+ children: /* @__PURE__ */ h(
70
+ "div",
71
+ {
72
+ ref: f,
73
+ className: d(
74
+ A({ size: a, shape: u, bordered: r, ring: s }),
75
+ l
76
+ ),
77
+ ...n,
78
+ children: [
79
+ m,
80
+ o !== "none" && /* @__PURE__ */ e("span", { className: d(N({ size: a, status: o })) }),
81
+ /* @__PURE__ */ e("div", { className: "absolute inset-0 bg-gradient-to-br from-white/0 via-white/0 to-black/0 group-hover:from-white/10 group-hover:to-black/5 transition-all duration-300 pointer-events-none" })
82
+ ]
83
+ }
84
+ )
85
+ }
64
86
  );
65
87
  }
66
88
  );
67
- k.displayName = "Avatar";
89
+ P.displayName = "Avatar";
90
+ const V = p.forwardRef(
91
+ ({ src: t, alt: c = "Avatar", className: i, onLoadingStatusChange: a, ...u }, o) => {
92
+ const r = I(), [s, l] = w("loading"), m = () => {
93
+ l("loaded"), r?.setImageLoadingStatus("loaded"), a?.("loaded");
94
+ }, n = () => {
95
+ l("error"), r?.setImageLoadingStatus("error"), a?.("error");
96
+ };
97
+ return S(() => {
98
+ t ? (l("loading"), r?.setImageLoadingStatus("loading"), a?.("loading")) : (l("error"), r?.setImageLoadingStatus("error"));
99
+ }, [t]), !t || s === "error" ? null : /* @__PURE__ */ h(L, { children: [
100
+ /* @__PURE__ */ e(
101
+ "img",
102
+ {
103
+ ref: o,
104
+ src: t,
105
+ alt: c,
106
+ className: d(
107
+ "w-full h-full object-cover transition-opacity duration-300",
108
+ s === "loaded" ? "opacity-100" : "opacity-0",
109
+ i
110
+ ),
111
+ onLoad: m,
112
+ onError: n,
113
+ ...u
114
+ }
115
+ ),
116
+ s === "loading" && /* @__PURE__ */ e("div", { className: "absolute inset-0 bg-muted animate-pulse" })
117
+ ] });
118
+ }
119
+ );
120
+ V.displayName = "AvatarImage";
121
+ const _ = p.forwardRef(
122
+ ({ delayMs: t = 0, className: c, children: i, ...a }, u) => {
123
+ const o = I(), [r, s] = w(t === 0);
124
+ return S(() => {
125
+ if (t > 0) {
126
+ const n = setTimeout(() => s(!0), t);
127
+ return () => clearTimeout(n);
128
+ }
129
+ }, [t]), r && (!o || o.imageLoadingStatus === "error") ? /* @__PURE__ */ e(
130
+ "span",
131
+ {
132
+ ref: u,
133
+ className: d(
134
+ "absolute inset-0 flex items-center justify-center font-bold tracking-tight text-white",
135
+ (() => {
136
+ if (!i) return "bg-muted";
137
+ const n = String(i), f = [
138
+ "bg-red-500",
139
+ "bg-blue-500",
140
+ "bg-green-500",
141
+ "bg-purple-500",
142
+ "bg-pink-500",
143
+ "bg-indigo-500",
144
+ "bg-cyan-500",
145
+ "bg-orange-500"
146
+ ];
147
+ let g = 0;
148
+ for (let v = 0; v < n.length; v++)
149
+ g = n.charCodeAt(v) + ((g << 5) - g);
150
+ return f[Math.abs(g) % f.length];
151
+ })(),
152
+ c
153
+ ),
154
+ ...a,
155
+ children: i
156
+ }
157
+ ) : null;
158
+ }
159
+ );
160
+ _.displayName = "AvatarFallback";
68
161
  export {
69
- k as default
162
+ P as Avatar,
163
+ _ as AvatarFallback,
164
+ V as AvatarImage,
165
+ P as default
70
166
  };
@@ -56,7 +56,7 @@ export declare const formSectionTitleVariants: (props?: ({
56
56
  * Form actions variants
57
57
  */
58
58
  export declare const formActionsVariants: (props?: ({
59
- align?: "left" | "center" | "right" | "between" | null | undefined;
59
+ align?: "left" | "right" | "center" | "between" | null | undefined;
60
60
  variant?: "error" | "primary" | "secondary" | "success" | "warning" | "info" | "default" | "glass" | "accent" | "outline" | null | undefined;
61
61
  } & import('class-variance-authority/types').ClassProp) | undefined) => string;
62
62
  //# sourceMappingURL=Form.styles.d.ts.map
@@ -10,7 +10,7 @@ declare const tableHeaderVariants: (props?: ({
10
10
  } & import('class-variance-authority/types').ClassProp) | undefined) => string;
11
11
  declare const tableCellVariants: (props?: ({
12
12
  density?: "normal" | "compact" | "comfortable" | null | undefined;
13
- align?: "left" | "center" | "right" | null | undefined;
13
+ align?: "left" | "right" | "center" | null | undefined;
14
14
  } & import('class-variance-authority/types').ClassProp) | undefined) => string;
15
15
  declare const tableRowVariants: (props?: ({
16
16
  hoverable?: boolean | null | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ThemeToggle/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAI3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAYvD,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAqUlD,CAAC;AAEF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ThemeToggle/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAI3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAYvD,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAkZlD,CAAC;AAEF,eAAe,WAAW,CAAC"}