Personalizza il contenuto dei post con i tuoi stili

Requisiti

:information_source: Per poter utilizzare questi suggerimenti e trucchi, devi essere un amministratore di un’istanza Discourse self-hosted o di un piano ospitato da Discourse superiore a Basic.

Introduzione

Discourse supporta diversi metodi per formattare e personalizzare il contenuto di un post. Puoi trovare l’elenco qui:

Ma a volte vorrai qualcosa di più specifico, ad esempio un link che sembri un pulsante.

Green button

Questo è il tipo di modifica che impareremo qui.

La logica

Spiegherò brevemente la logica sottostante, ma puoi passare al passaggio successivo e tuffarti in un esempio pratico :slight_smile:

Discourse consente qualsiasi attributo HTML che inizi con data- nel contenuto di un post.
Questi sono gli attributi che targetizzeremo con CSS per personalizzare il nostro contenuto.

Li chiamerò attributi data- in questo tutorial :slight_smile:

Un modo per creare elementi con questi attributi è un tag simile a BBcode: [wrap], a cui aggiungeremo un valore a nostra scelta. Qui scegliamo “button” (potrebbe essere qualsiasi altra cosa, anche il nome del tuo cane :dog:):

[wrap=button]some text[/wrap]

Questo produrrà un elemento HTML con il seguente attributo: data-wrap="button".

Primo esempio: uno sfondo rosa

Iniziamo con un esempio pratico. Creeremo del testo con uno sfondo rosa.

Come elemento blocco

Nel tuo post, su una riga vuota, scrivi:

[wrap=pink]pink text[/wrap]

Questo creerà un elemento div con l’attributo data-wrap="pink".

Quindi, aggiungi il seguente CSS al tuo tema.
Vai a Pannello di amministrazione → Personalizza → Temi → il tuo tema → Modifica CSS/HTML → CSS.

Inserisci il seguente codice CSS all’interno:

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

Quindi fai clic sul pulsante Salva.

Torna al tuo post e guarda il risultato:

Sì, è già bello :cherry_blossom:

Noterai che lo sfondo copre tutta la larghezza del post. Poiché il nostro wrap è l’unico elemento sulla sua riga, produce un elemento blocco.
Puoi saperne di più sulla differenza tra elementi HTML blocco e inline qui: HTML Block and Inline Elements.

Se vuoi il tuo sfondo rosa su più righe (ancora come blocco), avrai bisogno che entrambi i tuoi tag [wrap] non abbiano altro contenuto o testo sulla stessa riga:

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

Questo avrà questo aspetto:

Come elemento inline

Ora, aggiungiamo del testo prima del [wrap], o dopo, o entrambi :smile:. Ad esempio:

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

Ecco il risultato:

Se il testo o altri elementi sono sulla stessa riga di uno dei tuoi tag [wrap], produrrà un elemento inline.

Secondo esempio: un link con l’aspetto di un pulsante.

Sfogliare il tag [wrap] può a volte portare a risultati indesiderati per varie ragioni, una delle quali è che può essere un elemento blocco o inline a seconda del contesto.
Quindi, descriveremo due metodi diversi che ottengono lo stesso risultato, ma potrai scegliere quello che ti si addice di più :v:

Un link pulsante inline con [wrap]

La sintassi per creare un link utilizzando markdown è: [some text](https://some-link.etc).
Per personalizzare il testo e farlo apparire come un pulsante, inseriamo il wrap all’interno delle parentesi quadre. Ecco un esempio:

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

Non commenteremo cosa produce questo codice. Lo sai perché, avendo scritto [wrap=button], dovrai targetizzare [data-wrap="button"] nel tuo CSS.

Quindi, andiamo, aggiungiamo un CSS elegante per renderlo bello! :sparkles:

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

Non dettagliamo qui le regole CSS. Ci sono molte risorse CSS su Internet, quindi se vuoi fare modifiche più specifiche, dovrai prima imparare al riguardo. :slight_smile:

Il risultato :magic_wand: :

Sembra bene, no?

Un link pulsante inline con contenuto HTML normale

Poiché Discourse accetta codice HTML, possiamo decidere di non usare i tag [wrap] e usare HTML con un attributo data-. In questo esempio, useremo la sintassi Markdown normale per il link e lo racchiuderemo con tag <span>.
:information_source: Non possiamo usare direttamente un tag di link <a> perché è un’eccezione e non consentirà alcun attributo data-.

Scrivi:

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

Questo produrrà un link dentro un tag <span> con un attributo data-button, il che significa che il CSS sarà un po’ più complicato. Dovremo targetizzare sia data-button che il link:

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

Ed ecco il risultato!

Per andare oltre

Un elenco personalizzato utilizzando [wrap]

I tag [wrap] e gli attributi data- possono essere utilizzati in molti contesti e puoi personalizzare contenuti più avanzati. Il limite è principalmente la tua conoscenza del CSS (e dell’HTML in misura minore).

Daremo un singolo esempio senza spiegazione personalizzando un elenco in cui ogni elemento sarà preceduto da un’emoji di gatto:

Testo:

[wrap=cat]

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

CSS:

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

Risultato:

Utilizzare le variabili di colore del tuo tema

Se consenti agli utenti di utilizzare temi o colori diversi, le tue modifiche potrebbero non sembrare belle per ciascuno, soprattutto se hanno la scelta tra schemi di colori chiari e scuri.

Una buona pratica è utilizzare le variabili di colore di Discourse invece di colori “hardcoded” come red, #FF0000 o rgb(255,0,0).

Ecco un esempio in cui il colore di sfondo del pulsante utilizzerà il colore primario della palette corrente e il testo utilizzerà il colore secondario:

Testo:

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);
}

