Für Entwickler

Content-Elemente — Referenz

Content-Elemente sind die einzige erlaubte Art, CMS-pflegbare Inhalte in einer Block-Komponente auszugeben. Sie sind unveränderlich: exakt so verwenden wie hier gezeigt, keine eigenen Attribute erfinden. Nur bei repeatable und fromdatabase bestimmst du den Inhalt des Slots frei.

Grundprinzip: db, val und dbKeys

Die val-Regel (auswendig)

Einfache Elemente: val ist identisch mit dem dbKeys-Schlüssel.
Container (repeatable, repeatcontents, fromdatabase): val ist ein frei gewählter Order-Key mit _-Präfix (_order, _fdb, _rcorder), eindeutig je Komponente.

dbKeys-Typen (einfache Elemente)

dbKeys-WertElement
"text"vtext (einfacher Text)
"htmltext"htmltext (Rich-Text via Editor.js)
"image"oimage
"video"ovideo
"icon"oicon neu
"folder"ofolder
"repeatcontent"repeatcontents

Einfache Elemente

vtext — einfacher, unformatierter Text

<vtext :db="db" val="text1"></vtext>

Config: "text1": "text". Gibt reinen Text aus. Für alle designfixen Texte: Überschriften, Hero-Titel, Eyebrows, Card-Titel, Button-Beschriftungen, Zahlen. Der CMS-User ändert nur den Text, nie die Formatierung — so bleibt das Design unzerstörbar. Im Zweifel immer vtext.

htmltext — formatierter Text (Editor.js)

<htmltext :db="db" val="text2"></htmltext>

Config: "text2": "htmltext". Nur dort, wo der User bewusst selbst formatieren, gliedern und Links/Buttons setzen soll — Fliesstext, Beschreibungen, Artikelkörper. Editor.js-Blöcke tragen die Klasse .ce-block. Styling unter einer Wrapper-Klasse:

.mein_richtext {
    & h2, & h3 { color: var(--c-text); }
    & p  { color: var(--c-text-soft); line-height: 1.75; }
    & a  { color: var(--c-accent); text-decoration: underline; }
}

Links & Buttons sind Inhalt — nie hardcoden

CTAs und Links dürfen nie als fixes <a href="…"> im Template stehen. Entweder setzt der User sie im htmltext-Editor, oder du bindest den Linktext per vtext und das Ziel über einen eigenen dbKeys-Schlüssel (z. B. "cta_url": "text") mit :href. Ausgenommen sind reine Funktions-Buttons (Burger, Slider-Pfeile).

oimage — Bild (mit Fokuspunkt)

<oimage :db="db" val="image1"></oimage>

Config: "image1": "image". Rendert ein <picture> mit responsivem srcset innerhalb von article > .focus-image-container > img. Bild über einen Wrapper mit festem Seitenverhältnis steuern:

Bilder werden automatisch optimiert

oimage liefert von sich aus moderne Formate (WebP/AVIF) und passende Größen je nach Bildschirm (srcset mit ?w=-Skalierung), lädt verzögert (loading="lazy") und respektiert den in der Mediathek gesetzten Fokuspunkt. Der alt-Text kommt mehrsprachig aus der Mediathek. Du musst Bilder daher nicht vorab verkleinern.

Styling über einen Wrapper mit festem Seitenverhältnis:

.mein_img_wrap {
    border-radius: var(--r-lg);
    overflow: hidden;
    aspect-ratio: 4 / 3;
    & .focus-image-container { width: 100% !important; height: 100% !important; }
    & img { width: 100%; height: 100%; object-fit: cover; display: block; }
}

ovideo — Video

<ovideo :db="db" val="video1" w="100%" :autoplay="false"></ovideo>

Config: "video1": "video". Attribute: w (Breite), :autoplay (Boolean). Rendert .orb_videoout > video. Immer ein Wrapper-aspect-ratio setzen, sonst kollabiert das Layout beim Laden.

oicon — Symbol aus der Icon-Bibliothek neu

<oicon :db="db" val="feature_icon"></oicon>

Config: "feature_icon": "icon". Zeigt ein SVG aus der Icon-Bibliothek des Templates — den SVG-Dateien unter templates/<template>/files/icons/. Der CMS-User wählt das Symbol aus einem Vorschau-Popup; gespeichert wird nur der Dateiname (ohne Endung).

Größe und Farbe kommen aus der Umgebung: das SVG wird auf 1em gezogen (folgt also der font-size) und übernimmt bei fill="currentColor" die Textfarbe. Rendert span.orb_icon > span.orb_icon_svg.

.c3_card_icon {
    font-size: 2rem;              /* steuert die Icon-Größe */
    color: var(--c-accent);      /* steuert die Icon-Farbe */
}

Eigene Icons ergänzen

Lege weitere SVGs in files/icons/ deines Templates ab — sie erscheinen dann von selbst im Auswahl-Popup. Die Bibliothek wird pro Seitenaufruf einmal geladen und von allen <oicon> gemeinsam genutzt.

ofolder — Datei-/Ordnerauswahl

<ofolder :db="db" val="folder1"></ofolder>

Config: "folder1": "folder". Zeigt eine vom CMS-User gewählte Dateiliste/Downloads; nutzt die Icons aus dem files/-Ordner (pdf.svg, doc.svg …).

