Tareas #8562
Feature: Soporte para inyección de estilos CSS personalizados mediante JSON de configuración
| Estado: | Nueva | Fecha de inicio: | 2026-03-04 | |
|---|---|---|---|---|
| Prioridad: | Normal | Fecha fin: | ||
| Asignado a: | Desarrollo | % Realizado: | 0% | |
| Categoría: | Desarrollo | Tiempo dedicado: | - | |
| Versión prevista: | Backlog widget | |||
| App related: | Tipo de funcionalidad: |
Descripción
Objetivo:¶
Extender las capacidades de personalización del componente permitiendo la definición de reglas CSS arbitrarias dentro de la clave styles del objeto theme.
Especificación del JSON:¶
Se debe dar soporte a una nueva estructura dentro de la configuración del tema:
"theme": { "name": "light", "colors": { "primary": "#BB0000", "secondary": "#6c757d" }, "fontFamily": "system-ui, ...", "fontSize": "12px", "styles": { "ul li": { "list-style": "none", "padding": "0" } } }
Reglas de Implementación (Vue.js):¶
- Encapsulamiento: Cualquier estilo declarado en el objeto styles debe ser inyectado en el DOM teniendo como ancestro obligatorio la clase .df-widgets.
- Transformación: El sistema debe parsear el JSON para generar una salida CSS válida.
Ejemplo de salida esperada:
.df-widgets ul li { list-style: none; padding: 0; }
Alcance: Asegurar que la inyección sea dinámica y responda a los cambios del tema cargado.
Criterios de Aceptación:¶
- El sistema debe renderizar los estilos correctamente al cargar el JSON.
- Los estilos inyectados no deben afectar elementos fuera del contenedor
.df-widgets.
Notas Técnicas para Desarrollo:¶
- Carga Única: La lógica de generación debe ejecutarse en el hook
onMountedo mediante uncomputedque procese el estado inicial del store. - Inyección en el DOM: Crear un elemento
<style id="df-dynamic-theme">e insertarlo al final del<head>para asegurar prioridad por cascada. - Sanitización (Seguridad): Es imperativo validar que los valores no contengan caracteres de escape que permitan inyectar CSS fuera del scope.
- Problema a evitar: Un JSON malintencionado podría intentar cerrar la llave prematuramente para afectar elementos globales:
"styles": { "ul li": { "list-style": "none; } body { display: none !important; } .df-widgets { \": \"none" } } - Resultado malicioso:
.df-widgets ul li { list-style: none; } body { display: none !important; } ... } - Solución: Escapar o eliminar llaves de cierre
}y caracteres especiales en los valores de las propiedades antes de la concatenación.
- Problema a evitar: Un JSON malintencionado podría intentar cerrar la llave prematuramente para afectar elementos globales: