From de2ef10129b44d79fcb855133bddb145c1e137f5 Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Mon, 27 Apr 2026 15:39:54 +0200 Subject: [PATCH] fix(brand): home tile = Element 1 with #000 bg, drop tile lavender MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Iterating-by-paint-over wasn't working. Going back to first principles: the brand IS the badge — full Element 1 mass, mark with its own internal padding, dark frame around it. That's what reads as "Backspace" on every other surface (dock, taskbar, favicon, apple- touch). The sidebar home tile should look the same. The earlier "ugly grey" complaint about Element 1 in the sidebar came down to one specific colour mismatch: the source SVG's #1d1d1b (warm near-black) sat next to the sidebar's #1a1a23 (cool near-black) and read as an off-grey rectangle. Fix: in the generator, do a string-replace `#1d1d1b → #000000` on app-icon.svg before rendering logo.png only — every other output (.icns, .ico, favicons, PWA) keeps the original brand `#1d1d1b`. Pure black against the sidebar's #1a1a23 reads as a deliberately darker tile, not a hue mismatch. Reverts the SpaceSidebar lavender-tile workaround: with the badge filling the tile via object-cover, the button's overflow-hidden + rounded-[20px → 13px] morph already animates the badge cleanly. backgroundStyle for type === 'dm' returns undefined again; deps trim back to what they were. Determinism gate verified — only logo.png changed (other 21 outputs byte-identical across two regen runs). --- packages/web/public/icons/logo.png | Bin 10387 -> 12523 bytes .../src/components/layout/SpaceSidebar.tsx | 24 ++++++------------ scripts/gen-icons.README.md | 4 +-- scripts/gen-icons.mjs | 22 +++++++++------- 4 files changed, 23 insertions(+), 27 deletions(-) diff --git a/packages/web/public/icons/logo.png b/packages/web/public/icons/logo.png index cfeff7c2f4e82589177dab60d2c37f67ee51387e..52eeb5fefc3dda3232930fd2a6f0bd639c0dc504 100644 GIT binary patch literal 12523 zcmX9_by!r-_rAOABD-|AG$BpoElk3M`<6fFLCxu>y+H zNcZo4zP~^Ax%WQLoI7V`?wonw_neK_)qX^Xq(cG#K&Ymwqz?cP@D>8#;er8~P5A!$9Wp;NP$31uR0>e)i zB@Vma>gv8#Ny?#WSxx+%Xq!k$5U#?$23-?fyT2xb13Mu6sFSbJYOrDCuxVjlAbFZ2 z_)<^&%Z~=ZQJN{*-oz|nK?Gsc_^@K4OJdM_@5}|UCe}o~_bs7X67m$wvrJ!M*d2R3*(p6Q zF*LKVeZMZ@V|X}X0Ef;ea^l`DxBjLB_j>IZwL+8@2_0g*{ajlcGWU&{JX%G_pceaF z`NJii0*@83Xx3ZYTQ)k2$O+^bou%GusK;A*4!oMa$A575(zN9z9h zB3}ycRspnSMsW`>%*W%m$P(9m&IAoHdvyCv( zxe{yK&&JDpm*LPlr$PDc#nmV+SDCuuVI2B=Kf8HW>KLKSc`5sw(I?qL?t;HHEffEe zQ`=k(xzLEQzK94_u|w^Vl8IX0!7MaThdG#-9$|?2_+%&B!tkd*{7@=6Id!bCnptNn z)yU8&c95XBZ$SY6N1Z-opOUp(gWE&4{sNZjjGk6(ahuoev0~G_D@VRuAg>zN9$Q7d zyM~Ot_U=2Ucu?5M;UgDK{1;@jcSmKDy)F(XJ=achzvB?BDrsgBZU;b zvvq}S@S)Dj3hJBxMy|2pK9DLwkHwe>gz`CRnQ#kwe`FgV%+K#jnWvfjL51T!pf=}2 z8~H2~XQE~bFlpIB92(6gGJWfCc_dtO8>JK_$!BBM7!j@3+)-h%Or!FIyI8e&b?6Nn zmrtA5guk`=MX`;cUxwV!2`?6z^(twPXM42;w$ybToZt03!i@rFWg zNNg9) zf9Z1O(URW>`8sQ`@0XN1*Ym=g%qrJluJteM#9ca~E0Iux$YvMDMX)JBsx`Jy;%uvE z`Nm%>9f2u;>iY`2FG6eSr9Js}S!zGaX`ZLSiu9m!oh)R*;#+L>KR6WZJ}>6~nR&v_ zO-t)~c$ND>6X3cp@Tc9K8p2^(S8Tw*_hCy^4F%dz%g`Du;SlGvc;BwxyZz7xnrzS`&YG zbP|gdv$@iW;MqL3^0w&q!1pIBOa)W{4|Cd>_O z@k4BX^|8rlwumjQW1VG0-g|p0`)#Z#P1={b?lgg-!MS9gMuxar#>@VN61fhaKM5y% z;pxubS06P!oh03vlk?vaPr2?{6ZFF}@a8ruBF~ofNx4=?_6{9E2^A{DkFDQLtc8@5vl*4c8d5zuy_E&-vR z6)@WSq#m1O(lJ5%DpA?n*mgGk^L9!HqsZTbiFjMx@BTk2en1- z`!vaS&SpAKl|(5W4!G-k;cULs?Rq)<=u1`=`!BeMItBlWD_(x)@NSATD(5ll(Xl&I zbc7R)hXO66Lu?w*xq4QL5yxGn-YaF{zm2{I?~IVe%s05zyfvoiMr=<3Zvp`Q*pGGY z!Ns{GO8W;_&)_A*If;oFu#z!+uNx)9IM*Ah^(PBnx9JUWa~f^5OkQj!5dPJuxdHWf zmz(3;;osc5^NFi%B+9x7c*P`}aKEKdx7167&WW&8>EI!aoO3tD(VIXh7CP504O_!~ zFrD57mA*9osURlgdbA^ghF=>jb{%MD0}9Z$6YmwNYXXEh^#$HL#>^a^IG6!HGG7$g zZ&~F`ocdY-yFTPS1-&@2jToJQuH5lxJgl2TsBFM-Mo za;2(sMXC)5`GXtA$QGNN2ED~u;YMF~LQNq_4ZRr?W z-;?jT_}F_(ZKFcAixi7J#}*3F!0$1yqUWKE{nbX^ZswlsiV!!;Ac`ePg2ztQ=R`Kj z>`P6ff}vj+q}#47;(*%5!5c_u>}1>KJ;JB04iKi)VnCFSNa29Bbb4l7l?=uCM(jrc z{1%@Die0%1b;ku;_Krs+!Z5V+PDBWl!Ost_4BJ^hf96y7!32CJ?lp%NSV(vmdldHx zJmgMBQgW9loHwQOTSI;&$qxR(`6a7+bDPdLo?4i$JAn7(7RP$)o^DZ*Qp=vtt=3@N zvXBr3x@wKo_X%+-@DO>!kzjYd@kZIFrpcIt_M+&>!6UTPgq< z&6CtQ2{W$Hg(Oh(^^R?+1>Bw(e+<6HU+%tuKexI`{LUXXDGu4si!$I{!79FjjPu74 zsGnsUkZgLB?rvQR+DGDy{_v4U^iP_JWo>2)59(~kB(5H` zuCUc`cF7u!PxUEh#`WOjIQZ)7#{cSQS1g|db1<#MT7deL78@{`a(RK8BP#6w5|~>r zIPsYNiW z16%nPuVu{r<}Vg2AM<<+IiTygy(qUrqAJPjF7ph@ZGIm4R=7{1>^Hs_-A$XK#AI^x zRzBcWho0T)Sp;I6e`LY?cx<6_?PK`uUc;?ZBXe!I1#-a=a$&a`dvIpTJGNx|PRjDL zb9)Y~&J}@AR@IHQje)!l&M{S>k~93~YG2Mn6&VH|bvt3Gppulma&_%bp9j{))ChifRz9j}SF;=IHIKJH&3IbMgHB3-&PRIsk)anU_@BkC zvFNFWotb3=uNWngRzI)Hp}gkmex6j|0Px4J&PqYktEDlAE(N9WoRZ9HS8yTuu1mjf+t8 zm^}T6-d|*qOVNmO${uNID#9V1L?CB1Ucq-yltQ3j&01Sn6+8Ve4%F;usqc4-wYL18UTU81$&qlQ>)2jzyG0e; zv+PJr$K%*~H4*|hVM$RC;I$$fn9-c5_H_06J59d!=qu*S=iHy2JQjS=eVf?eY&tRB zpS`S{;KaEbxRPO7^;@6GEOvx3@ylxZL7=J~H?W-_W);WYU4e&2*?_3zbKCdh62e=2 zS}trRIsW}*Qcesq9#&7FCPL5oe{|I3Ol5LsRu%NJ+BktPn`lxKTI{;c);c=vgL&*Z zKCJHaiS6K_xIX^Aq5$(aIZ_t=Nho|F`)_ADf2>mjE zCyAuQaEH0k#|hW(aAenSq)Ro@b&P?r(NQ(Pv^cbrDBubk_=TPN9$JrWz~$2h&*RE; z0myXqc^4S9tR{SP_v-PM{jI1V`{be33&$DP-ZWG^`L#gKw7UlM%#2sk$DwMTe}D5_ zM*%JnHp))8Fl1il}c=EtA#nhgn9LWHZAa$x(9?`K+e zuFa=?4;cIJ#4ppyud$V){ft2UAZ8NbHXtpaC&H%&py;0LjLAYtp!G(HZwyU zGG)6i>utihw4S{N!)uQcPV2)oVDh8jJ(uXvTH8K220!3SN87OI-BK=e2d9=A@TRg} z)B_Ly?39VC^&UjL#_WS2oLv>5O<%m}W+4hv!l%Ui=8$*mlJ9=1-R}Jh3>3|kV(buy zY;rjtSnkCAUVeSRT&z>W3F_?lkQ{-cjS5aC=LW3$dmLwi8Zz^BbO5iLB}o=^d`sFp zwd<3aaRoTG#W!ofJ&^_C@SA=H_%VBiPl+-c!*UgA~OQ}{i zmY*LJr~-dwj5=%Z$vA;-BIXSmcQ3rF65!0pmJFSW4Zrm0NKB|{*25@srf)pbsnwZ-thWBgsWK$}o>3+YWBu8EzUgt!PzjtQ_y+kULuj%uCx#uJm@T-hmko575@ggA z@;L3?fZofO1n~iPuYR<)|8%;06$vK^KcM3_tf(ke1{agocB#Hl0CIG#*Uet{M94o( z5BLvETZ3^z_;mNcF6~V0C$ufogMOy!JNm>(gcIVR#MWp8VxV^$hVvKg4hygNkwvJR zzKi=nSa#WI7}M3isl7h9$JPbTd!=l@EDSD1` zitmPb%mCs&4voi=6q25G2m~`5fr+J@9+XDTquA}biGJ^&GGt#%D~JuP0LN!}cm>OC z3&*3zq{Z@=a?2z0CFbK`DQ}DiL86&(j+pSTb-T`!8Tgw3)wSiU41()6sp=^e%BD$r zenv8%AGn(MHAFsRbXS26X}l#E#Y?fx3C~k8FG*dztQtIIQPbQI6K=={U zT)2SGp@#t(N`>NqiD5QSz3|1DGml?@n;bo&5WYkOtVH;Wu#ooLo|N-~2vJOpi%S&2 ze0UC&z$PkRhnPp4L*G7xROg4I{Nb47jqc02kO0~W4sAGpdgg3w5 zpcSUuScZ`Lc2X>?_lpEmMp!E;^+pY_CjNkAR{##V+|pZ9T$1mr!?6OsvAcLhVb{0; znO6+qW!i?{pdLSVi|Z*v)PMy`l6Nb~YfpAu!(Giw!3ecpNe@klyq!--SL2QXLWp6i z!-^MV|GAwG+hVC@H+d^5H?&~fJ&1Y(tcU&6jR(w{oa4nltTeo>zJ09>KyG5^Vu*3N zkYQw~0V%-J_#8$C=GMCxAuIuo_kEg^Dd~7$5H0B1 z5jon3Z;nM1psES_V%;9cC|#lnOsP~)YeV*PNyy0ld3wF1!psX%>oz&-brFVM*AF)ikNxwEQHM6k551E zJ)Ybn;tRej_!5x3Q%jQDO0+$6Ny1Thq16Gbp6WFcl*DZE?oN?TvMb1+SrTG@z z;)f_wea*@{aZAOGUgsJ&CDjo^29crlC0n*)n5nLMgYBacHYhRkjIfwYLMd)ajBX}d z(PQYJZ*OCT?<*s)=Z(hBlWhpNGy*H+Hqnv%A#!0uQ^CTWISt{|1^5+b^vA_CnAO%MJ_9SB%rC_JB0G+SX)_&tRHL z^&v;~bXAs6JVL^2M+itsjD5Bi@+0$L`)ZEXBAR#YW3i!59;5tsi@QBRk)n0Wq&c)3 zJWMl?m;tYJKLqydU~PpLE%sr#I7{m}(o2R4C7L;E&{c`RJ!K>`=Hgd^S*ZkII2cZo zvy_4UOHG3(*Vp3$BF`!efhE2emn@*KuP^!v2GTC-Af#?FpfsZg(oJS$L%*f0K1$;A zOS%#_S~kNP3&xf2)ls5+qu;82Fl*9D-Jv%MW}W88d-s&<-1tBX?F|pKzu>2XR9HfwDRzKA{qxjut{#yX~$aizfVz8Vr=K` z1Ww%W9$jY6(s}YH@q7n^&DV#Stl&8P{QMNGak|6KUoFEbPyjBj9Z^xDl(zv7tj_km zSfz1oso-hD(-(UgNc0Ata|W=`;?83Tgs_ohq3(F&BZFw+DLh%(Pt^}Lp1C#wA6r#y zM~h6ihup_1S@ed7Ox^>d=0_6`AT%^I*evTX%5KUt(|;PmuCsYiYfi}e&}&82LNdGE zr`3QF{}C#wvMeW%f5cFa8{INi-ONvo8FB659Y&28q{7z8&=tx8cdv3d(PKQJHp>fU zZ>@bZ`AqfR17>0^ld_O^R|IFqnLgM-;xxULYH)`X0U(@bt0o(7Zi}U3LucT(ynRCM z?J!<;o>8Jfn`yv}rs92s+Ja%Y6nuP|+~D$e7efiizYtJxqCwV={Hx>FB4)h=o$J{V zcZ(gj#Sd9=o$2DWdY7&b5f%~p{`Dm)iC!#|v($p4cXzQPx$<$5Rb>*+c==EbbNVND1(aoiqNN(Y&of1s~h5jS0*D(I4-`y%sF8^)@tP4T*86f$jXv2>A4xX^f9pe8cy=A8@o*n&x1XDVv#BzP# zvNF*KiT;i=w?ppwTRU1R?$0v8>$boUv2?>bD@9|u4O2l>UHt4TPc0Vym2Oi`leUBSY zle2~x@>;_ked+qYl-zN9^ffwdO%%2*@%|ymx-nJTe!X=Sn=2I6xqF9ifPhzMZ6vz! z>942%jniLYQ3Ry@s?Z@6Ks|09Q&xClUYaWCR(;1Vql-tu6gvW9$p@H@7ngcv4)Bby zuOi-EvgD}Y)hE8jK*+Bt`|@%(Xu$Oq7wim{nu~iG`lc_e??-hhLAh4A7-}*Q})n1w=dYmzgea?uB z$rR+%cPxcxC<6%$y;X-AXzvyxz~J(y2@ns#880rf`Op6Vv8}tHnG9WGA<6Ve5Z=|| zTaZM!Kc;cJGhemtEv~tA@CHCq-7C3-V%LY$?i4@jcOV4{*ON^K%-yFXK~q`AHlJZH z55GkY3qZ;!y5#X&?S|9vZ|gOM2xjX7=miVl!XMZh87CR2P6hdxZsl(&|E=V+Dj>-X z{B=p)*~}GOmTv<@9}uD9?VdR7Tt*^tW&gKg^pJOX4=gA)z77nrqO*qges+!PI8nht z)D`9`;J8mv{GZ&bbW#ZQ9&8Wc1Sp*ZDy@M@ZvJ3j{{w}OywHGN&dY_F2cU~om^%nf znrB>wpw!E#JXU$^uywdC=qg8!ez}+6h=(>P)14}@mJLi{lXdQKn+KTm6|zH9X`N6b|XI$;ahKSn?C`w@*m%jFz$ zcb8mBgcXI-LG~8`GR$C(%Q-d}W8DUv=|pt478Kb=selupop-U^Rv-Ww@^xIv4m+I0 zLvP@Myl&~>v(-ww_;Zp6z}MzzsS2yHY|tUz!dA;{fJ$?b_hUE+nAO0L-guexN5NM-8o zoj0I1wM|I%d6+`f=RdQvMDaiqC`sO-TeMft+2ViG5(P`SYn0!~{DzT+TOSxEwq}z) zq5wtcYBA_39aRbdki7n{7NE`dx?p))FHgo66ln?eL=2o)F3fdQy+aG=!O)E6Ov+td z&VQr;-#_Ygg`LONHRAr;d;w@P$km8J|4ejL2|#!Yn>9cqAKKjC7t&%NGec-L1NNkbzIKk(975-QZ`O)Iu}*hhk^x-L?|ME;KHik(9%~MK1|YCi?E9z+pkOf^ z-dfWsEE=eq4yX{&mxApR@(Ugm_rY{)?D%X$x4wA>ME-C zoXO`g@VL@&h92U<;N%X{!r7#n=;NxYbFA?90#Q2-1lIMvdHLO4E*Vm8^x&zLZSUe| z$@^$~me)a)S9!y1J1-DLPUWP17c-?xXwXF3?LLB;N7$zG;_k8r_z?~ITiccF80M3s zR%EY_wSnu-WJ*r7Ep!EDax)<|*33oV2kImlMttUtr$6|kkyuju^}2dVHuM}mVv=rGZ7XqeMpa+8A^=c~XjqtE`n$n4h zU$%Vr6RdFN>h7WPvNxM`ym!Ln7E%EvA^QurVrYQJrNr0#j%cqZNy28pk3 zXNK|SkenTgw?(NUhR!nRh$T+MR<7qSNtfEOR@^kekOkrgtlial{$FDmTAnP4sny&V z!M3a#T}T`+@mC#&i=zei9Fy08p^?BO1_)c0SAeH{%9faU1=Wd~4He~G;x_~cU0bPU zd-iS*$&1vMTG)ZdeXaoR86&tE-nkCb$n<4Gb#W>l_iH+vdT5t=4M3?O^kwaS`8ir( zrlHIxA`(xAfyEGLB`+*`{vm=Q`l;jO&}Na z_S9nkv`oT@Ha9N7j>c<%Spc%652Kn4f=plyLmyngrQ+>b4rL(&5qHBZGXe$tr?4;l zVz-52m7?<$-=~(kggogh8zDK{lV(c*a^Aeb-{Y6VTkk(UmxusUUO!aKK0s=@7Rfo$ zxrk)apg-wHvk?Qv9^aCw@;y`FJq*yfCULw#!cSR-=3*-ww_LfL>Q3j&>`ef zjk^hk3!fb0J1|_AQ1N^=Zs3&XsiaT+pBFgKUgIs(vvmTM#;F^}JMUPCnBX=`VI&BY z>*mPu-Fxt^dk~A{@aRu%cTA+i;mC;&RL7gpq){`QswoJ=K}TG_6}5-+UZ5#lz;>VY z%~Sn#yO|f)w}mzihEcF0EdqLJ^$Gy23Hb!_t~g}EXG~cCTuj=P@K>fP=3h!%j=$$V zF7R;t3B>H#L3(&Z{*=m%BdIZ*u_y|Def7+7!*a)|Wc3!l|P5E>{ zvU!)|$Hv+tbSMeRKcRS&;lDhIfc>V0DJ&)608;DqVDZt}Pj3&CI%K|-pYqI?nbHn) zhe=tD*)O_32lnCBW*_15!8&ZyTt*iISz#ODXElYzz?>{_`kWdQ8J|067A3uw$NwC1 z;zN3LK&S{-kC3578*OT%s-bOt@$IqEhxb1fwkNIix~=ZXy$aop@bI07mp{q~GGbWKF*J4mnNaxm5F?)`M3;nXF=CP`V zRT@@uUUyyXJzsuD=+;4m`Sh)^-l0H9RBGqNZEYG@#AFX)ie=l*y#W;)eJs=RU}U(p zW+n`~=f^n$^)Ou@xqGegMf3qElQm#sG%gDc#x4@+KIsZ`ts zG8{|cuUOjd{|F@rZei-%b%*TFt;RBLb=7;P@k@(d_D+caovpZb<1NhF{&LXgrzB?q zF+Z`(cnk*;QTBKESy}JheH}|SSBL;>v!d5-4#a;`^TUI(`SJaTE@Oy)GQ?%vJxB)A zd#V6|b?XP}|Eg2Yx`RUJeZT-oMSOijz$38}2vuczA}?hH+tG_&#^HU(08iVuYal8uI+`8+ju9Fkd`o zd>w%C$5EyS%|<=ni;Fd?6rxRlq|}(4z{}~3y+TqV3qa_;?yuOaI~y}-RbZ18vr0>^ zSKIVaK0E){QEuz@fYBw+d|8Qr8sOLRAm?Q6_Wo2m5TuK)+|-@SqY?Ds1uM6}#PL0} zPAl|-`A2#_djAxWpD|p#&2G*Sl-|;^yZ08mSMfUh87gZPnBJ7~P^0*e+B2!iPcD-f zM2X7TRzcJR-&YeYnkun$o~`4sM~>+CAK_rPm59LJ~%g%kGOiFTjmfr zE$04;Y3$N|yC~4)p*PQBe&4(AaRqMVq{LyZk6CDhY#x9q)LOp7y}jwVEHg6ryP%(? zy|~BpkYx8|UQC)Q0G4pp9&Ve<(T!}l%g2h&4&`#K7$*mJnP~}nommRpXF0+XGC_#o0^~ayIK;)n!nUpAVn&SvFH?h zbe^n`7)Z)VZ02bNm58=?=__6&2OeWF6KU+nA=xwN^?wyx6aX)2#hUu&hF)o+i33JI7*_ede0;&zh?)% zVaYbIfEQ~HLmX6RbPv!t_oL4&(r@Tv%aNTDm;KMac$xTb5|Xb;rZTw5#s$OAir-A3 z|Hy&`kn%mUID-DarFqR8Vx9;{+Ed!^RBCOj*$Y|Bw%J|h?98?K-D#;l#5g(;yZxx6 zHvjH@Qn!E;T<3l*yFIs_#7J*o+EaKf7K5+h?R(N^v=KU2x1eZu%}rcw*+E#9)uvu; z(nP93-DdNRfon9kg#b*me~RlR|CUb){kvE!WhU%068W*k@DY0B@q|oTMoS@*nSafn zjv{gbKg@nz@2Wh%D1rsA3)`lk)>!`EolU_*i16G0?ux*CLdam7Vw56@G<$)B&%dWL_}c3|Wv-B`JKq z{j=xzkmsoAvHkWt#%LJJXLK$rdHKnvT~*4{E^8N7lAr-50v%;_$C_oaZr!$*2Z@}x z#S_oE?L)Ga)T1g-2&er0-PKmWS1B3)+q11oM8rEn>h?xWszT<_a3V z_L_Up{M>n-#+TMWU+W@|lcqQ#*Y7MWYd8_)RMWqwP6xIMMQjOddF{_0_EFv+WLa{M z*3*6Ykfm((YudDgFN^Q1gZ36--(8W{Z*k>Bo=#T`FW=mmu_9iw)nOU||GfaHDQhd$ ID%eE+A11Nhng9R* literal 10387 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 AHvj+t diff --git a/packages/web/src/components/layout/SpaceSidebar.tsx b/packages/web/src/components/layout/SpaceSidebar.tsx index c2eb464a..b3a2ae20 100644 --- a/packages/web/src/components/layout/SpaceSidebar.tsx +++ b/packages/web/src/components/layout/SpaceSidebar.tsx @@ -79,21 +79,13 @@ function SidebarItem({ id, name, icon, avatarColor, active, onClick, onContextMe } if (type === 'dm') { - // Home tile uses brand-tinted lavender (the endpoint of the mark's - // gradient — see assets/brand/mark.svg) so the bg is on-brand and - // visibly NOT grey against the cool-dark sidebar (any neutral tint - // reads as muddy grey-on-dark; only saturation breaks the grey). - // Discord's home button uses brand blurple the same way; ours uses - // accent-lavender. The bare mark in logo.png sits at 75% scale on - // transparent so the lavender tile is the visible frame, escalating - // at rest → hover → active for clear interaction feedback. - return { - background: active - ? 'rgba(196, 181, 253, 0.28)' - : isHovered - ? 'rgba(196, 181, 253, 0.16)' - : 'rgba(196, 181, 253, 0.08)', - }; + // Home tile renders logo.png (full Element 1 badge with #000 bg) + // via object-cover; the badge IS the visible tile fill, so no + // separate button background is needed. The button's overflow-hidden + // + rounded-[20px → 13px] morph clips the opaque badge cleanly, + // giving the same hover/active feedback shape as space tiles with + // custom icons. + return undefined; } // Space type — if it has a custom icon image, no gradient needed @@ -101,7 +93,7 @@ function SidebarItem({ id, name, icon, avatarColor, active, onClick, onContextMe const spaceGrad = getSpaceGradient(id, name, avatarColor); return { background: spaceGrad.gradient }; - }, [type, id, name, icon, avatarColor, isHovered, active]); + }, [type, id, name, icon, avatarColor, isHovered]); const getButtonClasses = () => { const base = 'w-10 h-10 flex items-center justify-center duration-200 overflow-hidden [transition:border-radius_0.2s,background_0.2s,color_0.2s]'; diff --git a/scripts/gen-icons.README.md b/scripts/gen-icons.README.md index 67f044d2..113c431e 100644 --- a/scripts/gen-icons.README.md +++ b/scripts/gen-icons.README.md @@ -39,8 +39,8 @@ git history clean. | Brand source | Drives | |---------------------------------|-----------------------------------------------| -| `assets/brand/app-icon.svg` | Every full app icon, all favicons, PWA | -| `assets/brand/mark.svg` | Win/Linux tray, in-app `logo.png`, PWA maskable inner mark | +| `assets/brand/app-icon.svg` | Every full app icon, all favicons, PWA, in-app `logo.png` (with `#1d1d1b → #000` bg swap for sidebar contrast) | +| `assets/brand/mark.svg` | Win/Linux tray, PWA maskable inner mark | | `assets/brand/mark-mono-dark.svg` | macOS menu-bar template (alpha + black) | `Artworks-Backspace/` is the design archive — never read by this script. diff --git a/scripts/gen-icons.mjs b/scripts/gen-icons.mjs index e5fc3f6e..7b5b0cb9 100755 --- a/scripts/gen-icons.mjs +++ b/scripts/gen-icons.mjs @@ -204,15 +204,19 @@ async function main() { ); trace('pwa-maskable', join(WEB_ICONS, 'icon-maskable-512.png'), `512 (60% mark on ${MASKABLE_BG})`); - // SpaceSidebar's 40×40 rounded-[20px] tile uses object-cover and provides - // its own dark surface (`bg-surface-*`). Render the bare mark on a - // transparent canvas at 75% scale: the sidebar's tile is the visual frame, - // the 25% padding keeps the mark off the squircle edges and out of the - // way of the active-state ring, and there's no warm-bg/cool-sidebar - // mismatch (the previous full-badge approach made #1d1d1b read as a - // visible warm-grey square inside the cool #1a1a23 sidebar). - await writeCenteredMarkPng(join(WEB_ICONS, 'logo.png'), mark, 256, 0.75, null); - trace('in-app-logo', join(WEB_ICONS, 'logo.png'), '256 (75% mark, transparent)'); + // Logo for the SpaceSidebar home tile: full Element 1 badge with the + // bg fill swapped from #1d1d1b → #000000. The badge IS the brand + // identity at small sizes (full mark mass + own internal padding), + // and pure black against the sidebar's #1a1a23 reads as deliberately + // darker (intentional dark tile) rather than as a warm/cool mismatch + // (the original #1d1d1b looked like an off-grey rectangle). The + // sidebar's overflow-hidden + rounded-[20px → 13px] morph clips the + // badge cleanly because the bg is fully opaque. + const logoSvg = Buffer.from( + appIcon.toString('utf8').replace(/#1d1d1b/gi, '#000000'), + ); + await writePng(join(WEB_ICONS, 'logo.png'), logoSvg, 256); + trace('in-app-logo', join(WEB_ICONS, 'logo.png'), '256 (full badge, #000)'); // --- Summary --- const fmtBytes = (n) => {