Commit Graph

529 Commits

Author SHA1 Message Date
Chad Curtis 7aad043734 Replace Repeat2 with custom RepostIcon, style repost/treasure action headers 2026-02-19 16:04:16 -06:00
Chad Curtis ec8e71cb70 Fix action header height — use w-11 instead of size-11 for icon container 2026-02-19 15:48:29 -06:00
Chad Curtis b0ac1180dd Align repost/treasure action text with username column, icon in avatar column 2026-02-19 15:46:57 -06:00
Chad Curtis 1bc069a7bd Fix sticky page titles on mobile for bookmarks and kind feed pages 2026-02-19 15:43:05 -06:00
Chad Curtis aa231797af Add NIP-05 domain feeds, profile hover cards, gallery lightbox, and NIP-05 profile URLs
- Domain feed page at /timeline/:domain fetches .well-known/nostr.json and queries events from domain users
- NIP-05 domains are clickable in usernames throughout the app (Nip05Badge, NoteCard, PostDetailPage, etc.)
- @_@domain.com renders as @domain.com (underscore prefix hidden)
- Profile hover cards on avatars, usernames, and mentions across all components
- Clicking avatar/banner on profile page opens image in gallery lightbox with safe-area support
- NIP-05 verified users get clean profile URLs (e.g. /user@domain.com) instead of /npub1...
- NIP19Page unified dispatcher handles NIP-19, NIP-05, and profile routing at /:param
- Removed /u/:npub and /d/:domain routes in favor of root-level routing
- CORS proxy fallback for NIP-05 resolution on non-CORS-compliant servers
- Mobile top bar logo links to home
- Safe area fixes for gallery lightbox, mobile drawer, and sheet close button
2026-02-19 15:37:53 -06:00
Chad Curtis e9331a4a6c Move notification polling to native Java with AlarmManager
Replace JS WebView-based polling with pure native implementation:
- NostrPoller: Java WebSocket client that queries Nostr relays directly via OkHttp
- PollAlarmReceiver: AlarmManager fires every 60s, acquires WakeLock, runs native poll
- NotificationService: foreground service keeps process alive, schedules alarms
- MewNotificationPlugin: Capacitor plugin passes pubkey/relays from JS to SharedPreferences
- Remove notificationService.ts (all polling logic now in Java)
- Simplify useNativeNotifications to only configure native service + handle permissions
2026-02-19 12:10:13 -06:00
Chad Curtis 64726d2cf7 Add local WebSocket notification polling and Mew splash/notification icons
- Implement Signal-like local-only notifications via direct WebSocket relay polling
- Poll every 60s foreground, 15min background, no external push server
- Resolve NIP-05 display names for notification body (e.g. 'alice@nostr.com reacted to your post')
- Add Capacitor LocalNotifications plugin with POST_NOTIFICATIONS permission
- Replace default Capacitor splash with Mew logo PNG on dark background using Android 12 Theme.SplashScreen
- Add ic_stat_mew vector drawable for notification small icon
- Regenerate splash PNGs with #14161f background
2026-02-19 10:40:38 -06:00
Chad Curtis 9d6cfdd4ef Fix Search and Settings page sticky behavior and transparency
SearchPage:
- Change tabs background from bg-background/95 to bg-background/80 (matches Feed/Notifications)
- Remove autoFocus from search inputs to prevent page jump on click
- Change z-index from z-20 to z-10 (consistent with other pages)

