Commit graph

125 commits

Author SHA1 Message Date
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
86b072c70f fix: convert final $: reactive statement to $effect
Replace remaining $: if statement with $effect for slug generation in InlineComposerModal.
2025-11-04 19:49:42 -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
314885b704 feat: add utility components and helpers
Add DropdownSelectField and StatusPicker components for form inputs. Add time utility functions.
2025-11-03 23:03:50 -08:00
9403cd047c feat: add sticky header with scroll shadow to admin pages
Make page headers sticky with subtle shadow on scroll. Fix min-height to 90px to prevent jumping when switching tabs. Modernize layout to use full viewport height.
2025-11-03 23:03:40 -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
6ca6727eda refactor: modernize ProjectBrandingForm with reusable components
Extract BrandingToggle and BrandingSection components. Consolidate $effect blocks, add $derived state, and apply BEM naming. Reduces component size by 47% while improving maintainability.
2025-11-03 23:03:20 -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
48e53aea3a feat(admin): complete Task 5 dropdown primitives (Option A)
Task 5 was ~85% complete when reviewed. This commit finalizes the
implementation with minimal cleanup and comprehensive documentation.

Changes:
- Refactored GenericMetadataPopover to use clickOutside action
  - Removed manual document.addEventListener for click outside
  - Now uses standardized action with trigger exclusion logic
  - Cleaner code, consistent with other components

Documentation:
- Created task-5-dropdown-primitives-completion.md
- Documented existing infrastructure (clickOutside, BaseDropdown)
- Justified 15 remaining manual event listeners
- API documentation for clickOutside action and BaseDropdown

What Already Existed:
- clickOutside action (full TypeScript, proper cleanup)
- BaseDropdown component (Svelte 5 snippets)
- Dropdown primitives (DropdownMenuContainer, DropdownItem, DropdownMenu)
- ~10 components already using clickOutside
- Specialized dropdowns (StatusDropdown, PostDropdown, etc.)

Justified Exceptions (manual listeners kept):
- DropdownMenu.svelte: Complex submenu logic with Floating UI
- ProjectListItem/PostListItem: Global dropdown coordination pattern
- BaseModal + forms: Keyboard shortcuts (Escape, Cmd+S)
- Various: Scroll/resize positioning (layout concerns)

Decision: Did NOT use Runed library
- Custom clickOutside implementation is production-ready
- No advantage from external dependency
- Current solution is type-safe and well-tested

Phase 3 (List Utilities & Primitives) now complete!
- Task 4: List filtering utilities 
- Task 5: Dropdown primitives 

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-08 19:47:09 -07:00
34a3e370ec refactor(admin): modularize ProjectForm with composable stores
Extract reusable form patterns following Svelte 5 best practices:

**New Store Factory** (`project-form.svelte.ts`)
- Centralizes form state management with `$state` and `$derived` runes
- Provides validation, payload building, and field mutation methods
- Type-safe with ProjectFormData interface
- Reusable across different contexts

**New Helpers**
- `useDraftRecovery.svelte.ts`: Generic draft restoration with auto-detection
- `useFormGuards.svelte.ts`: Navigation guards, beforeunload warning, Cmd+S shortcut
- `DraftPrompt.svelte`: Extracted UI component for draft recovery prompts

**Refactored ProjectForm.svelte**
- Reduced from 720 lines to 417 lines (42% reduction)
- Uses new composable helpers instead of inline logic
- Cleaner separation between UI orchestration and business logic
- All form state now managed through formStore
- Draft recovery, navigation guards fully extracted

**Benefits**
- Reusable patterns for PostForm, EssayForm, etc.
- Easier to test helpers in isolation
- Consistent UX across all admin forms
- Better maintainability and code organization

Closes Task 3 of admin modernization plan (Phase 2)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 23:24:50 -07:00
3fded37d64 fix(svelte5): update event handler syntax from on:clickoutside to onclickoutside
Update all clickOutside action usages to use Svelte 5's new event handler
syntax. Replace deprecated `on:clickoutside` with `onclickoutside` across
all components to fix Svelte 5 compilation errors.

Fixed in:
- ProjectListItem
- AdminSegmentedController
- BaseDropdown
- PostDropdown
- BubbleTextStyleMenu
- BubbleColorPicker
- EssayForm
- BasePane

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 22:16:13 -07:00
7300bd672b refactor(admin): update EssayForm to use clickOutside action
Replace manual click event listener with clickOutside action for the
publish menu dropdown. This simplifies the code and ensures consistent
click-outside behavior across all admin dropdowns.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 22:00:06 -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
97a80d9c3e feat(admin): add clickOutside action and update dropdowns
Created a reusable clickOutside Svelte action that dispatches a custom
event when users click outside an element. This replaces manual
document.addEventListener patterns.

Features:
- TypeScript support with generic event types
- Configurable enabled/disabled state
- Optional callback parameter
- Proper cleanup on destroy
- setTimeout to avoid immediate triggering

Updated components to use the new action:
- BaseDropdown.svelte: Removed $effect with manual listeners
- PostDropdown.svelte: Replaced manual click handling

