67 votes

Utilisation de thèmes personnalisés dans Vuetify et passage de variables de couleur aux composants

Dans mon index.js J'ai remplacé manuellement le fichier Vuetify theme avec la couleur de mon entreprise :

Vue.use(Vuetify, {
  theme: {
    primary: '#377ef9',
    secondary: '#1b3e70',
    accent: '#ff643d',
    error: '#ff643d'
    ...
  }

Maintenant, je peux utiliser ces couleurs à partir de mes modèles comme suit :

<my-text-field name="input text"
    label="text"
    value="text text text text..."
    type="text"
    color="primary">
</my-text-field>

Ce que je cherche, c'est à utiliser le primary ou toute autre variable dans le theme défini ci-dessus, dans le style de mon modèle :

<script>
  import { VTextField } from 'vuetify'
  export default {
    extends: VTextField
  }
</script>

<style scoped lang="stylus">
  label
    color: <seconday color> <-- this is what I'm after
    color: #1b3e70 <-- this works, but not quite good enough for me
</style>

Je peux facilement écrire la valeur hexadécimale de mes couleurs dans la section style, mais je ne veux pas me répéter, et préfère utiliser mon theme Ainsi, il me sera plus facile de changer facilement les couleurs partout, et d'éviter les fautes de frappe qui entraîneraient des erreurs dans la définition des couleurs.

0 votes

Je ne suis pas sûr, mais je crois que vous devez les définir dans la section .styl (c'est-à-dire main.styl ) également. Ou, par exemple, dans custom_colors.styl que vous importez ensuite dans les composants <style scoped lang="stylus">

2 votes

@Traxo Je ne veux pas définir mes styles deux fois. La maintenance va devenir difficile. Je cherche une solution parfaite qui me permette de définir mes éléments à un seul endroit, et de les utiliser dans tout le système...

0 votes

Je comprends, c'est pourquoi j'ai mis un commentaire parce que je ne suis pas sûr à 100% qu'il y ait une solution vuetify à ce problème. Je pense que la seule façon vuetify de le faire est de copier ces valeurs dans le fichier .styl

79voto

Traxo Points 5517

Modifier (2018/10/11)

Depuis la version 1.2. nous pouvons activer les variables CSS
NOTE : il ne fonctionnerait pas dans IE (Edge devrait fonctionner), et peut-être certaines versions de Safari ?

Desde docs (voir Propriétés personnalisées )

L'activation de CustomProperties génèrera également une variable css pour chaque élément de la base de données. couleur du thème, que vous pouvez ensuite utiliser dans les blocs de vos composants.

Vue.use(Vuetify, {
  options: {
    customProperties: true
  }
})

<style scoped>
  .something {
    color: var(--v-primary-base)
    background-color: var(--v-accent-lighten2)
  }
</style>

Pour les valeurs personnalisées, par exemple
yourcustomvariablename: '#607D8B'
utiliser --v-yourcustomvariablename-base (donc base est la valeur par défaut).



Réponse originale :

Il existe un Feature Request sur github : Accéder aux couleurs du thème dans les fichiers du stylet

@KaelWD (un des développeurs) a écrit :

C'est quelque chose que vous devrez mettre en œuvre vous-même. J'ai essayé de faire quelque chose de similaire auparavant, mais cela ne fonctionne pas vraiment au niveau du cadre.

Le problème est étiqueté wontfix


Edit (2018/10/11)
Voir aussi ce fil de discussion mis à jour :
https://github.com/vuetifyjs/vuetify/issues/827 (Demande de fonctionnalité : Variables css natives)

0 votes

Oui, si vous avez juste besoin de couleurs statiques, vous pouvez les définir dans un fichier json et l'importer dans sylus et js. Pour les changer dynamiquement, il faudrait utiliser des variables css, que je suis un peu réticent à mettre en œuvre car nous devons toujours supporter IE11.

0 votes

Je ne suis pas sûr que la v1.2 de vuetify fasse cela avec un thème personnalisé. --v-yourcustomvariablename ne fonctionne pas

1 votes

@RomOne pouvez-vous essayer --v-yourcustomvariablename-base ?

26voto

Vic Points 217

Il y a un moyen de contourner ce problème en utilisant :style attributs. Il peut être utilisé pour définir des propriétés CSS personnalisées de manière réactive.

Ajouter une propriété calculée :

computed: {
    cssProps () {
        return {
            '--secondary-color': this.$vuetify.theme.secondary
        }
    }

Lier le style à cssProps :

<div id="app" :style="cssProps">

Ensuite, dans votre style :

<style scoped>
    label
        color: var(--secondary-color);
</style>

Adapté de cette discussion : https://github.com/vuejs/vue/issues/7346

2 votes

Je n'arrive pas à le faire fonctionner. Le site var(--secondary-color) n'est pas analysé. Peut-être que le build n'est pas configuré correctement ?

2 votes

Avez-vous vérifié le codepen dans la discussion liée ? codepen.io/richardtallent/pen/yvpERW J'avais initialement oublié d'ajouter l'attribut :style="cssProps" lors du test.

1 votes

Pour les fans de lodash voici un oneliner pour exporter le thème entier dans cssProps() : _(this.$vuetify.theme).reduce((acc, v, k)=>{acc[`--${k}`]=v;return acc;},{});

18voto

Alex McCabe Points 758

Pour tous ceux qui se heurtent à ce problème à partir de Vuetify V2, vous pouvez procéder comme suit pour accéder aux variables de couleur SCSS.

// Import the Vuetify styles somewhere global
@import '~vuetify/src/styles/styles.sass';

// Now in your components you can access the colour variables using map-get
div {
  background: map-get($grey, lighten-4);
}

Toutes les couleurs peuvent être trouvées dans /node_modules/vuetify/styles/settings/_colors.scss .

1 votes

Merci pour le conseil mais je pense que l'idée était de ne pas accéder aux couleurs en utilisant directement les noms, mais par exemple d'utiliser la couleur de fond définie par le thème. En tout cas, c'est ce que j'ai lu et ce que je recherche ;-)

1 votes

Oui, vous savez comment accéder aux couleurs du thème ?

1 votes

Merci pour ce document, c'est exactement ce que je cherchais, pas le thème mais les couleurs actuelles.

6voto

wanjijul Points 92

D'après les réponses ci-dessus, si vous voulez inclure toutes les couleurs Vuetify, mettez ce code dans le modèle App.vue.

<v-app :style="cssProps">

App.vue script

computed: {
   cssProps () {
      var themeColors = {}
      Object.keys(this.$vuetify.theme.themes.light).forEach((color) => {
        themeColors[`--v-${color}`] = this.$vuetify.theme.themes.light[color]
      })
      return themeColors
   }
}

Disons que vous avez cette couleur dans vuetify.js

export default new Vuetify({
  treeShake: true,
    theme: {
      themes: {
        light: {
          darkRed: "#CD3300",
        }
      }
    }
})

Ensuite, dans n'importe quel composant :

<style scoped>
  .label {
    color: var(--v-darkRed);
  }
</style>

0 votes

Intéressant... Donc, vous placez toutes les définitions de couleur sur le style de l'attribut <v-app> composant ... c'est un bon hack en fait :)

3voto

N3XT Points 1

Je suis peut-être en retard, mais la façon la plus efficace de procéder est celle mentionnée dans la documentation. https://vuetifyjs.com/en/features/theme/#custom-properties

Je fournirai un exemple de travail pour la même chose. Vous n'avez besoin que de trois changements pour que cela fonctionne.

  1. Mentionnez l'option qui fait la magie et la couleur de votre thème.

    export default new Vuetify({ theme: { options: { customProperties: true }, themes: { light: { primary: "#3DCFD3", secondary: "#171b34", accent: "3D87E4" } } } });

  2. Mentionnez le nom de la classe dans la balise où vous voulez que votre thème soit appliqué.

    <h4 class="blue-header">Yash Oswal</h4>

  3. CSS pour appliquer votre thème.

    <style lang="scss">

    .blue-header { color: var(--v-primary-base); }

    </style>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X