private/output/Add-TextResultsFilter.ps1

function Add-TextResultsFilter {
    <#
    .SYNOPSIS
        Adds a live search filter box for text-type results in a RichTextBox.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [System.Windows.Controls.RichTextBox]$RichTextBox,

        [Parameter(Mandatory)]
        [System.Windows.Controls.StackPanel]$FilterPanel,

        [Parameter(Mandatory)]
        [System.Windows.Controls.DockPanel]$Toolbar2
    )

    $filterResult = New-FilterBoxWithClear -Width 200 -Height 28 -IncludeIcon -AdditionalTagData @{
        RichTextBox = $RichTextBox
        Timer       = $null
    }
    $filterBox = $filterResult.TextBox

    [void]$FilterPanel.Children.Add($filterResult.Icon)
    [void]$FilterPanel.Children.Add($filterResult.Container)
    [System.Windows.Controls.DockPanel]::SetDock($FilterPanel, 'Left')
    $Toolbar2.Children.Insert(0, $FilterPanel)

    $filterBox.Add_TextChanged({
        $tag = $this.Tag

        $tag.ClearButton.Visibility = if ([string]::IsNullOrEmpty($this.Text)) { 'Collapsed' } else { 'Visible' }

        if ($tag.Timer) {
            $tag.Timer.Stop()
            $tag.Timer = $null
        }

        $timer = [System.Windows.Threading.DispatcherTimer]::new()
        $timer.Interval = [TimeSpan]::FromMilliseconds(300)
        $timer.Tag = $this
        $tag.Timer = $timer

        $timer.Add_Tick({
            try {
                $fb = $this.Tag
                $fbTag = $fb.Tag
                $rtb = $fbTag.RichTextBox

                $searchText = $fb.Text.Trim()
                Find-ConsoleText -RichTextBox $rtb -SearchText $searchText
            }
            catch { Write-Debug "RichTextBox search failed: $_" }
            finally {
                $this.Stop()
                $fb = $this.Tag
                $fb.Tag.Timer = $null
            }
        })

        $timer.Start()
    })

    return @{ FilterBox = $filterBox }
}