Fjern gjenværende v2-referanser, dokumenter editor og tekstlagring

Rydder opp siste «v2»-referanser i docs (status_quo, migration_safety,
personlig_workspace, spacetimedb_integrasjon). Legger til editor-seksjon
i universell_input.md (TipTap, presets, tekstlagring) og oppdaterer
nodes.md med content/metadata.document-modellen.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
vegard 2026-03-17 10:55:39 +01:00
parent 00bf5d27ce
commit c1d3ad66a5
7 changed files with 8947 additions and 12 deletions

View file

@ -150,7 +150,7 @@ PG-polling adapter (`pg.svelte.ts`) brukes kun når SpacetimeDB ikke er konfigur
## 8. Reducer-parameternavn — unngå underscore-prefix
> *Kodeeksemplene i denne seksjonen er fra v1 og bruker `workspace_id`-parametere.
> I v2 er workspace-modellen erstattet av noder og edges (se `docs/retninger/bruker_ikke_workspace.md`),
> Workspace-modellen er erstattet av noder og edges (se `docs/retninger/bruker_ikke_workspace.md`),
> men lærdommen om underscore-prefix gjelder generelt for alle SpacetimeDB-reducere.*
SpacetimeDB eksponerer Rust-parameternavn direkte i HTTP JSON API-et. Underscore-prefix (`_workspace_id`) blir til `_workspace_id` i JSON, ikke `workspace_id`:

View file

@ -62,27 +62,37 @@ navnet på en podcast.
- Chatmelding: `NULL` (har sjelden tittel)
### `content`
Primært tekstinnhold. Det du leser, søker i, viser i detalj.
Blogginnhold, chatmeldinger, transkripsjoner.
Ren tekst uten formatering. Brukes til fulltekstsøk og enkel
visning. For rike dokumenter (formatert tekst med bilder) genereres
`content` automatisk fra `metadata.document` ved lagring.
- Bloggpost: hele artikkelen
- Bloggpost: teksten uten markup (generert fra `metadata.document`)
- Chatmelding: `'Hei, er du klar?'`
- Voice memo: `NULL` ved opprettelse, fylles etter transkribering
- Brukernode: `NULL`
- CAS-node: `NULL` (binærdata lever på disk)
For formatert innhold: se `metadata.document` under metadata.
### `visibility`
Default synlighet for alle uten eksplisitt edge.
Se [noder er sentrum](../retninger/bruker_ikke_workspace.md)
for full spesifikasjon av visibility-nivåer og traverseringsregelen.
### `metadata`
JSONB for alt typespesifikt som ikke er tittel eller tekstinnhold:
JSONB for alt typespesifikt som ikke er tittel eller ren tekst:
- Person: `{ "display_name": "Vegard", "preferences": { ... } }`
- CAS-node: `{ "cas_hash": "abc123", "mime": "audio/mp3", "size_bytes": 84000000 }`
- Kommunikasjonsnode: `{ "started_at": "...", "ended_at": "..." }`
- Samlings-node: `{ "pruning_profile": "conservative", "theme": "dark" }`
- Rikt dokument: `{ "document": { "type": "doc", "content": [...] } }`
`metadata.document` inneholder TipTap/ProseMirror JSON for formatert
innhold (overskrifter, bilder, blockquotes, etc.). Bilder refererer
til CAS-noder via `node_id`. For enkle meldinger (ren tekst) er
`document` null — `content` er alt som trengs. Se
[universell input](../retninger/universell_input.md) for detaljer.
### `created_at`
Tidsstempel, automatisk.

View file

@ -1,8 +1,8 @@
# Forslag: Personlig workspace
> **Superseded (v2):** Dette forslaget er erstattet av retningen
> **Superseded:** Dette forslaget er erstattet av retningen
> "noder er sentrum" (se `docs/retninger/bruker_ikke_workspace.md`).
> I v2 finnes det ingen workspaces. Privat rom oppstår naturlig:
> Det finnes ingen workspaces. Privat rom oppstår naturlig:
> noder uten edges til andre brukere er ditt private rom. Personlig
> kanban, kalender og notater er bare noder du eier uten delte edges.
> Dokumentet er bevart som historisk referanse.

View file

