Commit graph

211 commits

Author SHA1 Message Date
Devin AI
041e13e95c lint: remove unused svelte-ignore comments (17 fixes)
Co-Authored-By: Justin Edmund <justin@jedmund.com>
2025-11-24 05:45:51 +00:00
Devin AI
3b46df5c7b lint: add svelte-ignore comments for @html tags (17 fixes)
Co-Authored-By: Justin Edmund <justin@jedmund.com>
2025-11-24 05:43:42 +00:00
Devin AI
62263e5785 lint: fix unused expressions by adding void operator (26 fixes)
Co-Authored-By: Justin Edmund <justin@jedmund.com>
2025-11-24 05:39:21 +00:00
Devin AI
f3bd552eca lint: remove remaining unused imports and variables (20 fixes)
Co-Authored-By: Justin Edmund <justin@jedmund.com>
2025-11-24 05:31:03 +00:00
Devin AI
0bdbd26deb lint: remove unused imports in api routes and stories (9 fixes)
Co-Authored-By: Justin Edmund <justin@jedmund.com>
2025-11-24 05:28:11 +00:00
Devin AI
30fde044d7 lint: remove unused imports and functions (7 fixes)
Co-Authored-By: Justin Edmund <justin@jedmund.com>
2025-11-24 05:26:28 +00:00
Devin AI
38b8b8995c lint: remove unused imports and rename unused variables (6 fixes)
Co-Authored-By: Justin Edmund <justin@jedmund.com>
2025-11-23 14:44:59 +00:00
Devin AI
ee31ed9a1e lint: remove unused imports and variables (8 fixes)
Co-Authored-By: Justin Edmund <justin@jedmund.com>
2025-11-23 14:43:41 +00:00
8ec4c582c1 fix: eliminate remaining any types in API routes
- use Prisma.JsonValue and Prisma input types throughout
- add proper type guards for array and object checks
- replace any with Record<string, unknown> where appropriate
- all API/RSS routes now have zero any type errors
2025-11-23 05:28:05 -08:00
73c2fae7b8 fix: complete API route type safety improvements
- add ProjectUpdateBody interface for partial updates
- use Prisma.ProjectUpdateInput for update operations
- replace all remaining any types in projects endpoints
- consistent use of proper types across all API routes
2025-11-23 05:16:55 -08:00
f6737ee19c fix: replace remaining any types in API routes
- add AlbumPhoto, BlockContent, AppleMusicData types
- add ProjectCreateBody interface for request validation
- use Prisma.ProjectWhereInput for query filters
- use Prisma.JsonValue for JSON fields
- add proper type guards for content validation
2025-11-23 05:14:19 -08:00
aab78f3909 fix: replace any types in API routes with proper Prisma types
- add ContentNode, GalleryItem, TextNode, ParagraphNode, DocContent types
- use Prisma.JsonValue for JSON column content
- use Prisma.ProjectUpdateInput and Prisma.PostUpdateInput for update payloads
- improve type guards for content filtering
- replace any[] with never[] for empty placeholder arrays
2025-11-23 05:04:04 -08:00
056e8927ee fix: replace any types with proper types in admin components
- add GalleryItem type for media/gallery item unions
- add EdraCommand import for editor command types
- add Post, Media imports from Prisma
- add BlockContent, DraftPayload, PostPayload, PhotoPayload types
- replace any with proper types in form handlers and callbacks
- use unknown for truly dynamic data, Record types for object props
2025-11-23 05:00:59 -08:00
94e13f1129 chore: auto-fix linting issues with eslint --fix
Apply automatic fixes for prefer-const violations and other
auto-fixable linting errors. Reduces error count from 613 to 622.
2025-11-23 04:48:06 -08:00
ec0431d2b0 fix: extract JSON-LD script generation to resolve parsing errors
Refactor inline template literals with nested JSON.stringify() into
separate derived variables. Fixes 6 ESLint parsing errors in route files.
2025-11-23 04:47:26 -08:00
ffa5ae7f02 fix: properly render links and formatting in RSS feeds
Replace broken text extraction logic with renderEdraContent() which correctly handles TipTap marks including links, bold, italic, etc.

Before: Links were stripped from RSS content (only plain text extracted)
After: Full HTML with proper links, formatting preserved in CDATA sections

