fluxbit_view_components 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +10 -0
  3. data/app/assets/javascripts/fluxbit_view_components/assigner_controller.js +49 -0
  4. data/app/assets/javascripts/fluxbit_view_components/auto_submit_controller.js +39 -0
  5. data/app/assets/javascripts/fluxbit_view_components/drawer_controller.js +135 -0
  6. data/app/assets/javascripts/fluxbit_view_components/index.js +56 -0
  7. data/app/assets/javascripts/fluxbit_view_components/method_link_controller.js +143 -0
  8. data/app/assets/javascripts/fluxbit_view_components/modal_controller.js +118 -0
  9. data/app/assets/javascripts/fluxbit_view_components/password_controller.js +170 -0
  10. data/app/assets/javascripts/fluxbit_view_components/progress_controller.js +374 -0
  11. data/app/assets/javascripts/fluxbit_view_components/row_click_controller.js +32 -0
  12. data/app/assets/javascripts/fluxbit_view_components/select_all_controller.js +122 -0
  13. data/app/assets/javascripts/fluxbit_view_components/spinner_percent_controller.js +174 -0
  14. data/app/assets/javascripts/fluxbit_view_components/theme_button_controller.js +90 -0
  15. data/app/assets/javascripts/fluxbit_view_components.js +1175 -0
  16. data/app/components/fluxbit/accordion_component.rb +125 -0
  17. data/app/components/fluxbit/alert_component.rb +8 -8
  18. data/app/components/fluxbit/avatar_component.rb +11 -12
  19. data/app/components/fluxbit/avatar_group_component.rb +1 -1
  20. data/app/components/fluxbit/badge_component.rb +8 -7
  21. data/app/components/fluxbit/banner_component.rb +139 -0
  22. data/app/components/fluxbit/bottom_navigation_component.rb +437 -0
  23. data/app/components/fluxbit/breadcrumb_component.rb +66 -0
  24. data/app/components/fluxbit/button_component.rb +39 -11
  25. data/app/components/fluxbit/button_group_component.rb +1 -1
  26. data/app/components/fluxbit/card_component.rb +26 -23
  27. data/app/components/fluxbit/carousel_component.rb +154 -0
  28. data/app/components/fluxbit/component.rb +24 -3
  29. data/app/components/fluxbit/drawer_component.html.erb +30 -0
  30. data/app/components/fluxbit/drawer_component.rb +125 -0
  31. data/app/components/fluxbit/dropdown_component.rb +41 -0
  32. data/app/components/fluxbit/dropdown_item_component.rb +68 -0
  33. data/app/components/fluxbit/flex_component.rb +1 -1
  34. data/app/components/fluxbit/form/check_box_component.rb +56 -0
  35. data/app/components/fluxbit/form/component.rb +27 -26
  36. data/app/components/fluxbit/form/dropzone_component.html.erb +39 -0
  37. data/app/components/fluxbit/form/dropzone_component.rb +39 -0
  38. data/app/components/fluxbit/form/field_component.rb +28 -0
  39. data/app/components/fluxbit/form/form_builder_component.rb +1 -1
  40. data/app/components/fluxbit/form/{helper_text_component.rb → help_text_component.rb} +9 -4
  41. data/app/components/fluxbit/form/label_component.rb +40 -30
  42. data/app/components/fluxbit/form/password_component.rb +247 -0
  43. data/app/components/fluxbit/form/radio_group_button_component.rb +126 -0
  44. data/app/components/fluxbit/form/range_component.rb +52 -0
  45. data/app/components/fluxbit/form/select_component.rb +185 -0
  46. data/app/components/fluxbit/form/text_field_component.rb +185 -0
  47. data/app/components/fluxbit/form/toggle_component.html.erb +23 -0
  48. data/app/components/fluxbit/form/toggle_component.rb +81 -0
  49. data/app/components/fluxbit/form/upload_image_component.html.erb +50 -0
  50. data/app/components/fluxbit/form/upload_image_component.rb +61 -0
  51. data/app/components/fluxbit/gravatar_component.rb +7 -0
  52. data/app/components/fluxbit/icon_helpers.rb +167 -0
  53. data/app/components/fluxbit/link_component.rb +42 -0
  54. data/app/components/fluxbit/modal_component.rb +28 -31
  55. data/app/components/fluxbit/pagination_component.rb +206 -0
  56. data/app/components/fluxbit/popover_component.rb +14 -14
  57. data/app/components/fluxbit/progress_component.rb +196 -0
  58. data/app/components/fluxbit/skeleton_component.rb +237 -0
  59. data/app/components/fluxbit/speed_dial_action_component.html.erb +30 -0
  60. data/app/components/fluxbit/speed_dial_action_component.rb +59 -0
  61. data/app/components/fluxbit/speed_dial_component.html.erb +33 -0
  62. data/app/components/fluxbit/speed_dial_component.rb +73 -0
  63. data/app/components/fluxbit/spinner_component.rb +71 -0
  64. data/app/components/fluxbit/spinner_percent_component.rb +174 -0
  65. data/app/components/fluxbit/stepper_component.rb +223 -0
  66. data/app/components/fluxbit/tab_component.rb +44 -25
  67. data/app/components/fluxbit/table_component.rb +186 -0
  68. data/app/components/fluxbit/table_group_component.rb +28 -0
  69. data/app/components/fluxbit/theme_button_component.rb +64 -0
  70. data/app/components/fluxbit/timeline_component.rb +63 -0
  71. data/app/components/fluxbit/timeline_item_component.html.erb +64 -0
  72. data/app/components/fluxbit/timeline_item_component.rb +78 -0
  73. data/app/components/fluxbit/tooltip_component.rb +2 -2
  74. data/app/helpers/fluxbit/components_helper.rb +93 -51
  75. data/app/helpers/fluxbit/form_builder.rb +136 -0
  76. data/app/helpers/fluxbit/view_helper.rb +71 -0
  77. data/config/locales/en.yml +37 -4
  78. data/config/locales/pt-BR.yml +36 -0
  79. data/lib/fluxbit/config/accordion_component.rb +73 -0
  80. data/lib/fluxbit/config/avatar_component.rb +11 -11
  81. data/lib/fluxbit/config/badge_component.rb +14 -11
  82. data/lib/fluxbit/config/banner_component.rb +60 -0
  83. data/lib/fluxbit/config/bottom_navigation_component.rb +74 -0
  84. data/lib/fluxbit/config/breadcrumb_component.rb +24 -0
  85. data/lib/fluxbit/config/button_component.rb +6 -4
  86. data/lib/fluxbit/config/card_component.rb +23 -12
  87. data/lib/fluxbit/config/carousel_component.rb +33 -0
  88. data/lib/fluxbit/config/drawer_component.rb +48 -0
  89. data/lib/fluxbit/config/dropdown_component.rb +29 -0
  90. data/lib/fluxbit/config/form/check_box_component.rb +19 -0
  91. data/lib/fluxbit/config/form/dropzone_component.rb +20 -0
  92. data/lib/fluxbit/config/form/{helper_text_component.rb → help_text_component.rb} +2 -2
  93. data/lib/fluxbit/config/form/label_component.rb +31 -0
  94. data/lib/fluxbit/config/form/password_component.rb +19 -0
  95. data/lib/fluxbit/config/form/radio_group_button_component.rb +24 -0
  96. data/lib/fluxbit/config/form/range_component.rb +15 -0
  97. data/lib/fluxbit/config/form/text_field_component.rb +76 -0
  98. data/lib/fluxbit/config/form/toggle_component.rb +79 -0
  99. data/lib/fluxbit/config/link_component.rb +24 -0
  100. data/lib/fluxbit/config/modal_component.rb +1 -1
  101. data/lib/fluxbit/config/pagination_component.rb +31 -0
  102. data/lib/fluxbit/config/popover_component.rb +1 -1
  103. data/lib/fluxbit/config/progress_component.rb +63 -0
  104. data/lib/fluxbit/config/skeleton_component.rb +82 -0
  105. data/lib/fluxbit/config/speed_dial_component.rb +50 -0
  106. data/lib/fluxbit/config/spinner_component.rb +30 -0
  107. data/lib/fluxbit/config/spinner_percent_component.rb +61 -0
  108. data/lib/fluxbit/config/stepper_component.rb +299 -0
  109. data/lib/fluxbit/config/tab_component.rb +6 -0
  110. data/lib/fluxbit/config/table_component.rb +75 -0
  111. data/lib/fluxbit/config/theme_button_component.rb +19 -0
  112. data/lib/fluxbit/config/timeline_component.rb +77 -0
  113. data/lib/fluxbit/view_components/engine.rb +11 -3
  114. data/lib/fluxbit/view_components/version.rb +1 -1
  115. data/lib/fluxbit/view_components.rb +27 -1
  116. data/lib/generators/fluxbit/devise_views_generator.rb +116 -0
  117. data/lib/generators/fluxbit/pagy_generator.rb +39 -0
  118. data/lib/generators/fluxbit/scaffold_generator.rb +165 -0
  119. data/lib/generators/fluxbit/templates/_alert.html.erb.tt +1 -0
  120. data/lib/generators/fluxbit/templates/_flash.html.erb.tt +15 -0
  121. data/lib/generators/fluxbit/templates/_form.html.erb.tt +38 -0
  122. data/lib/generators/fluxbit/templates/_metadata.html.erb.tt +44 -0
  123. data/lib/generators/fluxbit/templates/controller.rb.tt +406 -0
  124. data/lib/generators/fluxbit/templates/create.turbo_stream.erb.tt +7 -0
  125. data/lib/generators/fluxbit/templates/destroy.turbo_stream.erb.tt +3 -0
  126. data/lib/generators/fluxbit/templates/destroy_all.turbo_stream.erb.tt +9 -0
  127. data/lib/generators/fluxbit/templates/devise_views/confirmations/new.html.erb +11 -0
  128. data/lib/generators/fluxbit/templates/devise_views/layouts/devise.html.erb +64 -0
  129. data/lib/generators/fluxbit/templates/devise_views/mailer/confirmation_instructions.html.erb +5 -0
  130. data/lib/generators/fluxbit/templates/devise_views/mailer/email_changed.html.erb +7 -0
  131. data/lib/generators/fluxbit/templates/devise_views/mailer/password_changed.html.erb +3 -0
  132. data/lib/generators/fluxbit/templates/devise_views/mailer/reset_password_instructions.html.erb +8 -0
  133. data/lib/generators/fluxbit/templates/devise_views/mailer/unlock_instructions.html.erb +7 -0
  134. data/lib/generators/fluxbit/templates/devise_views/passwords/edit.html.erb +29 -0
  135. data/lib/generators/fluxbit/templates/devise_views/passwords/new.html.erb +11 -0
  136. data/lib/generators/fluxbit/templates/devise_views/registrations/edit.html.erb +43 -0
  137. data/lib/generators/fluxbit/templates/devise_views/registrations/new.html.erb +34 -0
  138. data/lib/generators/fluxbit/templates/devise_views/sessions/new.html.erb +15 -0
  139. data/lib/generators/fluxbit/templates/devise_views/shared/_error_messages.html.erb +14 -0
  140. data/lib/generators/fluxbit/templates/devise_views/shared/_links.html.erb +25 -0
  141. data/lib/generators/fluxbit/templates/devise_views/unlocks/new.html.erb +11 -0
  142. data/lib/generators/fluxbit/templates/edit.html.erb.tt +47 -0
  143. data/lib/generators/fluxbit/templates/fluxbit_pagy.css +27 -0
  144. data/lib/generators/fluxbit/templates/i18n.en.yml.tt +121 -0
  145. data/lib/generators/fluxbit/templates/i18n.pt-BR.yml.tt +121 -0
  146. data/lib/generators/fluxbit/templates/index.html.erb.tt +254 -0
  147. data/lib/generators/fluxbit/templates/index.json.jbuilder.tt +33 -0
  148. data/lib/generators/fluxbit/templates/new.html.erb.tt +47 -0
  149. data/lib/generators/fluxbit/templates/partial.html.erb.tt +61 -0
  150. data/lib/generators/fluxbit/templates/policy.rb.tt +36 -0
  151. data/lib/generators/fluxbit/templates/send_alert_via_drawer.erb.tt +10 -0
  152. data/lib/generators/fluxbit/templates/show.html.erb.tt +44 -0
  153. data/lib/generators/fluxbit/templates/show.json.jbuilder.tt +6 -0
  154. data/lib/generators/fluxbit/templates/update.turbo_stream.erb.tt +10 -0
  155. data/lib/generators/fluxbit/templates/update_all.turbo_stream.erb.tt +20 -0
  156. data/lib/install/install.rb +61 -3
  157. metadata +127 -35
  158. data/LICENSE.txt +0 -20
  159. data/app/components/fluxbit/form/checkbox_input_component.rb +0 -61
  160. data/app/components/fluxbit/form/datepicker_component.rb +0 -7
  161. data/app/components/fluxbit/form/radio_input_component.rb +0 -21
  162. data/app/components/fluxbit/form/range_input_component.rb +0 -51
  163. data/app/components/fluxbit/form/select_free_input_component.rb +0 -77
  164. data/app/components/fluxbit/form/select_input_component.rb +0 -21
  165. data/app/components/fluxbit/form/spacer_input_component.rb +0 -12
  166. data/app/components/fluxbit/form/text_input_component.rb +0 -225
  167. data/app/components/fluxbit/form/textarea_input_component.rb +0 -57
  168. data/app/components/fluxbit/form/toggle_input_component.rb +0 -166
  169. data/app/components/fluxbit/form/upload_image_input_component.html.erb +0 -48
  170. data/app/components/fluxbit/form/upload_image_input_component.rb +0 -61
  171. data/app/components/fluxbit/form/upload_input_component.html.erb +0 -12
  172. data/app/components/fluxbit/form/upload_input_component.rb +0 -47
  173. data/app/helpers/fluxbit/classes_helper.rb +0 -9
