From 9c8728138ea5d9cd9ce40721648705d70678a343 Mon Sep 17 00:00:00 2001 From: ttipo Date: Wed, 4 Nov 2026 22:41:05 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat(frontend):=20=ED=83=AD=20=C2=B7=20?= =?UTF-8?q?=ED=99=88=20=ED=99=94=EB=A9=B4=20=EC=95=84=EC=9D=B4=EC=BD=98?= =?UTF-8?q?=EC=9D=84=20ARA=20=EB=A7=88=ED=81=AC=EB=A1=9C=20=EB=B0=94?= =?UTF-8?q?=EA=BE=BC=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Vue 기본 favicon 이 남아 있었다. 5단계 알림 아이콘과 같은 모양(#0B3640 둥근 사각 + 흰 ARA 마크)을 원본 로고에서 크기마다 따로 줄였다 — 16 · 32 는 가는 획을 조금 굵게. index.html 은 아이콘을 /src 경로로 걸어 빌드가 /assets/ 의 해시 파일로 바꾼다 — 배포 직후 새 아이콘이 보이고, 공개 내려받기 호스트도 /assets/ 는 연다(nginx 그대로). public/favicon.ico(16 · 32 · 48)는 /favicon.ico 를 직접 묻는 클라이언트용으로 바꿔 둔다. apple-touch-icon(180 불투명 정사각)과 theme-color #0B3640 도 더한다. Co-Authored-By: Claude Opus 5.5 --- frontend/index.html | 6 +++++- frontend/public/favicon.ico | Bin 4286 -> 4847 bytes .../src/assets/brand/apple-touch-icon.png | Bin 0 -> 9945 bytes frontend/src/assets/brand/favicon-16.png | Bin 0 -> 709 bytes frontend/src/assets/brand/favicon-32.png | Bin 0 -> 1576 bytes 5 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 frontend/src/assets/brand/apple-touch-icon.png create mode 100644 frontend/src/assets/brand/favicon-16.png create mode 100644 frontend/src/assets/brand/favicon-32.png diff --git a/frontend/index.html b/frontend/index.html index ad388cb..9d2cf70 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -2,7 +2,11 @@ - + + + + + ARA SYSTEM diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico index df36fcfb72584e00488330b560ebcf34a41c64c2..57745be3dd5d6230560874adc9b948f7c346ff8d 100644 GIT binary patch literal 4847 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 literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S diff --git a/frontend/src/assets/brand/apple-touch-icon.png b/frontend/src/assets/brand/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..02f39b0028fb6367e55d06aca2fd223be8d3ddc4 GIT binary patch literal 9945 zcmch-Ra9GF_$^vmpru8M7AVp}pcE_auEn9aySoIJ;ts_j5VVDo7AOINLvaaC(GX~H z2yVeS`8}M6d&hs=^K|aR+IwX0owa3sYpyxx_r+_fD-t}Xe*WmuBLbz5a-T5!`v2N9 zT+CK{6qo1GBj#cyIcXjL#eJ|}uI@(jMc9vhfz}ax-Im9nw%0gw(#BZU zoL2{lA8H?L1$-;*QCxWT>{jMYBGb#4Q564=_W%0%-|7E<5B*=dn*;WD$;KDi06eAi z+e24GKg{(Q&?oYMkH-=22(s}KNyml}fFLg?>O(r_m!ISS@G57=UA8`G>yt#@?SQ1W?-}tQk=HVz!d-fE#LIj7V*~Yty!WUY~@a1*$lK|;}x2@|9 zuCIHbgBw0RJ&&dz!I$N& zj&m*FI>%6rE@h=H)be`2YH>=!&Z1eLXX(zE0GAhTcOtxpZ0e#Sq$#QmMtfgyzMUG> zGfD^87~;BkwMa8(;PgC_XExH28-P_guC$QvBkHX>vpF2JOjH?+0-t>*`9= z-38q(M{`jAH)|S(?VH*XhG_mQa`HFus2il{a(#H}8Q9RcZlj1WZc@ z=kuBZ!J0;xyEG42S~t@U#dF90tZI;FhMzx4(uzy`;xNgQ(gCEPK8J_53Vjt+UGjf)ZvV|hZ&#m*|PHjJ9Jq&?T0OI7!K9c0xO%o%au4Ej)he!vm zTeHv%j|=!L@yFW)Is?4FZ69g*dcUi4%Ox8~xcs}4I?*EkUf@k@;+|oGrM>weBz0Dk zES}FHUyqCm4y~-LmVSYq%NP9Ym6~|ku`HoqX@HbpS+Jqj?RcGQ>%C95t87(L?A8lo zSn^)SqpMD1DQ0+gJv%^3msT`m8fX@3O@)@=kBw&2vj#EO8jw}uvBTKmU#A=iMSi_z zqi?0x)e4pg!u{F?Nr==CNyN-DJO`&bAJO%q$ksHqZ@FAHFI|mbzqwS4OqTV2vOIs6 zL=~O|C%<*^BT`SZg+QDK?dnwXgtFy{Zo$oAtyzq*1jq3%3j&~Wh9RDEOA8Qlx#Mg= z99>B}ew-UVA?Js-jJf-O zcZ#Vr3OsqGta)-nj3#9-rPI0U4Ap5w6F!%dV~3^#EGcon#bcAk(5Z8RPy7`BdF}OG zun+NQBVB(9nCs4g)aiI5I+xIIS{!Fl!^-LFm#af$*|t26^P1JS=Y~l_doN>qW5T1N zAgqJX{mX&shBLZCOG+U7Pg}$9kYNI}cyHNw=SLxuE-p2I5(5eTB=l?U0a%o$$(+8Q zCX|vxC4n1RG{^jPzvXTEx=AcL?~(OWBAdOx;UhuLID#t=T#0%e$RMX zJ$&)KR;pB@!+w2EHT1uS)&`Cy3by1mn;H)kMDo8O?!i>z9*J24hE=Q=-VU-Xm7z-ZM#@HIQ4TY!U0?Tf9*-ds##h1x&At-_s* zMhP}lNX$NNenP25Q)^EYBQEd1xGu4)6EU~kyO+)q#wsk-Oa^esLBIsqX75Y**=~zu zjAbb#8ik1om@T)JR9MU5N_35Y3xMnypQsgl6p5UereaQ|R?q?@xrtCrRokYuJ&1cQ zvAFasoxil9QcC~MUQ;YDHU`#zND-vZ8(rsSoFI78!#BxCV3<9$BSKQ_$Vz3pwWI&a zeU={_DX?A3aotncm^jVZ_K|xN?MY_e6oF>`U zcq*MIHiuEe8+%Fzh_Wt^l0g1i_q4j*Oa_tH(2lkiITiA*xs+wQ1#2FgFF653eGs_k zhzkznoW9>8YCGBF86bGi@s@<}&SSG1TCf-GYHbLk-=?a5sDiLExgw7K6ufHkypZLT z9&KR)0-((__U3o?W@gvfVO7GWih5)^y7F@b-Cb|=@2_3-B#s~1gFWzvbP{Y>lOYEZ zmp@ZS3{5L^^Yv(Wy>jcyDwV5DBf5W1T~0cb{FP8*y0?190q5EA0m%lQ+ejT2=9cfc z2Q|Dh%BD^Cb(jWm$I>gbKtKt@$}zNFTrVDgg6R7lbiF%r_-z!*j4~$N7UTd@R%7j< zO%)sZtv&WH9p(Nnqo(t1VcbnLX%Am5d#lze7LtpFm16@IOSksp{I#a;H#!vuO_J0y zR#wF#AeQ#SR%+YB!WIS(7JwOiqj)^tEn`@;i>G0NCU7?Na#u+^;a4yF=F`XTl_O_` zGnBdACZsN$XQtwrPJY(AE&x9jJh{0jH%~qI%A2P^pc=Lil?@m%Ny+F>RnQ_^p*Fy& zRxnKmbJ+nnR=Mv(&kqf6|F+}PPZSkYTN`GZhfD*J=rnr&0~|uha~jUpV}TB2TeO@K zcbewJkP}}x4ivek1e9meXm9yFss86A#8#=hzj92emgS+a^NXcDc$~a(c_?LAnNQ7| zhxJ5k%EqP@I!NGox2~N+qu)t?h|==KNd-Z80{%Q3 zak+R}ryMa+U9TvJzuMPVz-9N9e*UV%R2)&VYm}R+NBd$nw;aElUU~)BYjpbeU>%Lay4zW-d=g{%1`a*+ zT{^#t)e_%nh&G(x%p3@`IGFJ~cnt4Fp_Ay>_YJ={F=vC<4&8@0ZLbZxw)dyXCVjzsL? znk1$ml+I7=1dvc#+%ik;vGj7< zZnlmZH=WpkS14|o@Kv$%DS+&A9A8DKI!c*Hk^~2LrN_`xasVtvqAJw z$I*e?pnDW>iO}5qp9Ccw`V5;-FXRlbY`i@e?%t9N@`;i2?0$Ezv7v34Ew3e{%0>CT zv4BuBPc>cD{<$v$+&4iYUamlubHG+`dH8aN_i{V2CfIp@&jxzv{3=?;#P8TATm1Ti zx`Y=EKfh9X9{z$!%70*Cv0`?Au+{wXLuYNlEtb0t>~U-LoXLXyaq z%(DOC6OwOC-vfyDD}o$tU692=TPf^i9ZOxJ0sSes6qJ0hKti>{ySP08kZ{d}`D|ymIn5&JvCFnI!rFzgzm&_?$ zX)G_8&t3fPmo^l(FT!L5hkmh%KY=*)s}*&Ph#t!8k*!WLm~+q3@Cd18#S6@ca!;m{%>KMfC#SFWw4#Ln)E*HD=%#dmyS?NV57*lm^9uCc zQEk=Z07qn>y*j7ogjXDOa+I*!*)ss5pKBy=#(5e2&*BSo zSUF;nLGVj0NNr0Es7BBpL^qguT*mE;;{;=Sr&d0N`Anbq^nV<;tl~N7?a~*67N4Xsu>te!0cZ0lu_Z*vIq$AOTYnv7Sn>j@Zli%wX*nDR` z2}5Nuq=dM%X&Qw%b*}nv*0ZD9V+}>Q_*64K3ia+N(klt%IZ;R_0+cXIFDsb27_#Iy znkC0byl3Q=QT>`Fp}XfpTlXvTYDSXh{0{oH$Q&`c)HHs4&h~pfW>f$7MIolScvuxt z2P_Xhl9B6%J31mgvfk$XQ$U{{08R4At})wp^>WSAYXMvRSwu^Hre`D}W4`*Frzk+_ z#C&!bOrF_qE#`l!N_TlWW02jqNo$L(Q>7(Jw!!R4WkWSXFt&bs;DA=~&2opJ4h>;y zYCQ4_7qoJuc;&RhV+}gW(qTpK2F{>VE!CoWE!hXZZ`%KR=_1aA{!doea_?h{-|lwn>jqQ2@q|i9T}bHhzMqd1B1YnVen&mVtRbt}KbmDY6Kc~7>g@2V^#9mtwqr#>FL|d37{+1T zwBcO!Ic{EngzK*5^+FSn?f7!JLFB3fD5k)ivzFeu)cqoH#bTB`$7>=S`O8ErvjA-Z z@MFWr}RVyK|yPa~QQ?MhTxUSG)BIv%-|r{Q(-59dG6Of4g#m)auSzqIRN1{n6w z0yW87>fHy{CmC}kHiWKyP|u}AGTzcWudQ->N}xCLQIwYDY?y!dqb6;s#iyf0RpAB_8mG4v#> zQzB7Cqey|Pct+M~sA%Xd)>HKMSeJOqY3xqtDk?dji=Zqe4Ff#}TEv(j=*jrdpad;h|RIb)m4mQ?4bUyC+d&T4~66M>7xFy-I zWsLP4U9r!Y0g?&c%{A$&4cs;Fjc7MvS_k?tkVw~?9)ga*#qj1`C(hgeUX9K(>f`kO z*W_Q^tJJ2~Qw1Ngvgkv)z5SN<1WEr?!>;G-4Gj)JbQ2}*E49|f>h4T#Pof+_w^yBG zTZ=Eo%UDRNy~m+HFF*WhT*HtQ0+2;V>|$;QZ$kGq2Z9SJ%?>L6ME3j&43EZ2`gh|6 zWpBOG-W_d(B*;i*UtPk1BW-B&+n{9`9o=vBO}WFn)P=@PQEX!pRmIr(MQpU(#gZS| zIx-E|7q{JFb$&F~`cA)x=^uGMr!5@$0~f*I5hhC4hY^RH86P^G$lz_F&Q+DHUP8SX z!h7{8B6#PADr))pV$Zg`r5mZD70TBD2D9IN#T#Z6>rn&r>I7^CrWPpQMdqk zyPyDJD1i76pN;&*>yNJakIgwGDHmz+d+ zXh~!EO;O0$XNgu;v#aJQ3{C!bg_8*Svwu`h-yD=BIV+|0e8!C=-Iy%R@ZvspMihVnOBj?-|YZ&nMk9=Z0Rz5g6NQVwC>@jVv0uU)g-yYd*go*i0f027vsBH)^2 z4U^y$g;6h-1Q~fCKe_IVddf`lV&@^VnxBAtsKu(^4+rXpKwnN{0oQW*d;uFIPWALx z>gUI|>4Ht0-QIW0Qj)(Xfkuriwo8A*#YE6d5%F?mgi6P^_ZV88#q?vDd2hMV5rkQW z?974-%X)n6djn8kQ6iB<2k@UO_c0I6#{wiA%HX7rq~+us;sclkH$=X$lqK|Fzr%hD zYV*&EF2Gh|i!Kb`o<=nOqRMzb!4iL3LrLHdi~omKH2V{*WN3o2TfyB+^U%gZO|FUU zj1uaZSUsCOkPnEKJj=%c(Z8U+ON{*Mrr~9_ikx=wmrf{$Wa{g3yI-+J919tm*7yZM zUGhCxdMnJUt*@RsQ}Q2at{igi>CwTh$2*s{r+M3R?C(!>#cn6cG>sm|;3eSC@MGjF z%HBkZvx4-QLqKb6f*YlY*R@We`7N%Bey1!ug>!nm9LX16d<^{)4n2F;X|<#KUh-;~ zN{PaKCBlg!GO)vnTjzJ&CiCiw3rVVq*u*pMM1cVCD1ZD1+GIIR6_tXLWTrjtMf4K^`z6L>*_G5|GDVi&!2L-N~sAe9IW3D0uUwwqU3b?_&(egAd&|oq>gc zu3c`-9CNPaGu>~^LcN9g8o+5q6hc?Ve zmnKAZ{I1mlMV|8oQtg)Re0nx}b?tR{3Pk>Gj!x8ClFl&$Y3Sk3xOSJo}D?i@tAmyUb8pp!bp3|y#U^(yDr6rwz4ESB~S2Mfl<&z zxh*j}>*~Qkk=@-UN0f}TS95_o@ku8DKr+ctu1X2VSUPtyakj$5=<88qgZgV)nY1IK zYeSeThSV9N_X8<9@7$0iRVwKj1F6z@*cW-lEA{LN2?>`+YZ}d)2RF9|dBGTFr#_b_ zVarpYE&&=od2U`Ym0PDK0&^eeEs4DSi#&=v;16!Pc)?Jj*(DOx3v-*<1Nvne^xew|9-visA`)9MsKitg`huHLMtC_x+8$ znX0(K`Z}E#k*TBI&4q8p)VFjsm@#7BF-&Z+qW~_)p5|-5fv{~)?mzle*^iKKi!W6q zpjTF6=uj~~AUUqoe`R6gz4F8U!j~Qnjf?3q2ux{C%$XhP3|a$>32lB{^gY}i(71^h zRAW|$vL|{7jV!u%SYzZvLGYEXm}nTWv2SJxgcVfYvIev1Yz3I3-frQI*s8hy;^*f` zv;d6UlK*)BY#UvKv!)0dq?(4RbBZgh>h2m#9l&L%&!ls7) zNYHz~5!BW97NU`P;ULEA{`Q^eMGzr4P(aZ%n2PuC?v*zM`|4WFtd^l^#umlLj^DR; z;}Z5Wiu9z8e*s$K46%=~1l$%!+H8LWlg!bjd#%oEVKb(MEQZ<|Qlx#%{V*HS2)M+BDp5x#L9;H_~@dXy=cs48(GCBdxJhb-7uTDTZCo>*M&YQvG~>-tR>q|(iC;b+2A>K$*uNj@qXxR!t6aiT`F;E-@Ku2ADcV-T1)3$fiw#=I?vYFn2!jLTR7S^I>1u-lIEh%_Pj|j##=SDQ(E3dp->tNlb9%zuOQ^ z@Vv!utAE6>scAV>76GFYw0Q#-seh;a!}->J1>g*Fdj*4#q>6YiE3a~6$oScB*%xHa zg};L_3hR5x5#2i^2b_V7uLX;4T4bIzApcvC}cVEkzKrTJof8+wmb{jYB~mS z91#~Hv!nT6oIuQVH8)ShTMjgM^3Fo0+us9Y%e2&~C0i^`(#j#ht&Y4HT_D@U5@DMc z)HdeC(u?8E3~T7u6n0t4tDek+RB~?gsls2-wl&2&o5jwb99w*MdV3jhZy0E6{pjGhq*!X_c=U}^^t}{46RN2*|v*T=kb_VU&e(vw~k7O7={OtQK-5luF zYE~a*aNMPMAF?ipCF(ZdU}L*NsE`u|iZ69cp*4K)$arUN`q|Yes9kLVmi(2q1MyY~ zNbdjC_n>#;{_f)gc4RBTG$8FG*VfF{(&;+y0Tr`C)xBtziTc)rnRwH~xPFFm1$Y|k z!a@n4)ICLjaf(oWm+McF4}}jRP#F5XYEACBYRFwoLQwJa=X)A|saI1s9yYnR+Nxv( z3f%?3y{{3^%)NDir`a{PTGIJDc81v@zhXXgnwr~FmZEPl{TXuw`kB{A11Q$eVZi>g z*=mLe?OOPTSAm!(`$NzbJ_OEoI}62CBOBdtXf-#+q(6qoo%|!dV&WJsN*|^SAX#?i zh}IwRx+cgtx65KEc{z|wol>~$cRVb?gvne1GL#gEM3OL;&2JCUH>%UvN~;ZxdcS}u z0hw@mzs=%uk)D_4#vN1WwNr9`n5*|~F0s${M2d?nnLkWTO8ZoHe6fV3>+|g2;^nuw zG9vjKb92iWMO5`;_%x!oVC+BFkP0KwhG}ip?Ny#&3|dugU^gX(9G!cQ7p7ryW5;GV zNFY?X>y3HM%I_1R*(P9&Q3x0|YB-?IK$Cn>_cMLz4|1t>y-c0-o2!wDZ-4!@P}l3j zjujSnXxXTq!7nQy*qZ%h{KeIwwg$7d)=pAo)>kB*?b|1PwFd1z7Z@w~ZP2?h0WO0S zg|fEOdqorAmiW0IaeLW&pPs*CE9U*p6{;mxH-r_a5J5&7GWjk(e1=H|&O(7c4n?+m zHwT0OeC6SpEzu|7%8$Ri_!QM9rsJB5R7j6&5e+b3I0(Ff{UkgvHT{0!<)RO~qQ&yd zm`&w;Tl8r;cn~9gLXJZv{>{41M`exfp9|#H%xXtsWrrORi?Xr4fXR+4^5aLY6mTai zk@iEqr|o!}X|m^}wNWfKYQCT%bcLy6UjA!q#stJ~G42Ue7Wq?FBPEb=G{Qtf6#XpCWchDOYirBvM58_Sx-NpkKXuS@^h!Cbl z_u@o0yHTF^R4EOwS9h8OVYPo|szA9cwSb2~)EHkDYJ6aE3~7AN%DPx3e>^tddgs^q?L!-;-&jW6t+6?EJ~R7JUZJ+E z2g|^iJ%j6BQID~dNj(=E9rs&x8{Vk|Lgq3)RFO* zrdA2qE;q}2a=RMCetY%37dAx``JAcyFV1AIZ$HwJw|pSnzYVJpqCSsD%WC;OJZa^{ z)EeMKCz+0df#R+oqQA9TW4HM3NzJ9u?uNW6SJ{j}jWx=p@713vGV~@S+!i&sEHX47(3<3(LqI#^=@EU z3!T%n9-f-{MCk??9lHXueT5wjDizXJK<3Xatx-@X_;79&S+A;bf4c31qDIXI)7M|U z`e{^Gdiunu@^=^vC07E)hN6B1&Hc^E|Aq@WNgy?ONWGz&uXr_(M5Cv8yB5-+|K?;J zC%Qe~OB~gP5&=)wlXXsPG^+-YyeXfeGB<;KRNqR_S=rhMsb)}Nf!1M4F7S_41zsfY zDgID1l^fg zUJI(0J8bCMe_zrrwetG9snOY*Uz)XMXzUupezW`f$f9L|fiKW+uKF)dyr%N#DVpYC zYN#oa?yh3e5XQSd-r;G0_>)~HO!j{FY$e3~wK1onC%Z!8s(;zg$FOJletYvk&~G9O zOl3=$328*DfbI}rBTJXSEWhaXDDcoFgZ_z{>t)`odhc?Zx&SbSe>kXs!h5kPDdfTm zm#?AggSz_M>u+=OukEhtJcaqxn0}|eI@=p69^3>D8X#q5&^GQ{zOd4+9M@-b-8L8i-`XP!3k#^ literal 0 HcmV?d00001 diff --git a/frontend/src/assets/brand/favicon-16.png b/frontend/src/assets/brand/favicon-16.png new file mode 100644 index 0000000000000000000000000000000000000000..48d84c78ce794cd8383cb9cab9a3e0847e1408ad GIT binary patch literal 709 zcmV;$0y_PPP)hrVfvN z4c3F?0OR=(W)U=$patgn|g`S=0Rqz#?1Q;3vrzlyDCD8faCumV&*)O9+Q*A z5u*S|+<$seBF5OrCkZh|BsnDc$77or6B7?9q$ybz$Yy3h4Kd5-XlZUn5);)bX>&74 zk|4=EfKL);>vgvGy~X#xjIyv;q<3wZVw#eLz{u5W43GSbFBI7E?iL0wj!=DA!^b0tHgzd~{S zCSAWdCP~`=2;5(=+^d=`wHkY`}X@wN~T8umunRAM9$h>!R4d)A)_f9bm rx!~wm$j&!jbY3FDEGlH@gQNdnr>Rwjcap{$00000NkvXXu0mjfEay~3 literal 0 HcmV?d00001 diff --git a/frontend/src/assets/brand/favicon-32.png b/frontend/src/assets/brand/favicon-32.png new file mode 100644 index 0000000000000000000000000000000000000000..1403d034a888f59584c60502af78e14fe27781cf GIT binary patch literal 1576 zcmV+@2G{wCP)3~FADhL8XY3`ECC3)_i-})k%ND%A`1$@zc zxwFsiclX)-{&s~}%;D8n{qWtD_X+Yfuq7xVK=|K^B6NY-r|7!W+uJu2i#Y-inKpB! z825XiqSkUfMT`MN)n-<8?rnKd!X>k+jpJ-l>no}j5$C!hQ1uZpVjQu)KgS7<9J2v2 zBeC}S2L})_s9KB>L2q+Gr(%7%A;JFz!om80PBkDwZkkBYaFgX@0PeN>L@t{g?L})0 zMg*&tK2^USz*^gHd!?T%_5T@w2yl2V88>D$Ri!2P*0Oxj zLRx?K8|GKc;JNh;Jh1ZX_}0?A{~+_1ET#JKm1HtL7u(`=bf);(ns2e~l^;9xj8vB?>oryHETJ3=pCk& zm*Mm^9ac#slQ@pS^U_RRyp$&v)$sh2D>&M;iBsp!b19y{7{lE1GD49s#&K9!RmqlJ zdk_&^>1((Zk32-s4KQj%9!us|BO?9(>cF2`Iex5_tPy#HvU`cMaNJnFQ@@&r@1KW= zu%T%)U8yc!cx3}y_w3~d-}ox!#gpmo>7lE~BR40?Po906$>VQFM0oA3W}=Y@L`&~c z?kv?~@14-grE&XCo&HFz_IRFNY>R8&%(=>>5}ozvGF4SgbR;!nt*WZNv16Aqp;&XK z->bKj&sN5MQor!cdR0|Dd+`IkQhxe+lQL$N!9*JA@x^ zdL7^Qd2n_memp_EqXXYsvV%d6Y;ETGpKoMHG)hC=GvtrRGxr_T@w1W@Sh0qgq|2L1aSi{U0vNM z+B*@}f(T-ypW6q8!=%$0deR;!pbFBv`>877>}&v1-93naT1AWy358JAULH_Yf`I^8 z!Qg-gNL7i1vO(lp`yE!5K)@v!3|!U3_Ay>G68<;e1E~0N#(C$1x%XwV73^eJvXuVlgNE`^~%Ef-(C*Mk1Qm#}C)(JeNNz`b27P^Dl|T aoPPq05zKCWFX2J}0000 Date: Wed, 4 Nov 2026 22:41:05 +0900 Subject: [PATCH 2/2] =?UTF-8?q?docs:=20=ED=83=AD=20=C2=B7=20=ED=99=88=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=95=84=EC=9D=B4=EC=BD=98=20=EA=B7=9C?= =?UTF-8?q?=EC=B9=99=EC=9D=84=20=EB=94=94=EC=9E=90=EC=9D=B8=20README=20?= =?UTF-8?q?=C2=B7=20vue3=20=EC=8A=A4=ED=82=AC=EC=97=90=20=EC=A0=81?= =?UTF-8?q?=EB=8A=94=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .claude/skills/vue3/SKILL.md | 2 +- docs/design/webmail/README.md | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.claude/skills/vue3/SKILL.md b/.claude/skills/vue3/SKILL.md index f21bf64..f95d652 100644 --- a/.claude/skills/vue3/SKILL.md +++ b/.claude/skills/vue3/SKILL.md @@ -31,7 +31,7 @@ description: Vue 3 프론트엔드(frontend/) 개발 규칙 — Composition API | 라우터 | `src/router/index.ts` · 라우트 표 `src/router/routes.ts`(라우터와 라우트 테스트가 함께 쓴다) | lazy import + 첫 네비게이션 전 세션 복원 + `requiresAuth` 가드(미인증 → `{ name: 'login', query: { redirect } }`) | | 전역 셸 | `src/components/shell/AppShell.vue` | 앱 레일 + 상단 바 + 모듈 영역. 레일 모듈 목록은 `src/shared/constants/app-modules.ts` 하나 | | 디자인 토큰·글꼴 | `src/styles/tokens.css` · `src/styles/base.css` | 색·간격·글자 크기 변수. 글꼴은 npm `pretendard` 자체 호스팅(`main.ts` 에서 import — CSP `font-src 'self'`) | -| 브랜드 자산 | `src/assets/brand/` · `src/shared/constants/brand.ts` | 흰 로고(전체·ARA 마크). 원본은 `docs/brand/` | +| 브랜드 자산 | `src/assets/brand/` · `src/shared/constants/brand.ts` | 흰 로고(전체·ARA 마크). 원본은 `docs/brand/`. 탭 · 홈 화면 아이콘(`favicon-16.png` · `favicon-32.png` · `apple-touch-icon.png`)은 `index.html` 이 `/src/assets/brand/…` 로 걸어 빌드가 `/assets/` 의 해시 파일로 바꾼다 — 배포 직후 새 아이콘이 보이고, 공개 내려받기 호스트도 `/assets/` 는 연다. `public/favicon.ico` 는 주소를 직접 묻는 클라이언트용. 모양 · 크기 규칙은 디자인 README 머리 | | 토스트 | `src/stores/toast.store.ts` · `src/components/feedback/ToastHost.vue` | 오류는 `useApi.ts` 의 `showErrorUI()`, 성공 안내는 `composables/useToast.ts`(API 가 아닌 화면 쪽 실패 — 예: 브라우저가 알림을 막음 · 보냈지만 받는 사람 일부가 받지 못함(+ [보낸편지함 보기], 문장은 `shared/utils/mail-send-result.ts`) — 는 `useToast().error()`). 알림 안의 단추는 `{ label, run }`(예: 임시 저장본 [되돌리기]), 이동 링크는 지금처럼. 단추가 있는 알림은 10초(`TOAST_ACTION_DURATION_MS`), 마우스 · 초점이 있는 동안은 `hold`·`release` 로 멈춘다. **단추는 띄운 세션에서만 움직인다** — `useToast` 가 `authStore.generation` 에 묶고, 로그아웃 · 세션 만료 · 다른 계정 로그인 때 단추가 있는 알림을 닫는다(메일 id 는 계정마다 겹칠 수 있다). 오래 걸리는 처리는 **진행 알림** `useToast().progress(글)` — 저절로 닫히지 않고(넘쳐도 다른 알림부터 닫는다) 글을 고치다가(`update`) 끝나면 그 자리에서 결과가 된다(`succeed` · `fail` — `toast.store` 의 `update`). 결과에도 단추를 붙일 수 있다(`succeed(글, action)` · `fail(글, action)` — 7단계 필터 적용의 [{메일함} 보기] · [다시 시도], 시간 · 세션 묶기는 다른 단추와 같다). 진행 알림도 세션이 바뀌면 닫는다 | | 모달 대화상자 | `src/components/feedback/ModalDialog.vue` | 네이티브 ``(초점·Esc·닫힘 처리)와 모양. 세션 만료(`SessionExpiredDialog`)·나가기 확인(공용 `components/feedback/LeaveConfirmDialog.vue` — 쓰기 화면 `ComposeLeaveDialog.vue`·서명 설정 · 부재중 설정 · 필터 고치기 창 위(7단계)가 쓴다) · 메일함 대화상자(`components/mail/Mailbox*Dialog.vue` — 기본 슬롯에 이름 칸) · 필터 고치기 창(`components/settings/MailFilterDialog.vue` — 칸이 많은 창은 `wide`: 폭 620) · 주소록의 연락처 · 그룹 창(`medium`: 폭 400 — 8단계)이 쓴다 — 새 대화상자도 이것으로 만든다. 되돌릴 수 없는 일의 확인은 처음 초점을 「취소」에 둔다. 초점을 지키려고 `aria-disabled` 로 막은 단추에는 마우스를 올린 모양이 걸리지 않는다. Esc 는 `cancel` 로 알리기만 한다 — 브라우저가 막지 못하고 스스로 닫았는데(Esc 를 거듭 누름) 쓰는 쪽이 닫지 않기로 했으면 `reshow()`(ref 로 부른다)로 다시 띄운다. 초점은 열린 동안 `focusin` 으로 기억한 창 안의 마지막 요소로 돌려준다(브라우저는 `close` 전에 초점을 창 밖으로 옮긴다) | | 외부 HTML 격리 렌더링 | `src/components/mail/MailBodyFrame.vue` · `src/shared/utils/mail-html.ts` | 메일 본문 등 외부 HTML 은 이 컴포넌트로만 그린다 (sandbox·내부 CSP 근거는 파일 머리말). 보여 줄 HTML 고르기는 `displayedHtmlBody()` 하나다 — null 이거나 공백뿐이면 textBody (읽기 화면·인용 공용, 서버의 `isBodyTruncated` 와 같은 규칙) | diff --git a/docs/design/webmail/README.md b/docs/design/webmail/README.md index ba61c07..4fe9b46 100644 --- a/docs/design/webmail/README.md +++ b/docs/design/webmail/README.md @@ -26,6 +26,13 @@ 로고 원본은 `docs/brand/logo_arasystem_white.png` 다. 흰 로고라 어두운 브랜드 바탕(`#0B3640`) 위에만 둔다. +탭 아이콘(favicon)과 홈 화면 아이콘은 바탕화면 알림 아이콘(5단계 `notification-icon.png`)과 같은 모양이다 — `#0B3640` 둥근 사각 가운데 흰 ARA 마크. +원본 로고의 위 덩이(ARA)를 크기마다 따로 줄였다(2026-11-04). +- `frontend/src/assets/brand/favicon-16.png` · `favicon-32.png`: 마크 폭 86% · 모서리 16%. 작은 크기에서 가는 획이 사라지지 않게 획을 조금 굵게 했다. +- `frontend/public/favicon.ico`: 16 · 32 · 48 세 장(48 은 굵게 하지 않았다) — `/favicon.ico` 를 직접 묻는 클라이언트용. +- `frontend/src/assets/brand/apple-touch-icon.png`: 180 불투명 정사각 · 마크 폭 77% — iOS 가 모서리를 깎는다. +- 모바일 브라우저 주소 표시줄 색(`theme-color`)은 `#0B3640`. + ## 디자인 원칙 (사용자 확정) - 안 읽음 점·개수 알약·코드 태그 같은 **뱃지를 쓰지 않는다** — 굵은 글자와 평범한 숫자로 구분한다. -- 2.52.0