Surfaces and windows
A panel can live in four hosts: a dock, a tab of the central zone, a floating window, or a detached system window. The factory contract is the same everywhere, and a single entry point decides on any move. This page describes the four hosts, the drop gestures, and what gets saved.
The four hosts
| Host | File | State | Use |
|---|---|---|---|
| Dock | shell-dock.js | isofind_shell_v1 | Inspectors, output, navigation. |
| Central zone | zone-centrale.js | isofind_zone_v1 | Notebook, consoles, chain view: anything that needs width. |
| Floating window | shell-flottant.js | isofind_flottant_v1 | A panel kept above the work in progress. |
| Detached window | shell-detach.js | Carried by the window URL | Second screen. |
The placement arbiter
placer keeps no registry of what it believes: it asks every host on every call. A panel opened by a path that ignores placer, for instance a plugin button calling the shell directly, is therefore still seen, and released before being reopened elsewhere.
Floating windows
Floating windows live in a position: fixed layer with pointer-events: none: only the windows themselves receive the pointer, and the rest of the application stays clickable.
| Gesture | Effect |
|---|---|
| Drag the header | Moves the window, bounded to the screen. |
| Pull an edge or a corner | Resizes, eight handles. |
| Double-click the header | Maximises, and restores the previous geometry on return. |
| Drop onto a dock | Files the panel into that dock. A dock collapsed below 24 px is not a target. |
| Release outside the application window | Detaches the panel into a system window, if the setting and the detachable flag allow it. |
The central zone is not a drop target. It occupies the whole middle of the screen, and making it a target would prevent moving a floating window without risking a tab swallowing it. The entry stays in the header menu.
While a window is being moved or resized, a transparent shield is raised above the frames. A hovered frame captures pointer events inside its own document, and the gesture would be lost as soon as the cursor passed over a tab.
Detached windows
A detached window is a system window, served by a single page under static/, to which panel identifiers are passed in the query string. One window can therefore carry several panels side by side, and there is only ever one page whatever their number.
The state of detached panels is not written on both sides: the window announces what it carries, and the main side relies on that. Also keeping a local registry would mean two truths for one fact, which would diverge at the first missed close.
The detachable flag
Some panels are adapters: they do not build their content, they move into their host a card built elsewhere, like the Python editor or the R and PHREEQC consoles. Taking that card into another window would cut it off from the code that owns it. Those panels therefore declare detachable: false.
The guard is placed at the source, in detacher and detacherVers, rather than in each caller: the dock detaches by dragging outside the window and through its tab menu, the floating host through its menu and by releasing outside. The entry stays visible and greyed, with its reason, rather than hidden.
Modals turned into panels
A workbench modal that gets converted becomes an ordinary panel, never a parallel family of surfaces. The plugin manager and the plugin library are in that case and open like any other panel, including in the centre.
Page-local modals are not converted. Their content is built by the page's code, with the page's CSS, and taking it out of that document would break the selectors through which that code finds its own parts. They are handled differently, through the full rectangle of the central zone.
Named layouts
A layout captures the three surfaces managed by the application: { shell, zone, flottant }. Each part is applied if present and left untouched otherwise, so a layout saved before V2.0 closes no floating window, since it never said anything about them.
| Setting | Default | Scope |
|---|---|---|
| workspace.restorePanels | true | Dock panels at startup. |
| workspace.restoreTabs | true | Central-zone tabs. |
| workspace.restoreFloating | true | Floating windows. |
| workspace.detachDrag | true | Detaching by releasing outside the window. |
A layout keeps only the floating windows that are open, their stacking order and their geometry. The geometry of a closed window stays a session convenience: putting it into a plan would mean that applying that plan moved windows it does not even open. The floating host is applied after the zone, otherwise a panel the plan wants floating would be reopened in the centre.