@@ -156,6 +156,13 @@ struct State {
156156 rect_instance_vbuf : wgpu:: Buffer ,
157157 rect_instance_count : u32 ,
158158
159+ // Overlay layer (modals, tooltips) — drawn on top of the base
160+ // text layer so the panel fill fully occludes the text behind it.
161+ overlay_text_vbuf : wgpu:: Buffer ,
162+ overlay_text_vcount : u32 ,
163+ overlay_rect_instance_vbuf : wgpu:: Buffer ,
164+ overlay_rect_instance_count : u32 ,
165+
159166 layout_dirty : bool ,
160167 geometry_dirty : bool ,
161168}
@@ -418,11 +425,21 @@ impl State {
418425 "empty_text" ,
419426 std:: mem:: size_of :: < TextVertex > ( ) as u64 ,
420427 ) ;
428+ let empty_overlay_text_vbuf = create_empty_buffer (
429+ & device,
430+ "empty_overlay_text" ,
431+ std:: mem:: size_of :: < TextVertex > ( ) as u64 ,
432+ ) ;
421433 let empty_rect_inst_vbuf = create_empty_buffer (
422434 & device,
423435 "empty_rect_instances" ,
424436 std:: mem:: size_of :: < StyledRectInstance > ( ) as u64 ,
425437 ) ;
438+ let empty_overlay_rect_inst_vbuf = create_empty_buffer (
439+ & device,
440+ "empty_overlay_rect_instances" ,
441+ std:: mem:: size_of :: < StyledRectInstance > ( ) as u64 ,
442+ ) ;
426443
427444 let rect_unit_verts = [
428445 QuadVertex { unit : [ 0.0 , 0.0 ] } ,
@@ -498,6 +515,10 @@ impl State {
498515 rect_unit_vbuf,
499516 rect_instance_vbuf : empty_rect_inst_vbuf,
500517 rect_instance_count : 0 ,
518+ overlay_text_vbuf : empty_overlay_text_vbuf,
519+ overlay_text_vcount : 0 ,
520+ overlay_rect_instance_vbuf : empty_overlay_rect_inst_vbuf,
521+ overlay_rect_instance_count : 0 ,
501522 layout_dirty : true ,
502523 geometry_dirty : true ,
503524 } ;
@@ -863,6 +884,11 @@ impl State {
863884 self . update_commit_prompt ( ) ;
864885 Ok ( true )
865886 }
887+ Key :: Named ( NamedKey :: Space ) => {
888+ self . current_commit_target ( ) . push ( ' ' ) ;
889+ self . update_commit_prompt ( ) ;
890+ Ok ( true )
891+ }
866892 Key :: Character ( ch) => {
867893 let mut changed = false ;
868894 for c in ch. chars ( ) {
@@ -3340,10 +3366,18 @@ impl State {
33403366 }
33413367 }
33423368
3343- // ── Bottom chrome + modals (rendered AFTER panes so they overlay) ─
3369+ // ── Bottom chrome (rendered AFTER panes so it overlays) ─ ─
33443370 self . build_status_geometry ( & mut text_vertices, & mut rect_instances) ?;
3345- self . build_modal_overlay_geometry ( & mut text_vertices, & mut rect_instances) ?;
3346- self . build_tooltip_geometry ( & mut text_vertices, & mut rect_instances) ?;
3371+
3372+ // ── Overlay layer: modals + tooltips ────────────────────
3373+ // Rendered as a separate pass *after* the base text so the
3374+ // panel/tooltip fill fully occludes the UI text behind it —
3375+ // otherwise the base text batch (drawn after the base rects)
3376+ // would bleed through the overlay's translucent-looking fill.
3377+ let mut overlay_text = Vec :: < TextVertex > :: new ( ) ;
3378+ let mut overlay_rects = Vec :: < StyledRectInstance > :: new ( ) ;
3379+ self . build_modal_overlay_geometry ( & mut overlay_text, & mut overlay_rects) ?;
3380+ self . build_tooltip_geometry ( & mut overlay_text, & mut overlay_rects) ?;
33473381
33483382 self . text_vbuf = create_vertex_buffer ( & self . device , "text_vertices" , & text_vertices) ;
33493383 self . text_vcount = text_vertices. len ( ) as u32 ;
@@ -3352,6 +3386,14 @@ impl State {
33523386 create_vertex_buffer ( & self . device , "styled_rect_instances" , & rect_instances) ;
33533387 self . rect_instance_count = rect_instances. len ( ) as u32 ;
33543388
3389+ self . overlay_text_vbuf =
3390+ create_vertex_buffer ( & self . device , "overlay_text_vertices" , & overlay_text) ;
3391+ self . overlay_text_vcount = overlay_text. len ( ) as u32 ;
3392+
3393+ self . overlay_rect_instance_vbuf =
3394+ create_vertex_buffer ( & self . device , "overlay_rect_instances" , & overlay_rects) ;
3395+ self . overlay_rect_instance_count = overlay_rects. len ( ) as u32 ;
3396+
33553397 self . geometry_dirty = false ;
33563398 Ok ( ( ) )
33573399 }
@@ -3737,6 +3779,23 @@ impl State {
37373779 pass. set_vertex_buffer ( 0 , self . text_vbuf . slice ( ..) ) ;
37383780 pass. draw ( 0 ..self . text_vcount , 0 ..1 ) ;
37393781 }
3782+
3783+ // ── Overlay layer (modals, tooltips) on top of base text ─
3784+ if self . overlay_rect_instance_count > 0 {
3785+ pass. set_pipeline ( & self . rect_pipeline ) ;
3786+ pass. set_bind_group ( 0 , & self . uniform_bg , & [ ] ) ;
3787+ pass. set_vertex_buffer ( 0 , self . rect_unit_vbuf . slice ( ..) ) ;
3788+ pass. set_vertex_buffer ( 1 , self . overlay_rect_instance_vbuf . slice ( ..) ) ;
3789+ pass. draw ( 0 ..6 , 0 ..self . overlay_rect_instance_count ) ;
3790+ }
3791+
3792+ if self . overlay_text_vcount > 0 {
3793+ pass. set_pipeline ( & self . text_pipeline ) ;
3794+ pass. set_bind_group ( 0 , & self . text_bg , & [ ] ) ;
3795+ pass. set_bind_group ( 1 , & self . uniform_bg , & [ ] ) ;
3796+ pass. set_vertex_buffer ( 0 , self . overlay_text_vbuf . slice ( ..) ) ;
3797+ pass. draw ( 0 ..self . overlay_text_vcount , 0 ..1 ) ;
3798+ }
37403799 }
37413800
37423801 self . queue . submit ( [ encoder. finish ( ) ] ) ;
0 commit comments