diff --git a/web/src/pages/HomePage.module.css b/web/src/pages/HomePage.module.css new file mode 100644 index 0000000..fdb1c2a --- /dev/null +++ b/web/src/pages/HomePage.module.css @@ -0,0 +1,83 @@ +.container { + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + background-color: #f5f5f5; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; +} + +.card { + background-color: #fff; + padding: 2.5rem; + border-radius: 8px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + text-align: center; +} + +.heading { + margin: 0 0 0.5rem; +} + +.welcomeText { + color: #666; + margin-bottom: 1.5rem; +} + +.signedInText { + margin-bottom: 0.5rem; +} + +.emailStrong { + font-weight: 600; +} + +.logoutButton { + padding: 0.5rem 1.25rem; + background-color: #b91c1c; + color: #fff; + border: none; + border-radius: 6px; + font-size: 0.9rem; + cursor: pointer; +} + +.logoutButton:hover { + background-color: #991616; +} + +.authLinks { + display: flex; + gap: 0.75rem; + justify-content: center; +} + +.signInLink { + padding: 0.5rem 1.25rem; + background-color: #1a73e8; + color: #fff; + text-decoration: none; + border-radius: 6px; + font-size: 0.9rem; + display: inline-block; +} + +.signInLink:hover { + background-color: #1557b0; +} + +.registerLink { + padding: 0.5rem 1.25rem; + background-color: #fff; + color: #1a73e8; + text-decoration: none; + border: 1px solid #1a73e8; + border-radius: 6px; + font-size: 0.9rem; + display: inline-block; +} + +.registerLink:hover { + background-color: #f0f5ff; +} \ No newline at end of file diff --git a/web/src/pages/HomePage.tsx b/web/src/pages/HomePage.tsx index b4619cf..c0937e5 100644 --- a/web/src/pages/HomePage.tsx +++ b/web/src/pages/HomePage.tsx @@ -1,83 +1,36 @@ import { Link } from "react-router-dom"; import { useAuth } from "../contexts/AuthContext"; +import styles from "./HomePage.module.css"; export default function HomePage() { const { state, logout } = useAuth(); return ( -
-
-

Job Tracker

-

+

+
+

Job Tracker

+

Welcome to the Job Tracker application.

{state.isAuthenticated && state.user ? (
-

- Signed in as {state.user.email} +

+ Signed in as{" "} + + {state.user.email} +

-
) : ( -
- +
+ Sign In - + Register
diff --git a/web/src/pages/LoginPage.module.css b/web/src/pages/LoginPage.module.css new file mode 100644 index 0000000..98f1c5a --- /dev/null +++ b/web/src/pages/LoginPage.module.css @@ -0,0 +1,114 @@ +.container { + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + background-color: #f5f5f5; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; +} + +.card { + background-color: #fff; + padding: 2rem; + border-radius: 8px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + width: 100%; + max-width: 400px; +} + +.title { + margin: 0 0 0.25rem; + font-size: 1.5rem; + font-weight: 600; +} + +.subtitle { + margin: 0 0 1.5rem; + color: #666; + font-size: 0.9rem; +} + +.form { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.field { + display: flex; + flex-direction: column; + gap: 0.35rem; +} + +.label { + font-size: 0.85rem; + font-weight: 500; + color: #333; +} + +.input { + padding: 0.6rem 0.75rem; + border: 1px solid #ccc; + border-radius: 6px; + font-size: 0.95rem; + outline: none; + transition: border-color 0.15s; +} + +.input:focus { + border-color: #1a73e8; +} + +.button { + padding: 0.65rem; + background-color: #1a73e8; + color: #fff; + border: none; + border-radius: 6px; + font-size: 1rem; + font-weight: 500; + cursor: pointer; + margin-top: 0.5rem; +} + +.button:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.error { + background-color: #fef2f2; + color: #b91c1c; + border: 1px solid #fecaca; + border-radius: 6px; + padding: 0.5rem 0.75rem; + font-size: 0.85rem; + margin-bottom: 0.5rem; +} + +.success { + background-color: #f0fdf4; + color: #166534; + border: 1px solid #bbf7d0; + border-radius: 6px; + padding: 0.5rem 0.75rem; + font-size: 0.85rem; + margin-bottom: 0.5rem; +} + +.footer { + margin-top: 1.25rem; + text-align: center; + font-size: 0.85rem; + color: #666; +} + +.link { + color: #1a73e8; + text-decoration: none; + font-weight: 500; +} + +.link:hover { + text-decoration: underline; +} \ No newline at end of file diff --git a/web/src/pages/LoginPage.tsx b/web/src/pages/LoginPage.tsx index dbd115a..bfe579d 100644 --- a/web/src/pages/LoginPage.tsx +++ b/web/src/pages/LoginPage.tsx @@ -1,6 +1,7 @@ import { useState, type FormEvent, type ChangeEvent } from "react"; import { useNavigate, useLocation, Link } from "react-router-dom"; import { useAuth } from "../contexts/AuthContext"; +import styles from "./LoginPage.module.css"; export default function LoginPage() { const navigate = useNavigate(); @@ -33,17 +34,17 @@ export default function LoginPage() { }; return ( -
-
-

Sign In

-

Welcome back to Job Tracker

+
+
+

Sign In

+

Welcome back to Job Tracker

- {state.error &&
{state.error}
} - {successMessage &&
{successMessage}
} + {state.error &&
{state.error}
} + {successMessage &&
{successMessage}
} -
-
-
); -} - -const styles: Record = { - container: { - minHeight: "100vh", - display: "flex", - alignItems: "center", - justifyContent: "center", - backgroundColor: "#f5f5f5", - fontFamily: - '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif', - }, - card: { - backgroundColor: "#fff", - padding: "2rem", - borderRadius: "8px", - boxShadow: "0 2px 8px rgba(0,0,0,0.1)", - width: "100%", - maxWidth: "400px", - }, - title: { - margin: "0 0 0.25rem", - fontSize: "1.5rem", - fontWeight: 600, - }, - subtitle: { - margin: "0 0 1.5rem", - color: "#666", - fontSize: "0.9rem", - }, - form: { - display: "flex", - flexDirection: "column", - gap: "1rem", - }, - field: { - display: "flex", - flexDirection: "column", - gap: "0.35rem", - }, - label: { - fontSize: "0.85rem", - fontWeight: 500, - color: "#333", - }, - input: { - padding: "0.6rem 0.75rem", - border: "1px solid #ccc", - borderRadius: "6px", - fontSize: "0.95rem", - outline: "none", - transition: "border-color 0.15s", - }, - button: { - padding: "0.65rem", - backgroundColor: "#1a73e8", - color: "#fff", - border: "none", - borderRadius: "6px", - fontSize: "1rem", - fontWeight: 500, - cursor: "pointer", - marginTop: "0.5rem", - }, - buttonDisabled: { - opacity: 0.6, - cursor: "not-allowed", - }, - error: { - backgroundColor: "#fef2f2", - color: "#b91c1c", - border: "1px solid #fecaca", - borderRadius: "6px", - padding: "0.5rem 0.75rem", - fontSize: "0.85rem", - marginBottom: "0.5rem", - }, - success: { - backgroundColor: "#f0fdf4", - color: "#166534", - border: "1px solid #bbf7d0", - borderRadius: "6px", - padding: "0.5rem 0.75rem", - fontSize: "0.85rem", - marginBottom: "0.5rem", - }, - footer: { - marginTop: "1.25rem", - textAlign: "center", - fontSize: "0.85rem", - color: "#666", - }, - link: { - color: "#1a73e8", - textDecoration: "none", - fontWeight: 500, - }, -}; \ No newline at end of file +} \ No newline at end of file diff --git a/web/src/pages/RegisterPage.module.css b/web/src/pages/RegisterPage.module.css new file mode 100644 index 0000000..16c42ca --- /dev/null +++ b/web/src/pages/RegisterPage.module.css @@ -0,0 +1,120 @@ +.container { + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; + background-color: #f5f5f5; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; +} + +.card { + background-color: #fff; + padding: 2rem; + border-radius: 8px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + width: 100%; + max-width: 440px; +} + +.title { + margin: 0 0 0.25rem; + font-size: 1.5rem; + font-weight: 600; +} + +.subtitle { + margin: 0 0 1.5rem; + color: #666; + font-size: 0.9rem; +} + +.form { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.row { + display: flex; + gap: 0.75rem; +} + +.field { + display: flex; + flex-direction: column; + gap: 0.35rem; +} + +.halfField { + display: flex; + flex-direction: column; + gap: 0.35rem; + flex: 1; +} + +.label { + font-size: 0.85rem; + font-weight: 500; + color: #333; +} + +.required { + color: #b91c1c; +} + +.input { + padding: 0.6rem 0.75rem; + border: 1px solid #ccc; + border-radius: 6px; + font-size: 0.95rem; + outline: none; + transition: border-color 0.15s; +} + +.input:focus { + border-color: #1a73e8; +} + +.button { + padding: 0.65rem; + background-color: #1a73e8; + color: #fff; + border: none; + border-radius: 6px; + font-size: 1rem; + font-weight: 500; + cursor: pointer; + margin-top: 0.5rem; +} + +.button:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.error { + background-color: #fef2f2; + color: #b91c1c; + border: 1px solid #fecaca; + border-radius: 6px; + padding: 0.5rem 0.75rem; + font-size: 0.85rem; + margin-bottom: 0.5rem; +} + +.footer { + margin-top: 1.25rem; + text-align: center; + font-size: 0.85rem; + color: #666; +} + +.link { + color: #1a73e8; + text-decoration: none; + font-weight: 500; +} + +.link:hover { + text-decoration: underline; +} \ No newline at end of file diff --git a/web/src/pages/RegisterPage.tsx b/web/src/pages/RegisterPage.tsx index 97830bd..dc8c559 100644 --- a/web/src/pages/RegisterPage.tsx +++ b/web/src/pages/RegisterPage.tsx @@ -1,6 +1,7 @@ import { useState, type FormEvent, type ChangeEvent } from "react"; import { useNavigate, Link } from "react-router-dom"; import { useAuth } from "../contexts/AuthContext"; +import styles from "./RegisterPage.module.css"; export default function RegisterPage() { const navigate = useNavigate(); @@ -32,17 +33,17 @@ export default function RegisterPage() { }; return ( -
-
-

Create Account

-

Get started with Job Tracker

+
+
+

Create Account

+

Get started with Job Tracker

- {state.error &&
{state.error}
} + {state.error &&
{state.error}
} -
-
-
-