Add block nesting and column layouts to Notes editor
Details
Introduces hierarchical block nesting via PageBlock.Children, enabling blocks to
own nested child blocks. This is the foundation for indentation, toggle sections,
and structured content like numbered lists with nested bullet lists or code blocks.
Model changes:
- Added Children property to PageBlock for universal block nesting
- Added ChildBlocks property to PageListItem and PageTaskItem for mixed-content
list items (e.g. a numbered item owning a code block)
- Added ColumnLayoutBlock and PageColumn types for side-by-side column layouts
- Updated PageBlockConverter to serialize/deserialize children and column_layout
- Updated PageBlockContentConverter for ColumnLayout type support
- Created BlockPath record for addressing blocks within nested trees
- Created BlockTreeHelper with tree navigation utilities: FindBlockById,
GetBlockAtPath, GetParentList, FlattenTree, IndentBlock, OutdentBlock
Rendering:
- BlockWrapper.axaml now renders nested children via recursive ItemsControl
with 24px left margin indentation per depth level
- Added Depth styled property to BlockWrapper for depth-aware rendering
- Added drop-as-child visual indicator (border glow when dropping on center)
- Created ColumnLayoutEditor control with resizable columns, add/remove column
buttons, and per-column block rendering
- Added ColumnLayoutBlock DataTemplate to NotesView.axaml
Editing operations:
- Added NestBlockAsChild, IndentBlock, OutdentBlock to NotesViewModel
- Tab/Shift+Tab keyboard shortcuts for indent/outdent in NotesView
- Extended drag-drop to support three zones: drop-above (top 25%), drop-as-child
(center 50%), drop-below (bottom 25%)
- Added column layout entries to block type picker (2 columns, 3 columns, 70/30)
- Extended GetBlockText and TryDeleteEmptyBlock for ColumnLayoutBlock
All changes are backward compatible — existing documents without children
deserialize with empty lists. Version bumped to 1.60.0.
Add live cross-block drag selection to Notes editor
Details
Implements Google Docs-like drag selection across block boundaries. When a user
clicks in one block and drags into another, text is selected continuously across
all blocks in between.
How it works:
- RichTextEditor detects when a drag moves outside its vertical bounds and fires
DragSelectionEscaped (new event from UI.Adaptive 1.59.2)
- NotesView registers tunnel PointerMoved/PointerReleased handlers on escape
- The parent hit-tests blocks to find the current target, sets partial selection
on edge blocks and full selection on intermediate blocks
- CrossBlockSelection now carries optional StartCharOffset/EndCharOffset for
partial text selection on the first/last block
- GetCrossBlockSelectedText uses char offsets so Cmd+C copies only the
drag-selected portion, not full block text
The selection persists until dismissed (click, Escape, or typing), matching
existing Shift+Click and Cmd+A cross-block selection behavior.
Version bump: 1.58.0 → 1.59.0
Add cross-block text selection for Notes editor
Details
Implements document-like selection across block boundaries in the block
editor. Double-tap Cmd+A selects all blocks (first tap selects within
the focused block, second escalates to all blocks). Shift+Click extends
selection from the anchor block to the clicked block. Selected blocks
receive a visual highlight overlay via the block-cross-selected CSS class.
Cmd+C copies aggregated text from selected blocks separated by blank
lines. Cmd+X copies and deletes. Delete/Backspace removes selected
blocks. Escape or clicking into a single block clears the selection.
Typing any character also dismisses the selection.
State is managed via CrossBlockSelection record on NotesViewModel with a
static event that BlockWrapper instances subscribe to for highlight
updates. No SDK or UI.Adaptive changes required.
Add chart query error recovery in ChartDataLoader
Details
When a dataset chart query fails with a binder or aggregation error,
the loader now sends a ChartQueryErrorMessage to the shell's
DatasetInsightOrchestrator for AI-assisted correction. The AI returns
a fixed chart config which is retried once. Recovery has a 15-second
timeout and only attempts one retry to prevent infinite loops.
Notes plugin version bump to 1.56.0.
Data plugin: visual overhaul + smart delete with reference checking
Details
Flatten sidebar item styling (smaller icons, tighter margins) to match
Notes' minimal aesthetic. Add hover-reveal (x) delete buttons on Views
and AI Generated list items. Extract delete logic into partial class
DataViewModel.Delete.cs with async reference search — on delete request,
the overlay now checks for cross-plugin entities referencing the dataset
via SDK SearchAsync and displays clickable navigation links before
confirming. Add DatasetReference model, wire IPrivStackSdk through
DataPlugin. Bump version to 1.20.0.
Get notified about new releases