From 9b2af29aa3a89ee17797a85742914f2104d6d495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lev=C3=AD=20Arista?= Date: Thu, 17 Jul 2025 00:17:00 -0500 Subject: [PATCH 1/8] Redesign UI and add HTML partials --- images/favicon-16x16.png | Bin 833 -> 710 bytes images/favicon-32x32.png | Bin 2184 -> 1522 bytes images/favicon.ico | Bin 15406 -> 15406 bytes images/gphg.png | Bin 0 -> 13303 bytes images/gphg.svg | 1 + index.html | 599 +----- js/main.js | 16 +- package-lock.json | 2480 +++++++++++++++++++--- package.json | 8 +- partials/footer.html | 27 + partials/head.html | 64 + partials/header.html | 17 + partials/how-to.html | 24 + partials/modals/feedback.html | 21 + partials/modals/info.html | 31 + partials/scripts.html | 8 + partials/toolbox/background.html | 107 + partials/toolbox/decorations.html | 95 + partials/toolbox/main.html | 131 ++ partials/toolbox/presets.html | 12 + partials/toolbox/result.html | 26 + public/images/icons/download-black.svg | 8 + public/images/icons/download.svg | 8 + public/images/icons/light-dark-black.svg | 12 + public/images/icons/light-dark.svg | 12 + public/images/icons/random-black.svg | 5 + public/images/icons/random.svg | 5 + styles/index.scss | 1 + styles/main.scss | 90 +- styles/tabs.scss | 87 +- styles/toolbox-background.scss | 8 +- styles/toolbox-decorations.scss | 8 +- styles/toolbox-main.scss | 170 +- styles/toolbox-presets.scss | 7 + styles/variables.scss | 5 +- vite.config.js | 14 +- 36 files changed, 3167 insertions(+), 940 deletions(-) create mode 100644 images/gphg.png create mode 100644 images/gphg.svg create mode 100644 partials/footer.html create mode 100644 partials/head.html create mode 100644 partials/header.html create mode 100644 partials/how-to.html create mode 100644 partials/modals/feedback.html create mode 100644 partials/modals/info.html create mode 100644 partials/scripts.html create mode 100644 partials/toolbox/background.html create mode 100644 partials/toolbox/decorations.html create mode 100644 partials/toolbox/main.html create mode 100644 partials/toolbox/presets.html create mode 100644 partials/toolbox/result.html create mode 100644 public/images/icons/download-black.svg create mode 100644 public/images/icons/download.svg create mode 100644 public/images/icons/light-dark-black.svg create mode 100644 public/images/icons/light-dark.svg create mode 100644 public/images/icons/random-black.svg create mode 100644 public/images/icons/random.svg create mode 100644 styles/toolbox-presets.scss diff --git a/images/favicon-16x16.png b/images/favicon-16x16.png index 01c99bc466d80e8e9c175aa6a8ae549b55633c72..3909475c5e4f4f7d1c388766a176debefe15e0b6 100644 GIT binary patch delta 673 zcmV;S0$%;W2F3-DF@JzbL_t(IPgPUhOH*+ee%`Z9cW_%6HPAu@F{41cm`&8x8scr0Z@A?4t74lDcryNQ7{eS}Iw~Q9+}?v>0USW`4|b_QvnyIQ?-rAHUyw z-sgGV_jw6K02r5g;zQ!WAczahkT1j_Ca~OQh;wGl4EIG(Lw`r;1j8971c@Po)zV2+ z;O>{$&CdHguM%w*F|!FEbi40e%(e^V4mgoQ+n-RS6*0Xx!tGwK`#rs#`u^hi$fxsm zL7b4J?%YrSic%814C(aVEAaq@*hu`nUlfjh6 z-7hN~t_Jl#oPS(;Gx4pmNKT0@^}5h|s|s#c9(V4qU~N^gDB>`h!Zo0Qf!Xxf=;vA? z)*mntZmPzia^Pr%2R?fm1=~X2JcETL8-G?Ab90OMyZlc|ZD~8UNvmsHoyiYBucd$G zy1-l-YB-1kTQ6a4=Oi8p#l&#AO>6|tVmi4F%d$~-#D723*jPD8+6IW+jAy_UBm=m9 zxdtbFQz-0gNF>8mf(35F-KRfbSxSUxV?wmi=}WXbo&ix%pq{EfjH}IGv9q}%8IVze zSh^YGvx~aSgxtK(GcFRy&H;$_#4`YbA|ldKjdQghv28XWZyN~YQ<(gH0*^;k0%6i@ zN;7aw7k`lnC@4yOrLztz>)RNcT124$w1z5BR~5j6XJ4eXMT@hkGEXAWZjmyNU=Y&@ zirz08Llx7pH!~sUFi-;nM7v|U273&(t5{%Yf9gkeUNGnoMckdn3~LE{4Jlfv+@nLa zC)b=VNNU80^o$HLI4Yy{55-y36CgtwWEeBU_Zlv?imCk%)Snwl+HPhe00000NkvXX Hu0mjf;bA-S delta 797 zcmV+&1LFL~1;GZ8F@O6>L_t(IPgPTIXq0sv|9pPW?YeeNePNf71<@a0iv0mgB}TY4 z=xoup(9l3(#WWGOyLrCxgkHFv&J|c-1wl~ejm@=L($pPD(3_S@uM$aI^rB*@JDhj- z{C*$#-Q66$dA`rX^L)O)&%cKNKz{*nD4UH$OKV<$#WrKO8Gpdj00rt#=P(WG^WUyV zuIBTdwhnoK#gYE;rV7i44bbiA;uJv$B1K2Y$e(jZ7GFdW&Grwr&p$Z4r|0w|E0^&k zfp-W)|D}T?stW+)0{JZ@B?sr=@@33-4-V{_XGiDh;Mu1lAJHg9=?V=eByY)J^3PO3NVPn>L$1L|Ck5W zAr}b7o`15jSog@`*NT$rMzS^`Y)Oqb#e>+FaO&{=f;7sm{&Vdz{7!P;QjxWyy(I)+ zyUys1L&OfgJV}DL=)G_?ng@(&-+`gF~>9YR)mc3Jt z*+yJ}knr86(JU?AnmoFBX7NWvTi^MYU4uC(r?Q}HVJY~aFx-60OK9mkmp~+P6$lc5 zu8G_^b)@-cU%h%-RZeI1~T`$0vyOq+$Uxr)fB%-W}9wih>D8Y z9I#B?vc$wcmboR9>K|-~Ml+K+mnHKrvyber5n?uDA_#6>bSBM=h#|x{oJQwdWNLwx z)jmGjV%xX8d*AE3?+d+2ljh!Y&-tBme)pX72!G-lL|?;AnBk6Gk-LHIVc)X>`rEd zdkP1OarkhWcaA$JX!7?A5unD>b5l$FCI^rYkAy@7gvnfY@ca6>1pp}py+bw%z)X?3 zAr>uF-Viuif!P z(x;Ce@4Kak8k^=)TQ^o7$BJM09> z6njDX#qdbUAsQ|^9d@j%uSzdnTD*%Slj)v)ZKs>Y$A2dknp>DNhP0}>1Pc~;asJ#* zOUfA2!qht)4jldbjr(L|Bs$Q(uY0AQ^$POY$k^Jt31wyZXlv_2GMRZ~CiPEMjQ7zi?3@+FDm4F*Sznz!ZYP+a_{yb+U-*?v`~Rp@-3d{rfEdm^=g} zr2akiD1UWdMPe!p_xx=*aG(b%3oh_)o@dL46o5qpte7tCmzNjdK>KPuxORf-E?%-3 zKb(o6ukWtTSD80D`Y5_-1jfdMfwqsjR_aQoA!r^?HcCq7prj-Zb#+USj{!`L-=T6& zR{^riwjvO?fzeR`p^yMUh(VNSp((`-i2`7czkgmNsZ{FZCx_0yegDBD?(s=HB6w+a z1sWQb!B><6motXP@ke+Zi_o7i`bVaLNlHC)7r~WV47=NlEO!Btq6gt{9D{?y=}c~HB8uX((P%6f4F2hxo=R|i5pdY;Xl$-Q?B78|{^_5k8t9G);PEbj zuYYO_0>9jZ5S8kVx|~isUa4IiFD;$(mQo4502-u9_}!`NM`DR&Ie%fz^QBmre;1K^ zmkl6j3)a;kPhlkzd3ERx{;l?B`R1p%xHT7yXCOk(Dv>N zs4f`B`0ynS2t8SIi>eX#)Z)yh3h(m zk>5?z;mVtbRM8e3Jl>D!q~18YqIN?DUFE3k3I!mdMmgavGBKP``m=05;^Pby@9f$gnPBUie zIbt%9s3Ow8Mmmxa!$c&pz4Oyrgm3-`Z}}=@d24Xyw_*JED2{httwh%2dx#A8p|GM3 zAAj=z5633i%%Sl?O@R_3?Z^lq6Mq3+`Si_oN~ zfo+=>!R4I6vCdn#d~GCSo1Y7;Nhm{N&(Qb^RxR^k?W!`I_~{l#!qPLQqZFIPWl!@w zPHf*?iOA#(x_@P5T3rl==}f5SfHagUwM99z+Xzx}UQHQB^)n+>R_crfiht{#A>p5) zCIYB2PBMmU$po_)!==JzyrQWC($GUicpCEG1xjco0ju_GIlWs<^}>Y59qibkor*Id zB?L_^>W4{Y-|7>A-`BC7mUb=ziUXG41&V<53V04!Ruqc^W2Cg`pZsBBsDwH?%AQ%K zgabyaosI_#z=pWeCe3=m&rJk)jd$>Aj6G$fMtY7nmJ*Om2WN>=3NwJ_y@6_^lbsO7 uD)WM`5r0a%64S|88e+@Y>$(dM1!q znlRqgJ8q*f(|<^v2C%nLdO~sg?Q7PQbt+UEp|h$~Iycq}(J0U(P;5(zzUUVoIi6U$ zOv2OVFtC@Q&WlJrV0>dF)|B=-`<`?Yk&{=h=$o516Zko-9;#E@&O99GPV?|S5)KyE-2q#VH67$8Vw<`8GkVK6l^l7FF&?!{g8(CLB1&{P+WX4KOH^0 z9MHJ{3v(PpO27@AAKzX}V59Qb&SC8;ipHZ+!*sN`p zLlpWEAB^v;CO8U!->g)MOJcC*^c(rB>gqyT7RL?`G6L> z079mxDO$s6W!1}-D6#D~WPxjT0f@H)HH%(cHTn(Lif>r~ng8;td){*a40`gNNYCRJrwgzgimo8e zs9=Q#ve(Nq52<2;Wq+_L|0P8Ej^F*Tu044gU$SSM@vwp5ZK0r8U!m@08#&1nqWV~U z%>Q#;VnjF**)^$r?=5M?ZxonGB41Ujo08FaCjUy>4O=NR|&lAdH#~^D~Fx3 zTHN}}$OV`%<4cD034Fg?RVTZ?2{{14+d^Ja$T=egHM=W@o@q}PMlY`IXCnSqRSXCZ zY$s;-d)Xta8h?Fn`JUy&J_=RK%8uMGm(78>gH@R|E!ri*k3y>UWE&ibH{Gxk4m_sRCEU|7lSzP=yX3S|>SE7LHw l=FG9KPL{zCwB(Re-iCRTT?2vc829h=b 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 literal 15406 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 z%0AfmLiiIQCGs(Zu|b6y(T$0D%;nbs+YanuKX4$o6~%|Pm-2ah8TNkJAo6TSz@G*o z2bDx&)Qz3Avt{k}+S;VLh?tX+ObpD(iF5QJe=e0?L)8rqzPy7lfUuWI*do9U%*&5B z*z&iL7d)!u?y8hrAy?XNUNz{DR=Di-RkvGkzEMz|%VQ$OL>Yxo97&WMi#Io=j_WWi zy92pJcekh-RC0?|*mIRA*I0#nqiP?>iTvM(4z?1xN6G_M$*s&YnSZgDt(+D@?q*C3 zV-AjmDn6E|lE|wP+mILTmR6=A@A(q&M{&tHO5}kFXZ5gMT6q|lcXf;E|3IE{FY<@T z<53=wa+OL;yo1-gYd5Z{bx4&rkACkN%e#s~ZOZt zl`*lJAv>#n*UnZxiTrLI@~SUm4MTRm3UaG}c@=Vfl=obPyx*#$c3$gp7;1h*?}-0J+>qTwp z4=uP>$m{;v#_B(#d4;0+=4jp-_WHY|`sb{M>W9WcKgKr7V&@tkZ6hvel^VX^$?Km1 zjy}}4;yxfOaY8OU+(}qj-LL2wMKugvTvu=Bx;H!JT(u5)T;!`MSB*aA!d;@F4+Q*m zz#sRe;ut-m&V2Efe4xg5dnecR6OK+ncoIm#xW~pCR{j#t6y$inWaIi7Hc4+mJ{s3W zk36#;`1Qc9@EAX8m2_KRXUZ2xbS{mtSB<*j2apHf0-wi}yg22?<75Ly8`nMMFx1^2 zLj5e|?`(Sgb*K{-nEMF1ddwr2E$8Ybs=7dG<@6)f+C~1{sol3OclRBcEv&oo(C2+tCOvJDB>E|V z{D~kb)3aj5RW`l&5pwMH$npOe`TRAVjIHQ28s{LNooNx`Veo0F1DM?|i6YboP>lfZ z;QSYmtF;RLU0SP(gA8LIzXv-{WB!=zTX5u%6@o7Ikw1f4h=*zK6(q<-A}?!|q^~27 zzZCTcd#pm7rg{OjW&rI;kc)EvTPw`tyG*8=u-<7_i9Z7DPhsvI+^XY8wWzKObT4Nv!i*bl<9bpV(4;hXs3#dIkqDeu7$u;SRnU z*RPRkBFdRr2!uDyz|4hPsbl)LitVMq^m5y^!lPsQyAG!eWMhbF6-2WUYpx zw-)Q9-zg}+RfyMkD0Lu8?FrSGK#pV-*WfjD8N&8mx62 zZ)}y!3oYD?H8g!{VNFA7O$q8iP*<@Ie%1ju)tRXEC^SZEQ^%DW6jhH}xmJbrV!Ck| zWl!Y28HDVo{m}4eAB*%6R;=lc8rfP zNlT!6Y25bOjn|`AB@?wRTTn~07qu=Y@Vk;B1-txv6S?jt`rDIe4UFVQz|qt^al4KlB;NA0UJXsK2RH9@Eg`ZLzhZjqXK8{3$YuXSxw%TuUP3be7!Z{T-F`&-%O z&(NL*VNER&nZ)L^zJ`z#H`O$dd za|zrCF{PV4NZ-};9^X-Qzh8XwV-XlgmpZA81+vlTE*kTt>Up^j2%b+ zzz){(GS<_vgKt{54LVdig_@|ZJc0K-^|xUONMdZV_vrALgE5tVG5^|u3)+Fd1KRJq A8UO$Q diff --git a/images/gphg.png b/images/gphg.png new file mode 100644 index 0000000000000000000000000000000000000000..87b5ee660e2291db0729a54dcca85279d993150a GIT binary patch literal 13303 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 \ No newline at end of file diff --git a/index.html b/index.html index 9a05119..d397ca6 100644 --- a/index.html +++ b/index.html @@ -1,604 +1,37 @@ - - - - - Github Profile Header Generator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - -
-

- Github logo
- Github
- Profile Header Generator -

-

- A simple but nice header image generator
for your Github profile -

-

- - Star - -

-
- -
-

How to use it?

-
    -
  1. - Create a nice github header image.
    - -
  2. -
  3. - Create your GitHub profile README
    following - - this guide. - -
  4. -
  5. Upload your header to your profile repo.
  6. -
  7. - Add this line to your README: -

    ![Header](./your-header-image-name.png)

    -
  8. -
-
+
+ + + +
- -
-
-
-
Hey! I am ...
-
Fullstack developer
-
-
-
-
- - - - -
-
+
+
-
-
-
- - -
-
-
- - -
-
- - -
-
- - - 25 -
-
-
-
- -

-
-
- -

-
-
- -

-
-
-
- Text align: - - - -
-
-
- - -
-
- - -
-
-
-
- - - 40 -
-
- - - 20 -
-
-
+
+ + + +
- -
-
-
-
- -

-
-
- -

-
-
-
-
- - - 0 -
-
- - - 7 -
-
-
-
- - -
-
- - - 100 -
-
- - - 0.25 -
-
-
- Patterns: - - - - - - - - - - - - - - - - - -
-
-
- -
-
-
-
- - - 100 -
-
-
- Decorations: - - - - - - - - - - - - - - - - - - -
-
- - -
- - đź’ˇUse an octocat from the - Github - Octodex -
- đź’ˇOr build your own at - MyOctocat.com -
-   (My octocat looks like broken but you can copy the svg result) -
-
-
-
-
- - - - - + + - - - - - - - - - - - + \ No newline at end of file diff --git a/js/main.js b/js/main.js index d26f607..7608915 100644 --- a/js/main.js +++ b/js/main.js @@ -18,8 +18,8 @@ let selectedTheme = 'github'; document.querySelector('.toolbox .size-inputs input#width-input').value = headerImageContainer.clientWidth; let titleFontSelect = toolbox.querySelector('.font-selectors-container #title-font-selector'); let subtitleFontSelect = toolbox.querySelector('.font-selectors-container #subtitle-font-selector'); -titleFontSelect.value='Red Hat Display'; -subtitleFontSelect.value='Kalam'; +titleFontSelect.value = 'Red Hat Display'; +subtitleFontSelect.value = 'Kalam'; // Demo reset after ended document.querySelector('.how-to-section video.demo').onended = (e) => e.target.currentTime = 0; @@ -53,12 +53,20 @@ document.querySelector('.dark-mode-button') .addEventListener('click', (e) => { let resultBox = document.querySelector('.result-box'); const toogleDarkModeButton = document.querySelector('.dark-mode-button'); + const toogleRandomizeButton = document.querySelector('.randomize-button'); + const toogleDownloadButton = document.querySelector('.download-button'); + + const size = 20; resultBox.classList.toggle('light-mode'); if (resultBox.className.includes('light')) { - toogleDarkModeButton.innerText = 'Light Mode' + toogleDarkModeButton.innerHTML = `GH Light` + toogleRandomizeButton.innerHTML = `Random` + toogleDownloadButton.innerHTML = `Download` } else { - toogleDarkModeButton.innerText = 'Dark Mode' + toogleDarkModeButton.innerHTML = `GH Dark` + toogleRandomizeButton.innerHTML = `Random` + toogleDownloadButton.innerHTML = `Download` } }); diff --git a/package-lock.json b/package-lock.json index b493b91..f7351cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,261 +1,2152 @@ { "name": "github-profile-header-generator", - "version": "1.0.0", - "lockfileVersion": 1, + "version": "2.0.0", + "lockfileVersion": 2, "requires": true, - "dependencies": { - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "packages": { + "": { + "name": "github-profile-header-generator", + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "html2canvas": "^1.4.1" + }, + "devDependencies": { + "sass": "^1.89.2", + "vite": "^7.0.3", + "vite-plugin-handlebars": "^1.5.0", + "vite-plugin-html-inject": "^1.1.2" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz", + "integrity": "sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.6.tgz", + "integrity": "sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz", + "integrity": "sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.6.tgz", + "integrity": "sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz", + "integrity": "sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz", + "integrity": "sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz", + "integrity": "sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz", + "integrity": "sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz", + "integrity": "sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz", + "integrity": "sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz", + "integrity": "sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz", + "integrity": "sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz", + "integrity": "sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz", + "integrity": "sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz", + "integrity": "sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz", + "integrity": "sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz", + "integrity": "sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz", + "integrity": "sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz", + "integrity": "sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz", + "integrity": "sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz", + "integrity": "sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz", + "integrity": "sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz", + "integrity": "sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz", + "integrity": "sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz", + "integrity": "sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz", + "integrity": "sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.2.tgz", + "integrity": "sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.2.tgz", + "integrity": "sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.2.tgz", + "integrity": "sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.2.tgz", + "integrity": "sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.2.tgz", + "integrity": "sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.2.tgz", + "integrity": "sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.2.tgz", + "integrity": "sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.2.tgz", + "integrity": "sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.2.tgz", + "integrity": "sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.2.tgz", + "integrity": "sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.2.tgz", + "integrity": "sha512-Yl5Rdpf9pIc4GW1PmkUGHdMtbx0fBLE1//SxDmuf3X0dUC57+zMepow2LK0V21661cjXdTn8hO2tXDdAWAqE5g==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.2.tgz", + "integrity": "sha512-03vUDH+w55s680YYryyr78jsO1RWU9ocRMaeV2vMniJJW/6HhoTBwyyiiTPVHNWLnhsnwcQ0oH3S9JSBEKuyqw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.2.tgz", + "integrity": "sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.2.tgz", + "integrity": "sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.2.tgz", + "integrity": "sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.2.tgz", + "integrity": "sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.2.tgz", + "integrity": "sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.2.tgz", + "integrity": "sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.2.tgz", + "integrity": "sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.2.tgz", + "integrity": "sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "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 + }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "engines": { + "node": ">= 0.6.0" + } + }, + "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, + "optional": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/css-line-break": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + "dependencies": { + "utrie": "^1.0.2" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esbuild": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz", + "integrity": "sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.6", + "@esbuild/android-arm": "0.25.6", + "@esbuild/android-arm64": "0.25.6", + "@esbuild/android-x64": "0.25.6", + "@esbuild/darwin-arm64": "0.25.6", + "@esbuild/darwin-x64": "0.25.6", + "@esbuild/freebsd-arm64": "0.25.6", + "@esbuild/freebsd-x64": "0.25.6", + "@esbuild/linux-arm": "0.25.6", + "@esbuild/linux-arm64": "0.25.6", + "@esbuild/linux-ia32": "0.25.6", + "@esbuild/linux-loong64": "0.25.6", + "@esbuild/linux-mips64el": "0.25.6", + "@esbuild/linux-ppc64": "0.25.6", + "@esbuild/linux-riscv64": "0.25.6", + "@esbuild/linux-s390x": "0.25.6", + "@esbuild/linux-x64": "0.25.6", + "@esbuild/netbsd-arm64": "0.25.6", + "@esbuild/netbsd-x64": "0.25.6", + "@esbuild/openbsd-arm64": "0.25.6", + "@esbuild/openbsd-x64": "0.25.6", + "@esbuild/openharmony-arm64": "0.25.6", + "@esbuild/sunos-x64": "0.25.6", + "@esbuild/win32-arm64": "0.25.6", + "@esbuild/win32-ia32": "0.25.6", + "@esbuild/win32-x64": "0.25.6" + } + }, + "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, + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/html2canvas": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", + "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", + "dependencies": { + "css-line-break": "^2.1.0", + "text-segmentation": "^1.0.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/immutable": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "dev": true + }, + "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, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "optional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "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, + "optional": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "optional": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rollup": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.2.tgz", + "integrity": "sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.44.2", + "@rollup/rollup-android-arm64": "4.44.2", + "@rollup/rollup-darwin-arm64": "4.44.2", + "@rollup/rollup-darwin-x64": "4.44.2", + "@rollup/rollup-freebsd-arm64": "4.44.2", + "@rollup/rollup-freebsd-x64": "4.44.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.44.2", + "@rollup/rollup-linux-arm-musleabihf": "4.44.2", + "@rollup/rollup-linux-arm64-gnu": "4.44.2", + "@rollup/rollup-linux-arm64-musl": "4.44.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.44.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.44.2", + "@rollup/rollup-linux-riscv64-gnu": "4.44.2", + "@rollup/rollup-linux-riscv64-musl": "4.44.2", + "@rollup/rollup-linux-s390x-gnu": "4.44.2", + "@rollup/rollup-linux-x64-gnu": "4.44.2", + "@rollup/rollup-linux-x64-musl": "4.44.2", + "@rollup/rollup-win32-arm64-msvc": "4.44.2", + "@rollup/rollup-win32-ia32-msvc": "4.44.2", + "@rollup/rollup-win32-x64-msvc": "4.44.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/sass": { + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", + "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/text-segmentation": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", + "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", + "dependencies": { + "utrie": "^1.0.2" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==" + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "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, + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "dev": true, - "requires": { - "fill-range": "^7.0.1" + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" } }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/utrie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", + "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", + "dependencies": { + "base64-arraybuffer": "^1.0.2" + } + }, + "node_modules/vite": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.3.tgz", + "integrity": "sha512-y2L5oJZF7bj4c0jgGYgBNSdIu+5HF+m68rn2cQXFbGoShdhV1phX9rbnxy9YXj82aS8MMsCLAAFkRxZeWdldrQ==", "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.6", + "picomatch": "^4.0.2", + "postcss": "^8.5.6", + "rollup": "^4.40.0", + "tinyglobby": "^0.2.14" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "css-line-break": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", - "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", - "requires": { - "utrie": "^1.0.2" + "node_modules/vite-plugin-handlebars": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vite-plugin-handlebars/-/vite-plugin-handlebars-1.5.0.tgz", + "integrity": "sha512-qoCfcye7WEgurMVN63IHATkKTzVUndZjG5zMEYYUYYeRHU5OkcDqfmTLmtq9gdsduDIf7bT9Gu+dmI7iO7tGog==", + "dev": true, + "license": "MIT", + "dependencies": { + "handlebars": "^4.7.6" } }, - "esbuild": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.23.tgz", - "integrity": "sha512-XjnIcZ9KB6lfonCa+jRguXyRYcldmkyZ99ieDksqW/C8bnyEX299yA4QH2XcgijCgaddEZePPTgvx/2imsq7Ig==", + "node_modules/vite-plugin-html-inject": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vite-plugin-html-inject/-/vite-plugin-html-inject-1.1.2.tgz", + "integrity": "sha512-4DWANEcAw73H5JLWTAI4EvXdSyoGqGq/Is9fTRjpF+SJLor58LNdqB+YYnK3FOLwx6LMTAn4z1hkiRyc52lYLg==", "dev": true, - "requires": { - "esbuild-android-arm64": "0.14.23", - "esbuild-darwin-64": "0.14.23", - "esbuild-darwin-arm64": "0.14.23", - "esbuild-freebsd-64": "0.14.23", - "esbuild-freebsd-arm64": "0.14.23", - "esbuild-linux-32": "0.14.23", - "esbuild-linux-64": "0.14.23", - "esbuild-linux-arm": "0.14.23", - "esbuild-linux-arm64": "0.14.23", - "esbuild-linux-mips64le": "0.14.23", - "esbuild-linux-ppc64le": "0.14.23", - "esbuild-linux-riscv64": "0.14.23", - "esbuild-linux-s390x": "0.14.23", - "esbuild-netbsd-64": "0.14.23", - "esbuild-openbsd-64": "0.14.23", - "esbuild-sunos-64": "0.14.23", - "esbuild-windows-32": "0.14.23", - "esbuild-windows-64": "0.14.23", - "esbuild-windows-arm64": "0.14.23" + "license": "MIT" + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "esbuild-android-arm64": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.23.tgz", - "integrity": "sha512-k9sXem++mINrZty1v4FVt6nC5BQCFG4K2geCIUUqHNlTdFnuvcqsY7prcKZLFhqVC1rbcJAr9VSUGFL/vD4vsw==", + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + } + }, + "dependencies": { + "@esbuild/aix-ppc64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz", + "integrity": "sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.6.tgz", + "integrity": "sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==", "dev": true, "optional": true }, - "esbuild-darwin-64": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.23.tgz", - "integrity": "sha512-lB0XRbtOYYL1tLcYw8BoBaYsFYiR48RPrA0KfA/7RFTr4MV7Bwy/J4+7nLsVnv9FGuQummM3uJ93J3ptaTqFug==", + "@esbuild/android-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz", + "integrity": "sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==", "dev": true, "optional": true }, - "esbuild-darwin-arm64": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.23.tgz", - "integrity": "sha512-yat73Z/uJ5tRcfRiI4CCTv0FSnwErm3BJQeZAh+1tIP0TUNh6o+mXg338Zl5EKChD+YGp6PN+Dbhs7qa34RxSw==", + "@esbuild/android-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.6.tgz", + "integrity": "sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==", "dev": true, "optional": true }, - "esbuild-freebsd-64": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.23.tgz", - "integrity": "sha512-/1xiTjoLuQ+LlbfjJdKkX45qK/M7ARrbLmyf7x3JhyQGMjcxRYVR6Dw81uH3qlMHwT4cfLW4aEVBhP1aNV7VsA==", + "@esbuild/darwin-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz", + "integrity": "sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==", "dev": true, "optional": true }, - "esbuild-freebsd-arm64": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.23.tgz", - "integrity": "sha512-uyPqBU/Zcp6yEAZS4LKj5jEE0q2s4HmlMBIPzbW6cTunZ8cyvjG6YWpIZXb1KK3KTJDe62ltCrk3VzmWHp+iLg==", + "@esbuild/darwin-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz", + "integrity": "sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==", "dev": true, "optional": true }, - "esbuild-linux-32": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.23.tgz", - "integrity": "sha512-37R/WMkQyUfNhbH7aJrr1uCjDVdnPeTHGeDhZPUNhfoHV0lQuZNCKuNnDvlH/u/nwIYZNdVvz1Igv5rY/zfrzQ==", + "@esbuild/freebsd-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz", + "integrity": "sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==", "dev": true, "optional": true }, - "esbuild-linux-64": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.23.tgz", - "integrity": "sha512-H0gztDP60qqr8zoFhAO64waoN5yBXkmYCElFklpd6LPoobtNGNnDe99xOQm28+fuD75YJ7GKHzp/MLCLhw2+vQ==", + "@esbuild/freebsd-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz", + "integrity": "sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==", "dev": true, "optional": true }, - "esbuild-linux-arm": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.23.tgz", - "integrity": "sha512-x64CEUxi8+EzOAIpCUeuni0bZfzPw/65r8tC5cy5zOq9dY7ysOi5EVQHnzaxS+1NmV+/RVRpmrzGw1QgY2Xpmw==", + "@esbuild/linux-arm": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz", + "integrity": "sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==", "dev": true, "optional": true }, - "esbuild-linux-arm64": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.23.tgz", - "integrity": "sha512-c4MLOIByNHR55n3KoYf9hYDfBRghMjOiHLaoYLhkQkIabb452RWi+HsNgB41sUpSlOAqfpqKPFNg7VrxL3UX9g==", + "@esbuild/linux-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz", + "integrity": "sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==", "dev": true, "optional": true }, - "esbuild-linux-mips64le": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.23.tgz", - "integrity": "sha512-kHKyKRIAedYhKug2EJpyJxOUj3VYuamOVA1pY7EimoFPzaF3NeY7e4cFBAISC/Av0/tiV0xlFCt9q0HJ68IBIw==", + "@esbuild/linux-ia32": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz", + "integrity": "sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==", "dev": true, "optional": true }, - "esbuild-linux-ppc64le": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.23.tgz", - "integrity": "sha512-7ilAiJEPuJJnJp/LiDO0oJm5ygbBPzhchJJh9HsHZzeqO+3PUzItXi+8PuicY08r0AaaOe25LA7sGJ0MzbfBag==", + "@esbuild/linux-loong64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz", + "integrity": "sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==", "dev": true, "optional": true }, - "esbuild-linux-riscv64": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.23.tgz", - "integrity": "sha512-fbL3ggK2wY0D8I5raPIMPhpCvODFE+Bhb5QGtNP3r5aUsRR6TQV+ZBXIaw84iyvKC8vlXiA4fWLGhghAd/h/Zg==", + "@esbuild/linux-mips64el": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz", + "integrity": "sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==", "dev": true, "optional": true }, - "esbuild-linux-s390x": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.23.tgz", - "integrity": "sha512-GHMDCyfy7+FaNSO8RJ8KCFsnax8fLUsOrj9q5Gi2JmZMY0Zhp75keb5abTFCq2/Oy6KVcT0Dcbyo/bFb4rIFJA==", + "@esbuild/linux-ppc64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz", + "integrity": "sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==", "dev": true, "optional": true }, - "esbuild-netbsd-64": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.23.tgz", - "integrity": "sha512-ovk2EX+3rrO1M2lowJfgMb/JPN1VwVYrx0QPUyudxkxLYrWeBxDKQvc6ffO+kB4QlDyTfdtAURrVzu3JeNdA2g==", + "@esbuild/linux-riscv64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz", + "integrity": "sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==", "dev": true, "optional": true }, - "esbuild-openbsd-64": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.23.tgz", - "integrity": "sha512-uYYNqbVR+i7k8ojP/oIROAHO9lATLN7H2QeXKt2H310Fc8FJj4y3Wce6hx0VgnJ4k1JDrgbbiXM8rbEgQyg8KA==", + "@esbuild/linux-s390x": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz", + "integrity": "sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==", "dev": true, "optional": true }, - "esbuild-sunos-64": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.23.tgz", - "integrity": "sha512-hAzeBeET0+SbScknPzS2LBY6FVDpgE+CsHSpe6CEoR51PApdn2IB0SyJX7vGelXzlyrnorM4CAsRyb9Qev4h9g==", + "@esbuild/linux-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz", + "integrity": "sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==", "dev": true, "optional": true }, - "esbuild-windows-32": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.23.tgz", - "integrity": "sha512-Kttmi3JnohdaREbk6o9e25kieJR379TsEWF0l39PQVHXq3FR6sFKtVPgY8wk055o6IB+rllrzLnbqOw/UV60EA==", + "@esbuild/netbsd-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz", + "integrity": "sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==", "dev": true, "optional": true }, - "esbuild-windows-64": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.23.tgz", - "integrity": "sha512-JtIT0t8ymkpl6YlmOl6zoSWL5cnCgyLaBdf/SiU/Eg3C13r0NbHZWNT/RDEMKK91Y6t79kTs3vyRcNZbfu5a8g==", + "@esbuild/netbsd-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz", + "integrity": "sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==", "dev": true, "optional": true }, - "esbuild-windows-arm64": { - "version": "0.14.23", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.23.tgz", - "integrity": "sha512-cTFaQqT2+ik9e4hePvYtRZQ3pqOvKDVNarzql0VFIzhc0tru/ZgdLoXd6epLiKT+SzoSce6V9YJ+nn6RCn6SHw==", + "@esbuild/openbsd-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz", + "integrity": "sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==", "dev": true, "optional": true }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "@esbuild/openbsd-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz", + "integrity": "sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==", + "dev": true, + "optional": true + }, + "@esbuild/openharmony-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz", + "integrity": "sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz", + "integrity": "sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz", + "integrity": "sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz", + "integrity": "sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz", + "integrity": "sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==", + "dev": true, + "optional": true + }, + "@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, + "optional": true, "requires": { - "to-regex-range": "^5.0.1" + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1", + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" } }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", "dev": true, "optional": true }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "dev": true, + "optional": true + }, + "@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "dev": true, + "optional": true + }, + "@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.2.tgz", + "integrity": "sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.2.tgz", + "integrity": "sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.2.tgz", + "integrity": "sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.2.tgz", + "integrity": "sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-freebsd-arm64": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.2.tgz", + "integrity": "sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-freebsd-x64": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.2.tgz", + "integrity": "sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.2.tgz", + "integrity": "sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-musleabihf": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.2.tgz", + "integrity": "sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.2.tgz", + "integrity": "sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.2.tgz", + "integrity": "sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.2.tgz", + "integrity": "sha512-Yl5Rdpf9pIc4GW1PmkUGHdMtbx0fBLE1//SxDmuf3X0dUC57+zMepow2LK0V21661cjXdTn8hO2tXDdAWAqE5g==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.2.tgz", + "integrity": "sha512-03vUDH+w55s680YYryyr78jsO1RWU9ocRMaeV2vMniJJW/6HhoTBwyyiiTPVHNWLnhsnwcQ0oH3S9JSBEKuyqw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.2.tgz", + "integrity": "sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-musl": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.2.tgz", + "integrity": "sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.2.tgz", + "integrity": "sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.2.tgz", + "integrity": "sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.2.tgz", + "integrity": "sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.2.tgz", + "integrity": "sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.2.tgz", + "integrity": "sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.2.tgz", + "integrity": "sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==", + "dev": true, + "optional": true + }, + "@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 }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==" + }, + "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, + "optional": true, + "requires": { + "fill-range": "^7.1.1" + } + }, + "chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "requires": { - "is-glob": "^4.0.1" + "readdirp": "^4.0.1" + } + }, + "css-line-break": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + "requires": { + "utrie": "^1.0.2" } }, - "has": { + "detect-libc": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz", + "integrity": "sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.25.6", + "@esbuild/android-arm": "0.25.6", + "@esbuild/android-arm64": "0.25.6", + "@esbuild/android-x64": "0.25.6", + "@esbuild/darwin-arm64": "0.25.6", + "@esbuild/darwin-x64": "0.25.6", + "@esbuild/freebsd-arm64": "0.25.6", + "@esbuild/freebsd-x64": "0.25.6", + "@esbuild/linux-arm": "0.25.6", + "@esbuild/linux-arm64": "0.25.6", + "@esbuild/linux-ia32": "0.25.6", + "@esbuild/linux-loong64": "0.25.6", + "@esbuild/linux-mips64el": "0.25.6", + "@esbuild/linux-ppc64": "0.25.6", + "@esbuild/linux-riscv64": "0.25.6", + "@esbuild/linux-s390x": "0.25.6", + "@esbuild/linux-x64": "0.25.6", + "@esbuild/netbsd-arm64": "0.25.6", + "@esbuild/netbsd-x64": "0.25.6", + "@esbuild/openbsd-arm64": "0.25.6", + "@esbuild/openbsd-x64": "0.25.6", + "@esbuild/openharmony-arm64": "0.25.6", + "@esbuild/sunos-x64": "0.25.6", + "@esbuild/win32-arm64": "0.25.6", + "@esbuild/win32-ia32": "0.25.6", + "@esbuild/win32-x64": "0.25.6" + } + }, + "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, + "optional": true, "requires": { - "function-bind": "^1.1.1" + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" } }, "html2canvas": { @@ -268,40 +2159,24 @@ } }, "immutable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", - "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", "dev": true }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "optional": true }, "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, + "optional": true, "requires": { "is-extglob": "^2.1.1" } @@ -310,99 +2185,127 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "optional": true, + "requires": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "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 + "node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "optional": true }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "dev": true, + "optional": true }, "postcss": { - "version": "8.4.7", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz", - "integrity": "sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "requires": { - "nanoid": "^3.3.1", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" } }, "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true }, "rollup": { - "version": "2.68.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.68.0.tgz", - "integrity": "sha512-XrMKOYK7oQcTio4wyTz466mucnd8LzkiZLozZ4Rz0zQD+HeX4nUK4B8GrTX/2EvN2/vBF/i2WnaXboPxo0JylA==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.2.tgz", + "integrity": "sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==", "dev": true, "requires": { + "@rollup/rollup-android-arm-eabi": "4.44.2", + "@rollup/rollup-android-arm64": "4.44.2", + "@rollup/rollup-darwin-arm64": "4.44.2", + "@rollup/rollup-darwin-x64": "4.44.2", + "@rollup/rollup-freebsd-arm64": "4.44.2", + "@rollup/rollup-freebsd-x64": "4.44.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.44.2", + "@rollup/rollup-linux-arm-musleabihf": "4.44.2", + "@rollup/rollup-linux-arm64-gnu": "4.44.2", + "@rollup/rollup-linux-arm64-musl": "4.44.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.44.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.44.2", + "@rollup/rollup-linux-riscv64-gnu": "4.44.2", + "@rollup/rollup-linux-riscv64-musl": "4.44.2", + "@rollup/rollup-linux-s390x-gnu": "4.44.2", + "@rollup/rollup-linux-x64-gnu": "4.44.2", + "@rollup/rollup-linux-x64-musl": "4.44.2", + "@rollup/rollup-win32-arm64-msvc": "4.44.2", + "@rollup/rollup-win32-ia32-msvc": "4.44.2", + "@rollup/rollup-win32-x64-msvc": "4.44.2", + "@types/estree": "1.0.8", "fsevents": "~2.3.2" } }, "sass": { - "version": "1.49.9", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz", - "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==", + "version": "1.89.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", + "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", "dev": true, "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", + "@parcel/watcher": "^2.4.1", + "chokidar": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" } }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "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==", + "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==", "dev": true }, "text-segmentation": { @@ -413,15 +2316,48 @@ "utrie": "^1.0.2" } }, + "tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "requires": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "dependencies": { + "fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "requires": {} + }, + "picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true + } + } + }, "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, + "optional": true, "requires": { "is-number": "^7.0.0" } }, + "uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "optional": true + }, "utrie": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", @@ -431,17 +2367,55 @@ } }, "vite": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.8.4.tgz", - "integrity": "sha512-GwtOkkaT2LDI82uWZKcrpRQxP5tymLnC7hVHHqNkhFNknYr0hJUlDLfhVRgngJvAy3RwypkDCWtTKn1BjO96Dw==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.3.tgz", + "integrity": "sha512-y2L5oJZF7bj4c0jgGYgBNSdIu+5HF+m68rn2cQXFbGoShdhV1phX9rbnxy9YXj82aS8MMsCLAAFkRxZeWdldrQ==", + "dev": true, + "requires": { + "esbuild": "^0.25.0", + "fdir": "^6.4.6", + "fsevents": "~2.3.3", + "picomatch": "^4.0.2", + "postcss": "^8.5.6", + "rollup": "^4.40.0", + "tinyglobby": "^0.2.14" + }, + "dependencies": { + "fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "requires": {} + }, + "picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true + } + } + }, + "vite-plugin-handlebars": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vite-plugin-handlebars/-/vite-plugin-handlebars-1.5.0.tgz", + "integrity": "sha512-qoCfcye7WEgurMVN63IHATkKTzVUndZjG5zMEYYUYYeRHU5OkcDqfmTLmtq9gdsduDIf7bT9Gu+dmI7iO7tGog==", "dev": true, "requires": { - "esbuild": "^0.14.14", - "fsevents": "~2.3.2", - "postcss": "^8.4.6", - "resolve": "^1.22.0", - "rollup": "^2.59.0" + "handlebars": "^4.7.6" } + }, + "vite-plugin-html-inject": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vite-plugin-html-inject/-/vite-plugin-html-inject-1.1.2.tgz", + "integrity": "sha512-4DWANEcAw73H5JLWTAI4EvXdSyoGqGq/Is9fTRjpF+SJLor58LNdqB+YYnK3FOLwx6LMTAn4z1hkiRyc52lYLg==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true } } } diff --git a/package.json b/package.json index 94083ca..22d156a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "github-profile-header-generator", - "version": "1.0.0", + "version": "2.0.0", "description": "A simple but nice header image generator for your Github profile", "scripts": { "dev": "vite", @@ -19,8 +19,10 @@ }, "homepage": "https://github.com/leviarista/github-profile-header-generator#readme", "devDependencies": { - "sass": "^1.49.9", - "vite": "^2.8.0" + "sass": "^1.89.2", + "vite": "^7.0.3", + "vite-plugin-handlebars": "^1.5.0", + "vite-plugin-html-inject": "^1.1.2" }, "dependencies": { "html2canvas": "^1.4.1" diff --git a/partials/footer.html b/partials/footer.html new file mode 100644 index 0000000..b3ccfda --- /dev/null +++ b/partials/footer.html @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/partials/head.html b/partials/head.html new file mode 100644 index 0000000..d1c7e6b --- /dev/null +++ b/partials/head.html @@ -0,0 +1,64 @@ + + + + + Github Profile Header Generator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/partials/header.html b/partials/header.html new file mode 100644 index 0000000..4c19fd1 --- /dev/null +++ b/partials/header.html @@ -0,0 +1,17 @@ +
+

+ Github logo
+ Github Profile
+ Header Generator +

+

+ A simple but nice header image generator
for your Github profile +

+

+ + Star + +

+
\ No newline at end of file diff --git a/partials/how-to.html b/partials/how-to.html new file mode 100644 index 0000000..05c7eea --- /dev/null +++ b/partials/how-to.html @@ -0,0 +1,24 @@ +
+

How to use it?

+
    +
  1. + Create a nice github header image.
    + +
  2. +
  3. + Create your GitHub profile README
    following + + this guide. + +
  4. +
  5. Upload your header to your profile repo.
  6. +
  7. + Add this line to your README: +

    ![Header](./your-header-image-name.png)

    +
  8. +
+
\ No newline at end of file diff --git a/partials/modals/feedback.html b/partials/modals/feedback.html new file mode 100644 index 0000000..edd6356 --- /dev/null +++ b/partials/modals/feedback.html @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/partials/modals/info.html b/partials/modals/info.html new file mode 100644 index 0000000..8be0bf9 --- /dev/null +++ b/partials/modals/info.html @@ -0,0 +1,31 @@ + \ No newline at end of file diff --git a/partials/scripts.html b/partials/scripts.html new file mode 100644 index 0000000..9b6ce74 --- /dev/null +++ b/partials/scripts.html @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/partials/toolbox/background.html b/partials/toolbox/background.html new file mode 100644 index 0000000..e6deffd --- /dev/null +++ b/partials/toolbox/background.html @@ -0,0 +1,107 @@ +
+
+
+
+ +

+
+
+ +

+
+
+
+
+ + + 0 +
+
+ + + 7 +
+
+
+
+ + +
+
+ + + 100 +
+
+ + + 0.25 +
+
+
Patterns:
+
+ + + + + + + + + + + + + + + + + +
+
+
\ No newline at end of file diff --git a/partials/toolbox/decorations.html b/partials/toolbox/decorations.html new file mode 100644 index 0000000..e0c18ae --- /dev/null +++ b/partials/toolbox/decorations.html @@ -0,0 +1,95 @@ +
+
+
+
+ + + 100 +
+
+
Decorations:
+
+ + + + + + + + + + + + + + + + + + +
+
+ + +
+ + đź’ˇUse an octocat from the + Github + Octodex +
+ đź’ˇOr build your own at + MyOctocat.com +
+   (My octocat looks like broken but you can copy the svg result) +
+
+
+
\ No newline at end of file diff --git a/partials/toolbox/main.html b/partials/toolbox/main.html new file mode 100644 index 0000000..d93b2c2 --- /dev/null +++ b/partials/toolbox/main.html @@ -0,0 +1,131 @@ +
+
+
+ + +
+
+
+ + +
+
+ + +
+
+ + + 25 +
+
+
+
+ +

+
+
+ +

+
+
+ +

+
+
+
+ Text align: + + + +
+
+
+ + +
+
+ + +
+
+
+
+ + + 40 +
+
+ + + 20 +
+
+
+
\ No newline at end of file diff --git a/partials/toolbox/presets.html b/partials/toolbox/presets.html new file mode 100644 index 0000000..1731c87 --- /dev/null +++ b/partials/toolbox/presets.html @@ -0,0 +1,12 @@ +
+
+ + + + + + + + +
+
\ No newline at end of file diff --git a/partials/toolbox/result.html b/partials/toolbox/result.html new file mode 100644 index 0000000..27e5e21 --- /dev/null +++ b/partials/toolbox/result.html @@ -0,0 +1,26 @@ +
+
+
+
+ + GH Dark +
+
+ + Random +
+
+
+ + Download +
+ +
+
+
+
Hey! I am ...
+
Fullstack developer
+
+
+
+
\ No newline at end of file diff --git a/public/images/icons/download-black.svg b/public/images/icons/download-black.svg new file mode 100644 index 0000000..f0ab490 --- /dev/null +++ b/public/images/icons/download-black.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/public/images/icons/download.svg b/public/images/icons/download.svg new file mode 100644 index 0000000..f28ee2b --- /dev/null +++ b/public/images/icons/download.svg @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/public/images/icons/light-dark-black.svg b/public/images/icons/light-dark-black.svg new file mode 100644 index 0000000..b14fceb --- /dev/null +++ b/public/images/icons/light-dark-black.svg @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/public/images/icons/light-dark.svg b/public/images/icons/light-dark.svg new file mode 100644 index 0000000..a8df9d0 --- /dev/null +++ b/public/images/icons/light-dark.svg @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/public/images/icons/random-black.svg b/public/images/icons/random-black.svg new file mode 100644 index 0000000..30b7a57 --- /dev/null +++ b/public/images/icons/random-black.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/public/images/icons/random.svg b/public/images/icons/random.svg new file mode 100644 index 0000000..ff232c1 --- /dev/null +++ b/public/images/icons/random.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/styles/index.scss b/styles/index.scss index d1cbc2e..bf27275 100644 --- a/styles/index.scss +++ b/styles/index.scss @@ -2,6 +2,7 @@ @use "variables"; @use "main"; @use "how-to"; +@use "toolbox-presets"; @use "toolbox-main"; @use "toolbox-background"; @use "toolbox-decorations"; diff --git a/styles/main.scss b/styles/main.scss index 6cbedd6..53355cb 100644 --- a/styles/main.scss +++ b/styles/main.scss @@ -1,27 +1,55 @@ body { - background-color: #4078c0; + background-color: #605FA1; } .main-container { margin: 0 auto; - padding: 25px 10%; - display: grid; - grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; - // grid-template-rows: 300px calc(100% - 300px - 25px - 45px) 25px; - grid-template-rows: auto 1fr auto; - grid-gap: 15px 40px; - grid-auto-flow: row; - grid-template-areas: - "header header section2 section2 section2 section2" - "section1 section1 section2 section2 section2 section2" - "footer footer section2 section2 section2 section2"; - background: linear-gradient(180deg, #6e5494 0%, #605fa1 32.6%, #4e6db3 68.54%, #4078c0 100%); + display: flex; + color: var(--text-color); + font-family: var(--main-font-familiy); + background: linear-gradient(180deg, #675494 0%, #605fa1 32.6%, #4e6db3 68.54%, #4078c0 100%); +} + +.left-container { + min-height: 100vh; + padding: 1rem; + display: flex; + flex-direction: column; + overflow: auto; + flex-grow: 2; + // background-color: #312149; + background: rgba(0, 0, 0, .05); + box-shadow: 0px 0px 10px 5px rgb(255, 255, 255, .25); + z-index: 20; +} + +.toolbox-container { + width: calc(100% - 300px - (var(--paddings) * 2)); + padding: 0; + // background: rgba(255, 255, 255, 0.15); + background: inherit; background-repeat: no-repeat; background-size: cover; background-position: center; background-attachment: fixed; - color: var(--text-color); - font-family: var(--main-font-familiy); + overflow: hidden; +} + +.scrollable { + &::-webkit-scrollbar { + width: 0.4em; + } + + &::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0.1); + // -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.1); + } + + &::-webkit-scrollbar-thumb { + border-radius: 10px; + background-color: rgba(255, 255, 255, 0.75); + // + } } a:link, @@ -54,7 +82,7 @@ select, } } -textarea{ +textarea { padding: 10px; background: rgba(255, 255, 255, 0.15); border: 1px solid rgb(255, 255, 255, 0.5); @@ -171,11 +199,10 @@ button { filter: drop-shadow(0px 0px 5px rgba(255, 255, 255, 0.5)); img { - margin-bottom: 5px; + margin-bottom: 15px; } - span { - font-family: var(--secondary-font-familiy); + h1 { line-height: 1; } @@ -191,11 +218,12 @@ button { } .footer { + flex-grow: 1; grid-area: footer; display: flex; align-items: center; flex-direction: column; - justify-content: space-between; + justify-content: end; >div { display: flex; @@ -256,7 +284,25 @@ button { @media (max-width: 768px) { .main-container { flex-direction: column; - display: flex; - padding: 25px 5%; + } + + .left-container { + background: inherit; + // display: none; + padding-bottom: 2rem; + + .how-to-section { + // display: none; + } + + footer { + // display: none; + } + } + + .toolbox-container { + width: 100%; + height: auto; + min-height: 100vh; } } \ No newline at end of file diff --git a/styles/tabs.scss b/styles/tabs.scss index 3186148..0b30e89 100644 --- a/styles/tabs.scss +++ b/styles/tabs.scss @@ -1,22 +1,34 @@ /* Style the tab */ .tab { - display: flex; + position: fixed; + left: 50%; + transform: translateX(calc(-50% + 190px)); + padding: 0 2px 2px 2px; + width: fit-content; + margin: 0 auto; + display: grid; + grid-template-columns: repeat(4, auto); + gap: 2px; justify-content: center; - overflow: hidden; - border-bottom: 1px solid #ccc; color: var(--text-color); + background: #6E5494; + border-radius: 0 0 10px 10px; + box-shadow: 0px 0px 5px 2px rgba(255, 255, 255, 0.25); + overflow: hidden; + z-index: 10; + user-select: none; } /* Style the buttons that are used to open the tab content */ .tab button { background-color: inherit; - float: left; border: none; outline: none; cursor: pointer; - padding: 14px 16px; + padding: 1rem 2rem; transition: 0.3s; color: white; + border-radius: 0 0 9px 9px; } /* Change background color of buttons on hover */ @@ -33,12 +45,18 @@ /* Style the tab content */ .tabcontent { - display: none; - padding: 15px 15px 0 15px; + width: 100%; + // max-width: calc(1280px - 296px - 24px); + margin: auto; + margin-top: calc(1rem + 2rem + 0.5rem); + max-width: calc(900px); + padding: 0.5rem 1rem 0.5rem 1rem; + overflow: auto; } .tabcontent { - animation: fadeEffect 1s; /* Fading effect takes 1 second */ + animation: fadeEffect 1s; + /* Fading effect takes 1 second */ } /* Go from zero to full opacity */ @@ -46,7 +64,60 @@ from { opacity: 0; } + to { opacity: 1; } } + +@media (max-width: 850px) { + .tab { + button { + padding: 10px 1rem; + } + } +} + +@media (max-width: 768px) { + .tab { + position: static; + width: 100%; + transform: translateX(calc(0)); + display: grid; + grid-template-columns: repeat(4, auto); + gap: 1px; + border-radius: 0; + padding: 1px; + overflow: auto; + + button { + padding: 10px; + border-radius: 0; + } + } + + .tabcontent { + height: auto; + margin-top: 1rem; + } +} + +@media (max-width: 360px) { + .tab { + width: 100%; + margin: 0; + left: 0; + transform: translateX(calc(0)); + display: grid; + grid-template-columns: repeat(4, auto); + border-radius: 0; + padding: 1px; + overflow: auto; + + button { + padding: 10px; + border-radius: 0; + } + } + +} \ No newline at end of file diff --git a/styles/toolbox-background.scss b/styles/toolbox-background.scss index 8f6bdc3..112eda6 100644 --- a/styles/toolbox-background.scss +++ b/styles/toolbox-background.scss @@ -73,8 +73,8 @@ margin: auto; button { - width: 50px; - height: 50px; + width: 70px; + height: 70px; padding: 0; margin-left: 5px; margin-bottom: 5px; @@ -83,8 +83,8 @@ justify-content: center; img { - max-width: 45px; - max-height: 45px; + max-width: 55px; + max-height: 55px; } &.selected { diff --git a/styles/toolbox-decorations.scss b/styles/toolbox-decorations.scss index 530915c..d170ec7 100644 --- a/styles/toolbox-decorations.scss +++ b/styles/toolbox-decorations.scss @@ -16,8 +16,8 @@ .decorations-buttons { button { - width: 50px; - height: 50px; + width: 70px; + height: 70px; padding: 0; margin-left: 5px; margin-bottom: 5px; @@ -26,8 +26,8 @@ justify-content: center; img { - max-width: 40px; - max-height: 40px; + max-width: 50px; + max-height: 50px; // border-radius: var(--input-border-radius); } diff --git a/styles/toolbox-main.scss b/styles/toolbox-main.scss index 918ce1f..b73426c 100644 --- a/styles/toolbox-main.scss +++ b/styles/toolbox-main.scss @@ -1,23 +1,47 @@ .toolbox-container { - grid-area: section2; - // text-align: center; - background: rgba(255, 255, 255, 0.15); - border-radius: 10px; - box-shadow: 0px 0px 5px 2px rgba(255, 255, 255, 0.25); - overflow: auto; - .result-box { // height: 300px; - padding: var(--paddings); - border-radius: 10px 10px 0px 0px; + padding: 1rem 2rem 2rem 2rem; background: var(--github-dark-mode-color); transition: 0.5s ease; + user-select: none; &.light-mode { background: var(--github-light-mode-color); + + .dark-mode-button, + .randomize-button { + color: black !important; + + &:hover { + // box-shadow: 0px 0px 5px 2px rgba(255, 255, 255, 0.25); + text-shadow: 0px 0px 10px #929292 !important; + } + } + } + + .header-image-container { + width: 100%; + flex-grow: 1; + // max-width: calc(1280px - 296px - 24px); + max-width: calc(900px); + margin: auto; + width: 100%; + filter: drop-shadow(0px 0px 5px rgba(125, 125, 125, 0.5)); } #github-header-image { + width: 100%; + height: 250px; + padding: 25px; + position: relative; + display: flex; + align-items: flex-start; + justify-content: center; + flex-direction: column; + background-color: #4078C0; + color: white; + border-radius: 7px; margin: 0 auto; border: none; overflow: hidden; @@ -35,47 +59,74 @@ } .options-container { + max-width: calc(900px); + margin: auto; + user-select: none; display: flex; - justify-content: center; - flex-wrap: wrap; - padding: var(--paddings) 0 0 0; + align-items: center; + gap: 35px; + justify-content: space-between; + // flex-wrap: wrap; + padding: 5px 0; - button { - width: 155px; + >div:first-child { + display: flex; + gap: 2rem; + } + + .dark-mode-button, + .randomize-button, + .download-button { + background-color: transparent; + display: flex; + gap: 7px; + justify-content: center; + align-items: center; + width: fit-content; height: 35px; - border: 1px solid #ffffff; - border-radius: var(--button-border-radius); + // border: 1px solid #ffffff; + // border-radius: var(--button-border-radius); color: var(--text-color); - text-transform: uppercase; - font-size: 12px; + // text-transform: uppercase; + text-align: center; font-weight: 600; + white-space: nowrap; transition: all 0.25s ease-in-out; + cursor: pointer; - &:hover { - box-shadow: 0px 0px 5px 2px rgba(255, 255, 255, 0.25); + img { + transition: all ease 500ms; } - &:not(:last-child) { - margin-right: 15px; + &:hover { + // box-shadow: 0px 0px 5px 2px rgba(255, 255, 255, 0.25); + text-shadow: 0px 0px 10px rgb(255, 255, 255); + + img { + transform: scale(1.2); + } } } - .dark-mode-button { - background: #2e384d; - } .download-button { - background: #2D8655; - } - .randomize-button { - background: #862D5A; + background-color: #2D8655 !important; + // border: 1px solid #ffffff; + border-radius: var(--button-border-radius); + padding: 5px 15px; } } } + .toolbox-tools { + height: calc(100vh - 250px - 3rem - 35px - 1rem); + overflow: auto; + padding: 0.5rem 1rem 2rem 1rem; + } + .toolbox { box-sizing: border-box; - > div { + >div { display: flex; align-items: center; justify-content: center; @@ -113,7 +164,7 @@ } .size-inputs { - > div { + >div { &:not(:last-child) { margin-right: 15px; } @@ -173,21 +224,6 @@ } } } - - &::-webkit-scrollbar { - width: 0.4em; - } - - &::-webkit-scrollbar-track { - background: rgba(0, 0, 0, 0.1); - // -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.1); - } - - &::-webkit-scrollbar-thumb { - border-radius: 10px; - background-color: rgba(255, 255, 255, 0.75); - // - } } @media (max-width: 768px) { @@ -197,17 +233,25 @@ } .result-box { + padding: 1rem 1rem 1.5rem 1rem; + + #github-header-image { + height: 250px; + } + .options-container { - button { - width: 100%; - &:not(:last-child) { - margin-bottom: 10px; - margin-right: 0; - } + gap: 10px; + + >div:first-child { + gap: 10px; } } } + .toolbox-tools { + height: auto; + } + .toolbox { .text-inputs { input { @@ -217,13 +261,15 @@ // } } } + .font-selectors-container { - > div { + >div { &:not(:last-child) { margin-bottom: 10px; } } } + .font-size-inputs { input { &:not(:last-child) { @@ -234,3 +280,21 @@ } } } + +@media (max-width: 360px) { + .toolbox-container { + .result-box { + .options-container { + flex-wrap: wrap; + gap: 10px; + justify-content: center; + + >div:first-child { + gap: 10px; + } + } + } + + } + +} \ No newline at end of file diff --git a/styles/toolbox-presets.scss b/styles/toolbox-presets.scss new file mode 100644 index 0000000..3d209f5 --- /dev/null +++ b/styles/toolbox-presets.scss @@ -0,0 +1,7 @@ +.toolbox-presets { + padding: 10px; + display: flex; + justify-content: center; + flex-wrap: wrap; + gap: 15px; +} \ No newline at end of file diff --git a/styles/variables.scss b/styles/variables.scss index 34fcda4..ef070df 100644 --- a/styles/variables.scss +++ b/styles/variables.scss @@ -2,15 +2,14 @@ --button-border-radius: 7px; --input-border-radius: 7px; --text-color: white; - --paddings: 25px; + --paddings: 3rem; --github-dark-mode-color: #0d1117; --github-light-mode-color: white; --main-font-familiy: "Red Hat Display", Arial, Helvetica, sans-serif; - --secondary-font-familiy: "Kalam"; } @media (max-width: 768px) { :root { - --paddings: 15px; + --paddings: 1rem; } } diff --git a/vite.config.js b/vite.config.js index 5176788..bd426b6 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,5 +1,13 @@ -module.exports = { +import { defineConfig } from 'vite'; +import injectHTML from 'vite-plugin-html-inject'; +import handlebars from 'vite-plugin-handlebars'; +import { resolve } from 'path'; + +export default defineConfig({ build: { emptyOutDir: true - } -} \ No newline at end of file + }, + plugins: [ + injectHTML(), + ], +}); From 6b65d984f049369af2125a5c9727e7a76c252069 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lev=C3=AD=20Arista?= Date: Thu, 17 Jul 2025 11:41:39 -0500 Subject: [PATCH 2/8] Update counter.dev analytics script --- partials/head.html | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/partials/head.html b/partials/head.html index d1c7e6b..c1da317 100644 --- a/partials/head.html +++ b/partials/head.html @@ -54,11 +54,7 @@ - + + \ No newline at end of file From 5935b5b8041ae5399b7169937206ac020d98933f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lev=C3=AD=20Arista?= Date: Thu, 17 Jul 2025 11:45:35 -0500 Subject: [PATCH 3/8] Redesign UI and add HTML partials --- index.html | 4 +- package-lock.json | 134 ----------------------------------- package.json | 1 - partials/toolbox/result.html | 14 ++-- styles/toolbox-main.scss | 6 +- vite.config.js | 2 - 6 files changed, 12 insertions(+), 149 deletions(-) diff --git a/index.html b/index.html index d397ca6..af80595 100644 --- a/index.html +++ b/index.html @@ -14,14 +14,14 @@
- +
- + diff --git a/package-lock.json b/package-lock.json index f7351cf..29f1f97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,6 @@ "devDependencies": { "sass": "^1.89.2", "vite": "^7.0.3", - "vite-plugin-handlebars": "^1.5.0", "vite-plugin-html-inject": "^1.1.2" } }, @@ -1121,28 +1120,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, "node_modules/html2canvas": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", @@ -1208,16 +1185,6 @@ "node": ">=8.6" } }, - "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/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -1236,13 +1203,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT" - }, "node_modules/node-addon-api": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", @@ -1370,16 +1330,6 @@ "@parcel/watcher": "^2.4.1" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -1452,20 +1402,6 @@ "node": ">=8.0" } }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/utrie": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", @@ -1549,16 +1485,6 @@ } } }, - "node_modules/vite-plugin-handlebars": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/vite-plugin-handlebars/-/vite-plugin-handlebars-1.5.0.tgz", - "integrity": "sha512-qoCfcye7WEgurMVN63IHATkKTzVUndZjG5zMEYYUYYeRHU5OkcDqfmTLmtq9gdsduDIf7bT9Gu+dmI7iO7tGog==", - "dev": true, - "license": "MIT", - "dependencies": { - "handlebars": "^4.7.6" - } - }, "node_modules/vite-plugin-html-inject": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vite-plugin-html-inject/-/vite-plugin-html-inject-1.1.2.tgz", @@ -1591,13 +1517,6 @@ "funding": { "url": "https://github.com/sponsors/jonschlinkert" } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "license": "MIT" } }, "dependencies": { @@ -2136,19 +2055,6 @@ "dev": true, "optional": true }, - "handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, "html2canvas": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", @@ -2199,24 +2105,12 @@ "picomatch": "^2.3.1" } }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, "nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, "node-addon-api": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", @@ -2296,12 +2190,6 @@ "source-map-js": ">=0.6.2 <2.0.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -2351,13 +2239,6 @@ "is-number": "^7.0.0" } }, - "uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "optional": true - }, "utrie": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", @@ -2396,26 +2277,11 @@ } } }, - "vite-plugin-handlebars": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/vite-plugin-handlebars/-/vite-plugin-handlebars-1.5.0.tgz", - "integrity": "sha512-qoCfcye7WEgurMVN63IHATkKTzVUndZjG5zMEYYUYYeRHU5OkcDqfmTLmtq9gdsduDIf7bT9Gu+dmI7iO7tGog==", - "dev": true, - "requires": { - "handlebars": "^4.7.6" - } - }, "vite-plugin-html-inject": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vite-plugin-html-inject/-/vite-plugin-html-inject-1.1.2.tgz", "integrity": "sha512-4DWANEcAw73H5JLWTAI4EvXdSyoGqGq/Is9fTRjpF+SJLor58LNdqB+YYnK3FOLwx6LMTAn4z1hkiRyc52lYLg==", "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true } } } diff --git a/package.json b/package.json index 22d156a..57acc47 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ "devDependencies": { "sass": "^1.89.2", "vite": "^7.0.3", - "vite-plugin-handlebars": "^1.5.0", "vite-plugin-html-inject": "^1.1.2" }, "dependencies": { diff --git a/partials/toolbox/result.html b/partials/toolbox/result.html index 27e5e21..e49224f 100644 --- a/partials/toolbox/result.html +++ b/partials/toolbox/result.html @@ -1,4 +1,11 @@
+
+
+
Hey! I am ...
+
Fullstack developer
+
+
+
@@ -16,11 +23,4 @@
-
-
-
Hey! I am ...
-
Fullstack developer
-
-
-
\ No newline at end of file diff --git a/styles/toolbox-main.scss b/styles/toolbox-main.scss index b73426c..10d8b4b 100644 --- a/styles/toolbox-main.scss +++ b/styles/toolbox-main.scss @@ -1,7 +1,7 @@ .toolbox-container { .result-box { // height: 300px; - padding: 1rem 2rem 2rem 2rem; + padding: 2rem 2rem 0.5rem 2rem; background: var(--github-dark-mode-color); transition: 0.5s ease; user-select: none; @@ -67,7 +67,7 @@ gap: 35px; justify-content: space-between; // flex-wrap: wrap; - padding: 5px 0; + padding: 0.5rem 0 0 0; >div:first-child { display: flex; @@ -233,7 +233,7 @@ } .result-box { - padding: 1rem 1rem 1.5rem 1rem; + padding: 1rem 1rem 0.5rem 1rem; #github-header-image { height: 250px; diff --git a/vite.config.js b/vite.config.js index bd426b6..0e1719c 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,7 +1,5 @@ import { defineConfig } from 'vite'; import injectHTML from 'vite-plugin-html-inject'; -import handlebars from 'vite-plugin-handlebars'; -import { resolve } from 'path'; export default defineConfig({ build: { From 9b3137c74c0858ad014d1fdd6c67ce2acf0338e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lev=C3=AD=20Arista?= Date: Thu, 31 Jul 2025 11:31:15 -0500 Subject: [PATCH 4/8] Test html2canvas alternatives --- js/main.js | 149 ++++++++++++++++++++++++++++---- js/utils/fonts.js | 111 +++++++++++++++++++----- package-lock.json | 36 ++++++++ package.json | 3 + partials/scripts.html | 3 +- partials/toolbox/result.html | 5 +- public/images/icons/loading.gif | Bin 0 -> 771 bytes 7 files changed, 267 insertions(+), 40 deletions(-) create mode 100644 public/images/icons/loading.gif diff --git a/js/main.js b/js/main.js index 7608915..84a426b 100644 --- a/js/main.js +++ b/js/main.js @@ -1,5 +1,8 @@ import { setFontValues } from './utils/fonts'; import { getRandomTheme } from './utils/themes'; +import * as htmlToImage from 'html-to-image'; +import { toPng, toJpeg, toBlob, toPixelData, toSvg } from 'html-to-image'; +import domtoimage from 'dom-to-image'; /* ************** Elements ************** */ @@ -27,27 +30,137 @@ document.querySelector('.how-to-section video.demo').onended = (e) => e.target.c /* ************** Header image buttons ************** */ // Download button +// document.querySelector('.download-button') +// .addEventListener('click', () => { +// html2canvas( +// document.querySelector('#github-header-image'), +// { +// // removeContainer: true, +// // backgroundColor: null, +// letterRendering: true, +// // logging: true, +// // useCORS: true, +// foreignObjectRendering: false, +// // onclone: (document, element) => { +// // // const title = element.querySelector('.title').style.letterSpacing = '0.10rem'; +// // const title = element.querySelector('.title') +// // if (getComputedStyle(title).getPropertyValue("font-family") === 'Ubuntu') { +// // title.style.letterSpacing = '1px'; +// // } +// // if (getComputedStyle(title).getPropertyValue("font-family") === 'Martel') { +// // title.style.letterSpacing = '2px'; +// // } +// // if (getComputedStyle(title).getPropertyValue("font-family") === 'MavenPro') { +// // title.style.letterSpacing = '0.2rem'; +// // } +// // // title.style.letterSpacing = '2px'; +// // // console.log("🚀 ~ title:", title) +// // // const title = element.querySelector('.subtitle').style.style.letterSpacing = '5px'; +// // } +// // widtH: (headerImage.clientWidth * 2), +// // height: (headerImage.style.height * 2) +// }) +// .then(function (canvas) { +// // for testing +// const container = document.querySelector('.header-image-container') + +// const prevImage = container.children[1]; +// if (prevImage) container.removeChild(prevImage); + +// container.appendChild(canvas); + +// // let imageURL = canvas.toDataURL("image/png"); +// // let a = document.createElement("a"); +// // a.href = imageURL; +// // a.download = 'github-header-image'; +// // a.click(); +// }); +// }) + +// document.querySelector('.download-button') +// .addEventListener('click', () => { +// htmlToImage +// .toPng(document.querySelector('#github-header-image')) +// .then((dataUrl) => { +// const img = new Image(); +// img.src = dataUrl; +// img.width = 900 +// document.querySelector('.header-image-container').appendChild(img); +// }) +// .catch((err) => { +// console.error('oops, something went wrong!', err); +// }); +// }) + document.querySelector('.download-button') - .addEventListener('click', () => { - html2canvas( - document.querySelector('#github-header-image'), - { - backgroundColor: null - // widtH: (headerImage.clientWidth * 2), - // height: (headerImage.style.height * 2) - }) - .then(function (canvas) { - // for testing - // document.body.before(canvas); - - let imageURL = canvas.toDataURL("image/png"); - let a = document.createElement("a"); - a.href = imageURL; - a.download = 'github-header-image'; - a.click(); - }); + .addEventListener('click', async () => { + document.querySelector('.download-button img').src = './images/icons/loading.gif' + + try { + const el = document.querySelector('#github-header-image'); + + if (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1') { + console.log('Running on localhost! Appending image instead of downloading ...'); + const png = await snapdom.toPng(el, { embedFonts: true }); + const container = document.querySelector('.header-image-container') + + const prevImage = container.children[1]; + if (prevImage) container.removeChild(prevImage); + + container.appendChild(png); + } else { + await snapdom.download(el, { + embedFonts: true, + format: 'png', + filename: 'github-header-banner', + scale: 2 + }); + } + document.querySelector('.download-button img').src = './images/icons/download.svg' + } catch (error) { + console.error('Image capture or download failed:', error); + } }) +// document.addEventListener("DOMContentLoaded", (event) => { +// const displayButton = document.querySelector('.display-button'); + +// if (displayButton && (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1')) { +// displayButton.style.display = "block"; // or "flex", "grid", etc. +// console.log('Running on localhost! display appending image option ...'); + +// document.querySelector('.display-button') +// .addEventListener('click', async () => { +// const el = document.querySelector('#github-header-image'); +// const png = await snapdom.toPng(el, { embedFonts: true }); +// const container = document.querySelector('.header-image-container') + +// const prevImage = container.children[1]; +// if (prevImage) container.removeChild(prevImage); + +// container.appendChild(png); +// }) +// } + +// }); + + +// document.querySelector('.download-button') +// .addEventListener('click', () => { +// var node = document.getElementById('github-header-image'); + +// domtoimage.toPng(node) +// .then(function (dataUrl) { +// console.log("🚀 ~ dataUrl:", dataUrl) +// var img = new Image(); +// img.src = dataUrl; +// document.querySelector('.header-image-container').appendChild(img); +// }) +// .catch(function (error) { +// console.error('oops, something went wrong!', error); +// }); +// }) + // Toogle Dark Mode button document.querySelector('.dark-mode-button') .addEventListener('click', (e) => { diff --git a/js/utils/fonts.js b/js/utils/fonts.js index 3890c62..17db68e 100644 --- a/js/utils/fonts.js +++ b/js/utils/fonts.js @@ -33,19 +33,27 @@ function setFontValues() { let subtitleFontSelect = toolbox.querySelector('.font-selectors-container #subtitle-font-selector'); document.fonts.ready.then(() => { + const titleFontName = titleFontSelect.value; + const titleFontUrl = './fonts/' + getFontUrl(titleFontSelect.value); let titleFont = getFont(titleFontSelect.value) titleFont.load().then(function (loadedFont) { document.fonts.add(loadedFont) - console.log('Font loaded an added'); + // injectFontFaceRule(titleFontName, titleFontUrl); + + console.log('Font loaded and added'); title.style.fontFamily = `"${titleFontSelect.value}"`; }).catch(function (error) { console.log('Failed to load font: ' + error) }) - let subTitlefont = getFont(subtitleFontSelect.value) - subTitlefont.load().then(function (loadedFont) { + const subTitleFontName = subtitleFontSelect.value; + const subTitleFontUrl = './fonts/' + getFontUrl(subtitleFontSelect.value); + let subTitleFont = getFont(subtitleFontSelect.value) + subTitleFont.load().then(function (loadedFont) { document.fonts.add(loadedFont) - console.log('Font loaded an added'); + // injectFontFaceRule(subTitleFontName, subTitleFontUrl); + + console.log('Font loaded and added'); subtitle.style.fontFamily = `"${subtitleFontSelect.value}"`; }).catch(function (error) { console.log('Failed to load font: ' + error) @@ -53,39 +61,102 @@ function setFontValues() { }); } -function getFont(fontName) { +function injectFontFaceRule(fontName, fontUrl) { + const style = document.createElement('style'); + style.textContent = ` + @font-face { + font-family: '${fontName}'; + src: url('${fontUrl}'); + } + `; + document.head.appendChild(style); +} + +function getFontUrl(fontName) { switch (fontName) { case 'Kalam': - return new FontFace('Kalam', 'url("./fonts/Kalam-Regular.ttf")'); + return 'Kalam-Regular.ttf")'; case 'Poppins': - return new FontFace('Poppins', 'url("./fonts/Poppins-Regular.ttf")'); + return 'Poppins-Regular.ttf'; case 'Athiti': - return new FontFace('Athiti', 'url("./fonts/Athiti-Regular.ttf")'); + return 'Athiti-Regular.ttf'; case 'MavenPro': - return new FontFace('MavenPro', 'url("./fonts/MavenPro-Regular.ttf")'); + return 'MavenPro-Regular.ttf'; case 'Ubuntu': - return new FontFace('Ubuntu', 'url("./fonts/Ubuntu-Regular.ttf")'); + return 'Ubuntu-Regular.ttf'; case 'IstokWeb': - return new FontFace('IstokWeb', 'url("./fonts/IstokWeb-Regular.ttf")'); + return 'IstokWeb-Regular.ttf'; case 'Courgette': - return new FontFace('Courgette', 'url("./fonts/Courgette-Regular.ttf")'); + return 'Courgette-Regular.ttf'; case 'Quattrocento': - return new FontFace('Quattrocento', 'url("./fonts/Quattrocento-Regular.ttf")'); + return 'Quattrocento-Regular.ttf'; case 'DellaRespira': - return new FontFace('DellaRespira', 'url("./fonts/DellaRespira-Regular.ttf")'); + return 'DellaRespira-Regular.ttf'; case 'Lato': - return new FontFace('Lato', 'url("./fonts/Lato-Regular.ttf")'); + return 'Lato-Regular.ttf'; case 'Martel': - return new FontFace('Martel', 'url("./fonts/Martel-Regular.ttf")'); + return 'Martel-Regular.ttf'; case 'Lancelot': - return new FontFace('Lancelot', 'url("./fonts/Lancelot-Regular.ttf")'); + return 'Lancelot-Regular.ttf'; case 'Playball': - return new FontFace('Playball', 'url("./fonts/Playball-Regular.ttf")'); + return 'Playball-Regular.ttf'; case 'LifeSavers': - return new FontFace('LifeSavers', 'url("./fonts/LifeSavers-Regular.ttf")'); + return 'LifeSavers-Regular.ttf'; default: - return new FontFace('Kalam', 'url("./fonts/Kalam-Regular.ttf")'); + return 'Kalam-Regular.ttf'; + } +} + +function getFont(fontName) { + let newFont = null; + if (fontName === 'Kalam') { + newFont = new FontFace('Kalam', 'url("./fonts/Kalam-Regular.ttf")'); + newFont._snapdomSrc = "./fonts/Kalam-Regular.ttf"; + } else if (fontName === 'Poppins') { + newFont = new FontFace('Poppins', 'url("./fonts/Poppins-Regular.ttf")'); + newFont._snapdomSrc = "./fonts/Poppins-Regular.ttf"; + } else if (fontName === 'Athiti') { + newFont = new FontFace('Athiti', 'url("./fonts/Athiti-Regular.ttf")'); + newFont._snapdomSrc = "./fonts/Athiti-Regular.ttf"; + } else if (fontName === 'MavenPro') { + newFont = new FontFace('MavenPro', 'url("./fonts/MavenPro-Regular.ttf")'); + newFont._snapdomSrc = "./fonts/MavenPro-Regular.ttf"; + } else if (fontName === 'Ubuntu') { + newFont = new FontFace('Ubuntu', 'url("./fonts/Ubuntu-Regular.ttf")'); + newFont._snapdomSrc = "./fonts/Ubuntu-Regular.ttf"; + } else if (fontName === 'IstokWeb') { + newFont = new FontFace('IstokWeb', 'url("./fonts/IstokWeb-Regular.ttf")'); + newFont._snapdomSrc = "./fonts/IstokWeb-Regular.ttf"; + } else if (fontName === 'Courgette') { + newFont = new FontFace('Courgette', 'url("./fonts/Courgette-Regular.ttf")'); + newFont._snapdomSrc = "./fonts/Courgette-Regular.ttf"; + } else if (fontName === 'Quattrocento') { + newFont = new FontFace('Quattrocento', 'url("./fonts/Quattrocento-Regular.ttf")'); + newFont._snapdomSrc = "./fonts/Quattrocento-Regular.ttf"; + } else if (fontName === 'DellaRespira') { + newFont = new FontFace('DellaRespira', 'url("./fonts/DellaRespira-Regular.ttf")'); + newFont._snapdomSrc = "./fonts/DellaRespira-Regular.ttf"; + } else if (fontName === 'Lato') { + newFont = new FontFace('Lato', 'url("./fonts/Lato-Regular.ttf")'); + newFont._snapdomSrc = "./fonts/Lato-Regular.ttf"; + } else if (fontName === 'Martel') { + newFont = new FontFace('Martel', 'url("./fonts/Martel-Regular.ttf")'); + newFont._snapdomSrc = "./fonts/Martel-Regular.ttf"; + } else if (fontName === 'Lancelot') { + newFont = new FontFace('Lancelot', 'url("./fonts/Lancelot-Regular.ttf")'); + newFont._snapdomSrc = "./fonts/Lancelot-Regular.ttf"; + } else if (fontName === 'Playball') { + newFont = new FontFace('Playball', 'url("./fonts/Playball-Regular.ttf")'); + newFont._snapdomSrc = "./fonts/Playball-Regular.ttf"; + } else if (fontName === 'LifeSavers') { + newFont = new FontFace('LifeSavers', 'url("./fonts/LifeSavers-Regular.ttf")'); + newFont._snapdomSrc = "./fonts/LifeSavers-Regular.ttf"; + } else { + // default case + newFont = new FontFace('Kalam', 'url("./fonts/Kalam-Regular.ttf")'); + newFont._snapdomSrc = "./fonts/Kalam-Regular.ttf"; } + return newFont; } export { setFontValues }; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 29f1f97..78b1b33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,9 @@ "version": "2.0.0", "license": "MIT", "dependencies": { + "@zumer/snapdom": "^1.9.7", + "dom-to-image": "^2.6.0", + "html-to-image": "^1.11.13", "html2canvas": "^1.4.1" }, "devDependencies": { @@ -995,6 +998,12 @@ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true }, + "node_modules/@zumer/snapdom": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@zumer/snapdom/-/snapdom-1.9.7.tgz", + "integrity": "sha512-tZvEq0e0NYn1gEyPCPZPOVQ5ihSFEGi2ppvpzi0dRL9vruPh8JrpPkcoG4IdqJHnF4y68wU0GZvlsQqEoeMCsg==", + "license": "MIT" + }, "node_modules/base64-arraybuffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", @@ -1052,6 +1061,12 @@ "node": ">=0.10" } }, + "node_modules/dom-to-image": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/dom-to-image/-/dom-to-image-2.6.0.tgz", + "integrity": "sha512-Dt0QdaHmLpjURjU7Tnu3AgYSF2LuOmksSGsUcE6ItvJoCWTBEmiMXcqBdNSAm9+QbbwD7JMoVsuuKX6ZVQv1qA==", + "license": "MIT" + }, "node_modules/esbuild": { "version": "0.25.6", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz", @@ -1120,6 +1135,12 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/html-to-image": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.11.13.tgz", + "integrity": "sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==", + "license": "MIT" + }, "node_modules/html2canvas": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", @@ -1965,6 +1986,11 @@ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true }, + "@zumer/snapdom": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@zumer/snapdom/-/snapdom-1.9.7.tgz", + "integrity": "sha512-tZvEq0e0NYn1gEyPCPZPOVQ5ihSFEGi2ppvpzi0dRL9vruPh8JrpPkcoG4IdqJHnF4y68wU0GZvlsQqEoeMCsg==" + }, "base64-arraybuffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", @@ -2004,6 +2030,11 @@ "dev": true, "optional": true }, + "dom-to-image": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/dom-to-image/-/dom-to-image-2.6.0.tgz", + "integrity": "sha512-Dt0QdaHmLpjURjU7Tnu3AgYSF2LuOmksSGsUcE6ItvJoCWTBEmiMXcqBdNSAm9+QbbwD7JMoVsuuKX6ZVQv1qA==" + }, "esbuild": { "version": "0.25.6", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz", @@ -2055,6 +2086,11 @@ "dev": true, "optional": true }, + "html-to-image": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.11.13.tgz", + "integrity": "sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==" + }, "html2canvas": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", diff --git a/package.json b/package.json index 57acc47..c48694c 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,9 @@ "vite-plugin-html-inject": "^1.1.2" }, "dependencies": { + "@zumer/snapdom": "^1.9.7", + "dom-to-image": "^2.6.0", + "html-to-image": "^1.11.13", "html2canvas": "^1.4.1" } } diff --git a/partials/scripts.html b/partials/scripts.html index 9b6ce74..a964bda 100644 --- a/partials/scripts.html +++ b/partials/scripts.html @@ -5,4 +5,5 @@ - \ No newline at end of file + + \ No newline at end of file diff --git a/partials/toolbox/result.html b/partials/toolbox/result.html index e49224f..8d218d0 100644 --- a/partials/toolbox/result.html +++ b/partials/toolbox/result.html @@ -1,5 +1,5 @@
-
+
Hey! I am ...
Fullstack developer
@@ -17,6 +17,9 @@ Random
+
Download diff --git a/public/images/icons/loading.gif b/public/images/icons/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..e846e1d6c58796558015ffee1fdec546bc207ee8 GIT binary patch literal 771 zcmZ?wbhEHb6krfw*v!MQYQ=(yeQk4RPu{+D?cCXuwr^cCp}%d_ius2R?!0jBXnAQ) zOH<|l|Nj|aK=D7fpKD04vtxj(k)8oFBT!uNCkrbB0}q1^NDatX1{VJbCr|b)oWWMT zS%hVC ~NwO_yO%;SvZ5MdNYf|QNy-I*%yJaj+uTdt+qbZ z4E`Fzb8m}I&!N8OKmWEcCmrLs^Hs&3i)mt@hQVdcqghkaBs*D}tG_lKew4?rTjzIZ z9tSone1TS+TR7tu^CunG)Y7Jg#sw#)sG9C!c0I%LEzP)9;hqRf&)s$D8d5Db{TBs% zgl0~5QQ91luq4Q9tJgt4QLbaxZvAaKeCM9!oy85dg4k>TdBSVqjHub_PG=PO&J-rx z7oYTuF+kH|tG-UK+EkUhDjYx?zW?T|lx>+aOQm zzL$v$zBLo4Cj=G&tw{H}dW?tlTkS)SY4<#NS92z*EY-MMB6Ftp`R=*=*Ev7cS+X%W zMCur^FdlokL}1Y+&aasU2J4#EOuNlnb9CmqgLCGTSY!1BD42pkHY^XidQ5=>YQx%` z*%Pm9D!CkBu&tMWm(%-ejACVWGS2RX5=QOJ$1*tr7F}F+*-OA+Ly&Isg|AEuUYicA z#%IG6kPXkHt{zk2M6zK@Vu^4Q(1zE$?yY6M!^&jQ+2^E?!p7{g*|X6}vuRC3p@jk0 W117c83?+LXEZI4G$p&LV25SKE>nb+@ literal 0 HcmV?d00001 From e70c712bd1e6ef82dfd2945ffa4e8942b8307f4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lev=C3=AD=20Arista?= Date: Thu, 31 Jul 2025 11:31:35 -0500 Subject: [PATCH 5/8] Test fonts --- index.html | 6 +- partials/head.html | 10 +- partials/toolbox/test-fonts.html | 32 ++++++ styles/index.scss | 1 + styles/tabs.scss | 2 +- styles/toolbox-main.scss | 13 ++- styles/toolbox-test-fonts.scss | 189 +++++++++++++++++++++++++++++++ 7 files changed, 242 insertions(+), 11 deletions(-) create mode 100644 partials/toolbox/test-fonts.html create mode 100644 styles/toolbox-test-fonts.scss diff --git a/index.html b/index.html index af80595..9b76152 100644 --- a/index.html +++ b/index.html @@ -14,17 +14,19 @@
- + +
- + +
diff --git a/partials/head.html b/partials/head.html index c1da317..bb13640 100644 --- a/partials/head.html +++ b/partials/head.html @@ -37,11 +37,15 @@ + rel="preload" as="style" crossorigin="anonymous"> + + + - - diff --git a/partials/toolbox/test-fonts.html b/partials/toolbox/test-fonts.html new file mode 100644 index 0000000..2f5156e --- /dev/null +++ b/partials/toolbox/test-fonts.html @@ -0,0 +1,32 @@ + +
+
Hey! I'm Facundo MartĂ­nez nadzyak/hackme - red-hat-display
+ + + + +
Hey! I'm Facundo MartĂ­nez nadzyak/hackme - ubuntu
+ + +
Hey! I'm Facundo MartĂ­nez nadzyak/hackme - poppins
+
Hey! I'm Facundo MartĂ­nez nadzyak/hackme - anonymous-pro
+
Hey! I'm Facundo MartĂ­nez nadzyak/hackme - source-code-pro
+ + + +
Hey! I'm Facundo MartĂ­nez nadzyak/hackme - quattrocento
+
Hey! I'm Facundo MartĂ­nez nadzyak/hackme - della-respira
+
Hey! I'm Facundo MartĂ­nez nadzyak/hackme - lancelot
+
Hey! I'm Facundo MartĂ­nez nadzyak/hackme - life-savers
+
Hey! I'm Facundo MartĂ­nez nadzyak/hackme - athiti
+
Hey! I'm Facundo MartĂ­nez nadzyak/hackme - electrolize
+
Hey! I'm Facundo MartĂ­nez nadzyak/hackme - passero-one
+
Hey! I'm Facundo MartĂ­nez nadzyak/hackme - pixelify-sans
+
Hey! I'm Facundo MartĂ­nez nadzyak/hackme - kalam
+
Hey! I'm Facundo MartĂ­nez nadzyak/hackme - playball
+ + +
\ No newline at end of file diff --git a/styles/index.scss b/styles/index.scss index bf27275..de1f1bf 100644 --- a/styles/index.scss +++ b/styles/index.scss @@ -6,5 +6,6 @@ @use "toolbox-main"; @use "toolbox-background"; @use "toolbox-decorations"; +@use "toolbox-test-fonts"; @use "tabs"; @use "modals"; \ No newline at end of file diff --git a/styles/tabs.scss b/styles/tabs.scss index 0b30e89..379cf05 100644 --- a/styles/tabs.scss +++ b/styles/tabs.scss @@ -14,7 +14,7 @@ background: #6E5494; border-radius: 0 0 10px 10px; box-shadow: 0px 0px 5px 2px rgba(255, 255, 255, 0.25); - overflow: hidden; + // overflow: hidden; z-index: 10; user-select: none; } diff --git a/styles/toolbox-main.scss b/styles/toolbox-main.scss index 10d8b4b..2315cca 100644 --- a/styles/toolbox-main.scss +++ b/styles/toolbox-main.scss @@ -5,6 +5,8 @@ background: var(--github-dark-mode-color); transition: 0.5s ease; user-select: none; + position: relative; + z-index: 10; &.light-mode { background: var(--github-light-mode-color); @@ -32,7 +34,7 @@ #github-header-image { width: 100%; - height: 250px; + height: 200px; padding: 25px; position: relative; display: flex; @@ -67,7 +69,7 @@ gap: 35px; justify-content: space-between; // flex-wrap: wrap; - padding: 0.5rem 0 0 0; + padding: 1rem 0 0.5rem 0; >div:first-child { display: flex; @@ -108,7 +110,8 @@ } } - .download-button { + .download-button, + .display-button { background-color: #2D8655 !important; // border: 1px solid #ffffff; border-radius: var(--button-border-radius); @@ -118,9 +121,9 @@ } .toolbox-tools { - height: calc(100vh - 250px - 3rem - 35px - 1rem); + height: calc(100vh - 200px - 3rem - 35px - 1rem); overflow: auto; - padding: 0.5rem 1rem 2rem 1rem; + padding: 1rem 1rem 5rem 1rem; } .toolbox { diff --git a/styles/toolbox-test-fonts.scss b/styles/toolbox-test-fonts.scss new file mode 100644 index 0000000..432d0db --- /dev/null +++ b/styles/toolbox-test-fonts.scss @@ -0,0 +1,189 @@ +.tablinks[data-name="test-fonts-section"] { + position: fixed; + right: 0; + transform: translateX(100%); + z-index: 100 +} + +#test-fonts-section { + font-size: 20px; + padding: 50px 0 100px 50px; + background-color: #222; + color: white; +} + +.red-hat-display { + font-family: "Red Hat Display", sans-serif; + font-optical-sizing: auto; + font-weight: 400; + font-style: normal; +} + +.kalam { + font-family: "Kalam", cursive; + font-weight: 400; + font-style: normal; +} + +.poppins { + font-family: "Poppins", sans-serif; + font-weight: 400; + font-style: normal; +} + + +.maven-pro { + font-family: "Maven Pro", sans-serif; + font-optical-sizing: auto; + font-weight: 400; + font-style: normal; +} + +.athiti { + font-family: "Athiti", sans-serif; + font-weight: 400; + font-style: normal; +} + +.ubuntu-sans { + font-family: "Ubuntu Sans", sans-serif; + font-optical-sizing: auto; + font-weight: 400; + font-style: normal; + font-variation-settings: + "wdth" 100; +} + +.ubuntu { + font-family: "Ubuntu", sans-serif; + font-weight: 400; + font-style: normal; +} + +.istok-web { + font-family: "Istok Web", sans-serif; + font-weight: 400; + font-style: normal; +} + + +.courgette { + font-family: "Courgette", cursive; + font-weight: 400; + font-style: normal; +} + +.quattrocento { + font-family: "Quattrocento", serif; + font-weight: 400; + font-style: normal; +} + +.della-respira { + font-family: "Della Respira", serif; + font-weight: 400; + font-style: normal; +} + +.lato { + font-family: "Lato", sans-serif; + font-weight: 400; + font-style: normal; +} + +.martel { + font-family: "Martel", serif; + font-weight: 400; + font-style: normal; +} + +.lancelot { + font-family: "Lancelot", serif; + font-weight: 400; + font-style: normal; +} + +.playball { + font-family: "Playball", cursive; + font-weight: 400; + font-style: normal; +} + + +.life-savers { + font-family: "Life Savers", serif; + font-weight: 400; + font-style: normal; +} + +.anonymous-pro { + font-family: "Anonymous Pro", monospace; + font-weight: 400; + font-style: normal; +} + +.inconsolata { + font-family: "Inconsolata", monospace; + font-optical-sizing: auto; + font-weight: 400; + font-style: normal; + font-variation-settings: + "wdth" 100; +} + +.fira-code { + font-family: "Fira Code", monospace; + font-optical-sizing: auto; + font-weight: 400; + font-style: normal; +} + +.open-sans { + font-family: "Open Sans", sans-serif; + font-optical-sizing: auto; + font-weight: 400; + font-style: normal; + font-variation-settings: + "wdth" 100; +} + +.playwrite-hu { + font-family: "Playwrite HU", cursive; + font-optical-sizing: auto; + font-weight: 400; + font-style: normal; +} + + +.dancing-script { + font-family: "Dancing Script", cursive; + font-optical-sizing: auto; + font-weight: 400; + font-style: normal; +} + +.passero-one { + font-family: "Passero One", sans-serif; + font-weight: 400; + font-style: normal; +} + +.pixelify-sans { + font-family: "Pixelify Sans", sans-serif; + font-optical-sizing: auto; + font-weight: 400; + font-style: normal; +} + +.electrolize { + font-family: "Electrolize", sans-serif; + font-weight: 400; + font-style: normal; +} + +.source-code-pro { + font-family: "Source Code Pro", monospace; + font-optical-sizing: auto; + font-weight: 400; + font-style: normal; +} \ No newline at end of file From bc2277931900f2b1dc27fa08d4ac5e903637f150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lev=C3=AD=20Arista?= Date: Thu, 31 Jul 2025 11:40:33 -0500 Subject: [PATCH 6/8] Fix in fonts url --- partials/head.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/partials/head.html b/partials/head.html index bb13640..1946a26 100644 --- a/partials/head.html +++ b/partials/head.html @@ -44,7 +44,7 @@ crossorigin="anonymous"> From 5b945558e243b508665336d196b7994aaa182a3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lev=C3=AD=20Arista?= Date: Thu, 31 Jul 2025 14:11:52 -0500 Subject: [PATCH 7/8] Using snapdom --- index.html | 2 +- js/main.js | 144 +++++++------------------------ js/utils/fonts.js | 125 +-------------------------- package-lock.json | 109 +---------------------- package.json | 5 +- partials/toolbox/main.html | 22 ++--- partials/toolbox/result.html | 3 +- partials/toolbox/test-fonts.html | 52 +++++------ styles/main.scss | 2 +- styles/toolbox-main.scss | 2 +- 10 files changed, 75 insertions(+), 391 deletions(-) diff --git a/index.html b/index.html index 9b76152..d1e582d 100644 --- a/index.html +++ b/index.html @@ -18,7 +18,7 @@ - +
diff --git a/js/main.js b/js/main.js index 84a426b..fa26fc2 100644 --- a/js/main.js +++ b/js/main.js @@ -1,8 +1,6 @@ import { setFontValues } from './utils/fonts'; import { getRandomTheme } from './utils/themes'; -import * as htmlToImage from 'html-to-image'; -import { toPng, toJpeg, toBlob, toPixelData, toSvg } from 'html-to-image'; -import domtoimage from 'dom-to-image'; +import { snapdom } from '@zumer/snapdom'; /* ************** Elements ************** */ @@ -30,136 +28,52 @@ document.querySelector('.how-to-section video.demo').onended = (e) => e.target.c /* ************** Header image buttons ************** */ // Download button -// document.querySelector('.download-button') -// .addEventListener('click', () => { -// html2canvas( -// document.querySelector('#github-header-image'), -// { -// // removeContainer: true, -// // backgroundColor: null, -// letterRendering: true, -// // logging: true, -// // useCORS: true, -// foreignObjectRendering: false, -// // onclone: (document, element) => { -// // // const title = element.querySelector('.title').style.letterSpacing = '0.10rem'; -// // const title = element.querySelector('.title') -// // if (getComputedStyle(title).getPropertyValue("font-family") === 'Ubuntu') { -// // title.style.letterSpacing = '1px'; -// // } -// // if (getComputedStyle(title).getPropertyValue("font-family") === 'Martel') { -// // title.style.letterSpacing = '2px'; -// // } -// // if (getComputedStyle(title).getPropertyValue("font-family") === 'MavenPro') { -// // title.style.letterSpacing = '0.2rem'; -// // } -// // // title.style.letterSpacing = '2px'; -// // // console.log("🚀 ~ title:", title) -// // // const title = element.querySelector('.subtitle').style.style.letterSpacing = '5px'; -// // } -// // widtH: (headerImage.clientWidth * 2), -// // height: (headerImage.style.height * 2) -// }) -// .then(function (canvas) { -// // for testing -// const container = document.querySelector('.header-image-container') - -// const prevImage = container.children[1]; -// if (prevImage) container.removeChild(prevImage); - -// container.appendChild(canvas); - -// // let imageURL = canvas.toDataURL("image/png"); -// // let a = document.createElement("a"); -// // a.href = imageURL; -// // a.download = 'github-header-image'; -// // a.click(); -// }); -// }) - -// document.querySelector('.download-button') -// .addEventListener('click', () => { -// htmlToImage -// .toPng(document.querySelector('#github-header-image')) -// .then((dataUrl) => { -// const img = new Image(); -// img.src = dataUrl; -// img.width = 900 -// document.querySelector('.header-image-container').appendChild(img); -// }) -// .catch((err) => { -// console.error('oops, something went wrong!', err); -// }); -// }) - document.querySelector('.download-button') .addEventListener('click', async () => { document.querySelector('.download-button img').src = './images/icons/loading.gif' try { const el = document.querySelector('#github-header-image'); - - if (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1') { - console.log('Running on localhost! Appending image instead of downloading ...'); - const png = await snapdom.toPng(el, { embedFonts: true }); - const container = document.querySelector('.header-image-container') - - const prevImage = container.children[1]; - if (prevImage) container.removeChild(prevImage); - - container.appendChild(png); - } else { - await snapdom.download(el, { - embedFonts: true, - format: 'png', - filename: 'github-header-banner', - scale: 2 - }); - } + await snapdom.download(el, { + embedFonts: true, + format: 'png', + filename: 'github-header-banner', + scale: 2 + }); document.querySelector('.download-button img').src = './images/icons/download.svg' } catch (error) { console.error('Image capture or download failed:', error); } }) -// document.addEventListener("DOMContentLoaded", (event) => { -// const displayButton = document.querySelector('.display-button'); - -// if (displayButton && (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1')) { -// displayButton.style.display = "block"; // or "flex", "grid", etc. -// console.log('Running on localhost! display appending image option ...'); +document.addEventListener("DOMContentLoaded", (event) => { + const displayButton = document.querySelector('.display-button'); + const testFontsTab = document.querySelector('.tablinks[data-name="test-fonts-section"]'); -// document.querySelector('.display-button') -// .addEventListener('click', async () => { -// const el = document.querySelector('#github-header-image'); -// const png = await snapdom.toPng(el, { embedFonts: true }); -// const container = document.querySelector('.header-image-container') + if (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1') { + if (displayButton) { -// const prevImage = container.children[1]; -// if (prevImage) container.removeChild(prevImage); + displayButton.style.display = "block"; // or "flex", "grid", etc. + console.log('Running on localhost! display appending image option ...'); -// container.appendChild(png); -// }) -// } + document.querySelector('.display-button') + .addEventListener('click', async () => { + const el = document.querySelector('#github-header-image'); + const png = await snapdom.toPng(el, { embedFonts: true }); + const container = document.querySelector('.header-image-container') -// }); + const prevImage = container.children[1]; + if (prevImage) container.removeChild(prevImage); + container.appendChild(png); + }) + } + if (testFontsTab) { + testFontsTab.style.display = "block" + } + } -// document.querySelector('.download-button') -// .addEventListener('click', () => { -// var node = document.getElementById('github-header-image'); - -// domtoimage.toPng(node) -// .then(function (dataUrl) { -// console.log("🚀 ~ dataUrl:", dataUrl) -// var img = new Image(); -// img.src = dataUrl; -// document.querySelector('.header-image-container').appendChild(img); -// }) -// .catch(function (error) { -// console.error('oops, something went wrong!', error); -// }); -// }) +}); // Toogle Dark Mode button document.querySelector('.dark-mode-button') diff --git a/js/utils/fonts.js b/js/utils/fonts.js index 17db68e..46885d3 100644 --- a/js/utils/fonts.js +++ b/js/utils/fonts.js @@ -33,130 +33,9 @@ function setFontValues() { let subtitleFontSelect = toolbox.querySelector('.font-selectors-container #subtitle-font-selector'); document.fonts.ready.then(() => { - const titleFontName = titleFontSelect.value; - const titleFontUrl = './fonts/' + getFontUrl(titleFontSelect.value); - let titleFont = getFont(titleFontSelect.value) - titleFont.load().then(function (loadedFont) { - document.fonts.add(loadedFont) - // injectFontFaceRule(titleFontName, titleFontUrl); - - console.log('Font loaded and added'); - title.style.fontFamily = `"${titleFontSelect.value}"`; - }).catch(function (error) { - console.log('Failed to load font: ' + error) - }) - - const subTitleFontName = subtitleFontSelect.value; - const subTitleFontUrl = './fonts/' + getFontUrl(subtitleFontSelect.value); - let subTitleFont = getFont(subtitleFontSelect.value) - subTitleFont.load().then(function (loadedFont) { - document.fonts.add(loadedFont) - // injectFontFaceRule(subTitleFontName, subTitleFontUrl); - - console.log('Font loaded and added'); - subtitle.style.fontFamily = `"${subtitleFontSelect.value}"`; - }).catch(function (error) { - console.log('Failed to load font: ' + error) - }) + title.style.fontFamily = `"${titleFontSelect.value}"`; + subtitle.style.fontFamily = `"${subtitleFontSelect.value}"`; }); } -function injectFontFaceRule(fontName, fontUrl) { - const style = document.createElement('style'); - style.textContent = ` - @font-face { - font-family: '${fontName}'; - src: url('${fontUrl}'); - } - `; - document.head.appendChild(style); -} - -function getFontUrl(fontName) { - switch (fontName) { - case 'Kalam': - return 'Kalam-Regular.ttf")'; - case 'Poppins': - return 'Poppins-Regular.ttf'; - case 'Athiti': - return 'Athiti-Regular.ttf'; - case 'MavenPro': - return 'MavenPro-Regular.ttf'; - case 'Ubuntu': - return 'Ubuntu-Regular.ttf'; - case 'IstokWeb': - return 'IstokWeb-Regular.ttf'; - case 'Courgette': - return 'Courgette-Regular.ttf'; - case 'Quattrocento': - return 'Quattrocento-Regular.ttf'; - case 'DellaRespira': - return 'DellaRespira-Regular.ttf'; - case 'Lato': - return 'Lato-Regular.ttf'; - case 'Martel': - return 'Martel-Regular.ttf'; - case 'Lancelot': - return 'Lancelot-Regular.ttf'; - case 'Playball': - return 'Playball-Regular.ttf'; - case 'LifeSavers': - return 'LifeSavers-Regular.ttf'; - default: - return 'Kalam-Regular.ttf'; - } -} - -function getFont(fontName) { - let newFont = null; - if (fontName === 'Kalam') { - newFont = new FontFace('Kalam', 'url("./fonts/Kalam-Regular.ttf")'); - newFont._snapdomSrc = "./fonts/Kalam-Regular.ttf"; - } else if (fontName === 'Poppins') { - newFont = new FontFace('Poppins', 'url("./fonts/Poppins-Regular.ttf")'); - newFont._snapdomSrc = "./fonts/Poppins-Regular.ttf"; - } else if (fontName === 'Athiti') { - newFont = new FontFace('Athiti', 'url("./fonts/Athiti-Regular.ttf")'); - newFont._snapdomSrc = "./fonts/Athiti-Regular.ttf"; - } else if (fontName === 'MavenPro') { - newFont = new FontFace('MavenPro', 'url("./fonts/MavenPro-Regular.ttf")'); - newFont._snapdomSrc = "./fonts/MavenPro-Regular.ttf"; - } else if (fontName === 'Ubuntu') { - newFont = new FontFace('Ubuntu', 'url("./fonts/Ubuntu-Regular.ttf")'); - newFont._snapdomSrc = "./fonts/Ubuntu-Regular.ttf"; - } else if (fontName === 'IstokWeb') { - newFont = new FontFace('IstokWeb', 'url("./fonts/IstokWeb-Regular.ttf")'); - newFont._snapdomSrc = "./fonts/IstokWeb-Regular.ttf"; - } else if (fontName === 'Courgette') { - newFont = new FontFace('Courgette', 'url("./fonts/Courgette-Regular.ttf")'); - newFont._snapdomSrc = "./fonts/Courgette-Regular.ttf"; - } else if (fontName === 'Quattrocento') { - newFont = new FontFace('Quattrocento', 'url("./fonts/Quattrocento-Regular.ttf")'); - newFont._snapdomSrc = "./fonts/Quattrocento-Regular.ttf"; - } else if (fontName === 'DellaRespira') { - newFont = new FontFace('DellaRespira', 'url("./fonts/DellaRespira-Regular.ttf")'); - newFont._snapdomSrc = "./fonts/DellaRespira-Regular.ttf"; - } else if (fontName === 'Lato') { - newFont = new FontFace('Lato', 'url("./fonts/Lato-Regular.ttf")'); - newFont._snapdomSrc = "./fonts/Lato-Regular.ttf"; - } else if (fontName === 'Martel') { - newFont = new FontFace('Martel', 'url("./fonts/Martel-Regular.ttf")'); - newFont._snapdomSrc = "./fonts/Martel-Regular.ttf"; - } else if (fontName === 'Lancelot') { - newFont = new FontFace('Lancelot', 'url("./fonts/Lancelot-Regular.ttf")'); - newFont._snapdomSrc = "./fonts/Lancelot-Regular.ttf"; - } else if (fontName === 'Playball') { - newFont = new FontFace('Playball', 'url("./fonts/Playball-Regular.ttf")'); - newFont._snapdomSrc = "./fonts/Playball-Regular.ttf"; - } else if (fontName === 'LifeSavers') { - newFont = new FontFace('LifeSavers', 'url("./fonts/LifeSavers-Regular.ttf")'); - newFont._snapdomSrc = "./fonts/LifeSavers-Regular.ttf"; - } else { - // default case - newFont = new FontFace('Kalam', 'url("./fonts/Kalam-Regular.ttf")'); - newFont._snapdomSrc = "./fonts/Kalam-Regular.ttf"; - } - return newFont; -} - export { setFontValues }; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 78b1b33..f026cf3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,10 +9,7 @@ "version": "2.0.0", "license": "MIT", "dependencies": { - "@zumer/snapdom": "^1.9.7", - "dom-to-image": "^2.6.0", - "html-to-image": "^1.11.13", - "html2canvas": "^1.4.1" + "@zumer/snapdom": "^1.9.7" }, "devDependencies": { "sass": "^1.89.2", @@ -1004,14 +1001,6 @@ "integrity": "sha512-tZvEq0e0NYn1gEyPCPZPOVQ5ihSFEGi2ppvpzi0dRL9vruPh8JrpPkcoG4IdqJHnF4y68wU0GZvlsQqEoeMCsg==", "license": "MIT" }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -1040,14 +1029,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/css-line-break": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", - "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", - "dependencies": { - "utrie": "^1.0.2" - } - }, "node_modules/detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -1061,12 +1042,6 @@ "node": ">=0.10" } }, - "node_modules/dom-to-image": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/dom-to-image/-/dom-to-image-2.6.0.tgz", - "integrity": "sha512-Dt0QdaHmLpjURjU7Tnu3AgYSF2LuOmksSGsUcE6ItvJoCWTBEmiMXcqBdNSAm9+QbbwD7JMoVsuuKX6ZVQv1qA==", - "license": "MIT" - }, "node_modules/esbuild": { "version": "0.25.6", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz", @@ -1135,24 +1110,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/html-to-image": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.11.13.tgz", - "integrity": "sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==", - "license": "MIT" - }, - "node_modules/html2canvas": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", - "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", - "dependencies": { - "css-line-break": "^2.1.0", - "text-segmentation": "^1.0.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/immutable": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", @@ -1360,14 +1317,6 @@ "node": ">=0.10.0" } }, - "node_modules/text-segmentation": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", - "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", - "dependencies": { - "utrie": "^1.0.2" - } - }, "node_modules/tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", @@ -1423,14 +1372,6 @@ "node": ">=8.0" } }, - "node_modules/utrie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", - "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", - "dependencies": { - "base64-arraybuffer": "^1.0.2" - } - }, "node_modules/vite": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.3.tgz", @@ -1991,11 +1932,6 @@ "resolved": "https://registry.npmjs.org/@zumer/snapdom/-/snapdom-1.9.7.tgz", "integrity": "sha512-tZvEq0e0NYn1gEyPCPZPOVQ5ihSFEGi2ppvpzi0dRL9vruPh8JrpPkcoG4IdqJHnF4y68wU0GZvlsQqEoeMCsg==" }, - "base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==" - }, "braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -2015,14 +1951,6 @@ "readdirp": "^4.0.1" } }, - "css-line-break": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", - "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", - "requires": { - "utrie": "^1.0.2" - } - }, "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -2030,11 +1958,6 @@ "dev": true, "optional": true }, - "dom-to-image": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/dom-to-image/-/dom-to-image-2.6.0.tgz", - "integrity": "sha512-Dt0QdaHmLpjURjU7Tnu3AgYSF2LuOmksSGsUcE6ItvJoCWTBEmiMXcqBdNSAm9+QbbwD7JMoVsuuKX6ZVQv1qA==" - }, "esbuild": { "version": "0.25.6", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz", @@ -2086,20 +2009,6 @@ "dev": true, "optional": true }, - "html-to-image": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.11.13.tgz", - "integrity": "sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==" - }, - "html2canvas": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", - "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", - "requires": { - "css-line-break": "^2.1.0", - "text-segmentation": "^1.0.3" - } - }, "immutable": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", @@ -2232,14 +2141,6 @@ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true }, - "text-segmentation": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", - "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", - "requires": { - "utrie": "^1.0.2" - } - }, "tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", @@ -2275,14 +2176,6 @@ "is-number": "^7.0.0" } }, - "utrie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", - "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", - "requires": { - "base64-arraybuffer": "^1.0.2" - } - }, "vite": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.3.tgz", diff --git a/package.json b/package.json index c48694c..29b7809 100644 --- a/package.json +++ b/package.json @@ -24,9 +24,6 @@ "vite-plugin-html-inject": "^1.1.2" }, "dependencies": { - "@zumer/snapdom": "^1.9.7", - "dom-to-image": "^2.6.0", - "html-to-image": "^1.11.13", - "html2canvas": "^1.4.1" + "@zumer/snapdom": "^1.9.7" } } diff --git a/partials/toolbox/main.html b/partials/toolbox/main.html index d93b2c2..3f8f9b1 100644 --- a/partials/toolbox/main.html +++ b/partials/toolbox/main.html @@ -56,21 +56,21 @@ +
@@ -57,6 +57,7 @@ - - - - - + - - + + + + - - - + + + + + + + - - + diff --git a/partials/toolbox/presets.html b/partials/toolbox/presets.html index 1731c87..5180449 100644 --- a/partials/toolbox/presets.html +++ b/partials/toolbox/presets.html @@ -1,12 +1,13 @@
+

Choose a preset theme or customize your own with the options above.

+
- - - - - - - - +
+ Create my own +
+ + Upload theme +
\ No newline at end of file diff --git a/partials/toolbox/result.html b/partials/toolbox/result.html index a7ddb52..b92058b 100644 --- a/partials/toolbox/result.html +++ b/partials/toolbox/result.html @@ -1,5 +1,5 @@
-
+
Hey! I am ...
Fullstack developer
@@ -17,9 +17,15 @@ Random
-