API: iconos y marca
Los ids de iconos de Moodle con el nombre de Font Awesome con que cada versión los dibuja, y los colores y el logo del tema de Didactika.
Iconos
/api/icons.json relaciona cada id de icono que conoce Moodle con el nombre de Font Awesome con que lo dibuja cada versión. Moodle 5.x y 4.5 usan Font Awesome 6; 4.1 usa Font Awesome 4.7, así que un mismo id puede tener otro nombre (circle-plus o file-o).
{
"versions": [{"id": "v53", "family": "fa6"}, {"id": "v45", "family": "fa6"}, {"id": "v41", "family": "fa4"}],
"icons": {
"a/add_file": {"v53": "circle-plus", "v45": "circle-plus", "v41": "file-o"}
}
}
Un id de icono es <grupo>/<nombre>: t/ para los iconos de herramientas, i/ para los de elementos, a/ para acciones, e/ para el editor. En una plantilla de Moodle se escribe {{#pix}}t/add, core{{/pix}}; en PHP, $OUTPUT->pix_icon('t/add', get_string('add')).
const root = 'https://moodle-design.didactika.org';
const {versions, icons} = await (await fetch(root + '/api/icons.json')).json();
const family = Object.fromEntries(versions.map((v) => [v.id, v.family]));
const name = icons['t/edit'].v41; // un nombre de Font Awesome 4.7
const html = family.v41 === 'fa4' ? `<i class="fa fa-${name}"></i>` : `<i class="fa-solid fa-${name}"></i>`;
Un nombre que empieza por regular o brands ya lleva su familia. Un id sin entrada para una versión no tiene icono ahí: no se dibuja uno a mano. La regla es la misma en todo este sistema: los iconos vienen de Moodle, nunca se dibujan para un plugin. Si un plugin necesita un icono que Moodle no tiene, lleva un SVG en pix/ y lo llama con pix_icon de su propio componente.
Marca
/api/brand.json guarda la paleta del tema de Didactika y sus recursos:
| Campo | Significado |
|---|---|
name |
Didactika |
logo |
El color del logo |
teal |
La escala de 50 a 950 del color de marca |
extra |
Los pocos neutros y acentos que se usan además |
roles |
El color de cada rol de Bootstrap (primary, secondary, success, info, warning, danger, light, dark) con el tema de Didactika activo |
assets.logo, assets.icon, assets.share |
El logo, el icono y la imagen que se usa al compartir una página |
const brand = await (await fetch(root + '/api/brand.json')).json();
console.log(brand.roles.primary, brand.assets.logo);
Los roles son lo que aplica el interruptor “Tema de Didactika” de la cabecera; para recolorear con otra cosa se cambian las variables de Bootstrap, nunca los componentes. Cada rol llega a 4,5:1 con texto blanco (el rol claro es la excepción: lleva texto oscuro).
UI