Software empresarial · Nuevo recurso

Sistema de diseño TDesign.

Crea un editor compacto de políticas de API con TDesign React: roles de tema concretos, su escala de tamaños de dos píxeles, registro de campos Form y una composición tipada de Table.

Guía de OpenDesign8 capítulos43 entradas de referenciaGuía de aplicación original
01

Vista previa de la interfaz del sistema de diseño TDesign

Valida una regla, revisa su efecto local y elimínala. No se implementa ninguna política.

editor de reglas APIAbrir ejemplo completo
Interpretación independiente en HTML/CSS de los tokens claros y la composición Form/Table de TDesign; no es el entorno de ejecución nativo de React. · Referencia de implementación
02

Referencia de diseño del sistema de diseño TDesign

TDesign React con el tema actual de la rama pública develop y las fuentes de los componentes. Los valores del tema son instantáneas de las fuentes, no una garantía de compatibilidad con una versión fija del paquete. La vista previa independiente es una interpretación en HTML; el ejemplo de React usa el paquete real API.

Roles del tema claro

Fuente
Nombre / ReglaValor / ConfiguraciónUso
--td-brand-color#0052d9 Acción principal, resuelta a partir del nivel 7 de la marca.
--td-brand-color-hover#366ef4 Estado al pasar el cursor de la acción principal.
--td-brand-color-active#003cab Acción al presionar.
--td-brand-color-light#f2f3ff Superficie seleccionada sutil.
--td-bg-color-page#eeeLienzo exterior.
--td-bg-color-container#fffPaneles del editor y de la tabla.
--td-text-color-primaryrgba(0,0,0,.9)Texto principal.
--td-text-color-secondaryrgba(0,0,0,.6)Texto complementario.
--td-border-level-1-color#e8e8e8 Separadores.
--td-border-level-2-color#dddBordes de controles.
--td-error-color#d54941 Rol de error del campo.
--td-success-color#2ba471 Rol positivo; no deduzcas el contraste solo a partir del color.

Roles tipográficos

Fuente
Nombre / ReglaValor / ConfiguraciónUso
--td-font-familyPingFang SC, Microsoft YaHei, Arial RegularPila orientada al sistema; esta declaración no descarga las fuentes.
--td-font-body-small12px / 20pxEtiquetas secundarias compactas.
--td-font-body-medium14px / 22pxTexto del cuerpo de la consola.
--td-font-body-large16px / 24pxTexto de lectura más grande.
--td-font-title-medium600 16px / 24pxTítulo del panel.
--td-font-headline-small600 24px / 32pxTítulo de página.
--td-font-display-medium600 48px / 56pxRol de presentación, no necesario en un editor de políticas.

Tamaño y espaciado semántico

Fuente
Nombre / ReglaValor / ConfiguraciónUso
--td-size-1 … --td-size-82, 4, 6, 8, 12, 16, 20, 24pxEscala base no lineal.
--td-size-9 … --td-size-1628, 32, 36, 40, 48, 56, 64, 72pxValores de escala más grandes.
--td-comp-size-m32pxAlias de altura media del componente.
--td-comp-paddingLR-m12pxAlias de relleno horizontal mediano.
--td-comp-paddingTB-l16pxAlias de relleno vertical grande.
--td-comp-margin-xl20pxEl alias de espaciado es distinto de padding xl.
--td-pop-padding-xxl16pxAlias de relleno de ventana emergente.

Estilo de esquinas

Fuente
Nombre / ReglaValor / ConfiguraciónUso
--td-radius-small2pxRadio pequeño.
--td-radius-default3pxRadio predeterminado.
--td-radius-medium6pxRadio mediano.
--td-radius-large9pxRadio grande.
--td-radius-extraLarge12pxRadio extragrande.
--td-radius-round999pxEstilo de píldora.
--td-radius-circle50%La forma circular requiere dimensiones iguales.

Contratos de formularios y tablas

Fuente
Nombre / ReglaValor / ConfiguraciónUso
Form.useForm()[form]Pasa la instancia a Form.
FormItem nameRegistered field keyDebe coincidir con los campos enviados y con los errores de setFields.
Form onSubmitevent.validateResult === trueRealiza las actualizaciones de la aplicación solo si la validación se completa correctamente.
form.setFieldsname + status + validateMessageEstablece un error concreto para el campo.
FormItem forInput associationEl ejemplo oficial de Switch usa for="status".

Configuración de la tabla de datos

