Commit graph

361 commits

Author SHA1 Message Date
7b5af20dee docs: capture autosave roll-out plan 2025-10-07 03:18:02 -07:00
c63608938a
Merge pull request #14 from jedmund/jedmund/autosave
Add autosave to admin interface
2025-10-02 19:27:39 -07:00
280bdfc06d feat(drafts): add local draft backup with restore prompt to EssayForm, SimplePostForm, and PhotoPostForm 2025-08-31 11:03:27 -07:00
c98ba3dcf0 feat(admin): integrate autosave and local draft prompt into ProjectForm and Post Edit; add Cmd/Ctrl+S and beforeNavigate flush 2025-08-31 11:03:27 -07:00
1a5ecf9ecf feat(autosave): add autosave controller and status component 2025-08-31 11:03:27 -07:00
9bc942211a refactor(admin): use shared api client across projects list, posts list, new post, project edit load, and media modal 2025-08-31 11:03:27 -07:00
f5a440a2ca feat(api/server): add posts PATCH and optimistic concurrency (updatedAt) for posts and projects 2025-08-31 11:03:27 -07:00
3aec443534 feat(api): add admin API client with auth, error handling, FormData, and abortable requests 2025-08-31 11:03:27 -07:00
c89b2b0db5
Merge pull request #13 from jedmund/feature/video-upload-support
Add video upload support
2025-08-23 00:19:48 -07:00
82581f9496 fix: update chevron icon to use Svelte 5 snippet syntax
- Replace slot="icon" with snippet syntax for dropdown chevron button
- Fixes missing chevron icon in Media tab actions dropdown

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-23 03:18:53 -04:00
aa3622d606 feat: add video playback UI and thumbnail display
- Add video player with controls in MediaDetailsModal
- Display video metadata (duration, codecs, bitrate) in metadata panel
- Show video thumbnails with play icon overlay in MediaGrid
- Support video preview in upload components
- Replace emoji icons with SVG play icon
- Maintain natural video aspect ratio in all views
- Add proper styling for video thumbnails and placeholders

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-23 03:14:06 -04:00
4f46b0e666 feat: add video upload support with ffmpeg processing
- Add video MIME types support (WebM, MP4, OGG, MOV, AVI)
- Increase upload size limit to 100MB for videos
- Add ffmpeg integration for local video processing
- Generate video thumbnails at 50% duration
- Extract video metadata (duration, codecs, bitrate)
- Add database fields for video metadata
- Support video uploads in both local and Cloudinary storage
- Maintain aspect ratio for video thumbnails (1920px max width)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-23 03:13:36 -04:00
bc2d1b4092
Merge pull request #12 from jedmund/hotfix/universe-actions
Fix universe actions
2025-08-22 22:10:15 -07:00
0c269389de fix: update post editor actions based on draft/published status
When editing a draft post, the primary action is now "Save draft" with "Publish" in the dropdown menu. When editing a published post, the primary action is "Save post" with "Save as Draft" in the dropdown.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-23 01:02:33 -04:00
f159d93b4b Add meta theme color 2025-08-07 03:12:25 -07:00
7acd366751 feat: add YouTube and media embed support to RSS feed
- Support video nodes with YouTube URL detection
- Support urlEmbed nodes for rich media previews
- Convert YouTube URLs to embedded iframes in RSS
- Add Twitter/X embed preview support
- Support generic iframe embeds
- Provide fallback links for better RSS reader compatibility

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-24 04:13:17 -07:00
be1da5aec7 refactor: remove EditorJS support from RSS feed
Clean up RSS content parsing to only support TipTap/Edra format
since that's what the application uses. Removed unnecessary
EditorJS format handling.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-24 04:04:54 -07:00
89360aa1ff feat: improve RSS feed with full content and best practices
- Include full HTML content in RSS posts using content:encoded
- Support both TipTap and EditorJS content formats
- Use date as title for posts without titles
- Add featured images as enclosures for posts
- Implement RSS best practices:
  - Add CORS headers for wider compatibility
  - Support conditional requests (ETag/Last-Modified)
  - Set appropriate cache headers (5 min client, 10 min CDN)
  - Improve content parsing for various editor formats

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-24 04:00:14 -07:00
1ed0afb5b2 fix: temporarily disable albums in RSS feed
Remove album queries from RSS feed to fix production error.
Albums will be re-enabled once database schema is updated.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-24 03:50:14 -07:00
1b0269e81e Tentative fix for mobile zoom 2025-07-24 03:45:00 -07:00
2dd3d60485 fix: update RSS feed to work with new media architecture
- Update album queries to use media relation instead of direct photos relation
- Filter photography albums by checking media.isPhotography instead of album.isPhotography
- Remove reference to non-existent post.excerpt field
- Fix cover photo access and counts to use album.media
- Fix URL concatenation for Cloudinary images to handle absolute URLs

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-24 03:16:23 -07:00
f24b79da2f fix: improve album page functionality and design
- Fix renderEdraContent to accept albumSlug option parameter
- Fix album listing links from /photos/{slug} to /albums/{slug}
- Remove album header section for cleaner photo story presentation
- Remove broken photo page conditional that was preventing render
- Pass album slug to content renderer for proper photo linking

