Des pictos / icônes symboliques pour tout le monde
#4727
Open
opened 2 years ago by tcharlss
·
35 comments
No Branch/Tag Specified
1.8
1.9.1
1.9.2
2.0
2.1
3.0
3.1
3.2
4.0
4.1
4.2
boutons-danger
coquille_doc
debug_ecrire_fichier
dev-sortable
dev/autoloader
dev/hasard_fixe
dev/instituer_ergo
dev/issue_4626_menu_squelettes
dev/issue_5496_intro_ligne_null
dev_infos_image
fix/valider_url_distante
fix_issue_5454
fix_modifier_login
issue_4101
issue_4678
issue_4705
issue_4717
issue_4836
issue_4946
issue_5095
issue_5344
issue_5427_bis
master
v1.8.3+b
v1.9.1+i
v1.9.2+f
v1.9.2+g
v1.9.2+h
v1.9.2+i
v1.9.2+j
v1.9.2+k
v1.9.2+m
v1.9.2+n
v1.9.2+o
v1.9.2+p
v2.0.0
v2.0.1
v2.0.10
v2.0.11
v2.0.12
v2.0.13
v2.0.14
v2.0.15
v2.0.16
v2.0.17
v2.0.18
v2.0.19
v2.0.2
v2.0.20
v2.0.21
v2.0.22
v2.0.23
v2.0.24
v2.0.25
v2.0.26
v2.0.3
v2.0.5
v2.0.6
v2.0.7
v2.0.8
v2.0.9
v2.1.0
v2.1.1
v2.1.10
v2.1.11
v2.1.12
v2.1.13
v2.1.14
v2.1.15
v2.1.16
v2.1.17
v2.1.18
v2.1.19
v2.1.2
v2.1.20
v2.1.21
v2.1.22
v2.1.23
v2.1.24
v2.1.25
v2.1.26
v2.1.27
v2.1.28
v2.1.29
v2.1.3
v2.1.30
v2.1.4
v2.1.5
v2.1.6
v2.1.7
v2.1.8
v2.1.9
v3.0.0
v3.0.0-alpha.1
v3.0.0-beta
v3.0.0-beta.2
v3.0.0-rc
v3.0.1
v3.0.10
v3.0.11
v3.0.12
v3.0.13
v3.0.14
v3.0.15
v3.0.16
v3.0.17
v3.0.18
v3.0.19
v3.0.2
v3.0.20
v3.0.21
v3.0.22
v3.0.23
v3.0.24
v3.0.25
v3.0.26
v3.0.27
v3.0.28
v3.0.3
v3.0.4
v3.0.5
v3.0.6
v3.0.7
v3.0.8
v3.0.9
v3.1.0
v3.1.0-alpha
v3.1.0-beta
v3.1.0-rc
v3.1.0-rc.2
v3.1.0-rc.3
v3.1.1
v3.1.10
v3.1.11
v3.1.12
v3.1.13
v3.1.14
v3.1.15
v3.1.2
v3.1.3
v3.1.4
v3.1.5
v3.1.6
v3.1.7
v3.1.8
v3.1.9
v3.2-alpha.1
v3.2.0
v3.2.0-alpha.1
v3.2.0-beta
v3.2.0-beta.2
v3.2.0-beta.3
v3.2.1
v3.2.10
v3.2.11
v3.2.12
v3.2.13
v3.2.14
v3.2.15
v3.2.16
v3.2.17
v3.2.18
v3.2.19
v3.2.2
v3.2.3
v3.2.4
v3.2.5
v3.2.6
v3.2.7
v3.2.8
v3.2.9
v4.0.0
v4.0.0-alpha
v4.0.0-beta
v4.0.1
v4.0.10
v4.0.11
v4.0.2
v4.0.3
v4.0.4
v4.0.5
v4.0.6
v4.0.7
v4.0.8
v4.0.9
v4.1.0
v4.1.0-alpha
v4.1.0-beta
v4.1.0-rc
v4.1.1
v4.1.2
v4.1.3
v4.1.4
v4.1.5
v4.1.6
v4.1.7
v4.1.8
v4.1.9
v4.2.0
v4.2.0-alpha
v4.2.0-alpha2
v4.2.1
v4.2.2
Labels
Amélioration, nouvelle fonctionnalité APIs authentification base de données bug
Ca ne fonctionne pas code généré compilo css divers documentation doublon
Ce ticket est un doublon ergonomie espace privé filtres et balises formulaires Inscription installation invalide
Ticket invalide javascript langues LDAP plugin PostgreSQL refusé
Ignoré, c'est comme Ca... sécurité traduction
Apply labels
Clear labels
accessibilité
amélioration
Amélioration, nouvelle fonctionnalité APIs authentification base de données bug
Ca ne fonctionne pas code généré compilo css divers documentation doublon
Ce ticket est un doublon ergonomie espace privé filtres et balises formulaires Inscription installation invalide
Ticket invalide javascript langues LDAP plugin PostgreSQL refusé
Ignoré, c'est comme Ca... sécurité traduction
No Label
accessibilité
amélioration
APIs
authentification
base de données
bug
code généré
compilo
css
divers
documentation
doublon
ergonomie
espace privé
filtres et balises
formulaires
Inscription
installation
invalide
javascript
langues
LDAP
plugin
PostgreSQL
refusé
sécurité
traduction
Milestone
Set milestone
Clear milestone
No items
No Milestone
Projects
Clear projects
No project
Assignees
Assign users
Clear assignees
No Assignees
8 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.
No due date set.
Blocks
Reference in new issue
There is no content yet.
Delete Branch '%!s(MISSING)'
Deleting a branch is permanent. It CANNOT be undone. Continue?
No
Yes
Je fais un ticket pour la future PR et poser le plan d'action.
C'est la suite de #4562
Proposition pour intégrer un jeu complet d'icônes symboliques.
Les besoins sont multiples pour pleins d'éléments d'interface, dans le core et les plugins : des barres d'outils, des boutons d'actions, etc.
Et chacun doit réimplémenter ça un peu à sa sauce, notamment dans le privé.
C'est un besoin bien distinct des icônes svg de couleur dont on dispose actuellement dans le privé : on veut des pictos symboliques qui héritent de taille et de la couleur du texte, et issus d'un même set afin d'avoir un style unifié.
Cela vient donc en complément.
Il s'agit donc de reprendre un jeu d'icônes existant, qu'on n'aura pas à maintenir, optimisé, et qui fournit des icônes cohérentes visuellement, utilisables dans tous les contextes. Cf. plus bas pour une comparaison initiale des candidats possibles.
Utilisation
Ces icônes seraient utilisables de 2 façons :
1) Des classes .sp-icone
Des classes à ajouter à n'importe quel élément inline quand il s'agit d'icônes purement décoratives.
Ces classes pouvant finir dans squelettes utilisés dans le public, pour éviter les conflits, on propose
sp-icone
.Exemples :
2) Une balise #ICONE
En complément, on peut vouloir embarquer une icône svg dans le HTML.
On propose de reprendre et d'adapter la balise
#ICON
du plugin Zcore, qui fait ça très bien.Cette balise permet d'embarquer une icône du set par défaut, mais également n'importe quelle autre (je rentre pas dans les détails).
Un modèle correspondant permettra aussi d'inclure des icônes svg dans les textes :
<icone|icone=truc>
Identifiants sémantiques
Les identifiants des icônes seront directement ceux du jeu d'icônes choisi.
Mais ils peuvent avoir des noms un peu barbares : chevron-double-right, eye-slash, grip-vertical, etc.
Dans tous les cas on pourra les utiliser tels quels, mais en plus de ça, on propose de faire une correspondance sémantique pour les icônes correspondants aux actions les plus courantes. Par exemple au lieu de faire
#ICONE{chevron-double-down}
on pourra faire#ICONE{deplier}
.Cela passerait par un pipeline, donc liste qui peut être complétée selon ses besoins.
La liste initiale est visible ici : https://demo.hedgedoc.org/3zIXkcFLTVSwV0nKC1_qcA?both
Ressources privé / public
Cela veut dire 2 ressources à charger :
Dans le privé, il faut charger les 2.
Dans le public, cela pourrait se faire optionnellement, à la demande.
Candidats
Pour finir un tableau comparatif des jeux d'icônes possibles (à licences libres), avec mes commentaires initiaux.
Petite préférence pour Feather actuellement.
edit: voir aussi https://icones.js.org/
Sprite entre parenthèses = non fourni dans le dépôt ou la dist → poids théorique.
Les fontes d'icônes c'est pas top, c'est un peu déprécié aujourd'hui, ça pose pas mal de problèmes.
Mais si ça devait être utilisé, il faudrait des
<span class="icone truc" aria-hidden="true">
plutôt que des<i class="spicon_truc"></i>
Et les gros fichiers de sprites svg, ça diminue le nombre de hits, c'est sûr, mais charger plusieurs centaines de Ko de Sprites pour afficher 3 icônes, c'est peut être beaucoup.
Et c'est la misère à mettre à jour sans outil spécialisé qui regénère tout le code, et vérifier que ça ne casse pas des choses...
moi j'ai du mal avec "spipcon". Ca fait "petit con", et c'est pas compréhensible si on a pas l'historique derrière. Pour gagner 5 caractères...
Pour la partie « icônes purement en CSS », c'est à dire sans rien de plus dans le HTML, je crois qu'on n'a pas trop le choix.
Dans ce cas ce sont des pseudos-éléments CSS
:before
ou:after
, si on veut que l'icône hérite de la couleur et de la taille du texte, rien d'autre ne marche à ma connaissance. Pas les svg en background-image en tout cas.D'ailleurs au passage mon 2ème exemple était mauvais :
<i class="spicon_truc"></i> Du texte
→ dans ce cas c'est la balise#ICONE
qu'il faut utiliser.Pour les icônes CSS, la proposition était bien de n'avoir à qu'à ajouter une classe sur un élément existant, sans
<span>
ou<i>
supplémentaire à l'intérieur.Mais du coup oui, on tombe plein pot sur le problème soulevé par ces icônes à base de fontface : à priori les lecteurs d'écran vont lire ces caractères abscons, et sans moyen de les cacher puisque c'est purement du CSS.
Moi au départ je pensais que la balise #ICONE suffirait : des icônes présentes dans le HTML, ce qui permet de gérer tout les attributs d'accessibilité finement.
C'est bien pour ça qu'il faut trouver une balance entre le poids et le nombre d'icônes dispos.
La proposition à moyen et long terme c'est de généraliser l'usage de ces icônes dans le privé de Spip, donc ça sera pas chargé pour rien.
C'est bien l'idée :)
Un outil à piori dans un dépôt à part qui genère tout seul le sprite et le reste.
On se disait qu'on partirait plutôt sur
sp-icone
du coup.La fonte n'a aucune utilité à être insérée avec un HTML dédié avec une balise vide, que ce soit "i" ou "span" : si on a la main sur le HTML alors on doit plutôt l'insérer avec la balise, qui va utiliser le SVG, c'est la méthode à privilégier dans ce cas.
La fonte permet d'insérer une icône sur n'importe quel contenu déjà existant, justement parce qu'on n'a pas la main dessus, qu'on ne veut pas changer/surcharger son HTML. C'est à peu près la seule (mais grande) utilité d'avoir aussi la fonte.
Cela vaut notamment pour les noms sémantiques : si par exemple on a des boutons de suppressions (btn_supprimer) ou autre variante générique du même genre, et qu'on décide que cette variante doit avoir telle icône, alors ça doit être cohérent et ça doit avoir la même icône partout où il y a cette variante de bouton, core et tous les plugins du monde qui utilisent cette variante. Ensuite un an plus tard, on pense qu'un autre picto est mieux pour signifier la suppression : c'est juste un choix de déco, à aucun moment on ne doit avoir à modifier les dizaines d'utilisations dans le core + tous les plugins du monde, pour mettre un autre #ICONE, juste parce qu'on décide de changer le picto associé. On redéfinit ce que fait la classe CSS de la variante et c'est tout, c'est le principe même des CSS.
Sinon justement pour les pseudo-elements, il y a aussi une méthode officielle définie dans CSS pour ne pas forcément lire ces contenus !
À terme la méthode c'est ça :
https://www.w3.org/TR/css-content-3/#accessibility
Donc il y a bien une méthode existante pour que les fontes soient parfaitement accessibles, sur n'importe quel élément déjà existant. Après faut que ça marche sur firefox etc, car certains ignorent encore la ligne sans la comprendre. Peut-être qu'il faut doublonner comme on faisait avec rgba() pour les navs qui connaissaient pas.
https://stackoverflow.com/questions/46815260/hide-a-pseudo-element-from-a-screenreader
Mais en tout cas ça existe et c'est déjà implémenté pour beaucoup de gens, et c'est de mieux en mieux, donc il n'y a pas trop trop d'inquiétude à se faire sur le long terme pour l'accessibilité des symboles ajoutées par pseudo-éléments.
Hello,
dans les jeux d'icone candidat il y a aussi ForkAwesome qui est un fork de la version 4.7 de FontAwesome, et est sous licence libre https://forkaweso.me/Fork-Awesome/icons/ et OpenIconic https://useiconic.com/open (mais je connais pas trop).
A noter plusieurs remarques :
#ICON
pourrait détecter si l'image demandée est dans un sprite connu, auquel cas elle utilise le sprite, sinon elle utilise le fichier individuelPar contre je suis pas fan du tout non plus des font face pour les icones, du coup j'ai pas intégré ça dans les plugins ZCore/BS/FontAwesome même si c'est vrai que parfois c'est bien embêtant de pas avoir les classes comme outil.
Le second inconvénient de la font-face aussi, c'est que pour le coup c'est beaucoup plus compliqué de maintenir ton sous-ensemble d'icones, tu es obligé de prendre toute la police fournie par la lib d'icone, et ça veut dire que tu charges tout dès que tu uilises juste une icone quelque part en CSS :(
Peut-être il faut regarder du côté
Pour finir sur la méthodo, je pense qu'il faut murir le sujet et l'implémentation dans un plugin, qu'on pourra utiliser et affiner et l'intégrer au core le cas échéant dans une prochaine release.
Mon script de build pour les sprites
Ça c'est bien prévu dans le cahier des charges :)
Pour les classes, si ya une autre méthode que la fonte tant mieux hein, mais ce qui compte c'est continuer d'avoir l'option des classes, surtout pour l'interface d'admin. Car il y a plein de cas où c'est utile quand on veut avoir une interface cohérente maintenable, surtout si elle est modulaire (plugins infinis qui doivent avoir aussi le même style, sans devoir tout changer partout dès qu'on veut changer le style d'un morceau, dont les pictos).
Et pour une interface d'admin, il y a encore moins de freinage y compris pour une fonte, on parle pas du site public qui utilise 3 pictos (là c'est au choix de la personne intégratrice de faire les bonnes décisions). Pour l'admin on charge de toute façon des choses permanentes, dont les sprites, et on va de toute façon utiliser un certain nombre de pictos un peu partout + en rendre dispo pour les plugins + le fait que les fontes sont à peu près toujours plus légères que les sprites. Avec tout ça je ne vois pas de problème énorme à charger une fonte de 80 pauvres kilos pour ce qui est de l'admin… (on parle pas de 500ko là…)
Batailler pour ne pas intégrer 80ko voire même 40ko si on prend un jeu moins gros que bootstrap, c'est un peu dérisoire… :)
(et du coup justement ya PAS à maintenir un sous-ensemble, car déjà l'ensemble complet pèse bien moins lourd que les sprites SVG, ça fait de la maintenance en moins)
Sauf que quand tu fais un truc pour l'admin en disant "c'est que pour l'admin", 4 matins plus tard un plugin le réutilise pour le public, les yeux fermés, sans regarder les conséquences, et tu te retrouves à gérer la merde ensuite (cf le dateur, cf jqueryui, ...)
Comme je disais, en SCSS j'ai une mixin qui me permet des trucs comme ça, ce qui transforme :
mais bon, on va peut être pas mettre scssphp dans la dist...
On parle d'un woff de 80ko pour une lib de 1300 pictos, et donc sûrement carrément moins, 40ko, voire 30ko, voire 20ko, si on choisit une qui n'en a que 300. Même en choisissant celle à 1300 pictos, c'est sans commune mesure avec les 1Mo de UI (872ko de JS et 173ko de CSS). :)
Ça à l'air super intéressant le coup des CSS Masks en substitut des fontfaces.
Avec des classes utilisant le sprite svg (
mask-image: url(sprite.svg#machin);
, ça simplifierait beaucoup les choses : plus qu'une seule ressource à charger.J'ai plus souvenir s'il y avait des difficultés avec les pseudos éléments + background-image pour les tailles, que ça prenne automatiquement celle du texte. Mais à tester donc.
Et du coup juste à partir des svg, on pourrait générer en même temps le sprite et la css, über pratique.
Ok pour tester tout ça dans un plugin à part dans un 1er temps.
Juste une remarque au niveau du choix du jeu d'icônes : je pencherais pour un qui rappelle un peu stylistiquement les icônes actuelles du bandeau, c'est à dire un peu "douces", en mode "rounded", sans trop d'angles droits.
Testé brièvement : les
mask-image
fonctionnent très bien en substitut de la font-face, et ça hérite bien de la taille du texte.Donc partir des seuls svg il serait possible de générer à la fois le sprite et la CSS des classes sémantiques, super pratique.
Je crois que je vais partir là-dessus.
Un truc bizarre cependant : quand sur la même page on a à la fois un svg et une classe qui utilisent tous deux le même sprite svg, et bien le navigateur le charge 2 fois.
Peut-être qu'à ce compte là, la classe devrait utiliser les svg indépendants plutôt que le sprite. Enfin bon, ce seront des questions techniques secondaires à résoudre au fil de l'eau dans le plugin, je note juste ça au passage.
Je crois que les sprites SVG sont pas trop utilisables dans la css par contre, c'est pas supporté partout et c'est encore trop tot.
J'aurai tendance à dire que dans la css :
Mais du coup je crois en effet que quelle que soit la méthode on a des risques de double chargement (via le sprite pour la balise #ICON et via le fichier svg ou le base64 en css)
Ah mais du coup pointé dans la discussion sur les icones de l'espace privé https://remixicon.com/ semble un très bon package car
J'avoue que j'ai un faible pour ce jeu d'icones
Je penchais plus au départ pour des icônes en mode "rounded", mais faut avouer qu'elle est bien sympa cette remix.
Peut-être qu'en rusant il serait possible de forcer le style des terminaisons et des raccords pour arrondir légèrement. Mais bon ne bloquons pas là-dessus.
Si c'est celle-là qui est retenue, moi ça me va.
cedric - a écrit :
+1, simples et élégantes, et sous licence libre.
+1 ne serait que pour la monochromie car à ce jour le privé de la 3.3 fait un peu sapin de noël :p
Oui, il semble très bien ce jeu d'icone.
L'auteur s'est mis en pause cela dit https://github.com/Remix-Design/RemixIcon/issues/232 a priori temporairement.
Mais effectivement y a pas eu de nouveaux commits depuis un petit temps. Espérons que la lib continuera sa vie.
Rien n'empêche de la forker si besoin :)
Version cible mise à 4.1
Des nouvelles ici du coup ?
Je vois que https://github.com/Remix-Design/RemixIcon/issues/232 est toujours ouvert d’ailleurs, et qu’il n’y a pas eu de fork proposant d’autres icones depuis… Pas d’autres nouvelles de l’auteur dans le ticket (un des commentaires évoque une version Pro)
Ben j'ai l'impression que RemixIcon est préféré. En outre, c'est aussi une source d'inspiration de la refonte des logos.
Je ne suis pas sur que le fait qu'il n'évolue plus depuis 18 mois soit un problème non ?
Par contre, j'ai jeté un oeil sur les autres et aucun ne me plait autant.
Mon avis pour l'instant : Remixicon a déjà ~1200 icônes, d'ici à ce qu'on ait besoin d'une nouvelle icône qui manquerait, le projet aura peut-être été repris, et au pire on pourra en ajouter nous-mêmes en suivant la même charte. Ça coche plein de critères, très complet de base, en variantes lignes et pleines, sobre, super lisible, catégorisées, déjà en svg et font…
Pardon, je me suis mal exprimé en fait. J’ai rien contre RemixIcon : je signale juste.
Ma question était surtout, est-ce que ça a avancé le ticket ? (je crois pas avoir vu mais je demande) (en rapport avec le commentaire sur #4750)
Idéalement on pourrait faire en sorte de ne pas s'enchaîner à un jeu d'icônes si on voit plus tard qu'il n'est pas maintenu ou autre.
C'est à dire avoir une base d'identifiants fixes pour les icônes les plus utiles, qui ne changerait pas en passant d'un set à l'autre (reste à voir comment, c'est juste une idée).
En attendant Remix à l'air de convenir.
De mon côté j'avais commencé à implémenter quelque chose, puis j'avais buté sur des choix de conception. Depuis ça n'a pas trop avancé...
Il faut que je me replonge dedans et je détaillerai ici ce qui me bloque.
La réponse est dans le plan de départ 😄 : il doit de toute façon y avoir un mécanisme de mapping entre des identifiants ajoutés en plus (sémantiques à priori ou pas, on met ce qu'on veut) et les vrais noms finaux d'icones (deplier => chevron-double-down).
Au passage un site qui recense pleins de sets d'icônes signalé par @rastapopoulos : https://icones.js.org/
Et un autre pack d'icône ici https://iconoir.com/
Encore un autre pack de 1000 icones sous licence CCBY par ici https://app.streamlinehq.com/icons/streamline-mini-line
Un autre pour la route, issu de Carbon Design System par IBM https://carbondesignsystem.com/guidelines/icons/library/
Des nouvelles de ce côté ?
Pour info, feather qui semblait être à l'abandon a été forké vers https://lucide.dev/
J'ajoute une pièce dans la machine avec https://www.mingcute.com/
Et un autre pour la routé repéré par @marcimat :