Personnalisez le contenu de vos publications avec vos propres styles

Prérequis

:information_source: Pour pouvoir utiliser ces astuces, vous devez être administrateur d’une instance Discourse auto-hébergée ou disposer d’un plan hébergé par Discourse supérieur à Basic.

Introduction

Discourse prend en charge plusieurs méthodes pour formater et personnaliser le contenu d’un message. Vous pouvez consulter la liste ici :

Mais parfois, vous voudrez quelque chose de plus spécifique, par exemple un lien qui ressemble à un bouton.

Green button

C’est le type de modification que nous allons apprendre ici.

La logique

Je vais brièvement expliquer la logique sous-jacente, mais vous pouvez passer à l’étape suivante et plonger directement dans un exemple pratique :slight_smile:

Discourse autorise tout attribut HTML commençant par data- dans le contenu d’un message.
Ce sont ces attributs que nous ciblerons avec CSS pour personnaliser notre contenu.

Je les appellerai attributs data- dans ce tutoriel :slight_smile:

Une façon de créer des éléments avec ces attributs est d’utiliser une balise de type BBcode : [wrap], à laquelle nous ajouterons une valeur de notre choix. Ici, nous choisissons “button” (cela pourrait être n’importe quoi d’autre, même le nom de votre chien :dog:):

[wrap=button]some text[/wrap]

Cela génèrera un élément HTML ayant l’attribut suivant : data-wrap="button".

Premier exemple : un fond rose

Commençons par un exemple pratique. Nous allons créer du texte avec un fond rose.

En tant qu’élément bloc

Dans votre message, sur une ligne vide, écrivez :

[wrap=pink]pink text[/wrap]

Cela créera un élément div ayant l’attribut data-wrap="pink".

Ensuite, ajoutez le CSS suivant à votre thème.
Allez dans le panneau d’administration → Personnaliser → Thèmes → votre thème → Modifier le CSS/HTML → CSS.

Placez le code CSS suivant à l’intérieur :

[data-wrap="pink"] {
  background: pink;
}

Ensuite, cliquez sur le bouton Enregistrer.

Retournez à votre message et observez le résultat :

Oui, c’est déjà beau :cherry_blossom:

Vous remarquerez que le fond couvre toute la largeur du message. Comme notre wrap est le seul élément sur sa ligne, il génère un élément bloc.
Vous pouvez en savoir plus sur la différence entre les éléments HTML blocs et en ligne ici : HTML Block and Inline Elements.

Si vous voulez votre fond rose sur plusieurs lignes (toujours en tant que bloc), vos balises [wrap] doivent être seules sur leur ligne, sans aucun autre contenu ou texte :

[wrap=pink]
pink text
pink text
pink text
pink text
[/wrap]

Cela donnera ce résultat :

En tant qu’élément en ligne

Maintenant, ajoutons du texte avant la balise [wrap], ou après, ou les deux :smile:. Par exemple :

Here is some [wrap=pink]pink text[/wrap] and it's awesome ✨

Voici le résultat :

Si du texte ou d’autres éléments se trouvent sur la même ligne que l’une de vos balises [wrap], cela générera un élément en ligne.

Deuxième exemple : un lien avec l’apparence d’un bouton.

Jouer avec la balise [wrap] peut parfois entraîner des résultats indésirables pour diverses raisons, l’une d’elles étant qu’il peut s’agir d’un élément bloc ou en ligne selon le contexte.
Nous allons donc décrire deux méthodes différentes qui obtiennent le même résultat, mais vous pourrez choisir celle qui vous convient le mieux :v:

Un lien bouton en ligne avec [wrap]

