Skip to content

0.3.0

Choose a tag to compare

@github-actions github-actions released this 26 May 23:08
· 176 commits to main since this release

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 (Annoteca view) 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, and project-planning presets into the working list (additive, not destructive). User-saved presets persist in settings.customPresets.
  • Removed the enableScholarlyPreset boolean toggle; its categories now live inside the scholarly preset.
  • 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 Setting widget.

Color picker (custom chip seeding)

  • Native <input type="color"> chip is silently seeded from the currently active theme swatch (resolved to hex via getComputedStyle), 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 __annotecaHidden field 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).
  • rgbStringToHex no longer silently returns #000000 on malformed input. Returns undefined instead, so callers can skip the assignment rather than seeding black on a transparent or display:none swatch.

Changed

  • Removed the AnnotecaEvents class wrapper around Obsidian's Events. Call sites now use events.trigger(...) directly.
  • Type augmentations for the Obsidian API moved from types.d.ts (which was being shadowed by the runtime types.ts) to globals.d.ts. Added a proper Editor.cm augmentation that removes four as unknown as double-casts from main.ts and one from decorations.ts.
  • tsconfig.json include now lists **/*.d.ts explicitly so ambient declaration files compile (TypeScript's **/*.ts glob does not match .d.ts).
  • Pure helpers extracted for unit-testability:
    • scope.ts — scope-shape dispatch (computeScopeFileSet).
    • view-utils.ts — extractIndexTerm, bucketCommentsByHeading.
    • rgbStringToHex exported from ui-helpers.ts.
  • New test suite __tests__/helpers.test.ts covers all four (30 new tests).