Ecco come apparirà per un utente che utilizza lo schema di colori Solarized Light:

E se utilizzano lo schema di colori Solarized Dark:

Conclusione

Ora hai le basi per creare elementi personalizzati utilizzando l’elemento [wrap] e gli attributi data-.

Per effettuare personalizzazioni più avanzate, imparare il CSS è fondamentale. Troverai molti tutorial su Internet.

La seguente guida di Discourse può anche essere d’aiuto: Making custom CSS changes on your site.
L’uso degli strumenti per sviluppatori del tuo browser Internet mostrerà anche facilmente l’elenco delle variabili di colore di Discourse e come appare ciascuna:


:raised_hand_with_fingers_splayed: Sentiti libero di suggerire qualsiasi modifica per questa guida!


Questo documento è sotto controllo di versione - suggerisci modifiche su github.

23 Mi Piace

Grazie @Canapin

Un buon esempio di componente tema che utilizza alcuni di questi concetti è questo:

4 Mi Piace

Bel lavoro!

Sono curioso di vedere quali altre soluzioni creative gli utenti proporranno utilizzando l’attributo data.


C’è qualche vantaggio nell’usare <span> data-button di HTML rispetto a [wrap="button"] di BBCode?

2 Mi Piace

Senza pensarci troppo, direi che usare uno <span> permette di inserire un elemento inline come unico contenuto su una singola riga.

Usare un [wrap] su una singola riga senza altri contenuti accanto produrrà automaticamente un elemento block. Il testo all’interno sarà anche racchiuso da tag di paragrafo <p>.

A parte questo, è probabilmente una questione di gusti. Non ho nemmeno menzionato che un [wrap] e un elemento HTML possono avere più attributi -data poiché non penso sia molto utile per la maggior parte degli scopi.

3 Mi Piace

Come aggiungere i “Card” di Bootstrap nei tuoi Post/Argomenti

…alcuni potrebbero dire che questo è folle, troppo complicato o esagerato, ma a me piace :smiley:

  • Aggiunti alcuni colori per vedere meglio la nidificazione del BBCode.

STOP! Non usare il mio codice

Invece, usa il codice migliorato pubblicato da @Canapin CLICCA QUI

BBCode da includere nell’Argomento/Post

[wrap="card"]
[wrap="card-header"]**Intestazione Card**[/wrap]
[wrap="card-body"]
[wrap="card-title"]**Titolo Card**[/wrap]
[wrap="card-text"]Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card, Testo Card[/wrap]
[/wrap]
[/wrap]

Codice CSS da aggiungere al tema.

// Bootstrap Card Box
[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;
}

// Bootstrap Card Header
[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;
    
}

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

// Bootstrap Card Title
[data-wrap="card-title"] {
    margin-bottom: 0.5rem;
}

// Bootstrap Card Text
[data-wrap="card-text"] {
    margin-top: 0;
    margin-bottom: 1rem;
}
4 Mi Piace

Certo, dipende da cosa intendi metterci, ma per ottenere lo stesso identico aspetto visivo del tuo esempio, puoi ottimizzare molto il tuo codice:

[wrap="card-header"]**Intestazione della Scheda**[/wrap]
[wrap="card-body"]
**Titolo della Scheda**

Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda, Testo della Scheda
[/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 Mi Piace

Ahhh! Molto meglio! Grazie mille per aver apportato i miglioramenti! <3

Bello! Quando viene elaborato il markdown nell’elemento [wrap]...[/wrap], o c’è un trucco per farlo visualizzare prima che venga incluso nel wrap?

Ad esempio, ho provato a formattare del testo nell’elemento come grassetto o corsivo, e non viene visualizzato in quel modo: vedo solo _testo_ o **testo** sulla pagina nel mio browser, una volta salvato :frowning:

1 Mi Piace

Sembra effettivamente che la formattazione (sia essa HTML, Markdown o BBcode) non funzionerà in [wrap] se si tratta di un elemento inline (se c’è altro contenuto sulla stessa riga):

Dovrai creare uno <span> per questo.

2 Mi Piace