Checkout
Fluxo completo de compra com stepper multi-step (barras de progresso), formulário de identificação, pagamento (PIX / Cartão via Pagar.me) e sidebar de resumo. Layout split-screen 50/50 no desktop, empilhado no mobile. Implementado no Consultant Portal.
// apps/consultant-portal/checkout/[order_id]/checkout-client.tsx
import { CheckoutLayout, CheckoutHeader, OrderSummarySidebar, MobileBottomBar } from "./components";
import { Stepper, StepperNav, StepperItem, StepperTrigger, StepperIndicator, StepperTitle, useCheckoutStepper } from "@workspace/checkout";
const steps = [
{ id: "items", title: "Carrinho", step: 1 },
{ id: "address", title: "Identificação", step: 2 },
{ id: "payment", title: "Pagamento", step: 3 },
];
<CheckoutLayout
header={<CheckoutHeader consultant={consultant} isAuthenticated={true} />}
stepper={
<Stepper value={currentStep} onValueChange={handleStepChange} className="w-full max-w-md">
<StepperNav className="gap-3">
{steps.map((step) => (
<StepperItem key={step.id} step={step.step} className="flex-1">
<StepperTrigger className="flex grow flex-col items-start gap-2">
<StepperIndicator className="h-1 w-full rounded-full" />
<StepperTitle className="text-xs font-medium">{step.title}</StepperTitle>
</StepperTrigger>
</StepperItem>
))}
</StepperNav>
</Stepper>
}
mainContent={renderStepContent()}
sidebar={<OrderSummarySidebar order={order} currentStep={currentStepId} />}
mobileBottomBar={<MobileBottomBar order={order} ctaLabel="Continuar" />}
/>Checkout — Desktop — Step 1: Carrinho
Layout split-screen 50/50. Esquerda: formulário (fundo branco) com header, stepper de barras e conteúdo do step. Direita: sidebar de resumo (fundo rosa bg-aautentic-50) com imagem hero, itens e totais.
Ana Autentic
Consultora
Ana Paula C.
ana.paula@email.com
Carrinho
Identificação
Pagamento
Seus Produtos
Confirme os itens do seu pedido

Body Splash Alioth 200ml
BS-ALI-200
R$ 139.80
R$ 69.90 / un

Esfoliante Corpo Alioth
ESF-ALI-200
R$ 59.90
R$ 59.90 / un
Resumo
Checkout — Desktop — Step 3: Pagamento
Radio buttons para seleção de método (Cartão / PIX) com título e descrição. Formulário de cartão limpo sem bordas extras. Sidebar atualizada com frete confirmado e total final.
Ana Autentic
Consultora
Ana Paula C.
ana.paula@email.com
Carrinho
Identificação
Pagamento
Pagamento
Escolha a forma de pagamento: PIX ou cartão de crédito
Número do cartão
Nome no cartão
Mês
Ano
CVV
Resumo
Body Splash Alioth 200ml
2x R$ 69,90
Esfoliante Corpo Alioth
1x R$ 59,90
Correios — SEDEX
Entrega em até 5 dias úteis
R$ 229,60
ou até 6x de R$ 38,27
Checkout — Mobile
Layout empilhado vertical: header → stepper → conteúdo → bottom bar fixa. Sidebar oculta no mobile. Bottom bar mostra total + botão CTA.
Ana Autentic
Consultora
Seus Produtos
Confirme os itens do seu pedido

Body Splash Alioth 200ml

