File tree Expand file tree Collapse file tree 4 files changed +33
-3
lines changed Expand file tree Collapse file tree 4 files changed +33
-3
lines changed Original file line number Diff line number Diff line change @@ -15,7 +15,7 @@ def default_attrs
15
15
data : {
16
16
state : :open
17
17
} ,
18
- class : "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-background p-1 text-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 w-56"
18
+ class : "relative z-50 min-w-[8rem] overflow-hidden rounded-md border bg-background p-1 text-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 w-56"
19
19
}
20
20
end
21
21
end
Original file line number Diff line number Diff line change @@ -2,7 +2,7 @@ import { Controller } from "@hotwired/stimulus";
2
2
import { computePosition , flip , shift , offset } from "@floating-ui/dom" ;
3
3
4
4
export default class extends Controller {
5
- static targets = [ "trigger" , "content" , "menuItem" ] ;
5
+ static targets = [ "trigger" , "content" , "menuItem" , "overlay" ] ;
6
6
static values = {
7
7
open : {
8
8
type : Boolean ,
@@ -33,7 +33,7 @@ export default class extends Controller {
33
33
34
34
onClickOutside ( event ) {
35
35
if ( ! this . openValue ) return ;
36
- if ( this . element . contains ( event . target ) ) return ;
36
+ if ( this . element . contains ( event . target ) && ( ! this . hasOverlayTarget || event . target !== this . overlayTarget ) ) return ;
37
37
38
38
event . preventDefault ( ) ;
39
39
this . close ( ) ;
@@ -49,12 +49,20 @@ export default class extends Controller {
49
49
this . #addEventListeners( ) ;
50
50
this . #computeTooltip( )
51
51
this . contentTarget . classList . remove ( "hidden" ) ;
52
+
53
+ if ( this . hasOverlayTarget ) {
54
+ this . overlayTarget . classList . remove ( "hidden" ) ;
55
+ }
52
56
}
53
57
54
58
close ( ) {
55
59
this . openValue = false ;
56
60
this . #removeEventListeners( ) ;
57
61
this . contentTarget . classList . add ( "hidden" ) ;
62
+
63
+ if ( this . hasOverlayTarget ) {
64
+ this . overlayTarget . classList . add ( "hidden" ) ;
65
+ }
58
66
}
59
67
60
68
#handleKeydown( e ) {
Original file line number Diff line number Diff line change
1
+ # frozen_string_literal: true
2
+
3
+ module RubyUI
4
+ class DropdownMenuOverlay < Base
5
+ def view_template
6
+ div ( **attrs )
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ data : {
14
+ ruby_ui__dropdown_menu_target : "overlay" ,
15
+ action : "click->ruby-ui--dropdown-menu#onClickOutside"
16
+ } ,
17
+ class : "absolute fixed inset-0 z-40 bg-black opacity-20 hidden"
18
+ }
19
+ end
20
+ end
21
+ end
Original file line number Diff line number Diff line change @@ -6,6 +6,7 @@ class RubyUI::DropdownMenuTest < ComponentTest
6
6
def test_render_with_all_items
7
7
output = phlex do
8
8
RubyUI . DropdownMenu do
9
+ RubyUI ::DropdownMenuOverlay ( )
9
10
RubyUI . DropdownMenuTrigger ( class : "w-full" ) do
10
11
RubyUI . Button ( variant : :outline ) { "Open" }
11
12
end
You can’t perform that action at this time.
0 commit comments