Guida per designer per iniziare con i temi su Discourse

Quindi sei interessato a progettare il tuo tema per Discourse? Sei capitato nel posto giusto :smile:

Questa guida sarà più focalizzata sugli aspetti SCSS/CSS della creazione di temi in Discourse. Se hai anche conoscenze in JS/EmberJs/Handlebars, puoi approfondire ulteriormente consultando questa guida.

Ti descriverò il mio metodo personale per la progettazione e la tematizzazione in Discourse. Come per molte altre cose, ci sono TANTISSIMI modi per implementare i propri design. Mi piace usare molto gli strumenti di ispezione quando creo temi e ti mostrerò alcune volte come lo faccio in questo post.

Preparazione per la Tematizzazione

Ti preghiamo di leggere Guida per principianti all’uso dei temi Discourse, nonché la Struttura dei temi… prima di continuare. Non è necessaria una conoscenza approfondita a questo punto, ma questi articoli ti daranno un po’ più di familiarità prima di iniziare.

Per lavorare al meglio con la tematizzazione in Discourse, suggerisco di configurarsi con i seguenti strumenti per offrirti il processo di design più rapido e snello possibile. Questi passaggi ti permetteranno di vedere le modifiche mentre le apporti, senza dover cliccare su ‘Salva’ e aggiornare dal pannello di amministrazione di un sito Discourse.

È assolutamente possibile seguire questa guida utilizzando la console di amministrazione (a patto di avere accesso di livello amministratore a un forum Discourse.)

  • Installa Discourse Theme CLI e leggi quell’argomento per capire cosa può fare.
  • Ottieni una Chiave API da https://discourse.theme-creator.io/
    • Accedi con il tuo account Meta
    • Clicca su I miei temi
    • Clicca su Chiave API
    • Nella finestra modale popup, clicca su Genera chiave API e copia la chiave generata per te (la useremo tra poco)

Esecuzione della Discourse Theme CLI

Con la Discourse Theme CLI installata e la tua Chiave API pronta, apri il tuo editor di testo o finestra di terminale preferito e cambia la directory di lavoro nella posizione in cui desideri che venga impostata la cartella del tuo tema.

Una volta lì, esegui il seguente comando discourse_theme new your_theme_name e compila i prompt come segue:

  1. Come vuoi chiamare il tuo tema? Scegli il nome del tuo tema

  2. Vuoi iniziare a monitorare questo tema? Sì

  3. Qual è l’URL radice del tuo sito Discourse? https://discourse.theme-creator.io/

  4. Vuoi che questo nome del sito venga salvato in…? Sì

  5. Qual è la tua Chiave API? Inserisci la chiave API che hai ottenuto da theme creator

  6. Vuoi che questa chiave API venga salvata…? Sì

  7. Scegli Crea e sincronizza con un nuovo tema quando richiesto

  8. Scegli Non fare nulla quando richiesto riguardo ai componenti del tema figlio

Se tutto ha funzionato correttamente, ora dovresti essere in grado di navigare su I miei temi su https://discourse.theme-creator.io/ e vedere il tuo nuovo tema nell’elenco dei temi a sinistra.

Per visualizzare queste modifiche in tempo reale, clicca sul nome del tuo tema, quindi nella parte inferiore dell’area informazioni, clicca su Anteprima

La Theme CLI ora monitora anche eventuali modifiche nella directory appena creata e salverà, nonché aggiornerà il tema su theme-creator con ogni modifica.

Primi Passi

La Discourse Theme CLI ha creato una struttura per il tema all’interno della cartella con il nome specificato nel comando eseguito in precedenza. Vengono generati molti file che non useremo, quindi andremo avanti ed elimineremo tutto tranne quanto segue:

common/common.scss

desktop/desktop.scss

mobile/mobile.scss

about.json

All’interno della directory, esegui anche rm -rf .git per rimuovere il tracciamento delle versioni di git, non sarà necessario per questa guida.

La directory del tuo tema dovrebbe ora sembrare così:

Vale la pena notare che gli stili che aggiungiamo a questi file verranno renderizzati nel rispettivo caso d’uso. Gli stili in common.scss verranno applicati a desktop + mobile, mentre gli stili in desktop.scss verranno applicati solo alla navigazione desktop e quelli in mobile.scss si applicheranno solo alle viste mobili.

Hello World (in colore)

Discourse utilizza SCSS per la sua stilizzazione, quindi per sfruttare al meglio gli stili, potresti voler familiarizzare con SASS, ma se non lo fai, potrai comunque seguire questa guida.

Ok, ora arriviamo a ciò per cui tutti stavano aspettando… LA TEMATIZZAZIONE!

