modules/layout_components.ps1

function New-ConsoleLayout {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [array]$Rows
    )
    return @{ Rows = $Rows }
}

function New-ConsoleRow {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [array]$Columns
    )
    return @{ Columns = $Columns }
}

function New-ConsoleColumn {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        $Content,
        
        [Parameter(Mandatory=$false)]
        [int]$WidthPercent = 50
    )
    return @{ Content = $Content; WidthPercent = $WidthPercent }
}

function Write-ConsoleLayout {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [hashtable]$Layout,
        
        [Parameter(Mandatory=$false)]
        [int]$TotalWidth = 80
    )
    
    foreach ($row in $Layout.Rows) {
        $colOutputs = @()
        $colWidths = @()
        
        # Calculate individual column widths
        foreach ($col in $row.Columns) {
            $w = [Math]::Floor(($col.WidthPercent / 100) * $TotalWidth) - 1
            $colWidths += $w
            
            # Capture output
            $lines = @()
            if ($col.Content -is [array]) {
                $lines = $col.Content
            } elseif ($col.Content -is [string]) {
                $lines = @($col.Content)
            } elseif ($col.Content -is [scriptblock]) {
                try {
                    $lines = @(. $col.Content -Width $w -ReturnLines)
                } catch {
                    $lines = @("Error rendering column")
                }
            }
            
            # Final safety: Ensure it is an array and not null
            if ($null -eq $lines) { $lines = @("") }
            $colOutputs += ,$lines
        }
        
        # Merge and print
        $merged = Set-LayoutBuffer -Columns $colOutputs -Widths $colWidths
        foreach ($l in $merged) {
            Write-Host " $l"
        }
        Write-Host "" # Row separator
    }
}


# No local Export-ModuleMember here - handled by main module