diff --git a/resources/js/components/dredge/Messages/MessageBubble.vue b/resources/js/components/dredge/Messages/MessageBubble.vue new file mode 100644 index 0000000..ef65915 --- /dev/null +++ b/resources/js/components/dredge/Messages/MessageBubble.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/resources/js/components/dredge/Messages/MessageShare.vue b/resources/js/components/dredge/Messages/MessageShare.vue new file mode 100644 index 0000000..9ded965 --- /dev/null +++ b/resources/js/components/dredge/Messages/MessageShare.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/resources/js/components/dredge/Messages/MessageSystem.vue b/resources/js/components/dredge/Messages/MessageSystem.vue new file mode 100644 index 0000000..5febc9c --- /dev/null +++ b/resources/js/components/dredge/Messages/MessageSystem.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/resources/js/components/dredge/Messages/MessageText.vue b/resources/js/components/dredge/Messages/MessageText.vue new file mode 100644 index 0000000..2f28b39 --- /dev/null +++ b/resources/js/components/dredge/Messages/MessageText.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/resources/js/pages/Messages/Show.vue b/resources/js/pages/Messages/Show.vue index 2a2e910..a009d73 100644 --- a/resources/js/pages/Messages/Show.vue +++ b/resources/js/pages/Messages/Show.vue @@ -2,9 +2,8 @@ import { ref, onMounted, computed } from 'vue'; import { Link } from '@inertiajs/vue3'; import AppLayout from '@/layouts/AppLayout.vue'; -import Avatar from '@/components/dredge/Avatar.vue'; -import { proxyImage } from '@/lib/proxyImage'; -import type { ThreadDetail, ThreadMessage } from '@/types/dredge.types'; +import MessageBubble from '@/components/dredge/Messages/MessageBubble.vue'; +import type { ThreadDetail } from '@/types/dredge.types'; defineOptions({ layout: AppLayout, @@ -50,15 +49,6 @@ function avatarFor(username: string | null): string | null { return thread.value.participants.find((p) => p.username === username)?.profile_pic_url ?? null; } -function isSystemMessage(message: ThreadMessage): boolean { - return !message.text && !message.shared_url; -} - -function systemLabel(message: ThreadMessage): string { - if (message.item_type?.includes('REACTION')) return 'Reacted to a message'; - return 'Sent an attachment'; -} - onMounted(fetchThread); @@ -75,64 +65,13 @@ onMounted(fetchThread);
-
- - -
-

- {{ message.replied_to_text }} -

- -

{{ message.text }}

- - - -

- {{ systemLabel(message) }} -

- -
- - {{ reaction.emoji }} - -
-
-
+ :message="message" + :is-own="message.username === ME" + :avatar-src="avatarFor(message.username)" + />
@@ -173,95 +112,8 @@ onMounted(fetchThread); .thread__messages { display: flex; flex-direction: column; - gap: 0.6rem; -} -.bubble-row { - display: flex; - align-items: flex-end; - gap: 0.5rem; -} -.bubble-row--me { - flex-direction: row-reverse; -} -.bubble { - max-width: 70%; - background: var(--panel); - border: 1px solid var(--line); - border-radius: 14px; - padding: 0.55rem 0.8rem; - font-size: 0.88rem; - line-height: 1.4; -} -.bubble-row--me .bubble { - background: var(--bioluminum); - color: #04141a; - border-color: transparent; -} -.bubble__reply { - font-size: 0.75rem; - color: var(--sediment-dim); - border-left: 2px solid var(--haze); - padding-left: 0.5rem; - margin-bottom: 0.3rem; -} -.bubble-row--me .bubble__reply { - color: rgba(4, 20, 26, 0.7); - border-left-color: rgba(4, 20, 26, 0.4); -} -.bubble__text { - white-space: pre-wrap; - word-break: break-word; -} -.bubble__system { - font-style: italic; - color: var(--sediment-dim); -} -.bubble-row--me .bubble__system { - color: rgba(4, 20, 26, 0.7); -} -.bubble__share { - display: flex; - gap: 0.6rem; - text-decoration: none; - color: inherit; - background: rgba(0, 0, 0, 0.15); - border-radius: 8px; - padding: 0.4rem; - margin-top: 0.3rem; -} -.bubble__share-image { - width: 48px; - height: 48px; - object-fit: cover; - border-radius: 6px; - flex-shrink: 0; -} -.bubble__share-body { - display: flex; - flex-direction: column; - min-width: 0; - justify-content: center; -} -.bubble__share-title { - font-weight: 600; - font-size: 0.82rem; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.bubble__share-caption { - font-size: 0.75rem; - opacity: 0.8; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.bubble__reactions { - margin-top: 0.3rem; - display: flex; - gap: 0.2rem; -} -.bubble__reaction { - font-size: 0.85rem; + /* Slightly taller than a plain bubble gap so a floating reaction pill + on one bubble doesn't collide with the row below it. */ + gap: 0.9rem; }