diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..ca2d7fc --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,10 @@ +export default { + semi: true, + trailingComma: "es5", + singleQuote: false, + tabWidth: 4, + endOfLine: "auto", + printWidth: 80, + bracketSpacing: true, + arrowParens: "always", +}; diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..0a2f21b --- /dev/null +++ b/bun.lock @@ -0,0 +1,178 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "portfolio", + "devDependencies": { + "prettier": "^3.4.2", + "sass": "^1.56.1", + "vite": "6.0.11", + }, + }, + }, + "packages": { + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.24.2", "", { "os": "android", "cpu": "arm64" }, "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.24.2", "", { "os": "android", "cpu": "x64" }, "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.24.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.24.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.24.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.24.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.24.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.24.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.24.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.24.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.24.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.24.2", "", { "os": "linux", "cpu": "x64" }, "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.24.2", "", { "os": "none", "cpu": "arm64" }, "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.24.2", "", { "os": "none", "cpu": "x64" }, "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.24.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.24.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.24.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.24.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.24.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg=="], + + "@parcel/watcher": ["@parcel/watcher@2.5.1", "", { "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^7.0.0" }, "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" } }, "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg=="], + + "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.1", "", { "os": "android", "cpu": "arm64" }, "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA=="], + + "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw=="], + + "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg=="], + + "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ=="], + + "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA=="], + + "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q=="], + + "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w=="], + + "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg=="], + + "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A=="], + + "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg=="], + + "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw=="], + + "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ=="], + + "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.1", "", { "os": "win32", "cpu": "x64" }, "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.32.1", "", { "os": "android", "cpu": "arm" }, "sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.32.1", "", { "os": "android", "cpu": "arm64" }, "sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.32.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.32.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.32.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.32.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.32.1", "", { "os": "linux", "cpu": "arm" }, "sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.32.1", "", { "os": "linux", "cpu": "arm" }, "sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.32.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.32.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw=="], + + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.32.1", "", { "os": "linux", "cpu": "none" }, "sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw=="], + + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.32.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.32.1", "", { "os": "linux", "cpu": "none" }, "sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.32.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.32.1", "", { "os": "linux", "cpu": "x64" }, "sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.32.1", "", { "os": "linux", "cpu": "x64" }, "sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.32.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.32.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.32.1", "", { "os": "win32", "cpu": "x64" }, "sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q=="], + + "@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], + + "esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "immutable": ["immutable@5.0.3", "", {}, "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="], + + "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "postcss": ["postcss@8.5.1", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ=="], + + "prettier": ["prettier@3.4.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ=="], + + "readdirp": ["readdirp@4.1.1", "", {}, "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw=="], + + "rollup": ["rollup@4.32.1", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.32.1", "@rollup/rollup-android-arm64": "4.32.1", "@rollup/rollup-darwin-arm64": "4.32.1", "@rollup/rollup-darwin-x64": "4.32.1", "@rollup/rollup-freebsd-arm64": "4.32.1", "@rollup/rollup-freebsd-x64": "4.32.1", "@rollup/rollup-linux-arm-gnueabihf": "4.32.1", "@rollup/rollup-linux-arm-musleabihf": "4.32.1", "@rollup/rollup-linux-arm64-gnu": "4.32.1", "@rollup/rollup-linux-arm64-musl": "4.32.1", "@rollup/rollup-linux-loongarch64-gnu": "4.32.1", "@rollup/rollup-linux-powerpc64le-gnu": "4.32.1", "@rollup/rollup-linux-riscv64-gnu": "4.32.1", "@rollup/rollup-linux-s390x-gnu": "4.32.1", "@rollup/rollup-linux-x64-gnu": "4.32.1", "@rollup/rollup-linux-x64-musl": "4.32.1", "@rollup/rollup-win32-arm64-msvc": "4.32.1", "@rollup/rollup-win32-ia32-msvc": "4.32.1", "@rollup/rollup-win32-x64-msvc": "4.32.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA=="], + + "sass": ["sass@1.83.4", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "vite": ["vite@6.0.11", "", { "dependencies": { "esbuild": "^0.24.2", "postcss": "^8.4.49", "rollup": "^4.23.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg=="], + } +} diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index 6af52fc..0000000 Binary files a/bun.lockb and /dev/null differ diff --git a/package.json b/package.json index eeb0184..fc13e74 100644 --- a/package.json +++ b/package.json @@ -2,27 +2,22 @@ "name": "portfolio", "version": "1.2.0", "main": "src/app/index.js", + "type": "module", "author": { "name": "Elias", "url": "https://EliasDevis.github.io" }, "license": "MIT", "devDependencies": { - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.7.2", - "html-webpack-plugin": "^5.5.0", - "json-minimizer-webpack-plugin": "^4.0.0", - "mini-css-extract-plugin": "^2.7.2", + "prettier": "^3.4.2", "sass": "^1.56.1", - "sass-loader": "^13.2.0", - "style-loader": "^3.3.1", - "webpack": "^5.75.0", - "webpack-cli": "^5.0.0", - "webpack-dev-server": "^4.11.1", - "node-sass": "^8.0.0" + "vite": "6.0.11" }, "scripts": { - "build": "webpack", - "serve": "webpack serve" + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "format": "prettier --write \"src/**/*.{js,jsx,ts,tsx,json,css,scss,md}\"", + "format:check": "prettier --check \"src/**/*.{js,jsx,ts,tsx,json,css,scss,md}\"" } } diff --git a/src/app/blocks/about/About.js b/src/app/blocks/about/About.js index 0c1b997..481c252 100644 --- a/src/app/blocks/about/About.js +++ b/src/app/blocks/about/About.js @@ -1,14 +1,18 @@ export default (t) => { - return /*html*/` + return /*html*/ `
- ${t.description.map(text => /*html*/` + ${t.description + .map( + (text) => /*html*/ `

${text}

- `).join("")} + ` + ) + .join("")}
- ` -} \ No newline at end of file + `; +}; diff --git a/src/app/blocks/about/Facts.js b/src/app/blocks/about/Facts.js index d46c69a..b260072 100644 --- a/src/app/blocks/about/Facts.js +++ b/src/app/blocks/about/Facts.js @@ -1,12 +1,16 @@ export default (t) => { - return /*html*/` + return /*html*/ `

${t.title}

@@ -14,5 +18,5 @@ export default (t) => {
- ` -} \ No newline at end of file + `; +}; diff --git a/src/app/blocks/about/Skills.js b/src/app/blocks/about/Skills.js index 0196733..368071a 100644 --- a/src/app/blocks/about/Skills.js +++ b/src/app/blocks/about/Skills.js @@ -1,15 +1,15 @@ -import SkillBlock from "@/components/SkillBlock" -import skills from "@/consts/skills" +import SkillBlock from "@/components/SkillBlock"; +import skills from "@/consts/skills"; export default (t, t2) => { - return /*html*/` + return /*html*/ `

${t.title}

${Object.keys(skills) - .map((id) => SkillBlock({ id }, t2)) - .join("")} + .map((id) => SkillBlock({ id }, t2)) + .join("")}
- ` -} + `; +}; diff --git a/src/app/blocks/home/About.js b/src/app/blocks/home/About.js index 07d50d6..e654c72 100644 --- a/src/app/blocks/home/About.js +++ b/src/app/blocks/home/About.js @@ -4,10 +4,12 @@ export default (t) => {

${t.title}

- ${t.description.map( - (text) => - /*html*/ `

${text}

` - ).join("")} + ${t.description + .map( + (text) => + /*html*/ `

${text}

` + ) + .join("")}
${t.button} -> diff --git a/src/app/blocks/home/Contacts.js b/src/app/blocks/home/Contacts.js index 5b31d07..dc21af5 100644 --- a/src/app/blocks/home/Contacts.js +++ b/src/app/blocks/home/Contacts.js @@ -8,7 +8,7 @@ const contacts = [ { name: "email", text: media.emailRaw, - } + }, ]; export default (t) => { diff --git a/src/app/blocks/home/Quote.js b/src/app/blocks/home/Quote.js index 025ac01..deb768a 100644 --- a/src/app/blocks/home/Quote.js +++ b/src/app/blocks/home/Quote.js @@ -1,8 +1,8 @@ export default (t) => { - return /*html*/` + return /*html*/ `
${t.text}
${t.author}
- ` -} \ No newline at end of file + `; +}; diff --git a/src/app/blocks/home/Skills.js b/src/app/blocks/home/Skills.js index 9ba7955..205c2f8 100644 --- a/src/app/blocks/home/Skills.js +++ b/src/app/blocks/home/Skills.js @@ -14,7 +14,7 @@ export default (t, t2) => {
${Object.keys(skills) - .filter(id => id !== "tool") + .filter((id) => id !== "tool") .map((id) => SkillBlock({ id }, t2)) .join("")}
diff --git a/src/app/components/Dots.js b/src/app/components/Dots.js index 2807bd3..e7ea2a3 100644 --- a/src/app/components/Dots.js +++ b/src/app/components/Dots.js @@ -2,20 +2,22 @@ const radius = 4; const gap = 16; export default ({ width = 5, height = 5 } = {}) => { - const svgWidth = (radius * 2 + gap) * width - gap - const svgHeight = (radius * 2 + gap) * height - gap + const svgWidth = (radius * 2 + gap) * width - gap; + const svgHeight = (radius * 2 + gap) * height - gap; return /*html*/ ` ${new Array(width) .fill(new Array(height).fill("")) .map((arr, i) => - arr.map((_, j) => { - const x = radius + i * (radius * 2 + gap); - const y = radius + j * (radius * 2 + gap); + arr + .map((_, j) => { + const x = radius + i * (radius * 2 + gap); + const y = radius + j * (radius * 2 + gap); - return /*html*/ ``; - }).join("") + return /*html*/ ``; + }) + .join("") ) .join("")} diff --git a/src/app/components/Header.js b/src/app/components/Header.js index 1035fae..1bf2911 100644 --- a/src/app/components/Header.js +++ b/src/app/components/Header.js @@ -1,7 +1,7 @@ import routes from "@/consts/routes"; import MediaIcon from "./MediaIcon"; -const paths = ["/", "/projects", "/about-me"] +const paths = ["/", "/projects", "/about-me"]; export default (t) => { return /*html*/ ` diff --git a/src/app/components/Path.js b/src/app/components/Path.js index fc9a9a0..4104d24 100644 --- a/src/app/components/Path.js +++ b/src/app/components/Path.js @@ -1,8 +1,8 @@ export default ({ description }) => { - return /*html*/` + return /*html*/ `

${window.location.pathname.slice(1)}

${description}

- ` -} \ No newline at end of file + `; +}; diff --git a/src/app/components/Project.js b/src/app/components/Project.js index 55389f6..064666e 100644 --- a/src/app/components/Project.js +++ b/src/app/components/Project.js @@ -6,11 +6,12 @@ import media from "@/consts/media"; function mapLinks(links) { function map(link) { let href = - "https://" + (link === "live" ? "" : websites[link]) + links[link]; - - if (link === "figma") href = `https://figma.com/community/file/${links[link]}` - if (link === "github" && links[link].startsWith("/")) href = media.github + links[link] + "https://" + (link === "live" ? "" : websites[link]) + links[link]; + if (link === "figma") + href = `https://figma.com/community/file/${links[link]}`; + if (link === "github" && links[link].startsWith("/")) + href = media.github + links[link]; const className = link === "cached" ? "button__secondary" : ""; const name = `${link[0].toUpperCase()}${link.slice(1)}`; @@ -22,9 +23,11 @@ function mapLinks(links) { } export default ({ id }, t) => { - const { hasImage, techs: projectTech, links } = projects.find( - (project) => project.id === id - ); + const { + hasImage, + techs: projectTech, + links, + } = projects.find((project) => project.id === id); return /*html*/ `
diff --git a/src/app/components/ProjectList.js b/src/app/components/ProjectList.js index b850740..fbe04b3 100644 --- a/src/app/components/ProjectList.js +++ b/src/app/components/ProjectList.js @@ -1,7 +1,6 @@ import Project from "@/components/Project"; import projects from "@/consts/projects"; - export default ({ title, filter = () => true, limit = projects.length }, t) => { return /*html*/ ` ${title ? `

${title}

` : ""} diff --git a/src/app/components/SkillBlock.js b/src/app/components/SkillBlock.js index e7a1c73..eba0153 100644 --- a/src/app/components/SkillBlock.js +++ b/src/app/components/SkillBlock.js @@ -6,7 +6,8 @@ export default ({ id }, t) => {
${t[id]}
    - ${(skills[id].map((techIndex) => techs[techIndex])) + ${skills[id] + .map((techIndex) => techs[techIndex]) .map( (tech) => /*html*/ `
  • ${tech}
  • ` diff --git a/src/app/consts/media.js b/src/app/consts/media.js index 9caed82..47268d2 100644 --- a/src/app/consts/media.js +++ b/src/app/consts/media.js @@ -1,4 +1,4 @@ -import proxy from "../proxies/media" +import proxy from "../proxies/media"; const media = { discord: { @@ -17,9 +17,7 @@ const media = { cssBattle: "elias_dev", codepen: "elias_dev", dribble: "Elias_dev", - email: "elias.devis@protonmail.com" - -} + email: "elias.devis@protonmail.com", +}; export default new Proxy(media, proxy); - diff --git a/src/app/consts/projects.js b/src/app/consts/projects.js index 93b641e..09e623c 100644 --- a/src/app/consts/projects.js +++ b/src/app/consts/projects.js @@ -7,7 +7,7 @@ const projects = [ links: { figma: "1198393124994627983", live: "deplos.github.io", - github: "Deplos/deplos.github.io" + github: "Deplos/deplos.github.io", }, techs: ["pug", "stylus", "node"], hasImage: true, @@ -19,13 +19,13 @@ const projects = [ github: "pixelate-it/pixelbattle-frontend", }, techs: ["preact", "css", "pixijs", "ts"], - hasImage: true + hasImage: true, }, { id: "feedrum", links: { github: "Feedrum-Project/feedrum-next", - figma: "1314605686829534158" + figma: "1314605686829534158", }, techs: ["node", "next", "react", "zod"], hasImage: true, @@ -70,7 +70,7 @@ const projects = [ links: { figma: "1164933568884615740", github: "/EliasDevis.github.io", - live: "eliasdevis.github.io" + live: "eliasdevis.github.io", }, hasImage: true, }, diff --git a/src/app/consts/routes.js b/src/app/consts/routes.js index 0cf527d..f8c1d37 100644 --- a/src/app/consts/routes.js +++ b/src/app/consts/routes.js @@ -1,4 +1,3 @@ - /** * @type {import("../../types/Routes").Routes} */ @@ -19,9 +18,9 @@ export default { name: "404", element: "PageNotFound", }, - + // "/contacts": { // name: "contacts", // element: "Contacts", // }, -}; \ No newline at end of file +}; diff --git a/src/app/consts/skills.js b/src/app/consts/skills.js index b19da3c..85ae8d6 100644 --- a/src/app/consts/skills.js +++ b/src/app/consts/skills.js @@ -1,7 +1,17 @@ export default { language: ["js", "ts", "python"], database: ["sqlite", "postgreSql"], - other: ["html", "css", "sass", "scss", "less", "stylus", "ejs", "jinja", "pug"], + other: [ + "html", + "css", + "sass", + "scss", + "less", + "stylus", + "ejs", + "jinja", + "pug", + ], tool: ["vscode", "nvim", "figma", "git"], - framework: ["react", "next", "gulp", "express", "flask", "quart"] -} \ No newline at end of file + framework: ["react", "next", "gulp", "express", "flask", "quart"], +}; diff --git a/src/app/consts/techs.js b/src/app/consts/techs.js index 0e2d9a0..f27980f 100644 --- a/src/app/consts/techs.js +++ b/src/app/consts/techs.js @@ -33,4 +33,4 @@ export default { deno: "Deno", pixijs: "PixiJS", preact: "Preact", -} \ No newline at end of file +}; diff --git a/src/app/consts/websites.js b/src/app/consts/websites.js index bfbbc92..6f162b9 100644 --- a/src/app/consts/websites.js +++ b/src/app/consts/websites.js @@ -9,5 +9,5 @@ export default { cssBattle: "cssbattle.dev/player/", codepen: "codepen.io/", dribble: "dribbble.com/", - email: "mailto:" -} \ No newline at end of file + email: "mailto:", +}; diff --git a/src/app/helpers/loadCssFile.js b/src/app/helpers/loadCssFile.js deleted file mode 100644 index 860369e..0000000 --- a/src/app/helpers/loadCssFile.js +++ /dev/null @@ -1,7 +0,0 @@ -export default (pathName) => { - const link = document.createElement("link") - link.href = `/css/${pathName}.css`; - link.rel = "stylesheet" - - document.head.appendChild(link) -} \ No newline at end of file diff --git a/src/app/helpers/localeHandler.js b/src/app/helpers/localeHandler.js index 668e5c1..92f4c2f 100644 --- a/src/app/helpers/localeHandler.js +++ b/src/app/helpers/localeHandler.js @@ -1,13 +1,15 @@ -const defaultLocale = "en" - +const defaultLocale = "en"; function setLocaleHander() { const options = document.querySelectorAll(".dropdown__option"); const label = document.querySelector(".dropdown__label"); options.forEach((option) => { - if (option.innerHTML === localStorage.locale) - [label.innerHTML, option.innerHTML] = [localStorage.locale, label.innerHTML] + if (option.innerHTML === localStorage.locale) + [label.innerHTML, option.innerHTML] = [ + localStorage.locale, + label.innerHTML, + ]; option.addEventListener("click", () => { localStorage.locale = option.innerHTML; @@ -18,10 +20,12 @@ function setLocaleHander() { } async function getLocale() { - const locale = localStorage.locale ?? defaultLocale + const locale = localStorage.locale ?? defaultLocale; - return fetch(`/locales/${locale}.json`).then(res => res.json()) + // Using Vite's dynamic import for JSON + const localeModule = await import(`../../locales/${locale}.json`); + return localeModule.default; } export default setLocaleHander; -export { getLocale } +export { getLocale }; diff --git a/src/app/helpers/replacePath.js b/src/app/helpers/replacePath.js index c1c8205..8f4add4 100644 --- a/src/app/helpers/replacePath.js +++ b/src/app/helpers/replacePath.js @@ -1,4 +1,3 @@ - // From https://github.com/rafgraph/spa-github-pages export default async () => { const l = window.location; @@ -16,4 +15,4 @@ export default async () => { l.pathname.slice(0, -1) + decoded + l.hash ); } -} \ No newline at end of file +}; diff --git a/src/app/helpers/startTitleAnimation.js b/src/app/helpers/startTitleAnimation.js index 256a095..574eb5a 100644 --- a/src/app/helpers/startTitleAnimation.js +++ b/src/app/helpers/startTitleAnimation.js @@ -1,6 +1,5 @@ - const steps = "/-\\|"; -const FPS = 2 +const FPS = 2; const frameInterval = 1000 / FPS; let step = 0; @@ -19,4 +18,4 @@ export default (pathName) => { window.requestAnimationFrame(animation); } -} \ No newline at end of file +}; diff --git a/src/app/index.js b/src/app/index.js index 4b0f79a..1aa44a3 100644 --- a/src/app/index.js +++ b/src/app/index.js @@ -1,8 +1,6 @@ -import Layout from "./views/Layout"; import routes from "./consts/routes"; import startTitleAnimation from "./helpers/startTitleAnimation"; import localeHandler from "./helpers/localeHandler"; -import loadCssFile from "./helpers/loadCssFile"; import replacePath from "./helpers/replacePath"; import "styles/styles.sass"; @@ -11,13 +9,12 @@ const rootId = "root"; async function render() { const path = routes[window.location.pathname] ?? routes["/404"]; - loadCssFile(path.name); + const Layout = (await import("./views/Layout.js")).default; + startTitleAnimation(path.name); document.getElementById(rootId).innerHTML = await Layout( - ( - await import(`./views/${path.element}`) - ).default, + (await import(`./views/${path.element}.js`)).default, path ); } diff --git a/src/app/proxies/media.js b/src/app/proxies/media.js index 9a685b4..25c5362 100644 --- a/src/app/proxies/media.js +++ b/src/app/proxies/media.js @@ -1,14 +1,13 @@ -import websites from "../consts/websites" - +import websites from "../consts/websites"; export default { get(target, name) { - if (name === "emailRaw") - return target.email - - if (name === "discord") return `https://${websites.discord}${target.discord.id}` - if (name === "discordTag") return target.discord.tag + if (name === "emailRaw") return target.email; + + if (name === "discord") + return `https://${websites.discord}${target.discord.id}`; + if (name === "discordTag") return target.discord.tag; - return `${name === "email" ? "" : "https://"}${websites[name] ?? ""}${target[name]}` - } -} \ No newline at end of file + return `${name === "email" ? "" : "https://"}${websites[name] ?? ""}${target[name]}`; + }, +}; diff --git a/src/app/spaHandler.js b/src/app/spaHandler.js deleted file mode 100644 index e1f7abe..0000000 --- a/src/app/spaHandler.js +++ /dev/null @@ -1,27 +0,0 @@ - -// From https://github.com/rafgraph/spa-github-pages - -let pathSegmentsToKeep = 0; -let l = window.location; - -l.replace( - l.protocol + - "//" + - l.hostname + - (l.port ? ":" + l.port : "") + - l.pathname - .split("/") - .slice(0, 1 + pathSegmentsToKeep) - .join("/") + - "/?/" + - l.pathname - .slice(1) - .split("/") - .slice(pathSegmentsToKeep) - .join("/") - .replace(/&/g, "~and~") + - (l.search - ? "&" + l.search.slice(1).replace(/&/g, "~and~") - : "") + - l.hash -); \ No newline at end of file diff --git a/src/app/views/About.js b/src/app/views/About.js index 0a51f5c..ea6771e 100644 --- a/src/app/views/About.js +++ b/src/app/views/About.js @@ -1,9 +1,9 @@ import Path from "@/components/Path.js"; -import About from "@/blocks/about/About.js" +import About from "@/blocks/about/About.js"; import Skills from "@/blocks/about/Skills.js"; import Facts from "@/blocks/about/Facts.js"; -import "styles/pages/about.sass" +import "styles/pages/about.sass"; export default (t, locale) => { return /*html*/ ` diff --git a/src/app/views/Contacts.js b/src/app/views/Contacts.js index a73a30e..387f187 100644 --- a/src/app/views/Contacts.js +++ b/src/app/views/Contacts.js @@ -1,6 +1,5 @@ import Path from "@/components/Path.js"; - export default (t) => { return /*html*/ `${Path({ description: t.description })}`; }; diff --git a/src/app/views/Home.js b/src/app/views/Home.js index 2b4fb42..f19ebde 100644 --- a/src/app/views/Home.js +++ b/src/app/views/Home.js @@ -5,11 +5,10 @@ import Skills from "@/blocks/home/Skills.js"; import About from "@/blocks/home/About.js"; import Contacts from "@/blocks/home/Contacts.js"; -import "styles/pages/home.sass" - +import "styles/pages/home.sass"; export default (t, locale) => { - return /*html*/` + return /*html*/ ` ${Hero(t.hero)} ${Quote(t.quote)} ${Projects(t.projects, locale.projects)} diff --git a/src/app/views/Layout.js b/src/app/views/Layout.js index 3bf16a6..8f9633b 100644 --- a/src/app/views/Layout.js +++ b/src/app/views/Layout.js @@ -3,7 +3,7 @@ import Header from "@/components/Header.js"; import { getLocale } from "@/helpers/localeHandler.js"; export default async (content, path) => { - const locale = await getLocale() + const locale = await getLocale(); return /*html*/ ` ${Header(locale.header)} diff --git a/src/app/views/Projects.js b/src/app/views/Projects.js index cbb4278..7f247b3 100644 --- a/src/app/views/Projects.js +++ b/src/app/views/Projects.js @@ -1,7 +1,7 @@ import Path from "../components/Path.js"; import ProjectList from "../components/ProjectList.js"; -import "styles/pages/projects.sass" +import "styles/pages/projects.sass"; export default (t, t2) => { return /*html*/ ` diff --git a/src/assets/fonts/fira-code/FiraCode-Bold.ttf b/src/assets/fonts/fira-code/FiraCode-Bold.ttf new file mode 100644 index 0000000..9a3d65f Binary files /dev/null and b/src/assets/fonts/fira-code/FiraCode-Bold.ttf differ diff --git a/src/assets/fonts/fira-code/FiraCode-Bold.woff b/src/assets/fonts/fira-code/FiraCode-Bold.woff deleted file mode 100644 index 74e57c4..0000000 Binary files a/src/assets/fonts/fira-code/FiraCode-Bold.woff and /dev/null differ diff --git a/src/assets/fonts/fira-code/FiraCode-Light.ttf b/src/assets/fonts/fira-code/FiraCode-Light.ttf new file mode 100644 index 0000000..87ff012 Binary files /dev/null and b/src/assets/fonts/fira-code/FiraCode-Light.ttf differ diff --git a/src/assets/fonts/fira-code/FiraCode-Light.woff b/src/assets/fonts/fira-code/FiraCode-Light.woff deleted file mode 100644 index 1c1ebc6..0000000 Binary files a/src/assets/fonts/fira-code/FiraCode-Light.woff and /dev/null differ diff --git a/src/assets/fonts/fira-code/FiraCode-Medium.ttf b/src/assets/fonts/fira-code/FiraCode-Medium.ttf new file mode 100644 index 0000000..7a9c38e Binary files /dev/null and b/src/assets/fonts/fira-code/FiraCode-Medium.ttf differ diff --git a/src/assets/fonts/fira-code/FiraCode-Medium.woff b/src/assets/fonts/fira-code/FiraCode-Medium.woff deleted file mode 100644 index 19251b0..0000000 Binary files a/src/assets/fonts/fira-code/FiraCode-Medium.woff and /dev/null differ diff --git a/src/assets/fonts/fira-code/FiraCode-Regular.ttf b/src/assets/fonts/fira-code/FiraCode-Regular.ttf new file mode 100644 index 0000000..b8a44d2 Binary files /dev/null and b/src/assets/fonts/fira-code/FiraCode-Regular.ttf differ diff --git a/src/assets/fonts/fira-code/FiraCode-Regular.woff b/src/assets/fonts/fira-code/FiraCode-Regular.woff deleted file mode 100644 index 8816b69..0000000 Binary files a/src/assets/fonts/fira-code/FiraCode-Regular.woff and /dev/null differ diff --git a/src/assets/fonts/fira-code/FiraCode-SemiBold.ttf b/src/assets/fonts/fira-code/FiraCode-SemiBold.ttf new file mode 100644 index 0000000..45cfed7 Binary files /dev/null and b/src/assets/fonts/fira-code/FiraCode-SemiBold.ttf differ diff --git a/src/assets/fonts/fira-code/FiraCode-SemiBold.woff b/src/assets/fonts/fira-code/FiraCode-SemiBold.woff deleted file mode 100644 index 97857db..0000000 Binary files a/src/assets/fonts/fira-code/FiraCode-SemiBold.woff and /dev/null differ diff --git a/src/assets/fonts/fira-code/FiraCode-VF.woff b/src/assets/fonts/fira-code/FiraCode-VF.woff deleted file mode 100644 index c3407ed..0000000 Binary files a/src/assets/fonts/fira-code/FiraCode-VF.woff and /dev/null differ diff --git a/src/assets/styles/default/font.sass b/src/assets/styles/default/font.sass deleted file mode 100644 index 646a874..0000000 --- a/src/assets/styles/default/font.sass +++ /dev/null @@ -1,11 +0,0 @@ - -$fonts: ("Light": 300,"Regular": 400,"Medium": 500,"SemiBold": 600,"Bold": 700) -$format: "woff" - -@each $name, $weight in $fonts - @font-face - font: - family: "Fira Code" - weight: $weight - style: normal - src: url("fonts/FiraCode-#{$name}.#{$format}") format($format) diff --git a/src/assets/styles/default/variables.scss b/src/assets/styles/default/variables.scss index 2ca19a1..5fd888d 100644 --- a/src/assets/styles/default/variables.scss +++ b/src/assets/styles/default/variables.scss @@ -7,9 +7,6 @@ $colors: ( white: 0 0% 100%, ); - $desktopScreen: 1024px; $tabletScreen: 768px; $mobileScreen: 500px; - - diff --git a/src/assets/styles/pages/about.sass b/src/assets/styles/pages/about.sass deleted file mode 100644 index f38e62e..0000000 --- a/src/assets/styles/pages/about.sass +++ /dev/null @@ -1,6 +0,0 @@ -@import ../default/variables - -@import ../components/skillBlock -@import ../blocks/about/about -@import ../blocks/about/skills -@import ../blocks/about/facts \ No newline at end of file diff --git a/src/assets/styles/pages/home.sass b/src/assets/styles/pages/home.sass deleted file mode 100644 index e7454c2..0000000 --- a/src/assets/styles/pages/home.sass +++ /dev/null @@ -1,11 +0,0 @@ -@import ../default/variables - -@import ../blocks/home/about -@import ../blocks/home/contacts -@import ../blocks/home/hero -@import ../blocks/home/projects -@import ../blocks/home/quote -@import ../blocks/home/skills - -@import ../components/project -@import ../components/skillBlock diff --git a/src/assets/styles/pages/projects.sass b/src/assets/styles/pages/projects.sass deleted file mode 100644 index 7020524..0000000 --- a/src/assets/styles/pages/projects.sass +++ /dev/null @@ -1,4 +0,0 @@ - -@import ../default/variables - -@import ../components/project \ No newline at end of file diff --git a/src/assets/styles/styles.sass b/src/assets/styles/styles.sass deleted file mode 100644 index b57088b..0000000 --- a/src/assets/styles/styles.sass +++ /dev/null @@ -1,18 +0,0 @@ -@import default/font -@import default/variables -@import default/reset -@import default/default - -@import components/header -@import components/footer -@import components/button -@import components/dropdown -@import components/mediaIcon -@import components/path -@import components/h2 -@import components/container -@import components/logo - -:root - @each $key, $value in $colors - --#{$key}: hsl(#{$value}) diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..eeaf632 --- /dev/null +++ b/src/index.html @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + Elias Portfolio + + + + + + diff --git a/src/assets/locales/en.json b/src/locales/en.json similarity index 98% rename from src/assets/locales/en.json rename to src/locales/en.json index e3788a1..5323d6c 100644 --- a/src/assets/locales/en.json +++ b/src/locales/en.json @@ -126,9 +126,9 @@ "facts": { "title": "fun-facts", "list": [ - "I like winter more than summer", + "I like winter more than summer", "I often bike with my friends", - "I like pizza and pasta", + "I like pizza and pasta", "My favorite movie is The Green Mile" ] } @@ -137,4 +137,4 @@ "description": "How to contact me" } } -} \ No newline at end of file +} diff --git a/src/assets/locales/ru.json b/src/locales/ru.json similarity index 98% rename from src/assets/locales/ru.json rename to src/locales/ru.json index 5cb5211..c14d7bf 100644 --- a/src/assets/locales/ru.json +++ b/src/locales/ru.json @@ -110,7 +110,6 @@ "decent": "неплохие", "small": "маленькие", "inProgress": "недоделанные" - }, "about": { "description": "Кто я такой", @@ -127,9 +126,9 @@ "facts": { "title": "факты-обо-мне", "list": [ - "Я очень люблю зиму", + "Я очень люблю зиму", "Я часто катаюсь на велосипеде с моими друзьями", - "Люблю пиццу и пасту", + "Люблю пиццу и пасту", "Мой любимый фильм это Зеленая Миля" ] } @@ -138,4 +137,4 @@ "description": "Как со мной можно связаться" } } -} \ No newline at end of file +} diff --git a/src/assets/locales/ua.json b/src/locales/ua.json similarity index 98% rename from src/assets/locales/ua.json rename to src/locales/ua.json index 9fbe981..e6e24f4 100644 --- a/src/assets/locales/ua.json +++ b/src/locales/ua.json @@ -110,7 +110,6 @@ "decent": "непогані", "small": "маленькі", "inProgress": "недороблені" - }, "about": { "description": "Хто я такий", @@ -127,9 +126,9 @@ "facts": { "title": "факти-про-мене", "list": [ - "Я дуже полюбляю зиму", + "Я дуже полюбляю зиму", "Я часто їзджу на велосипеді з моїми друзями", - "Люблю піцу та пасту", + "Люблю піцу та пасту", "Мій улюблений фільм це Зелена миля" ] } @@ -138,4 +137,4 @@ "description": "Як можно зі мною зв'язатися" } } -} \ No newline at end of file +} diff --git a/src/assets/styles/blocks/about/about.sass b/src/styles/blocks/about/about.sass similarity index 100% rename from src/assets/styles/blocks/about/about.sass rename to src/styles/blocks/about/about.sass diff --git a/src/assets/styles/blocks/about/facts.sass b/src/styles/blocks/about/facts.sass similarity index 100% rename from src/assets/styles/blocks/about/facts.sass rename to src/styles/blocks/about/facts.sass diff --git a/src/assets/styles/blocks/about/skills.sass b/src/styles/blocks/about/skills.sass similarity index 100% rename from src/assets/styles/blocks/about/skills.sass rename to src/styles/blocks/about/skills.sass diff --git a/src/assets/styles/blocks/home/about.sass b/src/styles/blocks/home/about.sass similarity index 100% rename from src/assets/styles/blocks/home/about.sass rename to src/styles/blocks/home/about.sass diff --git a/src/assets/styles/blocks/home/contacts.sass b/src/styles/blocks/home/contacts.sass similarity index 100% rename from src/assets/styles/blocks/home/contacts.sass rename to src/styles/blocks/home/contacts.sass diff --git a/src/assets/styles/blocks/home/hero.sass b/src/styles/blocks/home/hero.sass similarity index 100% rename from src/assets/styles/blocks/home/hero.sass rename to src/styles/blocks/home/hero.sass diff --git a/src/assets/styles/blocks/home/projects.sass b/src/styles/blocks/home/projects.sass similarity index 100% rename from src/assets/styles/blocks/home/projects.sass rename to src/styles/blocks/home/projects.sass diff --git a/src/assets/styles/blocks/home/quote.sass b/src/styles/blocks/home/quote.sass similarity index 100% rename from src/assets/styles/blocks/home/quote.sass rename to src/styles/blocks/home/quote.sass diff --git a/src/assets/styles/blocks/home/skills.sass b/src/styles/blocks/home/skills.sass similarity index 95% rename from src/assets/styles/blocks/home/skills.sass rename to src/styles/blocks/home/skills.sass index 5d397ac..0c55ac2 100644 --- a/src/assets/styles/blocks/home/skills.sass +++ b/src/styles/blocks/home/skills.sass @@ -1,3 +1,5 @@ +@use '../../default/variables' as * + .skills width: 100% diff --git a/src/styles/components/_index.sass b/src/styles/components/_index.sass new file mode 100644 index 0000000..5a43175 --- /dev/null +++ b/src/styles/components/_index.sass @@ -0,0 +1,11 @@ +@forward 'header' +@forward 'footer' +@forward 'button' +@forward 'dropdown' +@forward 'mediaIcon' +@forward 'path' +@forward 'h2' +@forward 'container' +@forward 'logo' +@forward 'skillBlock' +@forward 'project' diff --git a/src/assets/styles/components/button.sass b/src/styles/components/button.sass similarity index 100% rename from src/assets/styles/components/button.sass rename to src/styles/components/button.sass diff --git a/src/assets/styles/components/container.sass b/src/styles/components/container.sass similarity index 89% rename from src/assets/styles/components/container.sass rename to src/styles/components/container.sass index 2b08b64..347b27c 100644 --- a/src/assets/styles/components/container.sass +++ b/src/styles/components/container.sass @@ -1,5 +1,6 @@ -.container +@use '../default/variables' as * +.container max-width: $desktopScreen margin: 0 auto position: relative diff --git a/src/assets/styles/components/dropdown.sass b/src/styles/components/dropdown.sass similarity index 100% rename from src/assets/styles/components/dropdown.sass rename to src/styles/components/dropdown.sass diff --git a/src/assets/styles/components/footer.sass b/src/styles/components/footer.sass similarity index 100% rename from src/assets/styles/components/footer.sass rename to src/styles/components/footer.sass diff --git a/src/assets/styles/components/h2.sass b/src/styles/components/h2.sass similarity index 100% rename from src/assets/styles/components/h2.sass rename to src/styles/components/h2.sass diff --git a/src/assets/styles/components/header.sass b/src/styles/components/header.sass similarity index 99% rename from src/assets/styles/components/header.sass rename to src/styles/components/header.sass index 769d1b4..31ff12e 100644 --- a/src/assets/styles/components/header.sass +++ b/src/styles/components/header.sass @@ -1,3 +1,4 @@ +@use '../default/variables' as * $screen: 768px diff --git a/src/assets/styles/components/logo.sass b/src/styles/components/logo.sass similarity index 100% rename from src/assets/styles/components/logo.sass rename to src/styles/components/logo.sass diff --git a/src/assets/styles/components/mediaIcon.sass b/src/styles/components/mediaIcon.sass similarity index 100% rename from src/assets/styles/components/mediaIcon.sass rename to src/styles/components/mediaIcon.sass diff --git a/src/assets/styles/components/path.sass b/src/styles/components/path.sass similarity index 100% rename from src/assets/styles/components/path.sass rename to src/styles/components/path.sass diff --git a/src/assets/styles/components/project.sass b/src/styles/components/project.sass similarity index 64% rename from src/assets/styles/components/project.sass rename to src/styles/components/project.sass index 596cd9a..a8983a8 100644 --- a/src/assets/styles/components/project.sass +++ b/src/styles/components/project.sass @@ -1,6 +1,21 @@ +@use '../default/variables' as * + .project + display: grid + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)) + gap: 16px + align-items: start + margin-top: 48px border: 1px solid var(--gray) + @media (max-width: $desktopScreen) + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)) + & + gap: 16px + align-items: start + margin-top: 48px + + &__links display: flex flex-wrap: wrap @@ -14,9 +29,8 @@ padding: 16px &__name - font: - size: 24px - weight: 500 + font-size: 24px + font-weight: 500 &__description color: var(--gray) @@ -33,12 +47,10 @@ .project-list width: 100% display: grid - grid-template-columns: repeat(3, 1fr) - - @media (max-width: $desktopScreen) - grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)) - gap: 16px align-items: start margin-top: 48px + + @media (max-width: $desktopScreen) + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)) diff --git a/src/assets/styles/components/skillBlock.sass b/src/styles/components/skillBlock.sass similarity index 100% rename from src/assets/styles/components/skillBlock.sass rename to src/styles/components/skillBlock.sass diff --git a/src/styles/default/_index.sass b/src/styles/default/_index.sass new file mode 100644 index 0000000..1fe8133 --- /dev/null +++ b/src/styles/default/_index.sass @@ -0,0 +1,4 @@ +@forward 'variables' +@forward 'font' +@forward 'reset' +@forward 'default' \ No newline at end of file diff --git a/src/assets/styles/default/default.sass b/src/styles/default/default.sass similarity index 100% rename from src/assets/styles/default/default.sass rename to src/styles/default/default.sass diff --git a/src/styles/default/font.sass b/src/styles/default/font.sass new file mode 100644 index 0000000..04562d8 --- /dev/null +++ b/src/styles/default/font.sass @@ -0,0 +1,10 @@ +$fonts: ("Light": 300, "Regular": 400, "Medium": 500, "SemiBold": 600, "Bold": 700) +$format: "ttf" + +@each $name, $weight in $fonts + @font-face + font: + family: "Fira Code" + weight: $weight + style: normal + src: url("/fonts/FiraCode-#{$name}.#{$format}") format($format) diff --git a/src/assets/styles/default/reset.sass b/src/styles/default/reset.sass similarity index 100% rename from src/assets/styles/default/reset.sass rename to src/styles/default/reset.sass diff --git a/src/styles/default/variables.scss b/src/styles/default/variables.scss new file mode 100644 index 0000000..cd4bad0 --- /dev/null +++ b/src/styles/default/variables.scss @@ -0,0 +1,12 @@ +$colors: ( + "primary": 287 60% 65%, + "primary-op": 287 60% 65% / 0.1, + "gray": 219 14% 71%, + "gray-op": 219 14% 71% / 0.1, + "background": 218 12% 18%, + "white": 0 0% 100%, +); + +$desktopScreen: 1024px; +$tabletScreen: 768px; +$mobileScreen: 500px; diff --git a/src/styles/pages/about.sass b/src/styles/pages/about.sass new file mode 100644 index 0000000..828ac2d --- /dev/null +++ b/src/styles/pages/about.sass @@ -0,0 +1,6 @@ +@use "../default/variables" + +@use "../components/skillBlock" +@use "../blocks/about/about" +@use "../blocks/about/skills" +@use "../blocks/about/facts" \ No newline at end of file diff --git a/src/styles/pages/home.sass b/src/styles/pages/home.sass new file mode 100644 index 0000000..1ff11a2 --- /dev/null +++ b/src/styles/pages/home.sass @@ -0,0 +1,10 @@ +@use '../default/variables' +@use '../blocks/home/hero' +@use '../blocks/home/about' +@use '../blocks/home/contacts' +@use '../blocks/home/projects' +@use '../blocks/home/quote' +@use '../blocks/home/skills' + +@use "../components/skillBlock" +@use "../components/project" diff --git a/src/styles/pages/projects.sass b/src/styles/pages/projects.sass new file mode 100644 index 0000000..18bf1b3 --- /dev/null +++ b/src/styles/pages/projects.sass @@ -0,0 +1,4 @@ + +@use "../default/variables" + +@use "../components/project" \ No newline at end of file diff --git a/src/styles/styles.sass b/src/styles/styles.sass new file mode 100644 index 0000000..ce32014 --- /dev/null +++ b/src/styles/styles.sass @@ -0,0 +1,6 @@ +@use 'default' as * +@use 'components' as * + +:root + @each $key, $value in $colors + --#{$key}: hsl(#{$value}) diff --git a/src/templates/404.ejs b/src/templates/404.ejs deleted file mode 100644 index 8fa533c..0000000 --- a/src/templates/404.ejs +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/templates/index.ejs b/src/templates/index.ejs deleted file mode 100644 index e913542..0000000 --- a/src/templates/index.ejs +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/types/Project.d.ts b/src/types/Project.d.ts index 4408d06..e982233 100644 --- a/src/types/Project.d.ts +++ b/src/types/Project.d.ts @@ -3,10 +3,10 @@ export interface Project { links: { live?: `${string}.${string}`; figma?: string; - github?: `/${string}` | `${string}/${string}` + github?: `/${string}` | `${string}/${string}`; }; techs: string[]; hasImage?: boolean; isSmall?: boolean; - isInProgress?: boolean -} \ No newline at end of file + isInProgress?: boolean; +} diff --git a/src/types/Routes.d.ts b/src/types/Routes.d.ts index 28de137..495b009 100644 --- a/src/types/Routes.d.ts +++ b/src/types/Routes.d.ts @@ -2,5 +2,5 @@ export interface Routes { [key: `/${string}`]: { name: string; element: string; - } -} \ No newline at end of file + }; +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..cdc1c6a --- /dev/null +++ b/vite.config.js @@ -0,0 +1,23 @@ +import { defineConfig } from "vite"; +import { resolve } from "path"; +import { fileURLToPath } from "url"; + +const __dirname = fileURLToPath(new URL(".", import.meta.url)); + +export default defineConfig({ + root: "src", + build: { + outDir: "../dist", + emptyOutDir: true, + }, + resolve: { + alias: { + "@": resolve(__dirname, "src/app"), + styles: resolve(__dirname, "src/styles"), + }, + }, + publicDir: resolve(__dirname, "src/assets"), + server: { + port: 9000, + }, +}); diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 754af17..0000000 --- a/webpack.config.js +++ /dev/null @@ -1,117 +0,0 @@ -const { resolve, join } = require("path"); -const plugins = { - html: require("html-webpack-plugin"), - css: require("mini-css-extract-plugin"), - copy: require("copy-webpack-plugin"), - json: require("json-minimizer-webpack-plugin") -} - -module.exports = { - entry: { - index: "./src/app/index.js", - spaHandler: "./src/app/spaHandler.js", - }, - output: { - path: resolve(__dirname, "dist"), - filename: "js/[name].js", - chunkFilename: "js/[chunkhash].js" - }, - mode: "development", - plugins: [ - new plugins.html({ - template: "src/templates/index.ejs", - filename: "index.html", - excludeChunks: ["spaHandler"], - title: "Elias Portfolio", - 'meta': { - 'viewport': 'width=device-width, initial-scale=1, shrink-to-fit=no', - 'theme-color': '#C778DD', - } - }), - new plugins.html({ - template: "src/templates/404.ejs", - filename: "404.html", - chunks: ["spaHandler"] - }), - new plugins.css({ - filename: "css/[name].css", - chunkFilename: (pathData) => { - if (typeof pathData.chunk.id === "number") return "css/[name].css" - const name = pathData.chunk.id.split("_").at(-2).toLowerCase() - - return `css/${name}.css` - } - }), - new plugins.copy({ - patterns: [ - { from: "src/assets/images", to: "images" }, - { from: "src/assets/locales", to: "locales" }, - ], - }) - ], - module: { - rules: [ - { - test: /\.(sass)$/, - use: [plugins.css.loader, "css-loader", "sass-loader"], - include: [ - join(__dirname, "src/assets/styles") - ] - }, - { - test: /\.json$/i, - type: "asset/resource", - include: [ - join(__dirname, "src/assets/locales") - ] - }, - - { - test: /\.(png|svg|jpe?g|gif)$/i, - include: [ - join(__dirname, "src/assets/images") - ], - type: "asset/resource", - generator: { - filename: "images/[contenthash][ext]", - } - }, - { - test: /\.(woff(2)?|eot|(o|t)tf)$/i, - type: "asset/resource", - include: [ - join(__dirname, "src/assets/fonts/") - ], - generator: { - filename: "fonts/[contenthash][ext]", - } - }, - ], - }, - devServer: { - static: { - directory: join(__dirname, 'dist'), - }, - port: 9000, - historyApiFallback: { - rewrites: [ - { from: /./, to: "/404.html" }, - ], - } - }, - - resolve: { - alias: { - "@": resolve(__dirname, "src/app/"), - styles: resolve(__dirname, "src/assets/styles/"), - fonts: resolve(__dirname, "src/assets/fonts/fira-code/") - }, - }, - optimization: { - minimize: true, - minimizer: [ - new plugins.json(), - ], - }, - -};