Skip to content

Personnalisation du thème ​

lh-ui-plus fournit un système complet de thèmes à base de variables CSS, offrant des capacités de personnalisation riches : palette de couleurs au style chinois, mode sombre, fonds à motifs, bascule à l'exécution, etc.

Vous souhaitez ajuster les couleurs visuellement et exporter directement un fichier scss ? Voir le Studio de thèmes.

Système de couleurs au style chinois ​

La bibliothèque de composants s'inspire de la peinture traditionnelle à l'encre de Chine et définit 8 thèmes de couleurs au style chinois :

CouleurSymboliqueTeinte principaleSurvolUsage
IndigoLe bleu de la porcelaine bleue et blanche#2B4C7C#3D649EBouton principal, liens, état de focus
松花绿 (vert pin)La fraîcheur des ombres de bambou#5B8C5A#6FA36EÉtat de succès
藤黄 (gamboge)L'or des feuilles d'automne#C4A35A#D4B76FÉtat d'avertissement
朱砂 (cinabre, danger)Le rouge du pastel de sceau#B23A3A#C45050État de danger / erreur (--lh-danger-*)
黛色 (gris ardoise)Les teintes légères de l'encre de Chine#7A7A7A#8F8F8FÉtat d'information
OrL'élégance précieuse des temps anciens#B8860B#D4A843Touches décoratives (--lh-gold-*)
朱砂红 (rouge vermillon, accent)Variante d'accentuation tirant sur le vermillon#C43A31#E85D4ACouleur d'accent (--lh-vermilion-*)
玉色 (vert jade)L'élégance du bambou émeraude#5B8C5A#7AAE7ASuccès / décoration (même valeur que le vert pin)

Chaque couleur comprend généralement 4 niveaux (teinte principale / survol / activation / fond clair) ; la teinte principale et l'or fournissent en plus une couleur de bordure lighter (*-color-border), afin de garantir un contraste approprié dans tous les contextes.

Système de thèmes à variables CSS ​

Toutes les couleurs du thème sont implémentées via des propriétés personnalisées CSS (--lh-*), au nombre de 88+, couvrant les catégories suivantes :

Variables de couleur ​

Préfixe de variableDescriptionExemple
--lh-primary-colorValeur de base de la teinte principale#2B4C7C
--lh-primary-color-hoverÉtat de survol de la teinte principale#3D649E
--lh-primary-color-activeÉtat d'activation de la teinte principale#1F3A5F
--lh-primary-color-bgFond clair de la teinte principale#E8EDF3
--lh-success-colorCouleur de succès#5B8C5A
--lh-warning-colorCouleur d'avertissement#C4A35A
--lh-danger-colorCouleur de danger#B23A3A
--lh-info-colorCouleur d'information#7A7A7A

Variables de texte ​

Nom de la variableDescriptionValeur par défaut
--lh-text-primaryTexte principal#2C2C2C
--lh-text-regularTexte courant#5A5A5A
--lh-text-secondaryTexte secondaire#8A8A8A
--lh-text-placeholderEspace réservé#B0B0B0
--lh-text-disabledTexte désactivé#C8C8C8

Variables de bordure ​

Nom de la variableDescriptionValeur par défaut
--lh-border-color-baseBordure par défaut#D8D3CC
--lh-border-color-lightBordure légère#E5E0D8
--lh-border-radius-baseArrondi de base2px
--lh-border-radius-roundArrondi en capsule20px

Variables de fond ​

Nom de la variableDescriptionValeur par défaut
--lh-bg-colorFond des composants#FAF6F0 (blanc papier de riz)
--lh-bg-color-pageFond de page#F5F0EB
--lh-bg-color-overlayFond du calque de masquergba(26, 26, 26, 0.4)

Variables d'ombre ​

Nom de la variableDescription
--lh-box-shadow-baseOmbre par défaut
--lh-box-shadow-lightOmbre légère
--lh-box-shadow-lighterOmbre très légère

Variables de police ​

Nom de la variableDescriptionValeur par défaut
--lh-font-familyFamille de policesNoto Serif SC, STSong, SimSun...
--lh-font-size-baseTaille de base14px
--lh-font-size-smallPetite taille13px
--lh-font-weight-primaryGraisse courante400
--lh-font-line-height-primaryInterligne1.8

Variables d'espacement ​