Part of Task 5 - Click-Outside Primitives

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 21:33:33 -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
fe923c3dbf refactor(admin): add autosave to SimplePostForm
Added runes-based autosave functionality to SimplePostForm:
- Added autosave store with updatedAt conflict detection
- Smart navigation guards and beforeunload warnings
- Draft recovery banner instead of inline prompt
- Only saves to localStorage on autosave failure
- Added AutoSaveStatus component
- Fixed $derived syntax to use $derived.by()

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 14:19:38 -07:00
6ed1b0f1a8 refactor(admin): add autosave to PhotoPostForm
Added runes-based autosave functionality to PhotoPostForm following the same pattern as EssayForm:
- Added autosave store with updatedAt conflict detection
- Smart navigation guards and beforeunload warnings
- Draft recovery banner instead of inline prompt
- Only saves to localStorage on autosave failure
- Added AutoSaveStatus component

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 14:04:20 -07:00
c49ce5cbb5 feat(admin): add runes-based autosave to EssayForm
- Add createAutoSaveStore for edit mode
- Add updatedAt tracking for conflict detection
- Add hasLoaded flag to prevent autosave on initial load
- Prime autosave after initial data loads
- Add AutoSaveStatus indicator in header
- Move draft recovery from inline to prominent banner
- Only save draft on autosave failure (not every change)
- Smart navigation guard (only blocks if unsaved)
- Add beforeunload warning (only if unsaved changes)
- Add keyboard shortcut (Cmd/Ctrl+S)
- Add proper cleanup on unmount
- Update clearDraft calls in restore/dismiss functions
- Fix $derived syntax (use $derived.by for draftTimeText)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 14:00:28 -07:00
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
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
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
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
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
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
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
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
e36f70d8c2 fix: ensure editor placeholder shows on initial page load
- Always initialize editor with content to create paragraph node
- Remove logic that prevented setting empty paragraph content
- Remove unused initialized variable
- This ensures the placeholder is visible when editor first loads

The issue was that the editor needs at least one paragraph node
for the placeholder to display, but the previous logic prevented
this from happening on initial load.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-26 14:17:03 -04:00
7abc1f3e63 fix: convert PublishDropdown to use Svelte 5 snippets
Replace old slot syntax with new snippet syntax to fix compilation error.
BaseDropdown expects snippets as props, not slots.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-26 13:49:15 -04:00
64b5a8e73c refactor: update media modals to use extracted components
- Replace inline grid with MediaGrid component
- Replace upload zone with FileUploadZone component
- Replace file list with FilePreviewList component
- Replace metadata sections with dedicated components
- Simplify media selection to idiomatic Svelte patterns
- Remove non-idiomatic composable pattern

This completes the media modal consolidation, reducing duplication
and improving maintainability.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-26 13:47:10 -04:00
2ec0be092e refactor: extract reusable components from media modals
- Create MediaGrid component for media selection grid (~150 lines)
- Create FileUploadZone component for drag-and-drop uploads (~120 lines)
- Create FilePreviewList component for upload preview (~100 lines)
- Create MediaMetadataPanel component for media details (~150 lines)
- Create MediaUsageList component for usage tracking (~80 lines)
- Add mediaHelpers.ts utility for file operations

This reduces ~750-800 lines of duplicate code across media modals.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-26 13:46:52 -04:00
82c39de7ea feat: implement enhanced bubble menu with text styles and color pickers
- Add ComposerBubbleMenu with formatting tools and dropdowns
- Create BubbleTextStyleMenu for paragraph/heading/list selection
- Add BubbleColorPicker with preset palettes and custom color selection
- Use lighter pastel colors for highlight presets
- Implement circle color swatches with even grid spacing
- Add strikethrough support and improved hover states
- Use absolute positioning to prevent scroll issues
- Integrate with existing editor configuration

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-26 12:07:24 -04:00
15ce9caae9 style: enhance toolbar with glassmorphism and improved design
- Add white background with subtle gray border and rounded corners
- Remove initial drop shadow, add shadow on hover
- Reduce vertical padding for more compact design
- Update button hover states to use darker gray
- Add sticky positioning with gap from top
- Improve responsive padding and animations

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-26 11:58:34 -04:00
2f20209d66 feat: add toolbar feature flag to disable toolbar in favor of bubble menu
- Add toolbar property to ComposerFeatures interface
- Update default features to disable toolbar for inline/full variants
- Add conditional rendering check for toolbar feature flag
- Enable bubble menu by default for better UX

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-26 11:58:10 -04:00
1c38dc87e3 fix: drag handle actions now affect the correct block
- Added menuNode state to capture the node position when menu opens
- Updated all action functions to use menuNode instead of currentNode
- This ensures drag handle actions (Turn into, Delete, etc.) always affect the block where the handle was clicked, not where the mouse currently hovers
- Also formatted code with prettier

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-26 10:33:27 -04:00
569a124d02 style: move editor padding to block elements for better drag handle interaction
- Remove horizontal padding from editor container
- Add 3rem (2rem on mobile) horizontal padding to all block elements
- Ensures drag handle appears when hovering over visual margins
- Properly handle nested elements (blockquotes, lists, tables) to prevent double padding

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-26 10:11:43 -04:00