- Added emit_to_all_extensions method to ExtensionWebviewManager
- Implemented webview_extension_emit_to_all Tauri command
- Updated UI store to broadcast context changes to webview extensions
- Centralized event and method names using SDK constants
- Updated all handlers to use HAEXTENSION_METHODS constants
This enables proper context propagation (theme, locale, platform) to webview extensions.
- Added emit_to_all_extensions method to ExtensionWebviewManager
- Created webview_extension_emit_to_all Tauri command
- Updated UI store to use new command instead of emit()
- Broadcasts CONTEXT_CHANGED event to all webview windows
- Fixes dynamic context updates not reaching webview extensions
- Updated @haexhub/sdk dependency from 1.9.7 to 1.9.10
- Imported HAEXTENSION_METHODS and HAEXTENSION_EVENTS from SDK
- Updated all handler files to use new nested method constants
- Updated extensionMessageHandler to route using constants
- Changed application.open routing in web handler
- All method names now use haextension:subject:action schema
- Add check.rs with Tauri commands for checking web, database, and filesystem permissions
- Implement handlePermissionsMethodAsync in frontend to route permission checks
- Register permission check commands in lib.rs
- Add toast notification for permission denied errors in web requests
- Extensions can now check permissions before operations via SDK
- Rename ResourceType::Http to ResourceType::Web
- Rename HttpAction to WebAction
- Rename HttpConstraints to WebConstraints
- Rename Action::Http to Action::Web
- Add check_web_permission method to PermissionManager
- Optimize permission loading (only fetch web permissions)
- Add permission checks to extension_web_fetch and extension_web_open
- Update manifest.rs to use Web instead of Http
- Add extension_web_open Tauri command
- Validate URL format and allow only http/https
- Use tauri-plugin-opener to open URL in default browser
- Add handleWebOpenAsync handler in frontend
- Add web module in src-tauri/src/extension/web/mod.rs
- Implement extension_web_fetch Tauri command using reqwest
- Add WebError variant to ExtensionError enum
- Update frontend handler to call Rust backend via Tauri IPC
- Web requests now run in native context without CORS restrictions
- Rename http.ts to web.ts handler
- Implement handleWebMethodAsync with haextension.web.fetch support
- Add base64 body encoding/decoding
- Add timeout support with AbortController
- Convert response headers and body to proper format
- Update message handler to route haextension.web.* methods
- Add TODO for permission checks
This enables extensions to make web requests through the host app,
bypassing iframe CORS restrictions.
- 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
Removed unused parameters:
- allowed_origin from parse_extension_info_from_path in protocol.rs
- app_handle from resolve_path_pattern in filesystem/core.rs
The trash crate is needed for the move_vault_to_trash function which
moves vault files to the system trash instead of permanently deleting
them. Clippy incorrectly marked it as unused because it's only used
within a cfg(not(target_os = "android")) block.
When cargo clippy removed the unused trash import, the cfg attribute
accidentally applied to the ts_rs::TS import below it, making it
conditional for Android. This caused the Android build to fail with
"cannot find derive macro TS in this scope".
Moved the TS import out of the cfg block to make it available for all
platforms including Android.
Applied cargo clippy fixes to clean up codebase:
- Removed unused imports (serde_json::json, std::collections::HashSet)
- Removed unused function encode_hex_for_log
- Modernized format strings to use inline variables
- Fixed clippy warnings for better code quality
All changes applied automatically by cargo clippy --fix
- Add lucide and hugeicons to serverBundle collections for local bundling
- Add https://tauri.localhost and asset: protocol to CSP directives
- Prevents CSP errors and eliminates dependency on Iconify API
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>