@@ -0,0 +1,136 @@
1
+ module Fluxbit
2
+ class FormBuilder < ActionView::Helpers::FormBuilder
3
+ include ActionView::Helpers::OutputSafetyHelper
4
+
5
+ attr_reader :template
6
+
7
+ delegate :render, :pluralize, to: :template
8
+
9
+ def errors_summary(within: :container)
10
+ return if object.blank?
11
+ return unless object.errors.any?
12
+
13
+ title = I18n.t(
14
+ "polaris.form_builder.errors_summary",
15
+ count: object.errors.count,
16
+ model: object.class.model_name.human.downcase
17
+ )
18
+
19
+ render Fluxbit::BannerComponent.new(
20
+ title: title,
21
+ status: :critical,
22
+ within: within,
23
+ data: { errors_summary: true }
24
+ ) do |banner|
25
+ parts = []
26
+
27
+ parts << render(Fluxbit::ListComponent.new) do |list|
28
+ object.errors.full_messages.each do |error|
29
+ list.with_item { template.sanitize(error.to_s, tags: [], attributes: []) }
30
+ end
31
+ end
32
+
33
+ parts << template.capture { yield(banner) } if block_given?
34
+
35
+ template.safe_join(parts)
36
+ end
37
+ end
38
+
39
+ def error_for(method)
40
+ return if object.blank?
41
+ return unless object.errors.key?(method)
42
+
43
+ raw object.errors.full_messages_for(method)&.first
44
+ end
45
+
46
+ def fluxbit_inline_error_for(method, **options, &block)
47
+ error_message = error_for(method)
48
+ return unless error_message
49
+
50
+ render(Fluxbit::InlineErrorComponent.new(**options, &block)) do
51
+ error_message
52
+ end
53
+ end
54
+
55
+ Fluxbit::Form::TextFieldComponent::TYPE_OPTIONS.each do |type|
56
+ define_method(type.in?([ :text_area, :textarea ]) ? "fx_#{type}" : "fx_#{type}_field") do |method, **options, &block|
57
+ options[:error] ||= error_for(method)
58
+ options[:error] = !!options[:error] if options[:error_hidden] && options[:error]
59
+ render Fluxbit::Form::TextFieldComponent.new(form: self, type: type, attribute: method, **options), &block
60
+ end
61
+ end
62
+
63
+ Fluxbit::Form::CheckBoxComponent::TYPE_OPTIONS.each do |type|
64
+ define_method("fx_#{type}") do |method, **options, &block|
65
+ options[:error] ||= error_for(method)
66
+ options[:error] = !!options[:error] if options[:error_hidden] && options[:error]
67
+ render Fluxbit::Form::CheckBoxComponent.new(form: self, type: type, attribute: method, **options), &block
68
+ end
69
+ end
70
+
71
+ [ :range, :toggle, :upload_image, :dropzone, :password ].each do |component|
72
+ define_method("fx_#{component}") do |method, **options, &block|
73
+ options[:error] ||= error_for(method)
74
+ options[:error] = !!options[:error] if options[:error_hidden] && options[:error]
75
+ klass = "Fluxbit::Form::#{component.to_s.camelize}Component".constantize
76
+ render klass.new(form: self, attribute: method, **options), &block
77
+ end
78
+ end
79
+
80
+ def fx_radio_group_button(method, **options, &block)
81
+ options[:name] ||= "#{@object_name}[#{method}]"
82
+ render Fluxbit::Form::RadioGroupButtonComponent.new(**options), &block
83
+ end
84
+
85
+ # Mimics Rails' form.select signature:
86
+ # select(method, choices = nil, options = {}, html_options = {}, &block)
87
+ #
88
+ # @param method [Symbol] The attribute name
89
+ # @param choices [Array, Hash, String, nil] Options for the select (raw data or pre-formatted HTML)
90
+ # @param options [Hash] Options like prompt, include_blank, selected, disabled
91
+ # @param html_options [Hash] HTML attributes for the select tag
92
+ # @param block [Proc] Optional block for custom options
93
+ #
94
+ # @example Basic usage
95
+ # form.fx_select :role, ["Admin", "User", "Guest"]
96
+ #
97
+ # @example With options
98
+ # form.fx_select :country, countries, { prompt: "Select a country" }, { class: "custom-class" }
99
+ #
100
+ # @example With pre-formatted options
101
+ # form.fx_select :status, options_for_select(statuses, selected: "active")
102
+ def fx_select(method, choices = nil, options = {}, html_options = {}, &block)
103
+ # Handle Rails-style signature
104
+ all_options = html_options.merge(options)
105
+
106
+ # Set the choices/options
107
+ all_options[:options] = choices if choices.present?
108
+
109
+ # Add error handling
110
+ all_options[:error] ||= error_for(method)
111
+ all_options[:error] = !!all_options[:error] if all_options[:error_hidden] && all_options[:error]
112
+
113
+ # Set selected value from object if not explicitly provided
114
+ value = object&.public_send(method)
115
+ all_options[:selected] ||= value if value.present?
116
+
117
+ render Fluxbit::Form::SelectComponent.new(form: self, attribute: method, **all_options, &block)
118
+ end
119
+
120
+ def fx_submit(content = nil, **options, &block)
121
+ options[:form] = self
122
+ options[:content] = content if content.present?
123
+ options[:color] ||= :primary
124
+ options[:size] ||= 2
125
+ options[:disabled] = true if object&.persisted? && !object.valid?
126
+
127
+ if block_given?
128
+ render Fluxbit::ButtonComponent.new(**options) do |*args|
129
+ yield(*args)
130
+ end
131
+ else
132
+ render Fluxbit::ButtonComponent.new(**options)
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fluxbit
4
+ module ViewHelper
5
+ def fx_body_class
6
+ "h-full bg-slate-100 dark:bg-slate-900 dark:text-white"
7
+ end
8
+
9
+ def fx_sort_field(field, url, label = nil)
10
+ order = (request.query_parameters[:order] || "").rpartition("_")
11
+
12
+ order_direction = "asc"
13
+ if order.first == field.to_s
14
+ order_direction = order.last == "asc" ? "desc" : "asc"
15
+ end
16
+
17
+ link_to public_send(url, request.query_parameters.merge(order: "#{field}_#{order_direction}")), class: "order-#{order_direction} flex" do
18
+ label_text = label || field.to_s.titlecase
19
+ icon = if order.first == field.to_s
20
+ order_direction == "asc" ? fx_sort_up : fx_sort_down
21
+ else
22
+ fx_sort_up_down
23
+ end
24
+
25
+ safe_join([ h(label_text), icon ], " ")
26
+ end
27
+ end
28
+
29
+ def fx_sort_up_down
30
+ content_tag :svg, class: "size-4", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor" do
31
+ concat(
32
+ content_tag(
33
+ :path,
34
+ "",
35
+ fill_rule: "evenodd",
36
+ d: "M11.47 4.72a.75.75 0 0 1 1.06 0l3.75 3.75a.75.75 0 0 1-1.06 1.06L12 6.31 8.78 9.53a.75.75 0 0 1-1.06-1.06l3.75-3.75Zm-3.75 9.75a.75.75 0 0 1 1.06 0L12 17.69l3.22-3.22a.75.75 0 1 1 1.06 1.06l-3.75 3.75a.75.75 0 0 1-1.06 0l-3.75-3.75a.75.75 0 0 1 0-1.06Z",
37
+ clip_rule: "evenodd"
38
+ )
39
+ )
40
+ end
41
+ end
42
+
43
+ def fx_sort_up
44
+ content_tag :svg, class: "size-4", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor" do
45
+ concat(
46
+ content_tag(
47
+ :path,
48
+ "",
49
+ fill_rule: "evenodd",
50
+ d: "M11.47 4.72a.75.75 0 0 1 1.06 0l3.75 3.75a.75.75 0 0 1-1.06 1.06L12 6.31 8.78 9.53a.75.75 0 0 1-1.06-1.06l3.75-3.75Z",
51
+ clip_rule: "evenodd"
52
+ )
53
+ )
54
+ end
55
+ end
56
+
57
+ def fx_sort_down
58
+ content_tag :svg, class: "size-4", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor" do
59
+ concat(
60
+ content_tag(
61
+ :path,
62
+ "",
63
+ fill_rule: "evenodd",
64
+ d: "M11.47 19.28a.75.75 0 0 1 1.06 0l3.75-3.75a.75.75 0 0 1-1.06-1.06L12 17.69l-3.22-3.22a.75.75 0 1 1-1.06 1.06l3.75 3.75Z",
65
+ clip_rule: "evenodd"
66
+ )
67
+ )
68
+ end
69
+ end
70
+ end
71
+ end
@@ -1,6 +1,39 @@
1
1
  en:
