Eigene CSS-Themes (Theme Library)

Ein eigenes CSS-Theme färbt ganz Marinara neu ein. In der Theme Library (Theme-Bibliothek) legst du Themes an, importierst und exportierst sie und wechselst zwischen ihnen. Diese Anleitung listet außerdem die CSS-Variablen und Klassen auf, die ein Theme nutzen kann, und erklärt, wie Themes mit Card CSS zusammenspielen. Für eine schnelle Änderung ohne CSS siehe Fertige Stile für Chat-Fenster.

Bevor du anfängst: Öffnest du Marinara von einem anderen Gerät aus, etwa vom Handy, braucht der Server ein Admin-Secret, bevor du Themes anlegen, bearbeiten, importieren, aktivieren oder entfernen kannst. Auf dem Rechner, auf dem der Server läuft, ist kein Secret nötig.

  1. Setze auf dem Server ADMIN_SECRET in der Datei .env.
  2. Öffne in der App Settings → Advanced → Admin Access (Einstellungen → Erweitert → Admin-Zugriff) und trag denselben Wert ein.

Siehe die Referenz zur Server-Konfiguration und die Anleitung zum Fernzugriff. Willst du zu einem Theme wechseln, das dir jemand gegeben hat, geh zu Ein Theme aktivieren.

Was ein eigenes Theme ist

CSS steht für Cascading Style Sheets und ist der Code, der Farben, Rahmen und Abstände festlegt. Ein Theme ist ein Block CSS, der den Seitenhintergrund, die Akzentfarbe, Karten, Rahmen, Text und mehr ändern kann.

Themes liegen in der Theme Library auf deinem Marinara-Server und erscheinen deshalb auf jedem Gerät, das sich mit demselben Server verbindet. Die meisten anderen Darstellungseinstellungen bleiben auf einem einzigen Gerät. Aktiv sein kann immer nur ein Theme, behalten kannst du so viele, wie du willst.

Wo die Theme Library steckt

  1. Öffne Settings.
  2. Öffne den Tab Addons.
  3. Such den Bereich Theme Library.

Ein Theme anlegen

  1. Klick im Bereich Theme Library auf Create Theme (Theme anlegen).
  2. Gib im Namensfeld einen Namen ein (dort steht „Theme name...“).
  3. Schreib dein CSS in das große Textfeld oder füg es dort ein.
  4. Lass Preview (Vorschau) an, um deine Änderungen beim Tippen live zu sehen. Schalte sie aus, um die Live-Vorschau zu beenden.
  5. Klick auf Save (Speichern).

Ein neues Theme startet mit einer Vorlage, die gängige Variablen als auskommentierte Beispiele auflistet. Entferne die Kommentarzeichen und trag eigene Werte ein. Ein brandneues Theme wird beim Speichern aktiviert, und du siehst: Theme "My Theme" saved and activated.

Um ein Theme später zu ändern, such es unter Installed Themes (installierte Themes), klick auf das Code-Symbol (Tooltip Edit theme CSS), bearbeite es und klick auf Save. Das Bearbeiten ändert nicht, welches Theme aktiv ist.

Themes importieren und exportieren

So importierst du ein Theme:

  1. Klick im Bereich Theme Library auf Import File (Datei importieren).
  2. Wähle eine .css- oder .json-Datei.
  3. Lies die Meldung. Sie nennt, wie viele Themes importiert, übersprungen oder nicht übernommen wurden.

Aus einer .css-Datei wird ein Theme, benannt nach der Datei. Eine .json-Datei kann ein oder mehrere Themes enthalten. Importiere eine aus Marinara exportierte Datei unverändert, oder schreib selbst eine kleine:

{ "name": "My Theme", "css": "..." }

Importierte Themes aktivieren sich nicht von selbst. Ein Theme mit demselben Namen und demselben CSS wie eines, das schon auf dem Server liegt, wird übersprungen.

Zum Exportieren klickst du in der Zeile des Themes unter Installed Themes auf das Upload-Symbol (Tooltip Export theme). Marinara lädt eine .json-Datei herunter, die du anderswo importieren kannst.

