hatui-kit 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. hatui/__init__.py +11 -0
  2. hatui/__main__.py +5 -0
  3. hatui/app.py +200 -0
  4. hatui/core/__init__.py +1 -0
  5. hatui/core/actions.py +46 -0
  6. hatui/core/context.py +33 -0
  7. hatui/core/input_manager.py +167 -0
  8. hatui/core/screen_buffer.py +150 -0
  9. hatui/core/style.py +381 -0
  10. hatui/core/terminal_env.py +67 -0
  11. hatui/core/util.py +0 -0
  12. hatui/core/widget.py +203 -0
  13. hatui/demo/__init__.py +1 -0
  14. hatui/demo/screens/dashboard/modals/debug.yaml +72 -0
  15. hatui/demo/screens/dashboard/modals/help.yaml +43 -0
  16. hatui/demo/screens/dashboard/providers/phase8.yaml +429 -0
  17. hatui/demo/screens/dashboard/providers.yaml +487 -0
  18. hatui/demo/screens/dashboard/screen.yaml +64 -0
  19. hatui/demo/screens/dashboard/tabs/analysis.yaml +65 -0
  20. hatui/demo/screens/dashboard/tabs/forensics.yaml +71 -0
  21. hatui/demo/screens/dashboard/tabs/hacker.yaml +80 -0
  22. hatui/demo/screens/dashboard/tabs/logs.yaml +39 -0
  23. hatui/demo/screens/dashboard/tabs/overview.yaml +180 -0
  24. hatui/demo/screens/dashboard/tabs/visuals.yaml +84 -0
  25. hatui/demo/screens/dashboard.yaml +166 -0
  26. hatui/demo_assets.py +16 -0
  27. hatui/providers/__init__.py +54 -0
  28. hatui/providers/base.py +61 -0
  29. hatui/providers/builtins.py +546 -0
  30. hatui/providers/helpers.py +169 -0
  31. hatui/runtime/__init__.py +24 -0
  32. hatui/runtime/action_registry.py +102 -0
  33. hatui/runtime/bindings.py +40 -0
  34. hatui/runtime/bootstrap.py +94 -0
  35. hatui/runtime/cli.py +66 -0
  36. hatui/runtime/defaults.py +219 -0
  37. hatui/runtime/engine.py +135 -0
  38. hatui/runtime/formatters.py +65 -0
  39. hatui/runtime/loader.py +140 -0
  40. hatui/runtime/provider_manager.py +138 -0
  41. hatui/runtime/registries.py +65 -0
  42. hatui/runtime/render_policy.py +144 -0
  43. hatui/runtime/router.py +74 -0
  44. hatui/runtime/store.py +29 -0
  45. hatui/runtime/validation.py +433 -0
  46. hatui/runtime/watcher.py +167 -0
  47. hatui/widgets/__init__.py +89 -0
  48. hatui/widgets/alert_stack_widget.py +64 -0
  49. hatui/widgets/alert_widget.py +83 -0
  50. hatui/widgets/banner_widget.py +76 -0
  51. hatui/widgets/border_widget.py +93 -0
  52. hatui/widgets/box_widget.py +81 -0
  53. hatui/widgets/center_widget.py +29 -0
  54. hatui/widgets/chart_widget.py +222 -0
  55. hatui/widgets/code_block_widget.py +91 -0
  56. hatui/widgets/column_widget.py +48 -0
  57. hatui/widgets/diff_viewer_widget.py +88 -0
  58. hatui/widgets/divider_widget.py +66 -0
  59. hatui/widgets/event_feed_widget.py +72 -0
  60. hatui/widgets/flow_widget.py +77 -0
  61. hatui/widgets/gauge_widget.py +109 -0
  62. hatui/widgets/heatmap_widget.py +153 -0
  63. hatui/widgets/hex_dump_widget.py +91 -0
  64. hatui/widgets/histogram_widget.py +96 -0
  65. hatui/widgets/inspector_widget.py +85 -0
  66. hatui/widgets/kv_inspector_widget.py +134 -0
  67. hatui/widgets/label_widget.py +99 -0
  68. hatui/widgets/list_widget.py +185 -0
  69. hatui/widgets/log_widget.py +106 -0
  70. hatui/widgets/menu_widget.py +31 -0
  71. hatui/widgets/metric_grid_widget.py +103 -0
  72. hatui/widgets/mini_chart_widget.py +79 -0
  73. hatui/widgets/modal_host_widget.py +85 -0
  74. hatui/widgets/modal_widget.py +112 -0
  75. hatui/widgets/paragraph_widget.py +94 -0
  76. hatui/widgets/progress_bar_widget.py +124 -0
  77. hatui/widgets/root_services.py +267 -0
  78. hatui/widgets/root_widget.py +130 -0
  79. hatui/widgets/row_widget.py +48 -0
  80. hatui/widgets/scroll_widget.py +224 -0
  81. hatui/widgets/selection.py +52 -0
  82. hatui/widgets/signal_strip_widget.py +79 -0
  83. hatui/widgets/sparkline_widget.py +84 -0
  84. hatui/widgets/stat_widget.py +107 -0
  85. hatui/widgets/status_matrix_widget.py +234 -0
  86. hatui/widgets/status_strip_widget.py +85 -0
  87. hatui/widgets/table_widget.py +239 -0
  88. hatui/widgets/tabs_widget.py +188 -0
  89. hatui/widgets/text_widget.py +64 -0
  90. hatui/widgets/timeline_widget.py +81 -0
  91. hatui/widgets/tree_widget.py +341 -0
  92. hatui/widgets/visualization.py +110 -0
  93. hatui_kit-0.1.0.dist-info/METADATA +154 -0
  94. hatui_kit-0.1.0.dist-info/RECORD +97 -0
  95. hatui_kit-0.1.0.dist-info/WHEEL +4 -0
  96. hatui_kit-0.1.0.dist-info/entry_points.txt +2 -0
  97. hatui_kit-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,487 @@
