Skip to content

Commit 76e861c

Browse files
Feat/metagram message (#135)
* feat: added metagram message component. * feat: added both states of message component. * docs: added usage docs. * chore: exposed component from ui. * fix: component -> fragement --------- Co-authored-by: SoSweetHam <[email protected]>
1 parent a3a9aa0 commit 76e861c

File tree

4 files changed

+115
-11
lines changed

4 files changed

+115
-11
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import type { ComponentProps } from "svelte";
2+
import Message from "./Message.svelte";
3+
4+
export default {
5+
title: "UI/Message",
6+
component: Message,
7+
tags: ["autodocs"],
8+
render: (args: {
9+
Component: Message;
10+
props: ComponentProps<typeof Message>;
11+
}) => ({
12+
Component: Message,
13+
props: args,
14+
}),
15+
};
16+
17+
export const Primary = {
18+
args: {
19+
avatar: "https://www.gravatar.com/avatar/2c7d99fe281ecd3bcd65ab915bac6dd5?s=250",
20+
username: "donaldthefirstt",
21+
text: "i was thinking of making it to the conference so we could take some more fire pictures like last time",
22+
unread: false,
23+
callback: () => alert("Message clicked"),
24+
},
25+
};
26+
27+
export const Unread = {
28+
args: {
29+
avatar: "https://www.gravatar.com/avatar/2c7d99fe281ecd3bcd65ab915bac6dd5?s=250",
30+
username: "donaldthefirstt",
31+
text: "i was thinking of making it to the conference so we could take some more fire pictures like last time",
32+
unread: true,
33+
callback: () => alert("Message clicked"),
34+
},
35+
};
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<script lang="ts">
2+
import type { HTMLAttributes } from 'svelte/elements';
3+
import Avatar from '../../ui/Avatar/Avatar.svelte';
4+
import { cn } from '../../utils';
5+
6+
interface IMessageProps extends HTMLAttributes<HTMLButtonElement> {
7+
avatar: string;
8+
username: string;
9+
text: string;
10+
unread?: boolean;
11+
callback: () => void;
12+
}
13+
14+
const {
15+
avatar,
16+
username,
17+
text,
18+
unread = false,
19+
callback,
20+
...restProps
21+
}: IMessageProps = $props();
22+
23+
const messageText = $derived(text.length < 80 ? text : `${text.substring(0, 80)}...`);
24+
</script>
25+
26+
<button
27+
{...restProps}
28+
class={cn([
29+
'relative flex w-full cursor-pointer items-center gap-2 rounded-lg py-4 hover:bg-gray-100',
30+
restProps.class
31+
])}
32+
onclick={callback}
33+
>
34+
<Avatar src={avatar} alt="User Avatar" size="md" />
35+
<span class="flex w-full flex-col items-start justify-end gap-1">
36+
<span class="flex w-full items-center justify-between">
37+
<h2>{username}</h2>
38+
{#if unread}
39+
<span class="h-2 w-2 rounded-full bg-blue-500"></span>
40+
{/if}
41+
</span>
42+
<p class="text-black/60">{messageText}</p>
43+
</span>
44+
</button>
45+
46+
<!--
47+
@component
48+
@name Message
49+
@description A message component that displays a user's avatar, username, and message text. It also includes an optional unread indicator.
50+
@props
51+
- avatar: string - The URL of the user's avatar image.
52+
- username: string - The name of the user.
53+
- text: string - The message text.
54+
- unread: boolean - Optional. Indicates if the message is unread. Defaults to false.
55+
- callback: () => void - Function to call when the message is clicked.
56+
@usage
57+
<script>
58+
import { Message } from '$lib/ui';
59+
</script>
60+
61+
<Message
62+
avatar="https://example.com/avatar.jpg"
63+
username="John Doe"
64+
text="Hello, how are you?"
65+
unread={true}
66+
callback={() => console.log('Message clicked')}
67+
/>
68+
-->
Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
export { default as Header } from "./Header/Header.svelte";
2-
export { default as BottomNav } from './BottomNav/BottomNav.svelte';
3-
export { default as SettingsNavigationButton } from './SettingsNavigationButton/SettingsNavigationButton.svelte';
4-
export { default as MessageInput } from './MessageInput/MessageInput.svelte';
5-
export { default as InputFile } from './InputFile/InputFile.svelte';
6-
export { default as Drawer } from './Drawer/Drawer.svelte';
2+
export { default as BottomNav } from "./BottomNav/BottomNav.svelte";
3+
export { default as SettingsNavigationButton } from "./SettingsNavigationButton/SettingsNavigationButton.svelte";
4+
export { default as MessageInput } from "./MessageInput/MessageInput.svelte";
5+
export { default as InputFile } from "./InputFile/InputFile.svelte";
6+
export { default as Drawer } from "./Drawer/Drawer.svelte";
7+
export { default as Message } from "./Message/Message.svelte";
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
export { default as Button } from './Button/Button.svelte';
2-
export { default as Avatar } from './Avatar/Avatar.svelte';
3-
export { default as Input } from './Input/Input.svelte';
4-
export { default as Select } from './Select/Select.svelte';
5-
export { default as Label } from './Label/Label.svelte';
6-
export { default as Toggle } from './Toggle/Toggle.svelte';
1+
export { default as Button } from "./Button/Button.svelte";
2+
export { default as Avatar } from "./Avatar/Avatar.svelte";
3+
export { default as Input } from "./Input/Input.svelte";
4+
export { default as Select } from "./Select/Select.svelte";
5+
export { default as Label } from "./Label/Label.svelte";
6+
export { default as Toggle } from "./Toggle/Toggle.svelte";

0 commit comments

Comments
 (0)