optics_view_components 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/Gemfile +4 -2
  4. data/Gemfile.lock +186 -0
  5. data/app/components/optics/application_view_component.rb +113 -0
  6. data/app/components/optics/application_view_component_preview.rb +5 -0
  7. data/app/components/optics/button/component.rb +55 -0
  8. data/app/components/optics/button/preview.rb +34 -0
  9. data/app/components/optics/icon/component.rb +59 -0
  10. data/app/components/optics/icon/preview.rb +31 -0
  11. data/demo/.ruby-version +1 -0
  12. data/demo/Gemfile +21 -0
  13. data/demo/Gemfile.lock +198 -0
  14. data/demo/Procfile.dev +2 -0
  15. data/demo/README.md +24 -0
  16. data/demo/Rakefile +8 -0
  17. data/demo/app/assets/builds/.keep +0 -0
  18. data/demo/app/assets/config/manifest.js +3 -0
  19. data/demo/app/assets/images/.keep +0 -0
  20. data/demo/app/assets/stylesheets/application.sass.scss +2 -0
  21. data/demo/app/controllers/application_controller.rb +4 -0
  22. data/demo/app/controllers/concerns/.keep +0 -0
  23. data/demo/app/controllers/home_controller.rb +4 -0
  24. data/demo/app/helpers/application_helper.rb +4 -0
  25. data/demo/app/javascript/application.js +3 -0
  26. data/demo/app/javascript/controllers/application.js +9 -0
  27. data/demo/app/javascript/controllers/index.js +11 -0
  28. data/demo/app/views/home/index.html.erb +3 -0
  29. data/demo/app/views/layouts/application.html.erb +15 -0
  30. data/demo/bin/bundle +113 -0
  31. data/demo/bin/dev +8 -0
  32. data/demo/bin/importmap +5 -0
  33. data/demo/bin/rails +6 -0
  34. data/demo/bin/rake +6 -0
  35. data/demo/bin/setup +35 -0
  36. data/demo/config/application.rb +36 -0
  37. data/demo/config/boot.rb +6 -0
  38. data/demo/config/cable.yml +10 -0
  39. data/demo/config/credentials.yml.enc +1 -0
  40. data/demo/config/database.yml +25 -0
  41. data/demo/config/environment.rb +7 -0
  42. data/demo/config/environments/development.rb +63 -0
  43. data/demo/config/environments/production.rb +89 -0
  44. data/demo/config/environments/test.rb +59 -0
  45. data/demo/config/importmap.rb +9 -0
  46. data/demo/config/initializers/assets.rb +14 -0
  47. data/demo/config/initializers/content_security_policy.rb +26 -0
  48. data/demo/config/initializers/filter_parameter_logging.rb +10 -0
  49. data/demo/config/initializers/inflections.rb +17 -0
  50. data/demo/config/initializers/permissions_policy.rb +12 -0
  51. data/demo/config/locales/en.yml +33 -0
  52. data/demo/config/puma.rb +45 -0
  53. data/demo/config/routes.rb +8 -0
  54. data/demo/config/storage.yml +34 -0
  55. data/demo/config.ru +8 -0
  56. data/demo/lib/assets/.keep +0 -0
  57. data/demo/lib/tasks/.keep +0 -0
  58. data/demo/log/.keep +0 -0
  59. data/demo/package.json +9 -0
  60. data/demo/public/404.html +67 -0
  61. data/demo/public/422.html +67 -0
  62. data/demo/public/500.html +66 -0
  63. data/demo/public/favicon.ico +0 -0
  64. data/demo/yarn.lock +157 -0
  65. data/lib/optics/view_components/engine.rb +19 -0
  66. data/lib/optics/view_components/version.rb +1 -1
  67. data/lib/optics/view_components.rb +4 -2
  68. metadata +155 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3d8a939a59793e3f27065ac5cddadd809131961428f67f06d37e4be3f1e308ee
4
- data.tar.gz: d239ad7523f2e891a1659d0d5fc84b27ba01a6c46eef684196171d185bdf52d5
3
+ metadata.gz: a06b9454efef278cd56ab9a178e0aa4567f01db54119ad83e7d972c5a2fa232f
4
+ data.tar.gz: 3f0d0d5559526ba23baa50e88a4c84c4a38870e602013db702f1588be94d67e3
5
5
  SHA512:
