Voltar ao Hub
Parte 2 de 4 — Design System

UX/UI — Componentes

Loading states, tooltips, breadcrumbs, stepper, animações, patterns de layout, empty states, inputs avançados, dark mode, data visualization e mais.

25
Seções
11–30, 77, 89–92
Capítulos
Intermediário
Nível
← Parte 1 Fundamentos Parte 3 → Patterns Parte 4 → Referência
11 — Loading e Skeleton States

Loading e Skeleton States

Estados de carregamento mantêm o usuário informado enquanto dados são processados. Skeletons preservam o layout, spinners indicam processamento, e botões com loading previnem cliques duplicados.

Skeleton Screens

<!-- Skeleton Card -->
<div class="skeleton-card">
  <div class="skel" style="height: 12px; width: 40%;"></div>
  <div class="skel" style="height: 24px; width: 60%; margin-top: 8px;"></div>
  <div class="skel" style="height: 12px; width: 100%; margin-top: 16px;"></div>
  <div class="skel" style="height: 12px; width: 80%; margin-top: 6px;"></div>
  <div class="skel" style="height: 36px; width: 120px; margin-top: 16px; border-radius: 8px;"></div>
</div>

<!-- Skeleton Table Row -->
<tr class="skeleton-row">
  <td><div class="skel" style="height: 16px; width: 16px; border-radius: 4px;"></div></td>
  <td><div class="skel" style="height: 14px; width: 70px;"></div></td>
  <td><div class="skel" style="height: 14px; width: 150px;"></div></td>
  <td><div class="skel" style="height: 14px; width: 90px;"></div></td>
  <td><div class="skel" style="height: 22px; width: 60px; border-radius: 99px;"></div></td>
</tr>

<!-- Spinner -->
<div class="spinner" role="status" aria-label="Carregando">
  <div class="spinner-ring"></div>
</div>

<!-- Button Loading -->
<button class="btn-primary btn-loading" disabled>
  <span class="btn-spinner"></span>
  Salvando...
</button>

<!-- Progress Bar -->
<div class="progress-track">
  <div class="progress-fill" style="width: 65%;"></div>