SettingsPage:
- Remove sticky from Settings header (title and description)
- Keep only tabs sticky
- Change tabs background from bg-background/95 to bg-background/80
- Header now scrolls out of view naturally, tabs remain sticky
2026-02-19 08:07:40 -06:00
Chad Curtis 780271f3c1 Fix sticky headers to use top-mobile-bar pattern
- Change STICKY_HEADER_CLASS to use 'top-mobile-bar sidebar:top-0'
- Matches the pattern used in Feed and NotificationsPage
- On mobile: sticky tabs position below the MobileTopBar (accounting for safe area)
- On desktop: sticky tabs position at top-0 (no top bar on desktop)
- Fixes issue where safe-area-top created unwanted space above tabs
2026-02-19 08:03:08 -06:00
Chad Curtis 40b1c1c182 Add safe-area-top to sticky headers
- Update STICKY_HEADER_CLASS constant to include safe-area-top
- Fixes sticky tabs in Search and Settings pages on mobile
- Ensures sticky headers respect device notches and status bars
- Feed and NotificationsPage already use top-mobile-bar which includes safe area
2026-02-19 07:58:45 -06:00
Chad Curtis 7ccac3d311 Fix NIP-85 default key overflow in advanced settings
- Add break-all utility to default pubkey text
- Prevents long hex string from overflowing on mobile screens
2026-02-19 07:55:22 -06:00
Chad Curtis 49c493d2fa Fix safe area padding in mobile drawer
- Add safe area top padding to Sheet close button (X icon)
- Add safe area bottom padding to theme toggle section
- Ensures UI elements don't overlap with device notches/navigation bars
2026-02-19 07:54:34 -06:00
Chad Curtis 8fc7dff792 Fix mobile APK issues: sticky headers and video playback
- Make headers sticky on all screen sizes (not just desktop)
- Add sticky positioning to settings tabs
- Add webkit-playsinline and x-webkit-airplay attributes for better mobile video support
2026-02-19 07:52:59 -06:00
shakespeare.diy 77993c4f74 Add safe area padding to mobile drawer menu
- Added safe-area-top to user profile header in mobile drawer
- Prevents content from being clipped behind status bar in APK
- Only applies to logged-in state header

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 07:47:07 -06:00
shakespeare.diy 725894b590 Fix sticky tabs going behind mobile top bar in APK
- Created top-mobile-bar utility class for sticky elements below mobile top bar
- Accounts for 48px bar height + safe-area-inset-top
- Updated Feed component tabs to use top-mobile-bar on mobile
- Updated NotificationsPage tabs to use top-mobile-bar on mobile
- Tabs now stick below the top bar instead of behind it

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 07:46:27 -06:00
shakespeare.diy 97eb13379b Fix mobile top bar safe area padding structure
- Wrapped content in inner div to separate safe area padding from content height
- safe-area-top now adds padding to outer header
- Inner flex container maintains h-12 for actual content
- Prevents content from being pushed into status bar area

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 07:40:12 -06:00
shakespeare.diy 08c117efd6 Mobile nav fix
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 07:35:36 -06:00
shakespeare.diy f27af5e525 Keep original stats size on desktop, compact on mobile
- Use responsive classes: text-xs sidebar:text-sm
- Use responsive padding: py-2 sidebar:py-2.5
- Use responsive margin: mt-2 sidebar:mt-3
- Mobile gets compact view, desktop keeps original size

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 07:31:08 -06:00
shakespeare.diy 619694b927 Make post detail stats section more compact on mobile
- Reduced text size from text-sm to text-xs
- Reduced padding from py-2.5 to py-2
- Reduced margin from mt-3 to mt-2
- Makes stats row take up less vertical space

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 07:30:18 -06:00
shakespeare.diy 3bd9a36e3b Use NoteCard's NIP-05 rendering pattern in PostDetailPage
- Removed Nip05Badge component usage in PostDetailPage
- Replaced with direct inline rendering like NoteCard does
- Ensures consistent truncation behavior across all views
- All NIP-05 displays now use the same DRY pattern

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 07:29:27 -06:00
shakespeare.diy b1dd7a2b58 Fix NIP-05 truncation in post details
- Added min-w-0 and overflow-hidden to parent container
- Fixed Nip05Badge component to properly support truncation
- Made favicon shrink-0 to prevent it from being truncated
- Wrapped Nip05Badge in min-w-0 container in PostDetailPage

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 07:28:28 -06:00
shakespeare.diy d248e46139 Fix username truncation and safe area issues
- Created getDisplayName utility to DRY up display name logic with automatic truncation
- Updated NoteCard and PostDetailPage to use getDisplayName utility
- Fixed top bar positioning in Capacitor APK with proper safe area insets
- Fixed FAB positioning to sit above bottom nav with safe area compensation
- Added safe-area-inset utilities for better mobile positioning control

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 07:27:04 -06:00
shakespeare.diy e085fd22e1 Match bottom mobile nav transparency to top bar (bg-background/80)
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 07:10:53 -06:00
shakespeare.diy 250e595425 Add right padding to NIP-05 line for consistent margins
- Added pr-2 to make truncation happen earlier
- Creates better visual balance with left padding

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 07:09:51 -06:00
shakespeare.diy 829be50214 Match Ditto's NIP-05 layout exactly
- NIP-05 text, favicon, dot, and timestamp all on same line
- Only NIP-05 text truncates, favicon and timestamp never cut off
- Added whitespace-nowrap to timestamp
- Removed Nip05Badge component, using inline layout instead

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 07:08:32 -06:00
shakespeare.diy a0696dc3f9 Restore favicon in NIP-05 badge
- Brought back Nip05Badge component with favicon
- NIP-05 still truncates properly with overflow-hidden on parent

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 07:05:51 -06:00
shakespeare.diy 83d7c810ec Fix NIP-05 truncation in NoteCard
- Display name and NIP-05 on separate lines (matching Ditto)
- NIP-05 now truncates properly with overflow-hidden
- Added truncate to repost and treasure headers
- Removed favicon from inline NIP-05 display

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 07:04:33 -06:00
shakespeare.diy 940d25f8e4 Fix overflow from long unbroken strings in NoteCard
- Added break-words and overflow-hidden to content containers
- Long URLs, mentions, and unbroken strings now wrap properly
- Applied fix to both regular note content and vine titles
- Prevents horizontal overflow breaking card layout

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 07:00:46 -06:00
shakespeare.diy a25cbf54c7 Fix reaction hover behavior and limit FAB to feed page
- Added timeout-based hover management for reaction quick menu
- Menu now closes smoothly when mouse leaves both button and menu
- 150ms delay allows user to move from button to menu seamlessly
- FAB now only appears on the feed page (Index)
- Added showFAB prop to MainLayout for conditional rendering

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 06:58:41 -06:00
shakespeare.diy 5357e13029 Move Edit/Preview toggle to top of inline ComposeBox
- Preview toggle now appears at top-right when in feed view
- Removed toggle from bottom toolbar
- Cleaner layout with toggle positioned above compose area
- Only shown when content has previewable elements

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 06:56:39 -06:00
shakespeare.diy 1edf3f119e Hide avatar in compact ComposeBox mode
- Avatar now hidden when compact=true (mobile feed view)
- Removes leading space on mobile compose area
- Avatar still shows in expanded/modal views

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 06:54:27 -06:00
shakespeare.diy f43132b656 Remove border between modal title and content
- Removed border-b from modal header for cleaner look

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 06:53:14 -06:00
shakespeare.diy d3d6d56e49 Move preview toggle to top of compose modal
- Moved Edit/Preview toggle from toolbar to modal header
- Added controlled preview mode to ComposeBox component
- Toggle now appears next to close button in modal header
- Added border-bottom to header for visual separation
- ComposeBox can be controlled externally or use internal state
- Fixes layout issues and improves UX in modal

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 06:52:45 -06:00
shakespeare.diy 2042477d6a Fix link preview layout issues in compose modal
- Added overflow-hidden to preview container to prevent content breaking out
- Added horizontal margins (mx-2) to Edit/Preview toggle for better spacing
- Increased button padding (px-3.5 py-1.5) for better click targets
- Fixes link preview cards overflowing to the right in modal

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 06:49:38 -06:00
shakespeare.diy ea11f5acb9 Prevent emoji picker scroll from propagating to page
- Added onWheel event handler to stop propagation
- Fixes issue where aggressive scrolling in emoji picker scrolls the page
- Scroll events now stay contained within the emoji picker

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 06:48:07 -06:00
shakespeare.diy afac29036a Fix "..." button to properly show full emoji picker
- Clicking "..." now replaces quick menu with full emoji picker
- Removed nested Popover that was causing the menu to close
- Full picker stays open and functional within the same popover
- Simplified state management with showFullPicker boolean

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 06:46:47 -06:00
shakespeare.diy 9f7cd4ed62 Add hover trigger and personalized emoji suggestions
- Created useEmojiUsage hook to track user's most-used emojis
- QuickReactMenu now shows user's top 6 emojis, falling back to defaults
- Default emojis: ❤️, 👍, 👎, 😂, 😮, 😢
- ReactionButton triggers menu on hover for faster access
- Menu aligns to start (left) to begin from the heart icon
- Emoji usage persists per user in localStorage

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 06:44:52 -06:00
shakespeare.diy 256b46394c Implement Ditto-style quick reaction menu
- Created QuickReactMenu component with horizontal emoji bar
- Quick access to 6 common emojis (❤️, 😂, 💯, 🔥, 👍, 📌)
- "..." button opens full EmojiPicker for more options
- Updated ReactionButton to use QuickReactMenu instead of full picker
- Matches Ditto UX: click shows quick react menu, ... reveals full picker

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 06:40:49 -06:00
Chad Curtis a293128176 Add mobile safe area support for status bar
- Install @capacitor/app and @capacitor/status-bar as dependencies
- Initialize StatusBar in App.tsx with dark style and overlay mode
- Add safe-area-top utility class to index.css
- Apply safe-area-top to MobileTopBar component
- Apply safe-area-top to toast notifications on mobile
- Ensures content is not hidden behind device notches/status bars
2026-02-19 06:31:18 -06:00
shakespeare.diy d519fe82bd Replace favicon and logo with new SVG design
- Added new mew_logo_2.svg to public directory
- Updated MewLogo component to use SVG instead of PNG
- Updated index.html favicon references to use SVG format
- Updated manifest.webmanifest icon references to use SVG with 'any' size
- SVG provides better scalability and smaller file size (3.5KB vs 4.2KB PNG)

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 06:11:34 -06:00
shakespeare.diy 336c761d66 Add support for custom profile fields in Edit Profile form
- Added dynamic field array management with add/remove functionality
- Extended form schema to support custom fields array
- Parse existing fields from kind 0 event content
- Store fields in NIP-compliant format: [["label", "value"], ...]
- UI includes label/value input pairs with trash icon to remove
- Fields are properly saved and loaded from metadata
- Integrates with existing ProfileRightSidebar display

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 06:08:54 -06:00
shakespeare.diy 48a5dedb45 Fix post menu to hide mute/mention/report options on own posts
- Wrapped mute conversation, mention, mute user, and report options with !isOwnPost checks
- Only show these options when viewing someone else's post
- Pin to profile option remains available only on own posts
- Fixes issue where inappropriate moderation options were shown on user's own content

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 06:04:58 -06:00
shakespeare.diy bdf189481e Revert to e693589: Increase top padding for search inputs from pt-4 to pt-5
This reverts the codebase back to the state at commit e693589.

