@@ -66,117 +66,115 @@ class ClickState {
66
66
private readonly options : UseClickOptions = { } ,
67
67
) { }
68
68
69
- get reference ( ) {
70
- if ( ! this . #enabled) {
71
- return { } ;
69
+ #onmousedown = ( event : MouseEvent ) => {
70
+ if ( event . button !== 0 ) return ;
71
+ if ( isMouseLikePointerType ( this . #pointerType, true ) && this . #ignoreMouse) {
72
+ return ;
72
73
}
74
+
75
+ if ( this . #eventOption === "click" ) return ;
76
+
77
+ if (
78
+ this . context . open &&
79
+ this . #toggle &&
80
+ ( this . context . data . openEvent
81
+ ? this . context . data . openEvent . type === "mousedown"
82
+ : true )
83
+ ) {
84
+ this . context . onOpenChange ( false , event , "click" ) ;
85
+ } else {
86
+ // Prevent stealing focus from the floating element
87
+ event . preventDefault ( ) ;
88
+ this . context . onOpenChange ( true , event , "click" ) ;
89
+ }
90
+ } ;
91
+
92
+ #onpointerdown = ( event : PointerEvent ) => {
93
+ this . #pointerType = event . pointerType ;
94
+ } ;
95
+
96
+ #onclick = ( event : MouseEvent ) => {
97
+ if ( this . #eventOption === "mousedown" && this . #pointerType) {
98
+ this . #pointerType = undefined ;
99
+ return ;
100
+ }
101
+
102
+ if ( isMouseLikePointerType ( this . #pointerType, true ) && this . #ignoreMouse) {
103
+ return ;
104
+ }
105
+
106
+ if (
107
+ this . context . open &&
108
+ this . #toggle &&
109
+ ( this . context . data . openEvent
110
+ ? this . context . data . openEvent . type === "click"
111
+ : true )
112
+ ) {
113
+ this . context . onOpenChange ( false , event , "click" ) ;
114
+ } else {
115
+ this . context . onOpenChange ( true , event , "click" ) ;
116
+ }
117
+ } ;
118
+
119
+ #onkeydown = ( event : KeyboardEvent ) => {
120
+ this . #pointerType = undefined ;
121
+
122
+ if (
123
+ event . defaultPrevented ||
124
+ ! this . #keyboardHandlers ||
125
+ isButtonTarget ( event )
126
+ ) {
127
+ return ;
128
+ }
129
+
130
+ if (
131
+ event . key === " " &&
132
+ ! isSpaceIgnored ( this . context . elements . domReference )
133
+ ) {
134
+ // Prevent scrolling
135
+ event . preventDefault ( ) ;
136
+ this . #didKeyDown = true ;
137
+ }
138
+
139
+ if ( event . key === "Enter" ) {
140
+ if ( this . context . open && this . #toggle) {
141
+ this . context . onOpenChange ( false , event , "click" ) ;
142
+ } else {
143
+ this . context . onOpenChange ( true , event , "click" ) ;
144
+ }
145
+ }
146
+ } ;
147
+
148
+ #onkeyup = ( event : KeyboardEvent ) => {
149
+ if (
150
+ event . defaultPrevented ||
151
+ ! this . #keyboardHandlers ||
152
+ isButtonTarget ( event ) ||
153
+ isSpaceIgnored ( this . context . elements . domReference )
154
+ ) {
155
+ return ;
156
+ }
157
+
158
+ if ( event . key === " " && this . #didKeyDown) {
159
+ this . #didKeyDown = false ;
160
+ if ( this . context . open && this . #toggle) {
161
+ this . context . onOpenChange ( false , event , "click" ) ;
162
+ } else {
163
+ this . context . onOpenChange ( true , event , "click" ) ;
164
+ }
165
+ }
166
+ } ;
167
+
168
+ readonly reference = $derived . by ( ( ) => {
169
+ if ( ! this . #enabled) return { } ;
73
170
return {
74
- onpointerdown : ( event : PointerEvent ) => {
75
- this . #pointerType = event . pointerType ;
76
- } ,
77
- onmousedown : ( event : MouseEvent ) => {
78
- if ( event . button !== 0 ) {
79
- return ;
80
- }
81
-
82
- if (
83
- isMouseLikePointerType ( this . #pointerType, true ) &&
84
- this . #ignoreMouse
85
- ) {
86
- return ;
87
- }
88
-
89
- if ( this . #eventOption === "click" ) {
90
- return ;
91
- }
92
-
93
- if (
94
- this . context . open &&
95
- this . #toggle &&
96
- ( this . context . data . openEvent
97
- ? this . context . data . openEvent . type === "mousedown"
98
- : true )
99
- ) {
100
- this . context . onOpenChange ( false , event , "click" ) ;
101
- } else {
102
- // Prevent stealing focus from the floating element
103
- event . preventDefault ( ) ;
104
- this . context . onOpenChange ( true , event , "click" ) ;
105
- }
106
- } ,
107
- onclick : ( event : MouseEvent ) => {
108
- if ( this . #eventOption === "mousedown" && this . #pointerType) {
109
- this . #pointerType = undefined ;
110
- return ;
111
- }
112
-
113
- if (
114
- isMouseLikePointerType ( this . #pointerType, true ) &&
115
- this . #ignoreMouse
116
- ) {
117
- return ;
118
- }
119
-
120
- if (
121
- this . context . open &&
122
- this . #toggle &&
123
- ( this . context . data . openEvent
124
- ? this . context . data . openEvent . type === "click"
125
- : true )
126
- ) {
127
- this . context . onOpenChange ( false , event , "click" ) ;
128
- } else {
129
- this . context . onOpenChange ( true , event , "click" ) ;
130
- }
131
- } ,
132
- onkeydown : ( event : KeyboardEvent ) => {
133
- this . #pointerType = undefined ;
134
-
135
- if (
136
- event . defaultPrevented ||
137
- ! this . #keyboardHandlers ||
138
- isButtonTarget ( event )
139
- ) {
140
- return ;
141
- }
142
- if (
143
- event . key === " " &&
144
- ! isSpaceIgnored ( this . context . elements . reference )
145
- ) {
146
- // Prevent scrolling
147
- event . preventDefault ( ) ;
148
- this . #didKeyDown = true ;
149
- }
150
-
151
- if ( event . key === "Enter" ) {
152
- if ( this . context . open && this . #toggle) {
153
- this . context . onOpenChange ( false , event , "click" ) ;
154
- } else {
155
- this . context . onOpenChange ( true , event , "click" ) ;
156
- }
157
- }
158
- } ,
159
- onkeyup : ( event : KeyboardEvent ) => {
160
- if (
161
- event . defaultPrevented ||
162
- ! this . #keyboardHandlers ||
163
- isButtonTarget ( event ) ||
164
- isSpaceIgnored ( this . context . elements . reference )
165
- ) {
166
- return ;
167
- }
168
-
169
- if ( event . key === " " && this . #didKeyDown) {
170
- this . #didKeyDown = false ;
171
- if ( this . context . open && this . #toggle) {
172
- this . context . onOpenChange ( false , event , "click" ) ;
173
- } else {
174
- this . context . onOpenChange ( true , event , "click" ) ;
175
- }
176
- }
177
- } ,
171
+ onpointerdown : this . #onpointerdown,
172
+ onmousedown : this . #onmousedown,
173
+ onclick : this . #onclick,
174
+ onkeydown : this . #onkeydown,
175
+ onkeyup : this . #onkeyup,
178
176
} ;
179
- }
177
+ } ) ;
180
178
}
181
179
182
180
function useClick ( context : FloatingContext , options : UseClickOptions = { } ) {
0 commit comments