Fuente
Nombre / ReglaValor / ConfiguraciónUso
rowKeyStable unique data propertyEl ejemplo genera un id por regla.
columns[].colKeyData key or custom cell keyUsa una columna específica para las acciones.
columns[].cell({row,col,rowIndex,colIndex})Representa controles específicos para cada fila.
tableLayoutfixed by default; auto availableDecide el ancho de las columnas para las rutas de recursos largas.
disableDataPagefalse by defaultTable gestiona la paginación local, salvo que se desactive explícitamente.
03

Guía completa del sistema de diseño de TDesign

Una guía práctica para elegir, aplicar y revisar este sistema en una interfaz real.

DESIGN-tdesign.md

Orientación completa, un punto de partida para la implementación y enlaces al código fuente.

Descargar la guía

Sistema de diseño TDesign: un sistema de consola con familias de implementación explícitas

Elige la implementación de React

TDesign tiene implementaciones independientes para cada framework. Este ejemplo usa tdesign-react intencionadamente, no un paquete de Vue con un nombre similar ni el conjunto de componentes para móviles. La hoja de estilos global forma parte de la integración: importar un componente por sí solo no proporciona el diseño ni las reglas del tema que se muestran.

De esta guía de OpenDesign

La unidad práctica es un Form registrado junto a una Table estructurada. El nombre, la ruta del recurso y el estado habilitado son campos de datos; eliminar una fila es una acción de tabla. Afirmar que ahora se protege un API en toda la página sería falso, ya que este ejemplo no tiene un backend de autorización.

Consulta la especificación complementaria

Sistema de diseño de TDesign: colores semánticos con diferencias reales entre modos claro y oscuro

El paso siete de marca no es universal en todos los modos

El tema claro resuelve el rol de marca mediante el paso siete, mientras que el tema oscuro lo hace mediante el paso ocho. Conserva la variable semántica en el CSS de la aplicación en lugar de copiar el azul claro en cada componente. El fondo oscuro es #181818 y su contenedor es #242424; corresponden a superficies distintas.

La vista previa permanece intencionadamente en modo claro. En una implementación nativa, establece theme-mode="dark" en el elemento raíz del documento para seleccionar las reglas oscuras publicadas; aplica cualquier política de ilustración personalizada por separado en lugar de recolorear todas las imágenes con un filtro.

js
document.documentElement.setAttribute('theme-mode', 'dark');
// Restore the published light theme:
document.documentElement.setAttribute('theme-mode', 'light');

Referencia de código

Consulta la especificación complementaria

Sistema de diseño de TDesign: tipografía densa sin perder el significado de los campos

Usa los roles tipográficos completos

El estilo de texto mediano para el cuerpo usa un tamaño de 14px y una altura de línea de 22px. El estilo de título mediano añade un peso de 600 con tamaño y altura de línea de 16/24; el encabezado pequeño usa 24/32. Son funciones distintas: los datos de la tabla, las etiquetas del panel y el título de la página no deberían convertirse todos en texto de cuerpo en negrita.

La familia tipográfica de origen especifica nombres de fuentes del sistema. Añade una alternativa sans-serif adecuada a la tipografía propia de la aplicación y verifica al mismo tiempo los textos en chino y en caracteres latinos. Puedes usar un estilo monoespaciado de la aplicación para una ruta de recurso sin afirmar que sea un token tipográfico de TDesign.

Consulta la especificación complementaria

Sistema de diseño de TDesign: asigna los alias de tamaño a la región correspondiente

Los nombres de espaciado no son intercambiables

El relleno horizontal mediano del componente se resuelve en 12px, pero el margen extragrande del componente se resuelve en 20px. No conviertas todos los sufijos semánticos usando una única escala supuesta. El editor usa un relleno exterior de 24px y menos espacio entre campos para mantener agrupados los controles.

En la vista previa independiente, el editor se muestra encima de la lista de reglas en pantallas estrechas. Ese punto de ruptura es una decisión de la aplicación, no una garantía del framework. Las rutas largas de API se ajustan en la lista en lugar de ensanchar toda la página más allá de la ventana gráfica.

Consulta la especificación complementaria

Sistema de diseño de TDesign: registra, valida y luego añade una regla

Asocia el error del campo a su clave

La instancia de Form se pasa al componente Form; cada FormItem proporciona el nombre del campo. El controlador de envío comprueba primero validateResult y luego lee los campos recopilados. Las comprobaciones de la aplicación normalizan las cadenas y rechazan las rutas duplicadas, para que dos etiquetas no puedan configurar inadvertidamente el mismo endpoint de ejemplo.

  1. Registra name, path y enabled mediante las claves de FormItem.
  2. Rechaza los nombres vacíos y las rutas que no empiezan por / antes de añadir los datos.
  3. Usa setFields con la misma clave del campo para mostrar el error y mantener los valores introducidos disponibles para corregirlos.
  4. Añade un id estable solo después de superar las comprobaciones; indica que el resultado es local.

