Fix DOCX export crash: copy NuGet dependencies to output
Details
Add CopyLocalLockFileAssemblies to the Notes plugin csproj. Without
this, NuGet dependencies like DocumentFormat.OpenXml and QuestPDF were
not copied to the build output. When the PluginLoadContext's
AssemblyDependencyResolver tried to resolve them at runtime, it failed
with FileNotFoundException because there's no runtimeconfig.json to
probe the NuGet cache.
This matches the pattern used by PrivStack.Plugin.Journal which also
has plugin-specific NuGet dependencies.
Style Notes image block with modern Journal photo treatment
Details
Wrap the image display in a styled Border with 8px corner radius,
clip-to-bounds, surface elevated background, dual-layer box shadow,
and hover lift animation (translateY -4px + expanded shadow, 200ms
cubic-ease transitions). Matches the PhotoLayoutBuilder cell styling
used in Journal.
Fix slash command not removing "/" from source block
Details
Setting rte.Markdown programmatically updates the visual display but
does NOT fire the TextChanged event, so the underlying model (e.g.
ParagraphBlock.Text) was never updated. When the ItemsControl
re-renders the block after inserting a new block (like a table), the
RTE reloads the stale model text which still contains the "/".
Add SyncRteToModel helper that copies rte.Markdown back to the model
(ParagraphBlock or HeadingBlock) after the programmatic slash removal.
This affects all block types created via "/" — table was the most
visible because inserting a non-RTE block forces a container recycle.
Add Ctrl+Tab block-level indent for all block types
Details
New feature: Ctrl+Tab indents the entire block (any type), Ctrl+Shift+Tab
outdents. Range 0–5 levels, 24px per level applied as left margin on
the BlockWrapper's outer border.
Model:
- Add IndentLevel property to PageBlock (serialized as "block_indent",
omitted when 0, clamped to 0–5 on read)
Serialization:
- PageBlockConverter.Read: parse "block_indent" from JSON
- PageBlockConverter.Write: emit "block_indent" when > 0
View:
- NotesView.OnKeyDown: Ctrl+Tab increments IndentLevel on the
top-level block, Ctrl+Shift+Tab decrements. Uses FindTopLevelBlock
to resolve the correct block even inside nested containers.
- Add FindParentOfType<T> helper for visual tree traversal
BlockWrapper:
- ApplyBlockIndentMargin: sets left margin on _outerBorder based on
PageBlock.IndentLevel, called on both OnLoaded and OnDataContextChanged
This is independent of ParagraphBlock.IndentLevel (Tab indent) which
applies a separate margin inside the block wrapper. Both can coexist.
Fix slash command inserting above blockquotes instead of after
Details
When "/" is typed inside a blockquote (or callout/group), FindParentBlock
returns the inner child PageBlock which isn't in CurrentBlocks, causing
IndexOf to return -1. The slash insert index falls back to stale
_savedBlockIndex, placing the new block at the wrong position.
Add FindTopLevelBlock helper that walks up the visual tree and returns
the first PageBlock found in CurrentBlocks. For nested containers, this
correctly resolves to the outer blockquote/callout block. For regular
blocks, it behaves identically to FindParentBlock.
The slash handler now uses FindTopLevelBlock instead of FindParentBlock
for index resolution.
Get notified about new releases