Ein Theme aktivieren

Installed Themes listet alle Themes auf, ganz oben mit dem Eintrag Default Theme (Standard-Theme).

  1. Klick auf den Namen eines Themes, um es zu aktivieren. Ein Häkchen zeigt das aktive Theme.
  2. Klick auf Default Theme, um eigene Themes abzuschalten und zum eingebauten Aussehen zurückzukehren.

Reset Appearance (Darstellung zurücksetzen) oben in App Style (App-Stil) unter Settings → Appearance (Einstellungen → Darstellung) schaltet ebenfalls das aktive Theme ab.

Um ein Theme zu löschen, klick auf das Papierkorb-Symbol (Tooltip Remove theme) und bestätige im Dialogfenster Delete Theme. Damit wird sein CSS dauerhaft vom Server gelöscht.

Wenn es nicht funktioniert hat: Sieht die App falsch aus, prüf sowohl das aktive Theme als auch etwaiges Card CSS im Chat. Siehe Themes und Card CSS.

Fertige Stile für Chat-Fenster

Bevor du anfängst: Dafür brauchst du kein CSS.

  1. Öffne Settings → Appearance → App.
  2. Such unten in App Style den Eintrag Chat widget style (Chat-Widget-Stil).
  3. Wähl einen Stil.
StilAussehen
Default (Standard)Das ursprüngliche Aussehen.
DottoreEisblaue Instrumentenrahmen, helle Metallkanten und abgeschrägte Ecken.
Prof. MariGoldgesäumte Märchenbuchrahmen, Edelsteinblau und Primogems an den Fenstertiteln. Seine Schaltflächen nutzen denselben Hintergrund wie seine Fenster.

Jeder Stil hat eine eigene Schrift, funktioniert im hellen und dunklen Modus und gestaltet Schaltflächen, Fenster und aufklappbare Abschnitte gemeinsam. Die Wahl eines Stils setzt Font (Schrift), Shape (Form) und alle drei Farben zurück. Deine Fensterpositionen bleiben erhalten.

Diese Einstellungen kannst du einzeln ändern:

Jede Farbe hat einen Farbwähler für eine einheitliche Farbe und eine Option für einen Farbverlauf. Reset color (Farbe zurücksetzen) neben einer Einstellung folgt wieder den hellen oder dunklen Farben des Stils. Dekorative Embleme behalten ihre ursprünglichen Farben.

Den Stil in den Chat übertragen

Drei Schalter unter den Farbwählern erweitern den Stil. Jeder ist anfangs aus und funktioniert für sich. Schaltest du einen aus, kehrt dieser Teil zur üblichen Chatgestaltung zurück, und die Wahl eines anderen Stils behält deine Schalterstellungen bei.

SchalterWas er anwendet
Apply preset font (Preset-Schrift anwenden)Die Widget-Schrift, für Nachrichten, Eingabefelder und Chat-Bedienelemente.
Apply preset shape (Preset-Form anwenden)Die Rahmenform, für Roleplay-Nachrichten (klassisch und Visual Novel), das Game-Dialogfeld, Eingabefelder und Bedienelemente. Conversation-Nachrichten behalten ihre eigene Form.
Apply preset colors (Preset-Farben anwenden)Die Rahmen-, Hintergrund- und Textfarben für diese Bereiche, einschließlich Conversation-Nachrichten. Auch deine eigenen Farben und Farbverläufe gelten dort. Wörtliche Rede behält die eigene Dialogue Highlight Color des jeweiligen Charakters oder der jeweiligen Persona. Eine Nachricht aus HTML, etwa die gestaltete Karte eines Agenten, behält die Textfarben, die sie selbst festlegt.

Die Verlaufsschaltflächen Load More (Mehr laden) und Show older (Ältere anzeigen) folgen den Schaltern wie andere Chat-Bedienelemente. Im Game Mode gelten die Schalter außerdem für Randbemerkungen, HUD-Widgets, das Kartenpanel, Charakterbögen, Protokolle, das Inventar, Kampfpanels und Dialogfenster. Professor Mari kann auch eigene Themes für diese Bereiche erstellen.