Consulta la especificación complementaria

Sistema de diseño de TDesign: conserva la identidad de las filas al editarlas y eliminarlas

Separa los datos visibles de las celdas de acción

La tabla obtiene el campo id mediante rowKey. La columna enabled convierte un valor Boolean en texto legible, en lugar de mostrar un punto de color sin etiqueta. La columna de acciones representa un botón con el nombre de la fila, para evitar que las tecnologías de asistencia encuentren tres controles Remove indistinguibles.

En un conjunto pequeño de reglas, la tabla completa puede mostrarse sin paginación. Si añades paginación, distingue el fragmentado local integrado de los datos gestionados por el servidor antes de establecer disableDataPage. Reutilizar las posiciones de una matriz como identificadores no es seguro, ya que al eliminar elementos cambia su orden.

  • name es la etiqueta visible para las personas; path identifica el recurso.
  • enabled es un dato de la aplicación que se representa con texto explícito.
  • actions es una columna personalizada y no necesita una propiedad almacenada equivalente.

Consulta la especificación complementaria

Sistema de diseño TDesign: el estado local no es una política implementada

Prueba el editor de políticas como un editor

La vista previa sin conexión usa controles nativos con etiquetas, una región de estado dinámico y un foco visible al navegar con el teclado. Al enviar un nombre vacío o una ruta duplicada, el formulario debe permanecer abierto e indicar el problema concreto. Eliminar una regla solo modifica la lista local.

Un servicio de producción sigue necesitando validación en el servidor, autorización, gestión de conflictos, registro de auditoría y recuperación ante un guardado rechazado. Estas funciones deben diseñarse en torno al editor, no simularse con una notificación de éxito que afirme que se ha implementado la política.

Consulta la especificación complementaria

Sistema de diseño de TDesign: integra el paquete y presenta el ejemplo con honestidad

Usa el ejemplo nativo para el código de la aplicación

El ejemplo de React importa componentes reales de TDesign: Form, Input, Switch, Button y Table. La vista previa integrada es una interpretación autónoma de HTML/CSS, para que funcione sin descargar paquetes ni acceder a la red. Sus comprobaciones de interacción no demuestran que se hayan compilado todas las dependencias de la biblioteca en tu proyecto.

Los archivos de tema enlazados son fuentes de desarrollo actuales. Consulta la versión instalada en un archivo de bloqueo y compara sus tokens antes de copiar personalizaciones. Esta página documenta intencionadamente los nombres de roles y la procedencia de las fuentes, para poder evaluar un cambio de tema posterior en lugar de ocultarlo tras una paleta ilustrativa.

Consulta la especificación complementaria

Ejemplos de componentes del sistema de diseño TDesign

Muestra interactiva independiente completa

Guarda el documento completo como index.html y ábrelo en un navegador. Interpretación independiente de HTML/CSS de los tokens claros de TDesign y de la composición de Form/Table; no es el entorno de ejecución nativo de React.

HTML
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>TDesign API rule editor</title><style>
*{box-sizing:border-box}body{margin:0;background:#eee;color:rgba(0,0,0,.9);font:14px/22px Arial,sans-serif}header{display:flex;justify-content:space-between;align-items:center;padding:16px 24px;background:#fff;border-bottom:1px solid #ddd}.mark{font-weight:700;color:#0052d9;font-size:20px}.tag{background:#f2f3ff;color:#003cab;padding:4px 8px;border-radius:3px}main{padding:24px;max-width:1100px;margin:auto}h1{font-size:24px;line-height:32px;margin:0 0 8px}h2{font-size:16px;line-height:24px;margin:0 0 20px}.sub{color:rgba(0,0,0,.6);margin:0 0 24px}.layout{display:grid;grid-template-columns:310px minmax(0,1fr);gap:16px}.panel{background:white;border:1px solid #e8e8e8;border-radius:6px;padding:24px}label{display:block;margin-bottom:6px}input[type=text]{width:100%;height:36px;border:1px solid #ddd;border-radius:3px;padding:0 12px;font:inherit;margin-bottom:4px}input:focus,button:focus-visible{outline:2px solid #0052d9;outline-offset:3px}.hint{font-size:12px;color:#666;margin:0 0 20px}.toggle{display:flex;gap:8px;align-items:center;margin:18px 0 24px}.toggle input{accent-color:#0052d9;width:18px;height:18px}.toggle label{margin:0}button{font:inherit;border:1px solid #ddd;border-radius:3px;padding:5px 12px;background:white;color:#0052d9;cursor:pointer}button:hover{background:#f2f3ff}.primary{background:#0052d9;color:white;border-color:#0052d9;width:100%;margin-top:8px}.primary:hover{background:#366ef4}.error{color:#ad352f;min-height:22px;margin:0}.listhead{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #e8e8e8;padding-bottom:16px;margin-bottom:0}.listhead h2{margin:0}.row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px;padding:20px 0;border-bottom:1px solid #e8e8e8}.row strong{display:block;font-weight:600}.path{display:block;overflow-wrap:anywhere;font:12px/20px monospace;color:#666}.state{font-size:12px;color:#003cab}.row button{align-self:center;font-size:12px}.diagram{margin-top:24px;padding:16px;background:#f2f3ff;border-radius:3px;display:flex;align-items:center;gap:12px}.node{padding:8px 12px;background:white;border:1px solid #b5c7ff;border-radius:3px}.diagram span{color:#0052d9}.status{font-size:12px;color:#555;min-height:20px;margin:20px 0 0}.foot{font-size:12px;color:#666;margin:20px 0 0}#empty{padding:24px 0;color:#666}@media(max-width:680px){header{padding:16px}.layout{grid-template-columns:1fr}main{padding:20px 16px}.panel{padding:20px}.diagram{flex-wrap:wrap}.tag{font-size:12px}}
</style><header><span class="mark">T / Console</span><span class="tag">Local policy workspace</span></header><main><h1>API access rules</h1><p class="sub">Define which resources belong in your draft policy.</p><div class="layout"><section class="panel"><h2>Create a rule</h2><form id="editor" novalidate><label for="name">Rule name</label><input type="text" id="name" aria-describedby="error"><p class="hint">A short label your team can recognize.</p><label for="path">Resource path</label><input type="text" id="path" placeholder="/reports" aria-describedby="path-help error"><p class="hint" id="path-help">Start with /. Each path must be unique.</p><div class="toggle"><input id="enabled" type="checkbox" checked><label for="enabled">Enabled in this draft</label></div><p class="error" id="error" role="alert"></p><button class="primary">Add local rule</button></form><p class="foot">This editor does not connect to an API gateway.</p></section><section class="panel"><div class="listhead"><h2>Policy rules</h2><span id="count" class="tag"></span></div><div id="rules"></div><div class="diagram" aria-label="Illustrative policy flow"><div class="node">Client</div><span aria-hidden="true">→</span><div class="node">Policy draft</div><span aria-hidden="true">→</span><div class="node">Resource</div></div><p class="status" id="status" role="status">Two example rules are loaded locally.</p></section></div><p class="foot">HTML interpretation of TDesign light theme roles · Native React integration is provided in the guide.</p></main><script>
const $=id=>document.getElementById(id);let rules=[{id:1,name:'Reports read access',path:'/reports',enabled:true},{id:2,name:'Billing export',path:'/billing/export',enabled:false}];let next=3;
function render(){const host=$('rules');host.replaceChildren();$('count').textContent=rules.length+' rules';if(!rules.length){const p=document.createElement('p');p.id='empty';p.textContent='No rules in this draft. Add a resource to begin.';host.append(p)}for(const rule of rules){const row=document.createElement('div');row.className='row';const copy=document.createElement('div'),name=document.createElement('strong'),path=document.createElement('code'),state=document.createElement('span'),remove=document.createElement('button');name.textContent=rule.name;path.textContent=rule.path;path.className='path';state.textContent=rule.enabled?'Enabled':'Disabled';state.className='state';copy.append(name,path,state);remove.textContent='Remove';remove.setAttribute('aria-label','Remove '+rule.name);remove.onclick=()=>{rules=rules.filter(x=>x.id!==rule.id);render();$('status').textContent='Removed '+rule.name+' from this local draft.';$('name').focus()};row.append(copy,remove);host.append(row)}}
$('editor').onsubmit=e=>{e.preventDefault();$('error').textContent='';for(const id of ['name','path'])$(id).removeAttribute('aria-invalid');const name=$('name').value.trim(),path=$('path').value.trim();const fail=!name?['name','Enter a rule name.']:!path.startsWith('/')?['path','Start the resource path with /.']:rules.some(r=>r.path===path)?['path','This path already has a rule.']:null;if(fail){$('error').textContent=fail[1];$(fail[0]).setAttribute('aria-invalid','true');$(fail[0]).focus();return}rules.push({id:next++,name,path,enabled:$('enabled').checked});render();$('status').textContent='Added '+name+' locally. No policy was deployed.';$('name').value='';$('path').value='';$('name').focus()};render();
</script></html>

Referencia de código

  • Las reglas solo existen en la colección de muestras visible. El registro nativo de Form, las funciones de validación y la representación de Table se muestran por separado en React.

Editor de reglas registradas y eliminación específica por fila

Form recopila el nombre, la ruta del recurso y el estado de activación. La validación de la aplicación detecta nombres vacíos, rutas con formato incorrecto y recursos duplicados antes de añadir una fila local a Table.

jsx
// npm install tdesign-react react react-dom
// main.jsx — a client-side React entry point
import React, {useState} from 'react';
import {createRoot} from 'react-dom/client';
import {Button, Form, Input, Switch, Table} from 'tdesign-react';
import 'tdesign-react/es/style/index.css';
const {FormItem} = Form;
function AccessRules() {
  const [form] = Form.useForm();
  const [rules, setRules] = useState([]);
  const [notice, setNotice] = useState('No local rules yet.');
  const addRule = ({validateResult, fields}) => {
    if (validateResult !== true) return;
    const name = String(fields.name || '').trim();
    const path = String(fields.path || '').trim();
    const invalid = !name ? ['name','Enter a rule name.'] :
      !path.startsWith('/') ? ['path','Start the resource path with /.'] :
      rules.some(rule => rule.path === path) ? ['path','This path already has a rule.'] : null;
    if (invalid) {
      form.setFields([{name:invalid[0],status:'error',validateMessage:{type:'error',message:invalid[1]}}]);
      setNotice(invalid[1]); return;
    }
    setRules(previous => [...previous, {id:crypto.randomUUID(),name,path,enabled:!!fields.enabled}]);
    setNotice(`Added ${name} to this browser session. No access policy was deployed.`);
  };
  const columns = [
    {colKey:'name', title:'Rule'}, {colKey:'path', title:'Resource'},
    {colKey:'enabled', title:'State', cell:({row}) => row.enabled ? 'Enabled' : 'Disabled'},
    {colKey:'actions', title:'Action', cell:({row}) => <Button variant="text" onClick={() => {
      setRules(previous => previous.filter(item => item.id !== row.id));
      setNotice(`Removed ${row.name} locally.`);
    }}>Remove {row.name}</Button>}
  ];
  return <main style={{padding:24,maxWidth:960,margin:'auto',font:'var(--td-font-body-medium)'}}>
    <h1>API access rules</h1>
    <Form form={form} onSubmit={addRule} labelWidth={100}>
      <FormItem name="name" label="Rule name"><Input /></FormItem>
      <FormItem name="path" label="Resource path"><Input placeholder="/reports" /></FormItem>
      <FormItem name="enabled" label="Enabled" for="enabled"><Switch /></FormItem>
      <FormItem><Button type="submit" theme="primary">Add local rule</Button></FormItem>
    </Form>
    <p role="status">{notice}</p>
    <Table rowKey="id" data={rules} columns={columns} bordered hover />
  </main>;
}
createRoot(document.getElementById('root')).render(<AccessRules />);

Referencia de código

  • Los contratos de columnas y rowKey de Table están enlazados en la especificación anterior.
  • Este ejemplo solo modifica el estado local de React; una etiqueta de activación no constituye una decisión de autorización.
  • El ejemplo de instalación/API se verificó con la fuente oficial; la compilación del paquete es independiente de la vista previa sin conexión probada.
04

Configuración del agente de IA del sistema de diseño TDesign

Punto de partida para la implementación

Usa el ejemplo completo de entrada del cliente anterior con un elemento raíz HTML. Importa tdesign-react/es/style/index.css una sola vez. Fija las versiones y prueba con tu herramienta de compilación antes de publicar.

bash
npm install tdesign-react react react-dom

Una instrucción para tu proyecto

Instrucción para el agente
Usa Form y Table de tdesign-react para crear un editor de reglas API. Conserva los roles semánticos --td-*, las claves de campo registradas, los identificadores de fila estables, la validación explícita y los mensajes veraces sobre el estado local.
05

Fuentes y alcance del sistema de diseño TDesign

Referencia independiente de OpenDesign. La vista previa es una interpretación sin conexión, no es software de Tencent ni un servicio de autorización desplegado.