@@ -12,6 +12,10 @@ defmodule AlgoraWeb.Components.UI.Button do
1212 """
1313 attr :type , :string , default: nil
1414 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
1519
1620 attr :variant , :string ,
1721 values: ~w( default secondary destructive outline ghost link) ,
@@ -23,24 +27,34 @@ defmodule AlgoraWeb.Components.UI.Button do
2327
2428 slot :inner_block , required: true
2529
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+ ] )
2840
2941 ~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 %>
4458 """
4559 end
4660
@@ -80,4 +94,8 @@ defmodule AlgoraWeb.Components.UI.Button do
8094
8195 Enum . map_join ( variants , " " , fn { key , value } -> @ variants [ key ] [ value ] end )
8296 end
97+
98+ defp link? ( assigns ) do
99+ Enum . any? ( [ assigns [ :href ] , assigns [ :navigate ] , assigns [ :patch ] ] )
100+ end
83101end
0 commit comments