From f6e434f91447ae9bd85d9d88b51a491c883640b0 Mon Sep 17 00:00:00 2001 From: Yungee Jung <86039030+jungyungee@users.noreply.github.com> Date: Wed, 29 Oct 2025 17:17:07 +0900 Subject: [PATCH 01/57] Add pull request template for new features --- .github/PULL_REQUEST_TEMPLATE.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..f682997 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,17 @@ +### ๐Ÿ’ก To Reviewers +- ํ•ด๋‹น ๋ธŒ๋žœ์น˜์—์„œ ์ƒˆ๋กญ๊ฒŒ ์„ค์น˜ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•จ๊ป˜ ๋ช…์‹œํ•ด ์ฃผ์„ธ์š”. +- ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์ •๋ณด๋‚˜ ์ฐธ๊ณ ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด ์ž์œ ๋กญ๊ฒŒ ์ž‘์„ฑํ•ด ์ฃผ์„ธ์š”. + +### ๐Ÿ”ฅ ์ž‘์—… ๋‚ด์šฉ (๊ฐ€๋Šฅํ•œ ๊ตฌ์ฒด์ ์œผ๋กœ ์ž‘์„ฑํ•ด ์ฃผ์„ธ์š”) +- ๋ฉ”์ธ ํŽ˜์ด์ง€ ๋ฆฌ์ŠคํŠธ ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ +- ํ—ค๋” ๊ตฌํ˜„ + +### ๐Ÿค” ์ถ”ํ›„ ์ž‘์—… ์˜ˆ์ • +- ์ถ”๊ฐ€ ๊ตฌํ˜„์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์ด๋‚˜ ๋‹ค์Œ ์ž‘์—… ๊ณ„ํš์„ ์ž‘์„ฑํ•ด ์ฃผ์„ธ์š”. + +### ๐Ÿ“ธ ์ž‘์—… ๊ฒฐ๊ณผ (์Šคํฌ๋ฆฐ์ƒท) +- ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์Šคํฌ๋ฆฐ์ƒท์„ ์ฒจ๋ถ€ํ•ด ์ฃผ์„ธ์š”. + +### ๐Ÿ”— ๊ด€๋ จ ์ด์Šˆ +- ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ์‹œ ์—ฐ๊ฒฐํ–ˆ๋˜ ์ด์Šˆ ๋ฒˆํ˜ธ๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ์„ธ์š”. +- ์˜ˆ: #2 From b4260667be20ac1ead6d3359181382c387fd35bc Mon Sep 17 00:00:00 2001 From: Yungee Jung <86039030+jungyungee@users.noreply.github.com> Date: Wed, 29 Oct 2025 17:18:31 +0900 Subject: [PATCH 02/57] Update issue templates --- .github/ISSUE_TEMPLATE/feature_request.md | 24 +++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..a014b8e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,24 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +### ๐Ÿš€ ์ด์Šˆ ์œ ํ˜• +- [ ] ๊ธฐ๋Šฅ ์ถ”๊ฐ€ +- [ ] ๋ฒ„๊ทธ ์ˆ˜์ • +- [ ] ๋ฆฌํŒฉํ† ๋ง +- [ ] ๊ธฐํƒ€ (์„ค๋ช… ์ถ”๊ฐ€) + +--- + +### โœจย ๊ธฐ๋Šฅ +์–ด๋–ค ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ• ์ง€ ๊ฐ„๋‹จํžˆ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. + +--- + +### ๐Ÿ“Ž ์ฐธ๊ณ  ์ž๋ฃŒ +ํ”ผ๊ทธ๋งˆ, ๋…ธ์…˜, ์Šคํฌ๋ฆฐ์ƒท, ๊ด€๋ จ ๋งํฌ ๋“ฑ ์žˆ์œผ๋ฉด ์ฒจ๋ถ€ํ•ด์ฃผ์„ธ์š”. From 9579d029755c3f261cdc33e96852e832758d2bf2 Mon Sep 17 00:00:00 2001 From: jungyungee Date: Thu, 30 Oct 2025 01:13:41 +0900 Subject: [PATCH 03/57] Initial commit from Create Next App --- .gitignore | 41 + app/favicon.ico | Bin 0 -> 25931 bytes app/globals.css | 26 + app/layout.tsx | 34 + app/page.tsx | 65 + eslint.config.mjs | 18 + next.config.ts | 7 + package-lock.json | 6574 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 26 + postcss.config.mjs | 7 + public/file.svg | 1 + public/globe.svg | 1 + public/next.svg | 1 + public/vercel.svg | 1 + public/window.svg | 1 + tsconfig.json | 34 + 16 files changed, 6837 insertions(+) create mode 100644 .gitignore create mode 100644 app/favicon.ico create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/page.tsx create mode 100644 eslint.config.mjs create mode 100644 next.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 public/file.svg create mode 100644 public/globe.svg create mode 100644 public/next.svg create mode 100644 public/vercel.svg create mode 100644 public/window.svg create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ef6a52 --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..a2dc41e --- /dev/null +++ b/app/globals.css @@ -0,0 +1,26 @@ +@import "tailwindcss"; + +:root { + --background: #ffffff; + --foreground: #171717; +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +body { + background: var(--background); + color: var(--foreground); + font-family: Arial, Helvetica, sans-serif; +} diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..f7fa87e --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,34 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..295f8fd --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,65 @@ +import Image from "next/image"; + +export default function Home() { + return ( +
+
+ Next.js logo +
+

+ To get started, edit the page.tsx file. +

+

+ Looking for a starting point or more instructions? Head over to{" "} + + Templates + {" "} + or the{" "} + + Learning + {" "} + center. +

+
+ +
+
+ ); +} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..05e726d --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,18 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import nextVitals from "eslint-config-next/core-web-vitals"; +import nextTs from "eslint-config-next/typescript"; + +const eslintConfig = defineConfig([ + ...nextVitals, + ...nextTs, + // Override default ignores of eslint-config-next. + globalIgnores([ + // Default ignores of eslint-config-next: + ".next/**", + "out/**", + "build/**", + "next-env.d.ts", + ]), +]); + +export default eslintConfig; diff --git a/next.config.ts b/next.config.ts new file mode 100644 index 0000000..e9ffa30 --- /dev/null +++ b/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..c7c0257 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6574 @@ +{ + "name": "next-netflix", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "next-netflix", + "version": "0.1.0", + "dependencies": { + "next": "16.0.1", + "react": "19.2.0", + "react-dom": "19.2.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "16.0.1", + "tailwindcss": "^4", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.6.0.tgz", + "integrity": "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.6.0.tgz", + "integrity": "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers/node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", + "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.4.tgz", + "integrity": "sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.3" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.4.tgz", + "integrity": "sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.3" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.3.tgz", + "integrity": "sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.3.tgz", + "integrity": "sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.3.tgz", + "integrity": "sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.3.tgz", + "integrity": "sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.3.tgz", + "integrity": "sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.3.tgz", + "integrity": "sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.3.tgz", + "integrity": "sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.3.tgz", + "integrity": "sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.3.tgz", + "integrity": "sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.4.tgz", + "integrity": "sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.3" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.4.tgz", + "integrity": "sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.3" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.4.tgz", + "integrity": "sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.3" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.4.tgz", + "integrity": "sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.3" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.4.tgz", + "integrity": "sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.3" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.4.tgz", + "integrity": "sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.3" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.4.tgz", + "integrity": "sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.3" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.4.tgz", + "integrity": "sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.5.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.4.tgz", + "integrity": "sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.4.tgz", + "integrity": "sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.4.tgz", + "integrity": "sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@next/env": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.1.tgz", + "integrity": "sha512-LFvlK0TG2L3fEOX77OC35KowL8D7DlFF45C0OvKMC4hy8c/md1RC4UMNDlUGJqfCoCS2VWrZ4dSE6OjaX5+8mw==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.0.1.tgz", + "integrity": "sha512-g4Cqmv/gyFEXNeVB2HkqDlYKfy+YrlM2k8AVIO/YQVEPfhVruH1VA99uT1zELLnPLIeOnx8IZ6Ddso0asfTIdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.1.tgz", + "integrity": "sha512-R0YxRp6/4W7yG1nKbfu41bp3d96a0EalonQXiMe+1H9GTHfKxGNCGFNWUho18avRBPsO8T3RmdWuzmfurlQPbg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.1.tgz", + "integrity": "sha512-kETZBocRux3xITiZtOtVoVvXyQLB7VBxN7L6EPqgI5paZiUlnsgYv4q8diTNYeHmF9EiehydOBo20lTttCbHAg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.1.tgz", + "integrity": "sha512-hWg3BtsxQuSKhfe0LunJoqxjO4NEpBmKkE+P2Sroos7yB//OOX3jD5ISP2wv8QdUwtRehMdwYz6VB50mY6hqAg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.1.tgz", + "integrity": "sha512-UPnOvYg+fjAhP3b1iQStcYPWeBFRLrugEyK/lDKGk7kLNua8t5/DvDbAEFotfV1YfcOY6bru76qN9qnjLoyHCQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.1.tgz", + "integrity": "sha512-Et81SdWkcRqAJziIgFtsFyJizHoWne4fzJkvjd6V4wEkWTB4MX6J0uByUb0peiJQ4WeAt6GGmMszE5KrXK6WKg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.1.tgz", + "integrity": "sha512-qBbgYEBRrC1egcG03FZaVfVxrJm8wBl7vr8UFKplnxNRprctdP26xEv9nJ07Ggq4y1adwa0nz2mz83CELY7N6Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.1.tgz", + "integrity": "sha512-cPuBjYP6I699/RdbHJonb3BiRNEDm5CKEBuJ6SD8k3oLam2fDRMKAvmrli4QMDgT2ixyRJ0+DTkiODbIQhRkeQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.1.tgz", + "integrity": "sha512-XeEUJsE4JYtfrXe/LaJn3z1pD19fK0Q6Er8Qoufi+HqvdO4LEPyCxLUt4rxA+4RfYo6S9gMlmzCMU2F+AatFqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.16.tgz", + "integrity": "sha512-BX5iaSsloNuvKNHRN3k2RcCuTEgASTo77mofW0vmeHkfrDWaoFAFvNHpEgtu0eqyypcyiBkDWzSMxJhp3AUVcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.19", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.16" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.16.tgz", + "integrity": "sha512-2OSv52FRuhdlgyOQqgtQHuCgXnS8nFSYRp2tJ+4WZXKgTxqPy7SMSls8c3mPT5pkZ17SBToGM5LHEJBO7miEdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.16", + "@tailwindcss/oxide-darwin-arm64": "4.1.16", + "@tailwindcss/oxide-darwin-x64": "4.1.16", + "@tailwindcss/oxide-freebsd-x64": "4.1.16", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.16", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.16", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.16", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.16", + "@tailwindcss/oxide-linux-x64-musl": "4.1.16", + "@tailwindcss/oxide-wasm32-wasi": "4.1.16", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.16", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.16" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.16.tgz", + "integrity": "sha512-8+ctzkjHgwDJ5caq9IqRSgsP70xhdhJvm+oueS/yhD5ixLhqTw9fSL1OurzMUhBwE5zK26FXLCz2f/RtkISqHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.16.tgz", + "integrity": "sha512-C3oZy5042v2FOALBZtY0JTDnGNdS6w7DxL/odvSny17ORUnaRKhyTse8xYi3yKGyfnTUOdavRCdmc8QqJYwFKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.16.tgz", + "integrity": "sha512-vjrl/1Ub9+JwU6BP0emgipGjowzYZMjbWCDqwA2Z4vCa+HBSpP4v6U2ddejcHsolsYxwL5r4bPNoamlV0xDdLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.16.tgz", + "integrity": "sha512-TSMpPYpQLm+aR1wW5rKuUuEruc/oOX3C7H0BTnPDn7W/eMw8W+MRMpiypKMkXZfwH8wqPIRKppuZoedTtNj2tg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.16.tgz", + "integrity": "sha512-p0GGfRg/w0sdsFKBjMYvvKIiKy/LNWLWgV/plR4lUgrsxFAoQBFrXkZ4C0w8IOXfslB9vHK/JGASWD2IefIpvw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.16.tgz", + "integrity": "sha512-DoixyMmTNO19rwRPdqviTrG1rYzpxgyYJl8RgQvdAQUzxC1ToLRqtNJpU/ATURSKgIg6uerPw2feW0aS8SNr/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.16.tgz", + "integrity": "sha512-H81UXMa9hJhWhaAUca6bU2wm5RRFpuHImrwXBUvPbYb+3jo32I9VIwpOX6hms0fPmA6f2pGVlybO6qU8pF4fzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.16.tgz", + "integrity": "sha512-ZGHQxDtFC2/ruo7t99Qo2TTIvOERULPl5l0K1g0oK6b5PGqjYMga+FcY1wIUnrUxY56h28FxybtDEla+ICOyew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.16.tgz", + "integrity": "sha512-Oi1tAaa0rcKf1Og9MzKeINZzMLPbhxvm7rno5/zuP1WYmpiG0bEHq4AcRUiG2165/WUzvxkW4XDYCscZWbTLZw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.16.tgz", + "integrity": "sha512-B01u/b8LteGRwucIBmCQ07FVXLzImWESAIMcUU6nvFt/tYsQ6IHz8DmZ5KtvmwxD+iTYBtM1xwoGXswnlu9v0Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.7", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.16.tgz", + "integrity": "sha512-zX+Q8sSkGj6HKRTMJXuPvOcP8XfYON24zJBRPlszcH1Np7xuHXhWn8qfFjIujVzvH3BHU+16jBXwgpl20i+v9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.16.tgz", + "integrity": "sha512-m5dDFJUEejbFqP+UXVstd4W/wnxA4F61q8SoL+mqTypId2T2ZpuxosNSgowiCnLp2+Z+rivdU0AqpfgiD7yCBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.16.tgz", + "integrity": "sha512-Qn3SFGPXYQMKR/UtqS+dqvPrzEeBZHrFA92maT4zijCVggdsXnDBMsPFJo1eArX3J+O+Gi+8pV4PkqjLCNBk3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.16", + "@tailwindcss/oxide": "4.1.16", + "postcss": "^8.4.41", + "tailwindcss": "4.1.16" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.24.tgz", + "integrity": "sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", + "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.2.tgz", + "integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz", + "integrity": "sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/type-utils": "8.46.2", + "@typescript-eslint/utils": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.46.2", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.2.tgz", + "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.2.tgz", + "integrity": "sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.2", + "@typescript-eslint/types": "^8.46.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz", + "integrity": "sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz", + "integrity": "sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.2.tgz", + "integrity": "sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/utils": "8.46.2", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz", + "integrity": "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz", + "integrity": "sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.2", + "@typescript-eslint/tsconfig-utils": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.2.tgz", + "integrity": "sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz", + "integrity": "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", + "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.21", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.21.tgz", + "integrity": "sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001751", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", + "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.243", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.243.tgz", + "integrity": "sha512-ZCphxFW3Q1TVhcgS9blfut1PX8lusVi2SvXQgmEEnK4TCmE1JhH2JkjJN+DNt0pJJwfBri5AROBnz2b/C+YU9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz", + "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.1", + "@eslint/core": "^0.16.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.38.0", + "@eslint/plugin-kit": "^0.4.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.0.1.tgz", + "integrity": "sha512-wNuHw5gNOxwLUvpg0cu6IL0crrVC9hAwdS/7UwleNkwyaMiWIOAwf8yzXVqBBzL3c9A7jVRngJxjoSpPP1aEhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "16.0.1", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^7.0.0", + "globals": "16.4.0", + "typescript-eslint": "^8.46.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/next": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/next/-/next-16.0.1.tgz", + "integrity": "sha512-e9RLSssZwd35p7/vOa+hoDFggUZIUbZhIUSLZuETCwrCVvxOs87NamoUzT+vbcNAL8Ld9GobBnWOA6SbV/arOw==", + "license": "MIT", + "dependencies": { + "@next/env": "16.0.1", + "@swc/helpers": "0.5.15", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.0.1", + "@next/swc-darwin-x64": "16.0.1", + "@next/swc-linux-arm64-gnu": "16.0.1", + "@next/swc-linux-arm64-musl": "16.0.1", + "@next/swc-linux-x64-gnu": "16.0.1", + "@next/swc-linux-x64-musl": "16.0.1", + "@next/swc-win32-arm64-msvc": "16.0.1", + "@next/swc-win32-x64-msvc": "16.0.1", + "sharp": "^0.34.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", + "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", + "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.4.tgz", + "integrity": "sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.0", + "semver": "^7.7.2" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.4", + "@img/sharp-darwin-x64": "0.34.4", + "@img/sharp-libvips-darwin-arm64": "1.2.3", + "@img/sharp-libvips-darwin-x64": "1.2.3", + "@img/sharp-libvips-linux-arm": "1.2.3", + "@img/sharp-libvips-linux-arm64": "1.2.3", + "@img/sharp-libvips-linux-ppc64": "1.2.3", + "@img/sharp-libvips-linux-s390x": "1.2.3", + "@img/sharp-libvips-linux-x64": "1.2.3", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.3", + "@img/sharp-libvips-linuxmusl-x64": "1.2.3", + "@img/sharp-linux-arm": "0.34.4", + "@img/sharp-linux-arm64": "0.34.4", + "@img/sharp-linux-ppc64": "0.34.4", + "@img/sharp-linux-s390x": "0.34.4", + "@img/sharp-linux-x64": "0.34.4", + "@img/sharp-linuxmusl-arm64": "0.34.4", + "@img/sharp-linuxmusl-x64": "0.34.4", + "@img/sharp-wasm32": "0.34.4", + "@img/sharp-win32-arm64": "0.34.4", + "@img/sharp-win32-ia32": "0.34.4", + "@img/sharp-win32-x64": "0.34.4" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.16.tgz", + "integrity": "sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.2.tgz", + "integrity": "sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.46.2", + "@typescript-eslint/parser": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/utils": "8.46.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", + "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..32c2fbc --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "next-netflix", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "eslint" + }, + "dependencies": { + "react": "19.2.0", + "react-dom": "19.2.0", + "next": "16.0.1" + }, + "devDependencies": { + "typescript": "^5", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "@tailwindcss/postcss": "^4", + "tailwindcss": "^4", + "eslint": "^9", + "eslint-config-next": "16.0.1" + } +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..61e3684 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/public/file.svg b/public/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/next.svg b/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg new file mode 100644 index 0000000..7705396 --- /dev/null +++ b/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/window.svg b/public/window.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..3a13f90 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts", + "**/*.mts" + ], + "exclude": ["node_modules"] +} From 16fff459a10b5eae0e78a60680d482c89a5d1a9d Mon Sep 17 00:00:00 2001 From: jungyungee Date: Thu, 30 Oct 2025 11:42:39 +0900 Subject: [PATCH 04/57] =?UTF-8?q?#1=20[FEAT]=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EA=B8=B0=EB=B3=B8=20=EC=84=B8=ED=8C=85=20=EB=B0=8F?= =?UTF-8?q?=20=EB=9E=9C=EB=94=A9=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=A0=9C?= =?UTF-8?q?=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .prettierrc | 11 + app/comingsoon/page.tsx | 9 + app/downloads/page.tsx | 9 + app/favicon.ico | Bin 25931 -> 0 bytes app/globals.css | 44 +- app/home/page.tsx | 9 + app/layout.tsx | 39 +- app/more/page.tsx | 9 + app/page.tsx | 88 +- app/search/page.tsx | 9 + app/theme.css | 10 + eslint.config.mjs | 33 +- next.config.ts | 2 +- package-lock.json | 151 +++ package.json | 21 +- postcss.config.mjs | 2 +- public/favicon.svg | 1 + public/file.svg | 1 - public/globe.svg | 1 - public/netflix-animation.json | 2222 +++++++++++++++++++++++++++++++++ public/next.svg | 1 - public/vercel.svg | 1 - public/window.svg | 1 - tsconfig.json | 9 +- 24 files changed, 2542 insertions(+), 141 deletions(-) create mode 100644 .prettierrc create mode 100644 app/comingsoon/page.tsx create mode 100644 app/downloads/page.tsx delete mode 100644 app/favicon.ico create mode 100644 app/home/page.tsx create mode 100644 app/more/page.tsx create mode 100644 app/search/page.tsx create mode 100644 app/theme.css create mode 100644 public/favicon.svg delete mode 100644 public/file.svg delete mode 100644 public/globe.svg create mode 100644 public/netflix-animation.json delete mode 100644 public/next.svg delete mode 100644 public/vercel.svg delete mode 100644 public/window.svg diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..7e11949 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "arrowParens": "always", + "bracketSpacing": true, + "endOfLine": "lf", + "printWidth": 120, + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all", + "useTabs": false +} diff --git a/app/comingsoon/page.tsx b/app/comingsoon/page.tsx new file mode 100644 index 0000000..6acb6cb --- /dev/null +++ b/app/comingsoon/page.tsx @@ -0,0 +1,9 @@ +const ComingSoonPage = () => { + return ( +
+

Coming Soon

+
+ ); +}; + +export default ComingSoonPage; diff --git a/app/downloads/page.tsx b/app/downloads/page.tsx new file mode 100644 index 0000000..856191e --- /dev/null +++ b/app/downloads/page.tsx @@ -0,0 +1,9 @@ +const DownloadsPage = () => { + return ( +
+

Downloads

+
+ ); +}; + +export default DownloadsPage; diff --git a/app/favicon.ico b/app/favicon.ico deleted file mode 100644 index 718d6fea4835ec2d246af9800eddb7ffb276240c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25931 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 LrJugUA?W`A8`#=m diff --git a/app/globals.css b/app/globals.css index a2dc41e..b2acaf9 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,26 +1,28 @@ -@import "tailwindcss"; +@import 'tailwindcss'; +@import './theme.css'; -:root { - --background: #ffffff; - --foreground: #171717; +/* Font */ +@font-face { + font-family: 'SF Pro Display'; + font-display: swap; + src: url('/assets/fonts/SFProDisplay.woff2') format('woff2'); } -@theme inline { - --color-background: var(--background); - --color-foreground: var(--foreground); - --font-sans: var(--font-geist-sans); - --font-mono: var(--font-geist-mono); -} - -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; +/* Base style */ +@layer base { + html, + body { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + background-color: var(--color-black); + color: var(--color-white); + font-family: var(--font-sf-pro); + -webkit-font-smoothing: antialiased; + text-align: center; + font-feature-settings: + 'liga' off, + 'clig' off; } } - -body { - background: var(--background); - color: var(--foreground); - font-family: Arial, Helvetica, sans-serif; -} diff --git a/app/home/page.tsx b/app/home/page.tsx new file mode 100644 index 0000000..c0ac020 --- /dev/null +++ b/app/home/page.tsx @@ -0,0 +1,9 @@ +const HomePage = () => { + return ( +
+

Home

+
+ ); +}; + +export default HomePage; diff --git a/app/layout.tsx b/app/layout.tsx index f7fa87e..1a95c1a 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,34 +1,23 @@ -import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; -import "./globals.css"; +import './globals.css'; -const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], -}); - -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); +import type { Metadata } from 'next'; export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: 'Netflix', + description: 'CEOS 22๊ธฐ ๋ชจ๋ธ๋ฆฌ ํŒ€ Netflix ํด๋ก ์ฝ”๋”ฉ ํ”„๋กœ์ ํŠธ', + icons: { + icon: '/favicon.svg', + }, }; -export default function RootLayout({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) { +const RootLayout = ({ children }: { children: React.ReactNode }) => { return ( - - - {children} + + +
{children}
); -} +}; + +export default RootLayout; diff --git a/app/more/page.tsx b/app/more/page.tsx new file mode 100644 index 0000000..2751a91 --- /dev/null +++ b/app/more/page.tsx @@ -0,0 +1,9 @@ +const MorePage = () => { + return ( +
+

More

+
+ ); +}; + +export default MorePage; diff --git a/app/page.tsx b/app/page.tsx index 295f8fd..cb531fe 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,65 +1,29 @@ -import Image from "next/image"; +'use client'; +import Lottie from 'lottie-react'; +import { useRouter } from 'next/navigation'; +import { useEffect } from 'react'; + +import netflixAnimation from '@/public/netflix-animation.json'; + +// ๋žœ๋”ฉํŽ˜์ด์ง€ +const LandingPage = () => { + const router = useRouter(); + + useEffect(() => { + const REDIRECT_TIMER = setTimeout(() => { + router.push('/home'); + }, 3000); + + return () => clearTimeout(REDIRECT_TIMER); + }, [router]); -export default function Home() { return ( -
-
- Next.js logo -
-

- To get started, edit the page.tsx file. -

-

- Looking for a starting point or more instructions? Head over to{" "} - - Templates - {" "} - or the{" "} - - Learning - {" "} - center. -

-
- -
-
+
+
+ +
+
); -} +}; + +export default LandingPage; diff --git a/app/search/page.tsx b/app/search/page.tsx new file mode 100644 index 0000000..988e4cf --- /dev/null +++ b/app/search/page.tsx @@ -0,0 +1,9 @@ +const SearchPage = () => { + return ( +
+

Search

+
+ ); +}; + +export default SearchPage; diff --git a/app/theme.css b/app/theme.css new file mode 100644 index 0000000..c493b82 --- /dev/null +++ b/app/theme.css @@ -0,0 +1,10 @@ +@theme { + /* Colors */ + --color-white: #ffffff; + --color-black: #000000; + --color-gray-dark: #8c8787; + --color-gray-light: #c4c4c4; + + /* Font */ + --font-sf-pro: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif; +} diff --git a/eslint.config.mjs b/eslint.config.mjs index 05e726d..6166d72 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,18 +1,29 @@ -import { defineConfig, globalIgnores } from "eslint/config"; -import nextVitals from "eslint-config-next/core-web-vitals"; -import nextTs from "eslint-config-next/typescript"; +import { defineConfig, globalIgnores } from 'eslint/config'; +import nextVitals from 'eslint-config-next/core-web-vitals'; +import nextTs from 'eslint-config-next/typescript'; +import prettierConfig from 'eslint-config-prettier'; +import pluginPrettier from 'eslint-plugin-prettier'; +import simpleImportSort from 'eslint-plugin-simple-import-sort'; const eslintConfig = defineConfig([ ...nextVitals, ...nextTs, - // Override default ignores of eslint-config-next. - globalIgnores([ - // Default ignores of eslint-config-next: - ".next/**", - "out/**", - "build/**", - "next-env.d.ts", - ]), + { + plugins: { + 'simple-import-sort': simpleImportSort, + prettier: pluginPrettier, + }, + rules: { + // disable stylistic rules that conflict with Prettier + ...prettierConfig.rules, + // keep import sorting automated + 'simple-import-sort/imports': 'warn', + 'simple-import-sort/exports': 'warn', + // surface prettier issues as ESLint warnings + 'prettier/prettier': 'warn', + }, + }, + globalIgnores(['.next/**', 'out/**', 'build/**', 'next-env.d.ts']), ]); export default eslintConfig; diff --git a/next.config.ts b/next.config.ts index e9ffa30..5e891cf 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,4 +1,4 @@ -import type { NextConfig } from "next"; +import type { NextConfig } from 'next'; const nextConfig: NextConfig = { /* config options here */ diff --git a/package-lock.json b/package-lock.json index c7c0257..6b98a45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "next-netflix", "version": "0.1.0", "dependencies": { + "lottie-react": "^2.4.1", "next": "16.0.1", "react": "19.2.0", "react-dom": "19.2.0" @@ -17,8 +18,14 @@ "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", + "@typescript-eslint/eslint-plugin": "^8.46.2", + "@typescript-eslint/parser": "^8.46.2", "eslint": "^9", "eslint-config-next": "16.0.1", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-simple-import-sort": "^12.1.1", + "prettier": "^3.6.2", "tailwindcss": "^4", "typescript": "^5" } @@ -1215,6 +1222,19 @@ "node": ">=12.4.0" } }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -3147,6 +3167,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -3238,6 +3275,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -3306,6 +3344,37 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.7" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, "node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", @@ -3377,6 +3446,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/eslint-plugin-simple-import-sort": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz", + "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, "node_modules/eslint-scope": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", @@ -3478,6 +3557,13 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/fast-glob": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", @@ -4857,6 +4943,25 @@ "loose-envify": "cli.js" } }, + "node_modules/lottie-react": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lottie-react/-/lottie-react-2.4.1.tgz", + "integrity": "sha512-LQrH7jlkigIIv++wIyrOYFLHSKQpEY4zehPicL9bQsrt1rnoKRYCYgpCUe5maqylNtacy58/sQDZTkwMcTRxZw==", + "license": "MIT", + "dependencies": { + "lottie-web": "^5.10.2" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/lottie-web": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.13.0.tgz", + "integrity": "sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==", + "license": "MIT" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -5368,6 +5473,36 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -6051,6 +6186,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/synckit": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, "node_modules/tailwindcss": { "version": "4.1.16", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.16.tgz", diff --git a/package.json b/package.json index 32c2fbc..926039f 100644 --- a/package.json +++ b/package.json @@ -6,21 +6,28 @@ "dev": "next dev", "build": "next build", "start": "next start", - "lint": "eslint" + "lint": "eslint . --ext .js,.jsx,.ts,.tsx" }, "dependencies": { + "lottie-react": "^2.4.1", + "next": "16.0.1", "react": "19.2.0", - "react-dom": "19.2.0", - "next": "16.0.1" + "react-dom": "19.2.0" }, "devDependencies": { - "typescript": "^5", + "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", - "@tailwindcss/postcss": "^4", - "tailwindcss": "^4", + "@typescript-eslint/eslint-plugin": "^8.46.2", + "@typescript-eslint/parser": "^8.46.2", "eslint": "^9", - "eslint-config-next": "16.0.1" + "eslint-config-next": "16.0.1", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-simple-import-sort": "^12.1.1", + "prettier": "^3.6.2", + "tailwindcss": "^4", + "typescript": "^5" } } diff --git a/postcss.config.mjs b/postcss.config.mjs index 61e3684..297374d 100644 --- a/postcss.config.mjs +++ b/postcss.config.mjs @@ -1,6 +1,6 @@ const config = { plugins: { - "@tailwindcss/postcss": {}, + '@tailwindcss/postcss': {}, }, }; diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..7821fa6 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/file.svg b/public/file.svg deleted file mode 100644 index 004145c..0000000 --- a/public/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg deleted file mode 100644 index 567f17b..0000000 --- a/public/globe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/netflix-animation.json b/public/netflix-animation.json new file mode 100644 index 0000000..b23b10e --- /dev/null +++ b/public/netflix-animation.json @@ -0,0 +1,2222 @@ +{ + "v": "5.5.7", + "meta": { + "g": "LottieFiles AE 0.1.20", + "a": "", + "k": "", + "d": "", + "tc": "#FFFFFF" + }, + "fr": 30, + "ip": 0, + "op": 138, + "w": 512, + "h": 512, + "nm": "Nettflix", + "ddd": 0, + "assets": [], + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 4, + "nm": "Big N 1", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 9, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 14.333, + "s": [100] + }, + { + "i": { "x": [1], "y": [1] }, + "o": { "x": [0.612], "y": [0] }, + "t": 57, + "s": [100] + }, + { "t": 83, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { + "a": 1, + "k": [ + { + "i": { "x": 0.455, "y": 1 }, + "o": { "x": 0.684, "y": 0 }, + "t": 52, + "s": [256, 256, 0], + "to": [-24.667, 0, 0], + "ti": [24.667, 0, 0] + }, + { "t": 77.373046875, "s": [108, 256, 0] } + ], + "ix": 2 + }, + "a": { "a": 0, "k": [0.209, 0.143, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.461, 0.461, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.655, 0.655, 0.333], "y": [0, 0, 0] }, + "t": 23, + "s": [66, 66, 100] + }, + { "t": 52, "s": [21, 21, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { "x": 0.252, "y": 1 }, + "o": { "x": 0.434, "y": 0 }, + "t": 9, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [42.684, 1.078], + [0, 0] + ], + "v": [ + [120.607, 218.722], + [31.805, 211.525], + [31.977, 211.212], + [120.318, 218.496] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 23, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [42.684, 1.078], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-119.9, -218.21], + [31.977, 211.212], + [120.318, 218.496] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 62, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [42.684, 1.078], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-119.9, -218.21], + [31.977, 211.212], + [120.318, 218.496] + ], + "c": true + } + ] + }, + { + "t": 78, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [44.422, -6.307], + [0, 0] + ], + "v": [ + [-47.223, -218.706], + [-102.043, -218.706], + [41.501, 198.117], + [102.46, 192.802] + ], + "c": true + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.898039215686, 0.035294117647, 0.078431372549, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Big N 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 1948, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 2, + "ty": 4, + "nm": "Big N 2 matte", + "parent": 1, + "td": 1, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 0, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 5.333, + "s": [100] + }, + { + "i": { "x": [1], "y": [1] }, + "o": { "x": [0.612], "y": [0] }, + "t": 57, + "s": [100] + }, + { "t": 83, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [77.223, 0, 0], "ix": 2 }, + "a": { "a": 0, "k": [77.223, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { "x": 0.252, "y": 1 }, + "o": { "x": 0.434, "y": 0 }, + "t": 0, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [1.198, 0] + ], + "o": [ + [0, 0], + [0, 0], + [-0.901, 0], + [0, 0] + ], + "v": [ + [34.099, -359.119], + [120.288, -359.43], + [120.49, -359.888], + [33.164, -359.117] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 12, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [28.673, 0.875] + ], + "o": [ + [0, 0], + [0, 0], + [-28.673, -3.601], + [0, 0] + ], + "v": [ + [34.128, -218.21], + [120.318, -218.521], + [120.318, 218.521], + [34.128, 211.337] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 62, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [28.673, 0.875] + ], + "o": [ + [0, 0], + [0, 0], + [-28.673, -3.601], + [0, 0] + ], + "v": [ + [34.128, -218.21], + [120.318, -218.521], + [120.318, 218.521], + [34.128, 211.337] + ], + "c": true + } + ] + }, + { + "t": 78, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [28.249, -4.53] + ], + "o": [ + [0, 0], + [0, 0], + [-27.545, 1.34], + [0, 0] + ], + "v": [ + [48.414, -218.706], + [114.365, -217.965], + [116.869, 194.041], + [44.408, 201.102] + ], + "c": true + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.694117647059, 0.023529411765, 0.058823529412, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Big N 2", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 1948, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 3, + "ty": 4, + "nm": "Big N 1 shadow 2", + "tt": 1, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 9, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 14.333, + "s": [100] + }, + { + "i": { "x": [1], "y": [1] }, + "o": { "x": [0.612], "y": [0] }, + "t": 57, + "s": [100] + }, + { "t": 83, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { + "a": 1, + "k": [ + { + "i": { "x": 0.455, "y": 1 }, + "o": { "x": 0.684, "y": 0 }, + "t": 52, + "s": [256, 256, 0], + "to": [-24.667, 0, 0], + "ti": [24.667, 0, 0] + }, + { "t": 77.373046875, "s": [108, 256, 0] } + ], + "ix": 2 + }, + "a": { "a": 0, "k": [0.209, 0.143, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.461, 0.461, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.655, 0.655, 0.333], "y": [0, 0, 0] }, + "t": 23, + "s": [66, 66, 100] + }, + { "t": 52, "s": [21, 21, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "ef": [ + { + "ty": 25, + "nm": "Drop Shadow", + "np": 8, + "mn": "ADBE Drop Shadow", + "ix": 1, + "en": 1, + "ef": [ + { + "ty": 2, + "nm": "Shadow Color", + "mn": "ADBE Drop Shadow-0001", + "ix": 1, + "v": { + "a": 0, + "k": [0.086274512112, 0, 0.0074725952, 1], + "ix": 1 + } + }, + { + "ty": 0, + "nm": "Opacity", + "mn": "ADBE Drop Shadow-0002", + "ix": 2, + "v": { "a": 0, "k": 178.5, "ix": 2 } + }, + { + "ty": 0, + "nm": "Direction", + "mn": "ADBE Drop Shadow-0003", + "ix": 3, + "v": { "a": 0, "k": 0, "ix": 3 } + }, + { + "ty": 0, + "nm": "Distance", + "mn": "ADBE Drop Shadow-0004", + "ix": 4, + "v": { "a": 0, "k": 0, "ix": 4 } + }, + { + "ty": 0, + "nm": "Softness", + "mn": "ADBE Drop Shadow-0005", + "ix": 5, + "v": { "a": 0, "k": 100, "ix": 5 } + }, + { + "ty": 7, + "nm": "Shadow Only", + "mn": "ADBE Drop Shadow-0006", + "ix": 6, + "v": { "a": 0, "k": 0, "ix": 6 } + } + ] + } + ], + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { "x": 0.252, "y": 1 }, + "o": { "x": 0.434, "y": 0 }, + "t": 9, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [42.684, 1.078], + [0, 0] + ], + "v": [ + [120.607, 218.722], + [31.805, 211.525], + [31.977, 211.212], + [120.318, 218.496] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 23, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [42.684, 1.078], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-119.9, -218.21], + [31.977, 211.212], + [120.318, 218.496] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 62, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [42.684, 1.078], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-119.9, -218.21], + [31.977, 211.212], + [120.318, 218.496] + ], + "c": true + } + ] + }, + { + "t": 78, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [44.422, -6.307], + [0, 0] + ], + "v": [ + [-47.223, -218.706], + [-102.043, -218.706], + [41.501, 198.117], + [102.46, 192.802] + ], + "c": true + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.898039215686, 0.035294117647, 0.078431372549, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Big N 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 1", + "np": 0, + "cix": 2, + "bm": 0, + "ix": 2, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 1948, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 4, + "ty": 4, + "nm": "Big N 2", + "parent": 1, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 0, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 5.333, + "s": [100] + }, + { + "i": { "x": [1], "y": [1] }, + "o": { "x": [0.612], "y": [0] }, + "t": 57, + "s": [100] + }, + { "t": 83, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [77.223, 0, 0], "ix": 2 }, + "a": { "a": 0, "k": [77.223, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { "x": 0.252, "y": 1 }, + "o": { "x": 0.434, "y": 0 }, + "t": 0, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [1.198, 0] + ], + "o": [ + [0, 0], + [0, 0], + [-0.901, 0], + [0, 0] + ], + "v": [ + [34.099, -359.119], + [120.288, -359.43], + [120.49, -359.888], + [33.164, -359.117] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 12, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [28.673, 0.875] + ], + "o": [ + [0, 0], + [0, 0], + [-28.673, -3.601], + [0, 0] + ], + "v": [ + [34.128, -218.21], + [120.318, -218.521], + [120.318, 218.521], + [34.128, 211.337] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 62, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [28.673, 0.875] + ], + "o": [ + [0, 0], + [0, 0], + [-28.673, -3.601], + [0, 0] + ], + "v": [ + [34.128, -218.21], + [120.318, -218.521], + [120.318, 218.521], + [34.128, 211.337] + ], + "c": true + } + ] + }, + { + "t": 78, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [28.249, -4.53] + ], + "o": [ + [0, 0], + [0, 0], + [-27.545, 1.34], + [0, 0] + ], + "v": [ + [48.414, -218.706], + [114.365, -217.965], + [116.869, 194.041], + [44.408, 201.102] + ], + "c": true + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.694117647059, 0.023529411765, 0.058823529412, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Big N 2", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 1948, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 5, + "ty": 4, + "nm": "Big N 3 matte", + "parent": 1, + "td": 1, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 19, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 24.333, + "s": [100] + }, + { + "i": { "x": [1], "y": [1] }, + "o": { "x": [0.612], "y": [0] }, + "t": 57, + "s": [100] + }, + { "t": 83, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [-77.223, 0, 0], "ix": 2 }, + "a": { "a": 0, "k": [-77.223, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { "x": 0.252, "y": 1 }, + "o": { "x": 0.434, "y": 0 }, + "t": 19, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 1.089] + ], + "o": [ + [0, 0], + [0, 0], + [26.294, 0.724], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-120.318, -218.521], + [-120.72, -218.979], + [-34.705, -218.587] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 30, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [-28.673, 0.875] + ], + "o": [ + [0, 0], + [0, 0], + [28.673, -3.601], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-120.318, -218.521], + [-120.318, 218.521], + [-34.128, 211.337] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 62, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [-28.673, 0.875] + ], + "o": [ + [0, 0], + [0, 0], + [28.673, -3.601], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-120.318, -218.521], + [-120.318, 218.521], + [-34.128, 211.337] + ], + "c": true + } + ] + }, + { + "t": 78, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [-28.758, -0.959] + ], + "o": [ + [0, 0], + [0, 0], + [28.673, -3.601], + [0, 0] + ], + "v": [ + [-43.652, -218.74], + [-106.032, -218.137], + [-106.032, 217.33], + [-37.7, 211.816] + ], + "c": true + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.694117647059, 0.023529411765, 0.058823529412, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Big N 3", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 1948, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 6, + "ty": 4, + "nm": "Big N 1 shadow", + "tt": 1, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 9, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 14.333, + "s": [100] + }, + { + "i": { "x": [1], "y": [1] }, + "o": { "x": [0.612], "y": [0] }, + "t": 57, + "s": [100] + }, + { "t": 83, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { + "a": 1, + "k": [ + { + "i": { "x": 0.455, "y": 1 }, + "o": { "x": 0.684, "y": 0 }, + "t": 52, + "s": [256, 256, 0], + "to": [-24.667, 0, 0], + "ti": [24.667, 0, 0] + }, + { "t": 77.373046875, "s": [108, 256, 0] } + ], + "ix": 2 + }, + "a": { "a": 0, "k": [0.209, 0.143, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.461, 0.461, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.655, 0.655, 0.333], "y": [0, 0, 0] }, + "t": 23, + "s": [66, 66, 100] + }, + { "t": 52, "s": [21, 21, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "ef": [ + { + "ty": 25, + "nm": "Drop Shadow", + "np": 8, + "mn": "ADBE Drop Shadow", + "ix": 1, + "en": 1, + "ef": [ + { + "ty": 2, + "nm": "Shadow Color", + "mn": "ADBE Drop Shadow-0001", + "ix": 1, + "v": { + "a": 0, + "k": [0.086274512112, 0, 0.0074725952, 1], + "ix": 1 + } + }, + { + "ty": 0, + "nm": "Opacity", + "mn": "ADBE Drop Shadow-0002", + "ix": 2, + "v": { "a": 0, "k": 178.5, "ix": 2 } + }, + { + "ty": 0, + "nm": "Direction", + "mn": "ADBE Drop Shadow-0003", + "ix": 3, + "v": { "a": 0, "k": 0, "ix": 3 } + }, + { + "ty": 0, + "nm": "Distance", + "mn": "ADBE Drop Shadow-0004", + "ix": 4, + "v": { "a": 0, "k": 0, "ix": 4 } + }, + { + "ty": 0, + "nm": "Softness", + "mn": "ADBE Drop Shadow-0005", + "ix": 5, + "v": { "a": 0, "k": 100, "ix": 5 } + }, + { + "ty": 7, + "nm": "Shadow Only", + "mn": "ADBE Drop Shadow-0006", + "ix": 6, + "v": { "a": 0, "k": 0, "ix": 6 } + } + ] + } + ], + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { "x": 0.252, "y": 1 }, + "o": { "x": 0.434, "y": 0 }, + "t": 9, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [42.684, 1.078], + [0, 0] + ], + "v": [ + [120.607, 218.722], + [31.805, 211.525], + [31.977, 211.212], + [120.318, 218.496] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 23, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [42.684, 1.078], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-119.9, -218.21], + [31.977, 211.212], + [120.318, 218.496] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 62, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [42.684, 1.078], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-119.9, -218.21], + [31.977, 211.212], + [120.318, 218.496] + ], + "c": true + } + ] + }, + { + "t": 78, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [44.422, -6.307], + [0, 0] + ], + "v": [ + [-47.223, -218.706], + [-102.043, -218.706], + [41.501, 198.117], + [102.46, 192.802] + ], + "c": true + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.898039215686, 0.035294117647, 0.078431372549, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Big N 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 1948, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 7, + "ty": 4, + "nm": "Big N 3", + "parent": 1, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 19, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 24.333, + "s": [100] + }, + { + "i": { "x": [1], "y": [1] }, + "o": { "x": [0.612], "y": [0] }, + "t": 57, + "s": [100] + }, + { "t": 83, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [-77.223, 0, 0], "ix": 2 }, + "a": { "a": 0, "k": [-77.223, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { "x": 0.252, "y": 1 }, + "o": { "x": 0.434, "y": 0 }, + "t": 19, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 1.089] + ], + "o": [ + [0, 0], + [0, 0], + [26.294, 0.724], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-120.318, -218.521], + [-120.72, -218.979], + [-34.705, -218.587] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 30, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [-28.673, 0.875] + ], + "o": [ + [0, 0], + [0, 0], + [28.673, -3.601], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-120.318, -218.521], + [-120.318, 218.521], + [-34.128, 211.337] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 62, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [-28.673, 0.875] + ], + "o": [ + [0, 0], + [0, 0], + [28.673, -3.601], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-120.318, -218.521], + [-120.318, 218.521], + [-34.128, 211.337] + ], + "c": true + } + ] + }, + { + "t": 78, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [-28.758, -0.959] + ], + "o": [ + [0, 0], + [0, 0], + [28.673, -3.601], + [0, 0] + ], + "v": [ + [-43.652, -218.74], + [-106.032, -218.137], + [-106.032, 217.33], + [-37.7, 211.816] + ], + "c": true + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.694117647059, 0.023529411765, 0.058823529412, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Big N 3", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 1948, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 8, + "ty": 4, + "nm": "Wordmark Matte", + "td": 1, + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [565.279, 256.14, 0], "ix": 2 }, + "a": { "a": 0, "k": [232, 1, 0], "ix": 1 }, + "s": { "a": 0, "k": [232.448, 114, 100], "ix": 6 } + }, + "ao": 0, + "ef": [ + { + "ty": 29, + "nm": "Gaussian Blur", + "np": 5, + "mn": "ADBE Gaussian Blur 2", + "ix": 1, + "en": 1, + "ef": [ + { + "ty": 0, + "nm": "Blurriness", + "mn": "ADBE Gaussian Blur 2-0001", + "ix": 1, + "v": { "a": 0, "k": 70, "ix": 1 } + }, + { + "ty": 7, + "nm": "Blur Dimensions", + "mn": "ADBE Gaussian Blur 2-0002", + "ix": 2, + "v": { "a": 0, "k": 1, "ix": 2 } + }, + { + "ty": 7, + "nm": "Repeat Edge Pixels", + "mn": "ADBE Gaussian Blur 2-0003", + "ix": 3, + "v": { "a": 0, "k": 0, "ix": 3 } + } + ] + } + ], + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ty": "rc", + "d": 1, + "s": { "a": 0, "k": [72, 538], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 4 }, + "nm": "Rectangle Path 1", + "mn": "ADBE Vector Shape - Rect", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.694117647059, 0.023529411765, 0.058823529412, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [232, 1], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Rectangle 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 1948, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 9, + "ty": 4, + "nm": "Netflix Wordmark", + "tt": 2, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.87], "y": [1] }, + "o": { "x": [0.612], "y": [0] }, + "t": 52, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 75, + "s": [100] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 121.776, + "s": [100] + }, + { "t": 137, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { + "s": true, + "x": { + "a": 1, + "k": [ + { + "i": { "x": [0.455], "y": [1] }, + "o": { "x": [0.684], "y": [0] }, + "t": 52, + "s": [402.75] + }, + { "t": 77.373046875, "s": [256] } + ], + "ix": 3 + }, + "y": { "a": 0, "k": 256, "ix": 4 } + }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [5.401, -0.719], + [0, 0], + [0, 0], + [4.861, -0.72], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [-5.131, 0.901], + [0, 0], + [0, 0], + [-5.131, 0.54], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [-123.641, 40.148], + [-139.394, 42.039], + [-155.868, -6.211], + [-155.868, 44.11], + [-170.541, 46.09], + [-170.541, -46.09], + [-156.858, -46.09], + [-138.134, 6.212], + [-138.134, -46.09], + [-123.641, -46.09] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [-5.131, 0], + [0, 0], + [5.401, -0.27], + [0, 0], + [-8.551, 0.27], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [5.582, 0], + [0, 0], + [-6.392, 0], + [0, 0], + [8.462, -0.54], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [-95.285, -12.333], + [-76.021, -12.603], + [-76.021, 1.8], + [-95.285, 2.07], + [-95.285, 23.495], + [-69.81, 21.964], + [-69.81, 35.826], + [-109.689, 38.978], + [-109.689, -46.09], + [-69.81, -46.09], + [-69.81, -31.687], + [-95.285, -31.687] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ind": 2, + "ty": "sh", + "ix": 3, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [4.68, -0.18], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [-4.861, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [-16.249, -31.686], + [-31.192, -31.686], + [-31.192, 34.568], + [-45.594, 34.747], + [-45.594, -31.686], + [-60.537, -31.686], + [-60.537, -46.09], + [-16.248, -46.09] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 3", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ind": 3, + "ty": "sh", + "ix": 4, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [7.156, -13.323], + [26.871, -13.323], + [26.871, 1.08], + [7.156, 1.08], + [7.156, 33.757], + [-6.978, 33.757], + [-6.978, -46.09], + [33.262, -46.09], + [33.262, -31.687], + [7.156, -31.687] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 4", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ind": 4, + "ty": "sh", + "ix": 5, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [-8.012, -0.449], + [0, 0], + [13.143, 0.271], + [0, 0], + [0, 0] + ], + "o": [ + [8.192, 0.18], + [0, 0], + [-12.873, -0.811], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [56.667, 21.154], + [81.152, 22.415], + [81.152, 36.638], + [42.264, 34.747], + [42.264, -46.09], + [56.667, -46.09] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 5", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ind": 5, + "ty": "sh", + "ix": 6, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [-4.681, -0.539], + [0, 0], + [0, 0] + ], + "o": [ + [4.591, 0.27], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [93.304, 37.628], + [107.437, 38.708], + [107.437, -46.09], + [93.304, -46.09] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 6", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ind": 6, + "ty": "sh", + "ix": 7, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [5.401, 0.9], + [0, 0], + [0, 0], + [5.22, 0.72], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [-5.403, -0.72], + [0, 0], + [0, 0], + [-5.222, -0.901], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [170.541, -46.09], + [152.267, -2.25], + [170.541, 46.09], + [154.337, 43.479], + [143.985, 16.834], + [133.454, 41.319], + [117.971, 39.428], + [136.515, -2.791], + [119.771, -46.09], + [135.253, -46.09], + [144.705, -21.875], + [154.788, -46.09] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 7", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.898039215686, 0.035294117647, 0.078431372549, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Netflix Wordmark", + "np": 8, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 51, + "op": 1948, + "st": 0, + "bm": 0 + } + ], + "markers": [] +} diff --git a/public/next.svg b/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index 7705396..0000000 --- a/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/window.svg b/public/window.svg deleted file mode 100644 index b2b2a44..0000000 --- a/public/window.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 3a13f90..cc9ed39 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,13 +22,6 @@ "@/*": ["./*"] } }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts", - ".next/dev/types/**/*.ts", - "**/*.mts" - ], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", ".next/dev/types/**/*.ts", "**/*.mts"], "exclude": ["node_modules"] } From 6caecf013c43bc041eb57ef50bbb82f4344b6d1f Mon Sep 17 00:00:00 2001 From: jungyungee Date: Thu, 30 Oct 2025 12:30:47 +0900 Subject: [PATCH 05/57] =?UTF-8?q?#1=20[CHORE]=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=84=A4=EC=A0=95=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/globals.css | 1 - app/theme.css | 2 -- 2 files changed, 3 deletions(-) diff --git a/app/globals.css b/app/globals.css index b2acaf9..8a9248d 100644 --- a/app/globals.css +++ b/app/globals.css @@ -20,7 +20,6 @@ color: var(--color-white); font-family: var(--font-sf-pro); -webkit-font-smoothing: antialiased; - text-align: center; font-feature-settings: 'liga' off, 'clig' off; diff --git a/app/theme.css b/app/theme.css index c493b82..aafa4d2 100644 --- a/app/theme.css +++ b/app/theme.css @@ -2,8 +2,6 @@ /* Colors */ --color-white: #ffffff; --color-black: #000000; - --color-gray-dark: #8c8787; - --color-gray-light: #c4c4c4; /* Font */ --font-sf-pro: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif; From 451d633e2fa855f93281674db289bf268727e511 Mon Sep 17 00:00:00 2001 From: jungyungee Date: Thu, 30 Oct 2025 21:10:40 +0900 Subject: [PATCH 06/57] =?UTF-8?q?#1=20[FIX]=20=EB=A7=88=ED=81=AC=EB=8B=A4?= =?UTF-8?q?=EC=9A=B4=20=ED=8C=8C=EC=9D=BC=20=EC=A4=91=EB=B3=B5=20=EC=B6=A9?= =?UTF-8?q?=EB=8F=8C=20=ED=95=B4=EA=B2=B0=20=EB=B0=8F=20=EB=B3=B5=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 69 +++++++++++++++++++------------------------------------ 1 file changed, 23 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 115611f..e215bc4 100644 --- a/README.md +++ b/README.md @@ -1,59 +1,36 @@ -# 5์ฃผ์ฐจ ๊ณผ์ œ: Next Netflix ๐ŸŽฌ๐Ÿฟ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). -## ์„œ๋ก  +## Getting Started -์•ˆ๋…•ํ•˜์„ธ์š”, ํ”„๋ก ํŠธ ์šด์˜์ง„ **๊ถŒ๋™์šฑ**์ž…๋‹ˆ๋‹ค! ๐Ÿฉท๐Ÿฅฐ +First, run the development server: -์ด๋ฒˆ ์ฃผ๋ถ€ํ„ฐ๋Š” ์ƒˆ ํ”„๋กœ์ ํŠธ์ธ **Netflix ํด๋ก ์ฝ”๋”ฉ**์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค! +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` -์ด๋ฒˆ ๊ณผ์ œ์—์„œ๋Š” **Next.js**๋ฅผ ํ™œ์šฉํ•ด **SSR(Server Side Rendering)** ์„ ์ง์ ‘ ๊ฒฝํ—˜ํ•ด๋ณด๊ณ , ์ฃผ์–ด์ง„ **Figma ๋””์ž์ธ**์„ ํ™œ์šฉํ•ด ์Šคํƒ€์ผ๋ง ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. -๋˜ํ•œ ์ด๋ฒˆ ์ฃผ๋ถ€ํ„ฐ๋Š” ํ”„๋ก ํŠธ ํŽ˜์–ด์™€ ํ•จ๊ป˜ํ•˜๋Š” ์ฒซ ๊ณผ์ œ์ธ ๋งŒํผ, ํŒ€๋ณ„๋กœ ๋ฏธ๋ฆฌ **ํ˜ธํก**์„ ๋งž์ถฐ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ธฐํšŒ๊ฐ€ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. -๊ทธ๋Ÿผ ์ด๋ฒˆ ๊ณผ์ œ๋„ ๋ชจ๋‘ ํŒŒ์ดํŒ…์ž…๋‹ˆ๋‹ค!!!! ๐Ÿ”ฅ๐Ÿ”ฅ +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. -## ๊ณผ์ œ +## Learn More -### **โญ ๊ณผ์ œ ๋ชฉํ‘œ** +To learn more about Next.js, take a look at the following resources: -- Next.js ์‚ฌ์šฉ๋ฒ•์„ ๊ณต๋ถ€ํ•ด๋ด…๋‹ˆ๋‹ค. -- Figma๋กœ ์ฃผ์–ด์ง€๋Š” ๋””์ž์ธ์œผ๋กœ ์Šคํƒ€์ผ๋ง ํ•˜๋Š” ๋ฐฉ์‹์— ์ต์ˆ™ํ•ด์ง‘๋‹ˆ๋‹ค. -- Git์„ ์ด์šฉํ•œ ํ˜‘์—… ๋ฐฉ์‹์— ์ต์ˆ™ํ•ด์ง‘๋‹ˆ๋‹ค. -- ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ํ๋ฆ„์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. -### ๐Ÿ“… ๊ธฐํ•œ +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! -> 2025๋…„ 11์›” 1์ผ ํ† ์š”์ผ (๊ธฐํ•œ ์—„์ˆ˜) +## Deploy on Vercel -### **โœ… ํ•„์ˆ˜ ์š”๊ฑด** +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. -- [๊ฒฐ๊ณผํ™”๋ฉด](https://next-netflix-18th-2.vercel.app)์˜ ๋žœ๋”ฉ ํŽ˜์ด์ง€์™€ ๋ฉ”์ธ ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. -- [Figma](https://www.figma.com/file/UqdXDovIczt1Gl0IjknHQf/Netflix?node-id=0%3A1)์˜ ๋””์ž์ธ์„ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. -- Open api๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ ํŒจ์นญ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (ex. [themoviedb API](https://developers.themoviedb.org/3/getting-started/introduction)) -- `yarn`, `yarn berry`, `npm`, `pnpm`๋“ฑ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ์ง์ ‘ ์„ ํƒํ•ด Next.js๋ฅผ ์„ธํŒ…ํ•ด ๋ด…๋‹ˆ๋‹ค. - -### ๐Ÿ‘๐Ÿป ์„ ํƒ ์š”๊ฑด - -- SSR(Server Side Rendering)์„ ์ ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. -- ์›น ํฐํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. -- ๋ฐ˜์‘ํ˜•์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. - -### ๐Ÿ”‘ Research Question - -- ์ „๋ฐ˜์ ์ธ ํ˜‘์—… ๊ณผ์ •์— ๋Œ€ํ•ด ์•Œ๋ ค์ฃผ์„ธ์š”. ๐Ÿ‘๐Ÿป (21๊ธฐ PR ์ฐธ๊ณ ํ•˜์…”๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”) - ---- - -### **๐Ÿ”— ๋งํฌ ๋ฐ ์ฐธ๊ณ ์ž๋ฃŒ** - -- [useCallback๊ณผ React.Memo๋ฅผ ์ด์šฉํ•œ ๋ Œ๋”๋ง ์ตœ์ ํ™”](https://velog.io/@yejinh/useCallback%EA%B3%BC-React.Memo%EC%9D%84-%ED%86%B5%ED%95%9C-%EB%A0%8C%EB%8D%94%EB%A7%81-%EC%B5%9C%EC%A0%81%ED%99%94) -- [์„ฑ๋Šฅ ์ตœ์ ํ™”](https://ui.toast.com/fe-guide/ko_PERFORMANCE) -- [React 18์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ](https://www.youtube.com/watch?v=7mkQi0TlJQo) -- [react ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ๋“ค in kakao ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ](https://tech.kakaopay.com/post/react-server-components/) -- [vercel์˜ ๋ฐฐํฌ ๋ฐฉ์‹](https://www.youtube.com/watch?v=8q-jCvLWwKc&t=11s) -- [๋žœ๋”ฉํŽ˜์ด์ง€ ์˜์ƒ](https://lottiefiles.com/kr/) -- [Next.js Docs](https://beta.nextjs.org/docs) -- [Next.js 13์—์„œ ๋ณ€ํ•œ ๊ฒƒ๋“ค](https://velog.io/@hang_kem_0531/Next.js-13%EC%9D%B4-%EB%82%98%EC%99%80%EB%B2%84%EB%A0%B8%EB%8B%A4) -- [Next.js 14์—์„œ ๋ณ€ํ•œ ๊ฒƒ๋“ค](https://velog.io/@lee_1124/Next.js-14-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8) -- [Git ํ˜‘์—… ๊ฐ€์ด๋“œ](https://velog.io/@jinuku/Git-%ED%98%91%EC%97%85-%EA%B0%80%EC%9D%B4%EB%93%9C) -- [๋””์ž์ด๋„ˆ์™€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…ํ•˜๊ธฐ ์œ„ํ•œ ํ”ผ๊ทธ๋งˆ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ](https://chingguhl.tistory.com/entry/%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EA%BC%AD-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-%ED%94%BC%EA%B7%B8%EB%A7%88-10%EA%B0%80%EC%A7%80-%EA%B8%B0%EB%8A%A5-%EB%94%94%EC%9E%90%EC%9D%B4%EB%84%88%EC%99%80-%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%ED%98%91%EC%97%85%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%9C-%ED%94%BC%EA%B7%B8%EB%A7%88-%EA%B8%B0%EB%B3%B8-%EA%B8%B0%EB%8A%A5) +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. From deb43fdf9d4c9ea1d83e9d692aa147b751c9bbf0 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Fri, 31 Oct 2025 17:04:56 +0900 Subject: [PATCH 07/57] =?UTF-8?q?#3=20[CHORE]=20=ED=8F=B0=ED=8A=B8,=20?= =?UTF-8?q?=EC=83=89=EC=83=81=20=EB=94=94=EC=9E=90=EC=9D=B8=20=EC=8B=9C?= =?UTF-8?q?=EC=8A=A4=ED=85=9C=20=EC=84=B8=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/comingsoon/page.tsx | 2 +- app/globals.css | 134 ++++++++++++++++++++++++++++++++++++++++ app/home/page.tsx | 2 +- app/more/page.tsx | 2 +- app/search/page.tsx | 2 +- app/theme.css | 9 +++ package-lock.json | 14 ----- 7 files changed, 147 insertions(+), 18 deletions(-) diff --git a/app/comingsoon/page.tsx b/app/comingsoon/page.tsx index 6acb6cb..a6d463c 100644 --- a/app/comingsoon/page.tsx +++ b/app/comingsoon/page.tsx @@ -1,7 +1,7 @@ const ComingSoonPage = () => { return (
-

Coming Soon

+
Coming Soon
); }; diff --git a/app/globals.css b/app/globals.css index 8a9248d..a9d9c5f 100644 --- a/app/globals.css +++ b/app/globals.css @@ -25,3 +25,137 @@ 'clig' off; } } + +@layer utilities { + /* Headline */ + .text-headline1 { + font-family: var(--font-sf-pro); + font-size: 30px; + line-height: 150%; + font-weight: 600; + letter-spacing: -0.057px; + } + + .text-headline2 { + font-family: var(--font-sf-pro); + font-size: 26.748px; + line-height: 100%; + font-weight: 700; + letter-spacing: -0.057px; + } + + .text-headline3 { + font-family: var(--font-sf-pro); + font-size: 20.921px; + line-height: 100%; + font-weight: 700; + letter-spacing: -0.057px; + } + + /* Subhead */ + .text-subhead1 { + font-family: var(--font-sf-pro); + font-size: 20.462px; + line-height: 150%; + font-weight: 600; + letter-spacing: -0.061px; + } + + .text-subhead2 { + font-family: var(--font-sf-pro); + font-size: 17.197px; + line-height: 150%; + font-weight: 400; + letter-spacing: 0.762px; + } + + .text-subhead3 { + font-family: var(--font-sf-pro); + font-size: 13.723px; + line-height: 150%; + font-weight: 700; + letter-spacing: -0.041px; + } + + /* Body */ + .text-body1 { + font-family: var(--font-sf-pro); + font-size: 15.213px; + line-height: 150%; + font-weight: 400; + letter-spacing: 0.207px; + } + + .text-body2 { + font-family: var(--font-sf-pro); + font-size: 14.722px; + line-height: 150%; + font-weight: 400; + letter-spacing: 0.921px; + } + + .text-body3 { + font-family: var(--font-sf-pro); + font-size: 13.642px; + line-height: 150%; + font-weight: 400; + letter-spacing: -0.041px; + } + + .text-body4 { + font-family: var(--font-sf-pro); + font-size: 12px; + line-height: 160%; + font-weight: 400; + letter-spacing: 0; + } + + /* Caption */ + .text-caption1 { + font-family: var(--font-sf-pro); + font-size: 14px; + line-height: 150%; + font-weight: 500; + } + + .text-caption2 { + font-family: var(--font-sf-pro); + font-size: 14px; + line-height: 150%; + font-weight: 200; + } + + .text-caption3 { + font-family: var(--font-sf-pro); + font-size: 11.141px; + line-height: 150%; + font-weight: 400; + letter-spacing: -0.031px; + } + + .text-caption4 { + font-family: var(--font-sf-pro); + font-size: 9px; + line-height: 100%; + font-weight: 500; + letter-spacing: 0.26px; + } + + .text-caption5 { + font-family: var(--font-sf-pro); + font-size: 8.2px; + line-height: 150%; + font-weight: 500; + letter-spacing: 0.26px; + } + + /* scrollbar hide */ + .scrollbar-hide::-webkit-scrollbar { + display: none; + } + + .scrollbar-hide { + -ms-overflow-style: none; + scrollbar-width: none; + } +} diff --git a/app/home/page.tsx b/app/home/page.tsx index c0ac020..a07830e 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -1,7 +1,7 @@ const HomePage = () => { return (
-

Home

+
Home
); }; diff --git a/app/more/page.tsx b/app/more/page.tsx index 2751a91..9256558 100644 --- a/app/more/page.tsx +++ b/app/more/page.tsx @@ -1,7 +1,7 @@ const MorePage = () => { return (
-

More

+
More
); }; diff --git a/app/search/page.tsx b/app/search/page.tsx index 988e4cf..56292e8 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -1,7 +1,7 @@ const SearchPage = () => { return (
-

Search

+
Search
); }; diff --git a/app/theme.css b/app/theme.css index aafa4d2..cdbdb36 100644 --- a/app/theme.css +++ b/app/theme.css @@ -3,6 +3,15 @@ --color-white: #ffffff; --color-black: #000000; + --color-gray-100: #c4c4c4; + --color-gray-200: #8c8787; + --color-gray-300: #424242; + --color-gray-400: #303030; + --color-gray-500: #121212; + + --color-overlay-100: rgba(0, 0, 0, 0.2); + --color-overlay-200: rgba(0, 0, 0, 0.57); + /* Font */ --font-sf-pro: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif; } diff --git a/package-lock.json b/package-lock.json index 6b98a45..ba4798a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -74,7 +74,6 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -1570,7 +1569,6 @@ "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -1631,7 +1629,6 @@ "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.2", "@typescript-eslint/types": "8.46.2", @@ -2162,7 +2159,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2504,7 +2500,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.19", "caniuse-lite": "^1.0.30001751", @@ -3072,7 +3067,6 @@ "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -3173,7 +3167,6 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", - "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -3275,7 +3268,6 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -5479,7 +5471,6 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -5551,7 +5542,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -5561,7 +5551,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -6264,7 +6253,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -6427,7 +6415,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6703,7 +6690,6 @@ "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } From 7481927a228a126c611dcc477dee0162a54fc8dd Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Fri, 31 Oct 2025 17:43:26 +0900 Subject: [PATCH 08/57] =?UTF-8?q?#5=20[CHORE]=20SVG=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=EC=BD=98=EB=93=A4=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/svgs/navigation/comingSoon.svg | 3 +++ app/assets/svgs/navigation/download.svg | 3 +++ app/assets/svgs/navigation/home.svg | 7 +++++++ app/assets/svgs/navigation/more.svg | 3 +++ app/assets/svgs/navigation/netflix-logo.svg | 20 ++++++++++++++++++++ app/assets/svgs/navigation/searchsvg.svg | 4 ++++ 6 files changed, 40 insertions(+) create mode 100644 app/assets/svgs/navigation/comingSoon.svg create mode 100644 app/assets/svgs/navigation/download.svg create mode 100644 app/assets/svgs/navigation/home.svg create mode 100644 app/assets/svgs/navigation/more.svg create mode 100644 app/assets/svgs/navigation/netflix-logo.svg create mode 100644 app/assets/svgs/navigation/searchsvg.svg diff --git a/app/assets/svgs/navigation/comingSoon.svg b/app/assets/svgs/navigation/comingSoon.svg new file mode 100644 index 0000000..6b2d5de --- /dev/null +++ b/app/assets/svgs/navigation/comingSoon.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/svgs/navigation/download.svg b/app/assets/svgs/navigation/download.svg new file mode 100644 index 0000000..f8b66df --- /dev/null +++ b/app/assets/svgs/navigation/download.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/svgs/navigation/home.svg b/app/assets/svgs/navigation/home.svg new file mode 100644 index 0000000..2c10e5c --- /dev/null +++ b/app/assets/svgs/navigation/home.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/app/assets/svgs/navigation/more.svg b/app/assets/svgs/navigation/more.svg new file mode 100644 index 0000000..3b6c201 --- /dev/null +++ b/app/assets/svgs/navigation/more.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/svgs/navigation/netflix-logo.svg b/app/assets/svgs/navigation/netflix-logo.svg new file mode 100644 index 0000000..c1f4592 --- /dev/null +++ b/app/assets/svgs/navigation/netflix-logo.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/assets/svgs/navigation/searchsvg.svg b/app/assets/svgs/navigation/searchsvg.svg new file mode 100644 index 0000000..f7d754f --- /dev/null +++ b/app/assets/svgs/navigation/searchsvg.svg @@ -0,0 +1,4 @@ + + + + From 44843b0591a66d7b78684124391ed966072ad69b Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Fri, 31 Oct 2025 18:12:24 +0900 Subject: [PATCH 09/57] =?UTF-8?q?#5=20[FEAT]=20=ED=95=98=EB=8B=A8=20?= =?UTF-8?q?=EB=84=A4=EB=B8=8C=EB=B0=94=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + app/assets/svgs/navigation/ComingSoonIcon.tsx | 16 +++++ app/assets/svgs/navigation/DownloadIcon.tsx | 18 ++++++ app/assets/svgs/navigation/HomeIcon.tsx | 17 ++++++ app/assets/svgs/navigation/MoreIcon.tsx | 13 +++++ app/assets/svgs/navigation/SearchIcon.tsx | 20 +++++++ app/assets/svgs/navigation/comingSoon.svg | 3 - app/assets/svgs/navigation/download.svg | 3 - app/assets/svgs/navigation/home.svg | 7 --- app/assets/svgs/navigation/index.ts | 5 ++ app/assets/svgs/navigation/more.svg | 3 - app/assets/svgs/navigation/netflix-logo.svg | 20 ------- app/assets/svgs/navigation/searchsvg.svg | 4 -- app/components/navigation/BottomNav.tsx | 58 +++++++++++++++++++ app/components/navigation/Header.tsx | 0 app/downloads/page.tsx | 2 +- app/layout.tsx | 7 ++- 17 files changed, 156 insertions(+), 42 deletions(-) create mode 100644 app/assets/svgs/navigation/ComingSoonIcon.tsx create mode 100644 app/assets/svgs/navigation/DownloadIcon.tsx create mode 100644 app/assets/svgs/navigation/HomeIcon.tsx create mode 100644 app/assets/svgs/navigation/MoreIcon.tsx create mode 100644 app/assets/svgs/navigation/SearchIcon.tsx delete mode 100644 app/assets/svgs/navigation/comingSoon.svg delete mode 100644 app/assets/svgs/navigation/download.svg delete mode 100644 app/assets/svgs/navigation/home.svg create mode 100644 app/assets/svgs/navigation/index.ts delete mode 100644 app/assets/svgs/navigation/more.svg delete mode 100644 app/assets/svgs/navigation/netflix-logo.svg delete mode 100644 app/assets/svgs/navigation/searchsvg.svg create mode 100644 app/components/navigation/BottomNav.tsx create mode 100644 app/components/navigation/Header.tsx diff --git a/.gitignore b/.gitignore index 5ef6a52..4c6f238 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,5 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +.cursorrules diff --git a/app/assets/svgs/navigation/ComingSoonIcon.tsx b/app/assets/svgs/navigation/ComingSoonIcon.tsx new file mode 100644 index 0000000..c01b897 --- /dev/null +++ b/app/assets/svgs/navigation/ComingSoonIcon.tsx @@ -0,0 +1,16 @@ +import React from 'react'; + +interface ComingSoonIconProps { + color: string; +} + +const ComingSoonIcon: React.FC = ({ color }) => ( + + + +); + +export default ComingSoonIcon; diff --git a/app/assets/svgs/navigation/DownloadIcon.tsx b/app/assets/svgs/navigation/DownloadIcon.tsx new file mode 100644 index 0000000..14a8c68 --- /dev/null +++ b/app/assets/svgs/navigation/DownloadIcon.tsx @@ -0,0 +1,18 @@ +import React from 'react'; + +interface DownloadIconProps { + color: string; +} + +const DownloadIcon: React.FC = ({ color }) => ( + + + +); + +export default DownloadIcon; diff --git a/app/assets/svgs/navigation/HomeIcon.tsx b/app/assets/svgs/navigation/HomeIcon.tsx new file mode 100644 index 0000000..a827b64 --- /dev/null +++ b/app/assets/svgs/navigation/HomeIcon.tsx @@ -0,0 +1,17 @@ +import React from 'react'; + +interface HomeIconProps { + color: string; +} + +const HomeIcon: React.FC = ({ color }) => ( + + + + + + + +); + +export default HomeIcon; diff --git a/app/assets/svgs/navigation/MoreIcon.tsx b/app/assets/svgs/navigation/MoreIcon.tsx new file mode 100644 index 0000000..7217a7e --- /dev/null +++ b/app/assets/svgs/navigation/MoreIcon.tsx @@ -0,0 +1,13 @@ +import React from 'react'; + +interface MoreIconProps { + color: string; +} + +const MoreIcon: React.FC = ({ color }) => ( + + + +); + +export default MoreIcon; diff --git a/app/assets/svgs/navigation/SearchIcon.tsx b/app/assets/svgs/navigation/SearchIcon.tsx new file mode 100644 index 0000000..c9abfc6 --- /dev/null +++ b/app/assets/svgs/navigation/SearchIcon.tsx @@ -0,0 +1,20 @@ +import React from 'react'; + +interface SearchIconProps { + color: string; +} + +const SearchIcon: React.FC = ({ color }) => ( + + + + +); + +export default SearchIcon; diff --git a/app/assets/svgs/navigation/comingSoon.svg b/app/assets/svgs/navigation/comingSoon.svg deleted file mode 100644 index 6b2d5de..0000000 --- a/app/assets/svgs/navigation/comingSoon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/app/assets/svgs/navigation/download.svg b/app/assets/svgs/navigation/download.svg deleted file mode 100644 index f8b66df..0000000 --- a/app/assets/svgs/navigation/download.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/app/assets/svgs/navigation/home.svg b/app/assets/svgs/navigation/home.svg deleted file mode 100644 index 2c10e5c..0000000 --- a/app/assets/svgs/navigation/home.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/app/assets/svgs/navigation/index.ts b/app/assets/svgs/navigation/index.ts new file mode 100644 index 0000000..5332f48 --- /dev/null +++ b/app/assets/svgs/navigation/index.ts @@ -0,0 +1,5 @@ +export { default as ComingSoonIcon } from './ComingSoonIcon'; +export { default as DownloadIcon } from './DownloadIcon'; +export { default as HomeIcon } from './HomeIcon'; +export { default as MoreIcon } from './MoreIcon'; +export { default as SearchIcon } from './SearchIcon'; diff --git a/app/assets/svgs/navigation/more.svg b/app/assets/svgs/navigation/more.svg deleted file mode 100644 index 3b6c201..0000000 --- a/app/assets/svgs/navigation/more.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/app/assets/svgs/navigation/netflix-logo.svg b/app/assets/svgs/navigation/netflix-logo.svg deleted file mode 100644 index c1f4592..0000000 --- a/app/assets/svgs/navigation/netflix-logo.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/app/assets/svgs/navigation/searchsvg.svg b/app/assets/svgs/navigation/searchsvg.svg deleted file mode 100644 index f7d754f..0000000 --- a/app/assets/svgs/navigation/searchsvg.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/app/components/navigation/BottomNav.tsx b/app/components/navigation/BottomNav.tsx new file mode 100644 index 0000000..f657689 --- /dev/null +++ b/app/components/navigation/BottomNav.tsx @@ -0,0 +1,58 @@ +'use client'; + +import Link from 'next/link'; +import { usePathname } from 'next/navigation'; + +import { ComingSoonIcon, DownloadIcon, HomeIcon, MoreIcon, SearchIcon } from '@/app/assets/svgs/navigation'; + +const BottomNav = () => { + const pathname = usePathname(); + + // ๋žœ๋”ฉํŽ˜์ด์ง€์—์„œ๋Š” BottomNav๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์Œ + if (pathname === '/') { + return null; + } + + const menuItems = [ + { href: '/home', label: 'Home', Icon: HomeIcon }, + { href: '/search', label: 'Search', Icon: SearchIcon }, + { href: '/downloads', label: 'Downloads', Icon: DownloadIcon }, + { href: '/comingsoon', label: 'Coming Soon', Icon: ComingSoonIcon }, + { href: '/more', label: 'More', Icon: MoreIcon }, + ]; + + const isActive = (href: string) => { + if (href === '/home' && (pathname === '/' || pathname === '/home')) return true; + if (href !== '/home' && pathname.startsWith(href)) return true; + return false; + }; + + return ( + + ); +}; + +export default BottomNav; diff --git a/app/components/navigation/Header.tsx b/app/components/navigation/Header.tsx new file mode 100644 index 0000000..e69de29 diff --git a/app/downloads/page.tsx b/app/downloads/page.tsx index 856191e..a088fc6 100644 --- a/app/downloads/page.tsx +++ b/app/downloads/page.tsx @@ -1,7 +1,7 @@ const DownloadsPage = () => { return (
-

Downloads

+
Downloads
); }; diff --git a/app/layout.tsx b/app/layout.tsx index 1a95c1a..5d135eb 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -2,6 +2,8 @@ import './globals.css'; import type { Metadata } from 'next'; +import BottomNav from './components/navigation/BottomNav'; + export const metadata: Metadata = { title: 'Netflix', description: 'CEOS 22๊ธฐ ๋ชจ๋ธ๋ฆฌ ํŒ€ Netflix ํด๋ก ์ฝ”๋”ฉ ํ”„๋กœ์ ํŠธ', @@ -14,7 +16,10 @@ const RootLayout = ({ children }: { children: React.ReactNode }) => { return ( -
{children}
+
+ {children} + +
); From b722fbed0a94da4fcecbde4f12b8741c2ddba6eb Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Fri, 31 Oct 2025 18:33:29 +0900 Subject: [PATCH 10/57] =?UTF-8?q?#5=20[FEAT]=20=ED=97=A4=EB=8D=94=EB=B0=94?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/svgs/navigation/NetflixIcon.tsx | 41 ++++++++++++++++++++++ app/assets/svgs/navigation/index.ts | 1 + app/assets/svgs/navigation/netflixIcon.svg | 20 +++++++++++ app/components/navigation/Header.tsx | 25 +++++++++++++ app/home/page.tsx | 3 ++ 5 files changed, 90 insertions(+) create mode 100644 app/assets/svgs/navigation/NetflixIcon.tsx create mode 100644 app/assets/svgs/navigation/netflixIcon.svg diff --git a/app/assets/svgs/navigation/NetflixIcon.tsx b/app/assets/svgs/navigation/NetflixIcon.tsx new file mode 100644 index 0000000..b3354a8 --- /dev/null +++ b/app/assets/svgs/navigation/NetflixIcon.tsx @@ -0,0 +1,41 @@ +import React from 'react'; + +const NetflixIcon: React.FC = () => ( + + + + + + + + + + + + +); + +export default NetflixIcon; diff --git a/app/assets/svgs/navigation/index.ts b/app/assets/svgs/navigation/index.ts index 5332f48..39a8e0a 100644 --- a/app/assets/svgs/navigation/index.ts +++ b/app/assets/svgs/navigation/index.ts @@ -2,4 +2,5 @@ export { default as ComingSoonIcon } from './ComingSoonIcon'; export { default as DownloadIcon } from './DownloadIcon'; export { default as HomeIcon } from './HomeIcon'; export { default as MoreIcon } from './MoreIcon'; +export { default as NetflixIcon } from './NetflixIcon'; export { default as SearchIcon } from './SearchIcon'; diff --git a/app/assets/svgs/navigation/netflixIcon.svg b/app/assets/svgs/navigation/netflixIcon.svg new file mode 100644 index 0000000..c1f4592 --- /dev/null +++ b/app/assets/svgs/navigation/netflixIcon.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/components/navigation/Header.tsx b/app/components/navigation/Header.tsx index e69de29..9fc27dd 100644 --- a/app/components/navigation/Header.tsx +++ b/app/components/navigation/Header.tsx @@ -0,0 +1,25 @@ +import { NetflixIcon } from '@/app/assets/svgs/navigation'; + +const Header = () => { + return ( +
+
+ {/* ์™ผ์ชฝ: Netflix ์•„์ด์ฝ˜ */} +
+ +
+ + {/* ์˜ค๋ฅธ์ชฝ: ๋ฉ”๋‰ด ํ…์ŠคํŠธ๋“ค */} +
+ + TV Shows + + Movies + My List +
+
+
+ ); +}; + +export default Header; diff --git a/app/home/page.tsx b/app/home/page.tsx index a07830e..98459ee 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -1,6 +1,9 @@ +import Header from '@/app/components/navigation/Header'; + const HomePage = () => { return (
+
Home
); From 82e2e8493001cd6f7d79014bb8c6aba1e1c609cd Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 1 Nov 2025 01:45:23 +0900 Subject: [PATCH 11/57] =?UTF-8?q?#7=20[FEAT]=20api=20axios=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/apis/axiosInstance.ts | 11 +++ app/apis/tmdb.ts | 114 ++++++++++++++++++++++++ app/components/home/Prieview.tsx | 0 package-lock.json | 116 ++++++++++++++++++++++--- package.json | 1 + public/assets/fonts/SFProDisplay.woff2 | Bin 0 -> 102660 bytes 6 files changed, 228 insertions(+), 14 deletions(-) create mode 100644 app/apis/axiosInstance.ts create mode 100644 app/apis/tmdb.ts create mode 100644 app/components/home/Prieview.tsx create mode 100644 public/assets/fonts/SFProDisplay.woff2 diff --git a/app/apis/axiosInstance.ts b/app/apis/axiosInstance.ts new file mode 100644 index 0000000..ffa6315 --- /dev/null +++ b/app/apis/axiosInstance.ts @@ -0,0 +1,11 @@ +import axios from 'axios'; + +export const axiosInstance = axios.create({ + baseURL: process.env.NEXT_PUBLIC_URL, + headers: { + 'Content-Type': 'application/json', + }, + params: { + api_key: process.env.NEXT_PUBLIC_TMDB_API_KEY, + }, +}); diff --git a/app/apis/tmdb.ts b/app/apis/tmdb.ts new file mode 100644 index 0000000..56d12a4 --- /dev/null +++ b/app/apis/tmdb.ts @@ -0,0 +1,114 @@ +import { axiosInstance } from '@/app/apis/axiosInstance'; + +// HeroSlider +export const getTrendingAllDay = async () => { + try { + const res = await axiosInstance.get('/trending/all/day', { + params: { language: 'ko-KR' }, + }); + return res.data; + } catch (err) { + console.error('getTrendingAllDay data error', err); + return { results: [] }; + } +}; + +// ์žฅ๋ฅด๋ณ„ ์˜ํ™” +export const getMoviesByGenre = async (genreIds: string) => { + try { + const res = await axiosInstance.get('/discover/movie', { + params: { + with_genres: genreIds, + sort_by: 'popularity.desc', + language: 'ko-KR', + }, + }); + return res.data; + } catch (err) { + console.error('getMoviesByGenre data error', err); + return { results: [] }; + } +}; + +// ๋„ทํ”Œ๋ฆญ์Šค ์˜ค๋ฆฌ์ง€๋„ +export const getTVByNetwork = async (networkId: number) => { + try { + const res = await axiosInstance.get('/discover/tv', { + params: { + with_networks: networkId, + language: 'ko-KR', + }, + }); + return res.data; + } catch (err) { + console.error('getTVByNetwork data error', err); + return { results: [] }; + } +}; + +export const getMoviesByCompany = async (companyId: number) => { + try { + const res = await axiosInstance.get('/discover/movie', { + params: { + with_companies: companyId, + language: 'ko-KR', + }, + }); + return res.data; + } catch (err) { + console.error('getMoviesByCompany data error', err); + return { results: [] }; + } +}; + +// Preview +export const getMoviePopular = async (page: number = 1) => { + try { + const res = await axiosInstance.get('movie/popular', { + params: { language: 'ko-KR', page }, + }); + return res.data; + } catch (err) { + console.error('getMoviePopular data error', err); + return { results: [] }; + } +}; + +// Korea Movie +export const getKoreaMovie = async () => { + try { + const res = await axiosInstance.get('/discover/movie', { + params: { with_original_language: 'ko', language: 'ko-KR' }, + }); + return res.data; + } catch (err) { + console.error('getKoreaMovie data error', err); + return { results: [] }; + } +}; + +// Search +export const searchMulti = async (query: string, page: number = 1) => { + try { + const res = await axiosInstance.get('/search/multi', { + params: { query, language: 'ko-KR', page, include_adult: 'false' }, + }); + return res.data; + } catch (err) { + console.error('searchMulti data error', err); + return { results: [] }; + } +}; + +// Overview Movie +export const getDetail = async (media_type: string, id: string) => { + try { + const res = await axiosInstance.get(`/${media_type}/${id}`, { + params: { language: 'ko-KR' }, + }); + return res.data; + } catch (err) { + console.error('getDetail data error', err); + return null; + } +}; diff --git a/app/components/home/Prieview.tsx b/app/components/home/Prieview.tsx new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json index ba4798a..8643523 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "next-netflix", "version": "0.1.0", "dependencies": { + "axios": "^1.13.1", "lottie-react": "^2.4.1", "next": "16.0.1", "react": "19.2.0", @@ -2403,6 +2404,12 @@ "node": ">= 0.4" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -2429,6 +2436,17 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.1.tgz", + "integrity": "sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -2537,7 +2555,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -2637,6 +2654,18 @@ "dev": true, "license": "MIT" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2795,6 +2824,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -2822,7 +2860,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -2934,7 +2971,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2944,7 +2980,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2982,7 +3017,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -2995,7 +3029,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -3674,6 +3707,26 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -3690,11 +3743,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3755,7 +3823,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -3780,7 +3847,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -3868,7 +3934,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -3947,7 +4012,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -3960,7 +4024,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -3976,7 +4039,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -4978,7 +5040,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5008,6 +5069,27 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -5506,6 +5588,12 @@ "react-is": "^16.13.1" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", diff --git a/package.json b/package.json index 926039f..720b657 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "lint": "eslint . --ext .js,.jsx,.ts,.tsx" }, "dependencies": { + "axios": "^1.13.1", "lottie-react": "^2.4.1", "next": "16.0.1", "react": "19.2.0", diff --git a/public/assets/fonts/SFProDisplay.woff2 b/public/assets/fonts/SFProDisplay.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2656d92b2f08065ab5ac4485c947c019cf590ffc GIT binary patch literal 102660 zcmV)KK)SzoPew8T0RR910g(g%5C8xG2VCR;0g#;l0RR9100000000000000000000 z0000Pfj~b-MpR848i5`ghwC03)lLRr0GdV-2nvzEV2-UL3(+V50X7081J7;*AO(&l z2Z87vTj6Q84E~#p{dcMJGR&>CWKJotipb8r}$VXZz*JVS; zIX{^$Xeyn_Ngx>floBgJ9cju+N*5(ZU>!)o_d%svRRDoN0N7(1wy~#H@+qfPKuZ6jvvD1?6+%%II0^VhT#a9_2#@?nw+_m@J7;(?q50d!JT0zH!Bo`Dk2P>Ld6=3q6; z<+c%A0o~y`zpzkXh?m+^n<70ti-0+-T^=b-Na^Bu8p!R$%EDS!S;etuuWYgV@{-z% zH~GbUq$zdmt6$P`7;eYEi#HQnpEKXOCvhF^pXKUZT7OmqK9r)Li)kr)t1XSfVEAd! zS|2Cu4Fjoy09UGGK6ca1i?dr~8$M3si+P(~R5&?TK?y4;O z>BKLv8CZleunr1T5ualOvwaM_louj)BK9)O7oy8Nu7k~Y`@R;x z3phX1gom-c^#8G6^0$aygbX{`pzCb7Aj5v$)+OucqtKeO6<46;m$d!Al{`>5FFTbK zMVS&HFcSdCu?O5fB0nU zCNMuw+xkEE&NRa?z>rcBB_UuG1}fTM6zaOx#@iJ(ur__M_1q}8^8JWN;UT_l{|75_ z!OF#`0t;ND7AqEv%(?TgzBfFa>)+6Vcwjt0-3|)W?+0)}D_^&)MK5Su=Gry{bL)Vy zjULfbAs_+*iV2LWv1A);^cXQ<8;r<}$dNrV6%`8*Yzz?nw;mDeRTPZoq1?;=&Sp2c z$^E}mG_q7zN|&f!B;7JN%Xo}LA{m6izF?>e-Kk3dFd3mVpyD7?YB}u<4}&KJJi)sN zfF$Pp0;T6`4UEVlxN(FNYySgsfd2o_ZS!|0h@VdABtq<@K%_z^ese^0Vx)L!2jBoZ zLHKG56%R>ZW*)ipTc(@r)SpfB-4F``yQh`8dj}qUa-yc3lK)Ttv?GHS^bLp+!dai3 znM}Y&Sb~wRx$kE>*qNc|_pap?W+|BkOaXP3yvqUb^Z5l~8e#VT-%m{<(;mOETO&+C zsG)3Gk3h)f+r$DwKTw$OyDun(PrUkiX`I*PP3-r~kSLL(kzgjz-2eBPb+PK9@A_^@L?WSVVlCSA=NnoI(@9Jx z6S7KQ6}j{GhBUFNiNyTx5B!O34GwXquPMzHPC{N2O0*xO`|f@6=1(HL{oe>C3SCJy zAuv2_vwsQ-sN0;nNOfzSHi$)rNQhLZfPjHWXrp2l&MZXd*ybW{m%D!zyPw{@x_{OUmw?Shj5w%!hoPF88A&uzP>z%L=3!RW>=b~ZRkQNkg))HtVzzZ@AvU#_Bj(v+L^#6vLmce4tB|e z4w*Q!7Z6Ik4FC!V20|S05C8Xmo)wJM`suF0%a&1RGTw7wF75uFo?gejmSRYwoUpw2XPL?dJD)I&0T zG0g_#6NIZGvIh+19{s(kR_T8PApu%xSJ15CdU7pwR=U0XB+9IF=WJ#x@Be=P?tcBz z1knH~08LUPC_@l3G;3(apaGBqL1>23YR0einst_D9LHRZ#IrN!oR5q%p|O#6quH}A zyCl2#W}~yw1wnREa6#tM?B>5zwJRV!#$b^}y3*N}bY)vRyVVqJ>FsOC5dcDzpcybE z2ed`GO0JaTG8UCx&7b-IW2m8w0Y88N`7v;jy)EgI+-P}J?0{AZB&E>Wrj*{4uCyjA zUCH)7*%SAM?but6d-O5K?d5RZ%Uwt9%|{=7%+ZJQwsO5MgTaC85svd9INL}A^F+V) ztU5t3SPadJ2frLhw^lK&zVhIgVuER%ho&HP6cuOQdw)L0_F+Czd*Bm7{U^O!UITR5x;-6 zv`@P=;(8PQD5E$->U$q;60i#>Jfbn^k!I+2hFoJUs_Isu8$g3bv-}#$9CD@g)OW@N z(T_4`!q}Pcho5@-6Frx;d?@O}sCJ5lFWsBivQ9jZl?J($$)YbK5JK+l*uPyNqTkEZ z%)h0d1BvojSs$q{{gbYusv=S8LLwtgT>R4PR}~p(4bFvRfixeRq$JVux?BB?W}%At zIG<4jiC1r=2JUWk=Y#NwsGI)5!9#*e97DiAfi{6BmTF+$)^xW0 z2;(9C<6q#Fu?tmmxkqpbwl#k_Duic1xY?wyk z0T!U?Z~Bn;l5nN}oRrV4 zsUzYQh@v9Wq{+4y-!!JxuxqZQ?9Kds&)#hk8(3mRK|w?XA?5#&{jx7B^y6;Zd*8O_ zQDjL72nc^sVHFjfkQvgor*|`G$w_kb&-AceOanC!Gf&9R-f5*Ut66FS6e>>Ty{6ml z97*Ym6^aA&J>;)RM=#cCVvJe5gMUjGr{L=YP~N_g%F)Kgdm4j zM5)2JG-7eM&Z3h<05X81hurbOd9z!tF4eZ~dX;C$%|G6cn71EV9cb92=svUKFAnvi z#RfD07$gD`GDZ-9)b6x@8h}&D4KF9r{WtUQ`XfmN@P?B5IS8OWz_|dR=s|7;xpl?D zj;gFjWD3~?w)3`saitv;yiUoYTtX>CE}@_G%IYwHbE zuCE_(Nm}PnNj^E@3fIX6Rk%-HxWaexK^6Y%*s(<74nEs zqo!gEwpnHOC-*Zfu-qdc;Q&gEIPg<*EO- zL6K3_>Q>*i?}X}0?<5%lHp`J`r1^|xQAp3z9o^YN|1)-yPQ*ZB@FXg4+CY=a#{5!3 zb-z9~sZy$1B*Tb?^My`$7WrO&@AEVEfvcyI+kG$JpMTYV@8kcxW&ZSL?`wL!pCSJs zC>P4nAO6Y4MEY=t9j6A76{WRdVG>SXHwM`sybE5OKc2HanNyjb37FC{T9f~4e zqCq@WTrfyDPaGDZu45P1Acql86we;mV*&~Z#W1YgnS>HP(&823lj6G)ER1g@LL_Js zaUxU+mPD$!heWnSxkQ6R8%cr&np32u?@LTeY)KqQBAECj1(GVsq&0Fza!_(ka-O%Q zqqaULjllT2{*#hKNs1I5GmjKmN+9Ku3X!5owH0YWSPO*f<5FJ#SGnPpw2+YXIRtRf8L$uTZ>d1k_D9!Fge668(kH4h- zWRN4~kRw1qz_EzMTx#@S3m>KMb-f4<{ukea>?~twEfQ1@1qwKu1e_FPCLLJb+}htY z*j_x$Ga&dr)_ks=b4#Hq)0C5M=)zKu=vO5I+0d)(M!KyagR$_x;XMeDt)hacpZSax zh}YovE`6%~sXI;D!=m_E4V&<@ zHRW7&scQYYO)6qdeK%HewX!ggs}iFk#1AG8qg(F&_euQWpu^05rB@sSXk*5M`m^PZiWbQ)#!_cl8S2y&1Ph9}KJkaW@{O z{aN9(;VF!)HpnL_3tW*Q$6iM=Cly&~Wv#}obT5N8^X)`U_wAk|kJ!FhMIjQ1oEyH} zuYvqsUD#E;y8NWGv&d}}@jbo8*vxhmFbp`!LylrrRKBk==xNKK9bE+-f0 zHyKuOPl99!w`2qq0B4!a* zza1^!!J!HOea3+K@(bjW2!0>~M{1lBX&(;73kcNKizD%Z48_wF8Z45JC_>pnv>vph z92+S-$Efe$6L|_}?BQk&4;7vFu1%Yu04hcl&fGpbdiXb1PBA#Gcs$f>!eRsy9M;1g z2hklTl*^z%fdT~z6ey+AGm+nW z%C`ti86wUdvf0Y;s}TH9!pb&6;xG=_FsJZa0wP743`~@X zXxUR7+W*%EGDi%phC4x-$)H)bH;Ma%mru+af?aQkW8AF4r-LU!DAWBxx@C>Yc65&#k;P!KW>^0`{@CNZ03 zMf(HMY7xWSlrKZ&i^eUg!9Sg4r4jF@fHafq)vM@8{Vk{K_`aR?v6;;`9B5h1A__PI zjm;*bX|;m{y-7%36vRkk4OO(AY$#1m9%>1sNAN%g_Li~~VJW+Qh+&SYY_BkMh7 z_k_{=rnq?~}O z$4vLlex$THIg20gDSrR-iI;R=kH{Y%Yv84iXI_BeE=h`}TOLG7niutiDHqCM z5yd1{VO=RLDYf)6$}BryyWF`;TqOioSD%+4)DS=qj+ z-fWFp9jx8q7U~xIQ@;sUnd9REAOs^Qh7%-@FEBaW*Ne&8VrTE*=;Z9;3IrjLC^QC( z!!wwEK*TzQQl-%uoj|CwFSvZULa9<~v^u@P2(q zL=w$&hUIucR#Z**{2+#?K;kbQZX5tcags07=-fx5&{z_gLS?epY$McQd5;7bMK=Tt zz#!7=jl= z*OuA6#+0x53tGzFj)vLi^Anga9IW---64JixNdyn3TcTni^9c_VQ&T{Xc(F zVM0tL-#(JDa&}8lU76~~6OL5RXpuN|@rPEaM7#JT2uu%gP*+N$))cuG{H24OItvuA zoSIP!mx`eIGcMC1OM+jx3L~>;HkF_Md$m4{2)!n3mvIPKbd;Ee zB0WtkM0$ac-aw^cP|1&23PP4b;PNI+seTF%rcPM^PPq`38RJjkp`W$F=p$!wwW^*i925BduUZ2C3)pFwT|>H$au%#9)n*%sRUzPcCoZ*DO;x|P4*-^D$g8`L%+ zAuDNVU0kefn+0*cBOAX@HI3J6Z|&^r$;*sCk8OJ;;CED{Xh(7}(xXPu8^VX2{du$W z%|*?`Y3BLl&vEB?Tqv}g35|0B`!K;nPKHkhqi{nJOX*OiLFIV1lik^k_Zam&)Bi(= zKB6}e8U`9{x2*4VAu~3s6hc_xL zb?J6QX*L6NC?GVA{S1z>gY2oXHvCRW+weh0m=%jR7^zs@nrx^3w1MgLS$~1J=|sT) zsbJ9?Vxx>`zu*fpPd|Bd1bwu+*|Ifr^ud3>PK1S{f0H>{Lrk%6gdCL#Rg74WLB@go5(+oLZJv4ivgaq?F*qFNQ!V~+X4=z;M!-1_I z<2E(#tOs}dtfv^My=E_n8uT6D`ZFkOiI?INv5O&nW={7%B)O8()Kt4IH%?GWW4=M= zVy2->NA}Ml7hZFI`C`B*F?DGzT!F*f*jpoR>8n6TNFl5`g|SEa9=7(z$Gb=;80SYgKr8(OIGJ!SNIH>iHQ6}o!wxNN}IhqGI%Izc3;}~I#4Nr^h z8Z+=9d!nwh9>Ea9=Hl1w<`3!1+p3oqCoIdwlt9nET&<2K!}H!P0kQS%sy(8>Dj~){sNOO zUVs&~2badLKUXCIv>RjEk$XVPLE}HN;*Of; zP?$h&ler?WEai&CxNSzy6i6UvmB920k9B04>CW=^O-suuPdr=t#U4HR(*{-{WW@1t zBl3Bj1+O*MR5`b)`U%=&uP~evgcljbcH@u~X?#0rlhxF~iHXRCTcM@LUz0{1v0Dnx z&I6PBq1UM-gmN@1nhDM+97+8eG)*sOe<&OmW`~Kt(_t!psy9At_}e%_j_Y71*%MH` z$hgHB&xcAG-6lLe!+qNR@@{*q+hw+eyR!O%HP+JKu$a$%ht*(&{STe;gUVb@9Iz{n z>^|4e;I?DsE!-v483}&3TdRAPt;@tdmOHH>Ic-`=m*FM2nbd4)?ixQ3`R{ZRV@8#R zfDJcY0yalNkw%q9M*h=|G@m$v)-tIJ>ds_4Weo1e)y9Um&xGAnI>6mGN5{=cG!Z}7 zq{%hRF z&-Efmm1TW^gjQt|KB2?_JcDHlV(BVn;`@`r(9_th6G%=RJ{$YJ47fOMx{PNpILO}) z$x6$AAFC8JqcFT!V0Q?6li;JnGmxuXzpV}r5Zu1Db$Yv~QEoEyfZwjH&bsGX*Z|I& zC)4O6Yhd7INA;}|tZ{pOde_1Kp zgBHvB7nDCLYp%P3iv_R#9X(v`y{73vs| zDqQu^wZgct3{CJ%;TI}weKJtp%cheGPwMMz)(_ef{^V0>6tUvfOJ_og-w04Zl(c5| zWW-}4Hnp@Ge^QY%B?KB}1m&SluQxio7e+<=a|W=bRa*2A<<(CC!?TSH%@t(nj8c8^BBTa$~gHQ)b z`tfA2Z(oZEsWFG$_uy0!^^5Hw%^7}p07YrP1RotwBb~a^c{#ne!UiJaw5!X7#2^jI z(A1%y98Z}3X0g(0lN`pt!m`<;MHDbx#)Lk(5_1X=as#6-4V|bB^7>x^?p|Mom8S-= za!s?|C5&Z0+J8~if1PGdNPs;K1+W7I0k8)+0>BXmaC#3|X5f)!ENkJx68LtrtwXcP zcGjq%WZ~ALodxIcr+3yeYMz@)9w<;f|I}T3mI3TrCi}ztrw94+yJ@lVnE;Qe1$6h) zvPb_SOeoHKt=25j`+Ie2+QY&O;0k~EBH4}`*L$IbWg}MM09=E1oyezr1`i$q47#lY zg-GNKNe&YFczggF?QshqT()6T!c%(8reucu?zRga$1*ro_fP- z(&U1D|GvX4)Zk*pi_#*dfbHC1(TAGTV(Lo)J#rXnX)~7E2qUNvZ?9K2NGA*=8cr?# z$TJ#((}IzC@P!g~q|mUIS<9hPWH}>=v{VmPBN%Ljudj6MMv73%+%@yCgk}g*_r78x z8aKAmw;TxGEb_2tq9bXc>D?}%p{mHYL4-&X0NFiP1Sn_aFk3w@2~6WuN~Vc0nTD6F z5rQ$JlI`XL6l>zpd>3zD!tZRi;ToXx=q1w!snM1-aU_Tvz+ZH!;hQ=iV-`{D|(FCxz@cBJ2t!H|?gxn7vb2W-@ z-W4Tmq#F3J?aFxja7P!ni@Q+=-+$Zjq}Huh_>O4W zZG3Q*>LWjY78(1mW5DEPKgB|;R5ssh+*UzG?FKBOpYCifRi>j-Q#;;JvgY;Lib>QK z>Vr!ak8086p}-K{z}%@Wknb6=-ap&QlvTRmy19&HbE(%p*VQA?RV#x3CrNA0C* zWUwyQ$%OGxhoWr@kJ^zSuZxy;Xu0?Isx? z$Dj;63Ef}OrO%l;d)}c+XH8%A8|6<+uA|rntFF?_STu*kKQP&X7;0n9?11o|5&wZ#S7sF=8rd%hs(#{ zD6Q`nt29=R$V9!IpQ7biwY1Db%$lx9yWvBoU+^`#Ms{}O**}(xzc?y=WKM%$Qx|+h z)5Wrwd%69GEDhq|xel^PU)?;J7X*uE0 zz%O?{h`jlY9<59qrcBbB4Eq_(^fT{W5w|FqHmdluF;fP#s2f$9Ms^|yGUtB@>x0j& zJcVU#0APh+|0ZUA#kM~<*y^GHSD*@x=+#tgq86Xdz}9-4)#Lnc_l0|8rBvF%_>p>& z($hs4B60<=;T0Rv9WDEI^`t&_UqZ8A)YoaMMRHFx9Qs0taUI-_F2;S;hl=nO41eOd zt~^@jg3>5@ks+z-Bj?B07wufqlrMSCp7mxLJbnF+@!##3Y*pGN{a8MFZ+}*M5d@)C=}|lTQG-yNy5f$^bX{=AFwG?YONd@cf2?UEyJC z&$a~hHLE^;Y&tIDPoD{Zd1^vIU8PaPvTJ^!(uzpQ{Skg4w(rMnzP9j!8mjxdUZAA; zTW3z*dEyt{e;urGVUt--O1uqT=7|i}_28Zgpp|g4oqoFN2-?hOMmx^d-nU zT|tbj2Py#l*koorkrH1p6fdY;BU<*QDWVq$2Ddhw?kg?GUTwyvQq1JHW;O5O3F){_>ytm1qTyT!-i{y5!C2XC*m zv11uRM#3c{&xjiCQ#X5B593~Z%$K@tnd6qFNU^E)jkwvMcKVPo3-n1Z^VPQ3c_De+ zaU=g>tFi5Rpm4Ej2;T6w7g!StbaH0vvR%s8mEm95r==-4cmF#7V5W9!cZ=BZFx!_R zdS*Rr?Ia|%8#}rrz{0({FE-6EgP|ql-4(}{nk+S8rxYJ#3SNmIa+r~kyQ@4`%b+_x zM}fNOgQNkju^e3^m9$_%&t{@Sb?*aI9Dk(A;(Y`cUAy80IuGW;E@7^8uK~zmPM~0~ zO&)obmD7L_A+GI_ z6=3B$6E+YnTQEbfhiwF7SYj!&*!Vq10!0(i=&J8RyY8qR{E?{ac$)p}1pv7zc|6lP zCf#WJ>8+&MQLz6UbNu?cw2~FqbPq~#tg*`;O?FIIPgzX!o z?t^IX^fsfy;Nxy$ebGg~1Gy_aWeMgpF35C|Qr!YJ!@KC%fS(ft{HV>G@#hUgPafe= z>ZI?VZ=p4|L7MzABuP#{yEdiYi)}?debhf+Lra@`4P1^Qc|NZH7Tf0d5Fj`A6Ipyop7`wwBa&tzl4z}N<)`dQm ztJ{~3V(w`Uju5U=ChZQP$wkFQ_L7AOSxg|`pIs^+xXF#a{q+u#k%cOTg~2S>BcO8V zhL!$KOJ^sg=iBL#k`#5s1l#E4C>8&9FBZ_)bdF7O-yF+DbBR$`dS>k8uXjzFZ@m^4 z?_zif<)UK(eoiLvbEb?o?_{hS^)wuEvwzzV&4Kag+|0jjhkv>#%VKVPQrY@U<$wzs z;jqVP+nYUZ*L5hPIttf1_juyfO8zBRFom^jhI7$DLj_a>?68S)$|2iU!n5z(UW7mG zfuGKD<5tRJNM1A_nI9{F7feB!5K)*zge0080$E%)S zgP^34HkI1dON;1Ku1j3Egr2O_t53E5yH?h~wFV769K$4GM59s7#-xmEH6bmh)1)p_ z(x!Dg13UYTcFy@rQ5L#kl~{L7l8F85o{dKwGD*B`(30gzOE$E9II^&1qsc*$n>2am z(EUp;jAM9;ag?M`sWU{X2vsLUaS5zKsY<9(qrt+m+8FH?SZAFUcxT-fL?^u#WM}=* zfPaI~FksR~0h=}sxGp9D-^COV(q?P{o;h2PXTetD7r|D>vq&fyD~we_Bd|{B1U3nS zz&2sx+a-MC+eZ%g4v`~)W7kgnIdzNV7TGPz_@_}q(iR99*iaylz@UIY0~-NwA>c)Y zj6{4!Aw@Qh$ULm>o5_zK0TtQs0vEkZAW9yGv4$V6#|EaU=fD_a|TJ4Xj+Cs$W{r8l+^Tg1c+ zx|pq5yi%^q_$vo12rI!VIM6s$59(`TYd>BcLLSqIZDQgOx&>^7+p(S4F2E6V58xQO z58(vC0Kx{r5I78vfTQp-`>oDs9H@IvB zH^H01S$GS$m2exl9o~VvlV%q_@%t-p{SEYYKKlpgpM3T&(7*ZYKV0H=%-=0rI$R@|EeTeXu2mMKVZaB*dL z`1lF}LP8Z0F|mfErLZ9w%R+e!g>a07idfl`s!-jNrcj&I73-6RVq?-&Voq9$tvR+* z87Od2sML0uWqN^!!DP12!oBn)dX$`!Q*vtF7O$epsz^x%0hwGbs8A}q)&!MxRA1Tl z-dNN3-dsKQ*;+dT1??8ARj19)PPe^-gI>oz390XXbr*dPs(VWAur_Ut3`R5Y;{0rg5!vBSr3NMFO;;Z4c_?RMl!Vt?4!&%(d%=oSb;mok>h$lbr4j4>?u+M}M*fOOhCprKd_@`{IZiB}tk! zQB>5yP+3-SWwV+(H*0Cvs;jEoQ1uADvMaj6F-!4`z0G-t!UazPHz}d}oXCg1#(rWF zfAD#Kj}o(n(=bcIc@!(c<5aB9W%_CK`%Kfs%skD)eyJ|ouk~r;{ImK6fa2hYroDc3_O;;D_Iou>|pPPMvt>*k|}pI!m_)YI{! z*P!2x0TTv|F*q>h+>}exRPs8_x?~b=E?3Q45M)J)H9^*0vgDyH`^p?BcetiPz`s64 z>^9GqOhJ9Q9H)1{)71Q?6slJk^3ZoW={{y8%V#tJ1JXA{{`!H05Bj0Mj0*e#6IOYbFX%)4 zWPlm;%ztK>jG$36hQ41Rd9(oV3;__CMY5z=cFl^5R>|7glSO3H zFHCwel97x~StNzH7}oc2BP8>Hq>w@iDWs5*^rVnN%8V#aP`)x` zAqB!HBB-Kh%5`4}E2*TCN-C+Ok_re22uLcaq>>s@RZ`InW!}dZ`&5Z*XysG+h94j;qILB4~NFnjVTv~D@Qh2mhb-y$F}sV?wzK& zTdoLXoY>|*u>4%j-92?6Il~or#;Yha>WIk=+h>kG94VkuIJt5*7y|`jOYcJpT0`=z zX@#9baRmw}1x?RYi5y)t4~r)dNmis#IjUvkSfF{M(2~kzsimQ`QY^ijJ^ig6W4cUb zvaHfrc9{xYc82LDb&c>iCplispd2i3iHRI}RXXDISd6}MIA*DhT@p#ZuOe{B@Au&m zRVgfMQm*{IYPGdAN<3YOXZVG>Ok15gX>^xROmeS2=gzNOyPZ-`Vn+3-spJ&>kB$P& z%Pk3@O`2J!epXr2+@5t)+-(nZdF+ic-t6sWyvvs?_==x9?w9`MivReJr~c>v4ELph zK*YR!B;%fsqoeWL_Yg7C{2RL8$nm^U8#O*91O|a9CJY9Hd`=n|4Fs9Auq*KeOZ0?I z-p~-XDLpRiQZ|<(ne$rJZibt5rlvg&j&KW#+-;N_BGnAW-l5n`4&>q9IuGtK-hLhv zQ!SAP`(ex~xXB4fpx%eqAVAF?AnN17n5ZR4$zOy~$!fJZ;dP=LiX4mo2%yqJa{BuQ zmgSC2tl4dJs5ATNi-S!S>dg*|AbVSZcX>Tl`}mP9zQBAi>fDvaM{D&*WxuGH*ISBalNraZyRxFDIxgM^ zQjVy71JQpt+s4?MhfS2aP~?k%p%a0kS}hL4Qif~Vu^gAwVjQHb)&oWqA#C}iu_zav z^-pyZs%%={$k3Zx_F128t@FXCm*RBKYD>9&_sT)cAp_Z7o=NIZ3v1jZ>+&-glm>T~ z?Py-j+$5TD0e2!Bb|e(H*^~AkEuAAd2B?udByL9QRT4U1p;{imq|v4+8oyO-*0ekW zT!^FjDhTJqk*|epHb0TUM#AppV(`+_rsHsXQ3V^doAXri)h>B%*k<$L@Lnqjrd&D$ zOAnOv!bl&4^rMs!u#7{=3|MBNga9K%C|RC}3mXU~xZsyUHldU)B-w_O-ATB@flvj% z6mkruoFT|LDxsiKC?F{eP$>-{DFP6c7Emf3ASpedQichn%N__Z&_Y=fbiM@2*Pycu zY?g)23Xu60C_ij#UF*?&-1L(L63lC$=-`;)=}?jp33yG0u!;%61ZdEOcM3GoD37=c7#@FDcN zWzZkcxR46o684HvI^I&|8)4ME8B4pLgx2(ykhg?W_7<HXn*WMKs*ADE7H+zVgP{4OyvgxH`Ng)a<(2x{vXDGF@id6v?vZVFd& zd745&yt2a#dv=#+f-vykkT4ErMjQZ)XP`7Ce|1A6KN(&=rdfxWc zUB7(Pn1R=|-PBqs(s>GpJHrz>y~cd(GfmY%fu zHJ|Royn`GI@1J3Fg-^O&Jt8K*Ivq#GrwHT7L|kqcq8Jn9Zl#7m0YjGBC2^eMqsYVd zIs_mIxrIJ1$}7uq8Ro?Y>H`V~EtylCn|h8=X+MuT~ZjkYQ^c%EpMGT{Ej7*Z-% zC++W*L6wCO2MVxj%+-%YKF183= zQfIO+jxdX@75*Z=*3L&c_1sWP# zwq6k>refEmN|qynlNCQOh82`+#auN)y4{@zCZ*@T=c?~LnxJygS}TB)5T8V#KergaWlTCA8G9W#0K26G`w%*)6?QJuP)h+Vo9HSUJ0 z&9y6-!*VYt{^nn`W$!gHoHafN)_Vw!>1-%zF zFVQCb9ks6h@qn=@{wY6Y#q-8~;<3XEV{fSJWtjIztfyONv<4sU460g|(YT{~Yk5_< zy??Bl^{kgb9A?M@`lm(F*g>#n>eAcU=5B|P6_)NgR!qGokWeNYlTG4`fg-J|NHNbX z$M`cCNs$u?QiK*Ku2SbIhGnX0_(>fMzhf|BMrnSIYMrEn5exOebH?DD-}uxEG-nyh zo!y7yJsKjQZUr7iRmiyL{)4|$WbIDnsAIpx+~73V_pE4B&XBA$K!v`E3p~2YCzA`p zs|CYHPNO18M{hi9__P(XRU$D5IrTu1zfLIPzM9Dnc#H37Jx=Am%{C`=kmYpmO|mxJv!KM~X>v!~2N5*ZG+CMwR4PT5B3$zw$w2_0 zl0wI?hY~q;)@-_M?;4|7*=xkS1*OifuJC)g&(W^-f*CL2q|}UHV8RC-VxOr^837Ud z=kg|YWqk~bGivRULHHz{cH>SdSH&LaOvO(V;69HyB~OeJ?nzxkinf@OLj*E3(JR;7 zbFE@%N|RYfis5eE;^o{jKSYCGuRv!Oza;O3IR#=eZPaK|3(lQ7Imx&eiteQNIr|ht zr$j9J^`o%v6kA6dkxrU>PDFZzlGajVwHsa}V~{RsE;I|iCM0cC+2DXh)ny(!iH2LB zxKRMFvpJU%pc*#tZqMJBl+sGimDlnk(6L4!#X_TQJqIDbPfpzE=5s=g(M+u~`!)*x zxp|VD9opffC^UW{zo93Fd@VGmke`$u5mz#_}Ey}K6`kVg?;^NBTA-X~9_ z`uf@1EF_*B>;kwetu%4sEKjtdw4ETmRgdt9+C;o~^Yu@utzoww7FFyk8Ga?SN1?^g zTKV&4O3taa2otfv3Img)g8FC5MaezObmY@3>m0nAa;AOH_6S{=amVhfis)F;vpyW% znuFX8H!$>8Aqsc#K{33s7ocf>SY8#{9J|ULbm|12dYs$HP8~Ip2RX-{z)ZZ&V|6xJ zd~`x?sVRUfN)aPMu>_`Q#x(Te5zkUsk?9kr7oS*z7hxlSQdlO9AEh|p#i-pErrHb+ zP}3;LiE?QqX2#1a70zXK-oenC^&wPR#0RCElb;6~J(Z3rd>fQgf&(kkP{uv^r~1nb zCn+aCn8MMaYB7`vXxP&MV}`vdw+Q`^Nj}+1s~iCAObzi}y=lpwE+AZOlHZox@h7pz z2^qsCtHc=bbIPs6^I^iozp;+Z-KNJRfzLYIYLw-K#b=5qhR;8@UPsI#cQi&mnry#K z*81D_mOtj|c2XL1iv6B-&bx2u;I44A9~u&rZraD#!Rl~2>fSzB8kuv7RqRaJIPY61 z)3g=Cn^I+fe1zKSoJp|Fe!-#SSf;@Lx^NaR=$iJ(FWUDqvNG|lAstUiC&C%`0UdY4 zzdZ>Rxey%x6sM$UNLF=32)ZY_EG5ydbg5B=v_&2hJwntjcm70_)WT{pO0G>Jt#KdP zgK!MbP1Hp6VNw3XS29H$4bPBQ={ZE_ad*p6Po+vkYVV|OJ&jq*=zI+e?suLL1qX0% z|5?tsZSl1D0UDp2TRmApx-p5nw`xWEn^LHrK^X4(HD}m3X`u-c!LGck*>Alp&r%y) zrf1eFbi943SqaF(^yr}jD2XyFkTZ8<;)Usmp8_RRNP@qoRHk&Y-Oe-&~fucsnmolT$}@wCcv_$zqW1L#+1UuH~zRB8y!2SupfNhmLUs^$4ZOR%Tend5}X< zyiNJn;@1SHG~}D?-pzQg#NAPku0_#H_v4eYaLczfGa|+ngYpOR(>G9YcAcfi+)Zw6 zkun)MA(c>0ZB++*-W#lh^G+NjcW4{V-uN2!57^9PcM$PCe$%lpBVU6Uu zB~v09FDijn2iYdwU@aonn}Rqs$_t7pgC_2Eg}yb6bFyW4c1Nu@0!uj{YpiWDdW|_( z!G+=23s2qua3YDxw+L^9QS5ybjS@Hn)7=2&_#l{^YpD1UJQNwbwxPU|C z3VC5Fx@iv`{v!MiMwxZI%XqljDbA=K4jaemRJ2U@QWBA+RSb0ZqS(eulUO(=0vqgjw1~-wx7SEzJ34?QT`W5v~Q$d5DWpQy9 zqd>7@J~#`U9fG%n{GJ~dWHvk69=>de$lt?-M}F;F6FQ96Vd({%m{y19x5MvM8uNIx ze^EILnlGRZA8I2x75BIcd!&hxz-Kv%GUyTE^pqxNIEq&nCZeAsfNh{ZRg)`ta5d-y zMRGh#B6J7c&57W5j_=>7N%gtB=aggYlRvb$y@25o!v<7Nhe$%X=rD&|lbfoie<$Z- zvkdOi_ADa9#am*kF@;eJwJZ$=UeveECyuQqk+0>ij;nGJ8BR!F4p=VC;ScXH=czE( zTD0NrINdDS;s>M;Pyf|f&R7kWaTN#_jxcgZOaWCjgi$;)P-y++

5py28t_DdLql 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 TXIEeHi!0dLF}0M-Qc?X6y8Oaw literal 0 HcmV?d00001 From e0d6b6dd62d21848c8a84a35180504c6cfb07b3a Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 1 Nov 2025 02:06:44 +0900 Subject: [PATCH 12/57] =?UTF-8?q?#7=20[CHORE]=20SVGR=20=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B8=8C=EB=9F=AC=EB=A6=AC=20=EC=84=A4=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/svgs/navigation/ComingSoonIcon.tsx | 16 - app/assets/svgs/navigation/DownloadIcon.tsx | 18 - app/assets/svgs/navigation/HomeIcon.tsx | 17 - app/assets/svgs/navigation/MoreIcon.tsx | 13 - app/assets/svgs/navigation/NetflixIcon.tsx | 41 - app/assets/svgs/navigation/SearchIcon.tsx | 20 - app/assets/svgs/navigation/comingSoonIcon.svg | 3 + app/assets/svgs/navigation/downloadIcon.svg | 3 + app/assets/svgs/navigation/homeIcon.svg | 7 + app/assets/svgs/navigation/index.ts | 6 - app/assets/svgs/navigation/moreIcon.svg | 3 + app/assets/svgs/navigation/searchIcon.svg | 4 + app/components/navigation/BottomNav.tsx | 8 +- app/components/navigation/Header.tsx | 2 +- next.config.ts | 20 +- package-lock.json | 2566 ++++++++++++++++- package.json | 1 + svgr.d.ts | 10 + tsconfig.json | 10 +- 19 files changed, 2486 insertions(+), 282 deletions(-) delete mode 100644 app/assets/svgs/navigation/ComingSoonIcon.tsx delete mode 100644 app/assets/svgs/navigation/DownloadIcon.tsx delete mode 100644 app/assets/svgs/navigation/HomeIcon.tsx delete mode 100644 app/assets/svgs/navigation/MoreIcon.tsx delete mode 100644 app/assets/svgs/navigation/NetflixIcon.tsx delete mode 100644 app/assets/svgs/navigation/SearchIcon.tsx create mode 100644 app/assets/svgs/navigation/comingSoonIcon.svg create mode 100644 app/assets/svgs/navigation/downloadIcon.svg create mode 100644 app/assets/svgs/navigation/homeIcon.svg delete mode 100644 app/assets/svgs/navigation/index.ts create mode 100644 app/assets/svgs/navigation/moreIcon.svg create mode 100644 app/assets/svgs/navigation/searchIcon.svg create mode 100644 svgr.d.ts diff --git a/app/assets/svgs/navigation/ComingSoonIcon.tsx b/app/assets/svgs/navigation/ComingSoonIcon.tsx deleted file mode 100644 index c01b897..0000000 --- a/app/assets/svgs/navigation/ComingSoonIcon.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react'; - -interface ComingSoonIconProps { - color: string; -} - -const ComingSoonIcon: React.FC = ({ color }) => ( - - - -); - -export default ComingSoonIcon; diff --git a/app/assets/svgs/navigation/DownloadIcon.tsx b/app/assets/svgs/navigation/DownloadIcon.tsx deleted file mode 100644 index 14a8c68..0000000 --- a/app/assets/svgs/navigation/DownloadIcon.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react'; - -interface DownloadIconProps { - color: string; -} - -const DownloadIcon: React.FC = ({ color }) => ( - - - -); - -export default DownloadIcon; diff --git a/app/assets/svgs/navigation/HomeIcon.tsx b/app/assets/svgs/navigation/HomeIcon.tsx deleted file mode 100644 index a827b64..0000000 --- a/app/assets/svgs/navigation/HomeIcon.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react'; - -interface HomeIconProps { - color: string; -} - -const HomeIcon: React.FC = ({ color }) => ( - - - - - - - -); - -export default HomeIcon; diff --git a/app/assets/svgs/navigation/MoreIcon.tsx b/app/assets/svgs/navigation/MoreIcon.tsx deleted file mode 100644 index 7217a7e..0000000 --- a/app/assets/svgs/navigation/MoreIcon.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; - -interface MoreIconProps { - color: string; -} - -const MoreIcon: React.FC = ({ color }) => ( - - - -); - -export default MoreIcon; diff --git a/app/assets/svgs/navigation/NetflixIcon.tsx b/app/assets/svgs/navigation/NetflixIcon.tsx deleted file mode 100644 index b3354a8..0000000 --- a/app/assets/svgs/navigation/NetflixIcon.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import React from 'react'; - -const NetflixIcon: React.FC = () => ( - - - - - - - - - - - - -); - -export default NetflixIcon; diff --git a/app/assets/svgs/navigation/SearchIcon.tsx b/app/assets/svgs/navigation/SearchIcon.tsx deleted file mode 100644 index c9abfc6..0000000 --- a/app/assets/svgs/navigation/SearchIcon.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react'; - -interface SearchIconProps { - color: string; -} - -const SearchIcon: React.FC = ({ color }) => ( - - - - -); - -export default SearchIcon; diff --git a/app/assets/svgs/navigation/comingSoonIcon.svg b/app/assets/svgs/navigation/comingSoonIcon.svg new file mode 100644 index 0000000..098571d --- /dev/null +++ b/app/assets/svgs/navigation/comingSoonIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/svgs/navigation/downloadIcon.svg b/app/assets/svgs/navigation/downloadIcon.svg new file mode 100644 index 0000000..b6a8a80 --- /dev/null +++ b/app/assets/svgs/navigation/downloadIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/svgs/navigation/homeIcon.svg b/app/assets/svgs/navigation/homeIcon.svg new file mode 100644 index 0000000..deb8110 --- /dev/null +++ b/app/assets/svgs/navigation/homeIcon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/app/assets/svgs/navigation/index.ts b/app/assets/svgs/navigation/index.ts deleted file mode 100644 index 39a8e0a..0000000 --- a/app/assets/svgs/navigation/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { default as ComingSoonIcon } from './ComingSoonIcon'; -export { default as DownloadIcon } from './DownloadIcon'; -export { default as HomeIcon } from './HomeIcon'; -export { default as MoreIcon } from './MoreIcon'; -export { default as NetflixIcon } from './NetflixIcon'; -export { default as SearchIcon } from './SearchIcon'; diff --git a/app/assets/svgs/navigation/moreIcon.svg b/app/assets/svgs/navigation/moreIcon.svg new file mode 100644 index 0000000..261d4e0 --- /dev/null +++ b/app/assets/svgs/navigation/moreIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/svgs/navigation/searchIcon.svg b/app/assets/svgs/navigation/searchIcon.svg new file mode 100644 index 0000000..8196eac --- /dev/null +++ b/app/assets/svgs/navigation/searchIcon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/components/navigation/BottomNav.tsx b/app/components/navigation/BottomNav.tsx index f657689..a8db614 100644 --- a/app/components/navigation/BottomNav.tsx +++ b/app/components/navigation/BottomNav.tsx @@ -3,7 +3,11 @@ import Link from 'next/link'; import { usePathname } from 'next/navigation'; -import { ComingSoonIcon, DownloadIcon, HomeIcon, MoreIcon, SearchIcon } from '@/app/assets/svgs/navigation'; +import ComingSoonIcon from '@/app/assets/svgs/navigation/ComingSoonIcon.svg'; +import DownloadIcon from '@/app/assets/svgs/navigation/DownloadIcon.svg'; +import HomeIcon from '@/app/assets/svgs/navigation/HomeIcon.svg'; +import MoreIcon from '@/app/assets/svgs/navigation/MoreIcon.svg'; +import SearchIcon from '@/app/assets/svgs/navigation/SearchIcon.svg'; const BottomNav = () => { const pathname = usePathname(); @@ -42,7 +46,7 @@ const BottomNav = () => { className="flex flex-col items-center justify-center min-w-0 flex-1 py-2" >

- +
{item.label} diff --git a/app/components/navigation/Header.tsx b/app/components/navigation/Header.tsx index 9fc27dd..6f666dc 100644 --- a/app/components/navigation/Header.tsx +++ b/app/components/navigation/Header.tsx @@ -1,4 +1,4 @@ -import { NetflixIcon } from '@/app/assets/svgs/navigation'; +import NetflixIcon from '@/app/assets/svgs/navigation/netflixIcon.svg'; const Header = () => { return ( diff --git a/next.config.ts b/next.config.ts index 5e891cf..3b9257a 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,7 +1,25 @@ import type { NextConfig } from 'next'; const nextConfig: NextConfig = { - /* config options here */ + webpack: (config) => { + config.module.rules.push({ + test: /\.svg$/i, + issuer: /\.[jt]sx?$/, + use: ['@svgr/webpack'], + }); + return config; + }, + turbopack: { + rules: { + '*.svg': { + loaders: ['@svgr/webpack'], + as: '*.ts', + }, + }, + }, + images: { + domains: ['image.tmdb.org'], // ์™ธ๋ถ€ ์ด๋ฏธ์ง€ ๋„๋ฉ”์ธ ์ถ”๊ฐ€ + }, }; export default nextConfig; diff --git a/package-lock.json b/package-lock.json index 8643523..795d908 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "react-dom": "19.2.0" }, "devDependencies": { + "@svgr/webpack": "^8.1.0", "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", @@ -117,6 +118,19 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", @@ -124,116 +138,1555 @@ "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", + "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", + "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", + "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", + "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", + "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-module-imports": { + "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-string-parser": { + "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "node_modules/@babel/preset-env": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", + "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.5", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.4", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/parser": { + "node_modules/@babel/preset-typescript": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.5" - }, - "bin": { - "parser": "bin/babel-parser.js" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/template": { @@ -1150,97 +2603,368 @@ "arm64" ], "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.1.tgz", + "integrity": "sha512-XeEUJsE4JYtfrXe/LaJn3z1pD19fK0Q6Er8Qoufi+HqvdO4LEPyCxLUt4rxA+4RfYo6S9gMlmzCMU2F+AatFqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 10" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.1.tgz", - "integrity": "sha512-XeEUJsE4JYtfrXe/LaJn3z1pD19fK0Q6Er8Qoufi+HqvdO4LEPyCxLUt4rxA+4RfYo6S9gMlmzCMU2F+AatFqQ==", - "cpu": [ - "x64" - ], + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">= 10" + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" }, "engines": { - "node": ">= 8" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, "engines": { - "node": ">= 8" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@babel/types": "^7.21.3", + "entities": "^4.4.0" }, "engines": { - "node": ">= 8" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, "engines": { - "node": ">=12.4.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" } }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", "dev": true, "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": ">=14" }, "funding": { - "url": "https://opencollective.com/pkgr" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" } }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } }, "node_modules/@swc/helpers": { "version": "0.5.15", @@ -1522,6 +3246,16 @@ "tailwindcss": "4.1.16" } }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/@tybys/wasm-util": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", @@ -2457,6 +4191,48 @@ "node": ">= 0.4" } }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2474,6 +4250,13 @@ "baseline-browser-mapping": "dist/cli.js" } }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -2591,6 +4374,19 @@ "node": ">=6" } }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001751", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", @@ -2622,79 +4418,210 @@ "supports-color": "^7.1.0" }, "engines": { - "node": ">=10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js-compat": { + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz", + "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.26.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" }, "engines": { - "node": ">=7.0.0" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "dev": true, - "license": "MIT" + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, "license": "MIT", "dependencies": { - "delayed-stream": "~1.0.0" + "css-tree": "~2.2.0" }, "engines": { - "node": ">= 0.8" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" }, "engines": { - "node": ">= 8" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -2788,6 +4715,16 @@ "dev": true, "license": "MIT" }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -2856,6 +4793,76 @@ "node": ">=0.10.0" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2898,6 +4905,29 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-abstract": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", @@ -4134,6 +6164,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, "node_modules/is-async-function": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", @@ -4613,6 +6650,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4961,6 +7005,13 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -4977,6 +7028,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -5016,6 +7074,16 @@ "integrity": "sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==", "license": "MIT" }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -5045,6 +7113,13 @@ "node": ">= 0.4" } }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -5241,6 +7316,17 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-releases": { "version": "2.0.27", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", @@ -5248,6 +7334,19 @@ "dev": true, "license": "MIT" }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5452,6 +7551,25 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5479,6 +7597,16 @@ "dev": true, "license": "MIT" }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5676,6 +7804,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", @@ -5697,6 +7845,44 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -6048,6 +8234,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -6263,6 +8460,39 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, "node_modules/synckit": { "version": "0.11.11", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", @@ -6561,6 +8791,50 @@ "dev": true, "license": "MIT" }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/unrs-resolver": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", diff --git a/package.json b/package.json index 720b657..6cb9945 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "react-dom": "19.2.0" }, "devDependencies": { + "@svgr/webpack": "^8.1.0", "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", diff --git a/svgr.d.ts b/svgr.d.ts new file mode 100644 index 0000000..bd3438f --- /dev/null +++ b/svgr.d.ts @@ -0,0 +1,10 @@ +declare module '*.svg' { + import { FC, SVGProps } from 'react'; + const content: FC>; + export default content; +} + +declare module '*.svg?url' { + const content: string; + export default content; +} diff --git a/tsconfig.json b/tsconfig.json index cc9ed39..779ee28 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,6 +22,14 @@ "@/*": ["./*"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", ".next/dev/types/**/*.ts", "**/*.mts"], + "include": [ + "svgr.d.ts", + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts", + "**/*.mts" + ], "exclude": ["node_modules"] } From 3a6a92780e9a041582ccf20d6d11b5618f68af1a Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 1 Nov 2025 15:03:10 +0900 Subject: [PATCH 13/57] =?UTF-8?q?#7=20[FIX]=20import=20=EA=B2=BD=EB=A1=9C?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/navigation/BottomNav.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/components/navigation/BottomNav.tsx b/app/components/navigation/BottomNav.tsx index a8db614..8b1fc5e 100644 --- a/app/components/navigation/BottomNav.tsx +++ b/app/components/navigation/BottomNav.tsx @@ -3,11 +3,11 @@ import Link from 'next/link'; import { usePathname } from 'next/navigation'; -import ComingSoonIcon from '@/app/assets/svgs/navigation/ComingSoonIcon.svg'; -import DownloadIcon from '@/app/assets/svgs/navigation/DownloadIcon.svg'; -import HomeIcon from '@/app/assets/svgs/navigation/HomeIcon.svg'; -import MoreIcon from '@/app/assets/svgs/navigation/MoreIcon.svg'; -import SearchIcon from '@/app/assets/svgs/navigation/SearchIcon.svg'; +import ComingSoonIcon from '@/app/assets/svgs/navigation/comingSoonIcon.svg'; +import DownloadIcon from '@/app/assets/svgs/navigation/downloadIcon.svg'; +import HomeIcon from '@/app/assets/svgs/navigation/homeIcon.svg'; +import MoreIcon from '@/app/assets/svgs/navigation/moreIcon.svg'; +import SearchIcon from '@/app/assets/svgs/navigation/searchIcon.svg'; const BottomNav = () => { const pathname = usePathname(); From 0105a1f6db5cc1a65722c6b282cd3aae26eb39a4 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 1 Nov 2025 15:26:48 +0900 Subject: [PATCH 14/57] =?UTF-8?q?#7=20[FEAT]=20API=20=EC=9D=91=EB=8B=B5=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/types/tmdb.ts | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 app/types/tmdb.ts diff --git a/app/types/tmdb.ts b/app/types/tmdb.ts new file mode 100644 index 0000000..d3249b9 --- /dev/null +++ b/app/types/tmdb.ts @@ -0,0 +1,54 @@ +/** + * TMDB API ์‘๋‹ต ํƒ€์ž… ์ •์˜ + * The Movie Database (TMDB) API์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. + */ + +/** + * ์˜ํ™”์™€ TV ํ”„๋กœ๊ทธ๋žจ์˜ ๊ณตํ†ต ์†์„ฑ์„ ์ •์˜ํ•˜๋Š” ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค + */ +interface BaseMedia { + id: number; // ๋ฏธ๋””์–ด ๊ณ ์œ  ID + poster_path: string | null; // ํฌ์Šคํ„ฐ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ + backdrop_path?: string | null; // ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ + overview?: string; // ์ค„๊ฑฐ๋ฆฌ ์š”์•ฝ + vote_average?: number; // ํ‰๊ท  ํ‰์  (0-10) + popularity?: number; // ์ธ๊ธฐ๋„ ์ ์ˆ˜ + media_type?: 'movie' | 'tv'; // ๋ฏธ๋””์–ด ํƒ€์ž… (์˜ํ™” ๋˜๋Š” TV) +} + +/** + * ์˜ํ™” ๋ฐ์ดํ„ฐ ํƒ€์ž… + * BaseMedia๋ฅผ ํ™•์žฅํ•˜์—ฌ ์˜ํ™” ํŠนํ™” ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. + */ +export interface Movie extends BaseMedia { + title: string; // ์˜ํ™” ์ œ๋ชฉ + release_date?: string; // ๊ฐœ๋ด‰์ผ (YYYY-MM-DD) + original_title?: string; // ์›์ œ +} + +/** + * TV ํ”„๋กœ๊ทธ๋žจ ๋ฐ์ดํ„ฐ ํƒ€์ž… + * BaseMedia๋ฅผ ํ™•์žฅํ•˜์—ฌ TV ํŠนํ™” ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. + */ +export interface TV extends BaseMedia { + name: string; // TV ํ”„๋กœ๊ทธ๋žจ ์ œ๋ชฉ + first_air_date?: string; // ์ฒซ ๋ฐฉ์˜์ผ (YYYY-MM-DD) + original_name?: string; // ์›์ œ +} + +/** + * ์˜ํ™” ๋˜๋Š” TV ํ”„๋กœ๊ทธ๋žจ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์œ ๋‹ˆ์˜จ ํƒ€์ž… + */ +export type Media = Movie | TV; + +/** + * TMDB API ๋ฆฌ์ŠคํŠธ ์‘๋‹ต ๊ตฌ์กฐ + * ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ํฌํ•จ๋œ API ์‘๋‹ต ํ˜•์‹์ž…๋‹ˆ๋‹ค. + * @template T - ๊ฒฐ๊ณผ ๋ฐฐ์—ด์˜ ์•„์ดํ…œ ํƒ€์ž… (Movie, TV ๋“ฑ) + */ +export interface TMDBListResponse { + page: number; // ํ˜„์žฌ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ + results: T[]; // ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด + total_pages: number; // ์ „์ฒด ํŽ˜์ด์ง€ ์ˆ˜ + total_results: number; // ์ „์ฒด ๊ฒฐ๊ณผ ์ˆ˜ +} From b7024c164bbc96dc791fd94c734dbd7b44283316 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 1 Nov 2025 15:27:27 +0900 Subject: [PATCH 15/57] =?UTF-8?q?#7=20[REFACTOR]=20API=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EB=B6=84=ED=95=A0=20=EB=B0=8F=20=EC=A3=BC=EC=84=9D?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/apis/axiosInstance.ts | 17 +++++++-- app/apis/detail.ts | 24 +++++++++++++ app/apis/{tmdb.ts => home.ts} | 66 +++++++++++++++++++++++------------ app/apis/search.ts | 24 +++++++++++++ 4 files changed, 105 insertions(+), 26 deletions(-) create mode 100644 app/apis/detail.ts rename app/apis/{tmdb.ts => home.ts} (61%) create mode 100644 app/apis/search.ts diff --git a/app/apis/axiosInstance.ts b/app/apis/axiosInstance.ts index ffa6315..f29a381 100644 --- a/app/apis/axiosInstance.ts +++ b/app/apis/axiosInstance.ts @@ -1,11 +1,22 @@ +/** + * TMDB API ํ†ต์‹ ์„ ์œ„ํ•œ Axios ์ธ์Šคํ„ด์Šค + * ๋ชจ๋“  TMDB API ์š”์ฒญ์— ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. + */ + import axios from 'axios'; +/** + * TMDB API์šฉ Axios ์ธ์Šคํ„ด์Šค + * - baseURL: TMDB API ๊ธฐ๋ณธ URL (ํ™˜๊ฒฝ๋ณ€์ˆ˜์—์„œ ๊ฐ€์ ธ์˜ด) + * - headers: ์š”์ฒญ ํ—ค๋” ์„ค์ • + * - params: ๋ชจ๋“  ์š”์ฒญ์— ์ž๋™์œผ๋กœ ํฌํ•จ๋  ํŒŒ๋ผ๋ฏธํ„ฐ (API ํ‚ค) + */ export const axiosInstance = axios.create({ - baseURL: process.env.NEXT_PUBLIC_URL, + baseURL: process.env.NEXT_PUBLIC_URL, // TMDB API ๋ฒ ์ด์Šค URL headers: { - 'Content-Type': 'application/json', + 'Content-Type': 'application/json', // JSON ํ˜•์‹์œผ๋กœ ํ†ต์‹  }, params: { - api_key: process.env.NEXT_PUBLIC_TMDB_API_KEY, + api_key: process.env.NEXT_PUBLIC_TMDB_API_KEY, // TMDB API ํ‚ค (๋ชจ๋“  ์š”์ฒญ์— ์ž๋™ ํฌํ•จ) }, }); diff --git a/app/apis/detail.ts b/app/apis/detail.ts new file mode 100644 index 0000000..cc81c5b --- /dev/null +++ b/app/apis/detail.ts @@ -0,0 +1,24 @@ +/** + * ์ƒ์„ธ ์ •๋ณด ํŽ˜์ด์ง€ ์ „์šฉ TMDB API ํ•จ์ˆ˜ + * ํŠน์ • ๋ฏธ๋””์–ด์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋Š” API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. + */ + +import { axiosInstance } from '@/app/apis/axiosInstance'; + +/** + * ํŠน์ • ๋ฏธ๋””์–ด์˜ ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ + * @param media_type - ๋ฏธ๋””์–ด ํƒ€์ž… ("movie" ๋˜๋Š” "tv") + * @param id - ๋ฏธ๋””์–ด ID + * @returns ๋ฏธ๋””์–ด ์ƒ์„ธ ์ •๋ณด + */ +export const getDetail = async (media_type: string, id: string) => { + try { + const res = await axiosInstance.get(`/${media_type}/${id}`, { + params: { language: 'ko-KR' }, + }); + return res.data; + } catch (err) { + console.error('getDetail data error', err); + return null; + } +}; diff --git a/app/apis/tmdb.ts b/app/apis/home.ts similarity index 61% rename from app/apis/tmdb.ts rename to app/apis/home.ts index 56d12a4..42f4f38 100644 --- a/app/apis/tmdb.ts +++ b/app/apis/home.ts @@ -1,6 +1,15 @@ +/** + * ํ™ˆ ํŽ˜์ด์ง€ ์ „์šฉ TMDB API ํ•จ์ˆ˜ + * ํ™ˆ ํŽ˜์ด์ง€์˜ ๊ฐ ์„น์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์˜ํ™” ๋ฐ TV ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. + */ + import { axiosInstance } from '@/app/apis/axiosInstance'; -// HeroSlider +/** + * ์˜ค๋Š˜์˜ ํŠธ๋ Œ๋”ฉ ์ฝ˜ํ…์ธ  (์˜ํ™” + TV ํ”„๋กœ๊ทธ๋žจ) + * ๋‹น์ผ ๊ฐ€์žฅ ์ธ๊ธฐ์žˆ๋Š” ๋ชจ๋“  ๋ฏธ๋””์–ด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. + * @returns TMDB ํŠธ๋ Œ๋”ฉ ๋ฐ์ดํ„ฐ (์˜ํ™” ๋ฐ TV ํฌํ•จ) + */ export const getTrendingAllDay = async () => { try { const res = await axiosInstance.get('/trending/all/day', { @@ -13,7 +22,11 @@ export const getTrendingAllDay = async () => { } }; -// ์žฅ๋ฅด๋ณ„ ์˜ํ™” +/** + * ํŠน์ • ์žฅ๋ฅด์˜ ์˜ํ™” ๋ชฉ๋ก ์กฐํšŒ + * @param genreIds - ์žฅ๋ฅด ID (์ฝค๋งˆ๋กœ ๊ตฌ๋ถ„๋œ ๋ฌธ์ž์—ด, ์˜ˆ: "28,12") + * @returns ํ•ด๋‹น ์žฅ๋ฅด์˜ ์ธ๊ธฐ์ˆœ ์˜ํ™” ๋ชฉ๋ก + */ export const getMoviesByGenre = async (genreIds: string) => { try { const res = await axiosInstance.get('/discover/movie', { @@ -30,7 +43,11 @@ export const getMoviesByGenre = async (genreIds: string) => { } }; -// ๋„ทํ”Œ๋ฆญ์Šค ์˜ค๋ฆฌ์ง€๋„ +/** + * ํŠน์ • TV ๋„คํŠธ์›Œํฌ์˜ ํ”„๋กœ๊ทธ๋žจ ๋ชฉ๋ก ์กฐํšŒ + * @param networkId - TV ๋„คํŠธ์›Œํฌ ID (์˜ˆ: Netflix = 213) + * @returns ํ•ด๋‹น ๋„คํŠธ์›Œํฌ์˜ TV ํ”„๋กœ๊ทธ๋žจ ๋ชฉ๋ก + */ export const getTVByNetwork = async (networkId: number) => { try { const res = await axiosInstance.get('/discover/tv', { @@ -46,6 +63,11 @@ export const getTVByNetwork = async (networkId: number) => { } }; +/** + * ํŠน์ • ์ œ์ž‘์‚ฌ์˜ ์˜ํ™” ๋ชฉ๋ก ์กฐํšŒ + * @param companyId - ์ œ์ž‘์‚ฌ ID + * @returns ํ•ด๋‹น ์ œ์ž‘์‚ฌ์˜ ์˜ํ™” ๋ชฉ๋ก + */ export const getMoviesByCompany = async (companyId: number) => { try { const res = await axiosInstance.get('/discover/movie', { @@ -61,7 +83,11 @@ export const getMoviesByCompany = async (companyId: number) => { } }; -// Preview +/** + * ์ธ๊ธฐ ์˜ํ™” ๋ชฉ๋ก ์กฐํšŒ (Preview ์„น์…˜์šฉ) + * @param page - ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ (๊ธฐ๋ณธ๊ฐ’: 1) + * @returns ํ˜„์žฌ ์ธ๊ธฐ์žˆ๋Š” ์˜ํ™” ๋ชฉ๋ก + */ export const getMoviePopular = async (page: number = 1) => { try { const res = await axiosInstance.get('movie/popular', { @@ -74,7 +100,11 @@ export const getMoviePopular = async (page: number = 1) => { } }; -// Korea Movie +/** + * ํ•œ๊ตญ ์˜ํ™” ๋ชฉ๋ก ์กฐํšŒ + * ์›๋ณธ ์–ธ์–ด๊ฐ€ ํ•œ๊ตญ์–ด์ธ ์˜ํ™”๋งŒ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. + * @returns ํ•œ๊ตญ ์˜ํ™” ๋ชฉ๋ก + */ export const getKoreaMovie = async () => { try { const res = await axiosInstance.get('/discover/movie', { @@ -87,28 +117,18 @@ export const getKoreaMovie = async () => { } }; -// Search -export const searchMulti = async (query: string, page: number = 1) => { - try { - const res = await axiosInstance.get('/search/multi', { - params: { query, language: 'ko-KR', page, include_adult: 'false' }, - }); - return res.data; - } catch (err) { - console.error('searchMulti data error', err); - return { results: [] }; - } -}; - -// Overview Movie -export const getDetail = async (media_type: string, id: string) => { +/** + * ํ‰์ ์ด ๋†’์€ ์˜ํ™” ๋ชฉ๋ก ์กฐํšŒ (Top Rated ์„น์…˜์šฉ) + * @returns ๋†’์€ ํ‰์ ์˜ ์˜ํ™” ๋ชฉ๋ก + */ +export const getTopRatedMovies = async () => { try { - const res = await axiosInstance.get(`/${media_type}/${id}`, { + const res = await axiosInstance.get('/movie/top_rated', { params: { language: 'ko-KR' }, }); return res.data; } catch (err) { - console.error('getDetail data error', err); - return null; + console.error('getTopRatedMovies data error', err); + return { results: [] }; } }; diff --git a/app/apis/search.ts b/app/apis/search.ts new file mode 100644 index 0000000..08d01dc --- /dev/null +++ b/app/apis/search.ts @@ -0,0 +1,24 @@ +/** + * ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€ ์ „์šฉ TMDB API ํ•จ์ˆ˜ + * ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์— ์‚ฌ์šฉ๋˜๋Š” API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. + */ + +import { axiosInstance } from '@/app/apis/axiosInstance'; + +/** + * ํ†ตํ•ฉ ๊ฒ€์ƒ‰ (์˜ํ™” + TV ํ”„๋กœ๊ทธ๋žจ + ์ธ๋ฌผ) + * @param query - ๊ฒ€์ƒ‰์–ด + * @param page - ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ (๊ธฐ๋ณธ๊ฐ’: 1) + * @returns ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ (์˜ํ™”, TV, ์ธ๋ฌผ ํฌํ•จ) + */ +export const searchMulti = async (query: string, page: number = 1) => { + try { + const res = await axiosInstance.get('/search/multi', { + params: { query, language: 'ko-KR', page, include_adult: 'false' }, + }); + return res.data; + } catch (err) { + console.error('searchMulti data error', err); + return { results: [] }; + } +}; From c7d958a382c220842d59655722c16e87197b6f8c Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 1 Nov 2025 16:48:21 +0900 Subject: [PATCH 16/57] =?UTF-8?q?#7=20[FEAT]=20=EA=B2=BD=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {app/apis => apis}/axiosInstance.ts | 0 {app/apis => apis}/detail.ts | 2 +- {app/apis => apis}/home.ts | 2 +- {app/apis => apis}/search.ts | 2 +- app/components/home/Prieview.tsx | 0 app/components/navigation/BottomNav.tsx | 62 ------------------ app/components/navigation/Header.tsx | 25 ------- public/{assets => }/fonts/SFProDisplay.woff2 | Bin .../navigation/comingSoonIcon.svg | 0 .../svgs => svgs}/navigation/downloadIcon.svg | 0 .../svgs => svgs}/navigation/homeIcon.svg | 0 .../svgs => svgs}/navigation/moreIcon.svg | 0 .../svgs => svgs}/navigation/netflixIcon.svg | 0 .../svgs => svgs}/navigation/searchIcon.svg | 0 {app/types => types}/tmdb.ts | 0 15 files changed, 3 insertions(+), 90 deletions(-) rename {app/apis => apis}/axiosInstance.ts (100%) rename {app/apis => apis}/detail.ts (91%) rename {app/apis => apis}/home.ts (98%) rename {app/apis => apis}/search.ts (91%) delete mode 100644 app/components/home/Prieview.tsx delete mode 100644 app/components/navigation/BottomNav.tsx delete mode 100644 app/components/navigation/Header.tsx rename public/{assets => }/fonts/SFProDisplay.woff2 (100%) rename {app/assets/svgs => svgs}/navigation/comingSoonIcon.svg (100%) rename {app/assets/svgs => svgs}/navigation/downloadIcon.svg (100%) rename {app/assets/svgs => svgs}/navigation/homeIcon.svg (100%) rename {app/assets/svgs => svgs}/navigation/moreIcon.svg (100%) rename {app/assets/svgs => svgs}/navigation/netflixIcon.svg (100%) rename {app/assets/svgs => svgs}/navigation/searchIcon.svg (100%) rename {app/types => types}/tmdb.ts (100%) diff --git a/app/apis/axiosInstance.ts b/apis/axiosInstance.ts similarity index 100% rename from app/apis/axiosInstance.ts rename to apis/axiosInstance.ts diff --git a/app/apis/detail.ts b/apis/detail.ts similarity index 91% rename from app/apis/detail.ts rename to apis/detail.ts index cc81c5b..9c01ad5 100644 --- a/app/apis/detail.ts +++ b/apis/detail.ts @@ -3,7 +3,7 @@ * ํŠน์ • ๋ฏธ๋””์–ด์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋Š” API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. */ -import { axiosInstance } from '@/app/apis/axiosInstance'; +import { axiosInstance } from '@/apis/axiosInstance'; /** * ํŠน์ • ๋ฏธ๋””์–ด์˜ ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ diff --git a/app/apis/home.ts b/apis/home.ts similarity index 98% rename from app/apis/home.ts rename to apis/home.ts index 42f4f38..8170b48 100644 --- a/app/apis/home.ts +++ b/apis/home.ts @@ -3,7 +3,7 @@ * ํ™ˆ ํŽ˜์ด์ง€์˜ ๊ฐ ์„น์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์˜ํ™” ๋ฐ TV ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. */ -import { axiosInstance } from '@/app/apis/axiosInstance'; +import { axiosInstance } from '@/apis/axiosInstance'; /** * ์˜ค๋Š˜์˜ ํŠธ๋ Œ๋”ฉ ์ฝ˜ํ…์ธ  (์˜ํ™” + TV ํ”„๋กœ๊ทธ๋žจ) diff --git a/app/apis/search.ts b/apis/search.ts similarity index 91% rename from app/apis/search.ts rename to apis/search.ts index 08d01dc..e55000e 100644 --- a/app/apis/search.ts +++ b/apis/search.ts @@ -3,7 +3,7 @@ * ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์— ์‚ฌ์šฉ๋˜๋Š” API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. */ -import { axiosInstance } from '@/app/apis/axiosInstance'; +import { axiosInstance } from '@/apis/axiosInstance'; /** * ํ†ตํ•ฉ ๊ฒ€์ƒ‰ (์˜ํ™” + TV ํ”„๋กœ๊ทธ๋žจ + ์ธ๋ฌผ) diff --git a/app/components/home/Prieview.tsx b/app/components/home/Prieview.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/app/components/navigation/BottomNav.tsx b/app/components/navigation/BottomNav.tsx deleted file mode 100644 index 8b1fc5e..0000000 --- a/app/components/navigation/BottomNav.tsx +++ /dev/null @@ -1,62 +0,0 @@ -'use client'; - -import Link from 'next/link'; -import { usePathname } from 'next/navigation'; - -import ComingSoonIcon from '@/app/assets/svgs/navigation/comingSoonIcon.svg'; -import DownloadIcon from '@/app/assets/svgs/navigation/downloadIcon.svg'; -import HomeIcon from '@/app/assets/svgs/navigation/homeIcon.svg'; -import MoreIcon from '@/app/assets/svgs/navigation/moreIcon.svg'; -import SearchIcon from '@/app/assets/svgs/navigation/searchIcon.svg'; - -const BottomNav = () => { - const pathname = usePathname(); - - // ๋žœ๋”ฉํŽ˜์ด์ง€์—์„œ๋Š” BottomNav๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์Œ - if (pathname === '/') { - return null; - } - - const menuItems = [ - { href: '/home', label: 'Home', Icon: HomeIcon }, - { href: '/search', label: 'Search', Icon: SearchIcon }, - { href: '/downloads', label: 'Downloads', Icon: DownloadIcon }, - { href: '/comingsoon', label: 'Coming Soon', Icon: ComingSoonIcon }, - { href: '/more', label: 'More', Icon: MoreIcon }, - ]; - - const isActive = (href: string) => { - if (href === '/home' && (pathname === '/' || pathname === '/home')) return true; - if (href !== '/home' && pathname.startsWith(href)) return true; - return false; - }; - - return ( - - ); -}; - -export default BottomNav; diff --git a/app/components/navigation/Header.tsx b/app/components/navigation/Header.tsx deleted file mode 100644 index 6f666dc..0000000 --- a/app/components/navigation/Header.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import NetflixIcon from '@/app/assets/svgs/navigation/netflixIcon.svg'; - -const Header = () => { - return ( -
-
- {/* ์™ผ์ชฝ: Netflix ์•„์ด์ฝ˜ */} -
- -
- - {/* ์˜ค๋ฅธ์ชฝ: ๋ฉ”๋‰ด ํ…์ŠคํŠธ๋“ค */} -
- - TV Shows - - Movies - My List -
-
-
- ); -}; - -export default Header; diff --git a/public/assets/fonts/SFProDisplay.woff2 b/public/fonts/SFProDisplay.woff2 similarity index 100% rename from public/assets/fonts/SFProDisplay.woff2 rename to public/fonts/SFProDisplay.woff2 diff --git a/app/assets/svgs/navigation/comingSoonIcon.svg b/svgs/navigation/comingSoonIcon.svg similarity index 100% rename from app/assets/svgs/navigation/comingSoonIcon.svg rename to svgs/navigation/comingSoonIcon.svg diff --git a/app/assets/svgs/navigation/downloadIcon.svg b/svgs/navigation/downloadIcon.svg similarity index 100% rename from app/assets/svgs/navigation/downloadIcon.svg rename to svgs/navigation/downloadIcon.svg diff --git a/app/assets/svgs/navigation/homeIcon.svg b/svgs/navigation/homeIcon.svg similarity index 100% rename from app/assets/svgs/navigation/homeIcon.svg rename to svgs/navigation/homeIcon.svg diff --git a/app/assets/svgs/navigation/moreIcon.svg b/svgs/navigation/moreIcon.svg similarity index 100% rename from app/assets/svgs/navigation/moreIcon.svg rename to svgs/navigation/moreIcon.svg diff --git a/app/assets/svgs/navigation/netflixIcon.svg b/svgs/navigation/netflixIcon.svg similarity index 100% rename from app/assets/svgs/navigation/netflixIcon.svg rename to svgs/navigation/netflixIcon.svg diff --git a/app/assets/svgs/navigation/searchIcon.svg b/svgs/navigation/searchIcon.svg similarity index 100% rename from app/assets/svgs/navigation/searchIcon.svg rename to svgs/navigation/searchIcon.svg diff --git a/app/types/tmdb.ts b/types/tmdb.ts similarity index 100% rename from app/types/tmdb.ts rename to types/tmdb.ts From 7ade7aff26a2cdd3d4df723cbabadc107db93778 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 1 Nov 2025 16:48:53 +0900 Subject: [PATCH 17/57] =?UTF-8?q?#7=20[FEAT]=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=20URL=20=EC=83=81=EC=88=98=20=ED=8C=8C=EC=9D=BC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- constants/imageURL.ts | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 constants/imageURL.ts diff --git a/constants/imageURL.ts b/constants/imageURL.ts new file mode 100644 index 0000000..b1e9700 --- /dev/null +++ b/constants/imageURL.ts @@ -0,0 +1,32 @@ +/** + * TMDB ์ด๋ฏธ์ง€ URL ์ƒ์ˆ˜ + * The Movie Database (TMDB)์—์„œ ์ œ๊ณตํ•˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ URL๊ณผ ์‚ฌ์ด์ฆˆ + */ + +export const IMAGE_BASE_URL = 'https://image.tmdb.org/t/p/'; + +/** + * TMDB ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ ์˜ต์…˜ + * - w92: 92px ๋„ˆ๋น„ (์ธ๋„ค์ผ) + * - w154: 154px ๋„ˆ๋น„ (์ž‘์€ ํฌ์Šคํ„ฐ) + * - w185: 185px ๋„ˆ๋น„ + * - w342: 342px ๋„ˆ๋น„ (์ค‘๊ฐ„ ํฌ์Šคํ„ฐ) + * - w500: 500px ๋„ˆ๋น„ (์ผ๋ฐ˜ ํฌ์Šคํ„ฐ) + * - w780: 780px ๋„ˆ๋น„ (ํฐ ํฌ์Šคํ„ฐ) + * - original: ์›๋ณธ ์‚ฌ์ด์ฆˆ + */ +export const IMAGE_SIZE = { + SMALL: 'w154', + MEDIUM: 'w342', + LARGE: 'w500', + XLARGE: 'w780', + ORIGINAL: 'original', +} as const; + +/** + * ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฏธ์ง€ URL ์ƒ์„ฑ ํ—ฌํผ + */ +export const getImageUrl = (path: string | null, size: keyof typeof IMAGE_SIZE = 'LARGE'): string => { + if (!path) return ''; + return `${IMAGE_BASE_URL}${IMAGE_SIZE[size]}${path}`; +}; From c78f14b3495f81e0e8672bf1611145c9a150e753 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 1 Nov 2025 16:52:24 +0900 Subject: [PATCH 18/57] =?UTF-8?q?#7=20[FEAT]=20=EB=A0=88=EC=9D=B4=EC=95=84?= =?UTF-8?q?=EC=9B=83=20=EC=8A=A4=ED=81=AC=EB=A1=A4=EB=B0=94=20HIDE=20?= =?UTF-8?q?=EC=98=B5=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/globals.css | 48 +++++++++++++++++++++++++++++++++++++++++++++++- app/layout.tsx | 6 +++--- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/app/globals.css b/app/globals.css index a9d9c5f..5789cfb 100644 --- a/app/globals.css +++ b/app/globals.css @@ -5,7 +5,7 @@ @font-face { font-family: 'SF Pro Display'; font-display: swap; - src: url('/assets/fonts/SFProDisplay.woff2') format('woff2'); + src: url('/fonts/SFProDisplay.woff2') format('woff2'); } /* Base style */ @@ -159,3 +159,49 @@ scrollbar-width: none; } } + +/* Swiper ์ปค์Šคํ…€ ์Šคํƒ€์ผ */ +.movie-swiper { + padding: 0 12px 0 16px; +} + +.movie-swiper .swiper-wrapper { + padding: 8px 0; +} + +/* Swiper ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฒ„ํŠผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• */ +.movie-swiper .swiper-button-prev, +.movie-swiper .swiper-button-next { + width: 40px; + height: 40px; + background-color: rgba(0, 0, 0, 0.7); + border-radius: 50%; + color: white; + transition: all 0.3s ease; +} + +.movie-swiper .swiper-button-prev:hover, +.movie-swiper .swiper-button-next:hover { + background-color: rgba(0, 0, 0, 0.9); + transform: scale(1.1); +} + +.movie-swiper .swiper-button-prev::after, +.movie-swiper .swiper-button-next::after { + font-size: 16px; + font-weight: bold; +} + +/* ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฒ„ํŠผ์ด ๋น„ํ™œ์„ฑํ™”๋˜์—ˆ์„ ๋•Œ ์ˆจ๊น€ */ +.movie-swiper .swiper-button-disabled { + opacity: 0; + pointer-events: none; +} + +/* ๋ชจ๋ฐ”์ผ์—์„œ๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฒ„ํŠผ ์ˆจ๊น€ */ +@media (max-width: 768px) { + .movie-swiper .swiper-button-prev, + .movie-swiper .swiper-button-next { + display: none; + } +} diff --git a/app/layout.tsx b/app/layout.tsx index 5d135eb..d1383aa 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -2,7 +2,7 @@ import './globals.css'; import type { Metadata } from 'next'; -import BottomNav from './components/navigation/BottomNav'; +import BottomNav from '@/components/navigation/BottomNav'; export const metadata: Metadata = { title: 'Netflix', @@ -16,8 +16,8 @@ const RootLayout = ({ children }: { children: React.ReactNode }) => { return ( -
- {children} +
+
{children}
From 11a59b2ffc03074814cc081ef32b502c253ab872 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 1 Nov 2025 16:53:27 +0900 Subject: [PATCH 19/57] =?UTF-8?q?#7=20[REFACTOR]=20=ED=97=A4=EB=8D=94,=20?= =?UTF-8?q?=ED=95=98=EB=8B=A8=EB=B0=94=20=EA=B2=BD=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/navigation/BottomNav.tsx | 62 +++++++++++++++++++++++++++++ components/navigation/Header.tsx | 25 ++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 components/navigation/BottomNav.tsx create mode 100644 components/navigation/Header.tsx diff --git a/components/navigation/BottomNav.tsx b/components/navigation/BottomNav.tsx new file mode 100644 index 0000000..a4a251b --- /dev/null +++ b/components/navigation/BottomNav.tsx @@ -0,0 +1,62 @@ +'use client'; + +import Link from 'next/link'; +import { usePathname } from 'next/navigation'; + +import ComingSoonIcon from '@/svgs/navigation/comingSoonIcon.svg'; +import DownloadIcon from '@/svgs/navigation/downloadIcon.svg'; +import HomeIcon from '@/svgs/navigation/homeIcon.svg'; +import MoreIcon from '@/svgs/navigation/moreIcon.svg'; +import SearchIcon from '@/svgs/navigation/searchIcon.svg'; + +const BottomNav = () => { + const pathname = usePathname(); + + // ๋žœ๋”ฉํŽ˜์ด์ง€์—์„œ๋Š” BottomNav๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์Œ + if (pathname === '/') { + return null; + } + + const menuItems = [ + { href: '/home', label: 'Home', Icon: HomeIcon }, + { href: '/search', label: 'Search', Icon: SearchIcon }, + { href: '/downloads', label: 'Downloads', Icon: DownloadIcon }, + { href: '/comingsoon', label: 'Coming Soon', Icon: ComingSoonIcon }, + { href: '/more', label: 'More', Icon: MoreIcon }, + ]; + + const isActive = (href: string) => { + if (href === '/home' && (pathname === '/' || pathname === '/home')) return true; + if (href !== '/home' && pathname.startsWith(href)) return true; + return false; + }; + + return ( + + ); +}; + +export default BottomNav; diff --git a/components/navigation/Header.tsx b/components/navigation/Header.tsx new file mode 100644 index 0000000..12f3413 --- /dev/null +++ b/components/navigation/Header.tsx @@ -0,0 +1,25 @@ +import NetflixIcon from '@/svgs/navigation/netflixIcon.svg'; + +const Header = () => { + return ( +
+
+ {/* ์™ผ์ชฝ: Netflix ์•„์ด์ฝ˜ */} +
+ +
+ + {/* ์˜ค๋ฅธ์ชฝ: ๋ฉ”๋‰ด ํ…์ŠคํŠธ๋“ค */} +
+ + TV Shows + + Movies + My List +
+
+
+ ); +}; + +export default Header; From a142a15d127134530b909cade9be33af56a9be52 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 1 Nov 2025 16:54:27 +0900 Subject: [PATCH 20/57] =?UTF-8?q?#7=20[CHORE]=20react-Swiper=20=EC=82=AC?= =?UTF-8?q?=EC=A0=84=20=EC=84=A4=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 22 +++++++++++++++++++++- package.json | 3 ++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 795d908..4fc4691 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,8 @@ "lottie-react": "^2.4.1", "next": "16.0.1", "react": "19.2.0", - "react-dom": "19.2.0" + "react-dom": "19.2.0", + "swiper": "^12.0.3" }, "devDependencies": { "@svgr/webpack": "^8.1.0", @@ -8493,6 +8494,25 @@ "url": "https://opencollective.com/svgo" } }, + "node_modules/swiper": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-12.0.3.tgz", + "integrity": "sha512-BHd6U1VPEIksrXlyXjMmRWO0onmdNPaTAFduzqR3pgjvi7KfmUCAm/0cj49u2D7B0zNjMw02TSeXfinC1hDCXg==", + "funding": [ + { + "type": "patreon", + "url": "https://www.patreon.com/swiperjs" + }, + { + "type": "open_collective", + "url": "http://opencollective.com/swiper" + } + ], + "license": "MIT", + "engines": { + "node": ">= 4.7.0" + } + }, "node_modules/synckit": { "version": "0.11.11", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", diff --git a/package.json b/package.json index 6cb9945..80a30b6 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,8 @@ "lottie-react": "^2.4.1", "next": "16.0.1", "react": "19.2.0", - "react-dom": "19.2.0" + "react-dom": "19.2.0", + "swiper": "^12.0.3" }, "devDependencies": { "@svgr/webpack": "^8.1.0", From 82d9cf7b753862dc0db8beed75284565e2fbae42 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 1 Nov 2025 16:58:42 +0900 Subject: [PATCH 21/57] =?UTF-8?q?#7=20[CHORE]=20=ED=99=88=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/home/page.tsx b/app/home/page.tsx index 98459ee..1f6af57 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -1,4 +1,4 @@ -import Header from '@/app/components/navigation/Header'; +import Header from '@/components/navigation/Header'; const HomePage = () => { return ( From 99a9a5393ffab8a8a12becec1dadf656dfe41aca Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 1 Nov 2025 17:12:10 +0900 Subject: [PATCH 22/57] =?UTF-8?q?#9=20[FEAT]=20=ED=99=88=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=ED=95=98=EB=8B=A8=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/page.tsx | 21 ++++++- components/home/GenrePreview.tsx | 36 ++++++++++++ components/home/KoreaMovie.tsx | 35 ++++++++++++ components/home/MovieSwiper.tsx | 89 +++++++++++++++++++++++++++++ components/home/NetflixOriginal.tsx | 36 ++++++++++++ components/home/Preview.tsx | 35 ++++++++++++ components/home/TopRatedMovies.tsx | 35 ++++++++++++ 7 files changed, 285 insertions(+), 2 deletions(-) create mode 100644 components/home/GenrePreview.tsx create mode 100644 components/home/KoreaMovie.tsx create mode 100644 components/home/MovieSwiper.tsx create mode 100644 components/home/NetflixOriginal.tsx create mode 100644 components/home/Preview.tsx create mode 100644 components/home/TopRatedMovies.tsx diff --git a/app/home/page.tsx b/app/home/page.tsx index 1f6af57..6335651 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -1,10 +1,27 @@ +/** + * ํ™ˆ ํŽ˜์ด์ง€ + * ๋„ทํ”Œ๋ฆญ์Šค ํด๋ก ์˜ ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ, ๋‹ค์–‘ํ•œ ์˜ํ™” ๋ฐ TV ํ”„๋กœ๊ทธ๋žจ ์„น์…˜์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. + */ + +import GenrePreview from '@/components/home/GenrePreview'; +import KoreaMovie from '@/components/home/KoreaMovie'; +import NetflixOriginal from '@/components/home/NetflixOriginal'; +import Preview from '@/components/home/Preview'; +import TopRatedMovies from '@/components/home/TopRatedMovies'; import Header from '@/components/navigation/Header'; const HomePage = () => { return ( -
+
-
Home
+ {/* ์„น์…˜ ์ปจํ…Œ์ด๋„ˆ */} +
+ + + + + +
); }; diff --git a/components/home/GenrePreview.tsx b/components/home/GenrePreview.tsx new file mode 100644 index 0000000..38ac090 --- /dev/null +++ b/components/home/GenrePreview.tsx @@ -0,0 +1,36 @@ +'use client'; + +/** + * GenrePreview ์„น์…˜ ์ปดํฌ๋„ŒํŠธ + * ํŠน์ • ์žฅ๋ฅด์˜ ์˜ํ™”๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. + */ + +import { useEffect, useState } from 'react'; + +import { getMoviesByGenre } from '@/apis/home'; +import MovieSwiper from '@/components/home/MovieSwiper'; +import { Movie } from '@/types/tmdb'; + +const GenrePreview = () => { + const [movies, setMovies] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchMovies = async () => { + // ์•ก์…˜(28), ๋ชจํ—˜(12) ์žฅ๋ฅด ์กฐํ•ฉ + const response = await getMoviesByGenre('28,12'); + setMovies(response.results); + setLoading(false); + }; + + fetchMovies(); + }, []); + + if (loading) { + return null; + } + + return ; +}; + +export default GenrePreview; diff --git a/components/home/KoreaMovie.tsx b/components/home/KoreaMovie.tsx new file mode 100644 index 0000000..9d7e452 --- /dev/null +++ b/components/home/KoreaMovie.tsx @@ -0,0 +1,35 @@ +'use client'; + +/** + * KoreaMovie ์„น์…˜ ์ปดํฌ๋„ŒํŠธ + * ํ•œ๊ตญ ์˜ํ™”๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. + */ + +import { useEffect, useState } from 'react'; + +import { getKoreaMovie } from '@/apis/home'; +import MovieSwiper from '@/components/home/MovieSwiper'; +import { Movie } from '@/types/tmdb'; + +const KoreaMovie = () => { + const [movies, setMovies] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchMovies = async () => { + const response = await getKoreaMovie(); + setMovies(response.results); + setLoading(false); + }; + + fetchMovies(); + }, []); + + if (loading) { + return null; + } + + return ; +}; + +export default KoreaMovie; diff --git a/components/home/MovieSwiper.tsx b/components/home/MovieSwiper.tsx new file mode 100644 index 0000000..4cbfc8d --- /dev/null +++ b/components/home/MovieSwiper.tsx @@ -0,0 +1,89 @@ +'use client'; + +/** + * MovieSwiper ์ปดํฌ๋„ŒํŠธ + * Swiper ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ํ™”/TV ํ”„๋กœ๊ทธ๋žจ ๋ชฉ๋ก์„ ๊ฐ€๋กœ ์Šคํฌ๋กค ํ˜•ํƒœ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. + */ + +import 'swiper/css'; +import 'swiper/css/free-mode'; +import 'swiper/css/navigation'; + +import Image from 'next/image'; +import { FreeMode, Navigation } from 'swiper/modules'; +import { Swiper, SwiperSlide } from 'swiper/react'; + +import { getImageUrl } from '@/constants/imageURL'; +import { Movie, TV } from '@/types/tmdb'; + +/** + * MovieSwiper Props ์ธํ„ฐํŽ˜์ด์Šค + */ +interface MovieSwiperProps { + title: string; // ์„น์…˜ ์ œ๋ชฉ + items: Movie[] | TV[]; // ์˜ํ™” ๋˜๋Š” TV ํ”„๋กœ๊ทธ๋žจ ๋ฐฐ์—ด + itemWidth: string; // ๊ฐ ์•„์ดํ…œ์˜ ๋„ˆ๋น„ (์˜ˆ: "103px") + itemHeight: string; // ๊ฐ ์•„์ดํ…œ์˜ ๋†’์ด (์˜ˆ: "161px") + shape?: 'rectangle' | 'circle'; // ์•„์ดํ…œ ๋ชจ์–‘ (๊ธฐ๋ณธ๊ฐ’: rectangle) +} + +/** + * ์˜ํ™”/TV ํ”„๋กœ๊ทธ๋žจ ์ œ๋ชฉ ์ถ”์ถœ ํ—ฌํผ ํ•จ์ˆ˜ + */ +const getTitle = (item: Movie | TV): string => { + return 'title' in item ? item.title : item.name; +}; + +const MovieSwiper = ({ title, items, itemWidth, itemHeight, shape = 'rectangle' }: MovieSwiperProps) => { + return ( +
+ {/* ์„น์…˜ ์ œ๋ชฉ */} +

{title}

+ + {/* Swiper ์ปจํ…Œ์ด๋„ˆ */} + + {items.map((item) => ( + +
+ {item.poster_path ? ( + {getTitle(item)} + ) : ( + // poster_path๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ํ”Œ๋ ˆ์ด์Šคํ™€๋” +
No Image
+ )} +
+
+ ))} +
+
+ ); +}; + +export default MovieSwiper; diff --git a/components/home/NetflixOriginal.tsx b/components/home/NetflixOriginal.tsx new file mode 100644 index 0000000..f83125f --- /dev/null +++ b/components/home/NetflixOriginal.tsx @@ -0,0 +1,36 @@ +'use client'; + +/** + * NetflixOriginal ์„น์…˜ ์ปดํฌ๋„ŒํŠธ + * ๋„ทํ”Œ๋ฆญ์Šค ์˜ค๋ฆฌ์ง€๋„ TV ํ”„๋กœ๊ทธ๋žจ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. + */ + +import { useEffect, useState } from 'react'; + +import { getTVByNetwork } from '@/apis/home'; +import MovieSwiper from '@/components/home/MovieSwiper'; +import { TV } from '@/types/tmdb'; + +const NetflixOriginal = () => { + const [tvShows, setTvShows] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchTVShows = async () => { + // Netflix ๋„คํŠธ์›Œํฌ ID: 213 + const response = await getTVByNetwork(213); + setTvShows(response.results); + setLoading(false); + }; + + fetchTVShows(); + }, []); + + if (loading) { + return null; + } + + return ; +}; + +export default NetflixOriginal; diff --git a/components/home/Preview.tsx b/components/home/Preview.tsx new file mode 100644 index 0000000..596f5ee --- /dev/null +++ b/components/home/Preview.tsx @@ -0,0 +1,35 @@ +'use client'; + +/** + * Preview ์„น์…˜ ์ปดํฌ๋„ŒํŠธ + * ์ธ๊ธฐ ์˜ํ™”๋ฅผ ์›ํ˜• ์ด๋ฏธ์ง€๋กœ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ˜•ํƒœ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. + */ + +import { useEffect, useState } from 'react'; + +import { getMoviePopular } from '@/apis/home'; +import MovieSwiper from '@/components/home/MovieSwiper'; +import { Movie } from '@/types/tmdb'; + +const Preview = () => { + const [movies, setMovies] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchMovies = async () => { + const response = await getMoviePopular(); + setMovies(response.results); + setLoading(false); + }; + + fetchMovies(); + }, []); + + if (loading) { + return null; + } + + return ; +}; + +export default Preview; diff --git a/components/home/TopRatedMovies.tsx b/components/home/TopRatedMovies.tsx new file mode 100644 index 0000000..bc84f8d --- /dev/null +++ b/components/home/TopRatedMovies.tsx @@ -0,0 +1,35 @@ +'use client'; + +/** + * TopRatedMovies ์„น์…˜ ์ปดํฌ๋„ŒํŠธ + * ๋†’์€ ํ‰์ ์˜ ์˜ํ™”๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. + */ + +import { useEffect, useState } from 'react'; + +import { getTopRatedMovies } from '@/apis/home'; +import MovieSwiper from '@/components/home/MovieSwiper'; +import { Movie } from '@/types/tmdb'; + +const TopRatedMovies = () => { + const [movies, setMovies] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchMovies = async () => { + const response = await getTopRatedMovies(); + setMovies(response.results); + setLoading(false); + }; + + fetchMovies(); + }, []); + + if (loading) { + return null; + } + + return ; +}; + +export default TopRatedMovies; From fd5d7a55e6940233183e4dbf6b542cb8f95178f3 Mon Sep 17 00:00:00 2001 From: jungyungee Date: Sat, 1 Nov 2025 18:37:42 +0900 Subject: [PATCH 23/57] =?UTF-8?q?#11=20[FEAT]=20=ED=99=88=20=EC=83=81?= =?UTF-8?q?=EB=8B=A8=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20API=20?= =?UTF-8?q?=EC=97=B0=EB=8F=99=20=EB=B0=8F=20=EC=82=AC=EC=86=8C=ED=95=9C=20?= =?UTF-8?q?UI=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/page.tsx | 4 +- components/home/MovieSwiper.tsx | 2 +- components/home/TrendingMovie.tsx | 100 ++++++++++++++++++++++++++++++ components/navigation/Header.tsx | 2 +- package-lock.json | 58 +++++++++++++++++ package.json | 1 + 6 files changed, 164 insertions(+), 3 deletions(-) create mode 100644 components/home/TrendingMovie.tsx diff --git a/app/home/page.tsx b/app/home/page.tsx index 6335651..5e55796 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -8,14 +8,16 @@ import KoreaMovie from '@/components/home/KoreaMovie'; import NetflixOriginal from '@/components/home/NetflixOriginal'; import Preview from '@/components/home/Preview'; import TopRatedMovies from '@/components/home/TopRatedMovies'; +import TrendingAll from '@/components/home/TrendingMovie'; import Header from '@/components/navigation/Header'; const HomePage = () => { return (
+ {/* ์„น์…˜ ์ปจํ…Œ์ด๋„ˆ */} -
+
diff --git a/components/home/MovieSwiper.tsx b/components/home/MovieSwiper.tsx index 4cbfc8d..b6f7717 100644 --- a/components/home/MovieSwiper.tsx +++ b/components/home/MovieSwiper.tsx @@ -38,7 +38,7 @@ const MovieSwiper = ({ title, items, itemWidth, itemHeight, shape = 'rectangle' return (
{/* ์„น์…˜ ์ œ๋ชฉ */} -

{title}

+

{title}

{/* Swiper ์ปจํ…Œ์ด๋„ˆ */} { + const [items, setItems] = useState([]); + const [currentIndex, setCurrentIndex] = useState(0); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchTrending = async () => { + try { + const response = await getTrendingAllDay(); + setItems(response.results); + } catch (error) { + console.error('Failed to fetch trending data:', error); + } finally { + setLoading(false); + } + }; + + fetchTrending(); + }, []); + + // 5์ดˆ๋งˆ๋‹ค ์ž๋™ ์ „ํ™˜ + useEffect(() => { + if (!items.length) return; + const interval = setInterval(() => { + setCurrentIndex((prev) => (prev + 1) % items.length); + }, 5000); + return () => clearInterval(interval); + }, [items]); + + if (loading || items.length === 0) return null; + + const currentItem = items[currentIndex]; + + return ( +
+ {/* ํฌ์Šคํ„ฐ ์˜์—ญ */} +
+ + + {currentItem.poster_path ? ( + {currentItem.title + ) : ( +
+ No Image +
+ )} +
+
+
+ + {/* ์ˆœ์œ„ ํ‘œ์‹œ */} +
+ + + #{currentIndex + 1} + + +
+
+ ); +}; + +export default TrendingMovie; diff --git a/components/navigation/Header.tsx b/components/navigation/Header.tsx index 12f3413..fd332bd 100644 --- a/components/navigation/Header.tsx +++ b/components/navigation/Header.tsx @@ -2,7 +2,7 @@ import NetflixIcon from '@/svgs/navigation/netflixIcon.svg'; const Header = () => { return ( -
+
{/* ์™ผ์ชฝ: Netflix ์•„์ด์ฝ˜ */}
diff --git a/package-lock.json b/package-lock.json index 4fc4691..2ee1ab3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.1.0", "dependencies": { "axios": "^1.13.1", + "framer-motion": "^12.23.24", "lottie-react": "^2.4.1", "next": "16.0.1", "react": "19.2.0", @@ -77,6 +78,7 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2865,6 +2867,7 @@ "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -3305,6 +3308,7 @@ "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -3365,6 +3369,7 @@ "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.2", "@typescript-eslint/types": "8.46.2", @@ -3895,6 +3900,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4302,6 +4308,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.19", "caniuse-lite": "^1.0.30001751", @@ -5131,6 +5138,7 @@ "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -5231,6 +5239,7 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -5332,6 +5341,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -5790,6 +5800,33 @@ "node": ">= 6" } }, + "node_modules/framer-motion": { + "version": "12.23.24", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.24.tgz", + "integrity": "sha512-HMi5HRoRCTou+3fb3h9oTLyJGBxHfW+HnNE25tAXOvVx/IvwMHK0cx7IR4a2ZU6sh3IX1Z+4ts32PcYBOqka8w==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.23.23", + "motion-utils": "^12.23.6", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -7189,6 +7226,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/motion-dom": { + "version": "12.23.23", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.23.tgz", + "integrity": "sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.23.6" + } + }, + "node_modules/motion-utils": { + "version": "12.23.6", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz", + "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==", + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -7682,6 +7734,7 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -7759,6 +7812,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -7768,6 +7822,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -8591,6 +8646,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8753,6 +8809,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9072,6 +9129,7 @@ "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 80a30b6..20dfad5 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "axios": "^1.13.1", + "framer-motion": "^12.23.24", "lottie-react": "^2.4.1", "next": "16.0.1", "react": "19.2.0", From 0da804bbfb8bd8cc6e67e53de5340b3f31c4d6d6 Mon Sep 17 00:00:00 2001 From: jungyungee Date: Sat, 1 Nov 2025 18:45:21 +0900 Subject: [PATCH 24/57] =?UTF-8?q?#11=20[FIX]=20=EC=95=84=EC=9D=B4=ED=85=9C?= =?UTF-8?q?=2010=EA=B0=9C=20=EC=8A=AC=EB=9D=BC=EC=9D=B4=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/home/TrendingMovie.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/home/TrendingMovie.tsx b/components/home/TrendingMovie.tsx index 4ce94a1..585ddcb 100644 --- a/components/home/TrendingMovie.tsx +++ b/components/home/TrendingMovie.tsx @@ -23,7 +23,7 @@ const TrendingMovie = () => { const fetchTrending = async () => { try { const response = await getTrendingAllDay(); - setItems(response.results); + setItems(response.results.slice(0, 10)); // ์ƒ์œ„ 10๊ฐœ ์•„์ดํ…œ๋งŒ ์‚ฌ์šฉ } catch (error) { console.error('Failed to fetch trending data:', error); } finally { From 930d3b0b1d3ce6fb60a7cf3b568f857a4c7d4118 Mon Sep 17 00:00:00 2001 From: jungyungee Date: Sat, 1 Nov 2025 20:07:58 +0900 Subject: [PATCH 25/57] =?UTF-8?q?#11=20[CHORE]=20=EA=B7=B8=EB=9D=BC?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=EC=85=98=20=EC=A0=81=EC=9A=A9=20=EB=B0=8F=20?= =?UTF-8?q?=EB=AC=B8=EA=B5=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/home/TrendingMovie.tsx | 42 +++++++++++++------------------ 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/components/home/TrendingMovie.tsx b/components/home/TrendingMovie.tsx index 585ddcb..e51b4b2 100644 --- a/components/home/TrendingMovie.tsx +++ b/components/home/TrendingMovie.tsx @@ -21,14 +21,9 @@ const TrendingMovie = () => { useEffect(() => { const fetchTrending = async () => { - try { - const response = await getTrendingAllDay(); - setItems(response.results.slice(0, 10)); // ์ƒ์œ„ 10๊ฐœ ์•„์ดํ…œ๋งŒ ์‚ฌ์šฉ - } catch (error) { - console.error('Failed to fetch trending data:', error); - } finally { - setLoading(false); - } + const response = await getTrendingAllDay(); + setItems(response.results.slice(0, 10)); // ์ƒ์œ„ 10๊ฐœ ์•„์ดํ…œ๋งŒ ์‚ฌ์šฉ + setLoading(false); }; fetchTrending(); @@ -44,7 +39,6 @@ const TrendingMovie = () => { }, [items]); if (loading || items.length === 0) return null; - const currentItem = items[currentIndex]; return ( @@ -74,24 +68,24 @@ const TrendingMovie = () => { No Image
)} +
-
- {/* ์ˆœ์œ„ ํ‘œ์‹œ */} -
- - - #{currentIndex + 1} - - +
+ {/* TOP 10 */} +
+ + TOP +
+ 10 +
+
+ + + # {currentIndex + 1} in Trending Today + +
); From 3c1b9bbe3cd5fbcac7df729a38bc8ecdfe748cac Mon Sep 17 00:00:00 2001 From: jungyungee Date: Sat, 1 Nov 2025 20:25:32 +0900 Subject: [PATCH 26/57] =?UTF-8?q?#11=20[FEAT]=20=EC=9E=AC=EC=83=9D?= =?UTF-8?q?=EB=B0=94=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=EC=BD=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/page.tsx | 2 ++ components/home/PlayBar.tsx | 26 ++++++++++++++++++++++++++ components/home/TrendingMovie.tsx | 4 ++-- svgs/navigation/addIcon.svg | 4 ++++ svgs/navigation/infoIcon.svg | 5 +++++ svgs/navigation/playIcon.svg | 3 +++ 6 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 components/home/PlayBar.tsx create mode 100644 svgs/navigation/addIcon.svg create mode 100644 svgs/navigation/infoIcon.svg create mode 100644 svgs/navigation/playIcon.svg diff --git a/app/home/page.tsx b/app/home/page.tsx index 5e55796..a928a5d 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -6,6 +6,7 @@ import GenrePreview from '@/components/home/GenrePreview'; import KoreaMovie from '@/components/home/KoreaMovie'; import NetflixOriginal from '@/components/home/NetflixOriginal'; +import PlayBar from '@/components/home/PlayBar'; import Preview from '@/components/home/Preview'; import TopRatedMovies from '@/components/home/TopRatedMovies'; import TrendingAll from '@/components/home/TrendingMovie'; @@ -16,6 +17,7 @@ const HomePage = () => {
+ {/* ์„น์…˜ ์ปจํ…Œ์ด๋„ˆ */}
diff --git a/components/home/PlayBar.tsx b/components/home/PlayBar.tsx new file mode 100644 index 0000000..fc63c05 --- /dev/null +++ b/components/home/PlayBar.tsx @@ -0,0 +1,26 @@ +'use client'; + +import AddIcon from '@/svgs/navigation/addIcon.svg'; +import InfoIcon from '@/svgs/navigation/infoIcon.svg'; +import PlayIcon from '@/svgs/navigation/playIcon.svg'; + +const PlayBar = () => { + return ( +
+
+ + My List +
+ +
+ + Info +
+
+ ); +}; + +export default PlayBar; diff --git a/components/home/TrendingMovie.tsx b/components/home/TrendingMovie.tsx index e51b4b2..36f1150 100644 --- a/components/home/TrendingMovie.tsx +++ b/components/home/TrendingMovie.tsx @@ -74,7 +74,7 @@ const TrendingMovie = () => {
{/* TOP 10 */} -
+
TOP
@@ -83,7 +83,7 @@ const TrendingMovie = () => {
- # {currentIndex + 1} in Trending Today + #{currentIndex + 1} in Trending Today
diff --git a/svgs/navigation/addIcon.svg b/svgs/navigation/addIcon.svg new file mode 100644 index 0000000..4de984e --- /dev/null +++ b/svgs/navigation/addIcon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/svgs/navigation/infoIcon.svg b/svgs/navigation/infoIcon.svg new file mode 100644 index 0000000..765215c --- /dev/null +++ b/svgs/navigation/infoIcon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/svgs/navigation/playIcon.svg b/svgs/navigation/playIcon.svg new file mode 100644 index 0000000..4a6e6dc --- /dev/null +++ b/svgs/navigation/playIcon.svg @@ -0,0 +1,3 @@ + + + From d2ecc48a6e9861bec3d1ffb8a3d34b217f9489c9 Mon Sep 17 00:00:00 2001 From: jungyungee Date: Sat, 1 Nov 2025 20:49:26 +0900 Subject: [PATCH 27/57] =?UTF-8?q?#11=20[FEAT]=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EA=B2=BD=EB=A1=9C=20=EB=B0=8F=20=EC=82=AC=EC=86=8C?= =?UTF-8?q?=ED=95=9C=20UI=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/page.tsx | 4 ++-- components/home/PlayBar.tsx | 6 +++--- components/home/TrendingMovie.tsx | 29 +++++++++++------------------ 3 files changed, 16 insertions(+), 23 deletions(-) diff --git a/app/home/page.tsx b/app/home/page.tsx index a928a5d..173f379 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -9,14 +9,14 @@ import NetflixOriginal from '@/components/home/NetflixOriginal'; import PlayBar from '@/components/home/PlayBar'; import Preview from '@/components/home/Preview'; import TopRatedMovies from '@/components/home/TopRatedMovies'; -import TrendingAll from '@/components/home/TrendingMovie'; +import TrendingMovies from '@/components/home/TrendingMovie'; import Header from '@/components/navigation/Header'; const HomePage = () => { return (
- + {/* ์„น์…˜ ์ปจํ…Œ์ด๋„ˆ */}
diff --git a/components/home/PlayBar.tsx b/components/home/PlayBar.tsx index fc63c05..9f09a7c 100644 --- a/components/home/PlayBar.tsx +++ b/components/home/PlayBar.tsx @@ -6,10 +6,10 @@ import PlayIcon from '@/svgs/navigation/playIcon.svg'; const PlayBar = () => { return ( -
+
- My List + My List
- Info + Info
); diff --git a/components/home/TrendingMovie.tsx b/components/home/TrendingMovie.tsx index 36f1150..8e19944 100644 --- a/components/home/TrendingMovie.tsx +++ b/components/home/TrendingMovie.tsx @@ -10,10 +10,9 @@ import Image from 'next/image'; import { useEffect, useState } from 'react'; import { getTrendingAllDay } from '@/apis/home'; +import { getImageUrl } from '@/constants/imageURL'; import { Movie } from '@/types/tmdb'; -const IMAGE_BASE_URL = 'https://image.tmdb.org/t/p/w500'; - const TrendingMovie = () => { const [items, setItems] = useState([]); const [currentIndex, setCurrentIndex] = useState(0); @@ -44,7 +43,7 @@ const TrendingMovie = () => { return (
{/* ํฌ์Šคํ„ฐ ์˜์—ญ */} -
+
{ transition={{ duration: 0.8 }} className="absolute inset-0" > - {currentItem.poster_path ? ( - {currentItem.title - ) : ( -
- No Image -
- )} + {currentItem.title
-
+
{/* TOP 10 */}
From 45a0c58cc37e8d8f7364f510dc3916d5060cd9f1 Mon Sep 17 00:00:00 2001 From: jungyungee Date: Sat, 1 Nov 2025 20:59:03 +0900 Subject: [PATCH 28/57] =?UTF-8?q?#11=20[CHORE]=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EC=A0=84=20=ED=99=94=EB=A9=B4=EC=97=90=20=EB=A1=9C=EB=94=A9=20?= =?UTF-8?q?=EC=9D=B8=EB=94=94=EC=BC=80=EC=9D=B4=ED=84=B0=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/comingsoon/page.tsx | 6 ++++-- app/downloads/page.tsx | 6 ++++-- app/more/page.tsx | 6 ++++-- app/search/page.tsx | 6 ++++-- components/common/Loading.tsx | 11 +++++++++++ components/home/TrendingMovie.tsx | 2 +- 6 files changed, 28 insertions(+), 9 deletions(-) create mode 100644 components/common/Loading.tsx diff --git a/app/comingsoon/page.tsx b/app/comingsoon/page.tsx index a6d463c..3ab4ab7 100644 --- a/app/comingsoon/page.tsx +++ b/app/comingsoon/page.tsx @@ -1,7 +1,9 @@ +import Loading from '@/components/common/Loading'; + const ComingSoonPage = () => { return ( -
-
Coming Soon
+
+
); }; diff --git a/app/downloads/page.tsx b/app/downloads/page.tsx index a088fc6..4edca43 100644 --- a/app/downloads/page.tsx +++ b/app/downloads/page.tsx @@ -1,7 +1,9 @@ +import Loading from '@/components/common/Loading'; + const DownloadsPage = () => { return ( -
-
Downloads
+
+
); }; diff --git a/app/more/page.tsx b/app/more/page.tsx index 9256558..557ca66 100644 --- a/app/more/page.tsx +++ b/app/more/page.tsx @@ -1,7 +1,9 @@ +import Loading from '@/components/common/Loading'; + const MorePage = () => { return ( -
-
More
+
+
); }; diff --git a/app/search/page.tsx b/app/search/page.tsx index 56292e8..7edc0ee 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -1,7 +1,9 @@ +import Loading from "@/components/common/Loading"; + const SearchPage = () => { return ( -
-
Search
+
+
); }; diff --git a/components/common/Loading.tsx b/components/common/Loading.tsx new file mode 100644 index 0000000..3e94b6b --- /dev/null +++ b/components/common/Loading.tsx @@ -0,0 +1,11 @@ +'use client'; + +const Loading = () => { + return ( +
+
+
+ ); +}; + +export default Loading; \ No newline at end of file diff --git a/components/home/TrendingMovie.tsx b/components/home/TrendingMovie.tsx index 8e19944..dd98179 100644 --- a/components/home/TrendingMovie.tsx +++ b/components/home/TrendingMovie.tsx @@ -2,7 +2,7 @@ /** * TrendingMovie ์ปดํฌ๋„ŒํŠธ - * ์˜ค๋Š˜์˜ ํŠธ๋ Œ๋”ฉ ์ฝ˜ํ…์ธ ๋ฅผ 10์ดˆ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉฐ ์ˆœ์œ„๋ฅผ ํ•จ๊ป˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. + * ์˜ค๋Š˜์˜ ํŠธ๋ Œ๋”ฉ ์ฝ˜ํ…์ธ ๋ฅผ 5์ดˆ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉฐ ์ˆœ์œ„๋ฅผ ํ•จ๊ป˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. */ import { AnimatePresence, motion } from 'framer-motion'; From 8b4145b466262ff6c2164d75e39f3f2b786d9389 Mon Sep 17 00:00:00 2001 From: jungyungee Date: Sat, 1 Nov 2025 21:17:22 +0900 Subject: [PATCH 29/57] =?UTF-8?q?#11=20[CHORE]=20=EB=A1=9C=EB=94=A9=20?= =?UTF-8?q?=EC=8B=9C=20UI=20=EA=B9=A8=EC=A7=80=EB=8A=94=20=EA=B2=83=20?= =?UTF-8?q?=EB=B0=A9=EC=A7=80=EC=9A=A9=20=EC=8A=A4=EC=BC=88=EB=A0=88?= =?UTF-8?q?=ED=86=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/search/page.tsx | 4 ++-- components/common/Loading.tsx | 2 +- components/home/TrendingMovie.tsx | 13 +++++++++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/app/search/page.tsx b/app/search/page.tsx index 7edc0ee..0169ff4 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -1,8 +1,8 @@ -import Loading from "@/components/common/Loading"; +import Loading from '@/components/common/Loading'; const SearchPage = () => { return ( -
+
); diff --git a/components/common/Loading.tsx b/components/common/Loading.tsx index 3e94b6b..a83a506 100644 --- a/components/common/Loading.tsx +++ b/components/common/Loading.tsx @@ -8,4 +8,4 @@ const Loading = () => { ); }; -export default Loading; \ No newline at end of file +export default Loading; diff --git a/components/home/TrendingMovie.tsx b/components/home/TrendingMovie.tsx index dd98179..2dbf568 100644 --- a/components/home/TrendingMovie.tsx +++ b/components/home/TrendingMovie.tsx @@ -37,7 +37,16 @@ const TrendingMovie = () => { return () => clearInterval(interval); }, [items]); - if (loading || items.length === 0) return null; + if (loading || items.length === 0) { + return ( +
+
+
+
+
+ ); + } + const currentItem = items[currentIndex]; return ( @@ -76,7 +85,7 @@ const TrendingMovie = () => {
- #{currentIndex + 1} in Trending Today + #{currentIndex + 1} in Korea Today
From a6b81be98364e2b6cc5f881db050c60c3cd8c3c2 Mon Sep 17 00:00:00 2001 From: jungyungee Date: Wed, 5 Nov 2025 03:53:59 +0900 Subject: [PATCH 30/57] =?UTF-8?q?[REFACTOR]=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {app => src/app}/comingsoon/page.tsx | 0 {app => src/app}/downloads/page.tsx | 0 {app => src/app}/home/page.tsx | 0 {app => src/app}/layout.tsx | 9 ++-- {app => src/app}/more/page.tsx | 0 {app => src/app}/page.tsx | 0 {app => src/app}/search/page.tsx | 0 .../components}/common/Loading.tsx | 0 .../components}/home/GenrePreview.tsx | 6 +-- .../components}/home/KoreaMovie.tsx | 6 +-- .../components}/home/MovieSwiper.tsx | 15 +----- .../components}/home/NetflixOriginal.tsx | 6 +-- .../components}/home/PlayBar.tsx | 0 .../components}/home/Preview.tsx | 6 +-- .../components}/home/TopRatedMovies.tsx | 6 +-- .../components}/home/TrendingMovie.tsx | 2 +- .../components}/navigation/BottomNav.tsx | 0 .../components}/navigation/Header.tsx | 0 {constants => src/constants}/imageURL.ts | 0 {apis => src/lib/api}/axiosInstance.ts | 0 src/lib/api/index.ts | 4 ++ {apis => src/lib/api/tmdb}/detail.ts | 6 +-- {apis => src/lib/api/tmdb}/home.ts | 46 ++++++------------- {apis => src/lib/api/tmdb}/search.ts | 2 +- {app => src/styles}/globals.css | 0 {app => src/styles}/theme.css | 0 {svgs => src/svgs}/navigation/addIcon.svg | 0 .../svgs}/navigation/comingSoonIcon.svg | 0 .../svgs}/navigation/downloadIcon.svg | 0 {svgs => src/svgs}/navigation/homeIcon.svg | 0 {svgs => src/svgs}/navigation/infoIcon.svg | 0 {svgs => src/svgs}/navigation/moreIcon.svg | 0 {svgs => src/svgs}/navigation/netflixIcon.svg | 0 {svgs => src/svgs}/navigation/playIcon.svg | 0 {svgs => src/svgs}/navigation/searchIcon.svg | 0 {types => src/types}/tmdb.ts | 0 tsconfig.json | 14 ++++-- 37 files changed, 50 insertions(+), 78 deletions(-) rename {app => src/app}/comingsoon/page.tsx (100%) rename {app => src/app}/downloads/page.tsx (100%) rename {app => src/app}/home/page.tsx (100%) rename {app => src/app}/layout.tsx (76%) rename {app => src/app}/more/page.tsx (100%) rename {app => src/app}/page.tsx (100%) rename {app => src/app}/search/page.tsx (100%) rename {components => src/components}/common/Loading.tsx (100%) rename {components => src/components}/home/GenrePreview.tsx (90%) rename {components => src/components}/home/KoreaMovie.tsx (89%) rename {components => src/components}/home/MovieSwiper.tsx (86%) rename {components => src/components}/home/NetflixOriginal.tsx (90%) rename {components => src/components}/home/PlayBar.tsx (100%) rename {components => src/components}/home/Preview.tsx (89%) rename {components => src/components}/home/TopRatedMovies.tsx (89%) rename {components => src/components}/home/TrendingMovie.tsx (98%) rename {components => src/components}/navigation/BottomNav.tsx (100%) rename {components => src/components}/navigation/Header.tsx (100%) rename {constants => src/constants}/imageURL.ts (100%) rename {apis => src/lib/api}/axiosInstance.ts (100%) create mode 100644 src/lib/api/index.ts rename {apis => src/lib/api/tmdb}/detail.ts (84%) rename {apis => src/lib/api/tmdb}/home.ts (74%) rename {apis => src/lib/api/tmdb}/search.ts (91%) rename {app => src/styles}/globals.css (100%) rename {app => src/styles}/theme.css (100%) rename {svgs => src/svgs}/navigation/addIcon.svg (100%) rename {svgs => src/svgs}/navigation/comingSoonIcon.svg (100%) rename {svgs => src/svgs}/navigation/downloadIcon.svg (100%) rename {svgs => src/svgs}/navigation/homeIcon.svg (100%) rename {svgs => src/svgs}/navigation/infoIcon.svg (100%) rename {svgs => src/svgs}/navigation/moreIcon.svg (100%) rename {svgs => src/svgs}/navigation/netflixIcon.svg (100%) rename {svgs => src/svgs}/navigation/playIcon.svg (100%) rename {svgs => src/svgs}/navigation/searchIcon.svg (100%) rename {types => src/types}/tmdb.ts (100%) diff --git a/app/comingsoon/page.tsx b/src/app/comingsoon/page.tsx similarity index 100% rename from app/comingsoon/page.tsx rename to src/app/comingsoon/page.tsx diff --git a/app/downloads/page.tsx b/src/app/downloads/page.tsx similarity index 100% rename from app/downloads/page.tsx rename to src/app/downloads/page.tsx diff --git a/app/home/page.tsx b/src/app/home/page.tsx similarity index 100% rename from app/home/page.tsx rename to src/app/home/page.tsx diff --git a/app/layout.tsx b/src/app/layout.tsx similarity index 76% rename from app/layout.tsx rename to src/app/layout.tsx index d1383aa..415b3a7 100644 --- a/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,4 +1,4 @@ -import './globals.css'; +import '@/styles/globals.css'; import type { Metadata } from 'next'; @@ -7,14 +7,15 @@ import BottomNav from '@/components/navigation/BottomNav'; export const metadata: Metadata = { title: 'Netflix', description: 'CEOS 22๊ธฐ ๋ชจ๋ธ๋ฆฌ ํŒ€ Netflix ํด๋ก ์ฝ”๋”ฉ ํ”„๋กœ์ ํŠธ', - icons: { - icon: '/favicon.svg', - }, + icons: { icon: '/favicon.svg' }, }; const RootLayout = ({ children }: { children: React.ReactNode }) => { return ( + + +
{children}
diff --git a/app/more/page.tsx b/src/app/more/page.tsx similarity index 100% rename from app/more/page.tsx rename to src/app/more/page.tsx diff --git a/app/page.tsx b/src/app/page.tsx similarity index 100% rename from app/page.tsx rename to src/app/page.tsx diff --git a/app/search/page.tsx b/src/app/search/page.tsx similarity index 100% rename from app/search/page.tsx rename to src/app/search/page.tsx diff --git a/components/common/Loading.tsx b/src/components/common/Loading.tsx similarity index 100% rename from components/common/Loading.tsx rename to src/components/common/Loading.tsx diff --git a/components/home/GenrePreview.tsx b/src/components/home/GenrePreview.tsx similarity index 90% rename from components/home/GenrePreview.tsx rename to src/components/home/GenrePreview.tsx index 38ac090..e290e05 100644 --- a/components/home/GenrePreview.tsx +++ b/src/components/home/GenrePreview.tsx @@ -7,8 +7,8 @@ import { useEffect, useState } from 'react'; -import { getMoviesByGenre } from '@/apis/home'; import MovieSwiper from '@/components/home/MovieSwiper'; +import { getMoviesByGenre } from '@/lib/api'; import { Movie } from '@/types/tmdb'; const GenrePreview = () => { @@ -26,9 +26,7 @@ const GenrePreview = () => { fetchMovies(); }, []); - if (loading) { - return null; - } + if (loading) return null; return ; }; diff --git a/components/home/KoreaMovie.tsx b/src/components/home/KoreaMovie.tsx similarity index 89% rename from components/home/KoreaMovie.tsx rename to src/components/home/KoreaMovie.tsx index 9d7e452..243d25c 100644 --- a/components/home/KoreaMovie.tsx +++ b/src/components/home/KoreaMovie.tsx @@ -7,8 +7,8 @@ import { useEffect, useState } from 'react'; -import { getKoreaMovie } from '@/apis/home'; import MovieSwiper from '@/components/home/MovieSwiper'; +import { getKoreaMovie } from '@/lib/api'; import { Movie } from '@/types/tmdb'; const KoreaMovie = () => { @@ -25,9 +25,7 @@ const KoreaMovie = () => { fetchMovies(); }, []); - if (loading) { - return null; - } + if (loading) return null; return ; }; diff --git a/components/home/MovieSwiper.tsx b/src/components/home/MovieSwiper.tsx similarity index 86% rename from components/home/MovieSwiper.tsx rename to src/components/home/MovieSwiper.tsx index b6f7717..c3fd1ff 100644 --- a/components/home/MovieSwiper.tsx +++ b/src/components/home/MovieSwiper.tsx @@ -50,21 +50,10 @@ const MovieSwiper = ({ title, items, itemWidth, itemHeight, shape = 'rectangle' className="movie-swiper" > {items.map((item) => ( - +
{item.poster_path ? ( { @@ -26,9 +26,7 @@ const NetflixOriginal = () => { fetchTVShows(); }, []); - if (loading) { - return null; - } + if (loading) return null; return ; }; diff --git a/components/home/PlayBar.tsx b/src/components/home/PlayBar.tsx similarity index 100% rename from components/home/PlayBar.tsx rename to src/components/home/PlayBar.tsx diff --git a/components/home/Preview.tsx b/src/components/home/Preview.tsx similarity index 89% rename from components/home/Preview.tsx rename to src/components/home/Preview.tsx index 596f5ee..f6abc1d 100644 --- a/components/home/Preview.tsx +++ b/src/components/home/Preview.tsx @@ -7,8 +7,8 @@ import { useEffect, useState } from 'react'; -import { getMoviePopular } from '@/apis/home'; import MovieSwiper from '@/components/home/MovieSwiper'; +import { getMoviePopular } from '@/lib/api'; import { Movie } from '@/types/tmdb'; const Preview = () => { @@ -25,9 +25,7 @@ const Preview = () => { fetchMovies(); }, []); - if (loading) { - return null; - } + if (loading) return null; return ; }; diff --git a/components/home/TopRatedMovies.tsx b/src/components/home/TopRatedMovies.tsx similarity index 89% rename from components/home/TopRatedMovies.tsx rename to src/components/home/TopRatedMovies.tsx index bc84f8d..881efb7 100644 --- a/components/home/TopRatedMovies.tsx +++ b/src/components/home/TopRatedMovies.tsx @@ -7,8 +7,8 @@ import { useEffect, useState } from 'react'; -import { getTopRatedMovies } from '@/apis/home'; import MovieSwiper from '@/components/home/MovieSwiper'; +import { getTopRatedMovies } from '@/lib/api'; import { Movie } from '@/types/tmdb'; const TopRatedMovies = () => { @@ -25,9 +25,7 @@ const TopRatedMovies = () => { fetchMovies(); }, []); - if (loading) { - return null; - } + if (loading) return null; return ; }; diff --git a/components/home/TrendingMovie.tsx b/src/components/home/TrendingMovie.tsx similarity index 98% rename from components/home/TrendingMovie.tsx rename to src/components/home/TrendingMovie.tsx index 2dbf568..8b4b616 100644 --- a/components/home/TrendingMovie.tsx +++ b/src/components/home/TrendingMovie.tsx @@ -9,8 +9,8 @@ import { AnimatePresence, motion } from 'framer-motion'; import Image from 'next/image'; import { useEffect, useState } from 'react'; -import { getTrendingAllDay } from '@/apis/home'; import { getImageUrl } from '@/constants/imageURL'; +import { getTrendingAllDay } from '@/lib/api'; import { Movie } from '@/types/tmdb'; const TrendingMovie = () => { diff --git a/components/navigation/BottomNav.tsx b/src/components/navigation/BottomNav.tsx similarity index 100% rename from components/navigation/BottomNav.tsx rename to src/components/navigation/BottomNav.tsx diff --git a/components/navigation/Header.tsx b/src/components/navigation/Header.tsx similarity index 100% rename from components/navigation/Header.tsx rename to src/components/navigation/Header.tsx diff --git a/constants/imageURL.ts b/src/constants/imageURL.ts similarity index 100% rename from constants/imageURL.ts rename to src/constants/imageURL.ts diff --git a/apis/axiosInstance.ts b/src/lib/api/axiosInstance.ts similarity index 100% rename from apis/axiosInstance.ts rename to src/lib/api/axiosInstance.ts diff --git a/src/lib/api/index.ts b/src/lib/api/index.ts new file mode 100644 index 0000000..778c851 --- /dev/null +++ b/src/lib/api/index.ts @@ -0,0 +1,4 @@ +export { axiosInstance } from '@/lib/api/axiosInstance'; +export * from '@/lib/api/tmdb/detail'; +export * from '@/lib/api/tmdb/home'; +export * from '@/lib/api/tmdb/search'; diff --git a/apis/detail.ts b/src/lib/api/tmdb/detail.ts similarity index 84% rename from apis/detail.ts rename to src/lib/api/tmdb/detail.ts index 9c01ad5..f52a3d1 100644 --- a/apis/detail.ts +++ b/src/lib/api/tmdb/detail.ts @@ -3,7 +3,7 @@ * ํŠน์ • ๋ฏธ๋””์–ด์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋Š” API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. */ -import { axiosInstance } from '@/apis/axiosInstance'; +import { axiosInstance } from '@/lib/api/axiosInstance'; /** * ํŠน์ • ๋ฏธ๋””์–ด์˜ ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ @@ -13,9 +13,7 @@ import { axiosInstance } from '@/apis/axiosInstance'; */ export const getDetail = async (media_type: string, id: string) => { try { - const res = await axiosInstance.get(`/${media_type}/${id}`, { - params: { language: 'ko-KR' }, - }); + const res = await axiosInstance.get(`/${media_type}/${id}`, { params: { language: 'ko-KR' } }); return res.data; } catch (err) { console.error('getDetail data error', err); diff --git a/apis/home.ts b/src/lib/api/tmdb/home.ts similarity index 74% rename from apis/home.ts rename to src/lib/api/tmdb/home.ts index 8170b48..8542db9 100644 --- a/apis/home.ts +++ b/src/lib/api/tmdb/home.ts @@ -3,7 +3,7 @@ * ํ™ˆ ํŽ˜์ด์ง€์˜ ๊ฐ ์„น์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์˜ํ™” ๋ฐ TV ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. */ -import { axiosInstance } from '@/apis/axiosInstance'; +import { axiosInstance } from '@/lib/api/axiosInstance'; /** * ์˜ค๋Š˜์˜ ํŠธ๋ Œ๋”ฉ ์ฝ˜ํ…์ธ  (์˜ํ™” + TV ํ”„๋กœ๊ทธ๋žจ) @@ -12,13 +12,11 @@ import { axiosInstance } from '@/apis/axiosInstance'; */ export const getTrendingAllDay = async () => { try { - const res = await axiosInstance.get('/trending/all/day', { - params: { language: 'ko-KR' }, - }); + const res = await axiosInstance.get('/trending/all/day', { params: { language: 'ko-KR' } }); return res.data; } catch (err) { console.error('getTrendingAllDay data error', err); - return { results: [] }; + return { results: [] } as const; } }; @@ -30,16 +28,12 @@ export const getTrendingAllDay = async () => { export const getMoviesByGenre = async (genreIds: string) => { try { const res = await axiosInstance.get('/discover/movie', { - params: { - with_genres: genreIds, - sort_by: 'popularity.desc', - language: 'ko-KR', - }, + params: { with_genres: genreIds, sort_by: 'popularity.desc', language: 'ko-KR' }, }); return res.data; } catch (err) { console.error('getMoviesByGenre data error', err); - return { results: [] }; + return { results: [] } as const; } }; @@ -50,16 +44,11 @@ export const getMoviesByGenre = async (genreIds: string) => { */ export const getTVByNetwork = async (networkId: number) => { try { - const res = await axiosInstance.get('/discover/tv', { - params: { - with_networks: networkId, - language: 'ko-KR', - }, - }); + const res = await axiosInstance.get('/discover/tv', { params: { with_networks: networkId, language: 'ko-KR' } }); return res.data; } catch (err) { console.error('getTVByNetwork data error', err); - return { results: [] }; + return { results: [] } as const; } }; @@ -71,15 +60,12 @@ export const getTVByNetwork = async (networkId: number) => { export const getMoviesByCompany = async (companyId: number) => { try { const res = await axiosInstance.get('/discover/movie', { - params: { - with_companies: companyId, - language: 'ko-KR', - }, + params: { with_companies: companyId, language: 'ko-KR' }, }); return res.data; } catch (err) { console.error('getMoviesByCompany data error', err); - return { results: [] }; + return { results: [] } as const; } }; @@ -90,13 +76,11 @@ export const getMoviesByCompany = async (companyId: number) => { */ export const getMoviePopular = async (page: number = 1) => { try { - const res = await axiosInstance.get('movie/popular', { - params: { language: 'ko-KR', page }, - }); + const res = await axiosInstance.get('movie/popular', { params: { language: 'ko-KR', page } }); return res.data; } catch (err) { console.error('getMoviePopular data error', err); - return { results: [] }; + return { results: [] } as const; } }; @@ -113,7 +97,7 @@ export const getKoreaMovie = async () => { return res.data; } catch (err) { console.error('getKoreaMovie data error', err); - return { results: [] }; + return { results: [] } as const; } }; @@ -123,12 +107,10 @@ export const getKoreaMovie = async () => { */ export const getTopRatedMovies = async () => { try { - const res = await axiosInstance.get('/movie/top_rated', { - params: { language: 'ko-KR' }, - }); + const res = await axiosInstance.get('/movie/top_rated', { params: { language: 'ko-KR' } }); return res.data; } catch (err) { console.error('getTopRatedMovies data error', err); - return { results: [] }; + return { results: [] } as const; } }; diff --git a/apis/search.ts b/src/lib/api/tmdb/search.ts similarity index 91% rename from apis/search.ts rename to src/lib/api/tmdb/search.ts index e55000e..a5a2fea 100644 --- a/apis/search.ts +++ b/src/lib/api/tmdb/search.ts @@ -3,7 +3,7 @@ * ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์— ์‚ฌ์šฉ๋˜๋Š” API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. */ -import { axiosInstance } from '@/apis/axiosInstance'; +import { axiosInstance } from '@/lib/api/axiosInstance'; /** * ํ†ตํ•ฉ ๊ฒ€์ƒ‰ (์˜ํ™” + TV ํ”„๋กœ๊ทธ๋žจ + ์ธ๋ฌผ) diff --git a/app/globals.css b/src/styles/globals.css similarity index 100% rename from app/globals.css rename to src/styles/globals.css diff --git a/app/theme.css b/src/styles/theme.css similarity index 100% rename from app/theme.css rename to src/styles/theme.css diff --git a/svgs/navigation/addIcon.svg b/src/svgs/navigation/addIcon.svg similarity index 100% rename from svgs/navigation/addIcon.svg rename to src/svgs/navigation/addIcon.svg diff --git a/svgs/navigation/comingSoonIcon.svg b/src/svgs/navigation/comingSoonIcon.svg similarity index 100% rename from svgs/navigation/comingSoonIcon.svg rename to src/svgs/navigation/comingSoonIcon.svg diff --git a/svgs/navigation/downloadIcon.svg b/src/svgs/navigation/downloadIcon.svg similarity index 100% rename from svgs/navigation/downloadIcon.svg rename to src/svgs/navigation/downloadIcon.svg diff --git a/svgs/navigation/homeIcon.svg b/src/svgs/navigation/homeIcon.svg similarity index 100% rename from svgs/navigation/homeIcon.svg rename to src/svgs/navigation/homeIcon.svg diff --git a/svgs/navigation/infoIcon.svg b/src/svgs/navigation/infoIcon.svg similarity index 100% rename from svgs/navigation/infoIcon.svg rename to src/svgs/navigation/infoIcon.svg diff --git a/svgs/navigation/moreIcon.svg b/src/svgs/navigation/moreIcon.svg similarity index 100% rename from svgs/navigation/moreIcon.svg rename to src/svgs/navigation/moreIcon.svg diff --git a/svgs/navigation/netflixIcon.svg b/src/svgs/navigation/netflixIcon.svg similarity index 100% rename from svgs/navigation/netflixIcon.svg rename to src/svgs/navigation/netflixIcon.svg diff --git a/svgs/navigation/playIcon.svg b/src/svgs/navigation/playIcon.svg similarity index 100% rename from svgs/navigation/playIcon.svg rename to src/svgs/navigation/playIcon.svg diff --git a/svgs/navigation/searchIcon.svg b/src/svgs/navigation/searchIcon.svg similarity index 100% rename from svgs/navigation/searchIcon.svg rename to src/svgs/navigation/searchIcon.svg diff --git a/types/tmdb.ts b/src/types/tmdb.ts similarity index 100% rename from types/tmdb.ts rename to src/types/tmdb.ts diff --git a/tsconfig.json b/tsconfig.json index 779ee28..1f540ee 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,11 @@ { "compilerOptions": { "target": "ES2017", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -19,7 +23,9 @@ } ], "paths": { - "@/*": ["./*"] + "@/*": ["./src/*"], + "@/svgs/*": ["./src/svgs/*"], + "@/public/*": ["./public/*"] } }, "include": [ @@ -31,5 +37,7 @@ ".next/dev/types/**/*.ts", "**/*.mts" ], - "exclude": ["node_modules"] + "exclude": [ + "node_modules" + ] } From a50ca9a93d46bb3f17c135aa729d213d5f09246e Mon Sep 17 00:00:00 2001 From: jungyungee Date: Wed, 5 Nov 2025 06:38:37 +0900 Subject: [PATCH 31/57] =?UTF-8?q?#13=20[REFACTOR]=20axios=EB=A5=BC=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=ED=95=98=EA=B3=A0=20=EA=B8=B0=EB=B3=B8=20fet?= =?UTF-8?q?ch=20=EC=82=AC=EC=9A=A9=20=EB=B0=8F=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=ED=8C=8C=EC=9D=BC=EB=93=A4=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EB=A7=9E=EC=B6=94=EC=96=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 116 +++----------------- package.json | 1 - src/app/home/page.tsx | 2 + src/components/home/GenrePreview.tsx | 25 +---- src/components/home/KoreaMovie.tsx | 23 +--- src/components/home/NetflixOriginal.tsx | 25 +---- src/components/home/Preview.tsx | 23 +--- src/components/home/TopRatedMovies.tsx | 23 +--- src/components/home/TrendingMovie.tsx | 94 ++-------------- src/components/home/TrendingMovieClient.tsx | 87 +++++++++++++++ src/lib/api/axiosInstance.ts | 22 ---- src/lib/api/index.ts | 2 +- src/lib/api/tmdb/detail.ts | 5 +- src/lib/api/tmdb/home.ts | 31 ++---- src/lib/api/tmdb/search.ts | 7 +- src/lib/api/tmdbClient.ts | 42 +++++++ tsconfig.json | 1 + 17 files changed, 186 insertions(+), 343 deletions(-) create mode 100644 src/components/home/TrendingMovieClient.tsx delete mode 100644 src/lib/api/axiosInstance.ts create mode 100644 src/lib/api/tmdbClient.ts diff --git a/package-lock.json b/package-lock.json index 2ee1ab3..d076c3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,6 @@ "name": "next-netflix", "version": "0.1.0", "dependencies": { - "axios": "^1.13.1", "framer-motion": "^12.23.24", "lottie-react": "^2.4.1", "next": "16.0.1", @@ -4145,12 +4144,6 @@ "node": ">= 0.4" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -4177,17 +4170,6 @@ "node": ">=4" } }, - "node_modules/axios": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.1.tgz", - "integrity": "sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -4346,6 +4328,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -4458,18 +4441,6 @@ "dev": true, "license": "MIT" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", @@ -4769,15 +4740,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -4875,6 +4837,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -5009,6 +4972,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5018,6 +4982,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5055,6 +5020,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -5067,6 +5033,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -5748,26 +5715,6 @@ "dev": true, "license": "ISC" }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -5784,22 +5731,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/framer-motion": { "version": "12.23.24", "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.24.tgz", @@ -5831,6 +5762,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5891,6 +5823,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -5915,6 +5848,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -6002,6 +5936,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6080,6 +6015,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6092,6 +6028,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -6107,6 +6044,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -7146,6 +7084,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7182,27 +7121,6 @@ "node": ">=8.6" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -7770,12 +7688,6 @@ "react-is": "^16.13.1" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", diff --git a/package.json b/package.json index 20dfad5..0a99f2c 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,6 @@ "lint": "eslint . --ext .js,.jsx,.ts,.tsx" }, "dependencies": { - "axios": "^1.13.1", "framer-motion": "^12.23.24", "lottie-react": "^2.4.1", "next": "16.0.1", diff --git a/src/app/home/page.tsx b/src/app/home/page.tsx index 173f379..195e872 100644 --- a/src/app/home/page.tsx +++ b/src/app/home/page.tsx @@ -3,6 +3,8 @@ * ๋„ทํ”Œ๋ฆญ์Šค ํด๋ก ์˜ ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ, ๋‹ค์–‘ํ•œ ์˜ํ™” ๋ฐ TV ํ”„๋กœ๊ทธ๋žจ ์„น์…˜์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. */ +export const dynamic = 'force-dynamic'; + import GenrePreview from '@/components/home/GenrePreview'; import KoreaMovie from '@/components/home/KoreaMovie'; import NetflixOriginal from '@/components/home/NetflixOriginal'; diff --git a/src/components/home/GenrePreview.tsx b/src/components/home/GenrePreview.tsx index e290e05..e4722da 100644 --- a/src/components/home/GenrePreview.tsx +++ b/src/components/home/GenrePreview.tsx @@ -1,32 +1,15 @@ -'use client'; - /** * GenrePreview ์„น์…˜ ์ปดํฌ๋„ŒํŠธ * ํŠน์ • ์žฅ๋ฅด์˜ ์˜ํ™”๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. */ -import { useEffect, useState } from 'react'; - import MovieSwiper from '@/components/home/MovieSwiper'; import { getMoviesByGenre } from '@/lib/api'; -import { Movie } from '@/types/tmdb'; - -const GenrePreview = () => { - const [movies, setMovies] = useState([]); - const [loading, setLoading] = useState(true); - - useEffect(() => { - const fetchMovies = async () => { - // ์•ก์…˜(28), ๋ชจํ—˜(12) ์žฅ๋ฅด ์กฐํ•ฉ - const response = await getMoviesByGenre('28,12'); - setMovies(response.results); - setLoading(false); - }; - - fetchMovies(); - }, []); - if (loading) return null; +const GenrePreview = async () => { + // ์•ก์…˜(28), ๋ชจํ—˜(12) ์žฅ๋ฅด ์กฐํ•ฉ + const response = await getMoviesByGenre('28,12'); + const movies = response.results; return ; }; diff --git a/src/components/home/KoreaMovie.tsx b/src/components/home/KoreaMovie.tsx index 243d25c..d07fbf2 100644 --- a/src/components/home/KoreaMovie.tsx +++ b/src/components/home/KoreaMovie.tsx @@ -1,31 +1,14 @@ -'use client'; - /** * KoreaMovie ์„น์…˜ ์ปดํฌ๋„ŒํŠธ * ํ•œ๊ตญ ์˜ํ™”๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. */ -import { useEffect, useState } from 'react'; - import MovieSwiper from '@/components/home/MovieSwiper'; import { getKoreaMovie } from '@/lib/api'; -import { Movie } from '@/types/tmdb'; - -const KoreaMovie = () => { - const [movies, setMovies] = useState([]); - const [loading, setLoading] = useState(true); - - useEffect(() => { - const fetchMovies = async () => { - const response = await getKoreaMovie(); - setMovies(response.results); - setLoading(false); - }; - - fetchMovies(); - }, []); - if (loading) return null; +const KoreaMovie = async () => { + const response = await getKoreaMovie(); + const movies = response.results; return ; }; diff --git a/src/components/home/NetflixOriginal.tsx b/src/components/home/NetflixOriginal.tsx index ff86df1..ce35806 100644 --- a/src/components/home/NetflixOriginal.tsx +++ b/src/components/home/NetflixOriginal.tsx @@ -1,32 +1,15 @@ -'use client'; - /** * NetflixOriginal ์„น์…˜ ์ปดํฌ๋„ŒํŠธ * ๋„ทํ”Œ๋ฆญ์Šค ์˜ค๋ฆฌ์ง€๋„ TV ํ”„๋กœ๊ทธ๋žจ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. */ -import { useEffect, useState } from 'react'; - import MovieSwiper from '@/components/home/MovieSwiper'; import { getTVByNetwork } from '@/lib/api'; -import { TV } from '@/types/tmdb'; - -const NetflixOriginal = () => { - const [tvShows, setTvShows] = useState([]); - const [loading, setLoading] = useState(true); - - useEffect(() => { - const fetchTVShows = async () => { - // Netflix ๋„คํŠธ์›Œํฌ ID: 213 - const response = await getTVByNetwork(213); - setTvShows(response.results); - setLoading(false); - }; - - fetchTVShows(); - }, []); - if (loading) return null; +const NetflixOriginal = async () => { + // Netflix ๋„คํŠธ์›Œํฌ ID: 213 + const response = await getTVByNetwork(213); + const tvShows = response.results; return ; }; diff --git a/src/components/home/Preview.tsx b/src/components/home/Preview.tsx index f6abc1d..ccb1a85 100644 --- a/src/components/home/Preview.tsx +++ b/src/components/home/Preview.tsx @@ -1,31 +1,14 @@ -'use client'; - /** * Preview ์„น์…˜ ์ปดํฌ๋„ŒํŠธ * ์ธ๊ธฐ ์˜ํ™”๋ฅผ ์›ํ˜• ์ด๋ฏธ์ง€๋กœ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ˜•ํƒœ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. */ -import { useEffect, useState } from 'react'; - import MovieSwiper from '@/components/home/MovieSwiper'; import { getMoviePopular } from '@/lib/api'; -import { Movie } from '@/types/tmdb'; - -const Preview = () => { - const [movies, setMovies] = useState([]); - const [loading, setLoading] = useState(true); - - useEffect(() => { - const fetchMovies = async () => { - const response = await getMoviePopular(); - setMovies(response.results); - setLoading(false); - }; - - fetchMovies(); - }, []); - if (loading) return null; +const Preview = async () => { + const response = await getMoviePopular(); + const movies = response.results; return ; }; diff --git a/src/components/home/TopRatedMovies.tsx b/src/components/home/TopRatedMovies.tsx index 881efb7..b33c8e3 100644 --- a/src/components/home/TopRatedMovies.tsx +++ b/src/components/home/TopRatedMovies.tsx @@ -1,31 +1,14 @@ -'use client'; - /** * TopRatedMovies ์„น์…˜ ์ปดํฌ๋„ŒํŠธ * ๋†’์€ ํ‰์ ์˜ ์˜ํ™”๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. */ -import { useEffect, useState } from 'react'; - import MovieSwiper from '@/components/home/MovieSwiper'; import { getTopRatedMovies } from '@/lib/api'; -import { Movie } from '@/types/tmdb'; - -const TopRatedMovies = () => { - const [movies, setMovies] = useState([]); - const [loading, setLoading] = useState(true); - - useEffect(() => { - const fetchMovies = async () => { - const response = await getTopRatedMovies(); - setMovies(response.results); - setLoading(false); - }; - - fetchMovies(); - }, []); - if (loading) return null; +const TopRatedMovies = async () => { + const response = await getTopRatedMovies(); + const movies = response.results; return ; }; diff --git a/src/components/home/TrendingMovie.tsx b/src/components/home/TrendingMovie.tsx index 8b4b616..929068f 100644 --- a/src/components/home/TrendingMovie.tsx +++ b/src/components/home/TrendingMovie.tsx @@ -1,96 +1,16 @@ -'use client'; - /** - * TrendingMovie ์ปดํฌ๋„ŒํŠธ - * ์˜ค๋Š˜์˜ ํŠธ๋ Œ๋”ฉ ์ฝ˜ํ…์ธ ๋ฅผ 5์ดˆ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉฐ ์ˆœ์œ„๋ฅผ ํ•จ๊ป˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. + * TrendingMovie ์ปดํฌ๋„ŒํŠธ (Server Component) + * ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์—์„œ fetchํ•˜์—ฌ Client Component๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. */ -import { AnimatePresence, motion } from 'framer-motion'; -import Image from 'next/image'; -import { useEffect, useState } from 'react'; - -import { getImageUrl } from '@/constants/imageURL'; +import TrendingMovieClient from '@/components/home/TrendingMovieClient'; import { getTrendingAllDay } from '@/lib/api'; -import { Movie } from '@/types/tmdb'; - -const TrendingMovie = () => { - const [items, setItems] = useState([]); - const [currentIndex, setCurrentIndex] = useState(0); - const [loading, setLoading] = useState(true); - - useEffect(() => { - const fetchTrending = async () => { - const response = await getTrendingAllDay(); - setItems(response.results.slice(0, 10)); // ์ƒ์œ„ 10๊ฐœ ์•„์ดํ…œ๋งŒ ์‚ฌ์šฉ - setLoading(false); - }; - - fetchTrending(); - }, []); - - // 5์ดˆ๋งˆ๋‹ค ์ž๋™ ์ „ํ™˜ - useEffect(() => { - if (!items.length) return; - const interval = setInterval(() => { - setCurrentIndex((prev) => (prev + 1) % items.length); - }, 5000); - return () => clearInterval(interval); - }, [items]); - - if (loading || items.length === 0) { - return ( -
-
-
-
-
- ); - } - - const currentItem = items[currentIndex]; - - return ( -
- {/* ํฌ์Šคํ„ฐ ์˜์—ญ */} -
- - - {currentItem.title -
- - -
- {/* TOP 10 */} -
- - TOP -
- 10 -
-
+const TrendingMovie = async () => { + const response = await getTrendingAllDay(); + const items = response.results.slice(0, 10); // ์ƒ์œ„ 10๊ฐœ ์•„์ดํ…œ๋งŒ ์‚ฌ์šฉ - - #{currentIndex + 1} in Korea Today - -
-
-
- ); + return ; }; export default TrendingMovie; diff --git a/src/components/home/TrendingMovieClient.tsx b/src/components/home/TrendingMovieClient.tsx new file mode 100644 index 0000000..7ceeb66 --- /dev/null +++ b/src/components/home/TrendingMovieClient.tsx @@ -0,0 +1,87 @@ +'use client'; + +/** + * TrendingMovieClient ์ปดํฌ๋„ŒํŠธ (Client Component) + * ๋ฐ์ดํ„ฐ๋ฅผ 5์ดˆ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์ˆœ์œ„๋ฅผ ํ•จ๊ป˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. + */ + +import { AnimatePresence, motion } from 'framer-motion'; +import Image from 'next/image'; +import { useEffect, useState } from 'react'; + +import { getImageUrl } from '@/constants/imageURL'; +import { Movie } from '@/types/tmdb'; + +interface TrendingMovieClientProps { + items: Movie[]; +} + +const TrendingMovieClient = ({ items }: TrendingMovieClientProps) => { + const [currentIndex, setCurrentIndex] = useState(0); + + // 5์ดˆ๋งˆ๋‹ค ์ž๋™ ์ „ํ™˜ + useEffect(() => { + if (!items.length) return; + const interval = setInterval(() => { + setCurrentIndex((prev) => (prev + 1) % items.length); + }, 5000); + return () => clearInterval(interval); + }, [items]); + + if (items.length === 0) { + return ( +
+
+
+
+
+ ); + } + + const currentItem = items[currentIndex]; + + return ( +
+ {/* ํฌ์Šคํ„ฐ ์˜์—ญ */} +
+ + + {currentItem.title +
+ + + +
+ {/* TOP 10 */} +
+ + TOP +
+ 10 +
+
+ + + #{currentIndex + 1} in Korea Today + +
+
+
+ ); +}; + +export default TrendingMovieClient; diff --git a/src/lib/api/axiosInstance.ts b/src/lib/api/axiosInstance.ts deleted file mode 100644 index f29a381..0000000 --- a/src/lib/api/axiosInstance.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * TMDB API ํ†ต์‹ ์„ ์œ„ํ•œ Axios ์ธ์Šคํ„ด์Šค - * ๋ชจ๋“  TMDB API ์š”์ฒญ์— ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. - */ - -import axios from 'axios'; - -/** - * TMDB API์šฉ Axios ์ธ์Šคํ„ด์Šค - * - baseURL: TMDB API ๊ธฐ๋ณธ URL (ํ™˜๊ฒฝ๋ณ€์ˆ˜์—์„œ ๊ฐ€์ ธ์˜ด) - * - headers: ์š”์ฒญ ํ—ค๋” ์„ค์ • - * - params: ๋ชจ๋“  ์š”์ฒญ์— ์ž๋™์œผ๋กœ ํฌํ•จ๋  ํŒŒ๋ผ๋ฏธํ„ฐ (API ํ‚ค) - */ -export const axiosInstance = axios.create({ - baseURL: process.env.NEXT_PUBLIC_URL, // TMDB API ๋ฒ ์ด์Šค URL - headers: { - 'Content-Type': 'application/json', // JSON ํ˜•์‹์œผ๋กœ ํ†ต์‹  - }, - params: { - api_key: process.env.NEXT_PUBLIC_TMDB_API_KEY, // TMDB API ํ‚ค (๋ชจ๋“  ์š”์ฒญ์— ์ž๋™ ํฌํ•จ) - }, -}); diff --git a/src/lib/api/index.ts b/src/lib/api/index.ts index 778c851..f42268d 100644 --- a/src/lib/api/index.ts +++ b/src/lib/api/index.ts @@ -1,4 +1,4 @@ -export { axiosInstance } from '@/lib/api/axiosInstance'; export * from '@/lib/api/tmdb/detail'; export * from '@/lib/api/tmdb/home'; export * from '@/lib/api/tmdb/search'; +export { tmdbGet } from '@/lib/api/tmdbClient'; diff --git a/src/lib/api/tmdb/detail.ts b/src/lib/api/tmdb/detail.ts index f52a3d1..e92665b 100644 --- a/src/lib/api/tmdb/detail.ts +++ b/src/lib/api/tmdb/detail.ts @@ -3,7 +3,7 @@ * ํŠน์ • ๋ฏธ๋””์–ด์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋Š” API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. */ -import { axiosInstance } from '@/lib/api/axiosInstance'; +import { tmdbGet } from '@/lib/api/tmdbClient'; /** * ํŠน์ • ๋ฏธ๋””์–ด์˜ ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ @@ -13,8 +13,7 @@ import { axiosInstance } from '@/lib/api/axiosInstance'; */ export const getDetail = async (media_type: string, id: string) => { try { - const res = await axiosInstance.get(`/${media_type}/${id}`, { params: { language: 'ko-KR' } }); - return res.data; + return await tmdbGet(`/${media_type}/${id}`, { language: 'ko-KR' }); } catch (err) { console.error('getDetail data error', err); return null; diff --git a/src/lib/api/tmdb/home.ts b/src/lib/api/tmdb/home.ts index 8542db9..9e0358f 100644 --- a/src/lib/api/tmdb/home.ts +++ b/src/lib/api/tmdb/home.ts @@ -3,7 +3,7 @@ * ํ™ˆ ํŽ˜์ด์ง€์˜ ๊ฐ ์„น์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์˜ํ™” ๋ฐ TV ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. */ -import { axiosInstance } from '@/lib/api/axiosInstance'; +import { tmdbGet } from '@/lib/api/tmdbClient'; /** * ์˜ค๋Š˜์˜ ํŠธ๋ Œ๋”ฉ ์ฝ˜ํ…์ธ  (์˜ํ™” + TV ํ”„๋กœ๊ทธ๋žจ) @@ -12,8 +12,7 @@ import { axiosInstance } from '@/lib/api/axiosInstance'; */ export const getTrendingAllDay = async () => { try { - const res = await axiosInstance.get('/trending/all/day', { params: { language: 'ko-KR' } }); - return res.data; + return await tmdbGet('/trending/all/day', { language: 'ko-KR' }); } catch (err) { console.error('getTrendingAllDay data error', err); return { results: [] } as const; @@ -27,10 +26,11 @@ export const getTrendingAllDay = async () => { */ export const getMoviesByGenre = async (genreIds: string) => { try { - const res = await axiosInstance.get('/discover/movie', { - params: { with_genres: genreIds, sort_by: 'popularity.desc', language: 'ko-KR' }, + return await tmdbGet('/discover/movie', { + with_genres: genreIds, + sort_by: 'popularity.desc', + language: 'ko-KR', }); - return res.data; } catch (err) { console.error('getMoviesByGenre data error', err); return { results: [] } as const; @@ -44,8 +44,7 @@ export const getMoviesByGenre = async (genreIds: string) => { */ export const getTVByNetwork = async (networkId: number) => { try { - const res = await axiosInstance.get('/discover/tv', { params: { with_networks: networkId, language: 'ko-KR' } }); - return res.data; + return await tmdbGet('/discover/tv', { with_networks: networkId, language: 'ko-KR' }); } catch (err) { console.error('getTVByNetwork data error', err); return { results: [] } as const; @@ -59,10 +58,7 @@ export const getTVByNetwork = async (networkId: number) => { */ export const getMoviesByCompany = async (companyId: number) => { try { - const res = await axiosInstance.get('/discover/movie', { - params: { with_companies: companyId, language: 'ko-KR' }, - }); - return res.data; + return await tmdbGet('/discover/movie', { with_companies: companyId, language: 'ko-KR' }); } catch (err) { console.error('getMoviesByCompany data error', err); return { results: [] } as const; @@ -76,8 +72,7 @@ export const getMoviesByCompany = async (companyId: number) => { */ export const getMoviePopular = async (page: number = 1) => { try { - const res = await axiosInstance.get('movie/popular', { params: { language: 'ko-KR', page } }); - return res.data; + return await tmdbGet('/movie/popular', { language: 'ko-KR', page }); } catch (err) { console.error('getMoviePopular data error', err); return { results: [] } as const; @@ -91,10 +86,7 @@ export const getMoviePopular = async (page: number = 1) => { */ export const getKoreaMovie = async () => { try { - const res = await axiosInstance.get('/discover/movie', { - params: { with_original_language: 'ko', language: 'ko-KR' }, - }); - return res.data; + return await tmdbGet('/discover/movie', { with_original_language: 'ko', language: 'ko-KR' }); } catch (err) { console.error('getKoreaMovie data error', err); return { results: [] } as const; @@ -107,8 +99,7 @@ export const getKoreaMovie = async () => { */ export const getTopRatedMovies = async () => { try { - const res = await axiosInstance.get('/movie/top_rated', { params: { language: 'ko-KR' } }); - return res.data; + return await tmdbGet('/movie/top_rated', { language: 'ko-KR' }); } catch (err) { console.error('getTopRatedMovies data error', err); return { results: [] } as const; diff --git a/src/lib/api/tmdb/search.ts b/src/lib/api/tmdb/search.ts index a5a2fea..3eb344c 100644 --- a/src/lib/api/tmdb/search.ts +++ b/src/lib/api/tmdb/search.ts @@ -3,7 +3,7 @@ * ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์— ์‚ฌ์šฉ๋˜๋Š” API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. */ -import { axiosInstance } from '@/lib/api/axiosInstance'; +import { tmdbGet } from '@/lib/api/tmdbClient'; /** * ํ†ตํ•ฉ ๊ฒ€์ƒ‰ (์˜ํ™” + TV ํ”„๋กœ๊ทธ๋žจ + ์ธ๋ฌผ) @@ -13,10 +13,7 @@ import { axiosInstance } from '@/lib/api/axiosInstance'; */ export const searchMulti = async (query: string, page: number = 1) => { try { - const res = await axiosInstance.get('/search/multi', { - params: { query, language: 'ko-KR', page, include_adult: 'false' }, - }); - return res.data; + return await tmdbGet('/search/multi', { query, language: 'ko-KR', page, include_adult: 'false' }); } catch (err) { console.error('searchMulti data error', err); return { results: [] }; diff --git a/src/lib/api/tmdbClient.ts b/src/lib/api/tmdbClient.ts new file mode 100644 index 0000000..5941482 --- /dev/null +++ b/src/lib/api/tmdbClient.ts @@ -0,0 +1,42 @@ +/** + * TMDB API ํ†ต์‹ ์„ ์œ„ํ•œ fetch ํ—ฌํผ (axios ์˜์กด์„ฑ ์—†์ด ํ‘œ์ค€ fetch๋กœ TMDB API ํ˜ธ์ถœ์„ ๊ฐ„์†Œํ™”) + * ๋ชจ๋“  TMDB API ์š”์ฒญ์— ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. + */ + +const BASE_URL = process.env.NEXT_PUBLIC_URL!; +const API_KEY = process.env.NEXT_PUBLIC_TMDB_API_KEY!; + +type QueryParams = Record; + +/** + * TMDB API GET ์š”์ฒญ ํ—ฌํผ + * @param path - API ๊ฒฝ๋กœ (์˜ˆ: '/trending/all/day') + * @param params - ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ์ฒด + * @returns JSON ์‘๋‹ต ๋ฐ์ดํ„ฐ + */ +export async function tmdbGet(path: string, params: QueryParams = {}) { + // path๊ฐ€ /๋กœ ์‹œ์ž‘ํ•˜๋ฉด ์ œ๊ฑฐ (BASE_URL ๋์— /3์ด ์œ ์ง€๋˜๋„๋ก) + const cleanPath = path.startsWith('/') ? path.slice(1) : path; + const url = new URL(`${BASE_URL}/${cleanPath}`); // TMDB API ๋ฒ ์ด์Šค URL + + // ๊ธฐ๋ณธ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ • + url.searchParams.set('api_key', API_KEY); // TMDB API ํ‚ค (๋ชจ๋“  ์š”์ฒญ์— ์ž๋™ ํฌํ•จ) + if (!url.searchParams.has('language') && !params.language) { + url.searchParams.set('language', 'ko-KR'); + } + + // ์ถ”๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ • + Object.entries(params).forEach(([key, value]) => { + if (value !== undefined) { + url.searchParams.set(key, String(value)); + } + }); + + const res = await fetch(url.toString(), { cache: 'no-store' }); + + if (!res.ok) { + throw new Error(`TMDB API error: ${res.status} ${res.statusText}`); + } + + return res.json(); +} diff --git a/tsconfig.json b/tsconfig.json index 1f540ee..6d18adc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,7 @@ "dom.iterable", "esnext" ], + "baseUrl": ".", "allowJs": true, "skipLibCheck": true, "strict": true, From 00f8831c40583f984ee884724ea7f227c0274d2f Mon Sep 17 00:00:00 2001 From: jungyungee Date: Wed, 5 Nov 2025 06:59:59 +0900 Subject: [PATCH 32/57] =?UTF-8?q?#13=20[CHORE]=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=9C=A0=EC=A0=80/=ED=81=B4=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EC=96=B8=ED=8A=B8=20=ED=8F=B4=EB=8D=94=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/home/page.tsx | 16 +++++++--------- src/components/home/{ => client}/MovieSwiper.tsx | 0 src/components/home/{ => client}/PlayBar.tsx | 0 .../TrendingBanner.tsx} | 10 +++++----- .../home/{ => server}/GenrePreview.tsx | 2 +- src/components/home/{ => server}/KoreaMovie.tsx | 2 +- .../home/{ => server}/NetflixOriginal.tsx | 2 +- src/components/home/{ => server}/Preview.tsx | 2 +- .../home/{ => server}/TopRatedMovies.tsx | 2 +- .../home/{ => server}/TrendingMovie.tsx | 6 +++--- 10 files changed, 20 insertions(+), 22 deletions(-) rename src/components/home/{ => client}/MovieSwiper.tsx (100%) rename src/components/home/{ => client}/PlayBar.tsx (100%) rename src/components/home/{TrendingMovieClient.tsx => client/TrendingBanner.tsx} (89%) rename src/components/home/{ => server}/GenrePreview.tsx (87%) rename src/components/home/{ => server}/KoreaMovie.tsx (85%) rename src/components/home/{ => server}/NetflixOriginal.tsx (87%) rename src/components/home/{ => server}/Preview.tsx (86%) rename src/components/home/{ => server}/TopRatedMovies.tsx (86%) rename src/components/home/{ => server}/TrendingMovie.tsx (60%) diff --git a/src/app/home/page.tsx b/src/app/home/page.tsx index 195e872..3f2fa99 100644 --- a/src/app/home/page.tsx +++ b/src/app/home/page.tsx @@ -3,15 +3,13 @@ * ๋„ทํ”Œ๋ฆญ์Šค ํด๋ก ์˜ ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ, ๋‹ค์–‘ํ•œ ์˜ํ™” ๋ฐ TV ํ”„๋กœ๊ทธ๋žจ ์„น์…˜์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. */ -export const dynamic = 'force-dynamic'; - -import GenrePreview from '@/components/home/GenrePreview'; -import KoreaMovie from '@/components/home/KoreaMovie'; -import NetflixOriginal from '@/components/home/NetflixOriginal'; -import PlayBar from '@/components/home/PlayBar'; -import Preview from '@/components/home/Preview'; -import TopRatedMovies from '@/components/home/TopRatedMovies'; -import TrendingMovies from '@/components/home/TrendingMovie'; +import GenrePreview from '@/components/home/server/GenrePreview'; +import KoreaMovie from '@/components/home/server/KoreaMovie'; +import NetflixOriginal from '@/components/home/server/NetflixOriginal'; +import Preview from '@/components/home/server/Preview'; +import TopRatedMovies from '@/components/home/server/TopRatedMovies'; +import TrendingMovies from '@/components/home/server/TrendingMovie'; +import PlayBar from '@/components/home/client/PlayBar'; import Header from '@/components/navigation/Header'; const HomePage = () => { diff --git a/src/components/home/MovieSwiper.tsx b/src/components/home/client/MovieSwiper.tsx similarity index 100% rename from src/components/home/MovieSwiper.tsx rename to src/components/home/client/MovieSwiper.tsx diff --git a/src/components/home/PlayBar.tsx b/src/components/home/client/PlayBar.tsx similarity index 100% rename from src/components/home/PlayBar.tsx rename to src/components/home/client/PlayBar.tsx diff --git a/src/components/home/TrendingMovieClient.tsx b/src/components/home/client/TrendingBanner.tsx similarity index 89% rename from src/components/home/TrendingMovieClient.tsx rename to src/components/home/client/TrendingBanner.tsx index 7ceeb66..107d0b5 100644 --- a/src/components/home/TrendingMovieClient.tsx +++ b/src/components/home/client/TrendingBanner.tsx @@ -1,8 +1,8 @@ 'use client'; /** - * TrendingMovieClient ์ปดํฌ๋„ŒํŠธ (Client Component) - * ๋ฐ์ดํ„ฐ๋ฅผ 5์ดˆ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์ˆœ์œ„๋ฅผ ํ•จ๊ป˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. + * TrendingBanner ์ปดํฌ๋„ŒํŠธ (Client Component) + * ํŠธ๋ Œ๋”ฉ ์˜ํ™”๋ฅผ 5์ดˆ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉฐ ์ˆœ์œ„๋ฅผ ํ•จ๊ป˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. */ import { AnimatePresence, motion } from 'framer-motion'; @@ -12,11 +12,11 @@ import { useEffect, useState } from 'react'; import { getImageUrl } from '@/constants/imageURL'; import { Movie } from '@/types/tmdb'; -interface TrendingMovieClientProps { +interface TrendingBannerProps { items: Movie[]; } -const TrendingMovieClient = ({ items }: TrendingMovieClientProps) => { +const TrendingBanner = ({ items }: TrendingBannerProps) => { const [currentIndex, setCurrentIndex] = useState(0); // 5์ดˆ๋งˆ๋‹ค ์ž๋™ ์ „ํ™˜ @@ -84,4 +84,4 @@ const TrendingMovieClient = ({ items }: TrendingMovieClientProps) => { ); }; -export default TrendingMovieClient; +export default TrendingBanner; diff --git a/src/components/home/GenrePreview.tsx b/src/components/home/server/GenrePreview.tsx similarity index 87% rename from src/components/home/GenrePreview.tsx rename to src/components/home/server/GenrePreview.tsx index e4722da..a4d9f8f 100644 --- a/src/components/home/GenrePreview.tsx +++ b/src/components/home/server/GenrePreview.tsx @@ -3,7 +3,7 @@ * ํŠน์ • ์žฅ๋ฅด์˜ ์˜ํ™”๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. */ -import MovieSwiper from '@/components/home/MovieSwiper'; +import MovieSwiper from '@/components/home/client/MovieSwiper'; import { getMoviesByGenre } from '@/lib/api'; const GenrePreview = async () => { diff --git a/src/components/home/KoreaMovie.tsx b/src/components/home/server/KoreaMovie.tsx similarity index 85% rename from src/components/home/KoreaMovie.tsx rename to src/components/home/server/KoreaMovie.tsx index d07fbf2..a91dfd9 100644 --- a/src/components/home/KoreaMovie.tsx +++ b/src/components/home/server/KoreaMovie.tsx @@ -3,7 +3,7 @@ * ํ•œ๊ตญ ์˜ํ™”๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. */ -import MovieSwiper from '@/components/home/MovieSwiper'; +import MovieSwiper from '@/components/home/client/MovieSwiper'; import { getKoreaMovie } from '@/lib/api'; const KoreaMovie = async () => { diff --git a/src/components/home/NetflixOriginal.tsx b/src/components/home/server/NetflixOriginal.tsx similarity index 87% rename from src/components/home/NetflixOriginal.tsx rename to src/components/home/server/NetflixOriginal.tsx index ce35806..675aabb 100644 --- a/src/components/home/NetflixOriginal.tsx +++ b/src/components/home/server/NetflixOriginal.tsx @@ -3,7 +3,7 @@ * ๋„ทํ”Œ๋ฆญ์Šค ์˜ค๋ฆฌ์ง€๋„ TV ํ”„๋กœ๊ทธ๋žจ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. */ -import MovieSwiper from '@/components/home/MovieSwiper'; +import MovieSwiper from '@/components/home/client/MovieSwiper'; import { getTVByNetwork } from '@/lib/api'; const NetflixOriginal = async () => { diff --git a/src/components/home/Preview.tsx b/src/components/home/server/Preview.tsx similarity index 86% rename from src/components/home/Preview.tsx rename to src/components/home/server/Preview.tsx index ccb1a85..c0d0b57 100644 --- a/src/components/home/Preview.tsx +++ b/src/components/home/server/Preview.tsx @@ -3,7 +3,7 @@ * ์ธ๊ธฐ ์˜ํ™”๋ฅผ ์›ํ˜• ์ด๋ฏธ์ง€๋กœ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ˜•ํƒœ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. */ -import MovieSwiper from '@/components/home/MovieSwiper'; +import MovieSwiper from '@/components/home/client/MovieSwiper'; import { getMoviePopular } from '@/lib/api'; const Preview = async () => { diff --git a/src/components/home/TopRatedMovies.tsx b/src/components/home/server/TopRatedMovies.tsx similarity index 86% rename from src/components/home/TopRatedMovies.tsx rename to src/components/home/server/TopRatedMovies.tsx index b33c8e3..fdef01d 100644 --- a/src/components/home/TopRatedMovies.tsx +++ b/src/components/home/server/TopRatedMovies.tsx @@ -3,7 +3,7 @@ * ๋†’์€ ํ‰์ ์˜ ์˜ํ™”๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. */ -import MovieSwiper from '@/components/home/MovieSwiper'; +import MovieSwiper from '@/components/home/client/MovieSwiper'; import { getTopRatedMovies } from '@/lib/api'; const TopRatedMovies = async () => { diff --git a/src/components/home/TrendingMovie.tsx b/src/components/home/server/TrendingMovie.tsx similarity index 60% rename from src/components/home/TrendingMovie.tsx rename to src/components/home/server/TrendingMovie.tsx index 929068f..256f112 100644 --- a/src/components/home/TrendingMovie.tsx +++ b/src/components/home/server/TrendingMovie.tsx @@ -1,16 +1,16 @@ /** * TrendingMovie ์ปดํฌ๋„ŒํŠธ (Server Component) - * ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์—์„œ fetchํ•˜์—ฌ Client Component๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. + * ํŠธ๋ Œ๋”ฉ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์—์„œ fetchํ•˜์—ฌ TrendingBanner๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. */ -import TrendingMovieClient from '@/components/home/TrendingMovieClient'; +import TrendingBanner from '@/components/home/client/TrendingBanner'; import { getTrendingAllDay } from '@/lib/api'; const TrendingMovie = async () => { const response = await getTrendingAllDay(); const items = response.results.slice(0, 10); // ์ƒ์œ„ 10๊ฐœ ์•„์ดํ…œ๋งŒ ์‚ฌ์šฉ - return ; + return ; }; export default TrendingMovie; From 507a7843d9c3acd7b5e49ff7a26e4a76561e6c23 Mon Sep 17 00:00:00 2001 From: jungyungee Date: Wed, 5 Nov 2025 07:13:21 +0900 Subject: [PATCH 33/57] =?UTF-8?q?#13=20[CHORE]=20force-dynamic=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/home/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/home/page.tsx b/src/app/home/page.tsx index 3f2fa99..280c4a8 100644 --- a/src/app/home/page.tsx +++ b/src/app/home/page.tsx @@ -3,13 +3,13 @@ * ๋„ทํ”Œ๋ฆญ์Šค ํด๋ก ์˜ ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ, ๋‹ค์–‘ํ•œ ์˜ํ™” ๋ฐ TV ํ”„๋กœ๊ทธ๋žจ ์„น์…˜์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. */ +import PlayBar from '@/components/home/client/PlayBar'; import GenrePreview from '@/components/home/server/GenrePreview'; import KoreaMovie from '@/components/home/server/KoreaMovie'; import NetflixOriginal from '@/components/home/server/NetflixOriginal'; import Preview from '@/components/home/server/Preview'; import TopRatedMovies from '@/components/home/server/TopRatedMovies'; import TrendingMovies from '@/components/home/server/TrendingMovie'; -import PlayBar from '@/components/home/client/PlayBar'; import Header from '@/components/navigation/Header'; const HomePage = () => { From b598b38e36f729a030c7bd6eb833db7d52b7ad2e Mon Sep 17 00:00:00 2001 From: jungyungee Date: Wed, 5 Nov 2025 07:52:57 +0900 Subject: [PATCH 34/57] =?UTF-8?q?#13=20[FEAT]=20ISR=20=EB=B0=A9=EC=8B=9D?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95=ED=95=98=EA=B8=B0=20?= =?UTF-8?q?=EC=9C=84=ED=95=B4=20revalidate=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/api/tmdbClient.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/api/tmdbClient.ts b/src/lib/api/tmdbClient.ts index 5941482..9641591 100644 --- a/src/lib/api/tmdbClient.ts +++ b/src/lib/api/tmdbClient.ts @@ -15,9 +15,7 @@ type QueryParams = Record; * @returns JSON ์‘๋‹ต ๋ฐ์ดํ„ฐ */ export async function tmdbGet(path: string, params: QueryParams = {}) { - // path๊ฐ€ /๋กœ ์‹œ์ž‘ํ•˜๋ฉด ์ œ๊ฑฐ (BASE_URL ๋์— /3์ด ์œ ์ง€๋˜๋„๋ก) - const cleanPath = path.startsWith('/') ? path.slice(1) : path; - const url = new URL(`${BASE_URL}/${cleanPath}`); // TMDB API ๋ฒ ์ด์Šค URL + const url = new URL(`${BASE_URL}${path}`); // TMDB API ๋ฒ ์ด์Šค URL // ๊ธฐ๋ณธ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ • url.searchParams.set('api_key', API_KEY); // TMDB API ํ‚ค (๋ชจ๋“  ์š”์ฒญ์— ์ž๋™ ํฌํ•จ) @@ -32,7 +30,9 @@ export async function tmdbGet(path: string, params: QueryParams = {}) { } }); - const res = await fetch(url.toString(), { cache: 'no-store' }); + const res = await fetch(url.toString(), { + next: { revalidate: 3600 }, // 1์‹œ๊ฐ„๋งˆ๋‹ค ๋ฐ์ดํ„ฐ ๊ฐฑ์‹  + }); if (!res.ok) { throw new Error(`TMDB API error: ${res.status} ${res.statusText}`); From e5090e4fc271609f2d6e067eef584fd171e58df2 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 8 Nov 2025 04:56:41 +0900 Subject: [PATCH 35/57] =?UTF-8?q?#15=20[FEAT]=20Tanstack=20Query=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=B0=8F=20Provider=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 70 ++++++++++++++++++++++++++------- package.json | 2 + src/app/layout.tsx | 11 ++++-- src/providers/QueryProvider.tsx | 32 +++++++++++++++ 4 files changed, 96 insertions(+), 19 deletions(-) create mode 100644 src/providers/QueryProvider.tsx diff --git a/package-lock.json b/package-lock.json index d076c3b..b5cf29c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,8 @@ "name": "next-netflix", "version": "0.1.0", "dependencies": { + "@tanstack/react-query": "^5.90.7", + "@tanstack/react-query-devtools": "^5.90.2", "framer-motion": "^12.23.24", "lottie-react": "^2.4.1", "next": "16.0.1", @@ -77,7 +79,6 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2866,7 +2867,6 @@ "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -3249,6 +3249,59 @@ "tailwindcss": "4.1.16" } }, + "node_modules/@tanstack/query-core": { + "version": "5.90.7", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.7.tgz", + "integrity": "sha512-6PN65csiuTNfBMXqQUxQhCNdtm1rV+9kC9YwWAIKcaxAauq3Wu7p18j3gQY3YIBJU70jT/wzCCZ2uqto/vQgiQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/query-devtools": { + "version": "5.90.1", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.90.1.tgz", + "integrity": "sha512-GtINOPjPUH0OegJExZ70UahT9ykmAhmtNVcmtdnOZbxLwT7R5OmRztR5Ahe3/Cu7LArEmR6/588tAycuaWb1xQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.90.7", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.7.tgz", + "integrity": "sha512-wAHc/cgKzW7LZNFloThyHnV/AX9gTg3w5yAv0gvQHPZoCnepwqCMtzbuPbb2UvfvO32XZ46e8bPOYbfZhzVnnQ==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.90.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@tanstack/react-query-devtools": { + "version": "5.90.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.90.2.tgz", + "integrity": "sha512-vAXJzZuBXtCQtrY3F/yUNJCV4obT/A/n81kb3+YqLbro5Z2+phdAbceO+deU3ywPw8B42oyJlp4FhO0SoivDFQ==", + "license": "MIT", + "dependencies": { + "@tanstack/query-devtools": "5.90.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@tanstack/react-query": "^5.90.2", + "react": "^18 || ^19" + } + }, "node_modules/@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", @@ -3307,7 +3360,6 @@ "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -3368,7 +3420,6 @@ "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.2", "@typescript-eslint/types": "8.46.2", @@ -3899,7 +3950,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4290,7 +4340,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.19", "caniuse-lite": "^1.0.30001751", @@ -5105,7 +5154,6 @@ "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -5206,7 +5254,6 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", - "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -5308,7 +5355,6 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -7652,7 +7698,6 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -7724,7 +7769,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -7734,7 +7778,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -8558,7 +8601,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -8721,7 +8763,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9041,7 +9082,6 @@ "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 0a99f2c..7474a42 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,8 @@ "lint": "eslint . --ext .js,.jsx,.ts,.tsx" }, "dependencies": { + "@tanstack/react-query": "^5.90.7", + "@tanstack/react-query-devtools": "^5.90.2", "framer-motion": "^12.23.24", "lottie-react": "^2.4.1", "next": "16.0.1", diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 415b3a7..16f78dd 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -3,6 +3,7 @@ import '@/styles/globals.css'; import type { Metadata } from 'next'; import BottomNav from '@/components/navigation/BottomNav'; +import QueryProvider from '@/providers/QueryProvider'; export const metadata: Metadata = { title: 'Netflix', @@ -17,10 +18,12 @@ const RootLayout = ({ children }: { children: React.ReactNode }) => { -
-
{children}
- -
+ +
+
{children}
+ +
+
); diff --git a/src/providers/QueryProvider.tsx b/src/providers/QueryProvider.tsx new file mode 100644 index 0000000..2989b74 --- /dev/null +++ b/src/providers/QueryProvider.tsx @@ -0,0 +1,32 @@ +'use client'; + +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; +import { ReactNode, useState } from 'react'; + +interface QueryProviderProps { + children: ReactNode; +} + +const QueryProvider = ({ children }: QueryProviderProps) => { + const [queryClient] = useState( + () => + new QueryClient({ + defaultOptions: { + queries: { + staleTime: 60 * 1000, // 1๋ถ„ + refetchOnWindowFocus: false, + }, + }, + }), + ); + + return ( + + {children} + + + ); +}; + +export default QueryProvider; From c445254840ab168c709f18df5efa44da27cc4f3e Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 8 Nov 2025 05:27:46 +0900 Subject: [PATCH 36/57] =?UTF-8?q?#15=20[FEAT]=20Search=20API=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=ED=83=80=EC=9E=85=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/api/tmdb/search.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lib/api/tmdb/search.ts b/src/lib/api/tmdb/search.ts index 3eb344c..a73e64e 100644 --- a/src/lib/api/tmdb/search.ts +++ b/src/lib/api/tmdb/search.ts @@ -4,6 +4,7 @@ */ import { tmdbGet } from '@/lib/api/tmdbClient'; +import type { Media, TMDBListResponse } from '@/types/tmdb'; /** * ํ†ตํ•ฉ ๊ฒ€์ƒ‰ (์˜ํ™” + TV ํ”„๋กœ๊ทธ๋žจ + ์ธ๋ฌผ) @@ -11,11 +12,11 @@ import { tmdbGet } from '@/lib/api/tmdbClient'; * @param page - ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ (๊ธฐ๋ณธ๊ฐ’: 1) * @returns ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ (์˜ํ™”, TV, ์ธ๋ฌผ ํฌํ•จ) */ -export const searchMulti = async (query: string, page: number = 1) => { +export const searchMulti = async (query: string, page: number = 1): Promise> => { try { return await tmdbGet('/search/multi', { query, language: 'ko-KR', page, include_adult: 'false' }); } catch (err) { console.error('searchMulti data error', err); - return { results: [] }; + return { page: 1, results: [], total_pages: 0, total_results: 0 }; } }; From e344d57d98b67e5225cfa9590bea994c5228d8d6 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 8 Nov 2025 05:34:10 +0900 Subject: [PATCH 37/57] =?UTF-8?q?#15=20[FEAT]=20Search=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EA=B8=B0=EB=B3=B8=20=EA=B5=AC=EC=A1=B0=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/search/page.tsx | 6 ++--- .../search/client/SearchContent.tsx | 25 +++++++++++++++++++ src/components/search/client/SearchInput.tsx | 11 ++++++++ .../search/client/SearchResults.tsx | 11 ++++++++ src/components/search/client/TopSearches.tsx | 7 ++++++ 5 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 src/components/search/client/SearchContent.tsx create mode 100644 src/components/search/client/SearchInput.tsx create mode 100644 src/components/search/client/SearchResults.tsx create mode 100644 src/components/search/client/TopSearches.tsx diff --git a/src/app/search/page.tsx b/src/app/search/page.tsx index 0169ff4..0ebde27 100644 --- a/src/app/search/page.tsx +++ b/src/app/search/page.tsx @@ -1,9 +1,9 @@ -import Loading from '@/components/common/Loading'; +import SearchContent from '@/components/search/client/SearchContent'; const SearchPage = () => { return ( -
- +
+
); }; diff --git a/src/components/search/client/SearchContent.tsx b/src/components/search/client/SearchContent.tsx new file mode 100644 index 0000000..b81c04f --- /dev/null +++ b/src/components/search/client/SearchContent.tsx @@ -0,0 +1,25 @@ +'use client'; + +import { useState } from 'react'; + +import SearchInput from '@/components/search/client/SearchInput'; +import SearchResults from '@/components/search/client/SearchResults'; +import TopSearches from '@/components/search/client/TopSearches'; + +const SearchContent = () => { + const [searchQuery, setSearchQuery] = useState(''); + + return ( +
+ {/* ๊ฒ€์ƒ‰ ์ž…๋ ฅ์ฐฝ */} +
+ +
+ + {/* ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ or Top Searches */} + {searchQuery ? : } +
+ ); +}; + +export default SearchContent; diff --git a/src/components/search/client/SearchInput.tsx b/src/components/search/client/SearchInput.tsx new file mode 100644 index 0000000..9176c04 --- /dev/null +++ b/src/components/search/client/SearchInput.tsx @@ -0,0 +1,11 @@ +'use client'; + +interface SearchInputProps { + onSearchChange: (query: string) => void; +} + +const SearchInput = ({ onSearchChange }: SearchInputProps) => { + return
SearchInput
; +}; + +export default SearchInput; diff --git a/src/components/search/client/SearchResults.tsx b/src/components/search/client/SearchResults.tsx new file mode 100644 index 0000000..f9b8249 --- /dev/null +++ b/src/components/search/client/SearchResults.tsx @@ -0,0 +1,11 @@ +'use client'; + +interface SearchResultsProps { + query: string; +} + +const SearchResults = ({ query }: SearchResultsProps) => { + return
SearchResults: {query}
; +}; + +export default SearchResults; diff --git a/src/components/search/client/TopSearches.tsx b/src/components/search/client/TopSearches.tsx new file mode 100644 index 0000000..f608b78 --- /dev/null +++ b/src/components/search/client/TopSearches.tsx @@ -0,0 +1,7 @@ +'use client'; + +const TopSearches = () => { + return
TopSearches
; +}; + +export default TopSearches; From e5b417d213bd329f017877c6b05df176356bab19 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 8 Nov 2025 13:16:45 +0900 Subject: [PATCH 38/57] =?UTF-8?q?#15=20[FEAT]=20=EA=B8=B0=EB=B3=B8=20Top?= =?UTF-8?q?=20seraches=20ui=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search/client/SearchContent.tsx | 5 +- src/components/search/client/SearchInput.tsx | 31 ++++++++- src/components/search/client/TopSearches.tsx | 66 ++++++++++++++++++- src/svgs/common/searchIcon.svg | 3 + src/svgs/common/xIcon.svg | 3 + src/svgs/search/playButton.svg | 4 ++ 6 files changed, 108 insertions(+), 4 deletions(-) create mode 100644 src/svgs/common/searchIcon.svg create mode 100644 src/svgs/common/xIcon.svg create mode 100644 src/svgs/search/playButton.svg diff --git a/src/components/search/client/SearchContent.tsx b/src/components/search/client/SearchContent.tsx index b81c04f..00d2820 100644 --- a/src/components/search/client/SearchContent.tsx +++ b/src/components/search/client/SearchContent.tsx @@ -11,8 +11,9 @@ const SearchContent = () => { return (
- {/* ๊ฒ€์ƒ‰ ์ž…๋ ฅ์ฐฝ */} -
+ {/* ๊ฒ€์ƒ‰ ์ž…๋ ฅ์ฐฝ ๋ฐ ํ—ค๋” */} +
+
diff --git a/src/components/search/client/SearchInput.tsx b/src/components/search/client/SearchInput.tsx index 9176c04..52c3710 100644 --- a/src/components/search/client/SearchInput.tsx +++ b/src/components/search/client/SearchInput.tsx @@ -1,11 +1,40 @@ 'use client'; +import { useEffect, useState } from 'react'; + +import SearchIcon from '@/svgs/common/searchIcon.svg'; +import XIcon from '@/svgs/common/xIcon.svg'; + interface SearchInputProps { onSearchChange: (query: string) => void; } const SearchInput = ({ onSearchChange }: SearchInputProps) => { - return
SearchInput
; + const [query, setQuery] = useState(''); + + useEffect(() => { + const handler = setTimeout(() => { + onSearchChange(query); + }, 300); + + return () => { + clearTimeout(handler); + }; + }, [query, onSearchChange]); + + return ( +
+ + setQuery(e.target.value)} + placeholder="Search for a show, movie, genre, e.t.c." + className="flex-1 p-3 bg-transparent text-white text-body1 outline-none placeholder:text-gray-100" + /> + setQuery('')} /> +
+ ); }; export default SearchInput; diff --git a/src/components/search/client/TopSearches.tsx b/src/components/search/client/TopSearches.tsx index f608b78..d655438 100644 --- a/src/components/search/client/TopSearches.tsx +++ b/src/components/search/client/TopSearches.tsx @@ -1,7 +1,71 @@ 'use client'; +import { useQuery } from '@tanstack/react-query'; +import Image from 'next/image'; + +import { getTrendingAllDay } from '@/lib/api/tmdb/home'; +import { getImageUrl } from '@/constants/imageURL'; +import type { Media } from '@/types/tmdb'; +import PlayButton from '@/svgs/search/playButton.svg'; + const TopSearches = () => { - return
TopSearches
; + const { data, isLoading, error } = useQuery({ + queryKey: ['topSearches'], + queryFn: getTrendingAllDay, + }); + + if (isLoading) { + return ( +
+

Top Searches

+
+ {[...Array(7)].map((_, i) => ( +
+ ))} +
+
+ ); + } + + if (error || !data?.results) { + return null; + } + + const items = data.results.slice(0, 7) as Media[]; + + const getTitle = (item: Media) => { + if ('title' in item) return item.title; + if ('name' in item) return item.name; + return 'Unknown'; + }; + + return ( +
+

Top Searches

+
+ {items.map((item) => ( +
+ {/* ์ด๋ฏธ์ง€ */} +
+ {getTitle(item)} +
+ + {/* ์ œ๋ชฉ ๋ฐ ์žฌ์ƒ ๋ฒ„ํŠผ */} +
+

{getTitle(item)}

+ +
+
+ ))} +
+
+ ); }; export default TopSearches; diff --git a/src/svgs/common/searchIcon.svg b/src/svgs/common/searchIcon.svg new file mode 100644 index 0000000..381d3b0 --- /dev/null +++ b/src/svgs/common/searchIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/svgs/common/xIcon.svg b/src/svgs/common/xIcon.svg new file mode 100644 index 0000000..d786511 --- /dev/null +++ b/src/svgs/common/xIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/svgs/search/playButton.svg b/src/svgs/search/playButton.svg new file mode 100644 index 0000000..6d95f76 --- /dev/null +++ b/src/svgs/search/playButton.svg @@ -0,0 +1,4 @@ + + + + From fe6cf2a2c8b74f84e3f16c20c7879d2cdf2bad10 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 8 Nov 2025 13:28:06 +0900 Subject: [PATCH 39/57] =?UTF-8?q?#15=20[REFACTOR]=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=EB=AF=B8=EB=94=94=EC=96=B4=20=EA=B3=B5=ED=86=B5=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=B0=8F=20=EC=9C=A0=ED=8B=B8?= =?UTF-8?q?=EB=A6=AC=ED=8B=B0=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/search/client/MediaCard.tsx | 35 ++++++++++++++++++++++ src/lib/utils/media.ts | 12 ++++++++ 2 files changed, 47 insertions(+) create mode 100644 src/components/search/client/MediaCard.tsx create mode 100644 src/lib/utils/media.ts diff --git a/src/components/search/client/MediaCard.tsx b/src/components/search/client/MediaCard.tsx new file mode 100644 index 0000000..50d2396 --- /dev/null +++ b/src/components/search/client/MediaCard.tsx @@ -0,0 +1,35 @@ +import Image from 'next/image'; + +import { getImageUrl } from '@/constants/imageURL'; +import { getMediaTitle } from '@/lib/utils/media'; +import PlayButton from '@/svgs/search/playButton.svg'; +import type { Media } from '@/types/tmdb'; + +interface MediaCardProps { + item: Media; +} + +const MediaCard = ({ item }: MediaCardProps) => { + return ( +
+ {/* ์ด๋ฏธ์ง€ */} +
+ {getMediaTitle(item)} +
+ + {/* ์ œ๋ชฉ ๋ฐ ์žฌ์ƒ ๋ฒ„ํŠผ */} +
+

{getMediaTitle(item)}

+ +
+
+ ); +}; + +export default MediaCard; diff --git a/src/lib/utils/media.ts b/src/lib/utils/media.ts new file mode 100644 index 0000000..8eed519 --- /dev/null +++ b/src/lib/utils/media.ts @@ -0,0 +1,12 @@ +import type { Media } from '@/types/tmdb'; + +/** + * Media ๊ฐ์ฒด์—์„œ ์ œ๋ชฉ์„ ์ถ”์ถœํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ + * @param item - Movie ๋˜๋Š” TV ๊ฐ์ฒด + * @returns ์ œ๋ชฉ ๋ฌธ์ž์—ด + */ +export const getMediaTitle = (item: Media): string => { + if ('title' in item) return item.title; + if ('name' in item) return item.name; + return 'Unknown'; +}; From 95926c10cb5b17079adbe3b1bcf670474f3a84c4 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 8 Nov 2025 13:28:28 +0900 Subject: [PATCH 40/57] =?UTF-8?q?#15=20[FEAT]=20getTrendingAllDay=20API=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EB=84=A4=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EC=A7=80=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/api/tmdb/home.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lib/api/tmdb/home.ts b/src/lib/api/tmdb/home.ts index 9e0358f..d93c6a8 100644 --- a/src/lib/api/tmdb/home.ts +++ b/src/lib/api/tmdb/home.ts @@ -8,11 +8,12 @@ import { tmdbGet } from '@/lib/api/tmdbClient'; /** * ์˜ค๋Š˜์˜ ํŠธ๋ Œ๋”ฉ ์ฝ˜ํ…์ธ  (์˜ํ™” + TV ํ”„๋กœ๊ทธ๋žจ) * ๋‹น์ผ ๊ฐ€์žฅ ์ธ๊ธฐ์žˆ๋Š” ๋ชจ๋“  ๋ฏธ๋””์–ด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. + * @param page - ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ (๊ธฐ๋ณธ๊ฐ’: 1) * @returns TMDB ํŠธ๋ Œ๋”ฉ ๋ฐ์ดํ„ฐ (์˜ํ™” ๋ฐ TV ํฌํ•จ) */ -export const getTrendingAllDay = async () => { +export const getTrendingAllDay = async (page: number = 1) => { try { - return await tmdbGet('/trending/all/day', { language: 'ko-KR' }); + return await tmdbGet('/trending/all/day', { language: 'ko-KR', page }); } catch (err) { console.error('getTrendingAllDay data error', err); return { results: [] } as const; From 588821c84a11b55ac47fcf1e4f442ad168c78bc6 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 8 Nov 2025 13:28:40 +0900 Subject: [PATCH 41/57] =?UTF-8?q?#15=20[FEAT]=20Top=20Searches=20=EB=AC=B4?= =?UTF-8?q?=ED=95=9C=20=EC=8A=A4=ED=81=AC=EB=A1=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/search/client/TopSearches.tsx | 86 ++++++++++++-------- 1 file changed, 50 insertions(+), 36 deletions(-) diff --git a/src/components/search/client/TopSearches.tsx b/src/components/search/client/TopSearches.tsx index d655438..664f319 100644 --- a/src/components/search/client/TopSearches.tsx +++ b/src/components/search/client/TopSearches.tsx @@ -1,69 +1,83 @@ 'use client'; -import { useQuery } from '@tanstack/react-query'; -import Image from 'next/image'; +import { useInfiniteQuery } from '@tanstack/react-query'; +import { useEffect, useRef } from 'react'; +import MediaCard from '@/components/search/client/MediaCard'; import { getTrendingAllDay } from '@/lib/api/tmdb/home'; -import { getImageUrl } from '@/constants/imageURL'; import type { Media } from '@/types/tmdb'; -import PlayButton from '@/svgs/search/playButton.svg'; const TopSearches = () => { - const { data, isLoading, error } = useQuery({ + const observerRef = useRef(null); + + const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading, error } = useInfiniteQuery({ queryKey: ['topSearches'], - queryFn: getTrendingAllDay, + queryFn: ({ pageParam = 1 }) => getTrendingAllDay(pageParam), + getNextPageParam: (lastPage) => { + if ('total_pages' in lastPage && 'page' in lastPage) { + if (lastPage.page < lastPage.total_pages) { + return lastPage.page + 1; + } + } + return undefined; + }, + initialPageParam: 1, }); + // Intersection Observer๋กœ ๋ฌดํ•œ ์Šคํฌ๋กค ๊ตฌํ˜„ + useEffect(() => { + const observer = new IntersectionObserver( + (entries) => { + if (entries[0].isIntersecting && hasNextPage && !isFetchingNextPage) { + fetchNextPage(); + } + }, + { threshold: 0.5 }, + ); + + if (observerRef.current) { + observer.observe(observerRef.current); + } + + return () => observer.disconnect(); + }, [hasNextPage, isFetchingNextPage, fetchNextPage]); + if (isLoading) { return ( -
-

Top Searches

-
+
+

Top Searches

+
{[...Array(7)].map((_, i) => ( -
+
))}
); } - if (error || !data?.results) { + if (error || !data) { return null; } - const items = data.results.slice(0, 7) as Media[]; + const allResults = data.pages.flatMap((page) => page.results) || []; - const getTitle = (item: Media) => { - if ('title' in item) return item.title; - if ('name' in item) return item.name; - return 'Unknown'; - }; + if (allResults.length === 0) { + return null; + } return (

Top Searches

- {items.map((item) => ( -
- {/* ์ด๋ฏธ์ง€ */} -
- {getTitle(item)} -
- - {/* ์ œ๋ชฉ ๋ฐ ์žฌ์ƒ ๋ฒ„ํŠผ */} -
-

{getTitle(item)}

- -
-
+ {allResults.map((item) => ( + ))}
+ + {/* ๋ฌดํ•œ ์Šคํฌ๋กค ํŠธ๋ฆฌ๊ฑฐ */} +
+ {isFetchingNextPage &&

Loading more...

} +
); }; From c2cc94e94dccf472b34ebe35ed1fbf4ae38622d0 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 8 Nov 2025 13:28:51 +0900 Subject: [PATCH 42/57] =?UTF-8?q?#15=20[REFACTOR]=20SearchResults=20MediaC?= =?UTF-8?q?ard=20=EC=9E=AC=EC=82=AC=EC=9A=A9=20=EB=B0=8F=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=98=81=EB=AC=B8=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search/client/SearchResults.tsx | 87 ++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/src/components/search/client/SearchResults.tsx b/src/components/search/client/SearchResults.tsx index f9b8249..4d91085 100644 --- a/src/components/search/client/SearchResults.tsx +++ b/src/components/search/client/SearchResults.tsx @@ -1,11 +1,96 @@ 'use client'; +import { useInfiniteQuery } from '@tanstack/react-query'; +import { useEffect, useRef } from 'react'; + +import MediaCard from '@/components/search/client/MediaCard'; +import { searchMulti } from '@/lib/api/tmdb/search'; +import type { Media } from '@/types/tmdb'; + interface SearchResultsProps { query: string; } const SearchResults = ({ query }: SearchResultsProps) => { - return
SearchResults: {query}
; + const observerRef = useRef(null); + + const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading, error } = useInfiniteQuery({ + queryKey: ['searchResults', query], + queryFn: ({ pageParam = 1 }) => searchMulti(query, pageParam), + getNextPageParam: (lastPage) => { + if (lastPage.page < lastPage.total_pages) { + return lastPage.page + 1; + } + return undefined; + }, + initialPageParam: 1, + enabled: !!query, + }); + + // Intersection Observer๋กœ ๋ฌดํ•œ ์Šคํฌ๋กค ๊ตฌํ˜„ + useEffect(() => { + const observer = new IntersectionObserver( + (entries) => { + if (entries[0].isIntersecting && hasNextPage && !isFetchingNextPage) { + fetchNextPage(); + } + }, + { threshold: 0.5 }, + ); + + if (observerRef.current) { + observer.observe(observerRef.current); + } + + return () => observer.disconnect(); + }, [hasNextPage, isFetchingNextPage, fetchNextPage]); + + if (isLoading) { + return ( +
+

Search Results

+
+ {[...Array(5)].map((_, i) => ( +
+ ))} +
+
+ ); + } + + if (error) { + return ( +
+

An error occurred while searching

+
+ ); + } + + const allResults = data?.pages.flatMap((page) => page.results) || []; + + if (allResults.length === 0) { + return ( +
+

No results found

+
+ ); + } + + return ( +
+

Search Results

+
+ {allResults.map((item) => ( + + ))} +
+ + {/* ๋ฌดํ•œ ์Šคํฌ๋กค ํŠธ๋ฆฌ๊ฑฐ */} +
+ {isFetchingNextPage &&

Loading more...

} +
+
+ ); }; export default SearchResults; From d48ea0664f18d9faf5517c64da2fb79cd30a5538 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 8 Nov 2025 13:56:45 +0900 Subject: [PATCH 43/57] =?UTF-8?q?#15=20[FIX]=20=EB=B0=B0=EC=9A=B0=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=20=ED=95=84=ED=84=B0=EB=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/search/client/SearchResults.tsx | 3 ++- src/types/tmdb.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/search/client/SearchResults.tsx b/src/components/search/client/SearchResults.tsx index 4d91085..03c5f0b 100644 --- a/src/components/search/client/SearchResults.tsx +++ b/src/components/search/client/SearchResults.tsx @@ -66,7 +66,8 @@ const SearchResults = ({ query }: SearchResultsProps) => { ); } - const allResults = data?.pages.flatMap((page) => page.results) || []; + // ๋ฐฐ์šฐ(person) ์ œ์™ธ, ์˜ํ™”์™€ TV๋งŒ ํฌํ•จ + const allResults = data?.pages.flatMap((page) => page.results.filter((item) => item.media_type !== 'person')) || []; if (allResults.length === 0) { return ( diff --git a/src/types/tmdb.ts b/src/types/tmdb.ts index d3249b9..86984cc 100644 --- a/src/types/tmdb.ts +++ b/src/types/tmdb.ts @@ -13,7 +13,7 @@ interface BaseMedia { overview?: string; // ์ค„๊ฑฐ๋ฆฌ ์š”์•ฝ vote_average?: number; // ํ‰๊ท  ํ‰์  (0-10) popularity?: number; // ์ธ๊ธฐ๋„ ์ ์ˆ˜ - media_type?: 'movie' | 'tv'; // ๋ฏธ๋””์–ด ํƒ€์ž… (์˜ํ™” ๋˜๋Š” TV) + media_type?: 'movie' | 'tv' | 'person'; // ๋ฏธ๋””์–ด ํƒ€์ž… (์˜ํ™”, TV, ์ธ๋ฌผ) } /** From 190d43d0bfe44fde810dbd3d78299c683ac12743 Mon Sep 17 00:00:00 2001 From: jungyungee Date: Sat, 8 Nov 2025 16:42:25 +0900 Subject: [PATCH 44/57] =?UTF-8?q?#16=20[FEAT]=20=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20?= =?UTF-8?q?movie=20swiper=EA=B3=BC=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/detail/[mediaType]/[id]/page.tsx | 51 ++++++++++++++++++++++ src/components/home/client/MovieSwiper.tsx | 42 +++++++++++------- 2 files changed, 77 insertions(+), 16 deletions(-) create mode 100644 src/app/detail/[mediaType]/[id]/page.tsx diff --git a/src/app/detail/[mediaType]/[id]/page.tsx b/src/app/detail/[mediaType]/[id]/page.tsx new file mode 100644 index 0000000..90af6f9 --- /dev/null +++ b/src/app/detail/[mediaType]/[id]/page.tsx @@ -0,0 +1,51 @@ +import Image from 'next/image'; + +import { getImageUrl } from '@/constants/imageURL'; +import { getDetail } from '@/lib/api/tmdb/detail'; +import PlayIcon from '@/svgs/navigation/playIcon.svg'; + +const DetailPage = async ({ params }: { params: Promise<{ mediaType: string; id: string }> }) => { + const { mediaType, id } = await params; + const detail = await getDetail(mediaType, id); + + if (!detail) { + return ( +
+

์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

+
+ ); + } + + const title = 'title' in detail ? detail.title : detail.name; + const overviewText = (detail.overview || '').trim(); + + return ( +
+ {/* ํฌ์Šคํ„ฐ ์ด๋ฏธ์ง€ */} + {detail.poster_path && ( +
+ {title} +
+
+ )} + {/* ์žฌ์ƒ ๋ฒ„ํŠผ */} +
+ +
+ {/* ์ƒ์„ธ ์ •๋ณด */} +
+

Previews

+ {overviewText ? ( +

{overviewText}

+ ) : ( +

์ค„๊ฑฐ๋ฆฌ๊ฐ€ ๋”ฐ๋กœ ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

+ )} +
+
+ ); +}; + +export default DetailPage; diff --git a/src/components/home/client/MovieSwiper.tsx b/src/components/home/client/MovieSwiper.tsx index c3fd1ff..0c1b721 100644 --- a/src/components/home/client/MovieSwiper.tsx +++ b/src/components/home/client/MovieSwiper.tsx @@ -10,6 +10,7 @@ import 'swiper/css/free-mode'; import 'swiper/css/navigation'; import Image from 'next/image'; +import Link from 'next/link'; import { FreeMode, Navigation } from 'swiper/modules'; import { Swiper, SwiperSlide } from 'swiper/react'; @@ -34,6 +35,13 @@ const getTitle = (item: Movie | TV): string => { return 'title' in item ? item.title : item.name; }; +/** + * ๋ฏธ๋””์–ด ํƒ€์ž… ํ™•์ธ ํ—ฌํผ ํ•จ์ˆ˜ + */ +const getMediaType = (item: Movie | TV): 'movie' | 'tv' => { + return 'title' in item ? 'movie' : 'tv'; +}; + const MovieSwiper = ({ title, items, itemWidth, itemHeight, shape = 'rectangle' }: MovieSwiperProps) => { return (
@@ -51,23 +59,25 @@ const MovieSwiper = ({ title, items, itemWidth, itemHeight, shape = 'rectangle' > {items.map((item) => ( -
+
- {item.poster_path ? ( - {getTitle(item)} - ) : ( - // poster_path๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ํ”Œ๋ ˆ์ด์Šคํ™€๋” -
No Image
- )} -
+ style={{ width: itemWidth, height: itemHeight, borderRadius: shape === 'circle' ? '50%' : '8px' }} + > + {item.poster_path ? ( + {getTitle(item)} + ) : ( + // poster_path๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ํ”Œ๋ ˆ์ด์Šคํ™€๋” +
No Image
+ )} +
+
))} From 04c28df94a805cb13d3e5c01db17863f91c6acd5 Mon Sep 17 00:00:00 2001 From: jungyungee Date: Sat, 8 Nov 2025 16:57:18 +0900 Subject: [PATCH 45/57] =?UTF-8?q?#16=20[FEAT]=20Trending=20Movie=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/detail/[mediaType]/[id]/page.tsx | 4 ++-- src/app/home/page.tsx | 2 -- src/components/home/client/PlayBar.tsx | 19 +++++++++++++++---- src/components/home/client/TrendingBanner.tsx | 4 ++++ 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/app/detail/[mediaType]/[id]/page.tsx b/src/app/detail/[mediaType]/[id]/page.tsx index 90af6f9..292a369 100644 --- a/src/app/detail/[mediaType]/[id]/page.tsx +++ b/src/app/detail/[mediaType]/[id]/page.tsx @@ -20,7 +20,7 @@ const DetailPage = async ({ params }: { params: Promise<{ mediaType: string; id: const overviewText = (detail.overview || '').trim(); return ( -
+
{/* ํฌ์Šคํ„ฐ ์ด๋ฏธ์ง€ */} {detail.poster_path && (
@@ -30,7 +30,7 @@ const DetailPage = async ({ params }: { params: Promise<{ mediaType: string; id: )} {/* ์žฌ์ƒ ๋ฒ„ํŠผ */}
- diff --git a/src/app/home/page.tsx b/src/app/home/page.tsx index 280c4a8..32882b3 100644 --- a/src/app/home/page.tsx +++ b/src/app/home/page.tsx @@ -3,7 +3,6 @@ * ๋„ทํ”Œ๋ฆญ์Šค ํด๋ก ์˜ ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ, ๋‹ค์–‘ํ•œ ์˜ํ™” ๋ฐ TV ํ”„๋กœ๊ทธ๋žจ ์„น์…˜์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. */ -import PlayBar from '@/components/home/client/PlayBar'; import GenrePreview from '@/components/home/server/GenrePreview'; import KoreaMovie from '@/components/home/server/KoreaMovie'; import NetflixOriginal from '@/components/home/server/NetflixOriginal'; @@ -17,7 +16,6 @@ const HomePage = () => {
- {/* ์„น์…˜ ์ปจํ…Œ์ด๋„ˆ */}
diff --git a/src/components/home/client/PlayBar.tsx b/src/components/home/client/PlayBar.tsx index 9f09a7c..5bb0420 100644 --- a/src/components/home/client/PlayBar.tsx +++ b/src/components/home/client/PlayBar.tsx @@ -1,24 +1,35 @@ 'use client'; +import Link from 'next/link'; + import AddIcon from '@/svgs/navigation/addIcon.svg'; import InfoIcon from '@/svgs/navigation/infoIcon.svg'; import PlayIcon from '@/svgs/navigation/playIcon.svg'; -const PlayBar = () => { +interface PlayBarProps { + mediaId: number; // ํ•ญ์ƒ ์กด์žฌ + mediaType?: 'movie' | 'tv'; // ๊ธฐ๋ณธ movie +} + +const PlayBar = ({ mediaId, mediaType = 'movie' }: PlayBarProps) => { return (
My List
- -
+ Info -
+
); }; diff --git a/src/components/home/client/TrendingBanner.tsx b/src/components/home/client/TrendingBanner.tsx index 107d0b5..e660058 100644 --- a/src/components/home/client/TrendingBanner.tsx +++ b/src/components/home/client/TrendingBanner.tsx @@ -9,6 +9,7 @@ import { AnimatePresence, motion } from 'framer-motion'; import Image from 'next/image'; import { useEffect, useState } from 'react'; +import PlayBar from '@/components/home/client/PlayBar'; import { getImageUrl } from '@/constants/imageURL'; import { Movie } from '@/types/tmdb'; @@ -80,6 +81,9 @@ const TrendingBanner = ({ items }: TrendingBannerProps) => {
+
+ +
); }; From 102583741ac6006769e6cc74983e3a8127658f37 Mon Sep 17 00:00:00 2001 From: jungyungee Date: Sat, 8 Nov 2025 17:24:10 +0900 Subject: [PATCH 46/57] =?UTF-8?q?#16=20[CHORE]=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/home/client/MovieSwiper.tsx | 2 +- src/components/home/client/PlayBar.tsx | 4 ++-- src/components/home/client/TrendingBanner.tsx | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/home/client/MovieSwiper.tsx b/src/components/home/client/MovieSwiper.tsx index 0c1b721..6325b56 100644 --- a/src/components/home/client/MovieSwiper.tsx +++ b/src/components/home/client/MovieSwiper.tsx @@ -36,7 +36,7 @@ const getTitle = (item: Movie | TV): string => { }; /** - * ๋ฏธ๋””์–ด ํƒ€์ž… ํ™•์ธ ํ—ฌํผ ํ•จ์ˆ˜ + * ๋ฏธ๋””์–ด ํƒ€์ž… ํ™•์ธ ํ—ฌํผ ํ•จ์ˆ˜ (movie: title ์†์„ฑ ์กด์žฌ ์‹œ, tv: name ์†์„ฑ ์กด์žฌ ์‹œ) */ const getMediaType = (item: Movie | TV): 'movie' | 'tv' => { return 'title' in item ? 'movie' : 'tv'; diff --git a/src/components/home/client/PlayBar.tsx b/src/components/home/client/PlayBar.tsx index 5bb0420..a4f05c6 100644 --- a/src/components/home/client/PlayBar.tsx +++ b/src/components/home/client/PlayBar.tsx @@ -7,8 +7,8 @@ import InfoIcon from '@/svgs/navigation/infoIcon.svg'; import PlayIcon from '@/svgs/navigation/playIcon.svg'; interface PlayBarProps { - mediaId: number; // ํ•ญ์ƒ ์กด์žฌ - mediaType?: 'movie' | 'tv'; // ๊ธฐ๋ณธ movie + mediaId: number; + mediaType?: 'movie' | 'tv'; } const PlayBar = ({ mediaId, mediaType = 'movie' }: PlayBarProps) => { diff --git a/src/components/home/client/TrendingBanner.tsx b/src/components/home/client/TrendingBanner.tsx index e660058..d214612 100644 --- a/src/components/home/client/TrendingBanner.tsx +++ b/src/components/home/client/TrendingBanner.tsx @@ -81,6 +81,7 @@ const TrendingBanner = ({ items }: TrendingBannerProps) => {
+ {/* PlayBar ์ปดํฌ๋„ŒํŠธ ์ด๋™ (์ƒ์„ธํŽ˜์ด์ง€๋กœ ์ด๋™ ๊ฐ€๋Šฅ) */}
From 83a878f63c8a0b16a5abbe6ac4e8717c68406c6f Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 8 Nov 2025 21:39:17 +0900 Subject: [PATCH 47/57] =?UTF-8?q?#19=20[FEAT]=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=ED=81=B4=EB=A6=AD=20=EC=8B=9C=20detail=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/search/client/MediaCard.tsx | 35 ++++++++++++---------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/components/search/client/MediaCard.tsx b/src/components/search/client/MediaCard.tsx index 50d2396..cef2ebf 100644 --- a/src/components/search/client/MediaCard.tsx +++ b/src/components/search/client/MediaCard.tsx @@ -1,4 +1,5 @@ import Image from 'next/image'; +import Link from 'next/link'; import { getImageUrl } from '@/constants/imageURL'; import { getMediaTitle } from '@/lib/utils/media'; @@ -11,24 +12,26 @@ interface MediaCardProps { const MediaCard = ({ item }: MediaCardProps) => { return ( -
- {/* ์ด๋ฏธ์ง€ */} -
- {getMediaTitle(item)} -
+ +
+ {/* ์ด๋ฏธ์ง€ */} +
+ {getMediaTitle(item)} +
- {/* ์ œ๋ชฉ ๋ฐ ์žฌ์ƒ ๋ฒ„ํŠผ */} -
-

{getMediaTitle(item)}

- + {/* ์ œ๋ชฉ ๋ฐ ์žฌ์ƒ ๋ฒ„ํŠผ */} +
+

{getMediaTitle(item)}

+ +
-
+ ); }; From e114665927829b3ca5c4a0a1d294e1f126ff42af Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 8 Nov 2025 21:57:03 +0900 Subject: [PATCH 48/57] =?UTF-8?q?#19=20[REFACTOR]=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20utils=20=ED=95=A8=EC=88=98=EB=A1=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/home/client/MovieSwiper.tsx | 23 ++++++---------------- src/components/search/client/MediaCard.tsx | 4 ++-- src/lib/utils/media.ts | 9 +++++++++ 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/components/home/client/MovieSwiper.tsx b/src/components/home/client/MovieSwiper.tsx index 6325b56..1beb8fd 100644 --- a/src/components/home/client/MovieSwiper.tsx +++ b/src/components/home/client/MovieSwiper.tsx @@ -15,6 +15,7 @@ import { FreeMode, Navigation } from 'swiper/modules'; import { Swiper, SwiperSlide } from 'swiper/react'; import { getImageUrl } from '@/constants/imageURL'; +import { getMediaTitle, getMediaType } from '@/lib/utils/media'; import { Movie, TV } from '@/types/tmdb'; /** @@ -28,20 +29,6 @@ interface MovieSwiperProps { shape?: 'rectangle' | 'circle'; // ์•„์ดํ…œ ๋ชจ์–‘ (๊ธฐ๋ณธ๊ฐ’: rectangle) } -/** - * ์˜ํ™”/TV ํ”„๋กœ๊ทธ๋žจ ์ œ๋ชฉ ์ถ”์ถœ ํ—ฌํผ ํ•จ์ˆ˜ - */ -const getTitle = (item: Movie | TV): string => { - return 'title' in item ? item.title : item.name; -}; - -/** - * ๋ฏธ๋””์–ด ํƒ€์ž… ํ™•์ธ ํ—ฌํผ ํ•จ์ˆ˜ (movie: title ์†์„ฑ ์กด์žฌ ์‹œ, tv: name ์†์„ฑ ์กด์žฌ ์‹œ) - */ -const getMediaType = (item: Movie | TV): 'movie' | 'tv' => { - return 'title' in item ? 'movie' : 'tv'; -}; - const MovieSwiper = ({ title, items, itemWidth, itemHeight, shape = 'rectangle' }: MovieSwiperProps) => { return (
@@ -61,20 +48,22 @@ const MovieSwiper = ({ title, items, itemWidth, itemHeight, shape = 'rectangle'
{item.poster_path ? ( {getTitle(item)} ) : ( // poster_path๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ํ”Œ๋ ˆ์ด์Šคํ™€๋” -
No Image
+
+ No Image +
)}
diff --git a/src/components/search/client/MediaCard.tsx b/src/components/search/client/MediaCard.tsx index cef2ebf..00e1786 100644 --- a/src/components/search/client/MediaCard.tsx +++ b/src/components/search/client/MediaCard.tsx @@ -2,7 +2,7 @@ import Image from 'next/image'; import Link from 'next/link'; import { getImageUrl } from '@/constants/imageURL'; -import { getMediaTitle } from '@/lib/utils/media'; +import { getMediaTitle, getMediaType } from '@/lib/utils/media'; import PlayButton from '@/svgs/search/playButton.svg'; import type { Media } from '@/types/tmdb'; @@ -12,7 +12,7 @@ interface MediaCardProps { const MediaCard = ({ item }: MediaCardProps) => { return ( - +
{/* ์ด๋ฏธ์ง€ */}
diff --git a/src/lib/utils/media.ts b/src/lib/utils/media.ts index 8eed519..534ce7a 100644 --- a/src/lib/utils/media.ts +++ b/src/lib/utils/media.ts @@ -10,3 +10,12 @@ export const getMediaTitle = (item: Media): string => { if ('name' in item) return item.name; return 'Unknown'; }; + +/** + * Media ๊ฐ์ฒด์—์„œ ๋ฏธ๋””์–ด ํƒ€์ž…์„ ์ถ”์ถœํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ + * @param item - Movie ๋˜๋Š” TV ๊ฐ์ฒด + * @returns ๋ฏธ๋””์–ด ํƒ€์ž… ('movie' | 'tv') + */ +export const getMediaType = (item: Media): 'movie' | 'tv' => { + return 'title' in item ? 'movie' : 'tv'; +}; From 0464469f17432bc8d60f9e41b81937bec02e1573 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 8 Nov 2025 22:01:14 +0900 Subject: [PATCH 49/57] =?UTF-8?q?#19=20[FIX]=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=A4=91=EB=B3=B5=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/search/client/SearchResults.tsx | 8 ++++++-- src/components/search/client/TopSearches.tsx | 8 ++++++-- src/lib/utils/media.ts | 11 +++++++++++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/components/search/client/SearchResults.tsx b/src/components/search/client/SearchResults.tsx index 03c5f0b..5ae3ab4 100644 --- a/src/components/search/client/SearchResults.tsx +++ b/src/components/search/client/SearchResults.tsx @@ -5,6 +5,7 @@ import { useEffect, useRef } from 'react'; import MediaCard from '@/components/search/client/MediaCard'; import { searchMulti } from '@/lib/api/tmdb/search'; +import { removeDuplicateMedia } from '@/lib/utils/media'; import type { Media } from '@/types/tmdb'; interface SearchResultsProps { @@ -69,7 +70,10 @@ const SearchResults = ({ query }: SearchResultsProps) => { // ๋ฐฐ์šฐ(person) ์ œ์™ธ, ์˜ํ™”์™€ TV๋งŒ ํฌํ•จ const allResults = data?.pages.flatMap((page) => page.results.filter((item) => item.media_type !== 'person')) || []; - if (allResults.length === 0) { + // ์ค‘๋ณต ์ œ๊ฑฐ + const uniqueResults = removeDuplicateMedia(allResults); + + if (uniqueResults.length === 0) { return (

No results found

@@ -81,7 +85,7 @@ const SearchResults = ({ query }: SearchResultsProps) => {

Search Results

- {allResults.map((item) => ( + {uniqueResults.map((item) => ( ))}
diff --git a/src/components/search/client/TopSearches.tsx b/src/components/search/client/TopSearches.tsx index 664f319..64062b6 100644 --- a/src/components/search/client/TopSearches.tsx +++ b/src/components/search/client/TopSearches.tsx @@ -5,6 +5,7 @@ import { useEffect, useRef } from 'react'; import MediaCard from '@/components/search/client/MediaCard'; import { getTrendingAllDay } from '@/lib/api/tmdb/home'; +import { removeDuplicateMedia } from '@/lib/utils/media'; import type { Media } from '@/types/tmdb'; const TopSearches = () => { @@ -61,7 +62,10 @@ const TopSearches = () => { const allResults = data.pages.flatMap((page) => page.results) || []; - if (allResults.length === 0) { + // ์ค‘๋ณต ์ œ๊ฑฐ + const uniqueResults = removeDuplicateMedia(allResults as Media[]); + + if (uniqueResults.length === 0) { return null; } @@ -69,7 +73,7 @@ const TopSearches = () => {

Top Searches

- {allResults.map((item) => ( + {uniqueResults.map((item) => ( ))}
diff --git a/src/lib/utils/media.ts b/src/lib/utils/media.ts index 534ce7a..ad57210 100644 --- a/src/lib/utils/media.ts +++ b/src/lib/utils/media.ts @@ -19,3 +19,14 @@ export const getMediaTitle = (item: Media): string => { export const getMediaType = (item: Media): 'movie' | 'tv' => { return 'title' in item ? 'movie' : 'tv'; }; + +/** + * Media ๋ฐฐ์—ด์—์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ + * @param items - Media ๊ฐ์ฒด ๋ฐฐ์—ด + * @returns ์ค‘๋ณต์ด ์ œ๊ฑฐ๋œ Media ๊ฐ์ฒด ๋ฐฐ์—ด + */ +export const removeDuplicateMedia = (items: Media[]): Media[] => { + return items.filter( + (item, index, self) => index === self.findIndex((t) => t.id === item.id && t.media_type === item.media_type), + ); +}; From dbadbe5107558fd423e49a0ef1ab2425632a74dc Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 8 Nov 2025 22:09:31 +0900 Subject: [PATCH 50/57] =?UTF-8?q?#19=20[FIX]=20MediaCard=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B0=84=EA=B2=A9=20=EC=A1=B0?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/search/client/MediaCard.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/search/client/MediaCard.tsx b/src/components/search/client/MediaCard.tsx index 00e1786..f44f43e 100644 --- a/src/components/search/client/MediaCard.tsx +++ b/src/components/search/client/MediaCard.tsx @@ -12,7 +12,7 @@ interface MediaCardProps { const MediaCard = ({ item }: MediaCardProps) => { return ( - +
{/* ์ด๋ฏธ์ง€ */}
From bce1d51eabc49a49806ec2e143b9fc0ae5a5f8a0 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sat, 8 Nov 2025 22:20:00 +0900 Subject: [PATCH 51/57] =?UTF-8?q?#19=20[FIX]=20TrendingBanner=20mediaType?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/home/client/TrendingBanner.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/home/client/TrendingBanner.tsx b/src/components/home/client/TrendingBanner.tsx index d214612..b677dda 100644 --- a/src/components/home/client/TrendingBanner.tsx +++ b/src/components/home/client/TrendingBanner.tsx @@ -83,7 +83,7 @@ const TrendingBanner = ({ items }: TrendingBannerProps) => {
{/* PlayBar ์ปดํฌ๋„ŒํŠธ ์ด๋™ (์ƒ์„ธํŽ˜์ด์ง€๋กœ ์ด๋™ ๊ฐ€๋Šฅ) */}
- +
); From 54a9740b440cf9a7af01af6f4e265282cc011c79 Mon Sep 17 00:00:00 2001 From: jungyungee Date: Sun, 9 Nov 2025 21:41:10 +0900 Subject: [PATCH 52/57] =?UTF-8?q?#16=20[FIX]=20=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20=EB=A1=9C=EB=94=A9?= =?UTF-8?q?=EC=9A=A9=20=EC=8A=A4=EC=BC=88=EB=A0=88=ED=86=A4=20UI=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/detail/[mediaType]/[id]/loading.tsx | 30 ++++++++++++++++ src/app/detail/[mediaType]/[id]/page.tsx | 35 ++++++------------- src/components/detail/client/PlayButton.tsx | 21 +++++++++++ src/components/detail/server/DetailInfo.tsx | 25 +++++++++++++ src/components/detail/server/DetailPoster.tsx | 32 +++++++++++++++++ 5 files changed, 118 insertions(+), 25 deletions(-) create mode 100644 src/app/detail/[mediaType]/[id]/loading.tsx create mode 100644 src/components/detail/client/PlayButton.tsx create mode 100644 src/components/detail/server/DetailInfo.tsx create mode 100644 src/components/detail/server/DetailPoster.tsx diff --git a/src/app/detail/[mediaType]/[id]/loading.tsx b/src/app/detail/[mediaType]/[id]/loading.tsx new file mode 100644 index 0000000..3fa615e --- /dev/null +++ b/src/app/detail/[mediaType]/[id]/loading.tsx @@ -0,0 +1,30 @@ +/** + * Detail ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์ปดํฌ๋„ŒํŠธ + * ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์ค‘ ํ‘œ์‹œ๋˜๋Š” ์Šค์ผˆ๋ ˆํ†ค UI + */ + +const DetailLoading = () => { + return ( +
+ {/* ํฌ์Šคํ„ฐ ์Šค์ผˆ๋ ˆํ†ค */} +
+ + {/* ์žฌ์ƒ ๋ฒ„ํŠผ ์Šค์ผˆ๋ ˆํ†ค */} +
+
+
+ + {/* ์ƒ์„ธ ์ •๋ณด ์Šค์ผˆ๋ ˆํ†ค */} +
+
+
+
+
+
+
+
+
+ ); +}; + +export default DetailLoading; diff --git a/src/app/detail/[mediaType]/[id]/page.tsx b/src/app/detail/[mediaType]/[id]/page.tsx index 292a369..eacfc93 100644 --- a/src/app/detail/[mediaType]/[id]/page.tsx +++ b/src/app/detail/[mediaType]/[id]/page.tsx @@ -1,8 +1,11 @@ -import Image from 'next/image'; - -import { getImageUrl } from '@/constants/imageURL'; +import PlayButton from '@/components/detail/client/PlayButton'; +import DetailInfo from '@/components/detail/server/DetailInfo'; +import DetailPoster from '@/components/detail/server/DetailPoster'; import { getDetail } from '@/lib/api/tmdb/detail'; -import PlayIcon from '@/svgs/navigation/playIcon.svg'; + +// ํŽ˜์ด์ง€ ๋ ˆ๋ฒจ ์บ์‹ฑ ์„ค์ • +export const revalidate = 3600; // 1์‹œ๊ฐ„ +export const dynamic = 'force-static'; // ์ •์  ์ƒ์„ฑ ๊ฐ•์ œ const DetailPage = async ({ params }: { params: Promise<{ mediaType: string; id: string }> }) => { const { mediaType, id } = await params; @@ -17,33 +20,15 @@ const DetailPage = async ({ params }: { params: Promise<{ mediaType: string; id: } const title = 'title' in detail ? detail.title : detail.name; - const overviewText = (detail.overview || '').trim(); return (
{/* ํฌ์Šคํ„ฐ ์ด๋ฏธ์ง€ */} - {detail.poster_path && ( -
- {title} -
-
- )} + {detail.poster_path && } {/* ์žฌ์ƒ ๋ฒ„ํŠผ */} -
- -
+ {/* ์ƒ์„ธ ์ •๋ณด */} -
-

Previews

- {overviewText ? ( -

{overviewText}

- ) : ( -

์ค„๊ฑฐ๋ฆฌ๊ฐ€ ๋”ฐ๋กœ ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

- )} -
+
); }; diff --git a/src/components/detail/client/PlayButton.tsx b/src/components/detail/client/PlayButton.tsx new file mode 100644 index 0000000..8e4488a --- /dev/null +++ b/src/components/detail/client/PlayButton.tsx @@ -0,0 +1,21 @@ +/** + * PlayButton ์ปดํฌ๋„ŒํŠธ (Client Component) + * ์žฌ์ƒ ๋ฒ„ํŠผ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. + */ + +'use client'; + +import PlayIcon from '@/svgs/navigation/playIcon.svg'; + +const PlayButton = () => { + return ( +
+ +
+ ); +}; + +export default PlayButton; diff --git a/src/components/detail/server/DetailInfo.tsx b/src/components/detail/server/DetailInfo.tsx new file mode 100644 index 0000000..4c49f20 --- /dev/null +++ b/src/components/detail/server/DetailInfo.tsx @@ -0,0 +1,25 @@ +/** + * DetailInfo ์ปดํฌ๋„ŒํŠธ + * ์ƒ์„ธ ํŽ˜์ด์ง€์˜ ์ •๋ณด(์ œ๋ชฉ, ์ค„๊ฑฐ๋ฆฌ)๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. + */ + +interface DetailInfoProps { + overview: string; +} + +const DetailInfo = ({ overview }: DetailInfoProps) => { + const overviewText = (overview || '').trim(); + + return ( +
+

Previews

+ {overviewText ? ( +

{overviewText}

+ ) : ( +

์ค„๊ฑฐ๋ฆฌ๊ฐ€ ๋”ฐ๋กœ ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

+ )} +
+ ); +}; + +export default DetailInfo; diff --git a/src/components/detail/server/DetailPoster.tsx b/src/components/detail/server/DetailPoster.tsx new file mode 100644 index 0000000..1921f91 --- /dev/null +++ b/src/components/detail/server/DetailPoster.tsx @@ -0,0 +1,32 @@ +/** + * DetailPoster ์ปดํฌ๋„ŒํŠธ + * ์ƒ์„ธ ํŽ˜์ด์ง€์˜ ํฌ์Šคํ„ฐ ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. + */ + +import Image from 'next/image'; + +import { getImageUrl } from '@/constants/imageURL'; + +interface DetailPosterProps { + posterPath: string; + title: string; +} + +const DetailPoster = ({ posterPath, title }: DetailPosterProps) => { + return ( +
+ {title} +
+
+ ); +}; + +export default DetailPoster; From f3d2cccd22eb4cde207cda742d42c47fbacf84b3 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sun, 9 Nov 2025 22:12:38 +0900 Subject: [PATCH 53/57] =?UTF-8?q?#21=20[REFACTOR]=20=EC=8A=A4=EC=BC=88?= =?UTF-8?q?=EB=A0=88=ED=86=A4=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20?= =?UTF-8?q?=EC=82=BD=EC=9E=85=20=EB=B0=A9=EC=8B=9D=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search/client/MediaCardSkeleton.tsx | 18 ++++++++++++++++++ src/components/search/client/SearchResults.tsx | 3 ++- src/components/search/client/TopSearches.tsx | 3 ++- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 src/components/search/client/MediaCardSkeleton.tsx diff --git a/src/components/search/client/MediaCardSkeleton.tsx b/src/components/search/client/MediaCardSkeleton.tsx new file mode 100644 index 0000000..7f05424 --- /dev/null +++ b/src/components/search/client/MediaCardSkeleton.tsx @@ -0,0 +1,18 @@ +const MediaCardSkeleton = () => { + return ( +
+ {/* ์ด๋ฏธ์ง€ ์˜์—ญ */} +
+ + {/* ํ…์ŠคํŠธ ์˜์—ญ */} +
+
+
+
+
+
+
+ ); +}; + +export default MediaCardSkeleton; diff --git a/src/components/search/client/SearchResults.tsx b/src/components/search/client/SearchResults.tsx index 5ae3ab4..43b2949 100644 --- a/src/components/search/client/SearchResults.tsx +++ b/src/components/search/client/SearchResults.tsx @@ -4,6 +4,7 @@ import { useInfiniteQuery } from '@tanstack/react-query'; import { useEffect, useRef } from 'react'; import MediaCard from '@/components/search/client/MediaCard'; +import MediaCardSkeleton from '@/components/search/client/MediaCardSkeleton'; import { searchMulti } from '@/lib/api/tmdb/search'; import { removeDuplicateMedia } from '@/lib/utils/media'; import type { Media } from '@/types/tmdb'; @@ -52,7 +53,7 @@ const SearchResults = ({ query }: SearchResultsProps) => {

Search Results

{[...Array(5)].map((_, i) => ( -
+ ))}
diff --git a/src/components/search/client/TopSearches.tsx b/src/components/search/client/TopSearches.tsx index 64062b6..d7711ec 100644 --- a/src/components/search/client/TopSearches.tsx +++ b/src/components/search/client/TopSearches.tsx @@ -4,6 +4,7 @@ import { useInfiniteQuery } from '@tanstack/react-query'; import { useEffect, useRef } from 'react'; import MediaCard from '@/components/search/client/MediaCard'; +import MediaCardSkeleton from '@/components/search/client/MediaCardSkeleton'; import { getTrendingAllDay } from '@/lib/api/tmdb/home'; import { removeDuplicateMedia } from '@/lib/utils/media'; import type { Media } from '@/types/tmdb'; @@ -49,7 +50,7 @@ const TopSearches = () => {

Top Searches

{[...Array(7)].map((_, i) => ( -
+ ))}
From 1400b363315e9f4eea04571991bfae9d232e6614 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sun, 9 Nov 2025 22:19:07 +0900 Subject: [PATCH 54/57] =?UTF-8?q?#21=20[FIX]=20=EC=8A=A4=EC=BC=88=EB=A0=88?= =?UTF-8?q?=ED=86=A4=20UI=20=EB=8D=94=20=EB=A7=8E=EC=9D=B4=20=EB=9C=A8?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/search/client/MediaCardSkeleton.tsx | 1 - src/components/search/client/SearchResults.tsx | 2 +- src/components/search/client/TopSearches.tsx | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/search/client/MediaCardSkeleton.tsx b/src/components/search/client/MediaCardSkeleton.tsx index 7f05424..f31be7f 100644 --- a/src/components/search/client/MediaCardSkeleton.tsx +++ b/src/components/search/client/MediaCardSkeleton.tsx @@ -9,7 +9,6 @@ const MediaCardSkeleton = () => {
-
); diff --git a/src/components/search/client/SearchResults.tsx b/src/components/search/client/SearchResults.tsx index 43b2949..833e46b 100644 --- a/src/components/search/client/SearchResults.tsx +++ b/src/components/search/client/SearchResults.tsx @@ -52,7 +52,7 @@ const SearchResults = ({ query }: SearchResultsProps) => {

Search Results

- {[...Array(5)].map((_, i) => ( + {[...Array(8)].map((_, i) => ( ))}
diff --git a/src/components/search/client/TopSearches.tsx b/src/components/search/client/TopSearches.tsx index d7711ec..33d064c 100644 --- a/src/components/search/client/TopSearches.tsx +++ b/src/components/search/client/TopSearches.tsx @@ -49,7 +49,7 @@ const TopSearches = () => {

Top Searches

- {[...Array(7)].map((_, i) => ( + {[...Array(8)].map((_, i) => ( ))}
From dcf45120e8cb5c1b1c2b8503eefaff802c2671d0 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sun, 9 Nov 2025 22:46:19 +0900 Subject: [PATCH 55/57] =?UTF-8?q?#21=20[REFACTOR]=20URL=20searchParams=20?= =?UTF-8?q?=EA=B8=B0=EB=B0=98=20=EA=B2=80=EC=83=89=20=EA=B5=AC=EC=A1=B0?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search/client/SearchContent.tsx | 26 ------------------- src/components/search/client/SearchInput.tsx | 19 ++++++++------ 2 files changed, 11 insertions(+), 34 deletions(-) delete mode 100644 src/components/search/client/SearchContent.tsx diff --git a/src/components/search/client/SearchContent.tsx b/src/components/search/client/SearchContent.tsx deleted file mode 100644 index 00d2820..0000000 --- a/src/components/search/client/SearchContent.tsx +++ /dev/null @@ -1,26 +0,0 @@ -'use client'; - -import { useState } from 'react'; - -import SearchInput from '@/components/search/client/SearchInput'; -import SearchResults from '@/components/search/client/SearchResults'; -import TopSearches from '@/components/search/client/TopSearches'; - -const SearchContent = () => { - const [searchQuery, setSearchQuery] = useState(''); - - return ( -
- {/* ๊ฒ€์ƒ‰ ์ž…๋ ฅ์ฐฝ ๋ฐ ํ—ค๋” */} -
-
- -
- - {/* ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ or Top Searches */} - {searchQuery ? : } -
- ); -}; - -export default SearchContent; diff --git a/src/components/search/client/SearchInput.tsx b/src/components/search/client/SearchInput.tsx index 52c3710..aa28152 100644 --- a/src/components/search/client/SearchInput.tsx +++ b/src/components/search/client/SearchInput.tsx @@ -1,26 +1,29 @@ 'use client'; +import { useRouter, useSearchParams } from 'next/navigation'; import { useEffect, useState } from 'react'; import SearchIcon from '@/svgs/common/searchIcon.svg'; import XIcon from '@/svgs/common/xIcon.svg'; -interface SearchInputProps { - onSearchChange: (query: string) => void; -} - -const SearchInput = ({ onSearchChange }: SearchInputProps) => { - const [query, setQuery] = useState(''); +const SearchInput = () => { + const router = useRouter(); + const searchParams = useSearchParams(); + const [query, setQuery] = useState(searchParams.get('q') || ''); useEffect(() => { const handler = setTimeout(() => { - onSearchChange(query); + if (query) { + router.push(`/search?q=${encodeURIComponent(query)}`); + } else { + router.push('/search'); + } }, 300); return () => { clearTimeout(handler); }; - }, [query, onSearchChange]); + }, [query, router]); return (
From 6706afaf2ec013205f5614e699662c2b7dd8f90e Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sun, 9 Nov 2025 22:46:46 +0900 Subject: [PATCH 56/57] =?UTF-8?q?#21=20[FEAT]=20SSR=20=EB=B0=8F=20Suspense?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9=EC=9C=BC=EB=A1=9C=20=EC=B4=88=EA=B8=B0=20?= =?UTF-8?q?=EB=A1=9C=EB=94=A9=20=EC=84=B1=EB=8A=A5=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/search/page.tsx | 38 +++++++++++++++++-- .../search/server/SearchResultsServer.tsx | 15 ++++++++ .../search/server/TopSearchesServer.tsx | 11 ++++++ .../search/skeletons/MediaCardSkeleton.tsx | 17 +++++++++ .../skeletons/SearchResultsSkeleton.tsx | 16 ++++++++ .../search/skeletons/TopSearchesSkeleton.tsx | 16 ++++++++ 6 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 src/components/search/server/SearchResultsServer.tsx create mode 100644 src/components/search/server/TopSearchesServer.tsx create mode 100644 src/components/search/skeletons/MediaCardSkeleton.tsx create mode 100644 src/components/search/skeletons/SearchResultsSkeleton.tsx create mode 100644 src/components/search/skeletons/TopSearchesSkeleton.tsx diff --git a/src/app/search/page.tsx b/src/app/search/page.tsx index 0ebde27..bc8ec3e 100644 --- a/src/app/search/page.tsx +++ b/src/app/search/page.tsx @@ -1,9 +1,41 @@ -import SearchContent from '@/components/search/client/SearchContent'; +import { Suspense } from 'react'; + +import SearchInput from '@/components/search/client/SearchInput'; +import SearchResultsServer from '@/components/search/server/SearchResultsServer'; +import TopSearchesServer from '@/components/search/server/TopSearchesServer'; +import SearchResultsSkeleton from '@/components/search/skeletons/SearchResultsSkeleton'; +import TopSearchesSkeleton from '@/components/search/skeletons/TopSearchesSkeleton'; + +interface SearchPageProps { + searchParams: Promise<{ + q?: string; + }>; +} + +const SearchPage = async ({ searchParams }: SearchPageProps) => { + const params = await searchParams; + const searchQuery = params.q || ''; -const SearchPage = () => { return (
- +
+ {/* ๊ฒ€์ƒ‰ ์ž…๋ ฅ์ฐฝ ๋ฐ ํ—ค๋” */} +
+
+ +
+ + {/* ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ or Top Searches */} + {searchQuery ? ( + }> + + + ) : ( + }> + + + )} +
); }; diff --git a/src/components/search/server/SearchResultsServer.tsx b/src/components/search/server/SearchResultsServer.tsx new file mode 100644 index 0000000..51b4732 --- /dev/null +++ b/src/components/search/server/SearchResultsServer.tsx @@ -0,0 +1,15 @@ +import { searchMulti } from '@/lib/api/tmdb/search'; + +import SearchResults from '../client/SearchResults'; + +interface SearchResultsServerProps { + query: string; +} + +const SearchResultsServer = async ({ query }: SearchResultsServerProps) => { + const initialData = await searchMulti(query, 1); + + return ; +}; + +export default SearchResultsServer; diff --git a/src/components/search/server/TopSearchesServer.tsx b/src/components/search/server/TopSearchesServer.tsx new file mode 100644 index 0000000..e0d18f9 --- /dev/null +++ b/src/components/search/server/TopSearchesServer.tsx @@ -0,0 +1,11 @@ +import { getTrendingAllDay } from '@/lib/api/tmdb/home'; + +import TopSearches from '../client/TopSearches'; + +const TopSearchesServer = async () => { + const initialData = await getTrendingAllDay(1); + + return ; +}; + +export default TopSearchesServer; diff --git a/src/components/search/skeletons/MediaCardSkeleton.tsx b/src/components/search/skeletons/MediaCardSkeleton.tsx new file mode 100644 index 0000000..f31be7f --- /dev/null +++ b/src/components/search/skeletons/MediaCardSkeleton.tsx @@ -0,0 +1,17 @@ +const MediaCardSkeleton = () => { + return ( +
+ {/* ์ด๋ฏธ์ง€ ์˜์—ญ */} +
+ + {/* ํ…์ŠคํŠธ ์˜์—ญ */} +
+
+
+
+
+
+ ); +}; + +export default MediaCardSkeleton; diff --git a/src/components/search/skeletons/SearchResultsSkeleton.tsx b/src/components/search/skeletons/SearchResultsSkeleton.tsx new file mode 100644 index 0000000..b6a09c9 --- /dev/null +++ b/src/components/search/skeletons/SearchResultsSkeleton.tsx @@ -0,0 +1,16 @@ +import MediaCardSkeleton from './MediaCardSkeleton'; + +const SearchResultsSkeleton = () => { + return ( +
+

Search Results

+
+ {[...Array(8)].map((_, i) => ( + + ))} +
+
+ ); +}; + +export default SearchResultsSkeleton; diff --git a/src/components/search/skeletons/TopSearchesSkeleton.tsx b/src/components/search/skeletons/TopSearchesSkeleton.tsx new file mode 100644 index 0000000..d82fa5d --- /dev/null +++ b/src/components/search/skeletons/TopSearchesSkeleton.tsx @@ -0,0 +1,16 @@ +import MediaCardSkeleton from './MediaCardSkeleton'; + +const TopSearchesSkeleton = () => { + return ( +
+

Top Searches

+
+ {[...Array(8)].map((_, i) => ( + + ))} +
+
+ ); +}; + +export default TopSearchesSkeleton; From 42d011ec0f37567fc229070a5c62e6a9fd19e6d3 Mon Sep 17 00:00:00 2001 From: fkgrkyr Date: Sun, 9 Nov 2025 22:47:09 +0900 Subject: [PATCH 57/57] =?UTF-8?q?#21=20[REFACTOR]=20=ED=8F=B4=EB=8D=94=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EA=B0=9C=EC=84=A0=20=EB=B0=8F=20=EB=AC=B4?= =?UTF-8?q?=ED=95=9C=20=EC=8A=A4=ED=81=AC=EB=A1=A4=20hook=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search/client/MediaCardSkeleton.tsx | 17 ------ .../search/client/SearchResults.tsx | 40 ++++--------- src/components/search/client/TopSearches.tsx | 41 +++++-------- src/hooks/search/useInfiniteScroll.ts | 57 +++++++++++++++++++ 4 files changed, 83 insertions(+), 72 deletions(-) delete mode 100644 src/components/search/client/MediaCardSkeleton.tsx create mode 100644 src/hooks/search/useInfiniteScroll.ts diff --git a/src/components/search/client/MediaCardSkeleton.tsx b/src/components/search/client/MediaCardSkeleton.tsx deleted file mode 100644 index f31be7f..0000000 --- a/src/components/search/client/MediaCardSkeleton.tsx +++ /dev/null @@ -1,17 +0,0 @@ -const MediaCardSkeleton = () => { - return ( -
- {/* ์ด๋ฏธ์ง€ ์˜์—ญ */} -
- - {/* ํ…์ŠคํŠธ ์˜์—ญ */} -
-
-
-
-
-
- ); -}; - -export default MediaCardSkeleton; diff --git a/src/components/search/client/SearchResults.tsx b/src/components/search/client/SearchResults.tsx index 833e46b..e8282aa 100644 --- a/src/components/search/client/SearchResults.tsx +++ b/src/components/search/client/SearchResults.tsx @@ -1,22 +1,19 @@ 'use client'; -import { useInfiniteQuery } from '@tanstack/react-query'; -import { useEffect, useRef } from 'react'; - import MediaCard from '@/components/search/client/MediaCard'; -import MediaCardSkeleton from '@/components/search/client/MediaCardSkeleton'; +import MediaCardSkeleton from '@/components/search/skeletons/MediaCardSkeleton'; +import { useInfiniteScroll } from '@/hooks/search/useInfiniteScroll'; import { searchMulti } from '@/lib/api/tmdb/search'; import { removeDuplicateMedia } from '@/lib/utils/media'; -import type { Media } from '@/types/tmdb'; +import type { Media, TMDBListResponse } from '@/types/tmdb'; interface SearchResultsProps { query: string; + initialData?: TMDBListResponse; } -const SearchResults = ({ query }: SearchResultsProps) => { - const observerRef = useRef(null); - - const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading, error } = useInfiniteQuery({ +const SearchResults = ({ query, initialData }: SearchResultsProps) => { + const { data, observerRef, isFetchingNextPage, isLoading, error } = useInfiniteScroll({ queryKey: ['searchResults', query], queryFn: ({ pageParam = 1 }) => searchMulti(query, pageParam), getNextPageParam: (lastPage) => { @@ -25,28 +22,15 @@ const SearchResults = ({ query }: SearchResultsProps) => { } return undefined; }, - initialPageParam: 1, + initialData: initialData + ? { + pages: [initialData], + pageParams: [1], + } + : undefined, enabled: !!query, }); - // Intersection Observer๋กœ ๋ฌดํ•œ ์Šคํฌ๋กค ๊ตฌํ˜„ - useEffect(() => { - const observer = new IntersectionObserver( - (entries) => { - if (entries[0].isIntersecting && hasNextPage && !isFetchingNextPage) { - fetchNextPage(); - } - }, - { threshold: 0.5 }, - ); - - if (observerRef.current) { - observer.observe(observerRef.current); - } - - return () => observer.disconnect(); - }, [hasNextPage, isFetchingNextPage, fetchNextPage]); - if (isLoading) { return (
diff --git a/src/components/search/client/TopSearches.tsx b/src/components/search/client/TopSearches.tsx index 33d064c..a905d5e 100644 --- a/src/components/search/client/TopSearches.tsx +++ b/src/components/search/client/TopSearches.tsx @@ -1,18 +1,18 @@ 'use client'; -import { useInfiniteQuery } from '@tanstack/react-query'; -import { useEffect, useRef } from 'react'; - import MediaCard from '@/components/search/client/MediaCard'; -import MediaCardSkeleton from '@/components/search/client/MediaCardSkeleton'; +import MediaCardSkeleton from '@/components/search/skeletons/MediaCardSkeleton'; +import { useInfiniteScroll } from '@/hooks/search/useInfiniteScroll'; import { getTrendingAllDay } from '@/lib/api/tmdb/home'; import { removeDuplicateMedia } from '@/lib/utils/media'; -import type { Media } from '@/types/tmdb'; +import type { Media, TMDBListResponse } from '@/types/tmdb'; -const TopSearches = () => { - const observerRef = useRef(null); +interface TopSearchesProps { + initialData?: TMDBListResponse; +} - const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading, error } = useInfiniteQuery({ +const TopSearches = ({ initialData }: TopSearchesProps) => { + const { data, observerRef, isFetchingNextPage, isLoading, error } = useInfiniteScroll({ queryKey: ['topSearches'], queryFn: ({ pageParam = 1 }) => getTrendingAllDay(pageParam), getNextPageParam: (lastPage) => { @@ -23,26 +23,13 @@ const TopSearches = () => { } return undefined; }, - initialPageParam: 1, - }); - - // Intersection Observer๋กœ ๋ฌดํ•œ ์Šคํฌ๋กค ๊ตฌํ˜„ - useEffect(() => { - const observer = new IntersectionObserver( - (entries) => { - if (entries[0].isIntersecting && hasNextPage && !isFetchingNextPage) { - fetchNextPage(); + initialData: initialData + ? { + pages: [initialData], + pageParams: [1], } - }, - { threshold: 0.5 }, - ); - - if (observerRef.current) { - observer.observe(observerRef.current); - } - - return () => observer.disconnect(); - }, [hasNextPage, isFetchingNextPage, fetchNextPage]); + : undefined, + }); if (isLoading) { return ( diff --git a/src/hooks/search/useInfiniteScroll.ts b/src/hooks/search/useInfiniteScroll.ts new file mode 100644 index 0000000..b1a7b88 --- /dev/null +++ b/src/hooks/search/useInfiniteScroll.ts @@ -0,0 +1,57 @@ +import { useInfiniteQuery } from '@tanstack/react-query'; +import { useEffect, useRef } from 'react'; + +interface UseInfiniteScrollParams { + queryKey: string[]; + queryFn: (params: { pageParam: number }) => Promise; + getNextPageParam: (lastPage: T) => number | undefined; + initialData?: { + pages: T[]; + pageParams: number[]; + }; + enabled?: boolean; +} + +export const useInfiniteScroll = ({ + queryKey, + queryFn, + getNextPageParam, + initialData, + enabled = true, +}: UseInfiniteScrollParams) => { + const observerRef = useRef(null); + + const queryResult = useInfiniteQuery({ + queryKey, + queryFn, + getNextPageParam, + initialPageParam: 1, + initialData, + enabled, + }); + + const { fetchNextPage, hasNextPage, isFetchingNextPage } = queryResult; + + // Intersection Observer๋กœ ๋ฌดํ•œ ์Šคํฌ๋กค ๊ตฌํ˜„ + useEffect(() => { + const observer = new IntersectionObserver( + (entries) => { + if (entries[0].isIntersecting && hasNextPage && !isFetchingNextPage) { + fetchNextPage(); + } + }, + { threshold: 0.5 }, + ); + + if (observerRef.current) { + observer.observe(observerRef.current); + } + + return () => observer.disconnect(); + }, [hasNextPage, isFetchingNextPage, fetchNextPage]); + + return { + ...queryResult, + observerRef, + }; +};