From 87c9b0b8abc50be583d388c48855f6a38cd07e9b Mon Sep 17 00:00:00 2001 From: kyle Date: Tue, 30 Jun 2026 03:52:00 +0000 Subject: [PATCH] better color control --- .../__init__.cpython-312 - Copy.pyc | Bin 0 -> 143 bytes .../__pycache__/config.cpython-312 - Copy.pyc | Bin 0 -> 1198 bytes .../database.cpython-312 - Copy.pyc | Bin 0 -> 844 bytes .../__pycache__/main.cpython-312 - Copy.pyc | Bin 0 -> 13413 bytes .../__pycache__/models.cpython-312 - Copy.pyc | Bin 0 -> 10836 bytes .../user_models.cpython-312 - Copy.pyc | Bin 0 -> 1145 bytes .../__init__.cpython-312 - Copy.pyc | Bin 0 -> 147 bytes .../__pycache__/admin.cpython-312 - Copy.pyc | Bin 0 -> 2049 bytes .../__pycache__/auth.cpython-312 - Copy.pyc | Bin 0 -> 5640 bytes .../community.cpython-312 - Copy.pyc | Bin 0 -> 5020 bytes .../__pycache__/events.cpython-312 - Copy.pyc | Bin 0 -> 4820 bytes .../history.cpython-312 - Copy.pyc | Bin 0 -> 4924 bytes .../__pycache__/shows.cpython-312 - Copy.pyc | Bin 0 -> 6916 bytes .../station_config.cpython-312 - Copy.pyc | Bin 0 -> 2879 bytes .../__pycache__/stats.cpython-312 - Copy.pyc | Bin 0 -> 8865 bytes .../storage.cpython-312 - Copy.pyc | Bin 0 -> 3552 bytes .../__pycache__/team.cpython-312 - Copy.pyc | Bin 0 -> 4898 bytes .../underwriters.cpython-312 - Copy.pyc | Bin 0 -> 4920 bytes src/app/utils/color-harmony.ts | 122 +++++++++++++++++- 19 files changed, 117 insertions(+), 5 deletions(-) create mode 100644 backend/app/__pycache__/__init__.cpython-312 - Copy.pyc create mode 100644 backend/app/__pycache__/config.cpython-312 - Copy.pyc create mode 100644 backend/app/__pycache__/database.cpython-312 - Copy.pyc create mode 100644 backend/app/__pycache__/main.cpython-312 - Copy.pyc create mode 100644 backend/app/__pycache__/models.cpython-312 - Copy.pyc create mode 100644 backend/app/__pycache__/user_models.cpython-312 - Copy.pyc create mode 100644 backend/app/api/__pycache__/__init__.cpython-312 - Copy.pyc create mode 100644 backend/app/api/__pycache__/admin.cpython-312 - Copy.pyc create mode 100644 backend/app/api/__pycache__/auth.cpython-312 - Copy.pyc create mode 100644 backend/app/api/__pycache__/community.cpython-312 - Copy.pyc create mode 100644 backend/app/api/__pycache__/events.cpython-312 - Copy.pyc create mode 100644 backend/app/api/__pycache__/history.cpython-312 - Copy.pyc create mode 100644 backend/app/api/__pycache__/shows.cpython-312 - Copy.pyc create mode 100644 backend/app/api/__pycache__/station_config.cpython-312 - Copy.pyc create mode 100644 backend/app/api/__pycache__/stats.cpython-312 - Copy.pyc create mode 100644 backend/app/api/__pycache__/storage.cpython-312 - Copy.pyc create mode 100644 backend/app/api/__pycache__/team.cpython-312 - Copy.pyc create mode 100644 backend/app/api/__pycache__/underwriters.cpython-312 - Copy.pyc diff --git a/backend/app/__pycache__/__init__.cpython-312 - Copy.pyc b/backend/app/__pycache__/__init__.cpython-312 - Copy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2d8ded0f3e7974b892710f787d86571fe8b7182 GIT binary patch literal 143 zcmX@j%ge<81lhkGvq1D?5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!($g=`FUl@1NK8&G z*3Zr@$xF-0FHbGfPfASAPR&cvPb?_VkB`sH%PfhH*DI*J#bJ}1pHiBWYFESx)XoUR Q#UREB z(@8*v{ZI9q-*^CCQJ9Tb-73GNTpqlErCDgVoYyoS2<&__^l>Vb4dwBm1Tv3>?Gj?Uc(iacAayVY`NI zACcUhPqw!<%g259#0hoF!Kr#xt?pJ83GR1W!#Ou^`D`VSqE$`d(9p`-;?+t9#OnJ5@z_(C*gpVx!$|v?N$- zH6>Yv%{tCUN>{2kyHZUhZ8e9h#*yyy&_*9^Sk8v$yXJ`zTCRgLUp`QwBGtN*3hzq? z)(dix@DdfJuREk3lHK=JNg2k-k$M46wAu{?l9h*RW!>}2J>-@f$Zc66+T5sF;ow%k zZ$2b#N$plsl{R607j~-ZJ)A_&W9a$l(E1j~?(eBGluLP>fY8zV2tu5Muur$$<92jxaAFe z`s$bwi4*)p%nx94`QWs5{=ry0m|VL(`m{YNb_joX9{gMyi=9cfa9TUdkHx~9I9R)S zDxcSgKe zJ5kx4KbPNsaeb7(@wDX^XYI))5$C*tsXL)%z#w|tK7G%ueVq7DyGk`yc#U{Cad-Mx qKJ(WJa^wqW#v6g-xIe&+xA7cz^X$8~fJ}dV1X9aC?mSJf@_zy9eM~3- literal 0 HcmV?d00001 diff --git a/backend/app/__pycache__/database.cpython-312 - Copy.pyc b/backend/app/__pycache__/database.cpython-312 - Copy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a04cdf14b2fb28dfe987fb89cf4cbc2dd8a6d18 GIT binary patch literal 844 zcmY*X&1(}u6o0d`A4!|EL1_=tQqe;RlthbI#iB&ii&D_~(dH7iyVEqye#DtAX;9f> zMHGugL0jG;ww1g>KmtaYGMQ*z|L;xuLSB|4 zp4Tu>Vj3eDRhDTZ8Z%W!#wAm`CFkR{SUUbAJV?_ZkrOq?7-mA0TqoG2hpZqXYU^dj zgWU#ay2lF95p#+qhowmn6U_5UPEnjeA~R#cO-q4lSh^5}AjPIDCC&=2Q!rfHE_s2< znK#89BdRB|8aj$~Z{0_576^*qp-9nMZumnmOH8q6slx}R!N!+VOz-^a$rDf zC?mo$_x{dgt1d5#if%BGE!&$sQvMIqHQ@89*e@A%vEeu(~xBba-$J*SWdq)&ZF z5j;{4&?l`3o|26GOhxdLpjlOOlJ<%mO}y3+ywxx?lx_(+#Z^nUj0tAfGHlw*)Eg|h zJe(7b$^Z|iGHAidGluJomx^2s1Bp|)i@B4z;nRgn7tRH0GzC1I#d;slVGAMfwlFs~ zXuIZ=#g6k%q@hyc7@AE=2>A>nYcTQ+dcMTF7DqmG_pf#Lzv)ruJMjKLRAtra literal 0 HcmV?d00001 diff --git a/backend/app/__pycache__/main.cpython-312 - Copy.pyc b/backend/app/__pycache__/main.cpython-312 - Copy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1fc2471fbc382e14e86f79f020e06b4c7beadcc GIT binary patch literal 13413 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 literal 0 HcmV?d00001 diff --git a/backend/app/__pycache__/models.cpython-312 - Copy.pyc b/backend/app/__pycache__/models.cpython-312 - Copy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d459cc7429f5d111cad5f49a29a6b281aa7a540 GIT binary patch literal 10836 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 X{Pd0k9y_P}P`f<#Uk-dSbL4*j#yvSU literal 0 HcmV?d00001 diff --git a/backend/app/__pycache__/user_models.cpython-312 - Copy.pyc b/backend/app/__pycache__/user_models.cpython-312 - Copy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed7c844a473ee7d58489a01510d55439f0c0269f GIT binary patch literal 1145 zcmY*Zy>HYo6nAo$kIUWl)b;=YLPC6rfanPU9iT#LDPQGdp)6S<_iT<(J4v0S<+ej~ zU<5JHs>_W?3xEJp2%x|Liu6^YP}Nas!70$9Q>2=sQQgr~tUwHEI%et@Nr_sH zr2rLN1xQ;2NXOP%AzM%xt=c~egQCW6a*X#eTf?Tco-oIC|oHa|!0ApAZ6P2;M>hu@yEX7Vo=g$5vfvGF=X@C+U{fg_(C6N3@s;(Q$B3a0a;wY0(i>n@Dx^y&5 zp+|THc~MAUJ59+gI1gjU+=P)-$9*?s!MuksV}?9rdXWne^?YW^jPjim!s4bMEO1LG z7Vi&oVf+$&6A1Wuy0H+j*(iif95rTX?B6570%naF*qp^aYQQjT$Rrv)(IR>`e44L(fK+4nM!pjW=+wGS<1=AKtrstUJ7N zazpD4k9KbM2lp)NOVLVs74-(sbf)_CeaoZWLo4Suw9SXT`nArjer?y&RyXO@PIayc z_L8}JZu9u-#;ZneaO%+%JFWYDIGdlIDF(+dCaiyP0+;?Fk>)A&mr#GO0uK zH4H~Gkxc#`GMR^^mzFsyN#?{_lE8 OxuHBc`vb@|&G83E*(nA9 literal 0 HcmV?d00001 diff --git a/backend/app/api/__pycache__/__init__.cpython-312 - Copy.pyc b/backend/app/api/__pycache__/__init__.cpython-312 - Copy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a243b514c578aac2f2c3c8273b1322dc58450bf GIT binary patch literal 147 zcmX@j%ge<81UbJQvq1D?5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!GSV;4FUl@1NK8&G z*3Zr@$xF-0FHbGfPfASAPR&cvPb??^;!OSc_{_Y_lK6PNg34PQHo5sJr8%i~MXW$0 T7=gGL#Q4a}$jDg43}gWSS8pQ? literal 0 HcmV?d00001 diff --git a/backend/app/api/__pycache__/admin.cpython-312 - Copy.pyc b/backend/app/api/__pycache__/admin.cpython-312 - Copy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4dd1bcdbdd5432b92c86edee57db908f23f789e6 GIT binary patch literal 2049 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 literal 0 HcmV?d00001 diff --git a/backend/app/api/__pycache__/community.cpython-312 - Copy.pyc b/backend/app/api/__pycache__/community.cpython-312 - Copy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07b797db6bb1d24e0c57d51c5a1088d869242874 GIT binary patch literal 5020 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

(;o^_H`S^#5y@|E0Rn7MOzxYe`9Nq zV8wz4mLfSfOh|(qn)Wqp*T|yH;&>OL#@m4M@7t~m-U(`E%g{jnbK@n>&D!d!W;uIW99EKQpI`hB2iJXBlT4W$F%gktG3I zx~Qa74NQ?tC<(6WLPAlZqQS%4kx_aR0jJx+*abyX(L51o&-RR7$nkS(K9OYV=(&uR zomFxd7#}^8NS*_vjwbSXcv7PbF{X~>=X4L=6gTHQ0&)WIs9EU#PM$81f4GS+_`L(~ zAFp`(OWyul2Y&X_PhKi}M;4}*9lj+;_i~`)y62kbhf_bE{=xL^qov-x<-oqn(sD3- z{qVKJHxHD9(TXp+aP%`z%T@bz|22O(5UB(POM$_1U`N?Av?LBy1>%3gH2j8U0cKt(3aThm*_NUwNl`F>(~H3QP?*sr z#(9oEYneiOMY1_9GMg)8<*1!widaJx?}DjrOUZhhiJ5pV%i=j6&%y}E*@oPR9KHn^ zCDYy(Z1`4ObYUDaHh2`~z3`~tfX=|dL(`zQ#um5#^vjijvC_cUFAE=E{KdsjUMw9v zRvwrx2ai{L#}|$+d)q4B?IrK_vUg}<>VYS)9Ozu?eqpI)=aO^hvL~=GU3C%v47Chy z8y}!|MLNDsyestq{piZ8^ zkOD)c8~K3?n`MAo)O`83=yxa>gEos@MZq#JCBV@HDwed3<~R78#IiMsO-`5~*a{KE zX+#il#&G>pACjnK1`)Rr+~aZ~lZW6S%ep<8%VbgzGB}%spl}v!z6*Y&Y4hDkL2xAX zKw(3P3&FK4qVLLL#p);M|OMGo5@7UF^R@!%z+IN)Ohhg?n`|rJD;QylMyyu9b#$pHH8^_H>?8|| zqJ^|{JsZI8BRhgG{#@u;0adFxP1CE zXUkRTs(NGU56*tbf}K^7UE;mr zE}%apbkZY!N*zeMDE1!gAN>x_Mk(J3L-WA8cg@|tIC&NF=BDlj?)abFtyp)qCZML9 zIpFjBb6D_A!-HYlg)YDc@Vz=W2fA*DBAr2fjtGS4zLuzspj}6_iWPMugw10$2;+y= z5qQ)E=u8NE|4$G$0ePdN?A}@tw=RiW*Twph7_NFuEINr4f!H2?rjCIUfW?VU#NtFN zU~vTLeMVKczZ2+t9y-w>-t*d#4pQtpu#XPtc5N=7%D%xdW9yFD1XKX|6vr&U@fC2) z0lHg#Q%NYvvn(@b)IfS@ZDE96)J78c@s-MP^nKk4Rqsfmpq=HIh;=Vcq4Z9iNx)YV zeo5$VTryIsYUWoDE~t1xLgijy;rK1V{m9&cd-&~UeqpH`12vT5<~N}LRTK~7ig+fM zQ;d>Y7gAZxD5`WZpHnrCsa6;A1&w3y;jdtaHsts}!V`Fi8K|5ugHi>By~1CGHB5Bs zZRo24rF4b#{Eh4`k=-k#Z-tEhh3s4*gDa%>Pvmfk99|)j&s}Zr_bk|}c4BkB7rqp} zJb6>R`Fbg`Zy{W!`#g@e)ZIqnW_NvLtpn} zTzeuA+kvVLsA|X(cKr5kl=I?)Lld7IDjzzrN+jBPBU#1a_Vi;M@Yt8CHlV5jJl1om z=km#$eZQJq=qb~$tlCN6pmFa5f5%d2SJ}UN)#0M8%f7Cv03%#pm0$$@o!-Z|gYw2{ z)rN~*8}(RqJ}=JY2XX$^ssQ6d5G%n5;{4&N11Tp8MxL6YxYmzy`!4lep1(b?&{w7- dP1SVM9z!mShMF+e)C3Bpjjq~&;wQjj{{nBp^B({J literal 0 HcmV?d00001 diff --git a/backend/app/api/__pycache__/history.cpython-312 - Copy.pyc b/backend/app/api/__pycache__/history.cpython-312 - Copy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..101cf1531b74d66fdb1cae61f98ad5981e8a12bf GIT binary patch literal 4924 zcmd5=U2Idy6`t|E*Z+2$IB|%bfJuPF{KQ*+waZ_V0NoZEb{9~EcPq>IP8OT%pPhTX z;9W-wY}EyI)q+$N9;%859=al}cLOV7DC*KvYN zE42?h(w#YT=FFLMJ>Pt1u7BtAxd{~IpA*?nLHY}JtYVBn=ZS11|z{cReN`EF8ke8whsG0FyTmKpw0hk@V~#^vnk6ji1j(| z7VTGwqE69=g!Op*L#}$_1A8PYHT=vFRKScL2symMswM-$OQeuMc znt1K&Zxl)zeA~a#>-%6SDC`n8c5y=wVY2MW2y=hp&xpiX~}enbC%bV zDLI$PCrc{hFyg@xwPomiHKS?;UOt%Dz@?z~wD+etOKEJm?nF^WU2nVH8%!-0@+t%O z;t5zrr*RPdd{Ldu6=bGNzt?{#qri(qPnDyow3d07MO7`Ol~jyMW@?&ejQ7^<=BVyi z3^TomXXDowq5c4#C*y$P!-T@w)E4nfh}N>SP?MF6S<9*=tE_$5fYGsL&e|&E{BXsV zbv=E35LHlqqTGe$_8ADZ>G4KIonn`Q9DtuRx$gH4sS@snn+il59 zt#wAT!6ls~S!0&>V`LZkXw%PxvouDhV{YyML+*h}cNVzJc=A+P_sJQxsHDnCL!(P) zPczOqI@cZS97_ZKbWs7Mz@DU2N{XwxkW!SGXxQ*xG?d;!RO)uv^^&5gxKB|i&%P2r zTi|EZVk*tl_?euRpHT{D8IPYzrOyDIVYS?|TAl8cHYK$vHk%A?>h z0FSCd^>^}gj{L(-e8C^?se7XhZ>;8x&2MgOJW$(spzb|5cW}Yst2zc20)1CKS3EyH z(in`_2IIGO)&^g$2VS`-Ed;|?_g~q6eMdbQYxrVwhd%doUAABKU-8!i(MDihEwHX0 z*iiS3R>je#K>Qn@sXegng^Bf(ef0JyoeYY%$2Nofo+ti3hFDH!ZwuupXTci_f#oN*l$Pa%5i^gmmPpa-QNiCTM z($gKqR9PvcWSu6{t*r&C79j3IXC;ftLI$=j+ink5Sgb9%LCx*BLBCI7duS(?s|ePH zQvwzpz+-t^2?)c!1M4k$>@dTG#Twumr@=Miw80I>KPEBBq#L)929k0qR|NKuW!;`G zC{6wYRVHBQ6sZ-$pNcYg~?K%->E-uI@Bq_krDw}at&G)_Wga)X!n25R2D*LF1` zTWXOl^++6gzYzc6-3#0xdOkdS{_th#t{7TycmH7g(s`K!d_n0H1j>GN5 z$IhjdlFX7Nxa4RtPbW&_8*s)bRxd%NOBs#jRJ_B$9Y^DQD~@b~D&{mfZUxkl?F_u@ z!WmZ9rFT5X89``-yLG}H)<)k0&p zv}$Oq9@^6gP1Zt_e+nJA#}rNy>{@A&SA)u{RioT|MEz6BdI=ZdRr%J z7eo&yYs!ZwYsvv9YhoBWcSh-yOT06-3gpiSo$`pEQ3uK{inRyphrfrpG0HbV)0t|w zE*-otPws`>`oe<;2lGE2yh`iXb$~a0(NTQfzKoZ}Bk&-RyYMjZ5&T`9FNVBshYLP~ zyFFqM_RoFC}ucj297@l$Go7s)pwMXl0MCHW#gu#hn5uM?3^~9!q2-* zfg>O2PPj6Ur%Kvsj!9bgVi!KjQm0bz?Se2G>p_Kz3#3%;1rv^6B;1e2 zT{wnchvs*h%8|U`9&dhi3UJrrVbqAH3I)Zuh3i5FF1&c<(#2vy)i|bKT_~0`jzq-w zVTHTM@t=w(@DP){oO>XslEU`!*FcBKPyIR6O@UH+pG5vfw$#X$`()@oiT{;sx=+^K zCnJ9*$7|&HeG>h`)$_f`oV{r$Hs^=o^WlqA*Tw4kmut~i=E8Nl`-`FB>)We4rtc0N zy*D^={cwHorALyJjxBh5FCV`&-4sB6;2U_1x+em$?P=OTYKAOt->h!jhmQ8&oBGDD zch{%B^@vEc`+B;G&8;JkvB7y?rA-@%%>Yh}oR3^QR$aT}SKHK0PO?t zD?tnX{NbhpB`11D8!J{+4x{Ix^FtSBe>yTZRHx$|19j7g;TT#YP-qte1qt27AK5_S IM`7Ro1xsllz5oCK literal 0 HcmV?d00001 diff --git a/backend/app/api/__pycache__/shows.cpython-312 - Copy.pyc b/backend/app/api/__pycache__/shows.cpython-312 - Copy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a79caf296f4ee61416f8fe7fbf3f91da35dd0464 GIT binary patch literal 6916 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 N;HC*E=~?(Z{{n72F;4&h literal 0 HcmV?d00001 diff --git a/backend/app/api/__pycache__/station_config.cpython-312 - Copy.pyc b/backend/app/api/__pycache__/station_config.cpython-312 - Copy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c66d790dbf53ea58723544a4b640f69d03a86db3 GIT binary patch literal 2879 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 literal 0 HcmV?d00001 diff --git a/backend/app/api/__pycache__/storage.cpython-312 - Copy.pyc b/backend/app/api/__pycache__/storage.cpython-312 - Copy.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca80508311f086bd2a941e296ddd61dd76e95de0 GIT binary patch literal 3552 zcma)9Uu+b|8K1rVcenS)XZ!r$CTnmLPS|%4Ln&zlIb%Z|Y~x^)gj1r``gV->*uA^X z?#0-gB?DD40x6(Waip{oRU)+!>3biG(uYcYvFo-zRz^x2RcYUjfYg*eq~Gk_a>nAJ zBj3z7-^_gbeKX(hH{(Bs!xDmG{5O@o3es1!;}w5Rcr?Tyw2Cy8MjE5}3?|J$%NjnD zO|vGK=1e}#n?hPJ#k6Sp(|(4|O;1mbT+HBtt><%& z{|vSY`J9Cv>8$&q6S{#N!Ln7mXvG<)^*pwfOpy?rvlUe{^_)_)FoBUE9kH-wff?GJ zs`^c1fG&5oI!myyfipH}LMdw@mzkWLWByEEYQ7mA|t>&_d~+wHFH1u&0ozf?8Y@ zlhxgIxLF#uSPRDqc@fiCGt{0}L=djR?~&h!&?&?~=9f^mmPg(s+Il&16|(&jSoqMl z%Knt+(GqJvwO3-jJhAD1xaGnyMAc=}@3_VGaE7uj7Cn8n)qJ0`cfk`{t^n?qIJ*`# zLRq?1JBsJkFnYHWp?6^A62Byr*eu=A9i_y3-dW7e_L8u~F(}7ysKhP*|Ne2?{j;0B zPh?}BRBt`svaNNUCoPF~hbNcB68F44EU};ScWe8&E&08e7z8tV>LZ@y zd9m}{fO!N>EQueZU-)!p3LQo_zlLAlt}w0pxxc^q{NZ8kS7vE&DvdQ*Vs*Q`i?t&XQI6?3ppSpxSc@ z*Ve>hH$|&#>5Ev#0BNjQ@*#PANH%m+w?Fea!77fGOkM*}YuHwGV{zDB1Q5V-E^o_L zu~5hp8*2&qH25h4iu&c(Cr6-u3(rjUyUde%bM%C)5-h8Rk)MaTan2EGh>ETOTJkxY z@&mQ$aMT@#qip1`MPe+5lWIXv)@UsmZ*Vw*Rn1`yoO8nCskfCAqhlk=)M$Ey@Nf!* zCcG1)G^HHezh4re;xd5yS8&KH335mjj6Ra|i zLamVlV67W|)_m}eWL3St9NB?OC>$G5s)+Uy=!?;iMTcXHj|zQV68l!Hy1!JhSC&qw$# z!M<|$_g2R5hZ-v)>e*kBkiTV3?0(kjxw_TIA=J?Pe)f9yhOrshwI108-UM6A(YA8S z?yYe2R@;qt%Hi1K03Q;ThrtCtbnVpTQ@6N3b1h}5@%_a0#D>(l$#t%AonM9;Z@qix z@SXTtbN^a!V2vB7977HAx0P2A-}S_bL-bc-!#?Ii=J-)=HMI-Gd*4sJ3e6WUGsB4c zVlV{q?-2v_qLjQ;%fKb~WHL1#1S1I1ByxFr2DrJ#)6DaDy3QnZ4)!=A`;>)Un{HK~ zm3_+0_0bZ#uot+$b{}}{PA*yUm3nLCQdJxgqf1&$4S!*;}zvh>p1QJ%d6>KqHK z{v4JC?Q{55FGRy^W}_#)2Gw-Vj2D&YC~IZSXBuT54)HB_SHb6Cj}B?s*`o@uJ_%t2-1^t5u~ z^x27FB2YW@Y9RCmaahYHgrYOfxfWgOa0G&_qG6LH3|REmp-e#b(*=I|GIDYKL+Fmu z2_HjM#kGK9U8~1#AKUUrZeH5(cWwH6*ZsYp?%UjbXnpsg-?pvqer>~_dc^u-!oQI( zA}pV%2q*;T?OPA_Z3JIj9xjW)<&uZi1MBSv%FTPWp;bbmSUDP74crcto7*;<`_`NL z%8k9B4&JeUweZV@PmZodUw$ldA)$geUZ}LdH=bCO60f9uLrLZy#|#Z{_xMyCI`LhO zs3=-KqbTG>nBs`DD$s2~Co}^H4ZFIR?v_!sRN31PgqKi@_8g%+>4a$4d!7>djBzBY zGT~Y>tm=_9Pz8N%DK#y9#{jwi*ienk95xr+<8@l=iUhuBCsg{V)boTQ1kR-T*lkLU zjh%jLWLOy=9UoDq&rOa@kzSZU_Rv{e0q$0pavc^r=E zc^z~V(AFQIs;~^h+(+YIq2SkOY7iZy8%d zP37nd%i)S2?Hw%dJy?Ee5dIzp_y*r{uo6W+|Fy2mT`T7{n6`%k>gl_4YNLDq{SJAp z_wYu?4<3qfCQ+7R6&Bhr!yOeKT1bZGwr}XjBNqAED?X}w8~zpYU+cWwxiYrFblgAk i+V8qHj*LG_~^TD3k9G)7DYMM5_Ij|3iec3th`PmNf z*re@4uk`Lc_uO;OJ$dlA$q5 zk+vzej1UttVoc0PG0ETwiaq0qISg7vpBsJT98lRFq?{kTi+WUe_;?)r|@I4SgRPU>cXHD|PHq;h}_)OBrW z(KQIV_L`@*_F#2D?pX@n5KJyu+@j5xd0MRPWnHLS?qfZ3cDcVr|3=Wizg4qI%TKX& zop!XmmvuKzaLS>U6T)!9bh{Jefu+Irzi-LXNl9?fg1TsEOZ z1l=|H`m1l`3L4|O;{eOEtgPzN*9(l#gP>hy3QKB0c_-ERZ1NaWRoDpg;M+`#Ckvdj ztQJqmnN&7jP#K3653Z;ULHBW%$Q)srSy&YG&gN{IvxLT4IVbWma=M!`Z!k5V%c>02 ziYGw5PNP8jd7T~4XXnF-q?US@g;gz~6;!lFW@?hBjQ7>;=Bnsa-A&NEQt>wle`be|Do-Q@S!A;1wreu#>|d!W;uIW99EpPkoza!SoBiTSv}(WNt| z7-t-n>kf97B>{K3sH9X4e3DEk39jlwLQx{3A;UMIp!5!+QMZHF3yP+qpTf`{Pejk; z_-QqtNHR5gI-_Ohl-wD{qqB+RX@GGwk{91Kz zdwFpC&0u+OPo?w43(|5RbY=hL{nvI^0+FgOvUuooPsb(u75`;_r88XZ++6P5T!4->fFl^5XcmYTgrcB| zGL>y9dW;kW15ASmrcZUNDpfvHu`(UcuQnKD{ zf+(KLGC*8B3nM^j7^M+Pd?O0l>)yA3#GgTK2d1qSaPSCl2jNjqLT6y(p6TD~FDyM< z8QEPO*;^jj`^(pUb>tUEK6|UY@6F1{H!6XXRo}_QL(9HE)i+x9jaGc)i-+!dx|Tb8 zOZ_`a9nY1V&nn>(%nM%P?<@QET^*~2 zwv|KMDxnFO-PHcz+XwCzJs%xDcleV1j@Y~G?)v`3#fgeLR24%dF@*Ez#pu=1ihH;! z4wuAX)Bh5Y1|BVo!;jU?aK`yb+vKys)9+@1HcP z6$IRuCHTdn_|)K+ic(APx2JG^V9=KCvCeCbMailzZv(Y$z9#?ik7jc^T?Fpb`rZdp4 z3#Zwd&Dw&|mYD4Fg!){^#5m9I6J#%fa!R zS}8bQ3GS-~r^>;pKLrn5bYBoIocP=c74xca^~4{YBTyoH57K-8Wju9ZK7Ca4Ho|HT z7!P4J?ZdE|c0gE7Zi30}F*@xMZ;$r@{VAc-9`RG^K-xvI_h5hj_pmoY`BoU(XW8eQ zQTOF3xlmG{8g&qr|0(K6PZsN4%89KS%gAB8(` z4Zi}-?=qER+J<|(`E@D41&fD}BhKb>igEYWg;Z8EZd$sS6!mA7Ug2pik@t3hf zCvyBp;vqc5Ok2)|9h-^lhd*}g)CR!H=(Wa|pqyh4Wm zOlHbtW`%^maCLuoV9{Q)6Pxp+(7Dis>1$$X%bs%h#l=vCe&vgyP1kmncF)`yI(m0- z% zZ>|!Fc3(SI!{O$>2RPuq{WTj$H~!tpf;MtB9M_W`b;!b7xXLuTJPOIDrh^|}0@ucNyrz<3YzN-%;x zf2ig_%88m$rfw?oHlgC7b3+%t{nMR`LlqirYp0tI7+sNgsc* zcZ|%KF61O=Y$Rx9ps4*&6n^kS1FL}hmI4J@J1^zAPvW<{yL?$v-NQTBJ zMcSs=GD1wqh%qrE#Uz6#DE5pa<}hecab{dGmqAO4JL8FY4BD=EGrpM5pdE@o(-G@1 zXs6Pd>56q_x?|m$KrCSJTuM(S7zcX6=$?+q;h}_EbHoN z(KQIV_L--)_F#2D4lagn2__dTZqa7UJT2DtvM$su_p#utUG8tuzX9|gXw_`e@;bJz z(T*(5^CtB{iVDlWH-WJi$~IHo`pgCez}{0_QBN z#S?NSm5mov#$m;SD{4c~b1Ew{KF3pV0vy-XGM(lup|KULQ+XL#fflLPn3~UJRR*fX zQ*eY%CxG~IkY5R%=V`A;RXe*IR!zEkV zwN|D@gOwv%gi7Sx7$GfsXxi7ZyiAsCmc)CIO)dcXe`LERd{2_dMM3MZ#>|d!W;uISzi0pDF4-Ii=>6L@{n~bZPD^ zN^c<|bvt;yplB-kX$ac0Jri>| zeooCNl1!aAm(jAbN^Xwvi8G1hIe_v+BAF zu;cEx39=Nf)8i>|>(fPw)csdsB*Zf!g)y|<>=V+yKwA#6)>e*Tr zx7G#X|JpOP8_s=qa`RM>-q}j00^*&q?LfcNHF2TE&Ui|`sQXtkRzMg*XF&M3K$s9N z(R2gEz+7$`fWmAVzD}cAZcU>fSGA^8+PP{8rYm7-=~)9l8$cf6v8q|Hx+s(cRg|f0 zOVJagBpC1-M0kBH%;*y1Jjb5}Pc@x6l+9^FvpIMlQ9H*n(?lTegQ;#y$$Ga5t9UNU z0E6)?i~z1pD2?Fa8w|n1Tmx2oBXT-0k+r;O9tG|oJnFZgGZ6B?^zzL;i`%Lrduk*5 zDrP(jq1qhY9LKdJ&y65pNb@rC~ca}Sz zD?6WC^7!Uosk?~(JJf=KZE}R(5$WV6@s1P$`r&Wj%&3iHyy_k^wZ)T=`gBJ=QB-mX zS*P)2!=)hA0K(@mS)I#dAq6f=x5|SQHp>+^sp*EB^!pUtLfhrKl3+QS5|C&E8cW-1 zAQ@{nH{{u9jv(aF3i<>qm|xhwRaoL zZXf)EYw!HjlIZ#1=%u3zw)c-Mxx0Qaer3Gs4%ftRSq$TR;>yJJ;i@}Q6C-6YV!B@< z(!kRtG4f0ug(Kdbv`vl~2p9zf^dTLglUu|)8yrY)q0lEAaSIz7?*2)mbV00rRpMSO ziR;F_RFYcazHLd9g+mzMUaw@ zdPD+mXq_V027v~F6uN>+bW!6k~6@r3+Gr-m)=e& z1*T#q$3lwD%zE7g;|jI{{CKfO{pu&s8Q`z`NzVWlxc@ozg(9`kSS2)eTPuggs-gY0 z&{QQf^{3FmEAGp})#NZt?rx>iF7fVIAJCr?I_(iZr4FQB6nhW$4}TAPqm*xhp?#8lz8Q62ooWl! zbls?fsQgb+S8Bvu8*J0{;&82e5ig71ga=c&3nPJ#;Cpqhk9XY;7kmbHdxRil`exxa z5_kjHD&EFhk!)^Tfn@xII|z?@2|5$W-v1YpOtA|$7}0FvWKzhGSdcJ%^%*F&d*;$5#D=>Ww(h<$WKw`;|GD*GnK zBCb1T6L2ZWr#RLGj&FivMbO>qTS`Jno@JS$aW&FIO~yDouZ<`0yDpXEmo^CL~= zn6}{(Z+>nHaKGYVq08485b>G%;!{%W8Kw-d_m)wg!s$Yp%Xd&Mezh4 zVx}$UelV(_u$TF(z{9eq{v7(cKq|JO z8T!)I{o%m8y>2Hq=Lg|S;mgxE#Pa5sDnonc!&UnAFC)V@c9nO}d>%P=Z*b(s(dyvN zN0O6{EqQwuPF|U*3qU{c^*=`56M@+F)ono4L(AIA-i_s*)2Qj-y(2T9U8o*;{SlF< z|ED8$96s?r#sN1TqIDaP^-kP5aB1N3iSnjhzaE(%sM5oa>?AU3oPEz9EQhvN{W~5x zT-3kh+fWx^1Ow_4jPN6z-p9Ct8jpZRWcIDK<&kr(LYE&D_Vm^T7$1OQ2}V%p57!+? zIZ-vrSjHlA7*$6uMamt+w}tsgmF{Y5s+$fNnqf3dg>l(bpitlLM>e4NF>u|#0M = 'complementary', +): Exclude { + const { s, l } = hexToHSL(primaryHex); + + // Low-saturation primaries look best monochromatic (accent is subtle) + if (s < 15) return 'monochromatic'; + + // Very dark or very light primaries benefit from complementary contrast + if (l < 25 || l > 75) return 'complementary'; + + return preferred; +} + // ── Harmony detection ─────────────────────────────────────────────────────── /** @@ -122,8 +226,10 @@ export function detectHarmonyRule(primaryHex: string, accentHex: string): Harmon const rules: Array<{ rule: HarmonyRule; target: number; tolerance: number }> = [ { rule: 'complementary', target: 180, tolerance: 20 }, { rule: 'split-complementary', target: 150, tolerance: 15 }, + { rule: 'tetradic', target: 90, tolerance: 15 }, { rule: 'triadic', target: 120, tolerance: 15 }, { rule: 'analogous', target: 30, tolerance: 15 }, + { rule: 'monochromatic', target: 0, tolerance: 10 }, ]; for (const { rule, target, tolerance } of rules) { @@ -166,7 +272,7 @@ export function validateColor( return { isHarmonious: true, deviation: 0 }; } - const expectedHues = getExpectedHues(primary.h, rule); + const expectedHues = getHarmonyHues(primary.h, rule); let minDeviation = 360; for (const expected of expectedHues) { @@ -185,8 +291,8 @@ export function validateColor( }; } -/** Get the expected hues for a given harmony rule relative to the primary hue. */ -function getExpectedHues(primaryHue: number, rule: HarmonyRule): number[] { +/** Get the harmony hues for a given rule relative to the primary hue. */ +export function getHarmonyHues(primaryHue: number, rule: HarmonyRule): number[] { switch (rule) { case 'complementary': return [primaryHue, (primaryHue + 180) % 360]; @@ -196,6 +302,10 @@ function getExpectedHues(primaryHue: number, rule: HarmonyRule): number[] { return [primaryHue, (primaryHue + 120) % 360, (primaryHue + 240) % 360]; case 'split-complementary': return [primaryHue, (primaryHue + 150) % 360, (primaryHue + 210) % 360]; + case 'monochromatic': + return [primaryHue]; + case 'tetradic': + return [primaryHue, (primaryHue + 90) % 360, (primaryHue + 180) % 360, (primaryHue + 270) % 360]; default: return [primaryHue]; } @@ -211,7 +321,7 @@ export function suggestHarmoniousColor( rule: HarmonyRule, ): string { const color = hexToHSL(colorHex); - const expectedHues = getExpectedHues(hexToHSL(primaryHex).h, rule); + const expectedHues = getHarmonyHues(hexToHSL(primaryHex).h, rule); // Find the closest expected hue let closestHue = expectedHues[0]; @@ -324,5 +434,7 @@ export const HARMONY_RULE_LABELS: Record = { analogous: 'Analogous (neighbors, ±30°)', triadic: 'Triadic (three-way, ±120°)', 'split-complementary': 'Split-Complementary (offset, ±150°)', + monochromatic: 'Monochromatic (single hue, value/saturation variants)', + tetradic: 'Tetradic (four-way, ±90°)', none: 'No harmony detected', };