heroicons_helper 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ea79c1638e02674896f2f251375b879df8e289d10c39bd1b6550b35f65bb667e
4
- data.tar.gz: 49e4f89e38f7ceec4e09970d9864f859424f4e59f314b40353df87e73ff128b9
3
+ metadata.gz: 2a4fd38721f8363f1f2b36b45cec732c0dba30f7ac3ad5d1cb243a8e5a722bda
4
+ data.tar.gz: 59333a78638dacbc4690bc22d231382d79addea64d4bb703b2efbdb4ccc052df
5
5
  SHA512:
6
- metadata.gz: c4c7715c0dc796769dd80fd26e38a56bbccadb1c00418ac0ff8911722679bd571e2a2cb058ecbf3931e9c6da3020628239ee5500ef90b05aed66c53f856bec5c
7
- data.tar.gz: 0257f55a823a70b7147b4ac0d7c3051fd407febea7577b0ffd2cc9bb2e14b7582299daae2a425f273de59ca7bd4dd5ddd51181baeb5ac40cdd47c1006224a324
6
+ metadata.gz: 1aef948793f04e86a224734f44da163f037a26c74f392757c0cb0b7546ae26edbfb00ef6ef0bd5bed5bea6b93be49933f3c432f28c94b9654b2905028dced010
7
+ data.tar.gz: 40c2239119dc8de51e43e55260e2bd9190faaad885ae1e53f4a5b4a24eb2420f5cc5d0e5fb13658c9a5cae55563d319fd858895a23dedbb5611da192d87bb654
data/README.md CHANGED
@@ -37,7 +37,7 @@ where
37
37
  This one method call returns an object that represents the Heroicon, and you should call `to_svg` to get the resulting SVG string:
38
38
 
39
39
  ```ruby
40
- outline_icon = heroicon("x", "outline")
40
+ outline_icon = heroicon("x", variant: HeroiconsHelper::Icon::VARIANT_OUTLINE)
41
41
  puts outline_icon.to_svg
42
42
  ```
43
43
  ```
@@ -3,22 +3,29 @@
3
3
  module HeroiconsHelper
4
4
  # Icon to show heroicons by name and variant.
5
5
  class Icon
6
- attr_reader :path, :attributes, :width, :height, :symbol, :variant
6
+ attr_reader :path, :attributes, :width, :height, :symbol, :variant, :keywords
7
7
 
8
8
  VARIANT_OUTLINE = "outline"
9
9
  VARIANT_SOLID = "solid"
10
10
  VARIANTS = [VARIANT_OUTLINE, VARIANT_SOLID].freeze
11
11
 
12
12
  def initialize(symbol, variant, attributes: {})
13
- @symbol = symbol
14
- @variant = variant
15
-
16
- icon = get_heroicon(@symbol, @variant)
17
-
18
- @path = icon["path"]
19
- @width = icon["width"]
20
- @height = icon["height"]
21
- @attributes = attributes.dup.merge!(default_attributes)
13
+ @symbol = symbol.to_s
14
+ @variant = variant.to_s
15
+
16
+ heroicon = get_heroicon(@symbol, @variant)
17
+
18
+ @path = heroicon["path"]
19
+ @width = heroicon["width"]
20
+ @height = heroicon["height"]
21
+ @keywords = heroicon["keywords"]
22
+ @attributes = attributes.dup
23
+ @attributes[:class] = classes
24
+ @attributes[:viewBox] = viewbox
25
+ @attributes.merge!(size)
26
+ @attributes[:version] = "1.1"
27
+ @attributes.merge!(variant_attributes)
28
+ @attributes.merge!(a11y)
22
29
  end
23
30
 
24
31
  # Returns an string representing a <svg> tag
@@ -26,54 +33,93 @@ module HeroiconsHelper
26
33
  "<svg xmlns=\"http://www.w3.org/2000/svg\" #{html_attributes}>#{@path}</svg>"
27
34
  end
28
35
 
29
- private
30
-
31
- def html_attributes
36
+ private def html_attributes
32
37
  attrs = []
33
38
  @attributes.each_pair { |attr, value| attrs << "#{attr}=\"#{value}\"" }
34
39
  attrs.map(&:strip).join(" ")
35
40
  end
36
41
 
37
- def default_attributes
42
+ # add some accessibility features to svg
43
+ private def a11y
44
+ accessible = {}
45
+
46
+ if @attributes[:"aria-label"].nil? && @attributes["aria-label"].nil?
47
+ accessible[:"aria-hidden"] = "true"
48
+ else
49
+ accessible[:role] = "img"
50
+ end
51
+
52
+ accessible
53
+ end
54
+
55
+ # prepare the octicon class
56
+ private def classes
57
+ "heroicon heroicon-#{@symbol}-#{@variant} #{@attributes[:class]} ".strip
58
+ end
59
+
60
+ private def variant_attributes
38
61
  case @variant
39
62
  when VARIANT_OUTLINE
40
63
  {
41
- viewBox: viewbox,
42
64
  fill: "none",
43
65
  stroke: "currentColor",
44
66
  }
45
67
  when VARIANT_SOLID
46
68
  {
47
- viewBox: viewbox,
48
69
  fill: "currentColor",
49
70
  }
50
71
  end
51
72
  end
52
73
 
53
- def viewbox
74
+ private def viewbox
54
75
  "0 0 #{@width} #{@height}"
55
76
  end
56
77
 
57
- def get_heroicon(symbol, variant)
58
- symbol_s = symbol.to_s
59
- raise ArgumentError, "Icon name can't be empty" if symbol_s.empty?
78
+ # determine the height and width of the octicon based on :size option
79
+ private def size
80
+ size = {
81
+ width: @width,
82
+ height: @height,
83
+ }
84
+
85
+ # Specific size
86
+ unless @attributes[:width].nil? && @attributes[:height].nil?
87
+ size[:width] = @attributes[:width].nil? ? calculate_width(@attributes[:height]) : @attributes[:width]
88
+ size[:height] = @attributes[:height].nil? ? calculate_height(@attributes[:width]) : @attributes[:height]
89
+ @width = size[:width]
90
+ @height = size[:height]
91
+ end
92
+
93
+ size
94
+ end
95
+
96
+ private def calculate_width(height)
97
+ (height.to_i * @width) / @height
98
+ end
99
+
100
+ private def calculate_height(width)
101
+ (width.to_i * @height) / @width
102
+ end
103
+
104
+ private def get_heroicon(symbol, variant)
105
+ raise ArgumentError, "Icon name can't be empty" if symbol.empty?
60
106
 
61
- variant_s = variant.to_s
62
- raise ArgumentError, "Variant `#{variant.inspect}` is invalid; must be one of #{VARIANTS.join(", ")}" unless VARIANTS.include?(variant_s)
107
+ raise ArgumentError, "Variant `#{variant.inspect}` is invalid; must be one of #{VARIANTS.join(", ")}" unless VARIANTS.include?(variant)
63
108
 
