@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,54 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
5
|
+
let _stackframe_stack_ui = require("@stackframe/stack-ui");
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
+
let react = require("react");
|
|
8
|
+
react = require_chunk.__toESM(react);
|
|
9
|
+
|
|
10
|
+
//#region src/components/chart-card.tsx
|
|
11
|
+
const hoverTintClasses = new Map([
|
|
12
|
+
["blue", "group-hover:bg-blue-500/[0.03]"],
|
|
13
|
+
["cyan", "group-hover:bg-cyan-500/[0.03]"],
|
|
14
|
+
["purple", "group-hover:bg-purple-500/[0.03]"],
|
|
15
|
+
["green", "group-hover:bg-emerald-500/[0.03]"],
|
|
16
|
+
["orange", "group-hover:bg-orange-500/[0.03]"],
|
|
17
|
+
["default", "group-hover:bg-slate-500/[0.02]"]
|
|
18
|
+
]);
|
|
19
|
+
function DesignChartCard({ gradient = "default", title, description, className, children, ...props }) {
|
|
20
|
+
const hoverTintClass = hoverTintClasses.get(gradient) ?? "group-hover:bg-slate-500/[0.02]";
|
|
21
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("style", { dangerouslySetInnerHTML: { __html: `
|
|
22
|
+
.design-chart-card-tooltip-escape .recharts-tooltip-wrapper {
|
|
23
|
+
z-index: 9999 !important;
|
|
24
|
+
overflow: visible !important;
|
|
25
|
+
}
|
|
26
|
+
.design-chart-card-tooltip-escape .recharts-tooltip-wrapper > * {
|
|
27
|
+
overflow: visible !important;
|
|
28
|
+
}
|
|
29
|
+
` } }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
30
|
+
className: (0, _stackframe_stack_ui.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),
|
|
31
|
+
...props,
|
|
32
|
+
children: [
|
|
33
|
+
/* @__PURE__ */ (0, react_jsx_runtime.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" }),
|
|
34
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: (0, _stackframe_stack_ui.cn)("absolute inset-0 transition-colors duration-150 group-hover:transition-none pointer-events-none rounded-2xl overflow-hidden", hoverTintClass) }),
|
|
35
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
36
|
+
className: "relative h-full flex flex-col p-4",
|
|
37
|
+
children: [(title || description) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
38
|
+
className: "mb-3",
|
|
39
|
+
children: [title && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
|
|
40
|
+
className: "text-sm font-semibold text-foreground",
|
|
41
|
+
children: title
|
|
42
|
+
}), description && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
43
|
+
className: "text-xs text-muted-foreground mt-0.5",
|
|
44
|
+
children: description
|
|
45
|
+
})]
|
|
46
|
+
}), children]
|
|
47
|
+
})
|
|
48
|
+
]
|
|
49
|
+
})] });
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
//#endregion
|
|
53
|
+
exports.DesignChartCard = DesignChartCard;
|
|
54
|
+
//# sourceMappingURL=chart-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-card.js","names":[],"sources":["../../src/components/chart-card.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"@stackframe/stack-ui\";\nimport React from \"react\";\n\ntype DesignChartCardGradient = \"blue\" | \"cyan\" | \"purple\" | \"green\" | \"orange\" | \"default\";\n\nconst hoverTintClasses = new Map<DesignChartCardGradient, string>([\n [\"blue\", \"group-hover:bg-blue-500/[0.03]\"],\n [\"cyan\", \"group-hover:bg-cyan-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]);\n\nexport type DesignChartCardProps = {\n gradient?: DesignChartCardGradient,\n title?: React.ReactNode,\n description?: React.ReactNode,\n} & Omit<React.ComponentProps<\"div\">, \"title\">;\n\nexport function DesignChartCard({\n gradient = \"default\",\n title,\n description,\n className,\n children,\n ...props\n}: DesignChartCardProps) {\n const hoverTintClass = hoverTintClasses.get(gradient) ?? \"group-hover:bg-slate-500/[0.02]\";\n\n return (\n <>\n <style dangerouslySetInnerHTML={{ __html: `\n .design-chart-card-tooltip-escape .recharts-tooltip-wrapper {\n z-index: 9999 !important;\n overflow: visible !important;\n }\n .design-chart-card-tooltip-escape .recharts-tooltip-wrapper > * {\n overflow: visible !important;\n }\n ` }} />\n <div\n className={cn(\n \"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\",\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-sm hover:shadow-md hover:z-10\",\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 overflow-hidden\" />\n <div\n className={cn(\n \"absolute inset-0 transition-colors duration-150 group-hover:transition-none pointer-events-none rounded-2xl overflow-hidden\",\n hoverTintClass\n )}\n />\n <div className=\"relative h-full flex flex-col p-4\">\n {(title || description) && (\n <div className=\"mb-3\">\n {title && <h3 className=\"text-sm font-semibold text-foreground\">{title}</h3>}\n {description && <p className=\"text-xs text-muted-foreground mt-0.5\">{description}</p>}\n </div>\n )}\n {children}\n </div>\n </div>\n </>\n );\n}\n"],"mappings":";;;;;;;;;;AAOA,MAAM,mBAAmB,IAAI,IAAqC;CAChE,CAAC,QAAQ,iCAAiC;CAC1C,CAAC,QAAQ,iCAAiC;CAC1C,CAAC,UAAU,mCAAmC;CAC9C,CAAC,SAAS,oCAAoC;CAC9C,CAAC,UAAU,mCAAmC;CAC9C,CAAC,WAAW,kCAAkC;CAC/C,CAAC;AAQF,SAAgB,gBAAgB,EAC9B,WAAW,WACX,OACA,aACA,WACA,UACA,GAAG,SACoB;CACvB,MAAM,iBAAiB,iBAAiB,IAAI,SAAS,IAAI;AAEzD,QACE,qFACE,2CAAC,WAAM,yBAAyB,EAAE,QAAQ;;;;;;;;SAQvC,GAAI,EACP,4CAAC;EACC,wCACE,oKACA,sGACA,wCACA,UACD;EACD,GAAI;;GAEJ,2CAAC,SAAI,WAAU,yJAAyJ;GACxK,2CAAC,SACC,wCACE,+HACA,eACD,GACD;GACF,4CAAC;IAAI,WAAU;gBACX,SAAS,gBACT,4CAAC;KAAI,WAAU;gBACZ,SAAS,2CAAC;MAAG,WAAU;gBAAyC;OAAW,EAC3E,eAAe,2CAAC;MAAE,WAAU;gBAAwC;OAAgB;MACjF,EAEP;KACG;;GACF,IACL"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
import * as React$1 from "react";
|
|
3
|
+
import * as RechartsPrimitive from "recharts";
|
|
4
|
+
|
|
5
|
+
//#region src/components/chart-container.d.ts
|
|
6
|
+
declare const THEMES: {
|
|
7
|
+
readonly light: "";
|
|
8
|
+
readonly dark: ".dark";
|
|
9
|
+
};
|
|
10
|
+
type DesignChartConfig = { [k in string]: {
|
|
11
|
+
label?: React$1.ReactNode;
|
|
12
|
+
icon?: React$1.ComponentType;
|
|
13
|
+
} & ({
|
|
14
|
+
color?: string;
|
|
15
|
+
theme?: never;
|
|
16
|
+
} | {
|
|
17
|
+
color?: never;
|
|
18
|
+
theme: Record<keyof typeof THEMES, string>;
|
|
19
|
+
}) };
|
|
20
|
+
type ChartContextProps = {
|
|
21
|
+
config: DesignChartConfig;
|
|
22
|
+
};
|
|
23
|
+
declare function useDesignChart(): ChartContextProps;
|
|
24
|
+
declare function DesignChartStyle({
|
|
25
|
+
id,
|
|
26
|
+
config
|
|
27
|
+
}: {
|
|
28
|
+
id: string;
|
|
29
|
+
config: DesignChartConfig;
|
|
30
|
+
}): react_jsx_runtime0.JSX.Element | null;
|
|
31
|
+
declare const DesignChartContainer: React$1.ForwardRefExoticComponent<Omit<React$1.ClassAttributes<HTMLDivElement> & React$1.HTMLAttributes<HTMLDivElement> & {
|
|
32
|
+
maxHeight?: number;
|
|
33
|
+
config: DesignChartConfig;
|
|
34
|
+
children: React$1.ComponentProps<typeof RechartsPrimitive.ResponsiveContainer>["children"];
|
|
35
|
+
}, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
|
|
36
|
+
/**
|
|
37
|
+
* Helper to extract item config from a Recharts payload object.
|
|
38
|
+
*/
|
|
39
|
+
declare function getPayloadConfigFromPayload(config: DesignChartConfig, payload: unknown, key: string): ({
|
|
40
|
+
label?: React$1.ReactNode;
|
|
41
|
+
icon?: React$1.ComponentType;
|
|
42
|
+
} & ({
|
|
43
|
+
color?: string;
|
|
44
|
+
theme?: never;
|
|
45
|
+
} | {
|
|
46
|
+
color?: never;
|
|
47
|
+
theme: Record<keyof typeof THEMES, string>;
|
|
48
|
+
})) | undefined;
|
|
49
|
+
//#endregion
|
|
50
|
+
export { DesignChartConfig, DesignChartContainer, DesignChartStyle, getPayloadConfigFromPayload, useDesignChart };
|
|
51
|
+
//# sourceMappingURL=chart-container.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-container.d.ts","names":[],"sources":["../../src/components/chart-container.tsx"],"mappings":";;;;;cAMM,MAAA;EAAA,SAA8C,KAAA;EAAA,SAAA,IAAA;AAAA;AAAA,KAExC,iBAAA;EAER,KAAA,GAAQ,OAAA,CAAM,SAAA;EACd,IAAA,GAAO,OAAA,CAAM,aAAA;AAAA;EAET,KAAA;EAAgB,KAAA;AAAA;EAChB,KAAA;EAAe,KAAA,EAAO,MAAA,cAAoB,MAAA;AAAA;AAAA,KAI7C,iBAAA;EACH,MAAA,EAAQ,iBAAA;AAAA;AAAA,iBAKM,cAAA,CAAA,GAAc,iBAAA;AAAA,iBAQd,gBAAA,CAAA;EAAmB,EAAA;EAAI;AAAA;EAAY,EAAA;EAAY,MAAA,EAAQ,iBAAA;AAAA,IAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cAiC7E,oBAAA,EAAoB,OAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,OAAA,CAAA,eAAA,CAAA,cAAA,IAAA,OAAA,CAAA,cAAA,CAAA,cAAA;;UAIrB,iBAAA;YACE,OAAA,CAAM,cAAA,QACP,iBAAA,CAAkB,mBAAA;AAAA;;;;iBA+Cf,2BAAA,CACd,MAAA,EAAQ,iBAAA,EACR,OAAA,WACA,GAAA;UA/GU,OAAA,CAAM,SAAA;SACP,OAAA,CAAM,aAAA;AAAA;;;;;SAGa,MAAA,cAAoB,MAAA;AAAA"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
5
|
+
let _stackframe_stack_ui = require("@stackframe/stack-ui");
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
+
let react = require("react");
|
|
8
|
+
react = require_chunk.__toESM(react);
|
|
9
|
+
let recharts = require("recharts");
|
|
10
|
+
recharts = require_chunk.__toESM(recharts);
|
|
11
|
+
|
|
12
|
+
//#region src/components/chart-container.tsx
|
|
13
|
+
const THEMES = {
|
|
14
|
+
light: "",
|
|
15
|
+
dark: ".dark"
|
|
16
|
+
};
|
|
17
|
+
const ChartContext = react.createContext(null);
|
|
18
|
+
function useDesignChart() {
|
|
19
|
+
const context = react.useContext(ChartContext);
|
|
20
|
+
if (!context) throw new Error("useDesignChart must be used within a <DesignChartContainer />");
|
|
21
|
+
return context;
|
|
22
|
+
}
|
|
23
|
+
function DesignChartStyle({ id, config }) {
|
|
24
|
+
const colorConfig = Object.entries(config).filter(([_, cfg]) => cfg.theme || cfg.color);
|
|
25
|
+
if (!colorConfig.length) return null;
|
|
26
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("style", { dangerouslySetInnerHTML: { __html: Object.entries(THEMES).map(([theme, prefix]) => `
|
|
27
|
+
${prefix} [data-chart=${id}] {
|
|
28
|
+
${colorConfig.map(([key, itemConfig]) => {
|
|
29
|
+
const color = itemConfig.theme?.[theme] || itemConfig.color;
|
|
30
|
+
return color ? ` --color-${key}: ${color};` : null;
|
|
31
|
+
}).join("\n")}
|
|
32
|
+
}
|
|
33
|
+
`).join("\n") } });
|
|
34
|
+
}
|
|
35
|
+
const DesignChartContainer = react.forwardRef(({ id, className, children, config, maxHeight, ...props }, ref) => {
|
|
36
|
+
const uniqueId = react.useId();
|
|
37
|
+
const chartId = `chart-${id || uniqueId.replace(/:/g, "")}`;
|
|
38
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChartContext.Provider, {
|
|
39
|
+
value: { config },
|
|
40
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
41
|
+
"data-chart": chartId,
|
|
42
|
+
ref,
|
|
43
|
+
className: (0, _stackframe_stack_ui.cn)("flex aspect-video justify-center text-xs", "[&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground", "[&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-black/[0.06] dark:[&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-white/[0.06]", "[&_.recharts-curve.recharts-tooltip-cursor]:stroke-black/[0.12] dark:[&_.recharts-curve.recharts-tooltip-cursor]:stroke-white/[0.12]", "[&_.recharts-dot[stroke='#fff']]:stroke-transparent", "[&_.recharts-layer]:outline-none", "[&_.recharts-polar-grid_[stroke='#ccc']]:stroke-black/[0.06] dark:[&_.recharts-polar-grid_[stroke='#ccc']]:stroke-white/[0.06]", "[&_.recharts-radial-bar-background-sector]:fill-black/[0.04] dark:[&_.recharts-radial-bar-background-sector]:fill-white/[0.04]", "[&_.recharts-rectangle.recharts-tooltip-cursor]:fill-black/[0.04] dark:[&_.recharts-rectangle.recharts-tooltip-cursor]:fill-white/[0.04]", "[&_.recharts-reference-line_[stroke='#ccc']]:stroke-black/[0.06] dark:[&_.recharts-reference-line_[stroke='#ccc']]:stroke-white/[0.06]", "[&_.recharts-sector[stroke='#fff']]:stroke-transparent", "[&_.recharts-sector]:outline-none", "[&_.recharts-surface]:outline-none", className),
|
|
44
|
+
...props,
|
|
45
|
+
style: {
|
|
46
|
+
...props.style,
|
|
47
|
+
maxHeight
|
|
48
|
+
},
|
|
49
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(DesignChartStyle, {
|
|
50
|
+
id: chartId,
|
|
51
|
+
config
|
|
52
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(recharts.ResponsiveContainer, {
|
|
53
|
+
maxHeight,
|
|
54
|
+
children
|
|
55
|
+
})]
|
|
56
|
+
})
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
DesignChartContainer.displayName = "DesignChartContainer";
|
|
60
|
+
/**
|
|
61
|
+
* Helper to extract item config from a Recharts payload object.
|
|
62
|
+
*/
|
|
63
|
+
function getPayloadConfigFromPayload(config, payload, key) {
|
|
64
|
+
if (typeof payload !== "object" || payload === null) return;
|
|
65
|
+
const payloadPayload = "payload" in payload && typeof payload.payload === "object" && payload.payload !== null ? payload.payload : void 0;
|
|
66
|
+
let configLabelKey = key;
|
|
67
|
+
if (key in payload && typeof payload[key] === "string") configLabelKey = payload[key];
|
|
68
|
+
else if (payloadPayload && key in payloadPayload && typeof payloadPayload[key] === "string") configLabelKey = payloadPayload[key];
|
|
69
|
+
return configLabelKey in config ? config[configLabelKey] : config[key];
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
//#endregion
|
|
73
|
+
exports.DesignChartContainer = DesignChartContainer;
|
|
74
|
+
exports.DesignChartStyle = DesignChartStyle;
|
|
75
|
+
exports.getPayloadConfigFromPayload = getPayloadConfigFromPayload;
|
|
76
|
+
exports.useDesignChart = useDesignChart;
|
|
77
|
+
//# sourceMappingURL=chart-container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-container.js","names":["React","RechartsPrimitive"],"sources":["../../src/components/chart-container.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as RechartsPrimitive from \"recharts\";\nimport { cn } from \"@stackframe/stack-ui\";\n\nconst THEMES = { light: \"\", dark: \".dark\" } as const;\n\nexport type DesignChartConfig = {\n [k in string]: {\n label?: React.ReactNode,\n icon?: React.ComponentType,\n } & (\n | { color?: string, theme?: never }\n | { color?: never, theme: Record<keyof typeof THEMES, string> }\n )\n};\n\ntype ChartContextProps = {\n config: DesignChartConfig,\n};\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null);\n\nexport function useDesignChart() {\n const context = React.useContext(ChartContext);\n if (!context) {\n throw new Error(\"useDesignChart must be used within a <DesignChartContainer />\");\n }\n return context;\n}\n\nexport function DesignChartStyle({ id, config }: { id: string, config: DesignChartConfig }) {\n const colorConfig = Object.entries(config).filter(\n ([_, cfg]) => cfg.theme || cfg.color\n );\n\n if (!colorConfig.length) {\n return null;\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: Object.entries(THEMES)\n .map(\n ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color =\n itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ||\n itemConfig.color;\n return color ? ` --color-${key}: ${color};` : null;\n })\n .join(\"\\n\")}\n}\n`\n )\n .join(\"\\n\"),\n }}\n />\n );\n}\n\nexport const DesignChartContainer = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n maxHeight?: number,\n config: DesignChartConfig,\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >[\"children\"],\n }\n>(({ id, className, children, config, maxHeight, ...props }, ref) => {\n const uniqueId = React.useId();\n const chartId = `chart-${id || uniqueId.replace(/:/g, \"\")}`;\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-chart={chartId}\n ref={ref}\n className={cn(\n \"flex aspect-video justify-center text-xs\",\n \"[&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground\",\n \"[&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-black/[0.06] dark:[&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-white/[0.06]\",\n \"[&_.recharts-curve.recharts-tooltip-cursor]:stroke-black/[0.12] dark:[&_.recharts-curve.recharts-tooltip-cursor]:stroke-white/[0.12]\",\n \"[&_.recharts-dot[stroke='#fff']]:stroke-transparent\",\n \"[&_.recharts-layer]:outline-none\",\n \"[&_.recharts-polar-grid_[stroke='#ccc']]:stroke-black/[0.06] dark:[&_.recharts-polar-grid_[stroke='#ccc']]:stroke-white/[0.06]\",\n \"[&_.recharts-radial-bar-background-sector]:fill-black/[0.04] dark:[&_.recharts-radial-bar-background-sector]:fill-white/[0.04]\",\n \"[&_.recharts-rectangle.recharts-tooltip-cursor]:fill-black/[0.04] dark:[&_.recharts-rectangle.recharts-tooltip-cursor]:fill-white/[0.04]\",\n \"[&_.recharts-reference-line_[stroke='#ccc']]:stroke-black/[0.06] dark:[&_.recharts-reference-line_[stroke='#ccc']]:stroke-white/[0.06]\",\n \"[&_.recharts-sector[stroke='#fff']]:stroke-transparent\",\n \"[&_.recharts-sector]:outline-none\",\n \"[&_.recharts-surface]:outline-none\",\n className\n )}\n {...props}\n style={{\n ...props.style,\n maxHeight,\n }}\n >\n <DesignChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer maxHeight={maxHeight}>\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n );\n});\nDesignChartContainer.displayName = \"DesignChartContainer\";\n\n/**\n * Helper to extract item config from a Recharts payload object.\n */\nexport function getPayloadConfigFromPayload(\n config: DesignChartConfig,\n payload: unknown,\n key: string,\n) {\n if (typeof payload !== \"object\" || payload === null) {\n return undefined;\n }\n\n const payloadPayload =\n \"payload\" in payload &&\n typeof payload.payload === \"object\" &&\n payload.payload !== null\n ? payload.payload\n : undefined;\n\n let configLabelKey: string = key;\n\n if (\n key in payload &&\n typeof payload[key as keyof typeof payload] === \"string\"\n ) {\n configLabelKey = payload[key as keyof typeof payload] as string;\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n ) {\n configLabelKey = payloadPayload[\n key as keyof typeof payloadPayload\n ] as string;\n }\n\n return configLabelKey in config\n ? config[configLabelKey]\n : config[key as keyof typeof config];\n}\n"],"mappings":";;;;;;;;;;;;AAMA,MAAM,SAAS;CAAE,OAAO;CAAI,MAAM;CAAS;AAgB3C,MAAM,eAAeA,MAAM,cAAwC,KAAK;AAExE,SAAgB,iBAAiB;CAC/B,MAAM,UAAUA,MAAM,WAAW,aAAa;AAC9C,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,gEAAgE;AAElF,QAAO;;AAGT,SAAgB,iBAAiB,EAAE,IAAI,UAAqD;CAC1F,MAAM,cAAc,OAAO,QAAQ,OAAO,CAAC,QACxC,CAAC,GAAG,SAAS,IAAI,SAAS,IAAI,MAChC;AAED,KAAI,CAAC,YAAY,OACf,QAAO;AAGT,QACE,2CAAC,WACC,yBAAyB,EACvB,QAAQ,OAAO,QAAQ,OAAO,CAC3B,KACE,CAAC,OAAO,YAAY;EAC/B,OAAO,eAAe,GAAG;EACzB,YACa,KAAK,CAAC,KAAK,gBAAgB;EAC1B,MAAM,QAChB,WAAW,QAAQ,UACnB,WAAW;AACD,SAAO,QAAQ,aAAa,IAAI,IAAI,MAAM,KAAK;GAC/C,CACD,KAAK,KAAK,CAAC;;EAGf,CACA,KAAK,KAAK,EACd,GACD;;AAIN,MAAa,uBAAuBA,MAAM,YASvC,EAAE,IAAI,WAAW,UAAU,QAAQ,WAAW,GAAG,SAAS,QAAQ;CACnE,MAAM,WAAWA,MAAM,OAAO;CAC9B,MAAM,UAAU,SAAS,MAAM,SAAS,QAAQ,MAAM,GAAG;AAEzD,QACE,2CAAC,aAAa;EAAS,OAAO,EAAE,QAAQ;YACtC,4CAAC;GACC,cAAY;GACP;GACL,wCACE,4CACA,gEACA,kJACA,wIACA,uDACA,oCACA,kIACA,kIACA,4IACA,0IACA,0DACA,qCACA,sCACA,UACD;GACD,GAAI;GACJ,OAAO;IACL,GAAG,MAAM;IACT;IACD;cAED,2CAAC;IAAiB,IAAI;IAAiB;KAAU,EACjD,2CAACC,SAAkB;IAA+B;IAC/C;KACqC;IACpC;GACgB;EAE1B;AACF,qBAAqB,cAAc;;;;AAKnC,SAAgB,4BACd,QACA,SACA,KACA;AACA,KAAI,OAAO,YAAY,YAAY,YAAY,KAC7C;CAGF,MAAM,iBACJ,aAAa,WACb,OAAO,QAAQ,YAAY,YAC3B,QAAQ,YAAY,OAChB,QAAQ,UACR;CAEN,IAAI,iBAAyB;AAE7B,KACE,OAAO,WACP,OAAO,QAAQ,SAAiC,SAEhD,kBAAiB,QAAQ;UAEzB,kBACA,OAAO,kBACP,OAAO,eAAe,SAAwC,SAE9D,kBAAiB,eACf;AAIJ,QAAO,kBAAkB,SACrB,OAAO,kBACP,OAAO"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as React$1 from "react";
|
|
2
|
+
import * as RechartsPrimitive from "recharts";
|
|
3
|
+
|
|
4
|
+
//#region src/components/chart-legend.d.ts
|
|
5
|
+
declare const DesignChartLegend: typeof RechartsPrimitive.Legend;
|
|
6
|
+
declare const DesignChartLegendContent: React$1.ForwardRefExoticComponent<Omit<React$1.ClassAttributes<HTMLDivElement> & React$1.HTMLAttributes<HTMLDivElement> & Pick<RechartsPrimitive.LegendProps, "verticalAlign" | "payload"> & {
|
|
7
|
+
hideIcon?: boolean;
|
|
8
|
+
nameKey?: string;
|
|
9
|
+
}, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
|
|
10
|
+
//#endregion
|
|
11
|
+
export { DesignChartLegend, DesignChartLegendContent };
|
|
12
|
+
//# sourceMappingURL=chart-legend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-legend.d.ts","names":[],"sources":["../../src/components/chart-legend.tsx"],"mappings":";;;;cAOa,iBAAA,SAAiB,iBAAA,CAAA,MAAA;AAAA,cAEjB,wBAAA,EAAwB,OAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,OAAA,CAAA,eAAA,CAAA,cAAA,IAAA,OAAA,CAAA,cAAA,CAAA,cAAA,IAAA,IAAA,CAAA,iBAAA,CAAA,WAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
5
|
+
let _stackframe_stack_ui = require("@stackframe/stack-ui");
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
+
let react = require("react");
|
|
8
|
+
react = require_chunk.__toESM(react);
|
|
9
|
+
let recharts = require("recharts");
|
|
10
|
+
recharts = require_chunk.__toESM(recharts);
|
|
11
|
+
let __chart_container_js = require("./chart-container.js");
|
|
12
|
+
|
|
13
|
+
//#region src/components/chart-legend.tsx
|
|
14
|
+
const DesignChartLegend = recharts.Legend;
|
|
15
|
+
const DesignChartLegendContent = react.forwardRef(({ className, hideIcon = false, payload, verticalAlign = "bottom", nameKey }, ref) => {
|
|
16
|
+
const { config } = (0, __chart_container_js.useDesignChart)();
|
|
17
|
+
if (!payload?.length) return null;
|
|
18
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
19
|
+
ref,
|
|
20
|
+
className: (0, _stackframe_stack_ui.cn)("flex flex-wrap items-center justify-center gap-2", verticalAlign === "top" ? "pb-3" : "pt-3", className),
|
|
21
|
+
children: payload.map((item) => {
|
|
22
|
+
const itemConfig = (0, __chart_container_js.getPayloadConfigFromPayload)(config, item, `${nameKey || item.dataKey || "value"}`);
|
|
23
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
24
|
+
className: (0, _stackframe_stack_ui.cn)("flex items-center gap-1.5 rounded-full bg-foreground/[0.03] ring-1 ring-foreground/[0.06] px-3 py-1.5 text-xs", "transition-colors duration-150 hover:transition-none hover:bg-foreground/[0.05]"),
|
|
25
|
+
children: [itemConfig?.icon && !hideIcon ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(itemConfig.icon, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
26
|
+
className: "h-2 w-2 shrink-0 rounded-full",
|
|
27
|
+
style: { backgroundColor: item.color }
|
|
28
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
29
|
+
className: "font-medium text-foreground",
|
|
30
|
+
children: itemConfig?.label || item.value
|
|
31
|
+
})]
|
|
32
|
+
}, item.value);
|
|
33
|
+
})
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
DesignChartLegendContent.displayName = "DesignChartLegendContent";
|
|
37
|
+
|
|
38
|
+
//#endregion
|
|
39
|
+
exports.DesignChartLegend = DesignChartLegend;
|
|
40
|
+
exports.DesignChartLegendContent = DesignChartLegendContent;
|
|
41
|
+
//# sourceMappingURL=chart-legend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-legend.js","names":["RechartsPrimitive","React"],"sources":["../../src/components/chart-legend.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as RechartsPrimitive from \"recharts\";\nimport { cn } from \"@stackframe/stack-ui\";\nimport { useDesignChart, getPayloadConfigFromPayload } from \"./chart-container\";\n\nexport const DesignChartLegend = RechartsPrimitive.Legend;\n\nexport const DesignChartLegendContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> &\n Pick<RechartsPrimitive.LegendProps, \"payload\" | \"verticalAlign\"> & {\n hideIcon?: boolean,\n nameKey?: string,\n }\n>(\n (\n { className, hideIcon = false, payload, verticalAlign = \"bottom\", nameKey },\n ref\n ) => {\n const { config } = useDesignChart();\n\n if (!payload?.length) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-wrap items-center justify-center gap-2\",\n verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n className\n )}\n >\n {payload.map((item) => {\n const key = `${nameKey || item.dataKey || \"value\"}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n\n return (\n <div\n key={item.value}\n className={cn(\n \"flex items-center gap-1.5 rounded-full bg-foreground/[0.03] ring-1 ring-foreground/[0.06] px-3 py-1.5 text-xs\",\n \"transition-colors duration-150 hover:transition-none hover:bg-foreground/[0.05]\"\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <span\n className=\"h-2 w-2 shrink-0 rounded-full\"\n style={{ backgroundColor: item.color }}\n />\n )}\n <span className=\"font-medium text-foreground\">\n {itemConfig?.label || item.value}\n </span>\n </div>\n );\n })}\n </div>\n );\n }\n);\nDesignChartLegendContent.displayName = \"DesignChartLegendContent\";\n"],"mappings":";;;;;;;;;;;;;AAOA,MAAa,oBAAoBA,SAAkB;AAEnD,MAAa,2BAA2BC,MAAM,YAS1C,EAAE,WAAW,WAAW,OAAO,SAAS,gBAAgB,UAAU,WAClE,QACG;CACH,MAAM,EAAE,qDAA2B;AAEnC,KAAI,CAAC,SAAS,OACZ,QAAO;AAGT,QACE,2CAAC;EACM;EACL,wCACE,oDACA,kBAAkB,QAAQ,SAAS,QACnC,UACD;YAEA,QAAQ,KAAK,SAAS;GAErB,MAAM,mEAAyC,QAAQ,MAD3C,GAAG,WAAW,KAAK,WAAW,UACuB;AAEjE,UACE,4CAAC;IAEC,wCACE,iHACA,kFACD;eAEA,YAAY,QAAQ,CAAC,WACpB,2CAAC,WAAW,SAAO,GAEnB,2CAAC;KACC,WAAU;KACV,OAAO,EAAE,iBAAiB,KAAK,OAAO;MACtC,EAEJ,2CAAC;KAAK,WAAU;eACb,YAAY,SAAS,KAAK;MACtB;MAhBF,KAAK,MAiBN;IAER;GACE;EAGX;AACD,yBAAyB,cAAc"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
//#region src/components/chart-theme.d.ts
|
|
2
|
+
type DesignChartColorEntry = {
|
|
3
|
+
light: string;
|
|
4
|
+
dark: string;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Design-system-consistent chart colors that work in light and dark mode.
|
|
8
|
+
* Maps to the gradient system used across the dashboard design components.
|
|
9
|
+
*/
|
|
10
|
+
declare const DESIGN_CHART_COLORS: readonly DesignChartColorEntry[];
|
|
11
|
+
type DesignChartColorName = "blue" | "cyan" | "purple" | "green" | "orange" | "red";
|
|
12
|
+
/**
|
|
13
|
+
* Get a chart color by index (wraps around) or by name.
|
|
14
|
+
*/
|
|
15
|
+
declare function getDesignChartColor(indexOrName: number | DesignChartColorName, mode?: "light" | "dark"): string;
|
|
16
|
+
/**
|
|
17
|
+
* Recharts-compatible grid/axis styling constants that match the design system.
|
|
18
|
+
*/
|
|
19
|
+
declare const DESIGN_CHART_GRID_COLOR = "hsl(0 0% 50% / 0.12)";
|
|
20
|
+
declare const DESIGN_CHART_AXIS_TICK_STYLE: {
|
|
21
|
+
readonly fill: "hsl(0 0% 50% / 0.5)";
|
|
22
|
+
readonly fontSize: 11;
|
|
23
|
+
};
|
|
24
|
+
//#endregion
|
|
25
|
+
export { DESIGN_CHART_AXIS_TICK_STYLE, DESIGN_CHART_COLORS, DESIGN_CHART_GRID_COLOR, DesignChartColorEntry, DesignChartColorName, getDesignChartColor };
|
|
26
|
+
//# sourceMappingURL=chart-theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-theme.d.ts","names":[],"sources":["../../src/components/chart-theme.tsx"],"mappings":";KAEY,qBAAA;EACV,KAAA;EACA,IAAA;AAAA;;;AAOF;;cAAa,mBAAA,WAA8B,qBAAA;AAAA,KAS/B,oBAAA;;AAAZ;;iBAcgB,mBAAA,CACd,WAAA,WAAsB,oBAAA,EACtB,IAAA;;;AAFF;cAaa,uBAAA;AAAA,cACA,4BAAA;EAAA,SAGH,IAAA;EAAA,SAAA,QAAA;AAAA"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
|
|
5
|
+
//#region src/components/chart-theme.tsx
|
|
6
|
+
/**
|
|
7
|
+
* Design-system-consistent chart colors that work in light and dark mode.
|
|
8
|
+
* Maps to the gradient system used across the dashboard design components.
|
|
9
|
+
*/
|
|
10
|
+
const DESIGN_CHART_COLORS = [
|
|
11
|
+
{
|
|
12
|
+
light: "hsl(221, 83%, 53%)",
|
|
13
|
+
dark: "hsl(217, 91%, 60%)"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
light: "hsl(192, 91%, 36%)",
|
|
17
|
+
dark: "hsl(188, 94%, 43%)"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
light: "hsl(271, 91%, 65%)",
|
|
21
|
+
dark: "hsl(270, 95%, 75%)"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
light: "hsl(160, 84%, 39%)",
|
|
25
|
+
dark: "hsl(160, 84%, 45%)"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
light: "hsl(38, 92%, 50%)",
|
|
29
|
+
dark: "hsl(38, 92%, 50%)"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
light: "hsl(0, 84%, 60%)",
|
|
33
|
+
dark: "hsl(0, 84%, 65%)"
|
|
34
|
+
}
|
|
35
|
+
];
|
|
36
|
+
const colorNameIndexMap = new Map([
|
|
37
|
+
["blue", 0],
|
|
38
|
+
["cyan", 1],
|
|
39
|
+
["purple", 2],
|
|
40
|
+
["green", 3],
|
|
41
|
+
["orange", 4],
|
|
42
|
+
["red", 5]
|
|
43
|
+
]);
|
|
44
|
+
/**
|
|
45
|
+
* Get a chart color by index (wraps around) or by name.
|
|
46
|
+
*/
|
|
47
|
+
function getDesignChartColor(indexOrName, mode = "dark") {
|
|
48
|
+
return DESIGN_CHART_COLORS[typeof indexOrName === "string" ? colorNameIndexMap.get(indexOrName) ?? 0 : indexOrName % DESIGN_CHART_COLORS.length][mode];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Recharts-compatible grid/axis styling constants that match the design system.
|
|
52
|
+
*/
|
|
53
|
+
const DESIGN_CHART_GRID_COLOR = "hsl(0 0% 50% / 0.12)";
|
|
54
|
+
const DESIGN_CHART_AXIS_TICK_STYLE = {
|
|
55
|
+
fill: "hsl(0 0% 50% / 0.5)",
|
|
56
|
+
fontSize: 11
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
//#endregion
|
|
60
|
+
exports.DESIGN_CHART_AXIS_TICK_STYLE = DESIGN_CHART_AXIS_TICK_STYLE;
|
|
61
|
+
exports.DESIGN_CHART_COLORS = DESIGN_CHART_COLORS;
|
|
62
|
+
exports.DESIGN_CHART_GRID_COLOR = DESIGN_CHART_GRID_COLOR;
|
|
63
|
+
exports.getDesignChartColor = getDesignChartColor;
|
|
64
|
+
//# sourceMappingURL=chart-theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-theme.js","names":[],"sources":["../../src/components/chart-theme.tsx"],"sourcesContent":["\"use client\";\n\nexport type DesignChartColorEntry = {\n light: string,\n dark: string,\n};\n\n/**\n * Design-system-consistent chart colors that work in light and dark mode.\n * Maps to the gradient system used across the dashboard design components.\n */\nexport const DESIGN_CHART_COLORS: readonly DesignChartColorEntry[] = [\n { light: \"hsl(221, 83%, 53%)\", dark: \"hsl(217, 91%, 60%)\" }, // blue\n { light: \"hsl(192, 91%, 36%)\", dark: \"hsl(188, 94%, 43%)\" }, // cyan\n { light: \"hsl(271, 91%, 65%)\", dark: \"hsl(270, 95%, 75%)\" }, // purple\n { light: \"hsl(160, 84%, 39%)\", dark: \"hsl(160, 84%, 45%)\" }, // emerald/green\n { light: \"hsl(38, 92%, 50%)\", dark: \"hsl(38, 92%, 50%)\" }, // amber/orange\n { light: \"hsl(0, 84%, 60%)\", dark: \"hsl(0, 84%, 65%)\" }, // red\n] as const;\n\nexport type DesignChartColorName = \"blue\" | \"cyan\" | \"purple\" | \"green\" | \"orange\" | \"red\";\n\nconst colorNameIndexMap = new Map<DesignChartColorName, number>([\n [\"blue\", 0],\n [\"cyan\", 1],\n [\"purple\", 2],\n [\"green\", 3],\n [\"orange\", 4],\n [\"red\", 5],\n]);\n\n/**\n * Get a chart color by index (wraps around) or by name.\n */\nexport function getDesignChartColor(\n indexOrName: number | DesignChartColorName,\n mode: \"light\" | \"dark\" = \"dark\",\n): string {\n const index = typeof indexOrName === \"string\"\n ? colorNameIndexMap.get(indexOrName) ?? 0\n : indexOrName % DESIGN_CHART_COLORS.length;\n return DESIGN_CHART_COLORS[index][mode];\n}\n\n/**\n * Recharts-compatible grid/axis styling constants that match the design system.\n */\nexport const DESIGN_CHART_GRID_COLOR = \"hsl(0 0% 50% / 0.12)\";\nexport const DESIGN_CHART_AXIS_TICK_STYLE = {\n fill: \"hsl(0 0% 50% / 0.5)\",\n fontSize: 11,\n} as const;\n"],"mappings":";;;;;;;;;AAWA,MAAa,sBAAwD;CACnE;EAAE,OAAO;EAAsB,MAAM;EAAsB;CAC3D;EAAE,OAAO;EAAsB,MAAM;EAAsB;CAC3D;EAAE,OAAO;EAAsB,MAAM;EAAsB;CAC3D;EAAE,OAAO;EAAsB,MAAM;EAAsB;CAC3D;EAAE,OAAO;EAAsB,MAAM;EAAqB;CAC1D;EAAE,OAAO;EAAsB,MAAM;EAAoB;CAC1D;AAID,MAAM,oBAAoB,IAAI,IAAkC;CAC9D,CAAC,QAAQ,EAAE;CACX,CAAC,QAAQ,EAAE;CACX,CAAC,UAAU,EAAE;CACb,CAAC,SAAS,EAAE;CACZ,CAAC,UAAU,EAAE;CACb,CAAC,OAAO,EAAE;CACX,CAAC;;;;AAKF,SAAgB,oBACd,aACA,OAAyB,QACjB;AAIR,QAAO,oBAHO,OAAO,gBAAgB,WACjC,kBAAkB,IAAI,YAAY,IAAI,IACtC,cAAc,oBAAoB,QACJ;;;;;AAMpC,MAAa,0BAA0B;AACvC,MAAa,+BAA+B;CAC1C,MAAM;CACN,UAAU;CACX"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as React$1 from "react";
|
|
2
|
+
import * as RechartsPrimitive from "recharts";
|
|
3
|
+
import * as recharts_types_component_DefaultTooltipContent0 from "recharts/types/component/DefaultTooltipContent";
|
|
4
|
+
import * as recharts_types_util_types0 from "recharts/types/util/types";
|
|
5
|
+
import * as recharts_types_component_Tooltip0 from "recharts/types/component/Tooltip";
|
|
6
|
+
import * as recharts_types_util_payload_getUniqPayload0 from "recharts/types/util/payload/getUniqPayload";
|
|
7
|
+
|
|
8
|
+
//#region src/components/chart-tooltip.d.ts
|
|
9
|
+
declare const DesignChartTooltip: typeof RechartsPrimitive.Tooltip;
|
|
10
|
+
declare const DesignChartTooltipContent: React$1.ForwardRefExoticComponent<Omit<RechartsPrimitive.DefaultTooltipContentProps<recharts_types_component_DefaultTooltipContent0.ValueType, recharts_types_component_DefaultTooltipContent0.NameType> & {
|
|
11
|
+
accessibilityLayer?: boolean;
|
|
12
|
+
active?: boolean | undefined;
|
|
13
|
+
includeHidden?: boolean | undefined;
|
|
14
|
+
allowEscapeViewBox?: recharts_types_util_types0.AllowInDimension;
|
|
15
|
+
animationDuration?: recharts_types_util_types0.AnimationDuration;
|
|
16
|
+
animationEasing?: recharts_types_util_types0.AnimationTiming;
|
|
17
|
+
content?: recharts_types_component_Tooltip0.ContentType<recharts_types_component_DefaultTooltipContent0.ValueType, recharts_types_component_DefaultTooltipContent0.NameType> | undefined;
|
|
18
|
+
coordinate?: Partial<recharts_types_util_types0.Coordinate>;
|
|
19
|
+
cursor?: boolean | React$1.ReactElement | React$1.SVGProps<SVGElement>;
|
|
20
|
+
filterNull?: boolean;
|
|
21
|
+
defaultIndex?: number;
|
|
22
|
+
isAnimationActive?: boolean;
|
|
23
|
+
offset?: number;
|
|
24
|
+
payloadUniqBy?: recharts_types_util_payload_getUniqPayload0.UniqueOption<recharts_types_component_DefaultTooltipContent0.Payload<recharts_types_component_DefaultTooltipContent0.ValueType, recharts_types_component_DefaultTooltipContent0.NameType>> | undefined;
|
|
25
|
+
position?: Partial<recharts_types_util_types0.Coordinate>;
|
|
26
|
+
reverseDirection?: recharts_types_util_types0.AllowInDimension;
|
|
27
|
+
shared?: boolean;
|
|
28
|
+
trigger?: "hover" | "click";
|
|
29
|
+
useTranslate3d?: boolean;
|
|
30
|
+
viewBox?: recharts_types_util_types0.CartesianViewBox;
|
|
31
|
+
wrapperStyle?: React$1.CSSProperties;
|
|
32
|
+
} & React$1.ClassAttributes<HTMLDivElement> & React$1.HTMLAttributes<HTMLDivElement> & {
|
|
33
|
+
hideLabel?: boolean;
|
|
34
|
+
hideIndicator?: boolean;
|
|
35
|
+
indicator?: "line" | "dot" | "dashed";
|
|
36
|
+
nameKey?: string;
|
|
37
|
+
labelKey?: string;
|
|
38
|
+
}, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
|
|
39
|
+
//#endregion
|
|
40
|
+
export { DesignChartTooltip, DesignChartTooltipContent };
|
|
41
|
+
//# sourceMappingURL=chart-tooltip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-tooltip.d.ts","names":[],"sources":["../../src/components/chart-tooltip.tsx"],"mappings":";;;;;;;;cAOa,kBAAA,SAAkB,iBAAA,CAAA,OAAA;AAAA,cAElB,yBAAA,EAAyB,OAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,iBAAA,CAAA,0BAAA,CA0JrC,+CAAA,CA1JqC,SAAA,EAAA,+CAAA,CAAA,QAAA;;;;uBAAA,0BAAA,CAAA,gBAAA"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
|
+
const require_chunk = require('../chunk-BE-pF4vm.js');
|
|
5
|
+
let _stackframe_stack_ui = require("@stackframe/stack-ui");
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
+
let react = require("react");
|
|
8
|
+
react = require_chunk.__toESM(react);
|
|
9
|
+
let recharts = require("recharts");
|
|
10
|
+
recharts = require_chunk.__toESM(recharts);
|
|
11
|
+
let __chart_container_js = require("./chart-container.js");
|
|
12
|
+
|
|
13
|
+
//#region src/components/chart-tooltip.tsx
|
|
14
|
+
const DesignChartTooltip = recharts.Tooltip;
|
|
15
|
+
const DesignChartTooltipContent = react.forwardRef(({ active, payload, className, indicator = "dot", hideLabel = false, hideIndicator = false, label, labelFormatter, labelClassName, formatter, color, nameKey, labelKey }, ref) => {
|
|
16
|
+
const { config } = (0, __chart_container_js.useDesignChart)();
|
|
17
|
+
const tooltipLabel = react.useMemo(() => {
|
|
18
|
+
if (hideLabel || !payload?.length) return null;
|
|
19
|
+
const [item] = payload;
|
|
20
|
+
const itemConfig = (0, __chart_container_js.getPayloadConfigFromPayload)(config, item, `${labelKey || item.dataKey || item.name || "value"}`);
|
|
21
|
+
const configEntry = typeof label === "string" ? config[label] : void 0;
|
|
22
|
+
const value = !labelKey && typeof label === "string" ? configEntry?.label ?? label : itemConfig?.label;
|
|
23
|
+
if (labelFormatter) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
24
|
+
className: (0, _stackframe_stack_ui.cn)("font-medium text-muted-foreground tracking-wide", labelClassName),
|
|
25
|
+
children: labelFormatter(value, payload)
|
|
26
|
+
});
|
|
27
|
+
if (!value) return null;
|
|
28
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
29
|
+
className: (0, _stackframe_stack_ui.cn)("font-medium text-muted-foreground tracking-wide", labelClassName),
|
|
30
|
+
children: value
|
|
31
|
+
});
|
|
32
|
+
}, [
|
|
33
|
+
label,
|
|
34
|
+
labelFormatter,
|
|
35
|
+
payload,
|
|
36
|
+
hideLabel,
|
|
37
|
+
labelClassName,
|
|
38
|
+
config,
|
|
39
|
+
labelKey
|
|
40
|
+
]);
|
|
41
|
+
if (!active || !payload?.length) return null;
|
|
42
|
+
const nestLabel = payload.length === 1 && indicator !== "dot";
|
|
43
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
44
|
+
ref,
|
|
45
|
+
className: (0, _stackframe_stack_ui.cn)("grid min-w-[8rem] items-start gap-1.5 rounded-xl bg-background/95 px-3.5 py-2.5 text-xs shadow-lg backdrop-blur-xl ring-1 ring-foreground/[0.08]", className),
|
|
46
|
+
style: { zIndex: 9999 },
|
|
47
|
+
children: [!nestLabel ? tooltipLabel : null, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
48
|
+
className: "grid gap-1.5",
|
|
49
|
+
children: payload.map((item, index) => {
|
|
50
|
+
const itemConfig = (0, __chart_container_js.getPayloadConfigFromPayload)(config, item, `${nameKey || item.name || item.dataKey || "value"}`);
|
|
51
|
+
const indicatorColor = color || item.payload.fill || item.color;
|
|
52
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
53
|
+
className: (0, _stackframe_stack_ui.cn)("flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground", indicator === "dot" && "items-center"),
|
|
54
|
+
children: formatter && item.value !== void 0 && item.name ? formatter(item.value, item.name, item, index, item.payload) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [itemConfig?.icon ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(itemConfig.icon, {}) : !hideIndicator && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
55
|
+
className: (0, _stackframe_stack_ui.cn)("shrink-0 rounded-full", {
|
|
56
|
+
"h-2 w-2 ring-2 ring-white/20": indicator === "dot",
|
|
57
|
+
"w-1 rounded-[2px]": indicator === "line",
|
|
58
|
+
"w-0 border-[1.5px] border-dashed bg-transparent rounded-[2px]": indicator === "dashed",
|
|
59
|
+
"my-0.5": nestLabel && indicator === "dashed"
|
|
60
|
+
}),
|
|
61
|
+
style: {
|
|
62
|
+
"--color-bg": indicatorColor,
|
|
63
|
+
"--color-border": indicatorColor,
|
|
64
|
+
backgroundColor: indicator === "dot" ? indicatorColor : void 0
|
|
65
|
+
}
|
|
66
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
67
|
+
className: (0, _stackframe_stack_ui.cn)("flex flex-1 justify-between leading-none", nestLabel ? "items-end" : "items-center"),
|
|
68
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
69
|
+
className: "grid gap-1.5",
|
|
70
|
+
children: [nestLabel ? tooltipLabel : null, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
71
|
+
className: "text-[11px] text-muted-foreground",
|
|
72
|
+
children: itemConfig?.label || item.name
|
|
73
|
+
})]
|
|
74
|
+
}), item.value != null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
75
|
+
className: "ml-auto font-mono text-xs font-semibold tabular-nums text-foreground",
|
|
76
|
+
children: typeof item.value === "number" ? item.value.toLocaleString() : item.value
|
|
77
|
+
})]
|
|
78
|
+
})] })
|
|
79
|
+
}, item.dataKey);
|
|
80
|
+
})
|
|
81
|
+
})]
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
DesignChartTooltipContent.displayName = "DesignChartTooltipContent";
|
|
85
|
+
|
|
86
|
+
//#endregion
|
|
87
|
+
exports.DesignChartTooltip = DesignChartTooltip;
|
|
88
|
+
exports.DesignChartTooltipContent = DesignChartTooltipContent;
|
|
89
|
+
//# sourceMappingURL=chart-tooltip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-tooltip.js","names":["RechartsPrimitive","React"],"sources":["../../src/components/chart-tooltip.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport * as RechartsPrimitive from \"recharts\";\nimport { cn } from \"@stackframe/stack-ui\";\nimport { useDesignChart, getPayloadConfigFromPayload } from \"./chart-container\";\n\nexport const DesignChartTooltip = RechartsPrimitive.Tooltip;\n\nexport const DesignChartTooltipContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<\"div\"> & {\n hideLabel?: boolean,\n hideIndicator?: boolean,\n indicator?: \"line\" | \"dot\" | \"dashed\",\n nameKey?: string,\n labelKey?: string,\n }\n>(\n (\n {\n active,\n payload,\n className,\n indicator = \"dot\",\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n },\n ref\n ) => {\n const { config } = useDesignChart();\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null;\n }\n\n const [item] = payload;\n const key = `${labelKey || item.dataKey || item.name || \"value\"}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const configEntry = typeof label === \"string\" ? config[label as keyof typeof config] : undefined;\n const value =\n !labelKey && typeof label === \"string\"\n ? configEntry?.label ?? label\n : itemConfig?.label;\n\n if (labelFormatter) {\n return (\n <div className={cn(\"font-medium text-muted-foreground tracking-wide\", labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n );\n }\n\n if (!value) {\n return null;\n }\n\n return <div className={cn(\"font-medium text-muted-foreground tracking-wide\", labelClassName)}>{value}</div>;\n }, [\n label,\n labelFormatter,\n payload,\n hideLabel,\n labelClassName,\n config,\n labelKey,\n ]);\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const nestLabel = payload.length === 1 && indicator !== \"dot\";\n\n return (\n <div\n ref={ref}\n className={cn(\n \"grid min-w-[8rem] items-start gap-1.5 rounded-xl bg-background/95 px-3.5 py-2.5 text-xs shadow-lg backdrop-blur-xl ring-1 ring-foreground/[0.08]\",\n className\n )}\n style={{ zIndex: 9999 }}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload.map((item, index) => {\n const key = `${nameKey || item.name || item.dataKey || \"value\"}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const indicatorColor = color || item.payload.fill || item.color;\n\n return (\n <div\n key={item.dataKey}\n className={cn(\n \"flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground\",\n indicator === \"dot\" && \"items-center\"\n )}\n >\n {formatter && item.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n \"shrink-0 rounded-full\",\n {\n \"h-2 w-2 ring-2 ring-white/20\": indicator === \"dot\",\n \"w-1 rounded-[2px]\": indicator === \"line\",\n \"w-0 border-[1.5px] border-dashed bg-transparent rounded-[2px]\":\n indicator === \"dashed\",\n \"my-0.5\": nestLabel && indicator === \"dashed\",\n }\n )}\n style={\n {\n \"--color-bg\": indicatorColor,\n \"--color-border\": indicatorColor,\n backgroundColor: indicator === \"dot\" ? indicatorColor : undefined,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n \"flex flex-1 justify-between leading-none\",\n nestLabel ? \"items-end\" : \"items-center\"\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-[11px] text-muted-foreground\">\n {itemConfig?.label || item.name}\n </span>\n </div>\n {item.value != null && (\n <span className=\"ml-auto font-mono text-xs font-semibold tabular-nums text-foreground\">\n {typeof item.value === \"number\" ? item.value.toLocaleString() : item.value}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n }\n);\nDesignChartTooltipContent.displayName = \"DesignChartTooltipContent\";\n"],"mappings":";;;;;;;;;;;;;AAOA,MAAa,qBAAqBA,SAAkB;AAEpD,MAAa,4BAA4BC,MAAM,YAY3C,EACE,QACA,SACA,WACA,YAAY,OACZ,YAAY,OACZ,gBAAgB,OAChB,OACA,gBACA,gBACA,WACA,OACA,SACA,YAEF,QACG;CACH,MAAM,EAAE,qDAA2B;CAEnC,MAAM,eAAeA,MAAM,cAAc;AACvC,MAAI,aAAa,CAAC,SAAS,OACzB,QAAO;EAGT,MAAM,CAAC,QAAQ;EAEf,MAAM,mEAAyC,QAAQ,MAD3C,GAAG,YAAY,KAAK,WAAW,KAAK,QAAQ,UACS;EACjE,MAAM,cAAc,OAAO,UAAU,WAAW,OAAO,SAAgC;EACvF,MAAM,QACJ,CAAC,YAAY,OAAO,UAAU,WAC1B,aAAa,SAAS,QACtB,YAAY;AAElB,MAAI,eACF,QACE,2CAAC;GAAI,wCAAc,mDAAmD,eAAe;aAClF,eAAe,OAAO,QAAQ;IAC3B;AAIV,MAAI,CAAC,MACH,QAAO;AAGT,SAAO,2CAAC;GAAI,wCAAc,mDAAmD,eAAe;aAAG;IAAY;IAC1G;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;AAEF,KAAI,CAAC,UAAU,CAAC,SAAS,OACvB,QAAO;CAGT,MAAM,YAAY,QAAQ,WAAW,KAAK,cAAc;AAExD,QACE,4CAAC;EACM;EACL,wCACE,oJACA,UACD;EACD,OAAO,EAAE,QAAQ,MAAM;aAEtB,CAAC,YAAY,eAAe,MAC7B,2CAAC;GAAI,WAAU;aACZ,QAAQ,KAAK,MAAM,UAAU;IAE5B,MAAM,mEAAyC,QAAQ,MAD3C,GAAG,WAAW,KAAK,QAAQ,KAAK,WAAW,UACU;IACjE,MAAM,iBAAiB,SAAS,KAAK,QAAQ,QAAQ,KAAK;AAE1D,WACE,2CAAC;KAEC,wCACE,uGACA,cAAc,SAAS,eACxB;eAEA,aAAa,KAAK,UAAU,UAAa,KAAK,OAC7C,UAAU,KAAK,OAAO,KAAK,MAAM,MAAM,OAAO,KAAK,QAAQ,GAE3D,qFACG,YAAY,OACX,2CAAC,WAAW,SAAO,GAEnB,CAAC,iBACC,2CAAC;MACC,wCACE,yBACA;OACE,gCAAgC,cAAc;OAC9C,qBAAqB,cAAc;OACnC,iEACE,cAAc;OAChB,UAAU,aAAa,cAAc;OACtC,CACF;MACD,OACE;OACE,cAAc;OACd,kBAAkB;OAClB,iBAAiB,cAAc,QAAQ,iBAAiB;OACzD;OAEH,EAGN,4CAAC;MACC,wCACE,4CACA,YAAY,cAAc,eAC3B;iBAED,4CAAC;OAAI,WAAU;kBACZ,YAAY,eAAe,MAC5B,2CAAC;QAAK,WAAU;kBACb,YAAY,SAAS,KAAK;SACtB;QACH,EACL,KAAK,SAAS,QACb,2CAAC;OAAK,WAAU;iBACb,OAAO,KAAK,UAAU,WAAW,KAAK,MAAM,gBAAgB,GAAG,KAAK;QAChE;OAEL,IACL;OArDA,KAAK,QAuDN;KAER;IACE;GACF;EAGX;AACD,0BAA0B,cAAc"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/components/cursor-blast-effect.d.ts
|
|
4
|
+
type CursorBlastEffectProps = {
|
|
5
|
+
/** Lifetime of each blast animation in ms. Default: 720 */blastLifetimeMs?: number; /** Maximum number of concurrent active blasts. Default: 18 */
|
|
6
|
+
maxActiveBlasts?: number; /** Minimum rapid clicks in the time window to trigger a blast. Default: 3 */
|
|
7
|
+
rageClickThreshold?: number; /** Time window (ms) for counting rage clicks. Default: 600 */
|
|
8
|
+
rageClickWindowMs?: number; /** Max distance (px) between clicks to count as same-spot rage clicking. Default: 60 */
|
|
9
|
+
rageClickRadiusPx?: number;
|
|
10
|
+
/**
|
|
11
|
+
* When provided, the blast effect is scoped to this container element.
|
|
12
|
+
* Clicks are only detected within the container and blasts are positioned
|
|
13
|
+
* relative to the container rather than the viewport.
|
|
14
|
+
*/
|
|
15
|
+
containerRef?: React.RefObject<HTMLElement | null>;
|
|
16
|
+
};
|
|
17
|
+
declare function CursorBlastEffect({
|
|
18
|
+
blastLifetimeMs,
|
|
19
|
+
maxActiveBlasts,
|
|
20
|
+
rageClickThreshold,
|
|
21
|
+
rageClickWindowMs,
|
|
22
|
+
rageClickRadiusPx,
|
|
23
|
+
containerRef
|
|
24
|
+
}?: CursorBlastEffectProps): react_jsx_runtime0.JSX.Element | null;
|
|
25
|
+
//#endregion
|
|
26
|
+
export { CursorBlastEffect, CursorBlastEffectProps };
|
|
27
|
+
//# sourceMappingURL=cursor-blast-effect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-blast-effect.d.ts","names":[],"sources":["../../src/components/cursor-blast-effect.tsx"],"mappings":";;;KA6BY,sBAAA;6DAEV,eAAA,WAFU;EAIV,eAAA;EAEA,kBAAA,WAJA;EAMA,iBAAA,WAFA;EAIA,iBAAA;EAAA;;;;;EAMA,YAAA,GAAe,KAAA,CAAM,SAAA,CAAU,WAAA;AAAA;AAAA,iBAGjB,iBAAA,CAAA;EACd,eAAA;EACA,eAAA;EACA,kBAAA;EACA,iBAAA;EACA,iBAAA;EACA;AAAA,IACC,sBAAA,GAA2B,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|