Sistema de componentes tematizado · Nuevo recurso

Sistema de diseño de Mantine.

Una referencia de Mantine 9 basada en una tabla nativa de participantes y un panel lateral de planificación. Inspecciona las escalas reales del tema, conecta useForm con TextInput, Select, Checkbox y DatePickerInput, y prueba la validación antes de añadir un registro local.

Guía de OpenDesign9 capítulos32 entradas de referenciaGuía de aplicación original
01

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

Abre el panel lateral, activa la validación de campos, selecciona un estudio y una fecha, añade un participante local y retira el consentimiento de ejemplo.

Tabla de participantes y panel lateral de programaciónAbrir ejemplo completo
Núcleo, formularios y paquetes de fechas de Mantine 9.6.3 nativos con React 19. Apariencia clara forzada y tema cian; solo estado local. · Referencia de implementación
02

Referencia de diseño del sistema de diseño de Mantine

Valores seleccionados de DEFAULT_THEME verificados con @mantine/core 9.6.3. Los equivalentes numéricos en píxeles presuponen una raíz de 16px y theme.scale=1; los tokens escalados se resuelven mediante --mantine-scale. El color primario cian, el tono 8 y el radio md son ajustes explícitos de la aplicación.

Paleta cian utilizada en el ejemplo

Fuente
Nombre / ReglaValor / ConfiguraciónUso
colors.cyan[0]#e3fafc Superficie discreta para el resumen del tema.
colors.cyan[1]#c5f6fa Tinte claro.
colors.cyan[2]#99e9f2 Matiz.
colors.cyan[3]#66d9e8 Matiz.
colors.cyan[4]#3bc9db Matiz intermedio.
colors.cyan[5]#22b8cf Sombra intermedia.
colors.cyan[6]#15aabf Tono estándar de la paleta.
colors.cyan[7]#1098ad Sombra más oscura.
colors.cyan[8]#0c8599 Tono elegido para la acción principal.
colors.cyan[9]#0b7285 Acento de texto intenso.

Escala tipográfica con scale 1

Fuente
Nombre / ReglaValor / ConfiguraciónUso
fontSizes.xs / sm12px / 14pxIdentificadores de registro / texto complementario.
fontSizes.md / lg / xl16px / 18px / 20pxTexto del cuerpo predeterminado y tamaños mayores.
lineHeights.xs / sm / md1.4 / 1.45 / 1.55Escalas emparejadas del cuerpo de texto.
lineHeights.lg / xl1.6 / 1.65Tamaños de lectura mayores.
headings.h134px / 1.3Título de las sesiones de participantes.
headings.h2 / h326px / 1.35; 22px / 1.4Niveles de encabezado disponibles.
fontFamilyPlatform sans-serif stackNo se necesita descargar fuentes.

Espaciado y radio con scale 1

Fuente
Nombre / ReglaValor / ConfiguraciónUso
spacing.xs / sm10px / 12pxSeparaciones pequeñas.
spacing.md / lg / xl16px / 20px / 32pxMargen interior móvil / separación de campos / separación de secciones.
radius.xs / sm2px / 4pxGeometría pequeña.
radius.md / lg / xl8px / 16px / 32pxEsquinas predeterminadas / mayores del ejemplo.
defaultRadiusmd (application override)Se aplica de forma centralizada mediante createTheme.

Puntos de interrupción

Fuente
Nombre / ReglaValor / ConfiguraciónUso
breakpoints.xs36em576px con el valor predeterminado de 16px.
breakpoints.sm48emLas tarjetas de resumen pasan a tener tres columnas.
breakpoints.md62em992px con el valor predeterminado de 16px.
breakpoints.lg / xl75em / 88em1200px / 1408px con el valor predeterminado de 16px.

Mapeo de CSS y los componentes

Fuente
Nombre / ReglaValor / ConfiguraciónUso
--mantine-primary-color-filledResolved from primaryColor and primaryShadeEl ejemplo elige el tono cian 8.
--mantine-spacing-lgcalc(1.25rem * var(--mantine-scale))Separación lg en Stack y relleno lg en los paneles.
--mantine-radius-mdcalc(0.5rem * var(--mantine-scale))Panel redondeado predeterminado.
--mantine-font-size-smcalc(0.875rem * var(--mantine-scale))Etiquetas de registro de la tabla.
Button.extend defaultPropssize: smValor predeterminado explícito de la aplicación.
TextInput.extend defaultPropssize: mdValor predeterminado explícito de la aplicación.
03

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

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

DESIGN-mantine.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 de Mantine: tema y límites de los paquetes

Un proveedor y tres paquetes de funciones

El ejemplo usa core para la interfaz, form para la validación y los enlaces, y dates para el campo de calendario. MantineProvider recibe las sobrescrituras de createTheme. Se importan tanto Core CSS como dates CSS; cargar solo el componente de React no basta para reproducir el calendario con estilo aplicado.

De esta guía de OpenDesign

El tema selecciona cian con primaryShade 8 y defaultRadius md. Button.extend establece los botones pequeños como valor predeterminado de la aplicación, mientras que TextInput.extend selecciona controles medianos. Son ajustes deliberados que se muestran en el código, no una afirmación de que todos los productos de Mantine deban usarlos.

Consulta la especificación complementaria

Sistema de diseño de Mantine: usa índices de paleta y roles de color resueltos

Una paleta ordenada no es una lista de muestras de color inconexas

Los colores de Mantine son matrices de tonos indexadas. Esta muestra usa cyan.0 para un panel de resumen discreto, cyan.9 para texto de acento y el tono primario configurado para las acciones con relleno. La referencia enumera toda la escala de cian utilizada por este tema.

La insignia de confirmado de la tabla usa una variante de cian claro; la de retirado, naranja. Ambos estados conservan su texto. La retirada cambia el estado del consentimiento, pero mantiene visible la sesión anterior, para evitar que un cambio de color elimine el historial sin avisar.

Consulta la especificación complementaria

Colores del tema frente a valores arbitrarios de CSS

La propiedad color del componente puede hacer referencia a una paleta con nombre; aplicar por separado un fondo hexadecimal sin procesar omitiría algunas decisiones de variante. Al usar CSS sin más, prefiere las variables generadas para las decisiones de tema recurrentes. La correspondencia entre las variables de CSS y los valores del ejemplo explica cuáles siguen vinculados a la escala y al color principal.

Consulta la especificación complementaria

Sistema de diseño de Mantine: aplica las escalas de fuentes y encabezados exportadas

Reproduce la jerarquía

La tabla usa texto sm para los nombres y las etiquetas de estudio, y xs para los identificadores y las fechas. Title order={1} usa la escala h1; el cajón tiene un encabezado semántico h2 que se muestra con size="h3" para que su nivel visual sea más compacto. Estas decisiones son independientes de las etiquetas y el texto de ayuda que proporcionan los componentes de entrada.

La pila de fuentes del sistema de Mantine no requiere descargar fuentes remotas. Los valores de fuente escalados incluyen --mantine-scale; los valores en píxeles de referencia presuponen una escala de 1. No trates esos equivalentes en píxeles como invariantes si la aplicación cambia la escala.

Consulta la especificación complementaria

Sistema de diseño de Mantine: vincula useForm a componentes de entrada reales

La validación corresponde al modelo del formulario

initialValues incluye un nombre, un estudio, una fecha que admite null y un consentimiento booleano. validate devuelve una cadena de error o null para los campos de nombre, fecha y consentimiento. form.onSubmit ejecuta esa validación antes de añadir la fila local. No hace falta recopilar por separado etiquetas de error dibujadas manualmente.

TextInput y DatePickerInput reciben getInputProps para la ruta de su campo. Checkbox también especifica type:"checkbox" para que el valor checked se vincule correctamente. Select usa una lista fija de estudios y allowDeselect={false}; el flujo no admite que el estudio quede vacío.

Consulta la especificación complementaria

Valor y formato de visualización de la fecha

Consulta la especificación complementaria

Sistema de diseño de Mantine: controla la densidad y el desbordamiento en los límites del componente

Mantén la tabla dentro de su propia región desplazable

