Private/UI/Show-VersionList.ps1

function Show-VersionList {
    param(
        [string[]]$Versions,
        [string]$ModuleName
    )

    if (-not $Versions -or $Versions.Count -eq 0) {
        Write-Host "No versions found for $ModuleName."
        return $null
    }

    $palette = Get-PSMBColorPalette
    $esc = [char]27
    $reset = "${esc}[0m"

    $innerWidth = Get-PSMBConsoleInnerWidth
    $border = ([char]0x2502)
    $hLine = ([char]0x2500)

    $amberRGB = @(168, 213, 162)
    $roseRGB = @(94, 234, 212)

    $fitText = {
        param([string]$Text)
        if ($null -eq $Text) { return '' }
        if ($Text.Length -le $innerWidth) { return $Text }
        if ($innerWidth -le 3) { return $Text.Substring(0, [Math]::Max(0, $innerWidth)) }
        return $Text.Substring(0, $innerWidth - 3) + '...'
    }

    $selectedIdx = 0
    $maxVisible = [Math]::Min(15, [Console]::WindowHeight - 12)

    try {
        [Console]::CursorVisible = $false

        while ($true) {
            $startIdx = [Math]::Max(0, $selectedIdx - [Math]::Floor($maxVisible / 2))
            $endIdx = [Math]::Min($Versions.Count - 1, $startIdx + $maxVisible - 1)
            if ($endIdx - $startIdx + 1 -lt $maxVisible -and $startIdx -gt 0) {
                $startIdx = [Math]::Max(0, $endIdx - $maxVisible + 1)
            }

            Clear-Host
            Write-Host ''

            # Top border
            $topLine = Get-PSMBGradientLine -Character $hLine -Length $innerWidth -StartRGB $amberRGB -EndRGB $roseRGB
            Write-Host (' {0}{1}{2}{3}' -f $palette.Surface, ([char]0x256D), $topLine, ([char]0x256E)) -NoNewline
            Write-Host $palette.Reset

            # Title
            $titleText = 'Versions for {0} ({1} total)' -f $ModuleName, $Versions.Count
            $titleClipped = & $fitText $titleText
            $titlePadded = (' ' + $titleClipped).PadRight($innerWidth)
            Write-Host (' {0}{1}{2}{3}{4}{5}{6}' -f $palette.Surface, $border, $palette.Amber, $palette.Bold, $titlePadded, $reset, ('{0}{1}{2}' -f $palette.Surface, $border, $reset))

            # Separator
            $sepLine = Get-PSMBGradientLine -Character $hLine -Length $innerWidth -StartRGB $amberRGB -EndRGB $roseRGB
            Write-Host (' {0}{1}{2}{3}' -f $palette.Surface, ([char]0x251C), $sepLine, ([char]0x2524)) -NoNewline
            Write-Host $palette.Reset

            $emptyLine = ' {0}{1}{2}{3}{4}' -f $palette.Surface, $border, (' ' * $innerWidth), $border, $reset
            Write-Host $emptyLine

            for ($i = $startIdx; $i -le $endIdx; $i++) {
                if ($i -eq $selectedIdx) {
                    $chevron = [char]0x276F
                    $itemText = (' {0} {1}' -f $chevron, $Versions[$i])
                    $padded = (& $fitText $itemText).PadRight($innerWidth)
                    $line = ' {0}{1}{2}{3}{4}{5}{6}{7}' -f $palette.Surface, $border, $palette.BgSelect, $palette.Amber, $palette.Bold, $padded, $reset, ('{0}{1}{2}' -f $palette.Surface, $border, $reset)
                } else {
                    $itemText = (' {0}' -f $Versions[$i])
                    $padded = (& $fitText $itemText).PadRight($innerWidth)
                    $line = ' {0}{1}{2}{3}{4}{5}' -f $palette.Surface, $border, $palette.Text, $padded, $reset, ('{0}{1}{2}' -f $palette.Surface, $border, $reset)
                }
                Write-Host $line
            }

            if ($Versions.Count -gt $maxVisible) {
                Write-Host $emptyLine
                $posText = (' {0} of {1}' -f ($selectedIdx + 1), $Versions.Count)
                $posPadded = (& $fitText $posText).PadRight($innerWidth)
                Write-Host (' {0}{1}{2}{3}{4}{5}' -f $palette.Surface, $border, $palette.Dim, $posPadded, $reset, ('{0}{1}{2}' -f $palette.Surface, $border, $reset))
            }

            Write-Host $emptyLine

            # Separator
            Write-Host (' {0}{1}{2}{3}' -f $palette.Surface, ([char]0x251C), $sepLine, ([char]0x2524)) -NoNewline
            Write-Host $palette.Reset

            # Hint
            $hintText = ' Up/Down: Navigate Enter: Select Esc: Cancel'
            $hintPadded = (& $fitText $hintText).PadRight($innerWidth)
            Write-Host (' {0}{1}{2}{3}{4}{5}' -f $palette.Surface, $border, $palette.Dim, $hintPadded, $reset, ('{0}{1}{2}' -f $palette.Surface, $border, $reset))

            # Bottom border
            $bottomLine = Get-PSMBGradientLine -Character $hLine -Length $innerWidth -StartRGB $amberRGB -EndRGB $roseRGB
            Write-Host (' {0}{1}{2}{3}' -f $palette.Surface, ([char]0x2570), $bottomLine, ([char]0x256F)) -NoNewline
            Write-Host $palette.Reset

            $key = [Console]::ReadKey($true)

            switch ($key.Key) {
                'UpArrow' { if ($selectedIdx -gt 0) { $selectedIdx-- } }
                'DownArrow' { if ($selectedIdx -lt $Versions.Count - 1) { $selectedIdx++ } }
                'Enter' { return $Versions[$selectedIdx] }
                'Escape' { return $null }
            }
        }
    } finally {
        [Console]::CursorVisible = $true
        Clear-Host
    }
}