@@ -12,6 +12,10 @@ defmodule AlgoraWeb.Components.UI.Button do
12
12
"""
13
13
attr :type , :string , default: nil
14
14
attr :class , :string , default: nil
15
+ attr :href , :string , default: nil
16
+ attr :navigate , :string , default: nil
17
+ attr :patch , :string , default: nil
18
+ attr :replace , :boolean , default: false
15
19
16
20
attr :variant , :string ,
17
21
values: ~w( default secondary destructive outline ghost link) ,
@@ -23,24 +27,34 @@ defmodule AlgoraWeb.Components.UI.Button do
23
27
24
28
slot :inner_block , required: true
25
29
26
- def ( button ( assigns ) ) do
27
- assigns = assign ( assigns , :variant_class , variant ( assigns ) )
30
+ def button ( assigns ) do
31
+ assigns =
32
+ assigns
33
+ |> assign ( :is_link , link? ( assigns ) )
34
+ |> assign ( :common_classes , [
35
+ "disabled:opacity-75 phx-submit-loading:opacity-75" ,
36
+ "inline-flex items-center justify-center whitespace-nowrap rounded-lg text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50" ,
37
+ variant ( assigns ) ,
38
+ assigns . class
39
+ ] )
28
40
29
41
~H"""
30
- < button
31
- type = { @ type }
32
- class = {
33
- classes ( [
34
- "disabled:opacity-75 phx-submit-loading:opacity-75" ,
35
- "inline-flex items-center justify-center whitespace-nowrap rounded-lg text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50" ,
36
- @ variant_class ,
37
- @ class
38
- ] )
39
- }
40
- { @ rest }
41
- >
42
- { render_slot ( @ inner_block ) }
43
- </ button >
42
+ <%= if @ is_link do %>
43
+ < . link
44
+ href = { @ href }
45
+ navigate = { @ navigate }
46
+ patch = { @ patch }
47
+ replace = { @ replace }
48
+ class = { classes ( @ common_classes ) }
49
+ { @ rest }
50
+ >
51
+ { render_slot ( @ inner_block ) }
52
+ </ . link >
53
+ <% else %>
54
+ < button type = { @ type } class = { classes ( @ common_classes ) } { @ rest } >
55
+ { render_slot ( @ inner_block ) }
56
+ </ button >
57
+ <% end %>
44
58
"""
45
59
end
46
60
@@ -80,4 +94,8 @@ defmodule AlgoraWeb.Components.UI.Button do
80
94
81
95
Enum . map_join ( variants , " " , fn { key , value } -> @ variants [ key ] [ value ] end )
82
96
end
97
+
98
+ defp link? ( assigns ) do
99
+ Enum . any? ( [ assigns [ :href ] , assigns [ :navigate ] , assigns [ :patch ] ] )
100
+ end
83
101
end
0 commit comments