lib/phoenix/ui/components/helper_text.ex

defmodule Phoenix.UI.Components.HelperText do
  @moduledoc """
  Provides helper text component.
  """
  use Phoenix.UI, :component

  attr(:class, :string, doc: "Override the classes applied to the component.")
  attr(:element, :string, default: "div", doc: "The HTML element to use, such as `div`.")
  attr(:extend_class, :string, doc: "Extend existing classes applied to the component.")
  attr(:rest, :global, doc: "Arbitrary HTML or phx attributes")

  slot(:inner_block, required: true)

  @doc """
  Renders helper text component.

  ## Examples

      <.helper_text>
        We'll never share your email with anyone else.
      </.helper_text>

  """
  @spec helper_text(Socket.assigns()) :: Rendered.t()
  def helper_text(assigns) do
    assigns = assign_class(assigns, ~w(
      helper-text invalid:hidden mt-2 text-sm text-slate-500 dark:text-slate-400
      disabled:text-slate-400 dark:disabled:text-slate-500
    ))

    ~H"""
    <.dynamic_tag class={@class} name={@element} {@rest}>
      <%= render_slot(@inner_block) %>
    </.dynamic_tag>
    """
  end
end