v0.3.0
May 22, 2026
Highlights
Rendered edit session (WYSIWYG block switching)PDF & themed HTML exportExecutable code blocks (shell/Python)Mermaid first wave: insert toolbar, validation, flowchart polisheframe/egui 0.34.2 + Rust 1.92 MSRVPhosphor icon set — full UI refreshSplit-view scroll syncQuick note workflowWorkspace file index (Ctrl+P / Ctrl+Shift+F)User-configurable accent color
Added
- • Rendered edit session (Tasks 94–105) — consolidated WYSIWYG architecture: one click opens any block (heading, paragraph, list item, formatted block, table cell); previous block commits automatically. Block-commit undo: each block close produces one logical Ctrl+Z step
- • Native PDF export (File → Export → PDF…) — page size, margins, optional H1 page breaks, link annotations via krilla + krilla-svg
- • Print preview — reuses PDF render path; opens in in-app PdfViewer tab
- • Themed HTML export — theme-aware CSS, Mermaid as inline SVG, syntect-highlighted code blocks, export options dialog
- • Executable fenced code blocks — Run control in rendered/split preview for shell & Python; background worker; inline ANSI-colored output; exit status; insert output as fenced block
- • Code execution settings — master enable, shell/Python toggles, timeout (default 30 s, max 300 s), hard timeout, user Stop, first-run consent modal
- • Mermaid: Insert → Mermaid… toolbar with per-diagram templates; About/Help syntax section and snippets
- • Mermaid inline validation — parse-time errors, warning header, last-good diagram fallback, squiggles in raw editor
- • Mermaid flowchart: extra shapes & style/classDef, state fork/join/history pseudostates
- • Mermaid flowchart edge routing & layout polish — edge–node obstacle avoidance, TD/BT layer centering, stable back-edge side channels with parallel lanes, inner back-edge direct path, branch parent snap, same-layer sibling spacing safety net
- • eframe / egui upgraded to 0.34.2 — skrifa + vello_cpu text backend; Phosphor 0.12; Popup & Tooltip APIs; Windows glow renderer retained
- • HarfRust validation under egui 0.34 — cluster shaping, 32 unit tests
- • MSRV raised to Rust 1.92 — rust-toolchain.toml, CI, package.rust-version
- • Phosphor icon font (egui-phosphor 0.12.0) — all chrome, ribbon, toolbars, panels, preview, viewers now use Phosphor instead of emoji or mixed Unicode
- • Split-view scroll sync — source line + fraction anchors keep raw editor and rendered preview aligned; Sync & 2-way controls on minimap footer; persists to settings
- • Mode-toggle scroll sync (Ctrl+E) — Raw ↔ Rendered preserves position via same hybrid strategy
- • Quick note workflow (on by default) — pathless tabs no longer block quit; empty untitled tabs close silently; closing a modified untitled tab still prompts; double-click to name; session recovery for unsaved text
- • Workspace file index — Ctrl+P and Ctrl+Shift+F search the entire workspace on a background thread; animated progress bar; index rebuilds on file create/delete/rename
- • User-configurable accent color — color picker in Settings → Appearance and Welcome; drives headings, selection, tabs, hub chrome, status bar
- • Spanish UI language (Español) — locale es / es-* detection
- • Productivity Hub polish — card layout, Pomodoro emphasis, floating × re-docks to sidebar, stable docked widths, detached window respects user resize
- • source_epoch widget identity — stable TextEdit ids under per-tab epoch counter; caret stays visible while typing in rendered headings (RS-2)
- • Workspace file index improves Quick Switcher (Ctrl+P) search quality — tokenizes paths on -, _, ., separators; includes both indexed and recent files; replaced loose full-path fuzzy matching
Improved
- • Build warnings: four-phase cleanup (Tasks 90–93) — cargo build goes from ~268 warnings to zero: unused imports, unused locals, egui 0.34 API migrations (Ui::close_menu → close, ComboBox::from_id_salt, Frame::corner_radius, etc.), dead_code audit
- • Undo granularity in raw mode — removed 500 ms time-based merging; each record_operations call is its own undo step; replace edits still undo atomically
- • Rendered mode block-commit undo — keystrokes inside active rendered block stay off the undo stack until close/switch; one logical step per commit
- • Main ribbon toolbar always icon-only — removed collapse/expand and section labels; fixed compact 28 px bar; tooltips and shortcuts unchanged
- • UI icons: emoji → Phosphor throughout — sharper, theme-consistent glyphs at all DPI scales
- • Flowchart TD/BT layer centering on max_cross_size instead of available_width — eliminates large empty left strip
- • Rendered view: scroll ratio preserved on viewport-culling remeasure — no layout nudges unrelated to sync
- • Per-document view mode (Raw/Split/Rendered) restored on reopen — closed tabs upsert into last_open_tabs; settings merge without erasing closed-file state
Fixed
- • CRITICAL: Smart-paste crash (STATUS_STACK_BUFFER_OVERRUN) — pasting text with a colon followed by multi-byte UTF-8 (Hebrew, Bengali, Hindi, emoji) caused abort in release builds. Fixed s.get(colon_pos..colon_pos+3) instead of direct slice. 5 regression tests
- • CRITICAL: Restored recovery snapshots dropped all edits on second crash cycle — Tab::with_file anchored original_content to recovered buffer, poisoning disk_content_hash. restore_from_session_result now constructs from on_disk_content and swaps buffer via set_content
- • Recovery / autosave cross-tab data loss — recovery and autosave now require path-and-disk-hash identity before applying; mismatches rejected; non-blocking banner for diverged content
- • Double-click required to switch WYSIWYG blocks (RS-1, RS-4, RS-5) — fixed by RenderedEditSession::switch_to_ui; one click closes active block and opens target
- • Cursor flash or disappear while typing in rendered headings (RS-2) — content_hash-based id remaps destroyed caret state; stable ids under source_epoch fix this
- • Formatted list/paragraph stuck in raw edit mode after clicking away (RS-3) — immediate save/exit on dismiss; formatted_editing cleared on switch
- • Rendered/split tables: two clicks to edit another cell — superseded by session-integrated table cells (BlockRef::TableCell, signal_table_force_commit)
- • Mermaid flowcharts shifted right with large left gap (#83, FC-83a) — TD/BT layers now centered on max_cross_size; back-edge padding only on sides that need loop clearance
- • Split/rendered view: only first of consecutive fenced code blocks visible (#129)
- • Empty markdown table cells hard to focus / edit (#131) — hit targets and Tab/Shift+Tab for empty cells
- • Multi-cursor copy/cut only copied primary selection — selected_text() now joins every non-empty selection (VS Code style); regression test added
- • Search in Files panel grew to full window height — results scroll inside fixed-height region; max 480 px; window fade disabled
- • Rendered/split scroll ghost snap with sync off — turning sync off clears tab pending targets and resets SyncScrollState
- • Split 2-way sync: preview jumped up when scrolling to bottom — top/bottom snaps from rendered pane now use SyncScrollState::set_raw_target()
- • Crash recovery dropped file opened on cold start — startup paths from CLI/file association deferred until session recovery dialog answered
- • Rendered view: scroll jump when toggling task list checkboxes — reuses culling layout when block structure unchanged; only wheel/scrollbar drag treated as active scroll
- • CSV rendered view: long cell text overflowed column bounds — truncate_cell_to_pixel_width() with font-metrics binary search; painter clip rect
- • Frontmatter panel stale after tab switch — cache keyed on (tab_id, content_version); regression tests
- • Document nav buttons visible above modal overlays — nav buttons use Order::Middle; suppressed while Ctrl+P / palette / search panel open
- • Status-bar Help (?) vs bottom-right resize (I-1, WIN-5) — consume_clicks_in_resize_zones prevents edge widgets stealing resize clicks
- • Integrated terminal: CJK paste/input local-echo (I-2, TRM-3) — UTF-8 init on shell spawn (PSReadLine, chcp 65001); lazy CJK font load on CJK input
- • Quick note workflow: closing untitled tabs with content did not prompt to save — Tab::should_prompt_to_save takes SavePromptContext; tab close still shows dialog; app exit stays frictionless
- • Export menu double icons (PDF, Print preview) — stripped duplicate emoji from export labels in all locale files
- • Outline panel tab selector layout — Phosphor icons broke hit-testing; fixed with painter-based dual-font tab labels
- • Detached Productivity Hub fought resize — removed width floor; clipped inner content; viewport-based max size only