Ein eigenes Theme kann die Stile weiterhin überschreiben. Die Variablen für Fenster und Abschnitte weiter unten haben Vorrang vor den Farben des Stils. Nutze --mari-window-font-family für die Fensterschrift, --mari-drawer-radius für die Ecken der Abschnitte und --mari-window-ornament: none, um die Verzierung am Titel auszublenden. Um alle Verzierungen des Stils zu entfernen, wähle zuerst Default.

Themes und Card CSS

Marinara kennt zwei Wege, eigenes CSS einzubringen, und beide können gleichzeitig aktiv sein.

Grenzen für Größe und Name

Ein Theme-Name darf bis zu 200 Zeichen lang sein. Das CSS darf bis zu 256 KiB umfassen, gemessen in UTF-8-Bytes. Ein größeres Theme wird beim Speichern oder Importieren abgelehnt. Das CSS eigener Themes wird außerdem bereinigt, bevor es wirkt: Stile, die eine Datei von einer anderen Website laden, funktionieren nicht. Bette ein Bild oder eine Schrift stattdessen als data:-URI ein.

Die CSS-Variablen-Referenz

Im Theme-Editor gibt es eine ausklappbare CSS Variable Reference (CSS-Variablen-Referenz). Ein Klick darauf zeigt die nützlichsten Variablen, die sich überschreiben lassen. Ein Theme verändert die App, indem es diese Variablen in einem :root-Block setzt. Die Referenz listet folgende Variablen:

VariableWirkung
--backgroundSeitenhintergrund
--foregroundHaupttext
--primaryAkzent und Schaltflächen
--primary-foregroundText auf Primärfarbe
--secondaryKarten und Eingabefelder
--cardKartenhintergrund
--borderRahmen
--muted-foregroundGedimmter Text
--sidebarHintergrund der Seitenleiste
--sidebar-borderRahmen der Seitenleiste
--marinara-shell-edge-borderLinker und rechter Rand der Hülle
--destructiveFehler und Löschen
--popoverHintergrund des Dropdown-Menüs
--accentHervorhebung beim Draufzeigen

Ein Theme kann jede CSS-Variable setzen, die Marinara verwendet, nicht nur diese. Manche Effekte haben eigene Variablen. Zum Beispiel fordert --marinara-theme-accent-pulse: enabled die pulsierende Akzent-Animation an.

Chat-Fenster und aufklappbare Abschnitte gestalten

Am Computer öffnet sich Chat Settings als verschiebbares Fenster. Seine aufklappbaren Abschnitte heißen drawers. Ein Abschnitt lässt sich in ein eigenes Fenster herauslösen und anschließend zu einer kleinen verschiebbaren Schaltfläche minimieren, einer bubble.

Auch andere Chat-Tools nutzen diese Fenster und Schaltflächen: Game controls, Session, Volume, Game Assets, verknüpfte Chats und Paket-Bedienelemente. Am Telefon öffnen sich die meisten Fenster als Panels über die ganze Breite; Echo Chamber bleibt ein kompaktes Fenster, das du verschieben und dessen Größe du ändern kannst. Aus Chat Settings herausgelöste Tools erscheinen im verschiebbaren Drei-Punkte-Menü Chat tools (Chat-Tools); Tracker-Schaltflächen bleiben separat.

Mit den folgenden Klassen, Datenattributen und Variablen gestaltet ein Theme diese Teile gemeinsam. Deine Theme-Regeln überschreiben die Standardwerte ohne !important.

Klassen

