Fix column layout blocks not added from block picker (BUG #7)
Details
The block type picker's InsertBlockType() switch statement had no
cases for columns_2, columns_3, or columns_2_wide_left. Selecting
any column layout from the "/" palette or Add Block button silently
did nothing.
Fix: add AddColumnsBlock relay command to NotesViewModel that
delegates to the existing CreateBlockFromTypeId() (which already
handles all three column variants). Wire the three column type IDs
in the picker's switch statement to call the new command.
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.
Fix cover image buttons unclickable and positioned wrong (BUG #2)
Details
Cover image action buttons (Change/Reposition/Remove) were positioned
at top-right with Margin="0,44,12,0", placing them directly under the
ToolbarHoverZone (ZIndex=1, Height=120 when cover exists). The hover
zone captured all pointer events before they reached the buttons.
Fix: move buttons to bottom-right of the cover (VerticalAlignment=
Bottom, Margin="0,0,12,28") and set ZIndex=2 so they float above the
toolbar hover zone. Buttons now appear on cover hover and are fully
clickable.
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).
Get notified about new releases