Skip to content

Commit 8c4fbe1

Browse files
committed
Create Overlay component
1 parent cb3951d commit 8c4fbe1

2 files changed

Lines changed: 89 additions & 0 deletions

File tree

src/lib/components/Overlay.svelte

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<script lang="ts">
2+
import type { Snippet } from "svelte";
3+
4+
const { children, enabled }: { children?: Snippet; enabled?: boolean } = $props();
5+
</script>
6+
7+
<div class={["overlay", enabled && "enabled"]}>
8+
{@render children?.()}
9+
</div>
10+
11+
<style lang="scss">
12+
@use "$lib/styles/color.scss";
13+
@use "$lib/styles/mixin.scss";
14+
15+
$transition-settings: 100ms ease-in;
16+
17+
:global(*:has(> .overlay)) {
18+
// Parent element has to be relative for the absolute position to work
19+
position: relative;
20+
}
21+
22+
.overlay {
23+
position: absolute;
24+
top: 0;
25+
left: 0;
26+
bottom: 0;
27+
right: 0;
28+
// TODO: Elements in different places may need different background colors
29+
background-color: rgba(color.$black, 0.75);
30+
overflow: scroll;
31+
// TODO: Backdrop filter could be added to create better contrast between text
32+
opacity: 0;
33+
visibility: hidden;
34+
transition:
35+
opacity $transition-settings,
36+
visibility $transition-settings;
37+
38+
:global {
39+
@include mixin.remove-edge-child-margins();
40+
}
41+
42+
&.enabled {
43+
opacity: 1;
44+
visibility: visible;
45+
}
46+
}
47+
</style>

src/routes/experiments/+page.svelte

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
<script>
2+
import Overlay from "$lib/components/Overlay.svelte";
3+
4+
let overlayEnabled = $state(false);
5+
</script>
6+
17
<h1>Experiments</h1>
28
<p>This is where I experiment with designing components and elements.</p>
39

@@ -35,3 +41,39 @@
3541
<br />
3642
PDF file: <i class="fa-regular fa-file-pdf fa-bounce"></i>
3743
</p>
44+
45+
<h2>Overlays</h2>
46+
<div>
47+
<Overlay enabled={overlayEnabled}>
48+
<p>Cool, right?</p>
49+
<p>
50+
Ut efficitur hendrerit tellus at fermentum. Nullam lacinia nisi sed orci sagittis, quis varius
51+
ligula pulvinar. Suspendisse non turpis erat. Vivamus tristique nisi at urna tempus porta. Sed
52+
neque nisi, varius nec libero eget, viverra tincidunt neque. Vestibulum et mauris nulla. Class
53+
aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam
54+
consectetur, elit eu blandit ultricies, magna ante sollicitudin lectus, et consectetur ex nibh
55+
non tortor. Mauris molestie nulla in sapien semper vulputate. Praesent varius erat sit amet
56+
nulla commodo convallis. Maecenas dictum diam sit amet ornare pharetra. Cras at massa
57+
ullamcorper, venenatis arcu eget, posuere ex. Nulla sodales tortor eu elit lacinia iaculis.
58+
</p>
59+
</Overlay>
60+
<p>
61+
Overlays are essentially elements that you can put atop other elements to fully cover them. Try
62+
them out below!
63+
</p>
64+
<p>
65+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque aliquet, ante at lacinia
66+
vehicula, magna ipsum aliquam nisi, non vestibulum turpis dui a turpis. Vivamus dapibus leo at
67+
nisi sollicitudin, viverra aliquet ipsum ullamcorper. Etiam sit amet mollis odio. Etiam vel
68+
hendrerit nibh. Mauris feugiat vehicula augue. Etiam ante ante, maximus eget sem in, varius
69+
pulvinar odio. Nullam mi orci, semper eu augue in, ullamcorper finibus libero. In elementum orci
70+
ligula, id fringilla justo consectetur cursus.
71+
</p>
72+
</div>
73+
<fieldset>
74+
<legend>Overlay settings</legend>
75+
<label>
76+
Enabled
77+
<input type="checkbox" bind:checked={overlayEnabled} />
78+
</label>
79+
</fieldset>

0 commit comments

Comments
 (0)