Plan Display

1.0.4

El pattern PlanDisplay organiza planes u opciones de forma comparativa y visual, ideal para mostrar precios, beneficios o niveles de suscripción con disposición flexible y personalizable.

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;

Instala el componente via terminal.

npm install @nimbus-ds/plan-display
  • Ayudar al usuario a comparar planes u opciones antes de contratar un servicio o funcionalidad.
  • Si la decisión depende de entender claramente las diferencias de beneficios o funcionalidades.
  • Cuando el producto o servicio tiene una sola opción disponible, sin necesidad de comparación.
  • Si el objetivo principal de la pantalla es informativo o educativo, y no requiere una acción inmediata de selección o contratación.
  • En casos donde los beneficios no son lo suficientemente diferenciables y pueden generar confusión en lugar de facilitar la elección.
  • Enfocar el flujo en la acción principal: Mostrar claramente el plan recomendado con un botón de CTA visible y destacado para agilizar la elección.
  • Minimizar pantallas de confirmación: Evitar pasos innecesarios tras la selección del plan. Redirigir automáticamente al siguiente paso del flujo.
  • Soporte completo de navegación por teclado: Las cards y botones deben ser navegables con Tab y activables con Enter o Space.
  • Contraste de color suficiente (WCAG AA): Garantizar legibilidad entre títulos, bullets, precios y fondo, especialmente en el plan destacado.
  • Uso correcto de roles y landmarks ARIA: Etiquetar correctamente botones y secciones para compatibilidad con lectores de pantalla.

El Plan Display puede contener:

  • Card
  • Header
  • Spacing
  • Bullet list
  • Spacing (opcional)
  • Button (opcional)
  • Disclaimer (opcional)
Imagen del diagrama mostrando los componentes: card, header, spacing, bullet list, button y disclaimer

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

  • Dos planes.
Imagen del layout comparativo mostrando dos planes lado a lado con precios y funcionalidades
  • Tres planes.
Imagen del layout comparativo mostrando tres planes lado a lado con plan central destacado

✅ Do

  • Mostrar un título claro por plan. El encabezado debe comunicar el nombre o nivel del plan de forma diferenciada y entendible.
  • Usar bullets para comparar funcionalidades. Lista beneficios clave con íconos visuales para facilitar la lectura y comparación.
  • Destacar visualmente el plan recomendado o más completo. Usá borde de color y botón para guiar la elección.
  • Incluir precios y condiciones claras. Muestra el costo y condiciones relevantes (como comisiones o periodo de prueba).
  • Asegurar consistencia en el orden de atributos. Muestra las funcionalidades en el mismo orden en todos los planes.
  • Mostrar un CTA claro en el plan seleccionable. Usá botones para acciones como "Comenzar prueba" o "Contratar".

❌ Don't

  • No usar descripciones largas. Evitá párrafos extensos o texto técnico; mantené los bullets breves y escaneables.
  • No alterar el orden de ítems entre planes. Eso dificulta la comparación visual rápida.
  • No ocultar condiciones clave. Información como precios, límites o comisiones deben ser visibles.

Desktop

Imagen de la visualización en desktop con planes organizados horizontalmente en layout de grilla

Mobile

Imagen de la visualización en mobile con planes apilados verticalmente y ajustes de responsividad

Se pueden pasar propiedades adicionales al componente <PlanDisplay>. Revisa la documentación del div para ver la lista de props aceptadas por el 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