Personalizza i contenuti dei post con i tuoi stili

Requisiti

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

Introduzione

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

Ma a volte avrai bisogno di 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 direttamente al prossimo passo ed entrare subito 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 mireremo con il CSS per personalizzare il nostro contenuto.

In questo tutorial li chiamerò attributi data- :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, persino il nome del tuo cane :dog:):

[wrap=button]some text[/wrap]

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

Primo esempio: uno sfondo rosa

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

Come elemento block

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 al Pannello di amministrazione → Personalizza → Temi → Il tuo tema → Modifica CSS/HTML → CSS.

Inserisci il seguente codice CSS:

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

Poi clicca sul pulsante Salva.

Torna al tuo post e vedi il risultato:

Sì, è già bellissimo :cherry_blossom:

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

Se desideri che lo sfondo rosa si estenda su più righe (sempre come block), dovrai assicurarti 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 apparirà così:

Come elemento inline

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

Ecco un [wrap=pink]testo rosa[/wrap] ed è fantastico ✨

Ecco il risultato:

Se del testo o altri elementi si trovano sulla stessa riga di uno dei tuoi tag [wrap], verrà generato un elemento inline.

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

L’uso del tag [wrap] può talvolta portare a risultati indesiderati per vari motivi, uno dei quali è che può essere un elemento block o inline a seconda del contesto.
Quindi, descriveremo due metodi diversi che raggiungono lo stesso risultato, ma potrai scegliere quello che più ti conviene :v:

Un link-pulsante inline con [wrap]

La sintassi per creare un link usando Markdown è: [qualche testo](https://qualche-link.ecc). Per personalizzare il testo e farlo apparire come un pulsante, inseriremo il wrap tra le parentesi quadre. Ecco un esempio:

Questo [[wrap=button]bel link[/wrap]](https://discourse.org/) è un pulsante blu 🐳 !

Non commenteremo cosa genera questo codice. Lo sai già perché hai scritto [wrap=button], quindi dovrai mirare a [data-wrap="button"] nel tuo CSS.

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

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

Non entreremo nei dettagli delle regole CSS qui. Ci sono molte risorse CSS su Internet, quindi se desideri effettuare modifiche più specifiche, dovrai prima imparare di più a riguardo. :slight_smile:

Il risultato :magic_wand: :

Non è vero che è bello?

Un link-pulsante inline con contenuto HTML regolare

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

Scrivi:

Questo <span data-button>[link](https://discourse.org/)</span> è un pulsante verde 🐸 !

Genererà un link all’interno di un tag <span> con un attributo data-button, il che significa che il CSS sarà un po’ più complicato. Dovremo mirare sia a data-button che al 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 usando [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 in misura minore dell’HTML).

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

Testo:

[wrap=cat]

- Felix
- Garfield
- Il gatto di Nat
  [/wrap]

CSS:

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

Risultato:

Utilizzando le variabili di colore del tuo tema

Se permetti agli utenti di utilizzare diversi temi o colori, le tue modifiche potrebbero non apparire bene per ciascuno, specialmente 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 userà il colore primario della palette corrente, e il testo userà il colore secondario:

Testo:

Questo [[wrap=button]bel link[/wrap]](https://discourse.org/) è un pulsante 🌈 !

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’utilizzo degli strumenti per sviluppatori del tuo browser Internet ti mostrerà 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 è controllato dalla 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