Repository navigation
0.3.0
This release bundles several distinct feature themes that landed on main before a release boundary was cut. Going forward, plugin releases will partition per feature theme; see the workspace CLAUDE.md "Release cadence" note.
Added
Hub panel overhaul
- Replaced the three earlier sidebar views with a single right-sidebar hub (
Annotecaview) containing Thread / Outline / Starred internal tabs. - Scope selector on the Thread tab: This file, This folder (with and without subfolders), Vault, Property
key = value(frontmatter-driven), Tag. Property and Tag option lists populate from the active file. Scope state persists across restarts; auto-collapses to "this file" when the active file moves outside the current scope and scope is unpinned. - Pin button on the scope toolbar to lock scope to a specific path; pinned scope ignores file changes.
- Multi-file scope rendering: comments group by file with per-file header + count badge. Single-file scope renders without the per-file header since the panel header already implies the file.
- Starred (bookmarked) comments persisted in settings. Star toggle in three places: hover popup header, Thread tab card header, Starred tab card. Comments without an ID cannot be starred. Starred tab lists most-recently-starred first.
- Reply drafts: in-progress reply text persists to vault-local storage (not
data.json, so it does not propagate via Obsidian Sync). Debounced on input, restored on composer open, cleared on send. Composer outside-click no longer dismisses a non-empty composer. - Outline tab interactions: open/resolved count badges per heading are clickable — click navigates to the first matching comment in that section. Row containing the cursor is highlighted.
- Internal tab selection persists across restarts (
settings.lastHubTab); marker clicks force the Thread tab. - Next/previous comment commands respect scope and walk across files within scope.
- Delete all resolved comments in this file command (confirmation modal sized to count, single write, rebuild index).
Settings UX
- Accordion category rows: only the active category expands; others collapse to a single-line summary.
- Leaner icon and color pickers: the icon picker is now a stacked search-and-grid, the color picker shows theme-adaptive swatches with a custom-color chip beneath.
- Browse presets: cherry-pick categories from
general,scholarly,fiction,code-review, andproject-planningpresets into the working list (additive, not destructive). User-saved presets persist insettings.customPresets. - Removed the
enableScholarlyPresetboolean toggle; its categories now live inside thescholarlypreset. - Long-form settings rows (textareas, multi-control rows) now use a stacked layout (label/description above, control below) rather than fighting Obsidian's narrow right-rail
Settingwidget.
Color picker (custom chip seeding)
- Native
<input type="color">chip is silently seeded from the currently active theme swatch (resolved to hex viagetComputedStyle), so opening the OS picker opens it on the theme color, ready to nudge into a variation.
Anchor underlines for commented text
- New marker syntax tail line
[anchor=<commented text>]captures the text the comment was attached to at creation. - Renders a category-tinted underline over the anchor range in the editor; clicking or hovering the underline triggers the same comment popup as the inline marker.
- Configurable indicator style includes a new
"underline"option (in addition to"icon","gutter","both","none").
Resolved-state polish
- Resolved comments always show an icon (no longer category-toggled).
- Resolved comments in scope lists render with strikethrough.
- New brightness toggle controls dimming of resolved entries.
Fixed
- Hide-all-comments was global with confused bookkeeping: a per-view
__annotecaHiddenfield was being written but never read; the decoration compute only consulted a module-level singleton. A toggle in pane B would silently affect pane A. Per-view writes have been removed; the toggle is now unambiguously global (one switch, all editors). rgbStringToHexno longer silently returns#000000on malformed input. Returnsundefinedinstead, so callers can skip the assignment rather than seeding black on atransparentordisplay:noneswatch.
Changed
- Removed the
AnnotecaEventsclass wrapper around Obsidian'sEvents. Call sites now useevents.trigger(...)directly. - Type augmentations for the Obsidian API moved from
types.d.ts(which was being shadowed by the runtimetypes.ts) toglobals.d.ts. Added a properEditor.cmaugmentation that removes fouras unknown asdouble-casts frommain.tsand one fromdecorations.ts. tsconfig.jsonincludenow lists**/*.d.tsexplicitly so ambient declaration files compile (TypeScript's**/*.tsglob does not match.d.ts).- Pure helpers extracted for unit-testability:
scope.ts— scope-shape dispatch (computeScopeFileSet).view-utils.ts—extractIndexTerm,bucketCommentsByHeading.rgbStringToHexexported fromui-helpers.ts.
- New test suite
__tests__/helpers.test.tscovers all four (30 new tests).