aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Dropdown.svelte
blob: efbafa1a87eff45d0c0c05e58220d4aa3e0982ca (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<script lang="ts">
	interface Item {
		name: string;
		url: string;
	}

	export let items: Item[] = [];
	export let title: string;

	let open = false;

	const handleClickOutside = (event: any) => {
		if (!event.target.closest('.dropdown')) open = false;
	};
</script>

<svelte:window on:click={handleClickOutside} />

<div class="dropdown" id="dropdown">
	<span
		class="header-item dropdown-toggle"
		id="dropdown-toggle"
		on:click|preventDefault={() => (open = !open)}
		on:keydown={() => {}}
		role="button"
		tabindex="0"
	>
		{title}
	</span>

	<div class={`dropdown-content card card-small ${open ? 'dropdown-open' : ''}`}>
		{#each items as item}
			<a href={item.url} class="header-item">
				{item.name}
			</a>
		{/each}
	</div>
</div>

<style lang="scss">
	a {
		color: var(--base06);
	}

	.header-item {
		margin: 0 0.5rem;
	}

	.header-item:hover {
		text-decoration: none;
	}

	.header-item:active {
		outline: none;
	}

	.dropdown {
		position: relative;
		display: inline-block;
	}

	.dropdown-content {
		display: block;
		position: absolute;
		min-width: max-content;
		padding: 0.5em 0;
		opacity: 0;
		transform: translateY(-20px);
		visibility: hidden;
		$delay: 0.25s;
		transition: opacity $delay ease, transform $delay ease, visibility 0s linear $delay;
		left: 50%;
		transform: translateX(-50%);
	}

	.dropdown-open {
		opacity: 1;
		transform: translateY(0);
		visibility: visible;
		transition-delay: 0s, 0s, 0s;
		left: 50%;
		transform: translateX(-50%);
	}

	.dropdown:hover .dropdown-content {
		opacity: 1;
		transform: translateY(0);
		visibility: visible;
		transition-delay: 0s, 0s, 0s;
		left: 50%;
		transform: translateX(-50%);
	}

	.dropdown-content a {
		padding: 0.5em 0.75em;
		text-decoration: none;
		display: block;
	}

	.dropdown-content a:hover {
		border-radius: 8px;
		backdrop-filter: blur(160px);
		background-color: var(--base01);
	}
</style>