better_ui 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +165 -105
- data/app/components/better_ui/application/alert_component.html.erb +1 -1
- data/app/components/better_ui/application/alert_component.rb +95 -89
- data/app/components/better_ui/application/card_component.html.erb +24 -0
- data/app/components/better_ui/application/card_component.rb +53 -0
- data/app/components/better_ui/application/card_container_component.html.erb +8 -0
- data/app/components/better_ui/application/card_container_component.rb +14 -0
- data/app/components/better_ui/application/toast_component.rb +92 -57
- data/app/components/better_ui/general/avatar_component.html.erb +19 -0
- data/app/components/better_ui/general/avatar_component.rb +171 -0
- data/app/components/better_ui/general/badge_component.html.erb +19 -0
- data/app/components/better_ui/general/badge_component.rb +123 -0
- data/app/components/better_ui/general/breadcrumb_component.html.erb +7 -31
- data/app/components/better_ui/general/breadcrumb_component.rb +64 -66
- data/app/components/better_ui/general/button_component.html.erb +4 -4
- data/app/components/better_ui/general/button_component.rb +64 -95
- data/app/components/better_ui/general/heading_component.html.erb +3 -3
- data/app/components/better_ui/general/heading_component.rb +76 -70
- data/app/components/better_ui/general/icon_component.html.erb +1 -1
- data/app/components/better_ui/general/icon_component.rb +22 -23
- data/app/components/better_ui/general/link_component.html.erb +17 -0
- data/app/components/better_ui/general/link_component.rb +132 -0
- data/app/components/better_ui/general/panel_component.rb +62 -56
- data/app/components/better_ui/general/spinner_component.html.erb +15 -0
- data/app/components/better_ui/general/spinner_component.rb +79 -0
- data/app/components/better_ui/general/table_component.html.erb +56 -20
- data/app/components/better_ui/general/table_component.rb +106 -80
- data/app/components/better_ui/theme_helper.rb +77 -75
- data/app/views/components/better_ui/general/table/_custom_body_row.html.erb +17 -0
- data/app/views/components/better_ui/general/table/_custom_footer_rows.html.erb +17 -0
- data/app/views/components/better_ui/general/table/_custom_header_rows.html.erb +12 -0
- data/lib/better_ui/engine.rb +4 -10
- data/lib/better_ui/version.rb +1 -1
- data/lib/better_ui.rb +4 -0
- data/lib/generators/better_ui/stylesheet_generator.rb +96 -0
- data/lib/generators/better_ui/templates/README +56 -0
- data/lib/generators/better_ui/templates/components/_avatar.scss +151 -0
- data/lib/generators/better_ui/templates/components/_badge.scss +142 -0
- data/lib/generators/better_ui/templates/components/_breadcrumb.scss +107 -0
- data/lib/generators/better_ui/templates/components/_button.scss +106 -0
- data/lib/generators/better_ui/templates/components/_card.scss +69 -0
- data/lib/generators/better_ui/templates/components/_heading.scss +180 -0
- data/lib/generators/better_ui/templates/components/_icon.scss +90 -0
- data/lib/generators/better_ui/templates/components/_link.scss +130 -0
- data/lib/generators/better_ui/templates/components/_panel.scss +144 -0
- data/lib/generators/better_ui/templates/components/_spinner.scss +132 -0
- data/lib/generators/better_ui/templates/components/_table.scss +105 -0
- data/lib/generators/better_ui/templates/components/_variables.scss +33 -0
- data/lib/generators/better_ui/templates/components_stylesheet.scss +66 -0
- metadata +51 -22
- data/app/helpers/better_ui_application_helper.rb +0 -99
@@ -1,46 +1,55 @@
|
|
1
1
|
module BetterUi
|
2
2
|
module General
|
3
3
|
class ButtonComponent < ViewComponent::Base
|
4
|
-
attr_reader :label, :type, :size, :
|
5
|
-
:icon, :icon_position, :href, :method, :data, :classes, :id
|
4
|
+
attr_reader :label, :type, :size, :full_width, :disabled,
|
5
|
+
:icon, :icon_position, :href, :method, :data, :classes, :id, :rounded
|
6
6
|
|
7
|
-
#
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
7
|
+
# Temi di bottoni disponibili con classi CSS personalizzate
|
8
|
+
BUTTON_THEME = {
|
9
|
+
default: "bui-btn-default",
|
10
|
+
white: "bui-btn-white",
|
11
|
+
red: "bui-btn-red",
|
12
|
+
rose: "bui-btn-rose",
|
13
|
+
orange: "bui-btn-orange",
|
14
|
+
green: "bui-btn-green",
|
15
|
+
blue: "bui-btn-blue",
|
16
|
+
yellow: "bui-btn-yellow",
|
17
|
+
violet: "bui-btn-violet"
|
17
18
|
}
|
18
19
|
|
19
|
-
#
|
20
|
-
OUTLINE_BUTTON_TYPES = {
|
21
|
-
primary: "bg-transparent text-blue-600 border-blue-600 border hover:text-white hover:bg-blue-600",
|
22
|
-
secondary: "bg-transparent text-gray-800 border-gray-200 border hover:text-white hover:bg-gray-200",
|
23
|
-
success: "bg-transparent text-green-600 border-green-600 border hover:text-white hover:bg-green-600",
|
24
|
-
danger: "bg-transparent text-red-600 border-red-600 border hover:text-white hover:bg-red-600",
|
25
|
-
warning: "bg-transparent text-yellow-500 border-yellow-500 border hover:text-white hover:bg-yellow-500",
|
26
|
-
info: "bg-transparent text-sky-500 border-sky-500 border hover:text-white hover:bg-sky-500",
|
27
|
-
light: "bg-transparent text-gray-800 border-gray-300 border hover:text-gray-900 hover:bg-gray-100",
|
28
|
-
dark: "bg-transparent text-gray-800 border-gray-800 border hover:text-white hover:bg-gray-800"
|
29
|
-
}
|
30
|
-
|
31
|
-
# Dimensioni disponibili
|
20
|
+
# Dimensioni disponibili con classi CSS personalizzate
|
32
21
|
BUTTON_SIZES = {
|
33
|
-
|
34
|
-
|
35
|
-
|
22
|
+
small: "bui-btn-size-small",
|
23
|
+
medium: "bui-btn-size-medium",
|
24
|
+
large: "bui-btn-size-large"
|
25
|
+
}
|
26
|
+
|
27
|
+
# Border radius disponibili con classi CSS personalizzate
|
28
|
+
BUTTON_RADIUS = {
|
29
|
+
none: "bui-btn-radius-none",
|
30
|
+
small: "bui-btn-radius-small",
|
31
|
+
medium: "bui-btn-radius-medium",
|
32
|
+
large: "bui-btn-radius-large",
|
33
|
+
full: "bui-btn-radius-full"
|
34
|
+
}
|
35
|
+
|
36
|
+
# Stati e comportamenti del bottone
|
37
|
+
BUTTON_STATES = {
|
38
|
+
disabled: "bui-btn-disabled",
|
39
|
+
full_width: "bui-btn-full-width"
|
40
|
+
}
|
41
|
+
|
42
|
+
# Layout e stili comuni
|
43
|
+
BUTTON_LAYOUT = {
|
44
|
+
default: "bui-btn-layout-default",
|
45
|
+
focus: "bui-btn-focus"
|
36
46
|
}
|
37
47
|
|
38
48
|
# Inizializzazione del componente
|
39
49
|
def initialize(
|
40
50
|
label: nil,
|
41
|
-
type: :
|
42
|
-
size: :
|
43
|
-
outline: false,
|
51
|
+
type: :default,
|
52
|
+
size: :medium,
|
44
53
|
full_width: false,
|
45
54
|
disabled: false,
|
46
55
|
icon: nil,
|
@@ -49,12 +58,12 @@ module BetterUi
|
|
49
58
|
method: nil,
|
50
59
|
data: {},
|
51
60
|
classes: nil,
|
52
|
-
id: nil
|
61
|
+
id: nil,
|
62
|
+
rounded: :small
|
53
63
|
)
|
54
64
|
@label = label
|
55
65
|
@type = type.to_sym
|
56
66
|
@size = size.to_sym
|
57
|
-
@outline = outline
|
58
67
|
@full_width = full_width
|
59
68
|
@disabled = disabled
|
60
69
|
@icon = icon
|
@@ -64,6 +73,7 @@ module BetterUi
|
|
64
73
|
@data = data
|
65
74
|
@classes = classes
|
66
75
|
@id = id
|
76
|
+
@rounded = rounded.to_sym
|
67
77
|
end
|
68
78
|
|
69
79
|
# Determina se il bottone è un link o un button
|
@@ -74,79 +84,28 @@ module BetterUi
|
|
74
84
|
# Combina tutte le classi
|
75
85
|
def combined_classes
|
76
86
|
[
|
77
|
-
"
|
78
|
-
|
87
|
+
"bui-btn", # Classe base per tutti i bottoni
|
88
|
+
BUTTON_LAYOUT[:default],
|
89
|
+
BUTTON_LAYOUT[:focus],
|
90
|
+
get_border_radius_class,
|
79
91
|
get_button_type_classes,
|
80
92
|
get_button_size_classes,
|
81
|
-
@full_width ?
|
82
|
-
@disabled ?
|
93
|
+
@full_width ? BUTTON_STATES[:full_width] : "",
|
94
|
+
@disabled ? BUTTON_STATES[:disabled] : "",
|
83
95
|
@classes
|
84
96
|
].compact.join(" ")
|
85
97
|
end
|
86
98
|
|
87
99
|
def get_button_type_classes
|
88
|
-
|
89
|
-
get_outline_button_classes
|
90
|
-
else
|
91
|
-
get_solid_button_classes
|
92
|
-
end
|
100
|
+
BUTTON_THEME[@type] || BUTTON_THEME[:default]
|
93
101
|
end
|
94
102
|
|
95
|
-
def
|
96
|
-
|
97
|
-
when :primary
|
98
|
-
"bg-orange-500 text-white hover:bg-orange-600 focus:ring-orange-500"
|
99
|
-
when :secondary
|
100
|
-
"bg-gray-200 text-gray-800 hover:bg-gray-300 focus:ring-gray-300"
|
101
|
-
when :success
|
102
|
-
"bg-green-500 text-white hover:bg-green-600 focus:ring-green-500"
|
103
|
-
when :danger
|
104
|
-
"bg-red-500 text-white hover:bg-red-600 focus:ring-red-500"
|
105
|
-
when :warning
|
106
|
-
"bg-amber-500 text-white hover:bg-amber-600 focus:ring-amber-500"
|
107
|
-
when :info
|
108
|
-
"bg-blue-500 text-white hover:bg-blue-600 focus:ring-blue-500"
|
109
|
-
when :light
|
110
|
-
"bg-white text-gray-800 border border-gray-300 hover:bg-gray-100 focus:ring-gray-300"
|
111
|
-
when :dark
|
112
|
-
"bg-gray-800 text-white hover:bg-gray-900 focus:ring-gray-800"
|
113
|
-
else
|
114
|
-
"bg-orange-500 text-white hover:bg-orange-600 focus:ring-orange-500"
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
def get_outline_button_classes
|
119
|
-
case @type
|
120
|
-
when :primary
|
121
|
-
"bg-transparent text-orange-500 border-2 border-orange-500 hover:bg-orange-50 focus:ring-orange-500"
|
122
|
-
when :secondary
|
123
|
-
"bg-transparent text-gray-800 border-2 border-gray-300 hover:bg-gray-50 focus:ring-gray-300"
|
124
|
-
when :success
|
125
|
-
"bg-transparent text-green-500 border-2 border-green-500 hover:bg-green-50 focus:ring-green-500"
|
126
|
-
when :danger
|
127
|
-
"bg-transparent text-red-500 border-2 border-red-500 hover:bg-red-50 focus:ring-red-500"
|
128
|
-
when :warning
|
129
|
-
"bg-transparent text-amber-500 border-2 border-amber-500 hover:bg-amber-50 focus:ring-amber-500"
|
130
|
-
when :info
|
131
|
-
"bg-transparent text-blue-500 border-2 border-blue-500 hover:bg-blue-50 focus:ring-blue-500"
|
132
|
-
when :light
|
133
|
-
"bg-transparent text-gray-800 border-2 border-gray-300 hover:bg-gray-50 focus:ring-gray-300"
|
134
|
-
when :dark
|
135
|
-
"bg-transparent text-gray-800 border-2 border-gray-800 hover:bg-gray-50 focus:ring-gray-800"
|
136
|
-
else
|
137
|
-
"bg-transparent text-orange-500 border-2 border-orange-500 hover:bg-orange-50 focus:ring-orange-500"
|
138
|
-
end
|
103
|
+
def get_border_radius_class
|
104
|
+
BUTTON_RADIUS[@rounded] || BUTTON_RADIUS[:small]
|
139
105
|
end
|
140
106
|
|
141
107
|
def get_button_size_classes
|
142
|
-
|
143
|
-
when :sm
|
144
|
-
"py-1 px-2.5 text-xs"
|
145
|
-
when :lg
|
146
|
-
"py-2.5 px-6 text-base"
|
147
|
-
else # :md
|
148
|
-
"py-2 px-4 text-sm"
|
149
|
-
end
|
108
|
+
BUTTON_SIZES[@size] || BUTTON_SIZES[:medium]
|
150
109
|
end
|
151
110
|
|
152
111
|
# Restituisce gli attributi per il bottone
|
@@ -181,10 +140,20 @@ module BetterUi
|
|
181
140
|
|
182
141
|
# Helper per renderizzare le icone
|
183
142
|
def render_icon(icon_name)
|
143
|
+
# Mappa le dimensioni del bottone alle dimensioni dell'icona
|
144
|
+
icon_size = case @size
|
145
|
+
when :large
|
146
|
+
:large
|
147
|
+
when :small
|
148
|
+
:small
|
149
|
+
else
|
150
|
+
:medium
|
151
|
+
end
|
152
|
+
|
184
153
|
# Utilizziamo il componente Icon
|
185
154
|
render BetterUi::General::IconComponent.new(
|
186
155
|
name: icon_name,
|
187
|
-
size:
|
156
|
+
size: icon_size,
|
188
157
|
fixed_width: true
|
189
158
|
)
|
190
159
|
end
|
@@ -2,9 +2,9 @@
|
|
2
2
|
<%# Utilizzo di tag heading dinamico in base al livello specificato %>
|
3
3
|
<<%= "h#{@level}" %> class="<%= heading_classes %>">
|
4
4
|
<% if @icon.present? %>
|
5
|
-
<span class="
|
6
|
-
<span class="
|
7
|
-
<%= render BetterUi::General::IconComponent.new(name: @icon) %>
|
5
|
+
<span class="bui-header-icon-container">
|
6
|
+
<span class="bui-header-icon-wrapper">
|
7
|
+
<%= render BetterUi::General::IconComponent.new(name: @icon, size: get_icon_size) %>
|
8
8
|
</span>
|
9
9
|
<%= @text || content %>
|
10
10
|
</span>
|
@@ -4,77 +4,75 @@ module BetterUi
|
|
4
4
|
attr_reader :text, :level, :variant, :size, :align, :classes, :icon, :subtitle, :with_divider
|
5
5
|
|
6
6
|
# Varianti di colore disponibili
|
7
|
-
|
7
|
+
HEADER_THEME = {
|
8
8
|
default: {
|
9
|
-
heading: "
|
10
|
-
subtitle: "
|
11
|
-
divider: "
|
9
|
+
heading: "bui-header-default-heading",
|
10
|
+
subtitle: "bui-header-default-subtitle",
|
11
|
+
divider: "bui-header-default-divider"
|
12
12
|
},
|
13
|
-
|
14
|
-
heading: "
|
15
|
-
subtitle: "
|
16
|
-
divider: "
|
13
|
+
white: {
|
14
|
+
heading: "bui-header-white-heading",
|
15
|
+
subtitle: "bui-header-white-subtitle",
|
16
|
+
divider: "bui-header-white-divider"
|
17
17
|
},
|
18
|
-
|
19
|
-
heading: "
|
20
|
-
subtitle: "
|
21
|
-
divider: "
|
18
|
+
red: {
|
19
|
+
heading: "bui-header-red-heading",
|
20
|
+
subtitle: "bui-header-red-subtitle",
|
21
|
+
divider: "bui-header-red-divider"
|
22
22
|
},
|
23
|
-
|
24
|
-
heading: "
|
25
|
-
subtitle: "
|
26
|
-
divider: "
|
23
|
+
rose: {
|
24
|
+
heading: "bui-header-rose-heading",
|
25
|
+
subtitle: "bui-header-rose-subtitle",
|
26
|
+
divider: "bui-header-rose-divider"
|
27
27
|
},
|
28
|
-
|
29
|
-
heading: "
|
30
|
-
subtitle: "
|
31
|
-
divider: "
|
28
|
+
orange: {
|
29
|
+
heading: "bui-header-orange-heading",
|
30
|
+
subtitle: "bui-header-orange-subtitle",
|
31
|
+
divider: "bui-header-orange-divider"
|
32
32
|
},
|
33
|
-
|
34
|
-
heading: "
|
35
|
-
subtitle: "
|
36
|
-
divider: "
|
33
|
+
green: {
|
34
|
+
heading: "bui-header-green-heading",
|
35
|
+
subtitle: "bui-header-green-subtitle",
|
36
|
+
divider: "bui-header-green-divider"
|
37
37
|
},
|
38
|
-
|
39
|
-
heading: "
|
40
|
-
subtitle: "
|
41
|
-
divider: "
|
38
|
+
blue: {
|
39
|
+
heading: "bui-header-blue-heading",
|
40
|
+
subtitle: "bui-header-blue-subtitle",
|
41
|
+
divider: "bui-header-blue-divider"
|
42
|
+
},
|
43
|
+
yellow: {
|
44
|
+
heading: "bui-header-yellow-heading",
|
45
|
+
subtitle: "bui-header-yellow-subtitle",
|
46
|
+
divider: "bui-header-yellow-divider"
|
47
|
+
},
|
48
|
+
violet: {
|
49
|
+
heading: "bui-header-violet-heading",
|
50
|
+
subtitle: "bui-header-violet-subtitle",
|
51
|
+
divider: "bui-header-violet-divider"
|
42
52
|
}
|
43
53
|
}
|
44
54
|
|
45
55
|
# Dimensioni disponibili
|
46
|
-
|
47
|
-
|
48
|
-
heading: "
|
49
|
-
subtitle: "
|
50
|
-
},
|
51
|
-
sm: {
|
52
|
-
heading: "text-xl",
|
53
|
-
subtitle: "text-base"
|
54
|
-
},
|
55
|
-
md: {
|
56
|
-
heading: "text-2xl",
|
57
|
-
subtitle: "text-lg"
|
56
|
+
HEADER_SIZES = {
|
57
|
+
small: {
|
58
|
+
heading: "bui-header-small-heading",
|
59
|
+
subtitle: "bui-header-small-subtitle"
|
58
60
|
},
|
59
|
-
|
60
|
-
heading: "
|
61
|
-
subtitle: "
|
61
|
+
medium: {
|
62
|
+
heading: "bui-header-medium-heading",
|
63
|
+
subtitle: "bui-header-medium-subtitle"
|
62
64
|
},
|
63
|
-
|
64
|
-
heading: "
|
65
|
-
subtitle: "
|
66
|
-
},
|
67
|
-
xxl: {
|
68
|
-
heading: "text-5xl",
|
69
|
-
subtitle: "text-3xl"
|
65
|
+
large: {
|
66
|
+
heading: "bui-header-large-heading",
|
67
|
+
subtitle: "bui-header-large-subtitle"
|
70
68
|
}
|
71
69
|
}
|
72
70
|
|
73
71
|
# Allineamenti disponibili
|
74
|
-
|
75
|
-
left: "
|
76
|
-
center: "
|
77
|
-
right: "
|
72
|
+
HEADER_ALIGNMENTS = {
|
73
|
+
left: "bui-header-left",
|
74
|
+
center: "bui-header-center",
|
75
|
+
right: "bui-header-right"
|
78
76
|
}
|
79
77
|
|
80
78
|
# Inizializzazione del componente
|
@@ -82,7 +80,7 @@ module BetterUi
|
|
82
80
|
text: nil,
|
83
81
|
level: 2,
|
84
82
|
variant: :default,
|
85
|
-
size: :
|
83
|
+
size: :medium,
|
86
84
|
align: :left,
|
87
85
|
classes: nil,
|
88
86
|
icon: nil,
|
@@ -103,10 +101,10 @@ module BetterUi
|
|
103
101
|
# Genera le classi per l'heading
|
104
102
|
def heading_classes
|
105
103
|
[
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
"
|
104
|
+
HEADER_THEME.fetch(@variant, HEADER_THEME[:default])[:heading],
|
105
|
+
HEADER_SIZES.fetch(@size, HEADER_SIZES[:medium])[:heading],
|
106
|
+
HEADER_ALIGNMENTS.fetch(@align, HEADER_ALIGNMENTS[:left]),
|
107
|
+
"bui-header-heading-base",
|
110
108
|
@classes
|
111
109
|
].compact.join(" ")
|
112
110
|
end
|
@@ -114,28 +112,36 @@ module BetterUi
|
|
114
112
|
# Genera le classi per il sottotitolo
|
115
113
|
def subtitle_classes
|
116
114
|
[
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
"
|
115
|
+
HEADER_THEME.fetch(@variant, HEADER_THEME[:default])[:subtitle],
|
116
|
+
HEADER_SIZES.fetch(@size, HEADER_SIZES[:medium])[:subtitle],
|
117
|
+
HEADER_ALIGNMENTS.fetch(@align, HEADER_ALIGNMENTS[:left]),
|
118
|
+
"bui-header-subtitle-base"
|
121
119
|
].compact.join(" ")
|
122
120
|
end
|
123
121
|
|
124
122
|
# Genera le classi per il divisore
|
125
123
|
def divider_classes
|
126
124
|
[
|
127
|
-
"
|
128
|
-
|
129
|
-
VARIANTS.fetch(@variant, VARIANTS[:default])[:divider]
|
125
|
+
"bui-header-divider-base",
|
126
|
+
HEADER_THEME.fetch(@variant, HEADER_THEME[:default])[:divider]
|
130
127
|
].compact.join(" ")
|
131
128
|
end
|
132
129
|
|
133
130
|
# Genera le classi per il container
|
134
131
|
def container_classes
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
132
|
+
@with_divider ? "bui-header-container-with-divider" : "bui-header-container-base"
|
133
|
+
end
|
134
|
+
|
135
|
+
# Helper per determinare la dimensione dell'icona in base alla dimensione dell'heading
|
136
|
+
def get_icon_size
|
137
|
+
case @size
|
138
|
+
when :large
|
139
|
+
:medium
|
140
|
+
when :small
|
141
|
+
:xsmall
|
142
|
+
else
|
143
|
+
:small
|
144
|
+
end
|
139
145
|
end
|
140
146
|
end
|
141
147
|
end
|
@@ -1,2 +1,2 @@
|
|
1
1
|
<%# Template per l'icona %>
|
2
|
-
<i class="<%= combined_classes %>" aria-hidden="true"></i>
|
2
|
+
<i class="bui-icon-base <%= combined_classes %>" aria-hidden="true"></i>
|
@@ -2,28 +2,27 @@ module BetterUi
|
|
2
2
|
module General
|
3
3
|
class IconComponent < ViewComponent::Base
|
4
4
|
# Dimensioni disponibili
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
"2xl": "fa-2xl"
|
5
|
+
ICON_SIZES = {
|
6
|
+
xsmall: "bui-icon-xsmall",
|
7
|
+
small: "bui-icon-small",
|
8
|
+
medium: "bui-icon-medium",
|
9
|
+
large: "bui-icon-large",
|
10
|
+
xlarge: "bui-icon-xlarge"
|
12
11
|
}
|
13
12
|
|
14
13
|
# Stili disponibili
|
15
|
-
|
16
|
-
solid: "
|
17
|
-
regular: "
|
18
|
-
light: "
|
19
|
-
brands: "
|
20
|
-
duotone: "
|
14
|
+
ICON_STYLES = {
|
15
|
+
solid: "bui-icon-solid",
|
16
|
+
regular: "bui-icon-regular",
|
17
|
+
light: "bui-icon-light",
|
18
|
+
brands: "bui-icon-brands",
|
19
|
+
duotone: "bui-icon-duotone"
|
21
20
|
}
|
22
21
|
|
23
22
|
# Inizializzazione del componente
|
24
23
|
def initialize(
|
25
24
|
name:,
|
26
|
-
size: :
|
25
|
+
size: :medium,
|
27
26
|
style: :solid,
|
28
27
|
fixed_width: false,
|
29
28
|
spin: false,
|
@@ -47,39 +46,39 @@ module BetterUi
|
|
47
46
|
|
48
47
|
# Classe CSS per lo stile dell'icona
|
49
48
|
def style_class
|
50
|
-
|
49
|
+
ICON_STYLES[@style] || ICON_STYLES[:solid]
|
51
50
|
end
|
52
51
|
|
53
52
|
# Classe CSS per la dimensione
|
54
53
|
def size_class
|
55
|
-
|
54
|
+
ICON_SIZES[@size] || ICON_SIZES[:medium]
|
56
55
|
end
|
57
56
|
|
58
57
|
# Classe per rotazione
|
59
58
|
def rotation_class
|
60
59
|
return "" unless @rotation
|
61
|
-
"
|
60
|
+
"bui-icon-rotate-#{@rotation}"
|
62
61
|
end
|
63
62
|
|
64
63
|
# Classe per rovesciamento
|
65
64
|
def flip_class
|
66
65
|
return "" unless @flip
|
67
|
-
"
|
66
|
+
"bui-icon-flip-#{@flip}"
|
68
67
|
end
|
69
68
|
|
70
69
|
# Classi per animazioni
|
71
70
|
def animation_classes
|
72
71
|
classes = []
|
73
|
-
classes << "
|
74
|
-
classes << "
|
72
|
+
classes << "bui-icon-spin" if @spin
|
73
|
+
classes << "bui-icon-pulse" if @pulse
|
75
74
|
classes.join(" ")
|
76
75
|
end
|
77
76
|
|
78
77
|
# Classi per caratteristiche aggiuntive
|
79
78
|
def feature_classes
|
80
79
|
classes = []
|
81
|
-
classes << "
|
82
|
-
classes << "
|
80
|
+
classes << "bui-icon-fw" if @fixed_width
|
81
|
+
classes << "bui-icon-border" if @border
|
83
82
|
classes.join(" ")
|
84
83
|
end
|
85
84
|
|
@@ -87,7 +86,7 @@ module BetterUi
|
|
87
86
|
def combined_classes
|
88
87
|
[
|
89
88
|
style_class,
|
90
|
-
"fa-#{@name}",
|
89
|
+
"fa-#{@name}", # Questa classe deve rimanere specifica di Font Awesome
|
91
90
|
size_class,
|
92
91
|
rotation_class,
|
93
92
|
flip_class,
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<% if link? %>
|
2
|
+
<%= link_to href, **link_attributes do %>
|
3
|
+
<% if render_icon %>
|
4
|
+
<span class="bui-link-icon-wrapper"><%= render_icon %></span>
|
5
|
+
<% end %>
|
6
|
+
<span><%= label %></span>
|
7
|
+
<%= content if content.present? %>
|
8
|
+
<% end %>
|
9
|
+
<% else %>
|
10
|
+
<span class="<%= component_classes %>" <%= "aria-current='page'" if active? %>>
|
11
|
+
<% if render_icon %>
|
12
|
+
<span class="bui-link-icon-wrapper"><%= render_icon %></span>
|
13
|
+
<% end %>
|
14
|
+
<span><%= label %></span>
|
15
|
+
<%= content if content.present? %>
|
16
|
+
</span>
|
17
|
+
<% end %>
|