@acarmisc/backstage-plugin-litellm 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api.test.d.ts +1 -0
- package/dist/components/TeamUsage.d.ts +1 -2
- package/dist/format.d.ts +2 -0
- package/dist/format.test.d.ts +1 -0
- package/dist/index.cjs.js +55 -11
- package/dist/index.cjs.js.map +4 -4
- package/dist/index.esm.js +58 -12
- package/dist/index.esm.js.map +4 -4
- package/package.json +3 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { TeamInfo, UsageMetrics
|
|
2
|
+
import { TeamInfo, UsageMetrics } from '../types';
|
|
3
3
|
interface TeamUsageProps {
|
|
4
4
|
teams: TeamInfo[];
|
|
5
5
|
loading: boolean;
|
|
6
|
-
dateRange: DateRange;
|
|
7
6
|
getTeamUsage: (teamId: string) => UsageMetrics | null;
|
|
8
7
|
getTeamUsageLoading: (teamId: string) => boolean;
|
|
9
8
|
}
|
package/dist/format.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/index.cjs.js
CHANGED
|
@@ -707,19 +707,30 @@ var init_KeysTable = __esm({
|
|
|
707
707
|
}
|
|
708
708
|
});
|
|
709
709
|
|
|
710
|
+
// src/format.ts
|
|
711
|
+
var fmtUsd, fmtInt;
|
|
712
|
+
var init_format = __esm({
|
|
713
|
+
"src/format.ts"() {
|
|
714
|
+
"use strict";
|
|
715
|
+
fmtUsd = (n) => `$${(n ?? 0).toFixed(n < 1 ? 4 : 2)}`;
|
|
716
|
+
fmtInt = (n) => (n ?? 0).toLocaleString();
|
|
717
|
+
}
|
|
718
|
+
});
|
|
719
|
+
|
|
710
720
|
// src/components/UsageStats.tsx
|
|
711
721
|
function modelColor(model) {
|
|
712
722
|
let h = 5381;
|
|
713
723
|
for (let i = 0; i < model.length; i++) h = (h << 5) + h + model.charCodeAt(i) >>> 0;
|
|
714
724
|
return MODEL_COLORS[h % MODEL_COLORS.length];
|
|
715
725
|
}
|
|
716
|
-
var import_react3, import_material3, import_recharts, TOP_N_MODELS, PERIOD_LS_KEY, MODEL_COLORS,
|
|
726
|
+
var import_react3, import_material3, import_recharts, TOP_N_MODELS, PERIOD_LS_KEY, MODEL_COLORS, fmtPct, KpiCard, ChartSkeleton, EmptyChart, UsageStats;
|
|
717
727
|
var init_UsageStats = __esm({
|
|
718
728
|
"src/components/UsageStats.tsx"() {
|
|
719
729
|
"use strict";
|
|
720
730
|
import_react3 = __toESM(require("react"));
|
|
721
731
|
import_material3 = require("@mui/material");
|
|
722
732
|
import_recharts = require("recharts");
|
|
733
|
+
init_format();
|
|
723
734
|
TOP_N_MODELS = 6;
|
|
724
735
|
PERIOD_LS_KEY = "litellm_usage_period";
|
|
725
736
|
MODEL_COLORS = [
|
|
@@ -734,8 +745,6 @@ var init_UsageStats = __esm({
|
|
|
734
745
|
"#a4de6c",
|
|
735
746
|
"#d0ed57"
|
|
736
747
|
];
|
|
737
|
-
fmtUsd = (n) => `$${(n ?? 0).toFixed(n < 1 ? 4 : 2)}`;
|
|
738
|
-
fmtInt = (n) => (n ?? 0).toLocaleString();
|
|
739
748
|
fmtPct = (n) => `${(n * 100).toFixed(1)}%`;
|
|
740
749
|
KpiCard = ({ label, value, hint }) => /* @__PURE__ */ import_react3.default.createElement(import_material3.Paper, { variant: "outlined", sx: { p: 2, height: "100%" } }, /* @__PURE__ */ import_react3.default.createElement(import_material3.Typography, { variant: "caption", color: "text.secondary" }, label), /* @__PURE__ */ import_react3.default.createElement(import_material3.Typography, { variant: "h5", sx: { mt: 0.5 } }, value), hint ? /* @__PURE__ */ import_react3.default.createElement(import_material3.Typography, { variant: "caption", color: "text.secondary" }, hint) : null);
|
|
741
750
|
ChartSkeleton = ({ height = 260 }) => /* @__PURE__ */ import_react3.default.createElement(import_material3.Skeleton, { variant: "rectangular", height, sx: { borderRadius: 1 } });
|
|
@@ -918,7 +927,7 @@ var init_UsageStats = __esm({
|
|
|
918
927
|
});
|
|
919
928
|
|
|
920
929
|
// src/components/TeamUsage.tsx
|
|
921
|
-
var import_react4, import_material4, import_icons_material2, import_recharts2, TeamCard, TeamUsage;
|
|
930
|
+
var import_react4, import_material4, import_icons_material2, import_recharts2, Stat, TeamCard, TeamUsage;
|
|
922
931
|
var init_TeamUsage = __esm({
|
|
923
932
|
"src/components/TeamUsage.tsx"() {
|
|
924
933
|
"use strict";
|
|
@@ -926,6 +935,7 @@ var init_TeamUsage = __esm({
|
|
|
926
935
|
import_material4 = require("@mui/material");
|
|
927
936
|
import_icons_material2 = require("@mui/icons-material");
|
|
928
937
|
import_recharts2 = require("recharts");
|
|
938
|
+
Stat = ({ label, value }) => /* @__PURE__ */ import_react4.default.createElement(import_material4.Box, null, /* @__PURE__ */ import_react4.default.createElement(import_material4.Typography, { variant: "caption", color: "text.secondary", display: "block" }, label), /* @__PURE__ */ import_react4.default.createElement(import_material4.Typography, { variant: "body2", fontWeight: 600, sx: { fontFamily: "monospace" } }, value));
|
|
929
939
|
TeamCard = ({ team, usage, usageLoading }) => {
|
|
930
940
|
const [expanded, setExpanded] = (0, import_react4.useState)(false);
|
|
931
941
|
const budget = team.max_budget ?? 0;
|
|
@@ -934,7 +944,43 @@ var init_TeamUsage = __esm({
|
|
|
934
944
|
const isOver = budget > 0 && spend >= budget;
|
|
935
945
|
const isNear = budget > 0 && spend >= budget * 0.8 && !isOver;
|
|
936
946
|
const dailyData = usage?.daily_usage?.map((d) => ({ date: d.date, spend: d.spend })) ?? [];
|
|
937
|
-
return /* @__PURE__ */ import_react4.default.createElement(import_material4.Paper, { variant: "outlined", sx: { p: 2, mb: 2 } }, /* @__PURE__ */ import_react4.default.createElement(import_material4.Box, { display: "flex", alignItems: "center", gap: 1 }, /* @__PURE__ */ import_react4.default.createElement(import_icons_material2.Group, { color: "action" }), /* @__PURE__ */ import_react4.default.createElement(import_material4.Box, { flexGrow: 1 }, /* @__PURE__ */ import_react4.default.createElement(import_material4.Typography, { variant: "subtitle1", fontWeight: 600 }, team.team_alias
|
|
947
|
+
return /* @__PURE__ */ import_react4.default.createElement(import_material4.Paper, { variant: "outlined", sx: { p: 2, mb: 2 } }, /* @__PURE__ */ import_react4.default.createElement(import_material4.Box, { display: "flex", alignItems: "center", gap: 1 }, /* @__PURE__ */ import_react4.default.createElement(import_icons_material2.Group, { color: "action" }), /* @__PURE__ */ import_react4.default.createElement(import_material4.Box, { flexGrow: 1 }, /* @__PURE__ */ import_react4.default.createElement(import_material4.Typography, { variant: "subtitle1", fontWeight: 600 }, team.team_alias || "Untitled team"), /* @__PURE__ */ import_react4.default.createElement(import_material4.Typography, { variant: "caption", color: "text.secondary", sx: { fontFamily: "monospace" } }, team.team_id)), /* @__PURE__ */ import_react4.default.createElement(import_material4.IconButton, { size: "small", onClick: () => setExpanded((e) => !e), "aria-label": "toggle details" }, expanded ? /* @__PURE__ */ import_react4.default.createElement(import_icons_material2.ExpandLess, null) : /* @__PURE__ */ import_react4.default.createElement(import_icons_material2.ExpandMore, null))), /* @__PURE__ */ import_react4.default.createElement(import_material4.Stack, { direction: "row", spacing: 3, mt: 1.5, flexWrap: "wrap", useFlexGap: true, gap: 1.5 }, /* @__PURE__ */ import_react4.default.createElement(
|
|
948
|
+
Stat,
|
|
949
|
+
{
|
|
950
|
+
label: "Members",
|
|
951
|
+
value: team.members_with_roles?.length ? String(team.members_with_roles.length) : "\u2014"
|
|
952
|
+
}
|
|
953
|
+
), /* @__PURE__ */ import_react4.default.createElement(
|
|
954
|
+
Stat,
|
|
955
|
+
{
|
|
956
|
+
label: "Models",
|
|
957
|
+
value: team.models?.length ? String(team.models.length) : "All"
|
|
958
|
+
}
|
|
959
|
+
), /* @__PURE__ */ import_react4.default.createElement(
|
|
960
|
+
Stat,
|
|
961
|
+
{
|
|
962
|
+
label: "Budget",
|
|
963
|
+
value: budget > 0 ? `$${budget.toFixed(2)}` : "Unlimited"
|
|
964
|
+
}
|
|
965
|
+
), /* @__PURE__ */ import_react4.default.createElement(
|
|
966
|
+
Stat,
|
|
967
|
+
{
|
|
968
|
+
label: "Spend",
|
|
969
|
+
value: `$${spend.toFixed(2)}`
|
|
970
|
+
}
|
|
971
|
+
), /* @__PURE__ */ import_react4.default.createElement(
|
|
972
|
+
Stat,
|
|
973
|
+
{
|
|
974
|
+
label: "TPM",
|
|
975
|
+
value: team.tpm_limit != null && team.tpm_limit > 0 ? String(team.tpm_limit) : "\u2014"
|
|
976
|
+
}
|
|
977
|
+
), /* @__PURE__ */ import_react4.default.createElement(
|
|
978
|
+
Stat,
|
|
979
|
+
{
|
|
980
|
+
label: "RPM",
|
|
981
|
+
value: team.rpm_limit != null && team.rpm_limit > 0 ? String(team.rpm_limit) : "\u2014"
|
|
982
|
+
}
|
|
983
|
+
)), budget > 0 && /* @__PURE__ */ import_react4.default.createElement(import_material4.Box, { mt: 1.5 }, /* @__PURE__ */ import_react4.default.createElement(import_material4.Box, { display: "flex", justifyContent: "space-between", mb: 0.5 }, /* @__PURE__ */ import_react4.default.createElement(import_material4.Typography, { variant: "body2" }, "$", spend.toFixed(2), " / $", budget.toFixed(2)), isOver && /* @__PURE__ */ import_react4.default.createElement(import_material4.Chip, { label: "Over Budget", size: "small", color: "error" }), isNear && /* @__PURE__ */ import_react4.default.createElement(import_material4.Chip, { label: "Near Limit", size: "small", color: "warning" })), /* @__PURE__ */ import_react4.default.createElement(
|
|
938
984
|
import_material4.LinearProgress,
|
|
939
985
|
{
|
|
940
986
|
variant: "determinate",
|
|
@@ -942,14 +988,14 @@ var init_TeamUsage = __esm({
|
|
|
942
988
|
color: isOver ? "error" : isNear ? "warning" : "primary",
|
|
943
989
|
sx: { height: 6, borderRadius: 1 }
|
|
944
990
|
}
|
|
945
|
-
)), /* @__PURE__ */ import_react4.default.createElement(import_material4.Collapse, { in: expanded }, /* @__PURE__ */ import_react4.default.createElement(import_material4.Box, { mt: 2 }, usageLoading ? /* @__PURE__ */ import_react4.default.createElement(import_material4.Box, { display: "flex", justifyContent: "center", p: 2 }, /* @__PURE__ */ import_react4.default.createElement(import_material4.CircularProgress, { size: 24 })) : dailyData.length > 0 ? /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null, /* @__PURE__ */ import_react4.default.createElement(import_material4.Typography, { variant: "subtitle2", color: "text.secondary", gutterBottom: true }, "Daily Spend"), /* @__PURE__ */ import_react4.default.createElement(import_material4.Box, { height: 160 }, /* @__PURE__ */ import_react4.default.createElement(import_recharts2.ResponsiveContainer, { width: "100%", height: "100%" }, /* @__PURE__ */ import_react4.default.createElement(import_recharts2.AreaChart, { data: dailyData }, /* @__PURE__ */ import_react4.default.createElement(import_recharts2.CartesianGrid, { strokeDasharray: "3 3" }), /* @__PURE__ */ import_react4.default.createElement(import_recharts2.XAxis, { dataKey: "date", tick: { fontSize: 11 } }), /* @__PURE__ */ import_react4.default.createElement(import_recharts2.YAxis, { tick: { fontSize: 11 }, tickFormatter: (v) => `$${v.toFixed(2)}` }), /* @__PURE__ */ import_react4.default.createElement(import_recharts2.Tooltip, { formatter: (v) => [`$${v.toFixed(4)}`, "Spend"] }), /* @__PURE__ */ import_react4.default.createElement(import_recharts2.Area, { type: "monotone", dataKey: "spend", stroke: "#8884d8", fill: "#8884d8", fillOpacity: 0.3 }))))) : null,
|
|
991
|
+
)), /* @__PURE__ */ import_react4.default.createElement(import_material4.Collapse, { in: expanded }, /* @__PURE__ */ import_react4.default.createElement(import_material4.Box, { mt: 2 }, /* @__PURE__ */ import_react4.default.createElement(import_material4.Box, { display: "flex", alignItems: "center", gap: 1, mb: 1 }, /* @__PURE__ */ import_react4.default.createElement(import_icons_material2.Speed, { fontSize: "small", color: "action" }), /* @__PURE__ */ import_react4.default.createElement(import_material4.Typography, { variant: "subtitle2", color: "text.secondary" }, "Rate limits")), /* @__PURE__ */ import_react4.default.createElement(import_material4.Stack, { direction: "row", spacing: 3, flexWrap: "wrap", useFlexGap: true, gap: 1.5, mb: 2 }, /* @__PURE__ */ import_react4.default.createElement(Stat, { label: "TPM limit", value: team.tpm_limit != null && team.tpm_limit > 0 ? String(team.tpm_limit) : "Unlimited" }), /* @__PURE__ */ import_react4.default.createElement(Stat, { label: "RPM limit", value: team.rpm_limit != null && team.rpm_limit > 0 ? String(team.rpm_limit) : "Unlimited" }), /* @__PURE__ */ import_react4.default.createElement(Stat, { label: "Max budget", value: budget > 0 ? `$${budget.toFixed(2)}` : "Unlimited" })), /* @__PURE__ */ import_react4.default.createElement(import_material4.Divider, { sx: { mb: 2 } }), /* @__PURE__ */ import_react4.default.createElement(import_material4.Typography, { variant: "subtitle2", color: "text.secondary", gutterBottom: true }, "Models"), team.models?.length ? /* @__PURE__ */ import_react4.default.createElement(import_material4.Box, { display: "flex", gap: 0.5, flexWrap: "wrap", mb: 2 }, team.models.map((m) => /* @__PURE__ */ import_react4.default.createElement(import_material4.Chip, { key: m, label: m, size: "small", variant: "outlined" }))) : /* @__PURE__ */ import_react4.default.createElement(import_material4.Typography, { variant: "body2", color: "text.secondary", mb: 2 }, "All models allowed"), /* @__PURE__ */ import_react4.default.createElement(import_material4.Divider, { sx: { mb: 2 } }), usageLoading ? /* @__PURE__ */ import_react4.default.createElement(import_material4.Box, { display: "flex", justifyContent: "center", p: 2 }, /* @__PURE__ */ import_react4.default.createElement(import_material4.CircularProgress, { size: 24 })) : dailyData.length > 0 ? /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null, /* @__PURE__ */ import_react4.default.createElement(import_material4.Typography, { variant: "subtitle2", color: "text.secondary", gutterBottom: true }, "Daily Spend"), /* @__PURE__ */ import_react4.default.createElement(import_material4.Box, { height: 160, mb: 2 }, /* @__PURE__ */ import_react4.default.createElement(import_recharts2.ResponsiveContainer, { width: "100%", height: "100%" }, /* @__PURE__ */ import_react4.default.createElement(import_recharts2.AreaChart, { data: dailyData }, /* @__PURE__ */ import_react4.default.createElement(import_recharts2.CartesianGrid, { strokeDasharray: "3 3" }), /* @__PURE__ */ import_react4.default.createElement(import_recharts2.XAxis, { dataKey: "date", tick: { fontSize: 11 } }), /* @__PURE__ */ import_react4.default.createElement(import_recharts2.YAxis, { tick: { fontSize: 11 }, tickFormatter: (v) => `$${v.toFixed(2)}` }), /* @__PURE__ */ import_react4.default.createElement(import_recharts2.Tooltip, { formatter: (v) => [`$${v.toFixed(4)}`, "Spend"] }), /* @__PURE__ */ import_react4.default.createElement(import_recharts2.Area, { type: "monotone", dataKey: "spend", stroke: "#8884d8", fill: "#8884d8", fillOpacity: 0.3 })))), /* @__PURE__ */ import_react4.default.createElement(import_material4.Divider, { sx: { mb: 2 } })) : null, /* @__PURE__ */ import_react4.default.createElement(import_material4.Box, { display: "flex", alignItems: "center", gap: 1, mb: 1 }, /* @__PURE__ */ import_react4.default.createElement(import_icons_material2.Memory, { fontSize: "small", color: "action" }), /* @__PURE__ */ import_react4.default.createElement(import_material4.Typography, { variant: "subtitle2", color: "text.secondary" }, "Members")), team.members_with_roles?.length ? /* @__PURE__ */ import_react4.default.createElement(import_material4.TableContainer, null, /* @__PURE__ */ import_react4.default.createElement(import_material4.Table, { size: "small" }, /* @__PURE__ */ import_react4.default.createElement(import_material4.TableHead, null, /* @__PURE__ */ import_react4.default.createElement(import_material4.TableRow, null, /* @__PURE__ */ import_react4.default.createElement(import_material4.TableCell, null, "User"), /* @__PURE__ */ import_react4.default.createElement(import_material4.TableCell, null, "Role"))), /* @__PURE__ */ import_react4.default.createElement(import_material4.TableBody, null, team.members_with_roles.map((m) => /* @__PURE__ */ import_react4.default.createElement(import_material4.TableRow, { key: m.user_id }, /* @__PURE__ */ import_react4.default.createElement(import_material4.TableCell, { sx: { fontFamily: "monospace", fontSize: 12 } }, m.user_id), /* @__PURE__ */ import_react4.default.createElement(import_material4.TableCell, null, /* @__PURE__ */ import_react4.default.createElement(
|
|
946
992
|
import_material4.Chip,
|
|
947
993
|
{
|
|
948
994
|
label: m.role,
|
|
949
995
|
size: "small",
|
|
950
996
|
color: m.role === "admin" ? "primary" : "default"
|
|
951
997
|
}
|
|
952
|
-
)))))))
|
|
998
|
+
))))))) : /* @__PURE__ */ import_react4.default.createElement(import_material4.Typography, { variant: "body2", color: "text.secondary" }, "No members assigned."))));
|
|
953
999
|
};
|
|
954
1000
|
TeamUsage = ({
|
|
955
1001
|
teams,
|
|
@@ -1352,7 +1398,6 @@ var init_LiteLLMPage = __esm({
|
|
|
1352
1398
|
{
|
|
1353
1399
|
teams: teams ?? [],
|
|
1354
1400
|
loading: teamsLoading,
|
|
1355
|
-
dateRange,
|
|
1356
1401
|
getTeamUsage: (teamId) => {
|
|
1357
1402
|
if (teamUsageCache[teamId] === void 0) loadTeamUsage(teamId);
|
|
1358
1403
|
return teamUsageCache[teamId] ?? null;
|
|
@@ -1429,8 +1474,7 @@ var import_material7 = require("@mui/material");
|
|
|
1429
1474
|
var import_recharts3 = require("recharts");
|
|
1430
1475
|
var import_core_plugin_api3 = require("@backstage/core-plugin-api");
|
|
1431
1476
|
init_api();
|
|
1432
|
-
|
|
1433
|
-
var fmtInt2 = (n) => (n ?? 0).toLocaleString();
|
|
1477
|
+
init_format();
|
|
1434
1478
|
function presetToDateRange(preset) {
|
|
1435
1479
|
const end = /* @__PURE__ */ new Date();
|
|
1436
1480
|
const start = /* @__PURE__ */ new Date();
|
|
@@ -1492,7 +1536,7 @@ var LiteLLMHomeWidget = ({
|
|
|
1492
1536
|
/* @__PURE__ */ import_react8.default.createElement(import_material7.MenuItem, { value: "today" }, "Today"),
|
|
1493
1537
|
/* @__PURE__ */ import_react8.default.createElement(import_material7.MenuItem, { value: "7d" }, "7d"),
|
|
1494
1538
|
/* @__PURE__ */ import_react8.default.createElement(import_material7.MenuItem, { value: "30d" }, "30d")
|
|
1495
|
-
))), loading && /* @__PURE__ */ import_react8.default.createElement(import_material7.Box, { display: "flex", justifyContent: "center", alignItems: "center", minHeight: 120 }, /* @__PURE__ */ import_react8.default.createElement(import_material7.CircularProgress, { size: 32 })), !loading && error && /* @__PURE__ */ import_react8.default.createElement(import_material7.Alert, { severity: "error", sx: { mt: 1 } }, error), !loading && !error && /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, /* @__PURE__ */ import_react8.default.createElement(import_material7.Grid, { container: true, spacing: 2, sx: { mb: hasSparkline ? 1.5 : 0 } }, /* @__PURE__ */ import_react8.default.createElement(import_material7.Grid, { item: true, xs: 6 }, /* @__PURE__ */ import_react8.default.createElement(Kpi, { label: "USD Spent", value:
|
|
1539
|
+
))), loading && /* @__PURE__ */ import_react8.default.createElement(import_material7.Box, { display: "flex", justifyContent: "center", alignItems: "center", minHeight: 120 }, /* @__PURE__ */ import_react8.default.createElement(import_material7.CircularProgress, { size: 32 })), !loading && error && /* @__PURE__ */ import_react8.default.createElement(import_material7.Alert, { severity: "error", sx: { mt: 1 } }, error), !loading && !error && /* @__PURE__ */ import_react8.default.createElement(import_react8.default.Fragment, null, /* @__PURE__ */ import_react8.default.createElement(import_material7.Grid, { container: true, spacing: 2, sx: { mb: hasSparkline ? 1.5 : 0 } }, /* @__PURE__ */ import_react8.default.createElement(import_material7.Grid, { item: true, xs: 6 }, /* @__PURE__ */ import_react8.default.createElement(Kpi, { label: "USD Spent", value: fmtUsd(usage?.total_spend ?? 0) })), /* @__PURE__ */ import_react8.default.createElement(import_material7.Grid, { item: true, xs: 6 }, /* @__PURE__ */ import_react8.default.createElement(Kpi, { label: "Tokens In", value: fmtInt(usage?.prompt_tokens ?? 0) })), /* @__PURE__ */ import_react8.default.createElement(import_material7.Grid, { item: true, xs: 6 }, /* @__PURE__ */ import_react8.default.createElement(Kpi, { label: "Tokens Out", value: fmtInt(usage?.completion_tokens ?? 0) })), /* @__PURE__ */ import_react8.default.createElement(import_material7.Grid, { item: true, xs: 6 }, /* @__PURE__ */ import_react8.default.createElement(Kpi, { label: "Keys", value: fmtInt(keys.length) }))), hasSparkline && /* @__PURE__ */ import_react8.default.createElement(import_material7.Box, { height: 120 }, /* @__PURE__ */ import_react8.default.createElement(import_recharts3.ResponsiveContainer, { width: "100%", height: "100%" }, /* @__PURE__ */ import_react8.default.createElement(import_recharts3.AreaChart, { data: dailyData, margin: { top: 4, right: 0, bottom: 0, left: 0 } }, /* @__PURE__ */ import_react8.default.createElement(
|
|
1496
1540
|
import_recharts3.Area,
|
|
1497
1541
|
{
|
|
1498
1542
|
type: "monotone",
|