6
- metadata.gz: 39847ffae1cc6c7c0d90625f1c247dd78b2037e6862145eb4185f34999c02028651dd44385465c521b40c207cffa8fcc260b0ef14ae4b9b72af0f15544c0c233
7
- data.tar.gz: 29b8bb26b211e60be644e7fb9e4548dff55ce39bbe4d1d9cc6aa7385421d08d39b63fbd1dd3e4fb143f46a2d9e703b7741b7f897de3d753c301d8da6bcbd3d9a
6
+ metadata.gz: 872cb462157bc5b9bcf7e610aafdb91eb2a125c042e7e9049ed38ced9f0750e54e6c8da305c8b568663bea3b3b56b72e0c8902df14758a8cfced1d3baefb8688
7
+ data.tar.gz: c66b0e6b482134588976015aaabdec6997c763b54460d28215b03cfb31524eda90c2825b4f4488559a84b40707f035191fa1f31450d4fbed449dbb2fad9f7f36
data/.rubocop.yml CHANGED
@@ -1,3 +1,3 @@
1
1
  AllCops:
2
2
  NewCops: enable
3
- TargetRubyVersion: 2.6
3
+ TargetRubyVersion: 3.1
data/Gemfile CHANGED
@@ -5,8 +5,10 @@ source 'https://rubygems.org'
5
5
  # Specify your gem's dependencies in optics_view_components.gemspec
6
6
  gemspec
7
7
 
8
- gem 'rake', '~> 13.0'
8
+ gem 'rails', '~> 7.0'
9
9
 
10
+ gem 'bootsnap', require: false
11
+ gem 'rake', '~> 13.0'
10
12
  gem 'rspec', '~> 3.0'
11
-
12
13
  gem 'rubocop', '~> 1.21'
14
+ gem 'view_component'
data/Gemfile.lock CHANGED
@@ -2,16 +2,165 @@ PATH
2
2
  remote: .
3
3
  specs:
4
4
  optics_view_components (0.1.0)
5
+ view_component (> 2.0, < 4.0)
5
6
 
6
7
  GEM
7
8
  remote: https://rubygems.org/
8
9
  specs:
10
+ actioncable (7.0.4.3)
11
+ actionpack (= 7.0.4.3)
12
+ activesupport (= 7.0.4.3)
13
+ nio4r (~> 2.0)
14
+ websocket-driver (>= 0.6.1)
15
+ actionmailbox (7.0.4.3)
16
+ actionpack (= 7.0.4.3)
17
+ activejob (= 7.0.4.3)
18
+ activerecord (= 7.0.4.3)
19
+ activestorage (= 7.0.4.3)
20
+ activesupport (= 7.0.4.3)
21
+ mail (>= 2.7.1)
22
+ net-imap
23
+ net-pop
24
+ net-smtp
25
+ actionmailer (7.0.4.3)
26
+ actionpack (= 7.0.4.3)
27
+ actionview (= 7.0.4.3)
28
+ activejob (= 7.0.4.3)
29
+ activesupport (= 7.0.4.3)
30
+ mail (~> 2.5, >= 2.5.4)
31
+ net-imap
32
+ net-pop
33
+ net-smtp
34
+ rails-dom-testing (~> 2.0)
35
+ actionpack (7.0.4.3)
36
+ actionview (= 7.0.4.3)
37
+ activesupport (= 7.0.4.3)
38
+ rack (~> 2.0, >= 2.2.0)
39
+ rack-test (>= 0.6.3)
40
+ rails-dom-testing (~> 2.0)
41
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
42
+ actiontext (7.0.4.3)
43
+ actionpack (= 7.0.4.3)
44
+ activerecord (= 7.0.4.3)
45
+ activestorage (= 7.0.4.3)
46
+ activesupport (= 7.0.4.3)
47
+ globalid (>= 0.6.0)
48
+ nokogiri (>= 1.8.5)
49
+ actionview (7.0.4.3)
50
+ activesupport (= 7.0.4.3)
51
+ builder (~> 3.1)
52
+ erubi (~> 1.4)
53
+ rails-dom-testing (~> 2.0)
54
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
55
+ activejob (7.0.4.3)
56
+ activesupport (= 7.0.4.3)
57
+ globalid (>= 0.3.6)
58
+ activemodel (7.0.4.3)
59
+ activesupport (= 7.0.4.3)
60
+ activerecord (7.0.4.3)
61
+ activemodel (= 7.0.4.3)
62
+ activesupport (= 7.0.4.3)
63
+ activestorage (7.0.4.3)
64
+ actionpack (= 7.0.4.3)
65
+ activejob (= 7.0.4.3)
66
+ activerecord (= 7.0.4.3)
67
+ activesupport (= 7.0.4.3)
68
+ marcel (~> 1.0)
69
+ mini_mime (>= 1.1.0)
70
+ activesupport (7.0.4.3)
71
+ concurrent-ruby (~> 1.0, >= 1.0.2)
72
+ i18n (>= 1.6, < 2)
73
+ minitest (>= 5.1)
74
+ tzinfo (~> 2.0)
75
+ addressable (2.8.4)
76
+ public_suffix (>= 2.0.2, < 6.0)
9
77
  ast (2.4.2)
