avo 3.10.10 → 3.11.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.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -4
  3. data/Gemfile.lock +51 -49
  4. data/app/components/avo/actions_component.html.erb +10 -6
  5. data/app/components/avo/actions_component.rb +37 -55
  6. data/app/components/avo/button_component.rb +3 -3
  7. data/app/components/avo/fields/belongs_to_field/edit_component.html.erb +8 -4
  8. data/app/components/avo/fields/belongs_to_field/show_component.rb +1 -1
  9. data/app/components/avo/fields/common/files/list_viewer_component.rb +1 -1
  10. data/app/components/avo/fields/has_one_field/show_component.rb +3 -3
  11. data/app/components/avo/index/resource_controls_component.rb +9 -5
  12. data/app/components/avo/paginator_component.html.erb +1 -1
  13. data/app/components/avo/paginator_component.rb +1 -1
  14. data/app/components/avo/panel_component.html.erb +6 -4
  15. data/app/components/avo/resource_component.rb +3 -2
  16. data/app/components/avo/resource_sidebar_component.html.erb +1 -1
  17. data/app/components/avo/views/resource_edit_component.html.erb +2 -2
  18. data/app/components/avo/views/resource_index_component.html.erb +2 -2
  19. data/app/components/avo/views/resource_index_component.rb +17 -4
  20. data/app/components/avo/views/resource_show_component.html.erb +2 -2
  21. data/app/controllers/avo/actions_controller.rb +1 -1
  22. data/app/controllers/avo/application_controller.rb +1 -1
  23. data/app/controllers/avo/associations_controller.rb +55 -18
  24. data/app/controllers/avo/base_controller.rb +7 -2
  25. data/app/controllers/avo/search_controller.rb +1 -1
  26. data/app/helpers/avo/application_helper.rb +1 -1
  27. data/app/javascript/avo.base.js +8 -0
  28. data/app/views/avo/actions/show.html.erb +3 -3
  29. data/app/views/avo/associations/new.html.erb +45 -20
  30. data/app/views/avo/base/close_modal_and_reload_field.turbo_stream.erb +1 -1
  31. data/app/views/layouts/avo/application.html.erb +1 -2
  32. data/config/initializers/pagy.rb +1 -1
  33. data/lib/avo/base_action.rb +1 -0
  34. data/lib/avo/engine.rb +8 -4
  35. data/lib/avo/fields/base_field.rb +2 -2
  36. data/lib/avo/fields/belongs_to_field.rb +14 -8
  37. data/lib/avo/fields/concerns/is_required.rb +1 -1
  38. data/lib/avo/fields/has_base_field.rb +3 -1
  39. data/lib/avo/fields/has_one_field.rb +1 -1
  40. data/lib/avo/fields_execution_context.rb +13 -0
  41. data/lib/avo/resources/base.rb +32 -22
  42. data/lib/avo/version.rb +1 -1
  43. data/lib/avo.rb +10 -8
  44. data/lib/generators/avo/templates/initializer/avo.tt +3 -3
  45. data/lib/generators/avo/templates/locales/avo.ar.yml +1 -0
  46. data/lib/generators/avo/templates/locales/avo.de.yml +1 -0
  47. data/lib/generators/avo/templates/locales/avo.en.yml +1 -0
  48. data/lib/generators/avo/templates/locales/avo.es.yml +1 -0
  49. data/lib/generators/avo/templates/locales/avo.fr.yml +1 -0
  50. data/lib/generators/avo/templates/locales/avo.it.yml +1 -0
  51. data/lib/generators/avo/templates/locales/avo.ja.yml +1 -0
  52. data/lib/generators/avo/templates/locales/avo.nb.yml +1 -0
  53. data/lib/generators/avo/templates/locales/avo.nl.yml +1 -0
  54. data/lib/generators/avo/templates/locales/avo.nn.yml +1 -0
  55. data/lib/generators/avo/templates/locales/avo.pl.yml +1 -0
  56. data/lib/generators/avo/templates/locales/avo.pt-BR.yml +1 -0
  57. data/lib/generators/avo/templates/locales/avo.pt.yml +1 -0
  58. data/lib/generators/avo/templates/locales/avo.ro.yml +1 -0
  59. data/lib/generators/avo/templates/locales/avo.ru.yml +1 -0
  60. data/lib/generators/avo/templates/locales/avo.tr.yml +1 -0
  61. data/lib/generators/avo/templates/locales/avo.uk.yml +1 -0
  62. data/lib/generators/avo/templates/locales/avo.zh.yml +1 -0
  63. data/lib/tasks/avo_tasks.rake +1 -1
  64. data/public/avo-assets/avo.base.css +49 -2
  65. data/public/avo-assets/avo.base.js +129 -129
  66. data/public/avo-assets/avo.base.js.map +3 -3
  67. data/tailwind.preset.js +2 -3
  68. metadata +4 -3
  69. /data/{lib → app}/avo/base_resource.rb +0 -0
