src/UI/AppHeader.ps1
|
# AppHeader — Breadcrumb "D: › repos › Kompra" + tab buttons. # El renderer delega los tab buttons a Primitives.K para los hints de tecla. class AppHeader { [object] $Theme # ThemeService [object] $Renderer # Renderer [object] $Primitives # Primitives AppHeader($theme, $renderer, $primitives) { $this.Theme = $theme $this.Renderer = $renderer $this.Primitives = $primitives } [string] Render([string[]]$pathSegs, [string]$current, [hashtable[]]$tabs) { return $this.Render($pathSegs, $current, $tabs, -1) } # Overload con activeBreadcrumbIndex: índice del segmento DESTACADO (pill # con bg=acc) — usado cuando el focus está en el breadcrumb. -1 = sin # destacar (modo display normal). # El índice 0..N-2 = segmentos de pathSegs, N-1 = current. [string] Render([string[]]$pathSegs, [string]$current, [hashtable[]]$tabs, [int]$activeBreadcrumbIndex) { $reset = [AnsiService]::Reset $sep = $this.Theme.Fg('fg3') + ' › ' + $reset $segFg = $this.Theme.Fg('fg2') $curFg = $this.Theme.Fg('fg0') $activeBg = $this.Theme.Bg('acc') $activeFg = $this.Theme.Fg('bg0') $parts = @() $i = 0 foreach ($s in $pathSegs) { if ($i -eq $activeBreadcrumbIndex) { $parts += "${activeBg}${activeFg} ${s} ${reset}" } else { $parts += "${segFg}${s}${reset}" } $i++ } if ($current) { if ($i -eq $activeBreadcrumbIndex) { $parts += "${activeBg}${activeFg} ${current} ${reset}" } else { $parts += "${curFg}${current}${reset}" } } $left = ($parts -join $sep) # Tabs solo se muestran cuando hay alguno (menu abierto). Si la lista llega vacía, # todo el ancho queda para el breadcrumb — UI mínima útil. $rightParts = @() foreach ($tab in $tabs) { $k = $this.Primitives.K($tab.k) if ($tab.focused) { # Tab seleccionado: pill con bg accent, alto contraste. $bg = $this.Theme.Bg('acc') $fg = $this.Theme.Fg('bg0') $label = "${bg}${fg} $($tab.label) ${reset}" } else { $label = $this.Theme.Fg('fg1') + $tab.label + $reset } $rightParts += "$k $label" } $right = ($rightParts -join ' ') $width = $this.Renderer.Width() $padCount = [Math]::Max(1, $width - [Renderer]::VisibleLength($left) - [Renderer]::VisibleLength($right) - 2) return ' ' + $left + (' ' * $padCount) + $right + ' ' } } |