Table.ScrollContainer usa minWidth={580} para conservar cuatro columnas legibles en pantallas estrechas. El documento permanece dentro de la ventana gráfica; solo la región de datos se desplaza horizontalmente cuando hace falta. horizontalSpacing="lg" y verticalSpacing="md" usan el espaciado del tema en lugar de un relleno de celda independiente.

Las tres tarjetas de resumen usan SimpleGrid con una columna en el punto de ruptura base y tres a partir de sm. El margen interior de la página también cambia de md a xl. Son objetos de estilo adaptables; el ancho mínimo de la tabla es una decisión explícita sobre el contenido.

Consulta la especificación complementaria

Sistema de diseño de Mantine: diferencia la inscripción no válida de la retirada del consentimiento

El ejemplo contempla dos cambios distintos

El formulario de programación no puede añadir una fila hasta que el nombre, la fecha de la sesión y el consentimiento de ejemplo cumplan la validación. Si se añade correctamente, el cajón se cierra, se agrega un registro y se actualizan los recuentos del resumen. La alerta indica que no se almacenó ningún registro de investigación.

Retirar el consentimiento solo cambia el estado de la fila seleccionada y desactiva la acción de esa fila. La fecha sigue visible como historial, mientras que el recuento de sesiones programadas excluye las filas con el consentimiento retirado. Esta es una política declarada para la vista previa, no una norma real de conservación de datos de investigación.

  • Formulario no válido: muestra errores junto a los campos y mantén abierto el cajón.
  • Entrada local aceptada: añade la fila una sola vez y restablece el siguiente borrador.
  • Consentimiento de ejemplo retirado: conserva el registro y desactiva la posibilidad de volver a retirarlo.

Sistema de diseño de Mantine: combina el cajón con la semántica de los campos de entrada

Foco y etiquetas

El cajón recibe un título y usa la gestión de foco nativa. El campo de nombre tiene data-autofocus. Todos los controles del formulario muestran una etiqueta visible; los mensajes de validación proceden de la propiedad de error vinculada. El nombre accesible del botón para retirar el consentimiento incluye el nombre del participante, de modo que se puedan distinguir varios botones con la misma etiqueta visual.

En este ejemplo, cerrar el cajón cancela el borrador: al abrir Add participant, se restablece el formulario. El calendario es una ventana emergente nativa de Mantine dentro del cajón. Prueba su interacción con el teclado junto con la trampa de foco que lo rodea; no des por sentado que dos componentes accesibles por separado siempre funcionan bien al combinarse.

Consulta la especificación complementaria

Sistema de diseño de Mantine: instala paquetes con versiones compatibles y ambas hojas de estilos

Se proporciona la configuración completa

Usa los comandos de terminal que aparecen a continuación, sustituye App.jsx por la composición completa y móntala con el main.jsx proporcionado. Las cuatro versiones de los paquetes de Mantine están alineadas deliberadamente. App.jsx contiene el proveedor y el tema, así que no se necesita ningún archivo oculto del proveedor.

No copies un ejemplo de fecha de otra versión principal sin comprobar antes el tipo de valor. Asegúrate de que la fecha inicial del formulario y la validación coincidan con el API real de DatePickerInput. Este ejemplo se creó con las versiones de paquete especificadas; no se dedujo de un tutorial anterior.

  1. Instala core, hooks, form y dates, además de la dependencia dayjs de dates.
  2. Importa core/styles.css y dates/styles.css una sola vez, en el límite de la aplicación.
  3. Prueba el formulario, añade un registro con fecha y, luego, revisa la tabla y el resultado de retirar el consentimiento.

Sistema de diseño de Mantine: verifica el calendario, el formulario y la tabla como una sola unidad

Qué probar

Envía el cajón vacío para mostrar los errores de nombre, fecha y consentimiento. Escribe un nombre, selecciona un día en el calendario y confirma el consentimiento de ejemplo antes de volver a enviar el formulario. El nuevo participante debería aparecer con la fecha seleccionada y un ID de vista previa estable. Después, retira el consentimiento de ese participante y observa los cambios en la fila y el resumen.