La syntaxe pour créer un lien en utilisant Markdown est : [some text](https://some-link.etc).
Pour personnaliser le texte et le faire apparaître comme un bouton, nous insérerons le wrap à l’intérieur des crochets. Voici un exemple :

This [[wrap=button]nice link[/wrap]](https://discourse.org/) is a blue button 🐳 !

Nous ne commenterons pas ce que ce code génère. Vous savez que, parce que vous avez écrit [wrap=button], vous devrez cibler [data-wrap="button"] dans votre CSS.

Alors, allons-y, ajoutons un peu de CSS sophistiqué pour le rendre joli ! :sparkles:

[data-wrap="button"] {
  display: inline-block;
  padding: 0.5em 1em;
  background: DodgerBlue;
  color: White;
}

Nous ne détaillerons pas les règles CSS ici. Il existe de nombreuses ressources sur le CSS sur Internet, donc si vous souhaitez effectuer des modifications plus spécifiques, vous devrez d’abord en apprendre davantage. :slight_smile:

Le résultat :magic_wand: :

Ça a l’air bien, non ?

Un lien bouton en ligne avec du contenu HTML standard

Puisque Discourse accepte le code HTML, nous pouvons décider de ne pas utiliser les balises [wrap] et d’utiliser du HTML avec un attribut data-. Dans cet exemple, nous utiliserons la syntaxe Markdown standard pour le lien et l’entourerons de balises <span>.
:information_source: Nous ne pouvons pas utiliser directement une balise de lien <a> car c’est une exception et elle n’autorise aucun attribut data-.

Écrivez :

This <span data-button>[link](https://discourse.org/)</span> is a green button 🐸 !

Cela générera un lien à l’intérieur d’une balise <span> ayant un attribut data-button, ce qui signifie que le CSS sera un peu plus compliqué. Nous devrons cibler à la fois data-button et le lien :

[data-button] {
  display: inline-block;
  padding: 0.5em 1em;
  background: ForestGreen;
  a {
    color: White;
  }
}

Et voici le résultat !

Pour aller plus loin

Une liste personnalisée utilisant [wrap]

Les balises [wrap] et les attributs data- peuvent être utilisés dans de nombreux contextes et vous pouvez personnaliser des contenus plus avancés. La limite est principalement votre connaissance du CSS (et du HTML dans une moindre mesure).

Je vais donner un seul exemple sans explication en personnalisant une liste dans laquelle chaque élément sera précédé d’un émoji de chat :

Texte :

[wrap=cat]

- Felix
- Garfield
- Nat's cat
  [/wrap]

CSS :

[data-wrap="cat"] ul {
  list-style: none;
  li:before {
    content: "🐈";
    margin-right: 0.25em;
  }
}

Résultat :

Utiliser les variables de couleurs de votre thème

Si vous autorisez les utilisateurs à utiliser des thèmes ou des couleurs différents, vos modifications peuvent ne pas bien paraître pour chacun d’entre eux, surtout s’ils ont le choix entre des schémas de couleurs clairs et sombres.

Une bonne pratique consiste à utiliser les variables de couleurs de Discourse au lieu de couleurs “codées en dur” telles que red, #FF0000 ou rgb(255,0,0).

Voici un exemple dans lequel la couleur de fond du bouton utilisera la couleur primaire de la palette actuelle, et le texte utilisera la couleur secondaire :

Texte :

This [[wrap=button]nice link[/wrap]](https://discourse.org/) is a button 🌈 !

CSS :

[data-wrap="button"] {
  display: inline-block;
  padding: 0.5em 1em;
  background: var(--primary);
  color: var(--secondary);
}

Voici à quoi cela ressemblera pour un utilisateur utilisant le schéma de couleurs Solarized Light :

Et s’ils utilisent le schéma de couleurs Solarized Dark :

Conclusion

Vous avez maintenant les bases pour créer des éléments personnalisés en utilisant l’élément [wrap] et les attributs data-.

Pour effectuer des personnalisations plus avancées, apprendre le CSS est primordial. Vous trouverez de nombreux tutoriels sur Internet.

Le guide suivant de Discourse peut également être utile : Making custom CSS changes on your site.
L’utilisation des outils de développement de votre navigateur Internet vous montrera également facilement la liste des variables de couleurs de votre Discourse et l’aspect de chacune :


:raised_hand_with_fingers_splayed: N’hésitez pas à suggérer toute modification pour ce guide !


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

23 « J'aime »

Merci @Canapin

Un bon exemple de composant de thème utilisant certains de ces concepts est celui-ci :

4 « J'aime »

Excellent travail !

Je suis curieux de voir quelles autres solutions créatives les utilisateurs proposeront en utilisant l’attribut data.


Y a-t-il un avantage à utiliser <span> data-button</span> HTML par rapport à [wrap="button"] BBCode ?

2 « J'aime »

Sans y avoir trop réfléchi, je dirais que l’utilisation d’un <span> permet de placer un élément en ligne comme seul contenu sur une seule ligne.

L’utilisation d’un [wrap] sur une seule ligne sans autre contenu à côté produira automatiquement un élément de bloc. Le texte à l’intérieur sera également encapsulé avec des balises de paragraphe <p>.

Sinon, c’est probablement une question de goût. Je n’ai pas non plus mentionné qu’un [wrap] et un élément HTML peuvent avoir plusieurs attributs -data car je ne pense pas que ce soit très utile dans la plupart des cas.

3 « J'aime »

Comment ajouter des « cartes » Bootstrap dans vos publications/sujets

…certains pourraient dire que c’est de la folie, trop compliqué ou excessif, mais j’adore ça :smiley:

image

  • Ajout de quelques couleurs pour mieux voir l’imbrication du BBCode.

ARRÊT ! N’utilisez pas mon code

Utilisez plutôt le code amélioré publié par @Canapin CLIQUEZ ICI

BBCode à inclure dans le sujet/la publication

[wrap="card"]
[wrap="card-header"]**En-tête de carte**[/wrap]
[wrap="card-body"]
[wrap="card-title"]**Titre de la carte**[/wrap]
[wrap="card-text"]Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte[/wrap]
[/wrap]
[/wrap]

Code CSS à ajouter au thème.

// Boîte de carte Bootstrap
[data-wrap="card"] {
    position: relative;
    display: flex;
    flex-direction: column;
    min-width: 0;
    word-wrap: break-word;
    background-color: #fff;
    background-clip: border-box;
    border: 1px solid rgba(0,0,0,.125);
    border-radius: 0.25rem;
}

// En-tête de carte Bootstrap
[data-wrap="card-header"] {
    padding: 0.5rem 1rem;
    margin-bottom: 0;
    border-bottom: 1px solid rgba(0,0,0,.125);
    background: #007bff;
    color: #fff;
    border-radius: 5px 5px 0px 0px;
    
}

// Corps de carte Bootstrap
[data-wrap="card-body"] {
    flex: 1 1 auto;
    padding: 1rem 1rem;
}

// Titre de carte Bootstrap
[data-wrap="card-title"] {
    margin-bottom: 0.5rem;
}

// Texte de carte Bootstrap
[data-wrap="card-text"] {
    margin-top: 0;
    margin-bottom: 1rem;
}
4 « J'aime »

Bien sûr, cela dépend de ce que vous avez l’intention d’y mettre, mais pour obtenir le même visuel exact que votre exemple, vous pouvez beaucoup optimiser votre code :

[wrap="card-header"]**En-tête de carte**[/wrap]
[wrap="card-body"]
**Titre de la carte**

Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte, Texte de la carte
[/wrap]
[data-wrap="card-header"] {
    padding: 0.5em 1em;
    border: 1px solid rgba(0,0,0,.125);
    border-bottom: 0;
    background: #007bff;
    color: #fff;
    border-radius: 5px 5px 0 0;
}

[data-wrap="card-body"] {
    padding: 1em;    
    border: 1px solid rgba(0,0,0,.125);
    border-radius: 0 0 5px 5px;
}

5 « J'aime »

Ahhh ! C’est tellement mieux ! Merci beaucoup d’avoir apporté les améliorations ! <3

Génial ! Quand le markdown dans l’élément [wrap]...[/wrap] est-il traité, ou y a-t-il une astuce pour le faire rendre avant qu’il ne soit inclus dans le wrap ?

Par exemple, j’ai essayé de formater du texte dans l’élément en gras ou en italique, et il ne s’affiche pas comme ça - je vois juste _texte_ ou **texte** sur la page dans mon navigateur, une fois que je l’ai sauvegardé :frowning:

1 « J'aime »

Il semble en effet que le formatage (qu’il s’agisse de HTML, Markdown ou BBcode) ne fonctionnera pas dans [wrap] s’il s’agit d’un élément inline (s’il y a d’autres contenus sur la même ligne) :

Vous devrez créer un <span> pour cela.

2 « J'aime »