diff --git a/package-lock.json b/package-lock.json index b5bf1f1..a856585 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@prisma/client": "^7.8.0", "bcryptjs": "^3.0.3", "jose": "^6.2.3", + "lucide-react": "^1.24.0", "next": "16.2.10", "pg": "^8.22.0", "prisma": "^7.8.0", @@ -6101,6 +6102,15 @@ "url": "https://github.com/sponsors/wellwelwel" } }, + "node_modules/lucide-react": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.24.0.tgz", + "integrity": "sha512-YT6mBD8lGKkg4nM39enlm94/sfJIiW0YKUT60fBy4YK8tai31ylg1VhGNWxkpSKHo9UagfnZqwIff3HTDQwXeA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", diff --git a/package.json b/package.json index 709b6ed..1c3be1d 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@prisma/client": "^7.8.0", "bcryptjs": "^3.0.3", "jose": "^6.2.3", + "lucide-react": "^1.24.0", "next": "16.2.10", "pg": "^8.22.0", "prisma": "^7.8.0", diff --git a/src/app/globals.css b/src/app/globals.css index a2dc41e..cf130a8 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,8 +1,8 @@ @import "tailwindcss"; :root { - --background: #ffffff; - --foreground: #171717; + --background: #f8fafc; + --foreground: #1e293b; } @theme inline { @@ -14,8 +14,8 @@ @media (prefers-color-scheme: dark) { :root { - --background: #0a0a0a; - --foreground: #ededed; + --background: #10131c; + --foreground: #e2e8f0; } } diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index a027974..86a0300 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -2,6 +2,7 @@ import { Suspense, useEffect, useState } from "react"; import { useRouter, useSearchParams } from "next/navigation"; +import { Lock, PiggyBank } from "lucide-react"; function LoginForm() { const router = useRouter(); @@ -59,9 +60,10 @@ function LoginForm() {
-

+

+ {passwordSet ? "FPT — Anmelden" : "FPT — Passwort festlegen"}

{!passwordSet && ( @@ -70,28 +72,34 @@ function LoginForm() { um den Zugriff auf Ihre Finanzplanung zu schuetzen.

)} - setPassword(e.target.value)} - className="w-full rounded-md border border-zinc-300 bg-white px-3 py-2 text-sm text-zinc-900 focus:border-zinc-500 focus:outline-none dark:border-zinc-600 dark:bg-zinc-950 dark:text-zinc-100" - /> - {!passwordSet && ( +
+ setPasswordConfirm(e.target.value)} - className="w-full rounded-md border border-zinc-300 bg-white px-3 py-2 text-sm text-zinc-900 focus:border-zinc-500 focus:outline-none dark:border-zinc-600 dark:bg-zinc-950 dark:text-zinc-100" + autoFocus + placeholder="Passwort" + value={password} + onChange={(e) => setPassword(e.target.value)} + className="w-full rounded-lg border border-zinc-300 bg-white py-2 pl-9 pr-3 text-sm text-zinc-900 shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-100" /> +
+ {!passwordSet && ( +
+ + setPasswordConfirm(e.target.value)} + className="w-full rounded-lg border border-zinc-300 bg-white py-2 pl-9 pr-3 text-sm text-zinc-900 shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-100" + /> +
)} {error &&

{error}

} diff --git a/src/components/AppShell.tsx b/src/components/AppShell.tsx index 42548bf..229565a 100644 --- a/src/components/AppShell.tsx +++ b/src/components/AppShell.tsx @@ -1,6 +1,7 @@ "use client"; import { useCallback, useEffect, useState } from "react"; +import { LogOut, PiggyBank, Plus, Settings, X } from "lucide-react"; import { PhaseCard } from "@/components/PhaseCard"; import { TransitionPanel } from "@/components/TransitionPanel"; import { Dashboard } from "@/components/Dashboard"; @@ -91,15 +92,17 @@ export function AppShell({ initialHousehold }: { initialHousehold: HouseholdInpu return (
-

+

+ Financial Planning Tool

@@ -124,15 +128,15 @@ export function AppShell({ initialHousehold }: { initialHousehold: HouseholdInpu )} {/* Tab-Leiste */} -
+
{plans.map((p) => (
)}
@@ -154,9 +158,10 @@ export function AppShell({ initialHousehold }: { initialHousehold: HouseholdInpu {showNewPlan && ( setShowScenario((v) => !v)} - className="rounded-md px-2 py-1.5 text-sm text-zinc-500 hover:bg-zinc-100 dark:hover:bg-zinc-800" + className="flex items-center gap-1 rounded-lg px-2 py-1.5 text-sm text-indigo-600 hover:bg-indigo-50 dark:text-indigo-400 dark:hover:bg-indigo-500/10" > - + Szenario + + Szenario {showScenario && ( - + Phase hinzufuegen + + Phase hinzufuegen {detail.plan.phases.length > 0 && ( @@ -252,9 +259,9 @@ export function AppShell({ initialHousehold }: { initialHousehold: HouseholdInpu function NewPlanPopover({ onCreate, onClose }: { onCreate: (name: string) => void; onClose: () => void }) { const [name, setName] = useState("Basisplan"); return ( -
+
setName(e.target.value)} placeholder="Name des Plans" @@ -263,11 +270,11 @@ function NewPlanPopover({ onCreate, onClose }: { onCreate: (name: string) => voi -
@@ -287,16 +294,16 @@ function ScenarioPopover({ const [name, setName] = useState("Neues Szenario"); const [branchFromPhaseId, setBranchFromPhaseId] = useState(phases[phases.length - 1]?.id ?? ""); return ( -
+
setName(e.target.value)} placeholder="Name des Szenarios" /> setItems((prev) => @@ -218,7 +220,7 @@ export function TransitionPanel({ {it.positionType === "REAL_ESTATE" && it.decision === "SELL" ? ( setItems((prev) => @@ -234,7 +236,7 @@ export function TransitionPanel({ ))} -
+
Verfuegbares Startkapital fuer neue Phase (aus Verkaeufen): {formatChf(totalAvailableCapital)} CHF

Wird beim Speichern automatisch in "{nextPhaseName}" als verfuegbares Startkapital hinterlegt. @@ -248,11 +250,15 @@ export function TransitionPanel({ type="button" disabled={saving} onClick={handleSave} - className="self-start rounded-md bg-zinc-900 px-3 py-1.5 text-xs font-medium text-white hover:bg-zinc-700 disabled:opacity-50 dark:bg-zinc-100 dark:text-zinc-900" + className="self-start rounded-lg bg-indigo-600 px-3 py-1.5 text-xs font-medium text-white shadow-sm hover:bg-indigo-500 disabled:opacity-50 dark:bg-indigo-500 dark:hover:bg-indigo-400" > {saving ? "Speichern..." : "Uebergang speichern"} - {saved && Gespeichert.} + {saved && ( + + Gespeichert. + + )}

);