lib/phoenix/ui/components/divider.ex

defmodule Phoenix.UI.Components.Divider do
  @moduledoc """
  Provides divider component.
  """
  use Phoenix.UI, :component

  @default_color "slate"
  @default_variant "full_width"

  @doc """
  Renders divider component.

  ## Examples

      ```
      <.divider />
      ```

  """
  @spec divider(Socket.assigns()) :: Rendered.t()
  def divider(raw) do
    assigns =
      raw
      |> assign_new(:color, fn -> @default_color end)
      |> assign_new(:variant, fn -> @default_variant end)
      |> build_divider_attrs()

    ~H"""
    <hr {@divider_attrs} />
    """
  end

  ### Divider Attrs ##########################

  defp build_divider_attrs(assigns) do
    class = build_class(~w(
      divider
      #{classes(:color, assigns)}
      #{classes(:variant, assigns)}
      #{Map.get(assigns, :extend_class)}
    ))

    attrs =
      assigns
      |> assigns_to_attributes([:color, :variant])
      |> Keyword.put_new(:class, class)

    assign(assigns, :divider_attrs, attrs)
  end

  ### CSS Classes ##########################

  # Color
  defp classes(:color, %{color: color}), do: "border-#{color}-200 dark:border-#{color}-500"

  # Variant
  defp classes(:variant, %{variant: "inset"}), do: "ml-4"
  defp classes(:variant, %{variant: "middle"}), do: "mx-4"

  defp classes(_rule_group, _assigns), do: nil
end