@@ -107,6 +107,41 @@ const NET_TX_COLOR: Color = Color {
107107 a : 1.0 ,
108108} ; // Red (upload)
109109
110+ // =============================================================================
111+ // PATTERN 5 HYBRID: Focus/Navigation Colors (WCAG AAA Compliant)
112+ // =============================================================================
113+ /// Bright cyan for focus indicators (cursor, selected row, focused border)
114+ const FOCUS_ACCENT_COLOR : Color = Color {
115+ r : 0.0 ,
116+ g : 1.0 ,
117+ b : 1.0 ,
118+ a : 1.0 ,
119+ } ; // #00FFFF - High visibility cyan
120+
121+ /// Row selection background (blue tint, visible but not overwhelming)
122+ const ROW_SELECT_BG : Color = Color {
123+ r : 0.15 ,
124+ g : 0.25 ,
125+ b : 0.4 ,
126+ a : 1.0 ,
127+ } ; // Dark blue background
128+
129+ /// Column header selection background
130+ const COL_SELECT_BG : Color = Color {
131+ r : 0.2 ,
132+ g : 0.35 ,
133+ b : 0.55 ,
134+ a : 1.0 ,
135+ } ; // Brighter blue for headers
136+
137+ /// Status bar background
138+ const STATUS_BAR_BG : Color = Color {
139+ r : 0.1 ,
140+ g : 0.1 ,
141+ b : 0.15 ,
142+ a : 1.0 ,
143+ } ; // Dark gray
144+
110145/// btop-style color gradient for percentage values (0-100)
111146/// Uses smooth transition: cyan -> green -> yellow -> orange -> red
112147fn percent_color ( percent : f64 ) -> Color {
@@ -211,33 +246,34 @@ fn format_uptime(secs: u64) -> String {
211246 }
212247}
213248
214- /// Create a border with STRONG focus indication (SPEC-024 v5.0 Feature D)
215- /// Focus indicators:
216- /// 1. Double-line border (vs rounded for unfocused)
217- /// 2. Significantly brighter color (1.5x, not 1.2x)
249+ /// Create a border with PATTERN 5 HYBRID focus indication
250+ /// Focus indicators (WCAG AAA compliant) :
251+ /// 1. Double-line border (vs rounded for unfocused) - works in monochrome
252+ /// 2. Bright cyan accent color for focused - high visibility
218253/// 3. Focus indicator arrow `►` prepended to title
219- /// 4. Bold title text for focused panels
254+ /// 4. Unfocused panels are dimmed for contrast
220255fn create_panel_border ( title : & str , color : Color , is_focused : bool ) -> Border {
221256 let style = if is_focused {
222- BorderStyle :: Double // Double border for focused panel
257+ BorderStyle :: Double // Double border for focused panel (Pattern 1)
223258 } else {
224259 BorderStyle :: Rounded // Normal rounded border
225260 } ;
226261
227- // Make focused panels MUCH brighter (1.5x instead of 1.2x)
262+ // PATTERN 5: Use accent color for focused, dim for unfocused
228263 let border_color = if is_focused {
264+ // Blend panel color with cyan accent for focused state
229265 Color {
230- r : ( color. r * 1 .5) . min ( 1.0 ) ,
231- g : ( color. g * 1 .5) . min ( 1.0 ) ,
232- b : ( color. b * 1 .5) . min ( 1.0 ) ,
266+ r : ( color. r * 0.5 + FOCUS_ACCENT_COLOR . r * 0 .5) . min ( 1.0 ) ,
267+ g : ( color. g * 0.5 + FOCUS_ACCENT_COLOR . g * 0 .5) . min ( 1.0 ) ,
268+ b : ( color. b * 0.5 + FOCUS_ACCENT_COLOR . b * 0 .5) . min ( 1.0 ) ,
233269 a : color. a ,
234270 }
235271 } else {
236- // Dim unfocused panels slightly for contrast
272+ // Dim unfocused panels significantly for contrast
237273 Color {
238- r : color. r * 0.7 ,
239- g : color. g * 0.7 ,
240- b : color. b * 0.7 ,
274+ r : color. r * 0.5 ,
275+ g : color. g * 0.5 ,
276+ b : color. b * 0.5 ,
241277 a : color. a ,
242278 }
243279 } ;
@@ -534,33 +570,36 @@ fn draw_status_bar(app: &App, canvas: &mut DirectTerminalCanvas<'_>, w: f32, h:
534570 let y = h - 1.0 ;
535571 let bar_width = w as usize ;
536572
537- // Key hint colors
538- let key_style = TextStyle {
539- color : Color :: new ( 0.3 , 0.3 , 0.3 , 1.0 ) , // Dim for background
573+ // PATTERN 5 HYBRID: Status bar colors
574+ let bg_style = TextStyle {
575+ color : Color :: new ( 0.25 , 0.25 , 0.25 , 1.0 ) , // Dim line background
540576 ..Default :: default ( )
541577 } ;
542578 let bracket_style = TextStyle {
543- color : Color :: new ( 0.6 , 0.6 , 0.6 , 1.0 ) , // Brackets
579+ color : Color :: new ( 0.5 , 0.5 , 0.5 , 1.0 ) , // Brackets
580+ ..Default :: default ( )
581+ } ;
582+ let key_style = TextStyle {
583+ color : FOCUS_ACCENT_COLOR , // Bright cyan for keys
544584 ..Default :: default ( )
545585 } ;
546586 let action_style = TextStyle {
547- color : Color :: new ( 0.8 , 0.8 , 0.8 , 1.0 ) , // Action text
587+ color : Color :: new ( 0.7 , 0.7 , 0.7 , 1.0 ) , // Action text
548588 ..Default :: default ( )
549589 } ;
550- let focus_style = TextStyle {
551- color : Color :: new ( 0.4 , 0.8 , 1.0 , 1.0 ) , // Cyan for focused panel
590+ let focus_indicator_style = TextStyle {
591+ color : FOCUS_ACCENT_COLOR , // Bright cyan for focus indicator
552592 ..Default :: default ( )
553593 } ;
554594
555595 // Draw background bar
556- let bg = "─" . repeat ( bar_width) ;
557- canvas. draw_text ( & bg, Point :: new ( 0.0 , y) , & key_style) ;
596+ canvas. fill_rect ( Rect :: new ( 0.0 , y, w, 1.0 ) , STATUS_BAR_BG ) ;
558597
559- // Navigation hints on left
598+ // Navigation hints - different for exploded vs normal view
560599 let hints = if app. exploded_panel . is_some ( ) {
561- " [Esc] Collapse [?] Help [q] Quit "
600+ " [Esc]Exit [↑↓]Row [←→]Col [?] Help [q]Quit "
562601 } else {
563- " [Tab] Navigate [Enter] Explode [/] Filter [?] Help [q] Quit "
602+ " [Tab]Panel [Enter]Explode [↑↓]Row [/] Filter [?]Help [q]Quit "
564603 } ;
565604
566605 // Draw hints with bracket highlighting
@@ -574,15 +613,15 @@ fn draw_status_bar(app: &App, canvas: &mut DirectTerminalCanvas<'_>, w: f32, h:
574613 in_bracket = false ;
575614 & bracket_style
576615 } else if in_bracket {
577- & focus_style // Key inside brackets
616+ & key_style // Key inside brackets - bright cyan
578617 } else {
579618 & action_style
580619 } ;
581620 canvas. draw_text ( & ch. to_string ( ) , Point :: new ( x, y) , style) ;
582621 x += 1.0 ;
583622 }
584623
585- // Focused panel indicator on right
624+ // PATTERN 5: Prominent focused panel indicator on right with ► cursor
586625 if let Some ( panel) = app. focused_panel {
587626 let panel_name = match panel {
588627 super :: config:: PanelType :: Cpu => "CPU" ,
@@ -598,14 +637,11 @@ fn draw_status_bar(app: &App, canvas: &mut DirectTerminalCanvas<'_>, w: f32, h:
598637 super :: config:: PanelType :: Psi => "PSI" ,
599638 super :: config:: PanelType :: Containers => "Containers" ,
600639 } ;
601- // Draw full right-aligned string "│ CPU " all at once
602- // Use chars().count() since "│" is multi-byte UTF-8
603- let focus_text = format ! ( "│ {panel_name} " ) ;
604- let focus_x = w - focus_text. chars ( ) . count ( ) as f32 ;
640+ // Prominent focus indicator: "► CPU"
641+ let focus_text = format ! ( "► {panel_name} " ) ;
642+ let focus_x = w - focus_text. chars ( ) . count ( ) as f32 - 1.0 ;
605643 if focus_x > x {
606- canvas. draw_text ( & focus_text, Point :: new ( focus_x, y) , & focus_style) ;
607- // Draw the separator with different color
608- canvas. draw_text ( "│" , Point :: new ( focus_x, y) , & bracket_style) ;
644+ canvas. draw_text ( & focus_text, Point :: new ( focus_x, y) , & focus_indicator_style) ;
609645 }
610646 }
611647}
@@ -4448,11 +4484,11 @@ fn draw_process_dataframe(app: &App, canvas: &mut DirectTerminalCanvas, area: Re
44484484 let col_widths = [ 7usize , 10 , 8 , 8 ] ;
44494485 let cmd_width = ( area. width as usize ) . saturating_sub ( col_widths. iter ( ) . sum :: < usize > ( ) + 5 ) ;
44504486
4451- // Colors - STRONGER highlighting for better visibility
4452- let header_bg = Color :: new ( 0.15 , 0.2 , 0.3 , 1.0 ) ;
4453- let selected_col_bg = Color :: new ( 0.3 , 0.45 , 0.65 , 1.0 ) ; // Much brighter column highlight
4454- let selected_row_bg = Color :: new ( 0.25 , 0.35 , 0.5 , 1.0 ) ; // Brighter row highlight (blue tint)
4455- let sort_color = Color :: new ( 0.5 , 0.85 , 1.0 , 1.0 ) ; // Bright cyan for sorted column
4487+ // PATTERN 5 HYBRID: Consistent focus/selection colors
4488+ let header_bg = Color :: new ( 0.12 , 0.15 , 0.22 , 1.0 ) ;
4489+ let selected_col_bg = COL_SELECT_BG ; // From constants
4490+ let selected_row_bg = ROW_SELECT_BG ; // From constants
4491+ let sort_color = FOCUS_ACCENT_COLOR ; // Bright cyan for sorted column
44564492 let dim_color = Color :: new ( 0.5 , 0.5 , 0.5 , 1.0 ) ;
44574493 let text_color = Color :: new ( 0.9 , 0.9 , 0.9 , 1.0 ) ;
44584494
@@ -4623,15 +4659,15 @@ fn draw_process_dataframe(app: &App, canvas: &mut DirectTerminalCanvas, area: Re
46234659 let abs_idx = scroll_offset + rel_idx;
46244660 let is_selected = abs_idx == app. process_selected ;
46254661
4626- // Row selection highlight with cursor indicator
4662+ // PATTERN 5 HYBRID: Row selection highlight with gutter cursor
46274663 if is_selected {
46284664 canvas. fill_rect ( Rect :: new ( x, y, area. width , 1.0 ) , selected_row_bg) ;
4629- // Draw cursor indicator at start of row
4665+ // Draw cursor indicator at start of row (▶ in gutter)
46304666 canvas. draw_text (
46314667 "▶" ,
46324668 Point :: new ( x - 1.5 , y) ,
46334669 & TextStyle {
4634- color : Color :: new ( 0.5 , 0.85 , 1.0 , 1.0 ) , // Bright cyan cursor
4670+ color : FOCUS_ACCENT_COLOR , // Bright cyan cursor
46354671 ..Default :: default ( )
46364672 } ,
46374673 ) ;
0 commit comments