Vize

Règles Musea et CSS

Chaque règle présente sur cette page son objectif, sa configuration et ses exemples complets Mauvais et Bon, accompagnés de leurs explications. Les lignes surlignées montrent les modifications ; le code copié conserve la source complète. Les limites de prise en charge actuelles sont précisées avant les exemples concernés.

Règle Exemples Objectif
css/no-display-none Mauvais · Bon Suggérer v-show plutôt que display: none
css/no-hardcoded-values Mauvais · Bon Suggérer des variables CSS plutôt que des valeurs codées en dur
css/no-id-selectors Mauvais · Bon Déconseiller les sélecteurs d’identifiant en CSS
css/no-important Mauvais · Bon Déconseiller !important en CSS
css/no-utility-classes Mauvais · Bon Déconseiller l’implémentation de classes utilitaires dans les styles des composants
css/no-v-bind-performance Mauvais · Bon Signaler le coût de performance de v-bind() en CSS
css/prefer-logical-properties Mauvais · Bon Recommander les propriétés logiques CSS pour mieux prendre en charge l’internationalisation
css/prefer-nested-selectors Mauvais · Bon Recommander l’imbrication CSS pour les sélecteurs de descendants
css/prefer-slotted Mauvais · Bon Recommander ::v-slotted() pour styliser le contenu des slots
css/require-font-display Mauvais · Bon Exiger font-display dans les règles @font-face
musea/no-empty-variant Mauvais · Bon Interdire les blocs <variant> vides
musea/prefer-design-tokens Mauvais · Bon Préférer les variables CSS de design tokens aux valeurs primitives codées en dur
musea/require-component Mauvais · Bon Exiger l’attribut component dans le bloc <art>
musea/require-title Mauvais · Bon Exiger l’attribut title dans le bloc <art>
musea/unique-variant-names Mauvais · Bon Exiger des noms de variants uniques
musea/valid-variant Mauvais · Bon Exiger un attribut name dans les blocs <variant>

Toutes les règles · Options des règles · Correspondance de migration ESLint · Vérifications du projet · Attributs entre composants

css/no-display-none

Suggérer v-show plutôt que display: none

Mauvais · Bon

Gravité par défaut: warning
Préréglages: opinionated, nuxt
Correction automatique: Aucune ; examinez la modification proposée
Champ d’application: Blocs style en CSS standard (les blocs scss, sass, less et stylus sont ignorés)
Options: Aucune option propre à la règle. La gravité et le choix des préréglages sont configurables.

Configuration (Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "css/no-display-none": "warn"
      }
    },
  },
});
vp run lint

Mauvais

La déclaration .message masque le paragraphe local au moyen du CSS plutôt que d’une condition de visibilité dans le template.

<template>
  <p class="message">Saved</p>
</template>

<style scoped>
.message {
  display: none;
}
</style>

Bon

v-show="isSaved" rend la condition de visibilité explicite sur le paragraphe local et supprime display: none.

<template>
  <p v-show="isSaved" class="message">Saved</p>
</template>

Le bon exemple évite le diagnostic de cette règle avec la configuration ci-dessus ; d’autres règles peuvent encore signaler des diagnostics.

Implémentation · Toutes les règles

css/no-hardcoded-values

Suggérer des variables CSS plutôt que des valeurs codées en dur

Mauvais · Bon

Gravité par défaut: warning
Préréglages: opinionated, nuxt
Correction automatique: Aucune ; examinez la modification proposée
Champ d’application: Blocs style en CSS standard (les blocs scss, sass, less et stylus sont ignorés)
Options: Aucune option propre à la règle. La gravité et le choix des préréglages sont configurables.

Configuration (Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "css/no-hardcoded-values": "warn"
      }
    },
  },
});
vp run lint

Mauvais

Le bouton place directement des nombres d’espacement et une couleur hexadécimale dans les déclarations.

<style scoped>
.button {
  padding: 12px 16px;
  color: #174ea6;
}
</style>