TeilKlasse
Fenster.mari-window
Titelleiste.mari-window__header
Titel und sein Symbol.mari-window__title-row
Titel.mari-window__title
Schaltflächen der Titelleiste (Reset View, Favoritenstern, Tracker Panel, Anheften, Sperren, Schließen, Put back).mari-window__controls (jede Schaltfläche hat .mari-window__control)
Fensterinhalt.mari-window__body
Kanten und Ecken zur Größenänderung.mari-window__resize-handle
Eckmarkierung, wenn Mauszeiger oder Tastaturfokus im Fenster liegen.mari-window__resize-grip
Aufklappbarer Abschnitt.mari-drawer
Kopfzeile und Titel des Abschnitts.mari-drawer__header, .mari-drawer__title
Symbol, Anzahl und ? des Abschnitts.mari-drawer__icon, .mari-drawer__count, .mari-drawer__help
Vorschau eines zugeklappten Abschnitts (das kleine Tracker-Widget).mari-drawer__summary
Schaltflächen neben dem Pfeil und zum Herauslösen.mari-drawer__actions, .mari-drawer__popout
Pfeil und Inhalt des Abschnitts.mari-drawer__arrow, .mari-drawer__body
Vorschau, die beim Herausziehen eines Abschnitts dem Mauszeiger folgt.mari-drawer-ghost
Schaltfläche eines minimierten Fensters (bubble).mari-window-bubble
Aktuelle Übersicht, die eine Fensterschaltfläche statt ihres Symbols zeigt (das Banner von World State).mari-window-bubble__banner
Hilfslinie beim Ausrichten einer gezogenen Schaltfläche an einer anderen.mari-window-snap-guide
Punkt während der Arbeit von Agenten (Chat-Settings-Schaltfläche, Trackers-Fenster).mari-agents-running-dot

Datenattribute

Variablen

Jede Variable fällt auf die gemeinsamen Farben der Chat-Bedienelemente zurück. Ein Theme muss deshalb nur die Werte festlegen, die es ändern soll.

VariableWas sie steuert
--mari-window-bgFensterhintergrund
--mari-window-textFenstertext
--mari-window-border, --mari-window-border-widthFensterrahmen
--mari-window-radiusRundung der Fensterecken
--mari-window-shadowFensterschatten
--mari-window-backdrop-filterUnschärfe hinter dem Fenster
--mari-window-header-bg, --mari-window-header-text, --mari-window-header-borderFarben der Titelleiste
--mari-window-header-paddingInnenabstände der Titelleiste
--mari-window-control-color, --mari-window-control-color-hover, --mari-window-control-bg-hoverSchaltflächen der Titelleiste, einschließlich Favoritenstern
--mari-window-control-color-active, --mari-window-control-bg-activeAktivierte Titelleisten-Schaltflächen, einschließlich Anheften, Sperren und ausgefülltem Favoritenstern
--mari-window-control-radius, --mari-window-control-gapRundung und Abstand der Schaltflächen
--mari-window-focus-ringUmriss für den Tastaturfokus und für das Fenster, in das ein Abschnitt zurückgelegt wird
--mari-window-resize-handle-sizeBreite der Kanten zur Größenänderung
--mari-window-bubble-size, --mari-window-bubble-radius, --mari-window-bubble-shadowGröße, Rundung und Schatten der Fensterschaltfläche
--mari-window-bubble-bg, --mari-window-bubble-bg-hover, --mari-window-bubble-borderHintergrund und Rahmen der Fensterschaltfläche
--mari-window-bubble-text, --mari-window-bubble-text-hoverSymbolfarbe der Fensterschaltfläche
--mari-window-snap-guideFarbe der Ausrichtungslinie
--mari-drawer-bg, --mari-drawer-borderHintergrund und Trennlinie des Abschnitts
--mari-drawer-header-bg, --mari-drawer-header-bg-hoverFarben der Abschnittskopfzeile
--mari-drawer-header-padding, --mari-drawer-body-padding-inline, --mari-drawer-body-padding-bottomAbstände im Abschnitt
--mari-drawer-title-color, --mari-drawer-icon-color, --mari-drawer-arrow-colorText und Symbole der Abschnittskopfzeile
--mari-drawer-count-bg, --mari-drawer-count-textAnzahl-Markierung am Abschnitt

Setze eine Variable in :root, um alle Fenster zu ändern, oder an einem Selektor für ein einzelnes Fenster:

:root {
  --mari-window-radius: 0.5rem;
  --mari-window-bubble-bg: #3b0764;
}

[data-window="chat-settings"] .mari-drawer[data-drawer="chat-name"] {
  --mari-drawer-border: transparent;
}

