rails_icons 1.1.0 → 1.3.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: 628225582b62195c9f7bc3994d9fcad7aa37dc563b4d0e73069c5efdddd81332
4
- data.tar.gz: 3241569575d809f7c6bbce51804cab8255df585f24a9473878432d2930596fcb
3
+ metadata.gz: ea0d1a2d414fe4308cfd7a65732fe7422e9a1f10edab64f6673cf0a667ef351f
4
+ data.tar.gz: 9fa4bab3788760957dce0e13135777fd9a432774fdd2172da077f9d716f5ed5e
5
5
  SHA512:
6
- metadata.gz: c4226fb17440c8eb8949ecce47be982b7dc17f022e33b1bccc640dbd16b700096e2f6867dceace37c597e56919be83621523ac8f842976365dc81517149bf4cc
7
- data.tar.gz: 1c1b35579576475f1b06ccf56416850c3d333402ebfefc63b8b1250b4317a196b04b15512ca5ac17cd26faba7298439114b4f175803c564ecbf1d22123db3eba
6
+ metadata.gz: 35389cf6c698b29f48229d34db04108c2471f8cb48f6e7b1d1dca8b812a381bcd6c1601fd39e360339aaa3487944130580881c2fa09323b9eeba1023be9714f3
7
+ data.tar.gz: 5ce92e169233c6a19c6e2e6b626996436d2ddda6b0f1c1c2e14d8b20d58b0550ccbab7b47767cabd0f7106ef8646483abdbfca20a3a7dbaf25108746fbf6158c
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rails_icons (1.1.0)
4
+ rails_icons (1.3.0)
5
5
  nokogiri (~> 1.16, >= 1.16.4)
6
6
  rails (> 6.1)
7
7
 
@@ -104,7 +104,7 @@ GEM
104
104
  marcel (1.0.4)
105
105
  method_source (1.0.0)
106
106
  mini_mime (1.1.5)
107
- mini_portile2 (2.8.5)
107
+ mini_portile2 (2.8.8)
108
108
  minitest (5.22.3)
109
109
  net-imap (0.4.10)
110
110
  date
@@ -116,10 +116,10 @@ GEM
116
116
  net-smtp (0.5.0)
117
117
  net-protocol
118
118
  nio4r (2.7.1)
119
- nokogiri (1.16.4)
119
+ nokogiri (1.18.3)
120
120
  mini_portile2 (~> 2.8.2)
121
121
  racc (~> 1.4)
122
- nokogiri (1.16.4-arm64-darwin)
122
+ nokogiri (1.18.3-arm64-darwin)
123
123
  racc (~> 1.4)
124
124
  parallel (1.24.0)
125
125
  parser (3.3.0.5)
@@ -132,7 +132,7 @@ GEM
132
132
  railties (>= 7.0.0)
133
133
  psych (5.1.2)
134
134
  stringio
135
- racc (1.7.3)
135
+ racc (1.8.1)
136
136
  rack (2.2.9)
137
137
  rack-test (2.1.0)
138
138
  rack (>= 1.3)
@@ -215,6 +215,7 @@ GEM
215
215
  PLATFORMS
216
216
  arm64-darwin-22
217
217
  ruby
218
+ x86_64-linux
218
219
 
219
220
  DEPENDENCIES
220
221
  debug (~> 1.9, >= 1.9.2)
