diff --git a/index.html b/index.html index 00bfdcb..a5863e6 100644 --- a/index.html +++ b/index.html @@ -23,6 +23,7 @@ + <%- googleAnalyticsScript %>
diff --git a/package-lock.json b/package-lock.json index 09c3dc2..0539553 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,14 +9,15 @@ "version": "4.0.0", "license": "MIT", "dependencies": { - "react": "^18.3.1", - "react-dom": "^18.3.1" + "@dr.pogodin/react-helmet": "^3.0.2", + "react": "^19.1.0", + "react-dom": "^19.1.0" }, "devDependencies": { "@arifszn/blog-js": "^2.0.6", "@tailwindcss/postcss": "^4.1.11", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", "@typescript-eslint/eslint-plugin": "^7.8.0", "@typescript-eslint/parser": "^7.3.1", "@vitejs/plugin-react": "^4.4.1", @@ -30,7 +31,6 @@ "eslint-plugin-react-refresh": "^0.4.20", "postcss": "^8.4.38", "prettier": "^3.3.2", - "react-helmet-async": "^2.0.5", "react-hotjar": "^6.3.1", "react-icons": "^5.4.0", "tailwindcss": "^4.1.11", @@ -1631,7 +1631,6 @@ "version": "7.27.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1685,6 +1684,18 @@ "node": ">=6.9.0" } }, + "node_modules/@dr.pogodin/react-helmet": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@dr.pogodin/react-helmet/-/react-helmet-3.0.2.tgz", + "integrity": "sha512-Y0O840J+TMZyq5eoJt3A/S5i7d35AiDXJ26VEg3uelvONEmMPPYoYpKmGx78tdZGVPWJ6llP/YFQRY8z8M1Kpw==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.27.1" + }, + "peerDependencies": { + "react": "19" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", @@ -3119,32 +3130,24 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/react": { - "version": "18.3.23", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", - "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", + "version": "19.1.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", + "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", "dev": true, "license": "MIT", "dependencies": { - "@types/prop-types": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "version": "19.1.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz", + "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==", "dev": true, "license": "MIT", "peerDependencies": { - "@types/react": "^18.0.0" + "@types/react": "^19.0.0" } }, "node_modules/@types/resolve": { @@ -5753,16 +5756,6 @@ "node": ">= 0.4" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -6308,6 +6301,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -6734,18 +6728,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -7404,50 +7386,24 @@ } }, "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "scheduler": "^0.26.0" }, "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/react-helmet-async": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-2.0.5.tgz", - "integrity": "sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "invariant": "^2.2.4", - "react-fast-compare": "^3.2.2", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0" + "react": "^19.1.0" } }, "node_modules/react-hotjar": { @@ -7868,13 +7824,10 @@ "license": "MIT" }, "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" }, "node_modules/semver": { "version": "7.7.2", @@ -7948,13 +7901,6 @@ "node": ">= 0.4" } }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "dev": true, - "license": "MIT" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/package.json b/package.json index 96583d8..392841f 100644 --- a/package.json +++ b/package.json @@ -22,14 +22,14 @@ "preview": "vite preview" }, "dependencies": { - "react": "^18.3.1", - "react-dom": "^18.3.1" + "react": "^19.1.0", + "react-dom": "^19.1.0" }, "devDependencies": { "@arifszn/blog-js": "^2.0.6", "@tailwindcss/postcss": "^4.1.11", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", "@typescript-eslint/eslint-plugin": "^7.8.0", "@typescript-eslint/parser": "^7.3.1", "@vitejs/plugin-react": "^4.4.1", @@ -43,7 +43,6 @@ "eslint-plugin-react-refresh": "^0.4.20", "postcss": "^8.4.38", "prettier": "^3.3.2", - "react-helmet-async": "^2.0.5", "react-hotjar": "^6.3.1", "react-icons": "^5.4.0", "tailwindcss": "^4.1.11", diff --git a/src/components/gitprofile.tsx b/src/components/gitprofile.tsx index afc5169..426dcb9 100644 --- a/src/components/gitprofile.tsx +++ b/src/components/gitprofile.tsx @@ -8,12 +8,10 @@ import { INVALID_GITHUB_USERNAME_ERROR, setTooManyRequestError, } from '../constants/errors'; -import { HelmetProvider } from 'react-helmet-async'; import '../assets/index.css'; import { getInitialTheme, getSanitizedConfig, setupHotjar } from '../utils'; import { SanitizedConfig } from '../interfaces/sanitized-config'; import ErrorPage from './error-page'; -import HeadTagEditor from './head-tag-editor'; import { DEFAULT_THEMES } from '../constants/default-themes'; import ThemeChanger from './theme-changer'; import { BG_COLOR } from '../constants'; @@ -180,123 +178,115 @@ const GitProfile = ({ config }: { config: Config }) => { }; return ( - -
- {error ? ( - - ) : ( - <> - -
-
-
-
- {!sanitizedConfig.themeConfig.disableSwitch && ( - - )} - + {error ? ( + + ) : ( + <> +
+
+
+
+ {!sanitizedConfig.themeConfig.disableSwitch && ( + - + + {sanitizedConfig.skills.length !== 0 && ( + - {sanitizedConfig.skills.length !== 0 && ( - - )} - {sanitizedConfig.experiences.length !== 0 && ( - - )} - {sanitizedConfig.certifications.length !== 0 && ( - - )} - {sanitizedConfig.educations.length !== 0 && ( - - )} -
+ )} + {sanitizedConfig.experiences.length !== 0 && ( + + )} + {sanitizedConfig.certifications.length !== 0 && ( + + )} + {sanitizedConfig.educations.length !== 0 && ( + + )}
-
-
- {sanitizedConfig.projects.github.display && ( - - )} - {sanitizedConfig.publications.length !== 0 && ( - - )} - {sanitizedConfig.projects.external.projects.length !== - 0 && ( - - )} - {sanitizedConfig.blog.display && ( - - )} -
+
+
+
+ {sanitizedConfig.projects.github.display && ( + + )} + {sanitizedConfig.publications.length !== 0 && ( + + )} + {sanitizedConfig.projects.external.projects.length !== 0 && ( + + )} + {sanitizedConfig.blog.display && ( + + )}
- {sanitizedConfig.footer && ( -
-
-
-
-
- )} - - )} -
- +
+ {sanitizedConfig.footer && ( +
+
+
+
+
+ )} + + )} +
); }; diff --git a/src/components/head-tag-editor/index.tsx b/src/components/head-tag-editor/index.tsx deleted file mode 100644 index 4ac418a..0000000 --- a/src/components/head-tag-editor/index.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { Helmet } from 'react-helmet-async'; -import { isDarkishTheme } from '../../utils'; - -type HeadTagEditorProps = { - googleAnalyticsId?: string; - appliedTheme: string; -}; - -/** - * Renders the head tag editor component. - * - * @param {HeadTagEditorProps} googleAnalyticsId - The Google Analytics ID. - * @param {HeadTagEditorProps} appliedTheme - The applied theme. - * @return {React.ReactElement} The head tag editor component. - */ -const HeadTagEditor: React.FC = ({ - googleAnalyticsId, - appliedTheme, -}) => { - return ( - - - {googleAnalyticsId && ( - <> - - - - )} - - ); -}; - -export default HeadTagEditor; diff --git a/vite.config.ts b/vite.config.ts index eccb768..df0480f 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -15,6 +15,16 @@ export default defineConfig({ metaTitle: CONFIG.seo.title, metaDescription: CONFIG.seo.description, metaImageURL: CONFIG.seo.imageURL, + googleAnalyticsScript: CONFIG.googleAnalytics.id + ? ` + +` + : '', }, }, }),