Skip to content

Commit 1a18dde

Browse files
authored
Merge pull request #62 from aquaductape/dismiss-dropdowns
Dismiss dropdowns
2 parents 3619dfd + 38afd40 commit 1a18dde

File tree

5 files changed

+33
-88
lines changed

5 files changed

+33
-88
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
"prettier": "^2.4.1",
5454
"register-service-worker": "^1.7.2",
5555
"rollup": "^2.58.0",
56+
"solid-dismiss": "^1.0.11",
5657
"solid-js": "1.1.5"
5758
}
5859
}

playground/components/header.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { processImport, Tab } from '../../src';
1515
import { exportToCsb } from '../utils/exportToCsb';
1616
import { exportToJSON } from '../utils/exportToJson';
1717
import { ZoomDropdown } from './zoomDropdown';
18+
import Dismiss from 'solid-dismiss';
1819

1920
export const Header: Component<{
2021
dark: boolean;
@@ -28,6 +29,7 @@ export const Header: Component<{
2829
}> = (props) => {
2930
const [copy, setCopy] = createSignal(false);
3031
const [showMenu, setShowMenu] = createSignal(false);
32+
let menuBtnEl!: HTMLButtonElement;
3133

3234
window.addEventListener('resize', closeMobileMenu);
3335
onCleanup(() => {
@@ -82,9 +84,13 @@ export const Header: Component<{
8284
<span class="inline-block -mb-1">Solid Playground</span>
8385
</h1>
8486
<div class="flex items-center space-x-2">
85-
<div
86-
classList={{ 'absolute top-[53px] right-[10px] w-[fit-content]': showMenu() }}
87+
<Dismiss
8788
class="z-10"
89+
classList={{ 'absolute top-[53px] right-[10px] w-[fit-content]': showMenu() }}
90+
menuButton={() => menuBtnEl}
91+
open={showMenu}
92+
setOpen={setShowMenu}
93+
show
8894
>
8995
<div
9096
class="md:items-center md:space-x-2 md:flex md:flex-row text-black dark:text-white"
@@ -175,7 +181,7 @@ export const Header: Component<{
175181
</button>
176182
<ZoomDropdown showMenu={showMenu()} />
177183
</div>
178-
</div>
184+
</Dismiss>
179185
<button
180186
type="button"
181187
id="menu-btn"
@@ -184,7 +190,7 @@ export const Header: Component<{
184190
}}
185191
class="z-40 px-3 py-2 focus:outline-none focus:ring-1 rounded text-white opacity-80 hover:opacity-100 visible relative md:hidden m-0 mr-[10px]"
186192
title="Mobile Menu Button"
187-
onClick={() => setShowMenu(!showMenu())}
193+
ref={menuBtnEl}
188194
>
189195
<Show when={showMenu()} fallback={<Icon path={menu} class="h-6 w-6" />}>
190196
<Icon path={xCircle} class="h-[22px] w-[22px]" /* adjusted to account for border */ />

playground/components/zoomDropdown.tsx

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { Icon } from '@amoutonbrady/solid-heroicons';
22
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';
55
import useZoom from '../../src/hooks/useZoom';
66

77
export const ZoomDropdown: Component<{ showMenu: boolean }> = (props) => {
8-
const [[toggle, setToggle], { onFOBlur, onFOClick, onFOFocus }] = useFocusOut();
8+
const [open, setOpen] = createSignal(false);
99
const { zoomState, updateZoomScale, updateZoomSettings } = useZoom();
1010
const popupDuration = 1250;
1111
let containerEl!: HTMLDivElement;
@@ -21,10 +21,11 @@ export const ZoomDropdown: Component<{ showMenu: boolean }> = (props) => {
2121
};
2222

2323
const onKeyDownContainer = (e: KeyboardEvent) => {
24-
if (!toggle()) return;
24+
if (!open()) return;
2525

2626
if (e.key === 'Escape' && !stealFocus) {
2727
if (prevFocusedEl) {
28+
setOpen(false);
2829
prevFocusedEl.focus();
2930
stealFocus = true;
3031
}
@@ -47,12 +48,12 @@ export const ZoomDropdown: Component<{ showMenu: boolean }> = (props) => {
4748
stealFocus = false;
4849
}
4950

50-
setToggle(true);
51+
setOpen(true);
5152

5253
window.clearTimeout(timeoutId!);
5354

5455
timeoutId = setTimeout(() => {
55-
setToggle(false);
56+
setOpen(false);
5657

5758
stealFocus = true;
5859
if (prevFocusedEl) {
@@ -62,7 +63,7 @@ export const ZoomDropdown: Component<{ showMenu: boolean }> = (props) => {
6263
});
6364

6465
createEffect(() => {
65-
if (!toggle()) {
66+
if (!open()) {
6667
if (containerEl) {
6768
containerEl.removeEventListener('mousemove', onMouseMove);
6869
}
@@ -77,8 +78,6 @@ export const ZoomDropdown: Component<{ showMenu: boolean }> = (props) => {
7778
return (
7879
<div
7980
class="relative"
80-
onFocusIn={onFOFocus}
81-
onFocusOut={onFOBlur}
8281
onKeyDown={onKeyDownContainer}
8382
onClick={() => {
8483
window.clearTimeout(timeoutId!);
@@ -90,19 +89,18 @@ export const ZoomDropdown: Component<{ showMenu: boolean }> = (props) => {
9089
type="button"
9190
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"
9291
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,
9594
'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':
9695
props.showMenu,
9796
}}
98-
onClick={onFOClick}
9997
title="Scale editor to make text larger or smaller"
10098
ref={btnEl}
10199
>
102100
<Icon class="h-6" path={zoomIn} />
103101
<span class="text-xs md:sr-only">Scale Editor</span>
104102
</button>
105-
<Show when={toggle()}>
103+
<Dismiss menuButton={btnEl} open={open} setOpen={setOpen}>
106104
<div
107105
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"
108106
classList={{
@@ -156,7 +154,7 @@ export const ZoomDropdown: Component<{ showMenu: boolean }> = (props) => {
156154
</label>
157155
</div>
158156
</div>
159-
</Show>
157+
</Dismiss>
160158
</div>
161159
);
162160
};

pnpm-lock.yaml

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/hooks/useFocusOut.ts

Lines changed: 0 additions & 70 deletions
This file was deleted.

0 commit comments

Comments
 (0)