El modelo de datos es deliberadamente pequeño y solo existe en memoria. No hay captación de participantes para estudios, recopilación de consentimientos, persistencia en el servidor ni conversión de zonas horarias. El valor concreto de este ejemplo está en la integración nativa de paquetes y el comportamiento visible de los controles, no en un supuesto backend para gestionar investigaciones.

Ejemplos de componentes del sistema de diseño de Mantine

App.jsx — proveedor, tema, tabla y cajón de programación

Ejemplo nativo completo de Mantine. Incluye las personalizaciones del tema, la validación de useForm, DatePickerInput, las actualizaciones de la tabla y el cambio del estado del consentimiento.

jsx
import React, {useState} from 'react';
import {MantineProvider, createTheme, Box, Group, Stack, Title, Text, Button, Paper, Badge, Table, Drawer, TextInput, Select, Checkbox, Alert, SimpleGrid} from '@mantine/core';
import {useForm} from '@mantine/form';
import {DatePickerInput} from '@mantine/dates';
import '@mantine/core/styles.css';
import '@mantine/dates/styles.css';
const theme=createTheme({primaryColor:'cyan',primaryShade:8,defaultRadius:'md',components:{Button:Button.extend({defaultProps:{size:'sm'}}),TextInput:TextInput.extend({defaultProps:{size:'md'}})}});
function Tracker(){
 const[opened,setOpened]=useState(false),[notice,setNotice]=useState(''),[rows,setRows]=useState([{name:'Alex Morgan',study:'Navigation study',date:'2026-10-14',status:'Confirmed'},{name:'Sam Rivera',study:'Editor study',date:'2026-10-16',status:'Confirmed'}]);
 const form=useForm({initialValues:{name:'',study:'Navigation study',date:null,consent:false},validate:{name:v=>v.trim().length<2?'Enter a name with at least two characters.':null,date:v=>!v?'Choose a session date.':null,consent:v=>!v?'Confirm consent before scheduling this example.':null}});
 const submit=values=>{setRows([...rows,{name:values.name.trim(),study:values.study,date:values.date,status:'Confirmed'}]);setOpened(false);setNotice('Participant added in this browser only. No research record was stored.');form.reset();};
 return <Box p={{base:'md',sm:'xl'}} bg='gray.0'><Box maw={1040} mx='auto'>
 <Group justify='space-between' align='flex-start' mb='xl'><Box><Text c='cyan.9' fw={700} size='xs' tt='uppercase' mb='xs'>Mantine · Research operations</Text><Title order={1}>Participant sessions</Title><Text c='dimmed' mt='xs'>Consent and scheduling stay visible in the same working view.</Text></Box><Button onClick={()=>{form.reset();setOpened(true)}}>Add participant</Button></Group>
 <SimpleGrid cols={{base:1,sm:3}} mb='xl'><Paper withBorder p='lg'><Text size='sm' c='dimmed'>In this preview</Text><Text fz={32} fw={700}>{rows.length}</Text><Text size='sm'>Participant records</Text></Paper><Paper withBorder p='lg'><Text size='sm' c='dimmed'>Scheduled</Text><Text fz={32} fw={700}>{rows.filter(r=>r.status==='Confirmed').length}</Text><Text size='sm'>With confirmed example consent</Text></Paper><Paper withBorder p='lg' bg='cyan.0'><Text size='sm' c='cyan.9' fw={600}>Working theme</Text><Text mt='xs' size='sm'>cyan.8 action · radius md<br/>spacing lg · body md</Text></Paper></SimpleGrid>
 {notice&&<Alert title='Local change' color='cyan' mb='md' withCloseButton onClose={()=>setNotice('')}>{notice}</Alert>}
 <Paper withBorder radius='md'><Table.ScrollContainer minWidth={580}><Table verticalSpacing='md' horizontalSpacing='lg' highlightOnHover><Table.Thead><Table.Tr><Table.Th>Participant</Table.Th><Table.Th>Study / session</Table.Th><Table.Th>Consent</Table.Th><Table.Th>Action</Table.Th></Table.Tr></Table.Thead><Table.Tbody>{rows.map((r,i)=><Table.Tr key={i}><Table.Td><Text fw={600} size='sm'>{r.name}</Text><Text size='xs' c='dimmed'>P-{String(i+1).padStart(3,'0')}</Text></Table.Td><Table.Td><Text size='sm'>{r.study}</Text><Text size='xs' c='dimmed'>{r.date}</Text></Table.Td><Table.Td><Badge variant='light' color={r.status==='Confirmed'?'cyan':'orange'}>{r.status}</Badge></Table.Td><Table.Td><Button variant='subtle' color='gray' disabled={r.status==='Withdrawn'} aria-label={'Withdraw consent for '+r.name} onClick={()=>{setRows(rows.map((x,j)=>j===i?{...x,status:'Withdrawn'}:x));setNotice('Consent withdrawn in the preview. The prior session remains visible as history.')}}>Withdraw</Button></Table.Td></Table.Tr>)}</Table.Tbody></Table></Table.ScrollContainer></Paper>
 <Text size='xs' c='dimmed' mt='lg'>Native Mantine 9.6.3: Table, Drawer, useForm, DatePickerInput, and input error styles. All records are memory-only examples.</Text>
 <Drawer opened={opened} onClose={()=>setOpened(false)} position='right' size='md' title={<Title order={2} size='h3'>Schedule a participant</Title>}><form onSubmit={form.onSubmit(submit)} noValidate><Stack gap='lg'><Text size='sm' c='dimmed'>All fields below belong to this one study enrollment. Closing discards the draft.</Text><TextInput label='Participant name' placeholder='Jules Davis' data-autofocus {...form.getInputProps('name')}/><Select label='Study' data={['Navigation study','Editor study']} allowDeselect={false} {...form.getInputProps('study')}/><DatePickerInput label='Session date' placeholder='Choose a date' valueFormat='DD MMM YYYY' defaultDate='2026-10-01' {...form.getInputProps('date')}/><Checkbox label='Consent is confirmed for this example study' {...form.getInputProps('consent',{type:'checkbox'})}/><Button type='submit'>Add to preview</Button><Text size='xs' c='dimmed'>This checkbox demonstrates validation; it is not a research consent collection process.</Text></Stack></form></Drawer>
 </Box></Box>;
}
export default function App(){return <MantineProvider theme={theme} forceColorScheme='light'><Tracker/></MantineProvider>}

