Über dieses Plugin
IDF Marketing Deck verwandelt das physische Marketing-Karten-Deck der Ideenfabrik („Roter Faden“) in ein digitales Drag-and-Drop-Strategiespiel. Workshops für Marketing-Strategie lassen sich damit interaktiv durchführen: Karten werden auf einer Spielfläche angeordnet, Verknüpfungen zwischen Karten als roter Faden visualisiert, Geschäftsfelder strukturieren das Deck.
Datenbasis ist der Wissen-Hub auf ihre-ideenfabrik.de. Jeder Wissen-Eintrag entspricht einer Karte. ACF-Felder steuern Icon, Geschäftsfeld und Verknüpfungen (Erfordert, Wird besser durch).
Funktionsumfang
- REST-Endpoint, der alle Karten mit Icon, Geschäftsfeld und Verknüpfungen liefert
- Spielfläche zum Einbetten in jeder Seite, optional gefiltert auf ein Geschäftsfeld
- Drag-and-Drop-Spielmechanik mit Deck-Sidebar pro Geschäftsfeld
- SVG-Verbindungen (Roter Faden) zwischen verknüpften Karten
- Session-Speicherung im Browser, Export und Import als JSON
- IDF-Home-Anbindung für automatische Updates
Changelog
v0.16.0 — 2026-05-25
Hinzugefügt
- Bidirektionale Pfeile — wenn A→B und B→A im selben Beziehungstyp existieren (beide „erfordert" oder beide „verbessert"), wird statt zweier Linien eine Linie mit Pfeilspitze an beiden Enden gezeichnet. Spart eine ganze Linie pro Paar und macht die Spielfläche übersichtlicher. Eine erfordert- und eine verbessert-Beziehung zwischen denselben Karten bleiben weiterhin zwei separate (parallel versetzte) Linien.
Geändert
- Endpunkte am Karten-Rand folgen jetzt dem Slot-Offset. Statt nur die Bezier-Kontrollpunkte zu verschieben, werden auch die virtuellen Zielpunkte für
edgePointum (perpOffX, perpOffY) versetzt. Damit landen die Pfeilspitzen mehrerer Linien zur selben Karte nebeneinander am Rand statt im exakt gleichen Punkt — ein „Erfordert"- und ein „Verbessert"-Pfeil sitzen also klar getrennt.
v0.15.0 — 2026-05-25
Entfernt
- Weiße Karten. Hatten weder eine Funktion noch Verknüpfungen — der Themen-Input-Slot ergab im Workshop-Flow keinen Mehrwert. Button, Render-Pfad und CSS sind komplett raus. Bestehende Speicherstände mit weißen Karten werden beim Laden gefiltert (nur
kind === 'card'bleibt).
Hinzugefügt
- Vollständigkeits-Highlight auf Karten in der Spielfläche: Sobald alle Erfordert-Voraussetzungen einer Karte ebenfalls platziert sind, bekommt sie einen pastellgrünen Hintergrund und einen leicht grünlichen Rahmen (
.is-complete). Karten ohne Voraussetzungen gelten nicht automatisch als „komplett" — sonst wäre die halbe Spielfläche grün. - Dezente Custom-Scrollbars in Sidebar und Deck-Pane (
scrollbar-width: thin+ Webkit-Pendant, 6 px Breite, hellgrauer Thumb, transparenter Track).
Geändert
- Sidebar und Deck-Pane verbreitert auf 290 px (vorher 260 px) — lange Geschäftsfeld-Namen wie „190 · Audiovisuelle Werbung (4)" brechen nicht mehr um. Media-Query-Breakpoint analog auf 1000 px hochgezogen.
- Modal-Headlines kleiner (0.72 → 0.65 em) und farblich weicher (
#b89494,#8eb0d6statt der vorherigen Töne) — wirken nicht mehr dominant. - „Wird besser durch" → „Verbessert" im Modal — kürzer, präziser.
- Gespielte Voraussetzungen im Modal sind jetzt grün (Text + Status-Kreis) — das bestätigte „erledigt" ist auf einen Blick erkennbar.
- Storage-Format:
whiteCounteraus dem serialisierten State entfernt (gehört zu den weißen Karten).
v0.14.0 — 2026-05-25
Behoben
- Gegenläufige Linien (A→B und B→A) lagen weiterhin übereinander. Ursache: Slot-Offset wurde mit einem Perpendicular-Vektor berechnet, der pro Linie individuell aus der eigenen Richtung abgeleitet wurde — für gegenläufige Linien hob er sich genau auf. Fix: Pro Karten-Paar wird jetzt ein gemeinsames Referenz-Perpendicular (relativ zur
lo→hi-Achse) berechnet, an dem alle Linien der Gruppe ausgerichtet werden. - Pfeilspitzen kippten horizontal, auch wenn die Linie diagonal oder vertikal verlief. Ursache: Bezier-Kontrollpunkte hatten eine horizontal-tangentiale Form (
c.y = endpoint.y), unabhängig von der tatsächlichen Linien-Richtung. Fix: Kontrollpunkte liegen jetzt tangential zur Verbindungsachse(dx * 0.4, dy * 0.4). Die Pfeilspitze (marker-end orient="auto-start-reverse") folgt damit der echten Linien-Richtung.
Geändert
bezierPath-Signatur — nimmt jetzt zwei Offset-Komponenten(perpOffX, perpOffY)statt eines skalarenslotOffset. Der Aufrufer berechnet den Vektor aus dem Referenz-Perpendicular der Gruppe und dem Slot-Index.SLOT_SPACINGauf 26 px erhöht (vorher 24) — sorgt für etwas mehr Luft zwischen parallelen Linien.
v0.13.0 — 2026-05-25
Geändert
- Pfeilspitzen an Verbindungs-Linien deutlich größer (markerWidth/Height 8 → 14, refX 10 → 9) — Richtung der Beziehung auch bei vielen Karten klar erkennbar.
- Detail-Panel als Modal statt Inline-Bereich über dem Spielfeld — das Spielfeld hüpft beim Öffnen nicht mehr nach unten. Modal hat Backdrop (45 % Schwarz), zentriert, max. 720 px breit. Schließen via X, ESC, Backdrop-Klick.
body.idf-marketing-deck-modal-opensperrt den Page-Scroll während das Modal offen ist.- Modal-Text dezenter — Schriftgrößen reduziert (Titel 0.95 em, Liste 0.85 em, Subtitle 0.72 em), Farben weicher (gedämpftes Rot/Blau für die Sektions-Header, hellgrauer Hintergrund für „fehlt"-Status statt Rot, gedämpftes Plus-Button-Outline).
v0.12.0 — 2026-05-25
Geändert
- Linien-Versatz bei mehrfach verknüpften Karten — wenn zwischen zwei Karten mehrere Beziehungen bestehen (z. B. A erfordert B und A wird besser durch B, oder beidseitig), werden die Linien jetzt parallel zueinander versetzt gezeichnet statt übereinander. Sortierung nach
kind, fromId, toIdfür deterministische Slot-Verteilung. bezierPathakzeptiert einenslotOffset-Parameter — verschiebt die Bezier-Kontrollpunkte senkrecht zur Verbindungsachse. MitslotOffset = 0(n = 1 Linie) bleibt das alte horizontal-tangentiale Verhalten erhalten.
v0.11.0 — 2026-05-25
Hinzugefügt
- Pfeilspitzen an allen Verbindungs-Linien als SVG-Marker — die Richtung der Beziehung ist jetzt eindeutig: „A erfordert B" zeichnet einen Pfeil von A nach B, der auf B zeigt. Analog für „besser".
- Schnittpunkt-Berechnung Karten-Rand (
edgePoint) — Linien beginnen und enden am Rand der Karten-Box statt im Mittelpunkt, damit die Pfeilspitze außerhalb der Ziel-Karte sichtbar ist.
Geändert
- Pair-Dedup entfernt — A→B und B→A sind unterschiedliche Beziehungen, beide werden separat gezeichnet. Bei wechselseitigen Verknüpfungen liegen die beiden Linien leicht versetzt durch den unterschiedlichen Bezier-Kurven-Verlauf.
v0.10.0 — 2026-05-25
Hinzugefügt
- FontAwesome-Pro-7-Kit wird vom Plugin selbst geladen (
kit.fontawesome.com/d40a8876ad.js, IDF-Account). Damit sind alle Icon-Styles (Solid, Regular, Light, Thin, Duotone, Brands) im Frontend verfügbar, unabhängig davon, was das Theme lädt. script_loader_tag-Filter ergänzt das Kit-Script automatisch umcrossorigin="anonymous"— sonst lädt FA das Webfont nicht.
Geändert
- „Wird besser durch"-Verbindungen in Blau (
#1976d2) statt Orange — klare visuelle Trennung von der roten „Erfordert"-Linie. Detail-Panel-Überschrift derselben Sektion in derselben Farbe.
v0.9.0 — 2026-05-25
Hinzugefügt
- Freie Positionierung der Karten in der Spielfläche — beim Drop landet die Karte exakt dort, wo der Cursor losgelassen wird. Jede Karte hält ihre eigene
(x, y)-Koordinate im State, der Grab-Offset wird beim Drag-Start mitgemerkt, damit Karten nicht zum Cursor springen. - SVG-Verbindungen folgen den Karten — die Bezier-Kurven werden aus den Karten-Mittelpunkten gezeichnet, egal wo die Karten liegen.
- Brand-Icon-Erkennung: Liste der bekannten Brand-Slugs (
fa-facebook,fa-instagram,fa-x-twitter, …) wählt automatischfa-brands, alles anderefa-regular. - Cascade-Layout für Karten, die ohne Drop entstehen (Detail-Panel + Hinzufügen, Weiße Karte) — 4er-Raster mit 20px Abstand.
Geändert
- Icons sind jetzt standardmäßig
fa-regularstattfa-solid— dünnerer, weniger massiver Look. - Karten-Titel ohne Fettdruck (
font-weight: 400), kleinere Schrift (0.95em). - Sidebar verbreitert auf 260px — Geschäftsfeld-Namen müssen nicht mehr in Buttons umbrechen.
- Schriftgewichte und -größen insgesamt zurückhaltender: aktive Deck-Buttons ohne Bold (nur Farb-Akzent), Detail-Panel-Titel auf
font-weight: 500. - Drop-Zone vom Flexbox-Wrap auf freies Koordinatensystem umgestellt — die Hint-Box liegt absolute, der Container ist
overflow: hidden.
Migration
- Alt-Stände im LocalStorage ohne
x/y-Felder bekommen beim Render automatisch eine Cascade-Position zugewiesen, anstatt unsichtbar bei(0, 0)übereinander zu liegen.
v0.8.0 — 2026-05-25
Hinzugefügt
- Detail-Panel über der Spielfläche: Klick auf eine platzierte Karte öffnet ein Panel mit zwei Listen — „Erfordert" (dunkelroter Akzent) und „Wird besser durch" (orange-gelb).
- Status-Icons pro Verknüpfung: grünes ✓ für bereits in der Drop-Zone liegende Karten, rotes ○ für fehlende.
- + Hinzufügen-Button an fehlenden Karten — legt die Voraussetzung mit einem Klick ans Ende der Drop-Zone.
- Selektions-Highlight — die ausgewählte Karte bekommt einen blauen Rahmen.
- Keyboard-Bedienung: Enter oder Space auf einer platzierten Karte öffnet das Panel, ESC schließt es. Karten sind via
tabindexfokussierbar. - Auto-Aufräumen — beim Entfernen einer selektierten Karte oder beim Zurücksetzen wird das Panel automatisch geschlossen.
Geändert
renderDraggableCardträgt Click- und Keydown-Handler nur an Karten in der Drop-Zone ein; das stört das bestehende Drag-Verhalten nicht.applyDropruft jetztrenderDetailPanel()auf, damit der Status der Voraussetzungen sofort aktualisiert wird, wenn neue Karten gelegt werden.
v0.7.0 — 2026-05-25
Hinzugefügt
- Auto-Save des Spielstands im
localStorage(Keyidf-marketing-deck-state-v1) nach jeder Änderung (Karte gesetzt/entfernt/verschoben, weiße Karte hinzugefügt/bearbeitet). - Wiederherstellung beim Seiten-Reload — gesetzte Karten, weiße Karten, aktiver Deck-Tab kommen automatisch zurück.
- JSON-Export als Datei-Download (
idf-marketing-deck-YYYYMMDD-HHMM.json) — der ganze Spielstand inkl. Versionsstempel. - JSON-Import via File-Picker — überschreibt den aktuellen Stand nach Format-Check.
- Zurücksetzen-Button mit Bestätigungs-Dialog, leert Drop-Zone und LocalStorage.
- Saved-Badge in der Toolbar zeigt zuletzt gespeicherte Uhrzeit oder „Stand wiederhergestellt".
Robustheit
- State-Validierung beim Laden — Karten-IDs, die nicht (mehr) im REST-Datenstrom sind, werden beim Wiederherstellen verworfen, statt einen kaputten Eintrag zu erzeugen.
- Versions-Sentinel im Storage-Format (
version: 1) — fremde oder veraltete Daten werden ignoriert statt fehlinterpretiert.
v0.6.0 — 2026-05-25
Hinzugefügt
- SVG-Overlay über der Drop-Zone, das Verbindungen zwischen verknüpften Karten als Bezier-Kurven zeichnet — der namensgebende „Rote Faden".
- Zwei Verbindungs-Typen visuell unterschieden: -
Erfordert(aus ACFwissen-erfordert) — dunkelrot, durchgezogen. -Wird besser durch(aus ACFwissen-besser) — orange, gestrichelt. - Live-Redraw bei jedem Render-Pass, bei Window-Resize, beim Scrollen der Drop-Zone und während eines HTML5-Drag-Overs (gedrosselt via
requestAnimationFrame). - Pair-Deduplication — pro Karten-Paar und Beziehungstyp wird nur eine Linie gezeichnet, auch wenn die Beziehung beidseitig in den ACF-Feldern hinterlegt ist.
Geändert
- Drop-Zone-Render schont das SVG-Element — nur Karten und Hinweis werden ausgetauscht, das Overlay bleibt erhalten.
- Karten in der Drop-Zone bekommen
z-index: 1, damit sie über dem SVG-Overlay liegen.
v0.5.0 — 2026-05-25
Hinzugefügt
- Play-Mode in
[idf-marketing-deck mode="play"]— drei-spaltiges Layout: Sidebar mit Geschäftsfeld-Decks zum Aktivieren, mittlere Deck-Pane mit Karten zum Ziehen, rechte Drop-Zone als Spielfläche. - Drag-and-Drop mit nativer HTML5-D&D-API für Maus, Pointer-Events-Fallback inkl. visuellem Ghost-Element für Touch und Stylus.
- Karten-Operationen in der Drop-Zone: neu anordnen per Drag, entfernen per ×-Button, zurück ins Deck per Drag aufs Deck.
- Weiße Karten als Themen-Input — frei beschreibbares Textfeld, mehrfach hinzufügbar, ebenfalls per Drag verschiebbar.
- Drop-Index-Berechnung anhand der Maus-Position — Einfügen genau dort, wo der Cursor liegt.
- Doppelschutz — eine Karte, die schon in der Drop-Zone liegt, ist im Deck ausgegraut und nicht erneut ziehbar.
Geändert
assets/frontend.jskomplett refactored — Browse- und Play-Mode teilen die Karten-Renderer, sind aber ansonsten getrennt strukturiert.assets/frontend.csserweitert um Play-Mode-Layout (Grid 220px / 260px / 1fr, responsives Stacking unter 900px).
v0.4.0 — 2026-05-25
Hinzugefügt
- Shortcode
[idf-marketing-deck]mit den Attributengeschaeftsfeld(optional, Term-Slug-Filter) undmode(browseStandard,playStub-Hinweis bis v0.5.0). - Vanilla-JS-Frontend (
assets/frontend.js) — lädt Karten via REST-Endpoint, gruppiert sie nach Geschäftsfeld und rendert eine responsive Karten-Galerie. Kein Build-Step, keine externen Libraries. - CSS-Skeleton (
assets/frontend.css) — zurückhaltendes Styling, das sich in jedes IDF-Theme einfügt. Responsive Grid, Hover- und Fokus-States, gestrichelte Rahmen für Draft-Karten. - Nonce-Pass-Through — eingeloggte User mit
edit_postsbekommen automatischinclude_drafts=1, Nonce perX-WP-Nonce-Header. - FontAwesome-Style-Detection — Icon-Klassen werden automatisch mit
fa-solidpräfixt, wenn keine Style-Klasse vorhanden ist.
Geändert
IDF_Marketing_Deck_Plugin::boot()initialisiert zusätzlichIDF_Marketing_Deck_Shortcode.
v0.3.0 — 2026-05-25
Hinzugefügt
- REST-Endpoint
GET /wp-json/idf-marketing-deck/v1/karten— liefert alle Karten als JSON mitid,slug,slug_alias,title,icon,geschaeftsfeld(Term-Object inkl. Code),erfordert,besser,excerpt,id0,id1. - Filter
?geschaeftsfeld=<slug>(z. B.030-vertrieb) und?include_drafts=1(nur für eingeloggte User mitedit_posts). - Object-Cache über
wp_cache_setmit 1h TTL und versionierten Cache-Keys. Invalidierung erfolgt durch Hochzählen einer globalen Cache-Version — kein Schleifen-Löschen einzelner Keys nötig. - Cache-Invalidation-Hooks auf
save_post_wissen,deleted_post(gefiltert auf wissen),created_term,edited_term,delete_term(gefiltert auf geschaeftsfeld). - Slug-Alias-Map in
IDF_Marketing_Deck_Rest::SLUG_ALIAS_MAPfür die zwei WP↔Directus-Sonderfälle (orientierungsysteme↔orientierung-und-schilder,personalmarketing↔personalmanagement) — wird alsslug_alias-Feld pro Karte ausgegeben. - Response-Header
X-IDF-Cache: HIT|MISSzur Cache-Diagnose im Frontend.
Geändert
IDF_Marketing_Deck_Plugin::boot()initialisiertIDF_Marketing_Deck_Restzusätzlich zum Admin-Modul.
v0.2.0 — 2026-05-25
Hinzugefügt
- Pflicht-Admin-Menü nach IDF-Backend-Konvention: Top-Level-Eintrag „IDF Marketing Deck" mit den vier Pflicht-Sub-Pages Übersicht, Einstellungen, Hilfe, Deinstallation.
- Übersichts-Seite (
idf-marketing-deck) mit Status-Block, Karten- und Geschäftsfeld-Zähler und Roadmap bis v1.0.0. - Hilfe-Seite mit Datenmodell-Erklärung (
page-fa-icon,wissen_geschaeftsfeld,wissen-erfordert,wissen-besser) und Repo-Links. - Deinstallations-Seite mit Nonce-geschütztem Bestätigungs-Formular und Aufruf von
uninstall.php. uninstall.phpmitidf_marketing_deck_delete_all_data()— entfernt die Plugin-Option bei WP-Standard-Deinstallation oder manueller Auslösung.
Geändert
- Auto-Loader lädt Klassen jetzt zusätzlich aus
admin/— Admin-Klassen liegen separat von Kern-Modulen. IDF_Marketing_Deck_Plugin::boot()ruftIDF_Marketing_Deck_Admin::init()nur imis_admin()-Kontext auf.
v0.1.0 — 2026-05-25
Hinzugefügt
- Plugin-Grundgerüst aus
idf-plugin-template: Plugin-Header, Konstanten (IDF_MARKETING_DECK_*), SPL-Auto-Loader für Klassen ausincludes/, Aktivierungs- und Deaktivierungs-Hook, Text-Domainidf-marketing-deck. - idf-home-Integration: Update-Registrierung über
idf_home_register_plugin()und Filteridf/home/known_plugins— sorgt für „Update verfügbar"-Notice in WordPress und Sichtbarkeit im Plugin-Dashboard. - Bootstrap-Singleton
IDF_Marketing_Deck_Pluginmit idempotenterboot()-Methode und Text-Domain-Lader.