2
2
  fluxbit:
3
- form_builder:
4
- errors_summary:
5
- one: "There is 1 error with this %{model}:"
6
- other: "There are %{count} errors with this %{model}:"
3
+ alert:
4
+ aria_close: Close
5
+ dismiss: Dismiss
6
+ banner:
7
+ aria_close: Close
8
+ dismiss: Dismiss
9
+ drawer:
10
+ dismiss: Dismiss
11
+ modal:
12
+ aria_close: Close
13
+ dismiss: Dismiss
14
+ pagination:
15
+ aria_label:
16
+ nav:
17
+ one: Page
18
+ other: Pages
19
+ prev: Previous
20
+ next: Next
21
+ first: First
22
+ last: Last
23
+ first: First
24
+ last: Last
25
+ prev: Previous
26
+ next: Next
27
+ skeleton:
28
+ loading: Loading...
29
+ speed_dial:
30
+ open_actions_menu: Open actions menu
31
+ form:
32
+ password:
33
+ checks:
34
+ length: At least %{count} characters
35
+ uppercase: Contains uppercase letter
36
+ lowercase: Contains lowercase letter
37
+ numbers: Contains number
38
+ special: Contains special character
39
+ strength: Password strength
@@ -0,0 +1,36 @@
1
+ pt-BR:
2
+ fluxbit:
3
+ alert:
4
+ aria_close: Close
5
+ dismiss: Dismiss
6
+ drawer:
7
+ dismiss: Dismiss
8
+ modal:
9
+ aria_close: Close
10
+ dismiss: Dismiss
11
+ pagination:
12
+ aria_label:
13
+ nav:
14
+ one: Página
15
+ other: Páginas
16
+ prev: Anterior
17
+ next: Próximo
18
+ first: Primeiro
19
+ last: Último
20
+ first: Primeiro
21
+ last: Último
22
+ prev: Anterior
23
+ next: Próximo
24
+ skeleton:
25
+ loading: Carregando...
26
+ speed_dial:
27
+ open_actions_menu: Abrir menu de ações
28
+ form:
29
+ password:
30
+ checks:
31
+ length: Pelo menos %{count} caracteres
32
+ uppercase: Contém letra maiúscula
33
+ lowercase: Contém letra minúscula
34
+ numbers: Contém número
35
+ special: Contém caractere especial
36
+ strength: Força da senha
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fluxbit::Config::AccordionComponent
4
+ mattr_accessor :flush, default: false
5
+ mattr_accessor :color, default: :default
6
+ mattr_accessor :collapse_all, default: false
7
+
8
+ # rubocop: disable Layout/LineLength, Metrics/BlockLength
9
+ mattr_accessor :styles do
10
+ {
11
+ base: "space-y-2",
12
+ item: {
13
+ base: "",
14
+ header: {
15
+ base: "flex items-center justify-between w-full p-5 font-medium rtl:text-right border border-gray-200 focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-800 dark:border-gray-700 hover:bg-gray-100 dark:hover:bg-gray-800 gap-3",
16
+ first: "rounded-t-xl",
17
+ last: "rounded-b-xl",
18
+ middle: "border-b-0"
19
+ },
20
+ content: {
21
+ base: "p-5 border border-gray-200 dark:border-gray-700",
22
+ first: "",
23
+ last: "rounded-b-xl border-t-0",
24
+ middle: "border-t-0 border-b-0"
25
+ },
26
+ icon: {
27
+ base: "w-3 h-3 rotate-180 shrink-0",
28
+ open: "rotate-180",
29
+ closed: ""
30
+ }
31
+ },
32
+ colors: {
33
+ default: {
34
+ header: "bg-white dark:bg-gray-900 text-gray-500 dark:text-gray-400",
35
+ content: "bg-white dark:bg-gray-900 text-gray-500 dark:text-gray-400"
36
+ },
37
+ light: {
38
+ header: "bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-white",
39
+ content: "bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-white"
40
+ },
41
+ primary: {
42
+ header: "bg-blue-50 dark:bg-blue-900 text-blue-900 dark:text-blue-100 border-blue-200 dark:border-blue-800",
43
+ content: "bg-blue-50 dark:bg-blue-900 text-blue-900 dark:text-blue-100 border-blue-200 dark:border-blue-800"
44
+ },
45
+ secondary: {
46
+ header: "bg-gray-100 dark:bg-gray-800 text-gray-800 dark:text-gray-200 border-gray-300 dark:border-gray-700",
47
+ content: "bg-gray-100 dark:bg-gray-800 text-gray-800 dark:text-gray-200 border-gray-300 dark:border-gray-700"
48
+ },
49
+ success: {
50
+ header: "bg-green-50 dark:bg-green-900 text-green-900 dark:text-green-100 border-green-200 dark:border-green-800",
51
+ content: "bg-green-50 dark:bg-green-900 text-green-900 dark:text-green-100 border-green-200 dark:border-green-800"
52
+ },
53
+ danger: {
54
+ header: "bg-red-50 dark:bg-red-900 text-red-900 dark:text-red-100 border-red-200 dark:border-red-800",
55
+ content: "bg-red-50 dark:bg-red-900 text-red-900 dark:text-red-100 border-red-200 dark:border-red-800"
56
+ },
57
+ warning: {
58
+ header: "bg-yellow-50 dark:bg-yellow-900 text-yellow-900 dark:text-yellow-100 border-yellow-200 dark:border-yellow-800",
59
+ content: "bg-yellow-50 dark:bg-yellow-900 text-yellow-900 dark:text-yellow-100 border-yellow-200 dark:border-yellow-800"
60
+ },
61
+ info: {
62
+ header: "bg-cyan-50 dark:bg-cyan-900 text-cyan-900 dark:text-cyan-100 border-cyan-200 dark:border-cyan-800",
63
+ content: "bg-cyan-50 dark:bg-cyan-900 text-cyan-900 dark:text-cyan-100 border-cyan-200 dark:border-cyan-800"
64
+ },
65
+ dark: {
66
+ header: "bg-gray-800 dark:bg-gray-700 text-gray-100 dark:text-gray-200 border-gray-700 dark:border-gray-600",
67
+ content: "bg-gray-800 dark:bg-gray-700 text-gray-100 dark:text-gray-200 border-gray-700 dark:border-gray-600"
68
+ }
69
+ }
70
+ }
71
+ end
72
+ # rubocop: enable Layout/LineLength, Metrics/BlockLength
73
+ end
@@ -32,7 +32,7 @@ module Fluxbit::Config::AvatarComponent
32
32
  },