Nom de la variableValeurUsage
--lh-spacing-xs4pxEspacement minimal
--lh-spacing-sm8pxPetit espacement
--lh-spacing-md12pxEspacement moyen
--lh-spacing-base16pxEspacement de base
--lh-spacing-lg20pxGrand espacement
--lh-spacing-xl24pxEspacement très grand

Variables de z-index ​

Nom de la variableValeurUsage
--lh-z-index-dropdown1000Menu déroulant
--lh-z-index-modal1050Boîte de dialogue modale
--lh-z-index-tooltip2000Infobulle

Variables de transition ​

Nom de la variableValeurDescription
--lh-transition-duration-fast0.25sTransition rapide
--lh-transition-duration-base0.3sTransition par défaut
--lh-transition-duration-slow0.4sTransition lente

Thème sombre ​

La bibliothèque de composants intègre des styles de thème sombre : toutes les variables CSS basculent automatiquement vers des valeurs adaptées en mode sombre.

Approche 1 : utiliser la fonction composable useLhTheme ​

Composition API ​

vue
<script setup lang="ts">
import { useLhTheme } from '@lh-ui/vue3'

const { theme, toggleTheme, setTheme } = useLhTheme()
</script>

<template>
  <div>
    <LhButton @click="toggleTheme">
      {{ theme === 'dark' ? 'Passer en mode clair' : 'Passer en mode sombre' }}
    </LhButton>
    <LhButton @click="() => setTheme('light')">Mode clair</LhButton>
    <LhButton @click="() => setTheme('dark')">Mode sombre</LhButton>
  </div>
</template>

Options API ​

vue
<script>
import { useLhTheme } from '@lh-ui/vue3'

export default {
  setup() {
    const { theme, toggleTheme, setTheme } = useLhTheme()
    return { theme, toggleTheme, setTheme }
  },
}
</script>

<template>
  <div>
    <LhButton @click="toggleTheme">
      {{ theme === 'dark' ? 'Passer en mode clair' : 'Passer en mode sombre' }}
    </LhButton>
  </div>
</template>

useLhTheme persiste automatiquement l'état du thème dans localStorage (clé : lh-ui-theme) ; le thème est conservé après un rafraîchissement de la page.

Approche 2 : bascule par attribut HTML ​

Placez data-theme="dark" sur l'élément racine pour activer globalement le mode sombre :

html
<!DOCTYPE html>
<html lang="fr-FR" data-theme="dark">
  <!-- ... -->
</html>

Couleurs de thème personnalisées (porcelaine bleue et blanche / vert pin / rouge vermillon) ​

Outre les thèmes clair et sombre intégrés, la bibliothèque de composants permet de personnaliser n'importe quelle combinaison de couleurs via themeVars, afin de réaliser un thème individualisé.

L'exemple ci-dessous est une démonstration de variables personnalisées écrites à la main, dont les valeurs ont été ajustées pour les besoins de l'explication et ne correspondent pas exactement aux préréglages intégrés de même nom dans les Thèmes prédéfinis (cerblue / songhua / zhusha). Pour utiliser directement un préréglage intégré, recourez à useLhPresetTheme ou getThemeVars(name).

Thème porcelaine bleue et blanche ​

Un fond de teinte indigo profond, inspiré de la porcelaine bleue et blanche traditionnelle.

Composition API ​

vue
<script setup lang="ts">
const cerblueTheme = {
  'primary-color': '#2B4C7C',
  'primary-color-hover': '#3D649E',
  'primary-color-active': '#1F3A5F',
  'primary-color-bg': '#E8EDF3',
  'bg-color': '#F0F4F8',
  'border-color-base': '#C8D6E5',
}
</script>

<template>
  <LhConfigProvider :theme-vars="cerblueTheme">
    <LhButton type="primary">Bouton porcelaine bleue</LhButton>
    <LhInput placeholder="Champ porcelaine bleue" />
  </LhConfigProvider>
</template>

Options API ​

vue
<script>
import { LhConfigProvider, LhButton, LhInput } from '@lh-ui/vue3'

export default {
  components: { LhConfigProvider, LhButton, LhInput },
  data() {
    return {
      cerblueTheme: {
        'primary-color': '#2B4C7C',
        'primary-color-hover': '#3D649E',
        'primary-color-bg': '#E8EDF3',
        'bg-color': '#F0F4F8',
      },
    }
  },
}
</script>

<template>
  <LhConfigProvider :theme-vars="cerblueTheme">
    <LhButton type="primary">Bouton porcelaine bleue</LhButton>
  </LhConfigProvider>
</template>