Bon

Les déclarations référencent des propriétés personnalisées d’espacement et de couleur nommées, afin que ces valeurs puissent être maintenues sous forme de tokens.

<style scoped>
.button {
  padding: var(--space-3) var(--space-4);
  color: var(--color-action-text);
}
</style>

Le bon exemple évite le diagnostic de cette règle avec la configuration ci-dessus ; d’autres règles peuvent encore signaler des diagnostics.

Implémentation · Toutes les règles

css/no-id-selectors

Déconseiller les sélecteurs d’identifiant en CSS

Mauvais · Bon

Gravité par défaut: warning
Préréglages: opinionated, nuxt
Correction automatique: Aucune ; examinez la modification proposée
Champ d’application: Blocs style en CSS standard (les blocs scss, sass, less et stylus sont ignorés)
Options: Aucune option propre à la règle. La gravité et le choix des préréglages sont configurables.

Configuration (Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "css/no-id-selectors": "warn"
      }
    },
  },
});
vp run lint

Mauvais

#submit lie la règle de style à un sélecteur d’identifiant.

<style scoped>
#submit {
  font-weight: 600;
}
</style>

Bon

La classe .submit fournit un point d’accroche de style réutilisable sans sélecteur d’identifiant.

<style scoped>
.submit {
  font-weight: 600;
}
</style>

Le bon exemple évite le diagnostic de cette règle avec la configuration ci-dessus ; d’autres règles peuvent encore signaler des diagnostics.

Implémentation · Toutes les règles

css/no-important

Déconseiller !important en CSS

Mauvais · Bon

Gravité par défaut: warning
Préréglages: opinionated, nuxt
Correction automatique: Aucune ; examinez la modification proposée
Champ d’application: Blocs style en CSS standard (les blocs scss, sass, less et stylus sont ignorés)
Options: Aucune option propre à la règle. La gravité et le choix des préréglages sont configurables.

Configuration (Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "css/no-important": "warn"
      }
    },
  },
});
vp run lint

Mauvais

La déclaration de couleur remplace la priorité normale de la cascade avec !important.

<style scoped>
.button {
  color: red !important;
}
</style>

Bon

La couleur provient d’une propriété personnalisée sans déclaration important.

<style scoped>
.button {
  color: var(--button-color);
}
</style>

Le bon exemple évite le diagnostic de cette règle avec la configuration ci-dessus ; d’autres règles peuvent encore signaler des diagnostics.

Implémentation · Toutes les règles

css/no-utility-classes

Déconseiller l’implémentation de classes utilitaires dans les styles des composants

Mauvais · Bon

Gravité par défaut: warning
Préréglages: opinionated, nuxt
Correction automatique: Aucune ; examinez la modification proposée
Champ d’application: Blocs style en CSS standard (les blocs scss, sass, less et stylus sont ignorés)
Options: Aucune option propre à la règle. La gravité et le choix des préréglages sont configurables.

Configuration (Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "css/no-utility-classes": "warn"
      }
    },
  },
});
vp run lint

Mauvais

Les sélecteurs écrits utilisent des noms de forme utilitaire, tels que .flex, .mt-4 et .text-center.

<style scoped>
.flex { display: flex; }
.mt-4 { margin-top: 1rem; }
.text-center { text-align: center; }
</style>

Bon

Un sélecteur .my-component propre au composant rassemble ses styles sous un nom sémantique unique.

<style scoped>
.my-component { display: flex; margin-top: 1rem; }
</style>

Le bon exemple évite le diagnostic de cette règle avec la configuration ci-dessus ; d’autres règles peuvent encore signaler des diagnostics.

Implémentation · Toutes les règles

css/no-v-bind-performance

Signaler le coût de performance de v-bind() en CSS

Mauvais · Bon

