This commit is contained in:
2026-09-11 03:46:11 +08:00
parent 45b9f9ed5d
commit b7f55aa631
114 changed files with 3646 additions and 576 deletions
@@ -93,10 +93,10 @@ knows which directory a change landed in but not which screen it shows up on.</p
<p>Ordered the way a request travels: the front end first, then the process that serves it.</p>
<h2 id="directories">Directories</h2>
<ul>
<li><a href="webservice-spa/index.html">Web Service SPA Source Tree</a> — the Quasar front end under
<li><a href="webservice-spa.html">Web Service SPA Source Tree</a> — the Quasar front end under
<code>wwwroot-src/src</code>: how <code>components/</code> is grouped two ways at once, what the Control-Tree registry
actually is, and why half the route table is redirects</li>
<li><a href="webservice-backend/index.html">Web Service Backend Source Tree</a> — the ASP.NET Core half: how to read
<li><a href="webservice-backend.html">Web Service Backend Source Tree</a> — the ASP.NET Core half: how to read
a filename, why folder nesting does not predict a route, and which declared hub is never mapped</li>
</ul>
<h2 id="what-this-layer-is-for">What This Layer Is For</h2>
@@ -118,8 +118,8 @@ retired the page-by-page map of its files.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../index.html">HiNC App Anatomy</a> — the section index, and the surface-keyed way in</li>
<li><a class="xref" href="webservice-spa/index.html">Web Service SPA Source Tree</a> — the flagship front end</li>
<li><a class="xref" href="webservice-backend/index.html">Web Service Backend Source Tree</a> — the process that
<li><a class="xref" href="webservice-spa.html">Web Service SPA Source Tree</a> — the flagship front end</li>
<li><a class="xref" href="webservice-backend.html">Web Service Backend Source Tree</a> — the process that
serves it</li>
<li><a class="xref" href="../platform/index.html">Platform</a> — the machinery under every screen, entered by mechanism rather
than by directory</li>
@@ -16,10 +16,10 @@
<a href="index.html" name="" title="Overview">Overview</a>
</li>
<li>
<a href="webservice-spa/index.html" name="" title="Web Service SPA">Web Service SPA</a>
<a href="webservice-spa.html" name="" title="Web Service SPA">Web Service SPA</a>
</li>
<li>
<a href="webservice-backend/index.html" name="" title="Web Service Backend">Web Service Backend</a>
<a href="webservice-backend.html" name="" title="Web Service Backend">Web Service Backend</a>
</li>
</ul>
</div>
@@ -1,2 +1,2 @@
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Web Service SPA","href":"webservice-spa/index.html","topicHref":"webservice-spa/index.html"},{"name":"Web Service Backend","href":"webservice-backend/index.html","topicHref":"webservice-backend/index.html"}]}
{"items":[{"name":"Overview","href":"index.html","topicHref":"index.html"},{"name":"Web Service SPA","href":"webservice-spa.html","topicHref":"webservice-spa.html"},{"name":"Web Service Backend","href":"webservice-backend.html","topicHref":"webservice-backend.html"}]}
@@ -7,13 +7,13 @@
<meta name="title" content="Web Service Backend Source Tree | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../toc.html">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="docfx:rel" content="../../">
@@ -30,7 +30,7 @@
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../../public/docfx.min.js"></script>
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
@@ -43,8 +43,8 @@
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../../index.html">
<img id="logo" class="svg" src="../../../img/HiAPI.logo.png" alt="">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
@@ -145,7 +145,7 @@ list is unreachable however complete its class looks — see the trap under <cod
<li><strong>The tree is not self-contained.</strong> The project service types <code>Program.cs</code> leans on hardest live in
the sibling HiNc engine repository, not here.</li>
</ul>
<p>Documented in <a class="xref" href="../../platform/program-and-hosting.html">Program and Hosting</a>.</p>
<p>Documented in <a class="xref" href="../platform/program-and-hosting.html">Program and Hosting</a>.</p>
<h2 id="execution">Execution</h2>
<p><code>Execution/</code> is the run cockpit's whole backend: playback control, the strip and cycle-line charts,
the NC-program branch index, run-output queries, and the real-time push layer.</p>
@@ -166,10 +166,10 @@ the repository references. The Execution canvas rides <code>Disp/RenderingHub.cs
canvas. A reader looking for &ldquo;the hub behind the Execution page&rdquo; by name will find this file first
and be wrong.</p>
</div>
<p>Documented in <a class="xref" href="../../execution/index.html">Execution Page</a>,
<a class="xref" href="../../execution/program.html">Program Branch</a>,
<a class="xref" href="../../execution/selected-step-info-panel.html">Selected-Step Info Panel</a>,
<a class="xref" href="../../execution/strip-charts.html">Strip Charts</a> and <a class="xref" href="../../execution/cycle-line-charts.html">Cycle-Line Charts</a>.</p>
<p>Documented in <a class="xref" href="../execution/index.html">Execution Page</a>,
<a class="xref" href="../execution/program.html">Program Branch</a>,
<a class="xref" href="../execution/selected-step-info-panel.html">Selected-Step Info Panel</a>,
<a class="xref" href="../execution/strip-charts.html">Strip Charts</a> and <a class="xref" href="../execution/cycle-line-charts.html">Cycle-Line Charts</a>.</p>
<h2 id="mech">Mech</h2>
<p><code>Mech/</code> is the largest domain folder: the REST surfaces for the machine tool, the tool house and
cutter editing, fixtures and workpieces, spindle capability, background and coolant, and the three
@@ -179,20 +179,20 @@ connection. <code>Mech/CutterDtoBuilder.cs</code> is the shared read-side DTO sh
loaded project actually plays them. No SignalR hub lives here.</p>
<ul>
<li><code>Mech/MechBuilder/</code> — the standalone mechanism-building session, held by a process-wide singleton
rather than per user. Documented in <a class="xref" href="../../util/mech-builder.html">Mechanism Builder Page</a>.</li>
rather than per user. Documented in <a class="xref" href="../util/mech-builder.html">Mechanism Builder Page</a>.</li>
<li><code>Mech/Topo/</code> — one thin controller per transformer kind, each editing an instance held in the
keyed object store. Documented in
<a class="xref" href="../../geom/transformer-panel.html">Transformer Select Panel</a>.</li>
<a class="xref" href="../geom/transformer-panel.html">Transformer Select Panel</a>.</li>
<li><code>Mech/SoftNcRunnerController.cs</code> — the one endpoint family behind the Controller branch, and the
file whose snapshot decides which of that branch's nodes exist. Documented in
<a class="xref" href="../../general-setup/controller/index.html">Controller Branch</a>, with
<a class="xref" href="../../general-setup/controller/brand-matrix.html">Brand Matrix</a> for the snapshot flags themselves.</li>
<a class="xref" href="../general-setup/controller/index.html">Controller Branch</a>, with
<a class="xref" href="../general-setup/controller/brand-matrix.html">Brand Matrix</a> for the snapshot flags themselves.</li>
<li><code>Mech/CsvRunnerController.cs</code> and <code>Mech/ClRunnerController.cs</code> — the two resident non-brand runner
suits, reached from tree branches the Preference menu hides by default. Documented in
<a class="xref" href="../../shell/preference-menu.html">Preference Menu Dropdown</a> until those branches have a page.</li>
<a class="xref" href="../shell/preference-menu.html">Preference Menu Dropdown</a> until those branches have a page.</li>
</ul>
<p>Documented in <a class="xref" href="../../general-setup/index.html">General Setup Page</a> and
<a class="xref" href="../../tool-house/index.html">Tool House Page</a> and the panels beneath them.</p>
<p>Documented in <a class="xref" href="../general-setup/index.html">General Setup Page</a> and
<a class="xref" href="../tool-house/index.html">Tool House Page</a> and the panels beneath them.</p>
<h2 id="missions">Missions</h2>
<p><code>Missions/</code> is the mission command tree's backend. Two things here surprise readers:</p>
<ul>
@@ -207,7 +207,7 @@ attribute once per process, replacing hand-maintained kind switches, and
command gets an editor without a bespoke panel. <code>Missions/ScriptCompletionService.cs</code> and
<code>Missions/ScriptCompileCheckService.cs</code> are the Roslyn pair behind the script editor; the compile
check reuses the same options and globals type the script command uses at run time.</p>
<p>Documented in <a class="xref" href="../../execution/mission/mission-root-panel.html">Mission Root Panel</a> and the command panels under it.</p>
<p>Documented in <a class="xref" href="../execution/mission/mission-root-panel.html">Mission Root Panel</a> and the command panels under it.</p>
<h2 id="disp">Disp</h2>
<p><code>Disp/</code> is the rendering layer. <code>Disp/RenderingHub.cs</code> is the single transport surface for every 3D
canvas in the application — canvas initialization, pointer, key and touch input, resize, view
@@ -217,21 +217,21 @@ engines the hub resolves against. <code>Disp/StlPreviewController.cs</code> is t
<p>The <code>*Displayee.cs</code> files are scene-graph composition objects rather than web types, and each has a
live instantiation site: the execution scene, the equipment-setup scene, the step-subtraction scene
and the two coordinate-frame displayees the first two compose in.</p>
<p>Documented in <a class="xref" href="../../conventions/rendering-canvas-web-service.html">Rendering Canvas on Web Service</a>,
<a class="xref" href="../../widget/renderingcanvas-tool-bar.html">RenderingCanvas Tool Bar</a> and — for
<p>Documented in <a class="xref" href="../conventions/rendering-canvas-web-service.html">Rendering Canvas on Web Service</a>,
<a class="xref" href="../widget/renderingcanvas-tool-bar.html">RenderingCanvas Tool Bar</a> and — for
<code>Disp/StlPreviewController.cs</code> and the per-connection slot behind it —
<a class="xref" href="../../util/stl-preview-pane.html">STL Preview Pane</a>.</p>
<a class="xref" href="../util/stl-preview-pane.html">STL Preview Pane</a>.</p>
<h2 id="environments">Environments</h2>
<p><code>Environments/</code> is session and environment scope: the project lifecycle, per-user preference
persistence, the Execution page's division flags, and the shipped localized step-present catalog. It
is also where the Log Viewer's data comes from — the log endpoints sit on the project controller
beside status, new, load, save, reload, save-as and close.</p>
<p>Documented in <a class="xref" href="../../shell/main-panel.html">Main Panel</a>,
<a class="xref" href="../../platform/session-state.html">Session State</a>,
<a class="xref" href="../../shell/preference-menu.html">Preference Menu Dropdown</a>,
<a class="xref" href="../../platform/i18n.html">Internationalization</a>,
<a class="xref" href="../../platform/log-viewer.html">Log Viewer Page</a> and
<a class="xref" href="../../execution/step-present-dialog.html">Step Present Dialog</a>.</p>
<p>Documented in <a class="xref" href="../shell/main-panel.html">Main Panel</a>,
<a class="xref" href="../platform/session-state.html">Session State</a>,
<a class="xref" href="../shell/preference-menu.html">Preference Menu Dropdown</a>,
<a class="xref" href="../platform/i18n.html">Internationalization</a>,
<a class="xref" href="../platform/log-viewer.html">Log Viewer Page</a> and
<a class="xref" href="../execution/step-present-dialog.html">Step Present Dialog</a>.</p>
<h2 id="common-geom-and-widget">Common, Geom and Widget</h2>
<ul>
<li><code>Common/</code> — cross-cutting infrastructure with no single domain owner: the optional login gate, the
@@ -245,31 +245,31 @@ disconnect handler always walks an empty registry. The bound comes from the brow
<code>wwwroot-src/src/composables/useCleanupHub.ts</code> posts the index-remove endpoint on
<code>Common/IndexController.cs</code> for every key it holds when its host unmounts, and again whenever a
key it registered is replaced. Documented in
<a class="xref" href="../../conventions/dictionary-service-pattern.html">Dictionary Service Pattern</a>,
<a class="xref" href="../../conventions/webapi-hub-cleanup-pattern.html">WebAPI Hub Cleanup Pattern</a>,
<a class="xref" href="../../platform/login-and-auth.html">Login and Authentication</a> and
<a class="xref" href="../../platform/log-viewer.html">Log Viewer Page</a>.</li>
<a class="xref" href="../conventions/dictionary-service-pattern.html">Dictionary Service Pattern</a>,
<a class="xref" href="../conventions/webapi-hub-cleanup-pattern.html">WebAPI Hub Cleanup Pattern</a>,
<a class="xref" href="../platform/login-and-auth.html">Login and Authentication</a> and
<a class="xref" href="../platform/log-viewer.html">Log Viewer Page</a>.</li>
<li><code>Geom/</code> — one CRUD controller per geometry kind, on the same keyed-object pattern, and nothing
else: no hubs, no services. Documented in <a class="xref" href="../../geom/index.html">Geometry Panels</a>.</li>
else: no hubs, no services. Documented in <a class="xref" href="../geom/index.html">Geometry Panels</a>.</li>
<li><code>Widget/</code> — the generic value and lifecycle controllers the reusable inputs post to: the 3D vector,
the 4×4 matrix, and the object-management surface that handles file operations, XML editing and
copy-paste for indexed objects. Documented in
<a class="xref" href="../../widget/object-management-menu-button.html">Object Management Menu Button</a>,
<a class="xref" href="../../widget/vec3d-control.html">Vec3dControl Component</a> and
<a class="xref" href="../../widget/mat4d-control.html">Mat4dControl Component</a>.</li>
<a class="xref" href="../widget/object-management-menu-button.html">Object Management Menu Button</a>,
<a class="xref" href="../widget/vec3d-control.html">Vec3dControl Component</a> and
<a class="xref" href="../widget/mat4d-control.html">Mat4dControl Component</a>.</li>
</ul>
<h2 id="controller-and-demo">Controller and Demo</h2>
<p><code>Controller/</code> is the single-file surface behind the legacy controller page. It has a successor in
<code>Mech/SoftNcRunnerController.cs</code>, whose own doc comment says so, but <strong>both are live</strong> — the legacy
page has not been removed. Documented in <a class="xref" href="../../legacy-controller.html">Legacy Controller</a>.</p>
page has not been removed. Documented in <a class="xref" href="../legacy-controller.html">Legacy Controller</a>.</p>
<p><code>Demo/</code> is customer-facing sample code — a custom colour guide and a per-step optimization sweep —
compiled into the assembly with no call site in the running application. Read it as an example of
how to extend the engine, not as part of the shipped behaviour.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../index.html">Anatomy by Source Directory</a> — the other two source trees, and how this
<li><a class="xref" href="index.html">Anatomy by Source Directory</a> — the other two source trees, and how this
layer is meant to be entered</li>
<li><a class="xref" href="../webservice-spa/index.html">Web Service SPA Source Tree</a> — the front end this process
<li><a class="xref" href="webservice-spa.html">Web Service SPA Source Tree</a> — the front end this process
serves and answers</li>
</ul>
@@ -7,13 +7,13 @@
<meta name="title" content="Web Service SPA Source Tree | HiAPI-C# 2025 ">
<link rel="icon" href="../../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../../public/docfx.min.css">
<link rel="stylesheet" href="../../../public/main.css">
<meta name="docfx:navrel" content="../../../toc.html">
<meta name="docfx:tocrel" content="../toc.html">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../../">
<meta name="docfx:rel" content="../../">
@@ -30,7 +30,7 @@
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../../public/docfx.min.js"></script>
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
@@ -43,8 +43,8 @@
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../../index.html">
<img id="logo" class="svg" src="../../../img/HiAPI.logo.png" alt="">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
@@ -116,7 +116,7 @@ page exists for it.</p>
<li><code>wwwroot-src/src/App.vue</code> — not the shell. It is a bare router view plus the once-per-load wiring
that subscribes the project store to the execution-status hub. The real shell is
<code>wwwroot-src/src/layouts/MainLayout.vue</code>. Documented in
<a class="xref" href="../../platform/session-state.html">Session State</a>.</li>
<a class="xref" href="../platform/session-state.html">Session State</a>.</li>
<li><code>wwwroot-src/src/boot/auth.ts</code>, <code>wwwroot-src/src/boot/i18n.ts</code>,
<code>wwwroot-src/src/boot/routine-toast.ts</code> — Quasar boot files, run once before mount and in a
declared order. The auth boot file patches the global fetch and inspects every 401, which is why
@@ -125,13 +125,13 @@ fires only while the auth store reports the login gate enabled, and not when the
already on the login route, so on a build with the gate off a 401 redirects nowhere. The toast
boot file patches the shared notify helper so every toast is mirrored into the footer history
without touching a call site. Documented in
<a class="xref" href="../../platform/login-and-auth.html">Login and Authentication</a> and
<a class="xref" href="../../platform/i18n.html">Internationalization</a>.</li>
<a class="xref" href="../platform/login-and-auth.html">Login and Authentication</a> and
<a class="xref" href="../platform/i18n.html">Internationalization</a>.</li>
<li><code>wwwroot-src/src/layouts/MainLayout.vue</code> — the shell: menu bar, the routed page container, footer.
It also owns the mechanism every page depends on and no page implements: a project epoch, bumped
when the loaded project changes, is the keep-alive key, so a project change destroys and rebuilds
every cached page. Documented in <a class="xref" href="../../shell/main-panel.html">Main Panel</a> and
<a class="xref" href="../../platform/session-state.html">Session State</a>.</li>
every cached page. Documented in <a class="xref" href="../shell/main-panel.html">Main Panel</a> and
<a class="xref" href="../platform/session-state.html">Session State</a>.</li>
</ul>
<h2 id="the-rest-edge">The REST Edge</h2>
<p><code>wwwroot-src/src/api/</code> is one thin typed module per backend controller family — functions, DTO types
@@ -142,7 +142,7 @@ application: each module wraps one named controller almost one-to-one.</p>
deliberately bypass it, so &ldquo;every API module goes through it&rdquo; would be wrong.</li>
<li><code>wwwroot-src/src/api/index-service.ts</code> — <strong>not</strong> a barrel file. It wraps the backend's keyed object
store, which is where the <code>key</code> string threaded through the whole application comes from.
Documented in <a class="xref" href="../../conventions/dictionary-service-pattern.html">Dictionary Service Pattern</a>.</li>
Documented in <a class="xref" href="../conventions/dictionary-service-pattern.html">Dictionary Service Pattern</a>.</li>
</ul>
<h2 id="components">Components</h2>
<ul>
@@ -152,9 +152,9 @@ Documented in <a class="xref" href="../../conventions/dictionary-service-pattern
The canvas does not render locally: it opens a SignalR connection and paints server-rendered
frames, which is why several pages each own a canvas bound to a different backend scene.
Documented in
<a class="xref" href="../../conventions/rendering-canvas-web-service.html">Rendering Canvas on Web Service</a>,
<a href="../../util/file-explorer.html">File Explorer</a> and
<a class="xref" href="../../util/stl-preview-pane.html">STL Preview Pane</a>.</li>
<a class="xref" href="../conventions/rendering-canvas-web-service.html">Rendering Canvas on Web Service</a>,
<a href="../util/file-explorer.html">File Explorer</a> and
<a class="xref" href="../util/stl-preview-pane.html">STL Preview Pane</a>.</li>
<li><code>wwwroot-src/src/components/controlTree/</code> — the largest folder in the SPA by a factor of two, and
a <strong>registry-driven panel system</strong> rather than a folder of tree widgets.
<code>wwwroot-src/src/components/controlTree/itemTypes.ts</code> and its domain siblings map an item-type
@@ -164,14 +164,14 @@ tree, gates a dirty selection switch, and syncs <code>?tree=</code>; the many
panel components are the editors the registry resolves. It serves <strong>three</strong> consumers, not one —
the Execution and General Setup pages each instantiate their own scoped host, while the Tool House
page reuses the identical panels and registry through a tab cascade and never touches the host.
Documented in <a class="xref" href="../../platform/control-tree.html">Control Tree</a> — the folder's own page — with
<a class="xref" href="../../execution/index.html">Execution Page</a>, <a class="xref" href="../../general-setup/index.html">General Setup Page</a> and
<a class="xref" href="../../tool-house/index.html">Tool House Page</a> for the three consumers, and
<a class="xref" href="../../execution/program.html">Program Branch</a> for the NC-program item types and panels that live in
Documented in <a class="xref" href="../platform/control-tree.html">Control Tree</a> — the folder's own page — with
<a class="xref" href="../execution/index.html">Execution Page</a>, <a class="xref" href="../general-setup/index.html">General Setup Page</a> and
<a class="xref" href="../tool-house/index.html">Tool House Page</a> for the three consumers, and
<a class="xref" href="../execution/program.html">Program Branch</a> for the NC-program item types and panels that live in
this folder. The nineteen <code>SoftNc*</code> panels and their registry are a wave of their own, documented
under <a class="xref" href="../../general-setup/controller/index.html">Controller Branch</a>: which of them the tree mounts at all is decided
by <a class="xref" href="../../general-setup/controller/brand-matrix.html">Brand Matrix</a>, and what they share is
<a class="xref" href="../../general-setup/controller/editing-contract.html">Editing Contract</a>.</li>
under <a class="xref" href="../general-setup/controller/index.html">Controller Branch</a>: which of them the tree mounts at all is decided
by <a class="xref" href="../general-setup/controller/brand-matrix.html">Brand Matrix</a>, and what they share is
<a class="xref" href="../general-setup/controller/editing-contract.html">Editing Contract</a>.</li>
<li><code>wwwroot-src/src/components/controlTree/toolhouse/</code> — the Tool House branch's panels. Easy to
confuse with <code>wwwroot-src/src/components/toolhouse/</code>: these are the panels the registry mounts,
that folder holds
@@ -180,24 +180,24 @@ the content fragments those panels embed, and the dependency runs one way only.<
sub-folder, the uPlot charting layer. Not purely page-local:
<code>wwwroot-src/src/components/execution/ExecutionToolBar.vue</code> is mounted by the Control Tree's
primary panel, and the spindle contours chart imports from the charts folder. Documented in
<a class="xref" href="../../execution/index.html">Execution Page</a>, <a class="xref" href="../../execution/strip-charts.html">Strip Charts</a> and
<a class="xref" href="../../execution/cycle-line-charts.html">Cycle-Line Charts</a>.</li>
<a class="xref" href="../execution/index.html">Execution Page</a>, <a class="xref" href="../execution/strip-charts.html">Strip Charts</a> and
<a class="xref" href="../execution/cycle-line-charts.html">Cycle-Line Charts</a>.</li>
<li><code>wwwroot-src/src/components/geom/</code> and <code>wwwroot-src/src/components/topo/</code> — structural twins: one
editor per kind, the same <code>modelKey</code> prop and <code>changed</code> / <code>error</code> emits, and a single kind → editor
map — <code>wwwroot-src/src/components/geom/geometryEditors.ts</code> and
<code>wwwroot-src/src/components/topo/transformerEditors.ts</code> — that is the source of truth for both the
switchboard and the Control Tree. A new kind must be registered there,
not merely dropped in the folder. &ldquo;topo&rdquo; means coordinate <strong>transformers</strong>, not mesh topology.
Documented in <a class="xref" href="../../geom/index.html">Geometry Panels</a> and
<a class="xref" href="../../geom/transformer-panel.html">Transformer Select Panel</a>.</li>
Documented in <a class="xref" href="../geom/index.html">Geometry Panels</a> and
<a class="xref" href="../geom/transformer-panel.html">Transformer Select Panel</a>.</li>
<li><code>wwwroot-src/src/components/widgets/</code> — the reusable input library: numeric, vector and matrix
inputs, the file-path input and picker, the CodeMirror text editor, the display-options and
object-management menus. Documented in <a class="xref" href="../../widget/index.html">Widgets</a>.</li>
object-management menus. Documented in <a class="xref" href="../widget/index.html">Widgets</a>.</li>
<li><code>wwwroot-src/src/components/panels/</code> — pure layout machinery with no domain: the collapsible
expansion panel and the resizable stack whose registration contract produces the &ldquo;rows collapse in
place&rdquo; behaviour the tree pages describe. Documented in
<a class="xref" href="../../platform/control-tree.html">Control Tree</a>, whose dock rows are both expansion rows, and
<a class="xref" href="../../platform/session-state.html">Session State</a> for the keep-mounted flag that decides whether a
<a class="xref" href="../platform/control-tree.html">Control Tree</a>, whose dock rows are both expansion rows, and
<a class="xref" href="../platform/session-state.html">Session State</a> for the keep-mounted flag that decides whether a
collapse unmounts its content.</li>
<li><code>wwwroot-src/src/components/mission/</code>, <code>.../toolhouse/</code>, <code>.../spindle/</code>, <code>.../preference/</code>,
<code>.../mech/</code>, <code>.../workpiece/</code> and <code>.../controller/</code> — the domain and page folders named above. The
@@ -212,21 +212,21 @@ behind every hub composable, so a hub opens only while something consumes it.
<code>wwwroot-src/src/composables/useToolHouse.ts</code> and <code>wwwroot-src/src/composables/useSpindleCapability.ts</code> are module-level
singletons, not per-component instances. <code>wwwroot-src/src/composables/useViewPrefs.ts</code> stores layout state in the
browser only — it is neither in the project file nor in the server's user config. Documented in
<a class="xref" href="../../platform/session-state.html">Session State</a>.</li>
<a class="xref" href="../platform/session-state.html">Session State</a>.</li>
<li><code>wwwroot-src/src/stores/</code> — four Pinia stores. <code>wwwroot-src/src/stores/index.ts</code> is <strong>not</strong> a barrel; it is the
Quasar factory. Most shared state lives in <code>composables/</code> instead. Documented in
<a class="xref" href="../../platform/session-state.html">Session State</a>.</li>
<a class="xref" href="../platform/session-state.html">Session State</a>.</li>
<li><code>wwwroot-src/src/router/</code> — <code>wwwroot-src/src/router/routes.ts</code> is the table plus the legacy redirects, and
<code>wwwroot-src/src/router/treeRoutes.ts</code> is the load-bearing file its name understates: it holds the accumulated
chain of tree-id renames and the id → page resolver, plus the tab-name constants both the router
and the tab composable consume. A route's <code>meta.title</code> holds an i18n key, not a title.
Documented in <a class="xref" href="../../platform/tree-ids-and-routes.html">Tree Ids and Routes</a>.</li>
Documented in <a class="xref" href="../platform/tree-ids-and-routes.html">Tree Ids and Routes</a>.</li>
<li><code>wwwroot-src/src/i18n/</code> — three locales shipped together, each a list of namespace files.
<strong>English is the schema</strong>, not merely a locale: the two Chinese bundles are typed against it, so a
key present in English and missing there is a build error. Keys are split by UI region rather than
by source file, so there is no one-to-one mapping between an i18n file and a components folder.
Documented in <a class="xref" href="../../platform/i18n.html">Internationalization</a> and
<a class="xref" href="../../conventions/translation-remarks.html">Translation Remarks</a>.</li>
Documented in <a class="xref" href="../platform/i18n.html">Internationalization</a> and
<a class="xref" href="../conventions/translation-remarks.html">Translation Remarks</a>.</li>
<li><code>wwwroot-src/src/pages/</code> — one file per route, and page size is a poor guide to importance: the
General Setup page is small because it delegates almost everything to the Control Tree dock and the
equipment canvas, while the File Explorer page is a thin wrapper around a large shared component.</li>
@@ -237,9 +237,9 @@ is a separate, shorter toast scale.</li>
</ul>
<h2 id="see-also">See Also</h2>
<ul>
<li><a class="xref" href="../index.html">Anatomy by Source Directory</a> — the other two source trees, and how this
<li><a class="xref" href="index.html">Anatomy by Source Directory</a> — the other two source trees, and how this
layer is meant to be entered</li>
<li><a class="xref" href="../webservice-backend/index.html">Web Service Backend Source Tree</a> — the process that
<li><a class="xref" href="webservice-backend.html">Web Service Backend Source Tree</a> — the process that
serves this application and answers its REST and hub traffic</li>
</ul>