Bump to 1.0.25: restore Obsidian 1.12 compatibility, lower minAppVersion to 1.7.2

Obsidian 1.13 is not generally available (stable is 1.12.x), so releases
1.0.20-1.0.24 — whose minAppVersion 1.13.0 floor was raised to satisfy
the review's no-unsupported-api check — were uninstallable for everyone;
updaters correctly capped users at 1.0.19, and on 1.12.7 the settings tab
rendered blank because 1.0.20 deleted the pre-1.13 display() path.

Restores dual-path settings rendering with zero 1.13-only API
references: getSettingDefinitions() still drives the declarative 1.13+
path, display() is back as the imperative fallback sharing the same
per-setting builders, internal refreshes rebuild imperatively (identical
output on both paths, avoids the 1.13-only update()), and the
Reset-everything button gets its destructive styling via the mod-warning
class rather than setDestructive()/setWarning(). minAppVersion back to
1.7.2; versions.json maps 1.0.25 accordingly so pre-1.13 devices jump
straight from 1.0.19 to 1.0.25.
This commit is contained in:
Daniel Anderson 2026-07-17 23:17:05 +10:00
parent 17f8ad0a44
commit d88d1e35c8
6 changed files with 74 additions and 20 deletions

View file

@ -177,7 +177,7 @@ Visual Notes only reads and writes files inside your own vault — it makes no n
|---|---|
| Obsidian desktop (Mac, Windows, Linux) | ✅ Supported |
| Obsidian mobile (iOS, iPadOS) | ✅ Supported |
| Minimum Obsidian version | 1.13.0 |
| Minimum Obsidian version | 1.7.2 |
---

View file

@ -1,8 +1,8 @@
{
"id": "visual-notes",
"name": "Visual Notes",
"version": "1.0.24",
"minAppVersion": "1.13.0",
"version": "1.0.25",
"minAppVersion": "1.7.2",
"description": "A visual workspace built on the Canvas format: nestable freeform boards, icon tile grids, kanban boards, sticky notes, checklists, columns, drawing with pen and highlighter, labels, reactions, and more.",
"author": "Daniel Anderson",
"isDesktopOnly": false

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "visual-notes",
"version": "1.0.24",
"version": "1.0.25",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "visual-notes",
"version": "1.0.24",
"version": "1.0.25",
"license": "MIT",
"dependencies": {
"sortablejs": "^1.15.7"

View file

@ -1,6 +1,6 @@
{
"name": "visual-notes",
"version": "1.0.24",
"version": "1.0.25",
"description": "Visual Notes — a visual workspace for Obsidian",
"main": "main.js",
"scripts": {

View file

@ -27,11 +27,15 @@ class BoardPickerModal extends FuzzySuggestModal<TFile> {
// ── Settings tab ──────────────────────────────────────────────
//
// Rendered declaratively via getSettingDefinitions() (Obsidian 1.13+, which
// is the plugin's minAppVersion) — the app renders each definition and
// indexes every setting's name/desc for its settings search. Each setting's
// controls are built by a small `buildX(setting)` method that fills in the
// Setting the app created for it.
// Two rendering paths, one body per setting so they can never drift:
// Obsidian 1.13+ renders declaratively from getSettingDefinitions() (and
// indexes each setting's name/desc for its settings search); older
// versions call display(), which builds the same settings imperatively.
// IMPORTANT: no 1.13-only APIs may be referenced here (update(),
// setDestructive(), …) — minAppVersion predates them and the plugin
// review's obsidianmd/no-unsupported-api check flags even guarded
// references. Obsidian 1.13 is not generally available yet (stable is
// 1.12.x as of 2026-07), so the floor must stay below 1.13.
export class VisualNotesSettingsTab extends PluginSettingTab {
plugin: VisualNotesPlugin;
@ -101,11 +105,57 @@ export class VisualNotesSettingsTab extends PluginSettingTab {
];
}
// ── Imperative fallback (Obsidian < 1.13) ───────────────────
// Not called by the app on 1.13+ (getSettingDefinitions() takes over).
override display(): void {
this.renderImperative();
}
// Re-render after a settings mutation that changes the tab's structure
// (reset buttons, board picker's Clear visibility, sticky palette):
// update() re-renders the tab from fresh definitions.
// (reset buttons, board picker's Clear visibility, sticky palette).
// Rebuilds imperatively on both paths: on 1.13+ the proper API would be
// update(), but that's 1.13-only and even a guarded reference trips the
// review's no-unsupported-api check — and an imperative rebuild renders
// identically since both paths share the same buildX bodies.
private refresh(): void {
this.update();
this.renderImperative();
}
private renderImperative(): void {
const { containerEl } = this;
containerEl.empty();
this.buildOpenOnStartup(new Setting(containerEl));
this.buildDefaultBoard(new Setting(containerEl));
new Setting(containerEl).setName('Freeform canvas').setHeading();
this.buildToolbarPosition(new Setting(containerEl));
this.buildDotColor(new Setting(containerEl));
this.buildDotSize(new Setting(containerEl));
this.buildCanvasBgColor(new Setting(containerEl));
this.buildCardDragAnimation(new Setting(containerEl));
this.buildCardDragAnimationIntensity(new Setting(containerEl));
this.buildSnapToGrid(new Setting(containerEl));
this.buildGridSize(new Setting(containerEl));
this.buildTrashZoneSize(new Setting(containerEl));
this.buildLargeKanbanItems(new Setting(containerEl));
this.buildBookmarkCacheDuration(new Setting(containerEl));
this.buildDefaultStickyColor(new Setting(containerEl));
this.buildCommentAuthorName(new Setting(containerEl));
new Setting(containerEl).setName('Assets').setHeading();
this.buildAutoSortAssets(new Setting(containerEl));
this.buildAutoRelinkOnOpen(new Setting(containerEl));
this.buildRelinkAllBoardsNow(new Setting(containerEl));
new Setting(containerEl).setName('Data').setHeading();
this.buildExportTilesJson(new Setting(containerEl));
this.buildImportDesc(new Setting(containerEl));
this.buildImportButton(new Setting(containerEl));
new Setting(containerEl).setName('Danger zone').setHeading();
this.buildResetAllTiles(new Setting(containerEl));
}
// ── Per-setting builders ─────────────────────────────────────
@ -530,10 +580,13 @@ export class VisualNotesSettingsTab extends PluginSettingTab {
setting
.setName('Reset all tiles')
.setDesc('Permanently delete every tile and nested board. This cannot be undone.')
.addButton(btn =>
btn
.addButton(btn => {
// The destructive red styling on every supported version, without
// referencing setWarning() (deprecated) or setDestructive()
// (1.13-only, above our minAppVersion).
btn.buttonEl.addClass('mod-warning');
return btn
.setButtonText('Reset everything')
.setDestructive()
.onClick(() => {
new ConfirmModal(
this.app,
@ -544,7 +597,7 @@ export class VisualNotesSettingsTab extends PluginSettingTab {
new Notice('All tiles deleted.');
})(); }
).open();
})
);
});
});
}
}

View file

@ -23,5 +23,6 @@
"1.0.21": "1.13.0",
"1.0.22": "1.13.0",
"1.0.23": "1.13.0",
"1.0.24": "1.13.0"
"1.0.24": "1.13.0",
"1.0.25": "1.7.2"
}