<ResourceDictionary
    xmlns="https://github.com/avaloniaui"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:CompileBindings="True">
    <Design.PreviewWith>
        <StackPanel
            Width="200"
            Margin="20"
            Spacing="20">
            <TextBox
                Classes="clearButton"
                Text="Hello"
                Theme="{StaticResource BorderlessTextBox}" />
            <TextBox
                Classes="Large"
                Text="Hello"
                Theme="{StaticResource BorderlessTextBox}" />
            <TextBox
                Classes="Small"
                Text="Hello"
                Theme="{StaticResource BorderlessTextBox}" />
        </StackPanel>
    </Design.PreviewWith>

    <MenuFlyout x:Key="DefaultTextBoxContextFlyout" Placement="Bottom">
        <MenuItem
            x:Name="TextBoxContextFlyoutCutItem"
            Command="{Binding $parent[TextBox].Cut}"
            Header="Cut"
            InputGesture="{x:Static TextBox.CutGesture}"
            IsEnabled="{Binding $parent[TextBox].CanCut}" />
        <MenuItem
            x:Name="TextBoxContextFlyoutCopyItem"
            Command="{Binding $parent[TextBox].Copy}"
            Header="Copy"
            InputGesture="{x:Static TextBox.CopyGesture}"
            IsEnabled="{Binding $parent[TextBox].CanCopy}" />
        <MenuItem
            x:Name="TextBoxContextFlyoutPasteItem"
            Command="{Binding $parent[TextBox].Paste}"
            Header="Paste"
            InputGesture="{x:Static TextBox.PasteGesture}"
            IsEnabled="{Binding $parent[TextBox].CanPaste}" />
    </MenuFlyout>

    <ControlTheme x:Key="{x:Type TextBox}" TargetType="TextBox">
        <ControlTheme.Resources>
            <ControlTheme x:Key="InputClearButton" TargetType="Button">
                <Setter Property="Button.Foreground" Value="{DynamicResource TextBoxButtonDefaultForeground}" />
                <Setter Property="Button.Cursor" Value="Hand" />
                <Setter Property="Button.Template">
                    <ControlTemplate TargetType="Button">
                        <!--  Background must be transparent or hit test will fail  -->
                        <ContentControl Background="Transparent">
                            <PathIcon
                                Width="16"
                                Height="16"
                                Data="{DynamicResource TextBoxClearButtonData}"
                                Foreground="{TemplateBinding Foreground}" />
                        </ContentControl>
                    </ControlTemplate>
                </Setter>
                <Style Selector="^:pointerover">
                    <Setter Property="Button.Foreground" Value="{DynamicResource TextBoxButtonPointeroverForeground}" />
                </Style>
            </ControlTheme>
            <ControlTheme x:Key="InputToggleButton" TargetType="ToggleButton">
                <Setter Property="ToggleButton.Foreground" Value="{DynamicResource TextBoxButtonDefaultForeground}" />
                <Setter Property="ToggleButton.Cursor" Value="Hand" />
                <Setter Property="ToggleButton.Template">
                    <ControlTemplate TargetType="ToggleButton">
                        <!--  Background must be transparent or hit test will fail  -->
                        <Panel Background="Transparent">
                            <PathIcon
                                Width="16"
                                Height="16"
                                Data="{DynamicResource PasswordBoxRevealButtonData}"
                                IsVisible="{Binding $parent[ToggleButton].IsChecked, Converter={x:Static BoolConverters.Not}}" />
                            <PathIcon
                                Width="16"
                                Height="16"
                                Data="{DynamicResource PasswordBoxHideButtonData}"
                                IsVisible="{Binding $parent[ToggleButton].IsChecked}" />
                        </Panel>
                    </ControlTemplate>
                </Setter>
            </ControlTheme>
        </ControlTheme.Resources>
        <Setter Property="TextBox.Foreground" Value="{DynamicResource TextBoxForeground}" />
        <Setter Property="TextBox.Background" Value="{DynamicResource TextBoxDefaultBackground}" />
        <Setter Property="TextBox.BorderBrush" Value="{DynamicResource TextBoxDefaultBorderBrush}" />
        <Setter Property="TextBox.SelectionBrush" Value="{DynamicResource TextBoxSelectionBackground}" />
        <Setter Property="TextBox.SelectionForegroundBrush" Value="{DynamicResource TextBoxSelectionForeground}" />
        <Setter Property="TextBox.BorderThickness" Value="{DynamicResource TextBoxBorderThickness}" />
        <Setter Property="TextBox.CornerRadius" Value="{DynamicResource TextBoxDefaultCornerRadius}" />
        <Setter Property="TextBox.FontSize" Value="14" />
        <Setter Property="TextBox.Cursor" Value="Ibeam" />
        <Setter Property="TextBox.CaretBrush" Value="{DynamicResource TextBoxTextCaretBrush}" />
        <Setter Property="TextBox.Padding" Value="{DynamicResource TextBoxContentPadding}" />
        <Setter Property="TextBox.VerticalContentAlignment" Value="Center" />
        <Setter Property="TextBox.FocusAdorner" Value="{x:Null}" />
        <Setter Property="ScrollViewer.IsScrollChainingEnabled" Value="True" />
        <Setter Property="TextBox.ContextFlyout" Value="{StaticResource DefaultTextBoxContextFlyout}" />
        <Setter Property="TextBox.Template">
            <ControlTemplate TargetType="TextBox">
                <DataValidationErrors>
                    <Border
                        Name="PART_ContentPresenterBorder"
                        MinHeight="{DynamicResource TextBoxWrapperDefaultHeight}"
                        Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        CornerRadius="{TemplateBinding CornerRadius}">
                        <Grid Margin="{TemplateBinding Padding}" ColumnDefinitions="Auto,*,Auto, Auto, Auto">
                            <ContentPresenter
                                Grid.Column="0"
                                Padding="{DynamicResource TextBoxInnerLeftContentPadding}"
                                VerticalAlignment="Center"
                                Content="{TemplateBinding InnerLeftContent}"
                                Foreground="{DynamicResource TextBoxInnerForeground}"
                                IsVisible="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=InnerLeftContent, Converter={x:Static ObjectConverters.IsNotNull}}" />
                            <ScrollViewer
                                Grid.Column="1"
                                AllowAutoHide="{TemplateBinding (ScrollViewer.AllowAutoHide)}"
                                HorizontalScrollBarVisibility="{TemplateBinding (ScrollViewer.HorizontalScrollBarVisibility)}"
                                IsScrollChainingEnabled="{TemplateBinding (ScrollViewer.IsScrollChainingEnabled)}"
                                VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}">
                                <Panel>
                                    <TextBlock
                                        Name="PART_Watermark"
                                        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                        IsVisible="{TemplateBinding Text,
                                                                    Converter={x:Static StringConverters.IsNullOrEmpty}}"
                                        Opacity="0.5"
                                        Text="{TemplateBinding Watermark}"
                                        TextAlignment="{TemplateBinding TextAlignment}"
                                        TextWrapping="{TemplateBinding TextWrapping}" />
                                    <TextPresenter
                                        Name="PART_TextPresenter"
                                        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                        CaretBrush="{TemplateBinding CaretBrush}"
                                        CaretIndex="{TemplateBinding CaretIndex}"
                                        LineHeight="{TemplateBinding LineHeight}"
                                        PasswordChar="{TemplateBinding PasswordChar}"
                                        RevealPassword="{TemplateBinding RevealPassword}"
                                        SelectionBrush="{TemplateBinding SelectionBrush}"
                                        SelectionEnd="{TemplateBinding SelectionEnd}"
                                        SelectionForegroundBrush="{TemplateBinding SelectionForegroundBrush}"
                                        SelectionStart="{TemplateBinding SelectionStart}"
                                        Text="{TemplateBinding Text,
                                                               Mode=TwoWay}"
                                        TextAlignment="{TemplateBinding TextAlignment}"
                                        TextWrapping="{TemplateBinding TextWrapping}" />
                                </Panel>
                            </ScrollViewer>
                            <Button
                                Name="PART_ClearButton"
                                Grid.Column="2"
                                Command="{Binding $parent[TextBox].Clear}"
                                IsVisible="False"
                                Theme="{StaticResource InputClearButton}" />
                            <ToggleButton
                                Name="PART_RevealButton"
                                Grid.Column="3"
                                Margin="4,0,0,0"
                                IsChecked="{TemplateBinding RevealPassword,
                                                            Mode=TwoWay}"
                                IsVisible="False"
                                Theme="{StaticResource InputToggleButton}" />
                            <ContentPresenter
                                Grid.Column="4"
                                Padding="{DynamicResource TextBoxInnerRightContentPadding}"
                                VerticalAlignment="Center"
                                Content="{TemplateBinding InnerRightContent}"
                                Foreground="{DynamicResource TextBoxInnerForeground}"
                                IsVisible="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=InnerRightContent, Converter={x:Static ObjectConverters.IsNotNull}}" />
                        </Grid>
                    </Border>
                </DataValidationErrors>
            </ControlTemplate>
        </Setter>

        <Style Selector="^:pointerover /template/ Border#PART_ContentPresenterBorder">
            <Setter Property="Border.Background" Value="{DynamicResource TextBoxPointeroverBackground}" />
        </Style>
        <Style Selector="^:pressed /template/ Border#PART_ContentPresenterBorder">
            <Setter Property="Border.Background" Value="{DynamicResource TextBoxPressedBackground}" />
        </Style>
        <Style Selector="^:focus /template/ Border#PART_ContentPresenterBorder">
            <Setter Property="Border.BorderBrush" Value="{DynamicResource TextBoxFocusBorderBrush}" />
        </Style>
        <Style Selector="^:disabled /template/ Border#PART_ContentPresenterBorder">
            <Setter Property="Border.BorderBrush" Value="{DynamicResource TextBoxDisabledBorderBrush}" />
            <Setter Property="Border.Background" Value="{DynamicResource TextBoxDisabledBackground}" />
        </Style>
        <Style Selector="^:disabled">
            <Setter Property="TextBox.Foreground" Value="{DynamicResource TextBoxDisabledForeground}" />
        </Style>

        <Style Selector="^:error">
            <Style Selector="^ /template/ Border#PART_ContentPresenterBorder">
                <Setter Property="Background" Value="{DynamicResource DataValidationErrorsBackground}" />
                <Setter Property="BorderBrush" Value="Transparent" />
            </Style>
            <Style Selector="^:pointerover /template/ Border#PART_ContentPresenterBorder">
                <Setter Property="Border.Background" Value="{DynamicResource DataValidationErrorsPointerOverBackground}" />
                <Setter Property="Border.BorderBrush" Value="Transparent" />
            </Style>
            <Style Selector="^:pressed /template/ Border#PART_ContentPresenterBorder">
                <Setter Property="Border.Background" Value="{DynamicResource DataValidationErrorsPressedBackground}" />
                <Setter Property="Border.BorderBrush" Value="Transparent" />
            </Style>
            <Style Selector="^:focus /template/ Border#PART_ContentPresenterBorder">
                <Setter Property="Border.Background" Value="{DynamicResource DataValidationErrorsSelectedBackground}" />
                <Setter Property="Border.BorderBrush" Value="{DynamicResource DataValidationErrorsSelectedBorderBrush}" />
            </Style>
        </Style>

        <Style Selector="^.clearButton, ^.ClearButton">
            <Style Selector="^[AcceptsReturn=False][IsReadOnly=False]:focus:not(:empty) /template/ Button#PART_ClearButton">
                <Setter Property="Button.IsVisible" Value="True" />
            </Style>
            <Style Selector="^[AcceptsReturn=False][IsReadOnly=False]:pointerover:not(:empty) /template/ Button#PART_ClearButton">
                <Setter Property="Button.IsVisible" Value="True" />
            </Style>
        </Style>
        <Style Selector="^.revealPasswordButton, ^.RevealPasswordButton">
            <Style Selector="^ /template/ ToggleButton#PART_RevealButton">
                <Setter Property="ToggleButton.IsVisible" Value="True" />
            </Style>
        </Style>
        <Style Selector="^.Large /template/ Border#PART_ContentPresenterBorder">
            <Setter Property="MinHeight" Value="{DynamicResource TextBoxWrapperLargeHeight}" />
        </Style>
        <Style Selector="^.Small /template/ Border#PART_ContentPresenterBorder">
            <Setter Property="MinHeight" Value="{DynamicResource TextBoxWrapperSmallHeight}" />
        </Style>

        <Style Selector="^.Bordered">
            <Setter Property="TextBox.Background" Value="{DynamicResource TextBoxBorderedDefaultBackground}" />
            <Setter Property="TextBox.BorderBrush" Value="{DynamicResource TextBoxBorderedDefaultBorderBrush}" />
            <Style Selector="^:pointerover /template/ Border#PART_ContentPresenterBorder">
                <Setter Property="Border.Background" Value="{DynamicResource TextBoxBorderedPointeroverBackground}" />
                <Setter Property="Border.BorderBrush" Value="{DynamicResource TextBoxBorderedPointeroverBorderBrush}" />
            </Style>
            <Style Selector="^:focus">
                <Setter Property="TextBox.Background" Value="{DynamicResource TextBoxBorderedPointeroverBackground}" />
                <Setter Property="TextBox.BorderBrush" Value="{DynamicResource TextBoxBorderedPointeroverBorderBrush}" />
            </Style>
            <Style Selector="^:disabled /template/ Border#PART_ContentPresenterBorder">
                <Setter Property="TextBox.Background" Value="{DynamicResource TextBoxDisabledBackground}" />
                <Setter Property="TextBox.BorderBrush" Value="{DynamicResource TextBoxDisabledBorderBrush}" />
            </Style>

            <Style Selector="^:error">
                <Style Selector="^ /template/ Border#PART_ContentPresenterBorder">
                    <Setter Property="Background" Value="{DynamicResource DataValidationErrorsBackground}" />
                    <Setter Property="BorderBrush" Value="{DynamicResource DataValidationErrorsBorderBrush}" />
                </Style>
                <Style Selector="^:pointerover /template/ Border#PART_ContentPresenterBorder">
                    <Setter Property="Border.Background" Value="{DynamicResource DataValidationErrorsPointerOverBackground}" />
                    <Setter Property="Border.BorderBrush" Value="{DynamicResource DataValidationErrorsPointerOverBorderBrush}" />
                </Style>
                <Style Selector="^:pressed /template/ Border#PART_ContentPresenterBorder">
                    <Setter Property="Border.Background" Value="{DynamicResource DataValidationErrorsPressedBackground}" />
                    <Setter Property="Border.BorderBrush" Value="{DynamicResource DataValidationErrorsPressedBorderBrush}" />
                </Style>
                <Style Selector="^:focus /template/ Border#PART_ContentPresenterBorder">
                    <Setter Property="Border.Background" Value="{DynamicResource DataValidationErrorsSelectedBackground}" />
                    <Setter Property="Border.BorderBrush" Value="{DynamicResource DataValidationErrorsSelectedBorderBrush}" />
                </Style>
            </Style>
        </Style>
    </ControlTheme>

    <ControlTheme x:Key="NonErrorTextBox" TargetType="TextBox">
        <Setter Property="TextBox.Foreground" Value="{DynamicResource TextBoxForeground}" />
        <Setter Property="TextBox.Background" Value="{DynamicResource TextBoxDefaultBackground}" />
        <Setter Property="TextBox.BorderBrush" Value="{DynamicResource TextBoxDefaultBorderBrush}" />
        <Setter Property="TextBox.SelectionBrush" Value="{DynamicResource TextBoxSelectionBackground}" />
        <Setter Property="TextBox.SelectionForegroundBrush" Value="{DynamicResource TextBoxSelectionForeground}" />
        <Setter Property="TextBox.BorderThickness" Value="{DynamicResource TextBoxBorderThickness}" />
        <Setter Property="TextBox.CornerRadius" Value="{DynamicResource TextBoxDefaultCornerRadius}" />
        <Setter Property="TextBox.FontSize" Value="14" />
        <Setter Property="TextBox.Cursor" Value="Ibeam" />
        <Setter Property="TextBox.CaretBrush" Value="{DynamicResource TextBoxTextCaretBrush}" />
        <Setter Property="TextBox.Padding" Value="{DynamicResource TextBoxContentPadding}" />
        <Setter Property="TextBox.MinHeight" Value="{DynamicResource TextBoxWrapperDefaultHeight}" />
        <Setter Property="TextBox.VerticalContentAlignment" Value="Center" />
        <Setter Property="TextBox.FocusAdorner" Value="{x:Null}" />
        <Setter Property="ScrollViewer.IsScrollChainingEnabled" Value="True" />
        <Setter Property="TextBox.ContextFlyout" Value="{StaticResource DefaultTextBoxContextFlyout}" />
        <Setter Property="TextBox.Template">
            <ControlTemplate TargetType="TextBox">
                <DataValidationErrors Theme="{DynamicResource SilentDataValidationErrors}">
                    <Border
                        Name="PART_ContentPresenterBorder"
                        MinHeight="{TemplateBinding MinHeight}"
                        Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        CornerRadius="{TemplateBinding CornerRadius}">
                        <Grid Margin="{TemplateBinding Padding}" ColumnDefinitions="Auto, *">
                            <ContentPresenter
                                Grid.Column="0"
                                Padding="{DynamicResource TextBoxInnerLeftContentPadding}"
                                VerticalAlignment="Center"
                                Content="{TemplateBinding InnerLeftContent}"
                                Foreground="{DynamicResource TextBoxInnerForeground}"
                                IsVisible="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=InnerLeftContent, Converter={x:Static ObjectConverters.IsNotNull}}" />
                            <ScrollViewer
                                Grid.Column="1"
                                AllowAutoHide="{TemplateBinding (ScrollViewer.AllowAutoHide)}"
                                HorizontalScrollBarVisibility="{TemplateBinding (ScrollViewer.HorizontalScrollBarVisibility)}"
                                IsScrollChainingEnabled="{TemplateBinding (ScrollViewer.IsScrollChainingEnabled)}"
                                VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}">
                                <Panel>
                                    <TextBlock
                                        Name="PART_Watermark"
                                        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                        IsVisible="{TemplateBinding Text,
                                                                    Converter={x:Static StringConverters.IsNullOrEmpty}}"
                                        Opacity="0.5"
                                        Text="{TemplateBinding Watermark}"
                                        TextAlignment="{TemplateBinding TextAlignment}"
                                        TextWrapping="{TemplateBinding TextWrapping}" />
                                    <TextPresenter
                                        Name="PART_TextPresenter"
                                        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                        CaretBrush="{TemplateBinding CaretBrush}"
                                        CaretIndex="{TemplateBinding CaretIndex}"
                                        LineHeight="{TemplateBinding LineHeight}"
                                        PasswordChar="{TemplateBinding PasswordChar}"
                                        RevealPassword="{TemplateBinding RevealPassword}"
                                        SelectionBrush="{TemplateBinding SelectionBrush}"
                                        SelectionEnd="{TemplateBinding SelectionEnd}"
                                        SelectionForegroundBrush="{TemplateBinding SelectionForegroundBrush}"
                                        SelectionStart="{TemplateBinding SelectionStart}"
                                        Text="{TemplateBinding Text,
                                                               Mode=TwoWay}"
                                        TextAlignment="{TemplateBinding TextAlignment}"
                                        TextWrapping="{TemplateBinding TextWrapping}" />
                                </Panel>
                            </ScrollViewer>
                        </Grid>
                    </Border>
                </DataValidationErrors>
            </ControlTemplate>
        </Setter>

        <Style Selector="^:pointerover /template/ Border#PART_ContentPresenterBorder">
            <Setter Property="Border.Background" Value="{DynamicResource TextBoxPointeroverBackground}" />
        </Style>
        <Style Selector="^:pressed /template/ Border#PART_ContentPresenterBorder">
            <Setter Property="Border.Background" Value="{DynamicResource TextBoxPressedBackground}" />
        </Style>
        <Style Selector="^:focus /template/ Border#PART_ContentPresenterBorder">
            <Setter Property="Border.BorderBrush" Value="{DynamicResource TextBoxFocusBorderBrush}" />
        </Style>
        <Style Selector="^:disabled /template/ Border#PART_ContentPresenterBorder">
            <Setter Property="Border.BorderBrush" Value="{DynamicResource TextBoxDisabledBorderBrush}" />
            <Setter Property="Border.Background" Value="{DynamicResource TextBoxDisabledBackground}" />
        </Style>
        <Style Selector="^:disabled">
            <Setter Property="TextBox.Foreground" Value="{DynamicResource TextBoxDisabledForeground}" />
        </Style>

        <Style Selector="^:error">
            <Style Selector="^ /template/ Border#PART_ContentPresenterBorder">
                <Setter Property="Background" Value="{DynamicResource DataValidationErrorsBackground}" />
                <Setter Property="BorderBrush" Value="Transparent" />
            </Style>
            <Style Selector="^:pointerover /template/ Border#PART_ContentPresenterBorder">
                <Setter Property="Border.Background" Value="{DynamicResource DataValidationErrorsPointerOverBackground}" />
                <Setter Property="Border.BorderBrush" Value="Transparent" />
            </Style>
            <Style Selector="^:pressed /template/ Border#PART_ContentPresenterBorder">
                <Setter Property="Border.Background" Value="{DynamicResource DataValidationErrorsPressedBackground}" />
                <Setter Property="Border.BorderBrush" Value="Transparent" />
            </Style>
            <Style Selector="^:focus /template/ Border#PART_ContentPresenterBorder">
                <Setter Property="Border.Background" Value="{DynamicResource DataValidationErrorsSelectedBackground}" />
                <Setter Property="Border.BorderBrush" Value="{DynamicResource DataValidationErrorsSelectedBorderBrush}" />
            </Style>
        </Style>
    </ControlTheme>
</ResourceDictionary>
