asterui 0.12.31 → 0.12.32
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/dist/components/Badge.d.ts +24 -5
- package/dist/components/Badge.js +209 -122
- package/dist/components/Badge.js.map +1 -1
- package/dist/components/Carousel.d.ts +47 -6
- package/dist/components/Carousel.js +202 -5
- package/dist/components/Carousel.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/package.json +1 -1
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
2
|
export type BadgePosition = 'top-start' | 'top-center' | 'top-end' | 'middle-start' | 'middle-center' | 'middle-end' | 'bottom-start' | 'bottom-center' | 'bottom-end';
|
|
3
3
|
export type BadgeStatus = 'success' | 'processing' | 'error' | 'default' | 'warning';
|
|
4
|
+
export type BadgeType = 'default' | 'primary' | 'secondary' | 'accent' | 'neutral' | 'info' | 'success' | 'warning' | 'error';
|
|
5
|
+
export type BadgeVariant = 'solid' | 'outline' | 'dash' | 'soft' | 'ghost';
|
|
6
|
+
export type BadgeSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
4
7
|
export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
5
8
|
count?: number;
|
|
6
9
|
showZero?: boolean;
|
|
@@ -9,12 +12,28 @@ export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
|
9
12
|
offset?: [number, number];
|
|
10
13
|
status?: BadgeStatus;
|
|
11
14
|
text?: string;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
type?: BadgeType;
|
|
16
|
+
size?: BadgeSize;
|
|
17
|
+
variant?: BadgeVariant;
|
|
18
|
+
color?: string;
|
|
16
19
|
dot?: boolean;
|
|
20
|
+
/** @deprecated Use variant="outline" instead */
|
|
17
21
|
outline?: boolean;
|
|
22
|
+
'data-testid'?: string;
|
|
18
23
|
children?: React.ReactNode;
|
|
19
24
|
}
|
|
20
|
-
|
|
25
|
+
declare const BadgeInner: React.ForwardRefExoticComponent<BadgeProps & React.RefAttributes<HTMLSpanElement>>;
|
|
26
|
+
export interface BadgeRibbonProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
27
|
+
text: string;
|
|
28
|
+
placement?: 'start' | 'end';
|
|
29
|
+
color?: string;
|
|
30
|
+
type?: BadgeType;
|
|
31
|
+
'data-testid'?: string;
|
|
32
|
+
children: React.ReactNode;
|
|
33
|
+
}
|
|
34
|
+
declare const BadgeRibbon: React.ForwardRefExoticComponent<BadgeRibbonProps & React.RefAttributes<HTMLDivElement>>;
|
|
35
|
+
type BadgeComponent = typeof BadgeInner & {
|
|
36
|
+
Ribbon: typeof BadgeRibbon;
|
|
37
|
+
};
|
|
38
|
+
export declare const Badge: BadgeComponent;
|
|
39
|
+
export {};
|
package/dist/components/Badge.js
CHANGED
|
@@ -1,133 +1,220 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
1
|
+
import { jsxs as C, jsx as l } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as j } from "react";
|
|
3
|
+
const w = {
|
|
4
|
+
default: "",
|
|
5
|
+
primary: "badge-primary",
|
|
6
|
+
secondary: "badge-secondary",
|
|
7
|
+
accent: "badge-accent",
|
|
8
|
+
neutral: "badge-neutral",
|
|
9
|
+
info: "badge-info",
|
|
10
|
+
success: "badge-success",
|
|
11
|
+
warning: "badge-warning",
|
|
12
|
+
error: "badge-error"
|
|
13
|
+
}, $ = {
|
|
14
|
+
xs: "badge-xs",
|
|
15
|
+
sm: "badge-sm",
|
|
16
|
+
md: "badge-md",
|
|
17
|
+
lg: "badge-lg",
|
|
18
|
+
xl: "badge-xl"
|
|
19
|
+
}, N = {
|
|
20
|
+
solid: "",
|
|
21
|
+
outline: "badge-outline",
|
|
22
|
+
dash: "badge-dash",
|
|
23
|
+
soft: "badge-soft",
|
|
24
|
+
ghost: "badge-ghost"
|
|
25
|
+
}, P = {
|
|
26
|
+
success: "success",
|
|
27
|
+
processing: "info",
|
|
28
|
+
error: "error",
|
|
29
|
+
warning: "warning",
|
|
30
|
+
default: "neutral"
|
|
31
|
+
}, V = (s) => {
|
|
32
|
+
const [a, o] = s.split("-"), e = [];
|
|
33
|
+
switch (a) {
|
|
34
|
+
case "top":
|
|
35
|
+
e.push("indicator-top");
|
|
36
|
+
break;
|
|
37
|
+
case "middle":
|
|
38
|
+
e.push("indicator-middle");
|
|
39
|
+
break;
|
|
40
|
+
case "bottom":
|
|
41
|
+
e.push("indicator-bottom");
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
switch (o) {
|
|
45
|
+
case "start":
|
|
46
|
+
e.push("indicator-start");
|
|
47
|
+
break;
|
|
48
|
+
case "center":
|
|
49
|
+
e.push("indicator-center");
|
|
50
|
+
break;
|
|
51
|
+
case "end":
|
|
52
|
+
e.push("indicator-end");
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
return e.join(" ");
|
|
56
|
+
}, R = j(
|
|
57
|
+
({
|
|
58
|
+
children: s,
|
|
59
|
+
count: a,
|
|
60
|
+
showZero: o = !1,
|
|
61
|
+
overflowCount: e = 99,
|
|
62
|
+
position: g = "top-end",
|
|
63
|
+
offset: r,
|
|
64
|
+
status: t,
|
|
65
|
+
text: d,
|
|
66
|
+
type: b = "error",
|
|
67
|
+
size: p = "md",
|
|
68
|
+
variant: u = "solid",
|
|
69
|
+
color: i,
|
|
70
|
+
dot: c = !1,
|
|
71
|
+
outline: T = !1,
|
|
72
|
+
className: m = "",
|
|
73
|
+
"data-testid": n,
|
|
74
|
+
...f
|
|
75
|
+
}, y) => {
|
|
76
|
+
const k = T ? "outline" : u, B = () => a === void 0 ? null : a > e ? `${e}+` : a, z = a !== void 0 && (a > 0 || o) || c, h = i ? { backgroundColor: i } : void 0;
|
|
77
|
+
if (t && !s) {
|
|
78
|
+
const x = P[t];
|
|
79
|
+
return /* @__PURE__ */ C(
|
|
72
80
|
"span",
|
|
73
81
|
{
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
82
|
+
ref: y,
|
|
83
|
+
role: "status",
|
|
84
|
+
"aria-label": d || t,
|
|
85
|
+
className: `inline-flex items-center gap-2 ${m}`,
|
|
86
|
+
"data-testid": n,
|
|
87
|
+
"data-status": t,
|
|
88
|
+
...f,
|
|
89
|
+
children: [
|
|
90
|
+
/* @__PURE__ */ l(
|
|
91
|
+
"span",
|
|
92
|
+
{
|
|
93
|
+
className: [
|
|
94
|
+
"badge badge-xs w-2 h-2 p-0",
|
|
95
|
+
w[x],
|
|
96
|
+
t === "processing" && "animate-pulse"
|
|
97
|
+
].filter(Boolean).join(" "),
|
|
98
|
+
"data-testid": n ? `${n}-dot` : void 0
|
|
99
|
+
}
|
|
100
|
+
),
|
|
101
|
+
d && /* @__PURE__ */ l("span", { className: "text-sm", children: d })
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
if (s) {
|
|
107
|
+
const x = r ? { transform: `translate(${r[0]}px, ${r[1]}px)`, ...h } : h, v = B(), M = c ? "New notification" : v !== null ? `${v} notifications` : void 0;
|
|
108
|
+
return /* @__PURE__ */ C(
|
|
109
|
+
"div",
|
|
110
|
+
{
|
|
111
|
+
ref: y,
|
|
112
|
+
className: `indicator inline-block ${m}`,
|
|
113
|
+
"data-testid": n,
|
|
114
|
+
...f,
|
|
115
|
+
children: [
|
|
116
|
+
z && /* @__PURE__ */ l(
|
|
117
|
+
"span",
|
|
118
|
+
{
|
|
119
|
+
role: "status",
|
|
120
|
+
"aria-label": M,
|
|
121
|
+
className: [
|
|
122
|
+
"indicator-item badge",
|
|
123
|
+
V(g),
|
|
124
|
+
!i && w[b],
|
|
125
|
+
c ? "badge-xs p-0 w-2 h-2" : $[p],
|
|
126
|
+
N[k]
|
|
127
|
+
].filter(Boolean).join(" "),
|
|
128
|
+
style: x,
|
|
129
|
+
"data-testid": n ? `${n}-indicator` : void 0,
|
|
130
|
+
"data-count": a,
|
|
131
|
+
"data-dot": c || void 0,
|
|
132
|
+
children: !c && v
|
|
133
|
+
}
|
|
134
|
+
),
|
|
135
|
+
s
|
|
136
|
+
]
|
|
79
137
|
}
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
const D = [
|
|
141
|
+
"badge",
|
|
142
|
+
!i && w[b],
|
|
143
|
+
$[p],
|
|
144
|
+
N[k],
|
|
145
|
+
m
|
|
146
|
+
].filter(Boolean).join(" "), L = B();
|
|
147
|
+
return /* @__PURE__ */ l(
|
|
148
|
+
"span",
|
|
149
|
+
{
|
|
150
|
+
ref: y,
|
|
151
|
+
className: D,
|
|
152
|
+
style: h,
|
|
153
|
+
"data-testid": n,
|
|
154
|
+
...f,
|
|
155
|
+
children: L
|
|
156
|
+
}
|
|
157
|
+
);
|
|
83
158
|
}
|
|
84
|
-
|
|
85
|
-
|
|
159
|
+
);
|
|
160
|
+
R.displayName = "Badge";
|
|
161
|
+
const S = j(
|
|
162
|
+
({
|
|
163
|
+
children: s,
|
|
164
|
+
text: a,
|
|
165
|
+
placement: o = "end",
|
|
166
|
+
color: e,
|
|
167
|
+
type: g = "primary",
|
|
168
|
+
className: r = "",
|
|
169
|
+
"data-testid": t,
|
|
170
|
+
...d
|
|
171
|
+
}, b) => {
|
|
172
|
+
const u = [
|
|
86
173
|
"absolute",
|
|
87
|
-
|
|
174
|
+
o === "start" ? "-left-1 top-2" : "-right-1 top-2",
|
|
88
175
|
"px-2 py-0.5",
|
|
89
|
-
"text-xs font-semibold
|
|
90
|
-
|
|
176
|
+
"text-xs font-semibold",
|
|
177
|
+
!e && {
|
|
178
|
+
default: "bg-base-300 text-base-content",
|
|
179
|
+
primary: "bg-primary text-primary-content",
|
|
180
|
+
secondary: "bg-secondary text-secondary-content",
|
|
181
|
+
accent: "bg-accent text-accent-content",
|
|
182
|
+
neutral: "bg-neutral text-neutral-content",
|
|
183
|
+
info: "bg-info text-info-content",
|
|
184
|
+
success: "bg-success text-success-content",
|
|
185
|
+
warning: "bg-warning text-warning-content",
|
|
186
|
+
error: "bg-error text-error-content"
|
|
187
|
+
}[g],
|
|
91
188
|
"shadow-sm",
|
|
92
|
-
|
|
93
|
-
].join(" ");
|
|
94
|
-
return /* @__PURE__ */
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
children: !c && w()
|
|
116
|
-
}
|
|
117
|
-
),
|
|
118
|
-
a
|
|
119
|
-
] });
|
|
189
|
+
o === "start" ? "rounded-r" : "rounded-l"
|
|
190
|
+
].filter(Boolean).join(" "), i = e ? { backgroundColor: e } : void 0;
|
|
191
|
+
return /* @__PURE__ */ C(
|
|
192
|
+
"div",
|
|
193
|
+
{
|
|
194
|
+
ref: b,
|
|
195
|
+
className: `relative inline-block overflow-visible ${r}`,
|
|
196
|
+
"data-testid": t,
|
|
197
|
+
...d,
|
|
198
|
+
children: [
|
|
199
|
+
s,
|
|
200
|
+
/* @__PURE__ */ l(
|
|
201
|
+
"div",
|
|
202
|
+
{
|
|
203
|
+
className: u,
|
|
204
|
+
style: i,
|
|
205
|
+
"data-testid": t ? `${t}-ribbon` : void 0,
|
|
206
|
+
children: a
|
|
207
|
+
}
|
|
208
|
+
)
|
|
209
|
+
]
|
|
210
|
+
}
|
|
211
|
+
);
|
|
120
212
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
x && "badge-outline",
|
|
126
|
-
t
|
|
127
|
-
].filter(Boolean).join(" "), N = w();
|
|
128
|
-
return /* @__PURE__ */ r("span", { className: B, ...i, children: N });
|
|
129
|
-
};
|
|
213
|
+
);
|
|
214
|
+
S.displayName = "Badge.Ribbon";
|
|
215
|
+
const q = R;
|
|
216
|
+
q.Ribbon = S;
|
|
130
217
|
export {
|
|
131
|
-
|
|
218
|
+
q as Badge
|
|
132
219
|
};
|
|
133
220
|
//# sourceMappingURL=Badge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Badge.js","sources":["../../src/components/Badge.tsx"],"sourcesContent":["import React from 'react'\n\nexport type BadgePosition =\n | 'top-start'\n | 'top-center'\n | 'top-end'\n | 'middle-start'\n | 'middle-center'\n | 'middle-end'\n | 'bottom-start'\n | 'bottom-center'\n | 'bottom-end'\n\nexport type BadgeStatus = 'success' | 'processing' | 'error' | 'default' | 'warning'\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n // Count mode\n count?: number\n showZero?: boolean\n overflowCount?: number\n\n // Positioning (when wrapping children)\n position?: BadgePosition\n offset?: [number, number]\n\n // Status mode\n status?: BadgeStatus\n text?: string\n\n // Ribbon mode\n ribbon?: string\n ribbonPlacement?: 'start' | 'end'\n\n // Visual\n type?: 'default' | 'primary' | 'secondary' | 'accent' | 'neutral' | 'info' | 'success' | 'warning' | 'error' | 'ghost'\n size?: 'xs' | 'sm' | 'md' | 'lg'\n dot?: boolean\n outline?: boolean\n\n // Content\n children?: React.ReactNode\n}\n\nexport const Badge: React.FC<BadgeProps> = ({\n children,\n count,\n showZero = false,\n overflowCount = 99,\n position = 'top-end',\n offset,\n status,\n text,\n ribbon,\n ribbonPlacement = 'end',\n type = 'error',\n size = 'md',\n dot = false,\n outline = false,\n className = '',\n ...rest\n}) => {\n const typeClasses = {\n default: '',\n primary: 'badge-primary',\n secondary: 'badge-secondary',\n accent: 'badge-accent',\n neutral: 'badge-neutral',\n info: 'badge-info',\n success: 'badge-success',\n warning: 'badge-warning',\n error: 'badge-error',\n ghost: 'badge-ghost',\n }\n\n const sizeClasses = {\n xs: 'badge-xs',\n sm: 'badge-sm',\n md: 'badge-md',\n lg: 'badge-lg',\n }\n\n const statusTypeMap: Record<BadgeStatus, typeof type> = {\n success: 'success',\n processing: 'info',\n error: 'error',\n warning: 'warning',\n default: 'neutral',\n }\n\n // Get position classes for indicator\n const getPositionClasses = (pos: BadgePosition) => {\n const [vertical, horizontal] = pos.split('-')\n const classes: string[] = []\n\n switch (vertical) {\n case 'top':\n classes.push('indicator-top')\n break\n case 'middle':\n classes.push('indicator-middle')\n break\n case 'bottom':\n classes.push('indicator-bottom')\n break\n }\n\n switch (horizontal) {\n case 'start':\n classes.push('indicator-start')\n break\n case 'center':\n classes.push('indicator-center')\n break\n case 'end':\n classes.push('indicator-end')\n break\n }\n\n return classes.join(' ')\n }\n\n // Calculate display count with overflow\n const getDisplayCount = () => {\n if (count === undefined) return null\n if (count > overflowCount) return `${overflowCount}+`\n return count\n }\n\n const shouldShowBadge = count !== undefined && (count > 0 || showZero) || dot\n\n // Status badge mode (standalone with status indicator)\n if (status && !children) {\n const statusType = statusTypeMap[status]\n return (\n <span className={`inline-flex items-center gap-2 ${className}`} {...rest}>\n <span\n className={[\n 'badge badge-xs w-2 h-2 p-0',\n typeClasses[statusType],\n status === 'processing' && 'animate-pulse',\n ]\n .filter(Boolean)\n .join(' ')}\n />\n {text && <span className=\"text-sm\">{text}</span>}\n </span>\n )\n }\n\n // Ribbon mode\n if (ribbon && children) {\n const ribbonClasses = [\n 'absolute',\n ribbonPlacement === 'start' ? '-left-1 top-2' : '-right-1 top-2',\n 'px-2 py-0.5',\n 'text-xs font-semibold text-white',\n 'bg-primary',\n 'shadow-sm',\n ribbonPlacement === 'start' ? 'rounded-r' : 'rounded-l',\n ].join(' ')\n\n return (\n <div className={`relative inline-block ${className}`} {...rest}>\n {children}\n <div className={ribbonClasses}>{ribbon}</div>\n </div>\n )\n }\n\n // Notification badge mode (wrapping children)\n if (children) {\n const offsetStyle =\n offset\n ? {\n transform: `translate(${offset[0]}px, ${offset[1]}px)`,\n }\n : undefined\n\n return (\n <div className={`indicator inline-block ${className}`} {...rest}>\n {shouldShowBadge && (\n <span\n className={[\n 'indicator-item badge',\n getPositionClasses(position),\n typeClasses[type],\n dot ? 'badge-xs p-0 w-2 h-2' : sizeClasses[size],\n outline && 'badge-outline',\n ]\n .filter(Boolean)\n .join(' ')}\n style={offsetStyle}\n >\n {!dot && getDisplayCount()}\n </span>\n )}\n {children}\n </div>\n )\n }\n\n // Standalone badge mode (like a label)\n const badgeClasses = [\n 'badge',\n typeClasses[type],\n sizeClasses[size],\n outline && 'badge-outline',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const displayContent = getDisplayCount()\n\n return <span className={badgeClasses} {...rest}>{displayContent}</span>\n}\n"],"names":["Badge","children","count","showZero","overflowCount","position","offset","status","text","ribbon","ribbonPlacement","type","size","dot","outline","className","rest","typeClasses","sizeClasses","statusTypeMap","getPositionClasses","pos","vertical","horizontal","classes","getDisplayCount","shouldShowBadge","statusType","jsx","ribbonClasses","offsetStyle","badgeClasses","displayContent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Badge.js","sources":["../../src/components/Badge.tsx"],"sourcesContent":["import React, { forwardRef } from 'react'\n\nexport type BadgePosition =\n | 'top-start'\n | 'top-center'\n | 'top-end'\n | 'middle-start'\n | 'middle-center'\n | 'middle-end'\n | 'bottom-start'\n | 'bottom-center'\n | 'bottom-end'\n\nexport type BadgeStatus = 'success' | 'processing' | 'error' | 'default' | 'warning'\n\nexport type BadgeType =\n | 'default'\n | 'primary'\n | 'secondary'\n | 'accent'\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'error'\n\nexport type BadgeVariant = 'solid' | 'outline' | 'dash' | 'soft' | 'ghost'\n\nexport type BadgeSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n // Count mode\n count?: number\n showZero?: boolean\n overflowCount?: number\n\n // Positioning (when wrapping children)\n position?: BadgePosition\n offset?: [number, number]\n\n // Status mode\n status?: BadgeStatus\n text?: string\n\n // Visual\n type?: BadgeType\n size?: BadgeSize\n variant?: BadgeVariant\n color?: string\n dot?: boolean\n /** @deprecated Use variant=\"outline\" instead */\n outline?: boolean\n\n // Testing\n 'data-testid'?: string\n\n // Content\n children?: React.ReactNode\n}\n\nconst typeClasses: Record<BadgeType, string> = {\n default: '',\n primary: 'badge-primary',\n secondary: 'badge-secondary',\n accent: 'badge-accent',\n neutral: 'badge-neutral',\n info: 'badge-info',\n success: 'badge-success',\n warning: 'badge-warning',\n error: 'badge-error',\n}\n\nconst sizeClasses: Record<BadgeSize, string> = {\n xs: 'badge-xs',\n sm: 'badge-sm',\n md: 'badge-md',\n lg: 'badge-lg',\n xl: 'badge-xl',\n}\n\nconst variantClasses: Record<BadgeVariant, string> = {\n solid: '',\n outline: 'badge-outline',\n dash: 'badge-dash',\n soft: 'badge-soft',\n ghost: 'badge-ghost',\n}\n\nconst statusTypeMap: Record<BadgeStatus, BadgeType> = {\n success: 'success',\n processing: 'info',\n error: 'error',\n warning: 'warning',\n default: 'neutral',\n}\n\n// Get position classes for indicator\nconst getPositionClasses = (pos: BadgePosition): string => {\n const [vertical, horizontal] = pos.split('-')\n const classes: string[] = []\n\n switch (vertical) {\n case 'top':\n classes.push('indicator-top')\n break\n case 'middle':\n classes.push('indicator-middle')\n break\n case 'bottom':\n classes.push('indicator-bottom')\n break\n }\n\n switch (horizontal) {\n case 'start':\n classes.push('indicator-start')\n break\n case 'center':\n classes.push('indicator-center')\n break\n case 'end':\n classes.push('indicator-end')\n break\n }\n\n return classes.join(' ')\n}\n\nconst BadgeInner = forwardRef<HTMLSpanElement, BadgeProps>(\n (\n {\n children,\n count,\n showZero = false,\n overflowCount = 99,\n position = 'top-end',\n offset,\n status,\n text,\n type = 'error',\n size = 'md',\n variant = 'solid',\n color,\n dot = false,\n outline = false,\n className = '',\n 'data-testid': testId,\n ...rest\n },\n ref\n ) => {\n // Resolve variant (support deprecated outline prop)\n const resolvedVariant = outline ? 'outline' : variant\n\n // Calculate display count with overflow\n const getDisplayCount = () => {\n if (count === undefined) return null\n if (count > overflowCount) return `${overflowCount}+`\n return count\n }\n\n const shouldShowBadge = (count !== undefined && (count > 0 || showZero)) || dot\n\n // Custom color style\n const colorStyle = color ? { backgroundColor: color } : undefined\n\n // Status badge mode (standalone with status indicator)\n if (status && !children) {\n const statusType = statusTypeMap[status]\n return (\n <span\n ref={ref}\n role=\"status\"\n aria-label={text || status}\n className={`inline-flex items-center gap-2 ${className}`}\n data-testid={testId}\n data-status={status}\n {...rest}\n >\n <span\n className={[\n 'badge badge-xs w-2 h-2 p-0',\n typeClasses[statusType],\n status === 'processing' && 'animate-pulse',\n ]\n .filter(Boolean)\n .join(' ')}\n data-testid={testId ? `${testId}-dot` : undefined}\n />\n {text && <span className=\"text-sm\">{text}</span>}\n </span>\n )\n }\n\n // Notification badge mode (wrapping children)\n if (children) {\n const offsetStyle = offset\n ? { transform: `translate(${offset[0]}px, ${offset[1]}px)`, ...colorStyle }\n : colorStyle\n\n const displayCount = getDisplayCount()\n const ariaLabel =\n dot ? 'New notification' : displayCount !== null ? `${displayCount} notifications` : undefined\n\n return (\n <div\n ref={ref as React.Ref<HTMLDivElement>}\n className={`indicator inline-block ${className}`}\n data-testid={testId}\n {...rest}\n >\n {shouldShowBadge && (\n <span\n role=\"status\"\n aria-label={ariaLabel}\n className={[\n 'indicator-item badge',\n getPositionClasses(position),\n !color && typeClasses[type],\n dot ? 'badge-xs p-0 w-2 h-2' : sizeClasses[size],\n variantClasses[resolvedVariant],\n ]\n .filter(Boolean)\n .join(' ')}\n style={offsetStyle}\n data-testid={testId ? `${testId}-indicator` : undefined}\n data-count={count}\n data-dot={dot || undefined}\n >\n {!dot && displayCount}\n </span>\n )}\n {children}\n </div>\n )\n }\n\n // Standalone badge mode (like a label)\n const badgeClasses = [\n 'badge',\n !color && typeClasses[type],\n sizeClasses[size],\n variantClasses[resolvedVariant],\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const displayContent = getDisplayCount()\n\n return (\n <span\n ref={ref}\n className={badgeClasses}\n style={colorStyle}\n data-testid={testId}\n {...rest}\n >\n {displayContent}\n </span>\n )\n }\n)\n\nBadgeInner.displayName = 'Badge'\n\n// Badge.Ribbon compound component\nexport interface BadgeRibbonProps extends React.HTMLAttributes<HTMLDivElement> {\n text: string\n placement?: 'start' | 'end'\n color?: string\n type?: BadgeType\n 'data-testid'?: string\n children: React.ReactNode\n}\n\nconst BadgeRibbon = forwardRef<HTMLDivElement, BadgeRibbonProps>(\n (\n {\n children,\n text,\n placement = 'end',\n color,\n type = 'primary',\n className = '',\n 'data-testid': testId,\n ...rest\n },\n ref\n ) => {\n const ribbonTypeClasses: Record<BadgeType, string> = {\n default: 'bg-base-300 text-base-content',\n primary: 'bg-primary text-primary-content',\n secondary: 'bg-secondary text-secondary-content',\n accent: 'bg-accent text-accent-content',\n neutral: 'bg-neutral text-neutral-content',\n info: 'bg-info text-info-content',\n success: 'bg-success text-success-content',\n warning: 'bg-warning text-warning-content',\n error: 'bg-error text-error-content',\n }\n\n const ribbonClasses = [\n 'absolute',\n placement === 'start' ? '-left-1 top-2' : '-right-1 top-2',\n 'px-2 py-0.5',\n 'text-xs font-semibold',\n !color && ribbonTypeClasses[type],\n 'shadow-sm',\n placement === 'start' ? 'rounded-r' : 'rounded-l',\n ]\n .filter(Boolean)\n .join(' ')\n\n const colorStyle = color ? { backgroundColor: color } : undefined\n\n return (\n <div\n ref={ref}\n className={`relative inline-block overflow-visible ${className}`}\n data-testid={testId}\n {...rest}\n >\n {children}\n <div\n className={ribbonClasses}\n style={colorStyle}\n data-testid={testId ? `${testId}-ribbon` : undefined}\n >\n {text}\n </div>\n </div>\n )\n }\n)\n\nBadgeRibbon.displayName = 'Badge.Ribbon'\n\n// Compound component type\ntype BadgeComponent = typeof BadgeInner & {\n Ribbon: typeof BadgeRibbon\n}\n\nexport const Badge = BadgeInner as BadgeComponent\nBadge.Ribbon = BadgeRibbon\n"],"names":["typeClasses","sizeClasses","variantClasses","statusTypeMap","getPositionClasses","pos","vertical","horizontal","classes","BadgeInner","forwardRef","children","count","showZero","overflowCount","position","offset","status","text","type","size","variant","color","dot","outline","className","testId","rest","ref","resolvedVariant","getDisplayCount","shouldShowBadge","colorStyle","statusType","jsxs","jsx","offsetStyle","displayCount","ariaLabel","badgeClasses","displayContent","BadgeRibbon","placement","ribbonClasses","Badge"],"mappings":"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"}
|
|
@@ -1,14 +1,55 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
|
+
export type CarouselEffect = 'scrollx' | 'fade';
|
|
3
|
+
export type CarouselDotPlacement = 'top' | 'bottom' | 'start' | 'end';
|
|
4
|
+
export interface CarouselRef {
|
|
5
|
+
goTo: (index: number, animate?: boolean) => void;
|
|
6
|
+
next: () => void;
|
|
7
|
+
prev: () => void;
|
|
8
|
+
}
|
|
2
9
|
export interface CarouselItemProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
3
|
-
|
|
10
|
+
'data-testid'?: string;
|
|
4
11
|
children: React.ReactNode;
|
|
5
12
|
}
|
|
6
|
-
|
|
7
|
-
export interface CarouselProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
13
|
+
declare const CarouselItemComponent: React.ForwardRefExoticComponent<CarouselItemProps & React.RefAttributes<HTMLDivElement>>;
|
|
14
|
+
export interface CarouselProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
|
|
15
|
+
/** Carousel slides */
|
|
8
16
|
children: React.ReactNode;
|
|
9
|
-
|
|
17
|
+
/** Current slide index (controlled mode) */
|
|
18
|
+
activeIndex?: number;
|
|
19
|
+
/** Default slide index (uncontrolled mode) */
|
|
20
|
+
defaultActiveIndex?: number;
|
|
21
|
+
/** Auto-advance slides */
|
|
22
|
+
autoplay?: boolean;
|
|
23
|
+
/** Autoplay interval in milliseconds */
|
|
24
|
+
autoplaySpeed?: number;
|
|
25
|
+
/** Animation duration in milliseconds */
|
|
26
|
+
speed?: number;
|
|
27
|
+
/** Show prev/next navigation arrows */
|
|
28
|
+
arrows?: boolean;
|
|
29
|
+
/** Show slide indicator dots */
|
|
30
|
+
dots?: boolean | {
|
|
31
|
+
className?: string;
|
|
32
|
+
};
|
|
33
|
+
/** Position of indicator dots */
|
|
34
|
+
dotPlacement?: CarouselDotPlacement;
|
|
35
|
+
/** Transition effect */
|
|
36
|
+
effect?: CarouselEffect;
|
|
37
|
+
/** Enable infinite looping */
|
|
38
|
+
infinite?: boolean;
|
|
39
|
+
/** Pause autoplay on hover */
|
|
40
|
+
pauseOnHover?: boolean;
|
|
41
|
+
/** Vertical carousel orientation */
|
|
10
42
|
vertical?: boolean;
|
|
43
|
+
/** Callback before slide change */
|
|
44
|
+
beforeChange?: (current: number, next: number) => void;
|
|
45
|
+
/** Callback after slide change */
|
|
46
|
+
afterChange?: (current: number) => void;
|
|
47
|
+
/** Test ID for testing */
|
|
48
|
+
'data-testid'?: string;
|
|
11
49
|
}
|
|
12
|
-
|
|
13
|
-
|
|
50
|
+
declare const CarouselComponent: React.ForwardRefExoticComponent<CarouselProps & React.RefAttributes<CarouselRef>>;
|
|
51
|
+
type CarouselType = typeof CarouselComponent & {
|
|
52
|
+
Item: typeof CarouselItemComponent;
|
|
14
53
|
};
|
|
54
|
+
export declare const Carousel: CarouselType;
|
|
55
|
+
export {};
|
|
@@ -1,8 +1,205 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { jsxs as R, jsx as i, Fragment as ae } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as T, useState as D, useRef as L, Children as re, isValidElement as ne, useCallback as y, useImperativeHandle as ie, useEffect as ce, cloneElement as ue } from "react";
|
|
3
|
+
const z = T(
|
|
4
|
+
({ children: g, className: b = "", "data-testid": w, ...c }, p) => /* @__PURE__ */ i(
|
|
5
|
+
"div",
|
|
6
|
+
{
|
|
7
|
+
ref: p,
|
|
8
|
+
role: "group",
|
|
9
|
+
"aria-roledescription": "slide",
|
|
10
|
+
className: `carousel-item w-full flex-shrink-0 ${b}`,
|
|
11
|
+
"data-testid": w,
|
|
12
|
+
...c,
|
|
13
|
+
children: g
|
|
14
|
+
}
|
|
15
|
+
)
|
|
16
|
+
);
|
|
17
|
+
z.displayName = "Carousel.Item";
|
|
18
|
+
const B = T(
|
|
19
|
+
({
|
|
20
|
+
children: g,
|
|
21
|
+
activeIndex: b,
|
|
22
|
+
defaultActiveIndex: w = 0,
|
|
23
|
+
autoplay: c = !1,
|
|
24
|
+
autoplaySpeed: p = 3e3,
|
|
25
|
+
speed: h = 500,
|
|
26
|
+
arrows: K = !0,
|
|
27
|
+
dots: d = !0,
|
|
28
|
+
dotPlacement: F = "bottom",
|
|
29
|
+
effect: $ = "scrollx",
|
|
30
|
+
infinite: v = !0,
|
|
31
|
+
pauseOnHover: I = !0,
|
|
32
|
+
vertical: a = !1,
|
|
33
|
+
beforeChange: A,
|
|
34
|
+
afterChange: x,
|
|
35
|
+
className: G = "",
|
|
36
|
+
"data-testid": r,
|
|
37
|
+
...U
|
|
38
|
+
}, V) => {
|
|
39
|
+
const C = b !== void 0, [X, Y] = D(w), o = C ? b : X, [S, E] = D(!1), [M, j] = D(!1), _ = L(null), k = L(null), N = re.toArray(g).filter(ne), l = N.length, u = y(
|
|
40
|
+
(e, t = !0) => {
|
|
41
|
+
if (M || l === 0) return;
|
|
42
|
+
let s = e;
|
|
43
|
+
v ? s = (e % l + l) % l : s = Math.max(0, Math.min(e, l - 1)), s !== o && (A?.(o, s), t ? (j(!0), setTimeout(() => {
|
|
44
|
+
j(!1), x?.(s);
|
|
45
|
+
}, h)) : x?.(s), C || Y(s));
|
|
46
|
+
},
|
|
47
|
+
[o, l, v, C, A, x, h, M]
|
|
48
|
+
), n = y(() => {
|
|
49
|
+
u(o + 1);
|
|
50
|
+
}, [u, o]), f = y(() => {
|
|
51
|
+
u(o - 1);
|
|
52
|
+
}, [u, o]);
|
|
53
|
+
ie(V, () => ({
|
|
54
|
+
goTo: (e, t = !0) => u(e, t),
|
|
55
|
+
next: n,
|
|
56
|
+
prev: f
|
|
57
|
+
})), ce(() => (c && !S && l > 1 && (k.current = setInterval(() => {
|
|
58
|
+
n();
|
|
59
|
+
}, p)), () => {
|
|
60
|
+
k.current && clearInterval(k.current);
|
|
61
|
+
}), [c, S, p, n, l]);
|
|
62
|
+
const q = y(
|
|
63
|
+
(e) => {
|
|
64
|
+
a ? e.key === "ArrowUp" ? (e.preventDefault(), f()) : e.key === "ArrowDown" && (e.preventDefault(), n()) : e.key === "ArrowLeft" ? (e.preventDefault(), f()) : e.key === "ArrowRight" && (e.preventDefault(), n());
|
|
65
|
+
},
|
|
66
|
+
[a, f, n]
|
|
67
|
+
), H = () => {
|
|
68
|
+
I && c && E(!0);
|
|
69
|
+
}, J = () => {
|
|
70
|
+
I && c && E(!1);
|
|
71
|
+
}, Q = [
|
|
72
|
+
"carousel",
|
|
73
|
+
a ? "carousel-vertical" : "",
|
|
74
|
+
G
|
|
75
|
+
].filter(Boolean).join(" "), W = (e) => $ === "fade" ? {
|
|
76
|
+
position: e === 0 ? "relative" : "absolute",
|
|
77
|
+
top: 0,
|
|
78
|
+
left: 0,
|
|
79
|
+
opacity: e === o ? 1 : 0,
|
|
80
|
+
transition: `opacity ${h}ms ease-in-out`,
|
|
81
|
+
zIndex: e === o ? 1 : 0
|
|
82
|
+
} : {}, Z = $ === "scrollx" ? {
|
|
83
|
+
display: "flex",
|
|
84
|
+
flexDirection: a ? "column" : "row",
|
|
85
|
+
transform: a ? `translateY(-${o * 100}%)` : `translateX(-${o * 100}%)`,
|
|
86
|
+
transition: `transform ${h}ms ease-in-out`,
|
|
87
|
+
height: a ? "100%" : void 0
|
|
88
|
+
} : {
|
|
89
|
+
position: "relative",
|
|
90
|
+
width: "100%",
|
|
91
|
+
height: "100%"
|
|
92
|
+
}, O = () => a ? { height: "100%", flexShrink: 0 } : {}, ee = {
|
|
93
|
+
top: "top-2 left-1/2 -translate-x-1/2 flex-row",
|
|
94
|
+
bottom: "bottom-2 left-1/2 -translate-x-1/2 flex-row",
|
|
95
|
+
start: "left-2 top-1/2 -translate-y-1/2 flex-col",
|
|
96
|
+
end: "right-2 top-1/2 -translate-y-1/2 flex-col"
|
|
97
|
+
}, te = d === !0 || typeof d == "object" && d !== null, oe = typeof d == "object" ? d.className : "", P = ({
|
|
98
|
+
direction: e,
|
|
99
|
+
onClick: t,
|
|
100
|
+
disabled: s
|
|
101
|
+
}) => {
|
|
102
|
+
const m = e === "prev", le = a ? m ? "top-2 left-1/2 -translate-x-1/2" : "bottom-2 left-1/2 -translate-x-1/2" : m ? "left-2 top-1/2 -translate-y-1/2" : "right-2 top-1/2 -translate-y-1/2", se = a ? m ? "▲" : "▼" : m ? "❮" : "❯";
|
|
103
|
+
return /* @__PURE__ */ i(
|
|
104
|
+
"button",
|
|
105
|
+
{
|
|
106
|
+
type: "button",
|
|
107
|
+
onClick: t,
|
|
108
|
+
disabled: s,
|
|
109
|
+
"aria-label": m ? "Previous slide" : "Next slide",
|
|
110
|
+
className: `absolute ${le} btn btn-circle btn-sm bg-base-100/80 hover:bg-base-100 border-none shadow-md z-10 disabled:opacity-50 disabled:cursor-not-allowed`,
|
|
111
|
+
"data-testid": r ? `${r}-${e}` : void 0,
|
|
112
|
+
children: se
|
|
113
|
+
}
|
|
114
|
+
);
|
|
115
|
+
};
|
|
116
|
+
return /* @__PURE__ */ R(
|
|
117
|
+
"div",
|
|
118
|
+
{
|
|
119
|
+
ref: _,
|
|
120
|
+
role: "region",
|
|
121
|
+
"aria-roledescription": "carousel",
|
|
122
|
+
"aria-label": "Image carousel",
|
|
123
|
+
tabIndex: 0,
|
|
124
|
+
onKeyDown: q,
|
|
125
|
+
onMouseEnter: H,
|
|
126
|
+
onMouseLeave: J,
|
|
127
|
+
className: `relative overflow-hidden focus:outline-none focus-visible:ring-2 focus-visible:ring-primary ${Q}`,
|
|
128
|
+
"data-testid": r,
|
|
129
|
+
"data-active-index": o,
|
|
130
|
+
...U,
|
|
131
|
+
children: [
|
|
132
|
+
/* @__PURE__ */ i(
|
|
133
|
+
"div",
|
|
134
|
+
{
|
|
135
|
+
className: $ === "fade" ? "relative w-full h-full" : a ? "h-full" : "",
|
|
136
|
+
style: Z,
|
|
137
|
+
"aria-live": "polite",
|
|
138
|
+
children: N.map((e, t) => {
|
|
139
|
+
const s = e;
|
|
140
|
+
return ue(s, {
|
|
141
|
+
key: t,
|
|
142
|
+
"aria-hidden": t !== o,
|
|
143
|
+
"aria-label": `Slide ${t + 1} of ${l}`,
|
|
144
|
+
style: {
|
|
145
|
+
...s.props.style,
|
|
146
|
+
...O(),
|
|
147
|
+
...W(t)
|
|
148
|
+
},
|
|
149
|
+
"data-testid": r ? `${r}-slide-${t}` : void 0
|
|
150
|
+
});
|
|
151
|
+
})
|
|
152
|
+
}
|
|
153
|
+
),
|
|
154
|
+
K && l > 1 && /* @__PURE__ */ R(ae, { children: [
|
|
155
|
+
/* @__PURE__ */ i(
|
|
156
|
+
P,
|
|
157
|
+
{
|
|
158
|
+
direction: "prev",
|
|
159
|
+
onClick: f,
|
|
160
|
+
disabled: !v && o === 0
|
|
161
|
+
}
|
|
162
|
+
),
|
|
163
|
+
/* @__PURE__ */ i(
|
|
164
|
+
P,
|
|
165
|
+
{
|
|
166
|
+
direction: "next",
|
|
167
|
+
onClick: n,
|
|
168
|
+
disabled: !v && o === l - 1
|
|
169
|
+
}
|
|
170
|
+
)
|
|
171
|
+
] }),
|
|
172
|
+
te && l > 1 && /* @__PURE__ */ i(
|
|
173
|
+
"div",
|
|
174
|
+
{
|
|
175
|
+
className: `absolute flex gap-2 ${ee[F]} ${oe || ""}`,
|
|
176
|
+
role: "tablist",
|
|
177
|
+
"aria-label": "Slide indicators",
|
|
178
|
+
"data-testid": r ? `${r}-dots` : void 0,
|
|
179
|
+
children: N.map((e, t) => /* @__PURE__ */ i(
|
|
180
|
+
"button",
|
|
181
|
+
{
|
|
182
|
+
type: "button",
|
|
183
|
+
role: "tab",
|
|
184
|
+
"aria-selected": t === o,
|
|
185
|
+
"aria-label": `Go to slide ${t + 1}`,
|
|
186
|
+
onClick: () => u(t),
|
|
187
|
+
className: `w-2 h-2 rounded-full transition-all ${t === o ? "bg-primary w-4" : "bg-base-content/30 hover:bg-base-content/50"}`,
|
|
188
|
+
"data-testid": r ? `${r}-dot-${t}` : void 0
|
|
189
|
+
},
|
|
190
|
+
t
|
|
191
|
+
))
|
|
192
|
+
}
|
|
193
|
+
)
|
|
194
|
+
]
|
|
195
|
+
}
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
);
|
|
199
|
+
B.displayName = "Carousel";
|
|
200
|
+
const de = B;
|
|
201
|
+
de.Item = z;
|
|
4
202
|
export {
|
|
5
|
-
|
|
6
|
-
o as CarouselItem
|
|
203
|
+
de as Carousel
|
|
7
204
|
};
|
|
8
205
|
//# sourceMappingURL=Carousel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Carousel.js","sources":["../../src/components/Carousel.tsx"],"sourcesContent":["import React from 'react'\n\nexport interface CarouselItemProps extends React.HTMLAttributes<HTMLDivElement> {\n id?: string\n children: React.ReactNode\n}\n\nexport const CarouselItem: React.FC<CarouselItemProps> = ({ id, children, className = '', ...rest }) => {\n return (\n <div id={id} className={`carousel-item ${className}`} {...rest}>\n {children}\n </div>\n )\n}\n\nexport interface CarouselProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n snap?: 'start' | 'center' | 'end'\n vertical?: boolean\n}\n\nexport const Carousel: React.FC<CarouselProps> & {\n Item: typeof CarouselItem\n} = ({ children, snap = 'start', vertical = false, className = '', ...rest }) => {\n const snapClass = snap === 'center' ? 'carousel-center' : snap === 'end' ? 'carousel-end' : ''\n const directionClass = vertical ? 'carousel-vertical' : ''\n\n return (\n <div className={`carousel ${snapClass} ${directionClass} ${className}`.trim()} {...rest}>\n {children}\n </div>\n )\n}\n\nCarousel.Item = CarouselItem\n"],"names":["CarouselItem","id","children","className","rest","jsx","Carousel","snap","vertical"],"mappings":";AAOO,MAAMA,IAA4C,CAAC,EAAE,IAAAC,GAAI,UAAAC,GAAU,WAAAC,IAAY,IAAI,GAAGC,QAEzF,gBAAAC,EAAC,SAAI,IAAAJ,GAAQ,WAAW,iBAAiBE,CAAS,IAAK,GAAGC,GACvD,UAAAF,EAAA,CACH,GAUSI,IAET,CAAC,EAAE,UAAAJ,GAAU,MAAAK,IAAO,SAAS,UAAAC,IAAW,IAAO,WAAAL,IAAY,IAAI,GAAGC,EAAA,MAKlE,gBAAAC,EAAC,OAAA,EAAI,WAAW,YAJAE,MAAS,WAAW,oBAAoBA,MAAS,QAAQ,iBAAiB,EAIrD,IAHhBC,IAAW,sBAAsB,EAGC,IAAIL,CAAS,GAAG,KAAA,GAAS,GAAGC,GAChF,UAAAF,GACH;AAIJI,EAAS,OAAON;"}
|
|
1
|
+
{"version":3,"file":"Carousel.js","sources":["../../src/components/Carousel.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n Children,\n cloneElement,\n isValidElement,\n} from 'react'\n\nexport type CarouselEffect = 'scrollx' | 'fade'\nexport type CarouselDotPlacement = 'top' | 'bottom' | 'start' | 'end'\n\nexport interface CarouselRef {\n goTo: (index: number, animate?: boolean) => void\n next: () => void\n prev: () => void\n}\n\nexport interface CarouselItemProps extends React.HTMLAttributes<HTMLDivElement> {\n 'data-testid'?: string\n children: React.ReactNode\n}\n\nconst CarouselItemComponent = forwardRef<HTMLDivElement, CarouselItemProps>(\n ({ children, className = '', 'data-testid': testId, ...rest }, ref) => {\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-roledescription=\"slide\"\n className={`carousel-item w-full flex-shrink-0 ${className}`}\n data-testid={testId}\n {...rest}\n >\n {children}\n </div>\n )\n }\n)\n\nCarouselItemComponent.displayName = 'Carousel.Item'\n\nexport interface CarouselProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n /** Carousel slides */\n children: React.ReactNode\n /** Current slide index (controlled mode) */\n activeIndex?: number\n /** Default slide index (uncontrolled mode) */\n defaultActiveIndex?: number\n /** Auto-advance slides */\n autoplay?: boolean\n /** Autoplay interval in milliseconds */\n autoplaySpeed?: number\n /** Animation duration in milliseconds */\n speed?: number\n /** Show prev/next navigation arrows */\n arrows?: boolean\n /** Show slide indicator dots */\n dots?: boolean | { className?: string }\n /** Position of indicator dots */\n dotPlacement?: CarouselDotPlacement\n /** Transition effect */\n effect?: CarouselEffect\n /** Enable infinite looping */\n infinite?: boolean\n /** Pause autoplay on hover */\n pauseOnHover?: boolean\n /** Vertical carousel orientation */\n vertical?: boolean\n /** Callback before slide change */\n beforeChange?: (current: number, next: number) => void\n /** Callback after slide change */\n afterChange?: (current: number) => void\n /** Test ID for testing */\n 'data-testid'?: string\n}\n\nconst CarouselComponent = forwardRef<CarouselRef, CarouselProps>(\n (\n {\n children,\n activeIndex: controlledIndex,\n defaultActiveIndex = 0,\n autoplay = false,\n autoplaySpeed = 3000,\n speed = 500,\n arrows = true,\n dots = true,\n dotPlacement = 'bottom',\n effect = 'scrollx',\n infinite = true,\n pauseOnHover = true,\n vertical = false,\n beforeChange,\n afterChange,\n className = '',\n 'data-testid': testId,\n ...rest\n },\n ref\n ) => {\n const isControlled = controlledIndex !== undefined\n const [internalIndex, setInternalIndex] = useState(defaultActiveIndex)\n const currentIndex = isControlled ? controlledIndex : internalIndex\n\n const [isPaused, setIsPaused] = useState(false)\n const [isAnimating, setIsAnimating] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n const autoplayRef = useRef<NodeJS.Timeout | null>(null)\n\n const slides = Children.toArray(children).filter(isValidElement)\n const slideCount = slides.length\n\n const goTo = useCallback(\n (index: number, animate = true) => {\n if (isAnimating || slideCount === 0) return\n\n let targetIndex = index\n if (infinite) {\n targetIndex = ((index % slideCount) + slideCount) % slideCount\n } else {\n targetIndex = Math.max(0, Math.min(index, slideCount - 1))\n }\n\n if (targetIndex === currentIndex) return\n\n beforeChange?.(currentIndex, targetIndex)\n\n if (animate) {\n setIsAnimating(true)\n setTimeout(() => {\n setIsAnimating(false)\n afterChange?.(targetIndex)\n }, speed)\n } else {\n afterChange?.(targetIndex)\n }\n\n if (!isControlled) {\n setInternalIndex(targetIndex)\n }\n },\n [currentIndex, slideCount, infinite, isControlled, beforeChange, afterChange, speed, isAnimating]\n )\n\n const next = useCallback(() => {\n goTo(currentIndex + 1)\n }, [goTo, currentIndex])\n\n const prev = useCallback(() => {\n goTo(currentIndex - 1)\n }, [goTo, currentIndex])\n\n // Expose methods via ref\n useImperativeHandle(ref, () => ({\n goTo: (index: number, animate = true) => goTo(index, animate),\n next,\n prev,\n }))\n\n // Autoplay\n useEffect(() => {\n if (autoplay && !isPaused && slideCount > 1) {\n autoplayRef.current = setInterval(() => {\n next()\n }, autoplaySpeed)\n }\n\n return () => {\n if (autoplayRef.current) {\n clearInterval(autoplayRef.current)\n }\n }\n }, [autoplay, isPaused, autoplaySpeed, next, slideCount])\n\n // Keyboard navigation\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (vertical) {\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n prev()\n } else if (e.key === 'ArrowDown') {\n e.preventDefault()\n next()\n }\n } else {\n if (e.key === 'ArrowLeft') {\n e.preventDefault()\n prev()\n } else if (e.key === 'ArrowRight') {\n e.preventDefault()\n next()\n }\n }\n },\n [vertical, prev, next]\n )\n\n const handleMouseEnter = () => {\n if (pauseOnHover && autoplay) {\n setIsPaused(true)\n }\n }\n\n const handleMouseLeave = () => {\n if (pauseOnHover && autoplay) {\n setIsPaused(false)\n }\n }\n\n // Build carousel classes\n const carouselClasses = [\n 'carousel',\n vertical ? 'carousel-vertical' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n // Slide transform/opacity based on effect\n const getSlideStyle = (index: number): React.CSSProperties => {\n if (effect === 'fade') {\n return {\n position: index === 0 ? 'relative' : 'absolute',\n top: 0,\n left: 0,\n opacity: index === currentIndex ? 1 : 0,\n transition: `opacity ${speed}ms ease-in-out`,\n zIndex: index === currentIndex ? 1 : 0,\n }\n }\n return {}\n }\n\n // Container style for scrollx effect\n const trackStyle: React.CSSProperties =\n effect === 'scrollx'\n ? {\n display: 'flex',\n flexDirection: vertical ? 'column' : 'row',\n transform: vertical\n ? `translateY(-${currentIndex * 100}%)`\n : `translateX(-${currentIndex * 100}%)`,\n transition: `transform ${speed}ms ease-in-out`,\n height: vertical ? '100%' : undefined,\n }\n : {\n position: 'relative',\n width: '100%',\n height: '100%',\n }\n\n // Slide style - ensure proper sizing for vertical/horizontal\n const getSlideContainerStyle = (): React.CSSProperties => {\n if (vertical) {\n return { height: '100%', flexShrink: 0 }\n }\n return {}\n }\n\n // Dots placement classes\n const dotsPlacementClasses: Record<CarouselDotPlacement, string> = {\n top: 'top-2 left-1/2 -translate-x-1/2 flex-row',\n bottom: 'bottom-2 left-1/2 -translate-x-1/2 flex-row',\n start: 'left-2 top-1/2 -translate-y-1/2 flex-col',\n end: 'right-2 top-1/2 -translate-y-1/2 flex-col',\n }\n\n const showDots = dots === true || (typeof dots === 'object' && dots !== null)\n const dotsClassName = typeof dots === 'object' ? dots.className : ''\n\n // Arrow buttons\n const ArrowButton = ({\n direction,\n onClick,\n disabled,\n }: {\n direction: 'prev' | 'next'\n onClick: () => void\n disabled: boolean\n }) => {\n const isPrev = direction === 'prev'\n const positionClass = vertical\n ? isPrev\n ? 'top-2 left-1/2 -translate-x-1/2'\n : 'bottom-2 left-1/2 -translate-x-1/2'\n : isPrev\n ? 'left-2 top-1/2 -translate-y-1/2'\n : 'right-2 top-1/2 -translate-y-1/2'\n\n const arrowIcon = vertical\n ? isPrev\n ? '▲'\n : '▼'\n : isPrev\n ? '❮'\n : '❯'\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-label={isPrev ? 'Previous slide' : 'Next slide'}\n className={`absolute ${positionClass} btn btn-circle btn-sm bg-base-100/80 hover:bg-base-100 border-none shadow-md z-10 disabled:opacity-50 disabled:cursor-not-allowed`}\n data-testid={testId ? `${testId}-${direction}` : undefined}\n >\n {arrowIcon}\n </button>\n )\n }\n\n return (\n <div\n ref={containerRef}\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label=\"Image carousel\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className={`relative overflow-hidden focus:outline-none focus-visible:ring-2 focus-visible:ring-primary ${carouselClasses}`}\n data-testid={testId}\n data-active-index={currentIndex}\n {...rest}\n >\n {/* Slides track */}\n <div\n className={effect === 'fade' ? 'relative w-full h-full' : vertical ? 'h-full' : ''}\n style={trackStyle}\n aria-live=\"polite\"\n >\n {slides.map((slide, index) => {\n const slideElement = slide as React.ReactElement<CarouselItemProps & { style?: React.CSSProperties }>\n return cloneElement(slideElement, {\n key: index,\n 'aria-hidden': index !== currentIndex,\n 'aria-label': `Slide ${index + 1} of ${slideCount}`,\n style: {\n ...slideElement.props.style,\n ...getSlideContainerStyle(),\n ...getSlideStyle(index),\n },\n 'data-testid': testId ? `${testId}-slide-${index}` : undefined,\n })\n })}\n </div>\n\n {/* Navigation arrows */}\n {arrows && slideCount > 1 && (\n <>\n <ArrowButton\n direction=\"prev\"\n onClick={prev}\n disabled={!infinite && currentIndex === 0}\n />\n <ArrowButton\n direction=\"next\"\n onClick={next}\n disabled={!infinite && currentIndex === slideCount - 1}\n />\n </>\n )}\n\n {/* Dot indicators */}\n {showDots && slideCount > 1 && (\n <div\n className={`absolute flex gap-2 ${dotsPlacementClasses[dotPlacement]} ${dotsClassName || ''}`}\n role=\"tablist\"\n aria-label=\"Slide indicators\"\n data-testid={testId ? `${testId}-dots` : undefined}\n >\n {slides.map((_, index) => (\n <button\n key={index}\n type=\"button\"\n role=\"tab\"\n aria-selected={index === currentIndex}\n aria-label={`Go to slide ${index + 1}`}\n onClick={() => goTo(index)}\n className={`w-2 h-2 rounded-full transition-all ${\n index === currentIndex\n ? 'bg-primary w-4'\n : 'bg-base-content/30 hover:bg-base-content/50'\n }`}\n data-testid={testId ? `${testId}-dot-${index}` : undefined}\n />\n ))}\n </div>\n )}\n </div>\n )\n }\n)\n\nCarouselComponent.displayName = 'Carousel'\n\n// Compound component type\ntype CarouselType = typeof CarouselComponent & {\n Item: typeof CarouselItemComponent\n}\n\nexport const Carousel = CarouselComponent as CarouselType\nCarousel.Item = CarouselItemComponent\n"],"names":["CarouselItemComponent","forwardRef","children","className","testId","rest","ref","jsx","CarouselComponent","controlledIndex","defaultActiveIndex","autoplay","autoplaySpeed","speed","arrows","dots","dotPlacement","effect","infinite","pauseOnHover","vertical","beforeChange","afterChange","isControlled","internalIndex","setInternalIndex","useState","currentIndex","isPaused","setIsPaused","isAnimating","setIsAnimating","containerRef","useRef","autoplayRef","slides","Children","isValidElement","slideCount","goTo","useCallback","index","animate","targetIndex","next","prev","useImperativeHandle","useEffect","handleKeyDown","handleMouseEnter","handleMouseLeave","carouselClasses","getSlideStyle","trackStyle","getSlideContainerStyle","dotsPlacementClasses","showDots","dotsClassName","ArrowButton","direction","onClick","disabled","isPrev","positionClass","arrowIcon","jsxs","slide","slideElement","cloneElement","Fragment","_","Carousel"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export type { AutocompleteProps, AutocompleteOption } from './components/Autocom
|
|
|
9
9
|
export { Avatar, AvatarGroup } from './components/Avatar';
|
|
10
10
|
export type { AvatarProps, AvatarGroupProps, AvatarSize, AvatarShape, AvatarStatus } from './components/Avatar';
|
|
11
11
|
export { Badge } from './components/Badge';
|
|
12
|
-
export type { BadgeProps, BadgePosition, BadgeStatus } from './components/Badge';
|
|
12
|
+
export type { BadgeProps, BadgeRibbonProps, BadgePosition, BadgeStatus, BadgeType, BadgeVariant, BadgeSize } from './components/Badge';
|
|
13
13
|
export { Breadcrumb } from './components/Breadcrumb';
|
|
14
14
|
export type { BreadcrumbProps, BreadcrumbItemProps } from './components/Breadcrumb';
|
|
15
15
|
export { Button } from './components/Button';
|
|
@@ -27,7 +27,7 @@ export type { CardProps, CardGridProps, CardMetaProps, CardSize, CardVariant, Ca
|
|
|
27
27
|
export { Cascader } from './components/Cascader';
|
|
28
28
|
export type { CascaderProps, CascaderOption } from './components/Cascader';
|
|
29
29
|
export { Carousel } from './components/Carousel';
|
|
30
|
-
export type { CarouselProps, CarouselItemProps } from './components/Carousel';
|
|
30
|
+
export type { CarouselProps, CarouselItemProps, CarouselRef, CarouselEffect, CarouselDotPlacement } from './components/Carousel';
|
|
31
31
|
export { Collapse } from './components/Collapse';
|
|
32
32
|
export type { CollapseProps, CollapseItemType, CollapseSize, CollapseIconPosition, CollapseCollapsible } from './components/Collapse';
|
|
33
33
|
export { Container } from './components/Container';
|