Xianbao QIAN
commited on
Commit
•
98f8d8e
1
Parent(s):
186881d
add /trend page
Browse files- package.json +4 -3
- src/pages/heatmap/index.tsx +108 -0
- src/pages/index.tsx +10 -180
- src/pages/trend/index.tsx +306 -0
- src/utils/modelData.ts +300 -0
- src/utils/providers.ts +15 -0
- yarn.lock +202 -197
package.json
CHANGED
@@ -15,14 +15,15 @@
|
|
15 |
"next": "14.2.5",
|
16 |
"react": "^18",
|
17 |
"react-activity-calendar": "^2.2.11",
|
18 |
-
"react-dom": "^18"
|
|
|
19 |
},
|
20 |
"devDependencies": {
|
21 |
-
"typescript": "^5",
|
22 |
"@types/node": "^20",
|
23 |
"@types/react": "^18",
|
24 |
"@types/react-dom": "^18",
|
25 |
"postcss": "^8",
|
26 |
-
"tailwindcss": "^3.4.1"
|
|
|
27 |
}
|
28 |
}
|
|
|
15 |
"next": "14.2.5",
|
16 |
"react": "^18",
|
17 |
"react-activity-calendar": "^2.2.11",
|
18 |
+
"react-dom": "^18",
|
19 |
+
"recharts": "^2.13.3"
|
20 |
},
|
21 |
"devDependencies": {
|
|
|
22 |
"@types/node": "^20",
|
23 |
"@types/react": "^18",
|
24 |
"@types/react-dom": "^18",
|
25 |
"postcss": "^8",
|
26 |
+
"tailwindcss": "^3.4.1",
|
27 |
+
"typescript": "^5"
|
28 |
}
|
29 |
}
|
src/pages/heatmap/index.tsx
ADDED
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React, { useState, useEffect } from 'react';
|
2 |
+
import ActivityCalendar from 'react-activity-calendar';
|
3 |
+
import { Tooltip } from '@mui/material';
|
4 |
+
import { PROVIDERS_MAP } from '../../utils/providers';
|
5 |
+
import { CalendarData, fetchAllModelData, generateCalendarData, aggregateCalendarData } from '../../utils/modelData';
|
6 |
+
|
7 |
+
interface OpenSourceHeatmapProps {
|
8 |
+
calendarData: CalendarData;
|
9 |
+
}
|
10 |
+
|
11 |
+
export const getStaticProps = async () => {
|
12 |
+
const allModels = await fetchAllModelData();
|
13 |
+
const calendarData = generateCalendarData(allModels);
|
14 |
+
|
15 |
+
return {
|
16 |
+
props: {
|
17 |
+
calendarData,
|
18 |
+
},
|
19 |
+
revalidate: 3600, // Revalidate every hour
|
20 |
+
};
|
21 |
+
};
|
22 |
+
|
23 |
+
const OpenSourceHeatmap: React.FC<OpenSourceHeatmapProps> = ({ calendarData }) => {
|
24 |
+
const [isLoading, setIsLoading] = useState(true);
|
25 |
+
const aggregatedData = aggregateCalendarData(calendarData);
|
26 |
+
|
27 |
+
useEffect(() => {
|
28 |
+
if (calendarData && Object.keys(calendarData).length > 0) {
|
29 |
+
setIsLoading(false);
|
30 |
+
}
|
31 |
+
}, [calendarData]);
|
32 |
+
|
33 |
+
return (
|
34 |
+
<div className="w-full max-w-screen-lg mx-auto p-4">
|
35 |
+
<h1 className="text-3xl lg:text-5xl mt-16 font-bold text-center mb-2">Chinese AI Open Source Heatmap 🤗</h1>
|
36 |
+
<p className="text-center text-sm mb-8">
|
37 |
+
The top AI labs and model releases from the awesome Chinese AI community.<br />
|
38 |
+
Huge thanks to Caleb for the excellent original work. <a href="https://huggingface.co/spaces/cfahlgren1/model-release-heatmap" target="_blank">Link</a> to the original repo
|
39 |
+
</p>
|
40 |
+
{isLoading ? (
|
41 |
+
<p className="text-center">Loading...</p>
|
42 |
+
) : (
|
43 |
+
<div className="space-y-8 mx-10">
|
44 |
+
{/* Total Activity Heatmap */}
|
45 |
+
<div className="flex flex-col">
|
46 |
+
<h2 className="text-2xl font-bold mb-2">Total Activity</h2>
|
47 |
+
<div className="w-full overflow-x-auto">
|
48 |
+
<div className="inline-block mx-auto">
|
49 |
+
<ActivityCalendar
|
50 |
+
data={aggregatedData}
|
51 |
+
theme={{
|
52 |
+
dark: ['#161b22', '#4CAF50'],
|
53 |
+
light: ['#e0e0e0', '#4CAF50'],
|
54 |
+
}}
|
55 |
+
hideTotalCount
|
56 |
+
renderBlock={(block, activity) => (
|
57 |
+
<Tooltip
|
58 |
+
title={`${activity.count} total models created on ${activity.date}`}
|
59 |
+
arrow
|
60 |
+
>
|
61 |
+
{block}
|
62 |
+
</Tooltip>
|
63 |
+
)}
|
64 |
+
/>
|
65 |
+
</div>
|
66 |
+
</div>
|
67 |
+
</div>
|
68 |
+
|
69 |
+
<h2 className="text-2xl font-bold mt-12 mb-6">Activity by Organization</h2>
|
70 |
+
|
71 |
+
{/* Individual Provider Heatmaps */}
|
72 |
+
{Object.entries(PROVIDERS_MAP)
|
73 |
+
.sort(([keyA], [keyB]) =>
|
74 |
+
calendarData[keyB].reduce((sum, day) => sum + day.count, 0) -
|
75 |
+
calendarData[keyA].reduce((sum, day) => sum + day.count, 0)
|
76 |
+
)
|
77 |
+
.map(([providerName, { color }]) => (
|
78 |
+
<div key={providerName} className="flex flex-col">
|
79 |
+
<h2 className="text-xl font-bold mb-2">{providerName}</h2>
|
80 |
+
<div className="w-full overflow-x-auto">
|
81 |
+
<div className="inline-block mx-auto">
|
82 |
+
<ActivityCalendar
|
83 |
+
data={calendarData[providerName]}
|
84 |
+
theme={{
|
85 |
+
dark: ['#161b22', color],
|
86 |
+
light: ['#e0e0e0', color],
|
87 |
+
}}
|
88 |
+
hideTotalCount
|
89 |
+
renderBlock={(block, activity) => (
|
90 |
+
<Tooltip
|
91 |
+
title={`${activity.count} models created on ${activity.date}`}
|
92 |
+
arrow
|
93 |
+
>
|
94 |
+
{block}
|
95 |
+
</Tooltip>
|
96 |
+
)}
|
97 |
+
/>
|
98 |
+
</div>
|
99 |
+
</div>
|
100 |
+
</div>
|
101 |
+
))}
|
102 |
+
</div>
|
103 |
+
)}
|
104 |
+
</div>
|
105 |
+
);
|
106 |
+
};
|
107 |
+
|
108 |
+
export default OpenSourceHeatmap;
|
src/pages/index.tsx
CHANGED
@@ -1,145 +1,6 @@
|
|
1 |
-
|
2 |
-
import React, { useState, useEffect } from 'react';
|
3 |
-
import ActivityCalendar from 'react-activity-calendar';
|
4 |
-
import { Tooltip } from '@mui/material';
|
5 |
-
|
6 |
-
interface ProviderInfo {
|
7 |
-
color: string;
|
8 |
-
authors: string[];
|
9 |
-
}
|
10 |
-
|
11 |
-
interface ModelData {
|
12 |
-
createdAt: string;
|
13 |
-
id: string;
|
14 |
-
}
|
15 |
-
|
16 |
-
interface Activity {
|
17 |
-
date: string;
|
18 |
-
count: number;
|
19 |
-
level: number;
|
20 |
-
}
|
21 |
-
|
22 |
-
interface CalendarData {
|
23 |
-
[key: string]: Activity[];
|
24 |
-
}
|
25 |
-
|
26 |
-
const PROVIDERS_MAP: Record<string, ProviderInfo> = {
|
27 |
-
"BAAI": { color: "#FF7000", authors: ["BAAI"] },
|
28 |
-
"DeepSeek": { color: "#1877F2", authors: ["deepseek-ai"] },
|
29 |
-
"Shanghai AI Lab": { color: "#10A37F", authors: ["internlm", "OpenGVLab", "openmmlab", "Vchitect"] },
|
30 |
-
"Alibaba": { color: "#FF6F00", authors: ["Qwen", "Alibaba-NLP", "alibaba-pai", "DAMO-NLP-SG", 'ali-vilab', 'modelscope', 'FunAudioLLM'] },
|
31 |
-
"ZhipuAI / GLM": { color: "#4285F4", authors: ["THUDM"] },
|
32 |
-
"Tencent": { color: "#1DA1F2", authors: ["TencentARC", "Tencent-Hunyuan", "h94"] },
|
33 |
-
"Yi/01": { color: "#FF4500", authors: ["01-ai"] },
|
34 |
-
"Multimodal Art Projection (m-a-p)": { color: "#5E35B1", authors: ["m-a-p"] }
|
35 |
-
};
|
36 |
-
|
37 |
-
// Generates calendar data from model data
|
38 |
-
const generateCalendarData = (modelData: ModelData[]): CalendarData => {
|
39 |
-
const data: CalendarData = Object.fromEntries(
|
40 |
-
Object.keys(PROVIDERS_MAP).map(provider => [provider, []])
|
41 |
-
);
|
42 |
-
|
43 |
-
const today = new Date();
|
44 |
-
const startDate = new Date(today);
|
45 |
-
startDate.setMonth(today.getMonth() - 11);
|
46 |
-
startDate.setDate(1);
|
47 |
-
|
48 |
-
// Create a map to store counts for each provider and date
|
49 |
-
const countMap: Record<string, Record<string, number>> = {};
|
50 |
-
|
51 |
-
modelData.forEach(item => {
|
52 |
-
console.log(item);
|
53 |
-
const dateString = item.createdAt.split('T')[0];
|
54 |
-
Object.entries(PROVIDERS_MAP).forEach(([provider, { authors }]) => {
|
55 |
-
if (authors.some(author => item.id.startsWith(author))) {
|
56 |
-
countMap[provider] = countMap[provider] || {};
|
57 |
-
countMap[provider][dateString] = (countMap[provider][dateString] || 0) + 1;
|
58 |
-
}
|
59 |
-
});
|
60 |
-
});
|
61 |
-
|
62 |
-
// Fill in with 0s for days with no activity
|
63 |
-
for (let d = new Date(startDate); d <= today; d.setDate(d.getDate() + 1)) {
|
64 |
-
const dateString = d.toISOString().split('T')[0];
|
65 |
-
Object.entries(PROVIDERS_MAP).forEach(([provider]) => {
|
66 |
-
const count = countMap[provider]?.[dateString] || 0;
|
67 |
-
data[provider].push({ date: dateString, count, level: 0 });
|
68 |
-
});
|
69 |
-
}
|
70 |
-
|
71 |
-
// Calculate average counts for each provider
|
72 |
-
const avgCounts = Object.fromEntries(
|
73 |
-
Object.entries(data).map(([provider, days]) => [
|
74 |
-
provider,
|
75 |
-
days.reduce((sum, day) => sum + day.count, 0) / days.length || 0
|
76 |
-
])
|
77 |
-
);
|
78 |
-
|
79 |
-
// Assign levels based on count relative to average
|
80 |
-
Object.entries(data).forEach(([provider, days]) => {
|
81 |
-
const avgCount = avgCounts[provider];
|
82 |
-
days.forEach(day => {
|
83 |
-
day.level =
|
84 |
-
day.count === 0 ? 0 :
|
85 |
-
day.count <= avgCount * 0.5 ? 1 :
|
86 |
-
day.count <= avgCount ? 2 :
|
87 |
-
day.count <= avgCount * 1.5 ? 3 : 4;
|
88 |
-
});
|
89 |
-
});
|
90 |
-
|
91 |
-
return data;
|
92 |
-
};
|
93 |
-
|
94 |
-
export async function getStaticProps() {
|
95 |
-
try {
|
96 |
-
const allAuthors = Object.values(PROVIDERS_MAP).flatMap(({ authors }) => authors);
|
97 |
-
const uniqueAuthors = Array.from(new Set(allAuthors));
|
98 |
-
|
99 |
-
const allModelData = await Promise.all(
|
100 |
-
uniqueAuthors.map(async (author) => {
|
101 |
-
const response = await fetch(`https://huggingface.co/api/models?author=${author}&sort=createdAt&direction=-1`);
|
102 |
-
const data = await response.json();
|
103 |
-
return data.map((item: any) => ({
|
104 |
-
createdAt: item.createdAt,
|
105 |
-
id: item.id,
|
106 |
-
}));
|
107 |
-
})
|
108 |
-
);
|
109 |
-
|
110 |
-
const flatModelData = allModelData.flat();
|
111 |
-
const calendarData = generateCalendarData(flatModelData);
|
112 |
-
|
113 |
-
return {
|
114 |
-
props: {
|
115 |
-
calendarData,
|
116 |
-
},
|
117 |
-
revalidate: 60, // Re-generate the page every hour (3600 seconds)
|
118 |
-
};
|
119 |
-
} catch (error) {
|
120 |
-
console.error("Error fetching data:", error);
|
121 |
-
return {
|
122 |
-
props: {
|
123 |
-
calendarData: {},
|
124 |
-
},
|
125 |
-
revalidate: 1,
|
126 |
-
};
|
127 |
-
}
|
128 |
-
}
|
129 |
-
|
130 |
-
interface OpenSourceHeatmapProps {
|
131 |
-
calendarData: CalendarData;
|
132 |
-
}
|
133 |
-
|
134 |
-
const OpenSourceHeatmap: React.FC<OpenSourceHeatmapProps> = ({ calendarData }) => {
|
135 |
-
const [isLoading, setIsLoading] = useState(true);
|
136 |
-
|
137 |
-
useEffect(() => {
|
138 |
-
if (calendarData && Object.keys(calendarData).length > 0) {
|
139 |
-
setIsLoading(false);
|
140 |
-
}
|
141 |
-
}, [calendarData]);
|
142 |
|
|
|
143 |
return (
|
144 |
<div className="w-full max-w-screen-lg mx-auto p-4">
|
145 |
<h1 className="text-3xl lg:text-5xl mt-16 font-bold text-center mb-2">Chinese AI Open Source Heatmap 🤗</h1>
|
@@ -147,45 +8,14 @@ const OpenSourceHeatmap: React.FC<OpenSourceHeatmapProps> = ({ calendarData }) =
|
|
147 |
The top AI labs and model releases from the awesome Chinese AI community.<br />
|
148 |
Huge thanks to Caleb for the excellent original work. <a href="https://huggingface.co/spaces/cfahlgren1/model-release-heatmap" target="_blank">Link</a> to the original repo
|
149 |
</p>
|
150 |
-
|
151 |
-
<
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
)
|
159 |
-
.map(([providerName, { color }]) => (
|
160 |
-
<div key={providerName} className="flex flex-col">
|
161 |
-
<h2 className="text-xl font-bold mb-2">{providerName}</h2>
|
162 |
-
<div className="w-full overflow-x-auto">
|
163 |
-
<div className="inline-block mx-auto">
|
164 |
-
<ActivityCalendar
|
165 |
-
data={calendarData[providerName]}
|
166 |
-
theme={{
|
167 |
-
dark: ['#161b22', color],
|
168 |
-
light: ['#e0e0e0', color],
|
169 |
-
}}
|
170 |
-
hideTotalCount
|
171 |
-
renderBlock={(block, activity) => (
|
172 |
-
<Tooltip
|
173 |
-
title={`${activity.count} models created on ${activity.date}`}
|
174 |
-
arrow
|
175 |
-
>
|
176 |
-
{block}
|
177 |
-
</Tooltip>
|
178 |
-
)}
|
179 |
-
/>
|
180 |
-
</div>
|
181 |
-
</div>
|
182 |
-
</div>
|
183 |
-
))
|
184 |
-
}
|
185 |
-
</div>
|
186 |
-
)}
|
187 |
</div>
|
188 |
);
|
189 |
}
|
190 |
-
|
191 |
-
export default OpenSourceHeatmap;
|
|
|
1 |
+
import Link from 'next/link';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
3 |
+
export default function Home() {
|
4 |
return (
|
5 |
<div className="w-full max-w-screen-lg mx-auto p-4">
|
6 |
<h1 className="text-3xl lg:text-5xl mt-16 font-bold text-center mb-2">Chinese AI Open Source Heatmap 🤗</h1>
|
|
|
8 |
The top AI labs and model releases from the awesome Chinese AI community.<br />
|
9 |
Huge thanks to Caleb for the excellent original work. <a href="https://huggingface.co/spaces/cfahlgren1/model-release-heatmap" target="_blank">Link</a> to the original repo
|
10 |
</p>
|
11 |
+
<div className="flex justify-center mt-8">
|
12 |
+
<Link
|
13 |
+
href="/heatmap"
|
14 |
+
className="text-xl text-blue-600 hover:text-blue-800 hover:underline"
|
15 |
+
>
|
16 |
+
View Heatmap
|
17 |
+
</Link>
|
18 |
+
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
</div>
|
20 |
);
|
21 |
}
|
|
|
|
src/pages/trend/index.tsx
ADDED
@@ -0,0 +1,306 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React, { useState, useEffect } from 'react';
|
2 |
+
import {
|
3 |
+
LineChart,
|
4 |
+
Line,
|
5 |
+
XAxis,
|
6 |
+
YAxis,
|
7 |
+
CartesianGrid,
|
8 |
+
Tooltip,
|
9 |
+
Legend,
|
10 |
+
ResponsiveContainer
|
11 |
+
} from 'recharts';
|
12 |
+
import { PROVIDERS_MAP } from '../../utils/providers';
|
13 |
+
import {
|
14 |
+
fetchAllModelData,
|
15 |
+
generateMonthlyData,
|
16 |
+
getTotalMonthlyData,
|
17 |
+
processDetailedModelData,
|
18 |
+
MonthlyActivity,
|
19 |
+
DetailedModelData
|
20 |
+
} from '../../utils/modelData';
|
21 |
+
|
22 |
+
interface TrendProps {
|
23 |
+
monthlyData: MonthlyActivity[];
|
24 |
+
totalData: MonthlyActivity[];
|
25 |
+
detailedData: DetailedModelData[];
|
26 |
+
error?: string;
|
27 |
+
}
|
28 |
+
|
29 |
+
const COLORS = Object.fromEntries(
|
30 |
+
Object.entries(PROVIDERS_MAP).map(([provider, { color }]) => [provider, color])
|
31 |
+
);
|
32 |
+
COLORS['Total'] = '#4CAF50';
|
33 |
+
|
34 |
+
const CustomTooltip = ({ active, payload, label }: any) => {
|
35 |
+
if (active && payload && payload.length) {
|
36 |
+
return (
|
37 |
+
<div className="bg-white p-4 border border-gray-200 rounded shadow dark:bg-gray-800 dark:border-gray-700">
|
38 |
+
<p className="text-sm font-bold mb-2 dark:text-white">{label}</p>
|
39 |
+
{payload.map((entry: any) => (
|
40 |
+
<p
|
41 |
+
key={entry.name}
|
42 |
+
className="text-sm"
|
43 |
+
style={{ color: entry.color }}
|
44 |
+
>
|
45 |
+
{entry.name}: {entry.value} models
|
46 |
+
</p>
|
47 |
+
))}
|
48 |
+
</div>
|
49 |
+
);
|
50 |
+
}
|
51 |
+
return null;
|
52 |
+
};
|
53 |
+
|
54 |
+
const formatDate = (dateStr: string) => {
|
55 |
+
const date = new Date(dateStr);
|
56 |
+
return date.toLocaleDateString('en-US', {
|
57 |
+
year: 'numeric',
|
58 |
+
month: 'short',
|
59 |
+
day: 'numeric'
|
60 |
+
});
|
61 |
+
};
|
62 |
+
|
63 |
+
const TrendPage: React.FC<TrendProps> = ({ monthlyData = [], totalData = [], detailedData = [], error }) => {
|
64 |
+
const [showTotal, setShowTotal] = useState(true);
|
65 |
+
const [selectedProviders, setSelectedProviders] = useState<string[]>([]);
|
66 |
+
const [minLikes, setMinLikes] = useState(100);
|
67 |
+
const [isLoading, setIsLoading] = useState(false);
|
68 |
+
|
69 |
+
const toggleProvider = (provider: string) => {
|
70 |
+
setSelectedProviders(prev =>
|
71 |
+
prev.includes(provider)
|
72 |
+
? prev.filter(p => p !== provider)
|
73 |
+
: [...prev, provider]
|
74 |
+
);
|
75 |
+
};
|
76 |
+
|
77 |
+
// Group data by provider
|
78 |
+
const providerData = Object.fromEntries(
|
79 |
+
Object.keys(PROVIDERS_MAP).map(provider => [
|
80 |
+
provider,
|
81 |
+
monthlyData.filter(d => d.provider === provider) || []
|
82 |
+
])
|
83 |
+
);
|
84 |
+
|
85 |
+
// Filter and group detailed model data
|
86 |
+
const filteredModels = (detailedData || [])
|
87 |
+
.filter(model => {
|
88 |
+
console.log('Filtering model:', model.name, model.likes, model.provider);
|
89 |
+
return model.likes >= minLikes &&
|
90 |
+
(selectedProviders.length === 0 || selectedProviders.includes(model.provider));
|
91 |
+
})
|
92 |
+
.reduce<Record<string, DetailedModelData[]>>((acc, model) => {
|
93 |
+
if (!acc[model.monthKey]) {
|
94 |
+
acc[model.monthKey] = [];
|
95 |
+
}
|
96 |
+
acc[model.monthKey].push(model);
|
97 |
+
return acc;
|
98 |
+
}, {});
|
99 |
+
|
100 |
+
useEffect(() => {
|
101 |
+
console.log('Current filtered models:', filteredModels);
|
102 |
+
console.log('Selected providers:', selectedProviders);
|
103 |
+
console.log('Min likes:', minLikes);
|
104 |
+
}, [filteredModels, selectedProviders, minLikes]);
|
105 |
+
|
106 |
+
if (error) {
|
107 |
+
return (
|
108 |
+
<div className="w-full max-w-screen-xl mx-auto p-4">
|
109 |
+
<h1 className="text-3xl lg:text-5xl mt-16 font-bold text-center mb-2 dark:text-white">Chinese AI Model Release Trends 📈</h1>
|
110 |
+
<div className="text-center text-red-600 dark:text-red-400 mt-8">
|
111 |
+
<p>Error loading data: {error}</p>
|
112 |
+
<p className="mt-2">Please try again later.</p>
|
113 |
+
</div>
|
114 |
+
</div>
|
115 |
+
);
|
116 |
+
}
|
117 |
+
|
118 |
+
return (
|
119 |
+
<div className="w-full max-w-screen-xl mx-auto p-4">
|
120 |
+
<h1 className="text-3xl lg:text-5xl mt-16 font-bold text-center mb-2 dark:text-white">Chinese AI Model Release Trends 📈</h1>
|
121 |
+
<p className="text-center text-sm mb-8 dark:text-gray-300">
|
122 |
+
Historical trends of model releases from Chinese AI organizations
|
123 |
+
</p>
|
124 |
+
|
125 |
+
{/* Controls */}
|
126 |
+
<div className="flex flex-wrap gap-4 mb-6 justify-center items-center">
|
127 |
+
<div className="flex gap-2">
|
128 |
+
<button
|
129 |
+
onClick={() => setShowTotal(!showTotal)}
|
130 |
+
className={`px-4 py-2 rounded transition-colors ${
|
131 |
+
showTotal
|
132 |
+
? 'bg-green-500 text-white dark:bg-green-600'
|
133 |
+
: 'bg-gray-200 dark:bg-gray-700 dark:text-gray-300'
|
134 |
+
}`}
|
135 |
+
>
|
136 |
+
Total
|
137 |
+
</button>
|
138 |
+
{Object.entries(PROVIDERS_MAP).map(([provider, { color }]) => (
|
139 |
+
<button
|
140 |
+
key={provider}
|
141 |
+
onClick={() => toggleProvider(provider)}
|
142 |
+
className={`px-4 py-2 rounded transition-colors ${
|
143 |
+
selectedProviders.includes(provider)
|
144 |
+
? 'text-white'
|
145 |
+
: 'text-gray-900 dark:text-gray-300'
|
146 |
+
}`}
|
147 |
+
style={{
|
148 |
+
backgroundColor: selectedProviders.includes(provider)
|
149 |
+
? color
|
150 |
+
: 'rgb(229, 231, 235)',
|
151 |
+
}}
|
152 |
+
>
|
153 |
+
{provider}
|
154 |
+
</button>
|
155 |
+
))}
|
156 |
+
</div>
|
157 |
+
</div>
|
158 |
+
|
159 |
+
{/* Chart */}
|
160 |
+
<div className="w-full h-[600px] dark:bg-gray-900 p-4 rounded-lg">
|
161 |
+
<ResponsiveContainer width="100%" height="100%">
|
162 |
+
<LineChart
|
163 |
+
margin={{ top: 20, right: 30, left: 20, bottom: 20 }}
|
164 |
+
>
|
165 |
+
<CartesianGrid strokeDasharray="3 3" stroke="#374151" />
|
166 |
+
<XAxis
|
167 |
+
dataKey="date"
|
168 |
+
type="category"
|
169 |
+
allowDuplicatedCategory={false}
|
170 |
+
tick={{ fontSize: 12 }}
|
171 |
+
interval="preserveStartEnd"
|
172 |
+
stroke="#9CA3AF"
|
173 |
+
/>
|
174 |
+
<YAxis stroke="#9CA3AF" />
|
175 |
+
<Tooltip content={<CustomTooltip />} />
|
176 |
+
<Legend />
|
177 |
+
|
178 |
+
{/* Total Line */}
|
179 |
+
{showTotal && (
|
180 |
+
<Line
|
181 |
+
data={totalData}
|
182 |
+
type="monotone"
|
183 |
+
dataKey="count"
|
184 |
+
stroke={COLORS['Total']}
|
185 |
+
name="Total"
|
186 |
+
strokeWidth={2}
|
187 |
+
dot={false}
|
188 |
+
/>
|
189 |
+
)}
|
190 |
+
|
191 |
+
{/* Provider Lines */}
|
192 |
+
{selectedProviders.map(provider => (
|
193 |
+
<Line
|
194 |
+
key={provider}
|
195 |
+
data={providerData[provider]}
|
196 |
+
type="monotone"
|
197 |
+
dataKey="count"
|
198 |
+
stroke={COLORS[provider]}
|
199 |
+
name={provider}
|
200 |
+
strokeWidth={1.5}
|
201 |
+
dot={false}
|
202 |
+
/>
|
203 |
+
))}
|
204 |
+
</LineChart>
|
205 |
+
</ResponsiveContainer>
|
206 |
+
</div>
|
207 |
+
|
208 |
+
{/* Major Releases Section */}
|
209 |
+
<div className="mt-12">
|
210 |
+
<div className="flex items-center justify-between mb-6">
|
211 |
+
<h2 className="text-2xl font-bold dark:text-white">
|
212 |
+
Major Releases ({Object.values(filteredModels).flat().length})
|
213 |
+
</h2>
|
214 |
+
<div className="flex items-center gap-3 bg-white dark:bg-gray-800 px-4 py-2 rounded-lg shadow-sm">
|
215 |
+
<label className="text-sm font-medium dark:text-gray-300">Min Likes:</label>
|
216 |
+
<input
|
217 |
+
type="number"
|
218 |
+
value={minLikes}
|
219 |
+
onChange={(e) => setMinLikes(Math.max(0, parseInt(e.target.value) || 0))}
|
220 |
+
className="w-20 px-2 py-1 border rounded dark:bg-gray-700 dark:border-gray-600 dark:text-white focus:outline-none focus:ring-2 focus:ring-green-500"
|
221 |
+
/>
|
222 |
+
</div>
|
223 |
+
</div>
|
224 |
+
<div className="space-y-8">
|
225 |
+
{Object.entries(filteredModels)
|
226 |
+
.map(([monthKey, models]) => ({
|
227 |
+
monthKey,
|
228 |
+
models,
|
229 |
+
sortKey: models[0]?.sortKey || '' // Use the first model's sortKey
|
230 |
+
}))
|
231 |
+
.sort((a, b) => b.sortKey.localeCompare(a.sortKey)) // Sort by sortKey in descending order
|
232 |
+
.map(({ monthKey, models }) => (
|
233 |
+
<div key={monthKey} className="border-b border-gray-200 dark:border-gray-700 pb-4">
|
234 |
+
<h3 className="text-xl font-semibold mb-3 dark:text-white">{monthKey}</h3>
|
235 |
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
236 |
+
{models
|
237 |
+
.sort((a, b) => b.likes - a.likes) // Sort models within each month by likes
|
238 |
+
.map(model => (
|
239 |
+
<div
|
240 |
+
key={model.id}
|
241 |
+
className="p-4 rounded-lg border dark:border-gray-700 hover:shadow-md transition-shadow bg-white dark:bg-gray-800"
|
242 |
+
style={{ borderColor: COLORS[model.provider] }}
|
243 |
+
>
|
244 |
+
<div className="flex justify-between items-start">
|
245 |
+
<div>
|
246 |
+
<a
|
247 |
+
href={`https://huggingface.co/${model.id}`}
|
248 |
+
target="_blank"
|
249 |
+
rel="noopener noreferrer"
|
250 |
+
className="text-blue-600 hover:underline font-medium dark:text-blue-400"
|
251 |
+
>
|
252 |
+
{model.name}
|
253 |
+
</a>
|
254 |
+
<p className="text-sm text-gray-600 dark:text-gray-400">{model.provider}</p>
|
255 |
+
</div>
|
256 |
+
<div className="text-right">
|
257 |
+
<p className="text-sm font-medium dark:text-white">❤️ {model.likes}</p>
|
258 |
+
<p className="text-xs text-gray-500 dark:text-gray-400">{formatDate(model.createdAt)}</p>
|
259 |
+
</div>
|
260 |
+
</div>
|
261 |
+
</div>
|
262 |
+
))}
|
263 |
+
</div>
|
264 |
+
</div>
|
265 |
+
))}
|
266 |
+
</div>
|
267 |
+
</div>
|
268 |
+
</div>
|
269 |
+
);
|
270 |
+
};
|
271 |
+
|
272 |
+
export const getStaticProps = async () => {
|
273 |
+
try {
|
274 |
+
const allModels = await fetchAllModelData();
|
275 |
+
|
276 |
+
if (!allModels || allModels.length === 0) {
|
277 |
+
throw new Error('Failed to fetch model data');
|
278 |
+
}
|
279 |
+
|
280 |
+
const monthlyData = generateMonthlyData(allModels);
|
281 |
+
const totalData = getTotalMonthlyData(monthlyData);
|
282 |
+
const detailedData = processDetailedModelData(allModels);
|
283 |
+
|
284 |
+
return {
|
285 |
+
props: {
|
286 |
+
monthlyData,
|
287 |
+
totalData,
|
288 |
+
detailedData,
|
289 |
+
},
|
290 |
+
revalidate: 3600, // Revalidate every hour
|
291 |
+
};
|
292 |
+
} catch (error) {
|
293 |
+
console.error('Error in getStaticProps:', error);
|
294 |
+
return {
|
295 |
+
props: {
|
296 |
+
monthlyData: [],
|
297 |
+
totalData: [],
|
298 |
+
detailedData: [],
|
299 |
+
error: 'Failed to load data. Please try again later.'
|
300 |
+
},
|
301 |
+
revalidate: 60, // Retry sooner if there was an error
|
302 |
+
};
|
303 |
+
}
|
304 |
+
};
|
305 |
+
|
306 |
+
export default TrendPage;
|
src/utils/modelData.ts
ADDED
@@ -0,0 +1,300 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { PROVIDERS_MAP } from './providers';
|
2 |
+
|
3 |
+
export interface ModelData {
|
4 |
+
createdAt: string;
|
5 |
+
id: string;
|
6 |
+
likes?: number;
|
7 |
+
}
|
8 |
+
|
9 |
+
export interface Activity {
|
10 |
+
date: string;
|
11 |
+
count: number;
|
12 |
+
level: number;
|
13 |
+
}
|
14 |
+
|
15 |
+
export interface CalendarData {
|
16 |
+
[key: string]: Activity[];
|
17 |
+
}
|
18 |
+
|
19 |
+
export interface MonthlyActivity {
|
20 |
+
date: string; // YYYY-MM format
|
21 |
+
count: number;
|
22 |
+
provider: string;
|
23 |
+
}
|
24 |
+
|
25 |
+
export interface DetailedModelData extends ModelData {
|
26 |
+
name: string;
|
27 |
+
likes: number;
|
28 |
+
downloads: number;
|
29 |
+
monthKey: string; // YYYY-MM
|
30 |
+
provider: string;
|
31 |
+
sortKey: string; // YYYY-MM
|
32 |
+
}
|
33 |
+
|
34 |
+
// Generates calendar data from model data
|
35 |
+
export const generateCalendarData = (modelData: ModelData[]): CalendarData => {
|
36 |
+
const data: CalendarData = Object.fromEntries(
|
37 |
+
Object.keys(PROVIDERS_MAP).map(provider => [provider, []])
|
38 |
+
);
|
39 |
+
|
40 |
+
const today = new Date();
|
41 |
+
const startDate = new Date(today);
|
42 |
+
startDate.setMonth(today.getMonth() - 11);
|
43 |
+
startDate.setDate(1);
|
44 |
+
|
45 |
+
// Create a map to store counts for each provider and date
|
46 |
+
const countMap: Record<string, Record<string, number>> = {};
|
47 |
+
|
48 |
+
if (!Array.isArray(modelData)) {
|
49 |
+
console.error('Model data is not an array:', modelData);
|
50 |
+
modelData = [];
|
51 |
+
}
|
52 |
+
|
53 |
+
modelData.forEach(item => {
|
54 |
+
const [org] = item.id.split('/');
|
55 |
+
const provider = Object.entries(PROVIDERS_MAP).find(([_, info]) =>
|
56 |
+
info.authors.includes(org)
|
57 |
+
)?.[0];
|
58 |
+
|
59 |
+
if (provider) {
|
60 |
+
const date = item.createdAt.split('T')[0];
|
61 |
+
if (!countMap[provider]) {
|
62 |
+
countMap[provider] = {};
|
63 |
+
}
|
64 |
+
countMap[provider][date] = (countMap[provider][date] || 0) + 1;
|
65 |
+
}
|
66 |
+
});
|
67 |
+
|
68 |
+
// Fill in the data array with actual counts and zero counts
|
69 |
+
Object.keys(PROVIDERS_MAP).forEach(provider => {
|
70 |
+
let currentDate = new Date(startDate);
|
71 |
+
while (currentDate <= today) {
|
72 |
+
const dateStr = currentDate.toISOString().split('T')[0];
|
73 |
+
const count = countMap[provider]?.[dateStr] || 0;
|
74 |
+
data[provider].push({
|
75 |
+
date: dateStr,
|
76 |
+
count,
|
77 |
+
level: count === 0 ? 0 : Math.min(4, Math.ceil(count / 2))
|
78 |
+
});
|
79 |
+
currentDate.setDate(currentDate.getDate() + 1);
|
80 |
+
}
|
81 |
+
});
|
82 |
+
|
83 |
+
return data;
|
84 |
+
};
|
85 |
+
|
86 |
+
// Aggregates calendar data from all providers into a single heatmap
|
87 |
+
export const aggregateCalendarData = (calendarData: CalendarData): Activity[] => {
|
88 |
+
if (Object.keys(calendarData).length === 0) return [];
|
89 |
+
|
90 |
+
// Get the first provider's data to get the date range
|
91 |
+
const firstProviderData = Object.values(calendarData)[0];
|
92 |
+
|
93 |
+
// Create a map to store aggregated counts by date
|
94 |
+
const aggregatedCounts: Record<string, number> = {};
|
95 |
+
|
96 |
+
// Sum up counts for each date across all providers
|
97 |
+
Object.values(calendarData).forEach(providerData => {
|
98 |
+
providerData.forEach(activity => {
|
99 |
+
aggregatedCounts[activity.date] = (aggregatedCounts[activity.date] || 0) + activity.count;
|
100 |
+
});
|
101 |
+
});
|
102 |
+
|
103 |
+
// Convert the aggregated counts into Activity array
|
104 |
+
return firstProviderData.map(({ date }) => {
|
105 |
+
const count = aggregatedCounts[date] || 0;
|
106 |
+
return {
|
107 |
+
date,
|
108 |
+
count,
|
109 |
+
level: count === 0 ? 0 : Math.min(4, Math.ceil(count / 3))
|
110 |
+
};
|
111 |
+
});
|
112 |
+
};
|
113 |
+
|
114 |
+
export const generateMonthlyData = (modelData: ModelData[]): MonthlyActivity[] => {
|
115 |
+
if (!Array.isArray(modelData)) {
|
116 |
+
console.error('Model data is not an array:', modelData);
|
117 |
+
return [];
|
118 |
+
}
|
119 |
+
|
120 |
+
// Create a map to store counts for each provider and month
|
121 |
+
const monthlyMap: Record<string, Record<string, number>> = {};
|
122 |
+
|
123 |
+
modelData.forEach(item => {
|
124 |
+
const [org] = item.id.split('/');
|
125 |
+
const provider = Object.entries(PROVIDERS_MAP).find(([_, info]) =>
|
126 |
+
info.authors.includes(org)
|
127 |
+
)?.[0];
|
128 |
+
|
129 |
+
if (provider) {
|
130 |
+
const date = item.createdAt.substring(0, 7); // Get YYYY-MM
|
131 |
+
if (!monthlyMap[provider]) {
|
132 |
+
monthlyMap[provider] = {};
|
133 |
+
}
|
134 |
+
monthlyMap[provider][date] = (monthlyMap[provider][date] || 0) + 1;
|
135 |
+
}
|
136 |
+
});
|
137 |
+
|
138 |
+
// Convert the map to an array of monthly activities
|
139 |
+
const monthlyActivities: MonthlyActivity[] = [];
|
140 |
+
|
141 |
+
// Get all unique months across all providers
|
142 |
+
const allMonths = new Set<string>();
|
143 |
+
Object.values(monthlyMap).forEach(providerData => {
|
144 |
+
Object.keys(providerData).forEach(month => allMonths.add(month));
|
145 |
+
});
|
146 |
+
|
147 |
+
// Sort months chronologically
|
148 |
+
const sortedMonths = Array.from(allMonths).sort();
|
149 |
+
|
150 |
+
// Create entries for each provider and month
|
151 |
+
Object.entries(monthlyMap).forEach(([provider, data]) => {
|
152 |
+
sortedMonths.forEach(month => {
|
153 |
+
monthlyActivities.push({
|
154 |
+
date: month,
|
155 |
+
count: data[month] || 0,
|
156 |
+
provider
|
157 |
+
});
|
158 |
+
});
|
159 |
+
});
|
160 |
+
|
161 |
+
return monthlyActivities;
|
162 |
+
};
|
163 |
+
|
164 |
+
const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
|
165 |
+
|
166 |
+
async function fetchWithRetry(url: string, retries = 3, delayMs = 1000): Promise<Response> {
|
167 |
+
for (let i = 0; i < retries; i++) {
|
168 |
+
try {
|
169 |
+
const response = await fetch(url);
|
170 |
+
if (response.status === 429) { // Rate limit exceeded
|
171 |
+
console.log(`Rate limit exceeded, waiting ${delayMs}ms before retry ${i + 1}/${retries}`);
|
172 |
+
await delay(delayMs);
|
173 |
+
continue;
|
174 |
+
}
|
175 |
+
return response;
|
176 |
+
} catch (error) {
|
177 |
+
if (i === retries - 1) throw error;
|
178 |
+
console.log(`Fetch failed, retrying (${i + 1}/${retries})...`);
|
179 |
+
await delay(delayMs);
|
180 |
+
}
|
181 |
+
}
|
182 |
+
throw new Error('Max retries reached');
|
183 |
+
}
|
184 |
+
|
185 |
+
export async function fetchAllModelData(): Promise<ModelData[]> {
|
186 |
+
console.log('Starting to fetch model data...');
|
187 |
+
const allModels: ModelData[] = [];
|
188 |
+
const failedProviders: string[] = [];
|
189 |
+
|
190 |
+
for (const [provider, info] of Object.entries(PROVIDERS_MAP)) {
|
191 |
+
console.log(`Fetching models for provider: ${provider}`);
|
192 |
+
try {
|
193 |
+
const response = await fetchWithRetry(
|
194 |
+
`https://huggingface.co/api/models?author=${info.authors[0]}&sort=likes&direction=-1&limit=100`,
|
195 |
+
3,
|
196 |
+
2000 // 2 second delay between retries
|
197 |
+
);
|
198 |
+
|
199 |
+
if (!response.ok) {
|
200 |
+
console.error(`Failed to fetch data for ${provider}:`, response.status, response.statusText);
|
201 |
+
failedProviders.push(provider);
|
202 |
+
continue;
|
203 |
+
}
|
204 |
+
|
205 |
+
const models = await response.json();
|
206 |
+
console.log(`Received ${models.length} models for ${provider}`);
|
207 |
+
|
208 |
+
allModels.push(
|
209 |
+
...models.map((model: any) => {
|
210 |
+
const date = new Date(model.createdAt);
|
211 |
+
return {
|
212 |
+
id: model.id,
|
213 |
+
name: model.modelId,
|
214 |
+
likes: model.likes || 0,
|
215 |
+
createdAt: model.createdAt,
|
216 |
+
provider,
|
217 |
+
monthKey: date.toLocaleDateString('en-US', {
|
218 |
+
year: 'numeric',
|
219 |
+
month: 'long'
|
220 |
+
}),
|
221 |
+
sortKey: `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`
|
222 |
+
};
|
223 |
+
})
|
224 |
+
);
|
225 |
+
|
226 |
+
// Add a small delay between requests to avoid rate limiting
|
227 |
+
await delay(500);
|
228 |
+
} catch (error) {
|
229 |
+
console.error(`Error fetching data for ${provider}:`, error);
|
230 |
+
failedProviders.push(provider);
|
231 |
+
}
|
232 |
+
}
|
233 |
+
|
234 |
+
if (failedProviders.length > 0) {
|
235 |
+
console.warn('Failed to fetch data for providers:', failedProviders);
|
236 |
+
}
|
237 |
+
|
238 |
+
console.log(`Total models fetched: ${allModels.length}`);
|
239 |
+
return allModels.sort((a, b) => {
|
240 |
+
// First sort by sortKey (year-month) in descending order
|
241 |
+
const dateCompare = b.sortKey.localeCompare(a.sortKey);
|
242 |
+
if (dateCompare !== 0) return dateCompare;
|
243 |
+
// Then by likes for models in the same month
|
244 |
+
return b.likes - a.likes;
|
245 |
+
});
|
246 |
+
}
|
247 |
+
|
248 |
+
export function processDetailedModelData(models: ModelData[]): DetailedModelData[] {
|
249 |
+
if (!models || models.length === 0) {
|
250 |
+
console.log('No models to process');
|
251 |
+
return [];
|
252 |
+
}
|
253 |
+
|
254 |
+
console.log('Processing detailed model data...');
|
255 |
+
console.log('Input models:', models.length);
|
256 |
+
|
257 |
+
// Group models by month
|
258 |
+
const groupedModels = models.reduce<Record<string, DetailedModelData[]>>((acc, model) => {
|
259 |
+
if (!acc[model.monthKey]) {
|
260 |
+
acc[model.monthKey] = [];
|
261 |
+
}
|
262 |
+
acc[model.monthKey].push(model as DetailedModelData);
|
263 |
+
return acc;
|
264 |
+
}, {});
|
265 |
+
|
266 |
+
// Sort each month's models by likes
|
267 |
+
Object.values(groupedModels).forEach(monthModels => {
|
268 |
+
monthModels.sort((a, b) => b.likes - a.likes);
|
269 |
+
});
|
270 |
+
|
271 |
+
const processed = Object.entries(groupedModels)
|
272 |
+
.sort((a, b) => {
|
273 |
+
const [monthKeyA, modelsA] = a;
|
274 |
+
const [monthKeyB, modelsB] = b;
|
275 |
+
return modelsB[0].sortKey.localeCompare(modelsA[0].sortKey);
|
276 |
+
})
|
277 |
+
.flatMap(([_, models]) => models);
|
278 |
+
|
279 |
+
console.log('Processed models:', processed.length);
|
280 |
+
console.log('Sample model:', processed[0]);
|
281 |
+
|
282 |
+
return processed;
|
283 |
+
}
|
284 |
+
|
285 |
+
// Helper function to get total monthly data across all providers
|
286 |
+
export const getTotalMonthlyData = (monthlyData: MonthlyActivity[]): MonthlyActivity[] => {
|
287 |
+
const totalByMonth: Record<string, number> = {};
|
288 |
+
|
289 |
+
monthlyData.forEach(({ date, count }) => {
|
290 |
+
totalByMonth[date] = (totalByMonth[date] || 0) + count;
|
291 |
+
});
|
292 |
+
|
293 |
+
return Object.entries(totalByMonth)
|
294 |
+
.map(([date, count]) => ({
|
295 |
+
date,
|
296 |
+
count,
|
297 |
+
provider: 'Total'
|
298 |
+
}))
|
299 |
+
.sort((a, b) => a.date.localeCompare(b.date));
|
300 |
+
};
|
src/utils/providers.ts
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export interface ProviderInfo {
|
2 |
+
color: string;
|
3 |
+
authors: string[];
|
4 |
+
}
|
5 |
+
|
6 |
+
export const PROVIDERS_MAP: Record<string, ProviderInfo> = {
|
7 |
+
"BAAI": { color: "#FF7000", authors: ["BAAI"] },
|
8 |
+
"DeepSeek": { color: "#1877F2", authors: ["deepseek-ai"] },
|
9 |
+
"Shanghai AI Lab": { color: "#10A37F", authors: ["internlm", "OpenGVLab", "openmmlab", "Vchitect"] },
|
10 |
+
"Alibaba": { color: "#FF6F00", authors: ["Qwen", "Alibaba-NLP", "alibaba-pai", "DAMO-NLP-SG", 'ali-vilab', 'modelscope', 'FunAudioLLM'] },
|
11 |
+
"ZhipuAI / GLM": { color: "#4285F4", authors: ["THUDM"] },
|
12 |
+
"Tencent": { color: "#1DA1F2", authors: ["TencentARC", "Tencent-Hunyuan", "h94"] },
|
13 |
+
"Yi/01": { color: "#FF4500", authors: ["01-ai"] },
|
14 |
+
"Multimodal Art Projection (m-a-p)": { color: "#5E35B1", authors: ["m-a-p"] }
|
15 |
+
};
|
yarn.lock
CHANGED
@@ -2,14 +2,6 @@
|
|
2 |
# yarn lockfile v1
|
3 |
|
4 |
|
5 |
-
"@75lb/deep-merge@^1.1.1":
|
6 |
-
version "1.1.1"
|
7 |
-
resolved "https://registry.yarnpkg.com/@75lb/deep-merge/-/deep-merge-1.1.1.tgz#3b06155b90d34f5f8cc2107d796f1853ba02fd6d"
|
8 |
-
integrity sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==
|
9 |
-
dependencies:
|
10 |
-
lodash.assignwith "^4.2.0"
|
11 |
-
typical "^7.1.1"
|
12 |
-
|
13 |
"@alloc/quick-lru@^5.2.0":
|
14 |
version "5.2.0"
|
15 |
resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30"
|
@@ -106,13 +98,6 @@
|
|
106 |
"@babel/helper-validator-identifier" "^7.24.7"
|
107 |
to-fast-properties "^2.0.0"
|
108 |
|
109 |
-
"@duckdb/duckdb-wasm@^1.28.1-dev106.0":
|
110 |
-
version "1.28.1-dev106.0"
|
111 |
-
resolved "https://registry.yarnpkg.com/@duckdb/duckdb-wasm/-/duckdb-wasm-1.28.1-dev106.0.tgz#43e71fd705fd47cac02ef8af9b58356669537748"
|
112 |
-
integrity sha512-HcA9q/Yq1t8nAIg2rl8DmOTjKy1tAHSdBGHlCcWAm5StsfAjcm+f0STBEH3hmWPk0qEtOJF30OR+GfeyUOP+hA==
|
113 |
-
dependencies:
|
114 |
-
apache-arrow "^14.0.1"
|
115 |
-
|
116 |
"@emotion/babel-plugin@^11.12.0":
|
117 |
version "11.12.0"
|
118 |
resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz#7b43debb250c313101b3f885eba634f1d723fcc2"
|
@@ -436,20 +421,56 @@
|
|
436 |
resolved "https://registry.yarnpkg.com/@types/chroma-js/-/chroma-js-2.4.4.tgz#254dddff54568ff8e5d0dcdb071871a458fdfd31"
|
437 |
integrity sha512-/DTccpHTaKomqussrn+ciEvfW4k6NAHzNzs/sts1TCqg333qNxOhy8TNIoQCmbGG3Tl8KdEhkGAssb1n3mTXiQ==
|
438 |
|
439 |
-
"@types/
|
440 |
-
version "
|
441 |
-
resolved "https://registry.yarnpkg.com/@types/
|
442 |
-
integrity sha512-
|
443 |
|
444 |
-
"@types/
|
445 |
-
version "
|
446 |
-
resolved "https://registry.yarnpkg.com/@types/
|
447 |
-
integrity sha512-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
448 |
|
449 |
-
"@types/
|
450 |
-
version "
|
451 |
-
resolved "https://registry.yarnpkg.com/@types/
|
452 |
-
integrity sha512-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
453 |
|
454 |
"@types/node@^20":
|
455 |
version "20.14.13"
|
@@ -458,11 +479,6 @@
|
|
458 |
dependencies:
|
459 |
undici-types "~5.26.4"
|
460 |
|
461 |
-
"@types/pad-left@2.1.1":
|
462 |
-
version "2.1.1"
|
463 |
-
resolved "https://registry.yarnpkg.com/@types/pad-left/-/pad-left-2.1.1.tgz#17d906fc75804e1cc722da73623f1d978f16a137"
|
464 |
-
integrity sha512-Xd22WCRBydkGSApl5Bw0PhAOHKSVjNL3E3AwzKaps96IMraPqy5BvZIsBVK6JLwdybUzjHnuWVwpDd0JjTfHXA==
|
465 |
-
|
466 |
"@types/parse-json@^4.0.0":
|
467 |
version "4.0.2"
|
468 |
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239"
|
@@ -517,7 +533,7 @@ ansi-styles@^3.2.1:
|
|
517 |
dependencies:
|
518 |
color-convert "^1.9.0"
|
519 |
|
520 |
-
ansi-styles@^4.0.0
|
521 |
version "4.3.0"
|
522 |
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
|
523 |
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
|
@@ -542,37 +558,11 @@ anymatch@~3.1.2:
|
|
542 |
normalize-path "^3.0.0"
|
543 |
picomatch "^2.0.4"
|
544 |
|
545 |
-
apache-arrow@^14.0.1:
|
546 |
-
version "14.0.2"
|
547 |
-
resolved "https://registry.yarnpkg.com/apache-arrow/-/apache-arrow-14.0.2.tgz#737f7b8211ef99a2c137dcc9d2001b469efb0344"
|
548 |
-
integrity sha512-EBO2xJN36/XoY81nhLcwCJgFwkboDZeyNQ+OPsG7bCoQjc2BT0aTyH/MR6SrL+LirSNz+cYqjGRlupMMlP1aEg==
|
549 |
-
dependencies:
|
550 |
-
"@types/command-line-args" "5.2.0"
|
551 |
-
"@types/command-line-usage" "5.0.2"
|
552 |
-
"@types/node" "20.3.0"
|
553 |
-
"@types/pad-left" "2.1.1"
|
554 |
-
command-line-args "5.2.1"
|
555 |
-
command-line-usage "7.0.1"
|
556 |
-
flatbuffers "23.5.26"
|
557 |
-
json-bignum "^0.0.3"
|
558 |
-
pad-left "^2.1.0"
|
559 |
-
tslib "^2.5.3"
|
560 |
-
|
561 |
arg@^5.0.2:
|
562 |
version "5.0.2"
|
563 |
resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c"
|
564 |
integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==
|
565 |
|
566 |
-
array-back@^3.0.1, array-back@^3.1.0:
|
567 |
-
version "3.1.0"
|
568 |
-
resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0"
|
569 |
-
integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==
|
570 |
-
|
571 |
-
array-back@^6.2.2:
|
572 |
-
version "6.2.2"
|
573 |
-
resolved "https://registry.yarnpkg.com/array-back/-/array-back-6.2.2.tgz#f567d99e9af88a6d3d2f9dfcc21db6f9ba9fd157"
|
574 |
-
integrity sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==
|
575 |
-
|
576 |
babel-plugin-macros@^3.1.0:
|
577 |
version "3.1.0"
|
578 |
resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1"
|
@@ -628,13 +618,6 @@ caniuse-lite@^1.0.30001579:
|
|
628 |
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001645.tgz#4c4b7427683dea1170a152cd1654be8d0da7bd71"
|
629 |
integrity sha512-GFtY2+qt91kzyMk6j48dJcwJVq5uTkk71XxE3RtScx7XWRLsO7bU44LOFkOZYR8w9YMS0UhPSYpN/6rAMImmLw==
|
630 |
|
631 |
-
chalk-template@^0.4.0:
|
632 |
-
version "0.4.0"
|
633 |
-
resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-0.4.0.tgz#692c034d0ed62436b9062c1707fadcd0f753204b"
|
634 |
-
integrity sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==
|
635 |
-
dependencies:
|
636 |
-
chalk "^4.1.2"
|
637 |
-
|
638 |
chalk@^2.4.2:
|
639 |
version "2.4.2"
|
640 |
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
|
@@ -644,14 +627,6 @@ chalk@^2.4.2:
|
|
644 |
escape-string-regexp "^1.0.5"
|
645 |
supports-color "^5.3.0"
|
646 |
|
647 |
-
chalk@^4.1.2:
|
648 |
-
version "4.1.2"
|
649 |
-
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
|
650 |
-
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
|
651 |
-
dependencies:
|
652 |
-
ansi-styles "^4.1.0"
|
653 |
-
supports-color "^7.1.0"
|
654 |
-
|
655 |
chokidar@^3.5.3:
|
656 |
version "3.6.0"
|
657 |
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
|
@@ -706,36 +681,6 @@ color-name@~1.1.4:
|
|
706 |
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
|
707 |
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
|
708 |
|
709 |
-
command-line-args@5.2.1, command-line-args@^5.2.1:
|
710 |
-
version "5.2.1"
|
711 |
-
resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e"
|
712 |
-
integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==
|
713 |
-
dependencies:
|
714 |
-
array-back "^3.1.0"
|
715 |
-
find-replace "^3.0.0"
|
716 |
-
lodash.camelcase "^4.3.0"
|
717 |
-
typical "^4.0.0"
|
718 |
-
|
719 |
-
command-line-usage@7.0.1:
|
720 |
-
version "7.0.1"
|
721 |
-
resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-7.0.1.tgz#e540afef4a4f3bc501b124ffde33956309100655"
|
722 |
-
integrity sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==
|
723 |
-
dependencies:
|
724 |
-
array-back "^6.2.2"
|
725 |
-
chalk-template "^0.4.0"
|
726 |
-
table-layout "^3.0.0"
|
727 |
-
typical "^7.1.1"
|
728 |
-
|
729 |
-
command-line-usage@^7.0.0:
|
730 |
-
version "7.0.3"
|
731 |
-
resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-7.0.3.tgz#6bce992354f6af10ecea2b631bfdf0c8b3bfaea3"
|
732 |
-
integrity sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==
|
733 |
-
dependencies:
|
734 |
-
array-back "^6.2.2"
|
735 |
-
chalk-template "^0.4.0"
|
736 |
-
table-layout "^4.1.0"
|
737 |
-
typical "^7.1.1"
|
738 |
-
|
739 |
commander@^4.0.0:
|
740 |
version "4.1.1"
|
741 |
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
|
@@ -776,6 +721,77 @@ csstype@^3.0.2, csstype@^3.1.3:
|
|
776 |
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
|
777 |
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
|
778 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
779 |
date-fns@^3.6.0:
|
780 |
version "3.6.0"
|
781 |
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf"
|
@@ -788,6 +804,11 @@ debug@^4.3.1:
|
|
788 |
dependencies:
|
789 |
ms "2.1.2"
|
790 |
|
|
|
|
|
|
|
|
|
|
|
791 |
didyoumean@^1.2.2:
|
792 |
version "1.2.2"
|
793 |
resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037"
|
@@ -838,6 +859,16 @@ escape-string-regexp@^4.0.0:
|
|
838 |
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
|
839 |
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
|
840 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
841 |
fast-glob@^3.3.0:
|
842 |
version "3.3.2"
|
843 |
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
|
@@ -863,23 +894,11 @@ fill-range@^7.1.1:
|
|
863 |
dependencies:
|
864 |
to-regex-range "^5.0.1"
|
865 |
|
866 |
-
find-replace@^3.0.0:
|
867 |
-
version "3.0.0"
|
868 |
-
resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38"
|
869 |
-
integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==
|
870 |
-
dependencies:
|
871 |
-
array-back "^3.0.1"
|
872 |
-
|
873 |
find-root@^1.1.0:
|
874 |
version "1.1.0"
|
875 |
resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
|
876 |
integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
|
877 |
|
878 |
-
flatbuffers@23.5.26:
|
879 |
-
version "23.5.26"
|
880 |
-
resolved "https://registry.yarnpkg.com/flatbuffers/-/flatbuffers-23.5.26.tgz#01358e272a61239f0faf3bfbe4e014f3ace9d746"
|
881 |
-
integrity sha512-vE+SI9vrJDwi1oETtTIFldC/o9GsVKRM+s6EL0nQgxXlYV1Vc4Tk30hj4xGICftInKQKj1F3up2n8UbIVobISQ==
|
882 |
-
|
883 |
foreground-child@^3.1.0:
|
884 |
version "3.2.1"
|
885 |
resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7"
|
@@ -939,11 +958,6 @@ has-flag@^3.0.0:
|
|
939 |
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
|
940 |
integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
|
941 |
|
942 |
-
has-flag@^4.0.0:
|
943 |
-
version "4.0.0"
|
944 |
-
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
|
945 |
-
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
|
946 |
-
|
947 |
hasown@^2.0.2:
|
948 |
version "2.0.2"
|
949 |
resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
|
@@ -966,6 +980,11 @@ import-fresh@^3.2.1:
|
|
966 |
parent-module "^1.0.0"
|
967 |
resolve-from "^4.0.0"
|
968 |
|
|
|
|
|
|
|
|
|
|
|
969 |
is-arrayish@^0.2.1:
|
970 |
version "0.2.1"
|
971 |
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
|
@@ -1036,11 +1055,6 @@ jsesc@^2.5.1:
|
|
1036 |
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
|
1037 |
integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
|
1038 |
|
1039 |
-
json-bignum@^0.0.3:
|
1040 |
-
version "0.0.3"
|
1041 |
-
resolved "https://registry.yarnpkg.com/json-bignum/-/json-bignum-0.0.3.tgz#41163b50436c773d82424dbc20ed70db7604b8d7"
|
1042 |
-
integrity sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==
|
1043 |
-
|
1044 |
json-parse-even-better-errors@^2.3.0:
|
1045 |
version "2.3.1"
|
1046 |
resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
|
@@ -1061,15 +1075,10 @@ lines-and-columns@^1.1.6:
|
|
1061 |
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
|
1062 |
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
|
1063 |
|
1064 |
-
lodash
|
1065 |
-
version "4.
|
1066 |
-
resolved "https://registry.yarnpkg.com/lodash
|
1067 |
-
integrity sha512-
|
1068 |
-
|
1069 |
-
lodash.camelcase@^4.3.0:
|
1070 |
-
version "4.3.0"
|
1071 |
-
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
|
1072 |
-
integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==
|
1073 |
|
1074 |
loose-envify@^1.1.0, loose-envify@^1.4.0:
|
1075 |
version "1.4.0"
|
@@ -1170,13 +1179,6 @@ package-json-from-dist@^1.0.0:
|
|
1170 |
resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00"
|
1171 |
integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==
|
1172 |
|
1173 |
-
pad-left@^2.1.0:
|
1174 |
-
version "2.1.0"
|
1175 |
-
resolved "https://registry.yarnpkg.com/pad-left/-/pad-left-2.1.0.tgz#16e6a3b2d44a8e138cb0838cc7cb403a4fc9e994"
|
1176 |
-
integrity sha512-HJxs9K9AztdIQIAIa/OIazRAUW/L6B9hbQDxO4X07roW3eo9XqZc2ur9bn1StH9CnbbI9EgvejHQX7CBpCF1QA==
|
1177 |
-
dependencies:
|
1178 |
-
repeat-string "^1.5.4"
|
1179 |
-
|
1180 |
parent-module@^1.0.0:
|
1181 |
version "1.0.1"
|
1182 |
resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
|
@@ -1349,6 +1351,15 @@ react-is@^18.3.1:
|
|
1349 |
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e"
|
1350 |
integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
|
1351 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1352 |
react-transition-group@^4.4.5:
|
1353 |
version "4.4.5"
|
1354 |
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1"
|
@@ -1380,16 +1391,32 @@ readdirp@~3.6.0:
|
|
1380 |
dependencies:
|
1381 |
picomatch "^2.2.1"
|
1382 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1383 |
regenerator-runtime@^0.14.0:
|
1384 |
version "0.14.1"
|
1385 |
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
|
1386 |
integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
|
1387 |
|
1388 |
-
repeat-string@^1.5.4:
|
1389 |
-
version "1.6.1"
|
1390 |
-
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
|
1391 |
-
integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==
|
1392 |
-
|
1393 |
resolve-from@^4.0.0:
|
1394 |
version "4.0.0"
|
1395 |
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
|
@@ -1450,17 +1477,13 @@ source-map@^0.5.7:
|
|
1450 |
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
|
1451 |
integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
|
1452 |
|
1453 |
-
stream-read-all@^3.0.1:
|
1454 |
-
version "3.0.1"
|
1455 |
-
resolved "https://registry.yarnpkg.com/stream-read-all/-/stream-read-all-3.0.1.tgz#60762ae45e61d93ba0978cda7f3913790052ad96"
|
1456 |
-
integrity sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==
|
1457 |
-
|
1458 |
streamsearch@^1.1.0:
|
1459 |
version "1.1.0"
|
1460 |
resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764"
|
1461 |
integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==
|
1462 |
|
1463 |
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0:
|
|
|
1464 |
version "4.2.3"
|
1465 |
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
1466 |
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
@@ -1479,6 +1502,7 @@ string-width@^5.0.1, string-width@^5.1.2:
|
|
1479 |
strip-ansi "^7.0.1"
|
1480 |
|
1481 |
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
|
|
1482 |
version "6.0.1"
|
1483 |
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
1484 |
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
@@ -1524,40 +1548,11 @@ supports-color@^5.3.0:
|
|
1524 |
dependencies:
|
1525 |
has-flag "^3.0.0"
|
1526 |
|
1527 |
-
supports-color@^7.1.0:
|
1528 |
-
version "7.2.0"
|
1529 |
-
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
|
1530 |
-
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
|
1531 |
-
dependencies:
|
1532 |
-
has-flag "^4.0.0"
|
1533 |
-
|
1534 |
supports-preserve-symlinks-flag@^1.0.0:
|
1535 |
version "1.0.0"
|
1536 |
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
|
1537 |
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
|
1538 |
|
1539 |
-
table-layout@^3.0.0:
|
1540 |
-
version "3.0.2"
|
1541 |
-
resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-3.0.2.tgz#69c2be44388a5139b48c59cf21e73b488021769a"
|
1542 |
-
integrity sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==
|
1543 |
-
dependencies:
|
1544 |
-
"@75lb/deep-merge" "^1.1.1"
|
1545 |
-
array-back "^6.2.2"
|
1546 |
-
command-line-args "^5.2.1"
|
1547 |
-
command-line-usage "^7.0.0"
|
1548 |
-
stream-read-all "^3.0.1"
|
1549 |
-
typical "^7.1.1"
|
1550 |
-
wordwrapjs "^5.1.0"
|
1551 |
-
|
1552 |
-
table-layout@^4.1.0:
|
1553 |
-
version "4.1.0"
|
1554 |
-
resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-4.1.0.tgz#533573a037aad6abffc45911be14c79d1c43aaa6"
|
1555 |
-
integrity sha512-AfbFMOsAZDoaQq2sDF/F7PSTxnTBexr4cuArFW1bMl07tFbB+HBwKpnw99To3ffcjRFe12dEoyckiNz1+qCSng==
|
1556 |
-
dependencies:
|
1557 |
-
"@75lb/deep-merge" "^1.1.1"
|
1558 |
-
array-back "^6.2.2"
|
1559 |
-
wordwrapjs "^5.1.0"
|
1560 |
-
|
1561 |
tailwindcss@^3.4.1:
|
1562 |
version "3.4.7"
|
1563 |
resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.7.tgz#6092f18767f5933f59375b9afe558e592fc77201"
|
@@ -1600,6 +1595,11 @@ thenify-all@^1.0.0:
|
|
1600 |
dependencies:
|
1601 |
any-promise "^1.0.0"
|
1602 |
|
|
|
|
|
|
|
|
|
|
|
1603 |
to-fast-properties@^2.0.0:
|
1604 |
version "2.0.0"
|
1605 |
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
|
@@ -1617,7 +1617,7 @@ ts-interface-checker@^0.1.9:
|
|
1617 |
resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
|
1618 |
integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
|
1619 |
|
1620 |
-
tslib@^2.4.0
|
1621 |
version "2.6.3"
|
1622 |
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0"
|
1623 |
integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==
|
@@ -1627,16 +1627,6 @@ typescript@^5:
|
|
1627 |
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba"
|
1628 |
integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==
|
1629 |
|
1630 |
-
typical@^4.0.0:
|
1631 |
-
version "4.0.0"
|
1632 |
-
resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4"
|
1633 |
-
integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==
|
1634 |
-
|
1635 |
-
typical@^7.1.1:
|
1636 |
-
version "7.1.1"
|
1637 |
-
resolved "https://registry.yarnpkg.com/typical/-/typical-7.1.1.tgz#ba177ab7ab103b78534463ffa4c0c9754523ac1f"
|
1638 |
-
integrity sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==
|
1639 |
-
|
1640 |
undici-types@~5.26.4:
|
1641 |
version "5.26.5"
|
1642 |
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
|
@@ -1647,6 +1637,26 @@ util-deprecate@^1.0.2:
|
|
1647 |
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
1648 |
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
|
1649 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1650 |
which@^2.0.1:
|
1651 |
version "2.0.2"
|
1652 |
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
|
@@ -1654,11 +1664,6 @@ which@^2.0.1:
|
|
1654 |
dependencies:
|
1655 |
isexe "^2.0.0"
|
1656 |
|
1657 |
-
wordwrapjs@^5.1.0:
|
1658 |
-
version "5.1.0"
|
1659 |
-
resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-5.1.0.tgz#4c4d20446dcc670b14fa115ef4f8fd9947af2b3a"
|
1660 |
-
integrity sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==
|
1661 |
-
|
1662 |
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
|
1663 |
version "7.0.0"
|
1664 |
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
|
|
2 |
# yarn lockfile v1
|
3 |
|
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
"@alloc/quick-lru@^5.2.0":
|
6 |
version "5.2.0"
|
7 |
resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30"
|
|
|
98 |
"@babel/helper-validator-identifier" "^7.24.7"
|
99 |
to-fast-properties "^2.0.0"
|
100 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
101 |
"@emotion/babel-plugin@^11.12.0":
|
102 |
version "11.12.0"
|
103 |
resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz#7b43debb250c313101b3f885eba634f1d723fcc2"
|
|
|
421 |
resolved "https://registry.yarnpkg.com/@types/chroma-js/-/chroma-js-2.4.4.tgz#254dddff54568ff8e5d0dcdb071871a458fdfd31"
|
422 |
integrity sha512-/DTccpHTaKomqussrn+ciEvfW4k6NAHzNzs/sts1TCqg333qNxOhy8TNIoQCmbGG3Tl8KdEhkGAssb1n3mTXiQ==
|
423 |
|
424 |
+
"@types/d3-array@^3.0.3":
|
425 |
+
version "3.2.1"
|
426 |
+
resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.1.tgz#1f6658e3d2006c4fceac53fde464166859f8b8c5"
|
427 |
+
integrity sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==
|
428 |
|
429 |
+
"@types/d3-color@*":
|
430 |
+
version "3.1.3"
|
431 |
+
resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2"
|
432 |
+
integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==
|
433 |
+
|
434 |
+
"@types/d3-ease@^3.0.0":
|
435 |
+
version "3.0.2"
|
436 |
+
resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.2.tgz#e28db1bfbfa617076f7770dd1d9a48eaa3b6c51b"
|
437 |
+
integrity sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==
|
438 |
+
|
439 |
+
"@types/d3-interpolate@^3.0.1":
|
440 |
+
version "3.0.4"
|
441 |
+
resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz#412b90e84870285f2ff8a846c6eb60344f12a41c"
|
442 |
+
integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==
|
443 |
+
dependencies:
|
444 |
+
"@types/d3-color" "*"
|
445 |
+
|
446 |
+
"@types/d3-path@*":
|
447 |
+
version "3.1.0"
|
448 |
+
resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.0.tgz#2b907adce762a78e98828f0b438eaca339ae410a"
|
449 |
+
integrity sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==
|
450 |
|
451 |
+
"@types/d3-scale@^4.0.2":
|
452 |
+
version "4.0.8"
|
453 |
+
resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.8.tgz#d409b5f9dcf63074464bf8ddfb8ee5a1f95945bb"
|
454 |
+
integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==
|
455 |
+
dependencies:
|
456 |
+
"@types/d3-time" "*"
|
457 |
+
|
458 |
+
"@types/d3-shape@^3.1.0":
|
459 |
+
version "3.1.6"
|
460 |
+
resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.6.tgz#65d40d5a548f0a023821773e39012805e6e31a72"
|
461 |
+
integrity sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==
|
462 |
+
dependencies:
|
463 |
+
"@types/d3-path" "*"
|
464 |
+
|
465 |
+
"@types/d3-time@*", "@types/d3-time@^3.0.0":
|
466 |
+
version "3.0.4"
|
467 |
+
resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.4.tgz#8472feecd639691450dd8000eb33edd444e1323f"
|
468 |
+
integrity sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==
|
469 |
+
|
470 |
+
"@types/d3-timer@^3.0.0":
|
471 |
+
version "3.0.2"
|
472 |
+
resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.2.tgz#70bbda77dc23aa727413e22e214afa3f0e852f70"
|
473 |
+
integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==
|
474 |
|
475 |
"@types/node@^20":
|
476 |
version "20.14.13"
|
|
|
479 |
dependencies:
|
480 |
undici-types "~5.26.4"
|
481 |
|
|
|
|
|
|
|
|
|
|
|
482 |
"@types/parse-json@^4.0.0":
|
483 |
version "4.0.2"
|
484 |
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239"
|
|
|
533 |
dependencies:
|
534 |
color-convert "^1.9.0"
|
535 |
|
536 |
+
ansi-styles@^4.0.0:
|
537 |
version "4.3.0"
|
538 |
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
|
539 |
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
|
|
|
558 |
normalize-path "^3.0.0"
|
559 |
picomatch "^2.0.4"
|
560 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
561 |
arg@^5.0.2:
|
562 |
version "5.0.2"
|
563 |
resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c"
|
564 |
integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==
|
565 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
566 |
babel-plugin-macros@^3.1.0:
|
567 |
version "3.1.0"
|
568 |
resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1"
|
|
|
618 |
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001645.tgz#4c4b7427683dea1170a152cd1654be8d0da7bd71"
|
619 |
integrity sha512-GFtY2+qt91kzyMk6j48dJcwJVq5uTkk71XxE3RtScx7XWRLsO7bU44LOFkOZYR8w9YMS0UhPSYpN/6rAMImmLw==
|
620 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
621 |
chalk@^2.4.2:
|
622 |
version "2.4.2"
|
623 |
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
|
|
|
627 |
escape-string-regexp "^1.0.5"
|
628 |
supports-color "^5.3.0"
|
629 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
630 |
chokidar@^3.5.3:
|
631 |
version "3.6.0"
|
632 |
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
|
|
|
681 |
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
|
682 |
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
|
683 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
684 |
commander@^4.0.0:
|
685 |
version "4.1.1"
|
686 |
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
|
|
|
721 |
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
|
722 |
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
|
723 |
|
724 |
+
"d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6:
|
725 |
+
version "3.2.4"
|
726 |
+
resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5"
|
727 |
+
integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==
|
728 |
+
dependencies:
|
729 |
+
internmap "1 - 2"
|
730 |
+
|
731 |
+
"d3-color@1 - 3":
|
732 |
+
version "3.1.0"
|
733 |
+
resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2"
|
734 |
+
integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==
|
735 |
+
|
736 |
+
d3-ease@^3.0.1:
|
737 |
+
version "3.0.1"
|
738 |
+
resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4"
|
739 |
+
integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==
|
740 |
+
|
741 |
+
"d3-format@1 - 3":
|
742 |
+
version "3.1.0"
|
743 |
+
resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641"
|
744 |
+
integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==
|
745 |
+
|
746 |
+
"d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1:
|
747 |
+
version "3.0.1"
|
748 |
+
resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d"
|
749 |
+
integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==
|
750 |
+
dependencies:
|
751 |
+
d3-color "1 - 3"
|
752 |
+
|
753 |
+
d3-path@^3.1.0:
|
754 |
+
version "3.1.0"
|
755 |
+
resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526"
|
756 |
+
integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==
|
757 |
+
|
758 |
+
d3-scale@^4.0.2:
|
759 |
+
version "4.0.2"
|
760 |
+
resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396"
|
761 |
+
integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==
|
762 |
+
dependencies:
|
763 |
+
d3-array "2.10.0 - 3"
|
764 |
+
d3-format "1 - 3"
|
765 |
+
d3-interpolate "1.2.0 - 3"
|
766 |
+
d3-time "2.1.1 - 3"
|
767 |
+
d3-time-format "2 - 4"
|
768 |
+
|
769 |
+
d3-shape@^3.1.0:
|
770 |
+
version "3.2.0"
|
771 |
+
resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5"
|
772 |
+
integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==
|
773 |
+
dependencies:
|
774 |
+
d3-path "^3.1.0"
|
775 |
+
|
776 |
+
"d3-time-format@2 - 4":
|
777 |
+
version "4.1.0"
|
778 |
+
resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a"
|
779 |
+
integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==
|
780 |
+
dependencies:
|
781 |
+
d3-time "1 - 3"
|
782 |
+
|
783 |
+
"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0:
|
784 |
+
version "3.1.0"
|
785 |
+
resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7"
|
786 |
+
integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==
|
787 |
+
dependencies:
|
788 |
+
d3-array "2 - 3"
|
789 |
+
|
790 |
+
d3-timer@^3.0.1:
|
791 |
+
version "3.0.1"
|
792 |
+
resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0"
|
793 |
+
integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==
|
794 |
+
|
795 |
date-fns@^3.6.0:
|
796 |
version "3.6.0"
|
797 |
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf"
|
|
|
804 |
dependencies:
|
805 |
ms "2.1.2"
|
806 |
|
807 |
+
decimal.js-light@^2.4.1:
|
808 |
+
version "2.5.1"
|
809 |
+
resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934"
|
810 |
+
integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==
|
811 |
+
|
812 |
didyoumean@^1.2.2:
|
813 |
version "1.2.2"
|
814 |
resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037"
|
|
|
859 |
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
|
860 |
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
|
861 |
|
862 |
+
eventemitter3@^4.0.1:
|
863 |
+
version "4.0.7"
|
864 |
+
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
|
865 |
+
integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
|
866 |
+
|
867 |
+
fast-equals@^5.0.1:
|
868 |
+
version "5.0.1"
|
869 |
+
resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-5.0.1.tgz#a4eefe3c5d1c0d021aeed0bc10ba5e0c12ee405d"
|
870 |
+
integrity sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==
|
871 |
+
|
872 |
fast-glob@^3.3.0:
|
873 |
version "3.3.2"
|
874 |
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
|
|
|
894 |
dependencies:
|
895 |
to-regex-range "^5.0.1"
|
896 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
897 |
find-root@^1.1.0:
|
898 |
version "1.1.0"
|
899 |
resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
|
900 |
integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
|
901 |
|
|
|
|
|
|
|
|
|
|
|
902 |
foreground-child@^3.1.0:
|
903 |
version "3.2.1"
|
904 |
resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7"
|
|
|
958 |
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
|
959 |
integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
|
960 |
|
|
|
|
|
|
|
|
|
|
|
961 |
hasown@^2.0.2:
|
962 |
version "2.0.2"
|
963 |
resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
|
|
|
980 |
parent-module "^1.0.0"
|
981 |
resolve-from "^4.0.0"
|
982 |
|
983 |
+
"internmap@1 - 2":
|
984 |
+
version "2.0.3"
|
985 |
+
resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009"
|
986 |
+
integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==
|
987 |
+
|
988 |
is-arrayish@^0.2.1:
|
989 |
version "0.2.1"
|
990 |
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
|
|
|
1055 |
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
|
1056 |
integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
|
1057 |
|
|
|
|
|
|
|
|
|
|
|
1058 |
json-parse-even-better-errors@^2.3.0:
|
1059 |
version "2.3.1"
|
1060 |
resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
|
|
|
1075 |
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
|
1076 |
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
|
1077 |
|
1078 |
+
lodash@^4.17.21:
|
1079 |
+
version "4.17.21"
|
1080 |
+
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
|
1081 |
+
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
|
|
|
|
|
|
|
|
|
|
|
1082 |
|
1083 |
loose-envify@^1.1.0, loose-envify@^1.4.0:
|
1084 |
version "1.4.0"
|
|
|
1179 |
resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00"
|
1180 |
integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==
|
1181 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1182 |
parent-module@^1.0.0:
|
1183 |
version "1.0.1"
|
1184 |
resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
|
|
|
1351 |
resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e"
|
1352 |
integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
|
1353 |
|
1354 |
+
react-smooth@^4.0.0:
|
1355 |
+
version "4.0.1"
|
1356 |
+
resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-4.0.1.tgz#6200d8699bfe051ae40ba187988323b1449eab1a"
|
1357 |
+
integrity sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==
|
1358 |
+
dependencies:
|
1359 |
+
fast-equals "^5.0.1"
|
1360 |
+
prop-types "^15.8.1"
|
1361 |
+
react-transition-group "^4.4.5"
|
1362 |
+
|
1363 |
react-transition-group@^4.4.5:
|
1364 |
version "4.4.5"
|
1365 |
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1"
|
|
|
1391 |
dependencies:
|
1392 |
picomatch "^2.2.1"
|
1393 |
|
1394 |
+
recharts-scale@^0.4.4:
|
1395 |
+
version "0.4.5"
|
1396 |
+
resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.4.5.tgz#0969271f14e732e642fcc5bd4ab270d6e87dd1d9"
|
1397 |
+
integrity sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==
|
1398 |
+
dependencies:
|
1399 |
+
decimal.js-light "^2.4.1"
|
1400 |
+
|
1401 |
+
recharts@^2.13.3:
|
1402 |
+
version "2.13.3"
|
1403 |
+
resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.13.3.tgz#a5ce61e493dff921a14a14a8f42a9f2d2bbefd5a"
|
1404 |
+
integrity sha512-YDZ9dOfK9t3ycwxgKbrnDlRC4BHdjlY73fet3a0C1+qGMjXVZe6+VXmpOIIhzkje5MMEL8AN4hLIe4AMskBzlA==
|
1405 |
+
dependencies:
|
1406 |
+
clsx "^2.0.0"
|
1407 |
+
eventemitter3 "^4.0.1"
|
1408 |
+
lodash "^4.17.21"
|
1409 |
+
react-is "^18.3.1"
|
1410 |
+
react-smooth "^4.0.0"
|
1411 |
+
recharts-scale "^0.4.4"
|
1412 |
+
tiny-invariant "^1.3.1"
|
1413 |
+
victory-vendor "^36.6.8"
|
1414 |
+
|
1415 |
regenerator-runtime@^0.14.0:
|
1416 |
version "0.14.1"
|
1417 |
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
|
1418 |
integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
|
1419 |
|
|
|
|
|
|
|
|
|
|
|
1420 |
resolve-from@^4.0.0:
|
1421 |
version "4.0.0"
|
1422 |
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
|
|
|
1477 |
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
|
1478 |
integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
|
1479 |
|
|
|
|
|
|
|
|
|
|
|
1480 |
streamsearch@^1.1.0:
|
1481 |
version "1.1.0"
|
1482 |
resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764"
|
1483 |
integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==
|
1484 |
|
1485 |
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0:
|
1486 |
+
name string-width-cjs
|
1487 |
version "4.2.3"
|
1488 |
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
1489 |
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
|
|
1502 |
strip-ansi "^7.0.1"
|
1503 |
|
1504 |
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
1505 |
+
name strip-ansi-cjs
|
1506 |
version "6.0.1"
|
1507 |
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
1508 |
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
|
|
1548 |
dependencies:
|
1549 |
has-flag "^3.0.0"
|
1550 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1551 |
supports-preserve-symlinks-flag@^1.0.0:
|
1552 |
version "1.0.0"
|
1553 |
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
|
1554 |
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
|
1555 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1556 |
tailwindcss@^3.4.1:
|
1557 |
version "3.4.7"
|
1558 |
resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.7.tgz#6092f18767f5933f59375b9afe558e592fc77201"
|
|
|
1595 |
dependencies:
|
1596 |
any-promise "^1.0.0"
|
1597 |
|
1598 |
+
tiny-invariant@^1.3.1:
|
1599 |
+
version "1.3.3"
|
1600 |
+
resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127"
|
1601 |
+
integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==
|
1602 |
+
|
1603 |
to-fast-properties@^2.0.0:
|
1604 |
version "2.0.0"
|
1605 |
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
|
|
|
1617 |
resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
|
1618 |
integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
|
1619 |
|
1620 |
+
tslib@^2.4.0:
|
1621 |
version "2.6.3"
|
1622 |
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0"
|
1623 |
integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==
|
|
|
1627 |
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba"
|
1628 |
integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==
|
1629 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1630 |
undici-types@~5.26.4:
|
1631 |
version "5.26.5"
|
1632 |
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
|
|
|
1637 |
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
1638 |
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
|
1639 |
|
1640 |
+
victory-vendor@^36.6.8:
|
1641 |
+
version "36.9.2"
|
1642 |
+
resolved "https://registry.yarnpkg.com/victory-vendor/-/victory-vendor-36.9.2.tgz#668b02a448fa4ea0f788dbf4228b7e64669ff801"
|
1643 |
+
integrity sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==
|
1644 |
+
dependencies:
|
1645 |
+
"@types/d3-array" "^3.0.3"
|
1646 |
+
"@types/d3-ease" "^3.0.0"
|
1647 |
+
"@types/d3-interpolate" "^3.0.1"
|
1648 |
+
"@types/d3-scale" "^4.0.2"
|
1649 |
+
"@types/d3-shape" "^3.1.0"
|
1650 |
+
"@types/d3-time" "^3.0.0"
|
1651 |
+
"@types/d3-timer" "^3.0.0"
|
1652 |
+
d3-array "^3.1.6"
|
1653 |
+
d3-ease "^3.0.1"
|
1654 |
+
d3-interpolate "^3.0.1"
|
1655 |
+
d3-scale "^4.0.2"
|
1656 |
+
d3-shape "^3.1.0"
|
1657 |
+
d3-time "^3.0.0"
|
1658 |
+
d3-timer "^3.0.1"
|
1659 |
+
|
1660 |
which@^2.0.1:
|
1661 |
version "2.0.2"
|
1662 |
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
|
|
|
1664 |
dependencies:
|
1665 |
isexe "^2.0.0"
|
1666 |
|
|
|
|
|
|
|
|
|
|
|
1667 |
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
|
1668 |
version "7.0.0"
|
1669 |
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|