{% block title %}{% endblock %} {% block style %}{% endblock %} {# Must precede the two widgets below: both hand their popup to it on construction. #} {# Before navbarControls.js and not deferred against it in any meaningful way: it installs one document-level keydown listener and paints the keys into the menu on DOMContentLoaded, so it only has to be present, not ordered against anything. #} {# Before browsePicker, which falls back to it when the machine running the server has no desktop for a native dialog to appear on -- the ordinary state of a compute node. Both are deferred, so both are parsed before either runs; the order is for readers. #} {# Before every field that mounts one. The switch is drawn on every launch now: there is always a second machine to mean something by "Remote" -- either the server is elsewhere, or a saved SSH connection could be -- and placePicker is what asks which one. remoteState comes first and everything else here reads from it: it owns the one poll that four surfaces used to run three of. It costs nothing on a page that never subscribes -- there is no timer until somebody does. #} {# The connection log, shared by the modal and the Settings page's cards. Before both of them: they call into it as they build. #} {# The navbar's connection icon. Deferred like the rest, which still runs it after pageBoot.js below (a normal script beats every deferred one), so PlexoraPage.register exists by the time this file's last line runs. It needs popoverPortal.js, loaded above with the other widgets. #} {# Says so before a scheduled job ends, from whichever page the user is on. After connectionModal.js, which its one button opens; passive, so it costs nothing while a connection sits settled. #} {# Local/Remote for every file button that has no switch of its own, which is all of them outside the core import forms. After placePicker.js and connectionModal.js, which it opens, and before toolLoader.js — a plugin's upload arrow must not be able to fire before the click delegate is on `document`. #} {# Not deferred: every page controller below calls PlexoraPage.register at the top level of its own file, so the registry has to exist before any of them is parsed -- including the ones a routed page loads later. #} {# Deferred, because it looks for the viewer's own root element (#container) to decide whether this document has anything worth preserving -- and that element is in the content block, below. #} {# Assets of the plugin this page opened with, if any. Declared by the plugin (Plugin.scripts/styles) and cache-busted from its version, so core names no plugin and the eager path here cannot drift out of sync with the lazy path in tool_routes.py -- which is exactly what happened when these two {% endfor %} {# `data-plexora-datasource` is how appRouter.js decides whether this document has a live viewer worth preserving. Empty on every page that is not one, and that emptiness is the router's own off switch -- see limit 1 in its header. #} {% block content %}{% endblock %} {# Where an internal navigation renders when the router handles it instead of the browser. Empty and hidden on every ordinary page load -- it only ever holds a page fetched as a fragment while the viewer above waits, hidden but alive, for the user to come back to it. #}