Files updated:
- src/routes/rss/+server.ts: Main RSS feed
- src/routes/rss/universe/+server.ts: Universe RSS feed

Fixes issue where content.blocks was expected but TipTap uses content.type='doc' format.
2025-11-04 20:56:26 -08:00
5b5785887d refactor: replace $: reactive statements with $derived()
Migrate remaining Svelte 4 reactive statements to Svelte 5 $derived:
- media/audit/+page.svelte: Convert allSelected, hasSelection, selectedSize to $derived
- universe/compose/+page.svelte: Convert postType, initialContent to $derived
- Also migrated all let declarations to $state() in audit page for consistency

All reactive statements now use Svelte 5 runes mode.
2025-11-04 19:46:35 -08:00
4337b57dee refactor: migrate createEventDispatcher to Svelte 5 callback props
Migrate 5 components from Svelte 4 createEventDispatcher to Svelte 5 callback props:
- DropdownMenu.svelte (removed unused dispatcher)
- ProjectListItem.svelte (edit, togglePublish, delete events)
- PostListItem.svelte (edit, togglePublish, delete events)
- AlbumListItem.svelte (toggleDropdown, edit, togglePublish, delete events)
- InlineComposerModal.svelte (close, saved events + migrate export let to $props)

Updated parent components to use onevent={handler} syntax instead of on:event={handler}.
2025-11-04 19:35:53 -08:00
d964bf05cd chore: remove dead code and unused files
Delete completely unused files:
- album-stream.ts store (127 lines, never imported)
- AdminSegmentedController + BaseSegmentedController (546 lines, superseded by AdminSegmentedControl)
- AlbumMetadataPopover.svelte (never imported)
- 5 test/demo pages in admin routes (buttons, inputs, *-test routes)

Total cleanup: ~1,200+ lines of dead code removed
2025-11-04 19:03:50 -08:00
cf2842d22d refactor: migrate admin UI to Svelte 5 runes
Convert admin components from Svelte 4 to Svelte 5 syntax using $props, $state, $derived, and $bindable runes. Simplifies AdminNavBar logic and improves type safety.
2025-11-03 23:03:28 -08:00
12d2ba1667 feat: add branding preview with visibility toggles
Add live preview to branding form showing featured image, background color, and logo. Add database fields and toggles to control visibility of each element in project headers.
2025-11-03 23:03:13 -08:00
1c98aff722 feat(admin): complete Task 7 Phase 2 - styling rollout
Extended the theming system to additional pages and components, continuing
to eliminate hardcoded colors and duplicated styles.

