Komponenten-Skin
Die Komponenten-Skin-Ebene gestaltet die integrierten Komponenten um. Sie baut auf einem spezifischen Styling-Stack und einem stabilen Hook-Vertrag auf.
Der Styling-Stack
Die integrierte Oberfläche verwendet vier Technologien gemeinsam:
- CSS-Module für komponentenbezogene Stile, mit gehashten Klassennamen, die explizit kein öffentlicher Vertrag sind.
- CSS-Custom-Properties für die semantischen Tokens (
--st-*). - Kaskadenebenen zur Ordnung der Wahrheitsquellen.
- Container-Queries für Layouts, die sich an den eigenen Container der
Komponente anpassen, mit Größen in
rem.
Themes zielen auf die Hook-Attribute, nie auf die generierten Klassennamen.
Kaskadenebenen-Reihenfolge
Alle Stile leben in einer festen Kaskadenebenen-Reihenfolge:
@layer reset, tokens, base, components, plugin-base, theme, user;
Spätere Ebenen gewinnen über frühere, sodass die Präzedenz ist:
reset— der Basis-Reset.tokens— die Token-Definitionen.base— Standardwerte auf Elementebene.components— die integrierten Komponentenstile.plugin-base— eine Ebene für vom Plugin bereitgestellte Basisstile.theme— der Skin des aktiven Themes.user— die eigenen Überschreibungen des Benutzers, die zuletzt laden.
Das Benutzer-Überschreibungs-Stylesheet lädt immer zuletzt, sodass ein
defektes oder eigenwilliges Theme den Benutzer nie daran hindern kann, es
zu überschreiben. In !important-Begriffen: Das Konstrukt ist in
Theme-CSS verboten, außer in der Ebene für
Barrierefreiheitspräferenzen, die zu den benutzerorientierten
A11y-Modi gehört.
Der Hook-Vertrag
Themes gestalten Komponenten über vier Attribute, die der Host veröffentlicht und die wie der Rest des SDKs versioniert sind:
<div
data-component="chat-message"
data-part="container"
data-role="assistant"
data-state="streaming"
></div>
data-component— die Komponentenart.data-part— der strukturelle Teil innerhalb einer Komponente.data-role— eine semantische Rolle, wie eine Nachrichtenrolle.data-state— ein Zustand wieopen,closedoderstreaming.
Das Skin-CSS eines Themes sieht dann so aus:
@layer theme {
[data-component='button'][data-variant='primary'] > [data-part='icon'] {
color: var(--st-color-accent-text);
}
[data-component='action-bar'] [data-part='group'][data-role='secondary'] {
color: var(--st-color-text-secondary);
}
}
Das Paket @neotavern/theme-sdk exportiert den Helfer dataHook zum Bauen
dieser Attributobjekte, sodass Komponentenautoren und Theme-Autoren
dieselben Namen verwenden.
Was kein Vertrag ist
- Generierte CSS-Modul-Klassennamen — gehasht, instabil und nicht Teil des SDKs. Ein Theme, das sie anspricht, bricht beim nächsten Build.
- Die interne React-Hierarchie — Themes dürfen nicht von Komponenten-Interna oder der DOM-Reihenfolge über die dokumentierten Hooks hinaus abhängen.
- Numerische Layout-Werte — Koordinaten, Grid-Schemata und Breakpoints
sind nicht über den Token-Vertrag gestaltbar;
Ansichtsfenster-Breakpoints leben im Registry, und Container-Queries
müssen in
remgeschrieben werden.
Verbotenes CSS
Theme-Stylesheets werden gescannt, bevor sie laden. Die verbotenen Konstrukte werden bei Installation und Validierung abgelehnt:
@importjavascript:-URLs undexpression().-moz-bindingundbehavior:.- Remote- oder protokollrelative URLs (
url(http:,url(https:,url(//). data:text/html.!important(außer der A11y-Präferenzen-Ebene).
Das hält Theme-CSS rein, lokal und sicher. Für die Tokens, die der Skin referenzieren sollte, siehe Design-Tokens; für die benannten Bereiche, die ein Skin umgestalten kann, siehe Shell-Vertrag.