harden terminal ui states and drawer focus handling #16

Open
dirtydishes wants to merge 4 commits from lavender/all-quiet into main
3 changed files with 469 additions and 9 deletions
Showing only changes of commit 96b179243c - Show all commits

View file

@ -24,6 +24,7 @@
{"_type":"issue","id":"islandflow-ayo","title":"Drop stale backlog events from live fanout","description":"Follow-up to live freshness rollout: /ws/live was still fanning out stale backlog events for freshness-gated channels, which kept tape panes in Live feed behind despite active synthetic ingest. Gate fanout and cache ingest by freshness for options/nbbo/equities/flow.","status":"closed","priority":1,"issue_type":"bug","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-04-28T21:26:39Z","created_by":"dirtydishes","updated_at":"2026-04-28T21:26:44Z","started_at":"2026-04-28T21:26:44Z","closed_at":"2026-04-28T21:26:44Z","close_reason":"Completed","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-0v6","title":"Fix tape freshness, NBBO coverage, pause controls, and filter popup","description":"Implement the tape fixes requested for synthetic options notional sizing, strict live freshness, live-mode pause/resume behavior, stronger NBBO snapshot coverage, and moving flow filters behind a popup. Includes server-side live cache changes, web terminal state/UI changes, and tests for synthetic pricing, live snapshot freshness/NBBO retention, and live pause/filter interactions.","status":"closed","priority":1,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-04-28T21:02:52Z","created_by":"dirtydishes","updated_at":"2026-04-28T21:13:38Z","started_at":"2026-04-28T21:02:57Z","closed_at":"2026-04-28T21:13:38Z","close_reason":"Completed","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-e4r","title":"Implement smart-money flow filtering and synthetic firehose modes","description":"Implement the approved multi-surface plan for named synthetic market profiles, options raw-vs-signal filtering, live/API filter contracts, Tape page client-side flow filters, firehose-readiness improvements, tests, and README updates.","status":"closed","priority":1,"issue_type":"feature","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-04-28T20:10:49Z","created_by":"dirtydishes","updated_at":"2026-04-28T20:29:29Z","started_at":"2026-04-28T20:10:53Z","closed_at":"2026-04-28T20:29:29Z","close_reason":"Implemented synthetic market profiles, options signal-path filtering, signal-aware API/replay contracts, Tape page filters, tests, and README updates. Follow-up tracked in islandflow-biq.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-833","title":"Improve narrow options table responsiveness","description":"Adapt the Options route for narrow screens so dense tape tables remain contained in their panes, preserve row identity while horizontally panning, and keep the mobile ticker/filter controls readable.","acceptance_criteria":"Options tape panes have bounded heights on narrow screens; table body scrolls internally; first table column remains visible while panning; mobile topbar and filter controls have adequate spacing; web production build passes.","status":"closed","priority":2,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-29T22:34:05Z","created_by":"dirtydishes","updated_at":"2026-05-29T22:36:20Z","started_at":"2026-05-29T22:34:24Z","closed_at":"2026-05-29T22:36:20Z","close_reason":"Implemented narrow-screen options pane containment, sticky row context, touch-scroll affordances, and mobile control spacing. Validated with web build and in-browser narrow viewport checks.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-aq9","title":"Harden terminal UI error and overflow states","description":"Harden the web terminal against oversized API errors, non-JSON synthetic admin failures, and long status text so live trading panes remain stable under bad network/backend responses.","status":"closed","priority":2,"issue_type":"task","owner":"dishes@dpdrm.com","created_at":"2026-05-29T22:10:16Z","created_by":"dirtydishes","updated_at":"2026-05-29T22:13:37Z","closed_at":"2026-05-29T22:13:37Z","close_reason":"Hardened terminal UI error rendering, synthetic admin failure parsing, long-message wrapping, and added focused tests.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-ggm","title":"Harden web terminal UI states","description":"Improve the web terminal surface so it handles loading, empty data, API failures, overflow, and accessible live-status behavior more robustly.","status":"closed","priority":2,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-29T21:59:45Z","created_by":"dirtydishes","updated_at":"2026-05-29T22:05:45Z","started_at":"2026-05-29T21:59:59Z","closed_at":"2026-05-29T22:05:45Z","close_reason":"Hardened web terminal status announcements, empty states, table semantics, clipped-cell fallbacks, tests, validation, and turn documentation.","dependency_count":0,"dependent_count":0,"comment_count":0}
{"_type":"issue","id":"islandflow-dk5","title":"Remove frontend cooker route","description":"Remove the experimental /frontend-cooker page and update repository references that still list it as an available public route.","status":"closed","priority":2,"issue_type":"task","assignee":"dirtydishes","owner":"dishes@dpdrm.com","created_at":"2026-05-29T13:50:38Z","created_by":"dirtydishes","updated_at":"2026-05-29T13:53:05Z","started_at":"2026-05-29T13:50:48Z","closed_at":"2026-05-29T13:53:05Z","close_reason":"Removed the /frontend-cooker Next.js route, cleaned route/scanner references, documented the work, and validated the web build.","dependency_count":0,"dependent_count":0,"comment_count":0}

View file

@ -1469,6 +1469,7 @@ h3 {
}
.data-table-wrap {
position: relative;
display: flex;
flex: 1 1 auto;
min-height: 0;
@ -2489,6 +2490,10 @@ h3 {
min-height: 0;
}
.page-grid-options > .terminal-pane {
height: clamp(430px, 68svh, 720px);
}
.command-deck-grid {
grid-template-columns: minmax(0, 1fr);
grid-template-areas:
@ -2563,7 +2568,7 @@ h3 {
}
.terminal-content {
padding: 16px 10px 22px;
padding: 18px 10px calc(22px + env(safe-area-inset-bottom));
}
.page-shell {
@ -2615,11 +2620,19 @@ h3 {
position: sticky;
top: 0;
z-index: 30;
padding: 12px 10px;
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
align-items: start;
column-gap: 10px;
row-gap: 16px;
padding: 10px 10px 12px;
}
.terminal-topbar-leading {
width: 100%;
width: auto;
min-width: 0;
grid-column: 1;
grid-row: 1;
}
.terminal-button,
@ -2638,30 +2651,50 @@ h3 {
.terminal-topbar-actions,
.terminal-topbar-controls,
.terminal-topbar-mode {
width: 100%;
min-width: 0;
justify-content: flex-start;
}
.terminal-topbar-actions,
.terminal-topbar-actions {
display: contents;
}
.terminal-topbar-controls {
flex-direction: column;
align-items: stretch;
width: 100%;
grid-column: 1 / -1;
grid-row: 2;
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
align-items: end;
gap: 10px;
}
.terminal-topbar-mode {
grid-column: 2;
grid-row: 1;
width: auto;
justify-content: flex-end;
}
.terminal-menu-trigger {
width: 100%;
width: auto;
justify-content: center;
}
.terminal-topbar-mode .terminal-button,
.terminal-topbar-controls > .terminal-button,
.terminal-topbar-leading > .terminal-button,
.page-actions > .terminal-button,
.page-actions > .flow-filter-popover {
width: 100%;
}
.terminal-topbar-controls > .terminal-button {
width: auto;
min-width: 76px;
}
.instrument-focus-chip {
grid-column: 1 / -1;
max-width: none;
min-height: 44px;
justify-content: space-between;
@ -2685,6 +2718,10 @@ h3 {
border-radius: 12px;
}
.page-grid-options > .terminal-pane {
height: clamp(390px, 62svh, 620px);
}
.terminal-pane-head,
.terminal-pane-body {
padding: 14px 12px;
@ -2716,6 +2753,7 @@ h3 {
width: 100%;
flex-direction: column;
align-items: stretch;
margin-top: 2px;
}
.flow-filter-popover {
@ -2753,6 +2791,19 @@ h3 {
margin-inline: -12px;
border-radius: 0;
scroll-snap-type: x proximity;
scrollbar-gutter: stable;
overscroll-behavior-x: contain;
-webkit-overflow-scrolling: touch;
}
.data-table-wrap::after {
content: "";
position: sticky;
right: 0;
z-index: 5;
flex: 0 0 18px;
pointer-events: none;
background: linear-gradient(90deg, transparent, oklch(0.12 0.01 250 / 0.92));
}
.data-table {
@ -2770,6 +2821,39 @@ h3 {
padding-inline: 8px;
}
.data-table-head .data-table-cell:first-child,
.data-table-row .data-table-cell:first-child {
position: sticky;
left: 0;
z-index: 4;
margin-left: -8px;
padding-left: 8px;
background: oklch(0.13 0.01 250);
box-shadow:
1px 0 0 oklch(0.72 0.012 250 / 0.14),
14px 0 18px oklch(0.06 0.01 250 / 0.42);
}
.data-table-head .data-table-cell:first-child {
z-index: 6;
background: oklch(0.15 0.012 250);
}
.data-table-row.is-even .data-table-cell:first-child {
background: oklch(0.145 0.011 250);
}
.data-table-row:hover .data-table-cell:first-child,
.data-table-row:focus-visible .data-table-cell:first-child {
background: oklch(0.18 0.025 74);
}
.data-table-row-classified .data-table-cell:first-child {
background:
linear-gradient(90deg, rgba(var(--classifier-rgb, 192, 200, 210), calc(0.04 + var(--classifier-intensity, 0) * 0.1)), transparent 90%),
oklch(0.13 0.01 250);
}
.data-table-row-options,
.data-table-row-equities {
height: 40px;
@ -2832,6 +2916,22 @@ h3 {
}
@media (max-width: 420px) {
.terminal-topbar {
column-gap: 8px;
row-gap: 14px;
padding-inline: 8px;
}
.terminal-menu-trigger {
min-width: 92px;
padding-inline: 8px;
}
.terminal-topbar-mode .terminal-button {
min-width: 82px;
padding-inline: 8px;
}
.terminal-content {
padding-inline: 8px;
}

File diff suppressed because one or more lines are too long