Scripts/aurora-halo.ps1

# Aurora Halo - concentric waves of luminous greens and violets

$esc = [char]27
$reset = "$esc[0m"

$rows = 28
$cols = 78
$charSteps = '▂▃▄▅▆▇█'
$centerY = ($rows - 1) / 2.0
$centerX = ($cols - 1) / 2.0

Write-Host
for ($y = 0; $y -lt $rows; $y++) {
    $sb = [System.Text.StringBuilder]::new()
    for ($x = 0; $x -lt $cols; $x++) {
        $dx = ($x - $centerX) / $centerX
        $dy = ($y - $centerY) / $centerY
        $distance = [math]::Sqrt($dx * $dx + $dy * $dy)
        $wave = [math]::Sin($distance * 6.5 - ($y * 0.08))
        $r = [int]([math]::Min(255, 120 + 80 * $wave + 60 * (1 - $distance)))
        $g = [int]([math]::Min(255, 160 + 90 * $wave))
        $b = [int]([math]::Min(255, 200 - 140 * $distance + 80 * $wave))
        if ($r -lt 0) { $r = 0 }
        if ($g -lt 0) { $g = 0 }
        if ($b -lt 0) { $b = 0 }
        $scaled = [math]::Floor(([math]::Min(0.999, [math]::Max(0, ($wave + 1) / 2))) * ($charSteps.Length))
        $index = [int]([math]::Min($charSteps.Length - 1, $scaled))
        $char = $charSteps[$index]
        $null = $sb.Append("$esc[38;2;$r;$g;$b" + "m$char")
    }
    $null = $sb.Append($reset)
    Write-Host $sb.ToString()
}
Write-Host $reset