@@ -0,0 +1,13 @@
1
+ module Avo
2
+ class FieldsExecutionContext < Avo::ExecutionContext
3
+ include Avo::Concerns::HasItems
4
+
5
+ def detect_fields
6
+ self.items_holder = Avo::Resources::Items::Holder.new(parent: self)
7
+
8
+ instance_exec(&target) if target.present? && target.respond_to?(:call)
9
+
10
+ self
11
+ end
12
+ end
13
+ end
@@ -119,7 +119,7 @@ module Avo
119
119
  end
120
120
 
121
121
  def valid_association_name(record, association_name)
122
- association_name if record._reflections.with_indifferent_access[association_name].present?
122
+ association_name if record.class.reflect_on_association(association_name).present?
123
123
  end
124
124
 
125
125
  def valid_attachment_name(record, association_name)
@@ -285,14 +285,16 @@ module Avo
285
285
  self
286
286
  end
287
287
 
288
- VIEW_METHODS_MAPPING = {
289
- index: [:index_fields, :display_fields],
290
- show: [:show_fields, :display_fields],
291
- edit: [:edit_fields, :form_fields],
292
- update: [:edit_fields, :form_fields],
293
- new: [:new_fields, :form_fields],
294
- create: [:new_fields, :form_fields]
295
- } unless defined? VIEW_METHODS_MAPPING
288
+ unless defined? VIEW_METHODS_MAPPING
289
+ VIEW_METHODS_MAPPING = {
290
+ index: [:index_fields, :display_fields],
291
+ show: [:show_fields, :display_fields],
292
+ edit: [:edit_fields, :form_fields],
293
+ update: [:edit_fields, :form_fields],
294
+ new: [:new_fields, :form_fields],
295
+ create: [:new_fields, :form_fields]
296
+ }
297
+ end
296
298
 
297
299
  def fetch_fields
298
300
  possible_methods_for_view = VIEW_METHODS_MAPPING[view.to_sym]
@@ -329,17 +331,17 @@ module Avo
329
331
  end
330
332
 
331
333
  # def action / def filter / def scope
332
- define_method entity do |entity_class, arguments: {}, icon: nil|
333
- entity_loader(entity).use({class: entity_class, arguments: arguments, icon: icon}.compact)
334
+ define_method entity do |entity_class, arguments: {}, icon: nil, default: nil|
335
+ entity_loader(entity).use({class: entity_class, arguments: arguments, icon: icon, default: default}.compact)
334
336
  end
335
337
 
336
338
  # def get_actions / def get_filters / def get_scopes
337
- define_method "get_#{plural_entity}" do
339
+ define_method :"get_#{plural_entity}" do
338
340
  return entity_loader(entity).bag if entity_loader(entity).present?
339
341
 
340
342
  # ex: @actions_loader = Avo::Loaders::ActionsLoader.new
341
343
  instance_variable_set(
342
- "@#{plural_entity}_loader",
344
+ :"@#{plural_entity}_loader",
343
345
  "Avo::Loaders::#{plural_entity.humanize}Loader".constantize.new
344
346
  )
