Iconify for Phoenix

Phoenix helpers for using 100,000+ SVG icons from 100+ icon sets compiled by Iconify (visit that site to browse the sets available and preview the icons)

It copies only the icons you use from the iconify library into your project, preparing them on-the-fly when you first use an icon in a view or component (either at compile time if using the Surface component, or on the first run during development).

It can be configured to embed the icons one of three ways:

There is also an optional integration of phoenix_live_favicon so you can set an icon (or emoji) as favicon on a page with Iconify.maybe_set_favicon(socket, icon_name_or_emoji).

Installation

def deps do
  [
    {:iconify_ex, "~> 0.1.0"}
  ]
end

You then need to fetch the latest iconify icon sets by running:

cd deps/iconify_ex/assets && yarn

Usage

  1. Add import Iconify in your Phoenix or LiveView module where you want to use it (or just once in the macros in your Web module).

  2. Set one of these options in config to choose which approach you want to use (see above for explanations):

If using CSS mode, you'll need to set some default styles that apply to all icons, either by adding something like this to your app's main CSS:

[iconify] {
  background-color: currentColor;
  -webkit-mask-size: cover;
  mask-size: cover;
  min-width: 0.5rem;
  min-height: 0.5rem;
}
  1. In all three cases, usage is simple and remains the same:

Embed an icon using default classes (copy the icon name from the iconify website):

<.iconify icon="heroicons-solid:collection" />

Specify custom classes:

<.iconify icon="heroicons-solid:collection" class="w-8 h-8 text-base-content" /> 

Or if you use Surface, it is highly recommended to use the macro component which means icons will be prepared at compile time rather than runtime:

Add alias Iconify.Icon to your Web module, and then:

<#Icon iconify="heroicons-solid:collection" />

If your icon is dynamic, you'll still want to use the first form:

<.iconify icon={@my_icon} />

Note: when using the CSS mode, there's sometimes a race condition that adds an icon several times. Until a fix is found you can run something like sort -u -o icons_dir/icons.css icons_dir/icons.css to clean up the CSS file.