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
- Jede Block-Komponente bekommt über
[[orblio_inject_props]]eindb-Objekt — den reaktiven Datenspeicher des Blocks. Alle Elemente erhalten:db="db". valzeigt auf den Schlüssel indb, den das Element besetzt.- Der
<config>-Block deklariert überdbKeys, welche Schlüssel es gibt und welchen Typ sie haben.
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-Wert | Element |
|---|---|
"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" }
| Attribut | Bedeutung |
|---|---|
:count | 'infinite' oder feste Maximalanzahl. |
elm | Tag des Item-Wrappers (Default div). |
cls | CSS-Klasse pro Item. |
:basekeys | Array 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)
| Element | Gerenderte Struktur zum Stylen |
|---|---|
vtext | reiner Textknoten — über die Eltern-Klasse stylen |
htmltext | Editor.js-Blöcke, .ce-block; & h2 / & p / & ul / & a |
oimage | article > .focus-image-container > img |
ovideo | .orb_videoout > video |
ofolder | Dateiliste mit den files/-Icons |
repeatable | pro Item <elm class="cls"> mit deinem Slot-Inhalt |
fromdatabase | pro Datensatz <elm class="cls"> mit deinem Slot-Inhalt |