synops/docs/features/brukerinnstillinger.md
vegard 00bf5d27ce Arkitekturbeslutninger: noder er sentrum, edges definerer alt
Grunnleggende arkitekturbeslutninger tatt og dokumentert:

- Alt er noder (brukere, team, innhold, mediefiler, samlings-noder)
- Edges definerer hva en node er (freeform typer, metadata i JSONB)
- Materialisert tilgangsmatrise (node_access) erstatter workspace-RLS
- Visibility (hidden/discoverable/readable/open) på noder
- Aliaser via usynlige system-edges
- Maskinrommet eier all skriving (SpacetimeDB først, PG asynk)
- SpacetimeDB holder hele grafen, PG er persistent backup
- Node- og edge-skjema spesifisert (docs/primitiver/)

Fjernet workspace-konseptet fra hele dokumentasjonen (~40 filer).
Fem retninger besluttet, én åpen (rom, ikke forum).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 10:29:54 +01:00

172 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 | 1224px (slider) | Gjelder all tekst i appen |
| Linjehøyde | 1.6 | 1.42.0 (slider) | Avstand mellom linjer |
| Innholdsbredde | 70ch | 50chfull (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 | 500ms5s | 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