Bump version to 0.2.0 across manifest, package and versions files, and
add a CHANGELOG. Highlights: a paged reading mode, a Solarized Dark
theme, iOS/iPadOS font suggestions, text selection/copying, and various
theme and default tweaks.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Use setCssStyles() for the paged-mode inline styles and the TOC row
indent instead of assigning to element.style directly.
- Create the font <datalist> with createEl() instead of
document.createElement().
- Move the CSS multi-column properties (column-fill and break-inside)
out of styles.css into inline setCssStyles calls, so the stylesheet no
longer trips the multicolumn browser-support warning. Also fixes the
paged block-image max-height selector.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Handle two-finger horizontal trackpad swipes (wheel events with deltaX)
to turn pages in paged mode. The handler is non-passive so it also
suppresses the browser's back/forward overscroll navigation. A lock held
until the event burst (including momentum) settles guarantees a single
swipe turns at most one page.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a "Reading mode" setting (Scroll / Paged) alongside the existing
continuous scroll. In paged mode the book layer is laid out into
full-width CSS columns (one column = one page) and slid horizontally by a
transform to turn pages, with symmetric side margins so neighboring pages
never peek in. Pages turn via tap zones, keyboard (arrows/space/PageUp
/PageDown) and touch swipes, and a "Page X of Y" indicator is shown.
Reading position is stored as a block index shared with scroll mode, so
switching modes keeps the reader's place; TOC and cross-reference
navigation jump to the target's page. Pagination is recomputed on resize
and on font/size/line-height/theme changes.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Give the TOC side panel the "book-open" icon, matching the reader tab,
instead of the generic "list" icon that looked like Obsidian's outline.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Obsidian applies user-select: none to its UI chrome, which custom views
inherit, so book text couldn't be selected or copied. Re-enable
user-select on the reader container.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add "Solarized dark" to the theme picker (both settings render paths),
its body-class toggling and cleanup, and the CSS color block using
Ethan Schoonover's Solarized palette (base03 background, base0 text,
base01 muted, blue links). Also expose the base0 text color (#839496) as
a "Solarized" preset in the text color picker.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Use the softer #9c9ca4 (the dark theme's muted gray) for the Light gray
text color option instead of #c4c4c4.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Footnote markers and their "↩" back links navigated poorly in the
continuous reader, so drop the links entirely: a footnote (type="note")
now renders as a non-clickable superscript showing only its number (any
"note" label is stripped), hugging the preceding word with no space.
Removes the back-link machinery (jumpOrigin, the backref click branch,
and the .fb2-backref styles); regular internal cross-references still
navigate.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Drop caps should never be shown, so remove the setting entirely: the
dropCaps field and default, the settings entries in both render paths,
the class toggling in applySettings, and the CSS rules. A leftover
dropCaps key in existing data.json is harmless and now ignored.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Update the default reading settings: line height 1.65 -> 1.5 and font
size 17px -> 16px, including the CSS fallback and the settings hints.
Existing users keep their saved values.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Trim the text color dropdown to black, dark gray, light gray, white and
sepia brown (plus the theme default). Adds pure white, which was
missing, and drops the intermediate gray shades. Saved custom colors are
preserved by the existing "add current value if absent" logic.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Make the dark theme background solid black (#000000) instead of dark
gray, and the light theme background pure white (#ffffff) instead of
off-white beige.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
WebKit exposes no queryLocalFonts API, so on iOS/iPadOS the installed
fonts can't be enumerated and the Font setting fell back to a bare text
field. Offer the standard iOS/iPadOS system fonts as datalist
suggestions instead, keep free-form entry for any other installed font,
and explain the limitation in the setting description. Applied to both
the declarative (1.13+) and imperative settings render paths.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The catalog lint (obsidianmd/no-unsupported-api) flagged the two
this.update() calls: the method exists only on Obsidian 1.13+, above
the declared minAppVersion 1.7.2. Route both through refreshTab(),
which looks update() up at runtime and falls back to display() on
older versions.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0.1.2 required Obsidian 1.13.0 for the declarative settings API, but
1.13.x is currently Catalyst-only. Restore the imperative settings-tab
fallback so the plugin works on the latest free release (1.12.7); the
declarative path still takes over on 1.13+.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Type loadData() result as Partial<Fb2Data> instead of implicit any
- Schedule requestAnimationFrame on the view's owning window
(contentEl.win) so timing works in popout windows
- Drop !important from theme backgrounds; selector specificity
already wins over Obsidian's .view-content rule
- Adopt the declarative settings API (getSettingDefinitions +
getControlValue/setControlValue) so settings appear in the settings
search on Obsidian 1.13+; the imperative display() stays as a
fallback for 1.7.2-1.12
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
workspace.revealLeaf returns a Promise since Obsidian 1.7.2, which is the
API shape this code is built against; declaring 1.4.0 was inaccurate.
Handle the returned promise explicitly at both call sites.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The community catalog validator rejects descriptions that mention
Obsidian; start with an action verb instead and describe the features.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The manifest id allows only lowercase letters and hyphens, so the digit
in "fb2-reader" is invalid. Display name stays "FB2 Reader".
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Drop .zip handling entirely: register only the .fb2 extension (claiming
zip would hijack every archive in the vault), remove fflate dependency
- Align versions at 0.1.0 (manifest.json, package.json), add versions.json
- Replace GUIDE.md with a concise English README.md, translate all code
comments to English
- Harden decoding: strict UTF-8 validation (fatal) with windows-1251
fallback when the XML encoding declaration lies
- Security: allow only http(s) schemes in external links, blocking
javascript: URLs from malicious files
- Footnote jumps now leave a return link; unknown text-only tags degrade
to a paragraph instead of being dropped; optional drop caps setting
- Performance: render large books in per-frame slices via a work queue;
images as lazily decoded blob object URLs, revoked on close
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>