Thème vert pin ​

Des touches de vert bambou pour un style frais et naturel.

vue
<script setup lang="ts">
const bambooTheme = {
  'primary-color': '#5B8C5A',
  'primary-color-hover': '#6FA36E',
  'primary-color-bg': '#EDF5EC',
  'success-color': '#5B8C5A',
  'bg-color': '#F6FAF5',
}
</script>

<template>
  <LhConfigProvider :theme-vars="bambooTheme">
    <LhButton type="primary">Sentier de bambous</LhButton>
    <LhTag type="success">Nouvelle feuille</LhTag>
  </LhConfigProvider>
</template>

Thème rouge vermillon ​

Une dominante de rouge vermillon, pastel de sceau, pour mettre en valeur une atmosphère d'élégance précieuse.

vue
<script setup lang="ts">
const vermilionTheme = {
  'primary-color': '#C43A31',
  'primary-color-hover': '#E85D4A',
  'primary-color-bg': '#FDF0EE',
  'bg-color': '#FFFBF9',
  'border-color-base': '#F0D5CF',
}
</script>

<template>
  <LhConfigProvider :theme-vars="vermilionTheme">
    <LhButton type="primary">Rouge vermillon</LhButton>
  </LhConfigProvider>
</template>

Système de fonds à motifs ​

La bibliothèque de composants fournit un système de fonds à motifs poétiques au style chinois, avec 6 motifs prédéfinis, que l'on peut combiner avec la liste blanche patternComponents pour en contrôler finement la portée.

Motifs prédéfinis ​

MotifVariable CSSDescription
Feuille de saulevar(--lh-pattern-willow)Feuilles de saule allongées, espacement régulier
Nuage de bon présagevar(--lh-pattern-cloud)Nuages qui se déploient en ondulant
Onde d'eauvar(--lh-pattern-water)De légers remous en couches successives
Flocon de neigevar(--lh-pattern-snow)Flocons hexagonaux aux fines branches
Fleur de pruniervar(--lh-pattern-plum)Cinq pétales ouverts, cœur bien marqué
Feuille de bambouvar(--lh-pattern-bamboo)Feuilles de bambou lancéolées, disposées avec rythme

Configuration globale des motifs ​

Composition API ​

vue
<script setup lang="ts">
const config = {
  themeVars: {
    'bg-pattern': 'var(--lh-pattern-cloud)',
    'bg-pattern-opacity': '0.15',
  },
  patternComponents: ['button', 'input'] as const,
}
</script>

<template>
  <LhConfigProvider
    :theme-vars="config.themeVars"
    :pattern-components="config.patternComponents"
  >
    <!-- Le bouton et le champ appliquent le motif, pas la boîte de dialogue -->
    <LhButton>Bouton avec motif</LhButton>
    <LhInput placeholder="Champ avec motif" />
  </LhConfigProvider>
</template>

Options API ​

vue
<script>
export default {
  data() {
    return {
      config: {
        themeVars: {
          'bg-pattern': 'var(--lh-pattern-cloud)',
          'bg-pattern-opacity': '0.15',
        },
        patternComponents: ['button', 'input'],
      },
    }
  },
}
</script>

<template>
  <LhConfigProvider
    :theme-vars="config.themeVars"
    :pattern-components="config.patternComponents"
  >
    <LhButton>Bouton avec motif</LhButton>
  </LhConfigProvider>
</template>

Référence des variables de motif ​

Nom de la variableDescriptionValeur par défaut
--lh-bg-patternURL du fond à motifsnone
--lh-bg-pattern-repeatMode de répétitionrepeat
--lh-bg-pattern-sizeTaille du motif40px
--lh-bg-pattern-opacityOpacité du motif0.15
--lh-bg-pattern-colorCouleur du motifvar(--lh-decoration-color, rgba(184, 134, 11, 0.12))
--lh-bg-pattern-blendMode de fusionsoft-light

Exemple de configuration complète ​

L'exemple suivant présente l'utilisation complète de la configuration de ConfigProvider, intégrant toutes les capacités : thème, langue, taille, motifs.

Composition API ​

vue
<script setup lang="ts">
import { zhCN } from '@lh-ui/vue3'

const configProvider = {
  size: 'medium' as const,
  locale: zhCN,
  themeVars: {
    'primary-color': '#2B4C7C',
    'bg-pattern': 'var(--lh-pattern-cloud)',
    'bg-pattern-opacity': '0.15',
  },
  patternComponents: ['button', 'input', 'dialog'],
}
</script>