@ -2,8 +2,8 @@
> **Historisk dokument (v1).** Denne teksten beskriver tilstanden i v1 —
> workspace-basert arkitektur, CRUD-mønster, fragmentert navigasjon.
> Den er bevart som referanse for å forstå utgangspunktet for v2-retningene
> i `docs/retninger/`.
> Den er bevart som referanse for å forstå utgangspunktet for de vedtatte
> retningene i `docs/retninger/`.
> En redaksjonell webapp med ambisiøse primitiver og tradisjonell overflate.

View file

@ -46,6 +46,80 @@ All UX-investering konsentreres ett sted. Én perfekt input-opplevelse
— responsiv, multimodal, med god AI-støtte — i stedet for ti
middelmådige spesialgrensesnitt.
## Editoren
Input-komponenten er en TipTap-editor (ProseMirror-basert) som
konfigureres med ulike extensions basert på kontekst.
### Kontekst setter default, brukeren bestemmer
Konteksten (kommunikasjonsnoden du er i, visningen du bruker)
setter en *default* editor-konfigurasjon. Men brukeren kan alltid
overstyre — utvide til full editor eller forenkle. Ingen kunstig
grense mellom "chatmelding" og "artikkel."
Du *kan* skrive en gjennomformatert tekst med overskrifter, bilder
og blockquotes i chatten. Om du vil publisere den etterpå er det
bare å legge til en publiserings-edge. Innholdet er det samme.
Editoren husker brukerens valg per kontekst via preferanser på
brukernoden.
### Presets
| Kontekst | Default extensions | Eksempel |
|----------|-------------------|----------|
| Chat | Tekst, markdown, kodeblokker, lenker | Enkel melding |
| Artikkel/blogg | + overskrifter, bilder, embeds, blockquotes, tabeller | Publisert tekst |
| Show notes | + lister, tidskoder, lenker | Episodenotater |
| Kanban-kort | Tekst, sjekklister | Oppgavebeskrivelse |
Presets er bare default — brukeren kan utvide eller forenkle med
en knapp eller tastatursnarvei. Ikke en modebytte, bare at flere
verktøy blir tilgjengelig.
### Tekstlagring
Noden lagrer to representasjoner:
- `content TEXT` — ren tekst uten formatering, for fulltekstsøk
og enkel visning
- `metadata.document JSONB` — strukturert TipTap/ProseMirror-
dokument for rendering
```json
{
"type": "doc",
"content": [
{ "type": "paragraph", "content": [
{ "type": "text", "text": "Her er en intro." }
]},
{ "type": "image", "attrs": {
"node_id": "uuid-av-cas-node", "alt": "Diagram"
}},
{ "type": "paragraph", "content": [
{ "type": "text", "text": "Teksten fortsetter." }
]}
]
}
```
`content` genereres automatisk fra dokumentet ved lagring — bare
teksten, uten markup. Editoren produserer begge.
For enkle meldinger (ren tekst uten formatering) er
`metadata.document` null — `content` er alt som trengs.
### Bilder og media i tekst
Bilder i dokumentet refererer til CAS-noder via `node_id`.
CAS-noden er en egen node med `has_media`-edge til innholdsnoden.
Dokumentstrukturen bestemmer *hvor* bildet plasseres i teksten.
Tekst er *på* noden. Binærfiler er *andre* noder koblet med edges.
Ren separasjon: tekst er innhold, binærfiler er vedlegg som kan
plasseres inline.
## Edges definerer alt
Hva en node "er" bestemmes utelukkende av edges:

View file

@ -1,8 +1,8 @@
# Migration Safety Checklist
> **Merk (v2):** Denne sjekklisten er skrevet for v1-arkitekturen der RLS var
> basert på `workspace_id`-kolonner og `SET app.current_workspace_id`. I v2 er
> workspace-modellen erstattet av en node-basert tilgangsmatrise (se
> **Merk:** Denne sjekklisten er skrevet for v1-arkitekturen der RLS var
> basert på `workspace_id`-kolonner og `SET app.current_workspace_id`.
> Workspace-modellen er erstattet av en node-basert tilgangsmatrise (se
> `docs/retninger/bruker_ikke_workspace.md`). Sjekklisten må skrives om for
> det nye mønsteret: `node_access`-matrise, edge-basert tilgang, og
> RLS-policies som opererer på bruker→node-edges i stedet for workspace-scope.

8851
scripts/synops.md Normal file

File diff suppressed because it is too large Load diff