Remplacer les icônes SVG par défaut de Discourse par des icônes personnalisées dans un thème

Vous pouvez remplacer les icônes SVG par défaut de Discourse individuellement ou en bloc par vos propres SVG personnalisés et les surcharger au sein d’un thème ou d’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. Elle peut contenir n’importe quoi, depuis une seule icône SVG personnalisée supplémentaire jusqu’à un ensemble complet de remplacement composé de centaines d’icônes.

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 approprié.

<?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
      il s'agit généralement de 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 quels attributs (c.-à-d. ViewBox="0 0 0 0") vers la balise <symbol>
      -->
  </symbol>

  <symbol id="my-theme-icon-2">
    <!-- Code SVG ici. Ajoutez d'autres 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 IDs 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 currentColor plutôt que sur une couleur codée en dur (comme #333)

  • Pour mettre à l’échelle ou centrer correctement votre icône, utilisez un attribut viewBox sur la balise <symbol>. Consultez How to Scale SVG | CSS-Tricks pour plus d’informations.

  • Soyez attentif aux collisions de styles au sein de vos SVG. Par exemple, les SVG ont souvent un style en ligne défini comme .st0{fill:#FF0000;}. Si vous avez plusieurs SVG utilisant les mêmes classes, cela peut causer des problèmes (pour corriger ces problèmes, modifiez les classes pour qu’elles soient uniques pour 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 simple outil en ligne de commande pour combiner des SVG en une feuille de sprites.

Exemple - feuille de sprites avec une seule icône personnalisée

<?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.

:information_source: Une fois qu’il est téléversé dans n’importe quel composant/thème installé, il est disponible dans toute votre instance en utilisant l’ID de la balise <symbol>.

Via l’interface utilisateur

Allez dans la section Téléversements des paramètres du thème/composant et ajoutez votre fichier sprite avec un nom de variable SCSS icons-sprite :

Codage en dur dans un thème / composant

Ajoutez le fichier de feuille de sprites dans le dossier /assets du thème. Puis 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 (optionnelle) - Surcharger les icônes par défaut

Maintenant que votre feuille de sprites est prête, vous pouvez indiquer à Discourse de remplacer les icônes. Voici comment faire depuis 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 de l’icône par défaut dans Discourse et le second est l’ID de votre icône de remplacement. La façon la 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 personnaliser Discourse avec vos propres icônes personnalisées !


Ce document est sous contrôle de version - suggérez des modifications sur github.

58 « J'aime »