Referencia de código

  • Se han importado Core y dates CSS.
  • La casilla de consentimiento es una condición de validación de ejemplo, no un flujo real de recopilación del consentimiento.
04

Configuración del agente del sistema de diseño Mantine

Punto de partida para la implementación

Usa una versión de Node compatible con la plantilla de Vite seleccionada. El código fuente incluye las importaciones del proveedor, el tema y la hoja de estilos; el flujo mostrado no requiere un backend ni un CSS personalizado.

Texto
# Terminal
npm create vite@latest participant-demo -- --template react
cd participant-demo
npm install
npm install @mantine/[email protected] @mantine/[email protected] @mantine/[email protected] @mantine/[email protected] dayjs

# Save the complete example as src/App.jsx.
# Replace src/main.jsx with:
import React from 'react';
import {createRoot} from 'react-dom/client';
import App from './App';
createRoot(document.getElementById('root')).render(<App/>);

# Terminal
npm run dev

Una instrucción para tu proyecto

Instrucción para el agente
Usa la composición Mantine 9.6.3 proporcionada y mantén alineadas las versiones de core/form/dates. Conserva el proveedor, ambas importaciones de CSS, los enlaces getInputProps, el tipo del valor de fecha y el límite de desplazamiento de la tabla. Sustituye los cambios locales de inscripción por el servicio real solo después de definir las políticas de consentimiento y persistencia. Mantén la retirada del consentimiento diferenciada de la eliminación y conserva los errores de entrada legibles y el foco del panel lateral.
05

Fuentes y alcance del sistema de diseño Mantine

Ejemplo original de OpenDesign con Mantine 9.6.3. Los valores predeterminados del tema se distinguen de las personalizaciones de la aplicación en cian y formas. La vista previa nativa muestra únicamente registros locales y validación; no recopila consentimientos ni guarda datos de investigación.