Commit graph

434 commits

Author SHA1 Message Date
672eb47143 fix(admin): only block navigation/close when changes are unsaved
- Update beforeNavigate guard to check autosave status before blocking
- Allow instant navigation when status is 'saved' (no interruption)
- Add beforeunload warning for browser close/reload
- Only show warnings when status is NOT 'saved' (saving/error/idle)
- Improves UX by not interrupting users when everything is already saved

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 13:21:57 -07:00
f35fa60207 refactor(admin): only save local draft on autosave failure
- Remove redundant localStorage saves on every form change
- Only save draft when autosave status is 'error' or 'offline'
- Reduces draft recovery banner noise for successful autosaves
- Navigation guard still prevents data loss when navigating away

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 13:09:39 -07:00
dfbf45f8a4 refactor(admin): migrate ProjectForm to runes-based autosave
- Update ProjectForm to use new createAutoSaveStore with Svelte 5 runes
- Fix $derived syntax in AutoSaveStatus (use $derived.by for multi-statement)
- Add hasLoaded flag to prevent infinite loop on autosave completion
- Move draft recovery from inline header to prominent banner below header
- Style draft banner with blue info colors and slide-down animation
- Fix draft persistence by clearing localStorage on restore/dismiss
- Call beforeNavigate at top level for proper Svelte 5 lifecycle
- Add keyboard shortcut (Cmd/Ctrl+S) and navigation guard effects
- Update AutoSaveStatus to support both old stores and new reactive props

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 11:55:51 -07:00
0334d3a831 feat(admin): create Svelte 5 runes-based autosave store
Introduces createAutoSaveStore() using $state() for automatic reactivity.
New store provides cleaner API while maintaining backward compatibility.

Changes:
- New: src/lib/admin/autoSave.svelte.ts with createAutoSaveStore()
- Uses $state() for status and lastError (reactive getters)
- Export AutoSaveStore and AutoSaveStoreOptions types
- Add JSDoc with usage examples
- Update autoSaveLifecycle.ts to accept both old and new types
- Export AutoSaveController type from old file for compatibility

Old createAutoSaveController() remains unchanged for gradual migration.
Type checking passes with no new errors.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 07:58:20 -07:00
c209417381 feat(admin): add prime() and auto-idle to autosave controller
Enhances autosave controller with missing features:
- prime(payload): Sets initial hash baseline to prevent autosaves on page load
- idleResetMs option: Auto-transitions from 'saved' → 'idle' status (default 2s)
- onSaved callback: Now receives { prime } helper for re-priming after server response
- Cleanup: destroy() now properly clears idle reset timer

All existing tests pass. Backward compatible - forms not using new features yet.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 07:54:49 -07:00
66d5240240 refactor(admin): extract shared list filtering utilities
Introduces createListFilters() with type-safe, reactive filtering and sorting
for admin list pages. Eliminates ~120 lines of duplicate code across projects
and posts pages.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 07:41:13 -07:00
c67dbeaf38 fix(admin): make filters reactive in Svelte 5
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 07:30:01 -07:00
42be8ebcfc chore(admin): remove basic auth fallback 2025-10-07 06:31:52 -07:00
3554d0af2c fix(admin): keep universe route authenticated 2025-10-07 06:09:26 -07:00
6a0e9c2fdb refactor(admin): let session auth drive albums/media routes 2025-10-07 05:58:49 -07:00
e2949bff20 refactor(admin): update form flows for session auth 2025-10-07 05:57:45 -07:00
94fb5f6daf refactor(admin): use session fetch in media components 2025-10-07 05:54:18 -07:00
376df12c20 refactor(admin): remove legacy client auth helper 2025-10-07 05:53:55 -07:00
878c0ae248 refactor(admin): drive media page from server data 2025-10-07 05:31:02 -07:00
3a588fdf89 refactor(admin): load posts list on server 2025-10-07 05:30:50 -07:00
dbcd7a9e1b refactor(admin): load projects list on server 2025-10-07 05:30:34 -07:00
22e53a7d30 feat(admin): add authenticated fetch helper 2025-10-07 05:25:44 -07:00
4d7ddf81ee feat(admin): add session-backed auth flow 2025-10-07 05:22:39 -07:00
f3c8315c59 fix: resolve scss global import path 2025-10-07 04:55:30 -07:00
006e1db96e Add modernization plan 2025-10-07 04:49:11 -07:00
ed906b6c75
Merge pull request #15 from jedmund/jedmund/autosave
complete autosave implementation
2025-10-07 03:25:12 -07:00
c96def2789 feat: add minimal not-found error page 2025-10-07 03:18:17 -07:00
6b21c4f7b3 test: cover autosave controller and lifecycle helper 2025-10-07 03:18:10 -07:00
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