# 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