gestion_table_tournante_libre/src/interface/primitives/icones.js

64 lines
3 KiB
JavaScript
Raw Normal View History

// © 2026 TechnoLibre (http://www.technolibre.ca)
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
// Les icônes des primitives : des tracés SVG au trait, dans un carré de 24
// unités, que Icone.svelte dessine sans remplissage, du trait de la couleur
// courante (currentColor) — la couleur vient du jeton que lit le parent.
// Aucune ne porte de texte ni de couleur. Une icône est un signe redondant :
// un libellé l'accompagne toujours, et le dessin est caché aux technologies
// d'assistance.
//
// Un point se trace comme un cercle de rayon 1,5, que l'épaisseur du trait
// remplit : deux arcs qui se referment.
// Un cercle de centre (x, y) et de rayon r, en deux demi-arcs.
const cercle = (x, y, r) => `M${x + r} ${y}a${r} ${r} 0 1 1-${2 * r} 0a${r} ${r} 0 1 1 ${2 * r} 0`;
const DESSINS = [
// Les quatre états du plan (§ 9) : brouillon, proposé, retenu, bloqué.
['crayon', ['M4 20h4L19 9l-4-4L4 16z', 'M14 6l4 4']],
['listePoints', ['M9 6h11M9 12h11M9 18h11', 'M4 6h.01M4 12h.01M4 18h.01']],
['coche', ['M4 12l5 5L20 6']],
['cadenas', ['M6 11h12v9H6z', 'M8 11V8a4 4 0 0 1 8 0v3']],
// Les commandes et les repères des écrans.
['liste', ['M4 6h16M4 12h16M4 18h16']],
['importer', ['M12 3v12', 'M7 10l5 5 5-5', 'M4 21h16']],
['exporter', ['M12 15V3', 'M7 8l5-5 5 5', 'M4 21h16']],
['ajouter', ['M12 5v14', 'M5 12h14']],
['chercher', [cercle(11, 11, 7), 'M20 20l-4-4']],
['calendrier', ['M5 5h14a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2z', 'M3 10h18', 'M8 3v4', 'M16 3v4']],
// Les messages : information, avis, refus.
['information', [cercle(12, 12, 9), 'M12 11v5', 'M12 8h.01']],
['triangle', ['M12 3l10 18H2z', 'M12 10v5', 'M12 18h.01']],
['interdit', [cercle(12, 12, 9), 'M5.6 5.6l12.8 12.8']],
['dossier', ['M3 6h7l2 2h9v11H3z']],
// Les modes : lecture, écriture.
['oeil', ['M2 12s4-7 10-7 10 7 10 7-4 7-10 7S2 12 2 12z', cercle(12, 12, 3)]],
['stylo', ['M4 20h4L19 9l-4-4L4 16z']],
['defaire', ['M9 14L4 9l5-5', 'M4 9h11a5 5 0 0 1 0 10h-3']],
['imprimer', ['M6 9V3h12v6', 'M5 9h14a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2z', 'M7 14h10v7H7z']],
['etoile', ['M12 3l2.6 5.6 6.1.7-4.5 4.2 1.2 6L12 16.6 6.6 19.5l1.2-6L3.3 9.3l6.1-.7z']],
['croix', ['M6 6l12 12M18 6L6 18']],
['chevron', ['M9 6l6 6-6 6']],
['points', [cercle(5, 12, 1.5), cercle(12, 12, 1.5), cercle(19, 12, 1.5)]],
['demarrer', ['M8 5l11 7-11 7z']],
];
/** Les noms des icônes, dans l'ordre du module. */
export const NOMS_ICONES = Object.freeze(DESSINS.map(([nom]) => nom));
/** Chaque icône par son nom : la liste figée de ses tracés. */
export const ICONES = Object.freeze(Object.fromEntries(DESSINS.map(([nom, traces]) => [nom, Object.freeze(traces)])));
/**
* Les tracés d'une icône.
*
* @param {string} nom
* @returns {readonly string[]}
* @throws {RangeError} un nom hors de NOMS_ICONES
*/
export function traceIcone(nom) {
if (!NOMS_ICONES.includes(nom)) throw new RangeError(`icône inconnue : ${JSON.stringify(nom)}`);
return ICONES[nom];
}