diff --git a/apps/portfolio-ui/src/components/footer/Footer.tsx b/apps/portfolio-ui/src/components/footer/Footer.tsx index c00b88b..e64ca58 100644 --- a/apps/portfolio-ui/src/components/footer/Footer.tsx +++ b/apps/portfolio-ui/src/components/footer/Footer.tsx @@ -13,6 +13,7 @@ const Footer: React.FC = () => { whileInView={{ y: 0 }} transition={{ duration: 0.8, type: "tween", stiffness: 100 }} viewport={{ once: true }} + style={{ willChange: "transform, opacity" }} >

diff --git a/apps/portfolio-ui/src/containers/StartupProjects/StartupProject.tsx b/apps/portfolio-ui/src/containers/StartupProjects/StartupProject.tsx index b9b86c1..12f981c 100644 --- a/apps/portfolio-ui/src/containers/StartupProjects/StartupProject.tsx +++ b/apps/portfolio-ui/src/containers/StartupProjects/StartupProject.tsx @@ -25,8 +25,9 @@ const StartupProject = (): React.ReactElement | null => {

diff --git a/apps/portfolio-ui/src/containers/achievement/Achievement.tsx b/apps/portfolio-ui/src/containers/achievement/Achievement.tsx index dcaf7fb..35a45eb 100644 --- a/apps/portfolio-ui/src/containers/achievement/Achievement.tsx +++ b/apps/portfolio-ui/src/containers/achievement/Achievement.tsx @@ -14,8 +14,9 @@ const Achievement = (): ReactElement => {
diff --git a/apps/portfolio-ui/src/containers/blogs/Blogs.tsx b/apps/portfolio-ui/src/containers/blogs/Blogs.tsx index 0df889c..d271b7b 100644 --- a/apps/portfolio-ui/src/containers/blogs/Blogs.tsx +++ b/apps/portfolio-ui/src/containers/blogs/Blogs.tsx @@ -35,8 +35,9 @@ const Blogs = (): ReactElement => {
diff --git a/apps/portfolio-ui/src/containers/contact/Contact.tsx b/apps/portfolio-ui/src/containers/contact/Contact.tsx index af38933..d4e642b 100644 --- a/apps/portfolio-ui/src/containers/contact/Contact.tsx +++ b/apps/portfolio-ui/src/containers/contact/Contact.tsx @@ -14,8 +14,9 @@ const Contact: React.FC = (): React.ReactElement => {
diff --git a/apps/portfolio-ui/src/containers/education/Education.tsx b/apps/portfolio-ui/src/containers/education/Education.tsx index f6efb72..2cdb1f1 100644 --- a/apps/portfolio-ui/src/containers/education/Education.tsx +++ b/apps/portfolio-ui/src/containers/education/Education.tsx @@ -12,8 +12,9 @@ const Education: React.FC = () => {

Education

diff --git a/apps/portfolio-ui/src/containers/greeting/Greeting.tsx b/apps/portfolio-ui/src/containers/greeting/Greeting.tsx index bc65ac7..cc47402 100644 --- a/apps/portfolio-ui/src/containers/greeting/Greeting.tsx +++ b/apps/portfolio-ui/src/containers/greeting/Greeting.tsx @@ -19,8 +19,9 @@ const Greeting: React.FC = () => {
diff --git a/apps/portfolio-ui/src/containers/loading/Loading.tsx b/apps/portfolio-ui/src/containers/loading/Loading.tsx index 5b3e763..9e2deaa 100644 --- a/apps/portfolio-ui/src/containers/loading/Loading.tsx +++ b/apps/portfolio-ui/src/containers/loading/Loading.tsx @@ -2,7 +2,7 @@ import React, { ReactElement } from "react"; import "./loading.scss"; const Loading = (): React.ReactElement => { - const renderCircles = (): React.ReactNodeArray => { + const renderCircles = (): React.ReactNode[] => { const circles: React.ReactNode[] = []; for (let i = 1; i <= 12; i++) { circles.push(
); diff --git a/apps/portfolio-ui/src/containers/projects/Projects.tsx b/apps/portfolio-ui/src/containers/projects/Projects.tsx index f82bf42..96defce 100644 --- a/apps/portfolio-ui/src/containers/projects/Projects.tsx +++ b/apps/portfolio-ui/src/containers/projects/Projects.tsx @@ -26,8 +26,9 @@ const Projects: React.FC = (): React.ReactElement => {

Open Source Projects

diff --git a/apps/portfolio-ui/src/containers/skillProgress/skillProgress.tsx b/apps/portfolio-ui/src/containers/skillProgress/skillProgress.tsx index 1591f8a..61675e2 100644 --- a/apps/portfolio-ui/src/containers/skillProgress/skillProgress.tsx +++ b/apps/portfolio-ui/src/containers/skillProgress/skillProgress.tsx @@ -14,6 +14,7 @@ const StackProgress: React.FC = (): React.ReactElement | null => { whileInView={{ x: 0 }} transition={{ duration: 0.9, type: "tween", stiffness: 100 }} viewport={{ once: true }} + style={{ willChange: "transform, opacity" }} className="skills-bar">

Proficiency

{techStack.experience.map((exp, i) => { @@ -35,6 +36,7 @@ const StackProgress: React.FC = (): React.ReactElement | null => { whileInView={{ x: 0 }} transition={{ duration: 0.9, type: "tween", stiffness: 100 }} viewport={{ once: true }} + style={{ willChange: "transform, opacity" }} className="skills-image" > {illustration.animated ? ( diff --git a/apps/portfolio-ui/src/containers/skills/Skills.tsx b/apps/portfolio-ui/src/containers/skills/Skills.tsx index bd5d242..c96567f 100644 --- a/apps/portfolio-ui/src/containers/skills/Skills.tsx +++ b/apps/portfolio-ui/src/containers/skills/Skills.tsx @@ -22,6 +22,7 @@ const Skills: React.FC = (): React.ReactElement | null => { whileInView={{ x: 0, y: "-12%" }} transition={{ delay: 1, type: "tween", stiffness: 100 }} viewport={{ once: true }} + style={{ willChange: "transform, opacity" }} >
{illustration.animated ? ( @@ -39,6 +40,7 @@ const Skills: React.FC = (): React.ReactElement | null => { whileInView={{ x: 0 }} transition={{ duration: 0.9, type: "tween", stiffness: 100 }} viewport={{ once: true }} + style={{ willChange: "transform, opacity" }} >

{
diff --git a/package-lock.json b/package-lock.json index 45d8805..a646b1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,14 +15,15 @@ "colorthief": "^2.4.0", "config": "^3.3.9", "constructs": "^10.0.0", - "framer-motion": "^10.16.4", + "framer-motion": "^12.23.26", "lottie-react": "^2.4.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", "react-easy-emoji": "^1.8.1", "react-headroom": "^3.2.1", "react-twitter-embed": "^4.0.4", - "sass": "^1.68.0" + "sass": "^1.68.0", + "typescript": "^5.9.3" }, "bin": { "devportfolio": "bin/devportfolio.js" @@ -33,9 +34,9 @@ "@types/esbuild-copy-static-files": "^0.1.1", "@types/fs-extra": "^11.0.2", "@types/jest": "^29.5.4", - "@types/node": "20.5.9", - "@types/react": "^18.2.24", - "@types/react-dom": "^18.2.8", + "@types/node": "^25.0.3", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", "@types/react-headroom": "^3.2.1", "aws-cdk": "2.96.2", "esbuild": "0.19.3", @@ -47,8 +48,7 @@ "nodemon": "^3.0.1", "prettier": "^3.0.3", "ts-jest": "^29.1.1", - "ts-node": "^10.9.1", - "typescript": "~5.2.2" + "ts-node": "^10.9.1" } }, "node_modules/@ampproject/remapping": { @@ -779,21 +779,6 @@ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" }, - "node_modules/@emotion/is-prop-valid": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", - "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", - "optional": true, - "dependencies": { - "@emotion/memoize": "0.7.4" - } - }, - "node_modules/@emotion/is-prop-valid/node_modules/@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", - "optional": true - }, "node_modules/@emotion/memoize": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", @@ -2083,10 +2068,14 @@ } }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", - "dev": true + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", + "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -2099,30 +2088,24 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, - "node_modules/@types/prop-types": { - "version": "15.7.8", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz", - "integrity": "sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==", - "devOptional": true - }, "node_modules/@types/react": { - "version": "18.2.24", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.24.tgz", - "integrity": "sha512-Ee0Jt4sbJxMu1iDcetZEIKQr99J1Zfb6D4F3qfUWoR1JpInkY1Wdg4WwCyBjL257D0+jGqSl1twBjV8iCaC0Aw==", - "devOptional": true, + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", + "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", + "dev": true, + "license": "MIT", "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "csstype": "^3.2.2" } }, "node_modules/@types/react-dom": { - "version": "18.2.8", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.8.tgz", - "integrity": "sha512-bAIvO5lN/U8sPGvs1Xm61rlRHHaq5rp5N3kp9C+NJ/Q41P8iqjkXSu0+/qu8POsjH9pNWb0OYabFez7taP7omw==", + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "dev": true, - "dependencies": { - "@types/react": "*" + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" } }, "node_modules/@types/react-headroom": { @@ -2134,12 +2117,6 @@ "@types/react": "*" } }, - "node_modules/@types/scheduler": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.4.tgz", - "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==", - "devOptional": true - }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -3336,9 +3313,10 @@ "dev": true }, "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" }, "node_modules/cwise-compiler": { "version": "1.1.3", @@ -3821,20 +3799,24 @@ } }, "node_modules/framer-motion": { - "version": "10.16.4", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.16.4.tgz", - "integrity": "sha512-p9V9nGomS3m6/CALXqv6nFGMuFOxbWsmaOrdmhyQimMIlLl3LC7h7l86wge/Js/8cRu5ktutS/zlzgR7eBOtFA==", + "version": "12.23.26", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.26.tgz", + "integrity": "sha512-cPcIhgR42xBn1Uj+PzOyheMtZ73H927+uWPDVhUMqxy8UHt6Okavb6xIz9J/phFUHUj0OncR6UvMfJTXoc/LKA==", + "license": "MIT", "dependencies": { + "motion-dom": "^12.23.23", + "motion-utils": "^12.23.6", "tslib": "^2.4.0" }, - "optionalDependencies": { - "@emotion/is-prop-valid": "^0.8.2" - }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, "react": { "optional": true }, @@ -5397,6 +5379,21 @@ "node": "*" } }, + "node_modules/motion-dom": { + "version": "12.23.23", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.23.tgz", + "integrity": "sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.23.6" + } + }, + "node_modules/motion-utils": { + "version": "12.23.6", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz", + "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==", + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -5950,26 +5947,24 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", + "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^19.2.3" } }, "node_modules/react-easy-emoji": { @@ -6193,12 +6188,10 @@ "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" }, "node_modules/scriptjs": { "version": "2.5.9", @@ -6763,10 +6756,10 @@ } }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6781,6 +6774,13 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "dev": true }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, "node_modules/uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", diff --git a/package.json b/package.json index 3178314..7b16b46 100644 --- a/package.json +++ b/package.json @@ -25,9 +25,9 @@ "@types/esbuild-copy-static-files": "^0.1.1", "@types/fs-extra": "^11.0.2", "@types/jest": "^29.5.4", - "@types/node": "20.5.9", - "@types/react": "^18.2.24", - "@types/react-dom": "^18.2.8", + "@types/node": "^25.0.3", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", "@types/react-headroom": "^3.2.1", "aws-cdk": "2.96.2", "esbuild": "0.19.3", @@ -39,8 +39,7 @@ "nodemon": "^3.0.1", "prettier": "^3.0.3", "ts-jest": "^29.1.1", - "ts-node": "^10.9.1", - "typescript": "~5.2.2" + "ts-node": "^10.9.1" }, "dependencies": { "@emotion/react": "^11.11.1", @@ -50,13 +49,14 @@ "colorthief": "^2.4.0", "config": "^3.3.9", "constructs": "^10.0.0", - "framer-motion": "^10.16.4", + "framer-motion": "^12.23.26", "lottie-react": "^2.4.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", "react-easy-emoji": "^1.8.1", "react-headroom": "^3.2.1", "react-twitter-embed": "^4.0.4", - "sass": "^1.68.0" + "sass": "^1.68.0", + "typescript": "^5.9.3" } } diff --git a/tsconfig.ui.json b/tsconfig.ui.json index c98c28f..548f171 100644 --- a/tsconfig.ui.json +++ b/tsconfig.ui.json @@ -9,6 +9,9 @@ "strictNullChecks": false, "strictPropertyInitialization": false, "typeRoots": ["./node_modules/@types"], + "jsx": "react", + "esModuleInterop": true, + "skipLibCheck": true }, "exclude": ["cdk.out"], "include": ["apps/portfolio-ui"]