diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 59585c1..9ec60b7 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -23,7 +23,8 @@ "globals": "^16.5.0", "stylelint": "^17.3.0", "stylelint-config-standard": "^40.0.0", - "vite": "^7.2.4" + "vite": "^7.2.4", + "vite-plugin-svgr": "^4.5.0" } }, "node_modules/@babel/code-frame": { @@ -1280,6 +1281,29 @@ "dev": true, "license": "MIT" }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.57.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.0.tgz", @@ -1643,6 +1667,258 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -1941,6 +2217,19 @@ "node": ">=6" } }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001766", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", @@ -2144,6 +2433,17 @@ "dev": true, "license": "MIT" }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.279", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.279.tgz", @@ -2158,6 +2458,19 @@ "dev": true, "license": "MIT" }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -2418,6 +2731,13 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -3088,6 +3408,16 @@ "dev": true, "license": "MIT" }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -3212,6 +3542,17 @@ "dev": true, "license": "MIT" }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-releases": { "version": "2.0.27", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", @@ -3331,6 +3672,16 @@ "node": ">=8" } }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -3745,6 +4096,17 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -4012,6 +4374,13 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true, + "license": "MIT" + }, "node_modules/svg-tags": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", @@ -4127,6 +4496,13 @@ "node": ">=8.0" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -4277,6 +4653,21 @@ } } }, + "node_modules/vite-plugin-svgr": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.5.0.tgz", + "integrity": "sha512-W+uoSpmVkSmNOGPSsDCWVW/DDAyv+9fap9AZXBvWiQqrboJ08j2vh0tFxTD/LjwqwAd3yYSVJgm54S/1GhbdnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.2.0", + "@svgr/core": "^8.1.0", + "@svgr/plugin-jsx": "^8.1.0" + }, + "peerDependencies": { + "vite": ">=2.6.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index a71d2bc..3697225 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -27,6 +27,7 @@ "globals": "^16.5.0", "stylelint": "^17.3.0", "stylelint-config-standard": "^40.0.0", - "vite": "^7.2.4" + "vite": "^7.2.4", + "vite-plugin-svgr": "^4.5.0" } } diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 58c5475..2a3fae9 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -8,6 +8,12 @@ import FormPage from './pages/FormPage'; import DashboardPage from './pages/DashboardPage'; import AboutPage from './pages/AboutPage'; import PricingPage from './pages/PricingPage'; +import NewsPage from './pages/NewsPage'; +import DataPage from './pages/DataPage'; +import TermsOfServicePage from './pages/TermsOfServicePage'; +import PrivacyPolicyPage from './pages/PrivacyPolicyPage'; +import FAQsPage from './pages/FAQsPage'; + import './styles/styles.css' import './styles/home-page.css' @@ -15,6 +21,7 @@ import './styles/form-page.css' import './styles/dashboard-page.css' import './styles/about-page.css' import './styles/pricing-page.css' +import './styles/news-page.css' import './styles/contact-page.css' @@ -34,14 +41,9 @@ function App() { localStorage.setItem("theme", theme); }, [theme]); - // Cycles through: light -> dark -> cream -> light - const toggleTheme = () => { - setTheme(prev => { - if (prev === "light") return "cream"; - if (prev === "cream") return "midnight"; // New step! - if (prev === "midnight") return "dark"; - return "light"; - }); + // Sets theme directly from navbar selection + const toggleTheme = (selectedTheme) => { + setTheme(selectedTheme); }; return ( @@ -54,6 +56,11 @@ function App() { } /> } /> } /> + } /> + } /> + } /> + } /> + } /> ) diff --git a/frontend/src/assets/pricingFree.svg b/frontend/src/assets/pricingFree.svg new file mode 100644 index 0000000..d32a9ac --- /dev/null +++ b/frontend/src/assets/pricingFree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/pricingPremium.svg b/frontend/src/assets/pricingPremium.svg new file mode 100644 index 0000000..b2bb1fa --- /dev/null +++ b/frontend/src/assets/pricingPremium.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/pricingStudent.svg b/frontend/src/assets/pricingStudent.svg new file mode 100644 index 0000000..582fa9f --- /dev/null +++ b/frontend/src/assets/pricingStudent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/components/Footer.jsx b/frontend/src/components/Footer.jsx index 52511cd..7d9bbf2 100644 --- a/frontend/src/components/Footer.jsx +++ b/frontend/src/components/Footer.jsx @@ -1,3 +1,5 @@ +import { NavLink } from 'react-router-dom' + function Footer() { return (
@@ -6,23 +8,52 @@ function Footer() {

The Method's Moto

Make Every Task Happen, Own Destiny

-
+ -
+

The Team

-

Cole Saldanha

-

Daniel Hurtarte

-

Lien Jabujab

-

Sean San

-

Ved Patel

+ Cole Saldanha + Daniel Hurtarte + Lien Jabujab + Sean San + Ved Patel
-
+

Socials/Contacts

LinkedIn

Email

@@ -30,13 +61,13 @@ function Footer() {

Reddit

Discord

-
+

Extras

-

Pricing

-

About

-

Terms of Service

-

Privacy Policy

-

FAQs

+ isActive ? 'active-link' : undefined}>News + isActive ? 'active-link' : undefined}>Data + isActive ? 'active-link' : undefined}>Terms of Service + isActive ? 'active-link' : undefined}>Privacy Policy + isActive ? 'active-link' : undefined}>FAQs
- +
+ + {showThemeMenu && ( +
+ {themes.map(t => ( + + ))} +
+ )} +
diff --git a/frontend/src/pages/AboutPage.jsx b/frontend/src/pages/AboutPage.jsx index 48db944..4908aa7 100644 --- a/frontend/src/pages/AboutPage.jsx +++ b/frontend/src/pages/AboutPage.jsx @@ -1,6 +1,35 @@ function AboutPage() { return ( -
+
+
+ Go back home +

About The Method

+

Who

+

Made by a team of 2nd and 3rd year Computer Science students at UCI.

+

What

+

The Method is an all-in-one platform for anyone to take control of their job search and career development. We have 4 main features for users to utilize:

+
    +
  • #1) Resume Builder
  • +
  • #2) Interview Practice
  • +
  • #3) Job Search Tools
  • +
  • #4) Progress Tracking
  • +
+

When

+

Full version 1.0 releases around Spring 2026. The dates are still being finalized, but our team of 5 is working hard to make it this possible.

+

Where

+

Based in Irvine, California, United States

+

Why

+

Because job searching is hard and we want to make it easier for everyone. Creating and optimizing resumes is challenging so we built out templates that + can auto generate resumes based on the your input. We also wanted to provide a platform for users to practice their interview skills and get feedback on their + performance. We also wanted to provide a platform for users to connect with mentors and other professionals in their field. +

+

How

+

For the technical people interested we are using React + Vite, Python + FastAPI, PostgreSQL + SQLAlchemy, Docker, Git, and (WIP). + If you want to join our team please reach out to us (WIP). We are always looking for talented and passionate individuals to join our team. + We accept all forms of experience for different roles such as developer, designer, marketer, and more. We are a remote team so you can work + from anywhere in the world. We also have a flexible schedule so you can work on your own time. We are a fun and supportive team that values diversity and inclusion. +

+
); } diff --git a/frontend/src/pages/DataPage.jsx b/frontend/src/pages/DataPage.jsx new file mode 100644 index 0000000..7a823fa --- /dev/null +++ b/frontend/src/pages/DataPage.jsx @@ -0,0 +1,11 @@ +function Data() { + return ( +
+

Your Data

+

Manage your data and privacy settings.

+

Here you can view and manage the data we have collected about you, as well as adjust your privacy settings and preferences.

+
+ ); +} + +export default Data; \ No newline at end of file diff --git a/frontend/src/pages/FAQs.jsx b/frontend/src/pages/FAQs.jsx deleted file mode 100644 index e69de29..0000000 diff --git a/frontend/src/pages/FAQsPage.jsx b/frontend/src/pages/FAQsPage.jsx new file mode 100644 index 0000000..d529517 --- /dev/null +++ b/frontend/src/pages/FAQsPage.jsx @@ -0,0 +1,10 @@ +function FAQs() { + return ( +
+

Frequently Asked Questions (FAQs)

+

Find answers to common questions about The Method.

+
+ ); +} + +export default FAQs; \ No newline at end of file diff --git a/frontend/src/pages/NewsPage.jsx b/frontend/src/pages/NewsPage.jsx new file mode 100644 index 0000000..cb0495e --- /dev/null +++ b/frontend/src/pages/NewsPage.jsx @@ -0,0 +1,63 @@ +function News() { + const updates = [ + { + id: "idhere1", + title: "Title goes here", + caption: "Caption would go here", + body: "Example text of what this thing does.", + date: "March 10, 2026 @ 2:00 PM", + }, + { + id: "idhere2", + title: "Title goes here", + caption: "Caption would go here", + body: "Example text of what this thing does.", + date: "March 11, 2026 @ 3:00 PM", + }, + { + id: "idhere2", + title: "Title goes here", + caption: "Caption would go here", + body: "Example text of what this thing does.", + date: "March 11, 2026 @ 3:00 PM", + }, + { + id: "idhere2", + title: "Title goes here", + caption: "Caption would go here", + body: "Example text of what this thing does.", + date: "March 11, 2026 @ 3:00 PM", + }, + ]; + + return ( +
+

News

+

+ Latest updates about The Method, including features, improvements, and announcements. +

+ +
    + {updates.map((item) => ( +
  • +
    +
    +
    +

    {item.title}

    +

    {item.caption}

    +
    + +

    + +

    +
    +

    {item.body}

    +
    +
  • + ))} +
+
+ ); +} + +export default News; \ No newline at end of file diff --git a/frontend/src/pages/PricingPage.jsx b/frontend/src/pages/PricingPage.jsx index 0b996a7..a052e90 100644 --- a/frontend/src/pages/PricingPage.jsx +++ b/frontend/src/pages/PricingPage.jsx @@ -1,11 +1,16 @@ +import FreeIcon from "../assets/pricingFree.svg?react"; +import StudentIcon from "../assets/pricingStudent.svg?react"; +import PremiumIcon from "../assets/pricingPremium.svg?react"; + function PricingPage() { return (

Pricing Page

+

Free

-

Basic features for everyone

+

Essential features for all users

$0/month

    @@ -18,8 +23,9 @@ function PricingPage() {
+

Student

-

Discounted pricing for students

+

Discounts for students

$2.49/month

    @@ -32,9 +38,10 @@ function PricingPage() {
+

Premium

All features for professionals

-

$6.99/month

+

$5.49/month

  • Everything in free plan +
  • diff --git a/frontend/src/pages/PrivacyPolicyPage.jsx b/frontend/src/pages/PrivacyPolicyPage.jsx index e69de29..4878e87 100644 --- a/frontend/src/pages/PrivacyPolicyPage.jsx +++ b/frontend/src/pages/PrivacyPolicyPage.jsx @@ -0,0 +1,11 @@ +function PrivacyPolicy() { + return ( +
    +

    Privacy Policy

    +

    Learn about our privacy practices.

    +

    At The Method, we are committed to protecting your privacy. This privacy policy explains how we collect, use, and safeguard your information when you use our platform. Please read it carefully to understand our practices regarding your personal data.

    +
    + ); +} + +export default PrivacyPolicy; \ No newline at end of file diff --git a/frontend/src/pages/TermsOfServicePage.jsx b/frontend/src/pages/TermsOfServicePage.jsx index e69de29..271978c 100644 --- a/frontend/src/pages/TermsOfServicePage.jsx +++ b/frontend/src/pages/TermsOfServicePage.jsx @@ -0,0 +1,11 @@ +function TermsOfService() { + return ( +
    +

    Terms of Service

    +

    Read our terms of service.

    +

    By using The Method, you agree to our terms of service. Please read them carefully to understand your rights and responsibilities when using our platform.

    +
    + ); +} + +export default TermsOfService; \ No newline at end of file diff --git a/frontend/src/styles/about-page.css b/frontend/src/styles/about-page.css index 8b13789..1de68eb 100644 --- a/frontend/src/styles/about-page.css +++ b/frontend/src/styles/about-page.css @@ -1 +1,31 @@ +#about-page { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding: 8px; + width: 100%; +} +#about-page-content { + display: flex; + flex-direction: column; + justify-content: center; + width: 40%; +} + + #go-back-home { + all: unset; + padding: 0.6rem 1.2rem; + font-size: 1rem; + border-radius: 6px; + cursor: pointer; + background-color: var(--main-accent-color); + color: var(--text-color); + display: inline-block; + width: 125px; + height: 35px; + display: flex; + justify-content: center; + align-items: center; + } \ No newline at end of file diff --git a/frontend/src/styles/home-page.css b/frontend/src/styles/home-page.css index 8b9f670..03b6cab 100644 --- a/frontend/src/styles/home-page.css +++ b/frontend/src/styles/home-page.css @@ -398,6 +398,51 @@ background-color: var(--true-bg-color); } +#quick-links { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; +} + + #quick-links #home-quick-navlink { + margin-bottom: 16px; + } + +#team-section { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; +} + + #team-section a { + margin-bottom: 16px; + } + +#socials-section { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; +} + + #socials-section p { + margin: 0; + margin-bottom: 16px; + } + +#extras-section { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; +} + + #extras-section a { + margin-bottom: 16px; + } + #copyright { display: flex; flex-direction: row; diff --git a/frontend/src/styles/news-page.css b/frontend/src/styles/news-page.css new file mode 100644 index 0000000..f758738 --- /dev/null +++ b/frontend/src/styles/news-page.css @@ -0,0 +1,73 @@ +/* ...existing code... */ +.news-title { + text-align: center; + margin-bottom: 0.5rem; + color: var(--text-color); +} + +.news-intro { + text-align: center; + max-width: 65ch; + margin: 0 auto 1.5rem; + color: var(--text-color); +} + +.news-grid { + list-style: none; + padding: 0; + margin: 0; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 1rem; +} + +.news-grid > li { + width: 60%; + min-width: 280px; +} + +.news-card { + border: 1px solid var(--box-border-color); + border-radius: 12px; + padding: 1rem; + width: 100%; + background-color: var(--tinted-card-bg); + color: var(--text-color); +} + +.news-card:hover { + background-color: var(--card-bg-hover); +} + +.news-card header { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 1rem; +} + +.news-heading h2 { + margin: 0; + color: var(--text-color); +} + +.news-caption { + font-weight: 600; + color: var(--text-color); + margin: 0.25rem 0 0.5rem; +} + +.news-date { + margin: 0; + font-size: 0.875rem; + color: var(--text-color); + white-space: nowrap; + text-align: right; +} + +.news-card time { + color: var(--main-accent-color); +} +/* ...existing code... */ \ No newline at end of file diff --git a/frontend/src/styles/pricing-page.css b/frontend/src/styles/pricing-page.css index 5241b77..1e09f57 100644 --- a/frontend/src/styles/pricing-page.css +++ b/frontend/src/styles/pricing-page.css @@ -4,7 +4,7 @@ flex-direction: column; justify-content: center; align-items: center; - padding: 2rem; + align-items: stretch; } #pricing-page-h1 { @@ -14,26 +14,33 @@ } #pricing-tiers-subarea { - width: 50%; + width: 100%; display: flex; flex-direction: row; - justify-content: space-between; - align-items: center; + justify-content: center; + align-items: stretch; margin-top: 2rem; } + .pricing-icon { + width: 3rem; + height: 3rem; + fill: var(--main-accent-color); + } + #pricing-free-tier, #pricing-student-tier, #pricing-premium-tier { - width: 300px; - height: 100%; - background-color: var(--card-bg); - border: solid 2px var(--main-accent-color); - padding: 2rem; - border-radius: 8px; - margin: 1rem; + display: flex; + flex-direction: column; + width: 300px; + background-color: var(--card-bg); + border: solid 2px var(--main-accent-color); + padding: 2rem; + border-radius: 8px; + margin: 1rem; } #pricing-free-tier:hover, #pricing-student-tier:hover, #pricing-premium-tier:hover { - background-color: var(--main-accent-color); + background-color: var(--main-accent-color-activte); color: var(--tinted-bg-color); cursor: pointer; transition: background-color 0.3s ease, color 0.3s ease; diff --git a/frontend/src/styles/styles.css b/frontend/src/styles/styles.css index 5b020f9..ee21709 100644 --- a/frontend/src/styles/styles.css +++ b/frontend/src/styles/styles.css @@ -209,41 +209,103 @@ nav { font-size: 1.1rem; } - #light-dark-toggle { - display: flex; - align-items: center; - gap: 1rem; - font-size: 1.1rem; - } - - #light-dark-toggle button { + #log-in-sign-up button { all: unset; - padding: 0.6rem 1.2rem; + padding: 0.6rem 2rem; font-size: 1rem; border-radius: 6px; cursor: pointer; + text-align: center; background-color: var(--main-accent-color); color: var(--text-color); display: inline-block; } - #log-in-sign-up button { + #log-in-sign-up button:active { + transform: scale(0.95); + background-color: var(--main-accent-color-activte); + } + + /* Theme button */ + #light-dark-toggle .theme-selector-container > button { all: unset; - padding: 0.6rem 2rem; + padding: 0.6rem 1.2rem; font-size: 1rem; border-radius: 6px; cursor: pointer; - text-align: center; background-color: var(--main-accent-color); color: var(--text-color); display: inline-block; } - #log-in-sign-up button:active { - transform: scale(0.95); - background-color: var(--main-accent-color-activte); + .theme-selector-container { + position: relative; } + .theme-menu { + position: absolute; + top: 100%; + right: 0; + margin-top: 0.5rem; + background-color: var(--card-bg); + border: 1px solid var(--box-border-color); + border-radius: 0; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12); + min-width: 160px; + z-index: 1000; + overflow: hidden; + display: flex; + flex-direction: column; + animation: slideDown 0.2s ease-out; + } + + @keyframes slideDown { + from { + opacity: 0; + transform: translateY(-8px); + } + to { + opacity: 1; + transform: translateY(0); + } + } + + .theme-option { + all: unset; + display: block; + width: 100%; + padding: 0.85rem 1.2rem; + font-size: 0.95rem; + cursor: pointer; + background-color: var(--card-bg); + color: var(--text-color); + border: none; + text-align: left; + transition: all 0.15s ease; + font-weight: 500; + border-radius: 0; + } + + .theme-option:hover { + background-color: var(--card-bg-hover); + padding-left: 1.8rem; + } + + .theme-option.active { + background-color: var(--main-accent-color); + color: var(--text-color); + font-weight: 600; + } + + .theme-option:first-child { + border-radius: 0; + } + + .theme-option:last-child { + border-radius: 0; + } + + /* The Method Accent Color */ .method-word { color: var(--main-accent-color); diff --git a/frontend/vite.config.js b/frontend/vite.config.js index 8b0f57b..1955f3c 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -1,7 +1,11 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' +import svgr from 'vite-plugin-svgr' // Allows importing SVGs as React components(Gives better styling) // https://vite.dev/config/ export default defineConfig({ - plugins: [react()], -}) + plugins: [ + react(), + svgr() + ], +}) \ No newline at end of file