345
347
 
@@ -349,8 +351,8 @@ module Avo
349
351
  end
350
352
 
351
353
  # def get_action_arguments / def get_filter_arguments / def get_scope_arguments
352
- define_method "get_#{entity}_arguments" do |entity_class|
353
- klass = send("get_#{plural_entity}").find { |entity| entity[:class].to_s == entity_class.to_s }
354
+ define_method :"get_#{entity}_arguments" do |entity_class|
355
+ klass = send(:"get_#{plural_entity}").find { |entity| entity[:class].to_s == entity_class.to_s }
354
356
 
355
357
  raise "Couldn't find '#{entity_class}' in the 'def #{plural_entity}' method on your '#{self.class}' resource." if klass.nil?
356
358
 
@@ -359,7 +361,7 @@ module Avo
359
361
  end
360
362
 
361
363
  def hydrate(...)
362
- super(...)
364
+ super
363
365
 
364
366
  if @record.present?
365
367
  hydrate_model_with_default_values if @view&.new?
@@ -394,8 +396,8 @@ module Avo
394
396
  def record_title
395
397
  return name if @record.nil?
396
398
 
397
- # Get the title from the record if title is not set, try to get the name, title or label, or fallback to the id
398
- return @record.try(:name) || @record.try(:title) || @record.try(:label) || @record.id if title.nil?
399
+ # Get the title from the record if title is not set, try to get the name, title or label, or fallback to the to_param
400
+ return @record.try(:name) || @record.try(:title) || @record.try(:label) || @record.to_param if title.nil?
399
401
 
400
402
  # If the title is a symbol, get the value from the record else execute the block/string
401
403
  case title
@@ -443,10 +445,14 @@ module Avo
443
445
  .to_h
444
446
  end
445
447
 
446
- def fill_record(record, params, extra_params: [])
448
+ def fill_record(record, params, extra_params: [], fields: nil)
447
449
  # Write the field values
448
450
  params.each do |key, value|
449
- field = fields_by_database_id[key]
451
+ field = if fields.present?
452
+ fields.find { |f| f.id == key.to_sym }
453
+ else
454
+ fields_by_database_id[key]
455
+ end
450
456
 
451
457
  next unless field.present?
452
458
 
@@ -509,7 +515,7 @@ module Avo
509
515
 
510
516
  if field.type == "belongs_to"
511
517
 
512
- reflection = @record._reflections.with_indifferent_access[@params[:via_relation]]
518
+ reflection = @record.class.reflect_on_association(@params[:via_relation]) if @params[:via_relation].present?
513
519
 
514
520
  if field.polymorphic_as.present? && field.types.map(&:to_s).include?(@params[:via_relation_class])
515
521
  # set the value to the actual record
@@ -601,7 +607,11 @@ module Avo
601
607
  end
602
608
 
603
609
  def entity_loader(entity)
604
- instance_variable_get("@#{entity.to_s.pluralize}_loader")
610
+ instance_variable_get(:"@#{entity.to_s.pluralize}_loader")
611
+ end
612
+
613
+ def record_param
614
+ @record_param ||= @record.persisted? ? @record.to_param : nil
605
615
  end
606
616
  end
607
617
  end
data/lib/avo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Avo
2
- VERSION = "3.10.10" unless const_defined?(:VERSION)
2
+ VERSION = "3.11.0" unless const_defined?(:VERSION)
3
3
  end
data/lib/avo.rb CHANGED
@@ -36,19 +36,20 @@ module Avo
36
36
  class DeprecatedAPIError < StandardError; end
37
37
 
38
38
  class MissingResourceError < StandardError
39
- def initialize(resource_name)
40
- super(missing_resource_message(resource_name))
39
+ def initialize(model_class, field_name = nil)
40
+ super(missing_resource_message(model_class, field_name))
41
41
  end
42
42
 
43
43
  private
44
44
 
