Skip to main content

Actions

Badge code

Copy the implementation or inspect every file that belongs to this component unit.

resources/views/components/ui/badge.blade.php

@props([
    'variant' => 'gray',
    'size' => 'base',
    'icon' => null,
    'iconWeight' => 'fill',
    'dot' => false,
    'pill' => true,
    'pulseDot' => null,
    'pulseIcon' => null,
])

@php
    /*
    | Small status/label pill.
    |
    | Variants: gray, brand, green, red, amber, blue, outline
    | Sizes:    sm, base, lg
    |
    | Usage:
    |   <x-ui.badge variant="green" dot>Active</x-ui.badge>
    |   <x-ui.badge variant="brand" dot pulse-dot>Deploying</x-ui.badge>
    */
    $pulseIndicatorVariants = ['green', 'brand'];
    $shouldPulseDot = $dot && ($pulseDot ?? in_array($variant, $pulseIndicatorVariants, true));
    $shouldPulseIcon = $icon && ($pulseIcon ?? in_array($variant, $pulseIndicatorVariants, true));

    $variants = [
        'gray' => 'bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300',
        'brand' => 'bg-brand-50 dark:bg-brand-950/60 text-brand-700 dark:text-brand-300',
        'green' => 'bg-green-50 dark:bg-green-950/60 text-green-700 dark:text-green-300',
        'red' => 'bg-red-50 dark:bg-red-950/60 text-red-700 dark:text-red-300',
        'amber' => 'bg-amber-50 dark:bg-amber-950/60 text-amber-700 dark:text-amber-300',
        'blue' => 'bg-accent-50 dark:bg-accent-950/60 text-accent-700 dark:text-accent-300',
        'outline' => 'border border-gray-300 dark:border-gray-700 text-gray-600 dark:text-gray-300',
    ];

    $dotColors = [
        'gray' => 'bg-gray-400', 'brand' => 'bg-brand-500', 'green' => 'bg-green-500',
        'red' => 'bg-red-500', 'amber' => 'bg-amber-500', 'blue' => 'bg-accent-500', 'outline' => 'bg-gray-400',
    ];

    $sizes = [
        'sm' => 'text-xs px-2 py-0.5 gap-1',
        'base' => 'text-xs px-2.5 py-1 gap-1.5',
        'lg' => 'text-sm px-3 py-1 gap-1.5',
    ];

    $classes = implode(' ', [
        'inline-flex items-center font-medium',
        $pill ? 'rounded-full' : 'rounded-md',
        $variants[$variant] ?? $variants['gray'],
        $sizes[$size] ?? $sizes['base'],
    ]);
@endphp

<span {{ $attributes->merge(['class' => $classes]) }}>
    @if ($dot)
        <span @class([
            'h-1.5 w-1.5 rounded-full',
            $dotColors[$variant] ?? $dotColors['gray'],
            'animate-pulse' => $shouldPulseDot,
        ])></span>
    @endif
    @if ($icon)
        <x-ui.icon :name="$icon" :weight="$iconWeight" size="sm" :class="$shouldPulseIcon ? 'animate-pulse' : null" />
    @endif
    {{ $slot }}
</span>