Display

IconCircle

Contenedor circular para iconos

Preview

size
icon
weight

Code

import css from "./IconCircle.module.css";

import type { Icon, IconWeight } from "@phosphor-icons/react";

type Size = "xs" | "sm" | "md" | "lg";

interface ResponsiveSize {
  base: Size;
  mobile?: Size;
  tablet?: Size;
  desktop?: Size;
  wide?: Size;
}

interface IconCircleProps {
  size?: Size | ResponsiveSize;
  customSize?: string;
  customBorder?: string;
  weight: IconWeight;
  icon: Icon;
}

function getSizeClasses(size: Size | ResponsiveSize): string {
  if (typeof size === "string") {
    return css[size];
  }

  const classes = [css[`${size.base}_base`]];

  if (size.mobile) classes.push(css[`${size.mobile}_mobile`]);
  if (size.tablet) classes.push(css[`${size.tablet}_tablet`]);
  if (size.desktop) classes.push(css[`${size.desktop}_desktop`]);
  if (size.wide) classes.push(css[`${size.wide}_wide`]);

  return classes.join(" ");
}

export default function IconCircle({
  size,
  customSize,
  customBorder,
  weight,
  icon: IconComponent,
}: IconCircleProps) {
  const customStyle =
    customSize || customBorder
      ? { width: customSize, height: customSize, borderWidth: customBorder }
      : undefined;

  return (
    <div
      className={`${css.circle} ${size ? getSizeClasses(size) : ""}`}
      style={customStyle}
      aria-hidden="true"
    >
      <IconComponent weight={weight} />
    </div>
  );
}

Props

PropTypeRequiredDescription
iconIconrequiredComponente de icono de Phosphor a renderizar. Es decorativo y queda oculto a lectores de pantalla.
weightIconWeightrequiredGrosor del trazo del icono.
size"xs" | "sm" | "md" | "lg" | ResponsiveSize—Diámetro del círculo y grosor de su borde. Omítelo solo si pasas customSize. Fijo o responsive.
customSizestring—Diámetro a medida (cualquier unidad CSS); sustituye a size.
customBorderstring—Grosor del borde a medida (cualquier unidad CSS).