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 + ' '
    }
}