When the media tab was already mounted, clicking a media item in the sidebar
set sidebarMediaUrl (initialOpenUrl) but flatIndex state didn't update because
useState only uses its initial value at mount time. Add a useEffect to sync
flatIndex whenever initialIndex (derived from initialOpenUrl) changes.
- Make main a flex container on mobile so chat flex-1 works correctly
- Add overflow-hidden to chat wrapper to complete flex scroll chain
- Remove horizontal padding and border-radius from video on mobile
- Apply xl:rounded-2xl to player component (main and error states)
The cleanup guard in useLayoutOptions compared store.getSnapshot() (a LayoutSnapshot spread copy) against prev.current (the original LayoutOptions reference), which are always different objects. The guard was never true, so store.reset() never fired on unmount and the ProfileRightSidebar leaked to other pages. Added getOptions() to expose the raw options reference for a correct identity comparison.
- Resize reaction emojis to h-4 w-4 in stats row and reaction button
- Fix vertical alignment of emojis using inline-flex and leading-none
- Split reposts/quotes into separate stat buttons each opening correct tab
- Fix interactions modal tab sync when already open
- Un-react by clicking emoji button on already-reacted post
- Disable hover-to-open picker when already reacted
- Remove gap between triple emojis in stats row, suppress underline on hover
- Make client tag a link when value is a valid hostname
- ComposeBox: invalidate the correct 'event-comments' cache key after
posting a NIP-22 comment so CommentsSheet refreshes immediately
- toast: raise z-index to 300 so it renders above the CommentsSheet
backdrop blur (which sits at z-200)
Replace RepostMenu popover with a dedicated VineRepostButton that works
like VineHeartButton — single tap to repost, tap again to undo — with
optimistic cache updates so the button color changes immediately.
The popover menu was invisible on the dark fullscreen video background
and provided no visible confirmation of the action.
- VineHeartButton: add optimistic cache updates and query invalidation on
reaction so the heart fills and count increments immediately without
a page refresh
- RepostMenu: include NIP-18 'a' tag (kind:pubkey:d-tag) when reposting
addressable events (30000–39999) so kind 16 events are properly linked
back to the original vine