refactor(ui): trim the right rail tabs surface, share one DOM fake and one phone breakpoint

rightRailTabs.js exports only createRightRailTabs, nextRailTabIndex and railJoinPath and returns element, sync and destroy; the id constants, railTabPanels, the argument guard and the createElementNS fallback existed for the tests alone. The sub-720px density tier and the slot's focus ring go; the five rail cards carry data-rail-card so the stylesheet lists them once.

src/ui/mobileShellContract.js holds the phone shell's media query and class, dependency-free so the rail layout and panel packages can read them; rightPanelRail.js, panelPositionControls.js and radioPanelPlacement.js use it instead of their own literals. src/testSupport/fakeDom.mjs replaces the two hand-made DOM fakes of the rail and strip tests; the rail tests now expect null for a missing attribute, as in the DOM. The two Radio gate checks of the removed several-panels rail policy are gone.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
German KhokhlovandClaude Fable 5.1 committed 2026-10-28 15:17:25 +04:00
1 parent e05d6a29b4
commit 8c788474db
19 files changed
+273 -396

No files matched your search

+5
View File
@@ -424,6 +424,7 @@
"src/ui/displayPanelScroll.js",
"src/ui/leftPanelRail.js",
"src/ui/rightPanelRail.js",
"src/ui/mobileShellContract.js",
"src/ui/panelMeasurement.js",
"src/ui/panelRailGeometry.js",
"src/panelStackLayout.js"
@@ -762,6 +763,7 @@
"src/ui/radioTunerModel.js",
"src/ui/recordingControls.js",
"src/ui/rightPanelRail.js",
"src/ui/mobileShellContract.js",
"src/ui/rightRailTabs.js",
"src/ui/sceneControls.js",
"src/ui/scenePresentation.js",
@@ -2288,6 +2290,7 @@
"src/ui/radioTunerModel.js",
"src/ui/recordingControls.js",
"src/ui/rightPanelRail.js",
"src/ui/mobileShellContract.js",
"src/ui/rightRailTabs.js",
"src/ui/sceneControls.js",
"src/ui/scenePresentation.js",
@@ -3308,6 +3311,7 @@
"src/hudLayouts.js",
"src/hudLayoutPolicy.js",
"src/ui/radioPanelPlacement.js",
"src/ui/mobileShellContract.js",
"src/bloom.js",
"src/cockpitVisionPolicy.js",
"src/contactsDetectionPolicy.js",
@@ -3354,6 +3358,7 @@
"src/ui/panelRailGeometry.js",
"src/ui/panelRails.js",
"src/ui/rightPanelRail.js",
"src/ui/mobileShellContract.js",
"src/ui/rightRailTabs.js",
"src/ui/uiLifetime.js",
"src/i18n/index.js",
-22
View File
@@ -1902,18 +1902,6 @@ async function main() {
return result;
});
check(
'HUD-off desktop lanes keep Data plus Scenes and Display plus Context expanded inside the viewport corridor',
multiExpandedPanelLayout.independentLeft
&& multiExpandedPanelLayout.independentRight
&& multiExpandedPanelLayout.leftCountsAllExpanded
&& multiExpandedPanelLayout.rightCountsAllExpanded
&& multiExpandedPanelLayout.leftInsideCorridor
&& multiExpandedPanelLayout.rightInsideCorridor
&& multiExpandedPanelLayout.internalScrollOwned
&& multiExpandedPanelLayout.restoredExactly,
JSON.stringify(multiExpandedPanelLayout),
);
check(
'HUD-off to Tactical preserves the latest-opened Scenes panel and hides its collapsed Data competitor',
multiExpandedPanelLayout.tacticalAutoCollapse.latestOpenedPanel === 'scene-panel'
@@ -1927,16 +1915,6 @@ async function main() {
&& multiExpandedPanelLayout.tacticalAutoCollapse.contextAriaExpanded === 'false',
JSON.stringify(multiExpandedPanelLayout.tacticalAutoCollapse),
);
check(
'closing Tactical lane owners restores eligible temporary siblings without changing disclosure truth',
multiExpandedPanelLayout.tacticalAutoRestore.dataExpanded
&& multiExpandedPanelLayout.tacticalAutoRestore.dataAutoMarkerCleared
&& multiExpandedPanelLayout.tacticalAutoRestore.dataAriaExpanded === 'true'
&& multiExpandedPanelLayout.tacticalAutoRestore.contextExpanded
&& multiExpandedPanelLayout.tacticalAutoRestore.contextAutoMarkerCleared
&& multiExpandedPanelLayout.tacticalAutoRestore.contextAriaExpanded === 'true',
JSON.stringify(multiExpandedPanelLayout.tacticalAutoRestore),
);
check(
'Tactical Display hides ordinary collapsed CCTV and Context launchers',
Object.values(multiExpandedPanelLayout.tacticalDisplayExclusive).every(Boolean),