Al momento, il nostro about.json non ha ancora schemi di colore definiti, quindi incolla il seguente codice in quella sezione e poi salva.

{
  "name": "my theme",
  "about_url": null,
  "license_url": null,
  "assets": {},
  "color_schemes": {
    "Default": {
      "primary": "222222",
      "secondary": "ffffff",
      "tertiary": "0088cc",
      "quaternary": "e45735",
      "header_background": "ffffff",
      "header_primary": "333333",
      "highlight": "ffff4d",
      "danger": "e45735",
      "success": "009900",
      "love": "fa6c8d"
    }
  }
}

Se hai il browser aperto, non avresti visto alcun cambiamento, perché questo è lo schema di colori predefinito utilizzato quando non è presente alcuno schema.

Panoramica del Tema

Per avere qualcosa di concreto da implementare in questa guida, ti guiderò nella creazione di un tema semplice basato su questa palette di colori.

image

Modifica del Colore di SFondo + Colore del Testo Primario

Facciamo qualcosa di molto semplice. Andremo avanti e modificheremo il valore "Secondary" del nostro schema di colori attuale. Cambiamolo in "secondary": "EEF4F7" (questo cambia il colore di sfondo). Cambiamo anche il valore "primary" in "203243".


Con solo quella riga, abbiamo già cambiato l’aspetto e la sensazione del nostro forum. Molte personalizzazioni possono essere fatte semplicemente modificando i colori nello schema di colori.

Utilizzo dello Schema di Colori

Tutte le seguenti chiavi sono definite nel file about.json sotto il nome corrispondente dello schema di colori. Queste descrizioni sono un buon riferimento per aiutarti a capire qual è lo scopo principale di ogni nome di variabile:

Colore Descrizione
primary La maggior parte del testo, delle icone e dei bordi
secondary Il colore di sfondo principale e il colore del testo di alcuni pulsanti
tertiary Link, alcuni pulsanti, notifiche e colore di accento
quaternary Link di navigazione
header_background Colore di sfondo dell’intestazione del sito
header_primary Testo e icone nell’intestazione del sito
highlight Il colore di sfondo degli elementi evidenziati nella pagina, come post e argomenti
danger Colore di evidenziazione per azioni come l’eliminazione di post e argomenti
success Usato per indicare che un’azione è stata completata con successo
love Il colore del pulsante Mi piace

Ognuna di queste variabili è disponibile per noi da usare all’interno dei nostri file SCSS come segue.

body {
  background-color: var(--primary);
}

Vengono create anche altre versioni di ciascun colore per essere utilizzate. Cose come var(--primary-medium) o var(--primary-very-low) possono essere usate per ottenere tonalità diverse dello stesso colore.

Cambiamo gli altri colori nel nostro schema di colori “Default” per corrispondere a questo:

"Default": {
      "primary": "203243",
      "secondary": "EEF4F7",
      "tertiary": "416376",
      "quaternary": "5E99B9",
      "header_background": "FaFaFa",
      "header_primary": "EEF4F7",
      "highlight": "86BDDB",
      "danger": "8F393E",
      "success": "70DB82",
      "love": "FC94CB"
    }

:flashlight: Puoi vedere tutte le variabili disponibili per l’uso nei tuoi file SCSS se clicchi sul link Guida agli stili mentre visualizzi l’anteprima del tuo tema su theme creator, poi cliccando su Colori nel menu a sinistra.

La Guida agli stili è una sezione molto utile da consultare quando si crea un tema personalizzato. Ogni Atomo ti mostrerà come appariranno determinati elementi di Discourse con i tuoi stili applicati.

Approfondimenti

Con la sezione precedente alle spalle, penso che sia il momento di approfondire un po’ cosa si può fare in Discourse usando solo SCSS. (Indizio: MOLTE COSE!)

Stilizzazione dell’Intestazione

Noterai che le nostre modifiche precedenti allo schema di colori hanno lasciato qualcosa a desiderare nella nostra intestazione. Le icone sono a malapena visibili!

image

L’intestazione di Discourse include un contenitore (con un colore di sfondo) per contenere il logo del sito, nonché le icone di navigazione a destra. Tutte queste possono essere personalizzate.

La classe target per personalizzare l’intestazione è .d-header.

Nel nostro file common/common.scss, aggiungiamo quanto segue:

.d-header {
  box-shadow: none;
  border-bottom: 1px solid var(--primary-low-mid);
  height: 5em;
}

Questo rimuoverà l’ombra della casella predefinita sull’intestazione, le darà un po’ più di altezza, nonché impostare un bordo inferiore per darci un po’ di separazione.

