From 99c914ca771cd05eba0f152ecbedb183f75a2c54 Mon Sep 17 00:00:00 2001 From: philipp Date: Tue, 19 May 2026 18:46:02 +0200 Subject: [PATCH] Use full dashboard width Proof: Dashboard shell now spans width 100%, panel subtitles and lifecycle pills no longer use max-width constraints, pair config controls no longer use React maxWidth, static UI coverage asserts those constraints stay absent, full npm test passes, and the operator dashboard bundle builds. Assumptions: this is a dashboard layout-only cleanup for the active maker timing and competitiveness turn; it does not change strategy decisions, execution, DB config, persistence, live funds, or response policy. Still fake: relay acceptance remains submission evidence only; venue-native terminal fill ids and fee-complete realized PnL remain unavailable. --- src/operator-dashboard/static/pages/StrategyPage.jsx | 4 ---- src/operator-dashboard/static/styles.css | 12 +++++------- test/operator-dashboard-ui-static.test.mjs | 3 +++ 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/operator-dashboard/static/pages/StrategyPage.jsx b/src/operator-dashboard/static/pages/StrategyPage.jsx index 1ad5d5c..9b25867 100644 --- a/src/operator-dashboard/static/pages/StrategyPage.jsx +++ b/src/operator-dashboard/static/pages/StrategyPage.jsx @@ -1242,7 +1242,6 @@ function PairConfigSection({ assetCatalog, pairConfig, onControl }) { [pairId]: event.target.value, }))} step="1" - style={{ maxWidth: 92 }} type="number" value={edgeDrafts[pairId] ?? ''} /> @@ -1257,7 +1256,6 @@ function PairConfigSection({ assetCatalog, pairConfig, onControl }) { [pairId]: event.target.value, }))} step="0.00000001" - style={{ maxWidth: 112 }} type="number" value={minNotionalDrafts[pairId] ?? ''} /> @@ -1272,7 +1270,6 @@ function PairConfigSection({ assetCatalog, pairConfig, onControl }) { [pairId]: event.target.value, }))} step="0.00000001" - style={{ maxWidth: 112 }} type="number" value={maxNotionalDrafts[pairId] ?? ''} /> @@ -1312,7 +1309,6 @@ function PairConfigSection({ assetCatalog, pairConfig, onControl }) { [pairId]: event.target.value, }))} step="1" - style={{ maxWidth: 112 }} type="number" value={maxQuoteAgeDrafts[pairId] ?? ''} /> diff --git a/src/operator-dashboard/static/styles.css b/src/operator-dashboard/static/styles.css index ca970cb..4fe2341 100644 --- a/src/operator-dashboard/static/styles.css +++ b/src/operator-dashboard/static/styles.css @@ -57,9 +57,9 @@ select { } .shell { - width: min(1440px, calc(100vw - 28px)); - margin: 0 auto; - padding: 18px 0 36px; + width: 100%; + margin: 0; + padding: 18px 14px 36px; } .status-bar { @@ -207,7 +207,6 @@ select { .panel-subtitle { margin-top: 8px; color: var(--muted); - max-width: 72ch; } .metric-grid { @@ -581,8 +580,7 @@ table.lifecycle-table th:nth-child(5) { @media (max-width: 720px) { .shell { - width: min(100vw - 16px, 100%); - padding-top: 10px; + padding: 10px 8px 36px; } .status-bar { @@ -665,7 +663,7 @@ table.lifecycle-table th:nth-child(5) { } .quote-lifecycle-table .pill { - max-width: 100%; + width: 100%; min-width: 0; overflow: hidden; text-overflow: ellipsis; diff --git a/test/operator-dashboard-ui-static.test.mjs b/test/operator-dashboard-ui-static.test.mjs index 65dd402..c9489cc 100644 --- a/test/operator-dashboard-ui-static.test.mjs +++ b/test/operator-dashboard-ui-static.test.mjs @@ -35,6 +35,9 @@ test('strategy page owns consolidated quote lifecycle and successful trade table assert.match(strategySource, /Live rows update as they arrive/); assert.match(strategySource, /visibleRows/); assert.match(strategySource, /quote-lifecycle-placeholder-row/); + assert.match(stylesSource, /\.shell \{[\s\S]*?width: 100%;[\s\S]*?margin: 0;[\s\S]*?\}/); + assert.doesNotMatch(stylesSource, /^\s*max-width\s*:/m); + assert.doesNotMatch(strategySource, /maxWidth:/); assert.match(stylesSource, /\.quote-lifecycle-table tbody tr\.quote-lifecycle-row/); assert.match(stylesSource, /\.quote-lifecycle-placeholder-row td/); assert.match(stylesSource, /\.lifecycle-clamp-one/);