Voltar ao Hub
Parte 1 de 4 — Design System

UX/UI — Fundamentos

Princípios de design, grid, espaçamento, botões, formulários, cards, modais, notificações, tabelas e tabs.

14
Seções
01–10, 85–88
Capítulos
Base
Nível
Parte 2 → Componentes Parte 3 → Patterns Parte 4 → Referência
01 — Manual UX/UI — Princípios

Princípios de Design

O design de interfaces da Sysled segue princípios que refletem os valores da marca e garantem uma experiência de usuário consistente, eficiente e profissional em todas as plataformas.

Princípio Descrição Aplicação
Clareza Informações devem ser apresentadas de forma direta e sem ambiguidade Labels claros, hierarquia visual definida, feedback imediato
Consistência Padrões visuais e de interação devem ser uniformes em toda a plataforma Componentes reutilizáveis, tokens de design, nomenclatura padronizada
Eficiência O usuário deve completar tarefas com o mínimo de esforço possível Atalhos, autocompletar, valores padrão inteligentes, fluxos otimizados
Confiabilidade O sistema deve transmitir segurança e previsibilidade Estados de loading, confirmações, tratamento de erros, dados em tempo real
Acessibilidade A interface deve ser utilizável por todos, independente de limitações Contraste WCAG AA, navegação por teclado, textos alternativos, ARIA labels
02 — Sistema de Grid

Sistema de Grid

A Sysled utiliza um sistema de grid de 12 colunas com gutters de 24px para layouts desktop e 16px para mobile. O grid garante alinhamento consistente e facilita a criação de layouts responsivos.

1
2
3
4
5
6
7
8
9
10
11
12
Breakpoint Largura Colunas Gutter Margem
Mobile 360px — 767px 4 16px 16px
Tablet 768px — 1023px 8 20px 24px
Desktop 1024px — 1439px 12 24px 32px
Large Desktop 1440px+ 12 24px Auto (max 1200px)
03 — Espaçamento

Sistema de Espaçamento

O sistema de espaçamento da Sysled é baseado em uma escala de 4px, garantindo consistência e harmonia visual em todos os componentes e layouts. Cada token de espaçamento é um múltiplo de 4px.

4px
xs
8px
sm
12px
md
16px
lg
24px
xl
32px
2xl
48px
3xl
64px
4xl
96px
5xl

Border Radius

Token Valor Uso
radius-sm 4px Badges, tags, chips
radius-md 8px Botões, inputs, dropdowns
radius-lg 12px Cards pequenos, tooltips
radius-xl 16px Cards grandes, modais, painéis
radius-full 9999px Avatares, pills, toggles
04 — Botões

Botões

Os botões são os principais elementos de ação da interface. Devem ser claramente distinguíveis e hierarquizados conforme a importância da ação que representam.

Hierarquia de Botões

