@stackframe/dashboard-ui-components 2.8.76
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/LICENSE +5 -0
- package/dist/chunk-BE-pF4vm.js +34 -0
- package/dist/components/alert.d.ts +22 -0
- package/dist/components/alert.d.ts.map +1 -0
- package/dist/components/alert.js +75 -0
- package/dist/components/alert.js.map +1 -0
- package/dist/components/badge.d.ts +24 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +59 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/button.d.ts +32 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +68 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/card.d.ts +59 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +133 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/chart-card.d.ts +21 -0
- package/dist/components/chart-card.d.ts.map +1 -0
- package/dist/components/chart-card.js +54 -0
- package/dist/components/chart-card.js.map +1 -0
- package/dist/components/chart-container.d.ts +51 -0
- package/dist/components/chart-container.d.ts.map +1 -0
- package/dist/components/chart-container.js +77 -0
- package/dist/components/chart-container.js.map +1 -0
- package/dist/components/chart-legend.d.ts +12 -0
- package/dist/components/chart-legend.d.ts.map +1 -0
- package/dist/components/chart-legend.js +41 -0
- package/dist/components/chart-legend.js.map +1 -0
- package/dist/components/chart-theme.d.ts +26 -0
- package/dist/components/chart-theme.d.ts.map +1 -0
- package/dist/components/chart-theme.js +64 -0
- package/dist/components/chart-theme.js.map +1 -0
- package/dist/components/chart-tooltip.d.ts +41 -0
- package/dist/components/chart-tooltip.d.ts.map +1 -0
- package/dist/components/chart-tooltip.js +89 -0
- package/dist/components/chart-tooltip.js.map +1 -0
- package/dist/components/cursor-blast-effect.d.ts +27 -0
- package/dist/components/cursor-blast-effect.d.ts.map +1 -0
- package/dist/components/cursor-blast-effect.js +243 -0
- package/dist/components/cursor-blast-effect.js.map +1 -0
- package/dist/components/edit-mode.d.ts +12 -0
- package/dist/components/edit-mode.d.ts.map +1 -0
- package/dist/components/edit-mode.js +23 -0
- package/dist/components/edit-mode.js.map +1 -0
- package/dist/components/empty-state.d.ts +21 -0
- package/dist/components/empty-state.d.ts.map +1 -0
- package/dist/components/empty-state.js +37 -0
- package/dist/components/empty-state.js.map +1 -0
- package/dist/components/input.d.ts +18 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +53 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/metric-card.d.ts +31 -0
- package/dist/components/metric-card.d.ts.map +1 -0
- package/dist/components/metric-card.js +88 -0
- package/dist/components/metric-card.js.map +1 -0
- package/dist/components/pill-toggle.d.ts +33 -0
- package/dist/components/pill-toggle.d.ts.map +1 -0
- package/dist/components/pill-toggle.js +86 -0
- package/dist/components/pill-toggle.js.map +1 -0
- package/dist/components/progress-bar.d.ts +25 -0
- package/dist/components/progress-bar.d.ts.map +1 -0
- package/dist/components/progress-bar.js +44 -0
- package/dist/components/progress-bar.js.map +1 -0
- package/dist/components/separator.d.ts +14 -0
- package/dist/components/separator.d.ts.map +1 -0
- package/dist/components/separator.js +20 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/skeleton.d.ts +12 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton.js +18 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/table.d.ts +24 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/table.js +59 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.d.ts +34 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +100 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/dashboard-ui-components.global.js +15232 -0
- package/dist/dashboard-ui-components.global.js.map +7 -0
- package/dist/esm/components/alert.d.ts +22 -0
- package/dist/esm/components/alert.d.ts.map +1 -0
- package/dist/esm/components/alert.js +73 -0
- package/dist/esm/components/alert.js.map +1 -0
- package/dist/esm/components/badge.d.ts +24 -0
- package/dist/esm/components/badge.d.ts.map +1 -0
- package/dist/esm/components/badge.js +57 -0
- package/dist/esm/components/badge.js.map +1 -0
- package/dist/esm/components/button.d.ts +32 -0
- package/dist/esm/components/button.d.ts.map +1 -0
- package/dist/esm/components/button.js +65 -0
- package/dist/esm/components/button.js.map +1 -0
- package/dist/esm/components/card.d.ts +59 -0
- package/dist/esm/components/card.d.ts.map +1 -0
- package/dist/esm/components/card.js +127 -0
- package/dist/esm/components/card.js.map +1 -0
- package/dist/esm/components/chart-card.d.ts +21 -0
- package/dist/esm/components/chart-card.d.ts.map +1 -0
- package/dist/esm/components/chart-card.js +51 -0
- package/dist/esm/components/chart-card.js.map +1 -0
- package/dist/esm/components/chart-container.d.ts +51 -0
- package/dist/esm/components/chart-container.d.ts.map +1 -0
- package/dist/esm/components/chart-container.js +70 -0
- package/dist/esm/components/chart-container.js.map +1 -0
- package/dist/esm/components/chart-legend.d.ts +12 -0
- package/dist/esm/components/chart-legend.d.ts.map +1 -0
- package/dist/esm/components/chart-legend.js +36 -0
- package/dist/esm/components/chart-legend.js.map +1 -0
- package/dist/esm/components/chart-theme.d.ts +26 -0
- package/dist/esm/components/chart-theme.d.ts.map +1 -0
- package/dist/esm/components/chart-theme.js +59 -0
- package/dist/esm/components/chart-theme.js.map +1 -0
- package/dist/esm/components/chart-tooltip.d.ts +41 -0
- package/dist/esm/components/chart-tooltip.d.ts.map +1 -0
- package/dist/esm/components/chart-tooltip.js +84 -0
- package/dist/esm/components/chart-tooltip.js.map +1 -0
- package/dist/esm/components/cursor-blast-effect.d.ts +27 -0
- package/dist/esm/components/cursor-blast-effect.d.ts.map +1 -0
- package/dist/esm/components/cursor-blast-effect.js +241 -0
- package/dist/esm/components/cursor-blast-effect.js.map +1 -0
- package/dist/esm/components/edit-mode.d.ts +12 -0
- package/dist/esm/components/edit-mode.d.ts.map +1 -0
- package/dist/esm/components/edit-mode.js +20 -0
- package/dist/esm/components/edit-mode.js.map +1 -0
- package/dist/esm/components/empty-state.d.ts +21 -0
- package/dist/esm/components/empty-state.d.ts.map +1 -0
- package/dist/esm/components/empty-state.js +34 -0
- package/dist/esm/components/empty-state.js.map +1 -0
- package/dist/esm/components/input.d.ts +18 -0
- package/dist/esm/components/input.d.ts.map +1 -0
- package/dist/esm/components/input.js +50 -0
- package/dist/esm/components/input.js.map +1 -0
- package/dist/esm/components/metric-card.d.ts +31 -0
- package/dist/esm/components/metric-card.d.ts.map +1 -0
- package/dist/esm/components/metric-card.js +85 -0
- package/dist/esm/components/metric-card.js.map +1 -0
- package/dist/esm/components/pill-toggle.d.ts +33 -0
- package/dist/esm/components/pill-toggle.d.ts.map +1 -0
- package/dist/esm/components/pill-toggle.js +84 -0
- package/dist/esm/components/pill-toggle.js.map +1 -0
- package/dist/esm/components/progress-bar.d.ts +25 -0
- package/dist/esm/components/progress-bar.d.ts.map +1 -0
- package/dist/esm/components/progress-bar.js +42 -0
- package/dist/esm/components/progress-bar.js.map +1 -0
- package/dist/esm/components/separator.d.ts +14 -0
- package/dist/esm/components/separator.d.ts.map +1 -0
- package/dist/esm/components/separator.js +18 -0
- package/dist/esm/components/separator.js.map +1 -0
- package/dist/esm/components/skeleton.d.ts +12 -0
- package/dist/esm/components/skeleton.d.ts.map +1 -0
- package/dist/esm/components/skeleton.js +16 -0
- package/dist/esm/components/skeleton.js.map +1 -0
- package/dist/esm/components/table.d.ts +24 -0
- package/dist/esm/components/table.d.ts.map +1 -0
- package/dist/esm/components/table.js +51 -0
- package/dist/esm/components/table.js.map +1 -0
- package/dist/esm/components/tabs.d.ts +34 -0
- package/dist/esm/components/tabs.d.ts.map +1 -0
- package/dist/esm/components/tabs.js +98 -0
- package/dist/esm/components/tabs.js.map +1 -0
- package/dist/esm/index.d.ts +21 -0
- package/dist/esm/index.js +22 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +245 -0
- package/package.json +71 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/components/alert.d.ts
|
|
4
|
+
type DesignAlertVariant = "default" | "success" | "error" | "warning" | "info";
|
|
5
|
+
type DesignAlertProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
6
|
+
variant?: DesignAlertVariant;
|
|
7
|
+
title?: React.ReactNode;
|
|
8
|
+
description?: React.ReactNode;
|
|
9
|
+
glassmorphic?: boolean;
|
|
10
|
+
};
|
|
11
|
+
declare function DesignAlert({
|
|
12
|
+
variant,
|
|
13
|
+
title,
|
|
14
|
+
description,
|
|
15
|
+
glassmorphic,
|
|
16
|
+
className,
|
|
17
|
+
children,
|
|
18
|
+
...props
|
|
19
|
+
}: DesignAlertProps): react_jsx_runtime0.JSX.Element;
|
|
20
|
+
//#endregion
|
|
21
|
+
export { DesignAlert, DesignAlertProps };
|
|
22
|
+
//# sourceMappingURL=alert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert.d.ts","names":[],"sources":["../../../src/components/alert.tsx"],"mappings":";;;KAKK,kBAAA;AAAA,KAmEO,gBAAA,GAAmB,KAAA,CAAM,cAAA,CAAe,cAAA;EAClD,OAAA,GAAU,kBAAA;EACV,KAAA,GAAQ,KAAA,CAAM,SAAA;EACd,WAAA,GAAc,KAAA,CAAM,SAAA;EACpB,YAAA;AAAA;AAAA,iBAGc,WAAA,CAAA;EACd,OAAA;EACA,KAAA;EACA,WAAA;EACA,YAAA;EACA,SAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,gBAAA,GAAgB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { CheckCircle, Info, WarningCircle, XCircle } from "@phosphor-icons/react";
|
|
4
|
+
import { cn } from "@stackframe/stack-ui";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
|
|
7
|
+
//#region src/components/alert.tsx
|
|
8
|
+
const variantIconMap = new Map([
|
|
9
|
+
["default", Info],
|
|
10
|
+
["success", CheckCircle],
|
|
11
|
+
["error", XCircle],
|
|
12
|
+
["warning", WarningCircle],
|
|
13
|
+
["info", Info]
|
|
14
|
+
]);
|
|
15
|
+
const variantStyles = new Map([
|
|
16
|
+
["default", {
|
|
17
|
+
container: "bg-background border-border",
|
|
18
|
+
icon: "text-foreground",
|
|
19
|
+
title: "text-foreground"
|
|
20
|
+
}],
|
|
21
|
+
["success", {
|
|
22
|
+
container: "bg-green-500/[0.06] border-green-500/30",
|
|
23
|
+
icon: "text-green-500",
|
|
24
|
+
title: "text-green-600 dark:text-green-400"
|
|
25
|
+
}],
|
|
26
|
+
["error", {
|
|
27
|
+
container: "bg-red-500/[0.06] border-red-500/30",
|
|
28
|
+
icon: "text-red-500",
|
|
29
|
+
title: "text-red-600 dark:text-red-400"
|
|
30
|
+
}],
|
|
31
|
+
["warning", {
|
|
32
|
+
container: "bg-amber-500/[0.08] border-amber-500/40",
|
|
33
|
+
icon: "text-amber-600 dark:text-amber-400",
|
|
34
|
+
title: "text-amber-700 dark:text-amber-300"
|
|
35
|
+
}],
|
|
36
|
+
["info", {
|
|
37
|
+
container: "bg-blue-500/[0.06] border-blue-500/30",
|
|
38
|
+
icon: "text-blue-500",
|
|
39
|
+
title: "text-blue-600 dark:text-blue-400"
|
|
40
|
+
}]
|
|
41
|
+
]);
|
|
42
|
+
function getMapValueOrThrow(map, key, mapName) {
|
|
43
|
+
const value = map.get(key);
|
|
44
|
+
if (!value) throw new Error(`Missing ${mapName} entry for key "${String(key)}"`);
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
function DesignAlert({ variant = "default", title, description, glassmorphic = false, className, children, ...props }) {
|
|
48
|
+
const styles = getMapValueOrThrow(variantStyles, variant, "variantStyles");
|
|
49
|
+
const Icon = getMapValueOrThrow(variantIconMap, variant, "variantIconMap");
|
|
50
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
51
|
+
role: "alert",
|
|
52
|
+
className: cn("relative w-full rounded-2xl border p-4 text-sm", "flex gap-3 items-start", styles.container, glassmorphic && "backdrop-blur-xl", className),
|
|
53
|
+
...props,
|
|
54
|
+
children: [/* @__PURE__ */ jsx(Icon, { className: cn("h-4 w-4 mt-0.5 flex-shrink-0", styles.icon) }), /* @__PURE__ */ jsxs("div", {
|
|
55
|
+
className: "min-w-0",
|
|
56
|
+
children: [
|
|
57
|
+
title && /* @__PURE__ */ jsx("h5", {
|
|
58
|
+
className: cn("mb-1 font-medium leading-none tracking-tight", styles.title),
|
|
59
|
+
children: title
|
|
60
|
+
}),
|
|
61
|
+
description && /* @__PURE__ */ jsx("div", {
|
|
62
|
+
className: "text-sm text-foreground/80 dark:text-muted-foreground [&_p]:leading-relaxed",
|
|
63
|
+
children: description
|
|
64
|
+
}),
|
|
65
|
+
children
|
|
66
|
+
]
|
|
67
|
+
})]
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
//#endregion
|
|
72
|
+
export { DesignAlert };
|
|
73
|
+
//# sourceMappingURL=alert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alert.js","names":[],"sources":["../../../src/components/alert.tsx"],"sourcesContent":["\"use client\";\n\nimport { CheckCircle, Info, WarningCircle, XCircle } from \"@phosphor-icons/react\";\nimport { cn } from \"@stackframe/stack-ui\";\n\ntype DesignAlertVariant = \"default\" | \"success\" | \"error\" | \"warning\" | \"info\";\n\nconst variantIconMap = new Map<DesignAlertVariant, React.ElementType>([\n [\"default\", Info],\n [\"success\", CheckCircle],\n [\"error\", XCircle],\n [\"warning\", WarningCircle],\n [\"info\", Info],\n]);\n\ntype VariantStyles = {\n container: string,\n icon: string,\n title: string,\n};\n\nconst variantStyles = new Map<DesignAlertVariant, VariantStyles>([\n [\n \"default\",\n {\n container: \"bg-background border-border\",\n icon: \"text-foreground\",\n title: \"text-foreground\",\n },\n ],\n [\n \"success\",\n {\n container: \"bg-green-500/[0.06] border-green-500/30\",\n icon: \"text-green-500\",\n title: \"text-green-600 dark:text-green-400\",\n },\n ],\n [\n \"error\",\n {\n container: \"bg-red-500/[0.06] border-red-500/30\",\n icon: \"text-red-500\",\n title: \"text-red-600 dark:text-red-400\",\n },\n ],\n [\n \"warning\",\n {\n container: \"bg-amber-500/[0.08] border-amber-500/40\",\n icon: \"text-amber-600 dark:text-amber-400\",\n title: \"text-amber-700 dark:text-amber-300\",\n },\n ],\n [\n \"info\",\n {\n container: \"bg-blue-500/[0.06] border-blue-500/30\",\n icon: \"text-blue-500\",\n title: \"text-blue-600 dark:text-blue-400\",\n },\n ],\n]);\n\nfunction getMapValueOrThrow<TKey, TValue>(map: Map<TKey, TValue>, key: TKey, mapName: string) {\n const value = map.get(key);\n if (!value) {\n throw new Error(`Missing ${mapName} entry for key \"${String(key)}\"`);\n }\n return value;\n}\n\nexport type DesignAlertProps = React.HTMLAttributes<HTMLDivElement> & {\n variant?: DesignAlertVariant,\n title?: React.ReactNode,\n description?: React.ReactNode,\n glassmorphic?: boolean,\n};\n\nexport function DesignAlert({\n variant = \"default\",\n title,\n description,\n glassmorphic = false,\n className,\n children,\n ...props\n}: DesignAlertProps) {\n const styles = getMapValueOrThrow(variantStyles, variant, \"variantStyles\");\n const Icon = getMapValueOrThrow(variantIconMap, variant, \"variantIconMap\");\n\n return (\n <div\n role=\"alert\"\n className={cn(\n \"relative w-full rounded-2xl border p-4 text-sm\",\n \"flex gap-3 items-start\",\n styles.container,\n glassmorphic && \"backdrop-blur-xl\",\n className\n )}\n {...props}\n >\n <Icon className={cn(\"h-4 w-4 mt-0.5 flex-shrink-0\", styles.icon)} />\n <div className=\"min-w-0\">\n {title && (\n <h5 className={cn(\"mb-1 font-medium leading-none tracking-tight\", styles.title)}>\n {title}\n </h5>\n )}\n {description && (\n <div className=\"text-sm text-foreground/80 dark:text-muted-foreground [&_p]:leading-relaxed\">\n {description}\n </div>\n )}\n {children}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAOA,MAAM,iBAAiB,IAAI,IAA2C;CACpE,CAAC,WAAW,KAAK;CACjB,CAAC,WAAW,YAAY;CACxB,CAAC,SAAS,QAAQ;CAClB,CAAC,WAAW,cAAc;CAC1B,CAAC,QAAQ,KAAK;CACf,CAAC;AAQF,MAAM,gBAAgB,IAAI,IAAuC;CAC/D,CACE,WACA;EACE,WAAW;EACX,MAAM;EACN,OAAO;EACR,CACF;CACD,CACE,WACA;EACE,WAAW;EACX,MAAM;EACN,OAAO;EACR,CACF;CACD,CACE,SACA;EACE,WAAW;EACX,MAAM;EACN,OAAO;EACR,CACF;CACD,CACE,WACA;EACE,WAAW;EACX,MAAM;EACN,OAAO;EACR,CACF;CACD,CACE,QACA;EACE,WAAW;EACX,MAAM;EACN,OAAO;EACR,CACF;CACF,CAAC;AAEF,SAAS,mBAAiC,KAAwB,KAAW,SAAiB;CAC5F,MAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,WAAW,QAAQ,kBAAkB,OAAO,IAAI,CAAC,GAAG;AAEtE,QAAO;;AAUT,SAAgB,YAAY,EAC1B,UAAU,WACV,OACA,aACA,eAAe,OACf,WACA,UACA,GAAG,SACgB;CACnB,MAAM,SAAS,mBAAmB,eAAe,SAAS,gBAAgB;CAC1E,MAAM,OAAO,mBAAmB,gBAAgB,SAAS,iBAAiB;AAE1E,QACE,qBAAC;EACC,MAAK;EACL,WAAW,GACT,kDACA,0BACA,OAAO,WACP,gBAAgB,oBAChB,UACD;EACD,GAAI;aAEJ,oBAAC,QAAK,WAAW,GAAG,gCAAgC,OAAO,KAAK,GAAI,EACpE,qBAAC;GAAI,WAAU;;IACZ,SACC,oBAAC;KAAG,WAAW,GAAG,gDAAgD,OAAO,MAAM;eAC5E;MACE;IAEN,eACC,oBAAC;KAAI,WAAU;eACZ;MACG;IAEP;;IACG;GACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/components/badge.d.ts
|
|
4
|
+
type DesignBadgeColor = "blue" | "cyan" | "purple" | "green" | "orange" | "red";
|
|
5
|
+
type DesignBadgeSize = "sm" | "md";
|
|
6
|
+
/** At least one of showLabel or showIcon must be true. */
|
|
7
|
+
type DesignBadgeContentMode = "both" | "text" | "icon";
|
|
8
|
+
type DesignBadgeProps = {
|
|
9
|
+
label: string;
|
|
10
|
+
color: DesignBadgeColor;
|
|
11
|
+
icon?: React.ElementType;
|
|
12
|
+
size?: DesignBadgeSize; /** What to display: "both" (default), "text" (label only), or "icon" (icon only; requires icon prop). */
|
|
13
|
+
contentMode?: DesignBadgeContentMode;
|
|
14
|
+
};
|
|
15
|
+
declare function DesignBadge({
|
|
16
|
+
label,
|
|
17
|
+
color,
|
|
18
|
+
icon,
|
|
19
|
+
size,
|
|
20
|
+
contentMode
|
|
21
|
+
}: DesignBadgeProps): react_jsx_runtime0.JSX.Element;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { DesignBadge, DesignBadgeColor, DesignBadgeContentMode, DesignBadgeProps, DesignBadgeSize };
|
|
24
|
+
//# sourceMappingURL=badge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.d.ts","names":[],"sources":["../../../src/components/badge.tsx"],"mappings":";;;KAIY,gBAAA;AAAA,KACA,eAAA;;KAoBA,sBAAA;AAAA,KAEA,gBAAA;EACV,KAAA;EACA,KAAA,EAAO,gBAAA;EACP,IAAA,GAAO,KAAA,CAAM,WAAA;EACb,IAAA,GAAO,eAAA,EA1BkB;EA4BzB,WAAA,GAAc,sBAAA;AAAA;AAAA,iBA2BA,WAAA,CAAA;EACd,KAAA;EACA,KAAA;EACA,IAAA;EACA,IAAA;EACA;AAAA,GACC,gBAAA,GAAgB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { cn } from "@stackframe/stack-ui";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
|
|
6
|
+
//#region src/components/badge.tsx
|
|
7
|
+
const badgeStyles = new Map([
|
|
8
|
+
["blue", "text-blue-700 dark:text-blue-400 bg-blue-500/20 dark:bg-blue-500/10 ring-1 ring-blue-500/30 dark:ring-blue-500/20"],
|
|
9
|
+
["cyan", "text-cyan-700 dark:text-cyan-400 bg-cyan-500/20 dark:bg-cyan-500/10 ring-1 ring-cyan-500/30 dark:ring-cyan-500/20"],
|
|
10
|
+
["purple", "text-purple-700 dark:text-purple-400 bg-purple-500/20 dark:bg-purple-500/10 ring-1 ring-purple-500/30 dark:ring-purple-500/20"],
|
|
11
|
+
["green", "text-emerald-700 dark:text-emerald-400 bg-emerald-500/20 dark:bg-emerald-500/10 ring-1 ring-emerald-500/30 dark:ring-emerald-500/20"],
|
|
12
|
+
["orange", "text-amber-700 dark:text-amber-300 bg-amber-500/20 dark:bg-amber-500/10 ring-1 ring-amber-500/30 dark:ring-amber-500/20"],
|
|
13
|
+
["red", "text-red-700 dark:text-red-400 bg-red-500/20 dark:bg-red-500/10 ring-1 ring-red-500/30 dark:ring-red-500/20"]
|
|
14
|
+
]);
|
|
15
|
+
function getMapValueOrThrow(map, key, mapName) {
|
|
16
|
+
const value = map.get(key);
|
|
17
|
+
if (!value) throw new Error(`Missing ${mapName} entry for key "${String(key)}"`);
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
function getShowLabelShowIcon(contentMode, hasIcon) {
|
|
21
|
+
switch (contentMode) {
|
|
22
|
+
case "both": return {
|
|
23
|
+
showLabel: true,
|
|
24
|
+
showIcon: hasIcon
|
|
25
|
+
};
|
|
26
|
+
case "text": return {
|
|
27
|
+
showLabel: true,
|
|
28
|
+
showIcon: false
|
|
29
|
+
};
|
|
30
|
+
case "icon":
|
|
31
|
+
if (!hasIcon) throw new Error("DesignBadge contentMode 'icon' requires the icon prop to be provided.");
|
|
32
|
+
return {
|
|
33
|
+
showLabel: false,
|
|
34
|
+
showIcon: true
|
|
35
|
+
};
|
|
36
|
+
default: {
|
|
37
|
+
const _exhaustive = contentMode;
|
|
38
|
+
throw new Error(`Unknown contentMode: ${String(_exhaustive)}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function DesignBadge({ label, color, icon, size = "md", contentMode = "both" }) {
|
|
43
|
+
const Icon = icon;
|
|
44
|
+
const { showLabel, showIcon } = getShowLabelShowIcon(contentMode, !!Icon);
|
|
45
|
+
if (!showLabel && !showIcon) throw new Error("DesignBadge must show at least label or icon.");
|
|
46
|
+
const sizeClasses = size === "sm" ? "px-2 py-0.5 text-[10px]" : "px-2.5 py-1 text-[11px]";
|
|
47
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
48
|
+
className: cn("inline-flex items-center gap-1.5 rounded-full font-medium", getMapValueOrThrow(badgeStyles, color, "badgeStyles"), sizeClasses),
|
|
49
|
+
title: !showLabel ? label : void 0,
|
|
50
|
+
"aria-label": label,
|
|
51
|
+
children: [showIcon && Icon && /* @__PURE__ */ jsx(Icon, { className: "h-3 w-3" }), showLabel ? label : null]
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
//#endregion
|
|
56
|
+
export { DesignBadge };
|
|
57
|
+
//# sourceMappingURL=badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.js","names":[],"sources":["../../../src/components/badge.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"@stackframe/stack-ui\";\n\nexport type DesignBadgeColor = \"blue\" | \"cyan\" | \"purple\" | \"green\" | \"orange\" | \"red\";\nexport type DesignBadgeSize = \"sm\" | \"md\";\n\nconst badgeStyles = new Map<DesignBadgeColor, string>([\n [\"blue\", \"text-blue-700 dark:text-blue-400 bg-blue-500/20 dark:bg-blue-500/10 ring-1 ring-blue-500/30 dark:ring-blue-500/20\"],\n [\"cyan\", \"text-cyan-700 dark:text-cyan-400 bg-cyan-500/20 dark:bg-cyan-500/10 ring-1 ring-cyan-500/30 dark:ring-cyan-500/20\"],\n [\"purple\", \"text-purple-700 dark:text-purple-400 bg-purple-500/20 dark:bg-purple-500/10 ring-1 ring-purple-500/30 dark:ring-purple-500/20\"],\n [\"green\", \"text-emerald-700 dark:text-emerald-400 bg-emerald-500/20 dark:bg-emerald-500/10 ring-1 ring-emerald-500/30 dark:ring-emerald-500/20\"],\n [\"orange\", \"text-amber-700 dark:text-amber-300 bg-amber-500/20 dark:bg-amber-500/10 ring-1 ring-amber-500/30 dark:ring-amber-500/20\"],\n [\"red\", \"text-red-700 dark:text-red-400 bg-red-500/20 dark:bg-red-500/10 ring-1 ring-red-500/30 dark:ring-red-500/20\"],\n]);\n\nfunction getMapValueOrThrow<TKey, TValue>(map: Map<TKey, TValue>, key: TKey, mapName: string) {\n const value = map.get(key);\n if (!value) {\n throw new Error(`Missing ${mapName} entry for key \"${String(key)}\"`);\n }\n return value;\n}\n\n/** At least one of showLabel or showIcon must be true. */\nexport type DesignBadgeContentMode = \"both\" | \"text\" | \"icon\";\n\nexport type DesignBadgeProps = {\n label: string,\n color: DesignBadgeColor,\n icon?: React.ElementType,\n size?: DesignBadgeSize,\n /** What to display: \"both\" (default), \"text\" (label only), or \"icon\" (icon only; requires icon prop). */\n contentMode?: DesignBadgeContentMode,\n};\n\nfunction getShowLabelShowIcon(\n contentMode: DesignBadgeContentMode,\n hasIcon: boolean,\n): { showLabel: boolean, showIcon: boolean } {\n switch (contentMode) {\n case \"both\": {\n return { showLabel: true, showIcon: hasIcon };\n }\n case \"text\": {\n return { showLabel: true, showIcon: false };\n }\n case \"icon\": {\n if (!hasIcon) {\n throw new Error(\"DesignBadge contentMode 'icon' requires the icon prop to be provided.\");\n }\n return { showLabel: false, showIcon: true };\n }\n default: {\n const _exhaustive: never = contentMode;\n throw new Error(`Unknown contentMode: ${String(_exhaustive)}`);\n }\n }\n}\n\nexport function DesignBadge({\n label,\n color,\n icon,\n size = \"md\",\n contentMode = \"both\",\n}: DesignBadgeProps) {\n const Icon = icon;\n const { showLabel, showIcon } = getShowLabelShowIcon(contentMode, !!Icon);\n if (!showLabel && !showIcon) {\n throw new Error(\"DesignBadge must show at least label or icon.\");\n }\n const sizeClasses = size === \"sm\"\n ? \"px-2 py-0.5 text-[10px]\"\n : \"px-2.5 py-1 text-[11px]\";\n const colorClasses = getMapValueOrThrow(badgeStyles, color, \"badgeStyles\");\n\n return (\n <div\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full font-medium\",\n colorClasses,\n sizeClasses\n )}\n title={!showLabel ? label : undefined}\n aria-label={label}\n >\n {showIcon && Icon && <Icon className=\"h-3 w-3\" />}\n {showLabel ? label : null}\n </div>\n );\n}\n"],"mappings":";;;;;;AAOA,MAAM,cAAc,IAAI,IAA8B;CACpD,CAAC,QAAQ,oHAAoH;CAC7H,CAAC,QAAQ,oHAAoH;CAC7H,CAAC,UAAU,gIAAgI;CAC3I,CAAC,SAAS,sIAAsI;CAChJ,CAAC,UAAU,0HAA0H;CACrI,CAAC,OAAO,8GAA8G;CACvH,CAAC;AAEF,SAAS,mBAAiC,KAAwB,KAAW,SAAiB;CAC5F,MAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,WAAW,QAAQ,kBAAkB,OAAO,IAAI,CAAC,GAAG;AAEtE,QAAO;;AAeT,SAAS,qBACP,aACA,SAC2C;AAC3C,SAAQ,aAAR;EACE,KAAK,OACH,QAAO;GAAE,WAAW;GAAM,UAAU;GAAS;EAE/C,KAAK,OACH,QAAO;GAAE,WAAW;GAAM,UAAU;GAAO;EAE7C,KAAK;AACH,OAAI,CAAC,QACH,OAAM,IAAI,MAAM,wEAAwE;AAE1F,UAAO;IAAE,WAAW;IAAO,UAAU;IAAM;EAE7C,SAAS;GACP,MAAM,cAAqB;AAC3B,SAAM,IAAI,MAAM,wBAAwB,OAAO,YAAY,GAAG;;;;AAKpE,SAAgB,YAAY,EAC1B,OACA,OACA,MACA,OAAO,MACP,cAAc,UACK;CACnB,MAAM,OAAO;CACb,MAAM,EAAE,WAAW,aAAa,qBAAqB,aAAa,CAAC,CAAC,KAAK;AACzE,KAAI,CAAC,aAAa,CAAC,SACjB,OAAM,IAAI,MAAM,gDAAgD;CAElE,MAAM,cAAc,SAAS,OACzB,4BACA;AAGJ,QACE,qBAAC;EACC,WAAW,GACT,6DALe,mBAAmB,aAAa,OAAO,cAAc,EAOpE,YACD;EACD,OAAO,CAAC,YAAY,QAAQ;EAC5B,cAAY;aAEX,YAAY,QAAQ,oBAAC,QAAK,WAAU,YAAY,EAChD,YAAY,QAAQ;GACjB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { VariantProps } from "class-variance-authority";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import * as class_variance_authority_types0 from "class-variance-authority/types";
|
|
4
|
+
|
|
5
|
+
//#region src/components/button.d.ts
|
|
6
|
+
declare const designButtonVariants: (props?: ({
|
|
7
|
+
variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | "plain" | null | undefined;
|
|
8
|
+
size?: "icon" | "default" | "sm" | "lg" | null | undefined;
|
|
9
|
+
} & class_variance_authority_types0.ClassProp) | undefined) => string;
|
|
10
|
+
type DesignOriginalButtonProps = {
|
|
11
|
+
asChild?: boolean;
|
|
12
|
+
} & React.ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<typeof designButtonVariants>;
|
|
13
|
+
type DesignButtonProps = {
|
|
14
|
+
onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void | Promise<void>;
|
|
15
|
+
loading?: boolean;
|
|
16
|
+
loadingStyle?: "spinner" | "disabled";
|
|
17
|
+
} & DesignOriginalButtonProps;
|
|
18
|
+
declare const DesignButton: React.FC<{
|
|
19
|
+
onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void | Promise<void>;
|
|
20
|
+
loading?: boolean;
|
|
21
|
+
loadingStyle?: "spinner" | "disabled";
|
|
22
|
+
} & {
|
|
23
|
+
asChild?: boolean;
|
|
24
|
+
} & React.ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<(props?: ({
|
|
25
|
+
variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | "plain" | null | undefined;
|
|
26
|
+
size?: "icon" | "default" | "sm" | "lg" | null | undefined;
|
|
27
|
+
} & class_variance_authority_types0.ClassProp) | undefined) => string> & {
|
|
28
|
+
ref?: React.Ref<HTMLButtonElement> | undefined;
|
|
29
|
+
}>;
|
|
30
|
+
//#endregion
|
|
31
|
+
export { DesignButton, DesignButtonProps, DesignOriginalButtonProps };
|
|
32
|
+
//# sourceMappingURL=button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.d.ts","names":[],"sources":["../../../src/components/button.tsx"],"mappings":";;;;;cASM,oBAAA,GAAoB,KAAA;;;IA6BzB,+BAAA,CAAA,SAAA;AAAA,KAEW,yBAAA;EACV,OAAA;AAAA,IACE,KAAA,CAAM,oBAAA,CAAqB,iBAAA,IAAqB,YAAA,QAAoB,oBAAA;AAAA,KAgB5D,iBAAA;EACV,OAAA,IAAW,CAAA,EAAG,KAAA,CAAM,UAAA,CAAW,iBAAA,aAA8B,OAAA;EAC7D,OAAA;EACA,YAAA;AAAA,IACE,yBAAA;AAAA,cAES,YAAA,EAAY,KAAA,CAAA,EAAA;aALZ,CAAA,EAAG,KAAA,CAAM,UAAA,CAAW,iBAAA,aAA8B,OAAA"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Spinner, cn } from "@stackframe/stack-ui";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Slot, Slottable } from "@radix-ui/react-slot";
|
|
4
|
+
import { forwardRefIfNeeded } from "@stackframe/stack-shared/dist/utils/react";
|
|
5
|
+
import { cva } from "class-variance-authority";
|
|
6
|
+
import React from "react";
|
|
7
|
+
import { useAsyncCallback } from "@stackframe/stack-shared/dist/hooks/use-async-callback";
|
|
8
|
+
import { runAsynchronouslyWithAlert } from "@stackframe/stack-shared/dist/utils/promises";
|
|
9
|
+
|
|
10
|
+
//#region src/components/button.tsx
|
|
11
|
+
const designButtonVariants = cva("stack-scope inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50", {
|
|
12
|
+
variants: {
|
|
13
|
+
variant: {
|
|
14
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/90",
|
|
15
|
+
destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
|
16
|
+
outline: "border border-input bg-white/85 dark:bg-background hover:bg-white dark:hover:bg-accent hover:text-accent-foreground",
|
|
17
|
+
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
18
|
+
ghost: "hover:bg-accent hover:text-accent-foreground",
|
|
19
|
+
link: "text-primary underline-offset-4 hover:underline",
|
|
20
|
+
plain: ""
|
|
21
|
+
},
|
|
22
|
+
size: {
|
|
23
|
+
default: "h-9 px-4 py-2",
|
|
24
|
+
sm: "h-8 rounded-md px-3 text-xs",
|
|
25
|
+
lg: "h-10 rounded-md px-8",
|
|
26
|
+
icon: "h-9 w-9"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
defaultVariants: {
|
|
30
|
+
variant: "default",
|
|
31
|
+
size: "default"
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
const DesignOriginalButton = forwardRefIfNeeded(({ className, variant, size, asChild = false, ...props }, ref) => {
|
|
35
|
+
return /* @__PURE__ */ jsx(asChild ? Slot : "button", {
|
|
36
|
+
className: cn(designButtonVariants({
|
|
37
|
+
variant,
|
|
38
|
+
size,
|
|
39
|
+
className
|
|
40
|
+
})),
|
|
41
|
+
ref,
|
|
42
|
+
...props
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
DesignOriginalButton.displayName = "DesignButton";
|
|
46
|
+
const DesignButton = forwardRefIfNeeded(({ onClick, loading: loadingProp, loadingStyle = "spinner", children, size, ...props }, ref) => {
|
|
47
|
+
const [handleClick, isLoading] = useAsyncCallback(async (e) => {
|
|
48
|
+
await onClick?.(e);
|
|
49
|
+
}, [onClick]);
|
|
50
|
+
const loading = loadingProp || isLoading;
|
|
51
|
+
return /* @__PURE__ */ jsxs(DesignOriginalButton, {
|
|
52
|
+
...props,
|
|
53
|
+
ref,
|
|
54
|
+
disabled: props.disabled || loading,
|
|
55
|
+
onClick: (e) => runAsynchronouslyWithAlert(handleClick(e)),
|
|
56
|
+
size,
|
|
57
|
+
className: cn("relative", loading && "[&>:not(.stack-button-do-not-hide-when-siblings-are)]:invisible", props.className),
|
|
58
|
+
children: [loadingStyle === "spinner" && /* @__PURE__ */ jsx(Spinner, { className: cn("absolute inset-0 flex items-center justify-center stack-button-do-not-hide-when-siblings-are", !loading && "invisible") }), /* @__PURE__ */ jsx(Slottable, { children: typeof children === "string" ? /* @__PURE__ */ jsx("span", { children }) : children })]
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
DesignButton.displayName = "DesignButton";
|
|
62
|
+
|
|
63
|
+
//#endregion
|
|
64
|
+
export { DesignButton };
|
|
65
|
+
//# sourceMappingURL=button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.js","names":[],"sources":["../../../src/components/button.tsx"],"sourcesContent":["import { Slot, Slottable } from \"@radix-ui/react-slot\";\nimport { forwardRefIfNeeded } from \"@stackframe/stack-shared/dist/utils/react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport React from \"react\";\n\nimport { cn, Spinner } from \"@stackframe/stack-ui\";\nimport { useAsyncCallback } from \"@stackframe/stack-shared/dist/hooks/use-async-callback\";\nimport { runAsynchronouslyWithAlert } from \"@stackframe/stack-shared/dist/utils/promises\";\n\nconst designButtonVariants = cva(\n \"stack-scope inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-white/85 dark:bg-background hover:bg-white dark:hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n plain: \"\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nexport type DesignOriginalButtonProps = {\n asChild?: boolean,\n} & React.ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<typeof designButtonVariants>;\n\nconst DesignOriginalButton = forwardRefIfNeeded<HTMLButtonElement, DesignOriginalButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(designButtonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n }\n);\nDesignOriginalButton.displayName = \"DesignButton\";\n\nexport type DesignButtonProps = {\n onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void | Promise<void>,\n loading?: boolean,\n loadingStyle?: \"spinner\" | \"disabled\",\n} & DesignOriginalButtonProps;\n\nexport const DesignButton = forwardRefIfNeeded<HTMLButtonElement, DesignButtonProps>(\n ({ onClick, loading: loadingProp, loadingStyle = \"spinner\", children, size, ...props }, ref) => {\n const [handleClick, isLoading] = useAsyncCallback(async (e: React.MouseEvent<HTMLButtonElement>) => {\n await onClick?.(e);\n }, [onClick]);\n\n const loading = loadingProp || isLoading;\n\n return (\n <DesignOriginalButton\n {...props}\n ref={ref}\n disabled={props.disabled || loading}\n onClick={(e) => runAsynchronouslyWithAlert(handleClick(e))}\n size={size}\n className={cn(\"relative\", loading && \"[&>:not(.stack-button-do-not-hide-when-siblings-are)]:invisible\", props.className)}\n >\n {loadingStyle === \"spinner\" && <Spinner className={cn(\"absolute inset-0 flex items-center justify-center stack-button-do-not-hide-when-siblings-are\", !loading && \"invisible\")} />}\n <Slottable>\n {typeof children === \"string\" ? <span>{children}</span> : children}\n </Slottable>\n </DesignOriginalButton>\n );\n }\n);\nDesignButton.displayName = \"DesignButton\";\n"],"mappings":";;;;;;;;;;AASA,MAAM,uBAAuB,IAC3B,iOACA;CACE,UAAU;EACR,SAAS;GACP,SACE;GACF,aACE;GACF,SACE;GACF,WACE;GACF,OAAO;GACP,MAAM;GACN,OAAO;GACR;EACD,MAAM;GACJ,SAAS;GACT,IAAI;GACJ,IAAI;GACJ,MAAM;GACP;EACF;CACD,iBAAiB;EACf,SAAS;EACT,MAAM;EACP;CACF,CACF;AAMD,MAAM,uBAAuB,oBAC1B,EAAE,WAAW,SAAS,MAAM,UAAU,OAAO,GAAG,SAAS,QAAQ;AAEhE,QACE,oBAFW,UAAU,OAAO;EAG1B,WAAW,GAAG,qBAAqB;GAAE;GAAS;GAAM;GAAW,CAAC,CAAC;EAC5D;EACL,GAAI;GACJ;EAGP;AACD,qBAAqB,cAAc;AAQnC,MAAa,eAAe,oBACzB,EAAE,SAAS,SAAS,aAAa,eAAe,WAAW,UAAU,MAAM,GAAG,SAAS,QAAQ;CAC9F,MAAM,CAAC,aAAa,aAAa,iBAAiB,OAAO,MAA2C;AAClG,QAAM,UAAU,EAAE;IACjB,CAAC,QAAQ,CAAC;CAEb,MAAM,UAAU,eAAe;AAE/B,QACE,qBAAC;EACC,GAAI;EACC;EACL,UAAU,MAAM,YAAY;EAC5B,UAAU,MAAM,2BAA2B,YAAY,EAAE,CAAC;EACpD;EACN,WAAW,GAAG,YAAY,WAAW,mEAAmE,MAAM,UAAU;aAEvH,iBAAiB,aAAa,oBAAC,WAAQ,WAAW,GAAG,gGAAgG,CAAC,WAAW,YAAY,GAAI,EAClL,oBAAC,uBACE,OAAO,aAAa,WAAW,oBAAC,UAAM,WAAgB,GAAG,WAChD;GACS;EAG5B;AACD,aAAa,cAAc"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Card } from "@stackframe/stack-ui";
|
|
2
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
3
|
+
import React from "react";
|
|
4
|
+
|
|
5
|
+
//#region src/components/card.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Returns `true` when the calling component is rendered inside a DesignCard.
|
|
8
|
+
* Useful for deriving a glassmorphic default.
|
|
9
|
+
*/
|
|
10
|
+
declare function useInsideDesignCard(): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Resolve the effective glassmorphic value.
|
|
13
|
+
* - If the caller passed an explicit boolean → honour it.
|
|
14
|
+
* - Otherwise → fall back to whether we're inside a DesignCard.
|
|
15
|
+
*/
|
|
16
|
+
declare function useGlassmorphicDefault(explicit: boolean | undefined): boolean;
|
|
17
|
+
type DesignCardGradient = "blue" | "cyan" | "purple" | "green" | "orange" | "default";
|
|
18
|
+
type DesignCardBaseProps = {
|
|
19
|
+
glassmorphic?: boolean;
|
|
20
|
+
gradient?: DesignCardGradient;
|
|
21
|
+
contentClassName?: string;
|
|
22
|
+
} & Omit<React.ComponentProps<typeof Card>, "title">;
|
|
23
|
+
type WithTitleProps = {
|
|
24
|
+
title: React.ReactNode;
|
|
25
|
+
subtitle?: React.ReactNode;
|
|
26
|
+
icon: React.ElementType;
|
|
27
|
+
actions?: React.ReactNode;
|
|
28
|
+
};
|
|
29
|
+
type WithoutTitleProps = {
|
|
30
|
+
title?: never;
|
|
31
|
+
subtitle?: never;
|
|
32
|
+
icon?: never;
|
|
33
|
+
actions?: never;
|
|
34
|
+
};
|
|
35
|
+
type DesignCardProps = DesignCardBaseProps & (WithTitleProps | WithoutTitleProps);
|
|
36
|
+
declare function DesignCard({
|
|
37
|
+
title,
|
|
38
|
+
subtitle,
|
|
39
|
+
icon: Icon,
|
|
40
|
+
actions,
|
|
41
|
+
glassmorphic: glassmorphicProp,
|
|
42
|
+
gradient,
|
|
43
|
+
children,
|
|
44
|
+
className,
|
|
45
|
+
contentClassName,
|
|
46
|
+
...props
|
|
47
|
+
}: DesignCardProps): react_jsx_runtime0.JSX.Element;
|
|
48
|
+
type DesignCardTintProps = {
|
|
49
|
+
gradient: DesignCardGradient;
|
|
50
|
+
} & React.ComponentProps<"div">;
|
|
51
|
+
declare function DesignCardTint({
|
|
52
|
+
gradient,
|
|
53
|
+
className,
|
|
54
|
+
children,
|
|
55
|
+
...props
|
|
56
|
+
}: DesignCardTintProps): react_jsx_runtime0.JSX.Element;
|
|
57
|
+
//#endregion
|
|
58
|
+
export { DesignCard, DesignCardProps, DesignCardTint, DesignCardTintProps, useGlassmorphicDefault, useInsideDesignCard };
|
|
59
|
+
//# sourceMappingURL=card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.d.ts","names":[],"sources":["../../../src/components/card.tsx"],"mappings":";;;;;;;;AAiBA;iBAAgB,mBAAA,CAAA;;;;AAShB;;iBAAgB,sBAAA,CAAuB,QAAA;AAAA,KAKlC,kBAAA;AAAA,KA6BA,mBAAA;EACH,YAAA;EACA,QAAA,GAAW,kBAAA;EACX,gBAAA;AAAA,IACE,IAAA,CAAK,KAAA,CAAM,cAAA,QAAsB,IAAA;AAAA,KAEhC,cAAA;EACH,KAAA,EAAO,KAAA,CAAM,SAAA;EACb,QAAA,GAAW,KAAA,CAAM,SAAA;EACjB,IAAA,EAAM,KAAA,CAAM,WAAA;EACZ,OAAA,GAAU,KAAA,CAAM,SAAA;AAAA;AAAA,KAGb,iBAAA;EACH,KAAA;EACA,QAAA;EACA,IAAA;EACA,OAAA;AAAA;AAAA,KAGU,eAAA,GAAkB,mBAAA,IAAuB,cAAA,GAAiB,iBAAA;AAAA,iBAEtD,UAAA,CAAA;EACd,KAAA;EACA,QAAA;EACA,IAAA,EAAM,IAAA;EACN,OAAA;EACA,YAAA,EAAc,gBAAA;EACd,QAAA;EACA,QAAA;EACA,SAAA;EACA,gBAAA;EAAA,GACG;AAAA,GACF,eAAA,GAAe,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,KA2GN,mBAAA;EACV,QAAA,EAAU,kBAAA;AAAA,IACR,KAAA,CAAM,cAAA;AAAA,iBAEM,cAAA,CAAA;EACd,QAAA;EACA,SAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,mBAAA,GAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { Card, cn } from "@stackframe/stack-ui";
|
|
4
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import React from "react";
|
|
6
|
+
|
|
7
|
+
//#region src/components/card.tsx
|
|
8
|
+
const DesignCardNestingContext = React.createContext(false);
|
|
9
|
+
/**
|
|
10
|
+
* Returns `true` when the calling component is rendered inside a DesignCard.
|
|
11
|
+
* Useful for deriving a glassmorphic default.
|
|
12
|
+
*/
|
|
13
|
+
function useInsideDesignCard() {
|
|
14
|
+
return React.useContext(DesignCardNestingContext);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Resolve the effective glassmorphic value.
|
|
18
|
+
* - If the caller passed an explicit boolean → honour it.
|
|
19
|
+
* - Otherwise → fall back to whether we're inside a DesignCard.
|
|
20
|
+
*/
|
|
21
|
+
function useGlassmorphicDefault(explicit) {
|
|
22
|
+
const insideCard = useInsideDesignCard();
|
|
23
|
+
return explicit ?? insideCard;
|
|
24
|
+
}
|
|
25
|
+
const hoverTintClasses = new Map([
|
|
26
|
+
["blue", "group-hover:bg-blue-500/[0.03]"],
|
|
27
|
+
["purple", "group-hover:bg-purple-500/[0.03]"],
|
|
28
|
+
["green", "group-hover:bg-emerald-500/[0.03]"],
|
|
29
|
+
["orange", "group-hover:bg-orange-500/[0.03]"],
|
|
30
|
+
["default", "group-hover:bg-slate-500/[0.02]"],
|
|
31
|
+
["cyan", "group-hover:bg-cyan-500/[0.03]"]
|
|
32
|
+
]);
|
|
33
|
+
const demoTintClasses = new Map([
|
|
34
|
+
["blue", "group-hover/tint:bg-blue-500/[0.02]"],
|
|
35
|
+
["purple", "group-hover/tint:bg-purple-500/[0.02]"],
|
|
36
|
+
["green", "group-hover/tint:bg-emerald-500/[0.02]"],
|
|
37
|
+
["orange", "group-hover/tint:bg-orange-500/[0.02]"],
|
|
38
|
+
["default", "group-hover/tint:bg-slate-500/[0.015]"],
|
|
39
|
+
["cyan", "group-hover/tint:bg-cyan-500/[0.02]"]
|
|
40
|
+
]);
|
|
41
|
+
const bodyPaddingClass = "p-5";
|
|
42
|
+
function DesignCard({ title, subtitle, icon: Icon, actions, glassmorphic: glassmorphicProp, gradient = "default", children, className, contentClassName, ...props }) {
|
|
43
|
+
const glassmorphic = glassmorphicProp ?? true;
|
|
44
|
+
const hoverTintClass = hoverTintClasses.get(gradient) ?? "group-hover:bg-slate-500/[0.02]";
|
|
45
|
+
const hasContent = React.Children.count(children) > 0;
|
|
46
|
+
const variant = title != null ? subtitle != null ? "header" : "compact" : "bodyOnly";
|
|
47
|
+
return /* @__PURE__ */ jsx(DesignCardNestingContext.Provider, {
|
|
48
|
+
value: true,
|
|
49
|
+
children: /* @__PURE__ */ jsxs(Card, {
|
|
50
|
+
className: cn("group relative rounded-2xl overflow-hidden", glassmorphic && [
|
|
51
|
+
"bg-white/90 dark:bg-background/60 dark:backdrop-blur-xl border-0 transition-all duration-150 hover:transition-none",
|
|
52
|
+
"ring-1 ring-black/[0.06] hover:ring-black/[0.1] dark:ring-white/[0.06] dark:hover:ring-white/[0.1]",
|
|
53
|
+
"shadow-none"
|
|
54
|
+
], glassmorphic && variant === "bodyOnly" && "dark:bg-transparent dark:ring-0 dark:shadow-none", className),
|
|
55
|
+
...props,
|
|
56
|
+
children: [glassmorphic && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", { className: cn("absolute inset-0 bg-gradient-to-br from-foreground/[0.04] dark:from-foreground/[0.02] to-transparent pointer-events-none rounded-2xl", variant === "bodyOnly" && "dark:hidden") }), variant !== "bodyOnly" && /* @__PURE__ */ jsx("div", { className: cn("absolute inset-0 transition-colors duration-150 group-hover:transition-none pointer-events-none rounded-2xl", hoverTintClass) })] }), /* @__PURE__ */ jsxs("div", {
|
|
57
|
+
className: "relative",
|
|
58
|
+
children: [
|
|
59
|
+
variant === "header" && /* @__PURE__ */ jsx("div", {
|
|
60
|
+
className: bodyPaddingClass,
|
|
61
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
62
|
+
className: "flex items-start justify-between gap-4",
|
|
63
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
64
|
+
className: "flex-1 min-w-0",
|
|
65
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
66
|
+
className: "flex items-center gap-2",
|
|
67
|
+
children: [Icon && /* @__PURE__ */ jsx("div", {
|
|
68
|
+
className: "p-1.5 rounded-lg bg-foreground/[0.06] dark:bg-foreground/[0.04]",
|
|
69
|
+
children: /* @__PURE__ */ jsx(Icon, { className: "h-3.5 w-3.5 text-foreground/70 dark:text-muted-foreground" })
|
|
70
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
71
|
+
className: "text-xs font-semibold text-foreground uppercase tracking-wider",
|
|
72
|
+
children: title
|
|
73
|
+
})]
|
|
74
|
+
}), subtitle && /* @__PURE__ */ jsx("p", {
|
|
75
|
+
className: "text-sm text-muted-foreground mt-1",
|
|
76
|
+
children: subtitle
|
|
77
|
+
})]
|
|
78
|
+
}), actions && /* @__PURE__ */ jsx("div", {
|
|
79
|
+
className: "flex-shrink-0",
|
|
80
|
+
children: actions
|
|
81
|
+
})]
|
|
82
|
+
})
|
|
83
|
+
}),
|
|
84
|
+
variant === "compact" && /* @__PURE__ */ jsxs("div", {
|
|
85
|
+
className: "p-5 flex items-center justify-between gap-4 border-b border-black/[0.12] dark:border-white/[0.06]",
|
|
86
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
87
|
+
className: "flex items-center gap-2 min-w-0",
|
|
88
|
+
children: [Icon && /* @__PURE__ */ jsx("div", {
|
|
89
|
+
className: "p-1.5 rounded-lg bg-foreground/[0.04]",
|
|
90
|
+
children: /* @__PURE__ */ jsx(Icon, { className: "h-3.5 w-3.5 text-muted-foreground" })
|
|
91
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
92
|
+
className: "text-xs font-semibold text-foreground uppercase tracking-wider",
|
|
93
|
+
children: title
|
|
94
|
+
})]
|
|
95
|
+
}), actions && /* @__PURE__ */ jsx("div", {
|
|
96
|
+
className: "flex-shrink-0",
|
|
97
|
+
children: actions
|
|
98
|
+
})]
|
|
99
|
+
}),
|
|
100
|
+
hasContent && /* @__PURE__ */ jsx("div", {
|
|
101
|
+
className: cn(variant === "header" ? "border-t border-black/[0.12] dark:border-white/[0.06]" : "", variant === "compact" ? "px-5 py-4" : "", variant === "bodyOnly" || variant === "header" ? bodyPaddingClass : "", contentClassName),
|
|
102
|
+
children
|
|
103
|
+
})
|
|
104
|
+
]
|
|
105
|
+
})]
|
|
106
|
+
})
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function DesignCardTint({ gradient, className, children, ...props }) {
|
|
110
|
+
const tintClass = demoTintClasses.get(gradient) ?? "group-hover/tint:bg-slate-500/[0.015]";
|
|
111
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
112
|
+
className: cn("group/tint relative rounded-2xl bg-white/90 dark:bg-background/60 dark:backdrop-blur-xl transition-all duration-150 hover:transition-none", "ring-1 ring-black/[0.06] hover:ring-black/[0.1] dark:ring-white/[0.06] dark:hover:ring-white/[0.1]", "shadow-none overflow-hidden", className),
|
|
113
|
+
...props,
|
|
114
|
+
children: [
|
|
115
|
+
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-br from-foreground/[0.04] dark:from-foreground/[0.02] to-transparent pointer-events-none rounded-2xl" }),
|
|
116
|
+
/* @__PURE__ */ jsx("div", { className: cn("absolute inset-0 transition-colors duration-150 group-hover/tint:transition-none pointer-events-none rounded-2xl", tintClass) }),
|
|
117
|
+
/* @__PURE__ */ jsx("div", {
|
|
118
|
+
className: "relative",
|
|
119
|
+
children
|
|
120
|
+
})
|
|
121
|
+
]
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
//#endregion
|
|
126
|
+
export { DesignCard, DesignCardTint, useGlassmorphicDefault, useInsideDesignCard };
|
|
127
|
+
//# sourceMappingURL=card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.js","names":[],"sources":["../../../src/components/card.tsx"],"sourcesContent":["\"use client\";\n\nimport { Card } from \"@stackframe/stack-ui\";\nimport { cn } from \"@stackframe/stack-ui\";\nimport React from \"react\";\n\n// ─── Card nesting context ────────────────────────────────────────────────────\n// Components with a `glassmorphic` prop use this to auto-detect whether they\n// sit inside a DesignCard. When they do, glassmorphic defaults to `true`;\n// when they don't, it defaults to `false`.\n\nconst DesignCardNestingContext = React.createContext(false);\n\n/**\n * Returns `true` when the calling component is rendered inside a DesignCard.\n * Useful for deriving a glassmorphic default.\n */\nexport function useInsideDesignCard(): boolean {\n return React.useContext(DesignCardNestingContext);\n}\n\n/**\n * Resolve the effective glassmorphic value.\n * - If the caller passed an explicit boolean → honour it.\n * - Otherwise → fall back to whether we're inside a DesignCard.\n */\nexport function useGlassmorphicDefault(explicit: boolean | undefined): boolean {\n const insideCard = useInsideDesignCard();\n return explicit ?? insideCard;\n}\n\ntype DesignCardGradient = \"blue\" | \"cyan\" | \"purple\" | \"green\" | \"orange\" | \"default\";\n\nconst hoverTintClasses = new Map<DesignCardGradient, string>([\n [\"blue\", \"group-hover:bg-blue-500/[0.03]\"],\n [\"purple\", \"group-hover:bg-purple-500/[0.03]\"],\n [\"green\", \"group-hover:bg-emerald-500/[0.03]\"],\n [\"orange\", \"group-hover:bg-orange-500/[0.03]\"],\n [\"default\", \"group-hover:bg-slate-500/[0.02]\"],\n [\"cyan\", \"group-hover:bg-cyan-500/[0.03]\"],\n]);\n\nconst demoTintClasses = new Map<DesignCardGradient, string>([\n [\"blue\", \"group-hover/tint:bg-blue-500/[0.02]\"],\n [\"purple\", \"group-hover/tint:bg-purple-500/[0.02]\"],\n [\"green\", \"group-hover/tint:bg-emerald-500/[0.02]\"],\n [\"orange\", \"group-hover/tint:bg-orange-500/[0.02]\"],\n [\"default\", \"group-hover/tint:bg-slate-500/[0.015]\"],\n [\"cyan\", \"group-hover/tint:bg-cyan-500/[0.02]\"],\n]);\n\nconst bodyPaddingClass = \"p-5\";\n\n// ─── Discriminated props ──────────────────────────────────────────────────\n// - If title is given, icon is required.\n// - The layout is derived automatically:\n// title + subtitle → \"header\" (full header block with subtitle)\n// title only → \"compact\" (slim bar with border-b)\n// no title → \"bodyOnly\" (just the body)\n\ntype DesignCardBaseProps = {\n glassmorphic?: boolean,\n gradient?: DesignCardGradient,\n contentClassName?: string,\n} & Omit<React.ComponentProps<typeof Card>, \"title\">;\n\ntype WithTitleProps = {\n title: React.ReactNode,\n subtitle?: React.ReactNode,\n icon: React.ElementType,\n actions?: React.ReactNode,\n};\n\ntype WithoutTitleProps = {\n title?: never,\n subtitle?: never,\n icon?: never,\n actions?: never,\n};\n\nexport type DesignCardProps = DesignCardBaseProps & (WithTitleProps | WithoutTitleProps);\n\nexport function DesignCard({\n title,\n subtitle,\n icon: Icon,\n actions,\n glassmorphic: glassmorphicProp,\n gradient = \"default\",\n children,\n className,\n contentClassName,\n ...props\n}: DesignCardProps) {\n const glassmorphic = glassmorphicProp ?? true;\n const hoverTintClass = hoverTintClasses.get(gradient) ?? \"group-hover:bg-slate-500/[0.02]\";\n const hasContent = React.Children.count(children) > 0;\n\n // Derive layout from which props were provided\n const variant = title != null\n ? (subtitle != null ? \"header\" : \"compact\")\n : \"bodyOnly\";\n\n return (\n <DesignCardNestingContext.Provider value={true}>\n <Card\n className={cn(\n \"group relative rounded-2xl overflow-hidden\",\n glassmorphic && [\n \"bg-white/90 dark:bg-background/60 dark:backdrop-blur-xl border-0 transition-all duration-150 hover:transition-none\",\n \"ring-1 ring-black/[0.06] hover:ring-black/[0.1] dark:ring-white/[0.06] dark:hover:ring-white/[0.1]\",\n \"shadow-none\",\n ],\n glassmorphic && variant === \"bodyOnly\" && \"dark:bg-transparent dark:ring-0 dark:shadow-none\",\n className\n )}\n {...props}\n >\n {glassmorphic && (\n <>\n <div className={cn(\n \"absolute inset-0 bg-gradient-to-br from-foreground/[0.04] dark:from-foreground/[0.02] to-transparent pointer-events-none rounded-2xl\",\n variant === \"bodyOnly\" && \"dark:hidden\"\n )} />\n {variant !== \"bodyOnly\" && (\n <div\n className={cn(\n \"absolute inset-0 transition-colors duration-150 group-hover:transition-none pointer-events-none rounded-2xl\",\n hoverTintClass\n )}\n />\n )}\n </>\n )}\n <div className=\"relative\">\n {variant === \"header\" && (\n <div className={bodyPaddingClass}>\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n {Icon && (\n <div className=\"p-1.5 rounded-lg bg-foreground/[0.06] dark:bg-foreground/[0.04]\">\n <Icon className=\"h-3.5 w-3.5 text-foreground/70 dark:text-muted-foreground\" />\n </div>\n )}\n <span className=\"text-xs font-semibold text-foreground uppercase tracking-wider\">\n {title}\n </span>\n </div>\n {subtitle && (\n <p className=\"text-sm text-muted-foreground mt-1\">\n {subtitle}\n </p>\n )}\n </div>\n {actions && (\n <div className=\"flex-shrink-0\">\n {actions}\n </div>\n )}\n </div>\n </div>\n )}\n {variant === \"compact\" && (\n <div className=\"p-5 flex items-center justify-between gap-4 border-b border-black/[0.12] dark:border-white/[0.06]\">\n <div className=\"flex items-center gap-2 min-w-0\">\n {Icon && (\n <div className=\"p-1.5 rounded-lg bg-foreground/[0.04]\">\n <Icon className=\"h-3.5 w-3.5 text-muted-foreground\" />\n </div>\n )}\n <span className=\"text-xs font-semibold text-foreground uppercase tracking-wider\">\n {title}\n </span>\n </div>\n {actions && (\n <div className=\"flex-shrink-0\">\n {actions}\n </div>\n )}\n </div>\n )}\n {hasContent && (\n <div\n className={cn(\n variant === \"header\" ? \"border-t border-black/[0.12] dark:border-white/[0.06]\" : \"\",\n variant === \"compact\" ? \"px-5 py-4\" : \"\",\n variant === \"bodyOnly\" || variant === \"header\" ? bodyPaddingClass : \"\",\n contentClassName\n )}\n >\n {children}\n </div>\n )}\n </div>\n </Card>\n </DesignCardNestingContext.Provider>\n );\n}\n\nexport type DesignCardTintProps = {\n gradient: DesignCardGradient,\n} & React.ComponentProps<\"div\">\n\nexport function DesignCardTint({\n gradient,\n className,\n children,\n ...props\n}: DesignCardTintProps) {\n const tintClass = demoTintClasses.get(gradient) ?? \"group-hover/tint:bg-slate-500/[0.015]\";\n\n return (\n <div\n className={cn(\n \"group/tint relative rounded-2xl bg-white/90 dark:bg-background/60 dark:backdrop-blur-xl transition-all duration-150 hover:transition-none\",\n \"ring-1 ring-black/[0.06] hover:ring-black/[0.1] dark:ring-white/[0.06] dark:hover:ring-white/[0.1]\",\n \"shadow-none overflow-hidden\",\n className\n )}\n {...props}\n >\n <div className=\"absolute inset-0 bg-gradient-to-br from-foreground/[0.04] dark:from-foreground/[0.02] to-transparent pointer-events-none rounded-2xl\" />\n <div\n className={cn(\n \"absolute inset-0 transition-colors duration-150 group-hover/tint:transition-none pointer-events-none rounded-2xl\",\n tintClass\n )}\n />\n <div className=\"relative\">\n {children}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAWA,MAAM,2BAA2B,MAAM,cAAc,MAAM;;;;;AAM3D,SAAgB,sBAA+B;AAC7C,QAAO,MAAM,WAAW,yBAAyB;;;;;;;AAQnD,SAAgB,uBAAuB,UAAwC;CAC7E,MAAM,aAAa,qBAAqB;AACxC,QAAO,YAAY;;AAKrB,MAAM,mBAAmB,IAAI,IAAgC;CAC3D,CAAC,QAAQ,iCAAiC;CAC1C,CAAC,UAAU,mCAAmC;CAC9C,CAAC,SAAS,oCAAoC;CAC9C,CAAC,UAAU,mCAAmC;CAC9C,CAAC,WAAW,kCAAkC;CAC9C,CAAC,QAAQ,iCAAiC;CAC3C,CAAC;AAEF,MAAM,kBAAkB,IAAI,IAAgC;CAC1D,CAAC,QAAQ,sCAAsC;CAC/C,CAAC,UAAU,wCAAwC;CACnD,CAAC,SAAS,yCAAyC;CACnD,CAAC,UAAU,wCAAwC;CACnD,CAAC,WAAW,wCAAwC;CACpD,CAAC,QAAQ,sCAAsC;CAChD,CAAC;AAEF,MAAM,mBAAmB;AA+BzB,SAAgB,WAAW,EACzB,OACA,UACA,MAAM,MACN,SACA,cAAc,kBACd,WAAW,WACX,UACA,WACA,kBACA,GAAG,SACe;CAClB,MAAM,eAAe,oBAAoB;CACzC,MAAM,iBAAiB,iBAAiB,IAAI,SAAS,IAAI;CACzD,MAAM,aAAa,MAAM,SAAS,MAAM,SAAS,GAAG;CAGpD,MAAM,UAAU,SAAS,OACpB,YAAY,OAAO,WAAW,YAC/B;AAEJ,QACE,oBAAC,yBAAyB;EAAS,OAAO;YACxC,qBAAC;GACC,WAAW,GACT,8CACA,gBAAgB;IACd;IACA;IACA;IACD,EACD,gBAAgB,YAAY,cAAc,oDAC1C,UACD;GACD,GAAI;cAEH,gBACC,4CACE,oBAAC,SAAI,WAAW,GACd,wIACA,YAAY,cAAc,cAC3B,GAAI,EACJ,YAAY,cACX,oBAAC,SACC,WAAW,GACT,+GACA,eACD,GACD,IAEH,EAEL,qBAAC;IAAI,WAAU;;KACZ,YAAY,YACX,oBAAC;MAAI,WAAW;gBACd,qBAAC;OAAI,WAAU;kBACb,qBAAC;QAAI,WAAU;mBACb,qBAAC;SAAI,WAAU;oBACZ,QACC,oBAAC;UAAI,WAAU;oBACb,oBAAC,QAAK,WAAU,8DAA8D;WAC1E,EAER,oBAAC;UAAK,WAAU;oBACb;WACI;UACH,EACL,YACC,oBAAC;SAAE,WAAU;mBACV;UACC;SAEF,EACL,WACC,oBAAC;QAAI,WAAU;kBACZ;SACG;QAEJ;OACF;KAEP,YAAY,aACX,qBAAC;MAAI,WAAU;iBACb,qBAAC;OAAI,WAAU;kBACZ,QACC,oBAAC;QAAI,WAAU;kBACb,oBAAC,QAAK,WAAU,sCAAsC;SAClD,EAER,oBAAC;QAAK,WAAU;kBACb;SACI;QACH,EACL,WACC,oBAAC;OAAI,WAAU;iBACZ;QACG;OAEJ;KAEP,cACC,oBAAC;MACC,WAAW,GACT,YAAY,WAAW,0DAA0D,IACjF,YAAY,YAAY,cAAc,IACtC,YAAY,cAAc,YAAY,WAAW,mBAAmB,IACpE,iBACD;MAEA;OACG;;KAEJ;IACD;GAC2B;;AAQxC,SAAgB,eAAe,EAC7B,UACA,WACA,UACA,GAAG,SACmB;CACtB,MAAM,YAAY,gBAAgB,IAAI,SAAS,IAAI;AAEnD,QACE,qBAAC;EACC,WAAW,GACT,6IACA,sGACA,+BACA,UACD;EACD,GAAI;;GAEJ,oBAAC,SAAI,WAAU,yIAAyI;GACxJ,oBAAC,SACC,WAAW,GACT,oHACA,UACD,GACD;GACF,oBAAC;IAAI,WAAU;IACZ;KACG;;GACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
//#region src/components/chart-card.d.ts
|
|
5
|
+
type DesignChartCardGradient = "blue" | "cyan" | "purple" | "green" | "orange" | "default";
|
|
6
|
+
type DesignChartCardProps = {
|
|
7
|
+
gradient?: DesignChartCardGradient;
|
|
8
|
+
title?: React.ReactNode;
|
|
9
|
+
description?: React.ReactNode;
|
|
10
|
+
} & Omit<React.ComponentProps<"div">, "title">;
|
|
11
|
+
declare function DesignChartCard({
|
|
12
|
+
gradient,
|
|
13
|
+
title,
|
|
14
|
+
description,
|
|
15
|
+
className,
|
|
16
|
+
children,
|
|
17
|
+
...props
|
|
18
|
+
}: DesignChartCardProps): react_jsx_runtime0.JSX.Element;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { DesignChartCard, DesignChartCardProps };
|
|
21
|
+
//# sourceMappingURL=chart-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-card.d.ts","names":[],"sources":["../../../src/components/chart-card.tsx"],"mappings":";;;;KAKK,uBAAA;AAAA,KAWO,oBAAA;EACV,QAAA,GAAW,uBAAA;EACX,KAAA,GAAQ,KAAA,CAAM,SAAA;EACd,WAAA,GAAc,KAAA,CAAM,SAAA;AAAA,IAClB,IAAA,CAAK,KAAA,CAAM,cAAA;AAAA,iBAEC,eAAA,CAAA;EACd,QAAA;EACA,KAAA;EACA,WAAA;EACA,SAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,oBAAA,GAAoB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { cn } from "@stackframe/stack-ui";
|
|
4
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import React from "react";
|
|
6
|
+
|
|
7
|
+
//#region src/components/chart-card.tsx
|
|
8
|
+
const hoverTintClasses = new Map([
|
|
9
|
+
["blue", "group-hover:bg-blue-500/[0.03]"],
|
|
10
|
+
["cyan", "group-hover:bg-cyan-500/[0.03]"],
|
|
11
|
+
["purple", "group-hover:bg-purple-500/[0.03]"],
|
|
12
|
+
["green", "group-hover:bg-emerald-500/[0.03]"],
|
|
13
|
+
["orange", "group-hover:bg-orange-500/[0.03]"],
|
|
14
|
+
["default", "group-hover:bg-slate-500/[0.02]"]
|
|
15
|
+
]);
|
|
16
|
+
function DesignChartCard({ gradient = "default", title, description, className, children, ...props }) {
|
|
17
|
+
const hoverTintClass = hoverTintClasses.get(gradient) ?? "group-hover:bg-slate-500/[0.02]";
|
|
18
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: `
|
|
19
|
+
.design-chart-card-tooltip-escape .recharts-tooltip-wrapper {
|
|
20
|
+
z-index: 9999 !important;
|
|
21
|
+
overflow: visible !important;
|
|
22
|
+
}
|
|
23
|
+
.design-chart-card-tooltip-escape .recharts-tooltip-wrapper > * {
|
|
24
|
+
overflow: visible !important;
|
|
25
|
+
}
|
|
26
|
+
` } }), /* @__PURE__ */ jsxs("div", {
|
|
27
|
+
className: cn("group relative rounded-2xl bg-white/90 dark:bg-background/60 backdrop-blur-xl transition-all duration-150 hover:transition-none design-chart-card-tooltip-escape", "ring-1 ring-black/[0.06] hover:ring-black/[0.1] dark:ring-white/[0.06] dark:hover:ring-white/[0.1]", "shadow-sm hover:shadow-md hover:z-10", className),
|
|
28
|
+
...props,
|
|
29
|
+
children: [
|
|
30
|
+
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-br from-foreground/[0.04] dark:from-foreground/[0.02] to-transparent pointer-events-none rounded-2xl overflow-hidden" }),
|
|
31
|
+
/* @__PURE__ */ jsx("div", { className: cn("absolute inset-0 transition-colors duration-150 group-hover:transition-none pointer-events-none rounded-2xl overflow-hidden", hoverTintClass) }),
|
|
32
|
+
/* @__PURE__ */ jsxs("div", {
|
|
33
|
+
className: "relative h-full flex flex-col p-4",
|
|
34
|
+
children: [(title || description) && /* @__PURE__ */ jsxs("div", {
|
|
35
|
+
className: "mb-3",
|
|
36
|
+
children: [title && /* @__PURE__ */ jsx("h3", {
|
|
37
|
+
className: "text-sm font-semibold text-foreground",
|
|
38
|
+
children: title
|
|
39
|
+
}), description && /* @__PURE__ */ jsx("p", {
|
|
40
|
+
className: "text-xs text-muted-foreground mt-0.5",
|
|
41
|
+
children: description
|
|
42
|
+
})]
|
|
43
|
+
}), children]
|
|
44
|
+
})
|
|
45
|
+
]
|
|
46
|
+
})] });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
//#endregion
|
|
50
|
+
export { DesignChartCard };
|
|
51
|
+
//# sourceMappingURL=chart-card.js.map
|