@@ -3,7 +3,8 @@ use crate::components::{
33 ChartComponent , ChartConfig , ChartType
44} ;
55use crate :: draw_utils:: {
6- get_fg_color, get_bg_color, fill_muxbox, draw_horizontal_line, draw_vertical_line,
6+ get_fg_color_transparent, get_bg_color_transparent,
7+ should_draw_color, fill_muxbox, draw_horizontal_line, draw_vertical_line,
78 print_with_color_and_background_at, content_size, draw_horizontal_line_with_tabs
89} ;
910use crate :: model:: common:: { Cell , ContentStreamTrait , ChoicesStreamTrait , StreamType } ;
@@ -89,38 +90,38 @@ impl<'a> BoxRenderer<'a> {
8990
9091 // Calculate all colors and properties (same logic as draw_muxbox)
9192 let muxbox_parent = app_graph. get_parent ( & layout. id , & self . muxbox . id ) ;
92- let bg_color = self . muxbox . calc_bg_color ( app_context, app_graph) . to_string ( ) ;
93+ let bg_color = self . muxbox . calc_bg_color ( app_context, app_graph) ;
9394 let parent_bg_color = if muxbox_parent. is_none ( ) {
94- layout. bg_color . clone ( ) . unwrap_or ( "black" . to_string ( ) )
95+ layout. bg_color . clone ( ) . map ( |s| s . to_string ( ) )
9596 } else {
96- muxbox_parent. unwrap ( ) . calc_bg_color ( app_context, app_graph) . to_string ( )
97+ muxbox_parent. unwrap ( ) . calc_bg_color ( app_context, app_graph) . map ( |s| s . to_string ( ) )
9798 } ;
98- let fg_color = self . muxbox . calc_fg_color ( app_context, app_graph) . to_string ( ) ;
99- let title_bg_color = self . muxbox . calc_title_bg_color ( app_context, app_graph) . to_string ( ) ;
100- let title_fg_color = self . muxbox . calc_title_fg_color ( app_context, app_graph) . to_string ( ) ;
99+ let fg_color = self . muxbox . calc_fg_color ( app_context, app_graph) ;
100+ let title_bg_color = self . muxbox . calc_title_bg_color ( app_context, app_graph) ;
101+ let title_fg_color = self . muxbox . calc_title_fg_color ( app_context, app_graph) ;
101102 let border = self . muxbox . calc_border ( app_context, app_graph) ;
102103
103104 // F0135: PTY Error States - Use different colors based on PTY status
104105 let border_color = if self . muxbox . execution_mode . is_pty ( ) {
105106 if let Some ( pty_manager) = & app_context. pty_manager {
106107 if pty_manager. is_pty_dead ( & self . muxbox . id ) {
107- "red" . to_string ( )
108+ Some ( "red" . to_string ( ) )
108109 } else if pty_manager. is_pty_in_error_state ( & self . muxbox . id ) {
109- "yellow" . to_string ( )
110+ Some ( "yellow" . to_string ( ) )
110111 } else {
111- "bright_cyan" . to_string ( )
112+ Some ( "bright_cyan" . to_string ( ) )
112113 }
113114 } else {
114- "bright_cyan" . to_string ( )
115+ Some ( "bright_cyan" . to_string ( ) )
115116 }
116117 } else {
117- self . muxbox . calc_border_color ( app_context, app_graph) . to_string ( )
118+ self . muxbox . calc_border_color ( app_context, app_graph) . map ( |s| s . to_string ( ) )
118119 } ;
119120
120121 let fill_char = self . muxbox . calc_fill_char ( app_context, app_graph) ;
121122
122123 // Draw fill (same logic as draw_muxbox)
123- fill_muxbox ( bounds, border, & bg_color, fill_char, buffer) ;
124+ fill_muxbox ( bounds, border, & bg_color, & None , fill_char, buffer) ;
124125
125126 // Calculate overflow behavior (same logic as draw_muxbox)
126127 let mut overflow_behavior = self . muxbox . calc_overflow_behavior ( app_context, app_graph) ;
@@ -169,20 +170,20 @@ impl<'a> BoxRenderer<'a> {
169170 fn render_box_contents (
170171 & self ,
171172 bounds : & Bounds ,
172- border_color : & str ,
173- bg_color : & str ,
174- parent_bg_color : & str ,
173+ border_color : & Option < String > ,
174+ bg_color : & Option < String > ,
175+ parent_bg_color : & Option < String > ,
175176 streams : & indexmap:: IndexMap < String , crate :: model:: common:: Stream > ,
176177 active_tab_index : usize ,
177178 tab_scroll_offset : usize ,
178- title_fg_color : & str ,
179- title_bg_color : & str ,
179+ title_fg_color : & Option < String > ,
180+ title_bg_color : & Option < String > ,
180181 title_position : & str ,
181- menu_fg_color : & str ,
182- menu_bg_color : & str ,
183- selected_menu_fg_color : & str ,
184- selected_menu_bg_color : & str ,
185- fg_color : & str ,
182+ menu_fg_color : & Option < String > ,
183+ menu_bg_color : & Option < String > ,
184+ selected_menu_fg_color : & Option < String > ,
185+ selected_menu_bg_color : & Option < String > ,
186+ fg_color : & Option < String > ,
186187 overflow_behavior : & str ,
187188 border : Option < & bool > ,
188189 horizontal_scroll : f64 ,
@@ -245,7 +246,7 @@ impl<'a> BoxRenderer<'a> {
245246 None
246247 } ;
247248
248- let draw_border = border . unwrap_or ( & true ) ;
249+ // Border visibility now determined by transparent color support
249250 let mut _overflowing = false ;
250251 let mut scrollbars_drawn = false ;
251252
@@ -265,19 +266,18 @@ impl<'a> BoxRenderer<'a> {
265266 title_fg_color,
266267 title_bg_color,
267268 title_position,
268- * draw_border,
269269 tab_labels,
270270 tab_close_buttons,
271271 active_tab_index,
272272 tab_scroll_offset,
273273 buffer,
274274 ) ;
275- } else if * draw_border {
275+ } else if crate :: draw_utils :: should_draw_color ( border_color ) || crate :: draw_utils :: should_draw_color ( bg_color ) {
276276 draw_horizontal_line (
277277 bounds. top ( ) ,
278278 bounds. left ( ) ,
279279 bounds. right ( ) ,
280- border_color,
280+ & border_color,
281281 bg_color,
282282 buffer,
283283 ) ;
@@ -307,7 +307,6 @@ impl<'a> BoxRenderer<'a> {
307307 selected_menu_fg_color,
308308 selected_menu_bg_color,
309309 border_color,
310- * draw_border,
311310 buffer,
312311 ) ;
313312
@@ -332,7 +331,6 @@ impl<'a> BoxRenderer<'a> {
332331 overflow_behavior,
333332 horizontal_scroll,
334333 vertical_scroll,
335- * draw_border,
336334 buffer,
337335 ) ;
338336 }
@@ -383,22 +381,21 @@ impl<'a> BoxRenderer<'a> {
383381 }
384382 }
385383
386- self . render_borders ( & bounds, border_color, bg_color, * draw_border , scrollbars_drawn, locked, content, buffer) ;
384+ self . render_borders ( & bounds, & border_color, & bg_color, scrollbars_drawn, locked, content, buffer) ;
387385 }
388386
389387 /// Render content with scrolling and overflow handling
390388 fn render_content (
391389 & self ,
392390 bounds : & Bounds ,
393391 content : & str ,
394- fg_color : & str ,
395- bg_color : & str ,
396- border_color : & str ,
397- parent_bg_color : & str ,
392+ fg_color : & Option < String > ,
393+ bg_color : & Option < String > ,
394+ border_color : & Option < String > ,
395+ parent_bg_color : & Option < String > ,
398396 overflow_behavior : & str ,
399397 horizontal_scroll : f64 ,
400398 vertical_scroll : f64 ,
401- draw_border : bool ,
402399 buffer : & mut ScreenBuffer ,
403400 ) -> bool {
404401 let ( content_width, content_height) = content_size ( content) ;
@@ -428,7 +425,6 @@ impl<'a> BoxRenderer<'a> {
428425 fg_color,
429426 bg_color,
430427 border_color,
431- draw_border,
432428 buffer,
433429 ) ;
434430 true
@@ -470,10 +466,9 @@ impl<'a> BoxRenderer<'a> {
470466 viewable_height : usize ,
471467 horizontal_scroll : f64 ,
472468 vertical_scroll : f64 ,
473- fg_color : & str ,
474- bg_color : & str ,
475- border_color : & str ,
476- draw_border : bool ,
469+ fg_color : & Option < String > ,
470+ bg_color : & Option < String > ,
471+ border_color : & Option < String > ,
477472 buffer : & mut ScreenBuffer ,
478473 ) {
479474 let viewable_height = bounds. height ( ) . saturating_sub ( 1 ) ;
@@ -513,7 +508,7 @@ impl<'a> BoxRenderer<'a> {
513508 ) ;
514509 }
515510
516- if draw_border {
511+ if crate :: draw_utils :: should_draw_color ( border_color ) || crate :: draw_utils :: should_draw_color ( bg_color ) {
517512 draw_horizontal_line (
518513 bounds. bottom ( ) ,
519514 bounds. left ( ) ,
@@ -563,10 +558,10 @@ impl<'a> BoxRenderer<'a> {
563558 bounds : & Bounds ,
564559 content : & str ,
565560 vertical_scroll : f64 ,
566- fg_color : & str ,
567- bg_color : & str ,
568- border_color : & str ,
569- parent_bg_color : & str ,
561+ fg_color : & Option < String > ,
562+ bg_color : & Option < String > ,
563+ border_color : & Option < String > ,
564+ parent_bg_color : & Option < String > ,
570565 buffer : & mut ScreenBuffer ,
571566 ) -> bool {
572567 let overflow_config = OverflowConfig :: wrap ( ) ;
@@ -596,8 +591,8 @@ impl<'a> BoxRenderer<'a> {
596591 max_content_width : usize ,
597592 viewable_width : usize ,
598593 viewable_height : usize ,
599- fg_color : & str ,
600- bg_color : & str ,
594+ fg_color : & Option < String > ,
595+ bg_color : & Option < String > ,
601596 buffer : & mut ScreenBuffer ,
602597 ) {
603598 let total_lines = content_lines. len ( ) ;
@@ -621,24 +616,24 @@ impl<'a> BoxRenderer<'a> {
621616 }
622617 }
623618
624- /// Render borders with proper corner handling
619+ /// Render borders with proper corner handling - supports transparent colors
625620 fn render_borders (
626621 & self ,
627622 bounds : & Bounds ,
628- border_color : & str ,
629- bg_color : & str ,
630- draw_border : bool ,
623+ border_color : & Option < String > ,
624+ bg_color : & Option < String > ,
631625 scrollbars_drawn : bool ,
632626 locked : bool ,
633627 content : Option < & str > ,
634628 buffer : & mut ScreenBuffer ,
635629 ) {
636- if !draw_border {
630+ // Skip border drawing if border color is transparent
631+ if !should_draw_color ( border_color) {
637632 return ;
638633 }
639634
640- let border_color_code = get_fg_color ( border_color) ;
641- let bg_color_code = get_bg_color ( bg_color) ;
635+ let border_color_code = get_fg_color_transparent ( border_color) ;
636+ let bg_color_code = get_bg_color_transparent ( bg_color) ;
642637
643638 // Check if we need horizontal scrollbar
644639 let has_horizontal_scrollbar = content. is_some ( ) && {
0 commit comments