From f05fb7540a1defb5fdd580e44c2af311dc2427d2 Mon Sep 17 00:00:00 2001 From: patrick Date: Sat, 4 Apr 2026 11:17:24 -0400 Subject: [PATCH] fix(profile): correct heatmap month labels --- public/heatmap.svg | 2 +- .../generate_heatmap_svg.cpython-314.pyc | Bin 0 -> 7368 bytes scripts/generate_heatmap_svg.py | 26 +++++++++++++----- 3 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 scripts/__pycache__/generate_heatmap_svg.cpython-314.pyc diff --git a/public/heatmap.svg b/public/heatmap.svg index dfb3386..71792f5 100644 --- a/public/heatmap.svg +++ b/public/heatmap.svg @@ -2,7 +2,7 @@ -Mar +Apr May Jun Jul diff --git a/scripts/__pycache__/generate_heatmap_svg.cpython-314.pyc b/scripts/__pycache__/generate_heatmap_svg.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74253c83b8b5449d00f4e644b567332f7389026a GIT binary patch literal 7368 zcmb6;X>1!;dT%&GayT4{hwjUwC|`_aQI=#|cOlD?Pua>?rfP>KON%3E))dLij4rmp za(kds;#PF)G)!S5Tx@_${QG3Hzd~mH zjBJ6gjH6^LrOK?OBayy>l>Ls^Mp+iBLmxVcAF<}_u!*b9~ zDAagRo{gVA8jQul{84FHlKHvTQ(+-;Yb-c*MXioTBXa8%ekRI0ubyi?%ZC>L&s4B= zNECwMRw)>fj!L{JOvjBa$4{PUKM|bD??K&(5g-ZQ%Xo|n}y6}pSnotXJq9f>#Rz)*_s{skRCe#Rh z_>Y4TePkmN2sd%bO)6A0#zz$DM^Y4EI2sJW(NQrtBgHTqjD*6xgtv3hsdRbZK!ctc zLFR*=wwM^57Q(zoni7SWEO}=52rt5c2WI)8JQs`wq=lKb*s{W6l!Zpo0;n3`lkol$ zC}*;))vngA)!(j98FsAYYs()lr>Zhm=YNxksa&gHtN*C}w~`6Qep=P5{|EDs*)&x= z9B9?U*8<!A;mEV%#x)#kFh zwdwMo*Z;KsXN?c++2)Q1!L0M-mc2V`?%trfU&1J~hg!VHH&E->zn$JvrSwK>@q+n; zseOu1SEW|0#-&;Sr36|c{E{4yg7UnG$pcP7_)zzdXHQ@G`FlTo?`Jo@L!OA)eh>5F z!&b>lLIGcPTxy}M8BG$c=0Xjw zo@&Kp=2JnBbmfJrki&5hB5re23ON^C0w92Pn8R9un&O2p=m`B(bUq?0Cg={RMNLoS zxxpkvWIiGZ^0J6Uy&XR3Bmm$8Bby}tIG((gZocdP%4*v&m#w^iw03wyj0;HZD{nL5sHCu_=>me)dQYl4bML0=X5e%& z<1S9Wu>_|daME5w2~PSASWJ_5x*ec;f%XP;VIM-UI#O+SmCDt|Y3K!|Y#PTW@=D^! z!kRH7i~u=!HTemQYevI92H3wBPZJu`nb1DuHBM`@{sLx^m?d!v!7ajWNRDa+V^K(O z(j_&ov3s$&=HKGk<0bM`m@_%qsVnTh30?RXgw$0@;4b}BOslF`F2!{RZa)2ANN$5@ zhgLXC}3gSjKa)_LMWga9m|3s2{*%hzDlcI*bo`Q!JB+o zQp|Ex4u%7mX(ffinZjV0pP-f1v5Fx&JuUIFx}1d7(Lpd^TGDhnI|rW7Y(T>-_P_{G zP)K?N0C?YGO^oI$8nPAc?Q+j%x#z*LYdjX6t}waE+7;$WRefscuVz<9bB>04%j?ryO~1Iy{h3BjlKIB!SX*3OOf~=cAMEY;%2xTj5>+=nt3hnlmbv-s z^4gR)ed_-8b>jYw^&dTM?9SP$KC#@fq~wi#?T>B8o*zK=mS=|%>qv}gQj2e*knjxw z*PxdXRchbv$;BwI?sX>EOZibjug3JdGBkOm*lO?>y&Ca4+q)Qmom zdM$YkrLqMhX)guP*#XyY8JBaG7iMN&cm$@r$MwKiP6ORc2b18`jRZOaT2;wdtz*T*iU*N+Ev7`{-Fl&_Ng)T3Z zd9lnpmpA8ya43NHDqe*7SK*WX4gkm`NX7@NAAI!V#MvC{SUbOZKDm^(XV{j+$PQbX zXiQD#-tT$ zPDjpBm#j;5r1;cidMF)E`=PbV@k~#e9M4F--tb+!j-7o~<{Ti23Gj+IRLU_nbQRu9 z9yG5TEl22mJGWO?17DVozNxza-Z$37FLA8@bcEuo3zZXyzkLHrd`SR8-D=v7E&R-i4N+t;~mgGc`fY+M(xcZB)$c!|xF_O@_S2!h0D!rsD`L!a0clT0$}V z{dS%F z8}?A)wZZC@uh|2*%Xkky{CrW<1)Cubzy{)0mvcej7f(gOVzfKkog#i! z#IL%XOLO6fG~k+*A%&N$iU z{2)&Ed-8)#{px6J_`u?UNjuiA;_~3;K`>&4?sm;A>Y&#EvlnIt6@qb-@MI&$q7n5? zkIR#M=qXmTxI8KfA~@?1Jri-0>WRiwPxKO0)t9{b-c`?D9Kvm<@Hi89?#x-uBo5;` zbL#TM#N{z;4;Az1d;jwK^$gR!%?xZZ0~zLb62m(cE$NX=#XE_y z9Y<4|%sBQZF67E;vt{mWi)Yh<9dHYFz}cR}2rQM-e@@+Jv+RLin6m6Kz;3BX5%*5t zr?Zyk&(CKqZHZBA&8w61$(hvkbwhe-{l^dIAI^OF?w1Q+&Vr@BO!x`NOn%}U+MZ(? z@7+q>SU>#Bz6VDi${Y0Q9PM~!Hkb{G;csoIW`BC@;gQGHqpRi>Y6ljl?#cJfS$6*l zk)zFP%qo+-mU=%mm9AYszJBOI^+tKmW4afDT{UNjmo%#GTV+=CJ8XGUx;OE0Jj=S$ z?`GM9yORUychkdZas9x0^#kKZdG}+w2PRkdeM=)-UFzs#>+uybztG)YSZ3g%J5zr8 zF+K8}M79$^r=I@P^FKMivb06jPs^uFe`%jr($?K4E-35Wm{ z-<@w?b?^JNu!k7(6+@k`dj}N95&vK6{G|HAe^;gMhwgEYpH^I32XCn2JEC~{XdH|F zD~TiFkJ>#Un2FWND`_`Yj(^F3Gc0;M<3*ogcgi@9`Mr`}#o#tP#W>=m+QWEdj!B>YsNP(g8KLD9!V2(KvyNe=O%C}QSR)sh-sR}30PML%~dB#7|%7a?LF zz}7*X0s8<&iQ6EO%?J_LR6q;&YdciTTCO&#QSG84gaDur5#zAjhww>%10aERjLhxM zweHpKKl&gwx@C0j(3Tu~cE?`vN!^{g{{l~+c@83Ke`2q^JN3!zo!Qj;AK%K@U5WEM zmfCx*>3F8DBV*}Ij6NyBLu?sqcdF{{b$-_UX?J?)eqW~Q(26-nmv7T`n{?ea?cAiD z>lF{F4cfUy52zjcHtBt-g)RCZEXP{D)gu#&wazwOvq{&aseG9R4OBnr??e&rQB3*bRlQ_NlHDolxj(4<75{q0n*c1mD@?ZWOVYiY*vKFu*z? z9~sAI7#417w=sg-PXSQKGehIzXY7#jeD+$l9-%iaQg3>CG?=8&m^mYN}4%{{I29ii|k` literal 0 HcmV?d00001 diff --git a/scripts/generate_heatmap_svg.py b/scripts/generate_heatmap_svg.py index dd2f21f..439a244 100644 --- a/scripts/generate_heatmap_svg.py +++ b/scripts/generate_heatmap_svg.py @@ -55,18 +55,30 @@ def weekday_row(day): return (day.weekday() + 1) % 7 -def month_labels(start, end): - labels = [(0, start.strftime("%b"))] - total_weeks = ((end - start).days // 7) + 1 +def month_labels(grid_start, visible_start, grid_end): + labels = [] + total_weeks = ((grid_end - grid_start).days // 7) + 1 for week in range(total_weeks): - week_start = start + timedelta(days=week * 7) + week_start = grid_start + timedelta(days=week * 7) + week_label = None + for offset in range(7): day = week_start + timedelta(days=offset) - if day.day == 1 and week != 0: - labels.append((week, day.strftime("%b"))) + if day < visible_start: + continue + + if week == 0 and week_label is None: + week_label = day.strftime("%b") + + if day.day == 1: + week_label = day.strftime("%b") break + if week_label is not None: + if not labels or labels[-1][1] != week_label: + labels.append((week, week_label)) + return labels @@ -108,7 +120,7 @@ def generate_svg(data): '', ] - for week, label in month_labels(aligned_start, aligned_end): + for week, label in month_labels(aligned_start, start, aligned_end): x = LEFT_PAD + (week * CELL) svg.append(f'{label}')