# Feature: Brukerinnstillinger
**Filsti:** `docs/features/brukerinnstillinger.md`

## 1. Konsept
Hver bruker har personlige innstillinger som styrer hvordan appen ser ut og oppfører seg. Innstillingene påvirker kun visning og opplevelse — aldri innholdet. Tilgjengelig via et innstillingspanel i appen.

## 2. Innstillinger

### 2.1 Utseende

| Innstilling | Default | Alternativer | Beskrivelse |
|---|---|---|---|
| Tema | System | Lys / Mørk / System | Følger OS-preferanse som default |
| Skriftstørrelse | 16px | 12–24px (slider) | Gjelder all tekst i appen |
| Linjehøyde | 1.6 | 1.4–2.0 (slider) | Avstand mellom linjer |
| Innholdsbredde | 70ch | 50ch–full (slider eller presets) | Maks bredde på tekstinnhold |
| Font | System default | Serif / Sans-serif / Monospace | Brødtekst-font i appen |
| Redusert bevegelse | System | Av / På / System | Respekterer `prefers-reduced-motion` |
| Kompakt modus | Av | Av / På | Mindre padding, tettere layout |

### 2.2 Editor

| Innstilling | Default | Alternativer | Beskrivelse |
|---|---|---|---|
| Standard visning | Rendered | Raw / Rendered | Foretrukket editor-modus |
| Stavekontroll | På | Av / På | Nettleserens innebygde stavekontroll |
| Auto-save intervall | 500ms | 500ms–5s | Debounce for auto-save |
| Vis tegnteller | Av | Av / På | Antall tegn/ord i bunn av editor |

### 2.3 Notifikasjoner (fremtidig)

| Innstilling | Default | Alternativer | Beskrivelse |
|---|---|---|---|
| Desktop-varsler | Av | Av / På | Push-notifikasjoner i nettleseren |
| Lyd | Av | Av / På | Lydvarsling ved nye meldinger |
| Varsle ved mention | På | Av / På | Varsle når noen `#`-mentioner noe du følger |

### 2.4 Tilgjengelighet

| Innstilling | Default | Alternativer | Beskrivelse |
|---|---|---|---|
| Høy kontrast | Av | Av / På | Sterkere fargekontraster |
| Fokus-synlighet | System | System / Forsterket | Tydeligere fokus-indikatorer |

## 3. Datamodell

Innstillingene lagres i en JSONB-kolonne på `users`-tabellen:

```sql
ALTER TABLE users ADD COLUMN settings JSONB NOT NULL DEFAULT '{}';
```

Eksempel:
```json
{
  "theme": "dark",
  "font_size": 18,
  "line_height": 1.7,
  "content_width": "80ch",
  "font_family": "serif",
  "reduced_motion": "system",
  "compact_mode": false,
  "editor_default_view": "raw",
  "spellcheck": true,
  "autosave_ms": 500,
  "show_char_count": true
}
```

**Hvorfor `users.settings` og ikke en egen tabell?**
- Innstillingene er per bruker, ikke per samlings-node
- JSONB er fleksibelt — nye innstillinger legges til uten migrering
- Ingen relasjoner, ingen spørringer mot enkeltfelt — bare hent hele objektet

**Samlings-node-spesifikke overrides** kan legges som edges med metadata mellom bruker og samlings-node ved behov.
Men dette er fase 2. Start med globale brukerinnstillinger.

## 4. Frontend

### 4.1 Innstillingspanel
Tilgjengelig via brukermenyen (avatar → "Innstillinger") eller hurtigtast.

```
┌─────────────────────────────────────┐
│ Innstillinger                    ✕  │
├─────────────────────────────────────┤
│                                     │
│ Utseende                            │
│ ┌─────────────────────────────────┐ │
│ │ Tema        [Lys] [Mørk] [Auto]│ │
│ │ Skrift      ──●────────── 18px │ │
│ │ Linjehøyde  ────●──────── 1.7  │ │
│ │ Bredde      ──────●────── 70ch │ │
│ │ Font        [Sans] [Serif] [Mono]│
│ └─────────────────────────────────┘ │
│                                     │
│ Editor                              │
│ ┌─────────────────────────────────┐ │
│ │ Standard    [Raw] [Rendered]    │ │
│ │ Stavekontroll        [●]       │ │
│ │ Tegnteller           [ ]       │ │
│ └─────────────────────────────────┘ │
│                                     │
│ Live forhåndsvisning:               │
│ ┌─────────────────────────────────┐ │
│ │ Dette er en prøvetekst som      │ │
│ │ viser hvordan innstillingene    │ │
│ │ påvirker visningen.             │ │
│ └─────────────────────────────────┘ │
│                                     │
│              [Tilbakestill default]  │
└─────────────────────────────────────┘
```

Endringer appliseres øyeblikkelig (live preview). Ingen "lagre"-knapp — auto-save med debounce.

### 4.2 CSS Custom Properties

Innstillingene appliseres via CSS custom properties på `:root`:

```css
:root {
  --user-font-size: 16px;
  --user-line-height: 1.6;
  --user-content-width: 70ch;
  --user-font-family: system-ui, sans-serif;
}
```

Alle komponenter bruker disse variablene i stedet for hardkodede verdier:

```css
.message-body {
  font-size: var(--user-font-size);
  line-height: var(--user-line-height);
  max-width: var(--user-content-width);
}
```

### 4.3 Svelte Store

```typescript
// $lib/stores/userSettings.ts
export const userSettings = writable<UserSettings>(defaults);

// Ved innlogging: hent fra API
// Ved endring: debounce → PATCH /api/user/settings
// CSS variables oppdateres reaktivt
```

## 5. API

| Metode | Sti | Beskrivelse |
|---|---|---|
| GET | `/api/user/settings` | Hent brukerens innstillinger |
| PATCH | `/api/user/settings` | Oppdater innstillinger (merge med eksisterende) |

PATCH gjør en shallow merge: `settings = settings || patch`. Kun oppgitte felt endres.

## 6. Viktige prinsipper

- **Innstillinger påvirker aldri innhold.** En bruker med 24px skrift og en bruker med 12px skrift ser identisk innhold. Publiserte artikler for eksterne lesere bruker typografi-stacken fra artikkel-publisering, ikke forfatterens personlige innstillinger.
- **Defaults er gode.** En bruker som aldri åpner innstillingspanelet skal ha en god opplevelse. Innstillinger er for tilpasning, ikke for at ting skal fungere.
- **Ingen overraskelser.** Endringer gjelder kun brukeren som gjør dem. Workspace-admin kan ikke overstyre personlige innstillinger.
- **Progressiv avsløring.** Start med de viktigste innstillingene (tema, skriftstørrelse). Legg til flere etter hvert som behov oppstår.

## 7. Instruks for Claude Code
- Innstillinger lagres i `users.settings` JSONB — hent hele objektet, merge ved oppdatering
- Bruk CSS custom properties for all visuell tilpasning — aldri hardkodede verdier i komponenter
- Innstillingspanelet er en modal/drawer, ikke en egen side
- Auto-save med debounce (500ms) — ingen "lagre"-knapp
- Ved nye innstillinger: legg til i defaults-objektet, ingen migrering nødvendig
