LuxFoto v2 — Onda 2

Design system

Estética Apple/Notion (Documento Mestre §10): fundo claro, bordas discretas, sombra quase invisível, cor só quando carrega significado. Todo componente aqui recebe dado por prop e emite evento por callback — nenhum busca dado sozinho.

Tokens

Documento Mestre §10.1 — a única fonte de cor permitida em todo o produto.

lf-white
lf-bg
lf-surface
lf-surface-muted
lf-border
lf-border-strong
lf-text
lf-text-muted
lf-text-soft
lf-black
lf-blueInformação / ação primária
lf-greenSucesso / pago
lf-amberAtenção / pendente
lf-redErro / vencido
lf-purpleIA / sugestão
lf-tealFinanceiro / recorrência

Layout

A composição completa (AppShell) precisa do viewport inteiro para a MobileBottomNav se comportar — ela é fixa à janela, não a uma caixa. Por isso o preview ao vivo mora numa página própria.

AppShell — Sidebar + TopBar + MobileBottomNav + área de conteúdo, trocando de forma no breakpoint lg (1024px).

Ver preview de página inteira

Sidebar

Desktop (≥1024px). Não lê a rota atual sozinha — recebe activeKey do chamador.

TopBar

Persistente nas duas larguras — é onde a identidade (workspace/conta) mora, não na Sidebar.

Estúdio Aurora

PageHeader

Cabeçalho de CONTEÚDO — rola com a página, diferente da TopBar.

Projetos

Tudo que está em produção neste mês.

MobileBottomNav

Sempre 5 itens ou menos visíveis; o resto vai para 'Mais' (Drawer). Aqui, position forçada para 'absolute' só para caber na caixa de preview — no produto real é 'fixed' ao viewport.

Primitivos

Sobre Radix UI, não do zero. Cor e forma vêm só dos tokens.

Button

Input + Label

Todo input tem Label associado por htmlFor/id — requisito de acessibilidade, não polimento.

Informe um e-mail válido.

Select

Card

Pacote Essencial

6 horas de cobertura + 200 fotos editadas.

R$ 2.800,00

Badge

Pílula com fundo tingido — para tag/contador, não para status de linha (isso é StatusBadge, na seção Domínio).

NeutralBlueGreenAmberRedPurpleTealSolid

Dialog / Sheet / Drawer

Mesmo comportamento de foco/ESC/clique-fora (Radix); a diferença é geometria de origem: centro, lateral, ou fundo.

ConfirmDialog

O único jeito de pedir confirmação neste produto — controlado de fora, não fecha sozinho enquanto onConfirm está pendente.

Outros primitivos

Avatar, DropdownMenu, Tabs, Separator, Skeleton, Tooltip — usados por dentro dos componentes de Layout e Domínio, mostrados aqui soltos para conferência isolada.

MS
Conteúdo A

Domínio

Compostos sobre os primitivos. Cada um recebe dado por prop — nenhum chama Supabase.

EmptyState

A description ENSINA o próximo passo — nunca 'nenhum registro encontrado'.

Nenhum lead ainda

Cadastre seu primeiro lead manualmente ou compartilhe o link público do seu formulário de contato.

DataCard

Item de lista genérico — é também em cima dele que DataTable vira lista em 375px.

SV
Studio Vento Norte
Ensaio corporativo
R$ 4.200,00

StatCard

Único componente com os 4 estados numa prop só (state) — um indicador é, por natureza, um valor assíncrono.

Vazio
Receita no mês

Sem lançamentos neste mês ainda.

Carregando
Receita no mês
Erro
Receita no mês
Não foi possível carregar.
Preenchido
Receita no mês
R$ 18.400,00+12% vs. mês anterior

StatusBadge

Ponto + texto, sem fundo — mais discreto que Badge de propósito, para não competir em listas densas.

RascunhoNovoPagoPendenteVencidoSugestão de IARecorrente

MoneyDisplay + DateDisplay

Mesma API (value/tone/size/className) de propósito — quem usa um já sabe usar o outro.

R$ 2.800,00R$ 18.400,00-R$ 320,00R$ 5.200,00

DataTable

Tabela em ≥768px, lista de DataCard abaixo disso. A troca é feita por media query real (md:), não simulada.

Vazio

Nenhum lead

Cadastre o primeiro lead para começar.

Carregando
Erro

Não foi possível carregar os dados.

Preenchido
Camila Rocha
Valor:R$ 8.500,00Status:Quente
João Pedro Alves
Valor:R$ 1.200,00Status:Novo

Tabela completa, com todas as linhas:

KanbanBoard

Desktop: colunas lado a lado com scroll horizontal. Mobile: abas trocando a coluna ativa — grade de colunas de 70px não seria legível.

Vazio

Pipeline vazio

Assim que houver itens, eles aparecem organizados por coluna aqui.

Carregando
Erro

Não foi possível carregar o quadro.

Preenchido

Novo

2
Camila RochaCasamento
João PedroEnsaio

Board completo (3 colunas):

Novo

2
Camila RochaCasamento
João PedroEnsaio

KanbanColumn

Standalone, com o menu "mover para" — a escolha de acessibilidade no lugar de arrastar (drag-and-drop HTML5 não é operável por teclado). Ver handoff.

Novo

2
Camila RochaCasamento
João PedroEnsaio

EntityDrawer

Sheet lateral em ≥1024px, Drawer de fundo abaixo disso — mesmo corte de breakpoint do AppShell.

Timeline

A trilha vem do BANCO (gatilhos AFTER UPDATE) — este componente só recebe a lista pronta.

Vazio

Sem histórico ainda

As próximas mudanças aparecem aqui automaticamente.

Carregando
Erro
Não foi possível carregar o histórico.
Preenchido
  1. Lead criado pelo formulário público
  2. Status alterado para "Em contato"

FeatureGateBanner

A cor do bloqueio (amber) não muda a cor do botão de ação (sempre primary/azul) — vocabulário de cor consistente com o resto do produto.

Relatórios avançados fazem parte do plano Pro

Veja margem real por tipo de evento, depreciação de equipamento e alertas de inadimplência.

Libere a calculadora de preço

SmartSuggestion

Único jeito de uma sugestão de IA aparecer no produto (§8.9): nunca executa sozinha. O vocabulário de status espelha ai_suggestions (A1, Lote 5) de propósito.

Sugestão da IA
Confiança: 92%
Classificar como lead quente — mencionou data do evento e orçamento na primeira mensagem.
Sugestão da IA
Classificar como lead quente — mencionou data do evento e orçamento na primeira mensagem.
Aprovadapor Marina Silva·
Sugestão da IA
Classificar como lead quente — mencionou data do evento e orçamento na primeira mensagem.
Aprovada com ediçãopor Marina Silva·
Sugestão da IA
Classificar como lead quente — mencionou data do evento e orçamento na primeira mensagem.
Executadapor Marina Silva·
Sugestão da IA
Classificar como lead quente — mencionou data do evento e orçamento na primeira mensagem.
Rejeitadapor Marina Silva·Motivo: Classificação errada — o lead é frio, não quente.
Sugestão da IA
Classificar como lead quente — mencionou data do evento e orçamento na primeira mensagem.
Expirada
Sugestão da IA
Classificar como lead quente — mencionou data do evento e orçamento na primeira mensagem.
Falhou ao executar