Per le icone – All’interno delle parentesi SCSS di .d-header, aggiungiamo questo codice annidato.

.d-header {
  // ...codice precedente
  .d-icon {
    color: var(--primary-low-mid);
  }
}

Questo sembra buono, ma un occhio attento noterà che l’aumento dell’altezza dell’intestazione ci ha dato meno spazio tra essa e il resto degli elementi del forum Discourse!

image

Lo spazio tra l’area principale e l’intestazione è controllato dal target #main-outlet. Aumentiamo leggermente questo spazio aggiungendo quanto segue alla fine del tuo file common/common.scss.

#main-outlet {
  padding-top: 6.5em;
}

Contenitore di Navigazione

Il contenitore di navigazione include le seguenti parti.

image

L’area più a sinistra è costituita dai menu a discesa per il filtro di categoria/tag, seguiti dai link di navigazione, terminati dal pulsante Nuovo Argomento.

Menu a Discesa Categoria / Tag

Facciamo alcune modifiche a questa area. Per farlo, aggiungi quanto segue al tuo file common.scss.

.navigation-container {
  .select-kit.combo-box {
    .select-kit-header {
      border-radius: 0.9em;
      background-color: var(--header_background);
    }
  }
}

Qui prendiamo di mira .select-kit-header per dare loro ciascuno un border-radius identico, nonché un colore di sfondo più chiaro.

Cliccando su uno di questi, si apre un menu a discesa.

Attualmente, ha anche angoli spigolosi, quindi aggiungiamo alcuni stili per arrotondarli e cambiare il colore di sfondo per essere lo stesso dell’intestazione.

.navigation-container {
  .select-kit.combo-box {
    // ...codice precedente
    &.category-drop,
    &.tag-drop {
      .select-kit-body {
        border-radius: 0.9em;
        background-color: var(--header_background);

        .select-kit-collection {
          background-color: var(--header_background);
          border-top-left-radius: 0px;
          border-top-right-radius: 0px;
        }
      }
    }
  }
}

Questo si traduce nel seguente aspetto…

Se guardi da vicino, puoi vedere che le nostre modifiche hanno lasciato visibile un piccolo bordo in alto a destra dell’area di ricerca.

Correggiamolo guardando nell’ispettore del nostro browser. Questo è sempre uno strumento super utile per imparare quali classi/ID dobbiamo prendere di mira per applicare correttamente gli stili.

Con il menu a discesa visibile, fai clic con il tasto destro sull’area di ricerca e ‘Ispetta’ l’elemento nel tuo browser.

Possiamo vedere che questo input si trova all’interno di un div con una classe select-kit-filter.

Se guardiamo le regole applicate a questo selettore, possiamo vedere che attualmente ha un bordo superiore e inferiore, nonché un po’ di padding applicato. Vogliamo cambiare solo la stilizzazione del bordo superiore.

Aggiungi il seguente codice annidato nello scss .select-kit-body di prima.

.select-kit.combo-box.category-drop,
.select-kit.combo-box.tag-drop {
  .select-kit-body {
    // ...codice precedente
    .select-kit-filter {
      border-top: 0px;
    }
  }
}

Con questo, il nostro codice per stilizzare il contenitore di navigazione dovrebbe sembrare così.

.navigation-container {
  // Menu a discesa Categoria + Tag
  .select-kit.combo-box {
    .select-kit-header {
      border-radius: 0.9em;
      background-color: var(--header_background);
    }

    &.category-drop,
    &.tag-drop {
      .select-kit-body {
        border-radius: 0.9em;
        background-color: var(--header_background);

        .select-kit-collection {
          background-color: var(--header_background);
          border-top-left-radius: 0px;
          border-top-right-radius: 0px;
        }

        .select-kit-filter {
          border-top: 0px;
        }
      }
    }
  }
}

Link di Navigazione

Aggiungiamo alcuni stili per far sì che questi link di navigazione sembrino simili a questo:

image

Usiamo di nuovo il nostro ispettore per scoprire cosa dovremmo prendere di mira qui.

Possiamo vedere che i nostri elementi di navigazione sono all’interno di un UL con una classe "nav nav-pills ..."

Tornando nel nostro file common.scss, sotto la sezione precedente, ma ancora annidato all’interno di navigation-container aggiungiamo quanto segue:

.nav-pills {
  & > li a {
    &.active {
      color: var(--tertiary);
      background-color: var(--secondary);
      border-bottom: 4px solid var(--tertiary);
    }
  }
}

