public/dialogs/Show-UiConfirmDialog.ps1

function Show-UiConfirmDialog {
    <#
    .SYNOPSIS
        Displays a simple themed confirmation dialog.
    .DESCRIPTION
        Shows a custom WPF confirmation dialog with customizable button text.
    .PARAMETER Title
        Dialog window title.
    .PARAMETER Message
        Message text to display.
    .PARAMETER ConfirmText
        Text for the confirmation button (default "Yes").
    .PARAMETER CancelText
        Text for the cancel button (default "No").
    .EXAMPLE
        if (Show-UiConfirmDialog -Title 'Delete File' -Message 'Are you sure you want to delete this file?') {
            Remove-Item $file
        }
    .EXAMPLE
        $proceed = Show-UiConfirmDialog -Title 'Continue' -Message 'Continue with operation?' -ConfirmText 'Continue' -CancelText 'Stop'
    #>

    [CmdletBinding()]
    param(
        [string]$Title = 'Confirm',

        [Parameter(Mandatory)]
        [string]$Message,

        [string]$ConfirmText = 'Yes',

        [string]$CancelText = 'No'
    )

    Write-Debug "Title='$Title' ConfirmText='$ConfirmText' CancelText='$CancelText'"

    # Create dialog window using shared helper
    $dlg = New-DialogWindow -Title $Title -Width 400 -AppIdSuffix 'ConfirmDialog' -OverlayGlyph ([PsUi.ModuleContext]::GetIcon('Help'))

    $window       = $dlg.Window
    $contentPanel = $dlg.ContentPanel
    $colors       = $dlg.Colors

    # Button panel at bottom
    $buttonPanel = [System.Windows.Controls.StackPanel]@{
        Orientation         = 'Horizontal'
        HorizontalAlignment = 'Right'
        Margin              = [System.Windows.Thickness]::new(0, 12, 0, 0)
    }
    [System.Windows.Controls.DockPanel]::SetDock($buttonPanel, 'Bottom')
    [void]$contentPanel.Children.Add($buttonPanel)

    # Message text with scroll support
    $scrollViewer = [System.Windows.Controls.ScrollViewer]@{
        VerticalScrollBarVisibility   = 'Auto'
        HorizontalScrollBarVisibility = 'Disabled'
        Padding                       = [System.Windows.Thickness]::new(0, 0, 8, 0)
    }

    $messageText = [System.Windows.Controls.TextBlock]@{
        Text         = $Message
        FontSize     = 13
        TextWrapping = 'Wrap'
        Foreground   = ConvertTo-UiBrush $colors.ControlFg
        Margin       = [System.Windows.Thickness]::new(0, 4, 0, 0)
    }
    $scrollViewer.Content = $messageText
    [void]$contentPanel.Children.Add($scrollViewer)

    # MinWidth lets long labels grow, but 'Yes' and 'No' still get the 80px floor so the
    # two buttons line up cleanly when their text is mixed lengths.
    $confirmBtn = [System.Windows.Controls.Button]@{
        Content  = $ConfirmText
        MinWidth = 80
        Height   = 28
        Padding  = [System.Windows.Thickness]::new(10, 0, 10, 0)
        Margin   = [System.Windows.Thickness]::new(0, 0, 4, 0)
    }
    Set-ButtonStyle -Button $confirmBtn -Accent
    $confirmBtn.Add_Click({
        $window.Tag = $true
        $window.Close()
    })
    [void]$buttonPanel.Children.Add($confirmBtn)
    $confirmBtn.IsDefault = $true

    $cancelBtn = [System.Windows.Controls.Button]@{
        Content  = $CancelText
        MinWidth = 80
        Height   = 28
        Padding  = [System.Windows.Thickness]::new(10, 0, 10, 0)
        Margin   = [System.Windows.Thickness]::new(4, 0, 0, 0)
    }
    Set-ButtonStyle -Button $cancelBtn
    $cancelBtn.Add_Click({
        $window.Tag = $false
        $window.Close()
    })
    [void]$buttonPanel.Children.Add($cancelBtn)
    $cancelBtn.IsCancel = $true

    # Standard window behavior: fade-in, title bar theming
    Initialize-UiWindowLoaded -Window $window

    Set-UiDialogPosition -Dialog $window

    Write-Debug "Showing modal dialog"
    [void]$window.ShowDialog()

    $result = $window.Tag -eq $true
    Write-Debug "Result: $result"
    return $result
}