45
- def missing_resource_message(resource_name)
46
- name = resource_name.to_s.underscore
45
+ def missing_resource_message(model_class, field_name)
46
+ model_name = model_class.to_s.underscore
47
+ field_name ||= model_name
47
48
 
48
- "Failed to find a resource while rendering the :#{name} field.\n" \
49
- "You may generate a resource for it by running 'rails generate avo:resource #{name.singularize}'.\n" \
49
+ "Failed to find a resource while rendering the :#{field_name} field.\n" \
50
+ "You may generate a resource for it by running 'rails generate avo:resource #{model_name.singularize}'.\n" \
50
51
  "\n" \
51
- "Alternatively add the 'use_resource' option to the :#{name} field to specify a custom resource to be used.\n" \
52
+ "Alternatively add the 'use_resource' option to the :#{field_name} field to specify a custom resource to be used.\n" \
52
53
  "More info on https://docs.avohq.io/#{Avo::VERSION[0]}.0/resources.html."
53
54
  end
54
55
  end
@@ -75,7 +76,7 @@ module Avo
75
76
  Avo::Current.error_manager = Avo::ErrorManager.build
76
77
  # Check rails version issues only on NON Production environments
77
78
  unless Rails.env.production?
78
- check_rails_version_issues
79
+ check_rails_version_issues
79
80
  display_menu_editor_warning
80
81
  end
81
82
  Avo::Current.resource_manager = Avo::Resources::ResourceManager.build
@@ -138,6 +139,7 @@ module Avo
138
139
  mount Avo::DynamicFilters::Engine, at: "/avo-dynamic_filters" if defined?(Avo::DynamicFilters::Engine)
139
140
  mount Avo::Dashboards::Engine, at: "/dashboards" if defined?(Avo::Dashboards::Engine)
140
141
  mount Avo::Pro::Engine, at: "/avo-pro" if defined?(Avo::Pro::Engine)
142
+ mount Avo::Kanban::Engine, at: "/boards" if defined?(Avo::Kanban::Engine)
141
143
  }
142
144
  end
143
145
 
@@ -22,13 +22,13 @@ Avo.configure do |config|
22
22
  end
23
23
 
24
24
  ## == Authentication ==
25
- # config.current_user_method = {}
26
- # config.is_admin_method = :is_admin
27
- # config.is_developer_method = :is_developer
25
+ # config.current_user_method = :current_user
28
26
  # config.authenticate_with do
29
27
  # end
30
28
 
31
29
  ## == Authorization ==
30
+ # config.is_admin_method = :is_admin
31
+ # config.is_developer_method = :is_developer
32
32
  # config.authorization_methods = {
33
33
  # index: 'index?',
34
34
  # show: 'show?',
@@ -21,6 +21,7 @@ ar:
21
21
  attachment_class_attached: "%{attachment_class} تم ربط"
22
22
  attachment_class_detached: "%{attachment_class} تم فصل"
23
23
  attachment_destroyed: تم حذف المرفق
24
+ attachment_failed: فشل في إرفاق %{attachment_class}
24
25
  cancel: إلغاء
25
26
  choose_a_country: اختر دولة
26
27
  choose_an_option: اختر خيارًا
@@ -16,6 +16,7 @@ de:
16
16
  attach_item: "%{item} anhängen"
17
17
  attachment_class_attached: "%{attachment_class} angehängt."
18
18
  attachment_class_detached: "%{attachment_class} abgehängt."
19
+ attachment_failed: "Kon %{attachment_class} niet bijvoegen"
19
20
  attachment_destroyed: Anhang gelöscht
20
21
  cancel: Abbrechen
21
22
  choose_a_country: Land auswählen
@@ -15,6 +15,7 @@ en:
15
15
  attachment_class_attached: "%{attachment_class} attached."
16
16
  attachment_class_detached: "%{attachment_class} detached."
17
17
  attachment_destroyed: Attachment destroyed
18
+ attachment_failed: Failed to attach %{attachment_class}
18
19
  cancel: Cancel
