diff --git a/AGENTS.md b/AGENTS.md index 3f4274a..d839c61 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -115,11 +115,20 @@ Follow Obsidian's **Developer Policies** and **Plugin Guidelines**. In particula ## UX & copy guidelines (for UI text, commands, settings) +Follow the [Obsidian style guide](https://obsidian.md/help/style-guide) for all user-facing copy: commands, settings, notices, explorer UI, error messages, and `README.md`. When adding or editing strings, check that text still matches the guide before merging. + - Prefer sentence case for headings, buttons, and titles. - Use clear, action-oriented imperatives in step-by-step copy. - Use **bold** to indicate literal UI labels. Prefer "select" for interactions. - Use arrow notation for navigation: **Settings → Community plugins**. - Keep in-app strings short, consistent, and free of jargon. +- Use "note" (not "markdown note") for Markdown files in the vault; prefer "active note" over "current note". +- Prefer "search term" over "search query" in user-facing text. +- Prefer "maximum" over "max" and "minimum" over "min". +- Match the exact casing of UI labels when referencing settings (for example, **Access token**). +- Document settings in-app with `setDesc()`; keep `README.md` aligned with the manifest plugin name and UI labels. + +`eslint-plugin-obsidianmd` enforces some of these rules (including sentence case) in TypeScript source files. ## Performance diff --git a/README.md b/README.md index ae4f8d7..0800b35 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The plugin uses a Raindrop.io access token and the official Raindrop.io REST API ## Features - **Raindrop.io explorer**: Browse saved bookmarks from the configured collection in a side pane. -- **Note-aware filtering**: Let the explorer follow the active note by turning note tags and external links into a Raindrop.io search query. +- **Note-aware filtering**: Let the explorer follow the active note by turning note tags and external links into a Raindrop.io search term. - **Manual search**: Search Raindrop.io directly with keywords, `#tag` filters, exact phrases, or operators such as `type:article`, `notag:true`, and `created:2024-01`. - **Note blocks**: Render saved Raindrop.io links inline from fenced `raindrop` code blocks. - **Configurable tag clicks**: Choose whether tags on rendered Raindrop.io items search Obsidian notes, filter the explorer, or do nothing. @@ -26,7 +26,7 @@ The plugin uses a Raindrop.io access token and the official Raindrop.io REST API ## Setup 1. Create or copy a Raindrop.io access token. -2. Open **Settings -> Community plugins -> Raindrop.io Plugin for Obsidian**. +2. Open **Settings → Community plugins**, then select **Raindrop.io**. 3. Paste the token into **Access token**. 4. Use **Open explorer** from the command palette or ribbon icon. 5. Optionally add a `raindrop` block to a note for inline results. @@ -40,7 +40,7 @@ The side pane opens as **Raindrop.io explorer**. It can browse all saved links f Controls: - **Search**: Runs the query in the search field against Raindrop.io. -- **Use note filter**: Rebuilds the query from the active markdown note. +- **Use note filter**: Rebuilds the search term from the active note. - **Browse all**: Clears the query and shows the configured collection. - **Refresh**: Reloads the current explorer state. - **Load more**: Requests the next page of results when more are available. @@ -51,7 +51,7 @@ When the explorer follows a note, it uses: - External `http` and `https` links as exact phrase searches. - `match:OR` when multiple note-derived filters are present, so a bookmark can match any note tag or link. -Opening and interacting with the explorer preserves the last active markdown note as context, so the note filter remains stable while you browse. +Opening and interacting with the explorer preserves the last active note as context, so the note filter remains stable while you browse. ## Note blocks @@ -71,11 +71,11 @@ Options: - `collection`: Raindrop.io collection ID. Use `0` for all collections. Defaults to **Default collection**. - `tag`: Raindrop.io tag to include in the search. Multi-word tags are quoted automatically, for example `#"coffee beans"`. -- `search`: Raindrop.io search query. This is passed through to Raindrop.io. +- `search`: Raindrop.io search term. This is passed through to Raindrop.io. - `sort`: Raindrop.io sort value, for example `-created`. Defaults to **Default sort**. - `limit`: Number of links to request, clamped between 1 and 100. Defaults to **Default limit**. -You can combine `tag` and `search`; the plugin joins them into one Raindrop.io query. +You can combine `tag` and `search`; the plugin joins them into one Raindrop.io search term. ## Settings @@ -112,7 +112,7 @@ The plugin passes search text through to Raindrop.io. Useful examples: - The plugin only makes network requests to `https://api.raindrop.io`. - The access token is stored locally in Obsidian plugin data. -- Note-aware filtering sends the generated Raindrop.io search query to Raindrop.io. If the active note contains external links, those URLs can be included in the query. +- Note-aware filtering sends the generated Raindrop.io search term to Raindrop.io. If the active note contains external links, those URLs can be included in the search term. - The plugin does not collect analytics or use hidden telemetry. ## Release files diff --git a/src/main.ts b/src/main.ts index e54a724..4c2e990 100644 --- a/src/main.ts +++ b/src/main.ts @@ -132,7 +132,7 @@ export default class RaindropViewPlugin extends Plugin { const parsed = parseRaindropBlock(source); const api = new RaindropApi(this.settings.accessToken); if (!api.isConfigured) { - renderRaindropStatus(container, "Add a Raindrop.io access token in plugin settings.", "info"); + renderRaindropStatus(container, "Add a Raindrop.io access token under Access token in plugin settings.", "info"); return; } diff --git a/src/raindrop-api.ts b/src/raindrop-api.ts index b72f4a5..e14fd20 100644 --- a/src/raindrop-api.ts +++ b/src/raindrop-api.ts @@ -39,7 +39,7 @@ export class RaindropApi { async listRaindrops(params: RaindropListParams): Promise { if (!this.isConfigured) { - throw new Error("Missing Raindrop.io access token. Add one in plugin settings."); + throw new Error("Missing Raindrop.io access token. Add one under Access token in plugin settings."); } const collectionId = Number.isFinite(params.collectionId) ? params.collectionId : 0; diff --git a/src/raindrop-view.ts b/src/raindrop-view.ts index dd1261d..c684d0e 100644 --- a/src/raindrop-view.ts +++ b/src/raindrop-view.ts @@ -144,7 +144,7 @@ export class RaindropSideView extends ItemView { this.lastFileMtime = null; this.lastFileSize = null; this.setQuery(""); - this.updateContext("Browsing the configured collection. Open a markdown note to use it as a filter."); + this.updateContext("Browsing the configured collection. Open a note to use it as a filter."); return force || changed; } @@ -186,7 +186,7 @@ export class RaindropSideView extends ItemView { const api = new RaindropApi(this.plugin.settings.accessToken); if (!api.isConfigured) { - renderRaindropStatus(this.resultsEl, "Add a Raindrop.io access token in plugin settings.", "info"); + renderRaindropStatus(this.resultsEl, "Add a Raindrop.io access token under Access token in plugin settings.", "info"); this.updateLoadMore(false); return; } diff --git a/src/settings.ts b/src/settings.ts index 0ed176e..297c8f6 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -46,7 +46,7 @@ export class RaindropSettingTab extends PluginSettingTab { new Setting(containerEl) .setName("Access token") - .setDesc("Stored in plugin data and sent only to the bookmark service.") + .setDesc("Stored in plugin data and sent only to the Raindrop.io API.") .addText((text) => { text.inputEl.type = "password"; text