@@ -2,6 +2,8 @@ defmodule PetalComponents.SlideOver do
2
2
use Phoenix.Component
3
3
alias Phoenix.LiveView.JS
4
4
5
+ attr :id , :string , default: "slide-over"
6
+
5
7
attr ( :origin , :string ,
6
8
default: "right" ,
7
9
values: [ "left" , "right" , "top" , "bottom" ] ,
@@ -41,12 +43,12 @@ defmodule PetalComponents.SlideOver do
41
43
~H"""
42
44
< div
43
45
{ @ rest }
44
- phx-mounted = { ! @ hide && show_slide_over ( @ origin ) }
45
- phx-remove = { hide_slide_over ( @ origin , @ close_slide_over_target ) }
46
+ phx-mounted = { ! @ hide && show_slide_over ( @ origin , @ id ) }
47
+ phx-remove = { hide_slide_over ( @ origin , @ id , @ close_slide_over_target ) }
46
48
class = "hidden pc-slide-over "
47
- id = " slide-over "
49
+ id = { @ id }
48
50
>
49
- < div id = " slide-over- overlay " class = "hidden pc-slideover__overlay " aria-hidden = "true " > </ div >
51
+ < div id = { " #{ @ id } - overlay"} class = "hidden pc-slideover__overlay " aria-hidden = "true " > </ div >
50
52
51
53
< div
52
54
class = { [ "pc-slideover__wrapper" , get_margin_classes ( @ origin ) , @ class ] }
@@ -55,22 +57,26 @@ defmodule PetalComponents.SlideOver do
55
57
aria-modal = "true "
56
58
>
57
59
< div
58
- id = " slide-over- content "
60
+ id = { " #{ @ id } - content"}
59
61
class = { get_classes ( @ max_width , @ origin , @ class ) }
60
- phx-click-away = { @ close_on_click_away && hide_slide_over ( @ origin , @ close_slide_over_target ) }
61
- phx-window-keydown = { @ close_on_escape && hide_slide_over ( @ origin , @ close_slide_over_target ) }
62
+ phx-click-away = {
63
+ @ close_on_click_away && hide_slide_over ( @ origin , @ id , @ close_slide_over_target )
64
+ }
65
+ phx-window-keydown = {
66
+ @ close_on_escape && hide_slide_over ( @ origin , @ id , @ close_slide_over_target )
67
+ }
62
68
phx-key = "escape "
63
69
>
64
70
<!-- Header -->
65
71
< div class = "pc-slideover__header " >
66
72
< div class = "pc-slideover__header__container " >
67
- < div class = "pc-slideover__header__text " >
73
+ < div :if = { @ title } class = "pc-slideover__header__text " >
68
74
{ @ title }
69
75
</ div >
70
76
71
77
< button
72
78
type = "button "
73
- phx-click = { hide_slide_over ( @ origin , @ close_slide_over_target ) }
79
+ phx-click = { hide_slide_over ( @ origin , @ id , @ close_slide_over_target ) }
74
80
class = "pc-slideover__header__button "
75
81
>
76
82
< div class = "sr-only " > Close</ div >
@@ -90,43 +96,43 @@ defmodule PetalComponents.SlideOver do
90
96
"""
91
97
end
92
98
93
- def show_slide_over ( origin ) do
99
+ def show_slide_over ( origin , id \\ "slide-over" ) do
94
100
{ start_class , end_class } = get_transition_classes ( origin )
95
101
96
102
% JS { }
97
- |> JS . show ( to: "#slide-over " )
103
+ |> JS . show ( to: "##{ id } " )
98
104
|> JS . show (
99
- to: "#slide-over -overlay" ,
105
+ to: "##{ id } -overlay" ,
100
106
time: 300 ,
101
107
transition: { "transition-all transform ease-out duration-300" , "opacity-0" , "opacity-100" }
102
108
)
103
109
|> JS . show (
104
- to: "#slide-over -content" ,
110
+ to: "##{ id } -content" ,
105
111
time: 300 ,
106
112
transition: { "transition-all transform ease-out duration-300" , start_class , end_class }
107
113
)
108
114
|> JS . add_class ( "overflow-hidden" , to: "body" )
109
- |> JS . focus_first ( to: "#slide-over -content" )
115
+ |> JS . focus_first ( to: "##{ id } -content" )
110
116
end
111
117
112
118
# The live view that calls <.slide_over> will need to handle the "close_slide_over" event. eg:
113
119
# def handle_event("close_slide_over", _, socket) do
114
120
# {:noreply, push_patch(socket, to: Routes.moderate_users_path(socket, :index))}
115
121
# end
116
- def hide_slide_over ( origin , close_slide_over_target \\ nil ) do
122
+ def hide_slide_over ( origin , id \\ "slide-over" , close_slide_over_target \\ nil ) do
117
123
{ end_class , start_class } = get_transition_classes ( origin )
118
124
119
125
js =
120
126
JS . remove_class ( "overflow-hidden" , to: "body" )
121
127
|> JS . hide (
122
128
transition: { "ease-in duration-200" , "opacity-100" , "opacity-0" } ,
123
- to: "#slide-over -overlay"
129
+ to: "##{ id } -overlay"
124
130
)
125
131
|> JS . hide (
126
132
transition: { "ease-in duration-200" , start_class , end_class } ,
127
- to: "#slide-over -content"
133
+ to: "##{ id } -content"
128
134
)
129
- |> JS . hide ( to: "#slide-over " , transition: { "duration-200" , "" , "" } )
135
+ |> JS . hide ( to: "##{ id } " , transition: { "duration-200" , "" , "" } )
130
136
131
137
if close_slide_over_target do
132
138
JS . push ( js , "close_slide_over" , target: close_slide_over_target )
0 commit comments