private/output/New-StatusIndicator.ps1


function New-StatusIndicator {
    <#
    .SYNOPSIS
        Creates animated status indicator (spinner/checkmark/warning).
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [hashtable]$Colors
    )

    # Status indicator - small spinner that shows running/complete/warning states
    $statusIndicator = [System.Windows.Controls.Grid]@{
        Width             = 20
        Height            = 20
        Margin            = [System.Windows.Thickness]::new(0, 0, 8, 0)
        VerticalAlignment = 'Center'
        ToolTip           = "Running..."
    }

    # Spinning arc for running state (using Path with ArcSegment)
    $statusSpinner = [System.Windows.Shapes.Path]@{
        Stroke          = ConvertTo-UiBrush $Colors.Accent
        StrokeThickness = 2
        Width           = 16
        Height          = 16
    }

    # Create arc geometry for spinner (3/4 circle)
    $geometry          = [System.Windows.Media.PathGeometry]::new()
    $figure            = [System.Windows.Media.PathFigure]::new()
    $figure.StartPoint = [System.Windows.Point]::new(8, 0)
    $arc               = [System.Windows.Media.ArcSegment]::new()
    $arc.Point         = [System.Windows.Point]::new(8, 16)
    $arc.Size          = [System.Windows.Size]::new(8, 8)
    $arc.SweepDirection = [System.Windows.Media.SweepDirection]::Clockwise
    $arc.IsLargeArc    = $true
    [void]$figure.Segments.Add($arc)
    [void]$geometry.Figures.Add($figure)
    $statusSpinner.Data = $geometry

    # Spinning animation (continuous rotation)
    $rotateTransform           = [System.Windows.Media.RotateTransform]::new()
    $rotateTransform.CenterX   = 8
    $rotateTransform.CenterY   = 8
    $statusSpinner.RenderTransform = $rotateTransform
    $rotateAnimation           = [System.Windows.Media.Animation.DoubleAnimation]@{
        From           = 0
        To             = 360
        Duration       = [System.Windows.Duration]::new([System.TimeSpan]::FromSeconds(1))
        RepeatBehavior = [System.Windows.Media.Animation.RepeatBehavior]::Forever
    }
    $rotateTransform.BeginAnimation([System.Windows.Media.RotateTransform]::AngleProperty, $rotateAnimation)

    [void]$statusIndicator.Children.Add($statusSpinner)

    # Success checkmark icon (hidden initially)
    $statusSuccess = [System.Windows.Controls.TextBlock]@{
        Text                = [PsUi.ModuleContext]::GetIcon('Accept')
        FontFamily          = [System.Windows.Media.FontFamily]::new('Segoe MDL2 Assets')
        FontSize            = 16
        Foreground          = ConvertTo-UiBrush '#107C10'
        HorizontalAlignment = 'Center'
        VerticalAlignment   = 'Center'
        Visibility          = 'Collapsed'
    }
    [void]$statusIndicator.Children.Add($statusSuccess)

    # Warning icon (hidden initially)
    $statusWarning = [System.Windows.Controls.TextBlock]@{
        Text                = [PsUi.ModuleContext]::GetIcon('Warning')
        FontFamily          = [System.Windows.Media.FontFamily]::new('Segoe MDL2 Assets')
        FontSize            = 16
        Foreground          = ConvertTo-UiBrush '#FFA500'
        HorizontalAlignment = 'Center'
        VerticalAlignment   = 'Center'
        Visibility          = 'Collapsed'
    }
    [void]$statusIndicator.Children.Add($statusWarning)

    return @{
        Container = $statusIndicator
        Spinner   = $statusSpinner
        Success   = $statusSuccess
        Warning   = $statusWarning
    }
}