diff --git a/README.md b/README.md
index a9fef24..1f8fab4 100644
--- a/README.md
+++ b/README.md
@@ -30,7 +30,7 @@ product, niet als medisch hulpmiddel. Release 1 blijft smal:
- niet-blokkerende waarschuwing bij budgetoverschrijding in planning en dashboard
- eerste unit tests voor budget- en meterlogica via `Vitest`
- korte onboardingflow voor eerste voorkeuren
-- instellingen voor taal, timezone, reminders en zichtbaarheid van energiepunten
+- instellingen voor profieltekst, avatar, taal, timezone, reminders en zichtbaarheid van energiepunten
- `shadcn/ui` foundation voor knoppen, formulieren, kaarten en meldingen
- `Dusk`-theme met dark-mode prioriteit, semantische oppervlakken en verbeterde focus-/toegankelijkheidsstijlen
@@ -87,6 +87,7 @@ De huidige app gebruikt onder meer deze migraties:
- `supabase/migrations/20260418_create_morning_check_ins.sql`
- `supabase/migrations/20260418_add_budget_fields_to_morning_check_ins.sql`
- `supabase/migrations/20260419_create_activities_and_reference_data.sql`
+- `supabase/migrations/20260419_add_profile_details_and_avatar_storage.sql`
Voer deze SQL uit in de Supabase SQL Editor of via de Supabase CLI voordat je
de profile-, check-in- en budgetlagen lokaal test.
@@ -122,7 +123,7 @@ zichtbaar als `NEXT_PUBLIC_ENABLE_TEST_WIZARD=true` staat.
## CI/CD
-- `CI`: GitHub Actions draait automatisch `lint` en `build` op pull requests en op `main`
+- `CI`: GitHub Actions draait automatisch `lint`, `test` en `build` op pull requests en op `main`
- `CD`: Vercel deployt automatisch previews voor branches/PR's en productie vanaf `main`
- Uitwerking: [docs/inspannings-monitor-cicd-en-deploy.md](/Users/janpetervisser/Development/third/docs/inspannings-monitor-cicd-en-deploy.md)
diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx
index c1a641c..ced66d8 100644
--- a/app/dashboard/page.tsx
+++ b/app/dashboard/page.tsx
@@ -5,6 +5,7 @@ import { StatusToastBridge } from "@/components/feedback/status-toast-bridge";
import { AppShell } from "@/components/navigation/app-shell";
import { PageIntro } from "@/components/navigation/page-intro";
import { EnergyMeterCard } from "@/components/planning/energy-meter-card";
+import { ProfileAvatar } from "@/components/profile/profile-avatar";
import {
Card,
CardContent,
@@ -116,13 +117,31 @@ export default async function DashboardPage({ searchParams }: DashboardPageProps
+ );
+}
diff --git a/components/settings/settings-form.tsx b/components/settings/settings-form.tsx
index 2f33b5a..44a1721 100644
--- a/components/settings/settings-form.tsx
+++ b/components/settings/settings-form.tsx
@@ -3,6 +3,7 @@
import { useActionState, useState } from "react";
import { saveSettingsAction } from "@/app/settings/actions";
import { PreferenceHiddenFields } from "@/components/preferences/preference-hidden-fields";
+import { ProfileAvatar } from "@/components/profile/profile-avatar";
import { Alert, AlertDescription } from "@/components/ui/alert";
import { Button } from "@/components/ui/button";
import {
@@ -23,7 +24,9 @@ import {
} from "@/components/ui/select";
import { Separator } from "@/components/ui/separator";
import { Switch } from "@/components/ui/switch";
+import { Textarea } from "@/components/ui/textarea";
import { ONBOARDING_TIMEZONE_OPTIONS } from "@/lib/onboarding/options";
+import { PROFILE_AVATAR_MAX_BYTES } from "@/lib/profile/avatar";
import { usePreferenceDraft } from "@/lib/preferences/use-preferences-draft";
import type { ProfileBundle } from "@/lib/profile/types";
@@ -42,9 +45,19 @@ export function SettingsForm({ profileBundle }: SettingsFormProps) {
const [, formAction, isPending] = useActionState(saveSettingsAction, null);
const [locale, setLocale] = useState(profileBundle.profile.locale);
const { draft, updateDraft } = usePreferenceDraft(profileBundle);
+ const avatarLimitInMb = PROFILE_AVATAR_MAX_BYTES / (1024 * 1024);
+ const profileTitle =
+ profileBundle.profile.displayName ??
+ profileBundle.profile.email ??
+ "Ingelogde gebruiker";
return (
-
+
+
+
+ Profiel
+
+
+ Laat in een paar regels zien wie je bent
+
+
+ Voeg een naam, korte profielregel, langere beschrijving en een profielfoto toe.
+ Dit helpt straks ook bij demo-accounts en voorbeeldgebruik.
+
+
+
+
+
+
+
+
{profileTitle}
+
+ {profileBundle.profile.tagline ?? "Nog geen 1-regelige introductie toegevoegd."}
+
+
+
+
+
+
+
+ JPG, PNG of WebP tot {avatarLimitInMb} MB. Een nieuw bestand vervangt je
+ huidige foto.
+