avo 3.9.0 → 3.9.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
- <div class="relative flex justify-center items-center w-full !border-b-2 border-gray-200 border-solid">
2
- <div class="absolute inset-auto z-20 text-xs font-semibold uppercase leading-none text-gray-500 bg-white px-2">
3
- <%if label.present?%>
4
- <%=label%>
5
- <%end%>
6
- </div>
1
+ <div class="relative flex justify-center items-center w-full !border-b-2 border-gray-200 border-solid" data-component-name="<%= self.class.to_s.underscore %>">
2
+ <% if label.present? %>
3
+ <div class="absolute inset-auto z-20 text-xs font-semibold uppercase leading-none text-gray-500 bg-white px-2 border py-1 rounded">
4
+ <%= label %>
5
+ </div>
6
+ <% end %>
7
7
  </div>
@@ -15,7 +15,6 @@ module Avo
15
15
  protect_from_forgery with: :exception
16
16
  around_action :set_avo_locale
17
17
  around_action :set_force_locale, if: -> { params[:force_locale].present? }
18
- before_action :set_default_locale, if: -> { params[:set_locale].present? }
19
18
  before_action :init_app
20
19
  before_action :set_active_storage_current_host
21
20
  before_action :set_resource_name
@@ -52,10 +51,6 @@ module Avo
52
51
  super
53
52
  end
54
53
 
55
- def hello
56
- puts "Nobody tested me :("
57
- end
58
-
59
54
  private
60
55
 
61
56
  # Get the pluralized resource name for this request
@@ -94,7 +89,7 @@ module Avo
94
89
 
95
90
  return field.use_resource if field&.use_resource.present?
96
91
 
97
- reflection = @record._reflections.with_indifferent_access[params[:for_attribute] || params[:related_name]]
92
+ reflection = @record._reflections.with_indifferent_access[field&.for_attribute || params[:related_name]]
98
93
 
99
94
  reflected_model = reflection.klass
100
95
 
@@ -279,23 +274,21 @@ module Avo
279
274
  @resource.form_scope
280
275
  end
281
276
 
282
- # Sets the locale set in avo.rb initializer
277
+ # Sets the locale set in avo.rb initializer or if to something that the user set using the `?set_locale=pt-BR` param
283
278
  def set_avo_locale(&action)
284
- locale = Avo.configuration.locale || I18n.default_locale
285
- I18n.with_locale(locale, &action)
286
- end
279
+ locale = Avo.configuration.default_locale
287
280
 
288
- # Enable the user to change the default locale with the `?set_locale=pt-BR` param
289
- def set_default_locale
290
- locale = params[:set_locale] || I18n.default_locale
281
+ if params[:set_locale].present?
282
+ locale = params[:set_locale]
283
+ Avo.configuration.locale = locale
284
+ end
291
285
 
292
- I18n.default_locale = locale
286
+ I18n.with_locale(locale, &action)
293
287
  end
294
288
 
295
289
  # Temporary set the locale and reverting at the end of the request.
296
290
  def set_force_locale(&action)
297
- locale = params[:force_locale] || I18n.default_locale
298
- I18n.with_locale(locale, &action)
291
+ I18n.with_locale(params[:force_locale], &action)
299
292
  end
300
293
 
301
294
  def set_sidebar_open
@@ -327,8 +320,6 @@ module Avo
327
320
  end
328
321
  end
329
322
 
330
- private
331
-
332
323
  def choose_layout
333
324
  if turbo_frame_request?
334
325
  "avo/blank"
@@ -78,7 +78,7 @@ module Avo
78
78
  end
79
79
 
80
80
  def destroy
81
- association_name = BaseResource.valid_association_name(@record, params[:related_name])
81
+ association_name = BaseResource.valid_association_name(@record, @field.for_attribute || params[:related_name])
82
82
 
83
83
  if reflection_class == "HasManyReflection"
84
84
  @record.send(association_name).delete @attachment_record
