defmodule PhoenixKitWeb.Components.Dashboard.Badge do
@moduledoc """
Badge component for dashboard tab indicators.
Renders various badge types with support for:
- Count badges (numeric)
- Dot indicators
- Status badges
- "New" indicators
- Custom text badges
- Pulse and other animations
"""
use Phoenix.Component
alias PhoenixKit.Dashboard.Badge, as: BadgeStruct
@doc """
Renders a dashboard badge.
## Attributes
- `badge` - The Badge struct or nil
- `class` - Additional CSS classes
## Examples
<.dashboard_badge badge={@tab.badge} />
<.dashboard_badge badge={Badge.count(5)} />
"""
attr :badge, :any, default: nil
attr :class, :string, default: ""
def dashboard_badge(assigns) do
~H"""
<%= if @badge && BadgeStruct.visible?(@badge) do %>
<%= case @badge.type do %>
<% :dot -> %>
<.dot_badge badge={@badge} class={@class} />
<% :count -> %>
<.count_badge badge={@badge} class={@class} />
<% :status -> %>
<.status_badge badge={@badge} class={@class} />
<% :new -> %>
<.new_badge badge={@badge} class={@class} />
<% :text -> %>
<.text_badge badge={@badge} class={@class} />
<% _ -> %>
<.count_badge badge={@badge} class={@class} />
<% end %>
<% end %>
"""
end
@doc """
Renders a count badge with optional max value display.
"""
attr :badge, :any, required: true
attr :class, :string, default: ""
def count_badge(assigns) do
value = BadgeStruct.display_value(assigns.badge)
color_class = BadgeStruct.color_class(assigns.badge)
assigns =
assigns
|> assign(:value, value)
|> assign(:color_class, color_class)
~H"""
{@value}
"""
end
@doc """
Renders a dot indicator badge.
"""
attr :badge, :any, required: true
attr :class, :string, default: ""
def dot_badge(assigns) do
color_class = BadgeStruct.dot_color_class(assigns.badge)
assigns = assign(assigns, :color_class, color_class)
~H"""
"""
end
@doc """
Renders a status badge with value and color.
"""
attr :badge, :any, required: true
attr :class, :string, default: ""
def status_badge(assigns) do
value = BadgeStruct.display_value(assigns.badge)
color_class = BadgeStruct.color_class(assigns.badge)
assigns =
assigns
|> assign(:value, value)
|> assign(:color_class, color_class)
~H"""
String.replace("badge-", "text-")}>
{String.capitalize(to_string(@value))}
"""
end
@doc """
Renders a "New" indicator badge.
"""
attr :badge, :any, required: true
attr :class, :string, default: ""
def new_badge(assigns) do
color_class = BadgeStruct.color_class(assigns.badge)
assigns = assign(assigns, :color_class, color_class)
~H"""
New
"""
end
@doc """
Renders a custom text badge.
"""
attr :badge, :any, required: true
attr :class, :string, default: ""
def text_badge(assigns) do
value = BadgeStruct.display_value(assigns.badge)
color_class = BadgeStruct.color_class(assigns.badge)
assigns =
assigns
|> assign(:value, value)
|> assign(:color_class, color_class)
~H"""
{@value}
"""
end
@doc """
Renders a presence indicator showing user count.
"""
attr :count, :integer, default: 0
attr :show_text, :boolean, default: false
attr :class, :string, default: ""
def presence_indicator(assigns) do
~H"""
<%= if @count > 0 do %>
<%= if @show_text do %>
{@count}
<% end %>
<% end %>
"""
end
end