33
33
  color: {
34
34
  dark: "ring-gray-800 dark:ring-gray-800",
35
- failure: "ring-red-500 dark:ring-red-700",
35
+ danger: "ring-red-500 dark:ring-red-700",
36
36
  gray: "ring-gray-500 dark:ring-gray-400",
37
37
  info: "ring-cyan-400 dark:ring-cyan-800",
38
38
  light: "ring-gray-300 dark:ring-gray-500",
@@ -42,20 +42,20 @@ module Fluxbit::Config::AvatarComponent
42
42
  pink: "ring-pink-500 dark:ring-pink-500"
43
43
  },
44
44
  size: {
45
- xs: "w-6 h-6",
46
- sm: "w-8 h-8",
47
- md: "w-10 h-10",
48
- lg: "w-20 h-20",
49
- xl: "w-36 h-36"
45
+ xs: "size-6",
46
+ sm: "size-8",
47
+ md: "size-10",
48
+ lg: "size-20",
49
+ xl: "size-36"
50
50
  },
51
51
  placeholder_icon: {
52
52
  base: "relative overflow-hidden bg-gray-200 dark:bg-gray-600",
53
53
  size: {
54
- xs: "w-8 h-8",
55
- sm: "w-10 h-10",
56
- md: "w-12 h-12",
57
- lg: "w-22 h-22",
58
- xl: "w-38 h-38"
54
+ xs: "size-8",
55
+ sm: "size-10",
56
+ md: "size-12",
57
+ lg: "size-22",
58
+ xl: "size-38"
59
59
  }
60
60
  },