19
20
  choose_a_country: Choose a country
20
21
  choose_an_option: Choose an option
@@ -17,6 +17,7 @@ es:
17
17
  attachment_class_attached: "%{attachment_class} adjuntado/a."
18
18
  attachment_class_detached: "%{attachment_class} adjuntado/a."
19
19
  attachment_destroyed: Adjunto eliminado
20
+ attachment_failed: No se pudo adjuntar %{attachment_class}
20
21
  cancel: Cancelar
21
22
  choose_a_country: Elige un país
22
23
  choose_an_option: Elige una opción
@@ -17,6 +17,7 @@ fr:
17
17
  attachment_class_attached: "%{attachment_class} attaché."
18
18
  attachment_class_detached: "%{attachment_class} détaché."
19
19
  attachment_destroyed: Pièce jointe détruite
20
+ attachment_failed: Échec de l'ajout de %{attachment_class}
20
21
  cancel: Annuler
21
22
  choose_a_country: Sélectionnez un pays
22
23
  choose_an_option: Sélectionnez une option
@@ -16,6 +16,7 @@ it:
16
16
  attach_item: Allega %{item}
17
17
  attachment_class_attached: "%{attachment_class} allegato."
18
18
  attachment_class_detached: "%{attachment_class} staccato."
19
+ attachment_failed: "Impossibile allegare %{attachment_class}"
19
20
  attachment_destroyed: Allegato distrutto
20
21
  cancel: Annulla
21
22
  choose_a_country: Scegli un paese
@@ -17,6 +17,7 @@ ja:
17
17
  attachment_class_attached: "%{attachment_class}をアタッチしました。"
18
18
  attachment_class_detached: "%{attachment_class}をデタッチしました。"
19
19
  attachment_destroyed: アタッチは削除されました
20
+ attachment_failed: "%{attachment_class}の添付に失敗しました"
20
21
  cancel: キャンセル
21
22
  choose_a_country: 国を選択
22
23
  choose_an_option: オプションを選択
@@ -17,6 +17,7 @@ nb:
17
17
  attachment_class_attached: "%{attachment_class} lagt til."
18
18
  attachment_class_detached: "%{attachment_class} fjernet."
19
19
  attachment_destroyed: Vedlett slettet
20
+ attachment_failed: Kunne ikke legge ved %{attachment_class}
20
21
  cancel: Avbryt
21
22
  choose_a_country: Velg et land
22
23
  choose_an_option: Velg et alternativ
@@ -16,6 +16,7 @@ nl:
16
16
  attach_item: "%{item} bijvoegen"
17
17
  attachment_class_attached: "%{attachment_class} bijgevoegd."
18
18
  attachment_class_detached: "%{attachment_class} losgekoppeld."
19
+ attachment_failed: "Kon %{attachment_class} niet bijvoegen"
19
20
  attachment_destroyed: Bijlage verwijderd
20
21
  cancel: Annuleren
21
22
  choose_a_country: Kies een land
@@ -17,6 +17,7 @@ nn:
17
17
  attachment_class_attached: "%{attachment_class} lagt til."
18
18
  attachment_class_detached: "%{attachment_class} fjerna."
19
19
  attachment_destroyed: Vedlegg sletta
20
+ attachment_failed: Klarte ikkje å legge ved %{attachment_class}
20
21
  cancel: Avbryt
21
22
  choose_a_country: Vel eit land
22
23
  choose_an_option: Vel eit alternativ
@@ -16,6 +16,7 @@ pl:
16
16
  attach_item: Załącz %{item}
17
17
  attachment_class_attached: "%{attachment_class} załączony."
18
18
  attachment_class_detached: "%{attachment_class} odłączony."
19
+ attachment_failed: "Nie udało się dołączyć %{attachment_class}"
19
20
  attachment_destroyed: Załącznik usunięty
20
21
  cancel: Anuluj
21
22
  choose_a_country: Wybierz kraj
