PhlexIcons brings 19,250+ SVG icons to Phlex through a single, consistent API:
- Bootstrap Icons (2,050+)
- Flag Icons (250+)
- Heroicons (300+)
- Hugeicons (4,450+)
- Lucide Icons (1,600+)
- Material Design Icons (2,100+)
- RadixUI Icons (300+)
- Remix Icons (3,050+)
- Tabler Icons (4,950+)
More packs can be added over time.
Prefer not to include every pack? Install only the packs you need with these gems:
- phlex-icons-bootstrap
- phlex-icons-flag
- phlex-icons-hero
- phlex-icons-huge
- phlex-icons-lucide
- phlex-icons-material
- phlex-icons-radix
- phlex-icons-remix
- phlex-icons-tabler
Thanks nejdetkadir for creating Phlex::Heroicons as it was the base for this gem.
Other Phlex icon gems:
- Unified API: One way to render icons across all supported packs.
- Use everything or just a pack: Depend on the main gem or install per-pack gems.
- Configurable defaults: Global defaults and per-pack variants.
- Works anywhere Phlex works: With
Phlex::Kitor plain Phlex components. - Rails helper: Simple
phlex_iconhelper (name is configurable). - Custom icons: Add your own icons alongside built-in packs.
- Kept up-to-date: Auto-generated packs and weekly updates.
Install the gem and add it to the application's Gemfile by executing:
bundle add phlex-iconsIf bundler is not being used to manage dependencies, install the gem by executing:
gem install phlex-iconsrequire 'phlex-icons' # Not needed in Rails apps; Bundler will require it.
class IconsDemo < Phlex::HTML
include PhlexIcons
def view_template
div do
Hero::Home(variant: :solid, class: 'w-6 h-6')
Icon('bootstrap/house', class: 'w-6 h-6') # string form
end
end
endThe gem provides global configuration options and per-pack options.
PhlexIcons.configure do |config|
config.default_classes = 'size-6'
config.helper_method_name = :phlex_icon # Default: :phlex_icon
config.default_pack = :hero # Default: nil. Accepts :symbol, "string", or Class (e.g., PhlexIcons::Hero)
end
# OR
PhlexIcons.configuration.default_classes = 'size-6'
PhlexIcons.configuration.helper_method_name = :phlex_icon
PhlexIcons.configuration.default_pack = :heroNothing to configure for Bootstrap Icons.
PhlexIcons::Flag.configure do |config|
config.default_variant = :square # or :rectangle
end
# OR
PhlexIcons::Flag.configuration.default_variant = :square # or :rectanglePhlexIcons::Hero.configure do |config|
config.default_variant = :solid # or :outline
end
# OR
PhlexIcons::Hero.configuration.default_variant = :solid # or :outlineNothing to configure for Hugeicons, as we are providing only the free stroke variant.
Nothing to configure for Lucide Icons.
PhlexIcons::Material.configure do |config|
config.default_variant = :filled # or :outlined, :round, :sharp, :two_tone
end
# OR
PhlexIcons::Material.configuration.default_variant = :filled # or :outlined, :round, :sharp, :two_toneNothing to configure for RadixUI Icons.
Nothing to configure for Remix Icons.
PhlexIcons::Tabler.configure do |config|
config.default_variant = :outline # or :filled
end
# OR
PhlexIcons::Tabler.configuration.default_variant = :outline # or :filledrequire 'phlex-icons' # No need to require the gem if you are using it in a Rails application.
class IconsDemo < Phlex::HTML
include PhlexIcons
def view_template
div do
Bootstrap::House(class: 'size-4')
Flag::Sa(variant: :rectangle, class: 'size-4')
Hero::Home(variant: :solid, class: 'size-4')
Huge::Home08(variant: :stroke, class: 'size-4')
Lucide::House(class: 'size-4')
Material::House(variant: :filled, class: 'size-4')
Radix::Home(class: 'size-4')
Remix::HomeLine(class: 'size-4')
Tabler::Home(variant: :filled, class: 'size-4')
# or with a string
Icon('bootstrap/house', class: 'size-4')
end
end
endrequire 'phlex-icons' # No need to require the gem if you are using it in a Rails application.
class IconsDemo < Phlex::HTML
def view_template
div do
render PhlexIcons::Bootstrap::House.new(class: 'size-4')
render PhlexIcons::Flag::Sa.new(variant: :rectangle, class: 'size-4')
render PhlexIcons::Hero::Home.new(variant: :solid, class: 'size-4')
render PhlexIcons::Huge::Home08.new(variant: :stroke, class: 'size-4')
render PhlexIcons::Lucide::House.new(class: 'size-4')
render PhlexIcons::Material::House.new(variant: :filled, class: 'size-4')
render PhlexIcons::Radix::Home.new(class: 'size-4')
render PhlexIcons::Remix::HomeLine.new(class: 'size-4')
render PhlexIcons::Tabler::Home.new(variant: :filled, class: 'size-4')
# or with a string
render PhlexIcons::Icon.new('bootstrap/house', class: 'size-4')
end
end
endPhlexIcons provides a convenient helper method to render icons directly in your ERB or Phlex views.
By default, the helper method is named phlex_icon, but it is configurable. You can change it by configuring PhlexIcons.configuration.helper_method_name.
To use the helper method inside Phlex views/components, you need to register it in your base component (Or any other component) using register_output_helper.
<%# Render a Bootstrap house icon with default size %>
<%= phlex_icon 'bootstrap/house' %>
<%# Render a Heroicons solid home icon with a specific class %>
<%= phlex_icon 'hero/home', variant: :solid, class: 'w-5 h-5 text-blue-500' %>
<%# Render a Tabler home icon, filled variant %>
<%= phlex_icon 'tabler/home:filled' %>
<%# If default_pack = :hero, render a Heroicons home icon %>
<%= phlex_icon 'home', class: 'w-6 h-6' %>
<%# Render a Flag icon (rectangle variant is default for flags if not configured otherwise) %>
<%= phlex_icon 'flag/sa' %>
<%# Render a custom icon %>
<%= phlex_icon 'custom/my_awesome_icon:variant_name' %>The first argument is the icon identifier. Such as: 'pack/icon_name:variant'.
- If
default_packis configured, you can omit the pack name (e.g.,'icon_name:variant'instead of'pack/icon_name:variant'). - The
:variantpart is optional. - Examples:
'hero/house:solid','house:solid','house'
Subsequent arguments are passed as options to the icon component, such as variant, class, etc.
For example, to use only Heroicons and Flag Icons, add:
Then, in your application, you can use the icons like this:
require 'phlex-icons-flag' # No need to require the gem if you are using it in a Rails application.
require 'phlex-icons-hero' # No need to require the gem if you are using it in a Rails application.
class PhlexIcons < Phlex::HTML
include PhlexIcons # If you want to use Phlex::Kit.
def view_template
div do
# With Phlex::Kit.
Flag::Sa(variant: :rectangle, class: 'size-4')
Hero::Home(variant: :solid, class: 'size-4')
# Without Phlex::Kit.
render PhlexIcons::Flag::Sa.new(variant: :rectangle, class: 'size-4')
render PhlexIcons::Hero::Home.new(variant: :solid, class: 'size-4')
end
end
endTo add your own icons in a Rails app, create a phlex_icons/custom directory under app/components, then create one component per icon. For example:
# app/components/phlex_icons/custom/icon_class_name.rb
module PhlexIcons
module Custom
class IconClassName < PhlexIcons::Base
def view_template
# SVG code here.
end
end
end
endNow, you can use your custom icons like any other icon pack as described above.
All packs are generated from the scripts under generators. Clone the repo and run the relevant generator to update a pack. A GitHub Action also regenerates all packs weekly and ships updates.
Each pack exposes a VERSION constant indicating the source version used by the gem. For example: PhlexIcons::Bootstrap::VERSION.
After checking out the repo, open it in VS Code and choose Reopen in Container to start a development container. Then run rake spec to execute tests. Use bin/console to experiment interactively.
If you prefer not to use the dev container, install Mise and run mise trust && mise install to set up dependencies.
To install this gem locally, run bundle exec rake install. To release a new version, update the version number in version.rb, then run bundle exec rake release to tag, push, and publish the gem to rubygems.org.
Bug reports and pull requests are welcome on GitHub at https://github.com/AliOsm/phlex-icons. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.
The gem is available as open source under the terms of the MIT License.
Everyone interacting in the PhlexIcons project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.