- Fixed early return using old `zaps` key instead of `zapAmount`
- Added robust amount extraction with 3 fallback strategies:
1. Top-level `amount` tag on the zap receipt
2. `amount` tag inside the embedded zap request (description tag)
3. Parsing the bolt11 invoice string
- This ensures zap amounts display even when relays omit the amount tag
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
- useEventStats now sums the `amount` tag (millisatoshis) from kind 9735
zap receipts and returns `zapAmount` in sats instead of a zap count
- NoteCard displays the total with compact formatting (e.g. 1.2K, 3.5M)
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
- NoteMoreMenu now shows a compact post preview at the top (avatar,
author name, timestamp, and 3-line-clamped content) before menu items
- Dialog overlay updated globally: bg-black/60 + backdrop-blur-sm for a
frosted-glass effect behind all modals
- FloatingComposeButton modal reworked to match the same presentation
pattern: rounded-2xl, hidden default close button replaced with a
centered header (X / "New post" title), separator, compose area
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
- Created NoteMoreMenu component as a centered dialog with grouped actions:
- Show Post Details, Copy Link to Post, View on njump.me, Bookmark
- Mute Conversation, Mention @user
- Mute @user, Report @user (destructive)
- Close button
- Added the ⋯ More button back to NoteCard action bar alongside Bookmark
- Menu items show the author's display name dynamically
- Copy Link copies nevent-based URL to clipboard with toast feedback
- Bookmark option in the menu toggles bookmark state via useBookmarks hook
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
- Created useBookmarks hook for NIP-51 kind 10003 bookmark list management
(query, add, remove bookmarks)
- Created BookmarksPage with login prompt, loading skeletons, and empty state
- Replaced "More" nav item with "Bookmarks" in LeftSidebar
- Added bookmark toggle button to NoteCard action bar (replaces three-dot menu)
- Removed /more route from AppRouter
- Bookmarks are stored per NIP-51 as replaceable kind 10003 events
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
- Inline ComposeBox hidden below sidebar breakpoint (mobile uses FAB)
- "New post" dialog: rounded-2xl corners, clean header with title and
border divider, no padding gap, overflow hidden for crisp edges
- Removed redundant DialogHeader wrapper, title sits in a flex bar
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
- Tabs z-index lowered to z-[1] so the emoji popover portal (z-50)
always renders above them
- Mobile top bar avatar container uses flex centering instead of
fixed width, ensuring the profile picture is visually centered
- Logo wrapped in flex-1 centered container for proper horizontal balance
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
- Header: h-10 fixed height, smaller avatar (size-7), smaller logo (22px),
tighter padding (px-3) — eliminates the gap/clipping between header
and sticky tabs
- Tabs sticky offset updated to top-10 (40px) to sit flush under header
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
- Lowered tabs z-index to z-[5] so the emoji popover (z-50 portal)
renders above them
- Tabs now stick at top-[48px] on mobile (below the 48px top bar)
and top-0 on desktop (sidebar: breakpoint), so they remain visible
when scrolling through the feed
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
- EmojiPicker component with 9 categories: Smileys, Gestures, People,
Nature, Food, Activities, Objects, Symbols, Flags
- Category tab bar with emoji icons for quick switching
- Search input filters by category name
- Scrollable grid of emoji buttons (8 columns)
- Click an emoji to insert it at the cursor position in the textarea
- Popover opens from the smiley face button in the compose toolbar
- Button highlights when the picker is open
- No external emoji dependencies — all native Unicode emoji
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
- Compact single-line compose expands to multi-line on focus/click
- Toolbar shows: paperclip (file upload via Blossom), emoji, content
warning triangle (NIP-36 sensitive content toggle)
- Content warning toggle adds `content-warning`, `L`, and `l` tags
per NIP-36 spec, with optional reason input field
- Circular progress ring shows character usage against 5000 char limit
- Ring turns amber at 90%, red when over limit
- Remaining character count displayed next to ring
- "Post!" button disabled when over limit or empty
- File uploads append URL to content via useUploadFile hook
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
Left border appears at the sidebar breakpoint (900px), right border
only at lg (1024px) when the right sidebar is present. In the middle
view (sidebar visible, right panel hidden), the feed extends to the
edge without a floating right border — matching Ditto's behavior.
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
The sidebar now either shows fully (280px with labels, search, user
info) or is completely replaced by the mobile UI. The icon-only 72px
strip is eliminated — below 900px the mobile top bar, bottom nav,
drawer, and FAB take over entirely.
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
The mobile layout now activates the moment the left sidebar would need
to shrink — at 688px (72px sidebar + 600px feed + padding). Added a
custom `sidebar` Tailwind screen breakpoint and replaced all `md:`
references that control the sidebar/mobile toggle with `sidebar:`.
This ensures the bottom nav, top bar, drawer, FAB, and full-width feed
kick in precisely when the sidebar can no longer fit alongside the feed.
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
Mobile UI (< md breakpoint):
- MobileTopBar: user avatar (opens drawer) + centered Mew logo
- MobileDrawer: left slide-out sheet with user profile, follower stats,
menu items (Profile, Wallet, Bookmarks, Mutes, Preferences, Domain blocks,
Logout), and expandable Switch accounts section
- MobileBottomNav: fixed bottom bar with Home, Notifications, Search, Vines
- FloatingComposeButton: purple FAB in bottom-right corner opens compose dialog
- Feed goes full-width on mobile, max-w-[600px] only on md+
- Left sidebar hidden on mobile, right sidebar hidden below lg
- Pages with their own headers use hideMobileTopBar to avoid double headers
- Safe area bottom padding for iOS devices
- Added routes for /bookmarks, /mutes, /domain-blocks placeholders
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>