MUI (Material UI)
Para aplicações React com MUI, o pacote @mobiis/mds-style traz createMdsTheme, um tema gerado dos mesmos tokens do CSS do MDS. Os componentes do MUI ficam com a mesma forma, cores e estados (hover, pressionado, foco, desabilitado e erro) dos componentes do mds-styles.css.
Instalação
Seção intitulada “Instalação”Requer @mui/material e react. O tema foi validado no MUI 7.3.
npm i @mobiis/mds-styleimport { ThemeProvider, CssBaseline } from '@mui/material';import { createMdsTheme } from '@mobiis/mds-style/mui';
const theme = createMdsTheme({ mode: 'light' });
export function App() { return ( <ThemeProvider theme={theme}> <CssBaseline /> {/* … */} </ThemeProvider> );}Tema e cor primária
Seção intitulada “Tema e cor primária”| Opção | Equivale a | Valores |
|---|---|---|
mode |
data-theme |
light (padrão), dark, dark-blue |
brand |
data-primary |
brand-mobiis, blue, teal, aqua, green, yellow, orange, red, pink. Sem valor = brand-mobiis. |
const theme = useMemo(() => createMdsTheme({ mode: preferencias.tema, brand: tenant.cor }), [preferencias.tema, tenant.cor]);Para trocar o tema ou a cor primária, crie outro tema e passe ao ThemeProvider. Ajustes próprios vão como argumentos extras e são mesclados por cima:
createMdsTheme({ mode: 'dark' }, { components: { MuiButton: { defaultProps: { size: 'small' } } } });O que segue o MDS
Seção intitulada “O que segue o MDS”| Componente | Segue | Comportamento |
|---|---|---|
Button |
.mds-btn |
small, medium e large = 32, 48 e 56px (e xsmall = 24px). Negrito, sem caixa alta, degrau de 1px. contained, outlined e text com os tokens --mds-buttons-*. Pressionado = escala 0,98 + sombra interna; foco = contorno de 2px; desabilitado cinza |
IconButton |
botão só-ícone | 32, 48 e 56px, raio do MDS, hover na cor de item |
TextField, OutlinedInput, Select |
.mds-input |
48px (small = 32px), borda de 2px, raio 8px. Hover com borda primary; foco com borda e halo de 4px a 30%; erro, desabilitado e texto de ajuda do MDS |
Checkbox, Radio |
.mds-checkbox, .mds-radio |
caixa de 24px com raio de 6px e círculo de 20px; marcados em primary |
Switch |
.mds-checkbox--switch |
40×24px; ligado em primary |
Chip |
.mds-badge |
raio de 4px, 12px negrito, mesmas cores do badge (.mds-badge--success…); variant="solid" = badge sólido |
Alert |
.mds-alert |
fundo e texto --mds-highlight-*, borda e ícone na cor do papel; filled = sólido |
Tabs, Tab |
nav-tabs |
sem caixa alta; aba ativa em negrito; indicador primary |
Table |
.mds-table |
linha de 48px, padding de 8px, cabeçalho dimmed-3 |
Tooltip |
.mds-tooltip |
fundo dimmed-7, 14px, raio de 6px |
Dialog, Menu, Popover, Card, Paper |
elevações do MDS | raio de 8px, sombras elevation-1…5, backdrop background-transparency |
MenuItem, ListItemButton |
item do MDS | hover e selecionado com --mds-item-* |
AppBar, Toolbar |
top-bar |
64px, fundo de superfície, borda inferior |
Avatar |
.mds-avatar |
quadrado com raio de 8px por padrão (variant="circular" para círculo) |
Outros ajustes:
- Ripple: fica desligado. O MDS não tem ripple: o retorno de toque é a escala e a sombra interna.
- Botão padrão:
<Button>sem props é o control sólido (.mds-btn--control), o botão neutro do MDS, como omdsButtondo Angular e o tema do PrimeFaces. A ação principal levacolor="primary": no máximo um por tela, formulário ou diálogo. Para ações secundárias de suporte (Exportar, Imprimir), usevariant="outlined" color="primary". Para ações de baixa prioridade, usevariant="text". - Tipografia:
| Variante MUI | Estilo MDS |
|---|---|
h1 … h4 |
headline-h1 … headline-h4 |
h5 |
title-lg |
h6, subtitle1 |
title-md |
subtitle2 |
title-sm |
body1, body2 |
body-md, body-sm |
caption |
body-xs |
- Medidas:
theme.spacing(1)= 8px (sm), então0.5,2,3e4= xs, md, lg e xl;shape.borderRadius= 8px;- breakpoints do grid MDS: 576, 768, 992 e 1200px.
<Stack direction="row" spacing={1}> <Button>Cancelar</Button> <Button color="primary">Salvar</Button></Stack><TextField label="Placa do veículo" error helperText="Placa inválida. Use o formato ABC1D23." /><Chip label="Em trânsito" color="success" /><Chip label="Atrasada" color="error" variant="solid" />Tokens no código
Seção intitulada “Tokens no código”theme.mds.tokens['colors-primary-main']; // valor resolvido para o tema e a cor primáriatheme.palette.primary.lighter; // os 5 tons: lighter, light, main, dark, darker
import { getMdsTokens } from '@mobiis/mds-style/mui';getMdsTokens({ mode: 'dark' })['control-default-border'];O TypeScript conhece as extensões:
color="control"noButtone noIconButton;size="xsmall"noButton;variant="solid"noChip;theme.mdse os nomes de token e de cor primária, com autocompletar.
Como o tema é feito
Seção intitulada “Como o tema é feito”O MUI faz conta com as cores da paleta (alpha(), contraste do texto), por isso precisa de valores, e não de var(--mds-*).
- Geração dos tokens:
npm run mui:build(scripts/mui/build-mui.js) compilasrc/scss/mds-tokens.scsse resolve a cascata real dos tokens (especificidade, ordem evar()) para cada tema e cor primária. O resultado vai parathemes/mui/tokens.jsno repositório (mui/tokens.jsno pacote). - O tema:
themes/mui/index.jsmonta a paleta e osstyleOverridesdos componentes a partir desses tokens e das medidas do SCSS.
npm run mui:verify falha se themes/mui/tokens.js estiver desatualizado. Quando os tokens mudam, rode npm run tokens e depois npm run mui:build.
Limitações conhecidas
Seção intitulada “Limitações conhecidas”- Migração de apps que já usam MUI: no MUI,
<Button>semcoloréprimary. Com o tema, ele vira o control, que é cinza. Revise as telas para marcar a ação principal comcolor="primary". - Troca em tempo de execução: trocar tema ou cor primária exige criar outro tema. No CSS do MDS e no Tailwind, a troca é pelos atributos do
<html>. - Rótulo dos campos: sobe para a borda, como no MUI, e não flutua dentro do campo como no
.mds-input. - Versões do MUI: a comparação exata foi feita no MUI 7.3.