Esfoliante Corpo Alioth
Total
R$ 199,70
Estrutura do layout
Composição do CheckoutLayout e seus slots. Split-screen 50/50 no desktop (flex w-1/2), empilhado no mobile.
| Componente | Classe / Slot | Função |
|---|---|---|
CheckoutLayout | hidden lg:flex (desktop) / flex flex-col lg:hidden (mobile) | Container split-screen responsivo com 2 metades iguais |
Left half | w-1/2 justify-end → max-w-[520px] py-10 pr-12 pl-8 | Área do formulário (fundo branco), conteúdo alinhado à direita |
Right half | w-1/2 justify-start bg-aautentic-50 → max-w-[400px] py-10 pr-8 pl-12 | Sidebar de resumo (fundo rosa), conteúdo alinhado à esquerda |
header (slot) | ReactNode — mb-8 | CheckoutHeader: Logo Ana Autentic + info do usuário (avatar/nome/email) |
stepper (slot) | ReactNode — mb-10 | Stepper com 3 barras de progresso (h-1 rounded-full) + títulos |
mainContent (slot) | ReactNode — flex-1 | Conteúdo do step ativo (StepItems, StepAddress, StepPayment) |
sidebar (slot) | ReactNode — sticky top-10 | OrderSummarySidebar: hero, resumo, preços, trust badges |
mobileBottomBar (slot) | ReactNode — fixed bottom-0 z-40 | MobileBottomBar: total + botão CTA (oculto no step de pagamento) |
Stepper (barras de progresso)
Sistema de stepper baseado em barras horizontais (não círculos numerados). Cada step é uma barra h-1 rounded-full com título abaixo. Suporta estados active, completed e inactive.
| Componente | Estado | Estilo |
|---|---|---|
StepperIndicator | active / completed | bg-primary (h-1 w-full rounded-full) |
StepperIndicator | inactive | bg-border (h-1 w-full rounded-full) |
StepperTitle | active / completed | text-foreground (text-xs font-medium) |
StepperTitle | inactive | text-muted-foreground (text-xs font-medium) |
StepperTrigger | clickable (step <= maxReached) | cursor-pointer hover:opacity-80 |
StepperTrigger | não clickable | cursor-default (disabled) |
Componentes de pagamento
Tabs PIX / Cartão no StepPayment. PIX gera QR Code via Pagar.me com timer regressivo e polling de status. Cartão tokeniza client-side via Pagar.me antes de enviar ao servidor.
| Componente | Método | Elementos |
|---|---|---|
StepPayment (tab PIX) | PIX (Pagar.me) | Info box verde "Pagamento instantâneo", botão "Pagar com PIX", QR Code (size-48), timer regressivo, botão copiar código, polling a cada 5s |
StepPayment (tab Cartão) | Cartão (Pagar.me) | Campos: número, nome no cartão, mês/ano/CVV (grid-cols-3). Tokenização client-side via tokenizeCard(). Inputs h-11 |
Dimensões
| Elemento | Dimensão | Classe Tailwind |
|---|---|---|
| Layout (desktop) | 50% + 50% (flex w-1/2) | hidden lg:flex → w-1/2 + w-1/2 |
| Form area (esquerda) | max 520px, padding py-10 pr-12 pl-8 | max-w-[520px] justify-end |
| Sidebar (direita) | max 400px, bg rosa | max-w-[400px] bg-aautentic-50 sticky top-10 |
| Sidebar background | aautentic-50 (rosa claro) | bg-aautentic-50 |
| Imagem hero (sidebar) | 2.5:1 aspect ratio, rounded 23px | aspect-5/2 rounded-[23px] |
| Stepper bar | 4px altura (h-1) | h-1 w-full rounded-full |
| StepperNav gap | 12px entre steps | gap-3 |
| Product image (step items) | 64x64 / 80x80 (sm) | h-16 w-16 sm:h-20 sm:w-20 rounded-md |
| QR Code (PIX) | 192x192px | size-48 rounded-lg |
| Card fields | 44px altura (h-11) | h-11 rounded-md border |
| CTA button | 40px altura | h-10 w-full rounded-lg bg-aautentic-500 |
| Pay button | 48px altura | h-12 w-full gap-2 |
| Bottom bar (mobile) | Fixa no bottom | fixed right-0 bottom-0 left-0 z-40 |
| Avatar (header) | 36px | h-9 w-9 |
| Logo (header) | 28px | size-7 text-primary |
Steps por canal
O número e conteúdo dos steps varia conforme o canal de venda.
| Canal | Steps | Pagamento |
|---|---|---|
plan_kit (Website) | Carrinho → Identificação → Pagamento | PIX + Cartão (BR) / Stripe (internacional) |
pdv_self (Consultant Portal) | Carrinho → Identificação → Pagamento | PIX + Cartão (Pagar.me) |
consultant_catalog | Carrinho → Endereço → Pagamento → Confirmação | PIX + Cartão (Pagar.me) |
infoproduct | Dados → Pagamento | PIX + Cartão (Pagar.me) |
API Reference
| Prop | Type | Default | Descrição |
|---|---|---|---|
header | ReactNode | — | CheckoutHeader: Logo Ana Autentic + info do usuário (avatar, nome, email) ou link 'Entrar' |
stepper | ReactNode | — | Stepper com StepperNav contendo 3 StepperItems (barras h-1 rounded-full + títulos) |
mainContent | ReactNode | — | Conteúdo do step ativo: StepItems (carrinho), StepAddress (identificação + frete), StepPayment (PIX/Cartão) |
sidebar | ReactNode | — | OrderSummarySidebar: hero image, resumo collapsible, preços (subtotal/frete/total), trust badges, payment badges |
mobileBottomBar | ReactNode | — | MobileBottomBar fixa no rodapé com total + botão CTA. Oculta no step de pagamento |
Stepper.value | number | — | Step ativo atual (1 = items, 2 = address, 3 = payment). Controlado via useCheckoutStepper |
Stepper.onValueChange | (value: number) => void | — | Callback quando o step muda. Permite navegar para steps já visitados (step <= maxStepReached) |
OrderSummarySidebar.order | Order | — | Objeto do pedido com items, subtotal, shipping_cost, total, shipping_carrier, shipping_service |
OrderSummarySidebar.currentStep | "items" | "address" | "payment" | — | Controla texto do frete ("Calcular na próxima etapa" no step items) e exibição de parcelas no step payment |
StepPayment.checkout | CheckoutStateReturn | — | Estado completo do checkout com order, selectedShipping, consultant, e funções de pagamento (PIX/Cartão) |