Gravité par défaut: warning
Préréglages: opinionated, nuxt
Correction automatique: Aucune ; examinez la modification proposée
Champ d’application: Blocs style en CSS standard (les blocs scss, sass, less et stylus sont ignorés)
Options: Aucune option propre à la règle. La gravité et le choix des préréglages sont configurables.

Configuration (Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "css/no-v-bind-performance": "warn"
      }
    },
  },
});
vp run lint

Mauvais

La feuille de style lit la valeur changeante offset au moyen du mécanisme CSS v-bind() du SFC.

<style scoped>
.card {
  transform: translateX(v-bind(offset));
}
</style>

Bon

L’élément reçoit directement la transformation changeante via sa liaison de style.

<template>
  <article :style="{ transform: `translateX(${offset}px)` }" class="card" />
</template>

Le bon exemple évite le diagnostic de cette règle avec la configuration ci-dessus ; d’autres règles peuvent encore signaler des diagnostics.

Implémentation · Toutes les règles

css/prefer-logical-properties

Recommander les propriétés logiques CSS pour mieux prendre en charge l’internationalisation

Mauvais · Bon

Gravité par défaut: warning
Préréglages: opinionated, nuxt
Correction automatique: Aucune ; examinez la modification proposée
Champ d’application: Blocs style en CSS standard (les blocs scss, sass, less et stylus sont ignorés)
Options: Aucune option propre à la règle. La gravité et le choix des préréglages sont configurables.

Configuration (Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "css/prefer-logical-properties": "warn"
      }
    },
  },
});
vp run lint

Mauvais

margin-left fixe la marge sur un côté physique indépendamment du sens d’écriture.

<style scoped>
.panel {
  margin-left: 1rem;
}
</style>

Bon

margin-inline-start suit plutôt le début de la direction en ligne.

<style scoped>
.panel {
  margin-inline-start: 1rem;
}
</style>

Le bon exemple évite le diagnostic de cette règle avec la configuration ci-dessus ; d’autres règles peuvent encore signaler des diagnostics.

Implémentation · Toutes les règles

css/prefer-nested-selectors

Recommander l’imbrication CSS pour les sélecteurs de descendants

Mauvais · Bon

Gravité par défaut: warning
Préréglages: opinionated, nuxt
Correction automatique: Aucune ; examinez la modification proposée
Champ d’application: Blocs style en CSS standard (les blocs scss, sass, less et stylus sont ignorés)
Options: Aucune option propre à la règle. La gravité et le choix des préréglages sont configurables.

Configuration (Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "css/prefer-nested-selectors": "warn"
      }
    },
  },
});
vp run lint

Mauvais

Le sélecteur de descendant .card .title répète le sélecteur parent dans une règle à plat.

<style scoped>
.card .title { color: red; }
</style>

Bon

La règle .title est imbriquée dans .card, ce qui rassemble la relation de style parent-enfant.

<style scoped>
.card { .title { color: red; } }
</style>

Le bon exemple évite le diagnostic de cette règle avec la configuration ci-dessus ; d’autres règles peuvent encore signaler des diagnostics.

Implémentation · Toutes les règles

css/prefer-slotted

Recommander ::v-slotted() pour styliser le contenu des slots

Mauvais · Bon

Gravité par défaut: warning
Préréglages: opinionated, nuxt
Correction automatique: Aucune ; examinez la modification proposée
Champ d’application: Blocs style en CSS standard (les blocs scss, sass, less et stylus sont ignorés)
Options: Aucune option propre à la règle. La gravité et le choix des préréglages sont configurables.

Configuration (Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "css/prefer-slotted": "warn"
      }
    },
  },
});
vp run lint

Mauvais

La feuille de style scoped cible le point d’insertion slot plutôt que les éléments fournis au slot.

<style scoped>
slot { color: red; }
</style>

Bon

:slotted(.label) cible l’élément label fourni au moyen du sélecteur de slot scoped.

<style scoped>
:slotted(.label) { color: red; }
</style>

