Skip to content

Commit b7d50f9

Browse files
committed
Extracted dropdown params to allow closing it when clicking inside buttons
1 parent e77ff6b commit b7d50f9

File tree

4 files changed

+55
-19
lines changed

4 files changed

+55
-19
lines changed

docs/DROPDOWN.md

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,34 @@ import { Dropdown } from "@mpiorowski/svelte-init";
1111
```
1212
<script lang="ts">
1313
import { Button, Dropdown } from "@mpiorowski/svelte-init";
14+
15+
let isOpen = false;
1416
</script>
1517
16-
<Dropdown position="left">
18+
<Dropdown
19+
position="left"
20+
{isOpen}
21+
onClickOutside={() => {
22+
isOpen = false;
23+
}}
24+
>
1725
<svelte:fragment slot="button">
1826
<Button type="ghost">Dropdown</Button>
1927
</svelte:fragment>
2028
<svelte:fragment slot="content">
21-
<div>
22-
23-
24-
</div>
29+
<button
30+
on:click={() => {
31+
isOpen = false;
32+
}}
33+
>
34+
35+
</button>
2536
</svelte:fragment>
2637
</Dropdown>
2738
```
2839

29-
| Prop | Values | Default |
30-
| -------- | ------------------------- | ------- |
31-
| position | `left`, `right`, `center` | right |
40+
| Prop | Values | Default |
41+
| -------------- | ------------------------- | --------- |
42+
| isOpen | `boolean` | |
43+
| onClickOutside | () => void | undefined |
44+
| position | `left`, `right`, `center` | right |

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
},
1616
"homepage": "https://svelte-init.vercel.app",
1717
"license": "MIT",
18-
"version": "1.5.6",
18+
"version": "1.6.0",
1919
"type": "module",
2020
"scripts": {
2121
"start": "vite dev",

src/lib/components/dropdown.svelte

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,15 @@
44
import { fade } from 'svelte/transition';
55
66
export let position: 'left' | 'right' | 'center' = 'right';
7-
export let isOpen = false;
7+
export let isOpen: boolean;
8+
export let onClickOutside: () => void = () => {
9+
return;
10+
};
811
</script>
912

1013
<!-- Dropdown button -->
11-
<div use:useClickOutside={() => (isOpen = false)} class="dropdown">
12-
<div
13-
class="dropdown-btn"
14-
on:click={() => (isOpen = !isOpen)}
15-
on:keypress={() => (isOpen = !isOpen)}
16-
>
14+
<div use:useClickOutside={onClickOutside} class="dropdown">
15+
<div class="dropdown-btn">
1716
<slot name="button" />
1817
</div>
1918
<!-- Dropdown content -->

src/routes/dropdown/+page.svelte

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,44 @@
1414
];
1515
1616
let group: 'left' | 'right' = 'left';
17+
let isOpen = false;
1718
</script>
1819

1920
<div in:fade class="content">
2021
<h1>Dropdown</h1>
2122
<CheckboxGroup values={position} type="radio" bind:group />
2223

23-
<Dropdown position={group}>
24+
<Dropdown
25+
position={group}
26+
{isOpen}
27+
onClickOutside={() => {
28+
isOpen = false;
29+
}}
30+
>
2431
<svelte:fragment slot="button">
25-
<Button type="ghost">Dropdown</Button>
32+
<Button
33+
type="ghost"
34+
on:click={() => {
35+
isOpen = !isOpen;
36+
}}
37+
>
38+
Dropdown
39+
</Button>
2640
</svelte:fragment>
2741
<svelte:fragment slot="content">
2842
<div>
2943
<div class="email">[email protected]</div>
30-
<div class="logout">Logout</div>
44+
<div
45+
on:click={() => {
46+
isOpen = false;
47+
}}
48+
on:keypress={() => {
49+
isOpen = false;
50+
}}
51+
class="logout"
52+
>
53+
Logout
54+
</div>
3155
</div>
3256
</svelte:fragment>
3357
</Dropdown>

0 commit comments

Comments
 (0)