- Add SerializedExtensionError TypeScript bindings from Rust
- Add ExtensionErrorCode enum export with ts-rs
- Create useExtensionError composable with type guards and error message extraction
- Fix developer page toast messages to show proper error messages instead of [object Object]
- Add getErrorMessage helper function for robust error handling across different error types
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add haextension.fs.showImage handler that delegates to frontend PhotoSwipe
- Add mobile.rs with open_file_with_provider command for future Android FileProvider integration
- Keep showImage as backwards-compatible no-op since image viewing is now handled client-side
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added new filesystem handler for opening files with the system's default viewer:
- Implemented haextension.fs.openFile handler in filesystem.ts
- Writes files to temp directory and opens with openPath from opener plugin
- Added Tauri permissions: opener:allow-open-path with $TEMP/** scope
- Added filesystem permissions for temp directory access
This enables extensions to open files (like images) in the native system viewer where users can zoom and interact with them naturally.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Split extensionMessageHandler into separate handler files
- Created handlers directory with individual files for database, filesystem, http, permissions, context, and storage
- Reduced main handler file from 602 to 342 lines
- Improved code organization and maintainability
- Add viewport utilities for safe area handling
- New viewport.ts utility with helpers for fullscreen dimensions
- Proper safe area inset calculations for mobile devices
- Fixed window positioning on small screens to start at 0,0
- Create UiDrawer wrapper component
- Automatically applies safe area insets
- Uses TypeScript DrawerProps interface for code completion
- Replaced all UDrawer instances with UiDrawer
- Improve window management
- Windows on small screens now use full viewport with safe areas
- Fixed maximize functionality to respect safe areas
- Consolidated safe area logic in reusable utilities
- Implement crypto utilities for vault key management (Hybrid-Ansatz)
- PBKDF2 key derivation with 600k iterations
- AES-GCM encryption for vault keys and CRDT data
- Optimized Base64 conversion with Buffer/btoa fallback
- Add Sync Engine Store for server communication
- Vault key storage and retrieval
- CRDT log push/pull operations
- Supabase client integration
- Add Sync Orchestrator Store with realtime subscriptions
- Event-driven sync (push after writes)
- Supabase Realtime for instant sync
- Sync status tracking per backend
- Add haex_sync_status table for reliable sync tracking
- Add haexSyncBackends table with CRDT support for multi-backend sync
- Implement useSyncBackendsStore for managing sync server configurations
- Fix desktop icon grid snapping for all icon sizes (small to extra-large)
- Add Supabase client dependency for future sync implementation
- Generate database migration for sync_backends table
- Add e.preventDefault() in handlePointerDown to prevent text selection
- Add @dragstart.prevent to prevent native browser drag
- Add select-none and @selectstart.prevent to workspace
- Add mouseleave event listener to reset drag state when leaving window
- Refactor grid positioning to use consistent iconPadding constant
- Increase icon spacing from 20px to 30px padding
- Add vertical grid offset (-30px) to start grid higher
- Remove screen-size dependent grid columns/rows (now fully dynamic)
- Fix dropzone visualization to use consistent snapToGrid function
- Clean up unused UI store dependencies
Prevent icons from being dragged beyond viewport boundaries on the x-axis.
Icons are now clamped to valid positions during drag, not just on drop.
- Added viewport bounds checking for both x and y axes during drag
- Icons stay within [0, viewport.width - iconWidth] horizontally
- Icons stay within [0, viewport.height - iconHeight] vertically
- Eliminates snap-back behavior when dragging near edges
Bump version to 0.1.8
This update migrates desktop grid settings from localStorage to the database
and introduces a comprehensive device management system.
Features:
- New haex_devices table for device identification and naming
- Device-specific settings with foreign key relationships
- Preset-based icon sizes (Small, Medium, Large, Extra Large)
- Grid positioning improvements to prevent dragging behind PageHeader
- Dynamic icon sizing based on database settings
Database Changes:
- Created haex_devices table with deviceId (UUID) and name columns
- Modified haex_settings to include device_id FK and updated unique constraint
- Migration 0002_loose_quasimodo.sql for schema changes
Technical Improvements:
- Replaced arbitrary icon size slider (60-200px) with preset system
- Icons use actual measured dimensions for proper grid centering
- Settings sync on vault mount for cross-device consistency
- Proper bounds checking during icon drag operations
Bump version to 0.1.7
- Dev extensions are now automatically opened in a window after successful load
- Simplified extension finding logic by using devExtensions directly
- Fixed table name handling to support both double quotes and backticks in permission manager
- Update window components to use fullscreen layout on small screens
- Adjust UI components styling for better mobile display
- Update desktop store for small screen handling
- Add missing filesystem permissions in capabilities
- fs:allow-applocaldata-read-recursive
- fs:allow-applocaldata-write-recursive
- fs:allow-write-file
- fs:allow-mkdir
- fs:allow-exists
- fs:allow-remove
- Fix Android photo picker URI handling
- Detect file type from binary signature (PNG, JPEG, WebP)
- Use manual path construction to avoid path joining issues
- Works with Android photo picker content:// URIs
- Improve error handling with detailed toast messages
- Show specific error at each step (read, mkdir, write, db)
- Better debugging on Android where console is unavailable
- Fix window activation behavior
- Restore minimized windows when activated
- Remove unused imports in launcher component
- Add workspace background image support with file-based storage
- Store background images in $APPLOCALDATA/files directory
- Save file paths in database (text column in haex_workspaces)
- Use convertFileSrc for secure asset:// URL conversion
- Add context menu to workspaces with "Hintergrund ändern" option
- Implement background management in settings
- File selection dialog for PNG, JPG, JPEG, WebP images
- Copy selected images to app data directory
- Remove background with file cleanup
- Multilingual UI (German/English)
- Fix launcher drawer drag interference
- Add :handle-only="true" to UDrawer to restrict drag to handle
- Simplify drag handlers (removed complex state tracking)
- Items can now be dragged to desktop without drawer interference
- Extend Tauri asset protocol scope to include $APPLOCALDATA/**
for background image loading
Moved database schemas from src-tauri/database/schemas/ to src/database/schemas/
to fix bundling issues and resolved circular import dependency that caused
"Cannot access uninitialized variable" error in production builds.
Key changes:
- Moved crdtColumnNames definition into haex.ts to break circular dependency
- Restored .$defaultFn(() => crypto.randomUUID()) calls
- Kept AnySQLiteColumn type annotations
- Removed obsolete TDZ fix script (no longer needed)
- Updated all import paths across stores and configuration files
- Add post-build script to fix Temporal Dead Zone error in generated code
- Remove debug logging from stores and composables
- Simplify init-logger plugin to essential error handling
- Fix circular store dependency in useUiStore
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Set useScope: 'global' in UI store to prevent i18n scope conflicts
- Add wrapper div to vault page to ensure single root node for transitions
- Fixes 'Duplicate useI18n calling by local scope' warning
- Fixes 'Component inside <Transition> renders non-element root node' warning
- Add UiButtonContext component for context menu support on buttons
- Implement vault trash functionality using trash crate
- Move vaults to system trash on desktop (with fallback to permanent delete on mobile)
- Add context menu to vault list items for better mobile UX
- Keep hover delete button for desktop users
- Fix extension signature verification on Android by canonicalizing paths (symlink compatibility)
- Implement proper safe-area-inset handling for mobile devices
- Add reactive header height measurement to UI store
- Fix maximized window positioning to respect safe-areas and header
- Create reusable HaexDebugOverlay component for mobile debugging
- Fix Swiper navigation by using absolute positioning instead of flex-1
- Remove debug logging after Android compatibility confirmed
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Changes:
- Added CLAUDE.md with project instructions
- Updated extension manifest bindings (TypeScript)
- Regenerated database migrations (consolidated into single migration)
- Updated haex schema with table name handling
- Enhanced extension manager and manifest handling in Rust
- Updated extension store in frontend
- Updated vault.db
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>