Creates more immersive experience where content speaks for itself.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-11 20:12:43 -07:00
df3a68885d feat: restrict debug panel to /about page only
- Add route check to only show debug panel on /about page
- Keeps debug features accessible but hidden from main experience
- Debug panel remains available in development mode on /about

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-11 20:12:23 -07:00
4fd35ec1f0 feat: link albums to Apple Music when available
- Add URL field to Apple Music data type
- Include Apple Music URL in album transformation
- Prioritize Apple Music links over Last.fm in Album component
- Falls back to Last.fm URL when Apple Music data unavailable

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-11 20:12:13 -07:00
a74e9d8c4d Fix hover effect in two column grid 2025-07-11 20:11:18 -07:00
c90c2a9bdd
Merge pull request #11 from jedmund/jedmund/music-refactor
Refactor a bunch of music code to make it more reliable
2025-07-10 21:43:52 -07:00
fd56b1492f chore: add server.log to .gitignore
🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-10 21:34:50 -07:00
a8997382b7 feat: add centralized cache management system
- Create CacheManager class to unify all Redis cache operations
- Define cache types with prefixes and default TTLs
- Provide type-safe cache operations
- Add bulk clear operations for related caches
- Include cache statistics and monitoring capabilities

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-10 21:33:25 -07:00
f17934dcb8 feat: add SVG icons for debug panel
- Add check, x, trash, settings, clock, and loader icons
- Replace emoji with proper SVG icons in DebugPanel
- Improve visual consistency and cross-platform compatibility

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-10 21:33:12 -07:00
f1d0453b63 feat: add comprehensive debug panel for development
- Create DebugPanel component with Now Playing, Albums, and Cache tabs
- Show real-time connection status and update intervals
- Display detailed Apple Music data for each album
- Add inline cache clearing for individual albums
- Implement Apple Music search modal for testing queries
- Add admin endpoints for cache management and API testing
- Only visible in development mode

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-10 21:32:59 -07:00
cb6ee326c8 fix: improve Apple Music search for singles and Japanese content
- Add fallback to search for songs when album search fails
- Handle artist name variations (with/without spaces in Japanese names)
- Create synthetic album entries for singles not found as albums
- Add search metadata to track failed searches and debug info
- Fix Hachikō preview detection by normalizing artist names

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-10 21:32:43 -07:00
b84a2637c0 feat: implement smart polling intervals based on track duration
- Adjust update frequency based on remaining track time
- Poll every 5s when <20s remaining, 10s for 20-60s, 15s for >60s
- Add heartbeat timestamps to track update timing
- Implement time-based fallback for tracks without Apple Music data
- Assume tracks scrobbled within 5 minutes are still playing

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-10 21:32:29 -07:00
3d7eb6e985 refactor: consolidate now playing detection into single music stream store
- Merge albumStream and nowPlayingStream into unified musicStream store
- Simplify confidence scoring to binary detection (playing/not playing)
- Create single source of truth for music state across components
- Fix synchronization issues between header and album indicators
- Make Album spring animation more subtle (stiffness: 150, damping: 25)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-10 21:32:14 -07:00
4d24be2457 Fix some bad photos changes 2025-07-10 09:33:43 -07:00
27075088ee Fix the mobile nav dropdown 2025-07-10 09:14:21 -07:00
5e4b0949c2 Fix styling of embeds 2025-07-10 02:53:38 -07:00
41fccde9be
Merge pull request #10 from jedmund/universe/cleanup
Clean up code
2025-07-10 02:43:55 -07:00
103c69664b fix: improve now playing detection reliability
- Always fetch fresh data from Last.fm for now playing detection
- Add confidence-based detection with progress tracking
- Implement dynamic polling intervals (10s when playing, 30s idle)
- Add marquee animation for now playing text in header
- Fix release date formatting to show only year
- Add gradient fade effects to marquee edges
- Enhanced logging for debugging detection issues

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-10 01:25:31 -07:00
e21d5eab9d feat: add now playing display to header on avatar hover
- Show currently playing track info when hovering over avatar
- Display album artwork, artist name, and track/album name
- Add music note icons with pulse animation
- Maintain exact same container size as navigation
- Only shows when music is actively playing (avatar has headphones)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-10 00:08:46 -07:00
ee6fd2f25e feat: improve Apple Music search for Japanese content
- Add Japanese character detection to prioritize JP storefront
- Improve album/artist matching logic with helper functions
- Support flexible matching for albums with extra text (e.g., "- Single")
- Handle comma-separated artists by matching primary artist
- Clean up code by removing duplicate logic and verbose logging
- Fix issue where Japanese albums weren't found due to strict matching

