Especificação de Componentes React

Biblioteca de componentes para KPIs do DBCHECKOUT

10

Componentes

TypeScript

Tipagem Completa

100%

Responsivo

Tailwind

CSS Framework

Sobre Esta Especificação

Esta documentação técnica define os componentes React reutilizáveis para construção dos dashboards e interfaces analíticas do DBCHECKOUT. Cada componente foi projetado seguindo princípios de:

Reutilização

Componentes genéricos e configuráveis

Tipagem Forte

TypeScript com interfaces completas

Responsividade

Mobile-first, adaptativo

Estados Completos

Loading, error, empty, success

Props

NomeTipoObrigatórioDescrição
titlestringSimTítulo da métrica
valuestring | numberSimValor principal da métrica
changenumberNãoVariação percentual (ex: 12.5)
changeType'positive' | 'negative' | 'neutral'NãoTipo de variação para cor
iconstringNãoClasse do ícone (Remix Icon)
gradientstringNãoClasses Tailwind para gradiente
loadingbooleanNãoEstado de carregamento
errorstringNãoMensagem de erro
onClick() => voidNãoCallback ao clicar no card

Estados do Componente

Loading

Skeleton animado com shimmer effect

Error

Ícone de alerta com mensagem de erro

Empty

Exibe "Sem dados" com ícone

Success

Exibe valor e variação normalmente

Comportamento Responsivo

Grid adaptativo: 1 col (mobile), 2 cols (tablet), 4 cols (desktop)

Exemplo de Uso

<MetricCard
  title="Faturamento"
  value="R$ 487.255"
  change={12.5}
  changeType="positive"
  icon="ri-money-dollar-circle-line"
  gradient="from-emerald-500 to-teal-600"
/>

Tipos TypeScript Comuns

Column (Tabelas)

interface Column {
  key: string;
  label: string;
  sortable?: boolean;
  align?: 'left' | 'center' | 'right';
  format?: 'text' | 'number' | 'currency' | 'percent' | 'date';
  width?: string;
  render?: (value: any, row: any) => ReactNode;
}

HierarchyData

interface HierarchyData {
  [group: string]: {
    [type: string]: string[];
  };
}

// Exemplo:
const hierarchy: HierarchyData = {
  Pizzas: {
    Tradicional: ['Pequena', 'Média', 'Grande'],
    Premium: ['Média', 'Grande', 'Gigante']
  }
};

TotalizerMetric

interface TotalizerMetric {
  label: string;
  value: string | number;
  icon?: string;
  change?: number;
  changeType?: 'positive' | 'negative' | 'neutral';
}

Filter

interface Filter {
  type: 'text' | 'select' | 'multi-select' | 'date' | 'date-range' | 'number-range';
  label: string;
  key: string;
  options?: { label: string; value: any }[];
  placeholder?: string;
  defaultValue?: any;
}

ComparisonData

interface ComparisonData {
  [key: string]: any;
}

// Exemplo:
const salesData: ComparisonData[] = [
  { date: '2024-01', store: 'Centro', revenue: 45000 },
  { date: '2024-01', store: 'Zona Sul', revenue: 38000 },
  { date: '2024-02', store: 'Centro', revenue: 52000 }
];

Boas Práticas de Implementação

Código Limpo

  • Use TypeScript para todas as props
  • Documente props complexas com JSDoc
  • Extraia lógica complexa para hooks customizados

Performance

  • Use React.memo para componentes pesados
  • Implemente virtualização em listas grandes
  • Lazy load de componentes não críticos

Acessibilidade

  • Use atributos ARIA apropriados
  • Garanta navegação por teclado
  • Contraste de cores adequado (WCAG AA)

Testes

  • Teste todos os estados (loading, error, empty)
  • Valide props obrigatórias
  • Teste interações do usuário