Vous pouvez remplacer les icônes SVG par défaut de Discourse individuellement ou dans leur ensemble par vos propres SVG personnalisés et les remplacer dans un thème ou un composant de thème.
Étape 1 - Créer une feuille de sprites SVG
Pour commencer, vous devez créer une feuille de sprites SVG. Celle-ci peut contenir n’importe quoi, d’une seule icône SVG personnalisée supplémentaire à un ensemble complet de remplacement de centaines.
La feuille de sprites doit être enregistrée en tant que fichier SVG. En principe, vous imbriquez le contenu de la balise <svg> du fichier d’icône SVG d’origine dans des balises <symbol> et leur donnez un identifiant agréable.
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="my-theme-icon-1">
<!--
Code à l'intérieur de la balise <svg> du fichier d'icône SVG source
c'est typiquement tout ce qui se trouve entre les balises <svg>
(mais pas la balise SVG elle-même, qui est remplacée par <symbol> ci-dessus)
Vous pouvez transférer n'importe quel attribut (c'est-à-dire ViewBox="0 0 0 0") à la balise <symbol>
-->
</symbol>
<symbol id="my-theme-icon-2">
<!-- Code SVG ici. Ajoutez plus de blocs <symbol> si nécessaire.
-->
</symbol>
</svg>
-
Assurez-vous d’ajouter un ID personnalisé à chaque symbole dans la feuille de sprites. Il est probablement utile pour votre santé mentale de préfixer vos ID avec le nom de votre thème
my-theme-icon. -
Pour que la couleur de l’icône soit dynamique comme les icônes existantes, définissez le remplissage sur
currentColorplutôt qu’une couleur codée en dur (comme #333) -
Pour mettre à l’échelle ou centrer correctement votre icône, utilisez un attribut
viewBoxsur la balise<symbol>. Consultez How to Scale SVG | CSS-Tricks pour plus d’informations. -
Faites attention aux collisions de style dans vos SVG. Par exemple, les SVG auront souvent un style en ligne tel que
.st0{fill:#FF0000;}défini. Si vous avez plusieurs SVG utilisant les mêmes classes, cela peut causer des problèmes (pour résoudre ces problèmes, modifiez les classes pour qu’elles soient uniques à chaque icône). -
Si vous avez beaucoup d’icônes, il existe des moyens d’automatiser cela. https://www.npmjs.com/package/svg-sprite-generator est un outil simple en ligne de commande pour combiner des SVG en une feuille de sprites.
Exemple - feuille de sprites d’icône personnalisée unique
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="bat-icon" viewBox="6 6 36 36">
<path
fill="currentColor"
d="M24,18.2c0.7,0,0.9,0.2,0.9,0.2l0.4-1.7c0,0,0.4,1.5,0.4,2.8c0.2,1.1,2.2,0.4,3.9,0C31.4,19.1,32,16,32,16h16c0,0-9.4,3.5-7,10c0,0-14.8-2-17,7l0,0c-2.2-9-17-7-17-7c2.4-6.5-7-10-7-10h16c0,0,0.6,3.1,2.3,3.5c1.7,0.4,3.9,1.1,3.9,0c0.2-1.1,0.4-2.8,0.4-2.8l0.4,1.7C23.1,18.4,23.4,18.2,24,18.2L24,18.2L24,18.2z"
/>
</symbol>
</svg>
Étape 2 - Ajouter la feuille de sprites à votre thème
Une fois votre feuille de sprites créée, vous devez ajouter le fichier SVG à votre composant/thème. C’est facile via l’interface utilisateur, ou vous pouvez le coder en dur dans un composant/thème.
Une fois qu’il est téléchargé sur n’importe quel composant/thème installé, il est disponible sur toute votre instance en utilisant l’ID dans la balise
<symbol>.
Via l’interface utilisateur
Accédez à la section Téléchargements des paramètres du thème/composant et ajoutez votre fichier sprite avec un nom de variable SCSS de icons-sprite:
Coder en dur dans un thème / composant
Ajoutez le fichier de feuille de sprites au dossier /assets du thème. Ensuite, mettez à jour votre fichier assets.json dans le dossier racine.
Pour un sprite SVG nommé my-icons.svg, votre about.json doit inclure ceci :
"assets": {
"icons-sprite": "/assets/my-icons.svg"
}
Étape 3 (facultatif) - Remplacer les icônes par défaut
Maintenant que votre feuille de sprites est définie, vous pouvez indiquer à Discourse de remplacer les icônes. Voici comment le faire à partir d’un api-initializer :
// {theme}/javascripts/discourse/api-initializers/init-theme.gjs
import { apiInitializer } from "discourse/lib/api";
export default apiInitializer((api) => {
api.replaceIcon("bars", "my-theme-icon-bars");
api.replaceIcon("link", "my-theme-icon-link");
// etc.
});
Le premier ID, bars, est l’ID d’icône par défaut dans Discourse et le second est l’ID de votre icône de remplacement. Le moyen le plus simple de trouver l’ID de l’une de nos icônes est d’inspecter l’icône dans votre navigateur.
Ici, le nom de l’icône suit le préfixe d-icon-. Donc, dans cet exemple, c’est d-unliked
La plupart de nos icônes suivent les noms d’icônes de https://fontawesome.com/, mais il y a des exceptions (c’est pourquoi vérifier l’ID dans votre inspecteur est la méthode la plus fiable). Vous pouvez voir toutes les exceptions dans le bloc const REPLACEMENTS ici sur github.
C’est tout. Vous pouvez maintenant styliser Discourse avec vos propres icônes personnalisées !
Ce document est contrôlé par version - suggérez des modifications sur github.








