This is an automated email from the ASF dual-hosted git repository.
hsluoyz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/casbin-gateway.git
The following commit(s) were added to refs/heads/master by this push:
new 6a579c7 refactor: replace echarts with the shadcn chart component in
web2
6a579c7 is described below
commit 6a579c7015e9ff1337449dad7569d41f65b9aee0
Author: Yang Luo <[email protected]>
AuthorDate: Tue Aug 18 21:50:07 2026 +0800
refactor: replace echarts with the shadcn chart component in web2
---
web2/package.json | 3 +-
web2/src/App.tsx | 5 +-
web2/src/components/charts/ChartCards.tsx | 120 +++++++----
web2/src/components/ui/chart.tsx | 325 ++++++++++++++++++++++++++++++
web2/src/index.css | 12 ++
web2/src/locales/en/data.json | 1 +
web2/src/locales/zh/data.json | 1 +
web2/tailwind.config.js | 7 +
web2/yarn.lock | 266 ++++++++++++++++++++----
9 files changed, 662 insertions(+), 78 deletions(-)
diff --git a/web2/package.json b/web2/package.json
index 43c9e75..fbe6c52 100644
--- a/web2/package.json
+++ b/web2/package.json
@@ -28,8 +28,6 @@
"clsx": "^2.1.1",
"cmdk": "^1.1.1",
"copy-to-clipboard": "^3.3.3",
- "echarts": "^5.5.0",
- "echarts-for-react": "^3.0.2",
"file-saver": "^2.0.5",
"i18next": "^23.16.8",
"lucide-react": "^0.475.0",
@@ -37,6 +35,7 @@
"react-dom": "^18.3.1",
"react-i18next": "^15.4.0",
"react-router-dom": "^6.30.0",
+ "recharts": "^2.15.0",
"sonner": "^2.0.1",
"tailwind-merge": "^2.6.0",
"tailwindcss-animate": "^1.0.7"
diff --git a/web2/src/App.tsx b/web2/src/App.tsx
index a8afc8e..6fea73d 100644
--- a/web2/src/App.tsx
+++ b/web2/src/App.tsx
@@ -43,8 +43,9 @@ import SiteEditPage from "@/pages/SiteEditPage";
import SiteListPage from "@/pages/SiteListPage";
import type {Account} from "@/types";
-// The dashboard is the only page that draws charts, and echarts is by far the
-// largest dependency here, so it is fetched only when that page is opened.
+// The dashboard is the only page that draws charts, and the charting runtime
is
+// by far the largest dependency here, so it is fetched only when that page is
+// opened.
const DashboardPage = React.lazy(() => import("@/pages/DashboardPage"));
Setting.initCasdoorSdk(Conf.AuthConfig);
diff --git a/web2/src/components/charts/ChartCards.tsx
b/web2/src/components/charts/ChartCards.tsx
index 287a52b..04e5107 100644
--- a/web2/src/components/charts/ChartCards.tsx
+++ b/web2/src/components/charts/ChartCards.tsx
@@ -12,32 +12,40 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-import ReactECharts from "echarts-for-react";
+import * as React from "react";
import i18next from "i18next";
+import {Bar, BarChart, CartesianGrid, Cell, Pie, PieChart, XAxis, YAxis} from
"recharts";
import {Card, CardContent, CardHeader, CardTitle} from "@/components/ui/card";
+import {
+ ChartContainer,
+ ChartLegend,
+ ChartLegendContent,
+ ChartTooltip,
+ ChartTooltipContent,
+ type ChartConfig,
+} from "@/components/ui/chart";
import type {MetricPoint} from "@/types";
+// The five categorical slots defined in index.css, used in this fixed order
and
+// never cycled: anything past the fifth slice folds into "Other".
+const SERIES_COLORS = [
+ "hsl(var(--chart-1))",
+ "hsl(var(--chart-2))",
+ "hsl(var(--chart-3))",
+ "hsl(var(--chart-4))",
+ "hsl(var(--chart-5))",
+];
+const OTHER_COLOR = "hsl(var(--muted-foreground))";
+
export function BarChartCard({title, data}: {title: string; data:
MetricPoint[] | null}) {
const points = data ?? [];
- const option = {
- tooltip: {trigger: "axis", axisPointer: {type: "shadow"}},
- grid: {left: "3%", right: "4%", bottom: "3%", containLabel: true},
- xAxis: {
- type: "category",
- data: points.map(item => item.data),
- axisTick: {alignWithLabel: true},
+ const config = {
+ count: {
+ label: i18next.t("general:Count"),
+ color: "hsl(var(--chart-1))",
},
- yAxis: {type: "value"},
- series: [
- {
- name: title,
- type: "bar",
- barWidth: "60%",
- data: points.map(item => item.count),
- },
- ],
- };
+ } satisfies ChartConfig;
return (
<Card className="h-full">
@@ -45,7 +53,21 @@ export function BarChartCard({title, data}: {title: string;
data: MetricPoint[]
<CardTitle
className="text-sm">{i18next.t(`general:${title}`)}</CardTitle>
</CardHeader>
<CardContent className="p-2">
- <ReactECharts option={option} style={{height: 300}} />
+ <ChartContainer config={config} className="aspect-auto h-[300px]
w-full">
+ <BarChart accessibilityLayer data={points} margin={{top: 8, right:
8, left: 0}}>
+ <CartesianGrid vertical={false} />
+ <XAxis
+ dataKey="data"
+ tickLine={false}
+ axisLine={false}
+ tickMargin={8}
+ minTickGap={16}
+ />
+ <YAxis tickLine={false} axisLine={false} tickMargin={8} width={48}
/>
+ <ChartTooltip cursor={false} content={<ChartTooltipContent />} />
+ <Bar dataKey="count" fill="var(--color-count)" radius={[4, 4, 0,
0]} maxBarSize={48} />
+ </BarChart>
+ </ChartContainer>
</CardContent>
</Card>
);
@@ -58,23 +80,31 @@ export function PieChartCard({
title: string;
data: {name: string; value: number}[] | null;
}) {
- const option = {
- tooltip: {trigger: "item"},
- legend: {top: "5%", left: "right", orient: "vertical"},
- series: [
- {
- name: title,
- type: "pie",
- radius: ["40%", "70%"],
- avoidLabelOverlap: false,
- itemStyle: {borderRadius: 10, borderColor: "#fff", borderWidth: 2},
- label: {show: false, position: "center"},
- emphasis: {label: {show: true, fontSize: 24, fontWeight: "bold"}},
- labelLine: {show: false},
- data: data ?? [],
- },
- ],
- };
+ // Rank the slices, keep the five that get their own color, and sum the tail
+ // into a single neutral "Other" slice so no color is ever reused.
+ const {slices, config} = React.useMemo(() => {
+ const sorted = [...(data ?? [])].sort((a, b) => b.value - a.value);
+ const head = sorted.slice(0, SERIES_COLORS.length).map((item, index) => ({
+ ...item,
+ fill: SERIES_COLORS[index],
+ }));
+ const tail = sorted.slice(SERIES_COLORS.length);
+
+ if (tail.length > 0) {
+ head.push({
+ name: i18next.t("general:Other"),
+ value: tail.reduce((sum, item) => sum + item.value, 0),
+ fill: OTHER_COLOR,
+ });
+ }
+
+ const chartConfig: ChartConfig = {};
+ head.forEach(item => {
+ chartConfig[item.name] = {label: item.name};
+ });
+
+ return {slices: head, config: chartConfig};
+ }, [data]);
return (
<Card className="h-full">
@@ -82,7 +112,23 @@ export function PieChartCard({
<CardTitle
className="text-sm">{i18next.t(`general:${title}`)}</CardTitle>
</CardHeader>
<CardContent className="p-2">
- <ReactECharts option={option} style={{height: 300}} />
+ <ChartContainer config={config} className="aspect-auto h-[300px]
w-full">
+ <PieChart>
+ <ChartTooltip content={<ChartTooltipContent nameKey="name"
hideLabel />} />
+ <Pie data={slices} dataKey="value" nameKey="name"
innerRadius="45%" outerRadius="70%">
+ {slices.map(item => (
+ // A 2px surface-colored ring keeps neighbouring slices apart.
+ <Cell
+ key={item.name}
+ fill={item.fill}
+ stroke="hsl(var(--card))"
+ strokeWidth={2}
+ />
+ ))}
+ </Pie>
+ <ChartLegend content={<ChartLegendContent nameKey="name"
className="flex-wrap" />} />
+ </PieChart>
+ </ChartContainer>
</CardContent>
</Card>
);
diff --git a/web2/src/components/ui/chart.tsx b/web2/src/components/ui/chart.tsx
new file mode 100644
index 0000000..6a1118f
--- /dev/null
+++ b/web2/src/components/ui/chart.tsx
@@ -0,0 +1,325 @@
+import * as React from "react";
+import * as RechartsPrimitive from "recharts";
+
+import {cn} from "@/lib/utils";
+
+// Format: {THEME_NAME: CSS_SELECTOR}
+const THEMES = {light: "", dark: ".dark"} as const;
+
+export type ChartConfig = {
+ [k in string]: {
+ label?: React.ReactNode;
+ icon?: React.ComponentType;
+ } & (
+ | {color?: string; theme?: never}
+ | {color?: never; theme: Record<keyof typeof THEMES, string>}
+ );
+};
+
+type ChartContextProps = {
+ config: ChartConfig;
+};
+
+const ChartContext = React.createContext<ChartContextProps | null>(null);
+
+function useChart() {
+ const context = React.useContext(ChartContext);
+
+ if (!context) {
+ throw new Error("useChart must be used within a <ChartContainer />");
+ }
+
+ return context;
+}
+
+const ChartContainer = React.forwardRef<
+ HTMLDivElement,
+ React.ComponentProps<"div"> & {
+ config: ChartConfig;
+ children: React.ComponentProps<typeof
RechartsPrimitive.ResponsiveContainer>["children"];
+ }
+>(({id, className, children, config, ...props}, ref) => {
+ const uniqueId = React.useId();
+ const chartId = `chart-${id || uniqueId.replace(/:/g, "")}`;
+
+ return (
+ <ChartContext.Provider value={{config}}>
+ <div
+ data-chart={chartId}
+ ref={ref}
+ className={cn(
+ "flex aspect-video justify-center text-xs
[&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground
[&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50
[&_.recharts-curve.recharts-tooltip-cursor]:stroke-border
[&_.recharts-dot[stroke='#fff']]:stroke-transparent
[&_.recharts-layer]:outline-none
[&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border
[&_.recharts-radial-bar-background-sector]:fill-muted
[&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [& [...]
+ className,
+ )}
+ {...props}
+ >
+ <ChartStyle id={chartId} config={config} />
+
<RechartsPrimitive.ResponsiveContainer>{children}</RechartsPrimitive.ResponsiveContainer>
+ </div>
+ </ChartContext.Provider>
+ );
+});
+ChartContainer.displayName = "Chart";
+
+const ChartStyle = ({id, config}: {id: string; config: ChartConfig}) => {
+ const colorConfig = Object.entries(config).filter(([, item]) => item.theme
|| item.color);
+
+ if (!colorConfig.length) {
+ return null;
+ }
+
+ return (
+ <style
+ dangerouslySetInnerHTML={{
+ __html: Object.entries(THEMES)
+ .map(
+ ([theme, prefix]) => `
+${prefix} [data-chart=${id}] {
+${colorConfig
+ .map(([key, itemConfig]) => {
+ const color = itemConfig.theme?.[theme as keyof typeof
itemConfig.theme] || itemConfig.color;
+ return color ? ` --color-${key}: ${color};` : null;
+ })
+ .join("\n")}
+}
+`,
+ )
+ .join("\n"),
+ }}
+ />
+ );
+};
+
+const ChartTooltip = RechartsPrimitive.Tooltip;
+
+const ChartTooltipContent = React.forwardRef<
+ HTMLDivElement,
+ React.ComponentProps<typeof RechartsPrimitive.Tooltip> &
+ React.ComponentProps<"div"> & {
+ hideLabel?: boolean;
+ hideIndicator?: boolean;
+ indicator?: "line" | "dot" | "dashed";
+ nameKey?: string;
+ labelKey?: string;
+ }
+>(
+ (
+ {
+ active,
+ payload,
+ className,
+ indicator = "dot",
+ hideLabel = false,
+ hideIndicator = false,
+ label,
+ labelFormatter,
+ labelClassName,
+ formatter,
+ color,
+ nameKey,
+ labelKey,
+ },
+ ref,
+ ) => {
+ const {config} = useChart();
+
+ const tooltipLabel = React.useMemo(() => {
+ if (hideLabel || !payload?.length) {
+ return null;
+ }
+
+ const [item] = payload;
+ const key = `${labelKey || item.dataKey || item.name || "value"}`;
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
+ const value =
+ !labelKey && typeof label === "string"
+ ? config[label as keyof typeof config]?.label || label
+ : itemConfig?.label;
+
+ if (labelFormatter) {
+ return (
+ <div className={cn("font-medium", labelClassName)}>
+ {labelFormatter(value, payload)}
+ </div>
+ );
+ }
+
+ if (!value) {
+ return null;
+ }
+
+ return <div className={cn("font-medium", labelClassName)}>{value}</div>;
+ }, [label, labelFormatter, payload, hideLabel, labelClassName, config,
labelKey]);
+
+ if (!active || !payload?.length) {
+ return null;
+ }
+
+ const nestLabel = payload.length === 1 && indicator !== "dot";
+
+ return (
+ <div
+ ref={ref}
+ className={cn(
+ "grid min-w-[8rem] items-start gap-1.5 rounded-lg border
border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl",
+ className,
+ )}
+ >
+ {!nestLabel ? tooltipLabel : null}
+ <div className="grid gap-1.5">
+ {payload.map((item, index) => {
+ const key = `${nameKey || item.name || item.dataKey || "value"}`;
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
+ const indicatorColor = color || item.payload?.fill || item.color;
+
+ return (
+ <div
+ key={item.dataKey}
+ className={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",
+ )}
+ >
+ {formatter && item?.value !== undefined && item.name ? (
+ formatter(item.value, item.name, item, index, item.payload)
+ ) : (
+ <>
+ {itemConfig?.icon ? (
+ <itemConfig.icon />
+ ) : (
+ !hideIndicator && (
+ <div
+ className={cn(
+ "shrink-0 rounded-[2px] border-[--color-border]
bg-[--color-bg]",
+ {
+ "h-2.5 w-2.5": indicator === "dot",
+ "w-1": indicator === "line",
+ "w-0 border-[1.5px] border-dashed
bg-transparent":
+ indicator === "dashed",
+ "my-0.5": nestLabel && indicator === "dashed",
+ },
+ )}
+ style={
+ {
+ "--color-bg": indicatorColor,
+ "--color-border": indicatorColor,
+ } as React.CSSProperties
+ }
+ />
+ )
+ )}
+ <div
+ className={cn(
+ "flex flex-1 justify-between leading-none",
+ nestLabel ? "items-end" : "items-center",
+ )}
+ >
+ <div className="grid gap-1.5">
+ {nestLabel ? tooltipLabel : null}
+ <span className="text-muted-foreground">
+ {itemConfig?.label || item.name}
+ </span>
+ </div>
+ {item.value !== undefined && (
+ <span className="ml-2 font-mono font-medium
tabular-nums text-foreground">
+ {item.value.toLocaleString()}
+ </span>
+ )}
+ </div>
+ </>
+ )}
+ </div>
+ );
+ })}
+ </div>
+ </div>
+ );
+ },
+);
+ChartTooltipContent.displayName = "ChartTooltip";
+
+const ChartLegend = RechartsPrimitive.Legend;
+
+const ChartLegendContent = React.forwardRef<
+ HTMLDivElement,
+ React.ComponentProps<"div"> &
+ Pick<RechartsPrimitive.LegendProps, "payload" | "verticalAlign"> & {
+ hideIcon?: boolean;
+ nameKey?: string;
+ }
+>(({className, hideIcon = false, payload, verticalAlign = "bottom", nameKey},
ref) => {
+ const {config} = useChart();
+
+ if (!payload?.length) {
+ return null;
+ }
+
+ return (
+ <div
+ ref={ref}
+ className={cn(
+ "flex items-center justify-center gap-4",
+ verticalAlign === "top" ? "pb-3" : "pt-3",
+ className,
+ )}
+ >
+ {payload.map(item => {
+ const key = `${nameKey || item.dataKey || "value"}`;
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
+
+ return (
+ <div
+ key={item.value}
+ className={cn("flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3
[&>svg]:text-muted-foreground")}
+ >
+ {itemConfig?.icon && !hideIcon ? (
+ <itemConfig.icon />
+ ) : (
+ <div
+ className="h-2 w-2 shrink-0 rounded-[2px]"
+ style={{backgroundColor: item.color}}
+ />
+ )}
+ {itemConfig?.label}
+ </div>
+ );
+ })}
+ </div>
+ );
+});
+ChartLegendContent.displayName = "ChartLegend";
+
+// Helper to extract item config from a payload.
+function getPayloadConfigFromPayload(config: ChartConfig, payload: unknown,
key: string) {
+ if (typeof payload !== "object" || payload === null) {
+ return undefined;
+ }
+
+ const payloadPayload =
+ "payload" in payload && typeof payload.payload === "object" &&
payload.payload !== null
+ ? payload.payload
+ : undefined;
+
+ let configLabelKey: string = key;
+
+ if (key in payload && typeof payload[key as keyof typeof payload] ===
"string") {
+ configLabelKey = payload[key as keyof typeof payload] as string;
+ } else if (
+ payloadPayload &&
+ key in payloadPayload &&
+ typeof payloadPayload[key as keyof typeof payloadPayload] === "string"
+ ) {
+ configLabelKey = payloadPayload[key as keyof typeof payloadPayload] as
string;
+ }
+
+ return configLabelKey in config ? config[configLabelKey] : config[key as
keyof typeof config];
+}
+
+export {
+ ChartContainer,
+ ChartTooltip,
+ ChartTooltipContent,
+ ChartLegend,
+ ChartLegendContent,
+ ChartStyle,
+};
diff --git a/web2/src/index.css b/web2/src/index.css
index ed79f03..f611bc3 100644
--- a/web2/src/index.css
+++ b/web2/src/index.css
@@ -28,6 +28,13 @@
--border: 214.3 31.8% 91.4%;
--input: 214.3 31.8% 91.4%;
--ring: 255 60% 52%;
+ /* Categorical series colors, assigned in slot order and never cycled.
+ Validated for colorblind separation against both surfaces. */
+ --chart-1: 212.8 67.7% 50.2%;
+ --chart-2: 17 82.1% 56.3%;
+ --chart-3: 158.5 73.3% 39.6%;
+ --chart-4: 40.8 100% 46.5%;
+ --chart-5: 337.4 70.3% 69.6%;
--radius: 0.5rem;
}
@@ -55,6 +62,11 @@
--border: 217.2 32.6% 17.5%;
--input: 217.2 32.6% 17.5%;
--ring: 255 70% 68%;
+ --chart-1: 212.8 76.8% 56.1%;
+ --chart-2: 17.1 70.2% 50%;
+ --chart-3: 159.2 72.7% 35.9%;
+ --chart-4: 39.7 100% 39.4%;
+ --chart-5: 338.2 61.1% 57.6%;
}
}
diff --git a/web2/src/locales/en/data.json b/web2/src/locales/en/data.json
index 964cf48..cd69f4b 100644
--- a/web2/src/locales/en/data.json
+++ b/web2/src/locales/en/data.json
@@ -146,6 +146,7 @@
"No Upgrade": "No Upgrade",
"Nodes": "Nodes",
"OK": "OK",
+ "Other": "Other",
"Owner": "Owner",
"Password": "Password",
"Path": "Path",
diff --git a/web2/src/locales/zh/data.json b/web2/src/locales/zh/data.json
index 44a7ef1..43fd987 100644
--- a/web2/src/locales/zh/data.json
+++ b/web2/src/locales/zh/data.json
@@ -146,6 +146,7 @@
"No Upgrade": "No Upgrade",
"Nodes": "Nodes",
"OK": "确定",
+ "Other": "其他",
"Owner": "所有者",
"Password": "密码",
"Path": "路径",
diff --git a/web2/tailwind.config.js b/web2/tailwind.config.js
index 87bd7b1..c0c6e30 100644
--- a/web2/tailwind.config.js
+++ b/web2/tailwind.config.js
@@ -51,6 +51,13 @@ export default {
DEFAULT: "hsl(var(--warning))",
foreground: "hsl(var(--warning-foreground))",
},
+ chart: {
+ 1: "hsl(var(--chart-1))",
+ 2: "hsl(var(--chart-2))",
+ 3: "hsl(var(--chart-3))",
+ 4: "hsl(var(--chart-4))",
+ 5: "hsl(var(--chart-5))",
+ },
},
borderRadius: {
lg: "var(--radius)",
diff --git a/web2/yarn.lock b/web2/yarn.lock
index 2dbf19d..be38646 100644
--- a/web2/yarn.lock
+++ b/web2/yarn.lock
@@ -135,7 +135,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.29.7"
-"@babel/runtime@^7.23.2", "@babel/runtime@^7.27.6":
+"@babel/runtime@^7.23.2", "@babel/runtime@^7.27.6", "@babel/runtime@^7.5.5",
"@babel/runtime@^7.8.7":
version "7.29.7"
resolved
"https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.7.tgz#12022450c45a4da6d8d8287b18a4ff2ddb23f768"
integrity
sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==
@@ -979,6 +979,57 @@
dependencies:
"@babel/types" "^7.28.2"
+"@types/d3-array@^3.0.3":
+ version "3.2.2"
+ resolved
"https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.2.tgz#e02151464d02d4a1b44646d0fcdb93faf88fde8c"
+ integrity
sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==
+
+"@types/d3-color@*":
+ version "3.1.3"
+ resolved
"https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2"
+ integrity
sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==
+
+"@types/d3-ease@^3.0.0":
+ version "3.0.2"
+ resolved
"https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.2.tgz#e28db1bfbfa617076f7770dd1d9a48eaa3b6c51b"
+ integrity
sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==
+
+"@types/d3-interpolate@^3.0.1":
+ version "3.0.4"
+ resolved
"https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz#412b90e84870285f2ff8a846c6eb60344f12a41c"
+ integrity
sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==
+ dependencies:
+ "@types/d3-color" "*"
+
+"@types/d3-path@*":
+ version "3.1.1"
+ resolved
"https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.1.tgz#f632b380c3aca1dba8e34aa049bcd6a4af23df8a"
+ integrity
sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==
+
+"@types/d3-scale@^4.0.2":
+ version "4.0.9"
+ resolved
"https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.9.tgz#57a2f707242e6fe1de81ad7bfcccaaf606179afb"
+ integrity
sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==
+ dependencies:
+ "@types/d3-time" "*"
+
+"@types/d3-shape@^3.1.0":
+ version "3.1.8"
+ resolved
"https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.8.tgz#d1516cc508753be06852cd06758e3bb54a22b0e3"
+ integrity
sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==
+ dependencies:
+ "@types/d3-path" "*"
+
+"@types/d3-time@*", "@types/d3-time@^3.0.0":
+ version "3.0.4"
+ resolved
"https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.4.tgz#8472feecd639691450dd8000eb33edd444e1323f"
+ integrity
sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==
+
+"@types/d3-timer@^3.0.0":
+ version "3.0.2"
+ resolved
"https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.2.tgz#70bbda77dc23aa727413e22e214afa3f0e852f70"
+ integrity
sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==
+
"@types/[email protected]":
version "1.0.9"
resolved
"https://registry.yarnpkg.com/@types/estree/-/estree-1.0.9.tgz#cf3f0e876d7bee15a93ab925b82bf570a3904a24"
@@ -1404,7 +1455,7 @@ class-variance-authority@^0.7.1:
dependencies:
clsx "^2.1.1"
-clsx@^2.1.1:
+clsx@^2.0.0, clsx@^2.1.1:
version "2.1.1"
resolved
"https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999"
integrity
sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==
@@ -1467,11 +1518,82 @@ cssesc@^3.0.0:
resolved
"https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
integrity
sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
-csstype@^3.2.2:
+csstype@^3.0.2, csstype@^3.2.2:
version "3.2.3"
resolved
"https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a"
integrity
sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==
+"d3-array@2 - 3", "[email protected] - 3", d3-array@^3.1.6:
+ version "3.2.4"
+ resolved
"https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5"
+ integrity
sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==
+ dependencies:
+ internmap "1 - 2"
+
+"d3-color@1 - 3":
+ version "3.1.0"
+ resolved
"https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2"
+ integrity
sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==
+
+d3-ease@^3.0.1:
+ version "3.0.1"
+ resolved
"https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4"
+ integrity
sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==
+
+"d3-format@1 - 3":
+ version "3.1.2"
+ resolved
"https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.2.tgz#01fdb46b58beb1f55b10b42ad70b6e344d5eb2ae"
+ integrity
sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==
+
+"[email protected] - 3", d3-interpolate@^3.0.1:
+ version "3.0.1"
+ resolved
"https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d"
+ integrity
sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==
+ dependencies:
+ d3-color "1 - 3"
+
+d3-path@^3.1.0:
+ version "3.1.0"
+ resolved
"https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526"
+ integrity
sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==
+
+d3-scale@^4.0.2:
+ version "4.0.2"
+ resolved
"https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396"
+ integrity
sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==
+ dependencies:
+ d3-array "2.10.0 - 3"
+ d3-format "1 - 3"
+ d3-interpolate "1.2.0 - 3"
+ d3-time "2.1.1 - 3"
+ d3-time-format "2 - 4"
+
+d3-shape@^3.1.0:
+ version "3.2.0"
+ resolved
"https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5"
+ integrity
sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==
+ dependencies:
+ d3-path "^3.1.0"
+
+"d3-time-format@2 - 4":
+ version "4.1.0"
+ resolved
"https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a"
+ integrity
sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==
+ dependencies:
+ d3-time "1 - 3"
+
+"d3-time@1 - 3", "[email protected] - 3", d3-time@^3.0.0:
+ version "3.1.0"
+ resolved
"https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7"
+ integrity
sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==
+ dependencies:
+ d3-array "2 - 3"
+
+d3-timer@^3.0.1:
+ version "3.0.1"
+ resolved
"https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0"
+ integrity
sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==
+
data-view-buffer@^1.0.2:
version "1.0.2"
resolved
"https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570"
@@ -1506,6 +1628,11 @@ debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
dependencies:
ms "^2.1.3"
+decimal.js-light@^2.4.1:
+ version "2.5.1"
+ resolved
"https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934"
+ integrity
sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==
+
deep-is@^0.1.3:
version "0.1.4"
resolved
"https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
@@ -1565,6 +1692,14 @@ doctrine@^3.0.0:
dependencies:
esutils "^2.0.2"
+dom-helpers@^5.0.1:
+ version "5.2.1"
+ resolved
"https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902"
+ integrity
sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==
+ dependencies:
+ "@babel/runtime" "^7.8.7"
+ csstype "^3.0.2"
+
dunder-proto@^1.0.0, dunder-proto@^1.0.1:
version "1.0.1"
resolved
"https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a"
@@ -1574,22 +1709,6 @@ dunder-proto@^1.0.0, dunder-proto@^1.0.1:
es-errors "^1.3.0"
gopd "^1.2.0"
-echarts-for-react@^3.0.2:
- version "3.0.6"
- resolved
"https://registry.yarnpkg.com/echarts-for-react/-/echarts-for-react-3.0.6.tgz#267908f53854856833dc39088d2a97ab4bbfad86"
- integrity
sha512-4zqLgTGWS3JvkQDXjzkR1k1CHRdpd6by0988TWMJgnvDytegWLbeP/VNZmMa+0VJx2eD7Y632bi2JquXDgiGJg==
- dependencies:
- fast-deep-equal "^3.1.3"
- size-sensor "^1.0.1"
-
-echarts@^5.5.0:
- version "5.6.0"
- resolved
"https://registry.yarnpkg.com/echarts/-/echarts-5.6.0.tgz#2377874dca9fb50f104051c3553544752da3c9d6"
- integrity
sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==
- dependencies:
- tslib "2.3.0"
- zrender "5.6.1"
-
electron-to-chromium@^1.5.402:
version "1.5.409"
resolved
"https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.409.tgz#3d514dd82b2d181d8ade96c53242f4b8c94ab4ed"
@@ -1894,11 +2013,21 @@ esutils@^2.0.2:
resolved
"https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity
sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+eventemitter3@^4.0.1:
+ version "4.0.7"
+ resolved
"https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
+ integrity
sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
+
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved
"https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity
sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+fast-equals@^5.0.1:
+ version "5.4.1"
+ resolved
"https://registry.yarnpkg.com/fast-equals/-/fast-equals-5.4.1.tgz#a9174b03eece5307dbd675be6d6d42f7fa1d00ed"
+ integrity
sha512-DjlFSM5Pk9cGcL0q5QXl66eGzx0N6szNgaswwc5ZphlBohjTVJSnGgI+rJVOgOi65qUoQnDZN4nDqi33udtydQ==
+
fast-glob@^3.2.9, fast-glob@^3.3.2:
version "3.3.3"
resolved
"https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818"
@@ -2228,6 +2357,11 @@ internal-slot@^1.1.0:
hasown "^2.0.2"
side-channel "^1.1.0"
+"internmap@1 - 2":
+ version "2.0.3"
+ resolved
"https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009"
+ integrity
sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==
+
is-array-buffer@^3.0.4, is-array-buffer@^3.0.5:
version "3.0.5"
resolved
"https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280"
@@ -2541,6 +2675,11 @@ lodash.merge@^4.6.2:
resolved
"https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity
sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+lodash@^4.17.21:
+ version "4.18.1"
+ resolved
"https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c"
+ integrity
sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==
+
loose-envify@^1.1.0, loose-envify@^1.4.0:
version "1.4.0"
resolved
"https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
@@ -2860,7 +2999,7 @@ prelude-ls@^1.2.1:
resolved
"https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity
sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
-prop-types@^15.8.1:
+prop-types@^15.6.2, prop-types@^15.8.1:
version "15.8.1"
resolved
"https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
integrity
sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
@@ -2900,6 +3039,11 @@ react-is@^16.13.1:
resolved
"https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity
sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+react-is@^18.3.1:
+ version "18.3.1"
+ resolved
"https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e"
+ integrity
sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
+
react-refresh@^0.17.0:
version "0.17.0"
resolved
"https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.17.0.tgz#b7e579c3657f23d04eccbe4ad2e58a8ed51e7e53"
@@ -2939,6 +3083,15 @@ [email protected]:
dependencies:
"@remix-run/router" "1.23.3"
+react-smooth@^4.0.4:
+ version "4.0.4"
+ resolved
"https://registry.yarnpkg.com/react-smooth/-/react-smooth-4.0.4.tgz#a5875f8bb61963ca61b819cedc569dc2453894b4"
+ integrity
sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==
+ dependencies:
+ fast-equals "^5.0.1"
+ prop-types "^15.8.1"
+ react-transition-group "^4.4.5"
+
react-style-singleton@^2.2.2, react-style-singleton@^2.2.3:
version "2.2.3"
resolved
"https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.3.tgz#4265608be69a4d70cfe3047f2c6c88b2c3ace388"
@@ -2947,6 +3100,16 @@ react-style-singleton@^2.2.2,
react-style-singleton@^2.2.3:
get-nonce "^1.0.0"
tslib "^2.0.0"
+react-transition-group@^4.4.5:
+ version "4.4.5"
+ resolved
"https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1"
+ integrity
sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
+ dependencies:
+ "@babel/runtime" "^7.5.5"
+ dom-helpers "^5.0.1"
+ loose-envify "^1.4.0"
+ prop-types "^15.6.2"
+
react@^18.3.1:
version "18.3.1"
resolved
"https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891"
@@ -2968,6 +3131,27 @@ readdirp@~3.6.0:
dependencies:
picomatch "^2.2.1"
+recharts-scale@^0.4.4:
+ version "0.4.5"
+ resolved
"https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.4.5.tgz#0969271f14e732e642fcc5bd4ab270d6e87dd1d9"
+ integrity
sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==
+ dependencies:
+ decimal.js-light "^2.4.1"
+
+recharts@^2.15.0:
+ version "2.15.4"
+ resolved
"https://registry.yarnpkg.com/recharts/-/recharts-2.15.4.tgz#0ed3e66c0843bcf2d9f9a172caf97b1d05127a5f"
+ integrity
sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==
+ dependencies:
+ clsx "^2.0.0"
+ eventemitter3 "^4.0.1"
+ lodash "^4.17.21"
+ react-is "^18.3.1"
+ react-smooth "^4.0.4"
+ recharts-scale "^0.4.4"
+ tiny-invariant "^1.3.1"
+ victory-vendor "^36.6.8"
+
reflect.getprototypeof@^1.0.10, reflect.getprototypeof@^1.0.9:
version "1.0.10"
resolved
"https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9"
@@ -3203,11 +3387,6 @@ side-channel@^1.1.0:
side-channel-map "^1.0.1"
side-channel-weakmap "^1.0.2"
-size-sensor@^1.0.1:
- version "1.0.3"
- resolved
"https://registry.yarnpkg.com/size-sensor/-/size-sensor-1.0.3.tgz#4ce525cbc5a098da09852e38b6f851ebb9b5116a"
- integrity
sha512-+k9mJ2/rQMiRmQUcjn+qznch260leIXY8r4FyYKKyRBO/s5UoeMAHGkCJyE1R/4wrIhTJONfyloY55SkE7ve3A==
-
slash@^3.0.0:
version "3.0.0"
resolved
"https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
@@ -3385,6 +3564,11 @@ thenify-all@^1.0.0:
dependencies:
any-promise "^1.0.0"
+tiny-invariant@^1.3.1:
+ version "1.3.3"
+ resolved
"https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127"
+ integrity
sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==
+
tinyglobby@^0.2.11, tinyglobby@^0.2.13:
version "0.2.17"
resolved
"https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.17.tgz#562a9a6c9eb2b3b123d39719f9af5bb44fcd7631"
@@ -3415,11 +3599,6 @@ ts-interface-checker@^0.1.9:
resolved
"https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
integrity
sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
[email protected]:
- version "2.3.0"
- resolved
"https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e"
- integrity
sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
-
tslib@^2.0.0, tslib@^2.1.0:
version "2.8.1"
resolved
"https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
@@ -3537,6 +3716,26 @@ util-deprecate@^1.0.2:
resolved
"https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity
sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+victory-vendor@^36.6.8:
+ version "36.9.2"
+ resolved
"https://registry.yarnpkg.com/victory-vendor/-/victory-vendor-36.9.2.tgz#668b02a448fa4ea0f788dbf4228b7e64669ff801"
+ integrity
sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==
+ dependencies:
+ "@types/d3-array" "^3.0.3"
+ "@types/d3-ease" "^3.0.0"
+ "@types/d3-interpolate" "^3.0.1"
+ "@types/d3-scale" "^4.0.2"
+ "@types/d3-shape" "^3.1.0"
+ "@types/d3-time" "^3.0.0"
+ "@types/d3-timer" "^3.0.0"
+ d3-array "^3.1.6"
+ d3-ease "^3.0.1"
+ d3-interpolate "^3.0.1"
+ d3-scale "^4.0.2"
+ d3-shape "^3.1.0"
+ d3-time "^3.0.0"
+ d3-timer "^3.0.1"
+
vite@^6.2.0:
version "6.4.3"
resolved
"https://registry.yarnpkg.com/vite/-/vite-6.4.3.tgz#85a164db7ce706f2a776812efa2b340f1721858e"
@@ -3635,10 +3834,3 @@ yocto-queue@^0.1.0:
version "0.1.0"
resolved
"https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
integrity
sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
-
[email protected]:
- version "5.6.1"
- resolved
"https://registry.yarnpkg.com/zrender/-/zrender-5.6.1.tgz#e08d57ecf4acac708c4fcb7481eb201df7f10a6b"
- integrity
sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==
- dependencies:
- tslib "2.3.0"
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]