Nachrichten, Eingabefelder und Chat-Bedienelemente gestalten

Mit den drei Apply preset-Schaltern kann auch ein eigenes Theme das Widget-Design im restlichen Chat nutzen. Ein Theme kann jeden Teil mit den folgenden Variablen überschreiben. Bitte Professor Mari um ein passendes Chat-Theme, wenn du das CSS nicht selbst schreiben möchtest.

TeilKlasse
Nachrichtenfelder in Roleplay und Game, Randbemerkungen, HUD-Widgets, Kartenpanel und Charakterbögen in Game sowie Chat-Eingabefelder.mari-chat-style-surface
Protokolle, Inventar, Kampfpanels, Entscheidungen und Dialogfenster in Game; die Panels tragen zusätzlich data-game-section mit ihrem Namen, etwa logs, inventory oder combat-actions.mari-game-section.mari-chat-style-surface
Game-Inhalte in einem Fenster wie dem Journal, die sich nach den Farben des Fensters richten.mari-game-section
Conversation-Nachrichten (nur Schrift und Farben).mari-chat-style-conversation
Conversation-Nachrichtentext ohne Rahmen.mari-chat-style-text
Chat-Bedienelemente, einschließlich Calls und Conversation-Gruppensteuerung.mari-chat-style-control
Verlaufsschaltflächen: Load More, Show older, Show newer, Latest sowie Older, All und Show more older logs in den Game-Protokollen. Sie haben zusätzlich .mari-chat-style-control.mari-chat-history-pager
Eine Nachricht aus HTML, etwa die gestaltete Karte eines Agenten. Darin gesetzte Textfarben bleiben erhalten, wenn Apply preset colors an ist.mari-html-content
VariableWirkung
--mari-chat-font-familySchrift für die zugehörigen Chatbereiche
--mari-chat-bgHintergrund der Felder; nimmt eine Farbe oder einen Farbverlauf an
--mari-chat-textLesbare einheitliche Textfarbe
--mari-chat-borderUmriss der Felder; nimmt eine Farbe oder einen Farbverlauf an
--mari-chat-border-colorEinheitliche Ersatzfarbe für den Rahmen
--mari-chat-radiusEckenrundung, außer bei Conversation-Nachrichten
--mari-chat-control-bg, --mari-chat-control-bg-hoverHintergründe der Chat-Schaltflächen
--mari-chat-control-color, --mari-chat-control-radiusSymbolfarbe und Rundung der Chat-Schaltflächen
--mari-chat-input-bgHintergrund in Eingabefeldern

Ein Beispiel mit eingeschaltetem Apply preset font und Apply preset colors:

:root {
  --mari-chat-font-family: Georgia, serif;
  --mari-chat-bg: #251e29;
  --mari-chat-text: #f4e8dc;
  --mari-chat-border: linear-gradient(100deg, #d6aa66, #dda0b2);
}

Nicht gesetzte Variablen folgen den Widget-Einstellungen und dem Preset. Damit diese Variablen über die eingebaute Gestaltung wirken, muss der zugehörige Schalter an sein. Conversation-Nachrichten behalten ihre eigene Form, auch wenn Apply preset shape an ist. Eigene Themes können die Klassen auch direkt ansprechen; Fokusumrisse, Menüs und Nachrichteninhalte dürfen dabei nicht von dekorativen Formen abgeschnitten werden.

Am Telefon klappt das Drei-Punkte-Menü zu runden Schaltflächen auf. Sein Auslöser ist [data-chat-tools-menu-button], die geöffnete Spalte ist [data-chat-tools-menu], und bei jedem Listeneintrag enthält data-chat-tools-menu-item die Fenster-ID. Tool-Schaltflächen nutzen .mari-window-bubble.mari-chat-tools-button und data-chat-tools-menu-tool mit derselben ID. Die Spalte hat keinen Fensterrahmen. Ihre Schaltflächen folgen den Widget-Farben und der Schaltflächengröße unabhängig von den drei Schaltern für den restlichen Chat und behalten dabei ihre runde Form.

Verwandte Anleitungen