{{ currentZoomLevel }}
@if (savedLayouts.length > 0) { } @if (savedLayouts.length > 0) { }
@if (showShortcuts) {
Keyboard & Mouse Shortcuts
Mouse
ClickSelect node, open detail panel
Right-clickHighlight entire subtree downward
{{ isMac ? '⌘' : 'Ctrl' }}+ClickFocus mode: show node, direct children, and paths to roots
{{ isMac ? '⌘⇧' : 'Ctrl+Shift' }}+ClickDeep focus: show node, all descendants to leaves, and paths to roots
Shift+ClickHighlight parent path only (no "also satisfies")
{{ isMac ? '⌥' : 'Alt' }}+ClickHighlight "also satisfies" links for a node
Click backgroundExit focus mode or close detail panel
Drag nodeReposition (saved across sessions)
Keyboard
+ =Zoom in
-Zoom out
0Fit graph to screen
{{ isMac ? '⌘Z' : 'Ctrl+Z' }}Undo last canvas action
EscExit focus mode
Graph
Solid linesParent-child relationships
Dashed purple"Also satisfies" links
Dashed yellowOrphaned node (parent was deleted)
Red dotFewer than 2 quality gates pass
Orange dot2 of 3 quality gates pass
Green dotAll quality gates pass
} @if (showHelp) {
How It Works
Databases
Each project lives in its own SQLite .db file. Use the database selector in the navbar to switch between them.
NewCreates an empty database on the server
CopyClones the active database under a new name
UploadUploads a .db file from your computer to the server and switches to it
DownloadDownloads the active database as a local backup file
Layout Persistence
Node positions, viewport (zoom/pan), selected node, and panel state are automatically saved to the active database every time you make a change. This means your layout travels with the .db file — download it, upload to another machine or browser, and everything is exactly where you left it.
Auto-saveWorking state writes to the DB after 1 second of inactivity
Named layoutsSave/Load snapshots of node positions via the toolbar
Layout buttonResets the tree to an automatic dagre layout; orphans are grouped below
Deleting Nodes
Deleting a requirement does not delete its children. Children become orphans — they lose their parent link and show a dashed yellow border. Orphaned nodes fail the Traceable (T) quality gate until re-parented.
Orphans buttonGroups orphaned nodes together without moving the rest of the layout
Re-parentEdit an orphan's parent ID in the detail panel to restore traceability
Quality Gates (TMCS)
T — TraceableAuto-calculated: non-pillar nodes must have a parent
M — MeasurableRequires a test specification (GIVEN/WHEN/THEN)
C — ConsistentManual toggle — you verify it doesn't contradict other requirements
S — Single-purposeManual toggle — you verify it serves exactly one purpose
} @if (showCreatePillar) {
}
@if (loading) {
Loading requirements graph...
} @if (!loading && treeData.length === 0 && !showCreatePillar) {
No requirements yet
Create a pillar to get started
}
@if (showSaveLayout) {
Save Current Layout
} @if (showManageLayouts) {
Manage Layouts
@for (layout of savedLayouts; track layout.id) {
{{ layout.name }}{{ layout.is_default ? ' (default)' : '' }} {{ layout.updated_at | date:'short' }} @if (layout.description) { {{ layout.description }} }
@if (!layout.is_default) { }
} @empty {
No saved layouts
}
} @if (detailOpen && selectedNode) { }