64
- icon = HeroiconsHelper::ICON_SYMBOLS[symbol_s]
109
+ icon = HeroiconsHelper::ICON_SYMBOLS[symbol]
65
110
 
66
111
  raise ArgumentError, "Couldn't find Heroicon for `#{symbol.inspect}`" unless icon
67
112
 
68
- icon_in_variant = icon["variants"][variant_s]
69
- raise ArgumentError, "Heroicon for `#{symbol.inspect}` doesn't have variant `#{variant.inspect}`" unless icon_in_variant
113
+ icon_variant = icon["variants"][variant]
114
+ raise ArgumentError, "Heroicon for `#{symbol.inspect}` doesn't have variant `#{variant.inspect}`" unless icon_variant
70
115
 
71
116
  {
72
117
  "name" => icon["name"],
73
- "variant" => variant_s,
74
- "width" => icon_in_variant["width"],
75
- "height" => icon_in_variant["height"],
76
- "path" => icon_in_variant["path"],
118
+ "variant" => variant,
119
+ "keywords" => icon["keywords"] || [],
120
+ "width" => icon_variant["width"],
121
+ "height" => icon_variant["height"],
122
+ "path" => icon_variant["path"],
77
123
  }
78
124
  end
79
125
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HeroiconsHelper
4
- VERSION = "0.3.0"
4
+ VERSION = "0.4.0"
5
5
  end
@@ -9,7 +9,7 @@ module HeroiconsHelper
9
9
  file_data = File.read(File.join(File.dirname(__FILE__), "./heroicons_helper/data.json"))
10
10
  ICON_SYMBOLS = JSON.parse(file_data).freeze
11
11
 
12
- def heroicon(symbol, variant, attributes: {})
12
+ def heroicon(symbol, variant:, **attributes)
13
13
  ::HeroiconsHelper::Icon.new(symbol, variant, attributes: attributes)
14
14
  end
15
15
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heroicons_helper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Garen J. Torikian
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-06-10 00:00:00.000000000 Z
11
+ date: 2022-06-11 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A package that distributes Heroicons as a gem, for easy inclusion in
14
14
  Ruby projects.