Address review feedback:
- Replace client-side fuse.js search with NIP-50 relay-side search
using request from @welshman/net with debounced queries and
AbortController for cancellation
- Move search from inline bar to a search icon in SpaceBar that
opens a popover/dialog, matching the existing SpaceSearch pattern
- Search results grouped by age (24h, 7d, older) with timestamps
- Recent activity view remains untouched when search is closed
Add a search bar on the recent activity page that allows users to
search across all content within the current space — messages, threads,
classifieds, goals, and calendar events. Uses createSearch from Welshman
with fuse.js for client-side fuzzy matching. When the search field is
empty, the normal recent activity view is shown. Matching activity items
are filtered inline; individual event matches can be clicked to navigate.
After using the voice rooms more since we removed the option for voice-only rooms I think you were right to suggest a dialog box before joining rooms. It felt far to clunky to have to join the voice call any time you just wanted to try to view room members, edit room settings, or just view the recent text chat.
This adds a dialog that allows the user to decline to join the call but still access the text part of the room along with associated settings and controls. It also acts as another confirmation step before turning on the user's microphone, and allows them to choose an audio input so they don't have to mess with the (generally terrible) browser controls for doing so. We should probably have controls to change your audio input and output from within the call as well, but I think this is enough for an MVP.

Co-authored-by: mplorentz <mplorentz@noreply.gitea.coracle.social>
Reviewed-on: #109
Co-authored-by: Matt Lorentz <mplorentz@noreply.coracle.social>
Co-committed-by: Matt Lorentz <mplorentz@noreply.coracle.social>
Before this we were showing "Failed to join voice room" if the relay rejected our request for a livekit token because we aren't a member of the room. Now it shows the error "Failed to join voice room: you must be a member."
Co-authored-by: mplorentz <mplorentz@noreply.gitea.coracle.social>
Reviewed-on: #106
Co-authored-by: Matt Lorentz <mplorentz@noreply.coracle.social>
Co-committed-by: Matt Lorentz <mplorentz@noreply.coracle.social>