if Code.ensure_loaded?(Surface) do
defmodule Iconify.Icon do
use Surface.MacroComponent
# any icon from iconify: https://icones.js.org
prop iconify, :string, required: false, static: true
# shorthand for heroicons solid icons
prop solid, :string, required: false, static: true
# shorthand for heroicons outline icons
prop outline, :string, required: false, static: true
# pass SVG markup directly
prop svg, :string, default: nil, required: false, static: true
prop class, :css_class, default: "w-4 h-4"
def expand(attributes, _content, meta) do
static_props =
Surface.MacroComponent.eval_static_props!(__MODULE__, attributes, meta.caller)
svg = svg_icon(static_props)
class = Surface.AST.find_attribute_value(attributes, :class) || ""
icon = prepare_icon_name(static_props)
# TODO? simply include the phoenix component like so instead of duplicating logic, see https://github.com/surface-ui/surface/pull/685#issuecomment-1505978390
# quote_surface caller: meta.caller do
# ~F"""
#
# """
# end
if is_nil(svg) do
case Iconify.prepare(%{icon: icon}) do
{:css, _fun, %{icon_name: icon_name}} ->
# icon_class = "#{Iconify.css_class()} #{icon_css_name} #{class_to_string(class)}"
quote_surface do
~F"""
"""
end
{:img, _fun, %{src: src}} ->
quote_surface do
~F"""
"""
end
{:inline, fun, _assigns} ->
quote_surface do
~F"""
<{^fun} class={^class} />
"""
end
end
else
quote_surface do
~F"""
{^svg}
"""
end
end
end
defmacro icon_name(icon) do
name = prepare_icon_name(icon)
Iconify.prepare(%{icon: name}, :css)
|> IO.inspect(label: "prepared icon")
name
end
defp svg_icon(%{svg: svg}) when is_binary(svg) do
svg
end
defp svg_icon(%{iconify: "