diff --git a/package.json b/package.json index c9452a8..9d933a6 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,11 @@ "format": "prettier --write ." }, "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.7.2", + "@fortawesome/free-brands-svg-icons": "^6.7.2", + "@fortawesome/free-regular-svg-icons": "^6.7.2", + "@fortawesome/free-solid-svg-icons": "^6.7.2", + "@fortawesome/react-fontawesome": "^0.2.2", "next": "15.3.2", "next-auth": "^5.0.0-beta.25", "react": "^19.0.0", diff --git a/src/app/globals.css b/src/app/globals.css index e3734be..6dae48f 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,12 +1,32 @@ :root { --background: #ffffff; - --foreground: #171717; + --foreground: #3a3a3a; + + --neutral: #808080; + + --primary-50: rgba(59, 130, 246, 0.5); + --primary-75: rgba(59, 130, 246, 0.75); + --primary-100: rgba(59, 130, 246, 1); + + --warning-50: rgba(245, 158, 11, 0.5); + --warning-75: rgba(245, 158, 11, 0.75); + --warning-100: rgba(245, 158, 11, 1); + + --success-50: rgba(22, 163, 74, 0.5); + --success-75: rgba(22, 163, 74, 0.75); + --success-100: rgba(22, 163, 74, 1); + + --danger-50: rgba(220, 38, 38, 0.5); + --danger-75: rgba(220, 38, 38, 0.75); + --danger-100: rgba(220, 38, 38, 1); + + --button-text-size: 18px; } @media (prefers-color-scheme: dark) { :root { --background: #0a0a0a; - --foreground: #ededed; + --foreground: #e5e7eb; } } diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index c3e261e..44e80c0 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -1,20 +1,18 @@ import { auth } from '@/auth'; -import SignIn from '@/components/user/signin-button'; -import { SignOut } from '@/components/user/signout-button'; +import Login from '@/components/user/login-button'; +import { redirect } from 'next/navigation'; -export default async function Login() { +export default async function LoginPage() { const session = await auth(); + + if (session?.user) { + redirect('/'); + } + return (

Login

- {!session?.user ? ( - - ) : ( - <> -

Hallo {session.user.name}

- - - )} +
); } diff --git a/src/components/Button.module.css b/src/components/Button.module.css new file mode 100644 index 0000000..85e67b6 --- /dev/null +++ b/src/components/Button.module.css @@ -0,0 +1,54 @@ +.button { + background-color: var(--color-50); + border-radius: 9999px; + padding: 10px 20px; + outline: none; + border: 2px solid var(--color-100); + transition: background-color 0.3s ease; + height: 50px; +} + +.button:hover { + background-color: var(--color-75); +} + +.button:active { + background-color: var(--color-100); +} + +.button span { + color: var(--foreground); + font-size: var(--button-text-size); + font-weight: 600; +} + +.icon { + display: grid; + grid-template-columns: 25px 1fr; + gap: 10px; + align-items: center; +} + +.style_primary { + --color-50: var(--primary-50); + --color-75: var(--primary-75); + --color-100: var(--primary-100); +} + +.style_warning { + --color-50: var(--warning-50); + --color-75: var(--warning-75); + --color-100: var(--warning-100); +} + +.style_success { + --color-50: var(--success-50); + --color-75: var(--success-75); + --color-100: var(--success-100); +} + +.style_danger { + --color-50: var(--danger-50); + --color-75: var(--danger-75); + --color-100: var(--danger-100); +} diff --git a/src/components/Button.tsx b/src/components/Button.tsx new file mode 100644 index 0000000..7fee3ff --- /dev/null +++ b/src/components/Button.tsx @@ -0,0 +1,39 @@ +import style from './Button.module.css'; + +import { IconProp } from '@fortawesome/fontawesome-svg-core'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; + +export default function Button({ + type, + children, + mode = 'primary', + icon, +}: { + type?: 'button' | 'submit' | 'reset'; + children?: React.ReactNode; + mode?: 'primary' | 'warning' | 'success' | 'danger'; + icon?: IconProp; +}) { + if (!icon) { + return ( + + ); + } else { + return ( + + ); + } +} diff --git a/src/components/user/login-button.tsx b/src/components/user/login-button.tsx new file mode 100644 index 0000000..e88891b --- /dev/null +++ b/src/components/user/login-button.tsx @@ -0,0 +1,24 @@ +import { signIn } from '@/auth'; +import Button from '../Button'; +import { faOpenid } from '@fortawesome/free-brands-svg-icons'; + +export default function Login({ + provider, + providerDisplayName, +}: { + provider: string; + providerDisplayName: string; +}) { + return ( +
{ + 'use server'; + await signIn(provider); + }} + > + +
+ ); +} diff --git a/src/components/user/signout-button.tsx b/src/components/user/logout-button.tsx similarity index 61% rename from src/components/user/signout-button.tsx rename to src/components/user/logout-button.tsx index 6bc4c98..2ce6c8b 100644 --- a/src/components/user/signout-button.tsx +++ b/src/components/user/logout-button.tsx @@ -1,6 +1,7 @@ import { signOut } from '@/auth'; +import Button from '../Button'; -export function SignOut() { +export function Logout() { return (
{ @@ -8,7 +9,7 @@ export function SignOut() { await signOut(); }} > - +
); } diff --git a/src/components/user/signin-button.tsx b/src/components/user/signin-button.tsx deleted file mode 100644 index 9e4dc55..0000000 --- a/src/components/user/signin-button.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { signIn } from '@/auth'; - -export default function SignIn() { - return ( -
{ - 'use server'; - await signIn('authentik'); - }} - > - -
- ); -} diff --git a/yarn.lock b/yarn.lock index 8d5a0fd..e0a6eb1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -103,6 +103,46 @@ "@eslint/core" "^0.13.0" levn "^0.4.1" +"@fortawesome/fontawesome-common-types@6.7.2": + version "6.7.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz#7123d74b0c1e726794aed1184795dbce12186470" + integrity sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg== + +"@fortawesome/fontawesome-svg-core@^6.7.2": + version "6.7.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz#0ac6013724d5cc327c1eb81335b91300a4fce2f2" + integrity sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA== + dependencies: + "@fortawesome/fontawesome-common-types" "6.7.2" + +"@fortawesome/free-brands-svg-icons@^6.7.2": + version "6.7.2" + resolved "https://registry.yarnpkg.com/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.7.2.tgz#4ebee8098f31da5446dda81edc344025eb59b27e" + integrity sha512-zu0evbcRTgjKfrr77/2XX+bU+kuGfjm0LbajJHVIgBWNIDzrhpRxiCPNT8DW5AdmSsq7Mcf9D1bH0aSeSUSM+Q== + dependencies: + "@fortawesome/fontawesome-common-types" "6.7.2" + +"@fortawesome/free-regular-svg-icons@^6.7.2": + version "6.7.2" + resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.7.2.tgz#f1651e55e6651a15589b0569516208f9c65f96db" + integrity sha512-7Z/ur0gvCMW8G93dXIQOkQqHo2M5HLhYrRVC0//fakJXxcF1VmMPsxnG6Ee8qEylA8b8Q3peQXWMNZ62lYF28g== + dependencies: + "@fortawesome/fontawesome-common-types" "6.7.2" + +"@fortawesome/free-solid-svg-icons@^6.7.2": + version "6.7.2" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.7.2.tgz#fe25883b5eb8464a82918599950d283c465b57f6" + integrity sha512-GsBrnOzU8uj0LECDfD5zomZJIjrPhIlWU82AHwa2s40FKH+kcxQaBvBo3Z4TxyZHIyX8XTDxsyA33/Vx9eFuQA== + dependencies: + "@fortawesome/fontawesome-common-types" "6.7.2" + +"@fortawesome/react-fontawesome@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.2.tgz#68b058f9132b46c8599875f6a636dad231af78d4" + integrity sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g== + dependencies: + prop-types "^15.8.1" + "@humanfs/core@^0.19.1": version "0.19.1" resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77"