defmodule Iconify do
@moduledoc "./README.md" |> File.stream!() |> Enum.drop(1) |> Enum.join()
use Phoenix.Component
use Arrows
use Untangle
import Phoenix.LiveView.TagEngine
# import Phoenix.LiveView.HTMLEngine
# this is executed at compile time
@cwd File.cwd!()
@doc """
Renders an icon as a `Phoenix.Component` based on the given assigns.
## Examples
iex> assigns = %{icon: "heroicons:user-solid", class: "w-6 h-6", __changed__: nil}
iex> Iconify.iconify(assigns) # Returns rendered icon HTML
iex> assigns = %{icon: "heroicons-solid:user", class: "w-6 h-6", __changed__: nil}
iex> Iconify.iconify(assigns) # Returns rendered icon HTML (v1 backwards compat)
"""
def iconify(assigns) do
with {_, fun, assigns} <- prepare(assigns, assigns[:mode]) do
component(
fun,
assigns,
{__ENV__.module, __ENV__.function, __ENV__.file, __ENV__.line}
)
end
end
@doc """
Prepares an icon based on the given assigns and mode (such as CSS, inline SVG, or image URL).
Heroicons v1 names (heroicons-solid:*, heroicons-outline:*) are automatically translated to v2 equivalents.
## Examples
iex> {:css, _function, %{icon: "heroicons:user-solid", class: "w-4 h-4", icon_name: "heroicons:user-solid"}} = Iconify.prepare(%{icon: "heroicons:user-solid", __changed__: nil}, :css)
iex> {:inline, _fun, %{icon: "heroicons:user-solid"}} = Iconify.prepare(%{icon: "heroicons:user-solid", __changed__: nil}, :inline)
iex> {:img, _fun, %{src: "/images/icons/heroicons/user-solid.svg"}} = Iconify.prepare(%{icon: "heroicons:user-solid", __changed__: nil}, :img)
iex> {:set, _fun, %{href: "/images/icons/heroicons.svg#user-solid"}} = Iconify.prepare(%{icon: "heroicons:user-solid", __changed__: nil}, :set)
iex> {:img, _fun, %{src: "/images/icons/twemoji/rabbit.svg"}} = Iconify.prepare(%{icon: "twemoji:rabbit", __changed__: nil})
iex> {:css, _fun, %{icon_name: "heroicons:question-mark-circle-solid"}} = Iconify.prepare(%{icon: "non-existent-icon", __changed__: nil})
> Iconify.prepare(%{icon: "", __changed__: nil})
{:inline, _fun, %{icon: ""}}
"""
def prepare(assigns, opts \\ [])
def prepare(assigns, opts) when is_map(assigns) and is_list(opts) do
do_prepare(assigns, opts)
catch
{:fallback, "