// ─── Jeu d'icônes ──────────────────────────────────────────────────────────── // Un seul trait pour toute l'interface : 24 unités de côté, 1,8 d'épaisseur, // extrémités et jonctions arrondies — celui des deux icônes de la maquette // (dépôt et envoi), étendu au reste de l'application. // // Elles étaient jusqu'ici des GLYPHES DE TEXTE (↻ × ☰ 🗑 ✎ ↓ ▸). C'est le // système d'exploitation qui les dessinait : le même bouton sortait fin sur // macOS, gras et bleuté sur Windows (émojis en couleur), et carrément absent sur // un serveur sans police d'émojis. Aucune cohérence possible, et rien à régler // depuis la feuille de style. En SVG, elles suivent currentColor et la taille // qu'on leur donne. // // Ajouter une icône : une entrée ici, et rien d'autre — surtout pas un second // dessin ailleurs, c'est ainsi que le trait finit par diverger. const ICONS = { menu: '', close: '', refresh: '', pencil: '', trash: '', download: '', arrowDown: '', folder: '', file: '', image: '', plus: '', chevron: '', search: '', // Anneau ouvert : c'est la ROTATION (CSS) qui en fait un indicateur d'activité, // le dessin reste au même trait que le reste du jeu. spinner: '', sun: '', }; // iconHTML rend l'icône en chaîne, pour les endroits qui composent déjà du // balisage. `aria-hidden` : le sens est porté par le title/aria-label du bouton, // jamais par le dessin. function iconHTML(name, size){ const d = ICONS[name]; if(!d) return ''; const n = size || 18; return ''; } // icon rend l'icône en ÉLÉMENT, pour les listes construites en DOM (fichiers, // discussions) où l'on ne veut pas d'innerHTML. function icon(name, size){ const span = document.createElement('span'); span.className = 'icn'; span.innerHTML = iconHTML(name, size); // contenu constant, jamais de donnée return span.firstElementChild || span; }