@@ -157,7 +157,7 @@ module Avo
157
157
  end
158
158
 
159
159
  def association_from_params
160
- params[:for_attribute] || params[:related_name]
160
+ @field&.for_attribute || params[:related_name]
161
161
  end
162
162
  end
163
163
  end
@@ -558,7 +558,7 @@ module Avo
558
558
 
559
559
  # Set pagy locale from params or from avo configuration, if both nil locale = "en"
560
560
  def set_pagy_locale
561
- @pagy_locale = locale.to_s || Avo.configuration.locale || "en"
561
+ @pagy_locale = locale.to_s || Avo.configuration.default_locale || "en"
562
562
  end
563
563
 
564
564
  def safe_call(method)
@@ -13,6 +13,9 @@
13
13
  <%= form_with scope: 'fields',
14
14
  url: Avo::Services::URIService.parse(@resource.records_path).append_paths("actions").to_s,
15
15
  local: true,
16
+ html: {
17
+ novalidate: true,
18
+ },
16
19
  data: {
17
20
  action_target: :form,
18
21
  **@action.class.form_data_attributes,
@@ -238,6 +238,10 @@ module Avo
238
238
  def pagination
239
239
  Avo::ExecutionContext.new(target: @pagination).handle
240
240
  end
241
+
242
+ def default_locale
243
+ @locale || I18n.default_locale
244
+ end
241
245
  end
242
246
 
243
247
  def self.configuration
@@ -86,6 +86,7 @@ module Avo
86
86
  @action = args[:action]
87
87
  @components = args[:components] || {}
88
88
  @for_attribute = args[:for_attribute]
89
+ @meta = args[:meta]
89
90
 
90
91
  @args = args
91
92
 
@@ -198,23 +199,25 @@ module Avo
198
199
  key = @for_attribute.to_s if @for_attribute.present?
199
200
  return record unless has_attribute?(record, key)
200
201
 
201
- if @update_using.present?
202
- value = Avo::ExecutionContext.new(
203
- target: @update_using,
204
- record: record,
205
- key: key,
206
- value: value,
207
- resource: resource,
208
- field: self,
209
- include: self.class.included_modules
210
- ).handle
211
- end
212
-
213
- record.public_send(:"#{key}=", value)
202
+ record.public_send(:"#{key}=", apply_update_using(record, key, value, resource))
214
203
 
215
204
  record
216
205
  end
217
206
 
207
+ def apply_update_using(record, key, value, resource)
208
+ return value if @update_using.nil?
209
+
210
+ Avo::ExecutionContext.new(
211
+ target: @update_using,
212
+ record:,
213
+ key:,
214
+ value:,
215
+ resource:,
216
+ field: self,
217
+ include: self.class.included_modules
218
+ ).handle
219
+ end
220
+
218
221
  def has_attribute?(record, attribute)
219
222
  record.methods.include? attribute.to_sym
220
223
  end
@@ -281,6 +284,10 @@ module Avo
281
284
  id
282
285
  end
283
286
 
287
+ def meta
288
+ Avo::ExecutionContext.new(target: @meta, record: record, resource: @resource, view: @view).handle
289
+ end
290
+
284
291
  private
285
292
 
286
293
  def model_or_class(model)
@@ -32,32 +32,39 @@ module Avo
32
32
  end
33
33
 
34
34
  def json_value
35
- value.map do |item|
36
- {
37
- value: item.name
38
- }
39
- end.as_json
35
+ acts_as_taggable_on_values.map { |value| {value:} }.as_json
40
36
  end
41
37
 
42
- def fill_field(model, key, value, params)
43
- return fill_acts_as_taggable(model, key, value, params) if acts_as_taggable_on.present?
38
+ def acts_as_taggable_on_values
39
+ # When record is DB persistent the values are fetched from the DB
40
+ # Else the array values are fetched from the record using the tag_list_on helper
41
+ # values_array examples: ["1", "2"]
42
+ # ["example suggestion","example tag"]
43
+ if record.persisted?
44
+ value.map { |item| item.name }
45
+ else
46
+ record.tag_list_on(acts_as_taggable_on)
47
+ end
48
+ end
44
49
 
45
- val = if value.is_a?(String)
50
+ def fill_field(record, key, value, params)
51
+ return fill_acts_as_taggable(record, key, value, params) if acts_as_taggable_on.present?
52
+
53
+ value = if value.is_a?(String)
46
54
  value.split(",")
47
- elsif value.is_a?(Array)
48
- value
49
55
  else
50
56
  value
51
57
  end
52
- model.send(:"#{key}=", val)
53
58
 
54
- model
59
+ record.send(:"#{key}=", apply_update_using(record, key, value, resource))
60
+
61
+ record
55
62
  end
56
63
 
57
- def fill_acts_as_taggable(model, key, value, params)
58
- model.send(act_as_taggable_attribute(key), value)
64
+ def fill_acts_as_taggable(record, key, value, params)
65
+ record.send(act_as_taggable_attribute(key), value)
59
66
 
60
- model
67
+ record
61
68
  end
62
69
 
63
70
  def suggestions
@@ -2,7 +2,7 @@ module Avo
2
2
  module Resources
3
3
  module Controls
4
4
  class ActionsList < BaseControl
5
- ACTIONS_LIST_DROPDOWN_ICON = "heroicons/outline/arrow-down-circle"
5
+ ACTIONS_LIST_DROPDOWN_ICON = "heroicons/outline/arrow-down-circle" unless defined?(ACTIONS_LIST_DROPDOWN_ICON)
6
6
 
7
7
  attr_reader :color, :exclude, :include, :style, :icon
8
8
 
data/lib/avo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Avo
2
- VERSION = "3.9.0" unless const_defined?(:VERSION)
2
+ VERSION = "3.9.2" unless const_defined?(:VERSION)
3
3
  end
@@ -7302,10 +7302,6 @@ tag.tagify__tag{
7302
7302
  bottom:0.25rem
7303
7303
  }
7304
7304
 
7305
- .bottom-4{
7306
- bottom:1rem
7307
- }
7308
-
7309
7305
  .bottom-full{
7310
7306
  bottom:100%
7311
7307
  }
@@ -7350,14 +7346,6 @@ tag.tagify__tag{
7350
7346
  right:0.75rem
7351
7347
  }
7352
7348
 
7353
- .right-4{
7354
- right:1rem
7355
- }
7356
-
7357
- .right-\[0\.3rem\]{
7358
- right:0.3rem
7359
- }
7360
-
7361
7349
  .start-1{
7362
7350
  inset-inline-start:0.25rem
7363
7351
  }
@@ -7370,10 +7358,6 @@ tag.tagify__tag{
7370
7358
  top:0px
7371
7359
  }
7372
7360
 
7373
- .top-1{
7374
- top:0.25rem
7375
- }
7376
-
7377
7361
  .top-1\/2{
7378
7362
  top:50%
7379
7363
  }
@@ -7442,14 +7426,6 @@ tag.tagify__tag{
7442
7426
  grid-column:span 1 / span 1
7443
7427
  }
7444
7428
 
7445
- .col-span-2{
7446
- grid-column:span 2 / span 2
7447
- }
7448
-
7449
- .col-span-3{
7450
- grid-column:span 3 / span 3
7451
- }
7452
-
7453
7429
  .col-span-4{
7454
7430
  grid-column:span 4 / span 4
7455
7431
  }
@@ -7521,11 +7497,6 @@ tag.tagify__tag{
7521
7497
  margin-right:-0.5rem
7522
7498
  }
7523
7499
 
7524
- .-mx-4{
7525
- margin-left:-1rem;
7526
- margin-right:-1rem
7527
- }
7528
-
7529
7500
  .-mx-6{
7530
7501
  margin-left:-1.5rem;
7531
7502
  margin-right:-1.5rem
@@ -7536,11 +7507,6 @@ tag.tagify__tag{
7536
7507
  margin-bottom:-0.5rem
7537
7508
  }
7538
7509
 
7539
- .-my-4{
7540
- margin-top:-1rem;
7541
- margin-bottom:-1rem
7542
- }
7543
-
7544
7510
  .mx-3{
7545
7511
  margin-left:0.75rem;
7546
7512
  margin-right:0.75rem
@@ -7658,10 +7624,6 @@ tag.tagify__tag{
7658
7624
  margin-left:2.5rem
7659
7625
  }
7660
7626
 
7661
- .ml-12{
7662
- margin-left:3rem
7663
- }
7664
-
7665
7627
  .ml-2{
7666
7628
  margin-left:0.5rem
7667
7629
  }
@@ -7865,10 +7827,6 @@ tag.tagify__tag{
7865
7827
  height:3rem
7866
7828
  }
7867
7829
 
7868
- .h-14{
7869
- height:3.5rem
7870
- }
7871
-
7872
7830
  .h-16{
7873
7831
  height:4rem
7874
7832
  }
@@ -7901,10 +7859,6 @@ tag.tagify__tag{
7901
7859
  height:1.5rem
7902
7860
  }
7903
7861
 
7904
- .h-60{
7905
- height:15rem
7906
- }
7907
-
7908
7862
  .h-64{
7909
7863
  height:16rem
7910
7864
  }
@@ -7933,10 +7887,6 @@ tag.tagify__tag{
7933
7887
  height:100%
7934
7888
  }
7935
7889
 
7936
- .max-h-11{
7937
- max-height:2.75rem
7938
- }
7939
-
7940
7890
  .max-h-11\/12{
7941
7891
  max-height:91.666667%
7942
7892
  }
@@ -7945,10 +7895,6 @@ tag.tagify__tag{
7945
7895
  max-height:100%
7946
7896
  }
7947
7897
 
7948
- .min-h-1{
7949
- min-height:0.25rem
7950
- }
7951
-
7952
7898
  .min-h-1\/4{
7953
7899
  min-height:25%
7954
7900
  }
@@ -7997,18 +7943,10 @@ tag.tagify__tag{
7997
7943
  min-height:8rem
7998
7944
  }
7999
7945
 
8000
- .min-h-dvh{
8001
- min-height:100dvh
8002
- }
8003
-
8004
7946
  .min-h-full{
8005
7947
  min-height:100%
8006
7948
  }
8007
7949
 
8008
- .min-h-inherit{
8009
- min-height:inherit
8010
- }
8011
-
8012
7950
  .min-h-screen{
8013
7951
  min-height:100vh
8014
7952
  }
@@ -8017,10 +7955,6 @@ tag.tagify__tag{
8017
7955
  width:0px
8018
7956
  }
8019
7957
 
8020
- .w-1{
8021
- width:0.25rem
8022
- }
8023
-
8024
7958
  .w-1\/2{
8025
7959
  width:50%
8026
7960
  }
@@ -8033,10 +7967,6 @@ tag.tagify__tag{
8033
7967
  width:83.333333%
8034
7968
  }
8035
7969
 
8036
- .w-11{
8037
- width:2.75rem
8038
- }
8039
-
8040
7970
  .w-11\/12{
8041
7971
  width:91.666667%
8042
7972
  }
@@ -8057,10 +7987,6 @@ tag.tagify__tag{
8057
7987
  width:6rem
8058
7988
  }
8059
7989
 
8060
- .w-3{
8061
- width:0.75rem
8062
- }
8063
-
8064
7990
  .w-4{
8065
7991
  width:1rem
8066
7992
  }
@@ -8209,19 +8135,10 @@ tag.tagify__tag{
8209
8135
  flex-grow:1
8210
8136
  }
8211
8137
 
8212
- .grow-0{
8213
- flex-grow:0
8214
- }
8215
-
8216
8138
  .border-collapse{
8217
8139
  border-collapse:collapse
8218
8140
  }
8219
8141
 
8220
- .-translate-x-1{
8221
- --tw-translate-x:-0.25rem;
8222
- transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))
8223
- }
8224
-
8225
8142
  .-translate-x-1\/2{
8226
8143
  --tw-translate-x:-50%;
8227
8144
  transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))
