Mudar ícones globalmente

Este é um jeito fácil de alterar um ícone do Discourse globalmente.

  1. Clique com o botão direito no ícone que você deseja alterar e selecione “Inspecionar elemento” ou “Inspecionar” (depende do navegador)

  2. Encontre o nome do ícone

  3. Procure um novo ícone aqui Find Icons with the Perfect Look & Feel | Font Awesome, por exemplo external-link-alt

  4. Personalize e adicione o código na aba admin > customize > themes > edit code -> JS

// {theme}/javascripts/discourse/api-initializers/init-theme.gjs

import { apiInitializer } from "discourse/lib/api";

export default apiInitializer((api) => {
  api.replaceIcon("link", "external-link-tab");
});
  1. Ícones que não são usados por padrão pelo Discourse devem ser adicionados na configuração do site svg icon subset e então force o recarregamento do seu navegador para ver as alterações aplicadas.
    Resultado:
    image
    Todos os ícones de “link” serão substituídos por “external-link-tab”.
    Se um ícone for usado para múltiplos elementos em outras páginas, como emblemas (badges), o ícone também será substituído lá.

Exceções

Note que já existe um componente de tema que permite alterar o ícone de Like. Estou usando este caso como exemplo

O ícone de “coração”, usado para dar Like, é codificado com outros nomes ('d-liked' e 'd-unliked') e deve ser tratado de forma diferente de outros ícones, então para alterar o ícone :heart: pelo ícone :+1::

api.replaceIcon("d-liked", "thumbs-up");
api.replaceIcon("d-unliked", "thumbs-o-up");

like
firefox_2018-04-24_18-37-02
mas na página de emblemas o ícone ainda é “coração”:


então para alterá-lo nessa página nós adicionamos:

api.replaceIcon("heart", "thumbs-up");

Outro exemplo:

api.replaceIcon("d-watching", "eye");

altera o ícone de watching:

Veja aqui outras exceções que cobrem o status de rastreamento, expandir/recolher, notificações e curtidas, é claro.
const REPLACEMENTS = {
  "d-tracking": "bell",
  "d-muted": "discourse-bell-slash",
  "d-regular": "far-bell",
  "d-watching": "discourse-bell-exclamation",
  "d-watching-first": "discourse-bell-one",
  "d-drop-expanded": "caret-down",
  "d-drop-collapsed": "caret-right",
  "d-unliked": "far-heart",
  "d-liked": "heart",
  "d-post-share": "link",
  "d-topic-share": "link",
  "notification.mentioned": "at",
  "notification.group_mentioned": "users",
  "notification.quoted": "quote-right",
  "notification.replied": "reply",
  "notification.posted": "reply",
  "notification.edited": "pencil-alt",
  "notification.bookmark_reminder": "discourse-bookmark-clock",
  "notification.liked": "heart",
  "notification.liked_2": "heart",
  "notification.liked_many": "heart",
  "notification.liked_consolidated": "heart",
  "notification.private_message": "far-envelope",
  "notification.invited_to_private_message": "far-envelope",
  "notification.invited_to_topic": "hand-point-right",
  "notification.invitee_accepted": "user",
  "notification.moved_post": "sign-out-alt",
  "notification.linked": "link",
  "notification.granted_badge": "certificate",
  "notification.topic_reminder": "far-clock",
  "notification.watching_first_post": "discourse-bell-one",
  "notification.group_message_summary": "users",
  "notification.post_approved": "check",
  "notification.membership_request_accepted": "user-plus",
  "notification.membership_request_consolidated": "users",
  "notification.reaction": "bell",
  "notification.votes_released": "plus",
  "notification.chat_quoted": "quote-right",
};

Ref: discourse/icon-library.js at main · discourse/discourse (github.com)


Sinta-se à vontade para criar outros componentes de tema e compartilhá-los em nossa categoria Theme component!


Este documento é controlado por versão - sugira alterações no github.

38 curtidas

Your post does help in changing icons globally but how to change the share icon in posts only? I do not want to change the link icon in the editor but, only in the posts. I checked the other posts in the forum but none of those work in the current build of Discourse, thus I am asking it here.

