public/layout/New-UiActionCard.ps1

function New-UiActionCard {
    <#
    .SYNOPSIS
        Creates a silent action card that runs without an output window.
    .DESCRIPTION
        Thin wrapper around New-UiButtonCard with -NoOutput baked in. Use this for
        cards that update UI state, open dialogs, or perform quick operations without
        needing output display. For cards that produce pipeline output or need an
        output window, use New-UiButtonCard instead.
    .PARAMETER Header
        The card title/header text.
    .PARAMETER Description
        Optional description text shown below the header.
    .PARAMETER ButtonText
        Text shown on the action button. Defaults to 'Go'.
    .PARAMETER Action
        The scriptblock to execute when the button is clicked. Mutually exclusive with -File.
    .PARAMETER File
        Path to a script file to execute when clicked. Mutually exclusive with -Action.
    .PARAMETER ArgumentList
        Hashtable of arguments to pass to the script file.
    .PARAMETER Accent
        If specified, the button uses accent color styling.
    .PARAMETER FullWidth
        If specified, the card spans the full width of its container.
    .PARAMETER NoAsync
        Execute synchronously on the UI thread (blocks UI).
    .PARAMETER NoWait
        Execute async but don't block the parent window.
    .PARAMETER LinkedVariables
        Variable names to capture from caller's scope.
    .PARAMETER LinkedFunctions
        Function names to capture from caller's scope.
    .PARAMETER LinkedModules
        Module paths to import in the async runspace.
    .PARAMETER Capture
        Variable names to capture from the runspace after execution completes.
    .PARAMETER Parameters
        Hashtable of parameters to pass to the action.
    .PARAMETER Variables
        Hashtable of variables to inject into the action.
    .PARAMETER Variable
        Optional name to register the button for -SubmitButton lookups.
    .PARAMETER WPFProperties
        Hashtable of WPF properties to apply to the card container.
    .EXAMPLE
        New-UiActionCard -Header 'File Picker' -Icon 'OpenFile' -ButtonText 'Pick' -Action { Show-UiFilePicker }
    .EXAMPLE
        New-UiActionCard -Header 'Register Theme' -Icon 'ColorBackground' -Accent -ButtonText 'Register' -Action { Register-UiTheme @theme }
    #>

    [CmdletBinding(DefaultParameterSetName = 'ScriptBlock')]
    param(
        [Parameter(Mandatory)]
        [string]$Header,

        [string]$Description,
        [string]$ButtonText = 'Go',

        [Parameter(Mandatory, ParameterSetName = 'ScriptBlock')]
        [scriptblock]$Action,

        [Parameter(Mandatory, ParameterSetName = 'File')]
        [string]$File,

        [Parameter(ParameterSetName = 'File')]
        [hashtable]$ArgumentList,

        [switch]$Accent,
        [switch]$FullWidth,

        [switch]$NoAsync,
        [switch]$NoWait,
        [string[]]$LinkedVariables,
        [string[]]$LinkedFunctions,
        [string[]]$LinkedModules,
        [string[]]$Capture,
        [hashtable]$Parameters,
        [hashtable]$Variables,

        [Parameter()]
        [string]$Variable,

        [Parameter()]
        [hashtable]$WPFProperties
    )

    DynamicParam {
        Get-IconDynamicParameter -ParameterName 'Icon'
    }

    begin {
        $Icon = $PSBoundParameters['Icon']
    }

    process {
        # Wrapper (not alias) so -NoOutput and -HideEmptyOutput stay out of IntelliSense
        $cardParams = @{}
        foreach ($key in $PSBoundParameters.Keys) {
            if ($key -eq 'Icon') { continue }
            $cardParams[$key] = $PSBoundParameters[$key]
        }
        if ($Icon) { $cardParams['Icon'] = $Icon }
        $cardParams['NoOutput'] = $true

        New-UiButtonCard @cardParams
    }
}