Addresses the automated review's warnings: !important overrides
resolved via higher-specificity selectors (a handful of legitimate
overrides of Obsidian's own core .modal chrome are kept, since they
guard against unowned CSS loaded after the plugin), a :has() selector
replaced with a JS-toggled class, duplicate-property fallback chains
rewritten with @supports, TFile casts routed through an instanceof
fast path, and a couple of narrow, justified exceptions left as-is
(a proper-noun tooltip, a createEl helper that isn't stubbed in the
test harness). Bumped the obsidian devDependency to pick up current
types along the way.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Obsidian's automated plugin review flagged this release: inline style
mutations instead of CSS classes, unsafe innerHTML writes, async callbacks
passed where a void return was expected, and a couple of real bugs the
review's style checks happened to surface along the way.
- Replace `.style.*` assignments with CSS classes (`is-hidden` etc.); the two
genuinely dynamic textarea-autosize resets use `removeProperty` instead.
- Replace innerHTML writes (map SVG injection, dashboard stat bars, legend,
refresh button) with DOMParser/createEl/appendText.
- Embed world-map.svg into main.js via an esbuild text-loader import instead
of reading it from the plugin's vault folder at runtime — Obsidian's
installer only ever fetches main.js/styles.css/manifest.json from a
release, so the travel map was silently broken for any Community Plugins
install (only worked for manual/BRAT installs that copied the extra file).
- Replace window.confirm() on delete with the same two-click "Confirm?"
button pattern already used elsewhere in the plugin (native confirm()
doesn't behave reliably on mobile Obsidian).
- Settings tab: use Setting().setHeading() instead of raw <h2>/<h3>, drop the
redundant plugin-name heading, wrap async onChange/click handlers so they
don't return unhandled promises.
- MarkdownRenderChild subclasses (chart/inline-view/tasks blocks): onload()
must be synchronous per Component's contract; move the async work inside
instead of marking onload itself async.
- Misc: unused imports/vars, unnecessary type assertions (two of which were
actually needed — restored with `querySelector<HTMLElement>` instead of a
blind cast), sentence-case UI text, template-literal error interpolation
on caught `unknown` values.
- Add eslint + eslint-plugin-obsidianmd as a permanent dev dependency
(`npm run lint`, wired into `npm run check`) so these surface locally
before the next review instead of after.
114 → 112 existing tests still pass (2 net-added assertions from the DOM
shim gaining appendText/DOMParser polyfills); typecheck and build clean.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tfyt1TBd7DiNic32s6E4nq
README.md, docs/{architecture,css-classes,dev-workflow}.md, manifest.json,
package.json, package-lock.json, versions.json, .gitignore, LICENSE, and
tsconfig.json are re-added here with their current content only. Their
prior revision history is gone by design: an audit found 22 of README.md's
24 historical revisions still linked to handoff.md (a gitignored, never-
published file) — a dead reference that only ever disclosed the private
doc's existence, not its content, but was live across nearly the entire
project history until a recent cleanup. Since these are docs/metadata
rather than code, commit-by-commit revision history has no review value
here; only the current, already-audited content is kept. Code history
(everything else) is untouched.