From 660de92bb5a1f61912a832dc22bc41a6eb87b09b Mon Sep 17 00:00:00 2001 From: Jiyong Jung Date: Tue, 4 Nov 2025 16:24:05 +0900 Subject: [PATCH 01/10] [BOOK-414] fix: replace deprecated assets --- .../checkbox-filled-rectangle.png | Bin 436 -> 460 bytes .../checkbox-filled-rectangle@2x.png | Bin 759 -> 796 bytes .../checkbox-filled-rectangle@3x.png | Bin 1070 -> 1082 bytes .../checkbox-filled.png | Bin 695 -> 684 bytes .../checkbox-filled@2x.png | Bin 1243 -> 1279 bytes .../checkbox-filled@3x.png | Bin 1656 -> 1731 bytes .../checkbox-icononly_active-rectangle.png | Bin 330 -> 328 bytes .../checkbox-icononly_active-rectangle@2x.png | Bin 516 -> 501 bytes .../checkbox-icononly_active-rectangle@3x.png | Bin 665 -> 649 bytes .../checkbox-icononly_active-round.png | Bin 330 -> 328 bytes .../checkbox-icononly_active-round@2x.png | Bin 516 -> 501 bytes .../checkbox-icononly_active-round@3x.png | Bin 665 -> 649 bytes .../checkbox-stroke-rectangle.png | Bin 568 -> 549 bytes .../checkbox-stroke-rectangle@2x.png | Bin 1054 -> 1064 bytes .../checkbox-stroke-rectangle@3x.png | Bin 1591 -> 1586 bytes .../checkbox-stroke-round.png | Bin 894 -> 900 bytes .../checkbox-stroke-round@2x.png | Bin 1837 -> 1819 bytes .../checkbox-stroke-round@3x.png | Bin 2723 -> 2688 bytes 18 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled-rectangle.imageset/checkbox-filled-rectangle.png b/src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled-rectangle.imageset/checkbox-filled-rectangle.png index 201dd2d9dfcb75f1b9783bc5c94d17c4d04b80af..983862cbdec0b2692f88171759199e8a616a42a8 100644 GIT binary patch delta 383 zcmV-_0f7Fr1Iz=ER)1khL_t(|0lkzxOT$0_hTlt*TC75#E!3rT&_RUK;0KB*_z$G3 zi|sG4vx|#3T5xY21*Oz~5OmN%sGEaJ>n=o4mwcRekqS*xAs^?ngxtsTa7PFMW8?l{ zK4qF6fK&mhA|@2HmsZkEee+^Ke&kj^39$!5Q4~#*P3ug6oPVR5>{cXpoIQx6DnTr& z=l~K4%*t7uSB`MK*1}@8JT@mICL{Smw&cDSGX=bS4u9ukoxm$^54*T~dmLL6IS?do zzjl4=e1W;Cyt_FGxi7GtTfx0$SBVB5AvKzc|5CT1>O daV$+|?r#)Xn`rF@6cYdd002ovPDHLkV1oRiuY3Ri delta 359 zcmV-t0hs>G1GEE>R)0xJL_t(|0lk(#OT$nUM}PM@IA|f@pwvZCaH}cAK{qEA2VLB< zxYbR+fH=E!s~rRpy13Ov+;nm=V9_toMdyMzxb*t&g9zrOLgIU#(j|Y+$-4<51WkCh zImh4&3=x75;IAljiRq|!aN8#%AM%qE@lOUsR98&g^dJ`knSYAXW7&l-7@>k+0^b2R z2~@@>aK3YjoA?q-QwwebsXVIIP_0axzq3FpPp`WD*uh=@!A&4f-cCB!aaKTfYRdb`R_FC2~%gC+3`{&2^Dnycv6qQ?n7*Xp z8j{x+G`Efm%U}gsZf$Vhjz$!tu@YO`i^zqMkEuw~ag~+-8puY<$c2$3a>YNqO&J4t zMCo4-o*=@tBGA53f`Wot(L+U3x+n3} z+Jgux)EvC(*&do6)T`B#9!d{A2!f=Sil>G~@FeX`D59wcwV?~J_zjWX2S2w%+Aj44nhsr3U~XF^8ts$ARwe54sciyS$`Hx(;UlRnJiWx!p)8T z`QbzMiajbeA3?l%ZdQbdHTjPUQb2|;*|Wm52XsKRi0POXNiZtQe_ogH1VWFUki7-4 z_tS7HVcXw9LlDtoBK#=misKA2VWCggsevO7FwVKQ0)i9+&1nlnjrIZt#Ejz|N8s`4 z2XOJ=87Tby41Z4+UqflV?E3v!wE%^Gd2U38C(>P)Ad|eQtP>l7&G5%M4)551shOf}N}TSx4A0JP-{aGWFtMZ_6@T0aB0QmNfm1+x4G9p9NKlsxGdzJ;=k9Pn73iWiBJP;#QCeSx z{l>ms`+tK9PxzinykDM^w|VslJ3O(cxsXbtnxMlId!EdBNrVxeXlgd&w&|He(`Mz!ov3`6gS$B7Ne#u5H%!F1YHrYTN!ek23-+v@0n8ZSEg>ldf)jTu`A4B1@~`tY&Fb3ecJZT6>^FOVB@WI%O+w z<+c}lRMR_qJC$IGECOEO7?XF%9Eu2h8W_t_m#;pw0W6MF0Q* delta 685 zcmV;e0#f~)2KNP!R)361L_t(|0qvSUXcJK!$G^X`s6hh`g3>8Pp*5wSMO@p&Q4#H;6$BUEV<%CtU7XBtbh3+PvEU#SQVHph=lh;UlX!W_HMu_z@_~?h z_wI%7CwKSWyFY>+vd&Dn|*2CI0iUCp^ji$qdoQd`2nt6&4~QIY&V) z!&+3q(PxEChfWttAG@FM>Jdd`E#i%Uo!I%3>DQ3CDo z3)6F6IX80-#eanx#x{u&Xou%_C$q;-8QUd7pkH`W{kCar8@qrh{MzUDSgpP?wvSa{ zQ23?wM+1K&Hi2=3C$R{OD?Eu@V4UH}KmiUUS7$H%?VCqo+~LWTsWLZnR*#1Nu6NiY ztbQ{03jGKpJTdNp>vPw-${ZDoXUrp`A7OB_kX{2K_$WrPmBVuH!HsDhm{CB zJUMXk%IQ+S%I*4h@54z|FWyP5?17q90SC4F7w`Jk)tf(kub{#TPXbRR*0yw*5B_1I4o~(q7cxn7Z5MKQ zvhT^he20{P-ME5x5sh8k0M7aWfH! z8w%85FRmjBZ(u3I8bs;NMk+kyJL`S{ySFeB Tmfw)z00000NkvXXu0mjfd?rTp diff --git a/src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled-rectangle.imageset/checkbox-filled-rectangle@3x.png b/src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled-rectangle.imageset/checkbox-filled-rectangle@3x.png index f989b6a9dc7a96292034c465bdd8cc61f6c8edce..db1f2bc5b6f598cf0b9b9d0976327b1a23a68b47 100644 GIT binary patch delta 1010 zcmV?3;x^ATS^43dc3y zsrKUO<>8=DmhZA}d!arGGpLXnlvMgc*V53KPfo|6esHj1S(am6(JSMnJBmionWdpA zLg_Trag@;M=iT>0`RxJ_jvR^784y7hvJ=Za_Z15TC^zTeVMUukgeBOV)QNMFG6%5< zc}n0E)hy>uQhz}HoUuNE=)VG)z&?rL41h?rw3HfWhZyMxk!qBXa}0=ffJmz#PSRp> z)-EW4NH+mwkN`4B02w5J3=%*F`N6|=?>_~Xj+}?iy~p9}_696|kHVeRN0vUrvp}Qm zgD~1QSlB+it3}yPrnlhXm&c|*$CHOxDNfNo_Ii`Q5r53)IUqe8tjWI{S{quxY@Px# z!pXO`vjJxF43Jrz#cxqI4{d_kJON}D=fmb_nEf~hR&qU%6`bp@Z^ADNqX%;}kkdGr zYk{hPgSir@S~!^NfU1duxeBP-IGAgIYJr1UzFFPF?qe<-?1p1aZSd;nJ6QVh($a-j zIn@dWvwsA1w6Ps#PfjZLGuXvLJ<2iy{!nW>>)=GS#K9~bVz*9A6mat4G6JHtHXH!E zt2GX08VE-ZVyNW=5)U|-X`p0gOLxDWNW9=+rh(SB*OmE3FFTNU!oe)fK{wvqR+cRF zssxEQ9Ly5X`^{D52Xg|6M;y%Zg`yKkyy9SGU4Kd2iNrGwR`#ui9Z0<6U=`hqRf6OO z9IWD-)pC&Bf`gH>(W?|}sPsNfD}*$955@xyX4`Uy*^%TX9L(1BAhSq%@q~lfzF<}f z5^p$|BP)vKAn}NUIkx0#1&LQ2%+WPzGe|t+V2&@^>ml)ugH`2!H4teeHVLuBTV)%u z@PAj~c*ntPyHNCM;`MYfxhP4n(W5*fM*(`l zq}Z1bh;k7cisVfGUI#tvnVTV$)IAcRG;4$wh3(Qeu;mYYOw|!Gygrswl(>VHe2k8ql9j g&P4j=HBV5#0R#(O8z12FJOBUy07*qoM6N<$f-pkYv;Y7A delta 998 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 Xmd_<9Pow7300000NkvXXu0mjfQi@ZB delta 1173 zcmV;G1Zw;L3EK&fR)26wL_t(|0nM6EXdG1>$G^XsV7f|S1tFW_Axjggm)#XASWg?F zG1_X+kn=v)#Zh?!0-k`~AK5`@KKEw}cSLT^&v0$$$1}*;H8q`cOs=3P}+E zJ)^|eB}K4|vbqT}ENfz+gndE?h!*{LYfPCKVX=7x!y-k~Ft8ld7~ckn@bdPPNh;Gh zTMO?GLXkjIehu+uK<3KO`Ot;iP^1d06TeJ(t?$Wz+?C-zrPOtKi+Csz(V&;!Fj`f} zd^dDPmDMf8Cx2d$2D_EJJT%&>qUmN1zOpAH~?_&e!?o|A`hfBw$RW|f*6pv5aH zpv`b#=iQ8Oi~;F71-gz7f=n8-K3e#pq1;}e16F)K!jUE*8ywiL*#o;Fh&gzcI#9fj ztd4|x*kgeBJ!C1+x#V)+4j1YRYA#eA>+hn?96H#8FMrpAk$;fA`r+?dphN$mDOIq+&S6q<<_R{mdgdL)Uhtuc9{4G@daCfvl|_~%#5tXy+^ zj`tNK@_$P04Bl4aC4k-FV1ChnD#y7F! z9&n#|4|czR_m3Q}jm`TZWbwT0LADDnONYVqF^vZ%77gPPZ}EB73y`dGv>B{TJ2f1Z2cm1Z^89{lUuh?vBKcW9Q``%eEc7V(B# zML$NwC0-!HoS8Z?kYWKX^DkbEko$3o7YN1$%3aJSRd@G8uMf$jCOal4WalIkpPeYg z3xDiFX>)zCw9SE>hsV9JTTgU%J=ahcm3YSb>*K`>dLAH!IX_R{SYuJYwH6hjcxnA< zd96%jJ3B?U`M`-*MnoyT%Ch{^sYP+4-V*}}j*7gG4`}L6QH$r+FLHuQXX$FW(bVym zEtp;7eiON3#M*;9$n?A_AB~^>p2wHJe}980VFOOB&)?P_vnRDENh97Lw>`b$1}B`S ztWOpSwQGBY?B%!PJ`3a5d| zlj8vg2Z+`C?g056m7+rX{lwyo)4irAH0wX#UhV`V>_OXbA1%i_aA*~LYc5@j!{(ovvNyQiVJmCz&qADEEAGox8 zaN(8UKlTtqzyYq*qzX9kv70RO^K(cfihhOHJ_8|8=@m{AljK<`E7?Bop}ty$$|S@B nmBruqAIfBLYtIH1UC&b!TLl-F@D4@P00000NkvXXu0mjfKnYG| diff --git a/src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled.imageset/checkbox-filled@3x.png b/src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-filled.imageset/checkbox-filled@3x.png index c6ac5ce59238eba124de228d0e72e4b782be1a8c..dcb539f5cbd73678fc2290cad185fd3528ea372e 100644 GIT binary patch delta 1664 zcmV-`27meZ48skOR)1JYL_t(|0p*-cY#T)sfZvSmw9q1qXrU2Ovps+W2a+HTB&~yU zf}Z+wKr}>((>qFYL>!VFDlSM#=$$xHk|GYY6;j0o**GNa1rj(QB&x~*p#Tlws!5e* z?VY|i@w&F-wRgR{_OA0C;?4df-cN7d{Ors!XfVA?16?e~qJJEqBL_lZf_2FQ43v@+ z1*Gw32KQ(1+*J)=jWM?RePk{P4TOQqL|0;A^?@40%`^D#P=*MDEm#Ks#;O1@+ZJj| zCVS#(a1mDol}dpqxJ!~`E%zAk&p;j2 zCFreNF(sg?3GiOj7?BQzLjCpRCJq*%A{9`xE8rhFgrchIN+dOS7A#^(P|xDv2@|KlDgt2x@ zL=!Q?do&c3Zv-mP`Y38ZHB8zSi&(zJF3O--^%II_@%Xg>|IbOW8q=@;jk7dZkj`MKw`1w8i zKf5~zU;g=x(PbIz*q$iv*p?JAp3M$H3(JwmaR1@pA)`yf`6wz-B8UkQ1D{h(4skg6 zG_)T$Vt8CIHd3663W9o512OP<^wg50v;JtK+JE6NR{Jsimx3S$d!zkkTxF}c|{IkTG0CTJ(+K+;e;eF$stHk z+U&_6{W6I)mV1%pH91Jy((I1kw$|hqb3>8`<iRgOf6pRlVT(ohFZNbE&?J6bz(=7*X0nj^g%v2Jem67fBdL>7Jo;1 z7sLp?TXOnX#Pf2H%u?U{bNO1#TB0t;N+iv^aoG=Y=#jH@q7S*=0GpVVR4dAeX3HTo z5VQ0t1>y7PI5>b=N!9Rz9HK3!CFxTN+I?8hlHdS#BzZ*+7O!No|BEzj7qz7A7c-rD zBzZ*+p%*WrAShqV>RQiG2`iGkB!7oiIu@@zD+r=uh6DK1;2>rsc}fmY@p=+HL`i2g zs0C?awPR64RFmX2ITSrXO^X-r3Kaj6o?YGUh;=@N8l&JK|Ec%k+l||@LD_!rsFXGL z$Jg-bof+@Q0U15hsp!?~rTfaDSq&;zSN5zzZgntvmfoH}QNDZ6c#zCRoPQ0&KEvpq zD-M{^d|{^(wwJ*tsMAJkHVj7;F=3DA7x%X|GBH0KH#%H>F-zioB@hVE>cZAsuOV0_ zq-DGHR&yn)j!ECf3vo>39JDB$<%X-tk>@}S@?~=rT947izS1ha5~iMN;K0!oCT&L+ z>U#l9$`f=?rp^Tm;K(D*LVuqGe=}-U4qk-acv-&26`d%zR zwHps4eAC*-syw9S`fDZRN?3le0711|NDFoQp)pB~z>v1pU5^}jJ=jFflGU)tc`ceS zYN-3rw3nNdbLzXnaRFke>7ppt089t9&8cMnb=yNXj=o@ta#N58V|h&x<**nX*WO`9 z%d0r>A>r~O8HNuV@PFJ0<+kEZih1()U528H2Y6J<63~TN(_Zs{B89=Kn^KB#T~Ims zr4L;+NgD@YIx(4s1--nW@@oR+^KlT`8cigic?8QR7i>KRw#s8D8L=ponE{^w0000< KMNUMnLSTYttQQdg delta 1589 zcmV-52Fm%v4fqU@R(}miL_t(|0qvYmNE}xj$G>k}Fxw`up)ILiy2hsVq${L{-qu6Z zCPkA&PZeCD&?FvAEf#mO=|oyagg14-MuJvL#K{ zmAEhO_x4YAS7&!-_KiEU<^yqeXWlOJKKZ@hy!U3_FzhptZ+}ilu)Pz_1n>p}!pIwi`+TLo&j6q;y2a)~=pu}r0%@@z#3*`GPb3P~ZUyVBXsG)YrG$HxiTDzc7p>}Z0i zAnF9dU#D`XgmZP>lRcYQZuqc*1B6*V+B1T3W2*xN)p@U`7AW69{T(rY38Mk%X?qtR zcAmq@)_+didvqT^-?@p|zrHgo9>$X`>O_tgZ!BqIJ{)72a{iqmoIg3VYx`Hf&*J;F z1+%XuSuogEJg_ZkVi{zH(ZF)#KC%5s^UG#m4dtS!K#3sHTaLl!RFXp+X+DhB!>^m} z7n5yc#kr^;C^Fq2gU_RBkkzh|5fa z`S&tO=aTb3@F`a1+j*XHG#96WDk z`3Q=@XSgXx!n018AIDv;%gMn4P2HLpg!n3Y_DhcB=}uJh)3|G27( zS%1O-5ka&V^|+}7HzavL zj>NK{Y6qZFl2_yqmIYCcsg`F{Nb-^#f`0@VRtsPL^)pu^$!l^1hON6htR9#XNgk9# zi0KXux}9&hA<3h1=vrA)V>{S@O;k$qs+=tRwkF0K1{|P5lDFl6raVLr3S<&+NG*~) zFNa`Emvhox(|r$Xxr?KG2x10x6R5HSZ=dqM9Fd@JUtB(#J&V~))aBTTq#r(*@qdFH zO3>1Y6vQ|dQ6p9>R4vNv{Fcki)1PbvrPFaJKt;toB8N!OA1O$`oS=1C2`HeJ3VKD3 zXkLY7R)wClie{F_Nku&rImCSa&GVrKH8WbQrU*L~_Lv+)L{B{bp&*Ew83UVwLabEW zV{+&Ym-*t)rGwS&tx1(pL{t*sHGesvnGFr`;teHt+HWo!TPn_*G)o6$}H~Vchj|vRYb8ai&xNAO0 z<|4*MaKJFD^PUrCbic4T?JG^#UWPGDnXTC{pHbXSj|0x8LVSjSL&0&goqwi+a!svA z^;ykRaJiVJr_y@XigVJ`-DVm)hX#cO_(-*NtW_uNWj+!YG|*sBo%D}yEL1CJX~iL} z%xgJ)f~oEw)eF(znb1dRtm%9mC#wgzQ!^g#i@PhxoSV1X*wey{)`℘|bhjTmlhg@h!C<%3C&IjVxJeb1JwGTi-9OG5um5r? z$~82v_0pk9rw=qKM(qQZL~cR`vAT#-EGCa@&oC3RV&Y|3G`}cZgeKU*`67bBxJogF z--pY{sDkWZ4)Y9G@{l)iy4Ky4QjF_@%Auq#@9t;R1X-7OFNCoW2QCkz}c8R)5_|L_t(|0qv5{4T3Nfhg(>{5jui*Kp8=AMmeyFFo_q!RX0G8 z$PqWt5lr;f=#vsu0@YYb;-$aSYy0|r=^untRAhru53zH1KreJ%lmv8`?v3#9T+@(b zO8AvVtYiZHrjh!(l;8yiG-P88;O|Dkrry)}ig@sJ9D2>Z)^iE$Y)05-)C0UFuo7oN zseUXTEVnb4$iiC!!023+gi;zcC8F?_Ahm)m2JG`BUEpOOZ_`~MBzV$NsMFxW<2+hippQ|0MGT8GzN0dkpKVy07*qoM6N<$f`NN< A@c;k- delta 252 zcmVLJ8Ks3S+v z3EAKV_5db2I=bP2dA0=qq%9`2jQtIywC{ai+Z4dY#xw*vh#!Z2d=z^?@QCY7=`5k| zH5Uw1!HXi}!)l^Lk9|La9vDP~6C`W8I39j$w691BU#5{*Cv}~`-vu6Th7RD8z~7ET zM7*%(6Bn7nB>|A$y&ic?l!=nIa7jStY0jHe5*>I|r<(LPL4*WX_3xFxZ7iR0TX>^D zA^A46fb%#_3%BH)4<UI{!pI)0000 diff --git a/src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-rectangle.imageset/checkbox-icononly_active-rectangle@2x.png b/src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-rectangle.imageset/checkbox-icononly_active-rectangle@2x.png index 91afa3b7f964527e43572d5ff081a88ea78f5c69..4bc65dfaf4a843ee130485c80b80fa9dacfcb5d2 100644 GIT binary patch delta 425 zcmV;a0apHm1oZ=uR)2~~L_t(|0qxdJPQpMG2k+ypEGU3`>p!T|DVv#17M6X#uz(Z0vhJ@&F!_r z(36`(1bpmny5q&!-FMRU9cYlh@N>D@qkRFw`Dv{`<>n;mo_`iJ#D4gHLY%1XYea#> z@C5Nmb#LwOfI2+*FM|hHb$_h|%7!Pk6{sRSsiiBH4o{Q?=%tkt;W+MGS_u>3w>h$0)DK3koD99Vb0~27YR|5B zkC_TjGOq(!OPCB#axG+OC8AE(HyNJfUWrvD8J)B@Bfpm5kGNaN$IVH}Y|o93uSu6 T{6t8i00000NkvXXu0mjfyduWD delta 440 zcmV;p0Z0Dz1B3*SR)3jEL_t(|0qvK+O2beThtEv~aqA{-h2p9m9Xl1l4ta!j(=Pf3 z_7z+#PN8qmrBEmJ4dSj)H=XQcI(fY(7X(Ri^7q~ZJl_iln?5#6Q1}67k{?Fn>xBm+T%b&h{*pU zj;Vc(2#_ofco&|iy|q6Bl)L~j_b00nwZGN?W##p{ny5lvudRWq4FxeFkB|YR5SM=%Nii)F!jwEh zzsLkczCrSaFn=kJkO7qJO~Uz1Axz67E$ZU?@@0K6Jj9PF7or0F{b3hAmanm|dK>ac zD{X-a;pYuuOCCuLfaD2bQ(o81fsz|3IWO*-8nsggoViVTT{kCG2=y1WQ5D-q)B62i2+?ok3NgbjJ!rzCM9Y{?^;#xW>GIAYJb&r175J;Wd!xbr9X i=fE%w!!QiP80QBf(**zDTzUEc0000S;61&IZaR(~EzL_t(|0qxpPO7lP%$MI*xbloHLJ;AF>D@t<%T`GdTfp`M- z1|Fd+b*DG5D*oB&5pslrxM`Y<^N0&kYi5#3`b_wJpd_TBgfD558A1dA0000000000 zU`tVpZQSl`<+OBQRtM&jXr)IF8)qjjztP%2{ky#*rSf#${e zG>Nk4-#8vk$ifn}OhFvhozk>NmRc3aBF={nbrQ1Fnn1R3jFIi%i!D3o=ksaaeGHnvBDO3eVHl8rhk)lu3R3x%2-q!<`k%ZKU`7S?Ajbj_sixailTVDHcF@li;TmZh8ikM zFTcfMy);d)2am%ZdA8^{%sNp2es{$zdUL+^9!WwRW*sP>=0ykKEs~Tt%sS9he36&~ zN(y$X97$3f=5!6x%X-@^YCDsp#bM63dA=5@Oqn|wb$<(Xb-KGrjKfMjDEf{hH4ZEN zB<(Ab2X-)u~^wiA;e)`2CJ@-rnA|82yvLV(Y$>mHTh+@@{@o#%?1jS*sOqi99BrFcAZAQ^KlE65u)+tx(NJ8VV+UKMTBMFYf8kw}8 z8%cN^);Gx89S`egFIkqYDpKQ*4O&f!kPs9=N4cU$xTJ&vA%XBPA3p*ijAy*FyECirsbCS7^?E#>J+cT9 z5fKp)5fKp)kt>x3%NA$njOs5jGG%}58#Sv3^IHo(kI|Nf`hT!A`^Uci|Lu>xyGvaa zoqGG_{ps<>;lAtRG;#$YjvDBTGB8h;y_m}FM8srQGp!d+$bSB^+7oz8FZko+d?6UT1O(>|*Qk`7dM97r}$6>%WRKvl(o zqlHsf9UZFiHra0iW2Y;yNGZgDAUCVNkp?pOmO>l| zb~o=F3CD!dA))p-5Omz(v64oKA`S$f2L*@}O&lm?U{)YfRB@oRiQ*WMqKgBij$Az= zMHvT5pGQeMM2a>JR5G-GAyU+Fppq{y}c8R)5_|L_t(|0qv5{4T3Nfhg(>{5jui*Kp8=AMmeyFFo_q!RX0G8 z$PqWt5lr;f=#vsu0@YYb;-$aSYy0|r=^untRAhru53zH1KreJ%lmv8`?v3#9T+@(b zO8AvVtYiZHrjh!(l;8yiG-P88;O|Dkrry)}ig@sJ9D2>Z)^iE$Y)05-)C0UFuo7oN zseUXTEVnb4$iiC!!023+gi;zcC8F?_Ahm)m2JG`BUEpOOZ_`~MBzV$NsMFxW<2+hippQ|0MGT8GzN0dkpKVy07*qoM6N<$f`NN< A@c;k- delta 252 zcmVLJ8Ks3S+v z3EAKV_5db2I=bP2dA0=qq%9`2jQtIywC{ai+Z4dY#xw*vh#!Z2d=z^?@QCY7=`5k| zH5Uw1!HXi}!)l^Lk9|La9vDP~6C`W8I39j$w691BU#5{*Cv}~`-vu6Th7RD8z~7ET zM7*%(6Bn7nB>|A$y&ic?l!=nIa7jStY0jHe5*>I|r<(LPL4*WX_3xFxZ7iR0TX>^D zA^A46fb%#_3%BH)4<UI{!pI)0000 diff --git a/src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-round.imageset/checkbox-icononly_active-round@2x.png b/src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-icononly_active-round.imageset/checkbox-icononly_active-round@2x.png index 91afa3b7f964527e43572d5ff081a88ea78f5c69..4bc65dfaf4a843ee130485c80b80fa9dacfcb5d2 100644 GIT binary patch delta 425 zcmV;a0apHm1oZ=uR)2~~L_t(|0qxdJPQpMG2k+ypEGU3`>p!T|DVv#17M6X#uz(Z0vhJ@&F!_r z(36`(1bpmny5q&!-FMRU9cYlh@N>D@qkRFw`Dv{`<>n;mo_`iJ#D4gHLY%1XYea#> z@C5Nmb#LwOfI2+*FM|hHb$_h|%7!Pk6{sRSsiiBH4o{Q?=%tkt;W+MGS_u>3w>h$0)DK3koD99Vb0~27YR|5B zkC_TjGOq(!OPCB#axG+OC8AE(HyNJfUWrvD8J)B@Bfpm5kGNaN$IVH}Y|o93uSu6 T{6t8i00000NkvXXu0mjfyduWD delta 440 zcmV;p0Z0Dz1B3*SR)3jEL_t(|0qvK+O2beThtEv~aqA{-h2p9m9Xl1l4ta!j(=Pf3 z_7z+#PN8qmrBEmJ4dSj)H=XQcI(fY(7X(Ri^7q~ZJl_iln?5#6Q1}67k{?Fn>xBm+T%b&h{*pU zj;Vc(2#_ofco&|iy|q6Bl)L~j_b00nwZGN?W##p{ny5lvudRWq4FxeFkB|YR5SM=%Nii)F!jwEh zzsLkczCrSaFn=kJkO7qJO~Uz1Axz67E$ZU?@@0K6Jj9PF7or0F{b3hAmanm|dK>ac zD{X-a;pYuuOCCuLfaD2bQ(o81fsz|3IWO*-8nsggoViVTT{kCG2=y1WQ5D-q)B62i2+?ok3NgbjJ!rzCM9Y{?^;#xW>GIAYJb&r175J;Wd!xbr9X i=fE%w!!QiP80QBf(**zDTzUEc0000S;61&IZaR(~EzL_t(|0qxpPO7lP%$MI*xbloHLJ;AF>D@t<%T`GdTfp`M- z1|Fd+b*DG5D*oB&5pslrxM`Y<^N0&kYi5#3`b_wJpd_TBgfD558A1dA0000000000 zU`tVpZQSl`<+OBQRtM&jXr)IF8)qjjztP%2{ky#*rSf#${e zG>Nk4-#8vk$ifn}OhFvhozk>NmRc3aBF={nbrQ1Fnn1R3jFIi%i!D3o=ksaaeGHnvBDO3eVHl8rhk)lu3R3x%2-q!<`k%ZKU`7S?Ajbj_sixailTVDHcF@li;TmZh8ikM zFTcfMy);d)2am%ZdA8^{%sNp2es{$zdUL+^9!WwRW*sP>=0ykKEs~Tt%sS9he36&~ zN(y$X97$3f=5!6x%X-@^YCDsp#bM63dA=5@Oqn|wb$<(Xb-KGrjKfMjDEf{hH4ZEN zB<(Ab2X-)u~^wiA;e)`2CJ@-rnA|82yvLV(Y$>mHTh+@@{@o#%?1jS*sOqi99BrFcAZAQ^KlE65u)+tx(NJ8VV+UKMTBMFYf8kw}8 z8%cN^);Gx89S`egFIkqYDpKQ*4O&f!kPs9=N4cU$xTJ&vA%XBPA3p*ijAy*FyECirsbCS7^?E#>J+cT9 z5fKp)5fKp)kt>x3%NA$njOs5jGG%}58#Sv3^IHo(kI|Nf`hT!A`^Uci|Lu>xyGvaa zoqGG_{ps<>;lAtRG;#$YjvDBTGB8h;y_m}FM8srQGp!d+$bSB^+7oz8FZko+d?6UT1O(>|*Qk`7dM97r}$6>%WRKvl(o zqlHsf9UZFiHra0iW2Y;yNGZgDAUCVNkp?pOmO>l| zb~o=F3CD!dA))p-5Omz(v64oKA`S$f2L*@}O&lm?U{)YfRB@oRiQ*WMqKgBij$Az= zMHvT5pGQeMM2a>JR5G-GAyU+Fppq{yL!R)4xlL_t(|0lk(zOT$1I$Da!w#42=<4mwB&bo&VICiN*5x;*7VDlk{ z2ByI&M%=@A@(bWF&5`mrF4D10#8xY;$O)J~j6qesZM*IQ8_*=jiI$+&cz{ul@5eos zdt{Wv#uq>wnty4#&yt8I!Gi}^gk8rFyChtZTq|l58aZ0mgmy@{qJEcKJELTktsM^jjC z6&}y29bm~;dah{YRxmH6&_Q%NmR$m?h*;4lf>kI{*+`XHdirEGCu7q$sa$v>SIQ%E P00000NkvXXu0mjfV}R4* delta 492 zcmVLMb`1 ziV~ZX+(he0N`xdKCpoJ<_}COBrIGUeb+8|8iFQ}*UiS4qlSONg-5LLFcW36Ed44^; z?@Yt+7UNuliGzQiwf2>ZT%SgBSQIcd4KLK5#(1W z7K;~AQZ`%9^$r>T`1Iy@4uoHzcO>zVFCK58S9b39!DSe8N({_CygdOux}uund-Jrp zlH}dEzE8L0F~^P5lyAsIVO9YW4FM;*wN4$B z^b%Pf)`IF%7k#-ujyzSX!RuH@Z=R92t z?lDQ$L^3OO5s3j~Y@a5ql2J)oZC;_x|F#vIM*kVhLVv2WEMye@{z1CzE~Eq1Sya$e zLL&jc)OAV7Rx11OMCw}Qgn}~t-v>k5yL?}yu2)KEHW`qzagWq{ zC?hnNOs4H5UD|zC>V1?Dnoq`g=o-lqbD^b_0WlR?Y8enSp=iheX(4QEFTAfN_lCs~ zEg7&vrhk*Wuayd#OD5}xII>Y^I?iv=2oh6$=?46}G1W zDNy|8{)}@$p$swLSjd2gg}{7LRb91V|HF*741ZYgtNk=vlF=-g5J=y4SbxQmC*FXHXSj{b3Q}cs z7=P7hmT^mkDEivJeWdEXIx-s=v!3_E$%{lL&3&T6C!X!+;beL5Q|k8jkXgXmarOS0 z9nQF(z!Zlcy{^triH?2ie(}JOmqV{#U}kQ2mC?wUpBU%G&1sdTXb(v* zJKm66Buw?ZAEe44y95ats^l;r5+itFy;)<403ma)DXlU;*k?uppq`n-Hsv1)sAZHcc6 z%sXJq-yg?0D;8%WNNt>qvn+2h4Z>%I5HcBfMa!5)2H;+C z&wvvv#$=|Ubwt^MaiV%R^9Al1<6RIz0|W6I58;PVx)61W%nBwi9Y%XJvCdd)d31bKgrx03AX2oq;v1s(4F(;%tb3#V(<$u>VI(;vh)?MCC$z_+Q_fMbH zbxI1kWL|f?*UL{@pVQrj`%>2`C*+d(Dqh|B*!5ZJdZmOWk^x&*M@qeiGD4Hd9F06k zDbZ)8-bV?csbsQ`UnNlnHA(K0LJKp#)hd0g~rZTWLA(WGXks9 zXn%09ggEuIbUE~N6SGm_sC4E1IPHnGC7M0$Sr2180g=L%a`*nIJm_k;XTTWK6PQBq z^u4D2(~8)&O9qGjZmVl=qWK~7$hv$3sSH}?TH~#eJRhW)CDrC2?vY+*%Ztf$<^ABl ze`J>+Aw!iM26Qcq^~TO-!Vm#sBDiButWO);G>%UIEQpEcT$i$t%7}5#LV1Gye7(oO zXA{+j7;!xh$ihdnO@a+0<`gDaW|}B0ti+yB)#F{~AH1K>*(i38ga7~l07*qoM6N<$ Eg4;6El>h($ diff --git a/src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-rectangle.imageset/checkbox-stroke-rectangle@3x.png b/src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-rectangle.imageset/checkbox-stroke-rectangle@3x.png index 477db37c1dd14ec0925cec95c8307ef32a81425f..50ad5e54cd05fdf49d1e7211218de17e23e0915f 100644 GIT binary patch delta 1518 zcmVFy(kh5V6 z7y*y>K8(*!!hgV>VYqyE7^WZG4n3uHsIsd$v~ig@Cas-q>}s5|VJn;{Y*2)mf$#qv zfcD96Lj^jRyn1azkhsuHJCb(*j^!VQEO{fC3CzN?e_w#}H!f$6*=ihK5*7 zLkuG>mC_JHh)cCJMEBy>LK>oLacd0JZB7ZO4r6F-W04GD99;6|0&m0mdPcPDtgiN^- zAx}@zkc7=ud0#3)%@73OKC__mX%_a7t34pbd-i9Z9Ohl zc~SpHno2{Gx{w)C2jE@_+Os z4N3W1E|k~x;wk0j4uYcaE2VmphOEg~S#cp0Gf&TmZ=G`@#Bn0TaU#TVBE)eb#BqY+ z+-fjAcLxOF!LmUb+!7(grA9ZGSF#fL8TU*E_6fkK1U~3j8%EsMKoFk6yTeNXrN2t7 zvj$2Vo}ao1g79d?5h6Jy*(;BNe}A0AeypipCGdkan{Bes=fGX1@Sdwmc=n6D6R8)Zy=_GHV@j)IdMNwvGAYv->wwci?dlSmVaZ6W8Dl( z)1pV8HeJ<1?4GA5z7CQ`C~X_6>JC(NTwYwXzsA8@>(m%aqhU=svy?}}M=~7egNln% z=oqT%vTM%^Th4Z0e{CyE%SLS*3f#B33@RTlgPmCghN;7Zv!$DCT*n^v&D0O9mj%Bh z$4t9i)!h{Odl3sLE5$}B`DYL-SAiL!#LcXo9IEVU4R<(d$?o#LqgGjx?G$L8X#_H1 zOiG*V^Rzmvd)$#uBM>845|UD%4Tw}sDU`7PhA~QcFN$&j`1(PTdStI>G@3A#hZgIv U9gU(pTmS$707*qoM6N<$g6pT=K>z>% delta 1523 zcmV2rL|YXh zrKz+r@u3)~M#Civ#0R4>YJIW~M%spgu?mFtr4N;wP+4sS9;7x>okCK<3f)Azz(Xwp zZ5ER5>G=m{8J4|q_QG7wmuz$zD^yrjW2qQc{%gtki{b;vb6u3!fR6_?*y zQcrHdrxp_CkBd;UU#{zE541C&xcnm}U$Pwy+OpK7yI^nrZYa#mhs@LrRn-DAIE ztcY{8l-eoKHnypB1X$Bhn$^MPX?9^wTl0!+uWtTo^3;e&!pIBWO7>;PZEVx33oAgd z2)fX8glTZoqjZ{zIM(e}X%EC6RIo^DQi{?!s<1I$J&tcB$B~!IK~vjyJz5NcmEbL_ zsZ7c&N`GPsx2YxD?azWBFnc%e)iq7oFS;r5500YP92vzEuPl*028>lqwsLEe2i zAP9`#Ovx^3=c1xh2#%k)GzkP;2yvVUahwQooCtB82yvWj0E=+uQa^P3astke{|;H{ zHrTVJ4BmP1P2j~6;troZ3Wv{p zOf4>yG-Spz2k!qSfCtlx3nxt_^IjY9U`lb3O53w#2W#h2fd|uxi&WaC%tzqEoejW? zsl=^CTIXBM+_eocjkrWgLrftq(b5pZi(3zAh@r);mo&t%;?`3dVn}i8Ee(lkl8^Je zlYfJ!VPx_$JeB=8y!6;}aXCpXdXR>2i~G}k8D9Uo&NoRud7&G!&f1ideIT808WRq^ zNJF@9)!Jk4uUc8a8PBF`073LY|SNAu*e)MkCK?(vX-=@_FPLQ5q8S)seNxD?e0eNNGr1mX#vC&`6%5 z>romKxAnMKT(DlHA#q*EjON1iEDeeK3NViVy-Pz9vUI){5k`=PBcslzDB}P&BN~w{gA?xxgD=vg~zTFH)M!a>-i4ez$5XXrS z$B7Wfi4ez$q~uRq!aXwug22qq&uPPH{A;;OjofoWTrftjjr+ChR25^%5rE)dVjB+TMnqyCxOQ!tL+@#$7=Q}!7`XrPLog0CD;DY zCCQC_(*(#twe;hkzfiLH2^K*Yn21k>P||_li^GuxPm@~f&}{2qCkPfn7uwp!jJ4y2 zl0RGIfi=FYRtQjFDnY1*_nRs?HW+aD)bS^(*ljX7&;_Z3p{I`D6;GkUN^ksBhkt1{R^jJ?uSxz=<^OSr`So55J_e1K& z6eV}06~GEp*ZmO;{Byxq#(Z?hwa#koaRJlWI+{zGD1mxy8RizkG-;Ue3zJuwB@Yv} zU--c>?D666R&|U^HEq@ZGi-wS`odwc)@002ovPDHLkV1m?->SzD} diff --git a/src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-round.imageset/checkbox-stroke-round.png b/src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-round.imageset/checkbox-stroke-round.png index f2931ce6349133791a66e8ae16306a4a1776bc7b..701534846af3021bd55f153fe6292bfc11b6cc06 100644 GIT binary patch delta 827 zcmV-B1H}CP280KYR(}~uL_t(|0lk)8NK;`L$DjAO^`+G)txZE0q#+7Uc2Tsc$1A0a z!Y~OZw7OW`Ww#fHsP*^@7guZGuQZp{nMF$D`7O9COJd!lAQND0Kd z%&O2z$g0^>(B4sIkpQXa<##7M@IFJJO}VM;7V3KgNnbww)~q#*n_N9#`sqq&jixL7 z2ER2pOfH^zC4YoqBnY|ZeL}MpdPp$4Sta{(@&*2`mcmBe)#3|~t>8|wg_daXRbMX;?O4(&A!JMK1!u zHz`f1>D5gMm<Mr2~l;f;!Ds^+hUS?>GPml*%ebRnp5RzldWo#xoj6NY@F z313QNm<~h+i6Zn$HwI^${e9qL(!6!&!y~F6JTINo(TLwcjZTw2Lj4~}^$*O^X0v_n zr~gVl%**I#waNaGeWVZ-UBll--S@puAzPux5P$Phi0fVQvmE)t)8`HrU9K3L{`HAp z39qXw51fEqoD$Lz?wQ;3gD~**g|O8&7ke-gq5gSHbFyQ*#rila%T>IQm66)RdMM2+i4;f7CjQ_OxPH#Sux|{b5tv)* z?KD=rurP9AFazPLSS8j0p<4|H1rO`vJnZbiy_gIj>o?o%6kygMWxORR})tm2tocKtaPUX`}`UE`J~(QVv8yWKYFwZ^T$W zTr2S>gimJr}Zk zo14wKO4ZG~r*BDsc=T#<1iB`lfz9n~BXW6*Sl91@7*%L=oyO_bu`asd_0UAM;dRs2 zF%v}(^okB)m49Fd(_}AARp=qXm}dk?+iARqmF$(UGV}}|GU06Rm86DiH{md%Cwe1; z;09;c^^!}V%*cdf#f;%{cO#UyUW9r37v`k^oJ{DA?P>f&1Fx2=gv!GPNLGHxy#1?m zZd-Rian2!W#^Un8stEihwdI>6@U)}LJ8=~^G`rBiUw)Y z*N5~e$<+cSw2UwsU$nm(xhgCkPNf?4Me;a38Iz!mtS^DPsqjn001+FCk*#S)e z$Yf8X6P?Lup0v&Enp^E7-L&v_Dce7yiD+QqEoPlLK>a_V>In(ezpxHt8%FzH3B7oe zvCZ!<^B-gz@;=P2Emhzl#zrc_S9;I%3z3t{>wg>r3*HcrW7z6dpDP@mvd;?cZBMpV zRSX$v>5z!%+D>hYgQ``3iukqgvapp=c3*1lzzAd`{rJPXZx3hU5@{AD+1VI z;4XoXTGmxZeU!%#-no&pVydw8AH}t}8^EtW1-p7nL!f!R00000NkvXXu0mjfqb-W8 diff --git a/src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-round.imageset/checkbox-stroke-round@2x.png b/src/Projects/BKDesign/Resources/Assets.xcassets/checkbox/checkbox-stroke-round.imageset/checkbox-stroke-round@2x.png index d3910480483be14f13d7e6e54f3e0fa6bbeb8095..d0264db34c20f7b6f109ab8a6bebbf99d0fd8474 100644 GIT binary patch delta 1753 zcmV;~1}6Ef4x0{;R)4TbL_t(|0nJ)lY*bYg-RDk62n8L*LV;KYVo6Z2MZjQ7VTK#()a<81Mn`Q8+v1wXm$ z7Qf%kT|34br>@L7k!UpEI!4Vs$Mm6TX{97o)8S&vHGkyBhR43x_rg}*8x>Rt^z(ju z@8VuvT0S-!&QwMtDWTf-bsH!^E$A)6p3bLf;B$AXCZxVYZsAk1MMy-R_fVBYZyxk67W4!lb z2*H{K4S#^N)s3H56l8Q@El_=i&ChFexLq-hJcdxnG}~bScFx#D#Rlx-Nu$cpwfik< ztr3XWLm~5g6aCNUAE5Hl&r&f0j=1619jY&caJJVS_UO+dBoy*BN>_`O41mx|-wL6q z#ehMm=G0mjg;cE=_D%2L9eT&Ji{`bhpl$8@Xn(*z81a176gc)$bR7uC^m&7jCbTVR z8!FzUkp{@T>)u7@?_5@6PwzQ8c;#rsJMf3ACNEX}a49K5ILGj0HKem_;vyPJ=wx~y z+=-aK=DQj5ZagU|LTuNSbgDCqmUD$fWPrJ4vts5TrR5yyt3e>J0*$V64*b$ZI1)%k zrhnePgf_jnI_`HkwxE?lY(T3)-6&)XD#uQxkw7XkyI&ePY^8pzn7i56SQbV(3MPzYX)4@kt6(D?I*G0${D zuk(TnMFzOUNq=r^9H6pk`R`TJ zehnqlKw%6(2~(eo$eh-mT7Qq6wj(?- zUaUYR0u>1ugO0^Vrs?w$!Kp4Kyl6P9A_PJmMTTJw3_HW0MG(SXVvDE5x8t`18L3{r zfi~X$1|S~NzPuDIEf7N)29=9Uv#*^T zV4nTwqVKEzlQx40$Cmu7F}!|i1{q&3LkUxp+7^~rwLS-ONctmBj%;Q*kHZs~kN}b~ z*ExUD$47pglH2c{H&UdL4Uxy+X9;CAh6HYCEsnXpXcoNT1qBX~rXA0eh>olYg+srh v$$D=mp;bxM#$M56Dfn2juvQmxeMR$sN$-2rVvqH&00000NkvXXu0mjfmMl!Z delta 1771 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 delta 2664 zcmV-u3YYbO6{8i9R)082L_t(|0p(m>Y!ufOK6j1qlGb!-P+gleU4xBNH8D=&G*G0* zZUb0Az{xAL(564eC^c69po*}~OOw#bxX6L3R0JiwR1q<#MmCsY9@;9c8^%U*FtO2A zq5eUnY%vMgEuP%(?%vtE}k9G?h z(^;#wv-1r~18gTw5Js$pEKD&k_cOF<`C6)4x{694TqfEn!q3U`oVt8gkO+b;;Nt`~ z+fATt#K9zW(i_bRQ^|t5(g~0U5>E}DwL0u$j8$mp{#@e<$*kqXjY-l^rrqDXPPNRq(mH7nOE2K^Q4$%CJ8e`5_tF@Zs8W_4jG&-v6*0_gV?= z^L|?Vz#_^PKy{l+*O1TuA^*81_VH(0`NfUJUVpBf%b#slGIRS?(^+-%#w~G)A~i(<)|uJ zMSm^TjWid5fT4_i{k)&|c(i_=E6TMiN|OCJXl<(->$*+%D9IMO)|ke8d2OMm^aSF{l< z3O1Hp80#4Fna{OUTyXp;@bp7Z__vhR(0}~`JgYj3BW8RoFoU@Aw(9Mq4B8tj>(f1J z>o{P%ZI~>dCc_+~`J5TV@o5)>Vf5FsWhfO3-2)fs+rQsQ%lE9Js@GnigXjJb@mxGJ zW_Kil6SH9m^Kn9LjK3QQe)(ssYaKagPZS5w9ihhd{q*mfqoO@=_cs0g>U*?sL4O{V zKm4fWcS;v8rMCw<3$oPPQ**vR|-q$mm7D*JP%wbqX~~RS3#U=ruPeJZ~mYyrrIQ|%r#)Dx)Kz! z)J)Sw8elTl&G>Ycw^U+eU=YU@myy*!sUV%C0i_Qv4Xl_7z>8TE7rEUkX@B_0sv%ao zNdpjFvChTVac8p9#kFS;hxHuUgxMfXqGHKoN^9E7eH=50D_od8eYe>p4G8PkGPc6S zhgn~iZH&*d0kcgSU>Xp3=W(ZJ*lynZ#0K;j=bh+1O_#?$psy7@PS1Yz8@AkJG-QG_ zK(5^b_5UU+Rah28<{4}Y^p9w0t2I0jJYi{(m|e+lqQiBai5EEV|J3~MACqy zh+D#aSS&wg2YF5<4FGXI*%-Ms9`_g9w!RwkMpGfrX{4E!#QKv`9Dfk+4JSjM6P1Qk z0R=vnNc9Na^qZVuLP&13?7K7aLZlq%wV z&`595letzpfz&1m9#KV12=wDz%vcL|>dINN19m*H6G#J0>7B>$OAsfLVuLRuCMIvk z$^(rXsXVxoNK+!JPbLr>BL@~_60pNuC6Xb)DWm}=GwqSvp?@Kl$y`&3u4W`cgp){< z*@p@YaT&x32{P)zHq7;S|2t$S;vvLIqyehh2+>r@^A8*3GhJ_$+s7}p+p0Ps8Zk~I z&8#+VrmgDnFygejGcZ>lw$q_H00f=<@iBV3=n2sVQ7?V#MMsean6j%86y8ve&oh64 zk=~#a6O2K1>3>+6iHXoRf7nJ&1qeIb8_KHYYMYUYK4U&ks7~>9d;k0!y5G>;)2gnY znV~koaw3yah+*_&j`z3I{Q|hBcdxx?46%^AZ*`s}aflv#7-l#_$TmVvk2!@ICW?9` z5fb4dPn}OqHjxr2kX>hYlywsDY^G=QX*)ZcBAp+RIDgEV2$=?lV)$<~bf#Rc!?DQ?K*A-0 zpgh&*O-y|(9BXdQd@9R-gq#d?Zg+S8iaz?}rhlm4wgRQ2bvWwpXIQ z($u{vk&boR(>nfi8!O?a=BvlPXGOdl@vKwqmOz(l+7C zpt9qa-kGuXBV%RIRFt<>H>sJ`07yeBPbLVALYVMp(FC zkIvXS#go2rwwyrH^?F^&6Eg!OBAW;0Y_S|3=>kY`v?^x{VEx9(#F!{&3v~_N81_f1 zEi4qKPqzkVwQa|&6j0_7Y`aeSGh|=2X<=)KNQpO5tUYTBC|g02$e(aUG$kei-l6pI z&e+M>AS?XuW(cC-)7`t}A_qz= WjTHp~mjE{a0000 Date: Tue, 4 Nov 2025 17:35:22 +0900 Subject: [PATCH 02/10] [BOOK-411] fix: apply missing font attributes in BKTextField --- .../TextField/BKBaseTextField.swift | 36 ++++++++++++++++--- .../TextField/BKSearchTextField.swift | 6 ++-- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/Projects/BKDesign/Sources/Components/TextField/BKBaseTextField.swift b/src/Projects/BKDesign/Sources/Components/TextField/BKBaseTextField.swift index 54f06f90..b15e874a 100644 --- a/src/Projects/BKDesign/Sources/Components/TextField/BKBaseTextField.swift +++ b/src/Projects/BKDesign/Sources/Components/TextField/BKBaseTextField.swift @@ -29,8 +29,8 @@ public class BKBaseTextField: UITextField { } } - private let textFont = BKTextStyle.body2(weight: .medium).uiFont - private let placeholderFont = BKTextStyle.body2(weight: .regular).uiFont + private let textFont: UIFont? + private let placeholderFont: UIFont? let clearButton: UIButton = { let button = UIButton(type: .custom) button.setImage(BKImage.Icon.xCircle, for: .normal) @@ -40,12 +40,18 @@ public class BKBaseTextField: UITextField { var onReturn: ((String) -> Void)? + private let fontStyle: BKTextStyle + public init( frame: CGRect = .zero, placeholder: String = "", - type: TextFieldType = .normal + type: TextFieldType = .normal, + fontStyle: BKTextStyle = .body2(weight: .medium) ) { self.textFieldType = type + self.fontStyle = fontStyle + self.textFont = fontStyle.uiFont + self.placeholderFont = BKTextStyle.body2(weight: .regular).uiFont super.init(frame: frame) self.placeholder = placeholder configure() @@ -136,12 +142,34 @@ private extension BKBaseTextField { returnKeyType = .done layer.cornerRadius = BKRadius.small backgroundColor = .bkBaseColor(.secondary) - font = BKTextStyle.body2(weight: .medium).uiFont + font = textFont textColor = .bkContentColor(.primary) textAlignment = .natural + + applyTypingAttributes() + applyClearButtonStyle() applyPlaceholderStyle() } + + func applyTypingAttributes() { + guard let font = textFont else { return } + + let paragraphStyle = fontStyle.paragraphStyle + paragraphStyle.alignment = textAlignment + + typingAttributes = [ + .font: font, + .foregroundColor: UIColor.bkContentColor(.primary), + .paragraphStyle: paragraphStyle + ] + + defaultTextAttributes = [ + .font: font, + .foregroundColor: UIColor.bkContentColor(.primary), + .paragraphStyle: paragraphStyle + ] + } func applyClearButtonStyle() { let containerView = UIView() diff --git a/src/Projects/BKDesign/Sources/Components/TextField/BKSearchTextField.swift b/src/Projects/BKDesign/Sources/Components/TextField/BKSearchTextField.swift index c400a84c..e2d60809 100644 --- a/src/Projects/BKDesign/Sources/Components/TextField/BKSearchTextField.swift +++ b/src/Projects/BKDesign/Sources/Components/TextField/BKSearchTextField.swift @@ -33,12 +33,14 @@ public final class BKSearchTextField: BKBaseTextField { public override init( frame: CGRect = .zero, placeholder: String = "", - type: BKBaseTextField.TextFieldType = .normal + type: BKBaseTextField.TextFieldType = .normal, + fontStyle: BKTextStyle = .body2(weight: .medium) ) { super.init( frame: frame, placeholder: placeholder, - type: type + type: type, + fontStyle: fontStyle ) setup() configure() From afbd7276eaf199acfad3927e82bb74a97b634ee2 Mon Sep 17 00:00:00 2001 From: Jiyong Jung Date: Tue, 4 Nov 2025 17:35:34 +0900 Subject: [PATCH 03/10] [BOOK-411] fix: apply missing font attributes in BKTextView --- .../TextField/BKTextFieldView.swift | 8 ++++-- .../Components/TextField/BKTextView.swift | 28 +++++++++++++++---- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/Projects/BKDesign/Sources/Components/TextField/BKTextFieldView.swift b/src/Projects/BKDesign/Sources/Components/TextField/BKTextFieldView.swift index 0a8b42ec..62a64c5e 100644 --- a/src/Projects/BKDesign/Sources/Components/TextField/BKTextFieldView.swift +++ b/src/Projects/BKDesign/Sources/Components/TextField/BKTextFieldView.swift @@ -5,12 +5,13 @@ import UIKit public final class BKTextFieldView: UIView { private let titleLabel = BKLabel2() - private let textField = BKBaseTextField() + private let textField: BKBaseTextField private let helpMessageLabel = BKLabel(type: .help) private var labelText: String private var placeholder: String private var helpMessage: String + private let fontStyle: BKTextStyle private var isError: Bool = false { didSet { @@ -48,12 +49,15 @@ public final class BKTextFieldView: UIView { labelText: String = "", placeholder: String = "", helpMessage: String = "", - isError: Bool = false + isError: Bool = false, + fontStyle: BKTextStyle = .body2(weight: .medium) ) { self.labelText = labelText self.placeholder = placeholder self.helpMessage = helpMessage self.isError = isError + self.fontStyle = fontStyle + self.textField = BKBaseTextField(fontStyle: fontStyle) super.init(frame: frame) setup() layout() diff --git a/src/Projects/BKDesign/Sources/Components/TextField/BKTextView.swift b/src/Projects/BKDesign/Sources/Components/TextField/BKTextView.swift index 60d491cd..645f492a 100644 --- a/src/Projects/BKDesign/Sources/Components/TextField/BKTextView.swift +++ b/src/Projects/BKDesign/Sources/Components/TextField/BKTextView.swift @@ -16,7 +16,6 @@ public final class BKTextView: UIView { textView.layer.borderColor = UIColor.clear.cgColor textView.backgroundColor = .bkBaseColor(.secondary) textView.isScrollEnabled = true - textView.font = BKTextStyle.body2(weight: .regular).uiFont textView.textColor = .bkContentColor(.primary) textView.textContainerInset = UIEdgeInsets( top: LayoutConstants.contentTitleInset, @@ -28,10 +27,7 @@ public final class BKTextView: UIView { return textView }() - private let placeholderLabel = BKLabel( - fontStyle: .body2(weight: .regular), - color: .bkContentColor(.tertiary) - ) + private let placeholderLabel = BKLabel(color: .bkContentColor(.tertiary)) private let errorMessageLabel = BKLabel(type: .error) @@ -48,6 +44,7 @@ public final class BKTextView: UIView { } private let textViewMinHeight: CGFloat + private let fontStyle: BKTextStyle private let stackView: UIStackView = { let stackView = UIStackView() @@ -70,11 +67,13 @@ public final class BKTextView: UIView { frame: CGRect = .zero, labelText: String? = nil, placeholder: String = "", - minHeight: CGFloat = 140 + minHeight: CGFloat = 140, + fontStyle: BKTextStyle = .body2(weight: .regular) ) { self.labelText = labelText self.placeholderText = placeholder self.textViewMinHeight = minHeight + self.fontStyle = fontStyle super.init(frame: frame) setup() layoutViews() @@ -138,6 +137,10 @@ public final class BKTextView: UIView { private extension BKTextView { func setup() { + textView.font = fontStyle.uiFont + applyTypingAttributes() + + placeholderLabel.setFontStyle(style: fontStyle) placeholderLabel.setText(text: placeholderText) placeholderLabel.isUserInteractionEnabled = false @@ -151,6 +154,19 @@ private extension BKTextView { addSubviews(titleLabel, stackView) } + func applyTypingAttributes() { + guard let font = fontStyle.uiFont else { return } + + let paragraphStyle = fontStyle.paragraphStyle + paragraphStyle.alignment = textView.textAlignment + + textView.typingAttributes = [ + .font: font, + .foregroundColor: UIColor.bkContentColor(.primary), + .paragraphStyle: paragraphStyle + ] + } + func layoutViews() { if titleLabel.superview != nil { titleLabel.snp.makeConstraints { From 9e7e954f260e69acb0ca538bafb1afe620f17e65 Mon Sep 17 00:00:00 2001 From: Jiyong Jung Date: Tue, 4 Nov 2025 17:37:52 +0900 Subject: [PATCH 04/10] [BOOK-409] fix: correct incorrect UI layout/appearance in NoteAppreciationView --- .../Sources/MainFlow/Note/View/NoteView.swift | 6 ++++++ .../MainFlow/Note/View/SentenceAppreciationView.swift | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Projects/BKPresentation/Sources/MainFlow/Note/View/NoteView.swift b/src/Projects/BKPresentation/Sources/MainFlow/Note/View/NoteView.swift index 034f7eec..a6a2b05a 100644 --- a/src/Projects/BKPresentation/Sources/MainFlow/Note/View/NoteView.swift +++ b/src/Projects/BKPresentation/Sources/MainFlow/Note/View/NoteView.swift @@ -200,6 +200,12 @@ private extension NoteView { .store(in: &cancellables) } + if pageControl.currentPage >= pageViews.count - 1 { + nextButton.primaryButton?.title = "기록 완료" + } else { + nextButton.primaryButton?.title = "다음" + } + updateNextButtonEnabled() } diff --git a/src/Projects/BKPresentation/Sources/MainFlow/Note/View/SentenceAppreciationView.swift b/src/Projects/BKPresentation/Sources/MainFlow/Note/View/SentenceAppreciationView.swift index ab5d9b2f..84b2110e 100644 --- a/src/Projects/BKPresentation/Sources/MainFlow/Note/View/SentenceAppreciationView.swift +++ b/src/Projects/BKPresentation/Sources/MainFlow/Note/View/SentenceAppreciationView.swift @@ -13,7 +13,7 @@ final class SentenceAppreciationView: BaseView { private let textDidChangeSubject = PassthroughSubject() private let containerView = UIView() private let titleLabel = BKLabel( - text: "문장에 대한 감상을 남겨주세요", + text: "떠오르는 생각이 있다면 자유롭게 작성해 주세요.", fontStyle: .heading1(weight: .bold) ) From eef21075fc4774560e9cd8abd5b042b27a2377cb Mon Sep 17 00:00:00 2001 From: Jiyong Jung Date: Tue, 4 Nov 2025 17:40:02 +0900 Subject: [PATCH 05/10] [BOOK-413] fix: unify back button insets app-wide --- .../Sources/Common/Extension/UINavigationController+.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Projects/BKPresentation/Sources/Common/Extension/UINavigationController+.swift b/src/Projects/BKPresentation/Sources/Common/Extension/UINavigationController+.swift index fe966293..6f1ef143 100644 --- a/src/Projects/BKPresentation/Sources/Common/Extension/UINavigationController+.swift +++ b/src/Projects/BKPresentation/Sources/Common/Extension/UINavigationController+.swift @@ -267,9 +267,8 @@ private extension UINavigationController { let backImage = BKImage.Icon.chevronLeft .withRenderingMode(.alwaysTemplate) - .imageWithOffset(x: -4, y: 2) ?? BKImage.Icon.chevronLeft .withAlignmentRectInsets( - UIEdgeInsets(top: 0, left: -16, bottom: 0, right: 0) + UIEdgeInsets(top: 0, left: -8, bottom: 0, right: 0) ) appearance.setBackIndicatorImage(backImage, transitionMaskImage: backImage) } From 40fbba2f1464f492b6953a0fe7956290148b1cb7 Mon Sep 17 00:00:00 2001 From: Jiyong Jung Date: Tue, 4 Nov 2025 17:41:28 +0900 Subject: [PATCH 06/10] [BOOK-413] feat: increase insets for better spacing in settings --- .../Setting/Notification/View/NotificationSettingsView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Projects/BKPresentation/Sources/MainFlow/Setting/Notification/View/NotificationSettingsView.swift b/src/Projects/BKPresentation/Sources/MainFlow/Setting/Notification/View/NotificationSettingsView.swift index 81cd7f90..9be48c72 100644 --- a/src/Projects/BKPresentation/Sources/MainFlow/Setting/Notification/View/NotificationSettingsView.swift +++ b/src/Projects/BKPresentation/Sources/MainFlow/Setting/Notification/View/NotificationSettingsView.swift @@ -246,7 +246,7 @@ private extension NotificationSettingsView { static let permissionRequestViewHorizontalInset = BKInset.inset5 static let commonHorizontalInset = BKInset.inset5 static let toggleEmptySpacing = BKSpacing.spacing4 - static let toggleSpacingWithRequest = BKSpacing.spacing2 + static let toggleSpacingWithRequest = BKSpacing.spacing4 static let permissionToggleLabelPadding = BKSpacing.spacing4 static let permissionRequestLabelPadding = BKSpacing.spacing6 } From 76501287d4d16936356682b1d782ff957357e21d Mon Sep 17 00:00:00 2001 From: Jiyong Jung Date: Tue, 4 Nov 2025 17:43:58 +0900 Subject: [PATCH 07/10] [BOOK-411] fix: update fonts in NoteEditView --- .../Sources/MainFlow/NoteEdit/View/NoteEditView.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift b/src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift index 44fbc513..c51c1883 100644 --- a/src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift +++ b/src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift @@ -37,12 +37,14 @@ final class NoteEditView: BaseView { private let sentenceTextView = BKTextView( labelText: "문장 기록", - placeholder: "기록하고 싶은 문장을 작성해보세요" + placeholder: "기록하고 싶은 문장을 작성해보세요", + fontStyle: .body2(weight: .medium) ) private let appreciationTextView = BKTextView( labelText: "감상평", - placeholder: "문장에 대한 감상을 남겨주세요" + placeholder: "문장에 대한 감상을 남겨주세요", + fontStyle: .body2(weight: .medium) ) private let emotionStatusView: UIStackView = { From 0cb20af52aaf0db7e605f8b5a0d82ceda487f088 Mon Sep 17 00:00:00 2001 From: Jiyong Jung Date: Tue, 4 Nov 2025 17:44:40 +0900 Subject: [PATCH 08/10] chore: bump project version to 1.2.0 --- src/SupportingFiles/Booket/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SupportingFiles/Booket/Info.plist b/src/SupportingFiles/Booket/Info.plist index 4ade5c04..3027174f 100644 --- a/src/SupportingFiles/Booket/Info.plist +++ b/src/SupportingFiles/Booket/Info.plist @@ -21,7 +21,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.1.3 + 1.2.0 FirebaseAppDelegateProxyEnabled NO CFBundleURLTypes From d9f707aa635e11ece9944a4f544f0e25856e94c8 Mon Sep 17 00:00:00 2001 From: doyeonk429 <80318425+doyeonk429@users.noreply.github.com> Date: Tue, 4 Nov 2025 17:31:00 +0900 Subject: [PATCH 09/10] =?UTF-8?q?[BOOK-425]=20chore:=20github=20actions=20?= =?UTF-8?q?workflow=20=EA=B0=9C=ED=8E=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/qa-task.yml | 41 +++ .github/workflows/PR_Label_Assign.yml | 42 +-- .github/workflows/close-jira-issue.yml | 89 ++++++- .github/workflows/create-jira-issue.yml | 255 ++++++++++++++----- .github/workflows/create_release_branch.yaml | 71 ------ 5 files changed, 337 insertions(+), 161 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/qa-task.yml delete mode 100644 .github/workflows/create_release_branch.yaml diff --git a/.github/ISSUE_TEMPLATE/qa-task.yml b/.github/ISSUE_TEMPLATE/qa-task.yml new file mode 100644 index 00000000..7ef59707 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/qa-task.yml @@ -0,0 +1,41 @@ +name: QA Task +description: QA용 이슈 템플릿입니다.(기존 JIRA의 이슈와 연동됩니다) +title: "qa] " +labels: ["🛠️ qa"] +body: + - type: input + id: parentKey + attributes: + label: '🎟️ 작업 (Ticket Number)' + description: '연동할 작업의 Ticket Number를 기입해주세요' + placeholder: 'BOOK-00' + validations: + required: true + + - type: input + id: description + attributes: + label: "🛠️ qa 설명" + description: "어떤 qa 항목에 대한 수정사항인지 명확히 작성해주세요" + validations: + required: true + + - type: textarea + id: tasks + attributes: + label: "🔧 수정할 작업 목록" + description: "수정해야 할 항목들을 체크리스트로 작성해주세요" + value: | + - [ ] .. + validations: + required: true + + - type: input + id: links + attributes: + label: "🔗 참고 링크" + description: "관련 문서, 스크린샷, 로그 등이 있다면 첨부해주세요 (선택)" + placeholder: "https://..." + validations: + required: false + diff --git a/.github/workflows/PR_Label_Assign.yml b/.github/workflows/PR_Label_Assign.yml index 1b6e15d6..3677810c 100644 --- a/.github/workflows/PR_Label_Assign.yml +++ b/.github/workflows/PR_Label_Assign.yml @@ -10,43 +10,49 @@ on: jobs: label-pr: runs-on: ubuntu-latest - - # 기본 GITHUB_TOKEN 대신 PAT을 쓰기 때문에 permissions 블록은 생략 가능 steps: - - name: Checkout repository - uses: actions/checkout@v3 - with: - token: ${{ secrets.PAT_TOKEN }} - - name: Label PR based on title - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: github-token: ${{ secrets.PAT_TOKEN }} script: | const title = context.payload.pull_request.title || ""; + + console.log(`📋 PR Title: ${title}`); const labelMap = [ { pattern: /^feat:/i, label: '✨ feat' }, { pattern: /^fix:/i, label: '🐞 fix' }, { pattern: /^refactor:/i, label: '🔨 refactor' }, { pattern: /^docs:/i, label: '📃 docs' }, - { pattern: /^chore:/i, label: '⚙️ chore' }, + { pattern: /^chore:/i, label: '⚙️ chore' }, { pattern: /^test:/i, label: '✅ test' }, - { pattern: /^style:/i, label: '🎨 style' } + { pattern: /^style:/i, label: '🎨 style' }, + { pattern: /^qa:/i, label: '🛠️ qa' } ]; + // 매칭되는 라벨 찾기 const labelsToAdd = labelMap .filter(entry => entry.pattern.test(title)) .map(entry => entry.label); if (labelsToAdd.length > 0) { - await github.rest.issues.addLabels({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - labels: labelsToAdd - }); - core.info(`Added labels: ${labelsToAdd.join(', ')}`); + console.log(`✅ Adding labels: ${labelsToAdd.join(', ')}`); + + try { + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + labels: labelsToAdd + }); + + console.log(`✅ Successfully added labels: ${labelsToAdd.join(', ')}`); + } catch (error) { + console.error(`❌ Failed to add labels: ${error.message}`); + core.setFailed(`Failed to add labels: ${error.message}`); + } } else { - core.info('No matching labels found for PR title.'); + console.log('⚠️ No matching labels found for PR title.'); + console.log('💡 Tip: Use prefixes like "feat:", "fix:", "qa:", etc.'); } diff --git a/.github/workflows/close-jira-issue.yml b/.github/workflows/close-jira-issue.yml index a72b0cb1..3b09372e 100644 --- a/.github/workflows/close-jira-issue.yml +++ b/.github/workflows/close-jira-issue.yml @@ -1,4 +1,4 @@ -name: Close Jira issue +name: Close Jira Issue on: issues: @@ -8,7 +8,6 @@ on: jobs: close-issue: runs-on: ubuntu-latest - steps: - name: Login to Jira uses: atlassian/gajira-login@v3 @@ -20,22 +19,90 @@ jobs: - name: Extract Jira issue key from GitHub issue title id: extract-key run: | - ISSUE_TITLE="${{ github.event.issue.title }}" - JIRA_KEY=$(echo "$ISSUE_TITLE" | grep -oE '[A-Z]+-[0-9]+' || true) - echo "JIRA_KEY=$JIRA_KEY" >> $GITHUB_ENV + ISSUE_TITLE=$(cat <<'EOF' + ${{ github.event.issue.title }} + EOF + ) + + echo "📋 Issue Title: $ISSUE_TITLE" + + # 대괄호 안의 Jira 키 우선 추출 (예: [BOOK-123] 작업명) + JIRA_KEY=$(echo "$ISSUE_TITLE" | grep -oP '(?<=\[)[A-Z]+-\d+(?=\])' | head -1) + + # 없으면 일반 패턴으로 추출 + if [ -z "$JIRA_KEY" ]; then + JIRA_KEY=$(echo "$ISSUE_TITLE" | grep -oP '\b[A-Z]+-\d+\b' | head -1) + fi + + if [ -z "$JIRA_KEY" ]; then + echo "⚠️ No Jira key found in issue title" + echo "JIRA_KEY=" >> $GITHUB_ENV + echo "found=false" >> $GITHUB_OUTPUT + else + echo "✅ Found Jira key: $JIRA_KEY" + echo "JIRA_KEY=$JIRA_KEY" >> $GITHUB_ENV + echo "found=true" >> $GITHUB_OUTPUT + fi + + - name: Stop if no Jira key + if: steps.extract-key.outputs.found == 'false' + run: | + echo "⚠️ No Jira key found. Skipping Jira transition." + exit 0 - name: Get available transitions - if: ${{ env.JIRA_KEY != '' }} + if: steps.extract-key.outputs.found == 'true' + id: transitions + continue-on-error: true run: | - curl -u ${{ secrets.JIRA_USER_EMAIL }}:${{ secrets.JIRA_API_TOKEN }} \ + echo "🔍 Checking available transitions for ${{ env.JIRA_KEY }}" + + RESPONSE=$(curl -s -u ${{ secrets.JIRA_USER_EMAIL }}:${{ secrets.JIRA_API_TOKEN }} \ -X GET \ -H "Content-Type: application/json" \ - "${{ secrets.JIRA_BASE_URL }}/rest/api/3/issue/${{ env.JIRA_KEY }}/transitions" \ - | jq '.transitions[] | {id, name, to: .to.name}' - + "${{ secrets.JIRA_BASE_URL }}/rest/api/3/issue/${{ env.JIRA_KEY }}/transitions") + + echo "$RESPONSE" | jq '.transitions[] | {id, name, to: .to.name}' + + # 개발 완료 transition이 있는지 확인 + HAS_TRANSITION=$(echo "$RESPONSE" | jq -r '.transitions[] | select(.name == "개발 완료") | .id') + + if [ -n "$HAS_TRANSITION" ]; then + echo "transition_available=true" >> $GITHUB_OUTPUT + echo "✅ '개발 완료' transition is available (ID: $HAS_TRANSITION)" + else + echo "transition_available=false" >> $GITHUB_OUTPUT + echo "⚠️ '개발 완료' transition is not available" + echo "Available transitions:" + echo "$RESPONSE" | jq -r '.transitions[] | .name' + fi + - name: Close Jira issue - if: ${{ env.JIRA_KEY != '' }} + if: | + steps.extract-key.outputs.found == 'true' && + steps.transitions.outputs.transition_available == 'true' uses: atlassian/gajira-transition@v3 with: issue: ${{ env.JIRA_KEY }} transition: 개발 완료 + + - name: Add comment to GitHub issue + if: | + steps.extract-key.outputs.found == 'true' && + steps.transitions.outputs.transition_available == 'true' + uses: actions-cool/issues-helper@v3 + with: + actions: 'create-comment' + token: ${{ secrets.GITHUB_TOKEN }} + issue-number: ${{ github.event.issue.number }} + body: | + ✅ **Jira Issue Closed:** [${{ env.JIRA_KEY }}](${{ secrets.JIRA_BASE_URL }}/browse/${{ env.JIRA_KEY }}) + Status transitioned to: **개발 완료** + + - name: Log transition failure + if: | + steps.extract-key.outputs.found == 'true' && + steps.transitions.outputs.transition_available == 'false' + run: | + echo "❌ Failed to transition ${{ env.JIRA_KEY }} to '개발 완료'" + echo "The issue might already be in that state or the transition is not available." diff --git a/.github/workflows/create-jira-issue.yml b/.github/workflows/create-jira-issue.yml index c55994ef..3981360f 100644 --- a/.github/workflows/create-jira-issue.yml +++ b/.github/workflows/create-jira-issue.yml @@ -1,11 +1,146 @@ -name: Create Jira Issue +name: Jira Integration on: issues: types: - opened + jobs: - create-issue: - name: Create Jira issue + # Job 1: 기존 Jira 이슈와 연결 (qa 라벨이 있는 경우) + link-existing-jira: + if: contains(github.event.issue.labels.*.name, '🛠️ qa') + name: Link Existing Jira Issue + runs-on: ubuntu-latest + steps: + - name: Extract Jira Key + id: extract + run: | + title=$(cat <<'EOF' + ${{ github.event.issue.title }} + EOF + ) + body=$(cat <<'EOF' + ${{ github.event.issue.body }} + EOF + ) + + # 제목에서 먼저 Jira 키 찾기 + jira_key=$(echo "$title" | grep -oP '\b[A-Z]+-\d+\b' | head -1) + + # 없으면 본문에서 찾기 + if [ -z "$jira_key" ]; then + jira_key=$(echo "$body" | grep -oP '\b[A-Z]+-\d+\b' | head -1) + fi + + if [ -z "$jira_key" ]; then + echo "❌ Jira key not found in issue title or body." + echo "jira_key=" >> $GITHUB_OUTPUT + else + echo "✅ Found Jira key: $jira_key" + echo "jira_key=$jira_key" >> $GITHUB_OUTPUT + fi + + - name: Stop if no Jira key + if: steps.extract.outputs.jira_key == '' + run: | + echo "⚠️ No Jira key found. Exiting workflow." + exit 0 + + - name: Jira Login + uses: atlassian/gajira-login@v3 + env: + JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }} + JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }} + JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }} + + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Switch to develop + run: | + git fetch origin develop + git checkout develop + + - name: Generate Branch Name + id: branch + run: | + issue_number=${{ github.event.issue.number }} + jira_key="${{ steps.extract.outputs.jira_key }}" + branch_name="${jira_key}-fix/#${issue_number}" + echo "branch=${branch_name}" >> $GITHUB_OUTPUT + + - name: Check and create branch + id: create_branch + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + # 브랜치가 이미 존재하는지 확인 + if git ls-remote --heads origin "${{ steps.branch.outputs.branch }}" | grep -q "${{ steps.branch.outputs.branch }}"; then + echo "⚠️ Branch already exists. Skipping creation." + echo "created=false" >> $GITHUB_OUTPUT + else + git checkout -b "${{ steps.branch.outputs.branch }}" + git push origin "${{ steps.branch.outputs.branch }}" + echo "✅ Branch created successfully." + echo "created=true" >> $GITHUB_OUTPUT + fi + + - name: Check if title needs update + id: check_title + run: | + title="${{ github.event.issue.title }}" + jira_key="${{ steps.extract.outputs.jira_key }}" + + if [[ "$title" == *"$jira_key"* ]]; then + echo "skip=true" >> $GITHUB_OUTPUT + echo "⚠️ Jira key already in title. Skipping update." + else + echo "skip=false" >> $GITHUB_OUTPUT + echo "new_title=[$jira_key] $title" >> $GITHUB_OUTPUT + echo "✅ Will update title." + fi + + - name: Update issue title + if: steps.check_title.outputs.skip == 'false' + uses: actions-cool/issues-helper@v3 + with: + actions: 'update-issue' + token: ${{ secrets.PAT_TOKEN }} + title: '${{ steps.check_title.outputs.new_title }}' + + - name: Add Jira link comment + uses: actions-cool/issues-helper@v3 + with: + actions: 'create-comment' + token: ${{ secrets.PAT_TOKEN }} + issue-number: ${{ github.event.issue.number }} + body: | + 🧩 **Linked to Jira Issue:** [${{ steps.extract.outputs.jira_key }}](${{ secrets.JIRA_BASE_URL }}/browse/${{ steps.extract.outputs.jira_key }}) + + - name: Add branch comment + if: steps.create_branch.outputs.created == 'true' + uses: actions-cool/issues-helper@v3 + with: + actions: 'create-comment' + token: ${{ secrets.PAT_TOKEN }} + issue-number: ${{ github.event.issue.number }} + body: | + 🔀 **Branch Created:** `${{ steps.branch.outputs.branch }}` + + - name: Assign issue author + uses: actions-cool/issues-helper@v3 + with: + actions: 'add-assignees' + token: ${{ secrets.PAT_TOKEN }} + issue-number: ${{ github.event.issue.number }} + assignees: ${{ github.event.issue.user.login }} + + # Job 2: 새 Jira 이슈 생성 (qa 라벨이 없는 경우) + create-new-jira: + if: "!contains(github.event.issue.labels.*.name, '🛠️ qa')" + name: Create New Jira Issue runs-on: ubuntu-latest steps: - name: Determine Issue Type @@ -18,43 +153,42 @@ jobs: label_names=$(echo "$LABELS_JSON" | jq -r '.[].name') - # 디버그: 라벨 JSON 전체 출력 echo "=== 라벨 목록 확인 ===" - echo "$label_names" | cat -vet + echo "$label_names" if echo "$label_names" | grep -Fxq '✨ feat'; then - echo "type=feature" >>"$GITHUB_OUTPUT" - echo "template=feature-task.yml" >>"$GITHUB_OUTPUT" + echo "type=feature" >> "$GITHUB_OUTPUT" + echo "template=feature-task.yml" >> "$GITHUB_OUTPUT" elif echo "$label_names" | grep -Fxq '🐞 fix'; then - echo "type=fix" >>"$GITHUB_OUTPUT" - echo "template=fix-task.yml" >>"$GITHUB_OUTPUT" + echo "type=fix" >> "$GITHUB_OUTPUT" + echo "template=fix-task.yml" >> "$GITHUB_OUTPUT" elif echo "$label_names" | grep -Fxq '🔨 refactor'; then - echo "type=refactor" >>"$GITHUB_OUTPUT" - echo "template=refactor-task.yml" >>"$GITHUB_OUTPUT" + echo "type=refactor" >> "$GITHUB_OUTPUT" + echo "template=refactor-task.yml" >> "$GITHUB_OUTPUT" elif echo "$label_names" | grep -Fxq '📃 docs'; then - echo "type=docs" >>"$GITHUB_OUTPUT" - echo "template=docs-task.yml" >>"$GITHUB_OUTPUT" + echo "type=docs" >> "$GITHUB_OUTPUT" + echo "template=docs-task.yml" >> "$GITHUB_OUTPUT" elif echo "$label_names" | grep -Fxq '⚙️ chore'; then - echo "type=chore" >>"$GITHUB_OUTPUT" - echo "template=setting-task.yml" >>"$GITHUB_OUTPUT" + echo "type=chore" >> "$GITHUB_OUTPUT" + echo "template=setting-task.yml" >> "$GITHUB_OUTPUT" elif echo "$label_names" | grep -Fxq '✅ test'; then - echo "type=test" >>"$GITHUB_OUTPUT" - echo "template=test-task.yml" >>"$GITHUB_OUTPUT" + echo "type=test" >> "$GITHUB_OUTPUT" + echo "template=test-task.yml" >> "$GITHUB_OUTPUT" elif echo "$label_names" | grep -Fxq '🎨 style'; then - echo "type=style" >>"$GITHUB_OUTPUT" - echo "template=style-task.yml" >>"$GITHUB_OUTPUT" + echo "type=style" >> "$GITHUB_OUTPUT" + echo "template=style-task.yml" >> "$GITHUB_OUTPUT" else - echo "type=other" >>"$GITHUB_OUTPUT" - echo "template=default.yml" >>"$GITHUB_OUTPUT" + echo "type=other" >> "$GITHUB_OUTPUT" + echo "template=default.yml" >> "$GITHUB_OUTPUT" fi - + - name: Jira Login uses: atlassian/gajira-login@v3 env: @@ -62,24 +196,22 @@ jobs: JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }} JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }} - - name: Checkout main code + - name: Checkout repository uses: actions/checkout@v4 with: ref: develop - # 📝 이슈 파싱 (템플릿 경로 자동 선택) - name: Parse Issue uses: stefanbuck/github-issue-parser@v3 id: issue-parser with: template-path: .github/ISSUE_TEMPLATE/${{ steps.type.outputs.template }} - - - name: Log Issue Parser + + - name: Log Issue Parser Output run: | - echo '${{ steps.issue-parser.outputs.issueparser_parentKey }}' - echo '${{ steps.issue-parser.outputs.__ticket_number }}' - echo '${{ steps.issue-parser.outputs.jsonString }}' - + echo "Parent Key: ${{ steps.issue-parser.outputs.issueparser_parentKey }}" + echo "Description: ${{ steps.issue-parser.outputs.issueparser_description }}" + - name: Convert markdown to Jira Syntax uses: peter-evans/jira2md@v1 id: md2jira @@ -98,15 +230,7 @@ jobs: ${{ steps.issue-parser.outputs.issueparser_links }} mode: md2jira - - name: Get Available Issue Types - run: | - curl -u ${{ secrets.JIRA_USER_EMAIL }}:${{ secrets.JIRA_API_TOKEN }} \ - -X GET \ - -H "Content-Type: application/json" \ - "${{ secrets.JIRA_BASE_URL }}/rest/api/3/project/BOOK/statuses" \ - | jq '.[] | select(.subtask == true) | .name' - - - name: Create Issue + - name: Create Jira Issue id: create uses: atlassian/gajira-create@v3 with: @@ -120,64 +244,73 @@ jobs: "key": "${{ steps.issue-parser.outputs.issueparser_parentKey }}" } } - - - name: Log created issue - run: echo "Jira Issue ${{ steps.issue-parser.outputs.parentKey }}/${{ steps.create.outputs.issue }} was created" - - name: Debug all issue-parser outputs + - name: Log created issue run: | - echo "🪵 Outputs:" - echo '${{ toJson(steps.issue-parser.outputs) }}' - - - name: Checkout both branches + echo "✅ Jira Issue Created: ${{ steps.create.outputs.issue }}" + echo "Parent: ${{ steps.issue-parser.outputs.issueparser_parentKey }}" + + - name: Checkout for branch creation uses: actions/checkout@v4 with: fetch-depth: 0 - + - name: Switch to develop run: | git fetch origin develop git checkout develop - + - name: Generate Branch Name id: branch run: | issue_number=${{ github.event.issue.number }} - issue_title="${{ github.event.issue.title }}" - slug=$(echo "$issue_title" | tr '[:upper:]' '[:lower:]' | sed 's/ /-/g' | sed 's/[^a-z0-9\-]//g') ticket_key="${{ steps.create.outputs.issue }}" - branch_name="${ticket_key}-${{ steps.type.outputs.type }}/#${issue_number}" + type="${{ steps.type.outputs.type }}" + branch_name="${ticket_key}-${type}/#${issue_number}" echo "branch=${branch_name}" >> $GITHUB_OUTPUT - - name: Create and push branch + - name: Check and create branch + id: create_branch run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" - git checkout -b "${{ steps.branch.outputs.branch }}" - git push origin "${{ steps.branch.outputs.branch }}" - + + # 브랜치가 이미 존재하는지 확인 + if git ls-remote --heads origin "${{ steps.branch.outputs.branch }}" | grep -q "${{ steps.branch.outputs.branch }}"; then + echo "⚠️ Branch already exists. Skipping creation." + echo "created=false" >> $GITHUB_OUTPUT + else + git checkout -b "${{ steps.branch.outputs.branch }}" + git push origin "${{ steps.branch.outputs.branch }}" + echo "✅ Branch created successfully." + echo "created=true" >> $GITHUB_OUTPUT + fi + - name: Update issue title uses: actions-cool/issues-helper@v3 with: actions: 'update-issue' token: ${{ secrets.PAT_TOKEN }} - title: '[${{ steps.create.outputs.issue }}/${{ github.event.issue.title }}' + title: '[${{ steps.create.outputs.issue }}] ${{ github.event.issue.title }}' - - name: Add comment with Jira issue link + - name: Add Jira issue link comment uses: actions-cool/issues-helper@v3 with: actions: 'create-comment' token: ${{ secrets.PAT_TOKEN }} issue-number: ${{ github.event.issue.number }} - body: 'Jira Issue Created: [${{ steps.create.outputs.issue }}](${{ secrets.JIRA_BASE_URL }}/browse/${{ steps.create.outputs.issue }})' + body: | + 🎫 **Jira Issue Created:** [${{ steps.create.outputs.issue }}](${{ secrets.JIRA_BASE_URL }}/browse/${{ steps.create.outputs.issue }}) - - name: Add comment with Branch Name + - name: Add branch comment + if: steps.create_branch.outputs.created == 'true' uses: actions-cool/issues-helper@v3 with: actions: 'create-comment' token: ${{ secrets.PAT_TOKEN }} issue-number: ${{ github.event.issue.number }} - body: '🔀 Branch Created: `${{ steps.branch.outputs.branch }}`' + body: | + 🔀 **Branch Created:** `${{ steps.branch.outputs.branch }}` - name: Assign issue author uses: actions-cool/issues-helper@v3 diff --git a/.github/workflows/create_release_branch.yaml b/.github/workflows/create_release_branch.yaml deleted file mode 100644 index 9d42d01d..00000000 --- a/.github/workflows/create_release_branch.yaml +++ /dev/null @@ -1,71 +0,0 @@ -name: Create Release Branch - -# on: -# release: -# types: [published] -# workflow_dispatch: -# inputs: -# tag: -# description: 'Tag name (e.g., v1.0.0)' -# required: true -# type: string - -# jobs: -# create-branch: -# runs-on: ubuntu-latest -# steps: -# - name: Checkout repository -# uses: actions/checkout@v4 -# with: -# ref: develop -# fetch-depth: 0 - -# - name: Fetch all tags -# run: git fetch --all --tags - -# - name: Extract tag name -# id: tag -# run: | -# if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then -# TAG_NAME="${{ inputs.tag }}" -# else -# TAG_NAME=${GITHUB_REF#refs/tags/} -# fi -# echo "tag=${TAG_NAME}" >> $GITHUB_OUTPUT -# echo "branch=release/${TAG_NAME}" >> $GITHUB_OUTPUT - -# - name: Verify tag exists -# run: | -# if ! git rev-parse "${{ steps.tag.outputs.tag }}" >/dev/null 2>&1; then -# echo "Error: Tag ${{ steps.tag.outputs.tag }} does not exist" -# exit 1 -# fi -# echo "Tag ${{ steps.tag.outputs.tag }} exists" - -# - name: Check if branch already exists -# id: check -# run: | -# if git ls-remote --heads origin "${{ steps.tag.outputs.branch }}" | grep -q "${{ steps.tag.outputs.branch }}"; then -# echo "exists=true" >> $GITHUB_OUTPUT -# echo "Branch ${{ steps.tag.outputs.branch }} already exists - skipping" -# else -# echo "exists=false" >> $GITHUB_OUTPUT -# fi - -# - name: Create release branch from develop -# if: steps.check.outputs.exists == 'false' -# run: | -# git config user.name "github-actions[bot]" -# git config user.email "github-actions[bot]@users.noreply.github.com" -# git checkout develop -# git pull origin develop -# git checkout -b ${{ steps.tag.outputs.branch }} -# git push origin ${{ steps.tag.outputs.branch }} - -# - name: Summary -# run: | -# if [ "${{ steps.check.outputs.exists }}" = "true" ]; then -# echo "Branch ${{ steps.tag.outputs.branch }} already exists - skipped" -# else -# echo "Created branch: ${{ steps.tag.outputs.branch }} from develop" -# fi From a4d417326873e4adbac9ac0e24a6a5b06c6aa8a2 Mon Sep 17 00:00:00 2001 From: Jiyong Jung Date: Tue, 4 Nov 2025 18:14:57 +0900 Subject: [PATCH 10/10] [BOOK-411] fix: update fonts in NoteEditView.pageField --- .../Sources/MainFlow/NoteEdit/View/NoteEditView.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift b/src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift index c51c1883..ecd503e6 100644 --- a/src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift +++ b/src/Projects/BKPresentation/Sources/MainFlow/NoteEdit/View/NoteEditView.swift @@ -32,7 +32,8 @@ final class NoteEditView: BaseView { private let pageField = BKTextFieldView( labelText: "책 페이지", - placeholder: "기록하고 싶은 페이지를 작성해보세요" + placeholder: "기록하고 싶은 페이지를 작성해보세요", + fontStyle: .body2(weight: .medium) ) private let sentenceTextView = BKTextView(