@urmzd/github-insights 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.githooks/.sr-hooks-hash +1 -0
- package/.githooks/commit-msg +0 -1
- package/.githooks/pre-commit +0 -1
- package/CHANGELOG.md +17 -0
- package/assets/insights/metrics-growth.svg +55 -0
- package/assets/insights/metrics-heatmap.svg +55 -0
- package/examples/classic/metrics-growth.svg +55 -0
- package/examples/classic/metrics-heatmap.svg +55 -0
- package/examples/ecosystem/metrics-growth.svg +55 -0
- package/examples/ecosystem/metrics-heatmap.svg +55 -0
- package/examples/minimal/metrics-growth.svg +55 -0
- package/examples/minimal/metrics-heatmap.svg +55 -0
- package/examples/modern/metrics-growth.svg +55 -0
- package/examples/modern/metrics-heatmap.svg +55 -0
- package/package.json +1 -1
- package/src/components/contribution-heatmap.tsx +43 -0
- package/src/components/growth-arc.tsx +119 -0
- package/src/types.ts +6 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="808" height="185" viewBox="0 0 808 185"><defs><style>
|
|
2
|
+
.t { font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif; font-variant-numeric: tabular-lining; }
|
|
3
|
+
.t-h { font-size: 14px; fill: #c9d1d9; letter-spacing: 2px; font-weight: 600; }
|
|
4
|
+
.t-sub { font-size: 11px; fill: #6e7681; }
|
|
5
|
+
.t-label { font-size: 12px; fill: #8b949e; }
|
|
6
|
+
.t-value { font-size: 11px; fill: #6e7681; }
|
|
7
|
+
.t-subhdr { font-size: 11px; fill: #8b949e; letter-spacing: 1px; font-weight: 600; }
|
|
8
|
+
.t-stat-label { font-size: 10px; fill: #8b949e; font-weight: 600; }
|
|
9
|
+
.t-stat-value { font-size: 22px; font-weight: 700; }
|
|
10
|
+
.t-card-title { font-size: 12px; fill: #58a6ff; font-weight: 700; }
|
|
11
|
+
.t-card-detail { font-size: 11px; fill: #8b949e; }
|
|
12
|
+
.t-pill { font-size: 11px; font-weight: 600; }
|
|
13
|
+
.t-bullet { font-size: 12px; fill: #c9d1d9; }
|
|
14
|
+
.bg-fill { fill: #0d1117; }
|
|
15
|
+
.card-fill { fill: #161b22; }
|
|
16
|
+
.border-stroke { stroke: #30363d; }
|
|
17
|
+
|
|
18
|
+
@media (prefers-color-scheme: light) {
|
|
19
|
+
.bg-fill { fill: #ffffff; }
|
|
20
|
+
.card-fill { fill: #f6f8fa; }
|
|
21
|
+
.border-stroke { stroke: #d0d7de; }
|
|
22
|
+
.t-h { fill: #1f2328; }
|
|
23
|
+
.t-sub { fill: #656d76; }
|
|
24
|
+
.t-label { fill: #656d76; }
|
|
25
|
+
.t-value { fill: #656d76; }
|
|
26
|
+
.t-subhdr { fill: #656d76; }
|
|
27
|
+
.t-stat-label { fill: #656d76; }
|
|
28
|
+
.t-card-title { fill: #0969da; }
|
|
29
|
+
.t-card-detail { fill: #656d76; }
|
|
30
|
+
.t-bullet { fill: #1f2328; }
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@keyframes fadeIn {
|
|
34
|
+
from { opacity: 0; transform: translateY(8px); }
|
|
35
|
+
to { opacity: 1; transform: translateY(0); }
|
|
36
|
+
}
|
|
37
|
+
@keyframes scaleIn {
|
|
38
|
+
from { transform: scale(0); opacity: 0; }
|
|
39
|
+
to { transform: scale(1); opacity: 1; }
|
|
40
|
+
}
|
|
41
|
+
@keyframes drawPath {
|
|
42
|
+
from { stroke-dashoffset: var(--path-length); }
|
|
43
|
+
to { stroke-dashoffset: 0; }
|
|
44
|
+
}
|
|
45
|
+
@keyframes radarReveal {
|
|
46
|
+
from { transform: scale(0); opacity: 0; }
|
|
47
|
+
to { transform: scale(1); opacity: 0.6; }
|
|
48
|
+
}
|
|
49
|
+
.fade-1 { animation: fadeIn 0.6s ease-out 0.1s both; }
|
|
50
|
+
.fade-2 { animation: fadeIn 0.6s ease-out 0.25s both; }
|
|
51
|
+
.fade-3 { animation: fadeIn 0.6s ease-out 0.4s both; }
|
|
52
|
+
.fade-4 { animation: fadeIn 0.6s ease-out 0.55s both; }
|
|
53
|
+
.fade-5 { animation: fadeIn 0.6s ease-out 0.7s both; }
|
|
54
|
+
.fade-6 { animation: fadeIn 0.6s ease-out 0.85s both; }
|
|
55
|
+
</style></defs><rect width="808" height="185" rx="12" class="bg-fill" fill="#0d1117"/><text x="24" y="40" class="t t-h">CONTRIBUTION ACTIVITY</text><text x="24" y="56" class="t t-sub">Contribution patterns over the past year</text><rect x="24" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="24" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="24" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="24" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="24" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="24" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="24" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="37" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="37" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="37" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="37" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="37" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="37" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="37" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="50" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="50" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="50" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="50" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="50" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="50" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="50" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="63" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="63" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="63" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="63" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="63" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="63" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="63" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="76" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="76" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="76" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="76" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="76" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="76" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="76" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="89" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="89" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="89" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="89" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="89" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="89" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="89" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="102" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="102" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="102" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="102" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="102" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="102" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="102" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="115" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="115" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="115" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="115" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="115" y="118" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-2"/><rect x="115" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="115" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="128" y="66" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-3"/><rect x="128" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="128" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="128" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="128" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="128" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="128" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="141" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="141" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="141" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="141" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="141" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="141" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="141" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="154" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="154" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="154" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="154" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="154" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="154" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="154" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="167" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="167" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="167" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="167" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="167" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="167" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="167" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="180" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="180" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="180" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="180" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="180" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="180" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="180" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="193" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="193" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="193" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="193" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="193" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="193" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="193" y="144" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-2"/><rect x="206" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="206" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="206" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="206" y="105" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-3"/><rect x="206" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="206" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="206" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="219" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="219" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="219" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="219" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="219" y="118" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-4"/><rect x="219" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="219" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="232" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="232" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="232" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="232" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="232" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="232" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="232" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="245" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="245" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="245" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="245" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="245" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="245" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="245" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="258" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="258" y="79" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-1"/><rect x="258" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="258" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="258" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="258" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="258" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="271" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="271" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="271" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="271" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="271" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="271" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="271" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="284" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="284" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="284" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="284" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="284" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="284" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="284" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="297" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="297" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="297" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="297" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="297" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="297" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="297" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="310" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="310" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="310" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="310" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="310" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="310" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="310" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="323" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="323" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="323" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="323" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="323" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="323" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="323" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="336" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="336" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="336" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="336" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="336" y="118" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-1"/><rect x="336" y="131" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-1"/><rect x="336" y="144" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-1"/><rect x="349" y="66" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-2"/><rect x="349" y="79" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-2"/><rect x="349" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="349" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="349" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="349" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="349" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="362" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="362" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="362" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="362" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="362" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="362" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="362" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="375" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="375" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="375" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="375" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="375" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="375" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="375" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="388" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="388" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="388" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="388" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="388" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="388" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="388" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="401" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="401" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="401" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="401" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="401" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="401" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="401" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="414" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="414" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="414" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="414" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="414" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="414" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="414" y="144" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-1"/><rect x="427" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="427" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="427" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="427" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="427" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="427" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="427" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="440" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="440" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="440" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="440" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="440" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="440" y="131" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-3"/><rect x="440" y="144" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-3"/><rect x="453" y="66" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-4"/><rect x="453" y="79" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-4"/><rect x="453" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="453" y="105" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-4"/><rect x="453" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="453" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="453" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="466" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="466" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="466" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="466" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="466" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="466" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="466" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="479" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="479" y="79" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-6"/><rect x="479" y="92" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-6"/><rect x="479" y="105" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-6"/><rect x="479" y="118" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-6"/><rect x="479" y="131" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-6"/><rect x="479" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="492" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="492" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="492" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="492" y="105" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-1"/><rect x="492" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="492" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="492" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="505" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="505" y="79" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-2"/><rect x="505" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="505" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="505" y="118" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-2"/><rect x="505" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="505" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="518" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="518" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="518" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="518" y="105" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-3"/><rect x="518" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="518" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="518" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="531" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="531" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="531" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="531" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="531" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="531" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="531" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-4"/><rect x="544" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="544" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="544" y="92" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="544" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="544" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="544" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="544" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-5"/><rect x="557" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="557" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="557" y="92" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-6"/><rect x="557" y="105" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-6"/><rect x="557" y="118" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-6"/><rect x="557" y="131" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-6"/><rect x="557" y="144" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="570" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="570" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="570" y="92" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-1"/><rect x="570" y="105" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-1"/><rect x="570" y="118" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-1"/><rect x="570" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-1"/><rect x="570" y="144" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-1"/><rect x="583" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="583" y="79" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-2"/><rect x="583" y="92" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-2"/><rect x="583" y="105" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-2"/><rect x="583" y="118" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-2"/><rect x="583" y="131" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-2"/><rect x="583" y="144" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-2"/><rect x="596" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="596" y="79" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-3"/><rect x="596" y="92" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-3"/><rect x="596" y="105" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-3"/><rect x="596" y="118" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-3"/><rect x="596" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="596" y="144" width="11" height="11" rx="2" fill="#216e39" opacity="0.85" class="fade-3"/><rect x="609" y="66" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-4"/><rect x="609" y="79" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-4"/><rect x="609" y="92" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-4"/><rect x="609" y="105" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-4"/><rect x="609" y="118" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-4"/><rect x="609" y="131" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-4"/><rect x="609" y="144" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-4"/><rect x="622" y="66" width="11" height="11" rx="2" fill="#216e39" opacity="0.85" class="fade-5"/><rect x="622" y="79" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-5"/><rect x="622" y="92" width="11" height="11" rx="2" fill="#40c463" opacity="0.85" class="fade-5"/><rect x="622" y="105" width="11" height="11" rx="2" fill="#30a14e" opacity="0.85" class="fade-5"/><rect x="622" y="118" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-5"/><rect x="622" y="131" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-5"/><rect x="622" y="144" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-5"/><rect x="635" y="66" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="635" y="79" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="635" y="92" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-6"/><rect x="635" y="105" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-6"/><rect x="635" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="635" y="131" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-6"/><rect x="635" y="144" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-6"/><rect x="648" y="66" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-1"/><rect x="648" y="79" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-1"/><rect x="648" y="92" width="11" height="11" rx="2" fill="#40c463" opacity="0.85" class="fade-1"/><rect x="648" y="105" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-1"/><rect x="648" y="118" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-1"/><rect x="648" y="131" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-1"/><rect x="648" y="144" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-1"/><rect x="661" y="66" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-2"/><rect x="661" y="79" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-2"/><rect x="661" y="92" width="11" height="11" rx="2" fill="#40c463" opacity="0.85" class="fade-2"/><rect x="661" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="661" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-2"/><rect x="661" y="131" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-2"/><rect x="661" y="144" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-2"/><rect x="674" y="66" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-3"/><rect x="674" y="79" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-3"/><rect x="674" y="92" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-3"/><rect x="674" y="105" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="674" y="118" width="11" height="11" rx="2" fill="#ebedf0" opacity="0.85" class="fade-3"/><rect x="674" y="131" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-3"/><rect x="674" y="144" width="11" height="11" rx="2" fill="#30a14e" opacity="0.85" class="fade-3"/><rect x="687" y="66" width="11" height="11" rx="2" fill="#30a14e" opacity="0.85" class="fade-4"/><rect x="687" y="79" width="11" height="11" rx="2" fill="#40c463" opacity="0.85" class="fade-4"/><rect x="687" y="92" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-4"/><rect x="687" y="105" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-4"/><rect x="687" y="118" width="11" height="11" rx="2" fill="#40c463" opacity="0.85" class="fade-4"/><rect x="687" y="131" width="11" height="11" rx="2" fill="#40c463" opacity="0.85" class="fade-4"/><rect x="687" y="144" width="11" height="11" rx="2" fill="#216e39" opacity="0.85" class="fade-4"/><rect x="700" y="66" width="11" height="11" rx="2" fill="#30a14e" opacity="0.85" class="fade-5"/><rect x="700" y="79" width="11" height="11" rx="2" fill="#9be9a8" opacity="0.85" class="fade-5"/></svg>
|
package/package.json
CHANGED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Fragment, h } from "../jsx-factory.js";
|
|
2
|
+
import { LAYOUT } from "../theme.js";
|
|
3
|
+
import type { ContributionCalendar, RenderResult } from "../types.js";
|
|
4
|
+
|
|
5
|
+
export function renderContributionHeatmap(
|
|
6
|
+
calendar: ContributionCalendar,
|
|
7
|
+
y: number,
|
|
8
|
+
): RenderResult {
|
|
9
|
+
if (calendar.weeks.length === 0) return { svg: "", height: 0 };
|
|
10
|
+
|
|
11
|
+
const { padX } = LAYOUT;
|
|
12
|
+
const cellSize = 11;
|
|
13
|
+
const cellGap = 2;
|
|
14
|
+
const step = cellSize + cellGap;
|
|
15
|
+
|
|
16
|
+
const rows = 7;
|
|
17
|
+
const chartHeight = rows * step;
|
|
18
|
+
const totalHeight = chartHeight + 4;
|
|
19
|
+
|
|
20
|
+
const svg = (
|
|
21
|
+
<>
|
|
22
|
+
{/* Heatmap cells */}
|
|
23
|
+
{calendar.weeks.map((week, wi) =>
|
|
24
|
+
week.contributionDays.map((day, di) => (
|
|
25
|
+
<rect
|
|
26
|
+
x={padX + wi * step}
|
|
27
|
+
y={y + di * step}
|
|
28
|
+
width={cellSize}
|
|
29
|
+
height={cellSize}
|
|
30
|
+
rx="2"
|
|
31
|
+
fill={day.color}
|
|
32
|
+
opacity="0.85"
|
|
33
|
+
className={`fade-${Math.min((wi % 6) + 1, 6)}`}
|
|
34
|
+
/>
|
|
35
|
+
)),
|
|
36
|
+
)}
|
|
37
|
+
</>
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
return { svg, height: totalHeight };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
void Fragment;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { Fragment, h } from "../jsx-factory.js";
|
|
2
|
+
import { escapeXml } from "../svg-utils.js";
|
|
3
|
+
import { LAYOUT, THEME } from "../theme.js";
|
|
4
|
+
import type { GrowthArcPoint, RenderResult } from "../types.js";
|
|
5
|
+
|
|
6
|
+
export function renderGrowthArc(
|
|
7
|
+
points: GrowthArcPoint[],
|
|
8
|
+
y: number,
|
|
9
|
+
): RenderResult {
|
|
10
|
+
if (points.length < 2) return { svg: "", height: 0 };
|
|
11
|
+
|
|
12
|
+
const { padX } = LAYOUT;
|
|
13
|
+
const chartWidth = 760;
|
|
14
|
+
const chartHeight = 120;
|
|
15
|
+
const labelHeight = 20;
|
|
16
|
+
const totalHeight = chartHeight + labelHeight;
|
|
17
|
+
|
|
18
|
+
const maxComplexity = Math.max(...points.map((p) => p.avgComplexity));
|
|
19
|
+
const minComplexity = Math.min(...points.map((p) => p.avgComplexity));
|
|
20
|
+
const range = maxComplexity - minComplexity || 1;
|
|
21
|
+
|
|
22
|
+
const stepX = chartWidth / Math.max(points.length - 1, 1);
|
|
23
|
+
|
|
24
|
+
// Compute point positions
|
|
25
|
+
const coords = points.map((p, i) => ({
|
|
26
|
+
x: padX + i * stepX,
|
|
27
|
+
y:
|
|
28
|
+
y +
|
|
29
|
+
chartHeight -
|
|
30
|
+
((p.avgComplexity - minComplexity) / range) * (chartHeight - 20) -
|
|
31
|
+
10,
|
|
32
|
+
...p,
|
|
33
|
+
}));
|
|
34
|
+
|
|
35
|
+
// Build smooth path
|
|
36
|
+
let pathD = `M ${coords[0].x},${coords[0].y}`;
|
|
37
|
+
for (let i = 1; i < coords.length; i++) {
|
|
38
|
+
const prev = coords[i - 1];
|
|
39
|
+
const curr = coords[i];
|
|
40
|
+
const cpx = (prev.x + curr.x) / 2;
|
|
41
|
+
pathD += ` C ${cpx},${prev.y} ${cpx},${curr.y} ${curr.x},${curr.y}`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Build filled area path
|
|
45
|
+
let areaD = pathD;
|
|
46
|
+
areaD += ` L ${coords[coords.length - 1].x},${y + chartHeight}`;
|
|
47
|
+
areaD += ` L ${coords[0].x},${y + chartHeight} Z`;
|
|
48
|
+
|
|
49
|
+
const svg = (
|
|
50
|
+
<>
|
|
51
|
+
{/* Filled area under curve */}
|
|
52
|
+
<path d={areaD} fill="#58a6ff" fill-opacity="0.15" className="fade-1" />
|
|
53
|
+
|
|
54
|
+
{/* Line */}
|
|
55
|
+
<path
|
|
56
|
+
d={pathD}
|
|
57
|
+
fill="none"
|
|
58
|
+
stroke="#58a6ff"
|
|
59
|
+
stroke-width="2.5"
|
|
60
|
+
stroke-linecap="round"
|
|
61
|
+
stroke-linejoin="round"
|
|
62
|
+
className="fade-1"
|
|
63
|
+
/>
|
|
64
|
+
|
|
65
|
+
{/* Data points */}
|
|
66
|
+
{coords.map((p, i) => (
|
|
67
|
+
<circle
|
|
68
|
+
cx={p.x}
|
|
69
|
+
cy={p.y}
|
|
70
|
+
r="4"
|
|
71
|
+
fill="#58a6ff"
|
|
72
|
+
className={`fade-${Math.min(i + 1, 6)}`}
|
|
73
|
+
/>
|
|
74
|
+
))}
|
|
75
|
+
|
|
76
|
+
{/* Point labels (complexity value) */}
|
|
77
|
+
{coords.map((p) => (
|
|
78
|
+
<text
|
|
79
|
+
x={p.x}
|
|
80
|
+
y={p.y - 10}
|
|
81
|
+
className="t t-value"
|
|
82
|
+
text-anchor="middle"
|
|
83
|
+
font-size="10"
|
|
84
|
+
>
|
|
85
|
+
{p.avgComplexity.toFixed(0)}
|
|
86
|
+
</text>
|
|
87
|
+
))}
|
|
88
|
+
|
|
89
|
+
{/* X-axis labels (relative time) */}
|
|
90
|
+
{coords.map((p) => (
|
|
91
|
+
<text
|
|
92
|
+
x={p.x}
|
|
93
|
+
y={y + chartHeight + 14}
|
|
94
|
+
className="t t-value"
|
|
95
|
+
text-anchor="middle"
|
|
96
|
+
>
|
|
97
|
+
{escapeXml(p.label)}
|
|
98
|
+
</text>
|
|
99
|
+
))}
|
|
100
|
+
|
|
101
|
+
{/* Repo count annotations */}
|
|
102
|
+
{coords.map((p) => (
|
|
103
|
+
<text
|
|
104
|
+
x={p.x}
|
|
105
|
+
y={y + chartHeight + 24}
|
|
106
|
+
className="t t-muted"
|
|
107
|
+
text-anchor="middle"
|
|
108
|
+
font-size="9"
|
|
109
|
+
>
|
|
110
|
+
{`${p.repoCount} repo${p.repoCount !== 1 ? "s" : ""}`}
|
|
111
|
+
</text>
|
|
112
|
+
))}
|
|
113
|
+
</>
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
return { svg, height: totalHeight + 10 };
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
void Fragment;
|
package/src/types.ts
CHANGED
|
@@ -166,6 +166,12 @@ export interface ContributionRhythm {
|
|
|
166
166
|
|
|
167
167
|
// ── Project constellation ─────────────────────────────────────────────────
|
|
168
168
|
|
|
169
|
+
export interface GrowthArcPoint {
|
|
170
|
+
label: string;
|
|
171
|
+
avgComplexity: number;
|
|
172
|
+
repoCount: number;
|
|
173
|
+
}
|
|
174
|
+
|
|
169
175
|
export interface ConstellationNode {
|
|
170
176
|
name: string;
|
|
171
177
|
url: string;
|