data/README.md CHANGED
@@ -4,10 +4,10 @@ Add any icon library to a Rails app. Rails Icons has first-party support for a [
4
4
 
5
5
  ```erb
6
6
  # Using the default icon library
7
- <%= icon "check", class: "text-gray-500" %>
7
+ icon "check", class: "text-gray-500"
8
8
 
9
9
  # Using any custom library
10
- <%= icon "apple", library: "simple_icons", class: "text-black" %>
10
+ icon "apple", library: "simple_icons", class: "text-black"
11
11
  ```
12
12
 
13
13
  The icons are sourced directly from their respective GitHub repositories, ensuring Rails Icons remain lightweight.
@@ -23,6 +23,8 @@ The icons are sourced directly from their respective GitHub repositories, ensuri
23
23
  </picture>
24
24
  </a>
25
25
 
26
+ Want to make JavaScript your second-favorite language? 👉 [JavaScript for Rails Developers](https://javascriptforrails.com/)
27
+
26
28
 
27
29
  ## Install
28
30
 
@@ -40,7 +42,7 @@ rails generate rails_icons:install --libraries=LIBRARY_NAME
40
42
  ```bash
41
43
  rails generate rails_icons:install --libraries=heroicons
42
44
 
43
- Or multiple at once
45
+ # Or multiple at once
44
46
  rails generate rails_icons:install --libraries=heroicons lucide
45
47
  ```
46
48
 
@@ -54,16 +56,16 @@ icon "check"
54
56
  # Use another variant
55
57
  icon "check", variant: "solid"
56
58
 
57
- # Set library explictly
59
+ # Set library explicitly
58
60
  icon "check", library: "heroicons"
59
61
 
60
62
  # Add CSS
61
63
  icon "check", class: "text-green-500"
62
64
 
63
65
  # Add CSS with class_names
64
- # article: https://railsdesigner.com/conditional-css-classes-in-rails/
65
- # docs: https://edgeapi.rubyonrails.org/classes/ActionView/Helpers/TagHelper.html#method-i-token_list
66
66
  icon "check", class: ["size-4", "bg-red-500": !verified?, "bg-green-500": verified?]
67
+ # ↳ Article: https://railsdesigner.com/conditional-css-classes-in-rails/
68
+ # ↳ Documentation: https://edgeapi.rubyonrails.org/classes/ActionView/Helpers/TagHelper.html#method-i-token_list
67
69
 
68
70
  # Add data attributes
69
71
  icon "check", data: { controller: "swap" }
@@ -75,13 +77,17 @@ icon "check", stroke_width: 2
75
77
 
76
78
  ## First-party libraries
77
79
 
78
- - [Boxicons](https://github.com/atisawd/boxicons) (1600+ icons)
79
- - [Feather](https://github.com/feathericons/feather) (280+ icons)
80
- - [Heroicons](https://github.com/tailwindlabs/heroicons) (300+ icons)
81
- - [Lucide](https://github.com/lucide-icons/lucide) (1500+ icons)
82
- - [Phosphor](https://github.com/phosphor-icons/core) (9000+ icons)
83
- - [Radix](https://github.com/radix-ui/icons/) (300+ icons)
84
- - [Tabler](https://github.com/tabler/tabler-icons) (5700+ icons)
80
+ - [Boxicons](https://railsdesigner.com/rails-icons/boxicons/) (1600+ icons)
81
+ - [Feather](https://railsdesigner.com/rails-icons/feather/) (280+ icons)
82
+ - [Flags](https://railsdesigner.com/rails-icons/flags/) (540+ icons)
83
+ - [Heroicons](https://railsdesigner.com/rails-icons/heroicons/) (300+ icons)
84
+ - [Linear](https://railsdesigner.com/rails-icons/linear/) (170+ icons)
85
+ - [Lucide](https://railsdesigner.com/rails-icons/lucide/) (1500+ icons)
86
+ - [Phosphor](https://railsdesigner.com/rails-icons/phosphor/) (9000+ icons)
87
+ - [Radix](https://railsdesigner.com/rails-icons/radix/) (300+ icons)
88
+ - [SidekickIcons](https://railsdesigner.com/rails-icons/sidekickicons/) (49 icons, complementing [Heroicons](https://railsdesigner.com/rails-icons/heroicons/))
89
+ - [Tabler](https://railsdesigner.com/rails-icons/tabler/) (5700+ icons)
90
+ - [Weather](https://railsdesigner.com/rails-icons/weather/) (215+ icons)
85
91
 
86
92
 
87
93
  ## Animated icons
@@ -93,7 +99,7 @@ Rails Icons also includes a few animated icons. Great for loading states and so
93
99
  - `fading-dots`
94
100
  - `bouncing-dots`
95
101
 
96
- Use like this: `icon "faded-spinner", library: "animated"`. The same attributes as other libraries are available.
102
+ Use like this: `icon "faded-spinner", library: "animated"`. The same attributes as the others libraries are available.
97
103
 
98
104
 
99
105
  ## Custom icon library
@@ -101,7 +107,7 @@ Use like this: `icon "faded-spinner", library: "animated"`. The same attributes
101
107
  Need to use an icon from another library?
102
108
 
103
109
  1. run `rails generate rails_icons:initializer --custom=simple_icons`;
104
- 2. add the (SVG) icons to the created directory **app/assets/svg/icons/simple_icons**;
110
+ 2. add the (SVG) icons to the created directory *app/assets/svg/icons/simple_icons*;
105
111
 
106
112
  Every custom icon can now be used with the same interface as first-party icon libraries.
107
113
  ```ruby
@@ -111,7 +117,7 @@ icon "apple", library: "simple_icons", class: "text-black"
111
117
 
112
118
  ## Sync icons
113
119
 
114
- To sync all installed libraries, run
120
+ To sync all libraries, run
115
121
  ```bash
116
122
  rails generate rails_icons:sync
117
123
  ```
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "rails_icons/base_generator"
4
+
3
5
  module RailsIcons
4
- class InitializerGenerator < Rails::Generators::Base
6
+ class InitializerGenerator < RailsIcons::BaseGenerator
5
7
  source_root File.expand_path("templates", __dir__)
6
8
 
7
9
  desc "Create the Rails Icons initializer."
@@ -20,9 +22,9 @@ module RailsIcons
20
22
  return unless File.exist?(INITIALIZER)
21
23
  return if default_configuration_exists?
22
24
 
23
- if options[:libraries].present?
25
+ if libraries.present?
24
26
  default_configuration = <<~RB.indent(2)
25
- config.default_library = "#{options[:libraries].first}"
27
+ config.default_library = "#{libraries.first}"
26
28
  # config.default_variant = "" # Set a default variant for all libraries
27
29
  RB
28
30
 
@@ -45,7 +47,7 @@ module RailsIcons
45
47
  end
46
48
 
47
49
  def setup_custom_configuration
48
- return "" if options[:custom].blank?
50
+ return if options[:custom].blank?
49
51
 
50
52
  insert_custom_configuration
51
53
  create_custom_directory
@@ -56,7 +58,7 @@ module RailsIcons
56
58
  INITIALIZER = "config/initializers/rails_icons.rb"
57
59
 
58
60
  def insert_custom_configuration
59
- unless File.read(INITIALIZER).include?("config.libraries.merge!")
61
+ unless file_contains?(INITIALIZER, "config.libraries.merge!")
60
62
  custom_default_configuration = <<~RB.indent(2)
61
63
  config.libraries.merge!(
62
64
 
@@ -76,7 +78,7 @@ module RailsIcons
76
78
  def create_custom_directory = FileUtils.mkdir_p(File.join(options[:destination], options[:custom]))
77
79
 
78
80
  def library_configuration
79
- options[:libraries].map { RailsIcons.libraries[_1.to_sym].initializer_config }.join("\n")
81
+ libraries.map { RailsIcons.libraries[_1.to_sym].initializer_config }.join("\n")
80
82
  end
81
83
 
82
84
  def custom_configuration
@@ -95,5 +97,7 @@ module RailsIcons
95
97
 
96
98
  File.readlines(INITIALIZER).any? { _1.match?(line) }
97
99
  end
100
+
101
+ def libraries = options[:libraries].map(&:downcase)
98
102
  end
99
103
  end
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "rails_icons/base_generator"
4
+
3
5
  module RailsIcons
4
- class InstallGenerator < Rails::Generators::Base
6
+ class InstallGenerator < RailsIcons::BaseGenerator
5
7
  source_root File.expand_path("templates", __dir__)
6
8
 
7
- desc "Install Rails Icons with the choosen libraries. This creates the configuration initializer and will sync the icons."
9
+ desc "Install Rails Icons with the chosen libraries. This creates the configuration initializer and will sync the icons."
8
10
 
9
11
  class_option :libraries, type: :array, default: [], desc: "Choose libraries (#{RailsIcons.libraries.keys.join("/")})"
10
12
  class_option :destination, type: :string, default: RailsIcons.configuration.destination_path, desc: "Specify destination folder for icons"
@@ -22,6 +24,6 @@ module RailsIcons
22
24
 
23
25
  private
24
26
 
25
- def attributes = ["--libraries=#{options[:libraries].join(" ")}", "--destination=#{options[:destination]}"].join(" ")
27
+ def attributes = ["--libraries=#{options[:libraries].map(&:downcase).join(" ")}", "--destination=#{options[:destination]}"].join(" ")
26
28
  end
27
29
  end
@@ -1,25 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "rails_icons/base_generator"
3
4
  require "rails_icons/sync/engine"
4
5
 
5
6
  module RailsIcons
6
- class SyncGenerator < Rails::Generators::Base
7
+ class SyncGenerator < RailsIcons::BaseGenerator
7
8
  source_root File.expand_path("templates", __dir__)
8
9
 
9
- desc "Sync the choosen icon libraries from their respective git repos."
10
+ desc "Sync the chosen icon libraries from their respective git repos."
10
11
 
11
12
  class_option :libraries, type: :array, default: [], desc: "Choose libraries (#{RailsIcons.libraries.keys.join("/")})"
12
13
 
13
- def sync_icons
14
- raise "[Rails Icons] Not a valid library" if libraries.empty?
15
-
16
- libraries.each { Sync::Engine.new(_1).sync }
17
- end
14
+ def sync_icons = libraries.each { Sync::Engine.new(_1).sync }
18
15
 
19
16
  private
20
17
 
21
18
  def libraries
22
- options[:libraries].presence || synced_libraries
19
+ options[:libraries].map(&:downcase).presence || synced_libraries
23
20
  end
24
21
 
25
22
  def synced_libraries
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsIcons
4
+ class BaseGenerator < Rails::Generators::Base
5
+ hide!
6
+
7
+ def initialize(*arguments)
8
+ super(*arguments)
9
+
10
+ validate!
11
+ end
12
+
13
+ private
14
+
15
+ def validate!
16
+ return if custom_library?
17
+
18
+ raise RailsIcons::LibraryNotFound.new("") if options.libraries.empty?
19
+ raise RailsIcons::LibraryNotFound.new(invalid_libraries.join(", ")) if invalid_libraries.any?
20
+ end
21
+
22
+ def invalid_libraries = options.libraries.map(&:to_sym).map(&:downcase).reject { RailsIcons.libraries.key?(_1) }
23
+
24
+ def custom_library? = options.custom.present?
25
+
26
+ # Uses `gsub_file` as a read-only operation to check file content. This
27
+ # approach is preferred over `File.read` because `gsub_file` is properly stubbed
28
+ # in generator tests, while `File.read` would fail in the test environment.
29
+ #
30
+ def file_contains?(path, content)
31
+ return false unless File.exist?(path)
32
+
33
+ result = false
34
+
35
+ gsub_file(path, /.*/) do |file_content|
36
+ result = file_content.include?(content)
37
+
38
+ file_content
39
+ end
40
+
41
+ result
42
+ rescue Thor::Error
43
+ false
44
+ end
45
+ end
46
+ end
@@ -8,6 +8,7 @@ module RailsIcons
8
8
  def config
9
9
  ActiveSupport::OrderedOptions.new.tap do |options|
10
10
  options.default_variant = :regular
11
+ options.exclude_variants = []
11
12
 
12
13
  setup_regular_config(options)
13
14
  setup_solid_config(options)
@@ -18,6 +19,9 @@ module RailsIcons
18
19
  def initializer_config
19
20
  <<~RB.indent(2)
20
21
  # Override Boxicons defaults
22
+ # config.libraries.boxicons.default_variant = "" # Set a default variant for Boxicons
23
+ # config.libraries.boxicons.exclude_variants = [] # Exclude specific variants
24
+
21
25
  # config.libraries.boxicons.solid.css = "size-6"
22
26
  # config.libraries.boxicons.solid.data = {}
23
27
 
@@ -8,6 +8,7 @@ module RailsIcons
8
8
  def config
9
9
  ActiveSupport::OrderedOptions.new.tap do |options|
10
10
  options.default_variant = nil
11
+ options.exclude_variants = []
11
12
 
12
13
  options.default = default_options
13
14
  end
@@ -16,6 +17,9 @@ module RailsIcons
16
17
  def initializer_config
17
18
  <<~RB.indent(2)
18
19
  # Override Feather defaults
20
+ # config.libraries.feather.default_variant = "" # Feather has no variants, this is provided for backwards compatibility
21
+ # config.libraries.feather.exclude_variants = [] # Feather has no variants, this is provided for backwards compatibility
22
+
19
23
  # config.libraries.feather.default.css = "size-6"
20
24
  # config.libraries.feather.default.stroke_width = "2"
21
25
  # config.libraries.feather.default.data = {}
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsIcons
4
+ class Configuration
5
+ module Flags
6
+ extend self
7
+
8
+ def config
9
+ ActiveSupport::OrderedOptions.new.tap do |options|
10
+ options.default_variant = "landscape"
11
+ options.exclude_variants = []
12
+
13
+ setup_square_config(options)
14
+ setup_landscape_config(options)
15
+ end
16
+ end
17
+
18
+ def initializer_config
19
+ <<~RB.indent(2)
20
+ # Override Flags defaults
21
+ # config.libraries.flags.default_variant = "" # Set a default variant for Flags
22
+ # config.libraries.flags.exclude_variants = [:square, :landscape]
23
+
24
+ # config.libraries.flags.square.default.css = "size-6"
25
+ # config.libraries.flags.square.default.data = {}
26
+
27
+ # config.libraries.flags.landscape.default.css = "size-6"
28
+ # config.libraries.flags.landscape.default.data = {}
29
+ RB
30
+ end
31
+
32
+ def source
33
+ {
34
+ url: "https://github.com/lipis/flag-icons.git",
35
+ variants: {
36
+ square: "flags/1x1",
37
+ landscape: "flags/4x3"
38
+ }
39
+ }
40
+ end
41
+
42
+ private
43
+
44
+ def setup_square_config(options)
45
+ options.square = ActiveSupport::OrderedOptions.new
46
+ options.square.default = default_square_options
47
+ end
48
+
49
+ def setup_landscape_config(options)
50
+ options.landscape = ActiveSupport::OrderedOptions.new
51
+ options.landscape.default = default_landscape_options
52
+ end
53
+
54
+ def default_square_options
55
+ ActiveSupport::OrderedOptions.new.tap do |options|
56
+ options.css = "size-6"
57
+ options.data = {}
58
+ end
59
+ end
60
+
61
+ def default_landscape_options
62
+ ActiveSupport::OrderedOptions.new.tap do |options|
63
+ options.css = "size-6"
64
+ options.data = {}
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -8,6 +8,7 @@ module RailsIcons
8
8
  def config
9
9
  ActiveSupport::OrderedOptions.new.tap do |options|
10
10
  options.default_variant = :outline
11
+ options.exclude_variants = []
11
12
 
12
13
  setup_outline_config(options)
13
14
  setup_solid_config(options)
@@ -19,6 +20,9 @@ module RailsIcons
19
20
  def initializer_config
20
21
  <<~RB.indent(2)
21
22
  # Override Heroicon defaults
23
+ # config.libraries.heroicons.default_variant = "" # Set a default variant for Heroicons
24
+ # config.libraries.heroicons.exclude_variants = [:mini, :micro] # Exclude specific variants
25
+
22
26
  # config.libraries.heroicons.outline.default.css = "size-6"
23
27
  # config.libraries.heroicons.outline.default.stroke_width = "1.5"
24
28
  # config.libraries.heroicons.outline.default.data = {}
@@ -68,16 +72,16 @@ module RailsIcons
68
72
  options.micro.default = default_micro_options
69
73
  end
70
74
 
71
- def default_solid_options
75
+ def default_outline_options
72
76
  ActiveSupport::OrderedOptions.new.tap do |options|
77
+ options.stroke_width = 1.5
73
78
  options.css = "size-6"
74
79
  options.data = {}
75
80
  end
76
81
  end
77
82
 
78
- def default_outline_options
83
+ def default_solid_options
79
84
  ActiveSupport::OrderedOptions.new.tap do |options|
80
- options.stroke_width = 1.5
81
85
  options.css = "size-6"
82
86
  options.data = {}
83
87
  end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsIcons
4
+ class Configuration
5
+ module Linear
6
+ extend self
7
+
8
+ def config
9
+ ActiveSupport::OrderedOptions.new.tap do |options|
10
+ options.default_variant = nil
11
+ options.exclude_variants = []
12
+
13
+ options.default = default_options
14
+ end
15
+ end
16
+
17
+ def initializer_config
18
+ <<~RB.indent(2)
19
+ # Override Linear defaults
20
+ # config.libraries.linear.default_variant = "" # Set a default variant for Linear
21
+ # config.libraries.linear.exclude_variants = []
22
+
23
+ # config.libraries.linear.default.css = "size-6"
24
+ # config.libraries.linear.default.stroke_width = "2"
25
+ # config.libraries.linear.default.data = {}
26
+ RB
27
+ end
28
+
29
+ def source
30
+ {
31
+ url: "https://github.com/cjpatoilo/linearicons.git",
32
+ variants: {
33
+ ".": "dist/svg" # Linear has no variants, store in the top directory
34
+ }
35
+ }
36
+ end
37
+
38
+ private
39
+
40
+ def default_options
41
+ ActiveSupport::OrderedOptions.new.tap do |options|
42
+ options.stroke_width = "2"
43
+ options.css = "size-6"
44
+ options.data = {}
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -8,6 +8,7 @@ module RailsIcons
8
8
  def config
9
9
  ActiveSupport::OrderedOptions.new.tap do |options|
10
10
  options.default_variant = :outline
11
+ options.exclude_variants = []
11
12
 
12
13
  setup_outline_config(options)
13
14
  end
@@ -16,6 +17,9 @@ module RailsIcons
16
17
  def initializer_config
17
18
  <<~RB.indent(2)
18
19
  # Override Lucide defaults
20
+ # config.libraries.lucide.default_variant = "" # Set a default variant for Lucide
21
+ # config.libraries.lucide.exclude_variants = [] # Exclude specific variants
22
+
19
23
  # config.libraries.lucide.outline.default.css = "size-6"
20
24
  # config.libraries.lucide.outline.default.stroke_width = "1.5"
21
25
  # config.libraries.lucide.outline.default.data = {}
@@ -8,6 +8,7 @@ module RailsIcons
8
8
  def config
9
9
  ActiveSupport::OrderedOptions.new.tap do |options|
10
10
  options.default_variant = :regular
11
+ options.exclude_variants = []
11
12
 
12
13
  setup_bold_config(options)
13
14
  setup_duotone_config(options)
@@ -21,6 +22,9 @@ module RailsIcons
21
22
  def initializer_config
22
23
  <<~RB.indent(2)
23
24
  # Override Phosphor defaults
25
+ # config.libraries.phosphor.default_variant = "" # Set a default variant for Phosphor
26
+ # config.libraries.phosphor.exclude_variants = [:duotone, :thin] # Exclude specific variants
27
+
24
28
  # config.libraries.phosphor.bold.default.css = "size-6"
25
29
  # config.libraries.phosphor.bold.default.data = {}
26
30
 
@@ -8,6 +8,7 @@ module RailsIcons
8
8
  def config
9
9
  ActiveSupport::OrderedOptions.new.tap do |options|
10
10
  options.default_variant = nil
11
+ options.exclude_variants = []
11
12
 
12
13
  options.default = default_options
13
14
  end
@@ -16,6 +17,8 @@ module RailsIcons
16
17
  def initializer_config
17
18
  <<~RB.indent(2)
18
19
  # Override Radix defaults
20
+ # config.libraries.radix.default_variant = "" # Radix has no variants, this is provided for backwards compatibility
21
+ # config.libraries.radix.exclude_variants = [] # Radix has no variants, this is provided for backwards compatibility
19
22
  # config.libraries.radix.default.css = "size-6"
20
23
  # config.libraries.radix.default.stroke_width = "2"
21
24
  # config.libraries.radix.default.data = {}
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsIcons
4
+ class Configuration
5
+ module Sidekickicons
6
+ extend self
7
+
8
+ def config
9
+ ActiveSupport::OrderedOptions.new.tap do |options|
10
+ options.default_variant = :outline
11
+ options.exclude_variants = []
12
+
13
+ setup_outline_config(options)
14
+ setup_solid_config(options)
15
+ setup_mini_config(options)
16
+ setup_micro_config(options)
17
+ end
18
+ end
19
+
20
+ def initializer_config
21
+ <<~RB.indent(2)
22
+ # Override Sidekickicons defaults
23
+ # config.libraries.sidekickicons.default_variant = "" # Set a default variant for Sidekickicons
24
+ # config.libraries.sidekickicons.exclude_variants = [:mini, :micro] # Exclude specific variants
25
+
26
+ # config.libraries.sidekickicons.outline.default.css = "size-6"
27
+ # config.libraries.sidekickicons.outline.default.stroke_width = "1.5"
28
+ # config.libraries.sidekickicons.outline.default.data = {}
29
+
30
+ # config.libraries.sidekickicons.solid.default.css = "size-6"
31
+ # config.libraries.sidekickicons.solid.default.data = {}
32
+
33
+ # config.libraries.sidekickicons.mini.default.css = "size-5"
34
+ # config.libraries.sidekickicons.mini.default.data = {}
35
+
36
+ # config.libraries.sidekickicons.micro.default.css = "size-4"
37
+ # config.libraries.sidekickicons.micro.default.data = {}
38
+ RB
39
+ end
40
+
41
+ def source
42
+ {
43
+ url: "https://github.com/ndri/sidekickicons",
44
+ variants: {
45
+ outline: "optimized/24/outline",
46
+ solid: "optimized/24/solid",
47
+ mini: "optimized/20/solid",
48
+ micro: "optimized/16/solid"
49
+ }
50
+ }
51
+ end
52
+
53
+ private
54
+
55
+ def setup_outline_config(options)
56
+ options.outline = ActiveSupport::OrderedOptions.new
57
+ options.outline.default = default_outline_options
58
+ end
59
+
60
+ def setup_solid_config(options)
61
+ options.solid = ActiveSupport::OrderedOptions.new
62
+ options.solid.default = default_solid_options
63
+ end
64
+
65
+ def setup_mini_config(options)
66
+ options.mini = ActiveSupport::OrderedOptions.new
67
+ options.mini.default = default_mini_options
68
+ end
69
+
70
+ def setup_micro_config(options)
71
+ options.micro = ActiveSupport::OrderedOptions.new
72
+ options.micro.default = default_micro_options
73
+ end
74
+
75
+ def default_solid_options
76
+ ActiveSupport::OrderedOptions.new.tap do |options|
77
+ options.css = "size-6"
78
+ options.data = {}
79
+ end
80
+ end
81
+
82
+ def default_outline_options
83
+ ActiveSupport::OrderedOptions.new.tap do |options|
84
+ options.stroke_width = 1.5
85
+ options.css = "size-6"
86
+ options.data = {}
87
+ end
88
+ end
89
+
90
+ def default_mini_options
91
+ ActiveSupport::OrderedOptions.new.tap do |options|
92
+ options.css = "size-5"
93
+ options.data = {}
94
+ end
95
+ end
96
+
97
+ def default_micro_options
98
+ ActiveSupport::OrderedOptions.new.tap do |options|
99
+ options.css = "size-4"
100
+ options.data = {}
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -8,6 +8,7 @@ module RailsIcons
8
8
  def config
9
9
  ActiveSupport::OrderedOptions.new.tap do |options|
10
10
  options.default_variant = :outline
11
+ options.exclude_variants = []
11
12
 
12
13
  setup_outline_config(options)
13
14
  setup_filled_config(options)
@@ -17,6 +18,10 @@ module RailsIcons
17
18
  def initializer_config
18
19
  <<~RB.indent(2)
19
20
  # Override Tabler defaults
21
+ # config.libraries.tabler.default_variant = "" # Set a default variant for Tabler
22
+ # config.libraries.tabler.exclude_variants = [] # Exclude specific variants
23
+
24
+ # config.libraries.tabler.regular.default.css = "size-6"
20
25
  # config.libraries.tabler.solid.default.css = "size-6"
21
26
  # config.libraries.tabler.solid.default.data = {}
22
27
 
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsIcons
4
+ class Configuration
5
+ module Weather
6
+ extend self
7
+
8
+ def config
9
+ ActiveSupport::OrderedOptions.new.tap do |options|
10
+ options.default_variant = nil
11
+ options.exclude_variants = []
12
+
13
+ options.default = default_options
14
+ end
15
+ end
16
+
17
+ def initializer_config
18
+ <<~RB.indent(2)
19
+ # Override Weather defaults
20
+ # config.libraries.weather.default_variant = "" # Set a default variant for Wweather
21
+ # config.libraries.weather.exclude_variants = []
22
+
23
+ # config.libraries.weather.default.css = "size-6"
24
+ # config.libraries.weather.default.data = {}
25
+ RB
26
+ end
27
+
28
+ def source
29
+ {
30
+ url: "https://github.com/erikflowers/weather-icons.git",
31
+ variants: {
32
+ ".": "svg" # Weather has no variants, store in the top directory
33
+ }
34
+ }
35
+ end
36
+
37
+ def transformations
38
+ {
39
+ filenames: {
40
+ delete_prefix: ["wi-"]
41
+ }
42
+ }
43
+ end
44
+
45
+ private
46
+
47
+ def default_options
48
+ ActiveSupport::OrderedOptions.new.tap do |options|
49
+ options.css = "size-6"
50
+ options.data = {}
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,5 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsIcons
4
- class NotFound < StandardError; end
4
+ class IconNotFound < StandardError
5
+ def initialize(icon_name)
6
+ super("The icon `#{icon_name}` is not available. Please check the icon name and try again.")
7
+ end
8
+ end
9
+
10
+ class LibraryNotFound < StandardError
11
+ def initialize(library_name)
12
+ if library_name.empty?
13
+ super("No libraries were specified. Please choose from: #{RailsIcons.libraries.keys.to_sentence(last_word_connector: " or ")}")
14
+ else
15
+ super("The library `#{library_name}` is not available. Please check the library name and try again.")
16
+ end
17
+ end
18
+ end
5
19
  end
@@ -5,10 +5,10 @@ require_relative "../configuration"
5
5
  module RailsIcons
6
6
  module Helpers
7
7
  module IconHelper
8
- def icon(name, library: RailsIcons.configuration.default_library, variant: nil, **arguments)
8
+ def icon(name, library: RailsIcons.configuration.default_library, from: library, variant: nil, **arguments)
9
9
  RailsIcons::Icon.new(
10
10
  name: name,
11
- library: library,
11
+ library: from || library,
12
12
  variant: variant,
13
13
  arguments: arguments
14
14
  ).svg
@@ -13,7 +13,7 @@ module RailsIcons
13
13
 
14
14
  icon_path = icons_path_in_app || icons_path_in_engines
15
15
 
16
- raise RailsIcons::NotFound if icon_path.nil?
16
+ raise RailsIcons::IconNotFound if icon_path.nil?
17
17
 
18
18
  icon_path
19
19
  end
@@ -2,7 +2,9 @@ require "rails_icons/icon/file_path"
2
2
  require "rails_icons/icon/attributes"
3
3
 
4
4
  class RailsIcons::Icon
5
- def initialize(name:, library:, arguments:, variant: nil)
5
+ def initialize(name:, library:, arguments:, variant: nil, config: RailsIcons.configuration)
6
+ @config = config # set first, config is used during initialization
7
+
6
8
  @name = name
7
9
  @library = library.to_s.inquiry
8
10
  @variant = (variant || set_variant).to_s
@@ -10,7 +12,7 @@ class RailsIcons::Icon
10
12
  end
11
13
 
12
14
  def svg
13
- raise RailsIcons::NotFound, error_message unless File.exist?(file_path)
15
+ raise RailsIcons::IconNotFound, error_message unless File.exist?(file_path)
14
16
 
15
17
  Nokogiri::HTML::DocumentFragment.parse(File.read(file_path))
16
18
  .at_css("svg")
@@ -22,8 +24,8 @@ class RailsIcons::Icon
22
24
  private
23
25
 
24
26
  def set_variant
25
- RailsIcons.configuration.default_variant.presence ||
26
- RailsIcons.configuration.libraries.dig(@library.to_sym, :default_variant)
27
+ @config.libraries.dig(@library.to_sym, :default_variant).presence ||
28
+ @config.default_variant.presence
27
29
  end
28
30
 
29
31
  def error_message
@@ -55,7 +57,7 @@ class RailsIcons::Icon
55
57
  def default(key) = library_attributes.dig(:default, key)
56
58
 
57
59
  def library_attributes
58
- custom_library? ? custom_library : RailsIcons.configuration.libraries.dig(@library, @variant) || {}
60
+ custom_library? ? custom_library : @config.libraries.dig(@library, @variant) || {}
59
61
  end
60
62
 
61
63
  def custom_library
@@ -65,7 +67,7 @@ class RailsIcons::Icon
65
67
  &.dig("custom")
66
68
  &.dig(@library.to_sym)&.with_defaults(
67
69
  {
68
- path: [RailsIcons.configuration.destination_path, @library].join("/")
70
+ path: [@config.destination_path, @library].join("/")
69
71
  }
70
72
  ) || {}
71
73
  end
@@ -1,11 +1,15 @@
1
1
  require_relative "configuration/animated"
2
2
  require_relative "configuration/boxicons"
3
3
  require_relative "configuration/feather"
4
+ require_relative "configuration/flags"
4
5
  require_relative "configuration/heroicons"
6
+ require_relative "configuration/linear"
5
7
  require_relative "configuration/lucide"
6
8
  require_relative "configuration/phosphor"
7
9
  require_relative "configuration/radix"
10
+ require_relative "configuration/sidekickicons"
8
11
  require_relative "configuration/tabler"
12
+ require_relative "configuration/weather"
9
13
 
10
14
  module RailsIcons
11
15
  extend self
@@ -14,11 +18,15 @@ module RailsIcons
14
18
  {
15
19
  boxicons: RailsIcons::Configuration::Boxicons,
16
20
  feather: RailsIcons::Configuration::Feather,
21
+ flags: RailsIcons::Configuration::Flags,
17
22
  heroicons: RailsIcons::Configuration::Heroicons,
23
+ linear: RailsIcons::Configuration::Linear,
18
24
  lucide: RailsIcons::Configuration::Lucide,
19
25
  phosphor: RailsIcons::Configuration::Phosphor,
20
26
  radix: RailsIcons::Configuration::Radix,
21
- tabler: RailsIcons::Configuration::Tabler
27
+ sidekickicons: RailsIcons::Configuration::Sidekickicons,
28
+ tabler: RailsIcons::Configuration::Tabler,
29
+ weather: RailsIcons::Configuration::Weather
22
30
  }
23
31
  end
24
32
  end
@@ -6,6 +6,8 @@ require "rails_icons/sync/process_variants"
6
6
  module RailsIcons
7
7
  module Sync
8
8
  class Engine < Rails::Generators::Base
9
+ hide!
10
+
9
11
  def initialize(name)
10
12
  super
11
13
 
@@ -32,12 +34,12 @@ module RailsIcons
32
34
 
33
35
  private
34
36
 
35
- TEMP_DIRECTORY = Rails.root.join("tmp/icons").freeze
37
+ TEMP_DIRECTORY = Rails.root.join("tmp/rails_icons").freeze
36
38
 
37
39
  def clone_repository
38
40
  raise "[Rails Icons] Failed to clone repository" unless system("git clone '#{@library[:url]}' '#{@temp_directory}'")
39
41
 
40
- say "'#{@name}' repository cloned successfully."
42
+ say "[Rails Icons] '#{@name}' repository cloned successfully."
41
43
  end
42
44
 
43
45
  def process_variants = Sync::ProcessVariants.new(@temp_directory, @name, @library).process
@@ -6,14 +6,19 @@ require "rails_icons/sync/transformations"
6
6
  module RailsIcons
7
7
  module Sync
8
8
  class ProcessVariants < Rails::Generators::Base
9
+ hide!
10
+
9
11
  def initialize(temp_directory, name, library)
10
12
  @temp_directory, @name, @library = temp_directory, name, library
11
13
  end
12
14
 
13
15
  def process
14
16
  original_variants = Dir.children(@temp_directory)
17
+ excluded_variants = RailsIcons.configuration.libraries.dig(@name.to_sym)&.exclude_variants || []
15
18
 
16
19
  @library[:variants].each do |variant_name, variant_source_path|
20
+ next if excluded_variants.include?(variant_name)
21
+
17
22
  source = File.join(@temp_directory, variant_source_path)
18
23
  destination = File.join(@temp_directory, variant_name.to_s)
19
24
 
@@ -26,7 +31,8 @@ module RailsIcons
26
31
  apply_transformations_to(destination)
27
32
  end
28
33
 
29
- remove_files_and_folders(original_variants)
34
+ remove_files_and_folders_for(original_variants)
35
+ remove_previously_downloaded(excluded_variants)
30
36
 
31
37
  say "[Rails Icons] Icon variants processed successfully"
32
38
  end
@@ -50,12 +56,18 @@ module RailsIcons
50
56
  end
51
57
  end
52
58
 
53
- def remove_files_and_folders(paths)
59
+ def remove_files_and_folders_for(paths)
54
60
  paths.each do |path|
55
61
  FileUtils.rm_rf(File.join(@temp_directory, path))
56
62
  end
57
63
  end
58
64
 
65
+ def remove_previously_downloaded(variants)
66
+ variants.each do |variant|
67
+ FileUtils.rm_rf(File.join(RailsIcons.configuration.destination_path, @name, variant.to_s))
68
+ end
69
+ end
70
+
59
71
  def transformations
60
72
  RailsIcons.libraries.dig(@name.to_sym)&.try(:transformations) || {}
61
73
  end
@@ -1,6 +1,8 @@
1
1
  module RailsIcons
2
2
  module Sync
3
3
  class Transformations < Rails::Generators::Base
4
+ hide!
5
+
4
6
  def self.transform(filename, rules = {})
5
7
  basename = File.basename(filename, File.extname(filename))
6
8
 
@@ -1,3 +1,3 @@
1
1
  module RailsIcons
2
- VERSION = "1.1.0"
2
+ VERSION = "1.3.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_icons
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rails Designer Developers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-01-13 00:00:00.000000000 Z
11
+ date: 2025-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -70,15 +70,20 @@ files:
70
70
  - lib/generators/rails_icons/sync_generator.rb
71
71
  - lib/generators/rails_icons/templates/initializer.rb.tt
72
72
  - lib/rails_icons.rb
73
+ - lib/rails_icons/base_generator.rb
73
74
  - lib/rails_icons/configuration.rb
74
75
  - lib/rails_icons/configuration/animated.rb
75
76
  - lib/rails_icons/configuration/boxicons.rb
76
77
  - lib/rails_icons/configuration/feather.rb
78
+ - lib/rails_icons/configuration/flags.rb
77
79
  - lib/rails_icons/configuration/heroicons.rb
80
+ - lib/rails_icons/configuration/linear.rb
78
81
  - lib/rails_icons/configuration/lucide.rb
79
82
  - lib/rails_icons/configuration/phosphor.rb
80
83
  - lib/rails_icons/configuration/radix.rb
84
+ - lib/rails_icons/configuration/sidekickicons.rb
81
85
  - lib/rails_icons/configuration/tabler.rb
86
+ - lib/rails_icons/configuration/weather.rb
82
87
  - lib/rails_icons/engine.rb
83
88
  - lib/rails_icons/errors.rb
84
89
  - lib/rails_icons/helpers/icon_helper.rb