@@ -8335,18 +8252,6 @@ tag.tagify__tag{
8335
8252
  grid-template-columns:repeat(2, minmax(0, 1fr))
8336
8253
  }
8337
8254
 
8338
- .grid-cols-3{
8339
- grid-template-columns:repeat(3, minmax(0, 1fr))
8340
- }
8341
-
8342
- .grid-cols-4{
8343
- grid-template-columns:repeat(4, minmax(0, 1fr))
8344
- }
8345
-
8346
- .grid-cols-5{
8347
- grid-template-columns:repeat(5, minmax(0, 1fr))
8348
- }
8349
-
8350
8255
  .grid-cols-6{
8351
8256
  grid-template-columns:repeat(6, minmax(0, 1fr))
8352
8257
  }
@@ -8363,10 +8268,6 @@ tag.tagify__tag{
8363
8268
  flex-direction:column
8364
8269
  }
8365
8270
 
8366
- .flex-col-reverse{
8367
- flex-direction:column-reverse
8368
- }
8369
-
8370
8271
  .flex-wrap{
8371
8272
  flex-wrap:wrap
8372
8273
  }
@@ -8443,12 +8344,6 @@ tag.tagify__tag{
8443
8344
  gap:1.5rem
8444
8345
  }
8445
8346
 
8446
- .space-x-0 > :not([hidden]) ~ :not([hidden]){
8447
- --tw-space-x-reverse:0;
8448
- margin-right:calc(0px * var(--tw-space-x-reverse));
8449
- margin-left:calc(0px * calc(1 - var(--tw-space-x-reverse)))
8450
- }
8451
-
8452
8347
  .space-x-1 > :not([hidden]) ~ :not([hidden]){
8453
8348
  --tw-space-x-reverse:0;
8454
8349
  margin-right:calc(0.25rem * var(--tw-space-x-reverse));
@@ -8473,18 +8368,6 @@ tag.tagify__tag{
8473
8368
  margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))