**Pages Refactored:**
- /admin/media - Integrated EmptyState with action button (~20 lines removed)
- /admin/albums - Integrated EmptyState & ErrorMessage (~25 lines removed)
  - Fixed hardcoded spacing in loading spinner (32px → calc($unit * 4))
  - Replaced hardcoded error color (#d33 → $error-text)

**Components Updated with Semantic Colors:**
- Button.svelte - Replaced 3 instances of #dc2626 → $error-text
- AlbumSelector.svelte - Error message uses $error-bg, $error-text
- AlbumSelectorModal.svelte - Error message uses $error-bg, $error-text, $error-border
  - Fixed border width (1px → $unit-1px)

**Phase 2 Results:**
- Total lines removed: ~105 across 4 pages (Phase 1: 60, Phase 2: 45)
- EmptyState component now used in 4 pages
- ErrorMessage component now used in 3 pages
- Standardized error colors across 3 modal components

**Theming Benefits:**
- Error styling centralized (change $error-bg once, updates everywhere)
- Empty states guaranteed visual consistency
- Dark mode ready (just remap CSS variables in themes.scss)

**Remaining work (future):**
- ~30 files with remaining hardcoded colors
- ~15 files with spacing that could use $unit system
- Opportunity for additional semantic variables as needed

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-08 22:02:33 -07:00
45e3556663 feat(admin): complete Task 7 Phase 1 - styling & theming foundation
Implemented a three-layer theming architecture to standardize admin component
styling and prepare for future dark mode support.

**Architecture:**
- Layer 1: Base colors ($gray-80, $red-60) in variables.scss
- Layer 2: Semantic SCSS variables ($input-bg, $error-bg) in variables.scss
- Layer 3: CSS custom properties (--input-bg, --error-bg) in themes.scss

**New semantic variables (~30 added):**
- Inputs & forms (bg, hover, focus, text, border states)
- State messages (error, success, warning with bg/text/border)
- Empty states (text, heading colors)
- Cards, dropdowns, popovers, modals (bg, border, shadow)

**New reusable components:**
- EmptyState.svelte - Supports icon and action snippets
- ErrorMessage.svelte - Supports dismissible errors

**Pages refactored:**
- /admin/projects - Uses EmptyState and ErrorMessage (~30 lines removed)
- /admin/posts - Uses EmptyState and ErrorMessage with icon (~30 lines removed)

**Benefits:**
- 60+ lines of duplicate styles removed (just 2 pages)
- Future dark mode = remap CSS variables in themes.scss only
- Guaranteed visual consistency for errors and empty states
- $unit-based spacing system enforced

**Remaining work (Phase 2):**
- Replace hardcoded colors in ~40 files
- Fix hardcoded spacing in ~20 files
- Expand EmptyState/ErrorMessage to remaining pages

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-08 21:28:28 -07:00
9cc7baddc6 refactor(admin): migrate dropdowns to clickOutside action
Updated components to use the new clickOutside action instead of manual
event listener management:
- ProjectListItem: Add clickOutside action and dropdown coordination
- AdminSegmentedController: Replace $effect with clickOutside action
- BubbleTextStyleMenu: Simplify click-outside handling
- BubbleColorPicker: Simplify click-outside handling
- Posts/Projects pages: Remove redundant page-level click handlers

The clickOutside action provides a cleaner, more maintainable way to
handle click-outside behavior with proper lifecycle management.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 21:58:34 -07:00
128a24ccde fix(admin): remove infinite loop in navigation guards
Fixed infinite loop caused by calling goto() inside beforeNavigate,
which would trigger the same navigation guard again.

The correct approach is to NOT cancel navigation, but simply await
the autosave flush. SvelteKit's beforeNavigate accepts async callbacks,
so navigation will naturally wait for the flush to complete before
proceeding.

Changes:
- Removed navigation.cancel() calls
- Removed goto() calls that created the loop
- Simply await autoSave.flush() and let navigation proceed

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 18:43:28 -07:00
8fa26fb39e fix(admin): replace navigation.retry() with goto() after flush
Fixed navigation guards in all forms that were calling the non-existent
navigation.retry() method. After canceling navigation and flushing autosave,
now properly uses goto() to navigate to the intended destination.

Files fixed:
- ProjectForm.svelte
- EssayForm.svelte
- PhotoPostForm.svelte
- SimplePostForm.svelte
- posts/[id]/edit/+page.svelte

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 18:34:56 -07:00
eebaf86b64 refactor(admin): migrate media list to use URL params and server loads
Refactored media list to follow SvelteKit data loading patterns:
- Removed client-side fetch() calls and manual state management
- Filter/sort/search state now driven by URL search params
- Page navigation triggers server-side reloads via goto()
- Mutations use invalidate('admin:media') to reload data
- Replaced error state with toast notifications for better UX
- Removed redundant loading state (handled by SvelteKit)

This completes Task 2 - all admin lists now use server-side data loading with proper session authentication.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 18:30:06 -07:00
32b4d16f9a refactor(admin): migrate Posts editor to runes-based autosave
- Update to use createAutoSaveStore with Svelte 5 runes
- Fix $derived syntax (use $derived.by for draftTimeText)
- Add hasLoaded flag to prevent autosave on initial load
- Add prime() call after loading post data
- Move draft recovery from inline header to prominent banner
- Implement missing restoreDraft() and dismissDraft() functions
- Only save draft on autosave failure (not every change)
- Smart navigation guard (only blocks if unsaved)
- Add beforeunload warning (only if unsaved changes)
- Update AutoSaveStatus to use reactive props
- Add keyboard shortcut and proper cleanup

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 13:31:27 -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
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
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
4d7ddf81ee feat(admin): add session-backed auth flow 2025-10-07 05:22:39 -07:00
c96def2789 feat: add minimal not-found error page 2025-10-07 03:18:17 -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
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
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
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
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