# Interaksjonsmodell — drag-and-drop som grammatikk

**Status: Besluttet.**

> Drag-and-drop er Synops sitt universelle verb. Hva som skjer
> bestemmes av hva du drar, hva du slipper på, og hvor du slipper.
> To retninger, to mål. Konsistent overalt.

## Observasjon

Synops har mange verktøy: AI-presets, orkestreringer, editorer,
lydstudio, kanban. De interagerer alle med noder. Men interaksjonen
følger alltid samme mønster — og det mønsteret bør være så
intuitivt at det ikke trenger forklaring.

## Grammatikken

Drag-and-drop er en setning:

- **Subjekt:** det du drar
- **Objekt:** det du slipper på
- **Verb:** bestemt av *hvor* du slipper

### To retninger

| Retning | Hva skjer |
|---------|-----------|
| **Inn** (verktøy → node) | Verktøyet virker *på* noden |
| **Ut** (node → verktøy) | Noden sendes *gjennom* verktøyet |

**Inn** = transformer. **Ut** = skap noe nytt.

### To mål

| Mål | Hva endres |
|-----|-----------|
| **Innhold** (body) | Denne ene tingen |
| **Container** (header) | Alle ting i denne containeren |

**Body** = engangsakjson. **Header** = vedvarende oppførsel.

### Matrisen

```
                    Mål: innhold (body)        Mål: container (header)
                    ─────────────────          ──────────────────────
Inn (verktøy→node)  Transformer denne          Transformer oppførselen
Ut  (node→verktøy)  Skap noe nytt              —
```

## Eksempler

### AI-preset

| Handling | Resultat | Edge |
|----------|---------|------|
| AI-preset → chatboble | Prosesser den meldingen | `derived_from` |
| AI-preset → chat-header | Prosesser alle meldinger heretter | `observes` |
| Chatboble → AI-preset | Ny node med AI-output | `source_material` |

### Orkestrering

| Handling | Resultat | Edge |
|----------|---------|------|
| Orkestrering → chatboble | Kjør på den meldingen | `derived_from` |
| Orkestrering → chat-header | Aktiver automatisering for chatten | `observes` |
| Chatboble → orkestrering | Ny kjøring med boblen som input | `source_material` |

### Tema (publisering)

| Handling | Resultat | Edge |
|----------|---------|------|
| Tema → artikkel | Style denne artikkelen | oppdater metadata |
| Tema → samling-header | Style alle artikler i samlingen | `uses` |

### Lydfil

| Handling | Resultat | Edge |
|----------|---------|------|
| Lydfil → lydstudio | Åpne filen i studio | — (navigasjon) |
| Lydfil → chat | Del lydfilen i samtalen | `has_media` |
| Chat-melding → lydstudio | Ny studio-sesjon med meldingen som kilde | `source_material` |

### Kalender

| Handling | Resultat | Edge |
|----------|---------|------|
| Node → kalender-slot | Planlegg noden | `scheduled` |
| Kalender-event → kanban | Oppgave fra kalenderhendelse | `source_material` |

## Visuell feedback

Brukeren må se hva som skjer *før* de slipper. To distinkte
drop-soner med ulik visuell respons:

```
Drar orkestrering mot chat:

  ┌─ #Redaksjonen ────── [header lyser opp: blå] ──┐
  │  "Slipp her for å aktivere automatisering"      │
  │                                                 │
  │  Melding 1                                      │
  │  Melding 2       [body lyser opp: grønn]        │
  │  Melding 3       "Slipp her for å kjøre én gang"│
  └─────────────────────────────────────────────────┘
```

### Fargekoder

| Drop-sone | Farge | Betydning |
|-----------|-------|-----------|
| Body (innhold) | Grønn | Engangsaksjoner, trygt |
| Header (container) | Blå | Vedvarende endring, mer permanent |
| Inkompatibel | Rød/dimmet | Kan ikke slippe her |

### Inkompatibilitet

Ikke alt kan dras overalt. Kompatibilitetsmatrisen
(se `docs/features/universell_overfoering.md`) bestemmer
hva som er lovlig. Ved inkompatibilitet:

- Drop-sonen dimmes
- Kort forklaring vises: "Lydfiler kan ikke dras til kalender"
- Ingen aksjon ved slipp

## Edge-typer fra interaksjon

| Interaksjon | Edge | Varighet |
|-------------|------|---------|
| Verktøy → innhold | `derived_from` | Permanent (transformasjon logges) |
| Innhold → verktøy | `source_material` | Permanent (proveniens) |
| Verktøy → header | `observes` / `uses` | Vedvarende (fjernbar) |
| Innhold → container | `belongs_to` | Vedvarende (flyttbar) |
| Innhold → tidslinje | `scheduled` | Vedvarende (fjernbar) |

Alle edges er synlige i grafen og kan fjernes. Ingen skjulte
koblinger.

## Prinsippet om reversibilitet

Enhver drag-and-drop-handling er reverserbar:

- **Engangstransformasjon:** Original bevart som revisjon.
  "Vis forrige versjon" tilgjengelig.
- **Vedvarende kobling:** Fjern edgen. Høyreklikk → "Fjern
  automatisering" / "Fjern kobling".
- **Ny node:** Slett noden. Source_material-edge forsvinner.

Brukeren skal aldri føle at de kan gjøre noe uopprettelig
ved å dra feil.

## Prinsippet om konsistens

Samme handling gir alltid samme type resultat, uavhengig av
hvilke verktøy som er involvert:

- **Inn + body = transformer** — alltid, overalt
- **Inn + header = endre oppførsel** — alltid, overalt
- **Ut = ny node** — alltid, overalt

Ingen spesialtilfeller. Ingen "dette verktøyet fungerer
annerledes". Brukeren lærer mønsteret én gang.

## Prinsippet om synlighet

Brukeren ser alltid:
- **Hva som er koblet:** `observes`- og `uses`-edges vises
  diskret i headeren (små ikoner for aktive automatiseringer)
- **Hva som skjedde:** Transformasjoner logges med
  `derived_from`-edge, synlig i node-historikk
- **Hva som er mulig:** Drop-soner lyser opp med forklaring

Ingen usynlig magi. Systemet er transparent.

## Prinsippet om gradvis dybde

Overflaten er enkel:
- Dra ting rundt. Slipp dem på andre ting. Se hva som skjer.

Dybden er tilgjengelig:
- Se edges i grafvisning
- Konfigurer orkestreringer med fritekst
- Bygg kaskader mellom automatiseringer

Men du trenger aldri dybden for å bruke systemet. Det bare
*fungerer* når du drar og slipper.

## Forhold til andre retninger

- [Arbeidsflaten](arbeidsflaten.md) — spatial canvas der
  drag-and-drop skjer
- [Universell input og mottak](universell_input.md) — nodene
  som dras og slippes
- [Unix-filosofi](unix_filosofi.md) — verktøyene som utfører
  transformasjonene
- `docs/features/universell_overfoering.md` — kompatibilitets-
  matrise og transfer-service
- `docs/concepts/orkestrering.md` — `observes`-edge fra
  header-drop