8474
8369
  }
8475
8370
 
8476
- .space-x-8 > :not([hidden]) ~ :not([hidden]){
8477
- --tw-space-x-reverse:0;
8478
- margin-right:calc(2rem * var(--tw-space-x-reverse));
8479
- margin-left:calc(2rem * calc(1 - var(--tw-space-x-reverse)))
8480
- }
8481
-
8482
- .space-y-0 > :not([hidden]) ~ :not([hidden]){
8483
- --tw-space-y-reverse:0;
8484
- margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));
8485
- margin-bottom:calc(0px * var(--tw-space-y-reverse))
8486
- }
8487
-
8488
8371
  .space-y-1 > :not([hidden]) ~ :not([hidden]){
8489
8372
  --tw-space-y-reverse:0;
8490
8373
  margin-top:calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));
@@ -8951,11 +8834,6 @@ tag.tagify__tag{
8951
8834
  background-color:rgb(227 229 232 / var(--tw-bg-opacity))
8952
8835
  }
8953
8836
 
8954
- .bg-gray-200{
8955
- --tw-bg-opacity:1;
8956
- background-color:rgb(200 203 208 / var(--tw-bg-opacity))
8957
- }
8958
-
8959
8837
  .bg-gray-25{
8960
8838
  --tw-bg-opacity:1;
8961
8839
  background-color:rgb(246 246 247 / var(--tw-bg-opacity))
@@ -9040,10 +8918,6 @@ tag.tagify__tag{
9040
8918
  background-color:rgb(var(--color-primary-100))
9041
8919
  }
9042
8920
 
9043
- .bg-primary-400{
9044
- background-color:rgb(var(--color-primary-400))
9045
- }
9046
-
9047
8921
  .bg-primary-500{
9048
8922
  background-color:rgb(var(--color-primary-500))
9049
8923
  }
@@ -9204,11 +9078,6 @@ tag.tagify__tag{
9204
9078
  padding-right:0.5rem
9205
9079
  }
9206
9080
 
9207
- .px-24{
9208
- padding-left:6rem;
9209
- padding-right:6rem
9210
- }
9211
-
9212
9081
  .px-3{
9213
9082
  padding-left:0.75rem;
9214
9083
  padding-right:0.75rem
@@ -9229,11 +9098,6 @@ tag.tagify__tag{
9229
9098
  padding-right:1.5rem
9230
9099
  }
9231
9100
 
9232
- .px-8{
9233
- padding-left:2rem;
9234
- padding-right:2rem
9235
- }
9236
-
9237
9101
  .py-0{
9238
9102
  padding-top:0px;
9239
9103
  padding-bottom:0px
@@ -9326,10 +9190,6 @@ tag.tagify__tag{
9326
9190
  padding-bottom:2rem
9327
9191
  }
9328
9192
 
9329
- .pe-1{
9330
- padding-inline-end:0.25rem
9331
- }
9332
-
9333
9193
  .pe-64{
9334
9194
  padding-inline-end:16rem
9335
9195
  }
@@ -9358,10 +9218,6 @@ tag.tagify__tag{
9358
9218
  padding-top:0.125rem
9359
9219
  }
9360
9220
 
9361
- .pt-1{
9362
- padding-top:0.25rem
9363
- }
9364
-
9365
9221
  .pt-16{
9366
9222
  padding-top:4rem
9367
9223
  }
@@ -9802,11 +9658,6 @@ tag.tagify__tag{
9802
9658
  filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)
9803
9659
  }
9804
9660
 
9805
- .drop-shadow{
9806
- --tw-drop-shadow:drop-shadow(0 1px 2px rgb(0 0 0 / 0.1)) drop-shadow(0 1px 1px rgb(0 0 0 / 0.06));
9807
- filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)
9808
- }
9809
-
9810
9661
  .grayscale{
9811
9662
  --tw-grayscale:grayscale(100%);
9812
9663
  filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)
@@ -9840,12 +9691,6 @@ tag.tagify__tag{
9840
9691
  transition-duration:150ms
9841
9692
  }
9842
9693
 
9843
- .transition-colors{
9844
- transition-property:color, background-color, border-color, text-decoration-color, fill, stroke;
9845
- transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);
9846
- transition-duration:150ms
9847
- }
9848
-
9849
9694
  .transition-opacity{
9850
9695
  transition-property:opacity;
9851
9696
  transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);
@@ -9876,10 +9721,6 @@ tag.tagify__tag{
9876
9721
  transition-timing-function:cubic-bezier(0, 0, 0.2, 1)
9877
9722
  }
9878
9723
 
9879
- .will-change-transform{
9880
- will-change:transform
9881
- }
9882
-
9883
9724
  .\[a-zA-Z\:_\]{
9884
9725
  a-z-a--z:
9885
9726
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: avo
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.9.0
4
+ version: 3.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adrian Marin
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2024-06-11 00:00:00.000000000 Z
13
+ date: 2024-06-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -236,6 +236,9 @@ files:
236
236
  - Gemfile.lock
237
237
  - README.md
238
238
  - Rakefile
239
+ - app/assets/builds/avo.base.css
240
+ - app/assets/builds/avo.base.js
241
+ - app/assets/builds/avo.base.js.map
239
242
  - app/assets/config/avo_manifest.js
240
243
  - app/assets/stylesheets/avo.base.css
241
244
  - app/assets/stylesheets/css/active-storage.css