feat: F4.7 the data exchange window, measured against Java's

One row per frame (its highest layer's), Java's detail tree, the table as
Java's text file, "Tabellen löschen" for every card (clearCapture in the
room), a tab per card with Java's title, Java's layer colours as tokens,
the chosen frame and autoscroll per tab. New oracle ExchangeWindowRun.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-04 09:12:38 +00:00
co-authored by Claude Opus 5.5
parent 6809a71300
commit 9252b942c4
26 changed files with 7692 additions and 33 deletions
+177
View File
@@ -1341,3 +1341,180 @@
white-space: pre-wrap;
overflow-wrap: anywhere;
}
/* The data exchange window (AggregatedExchangeDialog): Java's is three
* quarters of the screen wide and four fifths high; the tabs, a bar for what
* Java's right mouse button offers, the table (a row per frame in its layer's
* colour, Java's fonts by column) and the chosen frame's details below. */
.capture-window {
width: 960px;
height: 640px;
}
.capture-tabs {
display: flex;
flex-wrap: wrap;
gap: 4px;
padding: 6px 8px 0;
background: var(--surface-raised);
border-bottom: 1px solid var(--border-default);
}
.capture-tab {
display: inline-flex;
align-items: center;
border: 1px solid var(--border-default);
border-bottom: none;
border-radius: 6px 6px 0 0;
background: var(--surface-sunken);
}
.capture-tab button {
min-height: 36px;
border: none;
background: transparent;
color: var(--text-primary);
font: inherit;
font-size: 13px;
cursor: pointer;
}
.capture-tab button[aria-selected='true'] {
font-weight: 600;
}
.capture-tab:has(button[aria-selected='true']) {
background: var(--surface-card);
}
.capture-tab-close {
min-width: 36px;
color: var(--text-secondary) !important;
font-size: 18px !important;
}
.capture-bar {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
padding: 6px 8px;
background: var(--surface-card);
color: var(--text-primary);
}
.capture-bar button {
min-height: 44px;
padding: 0 12px;
border: 1px solid var(--border-default);
border-radius: 8px;
background: var(--surface-raised);
color: var(--text-primary);
font: inherit;
cursor: pointer;
}
.capture-bar label {
display: inline-flex;
align-items: center;
gap: 6px;
min-height: 44px;
}
.capture-bar input {
width: 20px;
height: 20px;
}
.capture-table {
flex: 3;
min-height: 0;
overflow: auto;
background: var(--surface-sunken);
}
.capture-table table {
width: 100%;
min-width: 760px;
border-collapse: separate;
border-spacing: 0 2px;
font-size: 12px;
}
.capture-table th {
position: sticky;
top: 0;
padding: 6px;
background: var(--surface-raised);
color: var(--text-primary);
text-align: left;
font-weight: 600;
}
.capture-row {
color: var(--capture-on-layer);
cursor: pointer;
}
.capture-row td {
padding: 4px 6px;
white-space: nowrap;
}
/* Java's fonts: number and time plain, addresses and comment monospaced, the protocol bold, the layer bold italic. */
.capture-row td:nth-child(3),
.capture-row td:nth-child(4),
.capture-row td:nth-child(7) {
font-family: ui-monospace, Menlo, Consolas, monospace;
}
.capture-row td:nth-child(5) {
font-weight: 700;
}
.capture-row td:nth-child(6) {
font-weight: 700;
font-style: italic;
}
.capture-networkAccess {
background: var(--capture-network-access);
}
.capture-internet {
background: var(--capture-internet);
}
.capture-transport {
background: var(--capture-transport);
}
.capture-application {
background: var(--capture-application);
}
.capture-row[aria-selected='true'] {
background: var(--capture-chosen);
color: var(--capture-on-chosen);
}
.capture-row:focus-visible {
outline: 2px solid var(--border-focus);
outline-offset: -2px;
}
/* MessageDetailsPanel: a tree in bold monospace, a long comment on lines of its own. */
.capture-details {
flex: 2;
min-height: 0;
margin: 0;
padding: 6px;
overflow: auto;
list-style: none;
border-top: 1px solid var(--border-strong);
background: var(--surface-card);
color: var(--text-primary);
font: 700 12px ui-monospace, Menlo, Consolas, monospace;
white-space: pre-wrap;
overflow-wrap: anywhere;
}