Signal Lab {{ trial_id }}
Tab
{% from 'partials/trial_viewer/_macros.html' import tab_strip, tree_folder_row, tree_expand_collapse_buttons, tree_indent_guides, tree_search_input, tree_sort_controls %} {% call tab_strip('labTabs', 'labActiveTabId', 'tab.name', 'tab.dirty', 'switchTab', 'closeTab', 'reorderLabTabs', 'mojo:lab-close-tab', 'newTab', 'New tab', duplicate_fn='duplicateLabTab', select_fn='selectLabTab', selected_expr='selectedLabTabIds.includes(tab.id)') %}
{# max-h used to live on this outer div, capping header+list together - since the header is shrink-0 (always its full natural height, e.g. search row + hint row + the sort- controls row above), it always claims its space FIRST, leaving only whatever's left of that fixed budget for the list. That's why the list looked cramped, and why bumping this cap felt disproportionate: the header's own height doesn't change, so 100% of any increase here goes to the list alone, not split evenly. Capping the list directly instead (below) gives it a size that's stable regardless of how tall the header ends up being. #}
{{ tree_search_input('labSearch', 'Search labs…', '@keydown.stop @keydown.tab.prevent="acceptSearch()" @keydown.enter="loadSingle()"') }}
{{ tree_expand_collapse_buttons('expandAllLabFolders()', 'collapseAllLabFolders()', "labTreeRows.some(r => r.type === 'folder')") }}
Tab
{{ tree_sort_controls("labSortMode", "labSortDir", "setLabSortMode('name')", "setLabSortMode('modified')", "hideInvalidLabs", "toggleHideInvalidLabs()", "hasInvalidLabs") }}

{% endcall %}

Select Signal

{% from 'partials/trial_viewer/_macros.html' import tree_folder_row, tree_expand_collapse_buttons, tree_indent_guides, tree_search_input %}
{{ tree_search_input('nodeColSearch', 'Filter signals…') }}
{{ tree_expand_collapse_buttons("expandAllColumnFolders('nodeCol')", "collapseAllColumnFolders('nodeCol')", "getColumnTreeRows('nodeCol').some(r => r.type === 'folder')") }}

No matching signals

Select Quaternion Base

{% from 'partials/trial_viewer/_macros.html' import tree_folder_row, tree_expand_collapse_buttons, tree_indent_guides, tree_search_input %}
{{ tree_search_input('nodeQuatSearch', 'Filter quaternions…') }}
{{ tree_expand_collapse_buttons("expandAllColumnFolders('nodeQuat')", "collapseAllColumnFolders('nodeQuat')", "getColumnTreeRows('nodeQuat').some(r => r.type === 'folder')") }}

No matching quaternions

Select Template

Right-click → add node Scroll to zoom · drag to pan + Z Undo + ⇧ Redo + S Save + C Clear Del Remove + ⇧ + A Arrange + ⇧ + F Fit