defmodule Oban.Web.Components.Icons do @moduledoc false use Phoenix.Component @icons_path Application.app_dir(:oban_web, ["priv", "static", "icons"]) @outline_path Path.join(@icons_path, "outline") @solid_path Path.join(@icons_path, "solid") @outline_icons @outline_path |> File.ls!() |> Enum.filter(&String.ends_with?(&1, ".svg")) |> Enum.map(&String.trim_trailing(&1, ".svg")) @solid_icons @solid_path |> File.ls!() |> Enum.filter(&String.ends_with?(&1, ".svg")) |> Enum.map(&String.trim_trailing(&1, ".svg")) for icon <- @outline_icons do @external_resource Path.join(@outline_path, "#{icon}.svg") func_name = icon |> String.replace("-", "_") |> String.to_atom() @doc false attr :class, :any, default: "w-6 h-6" attr :rest, :global def unquote(func_name)(assigns) do assigns = assign(assigns, :icon_path, "outline/#{unquote(icon)}.svg") render_icon(assigns) end end for icon <- @solid_icons do @external_resource Path.join(@solid_path, "#{icon}.svg") func_name = icon |> String.replace("-", "_") |> Kernel.<>("_solid") |> String.to_atom() @doc false attr :class, :any, default: "w-6 h-6" attr :rest, :global def unquote(func_name)(assigns) do assigns = assign(assigns, :icon_path, "solid/#{unquote(icon)}.svg") render_icon(assigns) end end # Inline Icons attr :rest, :global, default: %{class: "w-6 h-6"} def oban_pro_logo(assigns) do ~H""" """ end attr :rest, :global, default: %{class: "w-6 h-6"} def spinner(assigns) do ~H""" """ end defp render_icon(assigns) do icon_url = icon_url(assigns.icon_path) class = normalize_class(assigns.class) assigns = assigns |> assign(:icon_url, icon_url) |> assign(:normalized_class, class) ~H"""