Container-Elemente

repeatable — wiederholbarer Block nach festem Mini-Template

<repeatable
    :count="'infinite'" elm="div" cls="c5_rep_inner"
    :basekeys="['text', 'image']"
    :db="db" val="_order"
    v-slot="{ index, keys }">
    <div class="c5_rep_text"><htmltext :db="db" :val="keys.text"></htmltext></div>
    <div class="c5_rep_img"><oimage :db="db" :val="keys.image"></oimage></div>
</repeatable>

Config: "repeatable": { "text": "htmltext", "image": "image" }

AttributBedeutung
:count'infinite' oder feste Maximalanzahl.
elmTag des Item-Wrappers (Default div).
clsCSS-Klasse pro Item.
:basekeysArray der Feld-Stämme.
v-slot{ index, keys } — pro Item.

Mechanik: Items werden über db[val] als Index-Array gespeichert (z. B. [1,2,3]). Pro Item-Index N lautet der echte DB-Key basekey + (N > 0 ? N : '') — Item 1 ⇒ text, Item 2 ⇒ text2 usw. keys ist eine Map { basekey: echterDbKey }; darum bindest du innen :val="keys.text" (mit Doppelpunkt!).

repeatcontents — gemischte, frei sortierbare Blöcke

<repeatcontents
    :count="'infinite'" elm="div"
    :typesettings="{ 'htmltext': 'rctext', 'oimage': 'rcimage', 'ovideo': 'rcvideo' }"
    :db="db" val="_rcorder"></repeatcontents>

Config: "repeatcontent1": "repeatcontent". Kein v-slot — das Element rendert sich selbst. :typesettings mappt Element-Typ → CSS-Klasse, sodass du jeden Typ (.rctext, .rcimage …) stylen kannst.

fromdatabase — Daten aus einer Sammlung

<fromdatabase
    :count="50" elm="div" cls="c6_inner"
    :basekeys="['title', 'image']"
    :db="db" val="_fdb"
    v-slot="{ index, keys }">
    <h3>{{ keys.title }}</h3>
    <img :src="keys.image" />
</fromdatabase>

Config: "fromdatabase": { "text": "title", "image": "image" } — Richtung Typ → Feldname (umgekehrt zu repeatable). Braucht die Sammlung mehrere Felder desselben Typs, wird der Typ durchnummeriert ("text2": "category").

Unterschied zu repeatable

Bei fromdatabase liefert keys bereits aufgelöste Werte (Strings/URLs aus dem Datensatz), keine DB-Key-Namen. Darum gibst du sie roh aus ({{ keys.title }}, <img :src="keys.image">) und führst sie nicht durch oimage/htmltext. htmltext-Felder im Slot per v-html ausgeben.

Sammlungs-Modus & Platzhalter neu

Neben fromdatabase gibt es eine flexiblere Art, Sammlungsdaten anzuzeigen: Ein repeatable kann im Sammlungs-Modus laufen und pro Datensatz eine Zeile rendern. Der Clou: Innerhalb dieser Zeilen funktionieren die ganz normalen Elemente (vtext, oimage, oicon …) — der CMS-User verbindet sie im Editor mit einer Spalte der Sammlung, oder du greifst über Platzhalter direkt auf Felder zu.

Platzhalter [[c:feld]]

In jedem Text- oder URL-Wert eines Elements lösen sich Sammlungs-Platzhalter gegen den aktuellen Datensatz auf — sowohl auf einer Detailseite als auch in jeder Zeile eines Sammlungs-repeatable:

PlatzhalterErgebnis
[[c:feldname]]Wert des Feldes feldname aus dem Datensatz.
[[c:ID]]Die eindeutige ID des Datensatzes (z. B. für Detail-Links).
[[c:date|DD.MM.YYYY]]Ein Datumsfeld mit eigenem Ausgabeformat.
{{feldname}}Ältere Schreibweise (Legacy) — funktioniert weiterhin, bevorzugt [[c:…]].

fromdatabase oder Sammlungs-Modus?

fromdatabase bleibt gültig und ist am schnellsten für einfache Listen. Der Sammlungs-Modus eines repeatable ist dann sinnvoll, wenn Redakteure die Spalten-Zuordnung selbst steuern oder du echte Content-Elemente (mit Editor, Fokuspunkt, Icon-Picker) pro Zeile brauchst. Die Spalten-Verknüpfung nimmt der CMS-User im Editor vor — im Template nutzt du die Elemente wie gewohnt.

Styling-Verträge (Kurzüberblick)

ElementGerenderte Struktur zum Stylen
vtextreiner Textknoten — über die Eltern-Klasse stylen
htmltextEditor.js-Blöcke, .ce-block; & h2 / & p / & ul / & a
oimagearticle > .focus-image-container > picture > img (responsives srcset)
ovideo.orb_videoout > video
oiconspan.orb_icon > span.orb_icon_svg (SVG auf 1em, currentColor)
ofolderDateiliste mit den files/-Icons
repeatablepro Item <elm class="cls"> mit deinem Slot-Inhalt
fromdatabasepro Datensatz <elm class="cls"> mit deinem Slot-Inhalt