Reverted 1 commit(s):
- 052aca5: Add support for Articles and Recipes (kind 30023)

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 06:02:49 -06:00
shakespeare.diy 052aca55cb Add support for Articles and Recipes (kind 30023)
- Added ArticleCard component for displaying long-form content in feeds
- Added ArticleDetail component with markdown rendering for article detail pages
- Created ArticlesFeedPage with optional tag filtering for recipes
- Added /articles and /recipes routes
- Updated PostDetailPage to use ArticleDetail for kind 30023 events
- Added Articles and Recipes to settings toggles (sidebar & feed visibility)
- Integrated articles into Feed component - kind 30023 events now use ArticleCard
- Added react-markdown and remark-gfm for proper markdown rendering
- Articles and Recipes now visible by default in sidebar navigation

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 05:59:37 -06:00
shakespeare.diy e693589e6d Increase top padding for search inputs from pt-4 to pt-5
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 05:47:45 -06:00
shakespeare.diy 1001ea8161 Improve search filters readability with larger inputs and icons
- Add icons to media type filters (Images, Videos, Vines)
- Add Languages icon to language filter
- Remove icons from "All media", "No media", and platform checkboxes
- Increase radio button and checkbox size from 16px to 18px
- Remove text-sm classes for better readability
- Increase icon sizes from 3.5px to 4px

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 05:46:30 -06:00
shakespeare.diy e224a33db7 Refine search filters layout with subtle improvements
- Use font-medium instead of font-semibold for cleaner hierarchy
- Restore original spacing (space-y-4, gap-3)
- Remove explicit text-foreground to let theme handle it naturally
- Keep consistent label spacing

Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 05:41:22 -06:00
shakespeare.diy 92e0b0b82c Improve search filters presentation with better spacing and text hierarchy
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>
2026-02-19 05:40:01 -06:00
Chad Curtis 39fb1057a5 Change platform filter to checkboxes for Nostr and Mastodon
- Changed from single toggle to dual checkboxes
- Users can select Nostr only, Mastodon only, or both platforms
- Nostr is checked by default, Mastodon unchecked by default
- Both checkboxes can be unchecked (shows no results)
- More flexible filtering with AND/OR logic
2026-02-19 05:34:26 -06:00
Chad Curtis 00c8ff6130 Add toggle to show/hide Mastodon posts on search page
- Added 'Show Mastodon posts' toggle in search filters
- Detects Mastodon/ActivityPub bridge posts via proxy tag
- Posts with proxy tag containing 'activitypub' are filtered out by default
- Toggle allows users to include or exclude bridged posts from results
2026-02-19 05:31:53 -06:00