Commit Graph

525 Commits

Author SHA1 Message Date
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
Chad Curtis db7bbb0095 Update app icon background to dark theme color
- Change icon background from white (#ffffff) to dark theme (#14161f)
- Update capacitor.config.ts backgroundColor to match
- Update generate-icons.sh to use dark theme color
- Regenerate all Android icons with new background
- Prevents white-on-white icon appearance
2026-02-19 06:27:00 -06:00
Chad Curtis d47f12b38d Build v2026.02.19: Update mew.apk (5.1M) 2026-02-19 06:21:41 -06:00
Chad Curtis 7e122c2118 Update build script to handle Android SDK location
- Check for ANDROID_HOME or ANDROID_SDK_ROOT environment variables
- Auto-create android/local.properties if missing
- Provide helpful error messages for SDK configuration
2026-02-19 06:21:02 -06:00
Chad Curtis 2f02e65ab6 Add Android Capacitor build system
- Install Capacitor dependencies (@capacitor/cli, @capacitor/core, @capacitor/android, @capacitor/app, @capacitor/status-bar, sharp)
- Create capacitor.config.ts with app configuration
- Update .gitignore to exclude Android build outputs and keystore files
- Generate icon-512.png from logo.svg
- Add scripts for icon generation, APK building, and keystore creation
- Initialize Capacitor Android platform
- Configure build.gradle with signing support
- Generate Android app icons in all required densities
- Add npm scripts: 'icons' and 'build:apk'
2026-02-19 06:18:02 -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
Chad Curtis 427aa2dab4 Use FileDigit icon for Copy Event ID 2026-02-19 05:30:09 -06:00
Chad Curtis cdf38328d5 Update post detail menu: remove 'View Details', add copy event ID and JSON
- Removed 'Show Post Details' option (redundant on detail page)
- Added 'Copy Event ID' to copy hex event ID
- Added 'Copy Event JSON' to copy full event as formatted JSON
- Replaced ArrowUpDown icon with FileJson for JSON copy option
2026-02-19 05:28:39 -06:00
Chad Curtis c82fc125c3 Remove debug logging bloat from useStreamPosts 2026-02-19 05:27:26 -06:00
Chad Curtis eb93d5dd09 Re-enable search filters and add logging for initial query
- Re-enabled language and media search filters for initial query
- Added console logging to track initial batch fetch
- Initial query fetches 40 events with NIP-50 filters applied
- Streaming subscription then continues from relay.ditto.pub for new events
2026-02-19 05:26:03 -06:00
Chad Curtis c6a2f7c960 Fix streaming by bypassing pool's eoseTimeout
The root cause: NPool.req() aborts subscriptions 500ms after the first EOSE
due to eoseTimeout configuration. This is intended for queries but breaks
streaming subscriptions.

Solution: Use relay() directly for streaming instead of the pool. This
bypasses the pool's eoseTimeout logic and allows subscriptions to stay
open indefinitely after EOSE.

- Use nostr.relay('wss://relay.ditto.pub') for streaming subscription
- Keep using the pool for initial query (benefits from multi-relay speed)
- Added detailed logging to track subscription lifecycle
- Re-enabled search filters for initial query only
2026-02-19 05:23:07 -06:00
Chad Curtis 3593fddc87 Fix streaming on search page
The search page was broken because it tried to use NIP-50 search filters
in the streaming subscription. Relays don't support streaming search queries
because search requires full-text indexing.

Changes:
- Split filters into initialFilter (with search) and streamFilter (kinds only)
- Initial query uses relay-level NIP-50 search extensions (language, media, video)
- Streaming subscription only filters by kinds
- Re-added client-side filtering for streaming events (search text, media type)
- Language filtering remains relay-level only (can't detect language client-side)

Now the search page correctly:
1. Fetches initial results using relay search filters
2. Streams new events by kind
3. Filters streaming events client-side as they arrive
2026-02-19 05:15:56 -06:00
Chad Curtis 0f1bdd40fb Implement Ditto relay language and media search filters
- Add language filtering using NIP-50 language: extension
- Add media filtering using NIP-50 media: and video: extensions
- Move media filtering from client-side to relay-level for better performance
- Support filtering by images (media:true video:false), videos (video:true), or no media (media:false)
- Language filter supports all existing language options (en, es, fr, de, ja, zh, etc.)
- Filters are now applied at the relay level via search query extensions rather than client-side filtering
2026-02-19 05:11:59 -06:00