dishui 0.0.66 → 0.0.67
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/Accordion/index.d.ts +39 -0
- package/dist/components/Accordion/index.js +70 -0
- package/dist/components/Accordion/index.js.map +1 -0
- package/dist/components/Avatar/index.d.ts +48 -0
- package/dist/components/Avatar/index.js +71 -0
- package/dist/components/Avatar/index.js.map +1 -0
- package/dist/components/Card/index.d.ts +66 -0
- package/dist/components/Card/index.js +193 -3
- package/dist/components/Card/index.js.map +1 -1
- package/dist/components/Icon/index.d.ts +3 -1
- package/dist/components/Icon/index.js +9 -8
- package/dist/components/Icon/index.js.map +1 -1
- package/dist/components/Page/index.d.ts +1 -1
- package/dist/components/Page/index.js.map +1 -1
- package/dist/dishui.css +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.js +95 -94
- package/dist/utils/i18n.js +18 -8
- package/dist/utils/i18n.js.map +1 -1
- package/package.json +1 -1
- package/dist/components/StatCard/index.d.ts +0 -52
- package/dist/components/StatCard/index.js +0 -193
- package/dist/components/StatCard/index.js.map +0 -1
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type AccordionItemType = {
|
|
3
|
+
/** 唯一标识(用于展开状态管理)。 */
|
|
4
|
+
key: string;
|
|
5
|
+
/** 标题。 */
|
|
6
|
+
title: React.ReactNode;
|
|
7
|
+
/** 展开区域内容。 */
|
|
8
|
+
content: React.ReactNode;
|
|
9
|
+
/** 标题左侧图标。 */
|
|
10
|
+
icon?: React.ReactNode;
|
|
11
|
+
/** 标题行右侧、展开指示器之前的附加内容。 */
|
|
12
|
+
extra?: React.ReactNode;
|
|
13
|
+
/** 禁用该项。 */
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
};
|
|
16
|
+
export type AccordionProps = {
|
|
17
|
+
/** 手风琴项(数据驱动,可动态增删)。 */
|
|
18
|
+
items: AccordionItemType[];
|
|
19
|
+
/** 受控:当前展开项的 key 列表。 */
|
|
20
|
+
openKeys?: string[];
|
|
21
|
+
/** 非受控:默认展开项的 key 列表。 */
|
|
22
|
+
defaultOpenKeys?: string[];
|
|
23
|
+
/** 是否允许同时展开多项;默认 false(互斥展开,展开新项时收起其它项)。 */
|
|
24
|
+
multiple?: boolean;
|
|
25
|
+
/** 展开状态变化回调。 */
|
|
26
|
+
onChange?: (openKeys: string[]) => void;
|
|
27
|
+
/** 是否显示右侧展开指示箭头,默认 true。 */
|
|
28
|
+
indicator?: boolean;
|
|
29
|
+
/** 是否显示外层边框,默认 true。 */
|
|
30
|
+
bordered?: boolean;
|
|
31
|
+
className?: string;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Accordion —— 手风琴组件:动态交互式的聚合展开列表。
|
|
35
|
+
* 数据驱动(items 可动态增删),支持受控 / 非受控、互斥或多开、
|
|
36
|
+
* 禁用项、图标与自定义内容,展开 / 收起带平滑过渡动画。
|
|
37
|
+
*/
|
|
38
|
+
declare const Accordion: React.FC<AccordionProps>;
|
|
39
|
+
export default Accordion;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { cn as e } from "../../utils/cn.js";
|
|
2
|
+
import t from "react";
|
|
3
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
+
//#region src/components/Accordion/index.tsx
|
|
5
|
+
var i = ({ className: t }) => /* @__PURE__ */ n("svg", {
|
|
6
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
7
|
+
viewBox: "0 0 24 24",
|
|
8
|
+
fill: "none",
|
|
9
|
+
stroke: "currentColor",
|
|
10
|
+
strokeWidth: 2,
|
|
11
|
+
strokeLinecap: "round",
|
|
12
|
+
strokeLinejoin: "round",
|
|
13
|
+
className: e("h-4 w-4", t),
|
|
14
|
+
"aria-hidden": "true",
|
|
15
|
+
children: /* @__PURE__ */ n("path", { d: "m6 9 6 6 6-6" })
|
|
16
|
+
}), a = ({ items: a, openKeys: o, defaultOpenKeys: s = [], multiple: c = !1, onChange: l, indicator: u = !0, bordered: d = !0, className: f = "" }) => {
|
|
17
|
+
let [p, m] = t.useState(s), h = o !== void 0, g = h ? o ?? [] : p, _ = (e, t) => {
|
|
18
|
+
if (t) return;
|
|
19
|
+
let n = g.includes(e) ? g.filter((t) => t !== e) : c ? [...g, e] : [e];
|
|
20
|
+
h || m(n), l?.(n);
|
|
21
|
+
};
|
|
22
|
+
return /* @__PURE__ */ n("div", {
|
|
23
|
+
className: e("w-full divide-y divide-base-300 overflow-hidden bg-base-100", d && "rounded-xl border border-base-300/70", f),
|
|
24
|
+
children: a.map((t) => {
|
|
25
|
+
let a = g.includes(t.key);
|
|
26
|
+
return /* @__PURE__ */ r("div", {
|
|
27
|
+
className: e(a && !t.disabled && "bg-base-200/40"),
|
|
28
|
+
children: [/* @__PURE__ */ r("button", {
|
|
29
|
+
type: "button",
|
|
30
|
+
disabled: t.disabled,
|
|
31
|
+
"aria-expanded": a,
|
|
32
|
+
onClick: () => _(t.key, t.disabled),
|
|
33
|
+
className: e("flex w-full items-center gap-2 px-4 py-3 text-left text-sm font-medium transition-colors", t.disabled ? "cursor-not-allowed opacity-50" : "cursor-pointer hover:bg-base-200/60", a && !t.disabled && "text-primary"),
|
|
34
|
+
children: [
|
|
35
|
+
t.icon && /* @__PURE__ */ n("span", {
|
|
36
|
+
className: "flex shrink-0 items-center text-base-content/60 [&>svg]:h-4 [&>svg]:w-4",
|
|
37
|
+
children: t.icon
|
|
38
|
+
}),
|
|
39
|
+
/* @__PURE__ */ n("span", {
|
|
40
|
+
className: "min-w-0 flex-1 truncate",
|
|
41
|
+
children: t.title
|
|
42
|
+
}),
|
|
43
|
+
t.extra && /* @__PURE__ */ n("span", {
|
|
44
|
+
className: "flex shrink-0 items-center",
|
|
45
|
+
children: t.extra
|
|
46
|
+
}),
|
|
47
|
+
u && /* @__PURE__ */ n("span", {
|
|
48
|
+
className: e("shrink-0 text-base-content/50 transition-transform duration-200", a && "rotate-180 text-primary"),
|
|
49
|
+
children: /* @__PURE__ */ n(i, {})
|
|
50
|
+
})
|
|
51
|
+
]
|
|
52
|
+
}), /* @__PURE__ */ n("div", {
|
|
53
|
+
className: "grid transition-[grid-template-rows] duration-200 ease-out",
|
|
54
|
+
style: { gridTemplateRows: a ? "1fr" : "0fr" },
|
|
55
|
+
children: /* @__PURE__ */ n("div", {
|
|
56
|
+
className: "overflow-hidden",
|
|
57
|
+
children: /* @__PURE__ */ n("div", {
|
|
58
|
+
className: "px-4 pb-4 pt-0 text-sm leading-relaxed text-base-content/75",
|
|
59
|
+
children: t.content
|
|
60
|
+
})
|
|
61
|
+
})
|
|
62
|
+
})]
|
|
63
|
+
}, t.key);
|
|
64
|
+
})
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
//#endregion
|
|
68
|
+
export { a as default };
|
|
69
|
+
|
|
70
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/Accordion/index.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type AccordionItemType = {\n /** 唯一标识(用于展开状态管理)。 */\n key: string;\n /** 标题。 */\n title: React.ReactNode;\n /** 展开区域内容。 */\n content: React.ReactNode;\n /** 标题左侧图标。 */\n icon?: React.ReactNode;\n /** 标题行右侧、展开指示器之前的附加内容。 */\n extra?: React.ReactNode;\n /** 禁用该项。 */\n disabled?: boolean;\n};\n\nexport type AccordionProps = {\n /** 手风琴项(数据驱动,可动态增删)。 */\n items: AccordionItemType[];\n /** 受控:当前展开项的 key 列表。 */\n openKeys?: string[];\n /** 非受控:默认展开项的 key 列表。 */\n defaultOpenKeys?: string[];\n /** 是否允许同时展开多项;默认 false(互斥展开,展开新项时收起其它项)。 */\n multiple?: boolean;\n /** 展开状态变化回调。 */\n onChange?: (openKeys: string[]) => void;\n /** 是否显示右侧展开指示箭头,默认 true。 */\n indicator?: boolean;\n /** 是否显示外层边框,默认 true。 */\n bordered?: boolean;\n className?: string;\n};\n\nconst ChevronGlyph: React.FC<{ className?: string }> = ({ className }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cn('h-4 w-4', className)}\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n);\n\n/**\n * Accordion —— 手风琴组件:动态交互式的聚合展开列表。\n * 数据驱动(items 可动态增删),支持受控 / 非受控、互斥或多开、\n * 禁用项、图标与自定义内容,展开 / 收起带平滑过渡动画。\n */\nconst Accordion: React.FC<AccordionProps> = ({\n items,\n openKeys,\n defaultOpenKeys = [],\n multiple = false,\n onChange,\n indicator = true,\n bordered = true,\n className = '',\n}) => {\n const [innerKeys, setInnerKeys] = React.useState<string[]>(defaultOpenKeys);\n const isControlled = openKeys !== undefined;\n const currentKeys = isControlled ? (openKeys ?? []) : innerKeys;\n\n const toggle = (key: string, disabled?: boolean) => {\n if (disabled) return;\n const nextKeys = currentKeys.includes(key)\n ? currentKeys.filter((k) => k !== key)\n : multiple\n ? [...currentKeys, key]\n : [key];\n if (!isControlled) setInnerKeys(nextKeys);\n onChange?.(nextKeys);\n };\n\n return (\n <div\n className={cn(\n 'w-full divide-y divide-base-300 overflow-hidden bg-base-100',\n bordered && 'rounded-xl border border-base-300/70',\n className,\n )}\n >\n {items.map((item) => {\n const open = currentKeys.includes(item.key);\n return (\n <div key={item.key} className={cn(open && !item.disabled && 'bg-base-200/40')}>\n <button\n type=\"button\"\n disabled={item.disabled}\n aria-expanded={open}\n onClick={() => toggle(item.key, item.disabled)}\n className={cn(\n 'flex w-full items-center gap-2 px-4 py-3 text-left text-sm font-medium transition-colors',\n item.disabled\n ? 'cursor-not-allowed opacity-50'\n : 'cursor-pointer hover:bg-base-200/60',\n open && !item.disabled && 'text-primary',\n )}\n >\n {item.icon && <span className=\"flex shrink-0 items-center text-base-content/60 [&>svg]:h-4 [&>svg]:w-4\">{item.icon}</span>}\n <span className=\"min-w-0 flex-1 truncate\">{item.title}</span>\n {item.extra && <span className=\"flex shrink-0 items-center\">{item.extra}</span>}\n {indicator && (\n <span className={cn('shrink-0 text-base-content/50 transition-transform duration-200', open && 'rotate-180 text-primary')}>\n <ChevronGlyph />\n </span>\n )}\n </button>\n <div\n className=\"grid transition-[grid-template-rows] duration-200 ease-out\"\n style={{ gridTemplateRows: open ? '1fr' : '0fr' }}\n >\n <div className=\"overflow-hidden\">\n <div className=\"px-4 pb-4 pt-0 text-sm leading-relaxed text-base-content/75\">\n {item.content}\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n\nexport default Accordion;\n"],"mappings":";;;;AAoCA,IAAM,KAAkD,EAAE,mBACxD,kBAAC,OAAD;CACE,OAAM;CACN,SAAQ;CACR,MAAK;CACL,QAAO;CACP,aAAa;CACb,eAAc;CACd,gBAAe;CACf,WAAW,EAAG,WAAW,CAAS;CAClC,eAAY;CAEZ,UAAA,kBAAC,QAAD,EAAM,GAAE,eAAgB,CAAA;AACrB,CAAA,GAQD,KAAuC,EAC3C,UACA,aACA,qBAAkB,CAAC,GACnB,cAAW,IACX,aACA,eAAY,IACZ,cAAW,IACX,eAAY,SACR;CACJ,IAAM,CAAC,GAAW,KAAgB,EAAM,SAAmB,CAAe,GACpE,IAAe,MAAa,KAAA,GAC5B,IAAc,IAAgB,KAAY,CAAC,IAAK,GAEhD,KAAU,GAAa,MAAuB;EAClD,IAAI,GAAU;EACd,IAAM,IAAW,EAAY,SAAS,CAAG,IACrC,EAAY,QAAQ,MAAM,MAAM,CAAG,IACnC,IACE,CAAC,GAAG,GAAa,CAAG,IACpB,CAAC,CAAG;EAEV,AADK,KAAc,EAAa,CAAQ,GACxC,IAAW,CAAQ;CACrB;CAEA,OACE,kBAAC,OAAD;EACE,WAAW,EACT,+DACA,KAAY,wCACZ,CACF;EAEC,UAAA,EAAM,KAAK,MAAS;GACnB,IAAM,IAAO,EAAY,SAAS,EAAK,GAAG;GAC1C,OACE,kBAAC,OAAD;IAAoB,WAAW,EAAG,KAAQ,CAAC,EAAK,YAAY,gBAAgB;IAA5E,UAAA,CACE,kBAAC,UAAD;KACE,MAAK;KACL,UAAU,EAAK;KACf,iBAAe;KACf,eAAe,EAAO,EAAK,KAAK,EAAK,QAAQ;KAC7C,WAAW,EACT,4FACA,EAAK,WACD,kCACA,uCACJ,KAAQ,CAAC,EAAK,YAAY,cAC5B;KAXF,UAAA;MAaG,EAAK,QAAQ,kBAAC,QAAD;OAAM,WAAU;OAA2E,UAAA,EAAK;MAAW,CAAA;MACzH,kBAAC,QAAD;OAAM,WAAU;OAA2B,UAAA,EAAK;MAAY,CAAA;MAC3D,EAAK,SAAS,kBAAC,QAAD;OAAM,WAAU;OAA8B,UAAA,EAAK;MAAY,CAAA;MAC7E,KACC,kBAAC,QAAD;OAAM,WAAW,EAAG,mEAAmE,KAAQ,yBAAyB;OACtH,UAAA,kBAAC,GAAD,CAAe,CAAA;MACX,CAAA;KAEF;IACR,CAAA,GAAA,kBAAC,OAAD;KACE,WAAU;KACV,OAAO,EAAE,kBAAkB,IAAO,QAAQ,MAAM;KAEhD,UAAA,kBAAC,OAAD;MAAK,WAAU;MACb,UAAA,kBAAC,OAAD;OAAK,WAAU;OACZ,UAAA,EAAK;MACH,CAAA;KACF,CAAA;IACF,CAAA,CACF;GAjCK,GAAA,EAAK,GAiCV;EAET,CAAC;CACE,CAAA;AAET"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type AvatarShape = 'circle' | 'square' | 'squircle';
|
|
3
|
+
export type AvatarBorderStyle = 'solid' | 'dashed' | 'dotted';
|
|
4
|
+
export type AvatarNotificationPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
|
|
5
|
+
export type AvatarProps = {
|
|
6
|
+
/** 头像图片地址;缺省或加载失败时回退为 `name` 的关键字母。 */
|
|
7
|
+
src?: string;
|
|
8
|
+
/** 图片 alt 描述。 */
|
|
9
|
+
alt?: string;
|
|
10
|
+
/** 名称 / 描述:未配置头像时取其关键字母(两个单词取首字母,否则取前两个字符)作为回退展示。 */
|
|
11
|
+
name?: string;
|
|
12
|
+
/** 方形尺寸;数字按 px 处理。默认 40。 */
|
|
13
|
+
size?: number | string;
|
|
14
|
+
/** 边框(整体)形态:circle 圆形(默认)/ square 方形 / squircle 超椭圆圆角方。 */
|
|
15
|
+
shape?: AvatarShape;
|
|
16
|
+
/** shape="square" 时的自定义圆角(数字按 px)。 */
|
|
17
|
+
radius?: number | string;
|
|
18
|
+
/** 边框宽度(数字按 px);mask 边框模式下即为环宽,默认 2。 */
|
|
19
|
+
borderWidth?: number | string;
|
|
20
|
+
/** 边框颜色。 */
|
|
21
|
+
borderColor?: string;
|
|
22
|
+
/** 边框线型:solid(默认)/ dashed / dotted。 */
|
|
23
|
+
borderStyle?: AvatarBorderStyle;
|
|
24
|
+
/** mask 边框:颜色或 CSS 渐变(如 story ring)。设置后以 mask 环的形式覆盖在头像边缘,中间不遮挡内容。 */
|
|
25
|
+
maskBorder?: string;
|
|
26
|
+
/** 中间(内容)区域透明度 0–1,默认 1;mask 边框模式下常用于压暗头像突出环。 */
|
|
27
|
+
centerOpacity?: number;
|
|
28
|
+
/** 角标通知位置,默认 top-right。 */
|
|
29
|
+
notificationPosition?: AvatarNotificationPosition;
|
|
30
|
+
/** 角标通知内容(如计数数值 / 短文本);传 `true` 显示小圆点,不传则不渲染角标。 */
|
|
31
|
+
notification?: React.ReactNode;
|
|
32
|
+
/** 角标背景色,默认 var(--color-error)。 */
|
|
33
|
+
notificationColor?: string;
|
|
34
|
+
/** Extra class names on the wrapper. */
|
|
35
|
+
className?: string;
|
|
36
|
+
/** Inline styles on the wrapper. */
|
|
37
|
+
style?: React.CSSProperties;
|
|
38
|
+
/** Click handler. */
|
|
39
|
+
onClick?: (e: React.MouseEvent<HTMLSpanElement>) => void;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Avatar —— 头像组件。
|
|
43
|
+
* 展示图片头像;未配置(或加载失败)时回退为 `name` 的关键字母。
|
|
44
|
+
* 支持自定义边框形态 / 颜色 / 线型、mask 环状边框(中间区域透明度可控)
|
|
45
|
+
* 以及四角 notification 短描述(计数 / 文本 / 圆点)。
|
|
46
|
+
*/
|
|
47
|
+
declare const Avatar: React.FC<AvatarProps>;
|
|
48
|
+
export default Avatar;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { cn as e } from "../../utils/cn.js";
|
|
2
|
+
import t from "react";
|
|
3
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
+
//#region src/components/Avatar/index.tsx
|
|
5
|
+
var i = (e) => {
|
|
6
|
+
let t = e.trim().split(/\s+/).filter(Boolean);
|
|
7
|
+
return t.length >= 2 ? (t[0][0] + t[1][0]).toUpperCase() : e.trim().slice(0, 2).toUpperCase();
|
|
8
|
+
}, a = {
|
|
9
|
+
circle: "rounded-full",
|
|
10
|
+
square: "",
|
|
11
|
+
squircle: "mask mask-squircle"
|
|
12
|
+
}, o = {
|
|
13
|
+
"top-left": "top-0 left-0 -translate-x-1/3 -translate-y-1/3",
|
|
14
|
+
"top-right": "top-0 right-0 translate-x-1/3 -translate-y-1/3",
|
|
15
|
+
"bottom-left": "bottom-0 left-0 -translate-x-1/3 translate-y-1/3",
|
|
16
|
+
"bottom-right": "bottom-0 right-0 translate-x-1/3 translate-y-1/3"
|
|
17
|
+
}, s = ({ src: s, alt: c, name: l, size: u = 40, shape: d = "circle", radius: f, borderWidth: p, borderColor: m, borderStyle: h = "solid", maskBorder: g, centerOpacity: _ = 1, notificationPosition: v = "top-right", notification: y, notificationColor: b = "var(--color-error)", className: x = "", style: S, onClick: C }) => {
|
|
18
|
+
let w = typeof u == "number" ? `${u}px` : u, [T, E] = t.useState(!1);
|
|
19
|
+
t.useEffect(() => E(!1), [s]);
|
|
20
|
+
let D = !!s && !T, O = l ? i(l) : "", k = `calc(${w} * 0.36)`, A = d === "square" ? { borderRadius: f ?? "0.5rem" } : {}, j = p === void 0 ? g ? "2px" : "0px" : typeof p == "number" ? `${p}px` : p, M = y != null && y !== !1;
|
|
21
|
+
return /* @__PURE__ */ r("span", {
|
|
22
|
+
className: e("relative inline-flex shrink-0 leading-none", C && "cursor-pointer", x),
|
|
23
|
+
style: {
|
|
24
|
+
width: w,
|
|
25
|
+
height: w,
|
|
26
|
+
...S
|
|
27
|
+
},
|
|
28
|
+
onClick: C,
|
|
29
|
+
children: [
|
|
30
|
+
g && /* @__PURE__ */ n("span", {
|
|
31
|
+
"aria-hidden": "true",
|
|
32
|
+
className: "pointer-events-none absolute inset-0 z-10",
|
|
33
|
+
style: {
|
|
34
|
+
padding: j,
|
|
35
|
+
background: g,
|
|
36
|
+
WebkitMask: "linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)",
|
|
37
|
+
WebkitMaskComposite: "xor",
|
|
38
|
+
mask: "linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)",
|
|
39
|
+
maskComposite: "exclude",
|
|
40
|
+
...A
|
|
41
|
+
}
|
|
42
|
+
}),
|
|
43
|
+
/* @__PURE__ */ n("span", {
|
|
44
|
+
className: e("relative flex h-full w-full select-none items-center justify-center overflow-hidden bg-base-200 text-center font-semibold text-base-content/70", a[d]),
|
|
45
|
+
style: {
|
|
46
|
+
fontSize: k,
|
|
47
|
+
opacity: _,
|
|
48
|
+
borderWidth: g ? 0 : j,
|
|
49
|
+
borderStyle: g ? void 0 : h,
|
|
50
|
+
borderColor: g ? void 0 : m,
|
|
51
|
+
...A
|
|
52
|
+
},
|
|
53
|
+
children: D ? /* @__PURE__ */ n("img", {
|
|
54
|
+
src: s,
|
|
55
|
+
alt: c ?? l ?? "",
|
|
56
|
+
className: "h-full w-full object-cover",
|
|
57
|
+
onError: () => E(!0)
|
|
58
|
+
}) : O
|
|
59
|
+
}),
|
|
60
|
+
M && /* @__PURE__ */ n("span", {
|
|
61
|
+
className: e("absolute z-20 flex items-center justify-center rounded-full border-2 border-base-100 font-bold leading-none text-white", o[v], y === !0 ? "h-3 w-3 p-0" : "h-[18px] min-w-[18px] px-1 text-[10px]"),
|
|
62
|
+
style: { backgroundColor: b },
|
|
63
|
+
children: y === !0 ? "" : y
|
|
64
|
+
})
|
|
65
|
+
]
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
//#endregion
|
|
69
|
+
export { s as default };
|
|
70
|
+
|
|
71
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/Avatar/index.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type AvatarShape = 'circle' | 'square' | 'squircle';\nexport type AvatarBorderStyle = 'solid' | 'dashed' | 'dotted';\nexport type AvatarNotificationPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n\nexport type AvatarProps = {\n /** 头像图片地址;缺省或加载失败时回退为 `name` 的关键字母。 */\n src?: string;\n /** 图片 alt 描述。 */\n alt?: string;\n /** 名称 / 描述:未配置头像时取其关键字母(两个单词取首字母,否则取前两个字符)作为回退展示。 */\n name?: string;\n /** 方形尺寸;数字按 px 处理。默认 40。 */\n size?: number | string;\n /** 边框(整体)形态:circle 圆形(默认)/ square 方形 / squircle 超椭圆圆角方。 */\n shape?: AvatarShape;\n /** shape=\"square\" 时的自定义圆角(数字按 px)。 */\n radius?: number | string;\n /** 边框宽度(数字按 px);mask 边框模式下即为环宽,默认 2。 */\n borderWidth?: number | string;\n /** 边框颜色。 */\n borderColor?: string;\n /** 边框线型:solid(默认)/ dashed / dotted。 */\n borderStyle?: AvatarBorderStyle;\n /** mask 边框:颜色或 CSS 渐变(如 story ring)。设置后以 mask 环的形式覆盖在头像边缘,中间不遮挡内容。 */\n maskBorder?: string;\n /** 中间(内容)区域透明度 0–1,默认 1;mask 边框模式下常用于压暗头像突出环。 */\n centerOpacity?: number;\n /** 角标通知位置,默认 top-right。 */\n notificationPosition?: AvatarNotificationPosition;\n /** 角标通知内容(如计数数值 / 短文本);传 `true` 显示小圆点,不传则不渲染角标。 */\n notification?: React.ReactNode;\n /** 角标背景色,默认 var(--color-error)。 */\n notificationColor?: string;\n /** Extra class names on the wrapper. */\n className?: string;\n /** Inline styles on the wrapper. */\n style?: React.CSSProperties;\n /** Click handler. */\n onClick?: (e: React.MouseEvent<HTMLSpanElement>) => void;\n};\n\n/** 从名称/描述中提取关键字母:两个单词取首字母,否则取前两个字符(统一大写)。 */\nconst initialsOf = (name: string): string => {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length >= 2) return (parts[0][0] + parts[1][0]).toUpperCase();\n return name.trim().slice(0, 2).toUpperCase();\n};\n\nconst SHAPE_CLASS: Record<AvatarShape, string> = {\n circle: 'rounded-full',\n square: '',\n squircle: 'mask mask-squircle',\n};\n\nconst NOTIFICATION_POSITION_CLASS: Record<AvatarNotificationPosition, string> = {\n 'top-left': 'top-0 left-0 -translate-x-1/3 -translate-y-1/3',\n 'top-right': 'top-0 right-0 translate-x-1/3 -translate-y-1/3',\n 'bottom-left': 'bottom-0 left-0 -translate-x-1/3 translate-y-1/3',\n 'bottom-right': 'bottom-0 right-0 translate-x-1/3 translate-y-1/3',\n};\n\n/**\n * Avatar —— 头像组件。\n * 展示图片头像;未配置(或加载失败)时回退为 `name` 的关键字母。\n * 支持自定义边框形态 / 颜色 / 线型、mask 环状边框(中间区域透明度可控)\n * 以及四角 notification 短描述(计数 / 文本 / 圆点)。\n */\nconst Avatar: React.FC<AvatarProps> = ({\n src,\n alt,\n name,\n size = 40,\n shape = 'circle',\n radius,\n borderWidth,\n borderColor,\n borderStyle = 'solid',\n maskBorder,\n centerOpacity = 1,\n notificationPosition = 'top-right',\n notification,\n notificationColor = 'var(--color-error)',\n className = '',\n style,\n onClick,\n}) => {\n const px = typeof size === 'number' ? `${size}px` : size;\n const [imgFailed, setImgFailed] = React.useState(false);\n React.useEffect(() => setImgFailed(false), [src]);\n\n const showImage = Boolean(src) && !imgFailed;\n const initials = name ? initialsOf(name) : '';\n const fontSize = `calc(${px} * 0.36)`;\n\n const shapeStyle: React.CSSProperties = shape === 'square' ? { borderRadius: radius ?? '0.5rem' } : {};\n const ringWidth = borderWidth === undefined ? (maskBorder ? '2px' : '0px') : typeof borderWidth === 'number' ? `${borderWidth}px` : borderWidth;\n\n const showNotification = notification !== undefined && notification !== null && notification !== false;\n\n return (\n <span\n className={cn('relative inline-flex shrink-0 leading-none', onClick && 'cursor-pointer', className)}\n style={{ width: px, height: px, ...style }}\n onClick={onClick}\n >\n {/* mask 边框:mask-composite 排除中间区域,只留下覆盖在头像边缘的环 */}\n {maskBorder && (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 z-10\"\n style={{\n padding: ringWidth,\n background: maskBorder,\n WebkitMask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',\n WebkitMaskComposite: 'xor',\n mask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',\n maskComposite: 'exclude',\n ...shapeStyle,\n } as React.CSSProperties}\n />\n )}\n <span\n className={cn(\n 'relative flex h-full w-full select-none items-center justify-center overflow-hidden bg-base-200 text-center font-semibold text-base-content/70',\n SHAPE_CLASS[shape],\n )}\n style={{\n fontSize,\n opacity: centerOpacity,\n borderWidth: maskBorder ? 0 : ringWidth,\n borderStyle: maskBorder ? undefined : borderStyle,\n borderColor: maskBorder ? undefined : borderColor,\n ...shapeStyle,\n }}\n >\n {showImage ? (\n <img\n src={src}\n alt={alt ?? name ?? ''}\n className=\"h-full w-full object-cover\"\n onError={() => setImgFailed(true)}\n />\n ) : (\n initials\n )}\n </span>\n {showNotification && (\n <span\n className={cn(\n 'absolute z-20 flex items-center justify-center rounded-full border-2 border-base-100 font-bold leading-none text-white',\n NOTIFICATION_POSITION_CLASS[notificationPosition],\n notification === true ? 'h-3 w-3 p-0' : 'h-[18px] min-w-[18px] px-1 text-[10px]',\n )}\n style={{ backgroundColor: notificationColor }}\n >\n {notification === true ? '' : notification}\n </span>\n )}\n </span>\n );\n};\n\nexport default Avatar;\n"],"mappings":";;;;AA6CA,IAAM,KAAc,MAAyB;CAC3C,IAAM,IAAQ,EAAK,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,OAAO;CAErD,OADI,EAAM,UAAU,KAAW,EAAM,EAAE,CAAC,KAAK,EAAM,EAAE,CAAC,GAAA,CAAI,YAAY,IAC/D,EAAK,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,YAAY;AAC7C,GAEM,IAA2C;CAC/C,QAAQ;CACR,QAAQ;CACR,UAAU;AACZ,GAEM,IAA0E;CAC9E,YAAY;CACZ,aAAa;CACb,eAAe;CACf,gBAAgB;AAClB,GAQM,KAAiC,EACrC,QACA,QACA,SACA,UAAO,IACP,WAAQ,UACR,WACA,gBACA,gBACA,iBAAc,SACd,eACA,mBAAgB,GAChB,0BAAuB,aACvB,iBACA,uBAAoB,sBACpB,eAAY,IACZ,UACA,iBACI;CACJ,IAAM,IAAK,OAAO,KAAS,WAAW,GAAG,EAAK,MAAM,GAC9C,CAAC,GAAW,KAAgB,EAAM,SAAS,EAAK;CACtD,EAAM,gBAAgB,EAAa,EAAK,GAAG,CAAC,CAAG,CAAC;CAEhD,IAAM,IAAY,EAAQ,KAAQ,CAAC,GAC7B,IAAW,IAAO,EAAW,CAAI,IAAI,IACrC,IAAW,QAAQ,EAAG,WAEtB,IAAkC,MAAU,WAAW,EAAE,cAAc,KAAU,SAAS,IAAI,CAAC,GAC/F,IAAY,MAAgB,KAAA,IAAa,IAAa,QAAQ,QAAS,OAAO,KAAgB,WAAW,GAAG,EAAY,MAAM,GAE9H,IAAmB,KAA+C,QAAQ,MAAiB;CAEjG,OACE,kBAAC,QAAD;EACE,WAAW,EAAG,8CAA8C,KAAW,kBAAkB,CAAS;EAClG,OAAO;GAAE,OAAO;GAAI,QAAQ;GAAI,GAAG;EAAM;EAChC;EAHX,UAAA;GAMG,KACC,kBAAC,QAAD;IACE,eAAY;IACZ,WAAU;IACV,OAAO;KACL,SAAS;KACT,YAAY;KACZ,YAAY;KACZ,qBAAqB;KACrB,MAAM;KACN,eAAe;KACf,GAAG;IACL;GACD,CAAA;GAEH,kBAAC,QAAD;IACE,WAAW,EACT,kJACA,EAAY,EACd;IACA,OAAO;KACL;KACA,SAAS;KACT,aAAa,IAAa,IAAI;KAC9B,aAAa,IAAa,KAAA,IAAY;KACtC,aAAa,IAAa,KAAA,IAAY;KACtC,GAAG;IACL;IAEC,UAAA,IACC,kBAAC,OAAD;KACO;KACL,KAAK,KAAO,KAAQ;KACpB,WAAU;KACV,eAAe,EAAa,EAAI;IACjC,CAAA,IAED;GAEE,CAAA;GACL,KACC,kBAAC,QAAD;IACE,WAAW,EACT,0HACA,EAA4B,IAC5B,MAAiB,KAAO,gBAAgB,wCAC1C;IACA,OAAO,EAAE,iBAAiB,EAAkB;IAE3C,UAAA,MAAiB,KAAO,KAAK;GAC1B,CAAA;EAEJ;;AAEV"}
|
|
@@ -110,6 +110,68 @@ export type CardMetaProps = {
|
|
|
110
110
|
/** Click handler. */
|
|
111
111
|
onClick?: (e: React.MouseEvent<HTMLDivElement>) => void;
|
|
112
112
|
};
|
|
113
|
+
export type CardInfoTone = 'primary' | 'success' | 'warning' | 'info' | 'error' | 'neutral';
|
|
114
|
+
export type CardInfoProps = {
|
|
115
|
+
/** Metric name (top-left, small muted text). */
|
|
116
|
+
label: React.ReactNode;
|
|
117
|
+
/** Metric value (number or short text). */
|
|
118
|
+
value: React.ReactNode;
|
|
119
|
+
/** Icon node, auto-sized and tinted by tone. */
|
|
120
|
+
icon?: React.ReactNode;
|
|
121
|
+
/** `top` (default) puts the icon at the right of the label row; `left` puts it on the left (horizontal layout). */
|
|
122
|
+
iconPosition?: 'top' | 'left';
|
|
123
|
+
/** 图标底框形状:`square`(默认,方形圆角)/ `circle`(正圆)。 */
|
|
124
|
+
iconShape?: 'square' | 'circle';
|
|
125
|
+
/** 是否给图标加色调底框(默认 `true`);`false` 时渲染不带底框、仅保留 tone 文字色的裸图标。 */
|
|
126
|
+
iconBoxed?: boolean;
|
|
127
|
+
/** Tone (icon text & background color). */
|
|
128
|
+
tone?: CardInfoTone;
|
|
129
|
+
/** Small hint text below the value (e.g. deltas, update time). */
|
|
130
|
+
hint?: React.ReactNode;
|
|
131
|
+
/** Loading state: value renders as a skeleton. */
|
|
132
|
+
loading?: boolean;
|
|
133
|
+
/** Color variant (daisyUI). */
|
|
134
|
+
variant?: CardProps['variant'];
|
|
135
|
+
/** Show a border (default true). */
|
|
136
|
+
bordered?: boolean;
|
|
137
|
+
/** Enable the glass background (default false — solid `bg-base-200`). */
|
|
138
|
+
glass?: boolean;
|
|
139
|
+
/** Extra class names on the card. */
|
|
140
|
+
className?: string;
|
|
141
|
+
/** Click handler. */
|
|
142
|
+
onClick?: (e: React.MouseEvent<HTMLDivElement>) => void;
|
|
143
|
+
};
|
|
144
|
+
export type CardStatProps = {
|
|
145
|
+
/** 面板标签 */
|
|
146
|
+
label: React.ReactNode;
|
|
147
|
+
/** 面板数值(数字或短文本) */
|
|
148
|
+
value: React.ReactNode;
|
|
149
|
+
/** 色调(决定数值文字色 / 角标三角 / filled 底色) */
|
|
150
|
+
tone?: CardInfoTone;
|
|
151
|
+
/** 加载态:值显示为骨架 */
|
|
152
|
+
loading?: boolean;
|
|
153
|
+
className?: string;
|
|
154
|
+
/** 数值单位后缀(如 `K`、`%`),以小号字体渲染在数值右侧。 */
|
|
155
|
+
unit?: React.ReactNode;
|
|
156
|
+
/** 面板数值字号,默认 `xl`。 */
|
|
157
|
+
valueSize?: 'md' | 'lg' | 'xl' | '2xl';
|
|
158
|
+
/** 面板内容对齐,默认 `left`。 */
|
|
159
|
+
align?: 'left' | 'center';
|
|
160
|
+
/** 直接传入迷你图节点(优先于 sparklineData)。 */
|
|
161
|
+
sparkline?: React.ReactNode;
|
|
162
|
+
/** 迷你图数据:传入数值数组后自动渲染 sparkline。 */
|
|
163
|
+
sparklineData?: number[];
|
|
164
|
+
/** 迷你图类型:折线 / 面积 / 柱状。 */
|
|
165
|
+
sparklineType?: 'line' | 'area' | 'bar';
|
|
166
|
+
/** 迷你图高度(px)。 */
|
|
167
|
+
sparklineHeight?: number;
|
|
168
|
+
/** 右上角状态三角(Grafana 阈值指示)。 */
|
|
169
|
+
indicator?: boolean;
|
|
170
|
+
/** 整卡填充 tone 底色、文字用对应 content 色(图 RabbitMQ 风格)。 */
|
|
171
|
+
filled?: boolean;
|
|
172
|
+
/** 点击回调(面板常用于跳转详情)。 */
|
|
173
|
+
onClick?: (e: React.MouseEvent<HTMLDivElement>) => void;
|
|
174
|
+
};
|
|
113
175
|
interface CardCompound extends React.FC<CardProps> {
|
|
114
176
|
Title: React.FC<CardTitleProps>;
|
|
115
177
|
Body: React.FC<CardBodyProps>;
|
|
@@ -121,6 +183,10 @@ interface CardCompound extends React.FC<CardProps> {
|
|
|
121
183
|
Quote: React.FC<CardQuoteProps>;
|
|
122
184
|
/** 元信息卡:标题 + 徽章 + 描述 + 左右页脚 */
|
|
123
185
|
Meta: React.FC<CardMetaProps>;
|
|
186
|
+
/** 指标卡:标签 + 数值 + 可选图标 / hint / 加载态(仪表盘统计卡片) */
|
|
187
|
+
Info: React.FC<CardInfoProps>;
|
|
188
|
+
/** 统计面板:Grafana 风格超大数值 + 迷你折线 / 面积 / 柱状图 / 角标 / 填充色 */
|
|
189
|
+
Stat: React.FC<CardStatProps>;
|
|
124
190
|
}
|
|
125
191
|
declare const CardWithCompounds: CardCompound;
|
|
126
192
|
export default CardWithCompounds;
|
|
@@ -173,9 +173,199 @@ var r = ({ children: n, variant: r, bordered: i = !1, dash: a = !1, side: o = !1
|
|
|
173
173
|
})
|
|
174
174
|
]
|
|
175
175
|
})
|
|
176
|
-
}), h =
|
|
177
|
-
|
|
176
|
+
}), h = {
|
|
177
|
+
primary: {
|
|
178
|
+
text: "text-primary",
|
|
179
|
+
bg: "bg-primary/10"
|
|
180
|
+
},
|
|
181
|
+
success: {
|
|
182
|
+
text: "text-success",
|
|
183
|
+
bg: "bg-success/10"
|
|
184
|
+
},
|
|
185
|
+
warning: {
|
|
186
|
+
text: "text-warning",
|
|
187
|
+
bg: "bg-warning/10"
|
|
188
|
+
},
|
|
189
|
+
info: {
|
|
190
|
+
text: "text-info",
|
|
191
|
+
bg: "bg-info/10"
|
|
192
|
+
},
|
|
193
|
+
error: {
|
|
194
|
+
text: "text-error",
|
|
195
|
+
bg: "bg-error/10"
|
|
196
|
+
},
|
|
197
|
+
neutral: {
|
|
198
|
+
text: "text-base-content/70",
|
|
199
|
+
bg: "bg-base-content/5"
|
|
200
|
+
}
|
|
201
|
+
}, g = ({ label: r, value: i, icon: a, iconPosition: o = "top", iconShape: s = "square", iconBoxed: c = !0, tone: l = "primary", hint: d, loading: f = !1, variant: p, bordered: m = !0, glass: g = !1, className: _ = "", onClick: v }) => {
|
|
202
|
+
let y = h[l], b = u({
|
|
203
|
+
variant: p,
|
|
204
|
+
bordered: m,
|
|
205
|
+
glass: g,
|
|
206
|
+
className: e("bg-base-200 p-4", _)
|
|
207
|
+
}), x = a && /* @__PURE__ */ t("span", {
|
|
208
|
+
className: e(o === "left" ? "flex shrink-0 items-center justify-center p-2.5 [&>svg]:h-5 [&>svg]:w-5" : "p-1.5 [&>svg]:h-4 [&>svg]:w-4", s === "circle" ? "rounded-full" : o === "left" ? "rounded-lg" : "rounded-md", y.bg, y.text),
|
|
209
|
+
children: a
|
|
210
|
+
}), S = a && /* @__PURE__ */ t("span", {
|
|
211
|
+
className: e(o === "left" ? "flex shrink-0" : "inline-flex", "[&>svg]:h-6 [&>svg]:w-6", y.text),
|
|
212
|
+
children: a
|
|
213
|
+
});
|
|
214
|
+
return o === "left" ? /* @__PURE__ */ t("div", {
|
|
215
|
+
className: e(b, "transition-shadow duration-300 hover:shadow-xl"),
|
|
216
|
+
onClick: v,
|
|
217
|
+
children: /* @__PURE__ */ n("div", {
|
|
218
|
+
className: "flex items-center gap-3",
|
|
219
|
+
children: [c ? x : S, /* @__PURE__ */ n("div", {
|
|
220
|
+
className: "min-w-0 flex-1",
|
|
221
|
+
children: [
|
|
222
|
+
/* @__PURE__ */ t("span", {
|
|
223
|
+
className: "block truncate text-xs font-medium text-base-content/60",
|
|
224
|
+
children: r
|
|
225
|
+
}),
|
|
226
|
+
f ? /* @__PURE__ */ t("div", { className: "mt-1 h-6 w-14 animate-pulse rounded bg-base-content/10" }) : /* @__PURE__ */ t("p", {
|
|
227
|
+
className: "truncate text-xl font-bold leading-tight text-base-content",
|
|
228
|
+
children: i
|
|
229
|
+
}),
|
|
230
|
+
d && /* @__PURE__ */ t("p", {
|
|
231
|
+
className: "mt-0.5 truncate text-[11px] text-base-content/50",
|
|
232
|
+
children: d
|
|
233
|
+
})
|
|
234
|
+
]
|
|
235
|
+
})]
|
|
236
|
+
})
|
|
237
|
+
}) : /* @__PURE__ */ n("div", {
|
|
238
|
+
className: e(b, "transition-shadow duration-300 hover:shadow-xl"),
|
|
239
|
+
onClick: v,
|
|
240
|
+
children: [
|
|
241
|
+
/* @__PURE__ */ n("div", {
|
|
242
|
+
className: "mb-2 flex items-center justify-between gap-2",
|
|
243
|
+
children: [/* @__PURE__ */ t("span", {
|
|
244
|
+
className: "truncate text-xs font-medium text-base-content/60",
|
|
245
|
+
children: r
|
|
246
|
+
}), c ? x : S]
|
|
247
|
+
}),
|
|
248
|
+
f ? /* @__PURE__ */ t("div", { className: "h-7 w-14 animate-pulse rounded bg-base-content/10" }) : /* @__PURE__ */ t("p", {
|
|
249
|
+
className: "text-2xl font-bold leading-none text-base-content",
|
|
250
|
+
children: i
|
|
251
|
+
}),
|
|
252
|
+
d && /* @__PURE__ */ t("p", {
|
|
253
|
+
className: "mt-1.5 text-[11px] text-base-content/50",
|
|
254
|
+
children: d
|
|
255
|
+
})
|
|
256
|
+
]
|
|
257
|
+
});
|
|
258
|
+
}, _ = {
|
|
259
|
+
primary: "text-primary",
|
|
260
|
+
success: "text-success",
|
|
261
|
+
warning: "text-warning",
|
|
262
|
+
info: "text-info",
|
|
263
|
+
error: "text-error",
|
|
264
|
+
neutral: "text-base-content/70"
|
|
265
|
+
}, v = {
|
|
266
|
+
primary: "bg-primary text-primary-content",
|
|
267
|
+
success: "bg-success text-success-content",
|
|
268
|
+
warning: "bg-warning text-warning-content",
|
|
269
|
+
info: "bg-info text-info-content",
|
|
270
|
+
error: "bg-error text-error-content",
|
|
271
|
+
neutral: "bg-neutral text-neutral-content"
|
|
272
|
+
}, y = {
|
|
273
|
+
md: "text-2xl",
|
|
274
|
+
lg: "text-4xl",
|
|
275
|
+
xl: "text-5xl",
|
|
276
|
+
"2xl": "text-6xl"
|
|
277
|
+
}, b = (e) => e === "neutral" ? "var(--color-base-content)" : `var(--color-${e})`, x = ({ data: e, type: r, height: i }) => {
|
|
278
|
+
if (!e || e.length < 2) return null;
|
|
279
|
+
let a = Math.min(...e), o = Math.max(...e) - a || 1, s = (t) => t / (e.length - 1) * 100, c = (e) => i - 3 - (e - a) / o * (i - 6), l = e.map((e, t) => `${s(t).toFixed(2)},${c(e).toFixed(2)}`);
|
|
280
|
+
if (r === "bar") {
|
|
281
|
+
let n = 100 / e.length;
|
|
282
|
+
return /* @__PURE__ */ t("svg", {
|
|
283
|
+
viewBox: `0 0 100 ${i}`,
|
|
284
|
+
preserveAspectRatio: "none",
|
|
285
|
+
className: "block w-full",
|
|
286
|
+
style: { height: i },
|
|
287
|
+
"aria-hidden": "true",
|
|
288
|
+
children: e.map((e, r) => /* @__PURE__ */ t("rect", {
|
|
289
|
+
x: s(r) - n / 2,
|
|
290
|
+
y: c(e),
|
|
291
|
+
width: n * .8,
|
|
292
|
+
height: Math.max(1, i - 3 - c(e)),
|
|
293
|
+
fill: "currentColor"
|
|
294
|
+
}, r))
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
return r === "area" ? /* @__PURE__ */ n("svg", {
|
|
298
|
+
viewBox: `0 0 100 ${i}`,
|
|
299
|
+
preserveAspectRatio: "none",
|
|
300
|
+
className: "block w-full",
|
|
301
|
+
style: { height: i },
|
|
302
|
+
"aria-hidden": "true",
|
|
303
|
+
children: [/* @__PURE__ */ t("path", {
|
|
304
|
+
d: `M0,${i} L${l.join(" L")} L100,${i} Z`,
|
|
305
|
+
fill: "currentColor",
|
|
306
|
+
opacity: .18
|
|
307
|
+
}), /* @__PURE__ */ t("polyline", {
|
|
308
|
+
points: l.join(" "),
|
|
309
|
+
fill: "none",
|
|
310
|
+
stroke: "currentColor",
|
|
311
|
+
strokeWidth: 1.5,
|
|
312
|
+
vectorEffect: "non-scaling-stroke"
|
|
313
|
+
})]
|
|
314
|
+
}) : /* @__PURE__ */ t("svg", {
|
|
315
|
+
viewBox: `0 0 100 ${i}`,
|
|
316
|
+
preserveAspectRatio: "none",
|
|
317
|
+
className: "block w-full",
|
|
318
|
+
style: { height: i },
|
|
319
|
+
"aria-hidden": "true",
|
|
320
|
+
children: /* @__PURE__ */ t("polyline", {
|
|
321
|
+
points: l.join(" "),
|
|
322
|
+
fill: "none",
|
|
323
|
+
stroke: "currentColor",
|
|
324
|
+
strokeWidth: 1.5,
|
|
325
|
+
vectorEffect: "non-scaling-stroke"
|
|
326
|
+
})
|
|
327
|
+
});
|
|
328
|
+
}, S = ({ label: e, value: r, tone: i = "primary", loading: a = !1, className: o = "", unit: s, valueSize: c = "xl", align: l = "left", sparkline: u, sparklineData: d, sparklineType: f = "line", sparklineHeight: p = 36, indicator: m = !1, filled: h = !1, onClick: g }) => {
|
|
329
|
+
let S = u ?? (d && d.length >= 2 ? /* @__PURE__ */ t(x, {
|
|
330
|
+
data: d,
|
|
331
|
+
type: f,
|
|
332
|
+
height: p
|
|
333
|
+
}) : null), C = h ? "" : _[i], w = h ? "opacity-80" : "text-base-content/60";
|
|
334
|
+
return /* @__PURE__ */ n("div", {
|
|
335
|
+
onClick: g,
|
|
336
|
+
className: `relative flex flex-col overflow-hidden rounded-lg p-3 ${h ? v[i] : "border border-base-300/60 bg-base-200"} ${g ? "cursor-pointer transition-colors hover:border-primary/40" : ""} ${o}`.trim(),
|
|
337
|
+
children: [
|
|
338
|
+
m && !h && /* @__PURE__ */ t("span", {
|
|
339
|
+
"aria-hidden": "true",
|
|
340
|
+
className: "absolute right-0 top-0 h-0 w-0",
|
|
341
|
+
style: {
|
|
342
|
+
borderTop: "14px solid " + b(i),
|
|
343
|
+
borderLeft: "14px solid transparent"
|
|
344
|
+
}
|
|
345
|
+
}),
|
|
346
|
+
/* @__PURE__ */ t("div", {
|
|
347
|
+
className: `truncate text-xs font-medium ${w} ${l === "center" ? "text-center" : ""}`.trim(),
|
|
348
|
+
children: e
|
|
349
|
+
}),
|
|
350
|
+
/* @__PURE__ */ t("div", {
|
|
351
|
+
className: `flex min-h-[3rem] flex-1 items-center py-1 ${l === "center" ? "justify-center" : "justify-start"}`,
|
|
352
|
+
children: a ? /* @__PURE__ */ t("span", { className: `inline-block h-8 w-16 animate-pulse rounded ${h ? "bg-white/25" : "bg-base-content/10"}` }) : /* @__PURE__ */ n("span", {
|
|
353
|
+
className: `leading-none tracking-tight ${y[c]} font-semibold ${h ? "" : C}`.trim(),
|
|
354
|
+
children: [r, s != null && s !== "" && /* @__PURE__ */ t("span", {
|
|
355
|
+
className: "ml-0.5 text-[0.45em] font-semibold",
|
|
356
|
+
children: s
|
|
357
|
+
})]
|
|
358
|
+
})
|
|
359
|
+
}),
|
|
360
|
+
S && /* @__PURE__ */ t("div", {
|
|
361
|
+
className: `-mx-3 -mb-3 mt-1 ${h ? "text-white" : _[i]}`,
|
|
362
|
+
children: S
|
|
363
|
+
})
|
|
364
|
+
]
|
|
365
|
+
});
|
|
366
|
+
}, C = r;
|
|
367
|
+
C.Title = i, C.Body = a, C.Actions = o, C.Figure = l, C.Feature = f, C.Quote = p, C.Meta = m, C.Info = g, C.Stat = S;
|
|
178
368
|
//#endregion
|
|
179
|
-
export {
|
|
369
|
+
export { C as default };
|
|
180
370
|
|
|
181
371
|
//# sourceMappingURL=index.js.map
|