Fix SplitPaneLayout: use Border hosts instead of ContentPresenter
Details
ContentPresenter outside a ControlTemplate doesn't reliably present
Control content in Avalonia. Replaced with Border hosts that use
Child property directly.
Also fixed MeasureOverride: was returning availableSize which could
contain Infinity, causing the layout system to give zero size. Now
clamps infinite dimensions and measures each child with its
proportional share of space.
Add SplitPaneLayout shared control to UI.Adaptive
Details
Code-only Border subclass with a custom inner Panel that arranges
two content panes and a draggable resize handle using ratio-based
math. Avoids the star-column minimum width issues that plague
Grid-based split implementations.
Properties: Ratio (pane2 fraction), MinRatio, MaxRatio, HandleSize,
Pane1, Pane2. Fires RatioChanged event on drag release for
persistence. During drag, uses an internal _dragRatio for live
feedback without updating the bound property on every pixel.
Replaces the inline resize logic pattern found in Tasks and Data
plugins with a single reusable component.
Fix cloud sync pushing local_only entities (CalDAV/ICS events)
Details
Events from external sources (CalDAV subscriptions, ICS feeds) are
marked local_only in the database and should never be synced to cloud
or P2P — the remote server is the source of truth.
Two defense-in-depth guards added:
1. SdkHost.NotifySyncIfMutation: Skip sync notification entirely when
the SDK request carries the local_only parameter. This prevents
the outbound pipeline from ever seeing local_only mutations.
2. SyncOutboundService.NotifyEntityChanged: Parse the entity payload
JSON and reject entities where local_only is true. Catches any
edge case where a local_only entity reaches the outbound path
without the parameter (e.g. ViewModel-initiated edits).
Make API docs dialog dynamically populate endpoints from plugins
Details
Replace hardcoded Tasks/Projects endpoint sections with an ItemsControl
that discovers all IApiProvider plugins at runtime via IPluginRegistry.
Each plugin gets a collapsible Expander showing its routes with color-coded
HTTP methods (GET=green, POST=primary, PATCH=warning, DELETE=danger).
- LoadRoutes() resolves plugin display names from metadata
- MethodBrush resolved from theme resources at load time
- Empty state shown when no plugins register API endpoints
- Shell endpoints (status, routes) remain static
Add API documentation dialog and View Documentation link
Details
New ApiDocsWindow dialog accessible from Settings > Developer via
"View Documentation" link. Shows a comprehensive guide with:
- Overview of the local API and its purpose
- Authentication instructions (X-API-Key and Bearer token)
- Step-by-step getting started guide with curl examples
- Full endpoint listing (shell, tasks, projects) with color-coded
HTTP methods (GET/POST/PATCH/DELETE)
- Create and search task examples with complete curl commands
- Security note about localhost-only binding and key management
Get notified about new releases