</div>
/* Skeleton Base */
.skel {
  background: linear-gradient(90deg,
    #E2E8F0 25%, #EDF2F7 50%, #E2E8F0 75%);
  background-size: 200% 100%;
  animation: skeletonShimmer 1.5s ease infinite;
  border-radius: 6px;
}
@keyframes skeletonShimmer {
  0%   { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}

/* Skeleton Card Container */
.skeleton-card {
  padding: 24px;
  border: 1px solid #E2E8F0;
  border-radius: 16px;
  background: #FFFFFF;
}

/* Spinner */
.spinner-ring {
  width: 32px; height: 32px;
  border: 3px solid #E2E8F0;
  border-top-color: #2B6CB0;
  border-radius: 50%;
  animation: spinnerRotate 0.7s linear infinite;
}
@keyframes spinnerRotate {
  to { transform: rotate(360deg); }
}

/* Tamanhos de Spinner */
.spinner-sm .spinner-ring { width: 16px; height: 16px; border-width: 2px; }
.spinner-md .spinner-ring { width: 32px; height: 32px; border-width: 3px; }
.spinner-lg .spinner-ring { width: 48px; height: 48px; border-width: 4px; }

/* Button Loading */
.btn-loading {
  position: relative;
  opacity: 0.8;
  pointer-events: none;
}
.btn-spinner {
  display: inline-block;
  width: 14px; height: 14px;
  border: 2px solid rgba(255,255,255,0.3);
  border-top-color: #FFFFFF;
  border-radius: 50%;
  animation: spinnerRotate 0.6s linear infinite;
  margin-right: 6px;
  vertical-align: middle;
}

/* Progress Bar */
.progress-track {
  width: 100%;
  height: 6px;
  background: #E2E8F0;
  border-radius: 99px;
  overflow: hidden;
}
.progress-fill {
  height: 100%;
  background: linear-gradient(90deg, #2B6CB0, #3A8FD6);
  border-radius: 99px;
  transition: width 0.3s ease;
}

/* Dark Mode */
[data-theme="dark"] .skel {
  background: linear-gradient(90deg,
    #2D3748 25%, #4A5568 50%, #2D3748 75%);
  background-size: 200% 100%;
}
[data-theme="dark"] .spinner-ring {
  border-color: #4A5568;
  border-top-color: #3A8FD6;
}
[data-theme="dark"] .progress-track {
  background: #2D3748;
}

Skeleton Cards

Skeleton Table Rows

Código Produto Categoria Estoque Status

Spinners

Tamanhos

SM · 16px
MD · 32px
LG · 48px
XL · 64px

Botões com Loading

Progress Bars

Importando produtos...25%
Sincronizando estoque...65%
Upload concluído!100%
Processando... (indeterminado)

Diretrizes de Uso

DiretrizDescrição
Skeleton vs SpinnerUsar skeleton quando o layout final é conhecido (cards, tabelas, listas). Usar spinner para ações pontuais (submit, processar).
Shimmer DirectionAnimação shimmer sempre da esquerda para direita. Duração: 1.5s, easing: ease, loop infinito.
Skeleton ShapesRespeitar a forma do conteúdo final: retângulos para texto, círculos para avatares, retângulos arredondados para badges/botões.
Button LoadingDesabilitar o botão (pointer-events: none), exibir spinner inline + texto "Salvando...", opacidade 0.8.
Progress BarDeterminada: exibir porcentagem. Indeterminada: animação loop. Concluída: trocar cor para #059669 (success).
Duração< 1s: nenhum indicador. 1-3s: spinner. > 3s: skeleton ou progress bar. > 10s: progress bar com estimativa.
ARIASpinners: role="status" + aria-label="Carregando". Progress: role="progressbar" + aria-valuenow.
Dark ModeSkeleton usa #2D3748#4A5568. Spinner track: #4A5568. Progress track: #2D3748.

Especificações

ComponentePropriedadeValor
SkeletonBackground#E2E8F0#EDF2F7 (gradient shimmer)
Animation1.5s ease infinite
Border Radius6px (texto), 8px (botão), 50% (avatar), 99px (badge)
SpinnerBorderTrack: #E2E8F0, Active: #2B6CB0
SizesSM: 16px/2px · MD: 32px/3px · LG: 48px/4px · XL: 64px/4px
Animationrotate 0.7s linear infinite
Button Spinner14px/2px, track rgba(255,255,255,0.3)
ProgressTrackHeight 6px, bg #E2E8F0, radius 99px
Filllinear-gradient(90deg, #2B6CB0, #3A8FD6)
CompleteFill: #059669
12 — Tooltips, Popovers e Dropdowns

Tooltips, Popovers e Dropdowns

Componentes flutuantes exibem informações contextuais sem sair da tela atual. Tooltips são rápidos e textuais, popovers trazem conteúdo rico, e dropdowns listam ações ou opções.

Tooltips

<!-- Tooltip (CSS-only, sem JS) -->
<span class="tooltip-wrapper">
  <button class="btn-icon" aria-describedby="tip1">
    <svg>...</svg>
  </button>
  <span class="tooltip tooltip-top" id="tip1"
        role="tooltip">Editar produto</span>
</span>

<!-- Posições: tooltip-top | tooltip-bottom
               tooltip-left | tooltip-right -->

<!-- Popover (click) -->
<div class="popover-wrapper">
  <button class="btn-secondary-sm"
          onclick="this.parentElement.classList.toggle('open')">
    Mais info
  </button>
  <div class="popover popover-bottom">
    <div class="popover-header">Detalhes do Produto</div>
    <div class="popover-body">
      <p>SKU: LED-001</p>
      <p>Última atualização: 05/03/2026</p>
    </div>
  </div>
</div>

<!-- Dropdown Menu -->
<div class="dropdown-wrapper">
  <button class="btn-icon"
          onclick="this.parentElement.classList.toggle('open')">
    •••
  </button>
  <div class="dropdown-menu">
    <button class="dropdown-item">
      <svg>...</svg> Editar
    </button>
    <button class="dropdown-item">
      <svg>...</svg> Duplicar
    </button>
    <div class="dropdown-divider"></div>
    <button class="dropdown-item dropdown-danger">
      <svg>...</svg> Excluir
    </button>
  </div>
</div>
/* ============ TOOLTIP ============ */
.tooltip-wrapper {
  position: relative;
  display: inline-flex;
}
.tooltip {
  position: absolute;
  padding: 6px 12px;
  background: #0F172A;
  color: #FFFFFF;
  font-family: 'Inter', sans-serif;
  font-size: 0.75rem;
  font-weight: 500;
  border-radius: 8px;
  white-space: nowrap;
  pointer-events: none;
  opacity: 0;
  transform: translateY(4px);
  transition: opacity 0.15s, transform 0.15s;
  z-index: 200;
}

/* Posições */
.tooltip-top    { bottom: calc(100% + 8px); left: 50%; transform: translateX(-50%) translateY(4px); }
.tooltip-bottom { top: calc(100% + 8px); left: 50%; transform: translateX(-50%) translateY(-4px); }
.tooltip-left   { right: calc(100% + 8px); top: 50%; transform: translateY(-50%) translateX(4px); }
.tooltip-right  { left: calc(100% + 8px); top: 50%; transform: translateY(-50%) translateX(-4px); }

/* Show on hover */
.tooltip-wrapper:hover .tooltip,
.tooltip-wrapper:focus-within .tooltip {
  opacity: 1;
  transform: translateX(-50%) translateY(0);
}
.tooltip-wrapper:hover .tooltip-left,
.tooltip-wrapper:focus-within .tooltip-left {
  transform: translateY(-50%) translateX(0);
}
.tooltip-wrapper:hover .tooltip-right,
.tooltip-wrapper:focus-within .tooltip-right {
  transform: translateY(-50%) translateX(0);
}

/* Arrow (optional) */
.tooltip::after {
  content: '';
  position: absolute;
  border: 5px solid transparent;
}
.tooltip-top::after {
  top: 100%; left: 50%;
  transform: translateX(-50%);
  border-top-color: #0F172A;
}
.tooltip-bottom::after {
  bottom: 100%; left: 50%;
  transform: translateX(-50%);
  border-bottom-color: #0F172A;
}

/* ============ POPOVER ============ */
.popover-wrapper {
  position: relative;
  display: inline-flex;
}
.popover {
  position: absolute;
  min-width: 240px;
  background: #FFFFFF;
  border: 1px solid #E2E8F0;
  border-radius: 12px;
  box-shadow: 0 4px 20px rgba(0,0,0,0.12);
  opacity: 0;
  visibility: hidden;
  transform: translateY(4px);
  transition: all 0.2s ease;
  z-index: 100;
}
.popover-wrapper.open .popover {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}
.popover-bottom { top: calc(100% + 8px); left: 0; }
.popover-top    { bottom: calc(100% + 8px); left: 0; }

.popover-header {
  padding: 0.75rem 1rem;
  font-family: 'Montserrat', sans-serif;
  font-size: 0.8rem;
  font-weight: 700;
  color: #0F172A;
  border-bottom: 1px solid #F1F5F9;
}
.popover-body {
  padding: 0.75rem 1rem;
  font-family: 'Inter', sans-serif;
  font-size: 0.8rem;
  color: #475569;
}

/* ============ DROPDOWN ============ */
.dropdown-wrapper {
  position: relative;
  display: inline-flex;
}
.dropdown-menu {
  position: absolute;
  top: calc(100% + 6px);
  right: 0;
  min-width: 180px;
  background: #FFFFFF;
  border: 1px solid #E2E8F0;
  border-radius: 10px;
  box-shadow: 0 4px 20px rgba(0,0,0,0.12);
  padding: 4px;
  opacity: 0;
  visibility: hidden;
  transform: translateY(-4px);
  transition: all 0.15s ease;
  z-index: 100;
}
.dropdown-wrapper.open .dropdown-menu {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}
.dropdown-item {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  width: 100%;
  padding: 0.5rem 0.75rem;
  font-family: 'Inter', sans-serif;
  font-size: 0.8rem;
  color: #334155;
  background: none;
  border: none;
  border-radius: 6px;
  cursor: pointer;
  transition: background 0.1s;
}
.dropdown-item:hover { background: #F8FAFC; }
.dropdown-item svg { width: 16px; height: 16px; color: #64748B; }
.dropdown-danger { color: #DC2626; }
.dropdown-danger:hover { background: #FEF2F2; }
.dropdown-danger svg { color: #DC2626; }
.dropdown-divider {
  height: 1px;
  background: #F1F5F9;
  margin: 4px 0;
}

Tooltips (hover nos ícones)

Editar produto Excluir item Buscar Configurações
Top Bottom Left Right

Popover

Exibem conteúdo rico ao clicar. Diferente do tooltip, o popover tem header, body e pode conter links e botões.

Dropdown Menu

Listam ações contextuais. Abrem ao clicar e fecham ao selecionar uma opção ou clicar fora.

Diretrizes de Uso

DiretrizDescrição
Tooltip vs PopoverTooltip: texto curto, trigger hover, sem interação. Popover: conteúdo rico, trigger click, permite links e botões.
Tooltip TextoMáximo 1 linha, ~60 caracteres. Sem HTML, sem links. Capitalização: sentence case.
DelayTooltip: aparecer após 200ms de hover, desaparecer após 100ms. Evitar flash em movimentos rápidos do mouse.
PosiçãoPadrão: top. Auto-flip se sair da viewport. Manter 8px de gap entre trigger e flutuante.
Dropdown FecharFechar ao: clicar em um item, clicar fora, pressionar Escape. Não fechar ao scroll.
Dropdown AçõesMáximo 6 itens. Agrupar com dividers. Ação destrutiva (excluir) sempre por último, em vermelho.
ARIATooltip: role="tooltip" + aria-describedby. Dropdown: aria-expanded + aria-haspopup.
MobileTooltips não funcionam com touch — usar long-press ou substituir por label. Dropdowns: bottom sheet em mobile.

Especificações

PropriedadeTooltipPopoverDropdown
Background#0F172A#FFFFFF#FFFFFF
BorderNenhum1px #E2E8F01px #E2E8F0
Radius8px12px10px
ShadowNenhum0 4px 20px rgba(0,0,0,0.12)0 4px 20px rgba(0,0,0,0.12)
Padding6px 12px0.75rem 1rem4px (container)
FontInter, 0.75rem, 500Inter, 0.8remInter, 0.8rem
Min WidthAuto240px180px
Gap (trigger)8px8px6px
Z-Index200 (--z-tooltip)100 (--z-dropdown)100 (--z-dropdown)
Animationopacity + translate 0.15sopacity + translate 0.2sopacity + translate 0.15s
TriggerHover / FocusClickClick
ArrowSim (5px border)OpcionalNão
14 — Stepper / Wizard

Stepper / Wizard

Steppers guiam o usuário por fluxos de múltiplas etapas como cadastros, configurações e processos de importação. Cada etapa mostra o progresso e permite navegação controlada entre fases.

Stepper Horizontal

<!-- Stepper Horizontal -->
<nav class="stepper" aria-label="Progresso do cadastro">
  <ol>
    <li class="step step-complete">
      <div class="step-indicator">
        <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3">
          <polyline points="20 6 9 17 4 12"/>
        </svg>
      </div>
      <div class="step-content">
        <span class="step-title">Dados Básicos</span>
        <span class="step-desc">Nome, categoria</span>
      </div>
    </li>
    <li class="step step-active">
      <div class="step-indicator">2</div>
      <div class="step-content">
        <span class="step-title">Especificações</span>
        <span class="step-desc">Dimensões, peso</span>
      </div>
    </li>
    <li class="step step-pending">
      <div class="step-indicator">3</div>
      <div class="step-content">
        <span class="step-title">Preço e Estoque</span>
      </div>
    </li>
    <li class="step step-pending">
      <div class="step-indicator">4</div>
      <div class="step-content">
        <span class="step-title">Revisão</span>
      </div>
    </li>
  </ol>
</nav>

<!-- Stepper Vertical -->
<nav class="stepper stepper-vertical">
  <ol>
    <li class="step step-complete">...</li>
    <li class="step step-active">...</li>
    <li class="step step-error">
      <div class="step-indicator">!</div>
      <div class="step-content">
        <span class="step-title">Validação</span>
        <span class="step-desc step-error-msg">Campo obrigatório</span>
      </div>
    </li>
    <li class="step step-pending">...</li>
  </ol>
</nav>
/* Stepper Horizontal */
.stepper ol {
  display: flex;
  align-items: flex-start;
  list-style: none;
  padding: 0;
  margin: 0;
  counter-reset: step;
}
.step {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  position: relative;
  text-align: center;
}

/* Connector line */
.step + .step::before {
  content: '';
  position: absolute;
  top: 18px;
  right: 50%;
  width: 100%;
  height: 2px;
  background: #E2E8F0;
  z-index: 0;
}
.step-complete + .step::before,
.step-complete + .step-active::before {
  background: #2B6CB0;
}

/* Step Indicator (circle) */
.step-indicator {
  width: 36px; height: 36px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: 'Montserrat', sans-serif;
  font-size: 0.8rem;
  font-weight: 700;
  position: relative;
  z-index: 1;
  transition: all 0.2s;
}
.step-indicator svg {
  width: 16px; height: 16px;
}

/* States */
.step-complete .step-indicator {
  background: #2B6CB0;
  color: #FFFFFF;
}
.step-active .step-indicator {
  background: #FFFFFF;
  color: #2B6CB0;
  border: 2px solid #2B6CB0;
  box-shadow: 0 0 0 4px rgba(43,108,176,0.15);
}
.step-pending .step-indicator {
  background: #F1F5F9;
  color: #94A3B8;
  border: 2px solid #E2E8F0;
}
.step-error .step-indicator {
  background: #FEE2E2;
  color: #DC2626;
  border: 2px solid #DC2626;
}

/* Step Content */
.step-content { margin-top: 0.75rem; }
.step-title {
  display: block;
  font-family: 'Montserrat', sans-serif;
  font-size: 0.75rem;
  font-weight: 600;
  color: #334155;
}
.step-active .step-title { color: #2B6CB0; }
.step-pending .step-title { color: #94A3B8; }
.step-error .step-title { color: #DC2626; }
.step-desc {
  display: block;
  font-family: 'Inter', sans-serif;
  font-size: 0.7rem;
  color: #94A3B8;
  margin-top: 2px;
}
.step-error-msg { color: #DC2626; }

/* Stepper Vertical */
.stepper-vertical ol { flex-direction: column; gap: 0; }
.stepper-vertical .step {
  flex-direction: row;
  align-items: flex-start;
  text-align: left;
  padding-left: 0;
  min-height: 72px;
}
.stepper-vertical .step + .step::before {
  top: 0; left: 17px; right: auto;
  width: 2px; height: 100%;
}
.stepper-vertical .step-content {
  margin-top: 0; margin-left: 1rem; padding-top: 6px;
}

/* Responsive */
@media (max-width: 640px) {
  .stepper:not(.stepper-vertical) .step-content { display: none; }
  .stepper:not(.stepper-vertical) .step-active .step-content { display: block; }
}

Horizontal — Cadastro de Produto

Vertical — Importação de Dados

Minimal (Dots) — Onboarding

Passo 3 de 5
Configurar notificações

Barra de Ações do Step

Diretrizes de Uso

DiretrizDescrição
Quando UsarProcessos com 3-7 etapas sequenciais. Para > 7 etapas, agrupar em fases. Para 2 etapas, usar apenas botões Voltar/Próximo.
Horizontal vs VerticalHorizontal: até 5 etapas, desktop. Vertical: > 5 etapas ou quando há descrições longas. Dots: onboarding simples.
NavegaçãoPermitir voltar para steps completos (clicáveis). Não permitir pular para steps futuros pendentes.
Estado de ErroIndicador vermelho com "!" no step. Mensagem de erro na descrição. Bloquear avanço até resolver.
Barra de AçõesFixa no rodapé: "Voltar" (esquerda), "Salvar Rascunho" + "Próximo" (direita). Último step: "Concluir" ou "Enviar".
PersistênciaSalvar dados parciais ao sair. Ao retornar, restaurar o último step ativo com dados preenchidos.
ARIAaria-label no nav, aria-current="step" no ativo. Steps completos: aria-label="Concluído".
MobileHorizontal: ocultar labels dos steps pendentes, mostrar apenas o ativo. Ou converter para variante dots com label abaixo.

Especificações

PropriedadeValor
Indicator Size36px × 36px, border-radius 50%
Indicator FontMontserrat, 0.8rem, weight 700
Check IconSVG 16px, stroke-width 3
Connector Line2px height (h) / width (v)
CompleteIndicator: bg #2B6CB0, cor #FFFFFF. Line: #2B6CB0
ActiveIndicator: bg #FFFFFF, border 2px #2B6CB0, shadow 0 0 0 4px rgba(43,108,176,0.15)
PendingIndicator: bg #F1F5F9, border 2px #E2E8F0, cor #94A3B8
ErrorIndicator: bg #FEE2E2, border 2px #DC2626, cor #DC2626
Title FontMontserrat, 0.75rem, weight 600
Description FontInter, 0.7rem, cor #94A3B8
Dots SizeNormal: 10px, Active: 12px + border + shadow
Transitionall 0.2s ease
15 — Animações e Micro-interações

Animações e Micro-interações

Animações comunicam mudanças de estado, guiam a atenção e tornam a interface mais fluida. Devem ser sutis, rápidas e com propósito — nunca decorativas. Todas as animações respeitam prefers-reduced-motion para acessibilidade.

Tokens de Motion

<!-- Aplicando tokens de motion -->
<button class="btn-primary"
  style="transition: all var(--duration-normal) var(--ease-out);">
  Salvar
</button>

<!-- Animação de entrada -->
<div class="animate-fade-in">Conteúdo</div>
<div class="animate-slide-up">Conteúdo</div>
<div class="animate-scale-in">Conteúdo</div>

<!-- Staggered animation (delay escalonado) -->
<div class="animate-slide-up" style="--delay: 0ms">Item 1</div>
<div class="animate-slide-up" style="--delay: 50ms">Item 2</div>
<div class="animate-slide-up" style="--delay: 100ms">Item 3</div>
/* ============ MOTION TOKENS ============ */
:root {
  --duration-instant: 100ms;
  --duration-fast:    150ms;
  --duration-normal:  250ms;
  --duration-slow:    350ms;
  --duration-slower:  500ms;

  --ease-in:      cubic-bezier(0.4, 0, 1, 1);
  --ease-out:     cubic-bezier(0, 0, 0.2, 1);
  --ease-in-out:  cubic-bezier(0.4, 0, 0.2, 1);
  --ease-spring:  cubic-bezier(0.34, 1.56, 0.64, 1);
}

/* ============ ENTRADA (APPEAR) ============ */
@keyframes fadeIn {
  from { opacity: 0; }
  to   { opacity: 1; }
}
@keyframes slideUp {
  from { opacity: 0; transform: translateY(16px); }
  to   { opacity: 1; transform: translateY(0); }
}
@keyframes slideDown {
  from { opacity: 0; transform: translateY(-16px); }
  to   { opacity: 1; transform: translateY(0); }
}
@keyframes slideLeft {
  from { opacity: 0; transform: translateX(16px); }
  to   { opacity: 1; transform: translateX(0); }
}
@keyframes scaleIn {
  from { opacity: 0; transform: scale(0.95); }
  to   { opacity: 1; transform: scale(1); }
}

/* Classes utilitárias */
.animate-fade-in  { animation: fadeIn var(--duration-normal) var(--ease-out) var(--delay, 0ms) both; }
.animate-slide-up { animation: slideUp var(--duration-normal) var(--ease-out) var(--delay, 0ms) both; }
.animate-slide-down { animation: slideDown var(--duration-normal) var(--ease-out) var(--delay, 0ms) both; }
.animate-scale-in { animation: scaleIn var(--duration-fast) var(--ease-spring) var(--delay, 0ms) both; }

/* ============ HOVER EFFECTS ============ */
.hover-lift {
  transition: transform var(--duration-normal) var(--ease-out),
              box-shadow var(--duration-normal) var(--ease-out);
}
.hover-lift:hover {
  transform: translateY(-2px);
  box-shadow: 0 8px 32px rgba(0,0,0,0.08);
}

.hover-glow {
  transition: box-shadow var(--duration-fast) var(--ease-out);
}
.hover-glow:hover {
  box-shadow: 0 0 0 4px rgba(43,108,176,0.15);
}

.hover-scale {
  transition: transform var(--duration-instant) var(--ease-spring);
}
.hover-scale:hover {
  transform: scale(1.05);
}

/* ============ FOCUS RING ============ */
.focus-ring:focus-visible {
  outline: none;
  box-shadow: 0 0 0 3px rgba(58,143,214,0.3);
  transition: box-shadow var(--duration-instant) var(--ease-out);
}

/* ============ REDUCED MOTION ============ */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}

Escala de Duração

Instant
100ms
Hover, focus
Fast
150ms
Tooltips, toggles
Normal
250ms
Modais, dropdowns
Slow
350ms
Page transitions
Slower
500ms
Complex anim.

Easing Curves

ease-out
cubic-bezier(0, 0, 0.2, 1)
Padrão. Entrada rápida, desaceleração suave.
ease-in
cubic-bezier(0.4, 0, 1, 1)
Aceleração gradual. Saída de elementos.
ease-in-out
cubic-bezier(0.4, 0, 0.2, 1)
Suave nos dois extremos. Expand/collapse.
spring
cubic-bezier(0.34, 1.56, 0.64, 1)
Efeito "bounce" sutil. Modais, popovers.

Hover Effects (interaja com os cards)

Lift
translateY(-2px) + shadow
Cards, rows
Glow
box-shadow ring 4px
Botões primários
Scale
scale(1.05) spring
Ícones, avatares
Color
bg + border transition
Links, nav items

Animações de Entrada (clique para replay)

Fade In
opacity 0→1
Slide Up
translateY(16px→0)
Scale In
scale(0.95→1)
Slide Down
translateY(-16px→0)

Focus Ring

Ring visível ao navegar com teclado (Tab). Usa :focus-visible para não aparecer em cliques.

Input com Focus
Link com Focus

Diretrizes de Uso

DiretrizDescrição
PropósitoToda animação deve ter um motivo: feedback, orientação ou continuidade. Se remover a animação e nada se perde, ela é desnecessária.
Duração MáxInterfaces: máx 500ms. Hover: 100-150ms. Modais/pages: 250-350ms. Usuários percebem > 400ms como lento.
Easing PadrãoUsar ease-out para entradas (elemento aparecendo), ease-in para saídas. linear apenas para spinners.
StaggerPara listas/grids, atrasar cada item em 50ms. Máximo 10 items com stagger, depois aparecer junto.
Reduced MotionObrigatório: @media (prefers-reduced-motion: reduce) desativa todas as animações.
PerformanceAnimar apenas transform e opacity (GPU-accelerated). Evitar animar width, height, top, left, margin.
ConsistênciaMesma ação = mesma animação em toda a aplicação. Modal sempre fadeIn + scaleIn. Dropdown sempre slideDown.
MobileReduzir duração em 20% em mobile. Desativar hover effects. Preferir animações mais curtas.

Mapa de Animações por Componente

ComponenteAnimaçãoDuraçãoEasing
Botão (hover)background + shadow150msease-out
Botão (focus)box-shadow ring100msease-out
Card (hover)translateY(-2px) + shadow250msease-out
Tooltipopacity + translateY150msease-out
Dropdownopacity + translateY150msease-out
Modal (overlay)fadeIn200msease
Modal (container)scaleIn + fadeIn250msspring
ToastslideLeft (from right)300msease-out
Page transitionfadeIn + slideUp350msease-out
Skeletonshimmer gradient1500msease (loop)
Spinnerrotate700mslinear (loop)
16 — Patterns de Layout

Patterns de Layout

Patterns são composições recorrentes de componentes que formam páginas completas. Definem a estrutura visual de dashboards, listagens, detalhes e configurações — garantindo consistência entre módulos.

Dashboard

Visão geral com métricas, gráficos e ações rápidas. Layout: sidebar fixa + header + grid de cards.

Dashboard
Visão geral do sistema
Últimos 30 dias ▾
+ Novo
Produtos
1.248
↑ 12%
Pedidos
384
↑ 8%
Receita
R$ 2.4M
↑ 23%
Alertas
7
↑ 3 novos
Vendas por Mês
Atividade Recente
Pedido #1234 confirmado
2min
Estoque baixo: LED 500W
15min
Novo produto cadastrado
1h

Master-Detail (Lista-Detalhe)

Lista à esquerda, detalhe à direita. Para catálogos, e-mails, mensagens e gestão de pedidos.

🔍 Buscar pedidos...
#PED-1234 Confirmado
João Silva · R$ 2.450,00
Há 2 minutos
#PED-1233 Pendente
Maria Souza · R$ 890,00
Há 15 minutos
#PED-1232 Enviado
Carlos Lima · R$ 5.120,00
Há 1 hora
Pedido #PED-1234
07/03/2026 · João Silva
Confirmado
Total
R$ 2.450,00
Itens
3 produtos
Painel Solar 200W ×2
R$ 979,80
Sensor PIR ×10
R$ 425,00

Página de Configurações

Tabs laterais ou superiores com formulários agrupados por categoria.

Configurações
Perfil
Notificações
Segurança
Integrações
Faturamento
Perfil da Empresa
Informações básicas da conta
Sysled Iluminação
contato@sysled.com.br
Salvar
Cancelar

Catálogo de Patterns

Dashboard
Sidebar + header + metric cards + charts + activity feed.
Master-Detail
Lista à esquerda + painel de detalhe à direita.
Configurações
Nav lateral + formulários por seção.
Listagem + Filtros
Search bar + filtros + tabela/grid + paginação.
Página de Detalhe
Breadcrumb + header + tabs + sidebar info.
Wizard / Onboarding
Stepper + formulário por etapa + barra de ações.

Diretrizes de Composição

DiretrizDescrição
Hierarquia VisualMétricas principais no topo (cards). Conteúdo detalhado no centro. Ações secundárias na sidebar ou footer.
SidebarDesktop: fixa, 240-280px expandida ou 56-64px colapsada (ícones). Mobile: drawer com overlay.
HeaderAltura: 56-64px. Contém: título da página, breadcrumb, ações primárias (botões). Sticky em scroll.
Content AreaMax-width: 1200px. Padding: 24-32px. Background: #F8FAFC.
Master-DetailLista: 280-320px fixa. Detalhe: flex. Em mobile: tela cheia alternando entre lista e detalhe.
ConfiguraçõesNav lateral: 180-220px. Conteúdo: max-width 600px para formulários.
Empty StateToda listagem deve ter empty state com ilustração + mensagem + CTA. Nunca exibir página vazia.
ResponsivoDashboard: cards empilham em 1-2 colunas. Master-Detail: stack vertical. Settings: nav vira tabs.

Especificações de Estrutura

ElementoDesktopTabletMobile
Sidebar240px fixa / 56px colapsada56px íconesDrawer overlay
Header64px sticky56px sticky56px sticky
Content Padding32px24px16px
Content Max Width1200px100%100%
Card Grid3-4 colunas2 colunas1 coluna
Master List280-320px fixa240pxTela cheia
Settings Nav180px lateralTabs superioresTabs superiores
Metric Cards4 em linha2 em linha1 por linha (stack)
17 — Empty States e Feedback Visual

Empty States e Feedback Visual

Empty states comunicam quando não há dados para exibir e guiam o próximo passo. Telas de erro informam problemas. Ambos devem ser visuais, claros e conter uma ação.

Empty States

Nenhum produto encontrado
Tente ajustar os filtros ou cadastre um novo produto.
Comece por aqui
Importe seu catálogo ou cadastre produtos manualmente.

Telas de Erro

404
Página não encontrada
O link pode estar incorreto ou a página foi removida.
500
Erro no servidor
Estamos trabalhando na correção. Tente novamente em instantes.
Sem conexão
Verifique sua internet e tente novamente.
DiretrizDescrição
EstruturaÍcone SVG outline + título + descrição (1-2 linhas) + CTA primário. Centralizado verticalmente.
TomEmpático e construtivo. Nunca culpar o usuário. Sugerir próximo passo concreto.
CTASempre incluir pelo menos 1 ação. Primeiro uso: 2 opções (importar ou manual). Busca vazia: "Limpar filtros".
IlustraçõesSVGs outline (Lucide/Heroicons) com stroke #94A3B8. Tamanho 48px.
18 — Inputs Avançados

Inputs Avançados

Componentes de formulário além do básico: toggles, file upload com drag & drop, date picker, search autocomplete e inputs com máscara.

Toggle Switch

Notificações por e-mail
Receber alertas de estoque baixo
Modo escuro
Alternar tema da interface
Autenticação 2FA
Requer plano Premium

File Upload (Drag & Drop)

📁
Arraste o arquivo ou clique para selecionar
CSV, XLSX ou PDF · Máx 10MB
CSV
produtos_estoque_marco_2026.csv
248 KB · Enviado
×

Search Autocomplete

Painel Sol |
Painel Solar 200W Ativo
Painel Solar 400W Ativo
Painel Solar 100W Mini Esgotado
ComponenteSpecs
ToggleTrack: 44×24px, radius 99px. Thumb: 20×20px. On: bg #2B6CB0. Off: bg #E2E8F0. Transition: 150ms.
File UploadBorder: 2px dashed #CBD5E1. Hover: border #2B6CB0, bg #EFF6FF. Radius: 12px.
AutocompleteInput padrão + dropdown de resultados. Highlight do match em <strong>. Debounce: 300ms.
DisabledOpacidade 0.5, cursor not-allowed. Mesmo visual mas sem interação.
20 — Tipografia Aplicada e Hierarquia

Tipografia Aplicada e Hierarquia

Exemplos práticos de como a tipografia Montserrat + Inter cria hierarquia visual em contextos reais: página de produto, dashboard e artigo.

Página de Produto

Produtos › Iluminação › LED Industrial

Luminária Industrial LED 150W

Alta performance para galpões e áreas industriais. IP65, 120lm/W, vida útil 50.000h.

R$ 329,00 R$ 399,00 -18%

Especificações

Potência
150W
Fluxo
18.000lm
Proteção
IP65
Vida Útil
50.000h

Escala Tipográfica em Contexto

2rem Page Title Montserrat 800
1.5rem Section Heading Montserrat 700
1.1rem Card Title / Modal Title Montserrat 700
1rem Body text. Parágrafos e descrições usam Inter regular 16px com line-height 1.6. Inter 400
0.875 Secondary text. Descrições menores, labels de formulário e textos auxiliares. Inter 400
0.75 OVERLINE / TABLE HEADER / LABEL Montserrat 600
0.8rem code / monospace JetBrains Mono

Truncamento de Texto

Single line (ellipsis)
Luminária Industrial LED 150W IP65 Alta Performance
Multi line (2 linhas max)
Luminária Industrial LED 150W IP65 Alta Performance para galpões industriais e áreas externas com proteção total contra poeira e água.
RegraDescrição
Heading FontMontserrat para títulos, labels de seção, badges, botões, overlines.
Body FontInter para parágrafos, inputs, descrições, tabelas, tooltips.
Mono FontJetBrains Mono para código, SKUs, IDs, valores técnicos.
Line HeightHeadings: 1.2-1.3. Body: 1.5-1.6. Compact (tables, labels): 1.3-1.4.
Truncamento1 linha: text-overflow: ellipsis. Multi-linha: -webkit-line-clamp. Sempre com title para hover.
ResponsivoPage title: 2rem → 1.5rem (mobile). Section: 1.5rem → 1.25rem. Body: mantém 1rem.
21 — Dark Mode e Temas

Dark Mode e Temas

O sistema de cores da Sysled suporta troca de tema via variáveis CSS. Cada cor semântica possui mapeamento light e dark, garantindo contraste WCAG AA (4.5:1 texto, 3:1 elementos UI) em ambos os modos.

Mapeamento de Cores Light / Dark

Light Mode
--bg-primary
#FFFFFF
--bg-secondary
#F8FAFC
--text-primary
#0F172A
--text-secondary
#64748B
--border
#E2E8F0
--accent
#2B6CB0
Dark Mode
--bg-primary
#0F172A
--bg-secondary
#1E293B
--text-primary
#F1F5F9
--text-secondary
#94A3B8
--border
#334155
--accent
#5BB8F5

Componentes: Light vs Dark

Light
Painel Solar 400W
Monocristalino - Eficiencia 21.5%
Digite o nome ou SKU...
Ativo Estoque OK Urgente
Dark
Painel Solar 400W
Monocristalino - Eficiencia 21.5%
Digite o nome ou SKU...
Ativo Estoque OK Urgente

Implementacao com CSS Variables

/* Light theme (default) */
:root {
  --bg-primary: #FFFFFF;
  --bg-secondary: #F8FAFC;
  --bg-elevated: #FFFFFF;
  --text-primary: #0F172A;
  --text-secondary: #64748B;
  --border-color: #E2E8F0;
  --accent: #2B6CB0;
  --accent-hover: #2C5282;
  --shadow: 0 1px 3px rgba(0,0,0,0.1);
}

/* Dark theme */
[data-theme="dark"] {
  --bg-primary: #0F172A;
  --bg-secondary: #1E293B;
  --bg-elevated: #334155;
  --text-primary: #F1F5F9;
  --text-secondary: #94A3B8;
  --border-color: #334155;
  --accent: #5BB8F5;
  --accent-hover: #3A8FD6;
  --shadow: 0 1px 3px rgba(0,0,0,0.4);
}

Regras de Contraste

Aa
#F1F5F9 on #0F172A
15.3:1 AAA
Aa
#94A3B8 on #1E293B
4.6:1 AA
Aa
#334155 on #1E293B
1.5:1 FAIL
DiretrizDescricao
AtivacaoUsar data-theme="dark" no <html>. Detectar prefers-color-scheme do sistema como padrao.
Contraste minimoTexto: 4.5:1 (AA). Elementos UI (bordas, icones): 3:1. Texto grande (≥18px bold): 3:1.
Cores de accentLight: #2B6CB0. Dark: #5BB8F5 (mais claro para manter contraste em fundo escuro).
SombrasLight: opacity 0.1. Dark: opacity 0.4 (sombras mais fortes em fundos escuros para manter profundidade).
Badges/TagsLight: background solido suave (#EBF8FF). Dark: background com rgba() a 15% de opacidade.
Imagens/IconesIcones SVG com currentColor adaptam automaticamente. Imagens: usar filter: brightness(0.9) no dark mode para evitar brilho excessivo.
TransicaoAplicar transition: background-color 0.2s, color 0.2s, border-color 0.2s para troca suave entre temas.
Nunca fazerNunca usar preto puro (#000000) como fundo. Usar #0F172A (Slate 900). Evitar branco puro (#FFFFFF) como texto — usar #F1F5F9.
22 — Data Visualization

Data Visualization — Graficos e Dashboards

Graficos traduzem dados complexos em insights visuais. A paleta Sysled para data viz usa cores distintas com contraste suficiente entre si e segue ordem semantica consistente.

Paleta para Graficos

#2B6CB0
#48C9B0
#5BB8F5
#ECC94B
#DC2626
#9F7AEA
Ordem de uso: Serie 1 (Primary) → Serie 2 (Cyan) → Serie 3 (Light Blue) → Serie 4 (Yellow) → Serie 5 (Red) → Serie 6 (Purple)

Grafico de Barras

Vendas por Categoria
Ultimos 6 meses
Paineis
Luminárias
Sensores
Jan
Fev
Mar
Abr
Mai

KPI Cards

Receita Total
R$ 1.2M
+12.5% vs mes anterior
Pedidos
847
+8.3% vs mes anterior
Ticket Medio
R$ 1.4K
-3.1% vs mes anterior

Grafico Donut

1.2K
produtos
Paineis Solares 45%
Luminarias LED 25%
Sensores 17.5%
Acessorios 12.5%
DiretrizDescricao
PaletaMaximo 6 cores por grafico. Usar a sequencia definida (Primary → Cyan → Light Blue → Yellow → Red → Purple).
LegendasPosicionar acima ou ao lado do grafico. Usar dot (10px) + label. Nunca sobrepor ao grafico.
KPI CardsValor principal em font-weight: 800, tamanho 1.5rem. Indicador de tendencia com seta SVG + percentual colorido (verde/vermelho).
TooltipsAo passar o mouse em barras/fatias, mostrar tooltip com valor exato. Background #0F172A, texto branco, border-radius 8px.
EixosLabels em Inter 0.6rem #94A3B8. Gridlines em #F1F5F9 (light) ou #1E293B (dark). Sem bordas nos eixos.
ResponsivoGraficos devem usar width: 100% e viewBox SVG. Em mobile, legendas abaixo do grafico.
23 — Paginacao e Infinite Scroll

Paginacao e Infinite Scroll

Paginacao divide resultados em paginas discretas. Cada padrão serve um caso de uso diferente: numerico para navegacao precisa, compact para mobile, load more para feeds, e infinite scroll para galerias.

Paginacao Numerica

...
Exibindo 1-20 de 235 resultados

Paginacao Compact (Mobile)

3 de 12

Load More Button

Exibindo 20 de 84 produtos
PadraoQuando usar
NumericoTabelas de dados, listagens com busca. Quando o usuario precisa navegar para pagina especifica. Desktop.
CompactMobile e espacos restritos. Anterior/Proximo com indicador de pagina atual.
Load MoreFeeds, catalogos de produtos. Barra de progresso mostra quanto ja foi carregado. Max 3 cliques antes de sugerir filtros.
Infinite ScrollGalerias de imagens, timelines. Usar sentinel element + Intersection Observer. Mostrar spinner ao carregar.
Items por paginaPadrao: 20. Opcoes: 10, 20, 50, 100. Dropdown ao lado da paginacao.
24 — Alertas Inline e Banners

Alertas Inline e Banners

Alertas inline e banners sao mensagens persistentes (diferente de toasts que desaparecem). Banners ficam no topo da pagina; alertas inline aparecem dentro do contexto do conteudo.

Banners de Topo

Atualizacao agendada: O sistema ficara em manutencao dia 15/03 das 02h as 04h.
Estoque baixo: 3 produtos estao abaixo do nivel minimo. Ver detalhes
Falha na sincronizacao: Nao foi possivel conectar ao ERP. Tentar novamente
Importacao concluida! 342 produtos foram atualizados com sucesso.

Alertas Inline em Formularios

Digite um email valido (ex: nome@empresa.com)
Quantidade acima do estoque disponivel (127 un.)

Callouts de Destaque

Dica
Use filtros combinados para encontrar produtos rapidamente. Voce pode filtrar por categoria, status e faixa de preco ao mesmo tempo.
Atencao
Alteracoes de preco em lote afetam todos os produtos selecionados. Esta acao nao pode ser desfeita.
TipoEspecificacao
BannerTopo da pagina, largura total. Icone SVG (18px) + texto + botao fechar (X). Border-radius 10px. Dismissable com X.
Inline (form)Abaixo do input com erro/warning. Icone 12px + texto 0.65rem. Borda do input muda para a cor do estado.
CalloutBorder-left 4px + background suave. Titulo bold + descricao. Nao e dismissable — sempre visivel.
CoresInfo: azul (#2B6CB0/#EBF8FF). Warning: amarelo (#D97706/#FFFBEB). Error: vermelho (#DC2626/#FFF5F5). Success: verde (#059669/#D1FAE5).
PersistenciaBanners de sistema (manutencao): persistem ate o usuario fechar. Erros criticos: nao podem ser fechados ate resolver.
25 — Drag & Drop e Reordenacao

Drag & Drop e Reordenacao

Drag & drop permite que usuarios reorganizem elementos visualmente. Os indicadores visuais (grab cursor, ghost, drop zone) devem ser claros para comunicar o que esta acontecendo.

Lista Reordenavel

1. Painel Solar Monocristalino 400W SKU-001
2. Luminaria LED Industrial 150W SKU-002
Soltar aqui
3. Sensor de Presenca IP65 SKU-003
4. Inversor Solar 5kW SKU-004

Kanban Board — Drag entre Colunas

Pendente
3
Pedido #1847
Solar Panel 400W x12
Pedido #1848
LED Strip 5m x24
Em Separacao
1
Pedido #1845
Sensor IP65 x8
Arraste cards aqui
Enviado
2
Pedido #1840
Inversor 5kW x2
Pedido #1839
LED Painel 60x60 x16
EstadoVisual
DefaultHandle com icone grip (6 dots). Cursor grab. Border normal #E2E8F0.
DraggingCursor grabbing. Border dashed #2B6CB0. Background #EBF8FF. Shadow elevada. transform: scale(1.02). Opacity 0.85.
Drop ZoneBorder dashed #48C9B0. Background rgba(72,201,176,0.08). Texto "Soltar aqui".
Drop Zone inativaBorder dashed #CBD5E0. Texto "Arraste cards aqui" em #CBD5E0.
AcessibilidadeSuporte a teclado: Space para pegar, setas para mover, Space para soltar, Esc para cancelar. aria-grabbed, aria-dropeffect.
FeedbackApos soltar: toast de confirmacao "Ordem atualizada". Animacao suave de reposicionamento (200ms ease).
26 — Shortcuts e Atalhos de Teclado

Shortcuts e Atalhos de Teclado

Atalhos de teclado aceleram o fluxo de trabalho de usuarios avancados. Todos os atalhos devem ser descobriveis via modal de ajuda (?) e documentados.

Modal de Atalhos

Atalhos de Teclado
Buscar atalho...
Navegacao
Busca rapida
K
Ir para Dashboard
GD
Ir para Produtos
GP
Acoes
Salvar
S
Novo produto
N
Desfazer
Z
Abrir ajuda de atalhos
?
DiretrizDescricao
DescobertaTecla ? abre modal de atalhos. Tooltip em hover mostra atalho do botao.
PadroesNavegacao: G + letra. Acoes: Cmd/Ctrl + letra. Acoes rapidas: letra unica (N = novo).
Kbd styleBackground branco, border #E2E8F0, border-radius 5px, box-shadow para efeito 3D sutil, font JetBrains Mono 0.6rem.
AcessibilidadeNunca substituir atalhos nativos do browser. Atalhos nao podem ser a unica forma de acesso — sempre ter equivalente clicavel.
27 — Onboarding e Tour Guiado

Onboarding e Tour Guiado

O onboarding guia novos usuarios pelos recursos principais do sistema. Usa spotlight (destaque) em elementos da interface com tooltips explicativos e progresso visual.

Tour Step — Spotlight

Produtos
2 de 4
Cadastre seu primeiro produto
Clique aqui para adicionar produtos ao seu catalogo. Voce pode importar via CSV ou cadastrar manualmente.
DiretrizDescricao
SpotlightOverlay escurecido rgba(15,23,42,0.6). Elemento alvo elevado com z-index + ring glow box-shadow: 0 0 0 4px rgba(43,108,176,0.3).
TooltipMax 260px. Titulo em Montserrat bold + descricao em Inter. Arrow CSS apontando para o elemento. Sombra forte.
ProgressoDots (6px) com estado ativo. Contador "N de N" alinhado a direita. Maximo 5-7 steps.
Acoes"Pular tour" (text button, cinza). "Anterior" (secondary). "Proximo" / "Concluir" (primary). Ultimo step: "Comecar a usar!".
PersistenciaSalvar progresso em localStorage. Nao mostrar novamente apos completar. Oferecer replay em Configuracoes.
28 — Filtros e Busca Avancada

Filtros e Busca Avancada

Filtros permitem refinar resultados. Devem ser visiveis, facilmente removiveis, e mostrar quantos resultados foram encontrados. A busca com sugestoes acelera a descoberta.

Barra de Filtros com Chips

Buscar produtos...
Filtros ativos: Categoria: Paineis Status: Ativo Preco: R$100 - R$500
47 resultados encontrados
DiretrizDescricao
Filter ChipsBackground #EBF8FF, border #BEE3F8, pill shape. Icone X para remover. white-space: nowrap.
ContagemBadge circular no botao Filtros mostrando quantidade ativa. Badge no resultado: "47 resultados encontrados".
LimparBotao "Limpar todos" em vermelho (#DC2626), text-only. Aparece so quando ha filtros ativos.
BuscaInput com icone lupa. Placeholder "Buscar...". Sugestoes em dropdown apos 2 caracteres. Highlight do match em bold.
View ToggleGrid / Lista — botoes icone com estado ativo (borda azul, bg #EBF8FF).
29 — Centro de Notificacoes

Centro de Notificacoes

O centro de notificacoes agrega todas as mensagens do sistema em um painel acessivel pelo icone de sino. Notificacoes nao lidas sao destacadas visualmente.

Notification Bell + Dropdown

4
Notificacoes
Estoque atualizado
Painel Solar 400W recebeu 50 unidades no deposito central.
2 min atras
Alerta de estoque baixo
Sensor IP65 esta com apenas 3 unidades em estoque.
15 min atras
Pedido #1845 enviado
Transportadora coletou o pedido com sucesso.
1 hora atras
Novo usuario adicionado
Maria Silva foi convidada como Operadora.
3 horas atras
DiretrizDescricao
BadgeCirculo vermelho (#DC2626) com borda branca 2px. Max "9+". Desaparece quando nao ha novas.
Nao lidaBackground #F8FAFC, border-left 3px azul, titulo bold, dot azul 8px a direita.
LidaBackground branco, sem border-left, titulo cinza (#64748B), sem dot.
IconesPor tipo: info (azul), warning (amarelo), error (vermelho), success (verde). Icones SVG outline em fundo colorido suave 32x32.
TimestampRelativo: "2 min atras", "1 hora atras". Apos 24h: "Ontem 14:30". Apos 7 dias: data completa.
AgrupamentoAgrupar por "Hoje", "Ontem", "Esta semana" com divisor + label cinza. Max 20 itens no dropdown, link "Ver todas" no footer.
30 — Tabelas Avancadas

Tabelas Avancadas — Selecao e Bulk Actions

Tabelas avancadas permitem selecionar multiplos itens e executar acoes em lote (bulk actions). A barra de acoes aparece quando ha selecao ativa.

Tabela com Selecao e Bulk Actions

3 itens selecionados
Produto SKU Preco Estoque Status
Painel Solar 400W SKU-001 R$ 1.299 142 Ativo
Luminaria LED 150W SKU-002 R$ 489 87 Ativo
Sensor IP65 SKU-003 R$ 189 3 Baixo
Inversor Solar 5kW SKU-004 R$ 3.450 24 Ativo
LED Strip 5m RGB SKU-005 R$ 79 215 Ativo
DiretrizDescricao
Checkbox18x18px, border-radius 4px. Checked: bg #2B6CB0 + checkmark branco. Indeterminate (parcial): bg azul + dash branco.
Linha selecionadaBackground #EBF8FF, border-bottom #BEE3F8. Transicao suave 150ms.
Bulk BarAparece no topo da tabela quando 1+ itens selecionados. Sticky para ficar visivel ao scrollar. Background #EBF8FF.
Acoes em loteExportar CSV, Editar (preco, categoria, status), Excluir (vermelho, com confirmacao modal). Max 4 acoes visiveis.
SelecaoClick no checkbox da linha seleciona/deseleciona. Checkbox do header: seleciona todos da pagina. Shift+Click para selecao em range.
FeedbackContador "N itens selecionados" atualiza em tempo real. Apos acao em lote: toast de confirmacao + deselecionar.
77 — Mega Menu & Navegação Complexa

Mega Menu & Navegação Complexa

Patterns de navegação para plataformas com muitos módulos como a SYSLED. Inclui mega menu multi-coluna, sidebar com sub-níveis, mobile drawer e navigation rail.

Preview — Mega Menu Multi-Coluna

Para header principal da plataforma. Abre em hover/click com colunas agrupadas por categoria.

SYSLED
Módulos ▾ Dashboard Relatórios Configurações
Buscar... ⌘K
DF
Produção
Ordens de Produção
Monitoramento
Máquinas
Estoque
Inventário
Notas Fiscais
Logística
Qualidade
Inspeções
Indicadores
Laudos
RH & Admin
Colaboradores
Turnos & Escalas
Permissões

Preview — Sidebar com Sub-Níveis

Navegação lateral colapsável com ícones, sub-menus e indicador de seção ativa.

SYSLED
Dashboard
Produção
Ordens
Monitoramento
Máquinas
Estoque
Qualidade
Configurações
Dashboard
OEE Geral
87.3%
Ordens Hoje
24
Alertas
3
Gráfico de Produção

Preview — Mobile Drawer

Em telas mobile (<768px), a sidebar vira um drawer deslizante com overlay escuro.

SYSLED
Dashboard
Produção
Estoque
Qualidade
Configurações

Especificações de Navegação

ComponenteLarguraBreakpointAnimação
Mega Menu100% da viewport (max-width container)≥1024pxopacity + translateY, 0.2s ease
Sidebar expandida240px≥768pxwidth 0.25s cubic-bezier(0.4,0,0.2,1)
Sidebar colapsada64px (só ícones)≥768pxwidth 0.25s
Mobile Drawer280px<768pxtranslateX 0.3s ease-out + overlay fade
Navigation Rail64pxTablet (768-1023px)

Hierarquia de Navegação

NívelElementoEstiloExemplo
1Categoria (label)Uppercase, 0.6rem, #64748B, letter-spacing 0.12emPRODUÇÃO, ESTOQUE
2Item principal0.75rem, #94A3B8 (inativo) / #E2E8F0 (ativo), icon 16pxDashboard, Ordens
3Sub-item0.7rem, #64748B, indent 28px, sem íconeMáquinas, Monitoramento
AtivoItem selecionadobg rgba(blue, 0.2), border-left 3px #2B6CB0, cor #E2E8F0
HoverQualquer itembg rgba(blue, 0.15), transition 0.15s

Do's & Don'ts

DO
Agrupar itens por categoria com labels descritivos. Máximo 4-5 colunas no mega menu.
DON'T
Ter mais de 2 níveis de profundidade na sidebar. Se precisar de mais, use mega menu ou breadcrumbs.
DO
Manter a sidebar colapsável com tooltips nos ícones quando minimizada (64px).
DON'T
Esconder a navegação principal sem um hamburger/toggle visível. O usuário deve sempre saber como navegar.
89 — File Upload & Attachment

File Upload & Attachment

Componentes de upload de arquivos para contextos industriais — drag & drop, progress bar, preview, validação de tipo/tamanho e galeria de anexos em ordens de manutenção e inspeções.

Drag & Drop Zone — Estados
Default
Arraste arquivos aqui
ou clique para selecionar
PNG, JPG, PDF, XLSX — Máx. 10MB
Drag Over
Solte para enviar
2 arquivos detectados
Erro de Validação
Arquivo não permitido
.exe não é aceito. Use PNG, JPG, PDF.
Lista de Uploads — Progress
relatorio-inspecao-CNC04.pdf 2.4 MB
Upload concluído
foto-desgaste-rolamento.jpg 67%
1.8 MB de 2.7 MB — ~3s restantes
planilha-producao.xlsx
Tamanho excede o limite de 10MB (12.3 MB)
Tentar novamente
Galeria de Anexos — Ordem de Manutenção
foto-antes.jpg
1.2 MB
foto-depois.jpg
980 KB
PDF
laudo-tecnico.pdf
3.1 MB
Adicionar
PropriedadeValorNota
Drop ZoneBorder 2px dashed, radius 12px, padding 2remActive = primary dashed + shadow ring
Icon Upload40×40px, radius 10pxBackground gray-100 (default) / primary/10% (active)
File RowPadding 12px 16px, radius 10pxIcon 36×36 + info + actions
Progress Bar4px height, radius 2pxPrimary color + pulse animation
Thumbnail Grid4 colunas, gap 10pxImage height 80px, object-fit cover
File Size Limit10MB por arquivo (configurável)Validar antes do upload
Tipos AceitosPNG, JPG, PDF, XLSX, CSV, DWGConfigurável por contexto
Action Buttons28×28px, radius 6pxPreview, delete, retry
DO
  • Validar tipo e tamanho antes do upload
  • Mostrar progresso com % e tempo restante
  • Permitir cancelar upload em andamento
  • Preview inline para imagens e PDFs
  • Feedback visual claro no drag over
DON'T
  • Upload sem indicação de progresso
  • Aceitar qualquer tipo de arquivo silenciosamente
  • Deletar arquivo sem confirmação
  • Drop zone menor que 200px de altura
  • Bloquear UI durante upload (usar async)
91 — Tooltip & Popover

Tooltip & Popover

Tooltips fornecem informações contextuais breves ao hover/focus sobre ícones de status e ações. Popovers são overlays ricos para detalhes de equipamentos, confirmações e cards de técnicos.

Tooltip — Variantes

Top
Editar OS
Bottom
Exportar relatório
Left
Filtrar OS
Right
Buscar equip.

Tooltip — Estilos

Default (Dark)
Vibração: 2.3 mm/s
Light
Temp.: 78°C — Normal
Com Atalho
Salvar S

Popover — Variantes

Informativo
Manutenção Preventiva

A manutenção preventiva reduz em até 40% os custos operacionais e aumenta a vida útil do equipamento.

Saiba mais →
Action Menu
Editar OS
Duplicar como nova OS
Exportar Relatório PDF
Cancelar OS
User Card
CS
Carlos Silva
Técnico de Manutenção
Setor B — Linha 03
carlos.silva@sysled.com
Confirmation
Encerrar OS-0847?

Isso marcará a ordem como concluída e notificará o solicitante. Peças utilizadas serão debitadas do estoque.

Timing & Comportamento

Tooltip

Trigger Hover / Focus
Delay in 200ms
Delay out 0ms
Animation fade 150ms ease
Interativo Não

Popover

Trigger Click
Delay in 0ms
Dismiss Click fora / Esc
Animation scale 200ms ease-out
Interativo Sim

Specs

PropriedadeTooltipPopover
Background#1e293b (dark) ou #fff (light)var(--bg-card)
Border radius6px12px
Padding6px 12px16px
Font size0.72rem / 5000.8rem / 400 (body)
Max width240px320px
ShadowNenhuma0 4px 16px rgba(0,0,0,0.1)
Z-index10701060
Arrow size8 × 8px rotated 45°Opcional, 10 × 10px
Offset do trigger8px8px

Do

  • Usar tooltip para labels curtos de icon buttons (max 1 linha)
  • Incluir atalhos de teclado no tooltip quando aplicável
  • Fechar popover ao pressionar Esc ou clicar fora
  • Manter popover visível enquanto o cursor estiver dentro dele

Don't

  • Não colocar conteúdo interativo dentro de tooltips
  • Não usar tooltip para informações essenciais — não são acessíveis em touch
  • Não abrir mais de um popover simultaneamente
  • Não usar tooltip em elementos já descritivos (texto visível)
92 — Stepper & Multi-Step Wizard

Stepper & Multi-Step Wizard

Steppers indicam progresso em fluxos multi-etapa. Wizards guiam o usuário por processos complexos divididos em passos sequenciais com validação progressiva.

Stepper Horizontal

Dados Gerais
Equipamento
3
Peças & Materiais
4
Revisão
5
Confirmação

Stepper Vertical

Identificação do Equipamento
TAG, modelo, fabricante e localização
2
Diagnóstico
Descreva o problema identificado
3
Plano de Ação
Definir atividades e responsáveis
4
Conclusão
Revisar e confirmar abertura da OS

Wizard — Exemplo Completo

Nova Ordem de Serviço

Etapa 3 de 5 — Peças & Materiais

60%
Dados
Equipamento
Peças
Revisão
Confirmar

Peças & Materiais Necessários

Adicione as peças e materiais que serão utilizados nesta manutenção.

ItemQtdEstoque
Rolamento 6205-2RS 2 un Disponível
Graxa Mobil EP2 1 kg Disponível
Retentor 35×52×7 1 un Baixo estoque

Estados do Step

Completed
Concluído
Active
3
Atual
Pending
4
Pendente
Error
Erro
Disabled
Bloqueado

Stepper Compacto (Mobile)

Dot Indicator
Etapa 3 de 5
Progress Bar
Peças & Materiais 3/5

Specs

PropriedadeValor
Step circle36 × 36px (default) · 32px (vertical) · border-radius 50%
Active ringbox-shadow 0 0 0 4px var(--primary-light)
Completed bg#16a34a · check icon stroke 2.5 · color #fff
Connectorheight 2px · completed: #16a34a · pending: var(--border)
Label fontInter 0.72rem / 600 (active/completed) · 500 (pending)
Wizard headerpadding 20px 24px · border-bottom 1px
Wizard footerbg gray-100 · padding 16px 24px · sticky bottom
Progress barheight 6px · border-radius 100px · bg primary
Max steps recomendado3–7 steps · colapsar se > 5 em mobile

Do

  • Validar cada etapa antes de permitir avançar
  • Permitir navegação livre entre etapas já concluídas
  • Oferecer "Salvar rascunho" em wizards longos
  • Usar dot indicator ou progress bar em mobile

Don't

  • Não exceder 7 etapas — divida em sub-fluxos
  • Não permitir pular etapas obrigatórias
  • Não perder dados preenchidos ao navegar entre etapas
  • Não esconder o progresso — sempre indicar a etapa atual
Parte 1 — Fundamentos Parte 3 — Patterns