61
61
  stacked: "ring-2 ring-gray-300 dark:ring-gray-500",
@@ -12,12 +12,15 @@ module Fluxbit::Config::BadgeComponent
12
12
  # rubocop: disable Layout/LineLength, Metrics/BlockLength
13
13
  mattr_accessor :styles do
14
14
  {
15
- base: "inline-flex items-center gap-1 font-medium me-2 rounded-sm",
16
- pill: "rounded-full",
15
+ base: "inline-flex items-center gap-1 font-medium me-2",
16
+ pill: {
17
+ off: "rounded-sm",
18
+ on: "rounded-full"
19
+ },
17
20
  colors: {
18
21
  info: "bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300",
19
22
  dark: "bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300",
20
- failure: "bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300",
23
+ danger: "bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300",
21
24
  success: "bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300",
22
25
  warning: "bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300",
23
26
  indigo: "bg-indigo-100 text-indigo-800 dark:bg-indigo-900 dark:text-indigo-300",
@@ -28,7 +31,7 @@ module Fluxbit::Config::BadgeComponent
28
31
  teal: "bg-teal-100 text-teal-800 dark:bg-teal-900 dark:text-teal-400",
29
32
  solid_info: "text-white bg-blue-500 border-1 border-white dark:border-gray-900",
30
33
  solid_dark: "text-white bg-gray-500 border-1 border-white dark:border-gray-900",
31
- solid_failure: "text-white bg-red-500 border-1 border-white dark:border-gray-900",
34
+ solid_danger: "text-white bg-red-500 border-1 border-white dark:border-gray-900",
32
35
  solid_success: "text-white bg-green-500 border-1 border-white dark:border-gray-900",
33
36
  solid_warning: "text-white bg-yellow-500 border-1 border-white dark:border-gray-900",
34
37
  solid_indigo: "text-white bg-indigo-500 border-1 border-white dark:border-gray-900",
@@ -40,7 +43,7 @@ module Fluxbit::Config::BadgeComponent
40
43
 
41
44
  info_bordered: "bg-blue-100 text-blue-800 dark:bg-gray-700 dark:text-blue-400 border border-blue-400",
42
45
  dark_bordered: "bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-400 border border-gray-500",
43
- failure_bordered: "bg-red-100 text-red-800 dark:bg-gray-700 dark:text-red-400 border border-red-400",
46
+ danger_bordered: "bg-red-100 text-red-800 dark:bg-gray-700 dark:text-red-400 border border-red-400",
44
47
  success_bordered: "bg-green-100 text-green-800 dark:bg-gray-700 dark:text-green-400 border border-green-400",
45
48
  warning_bordered: "bg-yellow-100 text-yellow-800 dark:bg-gray-700 dark:text-yellow-300 border border-yellow-300",
46
49
  indigo_bordered: "bg-indigo-100 text-indigo-800 dark:bg-gray-700 dark:text-indigo-400 border border-indigo-400",
@@ -55,12 +58,12 @@ module Fluxbit::Config::BadgeComponent
55
58
  ],
56
59
  perfect_rounded: [
57
60
  "h-fit px-2.5 py-0.5",
58
- "justify-center w-4 h-4",
59
- "justify-center w-6 h-6",
60
- "justify-center w-8 h-8",
61
- "justify-center w-10 h-10",
62
- "justify-center w-12 h-12"
63
- ],
61
+ "justify-center size-4",
62
+ "justify-center size-6",
63
+ "justify-center size-8",
64
+ "justify-center size-10",
65
+ "justify-center size-12"
66
+ ],
64
67
  notification: {
65
68
  default: "absolute",
66
69
  positions: {
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fluxbit::Config::BannerComponent
4
+ mattr_accessor :position, default: :top
5
+ mattr_accessor :color, default: :info
6
+ mattr_accessor :icon, default: :default
7
+ mattr_accessor :dismissible, default: true
8
+ mattr_accessor :full_width, default: true
9
+
10
+ # rubocop: disable Layout/LineLength, Metrics/BlockLength
11
+ mattr_accessor :styles do
12
+ {
13
+ base: "border border-b",
14
+ positions: {
15
+ top: "relative",
16
+ bottom: "relative",
17
+ sticky_top: "fixed top-0 start-0 z-50 w-full",
18
+ sticky_bottom: "fixed bottom-0 start-0 z-50 w-full"
19
+ },
20
+ colors: {
21
+ info: "bg-blue-50 text-blue-800 border-blue-200 dark:bg-gray-800 dark:text-blue-400 dark:border-blue-600",
22
+ success: "bg-green-50 text-green-800 border-green-200 dark:bg-gray-800 dark:text-green-400 dark:border-green-600",
23
+ warning: "bg-yellow-50 text-yellow-800 border-yellow-200 dark:bg-gray-800 dark:text-yellow-300 dark:border-yellow-600",
24
+ danger: "bg-red-50 text-red-800 border-red-200 dark:bg-gray-800 dark:text-red-400 dark:border-red-600",
25
+ dark: "bg-gray-50 text-gray-800 border-gray-200 dark:bg-gray-800 dark:text-gray-300 dark:border-gray-600",
26
+ light: "bg-white text-gray-800 border-gray-200 dark:bg-gray-800 dark:text-gray-300 dark:border-gray-600",
27
+ primary: "bg-primary-50 text-primary-800 border-primary-200 dark:bg-gray-800 dark:text-primary-400 dark:border-primary-600",
28
+ secondary: "bg-gray-50 text-gray-800 border-gray-200 dark:bg-gray-800 dark:text-gray-300 dark:border-gray-600"
29
+ },
30
+ default_icons: {
31
+ info: "information-circle",
32
+ success: "check-circle",
33
+ warning: "exclamation-triangle",
34
+ danger: "exclamation-circle",
35
+ dark: "information-circle",
36
+ light: "information-circle",
37
+ primary: "information-circle",
38
+ secondary: "information-circle"
39
+ },
40
+ content_wrapper: {
41
+ full_width: "flex items-center justify-between w-full p-4",
42
+ constrained: "flex items-center justify-between max-w-screen-xl mx-auto p-4"
43
+ },
44
+ left_content: "flex items-center",
45
+ right_content: "flex items-center",
46
+ text: {
47
+ with_icon_or_logo: "ml-3 text-sm font-normal",
48
+ without_icon_or_logo: "text-sm font-normal"
49
+ },
50
+ dismiss_button: {
51
+ base: "flex-shrink-0 inline-flex justify-center w-7 h-7 items-center text-gray-400 hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm p-1.5 dark:hover:bg-gray-600 dark:hover:text-white",
52
+ with_cta: "ml-3"
53
+ },
54
+ screen_reader: "sr-only",
55
+ icon_default: "size-5 text-current flex-shrink-0",
56
+ close_icon: "w-3 h-3"
57
+ }
58
+ end
59
+ # rubocop: enable Layout/LineLength, Metrics/BlockLength
60
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fluxbit::Config::BottomNavigationComponent
4
+ mattr_accessor :variant, default: :default
5
+ mattr_accessor :border, default: true
6
+
7
+ # rubocop:disable Layout/LineLength
8
+ mattr_accessor :styles do
9
+ {
10
+ variants: {
11
+ default: {
12
+ base: "fixed bottom-0 left-0 z-50 w-full h-16 bg-white dark:bg-gray-700",
13
+ base_with_button_group: "fixed bottom-0 left-0 z-50 w-full h-auto bg-white dark:bg-gray-700",
14
+ border: "border-t border-gray-200 dark:border-gray-600"
15
+ },
16
+ app_bar: {
17
+ base: "fixed z-50 w-full h-16 max-w-lg -translate-x-1/2 bg-white border border-gray-200 rounded-full bottom-4 left-1/2 dark:bg-gray-700 dark:border-gray-600",
18
+ base_with_button_group: "fixed z-50 w-full h-auto max-w-lg -translate-x-1/2 bg-white border border-gray-200 rounded-full bottom-4 left-1/2 dark:bg-gray-700 dark:border-gray-600",
19
+ border: ""
20
+ }
21
+ },
22
+ container: {
23
+ base: "grid h-full max-w-lg mx-auto font-medium",
24
+ base_with_button_group: "grid h-16 max-w-lg mx-auto font-medium",
25
+ columns: [
26
+ "grid-cols-2", # 2 columns (index 0)
27
+ "grid-cols-3", # 3 columns (index 1)
28
+ "grid-cols-4", # 4 columns (index 2)
29
+ "grid-cols-5", # 5 columns (index 3)
30
+ "grid-cols-6" # 6 columns (index 4)
31
+ ]
32
+ },
33
+ item: {
34
+ base: "inline-flex flex-col items-center justify-center px-5 hover:bg-gray-50 dark:hover:bg-gray-800 group",
35
+ active: "text-blue-600 dark:text-blue-500",
36
+ inactive: "text-gray-500 dark:text-gray-400",
37
+ icon_wrapper: "w-5 h-5 mb-2",
38
+ icon: "w-5 h-5",
39
+ text: "text-sm group-hover:text-blue-600 dark:group-hover:text-blue-500",
40
+ sr_only: "sr-only"
41
+ },
42
+ cta_wrapper: "flex items-center justify-center",
43
+ cta: {
44
+ button: "inline-flex items-center justify-center w-10 h-10 font-medium bg-blue-600 rounded-full hover:bg-blue-700 group focus:ring-4 focus:ring-blue-300 focus:outline-none dark:focus:ring-blue-800",
45
+ icon: "w-4 h-4 text-white dark:text-white"
46
+ },
47
+ tooltip: {
48
+ base: "absolute z-10 invisible inline-block px-3 py-2 text-sm font-medium text-white transition-opacity duration-300 bg-gray-900 rounded-lg shadow-sm opacity-0 tooltip dark:bg-gray-700",
49
+ arrow: "tooltip-arrow"
50
+ },
51
+ pagination: {
52
+ container: "inline-flex items-center justify-center col-span-2",
53
+ button: "inline-flex items-center justify-center h-full px-5 hover:bg-gray-50 dark:hover:bg-gray-800 disabled:opacity-50 disabled:cursor-not-allowed",
54
+ icon: "w-3 h-3 text-gray-500 dark:text-gray-400",
55
+ info: "flex items-center text-sm text-gray-500 dark:text-gray-400",
56
+ sr_only: "sr-only"
57
+ },
58
+ button_group: {
59
+ container: "grid max-w-xs p-1 mx-auto my-2 bg-gray-100 rounded-lg dark:bg-gray-600",
60
+ grid: "grid gap-1",
61
+ button: "px-5 py-1.5 text-xs font-medium hover:bg-white dark:hover:bg-gray-700 rounded-lg",
62
+ button_active: "text-gray-900 bg-white dark:text-white dark:bg-gray-700",
63
+ button_inactive: "text-gray-500 dark:text-gray-400",
64
+ columns: [
65
+ "grid-cols-2", # 2 columns (index 0)
66
+ "grid-cols-3", # 3 columns (index 1)
67
+ "grid-cols-4", # 4 columns (index 2)
68
+ "grid-cols-5" # 5 columns (index 3)
69
+ ]
70
+ }
71
+ }
72
+ end
73
+ # rubocop:enable Layout/LineLength
74
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fluxbit::Config::BreadcrumbComponent
4
+ # rubocop: disable Layout/LineLength, Metrics/BlockLength
5
+ mattr_accessor :styles do
6
+ {
7
+ root: {
8
+ base: "",
9
+ list: "inline-flex items-center"
10
+ },
11
+ item: {
12
+ base: "group flex items-center",
13
+ chevron: "mx-1 h-4 w-4 text-gray-400 group-first:hidden md:mx-2",
14
+ icon: "mr-2 h-4 w-4",
15
+ click_cursor: "cursor-pointer",
16
+ href: {
17
+ on: "flex items-center text-sm font-medium text-gray-700 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white",
18
+ off: "flex items-center text-sm font-medium text-gray-500 dark:text-gray-400"
19
+ }
20
+ }
21
+ }
22
+ end
23
+ # rubocop: enable Layout/LineLength, Metrics/BlockLength
24
+ end
@@ -5,18 +5,19 @@ module Fluxbit::Config::ButtonComponent
5
5
  mattr_accessor :pill, default: false
6
6
  mattr_accessor :size, default: 1
7
7
  mattr_accessor :as, default: :button
8
+ mattr_accessor :selected, default: false
8
9
 
9
10
  # TODO: Gradient and Gradient Duotone need their outline version.
10
11
  # rubocop: disable Layout/LineLength, Metrics/BlockLength
11
12
  mattr_accessor :styles do
12
13
  {
13
- base: "group flex items-center justify-center p-0.5 text-center font-medium relative focus:z-10 focus:outline-hidden",
14
+ base: "group flex items-center justify-center text-center font-medium relative focus:z-10 focus:outline-hidden",
14
15
  full_sized: "w-full",
15
16
  colors: {
16
17
  transparent: "text-slate-500 hover:text-slate-900 hover:bg-slate-100 dark:text-slate-400 dark:hover:bg-slate-700 dark:hover:text-white",
17
18
  default: "text-white bg-blue-700 border border-transparent enabled:hover:bg-blue-800 focus:ring-4 focus:ring-blue-300 dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800",
18
19
  success: "text-white bg-green-700 border border-transparent enabled:hover:bg-green-800 focus:ring-4 focus:ring-green-300 dark:bg-green-600 dark:enabled:hover:bg-green-700 dark:focus:ring-green-800",
19
- failure: "text-white bg-red-700 border border-transparent enabled:hover:bg-red-800 focus:ring-4 focus:ring-red-300 dark:bg-red-600 dark:enabled:hover:bg-red-700 dark:focus:ring-red-900",
20
+ danger: "text-white bg-red-700 border border-transparent enabled:hover:bg-red-800 focus:ring-4 focus:ring-red-300 dark:bg-red-600 dark:enabled:hover:bg-red-700 dark:focus:ring-red-900",
20
21
  info: "text-white bg-cyan-700 border border-transparent enabled:hover:bg-cyan-800 focus:ring-4 focus:ring-cyan-300 dark:bg-cyan-600 dark:enabled:hover:bg-cyan-700 dark:focus:ring-cyan-800",
21
22
  warning: "text-white bg-yellow-400 border border-transparent enabled:hover:bg-yellow-500 focus:ring-4 focus:ring-yellow-300 dark:focus:ring-yellow-900",
22
23
  dark: "text-white bg-gray-800 border border-transparent enabled:hover:bg-gray-900 focus:ring-4 focus:ring-gray-300 dark:bg-gray-800 dark:enabled:hover:bg-gray-700 dark:focus:ring-gray-800 dark:border-gray-700",
@@ -25,7 +26,7 @@ module Fluxbit::Config::ButtonComponent
25
26
 
26
27
  default_outline: "text-blue-700 hover:text-white border border-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-hidden focus:ring-blue-300 dark:border-blue-500 dark:text-blue-500 dark:hover:text-white dark:hover:bg-blue-500 dark:focus:ring-blue-800",
27
28
  success_outline: "text-green-700 hover:text-white border border-green-700 hover:bg-green-800 focus:ring-4 focus:outline-hidden focus:ring-green-300 dark:border-green-500 dark:text-green-500 dark:hover:text-white dark:hover:bg-green-600 dark:focus:ring-green-800",
28
- failure_outline: "text-red-700 hover:text-white border border-red-700 hover:bg-red-800 focus:ring-4 focus:outline-hidden focus:ring-red-300 dark:border-red-500 dark:text-red-500 dark:hover:text-white dark:hover:bg-red-600 dark:focus:ring-red-900",
29
+ danger_outline: "text-red-700 hover:text-white border border-red-700 hover:bg-red-800 focus:ring-4 focus:outline-hidden focus:ring-red-300 dark:border-red-500 dark:text-red-500 dark:hover:text-white dark:hover:bg-red-600 dark:focus:ring-red-900",
29
30
  info_outline: "text-cyan-400 hover:text-white border border-cyan-400 hover:bg-cyan-500 focus:ring-4 focus:outline-hidden focus:ring-cyan-300 dark:border-cyan-300 dark:text-cyan-300 dark:hover:text-white dark:hover:bg-cyan-400 dark:focus:ring-cyan-900",
30
31
  warning_outline: "text-yellow-400 hover:text-white border border-yellow-400 hover:bg-yellow-500 focus:ring-4 focus:outline-hidden focus:ring-yellow-300 dark:border-yellow-300 dark:text-yellow-300 dark:hover:text-white dark:hover:bg-yellow-400 dark:focus:ring-yellow-900",
31
32
  dark_outline: "text-gray-900 hover:text-white border border-gray-800 hover:bg-gray-900 focus:ring-4 focus:outline-hidden focus:ring-gray-300 dark:border-gray-600 dark:text-gray-400 dark:hover:text-white dark:hover:bg-gray-600 dark:focus:ring-gray-800",
@@ -33,7 +34,7 @@ module Fluxbit::Config::ButtonComponent
33
34
  purple_outline: "text-purple-700 hover:text-white border border-purple-700 hover:bg-purple-800 focus:ring-4 focus:outline-hidden focus:ring-purple-300 dark:border-purple-400 dark:text-purple-400 dark:hover:text-white dark:hover:bg-purple-500 dark:focus:ring-purple-900",
34
35
 
35
36
  info_gradient: "text-white bg-gradient-to-r from-cyan-500 via-cyan-600 to-cyan-700 enabled:hover:bg-gradient-to-br focus:ring-4 focus:ring-cyan-300 dark:focus:ring-cyan-800 ",
36
- failure_gradient: "text-white bg-gradient-to-r from-red-400 via-red-500 to-red-600 enabled:hover:bg-gradient-to-br focus:ring-4 focus:ring-red-300 dark:focus:ring-red-800",
37
+ danger_gradient: "text-white bg-gradient-to-r from-red-400 via-red-500 to-red-600 enabled:hover:bg-gradient-to-br focus:ring-4 focus:ring-red-300 dark:focus:ring-red-800",
37
38
  success_gradient: "text-white bg-gradient-to-r from-green-400 via-green-500 to-green-600 enabled:hover:bg-gradient-to-br focus:ring-4 focus:ring-green-300 dark:focus:ring-green-800",
38
39
  cyan_gradient: "text-white bg-gradient-to-r from-cyan-400 via-cyan-500 to-cyan-600 enabled:hover:bg-gradient-to-br focus:ring-4 focus:ring-cyan-300 dark:focus:ring-cyan-800",
39
40
  lime_gradient: "text-gray-900 bg-gradient-to-r from-lime-200 via-lime-400 to-lime-500 enabled:hover:bg-gradient-to-br focus:ring-4 focus:ring-lime-300 dark:focus:ring-lime-800",
@@ -50,6 +51,7 @@ module Fluxbit::Config::ButtonComponent
50
51
  teal_to_lime_gradient: "text-gray-900 bg-gradient-to-r from-teal-200 to-lime-200 enabled:hover:bg-gradient-to-l enabled:hover:from-teal-200 enabled:hover:to-lime-200 enabled:hover:text-gray-900 focus:ring-4 focus:ring-lime-200 dark:focus:ring-teal-700"
51
52
  },
52
53
  disabled: "cursor-not-allowed opacity-50",
54
+ selected: "brightness-90 dark:brightness-75",
53
55
  inner: {
54
56
  base: "flex items-stretch items-center transition-all duration-200",
55
57
  position: {