- Resolves Obsidian plugin-evaluation styling warnings: removes all `!important` declarations from `styles.css` (overriding via selector specificity instead) and replaces the partially-supported `text-indent` on indented passage lines with `padding-left`
- Renders ESV passage HTML through Obsidian's `sanitizeHTMLToDom()` and appends the resulting fragment, instead of assigning the raw API response to `innerHTML`
- Scrolls to a referenced verse the moment it renders by watching the view for the verse element, instead of guessing with a fixed delay (more reliable on slow loads, snappier on fast ones)
- Brings the plugin in line with current Obsidian community standards
- Modernizes the lint toolchain (flat config, `eslint-plugin-obsidianmd`, type-aware `typescript-eslint`); the plugin now passes `eslint` and `tsc` cleanly
- Settings UI text uses sentence case
- Corrects the manifest description and raises `minAppVersion` to `1.6.6` to match the APIs actually used
- Tightens type safety (removes `any`, narrows YAML/error handling) and moves remaining inline styles to `styles.css`
- Fixes a hover-preview event-listener leak: `BibleEventHandlers` is now a single plugin-owned `Component` whose `document` listeners and close-poll timer are registered through the Obsidian lifecycle (so they're released on unload) and tracked per document for correct pop-out behavior, instead of being re-created and leaked on every hover
- Surfaces a notification when opening a chapter fails instead of failing silently — e.g. opening the Bible without an ESV API token configured now explains that a token is needed (and points to the plugin settings) rather than doing nothing
- Migrates file access off `vault.adapter` onto the intended `Vault`/`FileManager` APIs: notes are created with `Vault.create()` and their frontmatter written via `FileManager.processFrontMatter()`, folders use `getAbstractFileByPath`/`createFolder`, deletions go through `FileManager.trashFile()` (respecting the user's trash settings), and paths are run through `normalizePath()`
- Known follow-ups (tracked in `FOLLOWUPS.md`): a couple of smaller cleanups remain (the ESV-HTML-via-`innerHTML` item noted here has since been resolved — see Unreleased)