@@ -17,6 +17,7 @@ pt-BR:
17
17
  attachment_class_attached: "%{attachment_class} anexado."
18
18
  attachment_class_detached: "%{attachment_class} separado."
19
19
  attachment_destroyed: Anexo destruído
20
+ attachment_failed: Não foi possível anexar %{attachment_class}
20
21
  cancel: Cancelar
21
22
  choose_a_country: Escolha um país
22
23
  choose_an_option: Escolha uma opção
@@ -17,6 +17,7 @@ pt:
17
17
  attachment_class_attached: "%{attachment_class} anexado."
18
18
  attachment_class_detached: "%{attachment_class} separado."
19
19
  attachment_destroyed: Anexo destruído
20
+ attachment_failed: Não foi possível anexar %{attachment_class}
20
21
  cancel: Cancelar
21
22
  choose_a_country: Escolha um país
22
23
  choose_an_option: Escolha uma opção
@@ -18,6 +18,7 @@ ro:
18
18
  attachment_class_attached: "%{attachment_class} anexat."
19
19
  attachment_class_detached: "%{attachment_class} separat."
20
20
  attachment_destroyed: Atașamentul a fost distrus
21
+ attachment_failed: Nu s-a reușit atașarea %{attachment_class}
21
22
  cancel: Anulează
22
23
  choose_a_country: Alege o țară
23
24
  choose_an_option: Alege o opțiune
@@ -16,6 +16,7 @@ ru:
16
16
  attach_item: Прикрепить %{item}
17
17
  attachment_class_attached: "%{attachment_class} прикреплено."
18
18
  attachment_class_detached: "%{attachment_class} отсоединено."
19
+ attachment_failed: "Не удалось прикрепить %{attachment_class}"
19
20
  attachment_destroyed: Вложение удалено
20
21
  cancel: Отмена
21
22
  choose_a_country: Выберите страну
@@ -17,6 +17,7 @@ tr:
17
17
  attachment_class_attached: "%{attachment_class} ilişkilendirildi."
18
18
  attachment_class_detached: "%{attachment_class} ilişkisi kesildi."
19
19
  attachment_destroyed: Ek silindi
20
+ attachment_failed: "%{attachment_class} eklenemedi"
20
21
  cancel: İptal et
21
22
  choose_a_country: Bir ülke seç
22
23
  choose_an_option: Bir seçenek seç
@@ -16,6 +16,7 @@ uk:
16
16
  attach_item: Прикріпити %{item}
17
17
  attachment_class_attached: "%{attachment_class} прикріплено."
18
18
  attachment_class_detached: "%{attachment_class} відкріплено."
19
+ attachment_failed: "Не вдалося прикріпити %{attachment_class}"
19
20
  attachment_destroyed: Вкладення знищено
20
21
  cancel: Скасувати
21
22
  choose_a_country: Виберіть країну
@@ -16,6 +16,7 @@ zh:
16
16
  attach_item: 附加 %{item}
17
17
  attachment_class_attached: "%{attachment_class} 已附加。"
18
18
  attachment_class_detached: "%{attachment_class} 已分离。"
19
+ attachment_failed: "无法附加 %{attachment_class}"
19
20
  attachment_destroyed: 附件已删除
20
21
  cancel: 取消
21
22
  choose_a_country: 选择一个国家
@@ -79,7 +79,7 @@ task "avo:sym_link" do
79
79
  `touch #{packages_path}/.keep`
80
80
  end
81
81
 
82
- ["avo-advanced", "avo-pro", "avo-dynamic_filters", "avo-dashboards", "avo-menu"].each do |gem|
82
+ ["avo-advanced", "avo-pro", "avo-dynamic_filters", "avo-dashboards", "avo-menu", "avo-kanban"].each do |gem|
83
83
  path = `bundle show #{gem} 2> /dev/null`.chomp
84
84
 
85
85
  # If path is emty we check if package is defined outside of root (on release process it is)