78
+ bootsnap (1.16.0)
79
+ msgpack (~> 1.2)
80
+ builder (3.2.4)
81
+ capybara (3.39.1)
82
+ addressable
83
+ matrix
84
+ mini_mime (>= 0.1.3)
85
+ nokogiri (~> 1.8)
86
+ rack (>= 1.6.0)
87
+ rack-test (>= 0.6.3)
88
+ regexp_parser (>= 1.5, < 3.0)
89
+ xpath (~> 3.2)
90
+ coderay (1.1.3)
91
+ concurrent-ruby (1.2.2)
92
+ crass (1.0.6)
93
+ date (3.3.3)
10
94
  diff-lcs (1.5.0)
95
+ erubi (1.12.0)
96
+ globalid (1.1.0)
97
+ activesupport (>= 5.0)
98
+ i18n (1.13.0)
99
+ concurrent-ruby (~> 1.0)
11
100
  json (2.6.3)
101
+ loofah (2.21.3)
102
+ crass (~> 1.0.2)
103
+ nokogiri (>= 1.12.0)
104
+ mail (2.8.1)
105
+ mini_mime (>= 0.1.1)
106
+ net-imap
107
+ net-pop
108
+ net-smtp
109
+ marcel (1.0.2)
110
+ matrix (0.4.2)
111
+ method_source (1.0.0)
112
+ mini_mime (1.1.2)
113
+ minitest (5.18.0)
114
+ msgpack (1.7.1)
115
+ net-imap (0.3.4)
116
+ date
117
+ net-protocol
118
+ net-pop (0.1.2)
119
+ net-protocol
120
+ net-protocol (0.2.1)
121
+ timeout
122
+ net-smtp (0.3.3)
123
+ net-protocol
124
+ nio4r (2.5.9)
125
+ nokogiri (1.15.1-x86_64-linux)
126
+ racc (~> 1.4)
12
127
  parallel (1.23.0)
13
128
  parser (3.2.2.1)
14
129
  ast (~> 2.4.1)
130
+ pry (0.14.2)
131
+ coderay (~> 1.1)
132
+ method_source (~> 1.0)
133
+ public_suffix (5.0.1)
134
+ racc (1.6.2)
135
+ rack (2.2.7)
136
+ rack-test (2.1.0)
137
+ rack (>= 1.3)
138
+ rails (7.0.4.3)
139
+ actioncable (= 7.0.4.3)
140
+ actionmailbox (= 7.0.4.3)
141
+ actionmailer (= 7.0.4.3)
142
+ actionpack (= 7.0.4.3)
143
+ actiontext (= 7.0.4.3)
144
+ actionview (= 7.0.4.3)
145
+ activejob (= 7.0.4.3)
146
+ activemodel (= 7.0.4.3)
147
+ activerecord (= 7.0.4.3)
148
+ activestorage (= 7.0.4.3)
149
+ activesupport (= 7.0.4.3)
150
+ bundler (>= 1.15.0)
151
+ railties (= 7.0.4.3)
152
+ rails-dom-testing (2.0.3)
153
+ activesupport (>= 4.2.0)
154
+ nokogiri (>= 1.6)
155
+ rails-html-sanitizer (1.5.0)
156
+ loofah (~> 2.19, >= 2.19.1)
157
+ railties (7.0.4.3)
158
+ actionpack (= 7.0.4.3)
159
+ activesupport (= 7.0.4.3)
160
+ method_source
161
+ rake (>= 12.2)
162
+ thor (~> 1.0)
163
+ zeitwerk (~> 2.5)
15
164
  rainbow (3.1.1)
