@@ -38,16 +38,27 @@ function getHostname(uri: string): string {
3838 return uri
3939 }
4040}
41+
42+ let segmenter: Intl .Segmenter | null = null
43+ function firstChar(str : string ): string {
44+ segmenter ?? = new Intl .Segmenter (undefined , { granularity: ' grapheme' })
45+ return Array .from (segmenter .segment (str ))[0 ]?.segment ?? ' '
46+ }
4147 </script >
4248
4349<template >
44- <div :class =" depth === 0 ? 'flex gap-3' : 'flex gap-3 mt-3'" >
45- <!-- Avatar -->
50+ <!--
51+ Depth 0: classic avatar-column layout (all screens)
52+ Depth 1+: Medium-style inline avatar on mobile, avatar-column on desktop
53+ -->
54+ <div :class =" depth === 0 ? 'flex gap-3' : 'sm:flex sm:gap-3'" >
55+ <!-- Column avatar: always shown at depth 0, desktop-only at depth 1+ -->
4656 <a
4757 :href =" `https://bsky.app/profile/${comment.author.handle}`"
4858 target =" _blank"
4959 rel =" noopener noreferrer"
5060 class =" shrink-0"
61+ :class =" depth > 0 ? 'hidden sm:block' : ''"
5162 >
5263 <img
5364 v-if =" comment.author.avatar"
@@ -65,22 +76,45 @@ function getHostname(uri: string): string {
6576 depth === 0 ? 'w-10 h-10' : 'w-8 h-8 text-sm',
6677 ]"
6778 >
68- {{ (comment.author.displayName || comment.author.handle).charAt(0 ).toUpperCase() }}
79+ {{ firstChar (comment.author.displayName || comment.author.handle).toUpperCase() }}
6980 </div >
7081 </a >
7182
7283 <div class =" flex-1 min-w-0" >
7384 <!-- Author info + timestamp -->
74- <div class =" flex flex-wrap items-baseline gap-x-2 gap-y-0" >
85+ <div class =" flex flex-wrap items-center gap-x-2 gap-y-0" >
86+ <!-- Inline avatar: mobile-only for nested comments -->
87+ <a
88+ v-if =" depth > 0"
89+ :href =" `https://bsky.app/profile/${comment.author.handle}`"
90+ target =" _blank"
91+ rel =" noopener noreferrer"
92+ class =" shrink-0 sm:hidden"
93+ >
94+ <img
95+ v-if =" comment.author.avatar"
96+ :src =" comment.author.avatar"
97+ :alt =" comment.author.displayName || comment.author.handle"
98+ class =" w-6 h-6 rounded-full"
99+ width =" 24"
100+ height =" 24"
101+ loading =" lazy"
102+ />
103+ <div
104+ v-else
105+ class =" w-6 h-6 rounded-full bg-border flex items-center justify-center text-fg-muted text-xs"
106+ >
107+ {{ firstChar(comment.author.displayName || comment.author.handle).toUpperCase() }}
108+ </div >
109+ </a >
75110 <a
76111 :href =" `https://bsky.app/profile/${comment.author.handle}`"
77112 target =" _blank"
78113 rel =" noopener noreferrer"
79- class =" font-medium text-fg hover:underline"
114+ : class =" [' font-medium text-fg hover:underline', depth > 0 ? 'text-sm' : ''] "
80115 >
81116 {{ comment.author.displayName || comment.author.handle }}
82117 </a >
83- <span class =" text-fg-subtle text-sm" >@{{ comment.author.handle }}</span >
84118 <span class =" text-fg-subtle text-sm" >·</span >
85119 <a
86120 :href =" getCommentUrl(props.comment)"
@@ -93,7 +127,7 @@ function getHostname(uri: string): string {
93127 </div >
94128
95129 <!-- Comment text with rich segments -->
96- <p class =" text-fg-muted whitespace-pre-wrap" >
130+ <p class =" text-fg-muted whitespace-pre-wrap mt-2 mb-3 " >
97131 <template v-for =" (segment , i ) in processedSegments " :key =" i " >
98132 <a
99133 v-if =" segment.url"
@@ -162,7 +196,7 @@ function getHostname(uri: string): string {
162196 <!-- Like/repost counts -->
163197 <div
164198 v-if =" comment.likeCount > 0 || comment.repostCount > 0"
165- class =" mt-2 flex gap-4 text-sm text-fg-subtle"
199+ class =" mt-1 flex gap-4 text-sm text-fg-subtle"
166200 >
167201 <span v-if =" comment.likeCount > 0" >
168202 {{ $t('blog.atproto.like_count', { count: comment.likeCount }, comment.likeCount) }}
@@ -174,7 +208,10 @@ function getHostname(uri: string): string {
174208
175209 <!-- Nested replies -->
176210 <template v-if =" comment .replies .length > 0 " >
177- <div v-if =" depth < MaxDepth" class =" mt-2 ps-2 border-is-2 border-border flex flex-col" >
211+ <div
212+ v-if =" depth < MaxDepth"
213+ class =" mt-3 ps-3 border-is-2 border-border flex flex-col gap-3"
214+ >
178215 <BlueskyComment
179216 v-for =" reply in comment.replies"
180217 :key =" reply.uri"
0 commit comments