This ensures albums like "ランデヴー" properly fetch artwork from Apple Music
even when Last.fm has no images available.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-09 23:56:03 -07:00
e0a3ec583d docs: update PRD with Phase 5 planning and research
- Add comprehensive research findings for Phase 5 implementation
- Document three implementation proposals for architecture improvements
- Include analysis of current patterns and opportunities
- Update timeline and resource allocation

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-09 23:22:07 -07:00
adf01059c2 refactor: improve utility functions and API error handling
- Enhance albumEnricher with better error handling and type safety
- Refactor lastfmStreamManager for cleaner event management
- Update lastfmTransformers with improved data validation
- Add better type guards in mediaHelpers
- Improve nowPlayingDetector logic and state management
- Enhance SSE error handling in Last.fm stream endpoint

Key improvements:
- Better error boundaries and fallback values
- More robust type checking and validation
- Cleaner async/await patterns
- Improved logging for debugging
- Consistent error response formats

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-09 23:21:48 -07:00
9ee98a2ff8 refactor: modernize Edra editor components and enhance functionality
- Migrate all Edra components to Svelte 5 with runes syntax
- Implement unified ContentInsertionPane for consistent content insertion
- Standardize placeholder components with improved layouts
- Enhance bubble menu with better color picker and text styling
- Improve drag handle interactions and visual feedback
- Update slash command system for better extensibility

Key improvements:
- ContentInsertionPane: New unified interface for all content types
- Placeholder components: Consistent sizing and spacing
- GeolocationPlaceholder: Simplified map integration
- UrlEmbedPlaceholder: Better preview handling
- ComposerMediaHandler: Converted to Svelte 5 class syntax
- BubbleMenu components: Enhanced UI/UX with modern patterns

All components now use:
- Interface Props pattern for better type safety
- $state and $derived for reactive state
- Modern event handling syntax
- Consistent styling with CSS variables

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-09 23:21:27 -07:00
a4f5c36f71 refactor: migrate media components to Svelte 5 runes
- Convert all media-related admin components to use $state and $derived
- Update event handlers to use new syntax (onclick instead of on:click)
- Refactor prop destructuring to use interface Props pattern
- Improve type safety and remove legacy reactive statements
- Simplify component logic with Svelte 5 patterns

Components updated:
- AlbumForm: Enhanced validation and state management
- FilePreviewList: Simplified preview rendering
- FileUploadZone: Improved drag-and-drop handling
- MediaDetailsModal: Better metadata display
- MediaGrid: Optimized selection state
- MediaMetadataPanel: Cleaner EXIF data presentation
- MediaUploadModal: Streamlined upload flow
- MediaUsageList: Enhanced usage tracking
- UnifiedMediaModal: Consolidated media management

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-09 23:20:56 -07:00
d767d9578f feat: implement reusable pane system components
- Add BasePane and Pane components for consistent panel UI
- Create pane-manager store for centralized pane state management
- Support for different pane positions and animations
- Establish foundation for unified pane behavior across the app

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-09 23:20:32 -07:00
12c30c1501 feat: implement unified content insertion pane for Edra editor
- Create ContentInsertionPane component with segmented controls
- Update image placeholder to single-line format with icon + text
- Update gallery placeholder to use unified pane
- Support upload, embed link, and gallery selection for each type
- Add location search placeholder for future geocoding integration
2025-06-26 16:15:17 -04:00
737a34b950 fix: correct placeholder spacing in Edra editor
- Add placeholder node styles to editor.css matching other media nodes
- Remove incorrect margins from individual placeholder components
- Placeholders now properly aligned with 2.25rem horizontal spacing
- Consistent with h1, h2, p text elements and YouTube embeds
2025-06-26 15:56:49 -04:00
48cc27770f fix: standardize Edra editor placeholder widths and slash command navigation
- Fix slash command keyboard navigation by uncommenting handler
- Update all media placeholders to respect content block margins (2.25rem)
- Refactor placeholder styles to use SCSS variables consistently
- Fix Audio, Gallery, IFrame, Video, Location, and URL embed placeholders
- Fix Image placeholder width to match other placeholders
- Ensure responsive margins on mobile (2rem)
2025-06-26 15:37:47 -04:00
22c27a0e64 refactor: update slash command menu to match visual style
- Replace old slash command list styles with new design
- Use consistent SCSS variables from design system
- Match dropdown styling patterns used elsewhere
- Improve visual hierarchy with better typography
- Add smooth transitions and hover states
- Clean up old CSS styles
2025-06-26 15:15:57 -04:00
ebdd958374 fix: remove unnecessary margin-top from editor with toolbar 2025-06-26 14:29:29 -04:00