Ir al contenido

Tokens de diseño

Un token (token) es el lenguaje de diseño convertido en variable: color, tamaño de fuente, espaciado, radio de borde, sombra y duración de las animaciones quedan nombrados como variables CSS --lh-*, y los componentes consumen el nombre sin escribir el valor a fuego. Cambiar de piel es cambiar los tokens.

Capa Ubicación Cantidad Momento de evaluación Posibilidad de sobrescritura
Variables CSS · claro :root de styles/theme/common/var.scss 185 entradas Tiempo de ejecución ✅ se pueden sobrescribir a voluntad
Variables CSS · oscuro [data-theme='dark'], .dark de styles/theme/common/var-dark.scss 118 entradas Tiempo de ejecución ✅
Variables SCSS styles/theme/common/variables.scss 183 Tiempo de compilación ⚠️ solo se puede cambiar el código fuente y recompilar
:root {
--lh-primary-color: #2B4C7C;
--lh-text-primary: rgba(0, 0, 0, 0.88);
--lh-bg-color: #FAF6F0;
--lh-border-color: #e5e6eb;
--lh-radius-base: 6px;
--lh-spacing-base: 8px;
// ... 185 entradas
}
[data-theme='dark'],
.dark {
--lh-bg-color: #2A2520;
--lh-text-primary: #E8E0D8;
--lh-border-color: #3A3530;
// ... 118 entradas
}

El modo oscuro es una capa de sobrescritura, no un conjunto independiente: solo se escriben las 118 entradas que necesitan invertirse; el resto sigue utilizando los valores claros.

$lh-primary-color: #2B4C7C !default;
$lh-border-radius-base: 6px !default;
// ... 183

El cometido de las variables SCSS es participar en los cálculos de tiempo de compilación: mezclas de color (mix() / shade()), composición de sombras (suma de varias capas de shadow), cosas que las variables CSS no pueden hacer. El precio es que se hornean en tiempo de compilación — en modo oscuro no se invierten automáticamente.

Los tokens se dividen en tres niveles; los dos primeros están en los archivos de tema globales y el tercero, en el estilo propio de cada componente:

// 1. Variables SCSS (variables.scss, tiempo de compilación)
$lh-primary: #2B4C7C !default;
$lh-text-primary: #2C2C2C !default;
// 2. Variables CSS globales (el :root de var.scss, 190 entradas)
--lh-primary-color: #{$lh-primary};
--lh-text-primary: #{$lh-text-primary};
--lh-bg-color: #FAF6F0;
// 3. Variables a nivel de componente (el scss del propio componente; el alcance es la raíz BEM del componente)
.lh-card {
--lh-card-bg: var(--lh-bg-color, #FAF6F0);
--lh-card-border-radius: calc(var(--lh-border-radius-base, 2px) + 2px);
}

Mecanismos clave:

  • Entre los niveles 1 y 2 hay interpolación en tiempo de compilación, no una cadena de referencias var(): el valor de --lh-primary-color se hornea dentro del build a partir de $lh-primary; cambiar la variable SCSS en tiempo de ejecución no sirve (habría que recompilar). En el proyecto no existe una capa intermedia de «paleta base» — no hay variables de escalas de color del tipo --lh-blue-6; los tokens semánticos se generan directamente a partir de las variables SCSS.
  • Los dos puntos de palanca para cambiar de piel: cambiar las variables SCSS de variables.scss y recompilar (afecta a todos los tokens semánticos), o sobrescribir en tiempo de ejecución las variables CSS del :root (los themeVars del ConfigProvider van por este camino, con efecto inmediato).
  • El nivel 3 referencia por defecto al nivel 2: el valor por defecto de las variables a nivel de componente suele ser una referencia var() a un token global (con respaldo), de modo que se mantiene el enlace con el tema y a la vez los themeVars pueden sobrescribir un componente concreto de forma dirigida.

Los dominios semánticos principales (la agrupación completa está en la tabla de tokens más abajo):

Dominio Tokens representativos Uso
Color principal --lh-primary-color / -hover / -active / -bg / -border El quinteto del color principal de marca
Texto --lh-text-primary / -secondary / -tertiary / -disabled Cuatro niveles de jerarquía de texto
Fondo --lh-bg-color / -page / -secondary / -overlay Página / contenedores / capa de cobertura
Borde --lh-border-color / -light / -dark Los trazos
Estado --lh-success-color / -warning / -error / -danger / -info Los cinco colores semánticos
Radio --lh-radius-small / -base / -large / -circle Cuatro escalas de radio
Espaciado --lh-spacing-* La escala de base 8px
Tamaño de fuente --lh-font-size-* La escalera de tamaños de fuente
Sombra --lh-shadow-* Los niveles de sombra
Animación --lh-animation-duration-* / -timing-function El ritmo de las transiciones
Decoración --lh-decoration-color El color decorativo de estilo chino

主色与衍生语义

令牌明色暗色SCSS 源备注
--lh-primary-color #3D649E$lh-primary
--lh-primary-color-hover #5078AB$lh-primary-hover
--lh-primary-color-active #2B4C7C$lh-primary-active
--lh-primary-color-bg color-mix(in srgb, var(--lh-primary-color) 25%, transparent)$lh-primary-light
--lh-primary-color-border #2A3A4A$lh-primary-lighter
--lh-color-on-primary #fff$lh-on-primary

状态

令牌明色暗色SCSS 源备注
--lh-hover-bg-color rgba(255, 255, 255, 0.08)$lh-hover-bg
--lh-selected-color color-mix(in srgb, var(--lh-primary-color) 40%, #fff)—

功能色

令牌明色暗色SCSS 源备注
--lh-success-color #6FA36E$lh-success
--lh-success-color-hover #82B581$lh-success-hover
--lh-success-color-active #5B8C5A$lh-success-active
--lh-success-color-bg #1A2A1A$lh-success-light
--lh-warning-color #D4B76F$lh-warning
--lh-warning-color-hover #E0C680$lh-warning-hover
--lh-warning-color-active #C4A35A$lh-warning-active
--lh-warning-color-bg #2A251A$lh-warning-light
--lh-danger-color #C45050$lh-danger
--lh-danger-color-hover #D46060$lh-danger-hover
--lh-danger-color-active #B23A3A$lh-danger-active
--lh-danger-color-bg #2A1A1A$lh-danger-light
--lh-info-color #8F8F8F$lh-info
--lh-info-color-hover #A0A0A0$lh-info-hover
--lh-info-color-active #7A7A7A$lh-info-active
--lh-info-color-bg #1A1A1A$lh-info-light

国风装饰色

令牌明色暗色SCSS 源备注
--lh-gold-color #D4A843$lh-gold
--lh-gold-color-hover #E8C35C$lh-gold-hover
--lh-gold-color-active #B8860B$lh-gold-active
--lh-gold-color-bg #2A241A$lh-gold-light
--lh-gold-color-border #3A2E1A$lh-gold-lighter
--lh-vermilion-color #E85D4A$lh-vermilion
--lh-vermilion-color-hover #FF7B6B$lh-vermilion-hover
--lh-vermilion-color-active #C43A31$lh-vermilion-active
--lh-vermilion-color-bg #2A1A18$lh-vermilion-light
--lh-jade-color #7AAE7A$lh-jade
--lh-jade-color-hover #9CC89C$lh-jade-hover
--lh-jade-color-active #5B8C5A$lh-jade-active
--lh-jade-color-bg #1A2A1A$lh-jade-light
--lh-decoration-color rgba(212, 168, 67, 0.08)$lh-decoration-color

文本

令牌明色暗色SCSS 源备注
--lh-text-primary #E8E0D8$lh-text-primary
--lh-text-regular #C8C0B8$lh-text-regular
--lh-text-secondary #A09890$lh-text-secondary
--lh-text-placeholder #7A7270$lh-text-placeholder
--lh-text-disabled #5A5250$lh-text-disabled

边框

令牌明色暗色SCSS 源备注
--lh-border-color-base #3A3530$lh-border-color-base
--lh-border-color-light #302B28$lh-border-color-light
--lh-border-color-lighter #2A2520$lh-border-color-lighter
--lh-border-color-extra-light #242018$lh-border-color-extra-light

圆角

令牌明色暗色SCSS 源备注
--lh-border-radius-base 沿用明色$lh-border-radius-base
--lh-border-radius-small 沿用明色$lh-border-radius-small
--lh-border-radius-round 沿用明色$lh-border-radius-round
--lh-border-radius-circle 沿用明色$lh-border-radius-circle

背景

令牌明色暗色SCSS 源备注
--lh-bg-color #2A2520$lh-bg-color
--lh-bg-color-page #1E1A16$lh-bg-color-page
--lh-bg-color-disabled #242018$lh-bg-color-disabled
--lh-bg-color-overlay rgba(10, 8, 6, 0.7)$lh-bg-color-overlay

阴影

令牌明色暗色SCSS 源备注
--lh-box-shadow-base 0 2px 12px 0 rgba(0, 0, 0, 0.5)$lh-box-shadow-base
--lh-box-shadow-light 0 2px 4px 0 rgba(0, 0, 0, 0.4)$lh-box-shadow-light
--lh-box-shadow-lighter 0 0 4px 0 rgba(0, 0, 0, 0.3)$lh-box-shadow-lighter

字体

令牌明色暗色SCSS 源备注
--lh-font-family 沿用明色$lh-font-family
--lh-font-size-extra-large 沿用明色$lh-font-size-extra-large
--lh-font-size-large 沿用明色$lh-font-size-large
--lh-font-size-medium 沿用明色$lh-font-size-medium
--lh-font-size-base 沿用明色$lh-font-size-base
--lh-font-size-small 沿用明色$lh-font-size-small
--lh-font-size-extra-small 沿用明色$lh-font-size-extra-small
--lh-font-weight-primary 沿用明色$lh-font-weight-primary
--lh-font-weight-bold 沿用明色$lh-font-weight-bold
--lh-font-line-height-primary 沿用明色$lh-font-line-height-primary

组件级 · control

令牌明色暗色SCSS 源备注
--lh-control-height-mini 沿用明色$lh-control-height-mini
--lh-control-height-small 沿用明色$lh-control-height-small
--lh-control-height-medium 沿用明色$lh-control-height-medium
--lh-control-height-large 沿用明色$lh-control-height-large
--lh-control-height-x-large 沿用明色$lh-control-height-x-large

间距

令牌明色暗色SCSS 源备注
--lh-spacing-xs 沿用明色$lh-spacing-xs
--lh-spacing-sm 沿用明色$lh-spacing-sm
--lh-spacing-md 沿用明色$lh-spacing-md
--lh-spacing-base 沿用明色$lh-spacing-base
--lh-spacing-lg 沿用明色$lh-spacing-lg
--lh-spacing-xl 沿用明色$lh-spacing-xl
--lh-spacing-xxl 沿用明色$lh-spacing-xxl

层级

令牌明色暗色SCSS 源备注
--lh-z-index-normal 沿用明色$lh-z-index-normal
--lh-z-index-dropdown 沿用明色$lh-z-index-dropdown
--lh-z-index-sticky 沿用明色$lh-z-index-sticky
--lh-z-index-fixed 沿用明色$lh-z-index-fixed
--lh-z-index-modal-backdrop 沿用明色$lh-z-index-modal-backdrop
--lh-z-index-modal 沿用明色$lh-z-index-modal
--lh-z-index-popover 沿用明色$lh-z-index-popover
--lh-z-index-tooltip 沿用明色$lh-z-index-tooltip

过渡

令牌明色暗色SCSS 源备注
--lh-transition-duration-fast 沿用明色$lh-transition-duration-fast
--lh-transition-duration-base 沿用明色$lh-transition-duration-base
--lh-transition-duration-slow 沿用明色$lh-transition-duration-slow
--lh-transition-function-ease-in-out 沿用明色$lh-transition-function-ease-in-out

禁用态

令牌明色暗色SCSS 源备注
--lh-disabled-bg-color #242018$lh-disabled-bg-color
--lh-disabled-text-color #5A5250$lh-disabled-text-color
--lh-disabled-border-color #302B28$lh-disabled-border-color
--lh-disabled-opacity 0.5$lh-disabled-opacity

组件级 · popover

令牌明色暗色SCSS 源备注
--lh-popover-bg-color #2A2520$lh-popover-bg-color
--lh-popover-border-color #3A3530$lh-popover-border-color
--lh-popover-border-radius 沿用明色$lh-popover-border-radius
--lh-popover-padding 沿用明色$lh-popover-padding
--lh-popover-title-color #E8E0D8$lh-popover-title-color
--lh-popover-content-color #C8C0B8$lh-popover-content-color
--lh-popover-arrow-size 沿用明色$lh-popover-arrow-size

组件级 · popconfirm

令牌明色暗色SCSS 源备注
--lh-popconfirm-padding 沿用明色$lh-popconfirm-padding
--lh-popconfirm-icon-size 沿用明色$lh-popconfirm-icon-size

组件级 · drawer

令牌明色暗色SCSS 源备注
--lh-drawer-bg-color #2A2520$lh-drawer-bg-color
--lh-drawer-border-color #3A3530$lh-drawer-border-color
--lh-drawer-header-padding 沿用明色$lh-drawer-header-padding
--lh-drawer-body-padding 沿用明色$lh-drawer-body-padding
--lh-drawer-footer-padding 沿用明色$lh-drawer-footer-padding
--lh-drawer-title-color #E8E0D8$lh-drawer-title-color
--lh-drawer-close-size 沿用明色$lh-drawer-close-size

组件级 · dropdown

令牌明色暗色SCSS 源备注
--lh-dropdown-bg-color #2A2520$lh-dropdown-bg-color
--lh-dropdown-border-color #3A3530$lh-dropdown-border-color
--lh-dropdown-border-radius 沿用明色$lh-dropdown-border-radius
--lh-dropdown-padding 沿用明色$lh-dropdown-padding
--lh-dropdown-item-height 沿用明色$lh-dropdown-item-height
--lh-dropdown-item-padding 沿用明色$lh-dropdown-item-padding
--lh-dropdown-item-color #C8C0B8$lh-dropdown-item-color
--lh-dropdown-item-hover-bg-color var(--lh-hover-bg-color)$lh-dropdown-item-hover-bg-color
--lh-dropdown-divider-color #302B28$lh-dropdown-divider-color

组件级 · message

令牌明色暗色SCSS 源备注
--lh-message-bg #2A2520$lh-message-bg-color
--lh-message-border #3A3530$lh-message-border-color
--lh-message-color #C8C0B8$lh-message-content-color
--lh-message-shadow 沿用明色$lh-message-shadow

组件级 · notification

令牌明色暗色SCSS 源备注
--lh-notification-bg #2A2520$lh-notification-bg-color
--lh-notification-border #3A3530$lh-notification-border-color
--lh-notification-title-color #E8E0D8$lh-notification-title-color
--lh-notification-content-color #C8C0B8$lh-notification-content-color
--lh-notification-width 沿用明色$lh-notification-width
--lh-notification-gap 沿用明色$lh-notification-gap
--lh-notification-shadow 沿用明色$lh-notification-shadow

组件级 · loading

令牌明色暗色SCSS 源备注
--lh-loading-bg rgba(10, 8, 6, 62%)$lh-loading-bg-color
--lh-loading-text-color #C8C0B8$lh-loading-text-color

组件级 · timeline

令牌明色暗色SCSS 源备注
--lh-timeline-line #302B28$lh-timeline-line
--lh-timeline-dot var(--lh-info-color)$lh-timeline-dot
--lh-timeline-timestamp var(--lh-text-secondary)$lh-timeline-timestamp

组件级 · collapse

令牌明色暗色SCSS 源备注
--lh-collapse-border #302B28$lh-collapse-border

组件级 · rate

令牌明色暗色SCSS 源备注
--lh-rate-active var(--lh-warning-color)$lh-rate-active

组件级 · segmented

令牌明色暗色SCSS 源备注
--lh-segmented-bg #242018$lh-segmented-bg

组件级 · calendar

令牌明色暗色SCSS 源备注
--lh-calendar-border var(--lh-border-color-lighter)$lh-calendar-border

组件级 · affix

令牌明色暗色SCSS 源备注
--lh-affix-z-index 沿用明色$lh-affix-z-index

组件级 · backtop

令牌明色暗色SCSS 源备注
--lh-backtop-z-index 沿用明色$lh-backtop-z-index

组件级 · menu

令牌明色暗色SCSS 源备注
--lh-menu-bg #242018$lh-menu-bg
--lh-menu-padding 沿用明色$lh-menu-padding
--lh-menu-border #302B28$lh-menu-border
--lh-menu-height 沿用明色$lh-menu-height
--lh-menu-collapse-width 沿用明色$lh-menu-collapse-width
--lh-menu-item-height 沿用明色$lh-menu-item-height
--lh-menu-item-padding 沿用明色$lh-menu-item-padding
--lh-menu-item-color var(--lh-text-primary)$lh-menu-item-color
--lh-menu-item-hover-bg #302B28$lh-menu-item-hover-bg
--lh-menu-item-active-color var(--lh-selected-color)$lh-menu-item-active-color
--lh-menu-item-active-bg var(--lh-primary-color-bg)$lh-menu-item-active-bg
--lh-menu-arrow-color var(--lh-text-secondary)$lh-menu-arrow-color
--lh-menu-z-index 沿用明色$lh-menu-z-index

组件级 · table

令牌明色暗色SCSS 源备注
--lh-table-bg #242018$lh-table-bg
--lh-table-color var(--lh-text-regular)$lh-table-color
--lh-table-header-bg #2A2420$lh-table-header-bg
--lh-table-header-color var(--lh-text-primary)$lh-table-header-color
--lh-table-border #302B28$lh-table-border
--lh-table-row-hover-bg #2A2420$lh-table-row-hover-bg
--lh-table-stripe-bg color-mix(in srgb, var(--lh-bg-color-page) 60%, transparent)$lh-table-stripe-bg
--lh-table-cell-padding 沿用明色$lh-table-cell-padding

组件级 · layout

令牌明色暗色SCSS 源备注
--lh-layout-header-height 沿用明色$lh-layout-header-height
--lh-layout-header-bg #242018$lh-layout-header-bg
--lh-layout-aside-width 沿用明色$lh-layout-aside-width
--lh-layout-aside-bg #242018$lh-layout-aside-bg
--lh-layout-main-bg #1C1815$lh-layout-main-bg
--lh-layout-border #302B28$lh-layout-border

组件级 · row

令牌明色暗色SCSS 源备注
--lh-row-gutter 沿用明色$lh-row-gutter

组件级 · tree

令牌明色暗色SCSS 源备注
--lh-tree-color #D8D0C8$lh-tree-color
--lh-tree-padding 沿用明色$lh-tree-padding
--lh-tree-node-height 沿用明色$lh-tree-node-height
--lh-tree-node-hover-bg #2A2420$lh-tree-node-hover-bg
--lh-tree-node-selected-color var(--lh-selected-color)$lh-tree-node-selected-color
--lh-tree-node-selected-bg var(--lh-primary-color-bg)$lh-tree-node-selected-bg
--lh-tree-arrow-color var(--lh-text-secondary)$lh-tree-arrow-color

组件级 · transfer

令牌明色暗色SCSS 源备注
--lh-transfer-panel-width 沿用明色$lh-transfer-panel-width
--lh-transfer-panel-height 沿用明色$lh-transfer-panel-height
--lh-transfer-bg #242018$lh-transfer-bg
--lh-transfer-border #302B28$lh-transfer-border

组件级 · upload

令牌明色暗色SCSS 源备注
--lh-upload-bg #242018$lh-upload-bg
--lh-upload-border var(--lh-border-color-base)$lh-upload-border
--lh-upload-trigger-padding 沿用明色$lh-upload-trigger-padding

组件级 · anchor

令牌明色暗色SCSS 源备注
--lh-anchor-color var(--lh-text-regular)$lh-anchor-color

组件级 · image

令牌明色暗色SCSS 源备注
--lh-image-viewer-mask rgba(0, 0, 0, 80%)—

无障碍焦点环

令牌明色暗色SCSS 源备注
--lh-focus-color #7FA6D9$lh-primary
--lh-focus-ring-width 沿用明色—
--lh-focus-ring-offset 沿用明色—

(Los datos los genera scripts/gen-docs-data.mjs parseando los tres archivos de tokens, con aserciones de cantidad: 190 claros, 118 oscuros y 188 SCSS; cualquier falta de coincidencia da error.)

// Los themeVars del ConfigProvider (la clave abreviada recibe el prefijo --lh- automáticamente)
<lh-config-provider :theme-vars="{ 'primary-color': '#1677ff' }">

O escribe CSS en la entrada de la aplicación:

:root {
--lh-primary-color: #1677ff;
--lh-primary-color-hover: #4096ff;
--lh-primary-color-active: #0958d9;
}

Véase Personalización en tiempo de ejecución.

// El scss de entrada del proyecto; la sobrescritura va antes del @use
$lh-primary-color: #1677ff;
@use '@lh-ui/share/styles';

La semántica de !default es «si ya tiene valor, no se sobrescribe», de modo que basta con asignar antes del @use. Ten en cuenta: esto solo afecta a la parte que se hornea en tiempo de compilación; las variables CSS en tiempo de ejecución siguen necesitando una sobrescritura aparte.

El «especial de tokens de altura» ya ha aterrizado (nuevos tokens --lh-control-height-mini/small/medium/large/x-large; button / select / input-number / cascader / tree-select / date-picker / time-picker / input referencian todos los tokens; input pasa de derivarse del padding a una altura fija; el padding-top: 16px asimétrico de has-label, el desplazamiento fijo del check de checkbox y el translate(-50%,-50%) repetido y codificado de forma rígida de switch se han corregido de paso). Lo que sigue pendiente:

  1. Las escalas de tamaño del spinner y del icono con el mismo nombre no coinciden (small 16 vs 14, medium 24 vs 16, etc.). Cambiar cualquiera de los dos lados afecta a toda la biblioteca (message / notification / loading / todos los iconos); condición de disparo: una queja visual por mezclar LhIcon / LhSpinner en la misma ranura; entonces se abrirá un proyecto dedicado.
  2. Las escalas de size no están alineadas: select / switch solo tienen 3 escalas; el validator de date / time-picker está recortado; tree-select / rate / segmented / pagination no tienen size; mini y x-large están casi sin dibujar en la capa CSS (en toda la biblioteca solo avatar tiene x-large). Es un cambio de la capa de la API y está desacoplado de los tokens de altura.
  • Los componentes no pueden declarar --lh-* por su cuenta: solo pueden consumirlos con var(--lh-*, fallback) (línea roja del AGENTS.md raíz). Los tokens nuevos se añaden en var.scss.
  • El respaldo es obligatorio: var(--lh-primary-color, #1677ff) — si falta el token, sigue habiendo un valor por defecto aceptable; lo custodia la verificación 2 de verify:styles (var fallback).
  • Completitud del modo oscuro: al añadir un token nuevo, pregúntate «en el modo oscuro, ¿tiene que invertirse?», y si es así, añade la sobrescritura en var-dark.scss; lo custodia la verificación 7 de verify:styles.
  • Los tokens cuyo valor tiene la forma #{$lh-foo} están horneados en tiempo de compilación: en modo oscuro no se invierten automáticamente y hay que reorientarlos explícitamente (véase Modo oscuro).

Copyright © 2024-2026 FengMo WenXue