defmodule PineUi.Badge do @moduledoc """ Provides badge components for status indicators. The Badge module offers several variants for indicating status: - `base/1` - Simple colored badge - `dot/1` - Badge with a status dot - `dismissible/1` - Badge that can be dismissed """ use Phoenix.Component import Phoenix.HTML @doc """ Renders a basic badge component. ## Examples <.base variant="success">Completed <.base variant="warning" class="ml-2">Pending ## Options * `:variant` - Color variant: "success", "warning", "danger", "info", "purple", "pink", "indigo", or "default" (gray) * `:class` - Additional CSS classes (optional) * `:icon` - HTML string for an icon to display before text (optional) """ def base(assigns) do assigns = assign_new(assigns, :class, fn -> "" end) ~H""" <%= if Map.get(assigns, :icon, nil) do %> <%= @icon %> <% end %> <%= render_slot(@inner_block) %> """ end defp get_color_classes(variant) do case variant do "success" -> "bg-green-100 text-green-800" "warning" -> "bg-yellow-100 text-yellow-800" "danger" -> "bg-red-100 text-red-800" "info" -> "bg-blue-100 text-blue-800" "purple" -> "bg-purple-100 text-purple-800" "pink" -> "bg-pink-100 text-pink-800" "indigo" -> "bg-indigo-100 text-indigo-800" _ -> "bg-gray-100 text-gray-800" # default end end @doc """ Renders a badge with a status dot. ## Examples <.dot variant="success">Active <.dot variant="danger" class="ml-2">Offline ## Options * `:variant` - Color variant: "success", "warning", "danger", "info", "purple", "pink", "indigo", or "default" (gray) * `:class` - Additional CSS classes (optional) """ def dot(assigns) do assigns = assign_new(assigns, :class, fn -> "" end) ~H""" <%= render_slot(@inner_block) %> """ end defp get_dot_color(variant) do case variant do "success" -> "text-green-500" "warning" -> "text-yellow-500" "danger" -> "text-red-500" "info" -> "text-blue-500" "purple" -> "text-purple-500" "pink" -> "text-pink-500" "indigo" -> "text-indigo-500" _ -> "text-gray-500" # default end end @doc """ Renders a dismissible badge. ## Examples <.dismissible variant="info">New Feature <.dismissible variant="purple" class="ml-2">Beta ## Options * `:variant` - Color variant: "success", "warning", "danger", "info", "purple", "pink", "indigo", or "default" (gray) * `:class` - Additional CSS classes (optional) """ def dismissible(assigns) do assigns = assign_new(assigns, :class, fn -> "" end) ~H""" <%= render_slot(@inner_block) %> """ end end