Skip to content

Commit 17ff625

Browse files
committed
style: contact search, global header & animations
1 parent 968295d commit 17ff625

File tree

7 files changed

+203
-98
lines changed

7 files changed

+203
-98
lines changed

web/.gitignore renamed to .gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ bower_components
137137
build/Release
138138

139139
# Dependency directories
140-
node_modules/
140+
web/node_modules/
141141
jspm_packages/
142142

143143
# Snowpack dependency directory (https://snowpack.dev/)

package-lock.json

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

package.json

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

web/src/lib/animation/crossfade.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import {crossfade} from "svelte/transition";
2+
import {quintOut} from "svelte/easing";
3+
4+
export function createCrossfade(amplifier: number, duration: number) {
5+
return crossfade({
6+
duration: (d) => Math.sqrt(d * amplifier),
7+
8+
fallback(node, params) {
9+
const style = getComputedStyle(node);
10+
const transform = style.transform === 'none' ? '' : style.transform;
11+
12+
return {
13+
duration,
14+
easing: quintOut,
15+
css: (t) => `
16+
transform: ${transform} scale(${t});
17+
opacity: ${t}`
18+
};
19+
}
20+
})
21+
}

web/src/lib/components/Chat.svelte

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import Alert from "$lib/components/Alert.svelte";
2222
import {writable} from "svelte/store";
2323
import {TYPING_DELAY} from "$lib/constants.ts";
24+
import {createCrossfade} from "$lib/animation/crossfade.ts";
2425
2526
export let token;
2627
export let user;
@@ -43,6 +44,8 @@
4344
let typingTimeout = null;
4445
let alertStore = writable();
4546
47+
const [send, receive] = createCrossfade(200, 600);
48+
4649
onMount(() => {
4750
messagesElement = document.getElementById('messages');
4851
inputElement = document.getElementById('send-input');
@@ -82,14 +85,17 @@
8285
if (event.key === 'Escape') {
8386
clearState()
8487
}
88+
// Ignore keydown events if the user is already focused on an input element
8589
8690
if (!event.key || event.ctrlKey || event.altKey || event.metaKey || event.shiftKey) return;
87-
if (event.key === 'Enter') {
91+
if (event.key === 'Enter' && document.activeElement === inputElement) {
8892
event.preventDefault();
8993
submit();
9094
return;
9195
}
92-
if (document.activeElement !== inputElement && !editingMessage && !openContextMenu && !addingEmoji) {
96+
if (document.activeElement.tagName === 'INPUT' || document.activeElement.tagName === 'TEXTAREA')
97+
return;
98+
if (!editingMessage && !openContextMenu && !addingEmoji) {
9399
inputElement.focus();
94100
}
95101
}
@@ -344,31 +350,30 @@
344350
typingMessage += emoji.emoji;
345351
}} bottom={position.y} left={position.x}/>
346352
{/if}
347-
<div class="header">
348-
<span class="contact-name">{contact?.name}</span>
349-
</div>
350353
<div class="messages" id="messages">
351354
<div class="messages-container" data-relevant="true">
352355
{#each messages as message,i (message.id)}
353-
<Message
354-
user={user}
355-
contact={contact}
356-
message={message}
357-
sent={message.user_id === user.id}
358-
sender={getUserObject(message.user_id)}
359-
followingMessage={messages[i + 1]}
360-
reactEmoji={reactEmoji}
361-
removeReaction={removeReaction}
362-
clearState={clearState}
363-
messageRepliesTo={messages.find((m) => m.id === message.reply_to || m.id === message.reply_to?.id)}
364-
submitEdit={submitEdit}
365-
excludeMessage={deleteMessage}
366-
bind:editingMessage={editingMessage}
367-
bind:reactingTo={reactingTo}
368-
bind:replyingTo={replyingTo}
369-
bind:openContextMenu={openContextMenu}
370-
bind:alertStore={alertStore}
371-
/>
356+
<div in:receive={{key: message.id}} out:send={{key: message.id}}>
357+
<Message
358+
user={user}
359+
contact={contact}
360+
message={message}
361+
sent={message.user_id === user.id}
362+
sender={getUserObject(message.user_id)}
363+
followingMessage={messages[i + 1]}
364+
reactEmoji={reactEmoji}
365+
removeReaction={removeReaction}
366+
clearState={clearState}
367+
messageRepliesTo={messages.find((m) => m.id === message.reply_to || m.id === message.reply_to?.id)}
368+
submitEdit={submitEdit}
369+
excludeMessage={deleteMessage}
370+
bind:editingMessage={editingMessage}
371+
bind:reactingTo={reactingTo}
372+
bind:replyingTo={replyingTo}
373+
bind:openContextMenu={openContextMenu}
374+
bind:alertStore={alertStore}
375+
/>
376+
</div>
372377
{/each}
373378
</div>
374379
</div>
@@ -438,7 +443,7 @@
438443
flex-direction: column;
439444
align-items: center;
440445
width: 100%;
441-
height: 62.5vh;
446+
height: 72.5vh;
442447
overflow-x: hidden;
443448
overflow-y: scroll;
444449
}

web/src/routes/(portal)/app/+layout.svelte renamed to web/src/routes/(portal)/app/PortalLayout.svelte

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1+
<!--This is a component, and not a layout page due to:-->
2+
<!--https://github.com/sveltejs/kit/issues/627-->
3+
14
<script lang="ts">
2-
import ThemeToggle from "$lib/components/ThemeToggle.svelte";
35
import {browser} from "$app/environment";
46
5-
export let data;
6-
77
let isSidebarExpanded = false;
88
99
// TODO: fix workaround
@@ -24,21 +24,8 @@
2424
<div class="background"></div>
2525
<div class="space">
2626
<div class="header">
27-
<div class="icon-space">
28-
</div>
29-
<div class="theme-toggle-container">
30-
<ThemeToggle/>
31-
</div>
32-
<div class="self-profile">
33-
<img src="/assets/no_profile_picture.jpg" alt="Your profile picture" class="photo"/>
34-
<div class="self-identifier">
35-
<div class="self-identifier-name">
36-
<span class="self-name">{data.user.name}</span>
37-
<span class="self-username">@{data.user.username}</span>
38-
</div>
39-
<span class="self-biography">A free thinker roaming Earth.</span>
40-
</div>
41-
</div>
27+
<div class="icon-space"></div>
28+
<slot name="header"></slot>
4229
</div>
4330
<div class="content">
4431
<div class={isSidebarExpanded ? 'sidebar expanded' : 'sidebar'}>
@@ -104,9 +91,16 @@
10491
background-color: var(--light-heavier-contrast);
10592
border-bottom: 1px solid var(--thin-border);
10693
}
94+
.standard-header-info {
95+
display: flex;
96+
height: 100%;
97+
width: 399px;
98+
border-right: 1px solid var(--thin-border);
99+
}
107100
.icon-space {
108101
height: 100%;
109-
width: 72px;
102+
width: 84.5px;
103+
border-right: 1px solid var(--thin-border);
110104
}
111105
.self-profile {
112106
display: flex;

0 commit comments

Comments
 (0)