feat: web UI chat render, panels, presence + analytics

This commit is contained in:
hh committed 2026-05-31 19:41:37 +02:00
1 parent 75425d1bee
commit ed469ba8dd
83 files changed
+6034 -136

No files matched your search

@@ -0,0 +1,106 @@
<script lang="ts">
import { ripple } from "$lib/actions/ripple";
import Avatar from "$lib/components/ui/Avatar.svelte";
import Icon from "$lib/components/ui/Icon.svelte";
import { accountName } from "$lib/format/peer";
import { accounts } from "$lib/stores/accounts.svelte";
const current = $derived(accounts.selected);
const others = $derived(
accounts.list.filter(
(account) => account.account_id !== accounts.selectedId
)
);
</script>
<div class="my-account">
{#if current}
<div class="profile">
<Avatar
name={accountName(current)}
colorKey={current.account_id}
size={5}
/>
<div class="name">{accountName(current)}</div>
{#if current.phone}
<div class="phone">+{current.phone}</div>
{/if}
</div>
{/if}
{#if others.length > 0}
<div class="switch">
{#each others as account (account.account_id)}
<button
type="button"
class="switch-row"
use:ripple
onclick={() => accounts.select(account.account_id)}
>
<Avatar
name={accountName(account)}
colorKey={account.account_id}
size={2.25}
/>
<span>{accountName(account)}</span>
<Icon name="arrow-right" size="1rem" class="chevron" />
</button>
{/each}
</div>
{/if}
</div>
<style lang="scss">
.profile {
display: flex;
flex-direction: column;
align-items: center;
gap: 0.5rem;
padding: 1.5rem 1rem;
}
.name {
font-size: 1.25rem;
font-weight: var(--font-weight-medium);
color: var(--color-text);
}
.phone {
font-size: 0.9375rem;
color: var(--color-text-secondary);
}
.switch-row {
cursor: pointer;
position: relative;
overflow: hidden;
display: flex;
align-items: center;
gap: 0.75rem;
width: 100%;
min-height: 3.5rem;
padding: 0 1.25rem;
border: 0;
font-size: 1rem;
text-align: start;
color: var(--color-text);
background-color: transparent;
transition: background-color 0.15s ease;
&:hover {
background-color: var(--color-chat-hover);
}
span {
flex: 1;
}
}
:global(.switch-row .chevron) {
flex-shrink: 0;
color: var(--color-icon-secondary);
}
</style>