Class: Yattho::Beta::Octicon

Inherits:
Component
  • Object
show all
Defined in:
app/components/yattho/beta/octicon.rb

Overview

‘Octicon` renders an <%= link_to_octicons %> with <%= link_to_system_arguments_docs %>. `Octicon` can also be rendered with the `yattho_octicon` helper, which accepts the same arguments.

Direct Known Subclasses

OcticonComponent

Constant Summary collapse

SIZE_XSMALL =
:xsmall
SIZE_DEFAULT =
:small
SIZE_MEDIUM =
:medium
SIZE_MAPPINGS =
{
  SIZE_XSMALL => 12,
  SIZE_DEFAULT => 16,
  SIZE_MEDIUM => 24
}.freeze
SIZE_OPTIONS =
SIZE_MAPPINGS.keys

Constants inherited from Component

Component::INVALID_ARIA_LABEL_TAGS

Constants included from Status::Dsl

Status::Dsl::STATUSES

Constants included from ViewHelper

ViewHelper::HELPERS

Constants included from TestSelectorHelper

TestSelectorHelper::TEST_SELECTOR_TAG

Constants included from FetchOrFallbackHelper

FetchOrFallbackHelper::InvalidValueError

Instance Method Summary collapse

Methods inherited from Component

deprecated?, generate_id

Methods included from JoinStyleArgumentsHelper

#join_style_arguments

Methods included from TestSelectorHelper

#add_test_selector

Methods included from FetchOrFallbackHelper

#fetch_or_fallback, #fetch_or_fallback_boolean, #silence_deprecations?

Methods included from ClassNameHelper

#class_names

Constructor Details

#initialize(icon_name = nil, icon: nil, size: SIZE_DEFAULT, use_symbol: false, **system_arguments) ⇒ Octicon

Returns a new instance of Octicon.

Examples:

Default

<%= render(Yattho::Beta::Octicon.new(:check)) %>
<%= render(Yattho::Beta::Octicon.new(icon: :check)) %>

Medium

<%= render(Yattho::Beta::Octicon.new(:people, size: :medium)) %>

Helper

<%= yattho_octicon(:check) %>

Parameters:

  • icon_name (Symbol, String) (defaults to: nil)

    Name of <%= link_to_octicons %> to use.

  • icon (Symbol, String) (defaults to: nil)

    Name of <%= link_to_octicons %> to use.

  • size (Symbol) (defaults to: SIZE_DEFAULT)

    <%= one_of(Yattho::Beta::Octicon::SIZE_MAPPINGS, sort: false) %>

  • use_symbol (Boolean) (defaults to: false)

    EXPERIMENTAL (May change or be removed) - Set to true when using with <%= link_to_component(Yattho::Alpha::OcticonSymbols) %>.

  • system_arguments (Hash)

    <%= link_to_system_arguments_docs %>



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'app/components/yattho/beta/octicon.rb', line 38

def initialize(icon_name = nil, icon: nil, size: SIZE_DEFAULT, use_symbol: false, **system_arguments)
  icon_key = icon_name || icon

  # Don't allow sizes under 16px
  if (system_arguments[:height].present? && system_arguments[:height].to_i < 16) || (system_arguments[:width].present? && system_arguments[:width].to_i < 16)
    system_arguments.delete(:height)
    system_arguments.delete(:width)
  end

  cache_key = Yattho::Octicon::Cache.get_key(
    symbol: icon_key,
    size: size,
    height: system_arguments[:height],
    width: system_arguments[:width]
  )

  @system_arguments = system_arguments
  @system_arguments[:tag] = :svg
  @system_arguments[:aria] ||= {}
  @use_symbol = use_symbol

  if @system_arguments[:aria][:label] || @system_arguments[:'aria-label']
    @system_arguments[:role] = "img"
  else
    @system_arguments[:aria][:hidden] = true
  end

  if (cache_icon = Yattho::Octicon::Cache.read(cache_key))
    @icon = cache_icon
  else
    # Filter out classify options to prevent them from becoming invalid html attributes.
    # Note height and width are both classify options and valid html attributes.
    octicon_options = {
      height: @system_arguments[:height] || SIZE_MAPPINGS[fetch_or_fallback(SIZE_OPTIONS, size, SIZE_DEFAULT)],
      width: @system_arguments[:width]
    }
    octicon_options.compact!

    @icon = Octicons::Octicon.new(icon_key, octicon_options)
    Yattho::Octicon::Cache.set(cache_key, @icon)
  end

  @system_arguments[:classes] = class_names(
    @icon.options[:class],
    @system_arguments[:classes]
  )
  @system_arguments.merge!(@icon.options.except(:class, :'aria-hidden'))
end