@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.
@@ -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
@@ -31,5 +31,5 @@
31
31
  "typecheck": "tsc --noEmit"
32
32
  },
33
33
  "type": "module",
34
- "version": "2.2.0"
34
+ "version": "2.3.0"
35
35
  }
@@ -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;