Commit
·
a61e08f
1
Parent(s):
a6d1411
refresh summary cards
Browse files- src/components/ProviderSummary.tsx +35 -6
- src/pages/index.tsx +3 -3
src/components/ProviderSummary.tsx
CHANGED
@@ -14,7 +14,8 @@ const ProviderSummary: React.FC<ProviderSummaryProps> = ({
|
|
14 |
}) => {
|
15 |
const providerName = provider.fullName || provider.authors[0];
|
16 |
const calendarKey = provider.authors[0];
|
17 |
-
const
|
|
|
18 |
|
19 |
const handleClick = () => {
|
20 |
const element = document.getElementById(`provider-${calendarKey}`);
|
@@ -23,13 +24,31 @@ const ProviderSummary: React.FC<ProviderSummaryProps> = ({
|
|
23 |
}
|
24 |
};
|
25 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
26 |
return (
|
27 |
<div
|
28 |
-
className="flex flex-col items-center min-w-0 flex-shrink-0 cursor-pointer"
|
29 |
onClick={handleClick}
|
30 |
>
|
31 |
-
{/* Logo Circle
|
32 |
<div className="relative">
|
|
|
|
|
|
|
|
|
|
|
33 |
{provider.avatarUrl ? (
|
34 |
<img
|
35 |
src={provider.avatarUrl}
|
@@ -41,11 +60,21 @@ const ProviderSummary: React.FC<ProviderSummaryProps> = ({
|
|
41 |
{providerName.charAt(0).toUpperCase()}
|
42 |
</div>
|
43 |
)}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
|
45 |
-
{/* Release Count
|
46 |
-
<div className="
|
47 |
-
{totalCount
|
48 |
</div>
|
|
|
|
|
49 |
</div>
|
50 |
</div>
|
51 |
);
|
|
|
14 |
}) => {
|
15 |
const providerName = provider.fullName || provider.authors[0];
|
16 |
const calendarKey = provider.authors[0];
|
17 |
+
const providerData = calendarData[calendarKey] || [];
|
18 |
+
const totalCount = providerData.reduce((sum, day) => sum + day.count, 0);
|
19 |
|
20 |
const handleClick = () => {
|
21 |
const element = document.getElementById(`provider-${calendarKey}`);
|
|
|
24 |
}
|
25 |
};
|
26 |
|
27 |
+
const getRankBadgeClasses = () => {
|
28 |
+
if (rank === 1) {
|
29 |
+
return "bg-gradient-to-br from-yellow-400 to-yellow-600 text-yellow-900";
|
30 |
+
}
|
31 |
+
if (rank === 2) {
|
32 |
+
return "bg-gradient-to-br from-gray-300 to-gray-500 text-gray-900";
|
33 |
+
}
|
34 |
+
if (rank === 3) {
|
35 |
+
return "bg-gradient-to-br from-amber-600 to-amber-800 text-amber-100";
|
36 |
+
}
|
37 |
+
return "bg-gradient-to-br from-blue-500 to-blue-700 text-white";
|
38 |
+
};
|
39 |
+
|
40 |
return (
|
41 |
<div
|
42 |
+
className="flex flex-col items-center min-w-0 flex-shrink-0 cursor-pointer group px-1"
|
43 |
onClick={handleClick}
|
44 |
>
|
45 |
+
{/* Logo Circle */}
|
46 |
<div className="relative">
|
47 |
+
{/* Rank Badge */}
|
48 |
+
<div className={`absolute -top-2 -left-2 ${getRankBadgeClasses()} text-xs font-bold rounded-full min-w-[24px] h-6 flex items-center justify-center px-1.5 shadow-lg border-2 border-background z-10`}>
|
49 |
+
#{rank}
|
50 |
+
</div>
|
51 |
+
|
52 |
{provider.avatarUrl ? (
|
53 |
<img
|
54 |
src={provider.avatarUrl}
|
|
|
60 |
{providerName.charAt(0).toUpperCase()}
|
61 |
</div>
|
62 |
)}
|
63 |
+
</div>
|
64 |
+
|
65 |
+
{/* Activity Info */}
|
66 |
+
<div className="mt-1.5 text-center space-y-0.5">
|
67 |
+
{/* Provider Name */}
|
68 |
+
<div className="text-xs font-medium text-foreground truncate max-w-20 text-center">
|
69 |
+
{providerName}
|
70 |
+
</div>
|
71 |
|
72 |
+
{/* Release Count */}
|
73 |
+
<div className="text-[10px] text-muted-foreground">
|
74 |
+
{totalCount} releases
|
75 |
</div>
|
76 |
+
|
77 |
+
|
78 |
</div>
|
79 |
</div>
|
80 |
);
|
src/pages/index.tsx
CHANGED
@@ -123,7 +123,7 @@ const OpenSourceHeatmap: React.FC<OpenSourceHeatmapProps> = ({
|
|
123 |
);
|
124 |
|
125 |
return (
|
126 |
-
<div className="w-full
|
127 |
<h1 className="text-3xl lg:text-5xl mt-16 font-bold text-center mb-2 text-foreground">
|
128 |
Hugging Face Heatmap 🤗
|
129 |
</h1>
|
@@ -134,9 +134,9 @@ const OpenSourceHeatmap: React.FC<OpenSourceHeatmapProps> = ({
|
|
134 |
</div>
|
135 |
|
136 |
{/* Provider Summary List */}
|
137 |
-
<div className="
|
138 |
<div className="overflow-x-auto scrollbar-hide">
|
139 |
-
<div className="flex gap-6 px-4 py-2 min-w-max">
|
140 |
{sortedProviders.map((provider, index) => (
|
141 |
<ProviderSummary
|
142 |
key={provider.fullName || provider.authors[0]}
|
|
|
123 |
);
|
124 |
|
125 |
return (
|
126 |
+
<div className="w-full p-4 py-16 relative">
|
127 |
<h1 className="text-3xl lg:text-5xl mt-16 font-bold text-center mb-2 text-foreground">
|
128 |
Hugging Face Heatmap 🤗
|
129 |
</h1>
|
|
|
134 |
</div>
|
135 |
|
136 |
{/* Provider Summary List */}
|
137 |
+
<div className="mb-16 mx-auto">
|
138 |
<div className="overflow-x-auto scrollbar-hide">
|
139 |
+
<div className="flex gap-6 px-4 py-2 min-w-max justify-center">
|
140 |
{sortedProviders.map((provider, index) => (
|
141 |
<ProviderSummary
|
142 |
key={provider.fullName || provider.authors[0]}
|