Enhanced Textual TUI with proper API usage and documentation
- Fixed DataTable row selection and event handling - Added explicit column keys to prevent auto-generated keys - Implemented row-to-flow mapping for reliable selection tracking - Converted left metrics panel to horizontal top bar - Fixed all missing FlowStats/EnhancedAnalysisData attributes - Created comprehensive Textual API documentation in Documentation/textual/ - Added validation checklist to prevent future API mismatches - Preserved cursor position during data refreshes - Fixed RowKey type handling and event names The TUI now properly handles flow selection, displays metrics in a compact top bar, and correctly correlates selected rows with the details pane.
This commit is contained in:
148
analyzer/tui/textual/styles/streamlens.tcss
Normal file
148
analyzer/tui/textual/styles/streamlens.tcss
Normal file
@@ -0,0 +1,148 @@
|
||||
/* StreamLens Textual CSS Styling */
|
||||
|
||||
/* Main application layout */
|
||||
#main-container {
|
||||
height: 1fr;
|
||||
padding: 1;
|
||||
}
|
||||
|
||||
#status-summary {
|
||||
height: 1;
|
||||
background: $primary;
|
||||
color: $text;
|
||||
text-align: center;
|
||||
margin-bottom: 1;
|
||||
}
|
||||
|
||||
/* Flow Analysis Tab Styling */
|
||||
#flow-title {
|
||||
height: 1;
|
||||
text-align: center;
|
||||
text-style: bold;
|
||||
color: $accent;
|
||||
margin-bottom: 1;
|
||||
}
|
||||
|
||||
#flows-table {
|
||||
height: 1fr;
|
||||
border: solid $primary;
|
||||
}
|
||||
|
||||
#flows-table:focus {
|
||||
border: solid $accent;
|
||||
}
|
||||
|
||||
/* Enhanced flow styling */
|
||||
.enhanced-flow {
|
||||
background: $success 50%;
|
||||
color: $text;
|
||||
}
|
||||
|
||||
/* Packet Decoder 3-panel layout */
|
||||
#flow-summary-panel {
|
||||
width: 25%;
|
||||
border: solid $primary;
|
||||
margin-right: 1;
|
||||
}
|
||||
|
||||
#packet-list-panel {
|
||||
width: 1fr;
|
||||
border: solid $primary;
|
||||
margin-right: 1;
|
||||
}
|
||||
|
||||
#field-details-panel {
|
||||
width: 25%;
|
||||
border: solid $primary;
|
||||
}
|
||||
|
||||
#flow-summary-title, #packet-list-title, #field-details-title {
|
||||
height: 1;
|
||||
text-align: center;
|
||||
text-style: bold;
|
||||
color: $accent;
|
||||
background: $surface;
|
||||
}
|
||||
|
||||
#flow-tree, #packet-table, #field-tree {
|
||||
height: 1fr;
|
||||
}
|
||||
|
||||
/* Statistics Dashboard */
|
||||
#stats-title {
|
||||
height: 1;
|
||||
text-align: center;
|
||||
text-style: bold;
|
||||
color: $accent;
|
||||
margin-bottom: 1;
|
||||
}
|
||||
|
||||
#metrics-summary {
|
||||
height: 3;
|
||||
margin-bottom: 1;
|
||||
}
|
||||
|
||||
#metrics-summary Static {
|
||||
width: 1fr;
|
||||
border: solid $primary;
|
||||
margin-right: 1;
|
||||
text-align: center;
|
||||
padding: 1;
|
||||
}
|
||||
|
||||
#metrics-summary Static:last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
/* Table styling */
|
||||
DataTable {
|
||||
height: 1fr;
|
||||
scrollbar-gutter: stable;
|
||||
}
|
||||
|
||||
DataTable .even {
|
||||
background: $surface;
|
||||
}
|
||||
|
||||
DataTable .odd {
|
||||
background: $background;
|
||||
}
|
||||
|
||||
DataTable .cursor {
|
||||
background: $accent;
|
||||
color: $text;
|
||||
}
|
||||
|
||||
/* Tree styling */
|
||||
Tree {
|
||||
height: 1fr;
|
||||
scrollbar-gutter: stable;
|
||||
}
|
||||
|
||||
Tree > .tree--label {
|
||||
color: $text;
|
||||
}
|
||||
|
||||
Tree > .tree--label:hover {
|
||||
background: $primary 30%;
|
||||
}
|
||||
|
||||
/* General widget styling */
|
||||
TabbedContent {
|
||||
height: 1fr;
|
||||
}
|
||||
|
||||
TabPane {
|
||||
height: 1fr;
|
||||
padding: 1;
|
||||
}
|
||||
|
||||
/* Color scheme */
|
||||
$primary: blue;
|
||||
$accent: cyan;
|
||||
$success: green;
|
||||
$warning: yellow;
|
||||
$error: red;
|
||||
$surface: grey 20%;
|
||||
$background: black;
|
||||
$text: white;
|
||||
Reference in New Issue
Block a user