- Auto-select the first chapter when a book opens so the editor is no
longer left on the placeholder (was the main `all I see is the title`
symptom).
- Stop markdownToNative from emitting text nodes with empty content and
defensively strip them in setEditorDoc; ProseMirror rejects such nodes,
which made editor.commands.setContent silently empty the whole editor.
- Home screen: delete a book (sent to trash, recoverable) and create a new
book in a folder named after it under ~/Documents.
- Add self-test coverage for new book + delete.
- Configure AppImage (primary) + Debian .deb (secondary) into releases/.
- White Folio app icon, Office category, io.atitlan.folio appId, folio
executable; no file associations (none invented).
- Bundle tests/selftest-scenario.js so the packaged binary can be exercised
in place via FOLIO_SELF_TEST (inert during normal launches).
- Search: a 'Search' button in the sidebar footer (or Ctrl/Cmd+F) opens a
modal that scans every chapter, lists matches grouped by chapter with
highlighted snippets, and jumps to and scrolls the match on click. Includes
a 'Match case' toggle.
- Manual save: remove the per-keystroke auto-save; a chapter is only persisted
via the new Save button or Ctrl/Cmd+S. Switching chapters or closing the book
with unsaved edits now prompts to save first.
- Extend the packaged self-test to exercise both features.
- Recolor the in-app glyph (Design B) to a solid white master and generate a
black variant; the desktop/app icon set (build/icons) is now the white
master at all sizes (verified bundled white in the AppImage/deb)
- In-app icon switches with the existing data-theme: black in Light mode
(visible on the light panel) and white in Dark mode (visible on the
near-black panel); the desktop/application icon stays white
- Export menu (PDF/DOCX/ODT) opens a workflow to export the entire book or
only selected chapters, with a canonical-order checklist + Select/Clear All
- Selected exports pass an ordered chapter list through the shared pipeline so
output follows book order (not click order); empty selection is rejected
- Filenames use a ' - Selected Chapters' suffix for partial exports
- PDF renders only the chosen chapters into the print container; DOCX/ODT build
from the selected chapters in order
- buildDocx/buildOdt now accept an explicit ordered chapter list, making that
list the single source of truth for export ordering (defaults to whole book)
- Emit real page breaks between chapters in DOCX, with none before the first
- Unify the DOCX/ODT handlers into one exportOffice pipeline (ODT still built
from the same DOCX via LibreOffice)
- Persist an app-wide zoom percentage (not per book) and apply it only to the
writing view (.editor-panes) so the sidebar/navigation stay fixed size
- Add a [-] [100%] [+] control to the chapter and Full Book headers, with a
click-to-reset level button
- Route Ctrl/Cmd+=, Ctrl/Cmd+-, and Ctrl/Cmd+0 to zoom in/out/reset,
intercepting the browser's native zoom
- Store an optional accent color on each ChapterEntry so it persists with the
chapter across switching, reordering, close/reopen, and restart
- Add a per-row color button that opens a palette popover (assign / change /
remove) and shows a small color dot in the sidebar, readable in Light/Dark
- Expose setChapterColor through the main/preload IPC bridge
- Migrate renderer from md-editor/md-format to a Tiptap-based native editor
(native-doc pipeline: native-doc, markdown-to-native, native-to-markdown,
native-assembly, migration, backup)
- Use pointer-event-based chapter reordering with grab/grabbing cursors to
avoid the Wayland prohibited-drop cursor while preserving reordering
- Add a persistent Home button that closes the open book and returns to the
Folio library/welcome screen
- Update app icons, package deps, theme styles, and tests
Exports now use the same typography as the Full Book editor — Georgia
serif at 12pt, 1.7 line spacing, and a blank-line gap between paragraphs -
so the on-screen editor and every exported format look consistent. DOCX/
ODT also gain a chapter break before each chapter after the first.
Replaces the old Default theme (which followed the OS color scheme) with a
fixed warm, writing-focused Light theme: off-white editor surface, charcoal
text, subtle warm-gray borders, and a restrained deep teal-green accent. The
selector now offers Light and Neonflux. Old saves storing "default" are
migrated to "light" in both the renderer and the main process, and the e2e
scenario now covers Light + Neonflux application, light/dark checks, theme
round-trips, and content preservation.
The main process now assembles the manuscript from the chapter files and
renders it to a Word document with the docx library, using the same
markdown-it plugin set as the on-screen renderer (highlight, callouts,
wikilinks). ODT is converted from that DOCX with LibreOffice running
headless, keeping the two formats consistent; a clear error is returned
when LibreOffice is missing. The Full Book header's single Export PDF
button becomes an Export menu (PDF/DOCX/ODT) wired to the File menu.
Tests: new run-office-export-test.mjs verifies DOCX/ODT structure,
chapter order and formatting; the e2e scenario exports through the real
IPC chain and checks magic bytes, extensions and the status notices.
Introduce a theme layer on top of the existing CSS custom properties.
All color tokens now live in themes.css, scoped by a data-theme
attribute on <html>, so a theme is just a new token block plus a
dropdown option - no code changes needed. The Default theme preserves
the existing light/dark behavior; Neonflux adds an electric-cyan dark
theme.
The active theme is chosen via a Theme selector in the sidebar footer
and persisted in a new main-process settings file (userData
settings.json) through getTheme/setTheme IPC, so it survives restarts.
Hard-coded on-accent, selection, shadow and backdrop colors across the
renderer were converted to semantic tokens so every theme stays
consistent.
Add a chapter dropdown plus Previous/Next buttons to the Full Book
toolbar. The dropdown lists every chapter in canonical order and the
buttons jump between them, scrolling the assembled manuscript so the
target chapter begins near the top of the viewport. Manual scrolling
keeps the dropdown in sync with the chapter currently on screen, and
reordering chapters while Full Book is open re-renders navigation to
match the new order immediately.
Navigation reuses the same chapter boundaries that drive page breaks,
so it can never drift from the assembled chapter order.
The printed book is rendered from the same markdown the editor writes, but
markdown-it escaped HTML and did not understand Folio's extensions, so
underlines, text/highlight colors, alignments, ==highlights==, callouts and
wikilinks all showed up as raw source text in the PDF. Render the print book
with a purpose-built print-format renderer that keeps every feature:
- html: true so the toolbar's <u>, <span style=...> and <div align=...>
pass through and render instead of appearing literally,
- ==highlight== rendered as <mark> (new inline rule),
- Obsidian callouts (> [!note] Title) rendered as styled divs with a bold
title (new core rule),
- wikilinks resolved to links via the shared wikilink plugin.
Add matching print styles for mark, underline and callout types, and e2e
assertions that none of these features leak as raw source into #printBook.
The previous export printed the CodeMirror editor, which only keeps a
virtualized window of lines in the DOM; on larger books the PDF could come
out truncated (only what was rendered around the viewport). Replace the
print path with a dedicated #printBook container: the renderer renders each
chapter of the assembled manuscript to plain HTML with markdown-it, and the
print stylesheet hides the entire app and shows that container instead.
Plain HTML paginates reliably regardless of editor viewport or scroll
position, every chapter after the first still starts on its own page, and
output is a properly formatted manuscript instead of raw markdown. Keep the
screen-only chapter-break separator in the Full Book editor.
Extend the e2e selftest to assert #printBook holds every chapter, is hidden
on screen, and that a 1500-line chapter reaches the print DOM and exported
PDF in full.
Print the Full Book window via webContents.printToPDF (A4, 1in margins),
reusing the existing print stylesheet so every chapter after the first
starts on its own page and all app chrome is stripped from the output.
Expose it as an Export PDF button in the Full Book header and a File menu
item, save via a native save dialog (self-test writes to FOLIO_TEST_PDF),
and force light-on-white colors in print so dark-mode exports stay readable.
Add e2e coverage that exports through the real renderer->IPC->print chain
and verifies a valid non-empty PDF is written.
Set effectAllowed to copyMove in dragstart so Chromium renders a valid
drop cursor over chapter rows on X11 and other platforms (the effective
operation remains move via dropEffect). On native Wayland the prohibited
cursor persists as a known upstream Chromium/Electron platform
limitation; no DOM change can reach it.
The Full Book pane had no CSS rule, so it fell back to block layout:
the CodeMirror editor grew to the full manuscript height and was
clipped by the overflow-hidden workspace, leaving the content below
the first screen unreachable and making a multi-chapter book appear
as a single chapter. Give .full-book-view the same flex-column layout
as .chapter-view so the editor is bounded and scrolls internally.
Add an e2e assertion (fbLayoutOk) that checks the computed layout is a
flex column with the editor bounded to the viewport, so this class of
rendering regression is caught in future runs.
Full Book now assembles from a fresh read of the canonical book metadata
(chapter order + chapter entries) instead of the renderer's in-memory
chapter array, so it always contains every chapter in the current order
and can never render from stale or partially-loaded state. The chapter
sidebar and Full Book share the same single source of truth.
Also refresh Full Book whenever book metadata loads, and extend the e2e
scenario to cover reordering to a new order, order persistence across
reopen, and delete/rename/new-empty chapters all being reflected.
Route the renderer select-all listener (previously sent but never handled) to
the active editor, and extend the e2e scenario to verify the Full Book
assembly, stats, Copy All clipboard content, and read-only select-all.
- Bind Ctrl+Shift+S to strikethrough
- Smart code toggle: fenced block for multi-line selections, inline otherwise
- Link editing: selecting an existing link now selects its URL for editing
- Route undo/redo shortcuts through IPC so CodeMirror history is used when
the editor has focus instead of Electron's native menu-role undo/redo
- Add Indent/Outdent toolbar buttons