blob: 547eae88ff2c2e5ec2d3b2c28da59b7c10991321 [file] [log] [blame]
Skyler Grey51e9e632023-06-03 10:20:11 +02001<script lang="ts">
2 import Button from '$components/ui/button/Button.svelte';
3 import Input from '$components/ui/input/Input.svelte';
4 import { onMount } from 'svelte';
5 import { flip } from 'svelte/animate';
6 import { fade } from 'svelte/transition';
7
8 export let form;
9
10 let messageInput: HTMLInputElement;
11 function focusMessageInput() {
12 messageInput.focus();
13 }
14
15 let systemMessage =
16 'Welcome to the void. Everything you put here is completely private. Messages will fade as they go up the page and disappear after a few minutes, or you can refresh the page to clear them too. Let out your frustrations and watch them slip away into the void...';
17 const resetMessage =
18 "Poof: it's gone; hopefully you feel a little better after letting your frustrations out. If there's something you still need to vent about feel free to continue. I'm still here to listen...";
19 let messages: string[] = [];
20 let currentlyTyped: string = '';
21
22 if (form?.pastMessages) {
23 messages = form?.pastMessages.toString().split('\n');
24 }
25
26 if (form?.message) {
27 messages.push(form?.message.toString());
28 }
29
30 if (form?.reset) {
31 systemMessage = resetMessage;
32 }
33
34 onMount(focusMessageInput);
35</script>
36
Skyler Greyf9eaa5f2023-06-03 12:45:39 +020037<svelte:head>
38 <title>The void</title>
39 <meta name="description" content="Have worries or frustrations? Let them out into the void" />
40 <meta property="og:title" content="The void" />
41 <meta property="og:description" content="Have worries or frustrations? Let them out into the void" />
42 <meta property="og:type" content="website" />
Skyler Greyf9eaa5f2023-06-03 12:45:39 +020043 <meta name="theme-color" content="#030711" />
Skyler Greybcfdf6f2023-06-03 14:24:08 +020044 <meta name="keywords" content="void, vent, stress" />
Skyler Greyf9eaa5f2023-06-03 12:45:39 +020045</svelte:head>
46
Skyler Grey51e9e632023-06-03 10:20:11 +020047<form
48 on:submit|preventDefault={() => {
Skyler Greyb69f5142023-06-03 13:18:38 +020049 if (currentlyTyped) {
50 messages.push(currentlyTyped);
51 messages = messages;
52 currentlyTyped = '';
53 }
Skyler Grey51e9e632023-06-03 10:20:11 +020054 focusMessageInput();
55 }}
56 method="post"
Skyler Grey57bcb4a2023-06-03 12:54:24 +020057 class="p-2 flex flex-col h-full gap-2 justify-end pt-0"
Skyler Grey51e9e632023-06-03 10:20:11 +020058>
Skyler Grey4c4e11f2023-06-03 14:11:29 +020059 <div class="flex p-2 pt-0 flex-col justify-end w-full pastMessages">
Skyler Grey51e9e632023-06-03 10:20:11 +020060 {#each (messages.length === 0 ? [systemMessage] : ['']).concat(messages) as message, index (`${index} ${message}`)}
61 <p class:message="{index !== 0}" transition:fade={{ duration: 100 }} animate:flip={{ duration: 100 }}>
Skyler Greybcfdf6f2023-06-03 14:24:08 +020062 <span class="message">{message}</span>
Skyler Grey51e9e632023-06-03 10:20:11 +020063 </p>
64 {/each}
65 <input type="hidden" value={messages.join('\n')} name="pastMessages" />
66 </div>
67
Skyler Grey350697b2023-06-03 13:04:05 +020068 <div class="flex w-full gap-2 z-10">
Skyler Grey51e9e632023-06-03 10:20:11 +020069 <Input
70 bind:element={messageInput}
71 bind:value={currentlyTyped}
72 name="message"
73 placeholder="Write down your worries, and let them slip into the void"
74 />
75 <Button type="submit">Send</Button>
76 <Button
77 name="reset"
78 value="reset"
79 on:click={() => {
80 currentlyTyped = '';
81 systemMessage = resetMessage;
Skyler Greybf73c0b2023-06-03 13:10:05 +020082 messages = [];
Skyler Greyb69f5142023-06-03 13:18:38 +020083 focusMessageInput();
Skyler Grey51e9e632023-06-03 10:20:11 +020084 }}>Clean</Button
85 >
86 </div>
87</form>
88
89<style lang="postcss">
90 div.pastMessages::after {
91 content: '';
92 position: absolute;
93 top: 0;
94 left: 0;
95 z-index: 1;
96 width: 100%;
97 height: 100%;
98 background: linear-gradient(0deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 100%);
Skyler Grey4c4e11f2023-06-03 14:11:29 +020099 pointer-events: none;
Skyler Grey51e9e632023-06-03 10:20:11 +0200100 }
101
102 @keyframes message-fade-out {
103 0% {
104 opacity: 1;
105 }
106 100% {
107 opacity: 0;
108 }
109 }
110
111 p.message {
Skyler Grey4c4e11f2023-06-03 14:11:29 +0200112 overflow-wrap: break-word;
Skyler Grey51e9e632023-06-03 10:20:11 +0200113 }
Skyler Greybcfdf6f2023-06-03 14:24:08 +0200114
115 span.message {
116 animation: message-fade-out 150s ease-in-out forwards;
117 }
Skyler Grey51e9e632023-06-03 10:20:11 +0200118</style>