Design System

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

AP

Carrinho

Identificação

Pagamento

Seus Produtos

Confirme os itens do seu pedido

Body Splash Alioth 200ml

Body Splash Alioth 200ml

BS-ALI-200

2 un

R$ 139.80

R$ 69.90 / un

Esfoliante Corpo Alioth

Esfoliante Corpo Alioth

ESF-ALI-200

1 un

R$ 59.90

R$ 59.90 / un

2 itensR$ 199,70
FreteA calcular
SubtotalR$ 199,70
Continuar para Entrega

Resumo

2 itens
SubtotalR$ 199,70
FreteCalcular na próxima etapa
TotalR$ 199,70
SSL
Compra Segura
PIXCartãoBoleto

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

AP

Carrinho

Identificação

Pagamento

Pagamento

Escolha a forma de pagamento: PIX ou cartão de crédito

Cartão
PIX

Número do cartão

0000 0000 0000 0000

Nome no cartão

NOME COMO NO CARTÃO

Mês

MM

Ano

AA

CVV

123
Pagar com Cartão — R$ 229,60
Pagamento seguro via Pagar.me

Resumo

2 itens

Body Splash Alioth 200ml

2x R$ 69,90

R$ 139,80

Esfoliante Corpo Alioth

1x R$ 59,90

R$ 59,90
SubtotalR$ 199,70
FreteR$ 29,90

Correios — SEDEX

Entrega em até 5 dias úteis

Total

R$ 229,60

ou até 6x de R$ 38,27

SSL
Compra Segura
PIXCartãoBoleto

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

CarrinhoIdentificaçãoPagamento

Seus Produtos

Confirme os itens do seu pedido

Body Splash

Body Splash Alioth 200ml

2 unR$ 139,80
Esfoliante

Esfoliante Corpo Alioth

1 unR$ 59,90
2 itensR$ 199,70
FreteA calcular
SubtotalR$ 199,70

Total

R$ 199,70

Continuar

Estrutura do layout

Composição do CheckoutLayout e seus slots. Split-screen 50/50 no desktop (flex w-1/2), empilhado no mobile.

ComponenteClasse / SlotFunção
CheckoutLayouthidden lg:flex (desktop) / flex flex-col lg:hidden (mobile)Container split-screen responsivo com 2 metades iguais
Left halfw-1/2 justify-end → max-w-[520px] py-10 pr-12 pl-8Área do formulário (fundo branco), conteúdo alinhado à direita
Right halfw-1/2 justify-start bg-aautentic-50 → max-w-[400px] py-10 pr-8 pl-12Sidebar de resumo (fundo rosa), conteúdo alinhado à esquerda
header (slot)ReactNode — mb-8CheckoutHeader: Logo Ana Autentic + info do usuário (avatar/nome/email)
stepper (slot)ReactNode — mb-10Stepper com 3 barras de progresso (h-1 rounded-full) + títulos
mainContent (slot)ReactNode — flex-1Conteúdo do step ativo (StepItems, StepAddress, StepPayment)
sidebar (slot)ReactNode — sticky top-10OrderSummarySidebar: hero, resumo, preços, trust badges
mobileBottomBar (slot)ReactNode — fixed bottom-0 z-40MobileBottomBar: 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.

ComponenteEstadoEstilo
StepperIndicatoractive / completedbg-primary (h-1 w-full rounded-full)
StepperIndicatorinactivebg-border (h-1 w-full rounded-full)
StepperTitleactive / completedtext-foreground (text-xs font-medium)
StepperTitleinactivetext-muted-foreground (text-xs font-medium)
StepperTriggerclickable (step <= maxReached)cursor-pointer hover:opacity-80
StepperTriggernão clickablecursor-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.

ComponenteMétodoElementos
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

ElementoDimensãoClasse 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-8max-w-[520px] justify-end
Sidebar (direita)max 400px, bg rosamax-w-[400px] bg-aautentic-50 sticky top-10
Sidebar backgroundaautentic-50 (rosa claro)bg-aautentic-50
Imagem hero (sidebar)2.5:1 aspect ratio, rounded 23pxaspect-5/2 rounded-[23px]
Stepper bar4px altura (h-1)h-1 w-full rounded-full
StepperNav gap12px entre stepsgap-3
Product image (step items)64x64 / 80x80 (sm)h-16 w-16 sm:h-20 sm:w-20 rounded-md
QR Code (PIX)192x192pxsize-48 rounded-lg
Card fields44px altura (h-11)h-11 rounded-md border
CTA button40px alturah-10 w-full rounded-lg bg-aautentic-500
Pay button48px alturah-12 w-full gap-2
Bottom bar (mobile)Fixa no bottomfixed right-0 bottom-0 left-0 z-40
Avatar (header)36pxh-9 w-9
Logo (header)28pxsize-7 text-primary

Steps por canal

O número e conteúdo dos steps varia conforme o canal de venda.

CanalStepsPagamento
plan_kit (Website)Carrinho → Identificação → PagamentoPIX + Cartão (BR) / Stripe (internacional)
pdv_self (Consultant Portal)Carrinho → Identificação → PagamentoPIX + Cartão (Pagar.me)
consultant_catalogCarrinho → Endereço → Pagamento → ConfirmaçãoPIX + Cartão (Pagar.me)
infoproductDados → PagamentoPIX + Cartão (Pagar.me)

API Reference

PropTypeDefaultDescrição
headerReactNodeCheckoutHeader: Logo Ana Autentic + info do usuário (avatar, nome, email) ou link 'Entrar'
stepperReactNodeStepper com StepperNav contendo 3 StepperItems (barras h-1 rounded-full + títulos)
mainContentReactNodeConteúdo do step ativo: StepItems (carrinho), StepAddress (identificação + frete), StepPayment (PIX/Cartão)
sidebarReactNodeOrderSummarySidebar: hero image, resumo collapsible, preços (subtotal/frete/total), trust badges, payment badges
mobileBottomBarReactNodeMobileBottomBar fixa no rodapé com total + botão CTA. Oculta no step de pagamento
Stepper.valuenumberStep ativo atual (1 = items, 2 = address, 3 = payment). Controlado via useCheckoutStepper
Stepper.onValueChange(value: number) => voidCallback quando o step muda. Permite navegar para steps já visitados (step <= maxStepReached)
OrderSummarySidebar.orderOrderObjeto 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.checkoutCheckoutStateReturnEstado completo do checkout com order, selectedShipping, consultant, e funções de pagamento (PIX/Cartão)