<template>
  <LhConfigProvider
    :size="configProvider.size"
    :locale="configProvider.locale"
    :theme-vars="configProvider.themeVars"
    :pattern-components="configProvider.patternComponents"
  >
    <slot />
  </LhConfigProvider>
</template>

Options API ​

vue
<script>
import { zhCN } from '@lh-ui/vue3'

export default {
  data() {
    return {
      configProvider: {
        size: 'medium',
        locale: zhCN,
        themeVars: {
          'primary-color': '#2B4C7C',
          'bg-pattern': 'var(--lh-pattern-cloud)',
        },
        patternComponents: ['button', 'input', 'dialog'],
      },
    }
  },
}
</script>

<template>
  <LhConfigProvider
    :size="configProvider.size"
    :locale="configProvider.locale"
    :theme-vars="configProvider.themeVars"
    :pattern-components="configProvider.patternComponents"
  >
    <slot />
  </LhConfigProvider>
</template>

Priorité des variables de thème ​

Les variables CSS finales du composant sont fusionnées selon la priorité suivante (les suivantes couvrent les précédentes) :

  1. themeVars global du ConfigProvider (priorité la plus basse)
  2. componentTheme[nom du composant] par composant du ConfigProvider
  3. Prop themeVars du composant lui-même
  4. Prop bgPattern du composant lui-même (priorité la plus haute)

Pour la variable bg-pattern, la liste blanche patternComponents s'applique en outre : seuls les composants de la liste blanche appliquent le bg-pattern de la configuration globale.

Mise en page rapide sx ​

La propriété sx offre un moyen déclaratif de mise en page en ligne, permettant de régler l'espacement et la taille des composants sans écrire de CSS. Elle est actuellement prise en charge par les composants suivants : Button, Input, Dialog, Tooltip, Alert, Card, Empty, Breadcrumb, Pagination, Steps, Tabs, Skeleton.

Principe ​

sx repose sur une grille de référence de 8px : un nombre multiplié par 8 donne la valeur en pixels. Par exemple, mt: 2 équivaut à marginTop: 16px.

Propriétés prises en charge ​

Espacement ​

PropDescriptionExempleCSS équivalent
mMarge externe des quatre côtésm: 2margin: 16px
mxMarge externe horizontalemx: 1marginLeft: 8px; marginRight: 8px
myMarge externe verticalemy: 1marginTop: 8px; marginBottom: 8px
mt, mr, mb, mlMarge externe d'un seul côtémt: 2marginTop: 16px
pMarge interne des quatre côtésp: 3padding: 24px
pxMarge interne horizontalepx: 2paddingLeft: 16px; paddingRight: 16px
pyMarge interne verticalepy: 1paddingTop: 8px; paddingBottom: 8px
pt, pr, pb, plMarge interne d'un seul côtépt: 2paddingTop: 16px

Tailles ​

PropDescriptionExemple
wLargeur (un nombre correspond à des px, une chaîne à la valeur elle-même)w: 200 ou w: '100%'
hHauteurh: 100 ou h: 'auto'

Disposition Flex ​

PropDescriptionExemple
displayType d'affichagedisplay: 'flex'
flexRaccourci flexflex: '1 1 0%'
flexDirectionDirection de l'axe principalflexDirection: 'column'
alignItemsAlignement sur l'axe transversalalignItems: 'center'
justifyContentAlignement sur l'axe principaljustifyContent: 'flex-end'

Exemple d'utilisation ​

vue
<script setup lang="ts">
import { ref } from 'vue'

const visible = ref(false)
</script>

<template>
  <!-- Espacement du bouton -->
  <LhButton type="primary" :sx="{ mt: 2, mx: 1 }">Bouton avec espacement</LhButton>

  <!-- Marge externe du champ -->
  <LhInput placeholder="Espacement vertical du champ" :sx="{ my: 1 }" />

  <!-- Largeur de la boîte de dialogue : sx ne prend en charge que w/h et les propriétés d'espacement -->
  <LhDialog v-model="visible" title="Exemple" :sx="{ w: 480 }">
    <p>Boîte de dialogue à largeur fixe</p>
  </LhDialog>
</template>
vue
<script>
export default {
  data() {
    return { visible: false }
  },
}
</script>

<template>
  <LhButton type="primary" :sx="{ mt: 2, mx: 1 }">Bouton avec espacement</LhButton>
</template>

La beauté de la tradition, la fondation du code