Le bon exemple évite le diagnostic de cette règle avec la configuration ci-dessus ; d’autres règles peuvent encore signaler des diagnostics.

Implémentation · Toutes les règles

css/require-font-display

Exiger font-display dans les règles @font-face

Mauvais · Bon

Gravité par défaut: warning
Préréglages: opinionated, nuxt
Correction automatique: Aucune ; examinez la modification proposée
Champ d’application: Blocs style en CSS standard (les blocs scss, sass, less et stylus sont ignorés)
Options: Aucune option propre à la règle. La gravité et le choix des préréglages sont configurables.

Configuration (Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "css/require-font-display": "warn"
      }
    },
  },
});
vp run lint

Mauvais

La déclaration font-face définit la source de la police, mais omet sa politique font-display.

<style>
@font-face {
  font-family: "Inter";
  src: url("/inter.woff2") format("woff2");
}
</style>

Bon

font-display: swap sélectionne explicitement la politique d’affichage passant d’une police de repli à la police chargée.

<style>
@font-face {
  font-family: "Inter";
  src: url("/inter.woff2") format("woff2");
  font-display: swap;
}
</style>

Le bon exemple évite le diagnostic de cette règle avec la configuration ci-dessus ; d’autres règles peuvent encore signaler des diagnostics.

Implémentation · Toutes les règles

musea/no-empty-variant

Interdire les blocs <variant> vides

Mauvais · Bon

Gravité par défaut: warning
Préréglages: none
Correction automatique: Aucune ; examinez la modification proposée
Champ d’application: Blocs art, variant et style des fichiers .art.vue de Musea
Options: Aucune option propre à la règle. La gravité et le choix des préréglages sont configurables.

Configuration (Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "musea/no-empty-variant": "warn"
      }
    },
  },
});
vp run lint

Mauvais

Le variant nommé primary est vide et ne fournit donc aucun contenu d’aperçu.

<art title="Button" component="./Button.vue">
  <variant name="primary" />
</art>

Bon

Le variant affiche un Button primary avec son contenu Save.

<art title="Button" component="./Button.vue">
  <variant name="primary">
    <Button tone="primary">Save</Button>
  </variant>
</art>

Le bon exemple évite le diagnostic de cette règle avec la configuration ci-dessus ; d’autres règles peuvent encore signaler des diagnostics.

Implémentation · Toutes les règles

musea/prefer-design-tokens

Préférer les variables CSS de design tokens aux valeurs primitives codées en dur

Mauvais · Bon

Gravité par défaut: warning
Préréglages: none
Correction automatique: Aucune ; examinez la modification proposée
Champ d’application: Blocs art, variant et style des fichiers .art.vue de Musea
Options: Consultez les options typées et leurs valeurs par défaut.

Nécessite un fichier .art.vue et l’inventaire des tokens présenté ci-dessous. Aucun token n’est déduit d’une couleur arbitraire.

Configuration (Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "musea/prefer-design-tokens": "warn"
      },
      "ruleOptions": {
        "musea/prefer-design-tokens": {
          "tokens": [
            {
              "path": "color.primary",
              "value": "#3b82f6",
              "tier": "semantic"
            }
          ]
        }
      }
    },
  },
});
vp run lint

Mauvais

L’exemple art utilise la couleur bleue littérale au lieu du design token primaire configuré.

Button.art.vue

<art title="Button" component="Button">
<variant name="Primary"><Button /></variant>
</art>
<style scoped>
.button {
  color: #3b82f6;
}
</style>

Bon

Le style référence --color-primary, le token configuré pour cet exemple.

Button.art.vue

<art title="Button" component="Button">
<variant name="Primary"><Button /></variant>
</art>
<style scoped>
.button {
  color: var(--color-primary);
}
</style>

Le bon exemple évite le diagnostic de cette règle avec la configuration ci-dessus ; d’autres règles peuvent encore signaler des diagnostics.

Implémentation · Toutes les règles

musea/require-component

