Skin de componentes
El nivel de skin de componentes rediseña los componentes integrados. Se construye sobre una pila de estilos específica y un contrato de hooks estable.
La Pila de Estilos
La interfaz integrada usa cuatro tecnologías juntas:
- CSS Modules para estilos con ámbito de componente, con nombres de clase con hash que explícitamente no son un contrato público.
- Propiedades personalizadas de CSS para los tokens semánticos
(
--st-*). - Capas en cascada para ordenar las fuentes de verdad.
- Consultas de contenedor para diseños que se adaptan al propio
contenedor del componente, con tamaños expresados en
rem.
Los temas apuntan a los atributos de hooks, nunca a los nombres de clase generados.
Orden de las Capas en Cascada
Todos los estilos viven en un orden fijo de capas en cascada:
@layer reset, tokens, base, components, plugin-base, theme, user;
Las capas posteriores ganan sobre las anteriores, por lo que la precedencia es:
reset— el reset base.tokens— las definiciones de tokens.base— los valores predeterminados a nivel de elemento.components— los estilos de componentes integrados.plugin-base— una capa para los estilos base proporcionados por los plugins.theme— el skin del tema activo.user— las anulaciones del propio usuario, que se cargan al final.
La hoja de estilos de anulación del usuario siempre se carga al final, por
lo que un tema roto u opinado nunca puede impedir que el usuario lo anule.
En términos de !important: la construcción está prohibida en el CSS del
tema, excepto en la capa de preferencias de accesibilidad, que pertenece a
los modos de accesibilidad orientados al usuario.
El Contrato de Hooks
Los temas estilizan los componentes a través de cuatro atributos, publicados por el host y versionados como el resto del SDK:
<div
data-component="chat-message"
data-part="container"
data-role="assistant"
data-state="streaming"
></div>
data-component— el tipo de componente.data-part— la parte estructural dentro de un componente.data-role— un rol semántico, como un rol de mensaje.data-state— un estado, comoopen,closedostreaming.
El CSS del skin de un tema se ve así:
@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);
}
}
El paquete @neotavern/theme-sdk exporta el helper dataHook para construir
estos objetos de atributos, por lo que los autores de componentes y los
autores de temas coinciden en los mismos nombres.
Lo Que No Es un Contrato
- Los nombres de clase generados por CSS Modules — con hash, inestables y fuera del SDK. Un tema que los apunta se rompe en la próxima compilación.
- La jerarquía interna de React — los temas no deben depender de los internos de los componentes ni del orden del DOM más allá de los hooks documentados.
- Los valores de diseño numéricos — las coordenadas, los esquemas de
grid y los puntos de interrupción no se pueden estilizar a través del
contrato de tokens; los puntos de interrupción de viewport viven en el
registro y las consultas de contenedor deben escribirse en
rem.
CSS Prohibido
Las hojas de estilo de los temas se escanean antes de cargarse. Las construcciones prohibidas se rechazan en la instalación y la validación:
@import- URL
javascript:yexpression(). -moz-bindingybehavior:.- URL remotas o relativas al protocolo (
url(http:,url(https:,url(//). data:text/html.!important(excepto la capa de preferencias de accesibilidad).
Esto mantiene el CSS del tema puro, local y seguro. Para los tokens que el skin debe referenciar, consulta Tokens de diseño; para las áreas con nombre que un skin puede rediseñar, consulta Contrato del shell.