<!-- Botão Primário --> <button class="btn btn-primary btn-lg">Ação Principal</button> <button class="btn btn-primary">Ação Principal</button> <button class="btn btn-primary btn-sm">Ação Principal</button> <!-- Botão Secundário --> <button class="btn btn-secondary">Ação Secundária</button> <!-- Botão Ghost --> <button class="btn btn-ghost">Ação Terciária</button>
.btn { display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.65rem 1.5rem; border-radius: 12px; font-family: 'Montserrat', sans-serif; font-size: 0.82rem; font-weight: 600; border: 1.5px solid transparent; cursor: pointer; transition: all 0.18s; } .btn-primary { background: #2B6CB0; color: #FFFFFF; box-shadow: 0 2px 8px rgba(43,108,176,0.3); } .btn-secondary { background: transparent; color: #2B6CB0; border-color: #2B6CB0; } .btn-ghost { background: transparent; color: #475569; border-color: #E2E8F0; } .btn-sm { padding: 0.45rem 1.1rem; font-size: 0.75rem; } .btn-lg { padding: 0.875rem 2rem; font-size: 0.9rem; }
Primário — Ação principal
Secundário — Ação alternativa
Ghost — Ação terciária

Especificações

Propriedade Small Default Large
Padding 8px 20px 12px 28px 16px 36px
Font Size 0.8rem 0.875rem 1rem
Font Weight 600 600 600
Border Radius 8px 8px 8px
Min Height 32px 40px 48px
05 — Formulários

Formulários e Inputs

Os campos de formulário devem ser claros, acessíveis e fornecer feedback visual imediato ao usuário. Labels devem estar sempre visíveis (não usar apenas placeholders como labels).

<div class="form-group"> <label for="company">Nome da Empresa</label> <input type="text" id="company" placeholder="Ex: Indústria ABC Ltda"> </div> <div class="form-group"> <label for="module">Módulo</label> <select id="module"> <option>Selecione um módulo</option> <option>Gestão de Estoque</option> </select> </div>
.form-group { display: flex; flex-direction: column; gap: 0.4rem; max-width: 380px; margin: 1rem 0; } .form-group label { font-size: 0.78rem; font-weight: 600; color: #0F172A; } .form-group input, .form-group select { padding: 0.65rem 1rem; border: 1.5px solid #E2E8F0; border-radius: 12px; font-family: 'Inter', sans-serif; font-size: 0.875rem; color: #1E293B; outline: none; transition: all 0.18s; } .form-group input:focus, .form-group select:focus { border-color: #3A8FD6; box-shadow: 0 0 0 3px rgba(58,143,214,0.12); }

Especificações de Input

Propriedade Valor
Padding 12px 16px
Border 1.5px solid #E2E8F0
Border (focus) 1.5px solid #3A8FD6
Border Radius 8px
Font Size 0.9rem (Inter)
Label Font Size 0.8rem (Inter, weight 600)
Focus Ring 0 0 0 3px rgba(58,143,214,0.15)
Min Height 44px
06 — Cards

Cards

Cards são containers versáteis para agrupar informações relacionadas. Na plataforma Sysled, são utilizados para módulos, métricas, alertas e itens de lista. O design deve ser limpo, com hierarquia clara entre título, conteúdo e ações.

<div class="card"> <h4>Gestão de Estoque</h4> <p>Controle inteligente de entradas, saídas e posições em tempo real.</p> <button class="btn btn-primary btn-sm"> Acessar Módulo </button> </div>
.card { border: 1px solid #E2E8F0; border-radius: 20px; padding: 1.75rem 2rem; background: #FFFFFF; max-width: 380px; box-shadow: 0 1px 3px rgba(0,0,0,0.06), 0 4px 16px rgba(0,0,0,0.06); transition: all 0.25s cubic-bezier(0.4,0,0.2,1); } .card:hover { box-shadow: 0 8px 40px rgba(0,0,0,0.12); transform: translateY(-3px); } .card h4 { font-family: 'Montserrat', sans-serif; font-size: 1rem; font-weight: 700; margin-bottom: 0.4rem; } .card p { font-size: 0.875rem; color: #94A3B8; }

Gestão de Estoque

Controle inteligente de entradas, saídas e posições de estoque em tempo real com alertas automáticos.

Automação Logística

Automatize separações, alocações e movimentações com regras configuráveis por operação.

Especificações de Card

Propriedade Valor
Padding 24px — 32px
Border 1px solid #E2E8F0
Border Radius 16px
Background #FFFFFF
Hover Shadow 0 8px 32px rgba(0,0,0,0.08)
Hover Transform translateY(-2px)
Transition 0.3s ease
07 — Modais e Dialogs

Modais e Dialogs

Modais são sobreposições que capturam a atenção do usuário para ações importantes — confirmações, formulários, alertas e visualização de conteúdo. Devem ser usados com parcimônia para não interromper o fluxo.

Tipos de Modal

<!-- Modal Overlay -->
<div class="modal-overlay" id="myModal">
  <div class="modal-container modal-md">

    <!-- Header -->
    <div class="modal-header">
      <h3>Título do Modal</h3>
      <button class="modal-close" aria-label="Fechar">
        <svg viewBox="0 0 24 24" fill="none" stroke="currentColor"
             stroke-width="2">
          <line x1="18" y1="6" x2="6" y2="18"/>
          <line x1="6" y1="6" x2="18" y2="18"/>
        </svg>
      </button>
    </div>

    <!-- Body -->
    <div class="modal-body">
      <p>Conteúdo do modal aqui.</p>
    </div>

    <!-- Footer -->
    <div class="modal-footer">
      <button class="btn-secondary-sm">Cancelar</button>
      <button class="btn-primary-sm">Confirmar</button>
    </div>

  </div>
</div>

<!-- Tamanhos: modal-sm | modal-md | modal-lg | modal-full -->

<!-- Dialog de Confirmação -->
<div class="modal-overlay">
  <div class="modal-container modal-sm">
    <div class="modal-body" style="text-align:center; padding-top:2rem;">
      <div class="modal-icon modal-icon-warning">!</div>
      <h3>Tem certeza?</h3>
      <p>Esta ação não pode ser desfeita.</p>
    </div>
    <div class="modal-footer" style="justify-content:center;">
      <button class="btn-secondary-sm">Cancelar</button>
      <button class="btn-danger-sm">Excluir</button>
    </div>
  </div>
</div>

<!-- Dialog de Alerta / Sucesso -->
<div class="modal-overlay">
  <div class="modal-container modal-sm">
    <div class="modal-body" style="text-align:center; padding-top:2rem;">
      <div class="modal-icon modal-icon-success">✓</div>
      <h3>Operação concluída</h3>
      <p>Os dados foram salvos com sucesso.</p>
    </div>
    <div class="modal-footer" style="justify-content:center;">
      <button class="btn-primary-sm">OK</button>
    </div>
  </div>
</div>
/* Modal Overlay */
.modal-overlay {
  position: fixed;
  inset: 0;
  background: rgba(15, 23, 42, 0.6);
  backdrop-filter: blur(4px);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 1000;
  padding: 1rem;
  animation: modalFadeIn 0.2s ease;
}

@keyframes modalFadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}

@keyframes modalSlideUp {
  from { opacity: 0; transform: translateY(16px) scale(0.98); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}

/* Modal Container */
.modal-container {
  background: #FFFFFF;
  border-radius: 16px;
  box-shadow: 0 8px 40px rgba(0,0,0,0.15),
              0 2px 12px rgba(0,0,0,0.08);
  width: 100%;
  max-height: 85vh;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  animation: modalSlideUp 0.25s ease;
}

/* Tamanhos */
.modal-sm  { max-width: 400px; }
.modal-md  { max-width: 560px; }
.modal-lg  { max-width: 720px; }
.modal-full { max-width: 95vw; max-height: 95vh; }

/* Header */
.modal-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 1.25rem 1.5rem;
  border-bottom: 1px solid #E2E8F0;
}

.modal-header h3 {
  font-family: 'Montserrat', sans-serif;
  font-size: 1.1rem;
  font-weight: 700;
  color: #0F172A;
  margin: 0;
}

.modal-close {
  width: 32px; height: 32px;
  border: none; background: transparent;
  border-radius: 8px; cursor: pointer;
  display: flex; align-items: center;
  justify-content: center; color: #64748B;
  transition: all 0.15s;
}
.modal-close:hover {
  background: #F1F5F9; color: #0F172A;
}
.modal-close svg { width: 18px; height: 18px; }

/* Body */
.modal-body {
  padding: 1.5rem;
  overflow-y: auto;
  flex: 1;
}

/* Footer */
.modal-footer {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 0.75rem;
  padding: 1rem 1.5rem;
  border-top: 1px solid #E2E8F0;
}

/* Icon para Dialogs */
.modal-icon {
  width: 56px; height: 56px;
  border-radius: 50%;
  display: flex; align-items: center;
  justify-content: center;
  font-size: 1.5rem; font-weight: 700;
  margin: 0 auto 1rem;
}
.modal-icon-warning {
  background: #FEF3C7; color: #D97706;
}
.modal-icon-success {
  background: #D1FAE5; color: #059669;
}
.modal-icon-danger {
  background: #FEE2E2; color: #DC2626;
}
.modal-icon-info {
  background: #DBEAFE; color: #2B6CB0;
}

/* Botão Danger */
.btn-danger-sm {
  padding: 8px 20px;
  font-family: 'Montserrat', sans-serif;
  font-size: 0.8rem; font-weight: 600;
  border: none; border-radius: 8px;
  background: #DC2626; color: #FFFFFF;
  cursor: pointer; transition: all 0.15s;
}
.btn-danger-sm:hover { background: #C53030; }

Modal Padrão (md)

Editar Produto
LED Painel Solar 200W
Selecione uma categoria ▾
Adicione uma descrição...

Dialog de Confirmação (sm)

!

Excluir item?

Esta ação não pode ser desfeita. O item será removido permanentemente.

Dialog de Sucesso (sm)

Produto cadastrado!

O item foi adicionado ao estoque com sucesso.

Tamanhos de Modal

Small
max-width: 400px
Confirmações, alertas
Medium
max-width: 560px
Formulários, detalhes
Large
max-width: 720px
Tabelas, conteúdo rico
Full
max-width: 95vw
Editores, dashboards

Diretrizes de Uso

DiretrizDescrição
Focus TrapO foco do teclado deve ficar preso dentro do modal enquanto aberto. Tab e Shift+Tab ciclam entre os elementos focáveis.
Fechar com ESCPressionar Escape deve fechar o modal. Clicar no overlay (fundo escuro) também fecha.
AnimaçãoEntrada com fadeIn (overlay) + slideUp (container). Duração: 200-250ms, easing: ease.
Scroll do BodyAdicionar overflow: hidden ao <body> quando modal está aberto para evitar scroll duplo.
ARIAUsar role="dialog", aria-modal="true", e aria-labelledby apontando para o título.
MobileEm telas < 640px, modais devem expandir para largura total com border-radius apenas no topo (estilo bottom sheet).
Ações DestrutivasBotões de exclusão/perigo usam cor #DC2626. Sempre exigir confirmação explícita.
Máximo de ProfundidadeEvitar modais sobre modais (máximo 1 nível). Para fluxos complexos, usar stepper dentro do modal.

Especificações

PropriedadeValor
Overlay Backgroundrgba(15, 23, 42, 0.6) + backdrop-filter: blur(4px)
Container Border Radius16px
Container Shadow0 8px 40px rgba(0,0,0,0.15), 0 2px 12px rgba(0,0,0,0.08)
Header Padding1.25rem 1.5rem
Body Padding1.5rem
Footer Padding1rem 1.5rem
Header Border1px solid #E2E8F0
Footer Border1px solid #E2E8F0
Close Button32px × 32px, radius 8px
Title FontMontserrat, 1.1rem, weight 700
Max Height85vh (body com overflow-y: auto)
Z-Index1000 (--z-modal)
AnimationfadeIn 200ms + slideUp 250ms, easing: ease
08 — Notificações e Toasts

Notificações e Toasts

Notificações fornecem feedback contextual ao usuário sobre ações realizadas, erros, avisos ou informações importantes. Toasts são temporários e não-intrusivos; Banners são persistentes e exigem ação.

Toast Notifications

<!-- Toast Container (posição fixa) -->
<div class="toast-container" role="alert" aria-live="polite">

  <!-- Toast Sucesso -->
  <div class="toast toast-success">
    <div class="toast-icon">
      <svg viewBox="0 0 24 24" fill="none" stroke="currentColor"
           stroke-width="2">
        <polyline points="20 6 9 17 4 12"/>
      </svg>
    </div>
    <div class="toast-content">
      <strong>Sucesso</strong>
      <span>Produto cadastrado com sucesso.</span>
    </div>
    <button class="toast-close" aria-label="Fechar">&times;</button>
    <div class="toast-progress"></div>
  </div>

  <!-- Toast Erro -->
  <div class="toast toast-error">...</div>

  <!-- Toast Aviso -->
  <div class="toast toast-warning">...</div>

  <!-- Toast Info -->
  <div class="toast toast-info">...</div>

</div>

<!-- Banner de Alerta (inline, persistente) -->
<div class="alert-banner alert-warning">
  <div class="alert-icon">⚠</div>
  <div class="alert-content">
    <strong>Atenção:</strong>
    Sua licença expira em 7 dias.
    <a href="#">Renovar agora</a>
  </div>
  <button class="alert-dismiss">&times;</button>
</div>
/* Toast Container */
.toast-container {
  position: fixed;
  top: 1.5rem;
  right: 1.5rem;
  z-index: 9999;
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  max-width: 380px;
}

/* Toast Base */
.toast {
  display: flex;
  align-items: flex-start;
  gap: 0.75rem;
  padding: 1rem 1.25rem;
  border-radius: 12px;
  background: #FFFFFF;
  border-left: 4px solid;
  box-shadow: 0 4px 20px rgba(0,0,0,0.12),
              0 1px 4px rgba(0,0,0,0.06);
  animation: toastSlideIn 0.3s ease;
  position: relative;
  overflow: hidden;
}

@keyframes toastSlideIn {
  from { opacity: 0; transform: translateX(100%); }
  to { opacity: 1; transform: translateX(0); }
}

/* Variantes */
.toast-success { border-color: #059669; }
.toast-error   { border-color: #DC2626; }
.toast-warning { border-color: #D97706; }
.toast-info    { border-color: #2B6CB0; }

/* Ícone */
.toast-icon {
  width: 24px; height: 24px;
  border-radius: 50%; flex-shrink: 0;
  display: flex; align-items: center;
  justify-content: center;
}
.toast-icon svg { width: 16px; height: 16px; }

.toast-success .toast-icon { background: #D1FAE5; color: #059669; }
.toast-error .toast-icon   { background: #FEE2E2; color: #DC2626; }
.toast-warning .toast-icon { background: #FEF3C7; color: #D97706; }
.toast-info .toast-icon    { background: #DBEAFE; color: #2B6CB0; }

/* Alert Banners (inline) */
.alert-banner {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.875rem 1.25rem;
  border-radius: 10px;
  border: 1px solid;
  font-family: 'Inter', sans-serif;
  font-size: 0.875rem;
}
.alert-success { background: #F0FDF4; border-color: #BBF7D0; color: #166534; }
.alert-error   { background: #FEF2F2; border-color: #FECACA; color: #991B1B; }
.alert-warning { background: #FFFBEB; border-color: #FDE68A; color: #92400E; }
.alert-info    { background: #EFF6FF; border-color: #BFDBFE; color: #1E40AF; }

Toast Notifications

Sucesso
Produto cadastrado com sucesso.
Erro
Falha ao conectar com o servidor.
!
Aviso
Sua sessão expira em 5 minutos.
i
Informação
Nova atualização disponível (v2.1).

Alert Banners (Inline)

Banners são persistentes e exibidos inline no conteúdo. Usados para mensagens que exigem atenção contínua ou ação do usuário.

Importação concluída. 248 produtos foram adicionados ao catálogo.
Erro de sincronização. Verifique sua conexão e tente novamente.
⚠️
Atenção: Sua licença expira em 7 dias. Renovar agora
ℹ️
Manutenção programada para sábado, 08/03, das 02h às 06h.

Posicionamento dos Toasts

Top Right
top: 1.5rem; right: 1.5rem;
Padrão recomendado
Top Center
top: 1.5rem; left: 50%;
Ações globais
Bottom Right
bottom: 1.5rem; right: 1.5rem;
Chat, uploads
Bottom Center
bottom: 1.5rem; left: 50%;
Mobile (snackbar)

Diretrizes de Uso

DiretrizDescrição
DuraçãoToasts de sucesso/info: 5 segundos. Toasts de erro: persistente até dismiss manual. Avisos: 8 segundos.
EmpilhamentoMáximo de 3 toasts visíveis. Novos toasts empurram os anteriores para baixo. Mais antigos saem primeiro (FIFO).
Progress BarBarra de progresso na base indica tempo restante antes do auto-dismiss. Pausar ao hover.
AçõesToasts podem ter 1 ação (ex: "Desfazer"). Máximo de 1 botão de ação + botão de fechar.
ARIAContainer com role="alert" e aria-live="polite". Toasts de erro usar aria-live="assertive".
MobileEm telas < 640px, toasts ocupam largura total com margin: 0 1rem. Posição: bottom center (snackbar).
Banners vs ToastsUsar toast para feedback de ação (salvar, excluir). Usar banner para estados persistentes (expiração, manutenção).
Cores SemânticasSuccess: #059669 · Error: #DC2626 · Warning: #D97706 · Info: #2B6CB0

Especificações

PropriedadeToastBanner
Max Width380px100% (inline)
Padding1rem 1.25rem0.875rem 1.25rem
Border Radius12px10px
Border4px left (cor semântica)1px solid (cor clara)
Background#FFFFFFCor semântica clara (ex: #F0FDF4)
Shadow0 4px 20px rgba(0,0,0,0.12)Nenhuma
Ícone28px circular com bgEmoji ou SVG 1.1rem
TítuloMontserrat, 0.85rem, 600Inter bold inline
TextoInter, 0.8rem, #64748BInter, 0.875rem
AnimaçãoslideIn 300ms easeNenhuma (inline)
Z-Index9999 (--z-toast)Herda do contexto
Auto-dismiss5s (progress bar)Não (manual)
09 — Tabelas de Dados

Tabelas de Dados

Tabelas organizam dados estruturados em linhas e colunas para facilitar leitura, comparação e análise. No contexto Sysled, são usadas em listagens de produtos, relatórios logísticos, dashboards de estoque e históricos de operações.

Tabela Padrão

<div class="table-wrapper">
  <table class="data-table">
    <thead>
      <tr>
        <th><input type="checkbox" class="table-check" /></th>
        <th class="sortable">Código <span class="sort-icon">&#x25B4;&#x25BE;</span></th>
        <th class="sortable active-sort">Produto <span class="sort-icon">&#x25B4;</span></th>
        <th>Categoria</th>
        <th class="text-right">Estoque</th>
        <th class="text-right">Preço</th>
        <th>Status</th>
        <th>Ações</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td><input type="checkbox" class="table-check" /></td>
        <td class="text-mono">#LED-001</td>
        <td><strong>Painel Solar 200W</strong></td>
        <td>Energia Solar</td>
        <td class="text-right">1.240</td>
        <td class="text-right">R$ 489,90</td>
        <td><span class="badge badge-success">Ativo</span></td>
        <td><button class="table-action">•••</button></td>
      </tr>
    </tbody>
  </table>
</div>
/* Table Wrapper */
.table-wrapper {
  overflow-x: auto;
  border: 1px solid #E2E8F0;
  border-radius: 12px;
}

.data-table {
  width: 100%;
  border-collapse: collapse;
  font-family: 'Inter', sans-serif;
  font-size: 0.875rem;
}

.data-table thead {
  background: #F8FAFC;
  border-bottom: 2px solid #E2E8F0;
}

.data-table th {
  padding: 0.75rem 1rem;
  font-family: 'Montserrat', sans-serif;
  font-size: 0.75rem;
  font-weight: 600;
  color: #64748B;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  text-align: left;
}

.sortable { cursor: pointer; user-select: none; }
.sortable:hover { color: #2B6CB0; }
.active-sort { color: #2B6CB0; }

.data-table td {
  padding: 0.75rem 1rem;
  color: #334155;
  border-bottom: 1px solid #F1F5F9;
}

.badge {
  display: inline-block;
  padding: 3px 10px;
  border-radius: 99px;
  font-size: 0.7rem;
  font-weight: 600;
}
.badge-success { background: #D1FAE5; color: #059669; }
.badge-warning { background: #FEF3C7; color: #D97706; }
.badge-error   { background: #FEE2E2; color: #DC2626; }
.badge-info    { background: #DBEAFE; color: #2B6CB0; }
.badge-neutral { background: #F1F5F9; color: #64748B; }

Tabela com Sorting, Badges e Paginação

Código ▴▾ Produto Categoria Estoque Preço Status Ações
#LED-001 Painel Solar 200W Energia Solar 1.240 R$ 489,90 Ativo •••
#LED-042 Luminária Industrial 150W Iluminação 856 R$ 329,00 Ativo •••
#LED-078 Refletor LED 500W IP65 Iluminação Externa 23 R$ 1.249,00 Baixo •••
#LED-103 Fita LED RGB 5m Decoração 0 R$ 89,90 Esgotado •••
#LED-156 Sensor de Presença PIR Automação 3.720 R$ 42,50 Ativo •••
Mostrando 1–5 de 48 itens
« 1 2 3 10 »

Badges de Status

Badges comunicam estados de forma visual e compacta. Use cores semânticas consistentes em toda a aplicação.

Ativo Pendente Esgotado Em Trânsito Rascunho Premium

Variantes de Tabela

Padrão
Hover row, borders sutis. Uso geral para listagens.
Striped
Linhas zebradas para tabelas densas e relatórios.
Compacta
Padding reduzido (0.5rem). Para dashboards com muitos dados.
Card View
Em mobile, cada row vira card com labels. Responsivo.

Diretrizes de Uso

DiretrizDescrição
AlinhamentoTexto à esquerda. Números à direita (para facilitar comparação). Ações centralizadas.
SortingIndicar coluna ativa com cor #2B6CB0. Setas ▴▾ para direção. Uma coluna ordenada por vez.
SeleçãoCheckbox na primeira coluna. Header checkbox seleciona todos. Destacar row selecionada com background: #EFF6FF.
Empty StateQuando sem dados, exibir ilustração + mensagem + CTA. Nunca deixar a tabela vazia sem feedback.
LoadingUsar skeleton rows (5 linhas) com animação pulse enquanto dados carregam.
PaginaçãoExibir "Mostrando X-Y de Z" + controles. Padrão: 10 itens/página. Opções: 10, 25, 50.
ResponsivoDesktop: tabela completa. Tablet: scroll horizontal. Mobile: card view com data-label em cada <td>.
AçõesBotão "•••" abre dropdown com opções (Editar, Duplicar, Excluir). Máximo 4 ações no dropdown.
BadgesSempre usar white-space: nowrap. Texto curto (1 palavra). Se precisar de texto longo, abreviar e usar title para tooltip no hover.

Especificações

PropriedadeValor
Wrapper Border1px solid #E2E8F0, radius 12px
Header Background#F8FAFC
Header FontMontserrat, 0.75rem, 600, uppercase, #64748B
Header Border2px solid #E2E8F0 (bottom)
Cell Padding0.75rem 1rem (padrão) · 0.5rem 0.75rem (compacta)
Cell FontInter, 0.875rem, #334155
Row Border1px solid #F1F5F9
Row Hoverbackground: #F8FAFC
Selected Rowbackground: #EFF6FF
Badge Padding3px 10px, radius 99px, font 0.7rem 600
Pagination Button32px × 32px, radius 8px, border 1px #E2E8F0
Checkbox16px × 16px, accent-color: #2B6CB0
10 — Tabs e Navegação por Abas

Tabs e Navegação por Abas

Tabs organizam conteúdo em painéis alternáveis, permitindo ao usuário navegar entre seções relacionadas sem sair da página. Essenciais para dashboards, configurações e páginas de detalhe de produtos.

Variantes de Tabs

<!-- Tabs Underline (padrão) -->
<div class="tabs-container">
  <nav class="tabs tabs-underline" role="tablist">
    <button class="tab active" role="tab"
            aria-selected="true" aria-controls="panel-1">
      Visão Geral
    </button>
    <button class="tab" role="tab"
            aria-selected="false" aria-controls="panel-2">
      Estoque
    </button>
    <button class="tab" role="tab"
            aria-selected="false" aria-controls="panel-3">
      Histórico
    </button>
    <button class="tab disabled" role="tab"
            aria-disabled="true">
      Relatórios
    </button>
  </nav>
  <div class="tab-panel active" id="panel-1" role="tabpanel">
    <!-- Conteúdo da aba -->
  </div>
</div>

<!-- Tabs Pill -->
<nav class="tabs tabs-pill" role="tablist">
  <button class="tab active">Todos</button>
  <button class="tab">Ativos</button>
  <button class="tab">Inativos</button>
</nav>

<!-- Tabs Boxed -->
<nav class="tabs tabs-boxed" role="tablist">
  <button class="tab active">Mensal</button>
  <button class="tab">Trimestral</button>
  <button class="tab">Anual</button>
</nav>

<!-- Tabs com Ícone + Badge -->
<nav class="tabs tabs-underline" role="tablist">
  <button class="tab active">
    <svg>...</svg> Pedidos
    <span class="tab-badge">12</span>
  </button>
  <button class="tab">
    <svg>...</svg> Devoluções
    <span class="tab-badge">3</span>
  </button>
</nav>
/* Tabs Container */
.tabs-container { width: 100%; }

/* Tabs Nav Base */
.tabs {
  display: flex; gap: 0;
  overflow-x: auto; scrollbar-width: none;
}
.tabs::-webkit-scrollbar { display: none; }

/* Tab Button Base */
.tab {
  display: inline-flex; align-items: center; gap: 0.4rem;
  padding: 0.75rem 1.25rem;
  font-family: 'Montserrat', sans-serif;
  font-size: 0.8rem; font-weight: 600;
  color: #64748B; background: none;
  border: none; cursor: pointer;
  white-space: nowrap; transition: all 0.15s;
  position: relative;
}
.tab:hover { color: #2B6CB0; }
.tab.disabled { opacity: 0.4; cursor: not-allowed; pointer-events: none; }

/* Underline Variant */
.tabs-underline { border-bottom: 2px solid #E2E8F0; }
.tabs-underline .tab { margin-bottom: -2px; border-bottom: 2px solid transparent; }
.tabs-underline .tab.active { color: #2B6CB0; border-bottom-color: #2B6CB0; }

/* Pill Variant */
.tabs-pill { background: #F1F5F9; border-radius: 10px; padding: 4px; gap: 4px; }
.tabs-pill .tab { border-radius: 8px; padding: 0.5rem 1rem; font-size: 0.75rem; }
.tabs-pill .tab.active { background: #FFFFFF; color: #0F172A; box-shadow: 0 1px 3px rgba(0,0,0,0.08); }

/* Boxed Variant */
.tabs-boxed { border: 1.5px solid #E2E8F0; border-radius: 10px; padding: 4px; gap: 0; display: inline-flex; }
.tabs-boxed .tab { border-radius: 8px; padding: 0.5rem 1.25rem; font-size: 0.75rem; }
.tabs-boxed .tab.active { background: #2B6CB0; color: #FFFFFF; }

/* Tab Badge */
.tab-badge {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 20px; height: 20px; border-radius: 99px;
  font-size: 0.65rem; font-weight: 700;
  background: #EFF6FF; color: #2B6CB0; padding: 0 5px;
}
.tab.active .tab-badge { background: #2B6CB0; color: #FFFFFF; }

Underline (Padrão)

Produtos
1.248
Categorias
24
Valor Total
R$ 2.4M

Pill

Boxed

Com Ícone + Badge

Diretrizes de Uso

DiretrizDescrição
Quando UsarPara alternar entre visões do mesmo contexto (ex: abas de um produto). Não usar para navegação entre páginas diferentes — use menu/sidebar.
QuantidadeMínimo 2, máximo 6 tabs. Se precisar de mais, agrupar ou usar dropdown "Mais ▾".
LabelsCurtos (1-2 palavras). Substantivos, não verbos. Capitalização: Title Case.
Underline vs PillUnderline: navegação principal de página. Pill: filtros dentro de uma seção. Boxed: alternância binária/ternária (ex: período).
Estado DisabledOpacidade 0.4, cursor: not-allowed. Usar tooltip para explicar por que está desabilitado.
BadgeContador numérico ao lado do label. Ativo: fundo azul + texto branco. Inativo: fundo claro + texto azul. Máx 3 dígitos.
ARIArole="tablist" no nav, role="tab" nos botões, role="tabpanel" nos painéis. aria-selected e aria-controls.
TecladoSetas ← → navegam entre tabs. Enter/Space ativa. Home/End vai para primeira/última.
MobileScroll horizontal com overflow-x: auto e scrollbar-width: none. Nunca quebrar tabs em múltiplas linhas.

Especificações

PropriedadeUnderlinePillBoxed
Padding0.75rem 1.25rem0.5rem 1rem0.5rem 1.25rem
Font Size0.8rem0.75rem0.75rem
FontMontserrat, weight 600
Cor Inativo#64748B
Cor Ativo#2B6CB0#0F172A#FFFFFF
Indicador AtivoBorder-bottom 2px #2B6CB0Background #FFF + shadowBackground #2B6CB0
ContainerBorder-bottom 2px #E2E8F0Background #F1F5F9, radius 10pxBorder 1.5px #E2E8F0, radius 10px
Gap04px0
Tab RadiusNenhum8px8px
Badge Size20px height, radius 99px, font 0.65rem 700
Transiçãoall 0.15s ease
85 — Grid System & Layout Columns

Grid System & Layout Columns

Sistema de grid responsivo de 12 colunas com gutters, breakpoints e containers — a base estrutural para layouts industriais consistentes em qualquer viewport.

Grid 12 Colunas — Visualização
1
2
3
4
5
6
7
8
9
10
11
12
Combinações comuns
12
6
6
4
4
4
3 (sidebar)
9 (content)
3
6
3
Breakpoints & Container Widths
XS
< 576px
100%
16px
SM
≥ 576px
540px
16px
MD
≥ 768px
720px
24px
LG
≥ 992px
960px
24px
XL
≥ 1200px
1140px
32px
XXL
≥ 1400px
1320px
32px
Device
Breakpoint
Range
Container
Gutter
Layouts Industriais — Exemplos
Dashboard Industrial
Sidebar 3col + Content 9col (KPIs 4+4+4, Chart 8 + Table 4)
Formulário de Cadastro
Container 8col centralizado, inputs 12/6+6/4+4+4
Anatomia — Margin, Gutter, Column
MARGIN
COL
G
COL
G
COL
MARGIN
Margin (padding externo)
Column (área de conteúdo)
Gutter (gap entre colunas)
PropriedadeValorNota
Colunas12Divisível por 2, 3, 4, 6
Gutter XS–SM16pxMobile compact
Gutter MD–LG24pxTablet e desktop
Gutter XL–XXL32pxWidescreen
Container Max1320pxXXL breakpoint
Margin XS16pxPadding horizontal do body
Margin LG+auto (centered)Container centralizado
Sidebar Width3 colunas (268px em LG)Collapsa para icon-only em MD
DO
  • Usar frações do grid (3, 4, 6, 8, 12)
  • Alinhar elementos às linhas do grid
  • Testar layout em todos os breakpoints
  • Colapsar colunas em stack no mobile
  • Manter gutters consistentes por breakpoint
DON'T
  • Usar valores fixos de px para largura
  • Misturar gutters de diferentes breakpoints
  • Colunas de 5 ou 7 (não divide por 12)
  • Ignorar margins em mobile
  • Nesting de grids > 2 níveis
86 — Motion & Animation Tokens

Motion & Animation Tokens

Curvas de easing, durações padronizadas e tipos de transição — garantindo movimento consistente, fluido e com propósito em toda a plataforma SYSLED.

Escala de Duração
Instant
Hover, focus ring
100ms
--duration-instant
Fast
Toggle, tooltip
150ms
--duration-fast
Normal
Dropdown, accordion
200ms
--duration-normal
Slow
Modal, page transition
300ms
--duration-slow
X-Slow
Drawer, complex enter
500ms
--duration-xslow
Curvas de Easing
t
v
Ease Out
Elemento entrando
cubic-bezier(0, 0, 0.2, 1)
Inicia rápido, desacelera no final
t
v
Ease In
Elemento saindo
cubic-bezier(0.4, 0, 1, 1)
Inicia lento, acelera na saída
t
v
Ease In-Out
Transformação / morph
cubic-bezier(0.4, 0, 0.2, 1)
Suave início e fim, rápido no meio
Tipos de Transição
Fade
opacity: 0 → 1
Toast, tooltip, overlay
Scale
scale: 0.95 → 1
Modal, popover, menu
Slide
translateY: 8px → 0
Drawer, dropdown, sheet
Collapse
height: auto → 0
Accordion, expand/collapse
prefers-reduced-motion
Motion: Normal
/* Todas as animações ativas */
.modal {
  transition: opacity 200ms ease-out,
    transform 200ms ease-out;
}
.toast {
  animation: slideUp 300ms ease-out;
}
Motion: Reduced
/* Apenas fade, sem transform */
@media (prefers-reduced-motion) {
  * {
    animation-duration: 0.01ms;
    transition-duration: 0.01ms;
  }
  .modal {
    transition: opacity 100ms;
  }
}
TokenValorUso
--duration-instant100msHover, focus, color change
--duration-fast150msToggle, switch, tooltip show
--duration-normal200msDropdown, accordion, fade
--duration-slow300msModal, page, complex enter
--duration-xslow500msDrawer, full-screen transition
--ease-entercubic-bezier(0, 0, 0.2, 1)Elemento entrando no viewport
--ease-exitcubic-bezier(0.4, 0, 1, 1)Elemento saindo do viewport
--ease-morphcubic-bezier(0.4, 0, 0.2, 1)Transformação no local
--ease-springcubic-bezier(0.34, 1.56, 0.64, 1)Bounce sutil (feedback)
DO
  • Usar ease-out para enter, ease-in para exit
  • Respeitar prefers-reduced-motion
  • Manter durações ≤ 500ms (exceto loading)
  • Animar transform e opacity (GPU-accelerated)
  • Usar tokens, nunca valores hardcoded
DON'T
  • Animar width, height, top, left (layout thrash)
  • Animações > 1s para micro-interactions
  • Bounce excessivo em contexto industrial
  • linear ease para UI (só para progress bars)
  • Ignorar acessibilidade de motion
87 — Accessibility (a11y) Guidelines

Accessibility (a11y) Guidelines

Diretrizes de acessibilidade WCAG 2.1 AA aplicadas ao contexto industrial SYSLED — contraste, navegação por teclado, screen readers, focus management e aria-labels.

Nível de Conformidade — WCAG 2.1
A
Nível A
Obrigatório
Alternativas textuais, navegação por teclado, sem armadilhas de foco
AA
Nível AA
Target SYSLED
Contraste 4.5:1, resize 200%, focus visível, labels associados
AAA
Nível AAA
Aspiracional
Contraste 7:1, sem limites de tempo, linguagem simplificada
Contraste de Cores — Exemplos
Aa
PASS
15.4:1
Aa
PASS
5.9:1
Aa
PASS
5.1:1
Aa
FAIL
1.8:1
Focus Ring — Estados de Foco
Botão
Button :focus-visible
outline 2px + offset 2px
Input
Input :focus
border primary + shadow ring
Link texto
Link :focus-visible
outline 2px + offset 3px
Card item
Card :focus-within
double ring (white + primary)
Navegação por Teclado
Tab
Navegar entre elementos focáveis
Enter
Ativar botão, link ou submeter form
Space
Toggle checkbox, radio, switch
Esc
Fechar modal, dropdown, popover
↑ ↓
Navegar em lista, menu, select
← →
Navegar em tabs, slider, carousel
Home
Primeiro item da lista/slider
End
Último item da lista/slider
ARIA — Atributos Essenciais
/* Botão com ação descrita */
<button aria-label="Fechar modal">
  <svg>...</svg>
</button>

/* Live region para alertas */
<div role="alert" aria-live="assertive">
  OEE caiu para 45% — ação necessária
</div>

/* Toggle com estado */
<button role="switch" aria-checked="true"
  aria-label="Notificações push">
</button>

/* Tabela com caption */
<table aria-label="Equipamentos da Linha 3">
  <thead>...</thead>
</table>
CritérioRequisitoNota
Contraste Texto4.5:1 (normal) / 3:1 (large 18px+)WCAG AA obrigatório
Contraste UI3:1 contra fundo adjacenteÍcones, bordas, focus rings
Focus Ring2px solid + 2px offsetCor primary, visível em light e dark
Touch TargetMínimo 44×44pxWCAG 2.5.5 (hit area, não visual)
Tab OrderSegue DOM order lógicaNunca tabindex > 0
Alt TextObrigatório em <img> informativosDecorativos: alt="" (vazio)
aria-livepolite (toast) / assertive (alerta crítico)Screen reader anuncia mudanças
Heading HierarchySequencial: h1 → h2 → h3Nunca pular níveis
Color IndependenceNão depender só de cor para informaçãoUsar ícone + cor + texto
ZoomFuncional até 200% zoomSem scroll horizontal
DO
  • Usar :focus-visible (não :focus simples)
  • Testar com screen reader (VoiceOver/NVDA)
  • aria-label em botões com apenas ícone
  • role="alert" para notificações críticas
  • Garantir touch target 44×44px mínimo
DON'T
  • outline: none sem alternativa de foco
  • Depender apenas de cor para status
  • tabindex positivo (usar 0 ou -1)
  • Texto em imagens (usar HTML real)
  • Auto-play de mídia sem controle
88 — Internationalization (i18n) Patterns

Internationalization (i18n) Patterns

Padrões para suportar múltiplos idiomas e regiões na plataforma SYSLED — RTL, pluralização, formatação de datas/números/moedas, truncamento e adaptação de layouts.

Formatação por Locale
Formato
🇧🇷 pt-BR
🇺🇸 en-US
🇩🇪 de-DE
🇸🇦 ar-SA
Número
1.234.567,89
1,234,567.89
1.234.567,89
١٬٢٣٤٬٥٦٧٫٨٩
Moeda
R$ 1.234,56
$1,234.56
1.234,56 €
١٬٢٣٤٫٥٦ ر.س
Data
08/03/2026
03/08/2026
08.03.2026
٠٨/٠٣/٢٠٢٦
Hora
14:30
2:30 PM
14:30
٢:٣٠ م
Temperatura
23,5 °C
74.3 °F
23,5 °C
٢٣٫٥ °م
LTR vs RTL — Espelhamento de Layout
LTR (Left-to-Right)
Alerta de produção
Linha 3 — OEE abaixo de 80%
RTL (Right-to-Left)
تنبيه الإنتاج
الخط ٣ — كفاءة أقل من ٨٠٪
Expansão de Texto por Idioma
EN
Save Changes
100%
PT
Salvar Alterações
+30%
DE
Änderungen speichern
+65%
FR
Enregistrer les modifications
+80%
Regra: sempre projetar botões e labels com +50% de espaço disponível para expansão de texto.
Pluralização — ICU Message Format
// ICU Message Format
{count, plural,
  =0    {Nenhum equipamento encontrado}
  one   {{count} equipamento encontrado}
  other {{count} equipamentos encontrados}
}

// Resultado:
0"Nenhum equipamento encontrado"
1"1 equipamento encontrado"
5"5 equipamentos encontrados"

// Data relativa
{time, relative}
→ "há 2 minutos" | "2 minutes ago" | "vor 2 Minuten"
AspectoRegraNota
NúmeroUsar Intl.NumberFormat(locale)Separadores variam por região
MoedaSímbolo + posição via Intl.NumberFormatR$ antes, € depois (DE)
DataIntl.DateTimeFormat(locale)DD/MM (BR) vs MM/DD (US)
Hora24h (BR, DE) vs 12h AM/PM (US)Configurável por preferência
PluralizaçãoICU Message FormatRegras variam: árabe tem 6 formas
Text ExpansionReservar +50% de espaçoDE e FR expandem significativamente
RTLdir="rtl" + CSS logical propsmargin-inline-start ao invés de margin-left
ÍconesEspelhar setas e chevrons em RTLNão espelhar: relógio, check, play
Unidades°C (métrico) / °F (imperial)Configurável por tenant
DO
  • Usar Intl APIs nativas do JS
  • CSS logical properties (inline-start/end)
  • Projetar com +50% de espaço para texto
  • Externalizar todas as strings em arquivos i18n
  • Testar UI com pseudo-locale (XXXXXX)
DON'T
  • Concatenar strings ("Olá " + nome)
  • Hardcodar formatos de data/número
  • Assumir que texto cabe em width fixo
  • Usar margin-left/right (usar inline)
  • Ignorar pluralização (!=1 não basta)
Parte 2 — Componentes