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