1 curtida

thanks for the clear guide. a small point:

is it possible to change d-watching to fas fa-eye and d-tracking to far fa-eye together?

if yes, how would one add the fas icon to the svg; as I tried adding fa-eye and this header:

<script type="text/discourse-plugin" version="0.8">
api.replaceIcon('d-watching', 'fa-eye');
api.replaceIcon('d-tracking', 'eye');
</script>

but the watching icon is not working.


also I was checking other icons such as bells, and I see even when I add bells to the svg icon subset it’s not loaded:

image

image

is there anything else I should do in order to be able to use bells?

Bells is a Pro icon, so it can’t be included, our default FA5 implementation only covers the free icons.

The solid eye icon is a bit of a special case: the FontAwesome 4 eye icon was moved to the regular bundle, so in Discourse we have a matcher for it that converts ‘eye’ to ‘far-eye’. Unfortunately, this stops you from using the solid ‘eye’ icon in Discourse, because Discourse will redirect eye to far-eye. If you absolutely must use that icon, you can copy the svg into a custom icon that you can rename to something of your liking, and add that to a theme or plugin.

3 curtidas

thanks for the complete information :+1: , meanwhile I’ve tried several other icons, e.g. user-shield.

here is the header:
<script type="text/discourse-plugin" version="0.8">
api.replaceIcon('d-watching', 'fa-user-shield');
</script>

and I added fa-user-shield to the svg icon subset, but it still shows empty icon.

Try without the “fa-” prefix for user-shield (both in the JS code and the site setting).

still empty (tried with flag for easier snapshot):

image

That works locally for me. Did you refresh the page after making these changes?

yes, refreshed with F5 and ctrl+R just to be sure!

is there anyway to look for possible errors?

If you are familiar with the rails console, I would try logging in to the console and running SvgSprite.expire_cache and then refreshing the page to see if that does it.

2 curtidas

How to change the solid (fas fa-bookmark) to regular version (far fa-bookmark)?

https://fontawesome.com/icons/bookmark?style=regular

@dax Is there a way to change the default heart icon to an emoji icon?

1 curtida

Currently, no, you can only replace svg icons with other svg icons, not emojis.

4 curtidas

Is it possible to change to custom SVG icons we add, rather than just FA icons?

Yes, see Introducing Font Awesome 5 and SVG icons for details.

2 curtidas

Thank you! I also found Replace Discourse’s default SVG icons with custom icons in a theme

I ended up embedding the SVG sprite directly into the Header file, as uploading it and naming it as that article says to do did not work for me (could be operator error, of course).

So my Header is:

<svg width="0" height="0" class="hidden" style="display: none;">
    <symbol id="myicon-search" ..... </symbol>  
    <!-- all of my symbols here... -->
</svg>
<script type="text/discourse-plugin" version="0.8">
    api.replaceIcon('search', 'myicon-search'); 
</script>

And that is easy to manage.

I use the SVG sprite generator at https://svgsprit.es to make sure the format is correct.

3 curtidas

Can we use Microsoft’s Fabric Icons with this method?

You should be able to, yes. I don’t see an official SVG sprite distribution of those icons, but according to Where can I find the svg files of the icons? · Issue #1008 · OfficeDev/office-ui-fabric-core · GitHub you can extract SVGs yourself, one by one, using their names.

4 curtidas

Estou tentando fazer a mesma coisa. Consegui alterar o ícone de “compartilhar” nas postagens com sucesso, mas parece que isso também altera o ícone de “link” no editor. Alguém tem alguma ideia de como mudar apenas o ícone das postagens?

3 curtidas

Existe alguma maneira de alterar globalmente um ícone do FontAwesome para um ícone SVG carregado na seção de upload do tema? Estou trabalhando em um site e gostaria de alterar especificamente o ícone do FontAwesome para quando um tópico é resolvido (usando o plugin discourse-solved) para o logotipo do meu site. Estou tendo dificuldade em abordar isso diretamente no código do plugin e me perguntava se o método de cabeçalho funciona para algo assim.