diff --git a/src/components/article/ArticleEditor.tsx b/src/components/article/ArticleEditor.tsx index a7a66cb..e57b2cb 100644 --- a/src/components/article/ArticleEditor.tsx +++ b/src/components/article/ArticleEditor.tsx @@ -20,6 +20,16 @@ function extractImages(md: string): { alt: string; url: string }[] { return images; } +function formatSavedAgo(elapsedMs: number): string { + const s = Math.floor(elapsedMs / 1000); + if (s < 5) return "just now"; + if (s < 60) return `${s}s ago`; + const m = Math.floor(s / 60); + if (m < 60) return `${m}m ago`; + const h = Math.floor(m / 60); + return `${h}h ago`; +} + export function ArticleEditor() { const { goBack } = useUIStore(); const { activeDraftId, drafts, updateDraft, deleteDraft, setActiveDraft, createDraft } = useDraftStore(); @@ -279,7 +289,7 @@ export function ArticleEditor() { {wordCount > 0 ? `${wordCount} words` : "New article"} {activeDraft && !published && lastSaved && ( - · saved {Math.floor((Date.now() - lastSaved) / 1000) < 5 ? "just now" : `${Math.floor((Date.now() - lastSaved) / 1000)}s ago`} + · saved {formatSavedAgo(Date.now() - lastSaved)} )} {published && publishedRelays > 0 && ( @@ -396,6 +406,7 @@ export function ArticleEditor() { onChange={(e) => setTitle(e.target.value)} placeholder="Title" className="w-full bg-transparent text-text text-2xl font-bold placeholder:text-text-dim focus:outline-none" + style={{ fontFamily: "var(--font-reading)" }} /> diff --git a/src/components/article/ArticleView.tsx b/src/components/article/ArticleView.tsx index 75b49aa..eb28861 100644 --- a/src/components/article/ArticleView.tsx +++ b/src/components/article/ArticleView.tsx @@ -306,7 +306,7 @@ export function ArticleView() { value={commentText} onChange={(e) => { setCommentText(e.target.value); autoResize(e); }} onKeyDown={(e) => { if (e.key === "Enter" && !e.shiftKey) { e.preventDefault(); handleComment(); } }} - placeholder="Write a comment about this article..." + placeholder="Write a comment…" rows={3} className="w-full bg-bg-raised border border-border rounded-sm px-3 py-2 text-[12px] text-text placeholder:text-text-dim resize-none focus:outline-none focus:border-accent leading-relaxed" autoFocus diff --git a/src/components/feed/ComposeBox.tsx b/src/components/feed/ComposeBox.tsx index ad838b4..e280660 100644 --- a/src/components/feed/ComposeBox.tsx +++ b/src/components/feed/ComposeBox.tsx @@ -270,7 +270,7 @@ export function ComposeBox({ onPublished, onNoteInjected }: { onPublished?: () = )} - Ctrl+Enter to post diff --git a/src/components/feed/NoteActions.tsx b/src/components/feed/NoteActions.tsx index a8b0b7b..16d9d98 100644 --- a/src/components/feed/NoteActions.tsx +++ b/src/components/feed/NoteActions.tsx @@ -116,6 +116,7 @@ export function NoteActions({ event, onReplyToggle, showReply }: NoteActionsProp disabled={reacting} className="inline-flex items-center px-1.5 py-0.5 text-[12px] text-text-dim hover:text-accent border border-border hover:border-accent/40 rounded-sm transition-colors disabled:opacity-30" title="React with emoji" + aria-label="React with emoji" > + @@ -125,7 +126,7 @@ export function NoteActions({ event, onReplyToggle, showReply }: NoteActionsProp {showEmojiPicker && ( <>
setShowEmojiPicker(false)} /> -
+
{REACTION_EMOJIS.map((emoji) => (
diff --git a/src/components/media/MediaFeed.tsx b/src/components/media/MediaFeed.tsx index 1c07a6f..3df1429 100644 --- a/src/components/media/MediaFeed.tsx +++ b/src/components/media/MediaFeed.tsx @@ -51,10 +51,10 @@ export function MediaFeed() { )}
diff --git a/src/components/poll/PollWidget.tsx b/src/components/poll/PollWidget.tsx index 3fe8950..2ceefed 100644 --- a/src/components/poll/PollWidget.tsx +++ b/src/components/poll/PollWidget.tsx @@ -63,7 +63,7 @@ export const PollWidget = memo(function PollWidget({ event }: { event: NDKEvent disabled={showResults} className={` relative w-full text-left px-3 py-2 rounded-sm overflow-hidden - transition-all duration-200 + transition-colors duration-200 ${showResults ? isMyVote ? "border border-accent/60" diff --git a/src/components/profile/ProfileView.tsx b/src/components/profile/ProfileView.tsx index b9163db..769cd3b 100644 --- a/src/components/profile/ProfileView.tsx +++ b/src/components/profile/ProfileView.tsx @@ -229,19 +229,17 @@ export function ProfileView() { {/* Avatar + info */}
-
+
{avatar ? ( {`${name}'s { (e.target as HTMLImageElement).style.display = "none"; }} /> ) : (
{name.charAt(0).toUpperCase()}
diff --git a/src/components/search/SearchView.tsx b/src/components/search/SearchView.tsx index 39881d5..dc69c44 100644 --- a/src/components/search/SearchView.tsx +++ b/src/components/search/SearchView.tsx @@ -117,7 +117,7 @@ function SuggestionFollowButton({ pubkey }: { pubkey: string }) { : "border-accent/60 text-accent hover:bg-accent hover:text-accent-text" }`} > - {pending ? "..." : isFollowing ? "unfollow" : "follow"} + {pending ? "…" : isFollowing ? "Unfollow" : "Follow"} ); } @@ -410,7 +410,7 @@ export function SearchView() {

Based on who your follows follow

{suggestionsLoading && ( -
Finding suggestions...
+
Finding suggestions…
)} {visibleSuggestions.map((s) => s.profile && (
diff --git a/src/components/shared/RelaysView.tsx b/src/components/shared/RelaysView.tsx index 5070f44..ab1dbfa 100644 --- a/src/components/shared/RelaysView.tsx +++ b/src/components/shared/RelaysView.tsx @@ -80,7 +80,7 @@ function RelayHealthCard({ result, poolConnected, onRemove }: { result: RelayHea > remove - {expanded ? "▾" : "▸"} +
diff --git a/src/components/shared/SettingsView.tsx b/src/components/shared/SettingsView.tsx index 036a095..9924fc7 100644 --- a/src/components/shared/SettingsView.tsx +++ b/src/components/shared/SettingsView.tsx @@ -50,7 +50,7 @@ function MuteSection() { onClick={() => setExpanded(!expanded)} className="flex items-center gap-2 w-full text-left group" > - +

@@ -280,7 +280,7 @@ function NotificationSection() { }`} > @@ -412,7 +412,7 @@ function ExperimentalSection() { }`} > diff --git a/src/components/sidebar/Sidebar.tsx b/src/components/sidebar/Sidebar.tsx index d410a4c..c7b207a 100644 --- a/src/components/sidebar/Sidebar.tsx +++ b/src/components/sidebar/Sidebar.tsx @@ -46,6 +46,7 @@ export function Sidebar() { )} @@ -103,7 +105,7 @@ export function Sidebar() { title={c ? item.label : undefined} className={`w-full text-left px-3 py-1.5 flex items-center gap-2 text-[12px] transition-colors ${ currentView === item.id - ? "text-accent bg-accent/8" + ? "text-accent bg-accent/10" : "text-text-muted hover:text-text hover:bg-bg-hover" }`} > @@ -115,7 +117,7 @@ export function Sidebar() { {!c && {item.label}} {!c && badge > 0 && ( - {badge} + {badge} )} ); diff --git a/src/components/thread/ThreadNode.tsx b/src/components/thread/ThreadNode.tsx index 35291b5..2ba2a03 100644 --- a/src/components/thread/ThreadNode.tsx +++ b/src/components/thread/ThreadNode.tsx @@ -57,7 +57,7 @@ function InlineThreadReply({ replyTo, rootEvent, onPublished }: { }; return ( -
+
replying to @{name}