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