@@ -3671,7 +3671,7 @@ body[data-theme=dark], body.dark {
3671
3671
  text-indent:1em
3672
3672
  }
3673
3673
 
3674
- /*! tailwindcss v3.4.6 | MIT License | https://tailwindcss.com
3674
+ /*! tailwindcss v3.4.7 | MIT License | https://tailwindcss.com
3675
3675
  */
3676
3676
 
3677
3677
  /*
@@ -7342,10 +7342,18 @@ tag.tagify__tag{
7342
7342
  bottom:0px
7343
7343
  }
7344
7344
 
7345
+ .bottom-1{
7346
+ bottom:0.25rem
7347
+ }
7348
+
7345
7349
  .bottom-full{
7346
7350
  bottom:100%
7347
7351
  }
7348
7352
 
7353
+ .end-1{
7354
+ inset-inline-end:0.25rem
7355
+ }
7356
+
7349
7357
  .end-2{
7350
7358
  inset-inline-end:0.5rem
7351
7359
  }
@@ -7366,6 +7374,10 @@ tag.tagify__tag{
7366
7374
  left:50%
7367
7375
  }
7368
7376
 
7377
+ .left-5{
7378
+ left:1.25rem
7379
+ }
7380
+
7369
7381
  .left-auto{
7370
7382
  left:auto
7371
7383
  }
@@ -7378,6 +7390,14 @@ tag.tagify__tag{
7378
7390
  right:0.75rem
7379
7391
  }
7380
7392
 
7393
+ .start-1{
7394
+ inset-inline-start:0.25rem
7395
+ }
7396
+
7397
+ .start-2{
7398
+ inset-inline-start:0.5rem
7399
+ }
7400
+
7381
7401
  .top-0{
7382
7402
  top:0px
7383
7403
  }
@@ -7398,6 +7418,10 @@ tag.tagify__tag{
7398
7418
  top:0.75rem
7399
7419
  }
7400
7420
 
7421
+ .top-5{
7422
+ top:1.25rem
7423
+ }
7424
+
7401
7425
  .top-\[-1px\]{
7402
7426
  top:-1px
7403
7427
  }
@@ -7870,6 +7894,16 @@ tag.tagify__tag{
7870
7894
  aspect-ratio:16 / 9
7871
7895
  }
7872
7896
 
7897
+ .size-1{
7898
+ width:0.25rem;
7899
+ height:0.25rem
7900
+ }
7901
+
7902
+ .size-2{
7903
+ width:0.5rem;
7904
+ height:0.5rem
7905
+ }
7906
+
7873
7907
  .size-24{
7874
7908
  width:6rem;
7875
7909
  height:6rem
@@ -7910,6 +7944,10 @@ tag.tagify__tag{
7910
7944
  height:4rem
7911
7945
  }
7912
7946
 
7947
+ .h-2{
7948
+ height:0.5rem
7949
+ }
7950
+
7913
7951
  .h-20{
7914
7952
  height:5rem
7915
7953
  }
@@ -8640,6 +8678,10 @@ tag.tagify__tag{
8640
8678
  border-radius:0.25rem
8641
8679
  }
8642
8680
 
8681
+ .rounded-2xl{
8682
+ border-radius:1rem
8683
+ }
8684
+
8643
8685
  .rounded-full{
8644
8686
  border-radius:9999px
8645
8687
  }
@@ -8657,7 +8699,7 @@ tag.tagify__tag{
8657
8699
  }
8658
8700
 
8659
8701
  .rounded-xl{
8660
- border-radius:1rem
8702
+ border-radius:0.75rem
8661
8703
  }
8662
8704
 
8663
8705
  .rounded-l{
@@ -9830,6 +9872,11 @@ tag.tagify__tag{
9830
9872
  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)
9831
9873
  }
9832
9874
 
9875
+ .drop-shadow{
9876
+ --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));
9877
+ 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)
9878
+ }
9879
+
9833
9880
  .grayscale{
9834
9881
  --tw-grayscale:grayscale(100%);
9835
9882
  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)