Questa modifica prenderà di mira solo i nostri link con la classe active che sono figli di nav-pills. Questa modifica dovrebbe far sembrare il nostro link attivo così:

image

Va bene, ma vorrei che il bordo inferiore si estendesse solo fino al testo. Per fare questo, sopra la riga &.active {, aggiungiamo quanto segue, che influenzerà tutti i link A all’interno dei tag <li> di navigazione.

// ...altro codice
.nav-pills {
  & > li a {
    padding: 0;
    margin-right: 20px;
    color: var(--tertiary-high);
    border-bottom: 4px solid transparent;

    &.active {
      // ...più codice
    }
  }
}

Ora, dobbiamo stilizzare l’effetto “hover” per essere lo stesso dell’effetto “active”.

Sotto il nostro precedente &.active aggiungiamo

&:hover {
  color: var(--tertiary);
  background-color: var(--secondary);
  border-bottom: 4px solid var(--primary);
}

Quindi tutto il nostro codice di navigazione dovrebbe ora sembrare così:

// Nav Pills
.nav-pills {
  & > li a {
    padding: 0;
    margin-right: 20px;
    color: var(--tertiary-high);
    border-bottom: 4px solid transparent;

    &.active {
      color: var(--tertiary);
      background-color: var(--secondary);
      border-bottom: 4px solid var(--tertiary);
    }

    &:hover {
      color: var(--tertiary);
      background-color: var(--secondary);
      border-bottom: 4px solid var(--primary);
    }
  }
}

Pulsanti

I pulsanti in Discourse vengono in molte forme e dimensioni. Puoi visualizzare una varietà di essi nella Guida agli stili nella sezione Pulsanti.

Vorrei cambiare la maggior parte dei pulsanti in questo tema per essere arrotondati con alcune stilizzazioni personalizzate. Questo cambierà il pulsante + Nuovo Argomento, nonché altri pulsanti in tutto il sito.

Nella parte inferiore del nostro file common.scss, aggiungiamo quanto segue:

.btn {
  background-color: var(--header_background);
  color: var(--primary);
  border-radius: 1.2em;
  border: 1px solid var(--primary-low-mid);

  .d-icon {
    color: var(--primary);
  }

  &:hover {
    background-color: var(--quaternary-low);
    color: var(--primary);
    .d-icon {
      color: var(--primary);
    }
  }

  &.btn-default,
  &.btn-primary {
    padding: 10px 12px;
  }
}

Questo farà sembrare i nostri pulsanti così:

image

Ora che i nostri pulsanti sono stilizzati, vorrei sottolineare qualcosa sulla stilizzazione dei pulsanti e perché è importante testare tutti i tuoi design.

Vai avanti e clicca su un Argomento nella tua anteprima del sito, poi premi il pulsante rispondi su una risposta all’argomento, o dal pulsante di risposta in fondo al flusso dell’argomento. Vedrai che la nostra stilizzazione dei pulsanti ha influenzato alcune cose che forse non avevamo in mente.

Non voglio che questi pulsanti di modifica del testo siano influenzati dalla mia precedente stilizzazione. Questo richiede un po’ di SASS/CSS più complesso, ma possiamo far sì che il nostro codice non influenzi questi pulsanti con :not(). :wink:

Aggiungiamo questa riga di codice, davanti al nostro target .btn attuale. Questo dirà ai nostri stili di applicarsi solo ai pulsanti che non sono figli di .d-editor-button-bar.

:not(.d-editor-button-bar) > .btn

Ok, ha funzionato benissimo… ma aspetta! Ora c’è questo strano ribelle che fa di testa sua.

image

Ispettandolo nel browser, posso vedere che questo pulsante ha una classe .select-kit-header perché cliccando su questa ingranaggio, verranno mostrate più opzioni.

:flashlight: Non posso sottolineare abbastanza quanto sia importante usare gli strumenti di ispezione del browser quando si creano temi Discourse. Sono il tuo migliore amico da portare con te in questo viaggio.

Ora che sappiamo che non vogliamo prendere di mira questo pulsante, aggiungiamo un po’ più di funzionalità :not() al nostro codice.

:not(.d-editor-button-bar) >
.btn:not(.single-select-header)

Questo selezionerà tutti i pulsanti che NON sono figli di .d-editor-button-bar e non hanno la classe .single-select-header. So che è un po’ confuso, ma all’interno di Discourse ci sono molte parti in movimento, quindi a volte la stilizzazione deve essere molto specifica per influenzare correttamente gli elementi.

Ho anche notato che la nostra attuale stilizzazione influenza in modo goffo il pulsante di chiusura della modale. Cliccando su qualsiasi cosa che apra una modale potresti vederlo, o ancora più facile, possiamo navigare alla sezione modali della Guida agli stili.

Per correggere questo, aggiungerò un altro target al nostro codice.

:not(.d-editor-button-bar) >
.btn:not(.single-select-header):not(.modal-close)

Passiamo oltre…

Vedo un altro pulsante che non sembra essere stato influenzato dal nostro codice. È il pulsante Monitoraggio situato in fondo a un flusso di post dell’argomento.

image

Aggiungerò la seguente riga, dopo una virgola, al nostro codice .btn attuale.

:not(.d-editor-button-bar) >
.btn:not(.single-select-header):not(.modal-close),
.topic-notifications-button > .select-kit > .btn

Questo prenderà di mira correttamente il pulsante che appare in questa sezione e, per ora, abbiamo finito con la stilizzazione della parte superiore del nostro forum.

:flashlight: Sentiti libero di regolare qualsiasi dei parametri nel tuo css. Più giocherai con questi stili e vedrai cosa e come influenzano l’html, più imparerai!

Dove andare da qui

Questa guida era destinata a sfiorare la superficie di come puoi personalizzare il tuo tema per Discourse. Spero che ora tu abbia una maggiore comprensione di come prendere di mira aree dell’app per le tue personalizzazioni.

Ricorda Molte cose possono essere personalizzate usando solo SCSS. Se vuoi approfondire ulteriormente lo sviluppo, ti consiglio di leggere gli articoli collegati in cima a questo post.

Sentiti libero di fare qualsiasi domanda e sarò lieto di aiutarti o indirizzarti nella direzione giusta.


Questo documento è versionato - suggerisci modifiche su github.

44 Mi Piace

Ciao @jordan.vidrine,

Ho ricevuto un errore 301 durante la sezione Esecuzione della CLI del tema Discourse di questo tutorial.

Sono stato in grado di risolverlo utilizzando https://discourse.theme-creator.io/ invece di https://theme-creator.discourse.org per l’URL principale.

Spero che questo aiuti!

7 Mi Piace

Sì, abbiamo aggiornato quell’URL e anche questo post necessita di un aggiornamento, grazie per avercelo fatto sapere!

6 Mi Piace

Grazie per queste informazioni @IdentityDan!
Inoltre, per la cronaca, se riscontri questo errore, probabilmente dovrai modificare questo file /home/USERNAME/.discourse_theme, che memorizza la relazione tra le chiavi API e i siti Discourse per ciascun tema.
Quindi, anche se la creazione del tema va in crash, le informazioni inserite nel “wizard” verranno memorizzate lì e se provi a creare un nuovo tema con lo stesso nome, l’URL e le chiavi API verranno recuperati da questo file.

3 Mi Piace

Solo un’altra cosa, quando si utilizza l’anteprima del tema, il link Styleguide non funziona correttamente. Reindirizza a una pagina che utilizza il tema standard, ma aggiungendo all’URL ?preview_theme_id=THEME-ID-NUMBER otteniamo la Styleguide con il tema corretto.

1 Mi Piace

Grazie, è fantastico

2 Mi Piace

Ciao, sto appena iniziando a leggere il post…
Ma prima di andare avanti volevo sapere se è possibile usare la CLI con un’istanza self-hosted?
O dobbiamo usare la CLI con theme-creator.io per lo sviluppo e una volta finito possiamo “importare” il tema nell’istanza self-hosted?
Nel mio caso, sono più interessato ad usarlo come tema per personalizzare un forum “one-off” piuttosto che creare un tema riutilizzabile destinato alla pubblicazione…
Quindi dovrei comunque usare la CLI con quel sito web pubblico?
Grazie.

1 Mi Piace

Questo è possibile, ed è il metodo che consiglierei. L’unica cosa di cui devi essere consapevole è che queste modifiche saranno attive sul forum man mano che apporti ogni modifica.

Quello che faccio è impostare il tema come selezionabile dall’utente e cambiare la mia preferenza utente personale a quel tema, mantenendo il tema predefinito la scelta per tutti gli altri utenti. Questo ti permette solo di vedere eventuali problemi che potrebbero sorgere durante la tematizzazione.

2 Mi Piace

Spesso faccio così con un server “dummy live” con un nome di dominio che non ho avuto il coraggio di smettere di affittare.

È più conveniente perché spengo semplicemente il server per settimane a volte, quando non lo uso.

Ovviamente pago ancora per lo storage (e forse per un IP), ma almeno non pago per il calcolo 24 ore su 24, 7 giorni su 7.

c’è un altro posto che necessita di un aggiornamento, credo!

1 Mi Piace