16
165
  rake (13.0.6)
17
166
  regexp_parser (2.8.0)
@@ -28,6 +177,14 @@ GEM
28
177
  rspec-mocks (3.12.5)
29
178
  diff-lcs (>= 1.2.0, < 2.0)
30
179
  rspec-support (~> 3.12.0)
180
+ rspec-rails (6.0.2)
181
+ actionpack (>= 6.1)
182
+ activesupport (>= 6.1)
183
+ railties (>= 6.1)
184
+ rspec-core (~> 3.12)
185
+ rspec-expectations (~> 3.12)
186
+ rspec-mocks (~> 3.12)
187
+ rspec-support (~> 3.12)
31
188
  rspec-support (3.12.0)
32
189
  rubocop (1.51.0)
33
190
  json (~> 2.3)
@@ -42,16 +199,45 @@ GEM
42
199
  rubocop-ast (1.28.1)
43
200
  parser (>= 3.2.1.0)
44
201
  ruby-progressbar (1.13.0)
202
+ sprockets (4.2.0)
203
+ concurrent-ruby (~> 1.0)
204
+ rack (>= 2.2.4, < 4)
205
+ sprockets-rails (3.4.2)
206
+ actionpack (>= 5.2)
207
+ activesupport (>= 5.2)
208
+ sprockets (>= 3.0.0)
209
+ thor (1.2.2)
210
+ timeout (0.3.2)
211
+ tzinfo (2.0.6)
212
+ concurrent-ruby (~> 1.0)
45
213
  unicode-display_width (2.4.2)
214
+ view_component (3.0.0)
215
+ activesupport (>= 5.2.0, < 8.0)
216
+ concurrent-ruby (~> 1.0)
217
+ method_source (~> 1.0)
218
+ websocket-driver (0.7.5)
219
+ websocket-extensions (>= 0.1.0)
220
+ websocket-extensions (0.1.5)
221
+ xpath (3.2.0)
222
+ nokogiri (~> 1.8)
223
+ zeitwerk (2.6.8)
46
224
 
47
225
  PLATFORMS
48
226
  x86_64-linux
49
227
 
50
228
  DEPENDENCIES
229
+ bootsnap
230
+ capybara
51
231
  optics_view_components!
232
+ pry
233
+ rails (~> 7.0)
52
234
  rake (~> 13.0)
53
235
  rspec (~> 3.0)
236
+ rspec-rails
54
237
  rubocop (~> 1.21)
238
+ sprockets
239
+ sprockets-rails
240
+ view_component
55
241
 
56
242
  BUNDLED WITH