1
+ - type: clock
2
+ name: clock
3
+ target: runtime.clock
4
+ interval: 1.0
5
+ group: runtime
6
+
7
+ - type: frame
8
+ name: frame
9
+ target: runtime.frame
10
+ group: runtime
11
+
12
+ - type: host_info
13
+ name: host_info
14
+ target: host
15
+ interval: 2.0
16
+ group: runtime
17
+
18
+ - type: system_stats
19
+ name: system_stats
20
+ target: system
21
+ interval: 2.0
22
+ group: runtime
23
+
24
+ - type: constant
25
+ name: header_text
26
+ target: ui.header_text
27
+ value: LIVE OPERATIONS DASHBOARD
28
+
29
+ - type: constant
30
+ name: header_subtitle
31
+ target: ui.header_subtitle
32
+ value: adaptive telemetry // yaml runtime demo
33
+
34
+ - type: constant
35
+ name: overview_text
36
+ target: ui.overview_text
37
+ value: |-
38
+ Monitoring compute load, uplink stability, and packet bursts. This screen is loaded from YAML and fed by generic providers through dotted-path bindings.
39
+
40
+ The overview panel is now wrapped in a generic scroll viewport, so long-form operator notes can exceed the visible panel height without leaking into adjacent widgets.
41
+
42
+ Use focus traversal to land on the scroll region, then use arrow keys or j/k to move through the content.
43
+
44
+ - type: constant
45
+ name: logs_note
46
+ target: ui.logs_note
47
+ value: |-
48
+ The log view is isolated in its own tab so providers can keep pushing events without forcing every screen to show them.
49
+
50
+ The note panel is also scrollable now, which gives us a bounded place for long-form operator guidance, incident notes, or task checklists.
51
+
52
+ Focus the viewport and use arrow keys or j/k to move through the text.
53
+
54
+ - type: constant
55
+ name: help_text
56
+ target: ui.help_text
57
+ value: |-
58
+ Hatui now has a generic modal host layered above the routed screens.
59
+
60
+ This overlay is route-driven:
61
+ - open it through a normal action
62
+ - keep the underlying screen visible
63
+ - trap focus to modal content while active
64
+ - close it with route pop rather than widget-local teardown
65
+
66
+ This is the base for future inspectors, command palettes, confirmations, and transient workflows.
67
+
68
+ - type: constant
69
+ name: debug_help_text
70
+ target: ui.debug_help_text
71
+ value: Press d to open the runtime debug overlay with widget tree and provider state snapshots.
72
+
73
+ - type: constant
74
+ name: hex_dump
75
+ target: panels.hex_dump
76
+ value: [77, 83, 89, 83, 45, 52, 10, 123, 114, 101, 108, 97, 121, 58, 51, 125, 59, 10, 255, 0, 126, 65, 66]
77
+
78
+ - type: waveform
79
+ name: scan_progress
80
+ target: signals.scan_progress
81
+ waveform: sine
82
+ frequency: 0.9
83
+ amplitude: 0.45
84
+ offset: 0.5
85
+
86
+ - type: waveform
87
+ name: uplink_progress
88
+ target: signals.uplink_progress
89
+ waveform: sine
90
+ frequency: 0.55
91
+ phase: 1.8
92
+ amplitude: 0.35
93
+ offset: 0.55
94
+
95
+ - type: waveform
96
+ name: packet_sample
97
+ target: signals.packet_sample
98
+ waveform: sine
99
+ frequency: 2.6
100
+ amplitude: 0.24
101
+ offset: 0.62
102
+
103
+ - type: waveform
104
+ name: mini_chart_sample
105
+ target: signals.mini_chart_sample
106
+ waveform: sine
107
+ frequency: 1.2
108
+ phase: 0.5
109
+ amplitude: 0.4
110
+ offset: 0.6
111
+
112
+ - type: waveform
113
+ name: thread_count
114
+ target: stats_sources.thread_count
115
+ waveform: sine
116
+ frequency: 0.55
117
+ phase: 0.6
118
+ amplitude: 5.0
119
+ offset: 10.0
120
+
121
+ - type: waveform
122
+ name: memory_gb
123
+ target: stats_sources.memory_gb
124
+ waveform: sine
125
+ frequency: 0.42
126
+ phase: 1.2
127
+ amplitude: 4.5
128
+ offset: 6.0
129
+
130
+ - type: waveform
131
+ name: cache_gb
132
+ target: stats_sources.cache_gb
133
+ waveform: sine
134
+ frequency: 0.78
135
+ phase: 0.15
136
+ amplitude: 1.2
137
+ offset: 1.0
138
+
139
+ - type: waveform
140
+ name: network_rx
141
+ target: stats_sources.network_rx
142
+ waveform: sine
143
+ frequency: 0.73
144
+ phase: 0.2
145
+ amplitude: 320
146
+ offset: 520
147
+
148
+ - type: waveform
149
+ name: network_tx
150
+ target: stats_sources.network_tx
151
+ waveform: sine
152
+ frequency: 0.57
153
+ phase: 1.7
154
+ amplitude: 180
155
+ offset: 240
156
+
157
+ - type: rolling_window
158
+ name: packet_series
159
+ target: telemetry.packet_series
160
+ source: signals.packet_sample
161
+ size: 48
162
+ group: telemetry
163
+ depends_on: [packet_sample]
164
+ metadata_target: telemetry.provider_meta.packet_series
165
+
166
+ - type: rolling_window
167
+ name: mini_chart
168
+ target: telemetry.mini_chart
169
+ source: signals.mini_chart_sample
170
+ size: 24
171
+ group: telemetry
172
+ depends_on: [mini_chart_sample]
173
+
174
+ - type: threshold
175
+ name: alert_level
176
+ target: alerts.level
177
+ source: signals.packet_sample
178
+ operator: gt
179
+ value: 0.75
180
+ true: warn
181
+ false: info
182
+ group: derived
183
+ depends_on: [packet_sample]
184
+
185
+ - type: threshold
186
+ name: alert_message
187
+ target: alerts.message
188
+ source: signals.packet_sample
189
+ operator: gt
190
+ value: 0.75
191
+ true: packet burst nearing threshold
192
+ false: all monitored channels nominal
193
+ group: derived
194
+ depends_on: [packet_sample]
195
+
196
+ - type: transform
197
+ name: cpu_stat
198
+ target: stats.cpu
199
+ group: derived
200
+ depends_on: [scan_progress, thread_count]
201
+ mapping:
202
+ value:
203
+ path: signals.scan_progress
204
+ formatter:
205
+ name: percent
206
+ precision: 1
207
+ secondary:
208
+ path: stats_sources.thread_count
209
+ formatter:
210
+ name: fixed
211
+ precision: 0
212
+ template: "threads {value}"
213
+
214
+ - type: transform
215
+ name: memory_stat
216
+ target: stats.memory
217
+ group: derived
218
+ depends_on: [memory_gb, cache_gb]
219
+ mapping:
220
+ value:
221
+ path: stats_sources.memory_gb
222
+ formatter:
223
+ name: fixed
224
+ precision: 1
225
+ template: "{value} GB"
226
+ secondary:
227
+ path: stats_sources.cache_gb
228
+ formatter:
229
+ name: fixed
230
+ precision: 1
231
+ template: "cache {value} GB"
232
+
233
+ - type: transform
234
+ name: network_stat
235
+ target: stats.network
236
+ group: derived
237
+ depends_on: [network_rx, network_tx]
238
+ mapping:
239
+ value:
240
+ path: stats_sources.network_rx
241
+ formatter:
242
+ name: fixed
243
+ precision: 0
244
+ template: "{value} kb/s"
245
+ secondary:
246
+ path: stats_sources.network_tx
247
+ formatter:
248
+ name: fixed
249
+ precision: 0
250
+ template: "tx {value} kb/s"
251
+
252
+ - type: transform
253
+ name: telemetry_summary
254
+ target: telemetry.summary
255
+ group: telemetry
256
+ depends_on: [frame, packet_sample]
257
+ template: "frame {frame} delta {delta}ms burst {burst}"
258
+ mapping:
259
+ frame:
260
+ path: runtime.frame.frame
261
+ formatter:
262
+ name: fixed
263
+ precision: 0
264
+ delta:
265
+ path: runtime.frame.delta_time
266
+ formatter:
267
+ name: fixed
268
+ precision: 3
269
+ burst:
270
+ path: signals.packet_sample
271
+ formatter:
272
+ name: fixed
273
+ precision: 2
274
+
275
+ - type: transform
276
+ name: metric_grid
277
+ target: panels.metric_grid
278
+ group: ui
279
+ depends_on: [host_info, system_stats, uplink_progress, packet_sample]
280
+ items:
281
+ - label: host
282
+ value:
283
+ path: host.hostname
284
+ - label: cpu
285
+ value:
286
+ path: system.cpu_count
287
+ - label: load
288
+ value:
289
+ path: system.loadavg.1m
290
+ formatter:
291
+ name: fixed
292
+ precision: 2
293
+ - label: auth
294
+ value:
295
+ path: signals.uplink_progress
296
+ formatter:
297
+ name: percent
298
+ precision: 0
299
+ - label: burst
300
+ value:
301
+ path: signals.packet_sample
302
+ formatter:
303
+ name: fixed
304
+ precision: 2
305
+ - label: disk
306
+ value:
307
+ path: system.disk.used
308
+ formatter:
309
+ name: bytes
310
+
311
+ - type: transform
312
+ name: relay_rows
313
+ target: panels.relay_rows
314
+ group: ui
315
+ depends_on: [network_rx, network_tx, memory_gb, cache_gb, scan_progress]
316
+ items:
317
+ - relay: r-01
318
+ latency:
319
+ path: stats_sources.network_rx
320
+ formatter:
321
+ name: fixed
322
+ precision: 0
323
+ template: "{value}ms"
324
+ loss: 0.1%
325
+ state: stable
326
+ - relay: r-02
327
+ latency:
328
+ path: stats_sources.network_tx
329
+ formatter:
330
+ name: fixed
331
+ precision: 0
332
+ template: "{value}ms"
333
+ loss: 0.4%
334
+ state: syncing
335
+ - relay: r-03
336
+ latency:
337
+ path: stats_sources.memory_gb
338
+ formatter:
339
+ name: fixed
340
+ precision: 0
341
+ template: "{value}ms"
342
+ loss: 2.1%
343
+ state: retry
344
+ - relay: r-04
345
+ latency:
346
+ path: stats_sources.cache_gb
347
+ formatter:
348
+ name: fixed
349
+ precision: 0
350
+ template: "{value}ms"
351
+ loss: 0.0%
352
+ state: stable
353
+ - relay: r-05
354
+ latency:
355
+ path: signals.scan_progress
356
+ formatter:
357
+ name: percent
358
+ precision: 0
359
+ loss: 0.3%
360
+ state: warming
361
+ - relay: r-06
362
+ latency: 412ms
363
+ loss: 0.7%
364
+ state: retry
365
+ - relay: r-07
366
+ latency: 388ms
367
+ loss: 0.0%
368
+ state: stable
369
+ - relay: r-08
370
+ latency: 501ms
371
+ loss: 1.2%
372
+ state: degraded
373
+ - relay: r-09
374
+ latency: 274ms
375
+ loss: 0.2%
376
+ state: stable
377
+ - relay: r-10
378
+ latency: 629ms
379
+ loss: 2.8%
380
+ state: probing
381
+ - relay: r-11
382
+ latency: 341ms
383
+ loss: 0.1%
384
+ state: stable
385
+ - relay: r-12
386
+ latency: 455ms
387
+ loss: 0.6%
388
+ state: syncing
389
+
390
+ - type: transform
391
+ name: code_block
392
+ target: panels.code_block
393
+ group: ui
394
+ depends_on: [thread_count, network_tx, packet_sample]
395
+ template: |-
396
+ scan(node_cluster);
397
+ refresh(relay_{relay});
398
+ latency_window = {latency};
399
+ packet_burst = {burst};
400
+ if packet_burst > 0.82:
401
+ flag('jitter-threshold');
402
+ commit(snapshot);
403
+ mapping:
404
+ relay:
405
+ path: stats_sources.thread_count
406
+ formatter:
407
+ name: fixed
408
+ precision: 0
409
+ latency:
410
+ path: stats_sources.network_tx
411
+ formatter:
412
+ name: fixed
413
+ precision: 0
414
+ burst:
415
+ path: signals.packet_sample
416
+ formatter:
417
+ name: fixed
418
+ precision: 3
419
+
420
+ - type: demo_logs
421
+ name: logs
422
+ target: logs.main
423
+ interval: 1.0
424
+ max_lines: 80
425
+
426
+ - type: transform
427
+ name: status_strip
428
+ target: ui.status_strip
429
+ group: ui
430
+ depends_on: [frame, packet_sample]
431
+ items:
432
+ - text: overview
433
+ - text:
434
+ path: _ui.focused_widget
435
+ template: "focus {value}"
436
+ fg_color: "@warn"
437
+ - text:
438
+ path: _router.current
439
+ template: "route {value}"
440
+ fg_color: "@accent_alt"
441
+ - text:
442
+ path: state.flags.compact_mode
443
+ template: "compact {value}"
444
+ fg_color: "@text_muted"
445
+ - text:
446
+ path: state.selection.relay_index
447
+ template: "relay #{value}"
448
+ fg_color: "@accent"
449
+ - text:
450
+ path: runtime.frame.frame
451
+ formatter:
452
+ name: fixed
453
+ precision: 0
454
+ template: "frame {value}"
455
+ fg_color: "@accent"
456
+ - text:
457
+ path: runtime.frame.delta_time
458
+ formatter:
459
+ name: fixed
460
+ precision: 3
461
+ template: "dt {value}ms"
462
+ fg_color: "@success"
463
+ - text:
464
+ path: signals.packet_sample
465
+ formatter:
466
+ name: fixed
467
+ precision: 2
468
+ template: "burst {value}"
469
+ fg_color: "@accent_alt"
470
+ - text:
471
+ path: telemetry.provider_meta.packet_series.status
472
+ template: "series {value}"
473
+ fg_color: "@warn"
474
+ - text:
475
+ path: _ui.last_focused_by_route.overview
476
+ template: "ovr {value}"
477
+ fg_color: "@text_muted"
478
+ - text:
479
+ path: state.selection.matrix_item.label
480
+ template: "node {value}"
481
+ fg_color: "@accent_alt"
482
+ - text: "tab focus"
483
+ fg_color: "@text_muted"
484
+ - text: "1-6 tabs / d debug / h help / enter menu / j-k lists / arrows scroll"
485
+ fg_color: "@text_muted"
486
+
487
+ - include: providers/phase8.yaml
@@ -0,0 +1,64 @@
1
+ type: modal_host
2
+ name: app_shell
3
+ keybindings:
4
+ - key: h
5
+ action: route_push
6
+ payload:
7
+ route: help_modal
8
+ - key: d
9
+ action: route_push
10
+ payload:
11
+ route: debug_modal
12
+ child:
13
+ type: tabs
14
+ name: root_tabs
15
+ show_tabs: true
16
+ focus_fg_color: "@focus_fg"
17
+ focus_bg_color: "@focus_bg"
18
+ keybindings:
19
+ - key: "1"
20
+ action: route_set
21
+ payload:
22
+ route: overview
23
+ - key: "2"
24
+ action: route_set
25
+ payload:
26
+ route: forensics
27
+ - key: "3"
28
+ action: route_set
29
+ payload:
30
+ route: visuals
31
+ - key: "4"
32
+ action: route_set
33
+ payload:
34
+ route: analysis
35
+ - key: "5"
36
+ action: route_set
37
+ payload:
38
+ route: hacker
39
+ - key: "6"
40
+ action: route_set
41
+ payload:
42
+ route: logs
43
+ - key: m
44
+ action: store_toggle
45
+ payload:
46
+ path: flags.compact_mode
47
+ - key: h
48
+ action: route_push
49
+ payload:
50
+ route: help_modal
51
+ - key: d
52
+ action: route_push
53
+ payload:
54
+ route: debug_modal
55
+ tabs:
56
+ - include: tabs/overview.yaml
57
+ - include: tabs/forensics.yaml
58
+ - include: tabs/visuals.yaml
59
+ - include: tabs/analysis.yaml
60
+ - include: tabs/hacker.yaml
61
+ - include: tabs/logs.yaml
62
+ modals:
63
+ - include: modals/debug.yaml
64
+ - include: modals/help.yaml
@@ -0,0 +1,65 @@
1
+ title: Analysis
2
+ route: analysis
3
+ child:
4
+ type: column
5
+ name: analysis_screen
6
+ children:
7
+ - type: row
8
+ name: analysis_top_row
9
+ weight: 4
10
+ children:
11
+ - type: box
12
+ name: timeline_box
13
+ title: timeline
14
+ padding: 1
15
+ weight: 2
16
+ child:
17
+ type: timeline
18
+ name: ops_timeline
19
+ events_key: viz.timeline
20
+ - type: box
21
+ name: feed_box
22
+ title: event feed
23
+ padding: 1
24
+ weight: 3
25
+ child:
26
+ type: event_feed
27
+ name: ops_feed
28
+ events_key: logs.main
29
+ - type: row
30
+ name: analysis_bottom_row
31
+ weight: 6
32
+ children:
33
+ - type: box
34
+ name: inspector_box
35
+ title: inspector
36
+ padding: 1
37
+ weight: 2
38
+ child:
39
+ type: inspector
40
+ name: runtime_inspector
41
+ data_key: viz.inspector
42
+ - type: box
43
+ name: diff_box
44
+ title: diff viewer
45
+ padding: 1
46
+ weight: 2
47
+ child:
48
+ type: diff_viewer
49
+ name: config_diff
50
+ left_key: viz.diff_left
51
+ right_key: viz.diff_right
52
+ - type: box
53
+ name: flow_box
54
+ title: flow view
55
+ padding: 1
56
+ weight: 2
57
+ child:
58
+ type: flow
59
+ name: pipeline_flow
60
+ edges_key: viz.flow_edges
61
+ - type: status_strip
62
+ name: analysis_status_strip
63
+ segments_key: ui.status_strip
64
+ bg_color: "@surface_alt"
65
+ weight: 1
@@ -0,0 +1,71 @@
1
+ title: Forensics
2
+ route: forensics
3
+ child:
4
+ type: column
5
+ name: forensics_screen
6
+ children:
7
+ - type: box
8
+ name: forensics_box
9
+ title: forensics
10
+ padding: 1
11
+ weight: 10
12
+ child:
13
+ type: row
14
+ name: forensics_row
15
+ children:
16
+ - type: box
17
+ name: metrics_box
18
+ title: node metrics
19
+ padding: 1
20
+ weight: 3
21
+ child:
22
+ type: column
23
+ name: metrics_column
24
+ children:
25
+ - type: metric_grid
26
+ name: metric_grid
27
+ metrics_key: panels.metric_grid
28
+ columns: 2
29
+ accent_color: "@accent_alt"
30
+ weight: 2
31
+ - type: divider
32
+ name: metric_divider
33
+ fg_color: "@text_muted"
34
+ weight: 1
35
+ - type: code_block
36
+ name: code_block
37
+ code_key: panels.code_block
38
+ show_line_numbers: true
39
+ line_number_color: "@text_muted"
40
+ weight: 3
41
+ - type: hex_dump
42
+ name: hex_dump
43
+ data_key: panels.hex_dump
44
+ bytes_per_row: 8
45
+ offset_color: "@text_muted"
46
+ weight: 2
47
+ - type: box
48
+ name: table_box
49
+ title: relay table
50
+ padding: 1
51
+ weight: 2
52
+ child:
53
+ type: table
54
+ name: relay_table
55
+ rows_key: panels.relay_rows
56
+ selectable: true
57
+ selected_index_key: selection.relay_index
58
+ selected_row_key: selection.relay_row
59
+ selected_fg_color: "@selection_fg"
60
+ selected_bg_color: "@success"
61
+ header_color: "@text"
62
+ columns:
63
+ - {title: relay, key: relay, width: 8}
64
+ - {title: lat, key: latency, width: 7, align: right}
65
+ - {title: loss, key: loss, width: 6, align: right}
66
+ - {title: state, key: state}
67
+ - type: status_strip
68
+ name: forensics_status_strip
69
+ segments_key: ui.status_strip
70
+ bg_color: "@surface_alt"
71
+ weight: 1