Exiger l’attribut component dans le bloc <art>

Mauvais · Bon

Gravité par défaut: warning
Préréglages: none
Correction automatique: Aucune ; examinez la modification proposée
Champ d’application: Blocs art, variant et style des fichiers .art.vue de Musea
Options: Aucune option propre à la règle. La gravité et le choix des préréglages sont configurables.

Configuration (Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "musea/require-component": "warn"
      }
    },
  },
});
vp run lint

Mauvais

Le bloc art fournit un titre, mais n’identifie pas le composant dont il présente l’aperçu.

<art title="Button">
  <variant name="primary" />
</art>

Bon

defineArt fournit ./Button.vue comme composant du bloc art.

<script setup>
defineArt("./Button.vue", { title: "Button" });
</script>

<art>
  <variant name="primary" />
</art>

Le bon exemple évite le diagnostic de cette règle avec la configuration ci-dessus ; d’autres règles peuvent encore signaler des diagnostics.

Implémentation · Toutes les règles

musea/require-title

Exiger l’attribut title dans le bloc <art>

Mauvais · Bon

Gravité par défaut: error
Préréglages: none
Correction automatique: Aucune ; examinez la modification proposée
Champ d’application: Blocs art, variant et style des fichiers .art.vue de Musea
Options: Aucune option propre à la règle. La gravité et le choix des préréglages sont configurables.

Configuration (Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "musea/require-title": "error"
      }
    },
  },
});
vp run lint

Mauvais

Le bloc art identifie Button.vue, mais ne fournit aucun titre.

<art component="./Button.vue">
  <variant name="primary" />
</art>

Bon

Les options de defineArt fournissent le titre Button pour le bloc art.

<script setup>
defineArt("./Button.vue", { title: "Button" });
</script>

<art>
  <variant name="primary" />
</art>

Le bon exemple évite le diagnostic de cette règle avec la configuration ci-dessus ; d’autres règles peuvent encore signaler des diagnostics.

Implémentation · Toutes les règles

musea/unique-variant-names

Exiger des noms de variants uniques

Mauvais · Bon

Gravité par défaut: error
Préréglages: none
Correction automatique: Aucune ; examinez la modification proposée
Champ d’application: Blocs art, variant et style des fichiers .art.vue de Musea
Options: Aucune option propre à la règle. La gravité et le choix des préréglages sont configurables.

Configuration (Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "musea/unique-variant-names": "error"
      }
    },
  },
});
vp run lint

Mauvais

Deux variants du même bloc art utilisent tous deux le nom primary.

<art title="Button" component="./Button.vue">
  <variant name="primary" />
  <variant name="primary" />
</art>

Bon

Les variants possèdent les noms distincts primary et secondary.

<art title="Button" component="./Button.vue">
  <variant name="primary" />
  <variant name="secondary" />
</art>

Le bon exemple évite le diagnostic de cette règle avec la configuration ci-dessus ; d’autres règles peuvent encore signaler des diagnostics.

Implémentation · Toutes les règles

musea/valid-variant

Exiger un attribut name dans les blocs <variant>

Mauvais · Bon

Gravité par défaut: error
Préréglages: none
Correction automatique: Aucune ; examinez la modification proposée
Champ d’application: Blocs art, variant et style des fichiers .art.vue de Musea
Options: Aucune option propre à la règle. La gravité et le choix des préréglages sont configurables.

Configuration (Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "musea/valid-variant": "error"
      }
    },
  },
});
vp run lint

Mauvais

Le variant omet le nom nécessaire pour identifier l’aperçu.

<art title="Button" component="./Button.vue">
  <variant />
</art>

Bon

Le nom primary identifie ce variant.

<art title="Button" component="./Button.vue">
  <variant name="primary" />
</art>

Le bon exemple évite le diagnostic de cette règle avec la configuration ci-dessus ; d’autres règles peuvent encore signaler des diagnostics.

Implémentation · Toutes les règles