ADR 026: Arquitectura de tema del panel (4 capas)¶
Estado¶
Aceptado — 2026-07
Relacionado con ADR 003, ADR 012, ADR 016.
Contexto¶
El panel CUS separa declaración de negocio (manifests, dashboards, forms) del runtime React. La capa visual debe ser intercambiable por namespace de panel sin duplicar lógica en plugins.
Zen Garden (operations.css, hooks cortex-panel-*) inició la separación esqueleto/skin. Falta un contrato estable para estilos, plantillas, estáticos y slots de shell.
Decisión¶
Cuatro capas de presentación, análogas al ensamblaje clásico diseño → plantilla → estilo → estáticos:
| Capa | Responsabilidad | Implementación HIVE |
|---|---|---|
| Layouts | Diagramación y distribución | CUS dashboards, layoutHandle en pantallas, renderHooks, layoutSlots en configuración del panel |
| Templates | Markup intercambiable por skin | WidgetRegistry.resolve(type, skin) → type@skin opcional |
| Styles | Tokens y apariencia | packages/cortex-panel-shadcn/src/skins/{skin}.css bajo [data-skin] |
| Statics | Imágenes y medios | framework/web-shadcn/public/skins/{skin}/assets/ con fallback a base |
Herencia de skin¶
- Skin
base: tokens neutros shadcn. - Skin
operations: extiendebase(import CSS + overrides de marca). PanelTheme.skinen API selecciona el skin activo (data-skinen<html>).
Runtime¶
ThemeProvideraplica modo claro/oscuro y skin activo.PanelShellleepanel.configuration.theme.skiny actualiza el skin.resolveSkinAsset(skin, key)resuelve rutas con fallback/skins/base/assets/.WidgetRendererusaregistry.resolve(type, skin, config.template).
Slots de shell (MVP)¶
| Slot | Uso |
|---|---|
shell.sidebar.footer | CTA sidebar (p. ej. float IA) |
module.header.stats | KPIs del header (alias de headerWidgets + renderHooks) |
module.header.actions | Acciones del header |
Los hosts declaran slots vía PanelBuilder.layout_slot().
Consecuencias¶
- Cambiar apariencia del panel operations = editar
operations.css+ assets enpublic/skins/operations/. - Nuevo skin = CSS + carpeta assets + registro en
skinManifest.ts; plugins sin cambios. - Layout merge registry (ADR 016) sigue aplicando al contenido CUS; slots cubren el chrome del shell.
Referencias¶
packages/cortex-panel-shadcn/src/skins/packages/cortex-panel-shadcn/src/assets/resolveSkinAsset.tspackages/cortex-panel-shadcn/src/theme/skinLoader.tsreports/FIGMA-PARITY-OPERATIONS-2026-07-21.md