class Heroicon::Icon

Attributes

name[R]
options[R]
path_options[R]
variant[R]

Public Class Methods

new(name:, variant:, options:, path_options:) click to toggle source
# File lib/heroicon/icon.rb, line 7
def initialize(name:, variant:, options:, path_options:)
  @name = name
  @variant = safe_variant(variant)
  @options = options
  @path_options = path_options
end

Private Class Methods

render(**kwargs) click to toggle source
# File lib/heroicon/icon.rb, line 99
def render(**kwargs)
  new(**kwargs).render
end

Public Instance Methods

render() click to toggle source
# File lib/heroicon/icon.rb, line 14
def render
  return warning unless file.present?

  doc = Nokogiri::HTML::DocumentFragment.parse(file)
  svg = doc.at_css "svg"

  path_options.each do |key, value|
    attribute = key.to_s.dasherize
    svg.css("path[#{attribute}]").each do |item|
      item[attribute] = value.to_s
    end
  end

  prepend_default_class_name

  options.each do |key, value|
    svg[key.to_s] = value
  end

  doc
end

Private Instance Methods

disable_default_class?() click to toggle source
# File lib/heroicon/icon.rb, line 62
def disable_default_class?
  @disable_default_class ||= !!options.delete(:disable_default_class)
end
file() click to toggle source
# File lib/heroicon/icon.rb, line 74
def file
  @file ||= File.read(file_path).force_encoding("UTF-8")
rescue
  nil
end
file_path() click to toggle source
# File lib/heroicon/icon.rb, line 80
def file_path
  File.join(Heroicon.root, "app/assets/images/heroicon/#{variant}/#{name}.svg")
end
prepend_default_class_name() click to toggle source

Prepends the default CSS class name for an icon. You can provide a String, which will apply to all icons, or a Hash, which will apply to the specified variant.

@example

Heroicon.configure do |config|
  config.default_class = { solid: "h-5 w-5", outline: "h-6 w-6" }
end

#=> <svg class="h-5 w-5">...</svg>
# File lib/heroicon/icon.rb, line 48
def prepend_default_class_name
  return if disable_default_class?

  default_class_config = Heroicon.configuration.default_class

  default_class = if default_class_config.is_a?(String)
    default_class_config
  elsif default_class_config.is_a?(Hash)
    default_class_config[variant]
  end

  options[:class] = "#{default_class} #{options[:class]}".strip if default_class.present?
end
safe_variant(provided_variant) click to toggle source
# File lib/heroicon/icon.rb, line 66
def safe_variant(provided_variant)
  if %i[solid outline].include?(provided_variant.to_sym)
    provided_variant
  else
    :solid
  end
end
warning() click to toggle source
# File lib/heroicon/icon.rb, line 84
    def warning
      return unless Rails.env.development?

      script = <<-HTML
      <script type="text/javascript">
      //<![CDATA[
      console.warn("Heroicon: Failed to find heroicon: #{name}")
      //]]>
      </script>
      HTML

      script.strip
    end