synops/docs/proposals/komponerbare_sider.md
vegard b5aa5bb243 Fjern SpacetimeDB komplett (oppgave 22.4)
SpacetimeDB er nå helt fjernet fra Synops. Sanntid håndteres av
PG LISTEN/NOTIFY + WebSocket i portvokteren (maskinrommet).

Kode fjernet:
- spacetimedb/ Rust-modul og spacetime.json
- maskinrommet/src/stdb.rs (HTTP-klient for STDB-reducers)
- frontend module_bindings/ (23 auto-genererte filer)
- spacetimedb npm-avhengighet fra package.json
- scripts/test-sanntid.sh (testet STDB-flyt)

Infrastruktur:
- Docker-container stoppet og fjernet fra docker-compose.yml
- Caddy: fjernet /spacetime/* reverse proxy
- maskinrommet-env.sh: fjernet STDB_IP og SPACETIMEDB_*-variabler
- .env.example: fjernet SpacetimeDB-seksjoner

Dokumentasjon oppdatert:
- CLAUDE.md: stack, lagmodell, kjerneprinsipper, driftsmodell
- docs/arkitektur.md: skrivestien, lesestien, datalag, teknologivalg
- docs/retninger/datalaget.md: migrasjonshistorikk, status "fjernet"
- 37 andre docs oppdatert (features, concepts, infra, ops, retninger)
- Alle kode-kommentarer med STDB-referanser oppdatert

Verifisert: maskinrommet bygger og starter OK, frontend bygger OK,
helsesjekk returnerer 200. Caddy reloadet.
2026-03-18 13:39:09 +00:00

143 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.

# Komponerbare sider (Dashboard-komposisjon)
> **Superseded:** Konseptet er videreført og utvidet i retningen
> "Arbeidsflaten" (`docs/retninger/arbeidsflaten.md`). Den spatial
> workspace-modellen med frie verktøy-paneler og drag-and-drop erstatter
> grid-baserte dashboard-komposisjoner. Dokumentet er bevart som
> historisk referanse — mye av tenkningen rundt blokker, resize og
> maximize er videreført i arbeidsflate-retningen.
## Idé
Brukere ser ferdige sider (Redaksjonen, Studioet, etc.), men admin kan komponere egne sider fra tilgjengelige byggeklosser — chat, kanban, statistikk, graf-visning, whiteboard, osv.
## Hvorfor interessant?
Ulike redaksjoner jobber ulikt. Noen vil ha chat + kanban side-om-side, andre vil ha statistikk + research. I stedet for å hardkode alle kombinasjoner, gir vi admin verktøy til å sette opp sider tilpasset teamets arbeidsflyt. Brukerne ser resultatet som ferdige sider i navigasjonen.
## Modell
### Fase 1: Forhåndsdefinerte layouts (implementeres først)
- Admin velger fra en katalog av **blokker** (chat, kanban, statistikk, etc.)
- Plasserer dem i et **grid-layout** med forhåndsdefinerte maler (1-kolonne, 2-kolonne, 2+1, etc.)
- Lagres som JSONB i `workspaces.settings` (nøkkel `pages`)
- Brukere ser sidene i navigasjonen — ingen komposisjon, bare bruk
- Mobil: blokkene stacker vertikalt (grid kollapser)
```jsonc
// Eksempel: admin-definert side
{
"slug": "oversikt",
"title": "Redaksjonsoversikt",
"layout": "two-column", // Forhåndsdefinert mal
"blocks": [
{ "type": "chat", "channel": "general", "span": 1 },
{ "type": "kanban", "board": "episoder", "span": 1 },
{ "type": "stats", "view": "lyttere-7d", "span": 2 }
]
}
```
### Fase 2: Konfigurerbare dashboards (senere, ved behov)
- Brukere kan lage egne personlige dashboards
- Drag-and-drop for å endre rekkefølge og størrelse
- Lagres per bruker i `workspace_members.dashboard_config` JSONB (PG, ikke fil)
### Fase 3: Full fri tiling (trolig unødvendig)
- VS Code / Bloomberg-stil fritt plassering med splitters
- Ekstremt høy kompleksitet, lav marginalverdi vs. Fase 2
- Unngå med mindre det er et demonstrert behov
## Blokker som resizable containere
Hver blokk på en side er et selvstendig, resizable panel. Brukeren kan:
### Resize
Dra i kanten mellom blokker for å justere proporsjoner. Midlertidig (session) eller persistent (lagres i brukerens `dashboard_config`).
```
Standard layout: Etter resize:
┌──────┬──────┐ ┌───┬─────────┐
│ Chat │Kanban│ │ │ │
│ │ │ → │ │ Kanban │
│ │ │ │ │ │
└──────┴──────┘ └───┴─────────┘
```
### Maximize
Dobbelklikk på tittellinjen, eller en maximize-knapp — blokken utvider seg til hele tilgjengelig skjermflate. Alle andre blokker kollapses. Trykk Escape eller minimize for å gå tilbake.
```
Maksimert chat:
┌──────────────────────────┐
│ Chat — #Mediepolitikk ✕ │
│ │
│ [full editor, │
│ full tråd-oversikt, │
│ full funksjonalitet] │
│ │
│ │
└──────────────────────────┘
```
Dette er spesielt verdifullt for:
- **Editoren** — en chatmelding som vokser til en artikkel trenger plutselig hele skjermen. Maximize gir deg et reelt skriveverksted i stedet for en bitteliten boks.
- **Whiteboard** — trenger plass for å være nyttig
- **Graf-visualisering** — uleselig i en liten boks
- **Mobil** — der skjermplassen er begrenset er maximize den naturlige interaksjonen. Blokkene stacker vertikalt, og du tapper en blokk for å utvide den til fullskjerm.
### Mobil-opplevelse
På mobil er default-visningen en stacked liste med kollapsede blokker:
```
┌──────────────────┐
│ ▼ Chat (3 nye) │
│ ▼ Kanban │
│ ▼ Statistikk │
└──────────────────┘
```
Tapp en blokk → den ekspanderer til fullskjerm. Swipe ned eller tilbake-knapp → tilbake til oversikten. Editoren i fullskjerm på mobil = et reelt skriveverksted, ikke en liten inputboks nederst.
### Teknisk implementering
- CSS Grid med `grid-template-columns`/`grid-template-rows` som justeres via drag
- Resize via pointer events på grid-gapene (eller et lett bibliotek som `svelte-splitpanes`)
- Maximize = CSS `position: fixed` + z-index overlay, med smooth transition
- Blokk-størrelse lagres i `dashboard_config` JSONB: `{ "blockId": { "span": 1.5 } }` eller lignende
- Midlertidig resize (ikke lagret) = Svelte `$state`, forsvinner ved refresh
## Arkitektur-krav
Hver feature-komponent MÅ bygges som en **selvstendig Svelte-komponent** som:
- Tar imot `workspaceId` (og evt. config-props som `channelId`, `boardId`)
- Håndterer sin egen datahenting og tilstand
- Respekterer container-størrelse (responsiv innenfor sin blokk, `container queries` i CSS)
- Eksponerer en `blockMeta`-descriptor (tittel, min-bredde, min-høyde, ikon) for katalogen
- Har en `maximized`-prop som tilpasser layout (f.eks. editoren viser full toolbar i maximized)
Dette koster ingenting å gjøre fra start og gir full fleksibilitet senere.
## Bygger på
- Workspace-modell, SvelteKit layout
- Alle feature-komponenter (chat, kanban, whiteboard, statistikk, etc.)
- Editor (proposal) — maximize gir editoren plass til å være et reelt skriveverksted
## Innsats
- Fase 1: **Lav** (grid-layout + JSON-config, ingen drag-and-drop)
- Fase 1.5: **Lav** (maximize per blokk — relativt enkelt med CSS overlay)
- Fase 2: **Middels** (resize, svelte-splitpanes, bruker-lagring)
- Fase 3: **Stor** (custom tiling engine — trolig unødvendig)
## Wow-faktor
MiddelsHøy. Gir en "dette er MITT verktøy"-følelse. Maximize alene er en stor forbedring — spesielt på mobil der det transformerer opplevelsen fra "begrenset app" til "fullverdig arbeidsflate".
## Åpne spørsmål
- Skal sider være workspace-globale (alle ser samme oppsett) eller per-bruker?
→ Fase 1: workspace-globale via `workspaces.settings` JSONB. Fase 2: personlige overrides i `workspace_members.dashboard_config` JSONB. Alt i PG — ingen filer per bruker.
- Midlertidig vs persistent resize: bør default være at resize forsvinner ved refresh (session), eller lagres automatisk?
→ Trolig: auto-lagre med debounce. Brukeren forventer at ting "huskes". En "tilbakestill layout"-knapp for å gå tilbake til admin-default.
- Bør det finnes et "standard-oppsett" per workspace-type (podcast, nyhetsredaksjon)?
→ Ja, som templates admin kan velge som utgangspunkt.
- Keyboard shortcut for maximize? F11 er konvensjon for fullskjerm, men kolliderer med nettleser. Kanskje Ctrl+Shift+F eller dobbelklikk.
## Relasjon til andre proposals
- **Editor** — maximize gir editoren rom til å gå fra chatinput til fullverdig skriveverksted
- **Personlig workspace** — personlige dashboards (fase 2) henger tett sammen med personlig workspace
- **Tekst-primitiv** — en melding som vokser trenger plass; maximize er mekanismen som gir den det