Diviser le thème SCSS en plusieurs fichiers

Les thèmes et les composants de thème deviennent de plus en plus puissants, et les développeurs deviennent de plus en plus ambitieux. Pour faciliter les choses aux développeurs, les thèmes peuvent désormais diviser leur SCSS en plusieurs fichiers.

Lors de la création d’un nouveau thème avec le theme CLI, ou lors du partage d’un thème sur github, créez simplement un nouveau dossier nommé scss. Remplissez-le avec vos fichiers .scss, en suivant n’importe quelle structure de dossier, et tous les fichiers seront disponibles pour être importés dans les sections SCSS communes / bureau / mobile de votre thème.

Par exemple, si vous souhaitez qu’une variable commune soit disponible pour le SCSS mobile et bureau, vous pouvez faire quelque chose comme ceci :

scss/my-folder/variables.scss

$favourite-color = red;

desktop/desktop.scss

@import "my-folder/variables";
body {
  background-color: $favourite-color;
}

mobile/mobile.scss

@import "my-folder/variables";
body {
  color: $favourite-color;
}

Cette fonctionnalité a été ajoutée dans v2.3.0.beta8, donc n’utilisez pas ces fonctionnalités pour le moment si vous devez maintenir une rétrocompatibilité avec les anciennes versions de Discourse. Vous pouvez utiliser le paramètre minimum_discourse_version de about.json pour vous assurer que votre composant n’est pas utilisé sur une version antérieure.


Ce document est contrôlé par version - suggérez des modifications sur github.

20 « J'aime »

This is amazing @david! Nice work!

I can’t wait to give this a whirl.

8 « J'aime »

This is a great! I can now remove my hack for getting around not being able to do this.

5 « J'aime »

@david this is great, but unfortunately it doesn’t seem to work when the theme is a component. Not sure if that’s a known bug.

You can see it happen with this very simple theme: GitHub - LeoMcA/discourse-multi-scss-component

When converted to a stand-alone theme the background colour will be green, but when used as a component within another theme it doesn’t change the background colour at all.

5 « J'aime »

Thanks @LeoMcA, you’re right - this wasn’t working in components. The issue should be fixed in

4 « J'aime »

Est-ce que cela est censé fonctionner ? Mes fichiers SCSS par défaut (common/desktop/mobile) ne fonctionnent pas lorsque j’ajoute un @import.

Ou y a-t-il une nouvelle recommandation pour séparer les fichiers ?

Cela devrait toujours fonctionner. Peux-tu partager l’instruction @import exacte que tu utilises, ainsi que la structure de tes fichiers de styles ?

La configuration du thème possède une structure de fichiers par défaut et j’ai ajouté scss/test.scss. Ensuite, j’ai ajouté @import "test";.

Sur la console (en utilisant discourse_theme watch), j’obtiens :
✘ Erreur dans le SCSS commun : Erreur : Fichier à importer introuvable ou illisible : test. sur la ligne 1 de common.scss

Votre fichier test.scss contient-il du contenu ?

J’ai simplement déclaré une variable (au fait, il y a une faute de frappe dans le premier bloc de code ci-dessus : la déclaration utilise le signe égal : $favourite-color = red;).

Mais j’ai résolu le problème. J’ai défini la version minimale dans about.json comme étant v2.3.0.beta8, et lorsque je l’enlève, tout fonctionne parfaitement. Je n’ai jamais utilisé cela auparavant, donc je ne suis pas sûr de ce qui cloche dans la déclaration.

1 « J'aime »

Intéressant ! Si vous ajoutez à nouveau la version minimale, le problème se produit-il systématiquement ? Dans ce cas, seriez-vous d’accord pour compresser le thème défectueux et le partager ici (ou me l’envoyer par message privé) ?

1 « J'aime »

Comme mentionné, je n’avais jamais défini de version minimale auparavant. Je l’ai donc simplement copiée ci-dessus sous la forme v2.3.0.beta8. Cela échoue, mais 2.3.0.beta8 fonctionne parfaitement.

Est-il possible d’utiliser des fichiers scss d’un package node_modules ? Par exemple :

@import 'bootstrap/scss/bootstrap.scss';
@import '../node_modules/bootstrap/scss/bootstrap.scss';

Dans les deux cas, je ne peux pas importer cela depuis le dossier /scss.