1
1
import { Icon } from '@amoutonbrady/solid-heroicons' ;
2
2
import { zoomIn } from '@amoutonbrady/solid-heroicons/outline' ;
3
- import { Component , createSignal , Show , createEffect } from 'solid-js ' ;
4
- import useFocusOut from '../../src/hooks/useFocusOut ' ;
3
+ import Dismiss from 'solid-dismiss ' ;
4
+ import { Component , createSignal , createEffect } from 'solid-js ' ;
5
5
import useZoom from '../../src/hooks/useZoom' ;
6
6
7
7
export const ZoomDropdown : Component < { showMenu : boolean } > = ( props ) => {
8
- const [ [ toggle , setToggle ] , { onFOBlur , onFOClick , onFOFocus } ] = useFocusOut ( ) ;
8
+ const [ open , setOpen ] = createSignal ( false ) ;
9
9
const { zoomState, updateZoomScale, updateZoomSettings } = useZoom ( ) ;
10
10
const popupDuration = 1250 ;
11
11
let containerEl ! : HTMLDivElement ;
@@ -21,10 +21,11 @@ export const ZoomDropdown: Component<{ showMenu: boolean }> = (props) => {
21
21
} ;
22
22
23
23
const onKeyDownContainer = ( e : KeyboardEvent ) => {
24
- if ( ! toggle ( ) ) return ;
24
+ if ( ! open ( ) ) return ;
25
25
26
26
if ( e . key === 'Escape' && ! stealFocus ) {
27
27
if ( prevFocusedEl ) {
28
+ setOpen ( false ) ;
28
29
prevFocusedEl . focus ( ) ;
29
30
stealFocus = true ;
30
31
}
@@ -47,12 +48,12 @@ export const ZoomDropdown: Component<{ showMenu: boolean }> = (props) => {
47
48
stealFocus = false ;
48
49
}
49
50
50
- setToggle ( true ) ;
51
+ setOpen ( true ) ;
51
52
52
53
window . clearTimeout ( timeoutId ! ) ;
53
54
54
55
timeoutId = setTimeout ( ( ) => {
55
- setToggle ( false ) ;
56
+ setOpen ( false ) ;
56
57
57
58
stealFocus = true ;
58
59
if ( prevFocusedEl ) {
@@ -62,7 +63,7 @@ export const ZoomDropdown: Component<{ showMenu: boolean }> = (props) => {
62
63
} ) ;
63
64
64
65
createEffect ( ( ) => {
65
- if ( ! toggle ( ) ) {
66
+ if ( ! open ( ) ) {
66
67
if ( containerEl ) {
67
68
containerEl . removeEventListener ( 'mousemove' , onMouseMove ) ;
68
69
}
@@ -77,8 +78,6 @@ export const ZoomDropdown: Component<{ showMenu: boolean }> = (props) => {
77
78
return (
78
79
< div
79
80
class = "relative"
80
- onFocusIn = { onFOFocus }
81
- onFocusOut = { onFOBlur }
82
81
onKeyDown = { onKeyDownContainer }
83
82
onClick = { ( ) => {
84
83
window . clearTimeout ( timeoutId ! ) ;
@@ -90,19 +89,18 @@ export const ZoomDropdown: Component<{ showMenu: boolean }> = (props) => {
90
89
type = "button"
91
90
class = "dark:text-white md:text-white flex flex-row space-x-2 items-center w-full md:px-3 px-2 py-2 focus:ring-1 rounded opacity-80 hover:opacity-100"
92
91
classList = { {
93
- 'bg-gray-900' : toggle ( ) && ! props . showMenu ,
94
- 'bg-gray-300 dark:text-black' : toggle ( ) && props . showMenu ,
92
+ 'bg-gray-900' : open ( ) && ! props . showMenu ,
93
+ 'bg-gray-300 dark:text-black' : open ( ) && props . showMenu ,
95
94
'rounded-none active:bg-gray-300 hover:bg-gray-300 dark:hover:text-black focus:outline-none focus:highlight-none active:highlight-none focus:ring-0 active:outline-none' :
96
95
props . showMenu ,
97
96
} }
98
- onClick = { onFOClick }
99
97
title = "Scale editor to make text larger or smaller"
100
98
ref = { btnEl }
101
99
>
102
100
< Icon class = "h-6" path = { zoomIn } />
103
101
< span class = "text-xs md:sr-only" > Scale Editor</ span >
104
102
</ button >
105
- < Show when = { toggle ( ) } >
103
+ < Dismiss menuButton = { btnEl } open = { open } setOpen = { setOpen } >
106
104
< div
107
105
class = "absolute top-full left-1/2 bg-white dark:bg-gray-700 text-brand-default border border-gray-900 rounded shadow p-6 -translate-x-1/2 z-10"
108
106
classList = { {
@@ -156,7 +154,7 @@ export const ZoomDropdown: Component<{ showMenu: boolean }> = (props) => {
156
154
</ label >
157
155
</ div >
158
156
</ div >
159
- </ Show >
157
+ </ Dismiss >
160
158
</ div >
161
159
) ;
162
160
} ;
0 commit comments