Skip to content

Settings suggestion dropdown is invisible when settings open in a separate window #340

Description

@Zachatoo

Hi! Heads up about a bug in Longform that a number of community plugins share.

What happens

Obsidian 1.13 added Settings → Interface → Open settings in new window, and it is now on by default. With that enabled, the suggestion dropdowns in the Longform settings do not appear at all. Typing still works and pressing Enter still accepts a value, but there are no visible suggestions.

In the Longform settings that affects New scene template, User script step folder — and any other field using the same suggester.

Reported on the forum here: https://forum.obsidian.md/t/the-path-suggestion-dropdown-is-hidden-in-the-setting-of-some-plugins/117184

Why

Longform uses the TextInputSuggest class that has been copied between plugins for years (originally from obsidian-periodic-notes). It appends the dropdown to the main window's container:

this.open((<any>this.app).dom.appContainerEl, this.inputEl);

The dropdown is then appended straight to that container, without checking which document the input actually belongs to. When the settings tab renders in a separate window, the dropdown lands in the main window's DOM — invisible where the user is typing. This is not specific to your plugin; a number of community plugins inherited the same code.

Background on the underlying window-context rules: https://docs.obsidian.md/plugins/guides/pop-out-windows

Fixing it

Preferred — migrate to declarative settings (https://docs.obsidian.md/plugins/guides/migrate-declarative-settings)

PluginSettingTab.getSettingDefinitions() describes settings as data rather than DOM, and it includes built-in file and folder suggesters — which is what the hand-rolled class is doing here. Obsidian renders them, so window context stops being your problem entirely.

This requires Obsidian 1.13.0. The guide covers two paths: bump minAppVersion to 1.13.0 and replace display() outright, or keep display() alongside getSettingDefinitions() if you want to keep supporting older versions.

Secondary — swap in AbstractInputSuggest (https://docs.obsidian.md/Reference/TypeScript+API/AbstractInputSuggest)

If you would rather not migrate yet, or you are doing a dual-support migration, replace the copied TextInputSuggest with the built-in AbstractInputSuggest, which handles window context correctly. It has been available since 1.4.10, so it most likely needs no minAppVersion change. The declarative settings guide also points to it for custom suggesters beyond the built-in file and folder ones.

There is an official lint rule for exactly this: obsidianmd/prefer-abstract-input-suggest.

Workaround for users in the meantime

Disable Settings → Interface → Open settings in new window.


I found this with an automated scan across the community plugin directory and reviewed the results before filing. No rush on this — feel free to close if it is not something you want to take on.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions