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
"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 grob article > .focus-image-container > img. Bild über einen Wrapper mit festem Seitenverhältnis steuern:

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

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.

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 > img
ovideo.orb_videoout > video
ofolderDateiliste mit den files/-Icons
repeatablepro Item <elm class="cls"> mit deinem Slot-Inhalt
fromdatabasepro Datensatz <elm class="cls"> mit deinem Slot-Inhalt