UIPackage
Menu

Framework

Change language

Boilerplate repo

Icon Box

icon-boxui

Icon container primitive with calibrated sizes (2xs to xl), surface variants (solid, outline, subtle, primary, muted), and 2.5D layered IconStack for empty states and feature hero cards.

Also available for Vue ->

Installation

$npx shadcn@latest add https://uipkge.dev/r/react/icon-box.json
Named registry:npx shadcn@latest add @uipkge-react/icon-boxInstalls to:components/ui/icon-box/

Examples

Loading interactive previews…

Props

NameType / ValuesDefaultRequired
icon

Optional icon component rendered inside the box (e.g. a Lucide icon).

React.ComponentType<{ className?: string; 'aria-hidden'?: boolean | 'true' | 'false' }>optional
variantIconBoxVariantoptional
shapeIconBoxShapeoptional
sizeIconBoxSizeoptional
iconClassstringoptional
iconClassName

@deprecated Use `iconClass`. Kept for backwards compatibility.

stringoptional

Used by

Files installed (3)

  • components/ui/icon-box/icon-box.tsx2.7 kB
    import * as React from 'react'
    import { cn } from '@/lib/utils'
    
    export type IconBoxVariant =
      | 'primary'
      | 'muted'
      | 'outline'
      | 'solid'
      | 'subtle'
      | 'destructive'
      | 'success'
      | 'warning'
      | 'ghost'
      | 'custom'
    
    export type IconBoxSize = '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl'
    export type IconBoxShape = 'rounded' | 'circle' | 'square'
    
    export interface IconBoxProps extends React.HTMLAttributes<HTMLDivElement> {
      /** Optional icon component rendered inside the box (e.g. a Lucide icon). */
      icon?: React.ComponentType<{ className?: string; 'aria-hidden'?: boolean | 'true' | 'false' }>
      variant?: IconBoxVariant
      shape?: IconBoxShape
      size?: IconBoxSize
      iconClass?: string
      /** @deprecated Use `iconClass`. Kept for backwards compatibility. */
      iconClassName?: string
    }
    
    const variantClasses: Record<IconBoxVariant, string> = {
      primary: 'bg-primary/10 text-primary',
      muted: 'bg-muted text-muted-foreground',
      outline: 'border border-border bg-background text-foreground shadow-xs',
      solid: 'bg-foreground text-background shadow-xs',
      subtle: 'bg-accent text-accent-foreground',
      destructive: 'bg-destructive/10 text-destructive',
      success: 'bg-success/15 text-success',
      warning: 'bg-warning/15 text-warning',
      ghost: 'text-muted-foreground hover:bg-accent hover:text-foreground',
      custom: '',
    }
    
    const shapeClasses: Record<IconBoxShape, string> = {
      rounded: 'rounded-lg',
      circle: 'rounded-full',
      square: 'rounded-none',
    }
    
    const sizeClasses: Record<IconBoxSize, string> = {
      '2xs': 'size-6 p-1',
      xs: 'size-7 p-1.5',
      sm: 'size-8 p-1.5',
      md: 'size-9 p-2',
      lg: 'size-11 p-2.5',
      xl: 'size-14 p-3.5',
    }
    
    const iconSizes: Record<IconBoxSize, string> = {
      '2xs': 'size-3',
      xs: 'size-3.5',
      sm: 'size-4',
      md: 'size-4.5',
      lg: 'size-6',
      xl: 'size-7',
    }
    
    const IconBox = React.forwardRef<HTMLDivElement, IconBoxProps>(
      (
        {
          className,
          icon: Icon,
          variant = 'primary',
          shape = 'rounded',
          size = 'md',
          iconClass,
          iconClassName,
          children,
          ...props
        },
        ref,
      ) => (
        <div
          ref={ref}
          data-uipkge=""
          data-slot="icon-box"
          data-variant={variant}
          data-size={size}
          data-shape={shape}
          className={cn(
            'inline-flex shrink-0 items-center justify-center transition-colors',
            variantClasses[variant],
            shapeClasses[shape],
            sizeClasses[size],
            className,
          )}
          {...props}
        >
          {children ? (
            children
          ) : Icon ? (
            <Icon className={cn(iconSizes[size], iconClass ?? iconClassName)} aria-hidden="true" />
          ) : null}
        </div>
      ),
    )
    IconBox.displayName = 'IconBox'
    
    export { IconBox }
    
  • components/ui/icon-box/IconStack.tsx2.9 kB
  • components/ui/icon-box/index.ts0.2 kB

Raw manifest:https://uipkge.dev/r/react/icon-box.json