IIO Theme Developer Guide
Diese Seite dokumentiert die komplette auswaehlbare Theme-Struktur in iio/theme sowie den internen Ablauf des Theme-Switchings im Manual.
Stand: April 2026, Schema: Family -> Theme -> assets/style.css mit b2b-basierter Vererbung.
Auswaehlbare Gesamtstruktur
Der Theme-Chooser liest alle Top-Level-Ordner unter iio/theme, mappt sie ueber theme-families.json auf Familien und schliesst legacy/families aus der direkten Auswahl aus.
| Family | Theme ID | Schema-Datei | Import-Kette | Status |
|---|---|---|---|---|
core | b2b | b2b/assets/style.css | ../solution-provider/assets/style.css | OK |
core | iio | iio/assets/style.css | ../../b2b/solution-provider/assets/style.css | OK |
core | iio-green | iio-green/assets/style.css | ../../b2b/solution-provider/assets/style.css | OK |
intelego | drama | drama/assets/style.css | ../../b2b/solution-provider/assets/style.css | OK |
intelego | classic | classic/assets/style.css | ../../b2b/solution-provider/assets/style.css | OK |
b2b | praezision | praezision/assets/style.css | ../../b2b/solution-provider/assets/style.css | OK |
b2b | publishing | publishing/assets/style.css | ../../b2b/solution-provider/assets/style.css | OK |
lynaear | lynäar | lynäar/assets/style.css | ../../b2b/solution-provider/assets/style.css | OK |
lynaear | linear | linear/assets/style.css | ../../b2b/solution-provider/assets/style.css | OK |
lynaear | raenil | raenil/assets/style.css | ../../b2b/solution-provider/assets/style.css | OK |
storyworld | genesis | genesis/assets/style.css | ../../b2b/solution-provider/assets/style.css | OK |
storyworld | magic | magic/assets/style.css | ../../b2b/solution-provider/assets/style.css | OK |
storyworld | ponyhof | ponyhof/assets/style.css | ../../b2b/solution-provider/assets/style.css | OK |
storyworld | balkangrill | balkangrill/assets/style.css | ../../b2b/solution-provider/assets/style.css | OK |
archive | - | - | - | Derzeit leer (Reserviert fuer Altfaelle) |
excluded | legacy | - | - | Nicht auswaehlbar (explizit ausgeschlossen) |
excluded | families | - | - | Nur Dokumentation/Organisation |
Top Header Control Center (aktuell)
Die Steuerung sitzt im Shell-Header (iio/theme/_shell.js). Der fruehere Standalone-Picker wird nicht mehr separat unterhalb der Navigation gemountet.
| Steuerung | Zweck | Persistenz | Technik |
|---|---|---|---|
| Operator-Preset | Setzt mehrere Header-Optionen in einem Schritt (CTO/Ops/Training) | iio-shell-preferences.presetId | Preset-Mapping in iio/theme/_shell.js |
| Theme-Familie | Filtert auf verfuegbare Themes je Family | iio-shell-preferences | Family-Metadaten aus theme-families.json |
| Theme | Aktiviert ein konkretes Theme | iio-theme-preference + iio-shell-preferences | IIOThemeSwitcher.setTheme(), #iio-active-theme-link |
| Sprache (UI) | Header-Beschriftungen DE/EN | iio-shell-preferences.uiLang | Label-Map in _shell.js |
| Sprachstil | Darstellungsstil technical/business/training | iio-shell-preferences.langStyle | data-iio-lang-style am body |
| Textdichte | Compact/Standard/Detailed Zeilenabstand | iio-shell-preferences.density | data-iio-density + CSS-Regeln |
| Schriftgroesse | Globaler Skalierungsfaktor | iio-shell-preferences.fontScale | --iio-shell-scale CSS-Variable |
| Nav-Modus | Kompakt oder Expanded fuer Seitenlisten | iio-shell-preferences.navMode | Steuert den Open-State der <details>-Listen |
| URL-Sync | Aktualisiert die URL bei Einstellungswechseln per history.replaceState | iio-shell-preferences.urlSync | On/Off Toggle in _shell.js |
| Reset auf Standard | Setzt Header-Praeferenzen auf Default-Werte zurueck | iio-shell-preferences | Reset-Button in _shell.js |
| Ansicht als Link teilen | Kopiert die aktuelle Header-Konfiguration als URL | - | Share-Button in _shell.js (Clipboard API) |
Preset-Profile (aktueller Stand)
- CTO Focus: EN, technical, compact, 100%, expanded, Family
core, Themeb2b. - Ops Daily: DE, technical, compact, 100%, expanded, Family
intelego, Thememodern. - Training Enablement: DE, training, detailed, 110%, compact, Family
storyworld, Thememagic. - Custom: automatisch aktiv, sobald Einzelwerte manuell geaendert werden.
URL-Parameter (Deep Links fuer Header-State)
Beim Teilen einer Ansicht werden diese Query-Parameter gesetzt und beim Laden ausgewertet:
preset=custom|cto|ops|traininglang=de|enstyle=technical|business|trainingdensity=compact|normal|detailedsize=90|100|110|120nav=compact|expandedsync=off|onfamily= Theme-Family-IDtheme= Theme-ID
Top-Level Directory Status (Cleanup)
Diese Tabelle zeigt alle vorhandenen Top-Level-Ordner in iio/theme mit aktuellem Status und empfohlener Aufraeum-Aktion.
| Dir | Status | Family/Zuordnung | Empfohlene Aktion |
|---|---|---|---|
b2b | ACTIVE_MAPPED | core / b2b | Behalten (Basis-Theme) |
balkangrill | ACTIVE_MAPPED | storyworld | Behalten |
families | EXCLUDED_INFRA | Dokumentation | Behalten (nicht als Theme) |
genesis | ACTIVE_MAPPED | storyworld | Behalten |
iio | ACTIVE_MAPPED | core | Behalten |
iio-green | ACTIVE_MAPPED | core | Behalten |
drama | ACTIVE_MAPPED | intelego/drama | Behalten |
classic | ACTIVE_MAPPED | intelego/classic | Behalten |
legacy | EXCLUDED_LEGACY | Historische Quelle | Optional archivieren oder read-only lassen |
linear | ACTIVE_MAPPED | lynaear | Behalten |
lynäar | ACTIVE_MAPPED | lynaear | Behalten |
magic | ACTIVE_MAPPED | storyworld | Behalten |
ponyhof | ACTIVE_MAPPED | storyworld | Behalten |
praezision | ACTIVE_MAPPED | b2b | Behalten |
publishing | ACTIVE_MAPPED | b2b | Behalten |
raenil | ACTIVE_MAPPED | lynaear | Behalten |
Interner Aufbau
1. Discovery
theme-switcher.jsliest per Directory Listing die Unterordner voniio/theme.- Ordner
legacyund versteckte Ordner werden bewusst gefiltert. - Jeder verbleibende Ordner wird als Theme-ID behandelt.
2. CSS-Aufloesung
- Resolver-Prio pro Theme:
assets/style.css→style.css→theme.css→theme-*.css. - Durch die Migration ist fuer alle aktiven Themes bereits
assets/style.cssvorhanden.
3. Aktivierung
- Der aktive Link wird als
#iio-active-theme-linkin den Head gesetzt. - Andere Theme-Stylesheet-Links werden deaktiviert, damit nur ein Theme gleichzeitig aktiv ist.
- Zusatzfarben werden via CSS-Variablen auf
:rootgesetzt.
4. Persistenz
- Storage-Key:
iio-theme-preference - Gespeichert wird die Theme-ID, nicht der Dateipfad.
Wie es im Manual verdrahtet ist
manual/*.htmlladen../theme/_shell.js._shell.jssetzt Navigation plus Header-Control-Center und laedttheme-switcher.js.theme-switcher.jsliefert Discovery/Resolver/Persistenz; die eigentliche Steuer-UI wird im Header gehostet.
Kernpfade: iio/theme/_shell.js, iio/theme/theme-switcher.js, iio/theme/*/assets/style.css
Operator Branding im Header
Manual-Seiten zeigen links neben IIO nicht das aktive Tenant-Logo, sondern das Branding des Tenants, der den Space aktuell betreibt.
- Quelle der Wahrheit:
specs/root/SPACE-OPERATOR-CONFIG.yaml - Der Sync
iio/specs/scripts/sync-public-state.shschreibt darauspublic/data/workspace-state.js. _shell.jslaedt diesen State zur Laufzeit und setzt daraus Favicon und Label-Fallbacks fail-closed.- Tenant-Seiten bleiben davon getrennt und nutzen weiter ihr eigenes Theme-Logo.
space_operator:
tenant: intelego
brand_label: Intelego
favicon_rel: families/intelego/classic/assets/brand/favicon-32.png
Developer Checkliste fuer neue Themes
- Neuen Ordner unter
iio/theme/THEME_IDanlegen. iio/theme/THEME_ID/assets/style.csserstellen.- Inhalt mit
@import url('../../b2b/solution-provider/assets/style.css');starten. - Eigene Variablen in
:rootsetzen (navy, blue-dark, blue-mid, blue-light, info). - Seite neu laden und Theme im Chooser auswaehlen.
Baukasten-Prinzip fuer Entwickler
Der IIO-Ansatz ist ein Baukasten mit klaren Schichten. Statt jede Seite neu zu bauen, werden stabile Bausteine kombiniert: Shell, Switcher, Basis-CSS und Theme-Overrides.
| Baustein | Aufgabe | Datei/Ort | Wann anfassen |
|---|---|---|---|
| Manual Shell | Globale Manual-Navigation + Laden des Theme-Switchers | iio/theme/_shell.js |
Neue Manual-Seiten, Nav-Logik, globale UX |
| Theme Switcher | Theme-Discovery, Auswahl, Persistenz, Aktivierung | iio/theme/theme-switcher.js |
Resolver-Reihenfolge, Dropdown, Storage, Fallback-Logik |
| Basis-Theme | Komplette Grund-Typografie, Layout, Komponenten-Look | iio/theme/families/b2b/solution-provider/assets/style.css |
Systemweite visuelle Basis veraendern |
| Theme-Adapter | Import der Basis + Farbprofil je Theme-ID | iio/theme/THEME_ID/assets/style.css |
Nur dieses Theme farblich/taktisch anpassen |
| Manual-Seiten | Inhalt und spezielle UI je Seite | iio/manual/*.html |
Fachliche Features, Tabellen, Visualisierungen |
Wo was hingehoert (Ablage-Regeln)
- Globale Theming-Logik nur in
theme-switcher.js. Keine Duplikate pro Seite. - Globale Manual-Navigation nur in
_shell.js. Seiten selbst sollen keine eigene fixe Nav-Struktur pflegen. - Theme-spezifische Farbe und Akzent in
THEME_ID/assets/style.css. - Komponenten-Styles fuer alle Themes in der b2b-Basisdatei.
- Seitenlokale Spezialfaelle in der jeweiligen Manual-Seite, aber nur wenn wirklich seitengebunden.
Faustregel: Verhalten zentral, Erscheinung pro Theme, Inhalt pro Seite.
Wie man mit dem Baukasten programmiert
Use Case A: Neue Manual-Seite bauen
- Neue Seite unter
iio/manual/anlegen. - Basis-CSS-Link setzen:
../../../iio/theme/families/b2b/solution-provider/assets/style.css. - Am Ende
<script src="../../../iio/theme/_shell.js"></script>einbinden. - Seiteninhalt als Cards/Tabellen/Panel schreiben, keine eigene Theme-Auswahl implementieren.
- Seite in
iio/manual/index.htmlverlinken.
Use Case B: Neues Theme hinzufuegen
- Ordner anlegen:
iio/theme/mein-theme/. - Datei anlegen:
iio/theme/mein-theme/assets/style.css. - Startinhalt: Import der b2b-Basis plus eigene
:root-Variablen. - Reload im Browser: Theme erscheint automatisch im Dropdown (Discovery ueber Ordnername).
- Theme auswaehlen, visuell pruefen, danach feinjustieren.
Use Case C: Systemweites UI-Verhalten aendern
- Komponenten-Style global: b2b-Basisdatei anpassen.
- Theme-spezifische Abweichungen: nur in den Adapter-Dateien je Theme.
- Resolver/Persistenz/Dropdown:
theme-switcher.js. - Navigation/Seitenliste:
_shell.js.
Use Case D: Betreiber des Space wechseln
specs/root/SPACE-OPERATOR-CONFIG.yamlanpassen.bash iio/specs/scripts/sync-public-state.sh /home/zolo/spaceausfuehren.- Manual neu laden und Header-Favicon gegen Betreiber-Brand pruefen.
- Tenant-Seiten separat pruefen, damit deren Theme-Logo unveraendert bleibt.
Konkretes Starttemplate fuer ein neues Theme
/* iio/theme/mein-theme/assets/style.css */
@import url('../../b2b/solution-provider/assets/style.css');
:root {
--color-navy: #1a2742;
--color-blue-dark: #2a4876;
--color-blue-mid: #3c6aa8;
--color-blue-light: #5f90d2;
--color-info: #2f6fa8;
}
Damit nutzt das Theme alle Basis-Komponenten sofort und ueberschreibt nur die Identitaetsfarben.
Technischer Ablauf beim Laden (intern)
- Manual-Seite laedt
_shell.js. _shell.jsstellt Navigation sicher und laedttheme-switcher.js.- Switcher liest Theme-Ordner unter
iio/theme. - Pro Theme wird CSS nach Prioritaet aufgeloest (normalerweise direkt
assets/style.css). - Aktives Theme wird in
#iio-active-theme-linkgeladen. - Nicht aktive Theme-Stylesheets werden deaktiviert.
- Theme-ID wird in LocalStorage gespeichert und beim naechsten Laden wiederhergestellt.
Debugging-Guide (wenn etwas nicht funktioniert)
| Symptom | Wahrscheinliche Ursache | Pruefung | Fix |
|---|---|---|---|
| Theme fehlt im Dropdown | Ordnername/Listing passt nicht | Liegt der Ordner direkt unter iio/theme? |
Ordner auf Top-Level verschieben, Namen bereinigen |
| Theme sichtbar, aber keine Aenderung | CSS-Datei leer/falsch importiert | Network + Inhalt von assets/style.css |
Importpfad korrigieren, Variablen setzen |
| Seite hat keine Navigation | _shell.js nicht eingebunden |
Script-Tag am Ende der Seite? | Shell-Script einfuegen |
| Theme springt nach Reload zurueck | LocalStorage-Blockade oder Key-Konflikt | Browser-Konsole + Storage-Eintrag | Storage erlauben, Key iio-theme-preference pruefen |
Release-Checkliste fuer menschliche Developer
- Jedes aktive Theme hat
assets/style.css. - Jede Manual-Seite bindet
_shell.jsein. - Theme-Wechsel funktioniert auf Desktop und Mobile.
- Kontrast fuer Text/Links ist lesbar.
- Keine inline Hotfixes in einzelnen Seiten, die globale Regeln brechen.
- Neue Seite ist in Hub und Shell-Navigation verlinkt.