Plan Display

1.0.4

O pattern PlanDisplay organiza planos ou opções de forma comparativa e visual, ideal para mostrar preços, benefícios ou níveis de assinatura com layout flexível e personalizável.

import React from "react";
import { PlanDisplay } from "@nimbus-ds/patterns";
import { CheckIcon, CloseIcon } from "@nimbus-ds/icons";
import { Box, Title, Text, Button } from "@nimbus-ds/components";
import { mockPlanDisplayLabels } from "lib/mocks/mock-labels";

const Example: React.FC = () => (
  <PlanDisplay minWidth={{ xs: "150px", md: "500px" }} mx="4">
    <PlanDisplay.Card>
      <PlanDisplay.Header
        subtitle="Punto de venta"
        title={
          <Box display="flex" gap="1">
            <Title as="h3" color="neutral-textLow">
              Plan
            </Title>
            <Title as="h3" color="neutral-textHigh">
              Básico
            </Title>
          </Box>
        }
      >
        <Title as="h5">Suscripción gratuita</Title>
        <Text fontWeight="bold" fontSize="highlight">
          1.5% costo por transacción
        </Text>
      </PlanDisplay.Header>
      <PlanDisplay.Content>
        {mockPlanDisplayLabels.slice(0, 4).map((label) => (
          <PlanDisplay.Bullet key={label} icon={<CheckIcon />}>
            {label}
          </PlanDisplay.Bullet>
        ))}
        {mockPlanDisplayLabels.slice(4).map((label) => (
          <PlanDisplay.Bullet key={label} icon={<CloseIcon />} disabled>
            {label}
          </PlanDisplay.Bullet>
        ))}
      </PlanDisplay.Content>
    </PlanDisplay.Card>
    <PlanDisplay.Card highlighted>
      <PlanDisplay.Header
        subtitle="Punto de venta"
        title={
          <Box display="flex" gap="1">
            <Title as="h3" color="neutral-textLow">
              Plan
            </Title>
            <Title as="h3" color="neutral-textHigh">
              Avanzado
            </Title>
          </Box>
        }
      >
        <Title as="h5">$14.999 / mes</Title>
        <Text fontWeight="bold" fontSize="highlight">
          0.15% costo por transacción
        </Text>
      </PlanDisplay.Header>
      <PlanDisplay.Content>
        {mockPlanDisplayLabels.map((label) => (
          <PlanDisplay.Bullet key={label} icon={<CheckIcon />}>
            {label}
          </PlanDisplay.Bullet>
        ))}
      </PlanDisplay.Content>
      <PlanDisplay.Footer>
        <Box
          display="flex"
          flexDirection="column"
          justifyContent="center"
          alignItems="center"
          width="100%"
          gap="2"
        >
          <Button appearance="primary">
            <Text fontSize="base" color="currentColor">
              Comenzar gratis*
            </Text>
          </Button>
          <Text fontSize="caption">
            *Al finalizar la prueba podrás elegir cancelar, continuar o cambiar
            de plan
          </Text>
        </Box>
      </PlanDisplay.Footer>
    </PlanDisplay.Card>
  </PlanDisplay>
);

export default Example;

Instale o componente via terminal.

npm install @nimbus-ds/plan-display
  • Ajudar o usuário a comparar planos ou opções antes de contratar um serviço ou funcionalidade.
  • Se a decisão depende de entender claramente as diferenças de benefícios ou funcionalidades.
  • Quando o produto ou serviço tem apenas uma opção disponível, sem necessidade de comparação.
  • Se o objetivo principal da tela é informativo ou educativo, e não requer uma ação imediata de seleção ou contratação.
  • Em casos onde os benefícios não são suficientemente diferenciáveis e podem gerar confusão em vez de facilitar a escolha.
  • Focar o fluxo na ação principal: Mostrar claramente o plano recomendado com um botão de CTA visível e destacado para agilizar a escolha.
  • Minimizar telas de confirmação: Evitar passos desnecessários após a seleção do plano. Redirecionar automaticamente para o próximo passo do fluxo.
  • Suporte completo de navegação por teclado: Os cards e botões devem ser navegáveis com Tab e ativáveis com Enter ou Space.
  • Contraste de cor suficiente (WCAG AA): Garantir legibilidade entre títulos, bullets, preços e fundo, especialmente no plano destacado.
  • Uso correto de roles e landmarks ARIA: Rotular corretamente botões e seções para compatibilidade com leitores de tela.

O Plan Display pode conter:

  • Card
  • Header
  • Spacing
  • Bullet list
  • Spacing (opcional)
  • Button (opcional)
  • Disclaimer (opcional)
Imagem do diagrama mostrando os componentes: card, header, spacing, bullet list, button e disclaimer

Este componente utiliza: #card, #text, #title, #bullet, #button, #spacing

  • Dois planos.
Imagem do layout comparativo mostrando dois planos lado a lado com preços e funcionalidades
  • Três planos.
Imagem do layout comparativo mostrando três planos lado a lado com plano central destacado

✅ Do

  • Mostrar um título claro por plano. O cabeçalho deve comunicar o nome ou nível do plano de forma diferenciada e compreensível.
  • Usar bullets para comparar funcionalidades. Liste benefícios-chave com ícones visuais para facilitar a leitura e comparação.
  • Destacar visualmente o plano recomendado ou mais completo. Use borda colorida e botão para guiar a escolha.
  • Incluir preços e condições claras. Mostre o custo e condições relevantes (como comissões ou período de teste).
  • Garantir consistência na ordem dos atributos. Mostre as funcionalidades na mesma ordem em todos os planos.
  • Mostrar um CTA claro no plano selecionável. Use botões para ações como "Começar teste" ou "Contratar".

❌ Don't

  • Não usar descrições longas. Evite parágrafos extensos ou texto técnico; mantenha os bullets breves e escaneáveis.
  • Não alterar a ordem dos itens entre planos. Isso dificulta a comparação visual rápida.
  • Não ocultar condições-chave. Informações como preços, limites ou comissões devem ser visíveis.

Desktop

Imagem da visualização em desktop com planos organizados horizontalmente em layout de grade

Mobile

Imagem da visualização em mobile com planos empilhados verticalmente e ajustes de responsividade

Propriedades adicionais podem ser passadas para o componente <PlanDisplay>. Consulte a documentação div para obter a lista de propriedades aceitas pelo componente <PlanDisplay>.

PlanDisplay

NameTypeDefaultDescription

minPlanWidth

string

children*

React.ReactNode

Content of the PlanDisplay

PlanDisplay.Card

NameTypeDefaultDescription

highlighted

boolean

PlanDisplay.Bullet

NameTypeDefaultDescription

icon

disabled

boolean

PlanDisplay.CardHeader

NameTypeDefaultDescription

subtitle*

string

title

PlanDisplay.CardContent

NameTypeDefaultDescription

children

PlanDisplay.CardSpacing

NameTypeDefaultDescription