57
243
  2.4.10
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Optics::ApplicationViewComponent < ViewComponent::Base
4
+ class_attribute :optional_attributes, default: {}
5
+ class_attribute :required_attributes, default: {}
6
+
7
+ class << self
8
+ # To allow DB queries, put this in the class definition:
9
+ # self.allow_db_queries = true
10
+ attr_accessor :allow_db_queries
11
+ alias allow_db_queries? allow_db_queries
12
+
13
+ def requires(parameter, default: nil)
14
+ required_attributes[parameter] = default
15
+
16
+ attr_reader parameter
17
+ end
18
+
19
+ def accepts(parameter, default: nil)
20
+ optional_attributes[parameter] = default
21
+
22
+ attr_reader parameter
23
+ end
24
+
25
+ def inherited(subclass)
26
+ subclass.optional_attributes = optional_attributes.dup
27
+ subclass.required_attributes = required_attributes.dup
28
+ super
29
+ end
30
+ end
31
+
32
+ def initialize(**attributes)
33
+ initialize_instance_variables(required_attributes, attributes) do |key, _default|
34
+ raise ArgumentError, "Missing keyword: :#{key}"
35
+ end
36
+
37
+ initialize_instance_variables(optional_attributes, attributes) do |key, default|
38
+ instance_variable_set("@#{key}", default)
39
+ end
40
+
41
+ @attributes = attributes.except(*optional_attributes.keys, *required_attributes.keys)
42
+ end
43
+
44
+ def class_for(name)
45
+ "c--#{identifier}--#{name}"
46
+ end
47
+
48
+ def container_class
49
+ "c--#{identifier}"
50
+ end
51
+
52
+ def class_names_for(*args)
53
+ class_names(*args).map { |name| class_for(name) }.join(' ')
54
+ end
55
+
56
+ # Inspired by https://github.com/primer/view_components/blob/v0.1.9/app/lib/primer/class_name_helper.rb#L9
57
+ def class_names(*args) # rubocop:disable Metrics/MethodLength
58
+ [].tap do |classes|
59
+ args.each do |class_name|
60
+ case class_name
61
+ when String
62
+ classes << class_name
63
+ when Hash
64
+ class_name.each do |key, val|
65
+ classes << key if val
66
+ end
67
+ end
68
+ end
69
+
70
+ classes.compact!
71
+ classes.uniq!
72
+ end
73
+ end
74
+
75
+ # Used by Stimulus. E.g. data-controller=identifier => data-controller='dynamic-form--field'
76
+ def identifier
77
+ @identifier ||= self.class.name.sub('::Component', '').underscore.gsub('_', '-').gsub('/', '--')
78
+ end
79
+
80
+ # Helper for Stimulus data attributes
81
+ def data_for(method:, target:)
82
+ data_method(method).merge(data_target(target))
83
+ end
84
+
85
+ # Helper for Stimulus controller method
86
+ def data_method(method, event: 'click')
87
+ { action: "#{event}->#{identifier}##{method}" }
88
+ end
89
+
90
+ # Helper for Stimulus controller target
91
+ def data_target(target)
92
+ { "#{identifier}": { target: } }
93
+ end
94
+
95
+ # Helper for Stimulus controller value
96
+ def data_values(values)
97
+ values.transform_keys do |key|
98
+ "#{identifier}-#{key}-value"
99
+ end
100
+ end
101
+
102
+ private
103
+
104
+ def initialize_instance_variables(configured_attributes, attributes)
105
+ configured_attributes.each do |key, default|
106
+ if attributes.key?(key)
107
+ instance_variable_set("@#{key}", attributes[key])
108
+ else
109
+ yield(key, default)
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Optics::ApplicationViewComponentPreview < ViewComponent::Preview
4
+ include ApplicationHelper
5
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Optics
4
+ module Button
5
+ class Component < ApplicationViewComponent
6
+ SIZES = %w[small medium large].freeze
7
+ STYLES = %w[default primary secondary delete].freeze
8
+
9
+ renders_one :leading_icon, lambda { |name:, size: 'normal'|
10
+ Optics::Icon::Component.new(name:, size:)
11
+ }
12
+
13
+ accepts :label
14
+ accepts :border, default: true
15
+ accepts :icon, default: false
16
+ accepts :size, default: 'medium'
17
+ accepts :variant, default: 'default'
18
+ accepts :url
19
+
20
+ def call
21
+ build_button do
22
+ leading_icon
23
+ label
24
+ end
25
+ end
26
+
27
+ def build_button(&)
28
+ return link_to(url, class: classes, **@attributes, &) if url
29
+
30
+ tag.button(class: classes, **@attributes, &)
31
+ end
32
+
33
+ def button_class
34
+ return 'btn' if variant == 'default'
35
+
36
+ "btn-#{variant}"
37
+ end
38
+
39
+ def classes
40
+ class_names(
41
+ button_class,
42
+ size_class,
43
+ 'btn--icon': icon,
44
+ 'btn--no-border': !border
45
+ ).join(' ')
46
+ end
47
+
48
+ def size_class
49
+ return if size == 'medium'
50
+
51
+ "btn--#{size}"
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Optics
4
+ module Button
5
+ class Preview < ApplicationViewComponentPreview
6
+ # @param border toggle
7
+ # @param icon toggle
8
+ # @param id text
9
+ # @param label text
10
+ # @param size select {{ ::Button::Component::SIZES }}
11
+ # @param variant select {{ ::Button::Component::STYLES }}
12
+ # @param url text
13
+ def default( # rubocop:disable Metrics/ParameterLists
14
+ border: true,
15
+ icon: false,
16
+ id: nil,
17
+ label: 'Default',
18
+ size: 'normal',
19
+ variant: 'default',
20
+ url: nil
21
+ )
22
+ render(Button::Component.new(
23
+ border:,
24
+ icon:,
25
+ id:,
26
+ label:,
27
+ size:,
28
+ variant:,
29
+ url:,
30
+ ))
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Optics
4
+ module Icon
5
+ class Component < ApplicationViewComponent
6
+ SIZES = %w[normal large x-large].freeze
7
+ WEIGHTS = %w[light normal semi-bold bold].freeze
8
+ EMPHASES = %w[low normal high].freeze
9
+
10
+ requires :name
11
+ accepts :data
12
+ accepts :emphasis, default: 'normal'
13
+ accepts :filled, default: false
14
+ accepts :size, default: 'normal'
15
+ accepts :title
16
+ accepts :weight, default: 'normal'
17
+
18
+ def call
19
+ content_tag(
20
+ :span,
21
+ class: classes,
22
+ 'aria-label': title,
23
+ title:,
24
+ data:
25
+ ) do
26
+ name
27
+ end
28
+ end
29
+
30
+ def classes
31
+ class_names(
32
+ 'material-symbols-outlined',
33
+ size_class,
34
+ weight_class,
35
+ emphasis_class,
36
+ 'icon--filled': filled
37
+ ).join(' ')
38
+ end
39
+
40
+ def size_class
41
+ return if size == 'normal'
42
+
43
+ "icon--#{size}"
44
+ end
45
+
46
+ def weight_class
47
+ return if weight == 'normal'
48
+
49
+ "icon--weight-#{weight}"
50
+ end
51
+
52
+ def emphasis_class
53
+ return if emphasis == 'normal'
54
+
55
+ "icon--#{emphasis}-emphasis"
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Icon
4
+ class Preview < ViewComponent::Preview
5
+ # @param emphasis select {{ ::Icon::Component::EMPHASES }}
6
+ # @param filled toggle
7
+ # @param name
8
+ # @param size select {{ ::Icon::Component::SIZES }}
9
+ # @param title
10
+ # @param weight select {{ ::Icon::Component::WEIGHTS }}
11
+ def default( # rubocop:disable Metrics/ParameterLists
12
+ emphasis: 'normal',
13
+ filled: false,
14
+ name: 'settings',
15
+ size: 'normal',
16
+ title: nil,
17
+ weight: 'normal'
18
+ )
19
+ render(
20
+ Icon::Component.new(
21
+ emphasis:,
22
+ filled:,
23
+ name:,
24
+ size:,
25
+ title:,
26
+ weight:
27
+ )
28
+ )
29
+ end
30
+ end
31
+ end
@@ -0,0 +1 @@
1
+ 3.2.2
data/demo/Gemfile ADDED
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'rails', '~> 7.0.4', '>= 7.0.4.3'
6
+
7
+ gem 'bootsnap', require: false
8
+ gem 'cssbundling-rails', '~> 1.1'
9
+ gem 'puma', '~> 6.0'
10
+ gem 'sprockets-rails'
11
+
12
+ gem 'optics_view_components', path: '../'
13
+
14
+ group :development, :test do
15
+ gem 'debug', platforms: %i[mri mingw x64_mingw]
16
+ end
17
+
18
+ group :development do
19
+ gem 'web-console'
20
+ end
21
+