Skip to content

Application mode - #548

Merged
dannyleech merged 13 commits into
mainfrom
application-mode
Oct 2, 2026
Merged

dannyleech merged 13 commits into
mainfrom
application-mode

Conversation

@dannyleech

@dannyleech dannyleech commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

Replaces the old mode concept and exclusive control with application modes.

Modes are configured in applicationModes: in plugin manifests, and in the host's constructor option, which can add to, remove from or disable (false) a plugin's mode. setApplicationMode(id, { include, exclude }) enters a mode, with optional one-off options applied last, and clearApplicationMode(id) leaves it. Only the top mode on the stack applies. It sets im-o-app--mode-{id} on the app root.

A mode with an include is a takeover: only the listed items and the declaring plugin's own items show. Hidden items stay mounted (hidden attribute), and modal panels are never hidden.

Draw uses a 'draw' takeover while drawing, keeping map styles, map controls and the scale bar. Search's 'search' mode has no lists, so it only adds the class for search's CSS.

Breaking changes: the mode option, setMode, revertMode, includeModes/excludeModes and exclusive control are removed. Root classes change from im-o-app--exclusive-control-* to im-o-app--mode-*.

In any draw or edit mode the draw plugin claims exclusive control, and
draw.scss hides everything else in the top row except map styles and map
controls (in whichever top-row slot they're in). The rule has zero
specificity so hosts can bring items back with a simple override, and a
new exclusiveControl: false option opts out entirely.

The Draw/Edit actions menu is replaced by Undo (icon), Snap (labelled
toggle, with a visible pressed state) and Delete point (icon) in the
top-middle slot.

Removes draw.scss's action bar width rules, which conflicted with core's
action button sizing and made Cancel and Done overlap. The draw demos now
link their own stylesheet: they were linking index.css, so none of
draw.scss had been loading, which is why that conflict went unnoticed.
Plugin control wrappers now carry im-c-control-wrapper--{id} (kebab-cased),
matching im-c-button-wrapper--{id}, so it's clear in the DOM which control a
wrapper belongs to. Documents the wrapper under ControlDefinition.render.
@sonarqubecloud

sonarqubecloud Bot commented Oct 2, 2026

Copy link
Copy Markdown

@dannyleech
dannyleech marked this pull request as ready for review October 2, 2026 13:15
@dannyleech
dannyleech merged commit 43ee8c5 into main Oct 2, 2026
2 checks passed
@dannyleech
dannyleech deleted the application-mode branch October 2, 2026 13:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants