Styles-Contract (--wk-*)
Der Styles-Contract ist die verbindliche CSS-Schnittstelle zwischen Templates und Plugins: ein fester Satz CSS Custom Properties (–wk-*). Das Design-System-Plugin wkfluentui besitzt diese Palette, und eine Vorlage steuert einen Rückfall bei. Plugins und Snippets konsumieren ausschließlich diese Tokens – dadurch sieht die gesamte Site unter jedem Template „aus einem Haus“ aus, ohne dass Plugin-CSS angepasst werden muss.
Version: 17 · Normative Quelle: lib/tpl/wkbizway/css/tokens.css
Für Plugin-Entwickler (Schnelleinstieg)
Grundregel: Farbe, Schriftart, Fokus-Ring-Optik und Inhaltsbreite kommen nie als eigener Hex-/Pixel-/Font-Wert in Plugin-CSS – immer als var(–wk-…, Fallback-Wert). Layout, Innen-/Außenabstände, eigene Klassennamen, Icons, Komponentenstruktur und JavaScript-Verhalten sind vollständig frei; der Contract schränkt hier nichts ein.
Entscheidungsregel – Token oder frei wählbar?
- Pflicht-Token aus der Tabelle unten: jede Farbe, die Schriftfamilie/-stack, die Fokus-Ring-Optik, die Inhaltsbreite.
- Vollständig frei: Layout (Flexbox/Grid), Abstände, eigene Klassennamen, Icons, Komponentenaufbau, JavaScript-Verhalten.
- Nicht selbst erfinden: Braucht ein Plugin eine Farbe/Schrift ohne passende Token-Semantik, wird sie hier als neuer Pflicht- oder Extension-Token vorgeschlagen (siehe „Regeln“ unten) statt als Ad-hoc-Wert eingeführt – sonst bricht sie beim nächsten Farbschema-Wechsel unbemerkt die Konsistenz.
Folge bei Ignorieren der Grundregel: kein Fehler, kein Absturz – das Plugin verliert nur die Teilnahme am Farbschema-Wechsel (riviera/night/white, s. u.). Ein hartcodiertes Blau bleibt blau, auch wenn der Nutzer das Schema wechselt; token-basiertes CSS wechselt automatisch mit.
/* Wrong - hardcoded colors, ignores the active color scheme and any foreign template without this contract */ .my-plugin-button { background: #1d86b6; color: #ffffff; border: 1px solid #148fb9; } /* Right - token with a sensible fallback for templates without the contract */ .my-plugin-button { background: var(--wk-btn-primary, #1d86b6); color: var(--wk-btn-text, #ffffff); border: 1px solid var(--wk-accent, #148fb9); }
Der Fallback-Wert (zweites var()-Argument) ist Pflicht, nicht optional: läuft das Plugin unter einem fremden Template ohne diesen Contract, existiert der Token nicht – ohne Fallback bleibt die Eigenschaft leer. Der Fallback muss für sich allein eine akzeptable Optik ergeben.
Tatsächliche Werte stehen ausschließlich in tokens.css bzw. color-palette.css des aktiven Templates – nie aus einem Screenshot ablesen oder raten, Werte unterscheiden sich pro Farbschema (siehe „Farbschemata“ unten).
Wegweiser: wo finde ich was
Diese Seite regelt Tokens und CSS-Konventionen. Alles Übrige – Layout-Muster, Widgets, Verhalten – steht in der Design-System-Bibliothek WvdS FluentUI. Für Entwickler ohne WvdS-Vorwissen in Lesereihenfolge:
| Ich will … | Seite |
|---|---|
| von Null ein Admin-Modul im Fluent-Stil bauen (Schritt-für-Schritt) | Tutorial: Erste Admin-Oberfläche mit FluentUI bauen |
| Helper-/Widget-APIs nachschlagen (tree/tabs/drawer/modal/toolbar/propertyGrid/rowActions …) | FluentUI: Öffentliche Helper-API |
| die Admin-UX-Regeln kennen (Aktivitätsleiste, Drawer, Inline-Dialog, Farbsemantik) | FluentUI: Admin-Bereich (vertieft) |
| eine ADS-artige Mehr-Regionen-Shell bauen (Sidebar/Content/Auxbar/Statusbar) | FluentUI: Basic Layout (vertieft) |
| eine panel-füllende, resize-feste Datentabelle bauen | FluentUI: Desktop-DataGrid – Demo-Übersicht |
| ein Objekt als Formular oder Eigenschaften-Liste zeigen (Property/Vertical Grid) | FluentUI: Vertical Grid (Property Grid) – Demo-Übersicht |
| Code anzeigen oder editieren (GeSHi/CodeMirror/EasyMDE) | FluentUI: Editoren und Code-Darstellung |
| die Doku-Shell (Wiki-Bereich) verstehen oder erweitern | FluentUI: Wiki Layout (Doku-Shell, vertieft) |
| Größen-/Radius-/Spacing-/Typo-Skalen nachschlagen | FluentUI: Design-Tokens |
Wiederverwendbare Komponenten-Klassen (.wk-*)
Site-weit geladene CSS-Bausteine (wkfluentui/css/widgets.css über das
CSS_STYLES_INCLUDED-Event) – vor jedem eigenen Bau prüfen, ob eine Klasse schon
existiert; Erzeugung bevorzugt über die zugehörige Helper-Methode
(api):
| Klasse(n) | Baustein | Erzeugung |
|---|---|---|
.wk-toolbar / __group | Command-Bar mit Tastatur-Roving-Tabindex | toolbar() |
.wk-tabs | Registerkarten-Leiste | tabs() |
.wk-scrim + Drawer-Panel | rechtsseitiges Slide-in-Detailpanel | drawer() |
.wk-modal–normal (+ –workbench, Doku-first) | zentrierter Dialog 640px bzw. 1024×768 resizable | modal() |
.wk-row-actions | verstecktes Kontextmenü einer Zeile | rowActions() + js/contextmenu.js |
.wk-shell-sidebar / -content / -auxbar / -statusbar (+ -commandbar, -banner: Doku-first/Stufe 2) | Regionen-Primitives für Admin-Shells | plugin-lokales Grid, siehe layout und admin-layout |
.wk-datagrid (Doku-first) | panel-füllende Datentabelle | dataGrid(), siehe datagrid |
.wk-property-grid / __row / __label / __control | zweispaltiges Label/Control-Raster (Property/Vertical Grid) | propertyGrid(), siehe property-grid |
.wk-btn / –accent / –danger | 3-Farben-Aktions-Button (Contract v3, seit Contract v17 mit –wk-control-height) | direktes Markup, keine Helper-Methode |
.wk-field–file (seit Contract v17) | Datei-Upload-Feld-Chrome (nativer „Datei wählen“-Button bleibt unstylbar, umliegender Rahmen/Radius/Background wird gestylt) | direktes Markup (Klasse auf <input type="file">); deckt per Selektor auch die zwei Core-Fundstellen ab, die keine eigene Klasse tragen können (UserManager-CSV-Import, Extension-Manager-Upload) |
CSS-Compiler-Fallen (sitewide fatal)
DokuWikis lessphp-basierter Compiler (lib/exe/css.php) bricht bei zwei Mustern
komplett ab – die gesamte Site verliert ihr Styling, nicht nur die eigene Regel
(Browser mit altem tseed-Cache kaschieren den Ausfall zunächst):
*/im Kommentartext – z. B. in Token-Aufzählungen wiea-/b-: das*/beendet den Blockkommentar vorzeitig, der Rest wird als CSS-Müll geparst. Formulierung ohne Schrägstrich wählen (a-* or b-*).min()/calc()mit gemischten Einheiten – z. B.calc(100% - 2px)in bestimmten Kontexten bzw.min(100%, 40em): einheitengleiche Werte oderminmax()-Grid-Tracks verwenden.
Verifikation nach jeder CSS-Änderung: lib/exe/css.php des Wikis abrufen (z. B. mit curl) —
mehrere hundert KB = ok; wenige hundert Bytes mit roter Fehlermeldung = Compile-Abbruch.
Danach conf/local.php touchen (tseed-Rotation, siehe
Verifikation).
In 5 Schritten zum contract-konformen Plugin-CSS
- Nur Tokens: jede Farbe/Schrift als
var(–wk-…, Fallback)(Grundregel oben); Werte-Nachschlag ausschließlich intokens.css/color-palette.css. - Erst suchen, dann bauen: passende
.wk-*-Klasse bzw. Helper-Methode aus der Tabelle oben verwenden statt eigener Duplikate; eigene Klassen mit Plugin-Präfix (<plugin>-…), nie imwk--Namensraum. - Admin-Buttons klassifizieren nach der 3-Farben-Semantik (Contract v3 unten): weiß = gewöhnlich inkl. Speichern, blau = Sonderaktion, rot = destruktiv.
- Compiler-Fallen meiden (Abschnitt oben) und nach jedem Edit css.php + tseed prüfen.
- Gegen alle drei Farbschemata testen (riviera/night/white, Abschnitt „Farbschemata“) und einmal unter einem fremden Template (Fallback-Werte greifen dann).
Wer darüber hinaus ein komplettes Admin-Modul aufbaut: Tutorial: Erste Admin-Oberfläche mit FluentUI bauen.
Regeln
- Das Design-System-Plugin definiert alle Pflicht-Tokens; eine Vorlage deklariert ihren Rückfall auf
htmlund nur das, worauf sie ausdrücklich besteht, auf:root. - Plugins/Snippets schreiben immer
var(–wk-…, fallback). - Keine Hex-Farben in Plugin-CSS außerhalb von var()-Fallbacks.
- In Template-CSS sind Literalfarben nur für neutrale Effekte erlaubt (Schwarz/Weiß-Schatten und -Overlays wie
rgba(0,0,0,.45)), die unter jedem Farbschema funktionieren. - Neue Tokens werden nur über diese Seite eingeführt (Contract-Version erhöhen, beide Template-Dateien ergänzen).
- Alpha-Varianten von Token-Farben über
color-mix(in srgb, var(–wk-…) N%, transparent)bilden, nicht als eigene rgba-Literale.
Pflicht-Tokens
| Token | Semantik |
|---|---|
–wk-ink | Überschriften, betonter Text |
–wk-ink-soft | Karten-/Posttitel (weicheres Schwarz) |
–wk-paper | Seitenstreifen (Header, Heading-Strip, Footer) |
–wk-accent / -dark / -light | Primär-Akzent (Links, Menü, Buttons) |
–wk-gold / -dark / -light | Sekundär-Akzent-Slot (semantisch, keine Farbe: flat=Amber, wkbizway-Basiswert in tokens.css=Petrol #148fb9, vom Standard-Farbschema riviera überschrieben auf Gold/Bronze #B08A42) |
–wk-rule | Trennlinien |
–wk-surface / -alt / -muted | Inhaltsflächen |
–wk-text / -alt / -muted / -on-dark / -on-accent | Texthierarchie |
–wk-link / -hover / -missing | Linkfarben |
–wk-border / -light / -dotted | Rahmen |
–wk-highlight | Suchtreffer/Markierungen |
–wk-sidebar-bg / -bg-alt / -text / -text-muted / -border / -hover | Sidebar |
–wk-control-height | Einheitliche Kontrollhöhe (22px) für Buttons/Tab-Köpfe/Selects/Text-Inputs — schema-invariant (Metrik, keine Farbe), seit Contract v17 |
–wk-control-gap | Waagerechter Abstand zwischen benachbarten Bedienelementen einer Leiste (8px) — Buttons einer Command-Bar-Gruppe, Select plus zugehöriger Ausführen-Button einer Massenaktion, Formular-Aktionszeile. Companion-Metrik zu –wk-control-height, ebenfalls schema-invariant. Verbraucher: .wk-toolbar, .wk-toolbar__group, .wk-shell-commandbar. Nicht für den Abstand ZWISCHEN Gruppen: der kommt aus Trennlinie + padding-left der Regel .wk-toolbargroup + .wk-toolbargroup (~19px) und trägt Bedeutung — er unterscheidet zwei Befehle voneinander. Ein Baustein, der eigene margin-Werte zwischen Bedienelemente setzt, addiert sich zum Gap und kehrt die Staffelung um. |
–wk-tabstrip-height | Höhe des Arbeitsbereich-Registerstreifens (.wk-editorgroup, die Zeile der geöffneten Admin-Module unter der Topbar) — 35px, die Editor-Tab-Höhe der Referenz-Workbench (VS Code / Azure Data Studio), also ein zitierbarer Wert statt einer Geschmacksentscheidung. Nicht für seiteninterne Tab-Sets: die sind Bedienelemente und bleiben auf –wk-control-height. Eigener Token, weil eine dichtere Button-Leiste die Dokument-Tabs nicht mitschrumpfen darf. Unter body[data-wk-density="compact"] auf 28px. |
–wk-success / -warning / -error + –wk-success-bg / -warning-bg / -error-bg | Feedback-Farben + Flächen |
–wk-admin-accent / -accent-light / -hover | Admin-UI |
–wk-focus / -focus-shadow | Fokus-Ring (A11y) |
–wk-btn-primary / -hover / -text | Primär-Button |
–wk-font-body | Fließtext-Stack (wkbizway: Arimo self-hosted) |
–wk-font-heading | Überschriften-Stack |
–wk-font-display | Display-Face (premium-navy-ivory: „Museo 500“-Slot des WP-Originals, nie gebundlet — fällt auf Arimo zurück) |
–wk-content-max-width | Inhaltsbreite (wkbizway 980px) |
Extension-Tokens (template-eigen)
Templates dürfen zusätzliche Tokens für eigene Skin-Details definieren; Plugins dürfen sich nicht darauf verlassen.
| Token | Template | Semantik |
|---|---|---|
–wk-footer-text / -heading / -strip-bg / -strip-border | premium-navy-ivory | Exakte WP-Grautöne des Footers |
–wk-brand-hairline | premium-navy-ivory | Dünne Akzentlinie unter der Wiki-Kopfzeile (nur Area-Profil wiki); Rot (–wk-error) bei riviera/white, transparent bei night — je css/schemes/{riviera,night,white}.css gesetzt, konsumiert von css/brand-accent.css |
Der obere Rahmenstreifen der Site-Seitenhülle ist ein fester Ivory-Ton, keine schemaabhängige Farbe; einen Token dafür gibt es nicht.
Konsumenten
- Template-CSS:
wkbizway/css/*(vollständig token-basiert),flat/css/customFlat.css,flat/css/accessibility.css - wkblog-Template-Sets
tpl/wvds+tpl/premiumnavyivory— beide überpremium-navy-ivory/css/blog.css - Plugins:
wvdstheme/style.css,wkacmenu/style.css,wvdsaudit-Badges wksnippet-Snippets (~40 HTML-Bausteine mit Inline-var(–wk-…, fallback))- Config-Snippets in
conf/local.php(Audit-/Compliance-Badges)
Farbschemata
Ein Farbschema ist eine alternative Belegung der Pflicht-Tokens (css/schemes/<name>.css im Template, nur :root-Overrides). Weil alle Konsumenten über Tokens gehen, wechselt ein Schema die komplette Site-Optik ohne weitere CSS-Änderungen. Drei Marken-Akzente: riviera (Standard), night, white. Die Option colorscheme wirkt nur auf das Area-Profil site — das Area-Profil wiki (und damit jeder do=admin-Bildschirm) rendert ausnahmslos mit white, unabhängig von dieser Einstellung. Details: BizWay (Hausvorlage).
Die Kette hat genau drei Glieder, und jedes sieht nur das vorige:
tokens.css— Basiswerte, alle Pflicht-Tokenscss/schemes/<name>.css—:root-Overrides, genau ein Schema aktiv- Konsumenten — Template-CSS,
wkblog,wkacmenu,wksnippetund das Admin-CSS-Overlay (_admin-forms.css,_admin-drawer.css)
Ein Konsument liest nie eine Schemadatei, sondern immer nur Tokens. Genau deshalb wechselt ein Schema die ganze Optik, ohne dass eine einzige Konsumentenregel angefasst werden müsste.
Zusätzlich folgt der davon unabhängige, DokuWiki-native style.ini-[replacements]-Kontrakt (__text__, __link__ usw., konsumiert über @ini_*-LESS-Variablen von jedem Plugin, nicht nur –wk-*-Verbrauchern) automatisch dem jeweils aktiven Farbschema — Details und Platzhalter-Tabelle: Farbschemata.
Admin-Chrome (premium-navy-ivory)
Der do=admin-Bereich rendert über DokuWikis natives Admin-Chrome, nicht über ein eigenes Dashboard. –wk-admin-accent/-accent-light/-hover konsumiert css/_admin-forms.css (additives Struktur-Overlay über das native Admin-Markup, keine Core-Plugin-Datei wird verändert) für Karten-Fieldsets, Zeilen-Hover, DataGrid-Tabellen und aktive Elemente (z. B. ACL-Baum). Der Admin-Akzent folgt damit dem gewählten Farbschema. Farblich nicht akzentuiert: „Wert entspricht dem eingebauten Standard“ im Config Manager (Normalfall, keine Ausnahme); akzentuiert: „geschützt“ (nicht änderbar) und Validierungsfehler.
Bild-Assets-Ausnahme: Menüleisten-Textur, Slider-Schatten und Sidebar-/Footer-Grafiken (assets/images/*-blue.png) sind feste Bitmaps aus dem BizWay-Original-Theme, nicht per Token umfärbbar.
Abdeckungsgrenze: _admin-forms.css deckt gezielt die mit DokuWiki mitgelieferten do=admin-Bildschirme ab: acl, config, usermanager, extension, logviewer, styling, popularity, revert, discussion, sqlite (plus die do=admin-Übersicht selbst). Drittanbieter-Plugins außerhalb dieser Liste und eigene wvds*-Admin-Tools (wkvault, wvdsremote, wvdsdwmmx, wksqliteds, wkdoadogit, wvdsmd, wksnippet) sind nicht Teil dieser Abdeckung — sie liegen in der Verantwortung des jeweiligen Plugins, das den Admin-Akzent optional selbst konsumieren kann (wvdsentra, wkblog tun das bereits mit eigener Admin-Optik). Keine _admin-forms.css-Selektor referenziert eine wvds*-Klasse/-ID, nur var(–wk-…)-Tokens — das Template bleibt dadurch unabhängig davon, welche Drittanbieter-/eigenen Plugins installiert sind.
Admin-Aktionsfarben-Semantik (Contract v3)
Ergänzt die Admin-Chrome-Ausnahme oben um eine dritte Dimension: eine Aktions-Farbsemantik für Buttons im do=admin-Bereich, unabhängig vom sitweiten primär(blau)/sekundär(Outline)-Kontrakt aus css/design.css (der Login/Profil/Wiki-Editor bedient und nicht angefasst wird). Referenzumsetzung: wkidentity.
| Farbe | Bedeutung | Beispiele |
|---|---|---|
| neutral/weiß | gewöhnliche Aktion, ausdrücklich inklusive Speichern — kein Button ist automatisch „der Haupt-CTA“ eines Admin-Formulars | Speichern, Hinzufügen |
| blau (accent) | Sonderaktion | Export, Konvertierung, Sync, Test-Verbindung |
| rot (danger) | destruktive/sicherheitsrelevante Aktion | Löschen, Zurücksetzen, Widerrufen, Deaktivieren |
Die Entscheidung läuft in dieser Reihenfolge, und die erste zutreffende gewinnt: destruktiv oder sicherheitsrelevant → rot; sonst Sonderaktion → blau; sonst weiß, ausdrücklich einschließlich Speichern.
Neue Tokens (tokens.css, zwischen dem Buttons- und dem Extension-Tokens-Block):
| Token | Semantik |
|---|---|
–wk-admin-btn-neutral-bg / -text / -hover-bg / -hover-border | Neutraler Admin-Button (Standard) |
–wk-admin-btn-neutral-border | var(–wk-text-alt), im Schema night #557AA3: ein neutraler Button ist in jedem Schema weiß gefüllt (–wk-surface), seine Kontur muss sich deshalb mit mindestens 3:1 von dieser Fläche abheben (siehe „Schema-Palette-Parität“ unten); ein gewöhnlicher –wk-border-Wert ergibt dort kaum sichtbare Kontur. |
–wk-admin-btn-accent-bg / -text / -border | Blauer Admin-Button — spiegelt –wk-admin-accent (schema-abhängig) |
–wk-admin-btn-danger-bg / -text / -border / -hover-bg | Roter Admin-Button — spiegelt –wk-error (schema-invariant) |
–wk-admin-btn-hover-darken | Halbtransparentes Schwarz-Overlay für den Accent-Hover (kein Schema definiert einen eigenen dunkleren Blauton) |
–wk-admin-toolbar-divider | Trennlinie zwischen Toolbar-Button-Gruppen |
–wk-admin-tab-underline | Aktiver-Tab-Unterstrich |
–wk-admin-row-selected-bg | Zeilen-Tönung bei markierter Grid-Zeile |
Eigene Tokens statt Wiederverwendung von –wk-btn-primary: Letzterer ist der sitweite Haupt-Button-Kontrakt (Login/Profil/Editor); eine künftige Bedeutungsänderung dort darf die admin-interne 3-Farben-Semantik nicht ungewollt mit verändern, auch wenn beide aktuell denselben Blauton referenzieren.
Klassennamens-Konvention, nach Editierbarkeit der Quelle:
- DokuWiki-Core-Plugins (PHP nicht editierbar, s. Abschnitt „Core-Patches“ unten): Farbzuordnung ausschließlich über vorhandene, stabile
id-/name-Attribute in_admin-forms.css/_admin-drawer.css, niemals über sichtbare Texte. Referenz: #usrmgr__del,button[name=„fn[export]“]. Ein ID-Präfix ist oft eine Spezifitäts-Notwendigkeit:_admin-forms.csslädt vordesign.css. - WvdS-eigene Plugins (PHP editierbar): direkte Klassenvergabe im PHP, Muster
<plugin-präfix>-btn–danger/–accent(Referenz:wkidentityswt-btn–danger). CSS-Regeln zeigen pervar(–wk-…, Fallback)auf die zentralen Tokens. - Generischer Fall: wiederverwendbares Klassenpaar
.wk-admin-btn–danger/–accentin_admin-forms.css. - Zentral vs. plugin-lokal: zentral (
_admin-forms.css), wenn ein Plugin einen einzelnen Root-Selektor und wenige Buttons hat; plugin-lokal (Vorbildwkidentity/admin.css), wenn ein Plugin bereits eigenes CSS mitbringt oder eine so komplexe UI hat, dass ID-Scoping in einer fremden zentralen Datei die Wartbarkeit verschlechtern würde.
Keine lokalen Token-Layer in Plugins: ein Plugin-Stylesheet deklariert keine eigenen –<plugin-präfix>-*-Custom-Properties, die nur einen zentralen Token spiegeln — jede Regel referenziert den zentralen Token direkt (color: var(–wk-admin-accent, #0f6cbd);). Ausnahme: ein @media (prefers-color-scheme: dark)-Block kann den statischen Fallback-Wert eines var()-Aufrufs nicht umschalten — betroffene Selektoren müssen dort mit dunklen Literalen wiederholt werden.
Icon-Priorität für neue Toolbar-/Button-Iconografie: 1. Codicons (passt zur Fluent-/ADO-Formensprache), 2. FontAwesome (bereits selbst gehostet, assets/fonts/fontawesome-webfont.*), 3. DokuWikis eigene Icons (lib/images/), nur wenn weder Codicon noch FontAwesome passt. Reine Prioritätsliste für künftige Symbolwahl, kein Zwang zum Ersetzen bestehender korrekter Icons.
Farb- und Schriftpolitik: aus einer Fluent-/Azure-DevOps-Referenz wird ausschließlich die strukturelle Formensprache übernommen (Radius, Fokusring, Grid-/Toolbar-/Tab-Konventionen, Typo-Größenstufen) — niemals Microsofts konkrete Farb- oder Schriftwerte. Farben bleiben die eigene Marken-Palette (Weiß, Ivory, Navy-Blau, Burgund-Rot, Gold). Schriftarten bleiben die bestehenden, selbst gehosteten Google-Fonts (Arimo/Roboto/Noto Sans).
Ini-Mechanismus: aktuell konsumiert kein @ini_*-Verbraucher im Admin-Bereich eine Danger-/Fehlerfarbe (nur __theme_color__ → accent, bereits gemappt). Braucht ein künftiger LESS-basierter Admin-Screen einen Danger-Ton über @ini_*: einen namespaced Schlüssel __wk_danger__ zur $map in wkbizway_sync_style_ini_replacements() (main.php) ergänzen, gemappt auf error. Kein proaktiver Eintrag ohne Verbraucher.
Abgrenzung zu lib/plugins/wvdsdwui/: ein zweites, unabhängig gewachsenes WvdS-Design-System (eigener Token-/Komponenten-/Icon-Provider-Satz, Repo wk-dw-ui-plugin). Kein hier behandeltes Admin-Plugin nutzt wvdsdwui — diese Admin-Button-/Chrome-Semantik gilt ausschließlich für die premium-navy-ivory-CSS-Overlay-Welt.
Core-Patches
Der DokuWiki-Kern und die mitgelieferten Plugins (lib/plugins/{acl,extension,usermanager,config,styling,logviewer,discussion,sqlite,…}, inc/*) werden nicht verändert. Eine bestätigte Fehlfunktion des Kerns wird beim DokuWiki-Projekt gemeldet statt lokal gepatcht: diese Dateien stehen unter keiner eigenen Versionskontrolle, und ein lokaler Patch ginge mit der nächsten Kernaktualisierung still verloren.
Sidebar/Auxbar-Kontrakt: Dokument vs. App (Contract v16)
Die Pflicht-Token-Familie –wk-sidebar-* (Tabelle oben) ist die gemeinsame Basis für die Container-Ebene (Hintergrund, Rahmen) jeder Sidebar-/Auxbar-artigen Region der Site — „Dokument vs. App“ ist dabei der einzige sanktionierte optische Unterschied, ausgedrückt als zwei benannte Wertesätze für dieselben Tokens, nicht als eigenständige Implementierung je Bereich.
| Variante | Wo | Bedeutung |
|---|---|---|
| Dokument | Wiki-Lesebereich: Doc-Sidebar, Page-TOC (area-wiki.css) | Liest sich wie eine Buchseite — weißer Hintergrund (var(–wk-surface)), kein sichtbarer Rahmen |
| App | Admin-/Studio-Regionen: .wk-shell-sidebar/-auxbar (wkfluentui/style.css) | Liest sich wie eine Application-/WebView-Chrome — getönter Hintergrund (var(–wk-surface-muted)), sichtbarer Rahmen (var(–wk-border)) |
Beide Wertesätze sind in premium-navy-ivory/css/tokens.css definiert: der Dokument-Satz als Basiswert im :root-Block (Wiki ist inc/area.phps globaler Default-Bereichstyp), der App-Satz als Override direkt auf den bestehenden Klassennamen .wk-shell-sidebar/.wk-shell-auxbar (keine neue Marker-Klasse, keine Markup-Änderung nötig). Die Zuweisung ist eine statische Architektur-Entscheidung je Regionstyp — kein Nutzer-Toggle, keine Laufzeit-Umschaltung.
| Token | Dokument | App |
|---|---|---|
–wk-sidebar-bg | var(–wk-surface) | var(–wk-surface-muted) |
–wk-sidebar-bg-alt | var(–wk-wiki-mat-bg) | var(–wk-surface-alt) |
–wk-sidebar-text | var(–wk-wiki-nav-text) | var(–wk-text) |
–wk-sidebar-text-muted | var(–wk-wiki-nav-text-muted) | var(–wk-text-muted) |
–wk-sidebar-border | transparent | var(–wk-border) |
–wk-sidebar-hover | var(–wk-wiki-nav-hover-bg) | var(–wk-admin-hover) |
Konsumenten: area-wiki.css (.premiumnavyivory-doc-sidebar/.premiumnavyivory-page-toc–desktop/–mobile, Hintergrund) und wkfluentui/style.css (.wk-shell-sidebar/-auxbar, Hintergrund + Rahmen, zweiter var()-Fallback-Level). Die Tönung kommt zentral aus dem Contract und gilt automatisch für jeden .wk-shell-sidebar/-auxbar-Verbraucher; ein plugin-lokaler Override ist dafür nicht nötig. Für Statusbar und Commandbar gibt es keine entsprechende Token-Familie; ihre Tönung ist ein lokaler Override.
Beispiel: der Konfigurations-Manager-TOC (.wk-shell-sidebar premiumnavyivory-admin-toc-sidebar, siehe inc/wiki-shell.php) erbt automatisch die App-Tönung und den Rahmen — ein eigener CSS-Selektor für diese Seite ist nicht nötig.
Regionen-Hebung + Klassen-Familien-Zuständigkeit (Contract v17)
Admin-Regionen (Objekt-Baum-Sidebar, Modul-Rail) liegen wie die Wiki-Doc-Sidebar/TOC-Rail als echte <aside>-Geschwister von <main>, nicht verschachtelt in main > .premiumnavyivory-wiki-card > .page.group > …. Dafür gilt ein generischer Kontrakt:
- Ein Admin-Plugin, das seine komplette Shell selbst rendert (Content+Auxbar+Statusbar), implementiert eine öffentliche Methode
getShellRegions(): ?array(Rückgabeform{sidebarHtml: ?string, railHtml: ?string, auxOpen: bool}odernull), aufrufbar vortpl_content()— analog zu DokuWikis eigenemgetTOC()-Kontrakt, aber template-spezifisch (kein Core-Interface).inc/wiki-shell.phpprüft generisch permethod_exists(), ob das aktive Admin-Plugin diese Methode anbietet — keine hartcodierte Plugin-Namensliste. - Fehlt
getShellRegions(), aber liefert das Plugin ein nicht-leeresgetTOC(), wird dessen Inhalt überwkfluentuistree()-Komponente gerendert — beide Pfade münden in derselben<aside id=„dokuwiki__docsidebar“>-Position wie die Wiki-Doc-Sidebar. railHtml(nur bei eigenschalenbesitzenden Plugins) rendert als eigene<aside id=„dokuwiki__adminmodulerail“>im selben visuellen Slot wie die Wiki-TOC-Rail — bewusst eigeneid/aria-label, andere Semantik (Modul-Aktionen, keine Seiten-TOC).- Sicherheitsanforderung:
getShellRegions()läuft vor DokuWiki-Cores eigener Admin-Zugriffsprüfung (die erst innerhalb vontpl_content()s Dispatch greift) und muss deshalb selbst denselben Capability-Gate wie die eigentlichehtml()-Methode anwenden — sonst könnte ein nicht autorisierter Deep-Link Verbindungs-/Tabellennamen im Sidebar-Baum sehen, obwohl der Content-Bereich korrekt verweigert würde. sidebar-collapsed/rail-collapsedwerden nur gesetzt, wenn tatsächlich kein Sidebar-/Rail-Inhalt vorhanden ist — dieselbe Logik, die Wiki-Seiten für ihre eigene Sidebar/TOC anwenden.
Klassen-Familien-Zuständigkeit: premiumnavyivory-* (Template-Eigentum: Regions-/Bereichs-Hooks, z. B. -doc-sidebar/-action-rail) und wk-shell-*/wk-workbench* (Plugin-Eigentum: Layout/Verhalten, z. B. wk-shell-sidebar/wk-workbench–no-sidebar) dürfen gemeinsam auf einem Element stehen (z. B. class=„premiumnavyivory-doc-sidebar premiumnavyivory-doc-sidebar–app wk-shell-sidebar“), aber nicht unkommentiert — jede Familie bleibt für ihre eigene Zuständigkeit (Bereichszugehörigkeit vs. generisches Layout) verantwortlich, keine Familie überschreibt die Zuständigkeit der anderen.
Schema-Palette-Parität (Contract v17)
Verbindliche Regel: jedes Farbschema (riviera/night/white) MUSS entweder jeden Rohpalette-Token definieren, der irgendwo per var() konsumiert wird, oder der Token wird als schema-invariant (:root-only, keine Schema-Datei überschreibt ihn — z. B. die –wk-wiki-card-*-Familie, die bewusst nur einmal in tokens.css gesetzt wird, damit die Wiki-Lesefläche unabhängig vom Akzent immer als weißes Dokument erscheint) explizit dokumentiert. Keine stille dritte Möglichkeit („in zwei von drei Schemata da“).
Kontrast-Nachweis-Pflicht: eine neue Token-Zuweisung, die als UI-Komponentengrenze dient (z. B. ein Button-Rahmen, wenn Button-Füllung == umgebende Fläche), muss WCAG 1.4.11 (Non-Text-Contrast, ≥3:1 gegen die angrenzende Fläche) rechnerisch nachgewiesen werden, nicht nur „sichtbarer als die Alternative“. Beispiel –wk-admin-btn-neutral-border: der :root-Default referenziert var(–wk-text-alt) (~5,85:1 in riviera/white); Night hat einen eigenen Override #557AA3 (~3,27:1), weil Nights –wk-text-alt eine für dunkle Flächen gedachte helle Farbe ist.
Changelog (Kurzfassung)
| Version | Datum | Änderung |
|---|---|---|
| 17 | 2026-07-18 | Regionen-Hebung: getShellRegions()-Kontrakt (generisch statt Plugin-Namensliste) hebt Admin-Sidebar/-Rail auf echte <aside>-Geschwister von <main>; Klassen-Familien-Zuständigkeit premiumnavyivory-* vs. wk-shell-*/wk-workbench* dokumentiert; neuer Token –wk-control-height; neue Komponenten .wk-btn/.wk-field–file; Schema-Palette-Parität-Regel (jeder konsumierte Rohpalette-Token muss in jedem Schema definiert ODER explizit als schema-invariant dokumentiert sein) + Kontrast-Nachweis-Pflicht (WCAG 1.4.11) für UI-Komponentengrenzen; toter –wk-steel-azure/-ivory/-ivory-2 entfernt; –wk-admin-btn-neutral-border war in allen drei Schemata unter 3:1 — rechnerisch korrigiert. |
| 16 | 2026-07-17 | Sidebar/Auxbar-Kontrakt „Dokument vs. App“: die bereits als Pflicht-Token geführte, aber ungenutzte –wk-sidebar-*-Familie wird zur tatsächlichen gemeinsamen Basis für Wiki-Doc-Sidebar/Page-TOC und Admin/Studio-.wk-shell-sidebar/-auxbar — zwei benannte Wertesätze statt drei divergenter Ad-hoc-Optiken; Studio-lokaler –wk-surface-muted-Override für Sidebar/Auxbar entfällt. |
| 15 | 2026-07-13 | Einstiegsabschnitte „Wegweiser“, „Wiederverwendbare Komponenten-Klassen“, „CSS-Compiler-Fallen (sitewide fatal)“ und „In 5 Schritten zum contract-konformen Plugin-CSS“. |
| 14 | 2026-07-12 | –wk-admin-btn-neutral-border auf Ivory (#D9D2C0) fixiert; Abschnitt „Core-Patches“. |
| 13 | 2026-07-11 | style.ini-[replacements]-Sync dem aktiven Farbschema automatisch nachgeführt. |
Workbench-Tracks und Dichte
Zusätzliche Custom Properties ohne Contract-Versionsänderung (rein additiv, kein bestehender Konsument ändert sein Verhalten):
--wk-workbench-{sidebar,auxbar}-width/-track— Spaltenbreiten des generischen Workbench-Grids; die-track-Wrapper gehören den Breakpoints, die-width-Werte dem Sash (Inline-Style). Konsument:wkfluentuiSektion WORKBENCH GRID.--wk-shell-statusbar-h— dichteabhängig:body[data-wk-density="compact"]setzt es auf 20px (Standard 22px).data-wk-density="compact"ambodyist der einzige Schalter der Dichte-Wirkschicht (Sektion DENSITY inwkfluentui/style.css); Toast-Statusfarben nutzen die bestehenden Status-Tokens--wk-{success,warning,error}.