Repository: Flow-Launcher/Flow.Launcher
Pull request #3396: Support Placeholder Text & Toggle Resize Search Window Mode
Author: login: Jack251970
Labels: name: enhancement
description: New feature or request
name: kind/ui
description: related to UI, icons, themes, etc
Created: 2025-03-29T06:24:17Z | Merged: 2025-03-29T08:57:37Z

# Placeholder Text

Add placeholder text when query is empty

<img width="637" alt="image" src="https://github.com/user-attachments/assets/1da996c0-d6d2-47fe-9889-9495bb3fec24" />

# Fixed Window Size

Allow dragging to change window size

![image](https://github.com/user-attachments/assets/ac2b1c04-54b0-438c-94b9-58e943adad06)


Diff:
diff --git a/Flow.Launcher.Core/Resource/Theme.cs b/Flow.Launcher.Core/Resource/Theme.cs
index 48900261730..e5980b62fa3 100644
--- a/Flow.Launcher.Core/Resource/Theme.cs
+++ b/Flow.Launcher.Core/Resource/Theme.cs
@@ -24,7 +24,7 @@ public class Theme
     {
         #region Properties & Fields
 
-        public bool BlurEnabled { get; set; }
+        public bool BlurEnabled { get; private set; }
 
         private const string ThemeMetadataNamePrefix = "Name:";
         private const string ThemeMetadataIsDarkPrefix = "IsDark:";
@@ -42,6 +42,8 @@ public class Theme
         private static string DirectoryPath => Path.Combine(Constant.ProgramDirectory, Folder);
         private static string UserDirectoryPath => Path.Combine(DataLocation.DataDirectory(), Folder);
 
+        private Thickness _themeResizeBorderThickness;
+
         #endregion
 
         #region Constructor
@@ -463,7 +465,7 @@ public void AddDropShadowEffectToCurrentTheme()
 
             var effectSetter = new Setter
             {
-                Property = Border.EffectProperty,
+                Property = UIElement.EffectProperty,
                 Value = new DropShadowEffect
                 {
                     Opacity = 0.3,
@@ -473,12 +475,12 @@ public void AddDropShadowEffectToCurrentTheme()
                 }
             };
 
-            if (windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == Border.MarginProperty) is not Setter marginSetter)
+            if (windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == FrameworkElement.MarginProperty) is not Setter marginSetter)
             {
                 var margin = new Thickness(ShadowExtraMargin, 12, ShadowExtraMargin, ShadowExtraMargin);
                 marginSetter = new Setter()
                 {
-                    Property = Border.MarginProperty,
+                    Property = FrameworkElement.MarginProperty,
                     Value = margin,
                 };
                 windowBorderStyle.Setters.Add(marginSetter);
@@ -508,12 +510,12 @@ public void RemoveDropShadowEffectFromCurrentTheme()
             var dict = GetCurrentResourceDictionary();
             var windowBorderStyle = dict["WindowBorderStyle"] as Style;
 
-            if (windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == Border.EffectProperty) is Setter effectSetter)
+            if (windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == UIElement.EffectProperty) is Setter effectSetter)
             {
                 windowBorderStyle.Setters.Remove(effectSetter);
             }
 
-            if (windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == Border.MarginProperty) is Setter marginSetter)
+            if (windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == FrameworkElement.MarginProperty) is Setter marginSetter)
             {
                 var currentMargin = (Thickness)marginSetter.Value;
                 var newMargin = new Thickness(
@@ -529,28 +531,41 @@ public void RemoveDropShadowEffectFromCurrentTheme()
             UpdateResourceDictionary(dict);
         }
 
+        public void SetResizeBorderThickness(WindowChrome windowChrome, bool fixedWindowSize)
+        {
+            if (fixedWindowSize)
+            {
+                windowChrome.ResizeBorderThickness = new Thickness(0);
+            }
+            else
+            {
+                windowChrome.ResizeBorderThickness = _themeResizeBorderThickness;
+            }
+        }
+
         // because adding drop shadow effect will change the margin of the window,
         // we need to update the window chrome thickness to correct set the resize border
-        private static void SetResizeBoarderThickness(Thickness? effectMargin)
+        private void SetResizeBoarderThickness(Thickness? effectMargin)
         {
             var window = Application.Current.MainWindow;
             if (WindowChrome.GetWindowChrome(window) is WindowChrome windowChrome)
             {
-                Thickness thickness;
+                // Save the theme resize border thickness so that we can restore it if we change ResizeWindow setting
                 if (effectMargin == null)
                 {
-                    thickness = SystemParameters.WindowResizeBorderThickness;
+                    _themeResizeBorderThickness = SystemParameters.WindowResizeBorderThickness;
                 }
                 else
                 {
-                    thickness = new Thickness(
+                    _themeResizeBorderThickness = new Thickness(
                         effectMargin.Value.Left + SystemParameters.WindowResizeBorderThickness.Left,
                         effectMargin.Value.Top + SystemParameters.WindowResizeBorderThickness.Top,
                         effectMargin.Value.Right + SystemParameters.WindowResizeBorderThickness.Right,
                         effectMargin.Value.Bottom + SystemParameters.WindowResizeBorderThickness.Bottom);
                 }
 
-                windowChrome.ResizeBorderThickness = thickness;
+                // Apply the resize border thickness to the window chrome
+                SetResizeBorderThickness(windowChrome, _settings.KeepMaxResults);
             }
         }
 
@@ -582,7 +597,7 @@ await Application.Current.Dispatcher.InvokeAsync(() =>
                 {
                     AutoDropShadow(useDropShadowEffect);
                 }
-            }, DispatcherPriority.Normal);
+            }, DispatcherPriority.Render);
         }
 
         /// <summary>
@@ -596,7 +611,7 @@ await Application.Current.Dispatcher.InvokeAsync(() =>
                 var (backdropType, _) = GetActualValue();
 
                 SetBlurForWindow(GetCurrentTheme(), backdropType);
-            }, DispatcherPriority.Normal);
+            }, DispatcherPriority.Render);
         }
 
         /// <summary>
diff --git a/Flow.Launcher.Core/Resource/ThemeManager.cs b/Flow.Launcher.Core/Resource/ThemeManager.cs
deleted file mode 100644
index 3cbe8319ad3..00000000000
--- a/Flow.Launcher.Core/Resource/ThemeManager.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-﻿using System;
-using CommunityToolkit.Mvvm.DependencyInjection;
-
-namespace Flow.Launcher.Core.Resource
-{
-    [Obsolete("ThemeManager.Instance is obsolete. Use Ioc.Default.GetRequiredService<Theme>() instead.")]
-    public class ThemeManager
-    {
-        public static Theme Instance
-            => Ioc.Default.GetRequiredService<Theme>();
-    }
-}
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 63debfb474c..bd146f49a0b 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -68,11 +68,12 @@ public string Theme
             get => _theme;
             set
             {
-                if (value == _theme)
-                    return;
-                _theme = value;
-                OnPropertyChanged();
-                OnPropertyChanged(nameof(MaxResultsToShow));
+                if (value != _theme)
+                {
+                    _theme = value;
+                    OnPropertyChanged();
+                    OnPropertyChanged(nameof(MaxResultsToShow));
+                }
             }
         }
         public bool UseDropShadowEffect { get; set; } = true;
@@ -113,6 +114,33 @@ public string Theme
         public double? SettingWindowLeft { get; set; } = null;
         public System.Windows.WindowState SettingWindowState { get; set; } = WindowState.Normal;
 
+        bool _showPlaceholder { get; set; } = false;
+        public bool ShowPlaceholder
+        {
+            get => _showPlaceholder;
+            set
+            {
+                if (_showPlaceholder != value)
+                {
+                    _showPlaceholder = value;
+                    OnPropertyChanged();
+                }
+            }
+        }
+        string _placeholderText { get; set; } = string.Empty;
+        public string PlaceholderText
+        {
+            get => _placeholderText;
+            set
+            {
+                if (_placeholderText != value)
+                {
+                    _placeholderText = value;
+                    OnPropertyChanged();
+                }
+            }
+        }
+
         public int CustomExplorerIndex { get; set; } = 0;
 
         [JsonIgnore]
@@ -241,10 +269,26 @@ public SearchPrecisionScore QuerySearchPrecision
         /// </summary>
         public double CustomWindowTop { get; set; } = 0;
 
-        public bool KeepMaxResults { get; set; } = false;
+        /// <summary>
+        /// Fixed window size
+        /// </summary>
+        private bool _keepMaxResults { get; set; } = false;
+        public bool KeepMaxResults
+        {
+            get => _keepMaxResults;
+            set
+            {
+                if (_keepMaxResults != value)
+                {
+                    _keepMaxResults = value;
+                    OnPropertyChanged();
+                }
+            }
+        }
+
         public int MaxResultsToShow { get; set; } = 5;
-        public int ActivateTimes { get; set; }
 
+        public int ActivateTimes { get; set; }
 
         public ObservableCollection<CustomPluginHotkey> CustomPluginHotkeys { get; set; } = new ObservableCollection<CustomPluginHotkey>();
 
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 833c63ddff8..7b1d113fbdc 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -177,7 +177,6 @@ await Stopwatch.NormalAsync("|App.OnStartup|Startup cost", async () =>
                 HotKeyMapper.Initialize();
 
                 // main windows needs initialized before theme change because of blur settings
-                // TODO: Clean ThemeManager.Instance in future
                 Ioc.Default.GetRequiredService<Theme>().ChangeTheme();
 
                 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index f0454b49633..c170c44e422 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -39,7 +39,7 @@
     <system:String x:Key="GameMode">Game Mode</system:String>
     <system:String x:Key="GameModeToolTip">Suspend the use of Hotkeys.</system:String>
     <system:String x:Key="PositionReset">Position Reset</system:String>
-    <system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
+    <system:String x:Key="queryTextBoxPlaceholder">Type here to search</system:String>
 
     <!--  Setting General  -->
     <system:String x:Key="flowlauncher_settings">Settings</system:String>
@@ -72,8 +72,6 @@
     <system:String x:Key="LastQueryEmpty">Empty last Query</system:String>
     <system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
     <system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
-    <system:String x:Key="KeepMaxResults">Fixed Window Height</system:String>
-    <system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String>
     <system:String x:Key="maxShowResults">Maximum results shown</system:String>
     <system:String x:Key="maxShowResultsToolTip">You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.</system:String>
     <system:String x:Key="ignoreHotkeysOnFullscreen">Ignore hotkeys in fullscreen mode</system:String>
@@ -104,11 +102,6 @@
     <system:String x:Key="AlwaysPreview">Always Preview</system:String>
     <system:String x:Key="AlwaysPreviewToolTip">Always open preview panel when Flow activates. Press {0} to toggle preview.</system:String>
     <system:String x:Key="shadowEffectNotAllowed">Shadow effect is not allowed while current theme has blur effect enabled</system:String>
-    <system:String x:Key="BackdropType">Backdrop Type</system:String>
-    <system:String x:Key="BackdropTypesNone">None</system:String>
-    <system:String x:Key="BackdropTypesAcrylic">Acrylic</system:String>
-    <system:String x:Key="BackdropTypesMica">Mica</system:String>
-    <system:String x:Key="BackdropTypesMicaAlt">Mica Alt</system:String>
 
     <!--  Setting Plugin  -->
     <system:String x:Key="searchplugin">Search Plugin</system:String>
@@ -200,8 +193,19 @@
     <system:String x:Key="AnimationSpeedCustom">Custom</system:String>
     <system:String x:Key="Clock">Clock</system:String>
     <system:String x:Key="Date">Date</system:String>
+    <system:String x:Key="BackdropType">Backdrop Type</system:String>
+    <system:String x:Key="BackdropTypesNone">None</system:String>
+    <system:String x:Key="BackdropTypesAcrylic">Acrylic</system:String>
+    <system:String x:Key="BackdropTypesMica">Mica</system:String>
+    <system:String x:Key="BackdropTypesMicaAlt">Mica Alt</system:String>
     <system:String x:Key="TypeIsDarkToolTip">This theme supports two(light/dark) modes.</system:String>
     <system:String x:Key="TypeHasBlurToolTip">This theme supports Blur Transparent Background.</system:String>
+    <system:String x:Key="ShowPlaceholder">Show placeholder</system:String>
+    <system:String x:Key="ShowPlaceholderTip">Display placeholder when query is empty</system:String>
+    <system:String x:Key="PlaceholderText">Placeholder text</system:String>
+    <system:String x:Key="PlaceholderTextTip">Change placeholder text. Input empty will use: {0}</system:String>
+    <system:String x:Key="KeepMaxResults">Fixed Window Size</system:String>
+    <system:String x:Key="KeepMaxResultsToolTip">The window size is not adjustable by dragging.</system:String>
 
     <!--  Setting Hotkey  -->
     <system:String x:Key="hotkey">Hotkey</system:String>
diff --git a/Flow.Launcher/MainWindow.xaml b/Flow.Launcher/MainWindow.xaml
index 533819d1730..82ac63b7da6 100644
--- a/Flow.Launcher/MainWindow.xaml
+++ b/Flow.Launcher/MainWindow.xaml
@@ -218,6 +218,14 @@
             <Grid x:Name="QueryBoxArea">
                 <Border MinHeight="30" Style="{DynamicResource QueryBoxBgStyle}">
                     <Grid>
+                        <TextBox
+                            x:Name="QueryTextPlaceholderBox"
+                            Height="{Binding MainWindowHeight, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
+                            FontSize="{Binding QueryBoxFontSize, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
+                            IsEnabled="False"
+                            Style="{DynamicResource QuerySuggestionBoxStyle}"
+                            Text="{Binding PlaceholderText, Mode=OneWay}"
+                            Visibility="Collapsed" />
                         <TextBox
                             x:Name="QueryTextSuggestionBox"
                             Height="{Binding MainWindowHeight, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 0fd802f1e13..8f22d64b8d6 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -11,6 +11,7 @@
 using System.Windows.Media;
 using System.Windows.Media.Animation;
 using System.Windows.Shapes;
+using System.Windows.Shell;
 using System.Windows.Threading;
 using CommunityToolkit.Mvvm.DependencyInjection;
 using Flow.Launcher.Core.Plugin;
@@ -115,6 +116,10 @@ private async void OnLoaded(object sender, RoutedEventArgs _)
                 welcomeWindow.Show();
             }
 
+            // Initialize place holder
+            SetupPlaceholderText();
+            _viewModel.PlaceholderText = _settings.PlaceholderText;
+
             // Hide window if need
             UpdatePosition();
             if (_settings.HideOnStartup)
@@ -146,13 +151,17 @@ private async void OnLoaded(object sender, RoutedEventArgs _)
             UpdatePosition();
 
             // Refresh frame
-            await Ioc.Default.GetRequiredService<Theme>().RefreshFrameAsync();
+            await _theme.RefreshFrameAsync();
+
+            // Initialize resize mode after refreshing frame
+            SetupResizeMode();
 
             // Reset preview
             _viewModel.ResetPreview();
 
             // Since the default main window visibility is visible, so we need set focus during startup
             QueryTextBox.Focus();
+
             // Set the initial state of the QueryTextBoxCursorMovedToEnd property
             // Without this part, when shown for the first time, switching the context menu does not move the cursor to the end.
             _viewModel.QueryTextCursorMovedToEnd = false;
@@ -237,6 +246,15 @@ private async void OnLoaded(object sender, RoutedEventArgs _)
                     case nameof(Settings.WindowTop):
                         Top = _settings.WindowTop;
                         break;
+                    case nameof(Settings.ShowPlaceholder):
+                        SetupPlaceholderText();
+                        break;
+                    case nameof(Settings.PlaceholderText):
+                        _viewModel.PlaceholderText = _settings.PlaceholderText;
+                        break;
+                    case nameof(Settings.KeepMaxResults):
+                        SetupResizeMode();
+                        break;
                 }
             };
 
@@ -437,23 +455,25 @@ private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref b
             {
                 _initialWidth = (int)Width;
                 _initialHeight = (int)Height;
+
                 handled = true;
             }
             else if (msg == Win32Helper.WM_EXITSIZEMOVE)
             {
                 if (_initialHeight != (int)Height)
                 {
-                    var shadowMargin = 0;
-                    var (_, useDropShadowEffect) = _theme.GetActualValue();
-                    if (useDropShadowEffect)
-                    {
-                        shadowMargin = 32;
-                    }
-
                     if (!_settings.KeepMaxResults)
                     {
-                        var itemCount = (Height - (_settings.WindowHeightSize + 14) - shadowMargin) / _settings.ItemHeightSize;
+                        // Get shadow margin
+                        var shadowMargin = 0;
+                        var (_, useDropShadowEffect) = _theme.GetActualValue();
+                        if (useDropShadowEffect)
+                        {
+                            shadowMargin = 32;
+                        }
 
+                        // Calculate max results to show
+                        var itemCount = (Height - (_settings.WindowHeightSize + 14) - shadowMargin) / _settings.ItemHeightSize;
                         if (itemCount < 2)
                         {
                             _settings.MaxResultsToShow = 2;
@@ -465,11 +485,16 @@ private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref b
                     }
 
                     SizeToContent = SizeToContent.Height;
-                    _viewModel.MainWindowWidth = Width;
                 }
 
                 if (_initialWidth != (int)Width)
                 {
+                    if (!_settings.KeepMaxResults)
+                    {
+                        // Update width
+                        _viewModel.MainWindowWidth = Width;
+                    }
+
                     SizeToContent = SizeToContent.Height;
                 }
 
@@ -1028,6 +1053,56 @@ private void QueryTextBox_OnPreviewDragOver(object sender, DragEventArgs e)
 
         #endregion
 
+        #region Placeholder
+
+        private void SetupPlaceholderText()
+        {
+            if (_settings.ShowPlaceholder)
+            {
+                QueryTextBox.TextChanged += QueryTextBox_TextChanged;
+                QueryTextSuggestionBox.TextChanged += QueryTextSuggestionBox_TextChanged;
+                SetPlaceholderText();
+            }
+            else
+            {
+                QueryTextBox.TextChanged -= QueryTextBox_TextChanged;
+                QueryTextSuggestionBox.TextChanged -= QueryTextSuggestionBox_TextChanged;
+                QueryTextPlaceholderBox.Visibility = Visibility.Collapsed;
+            }
+        }
+
+        private void QueryTextBox_TextChanged(object sender, TextChangedEventArgs e)
+        {
+            SetPlaceholderText();
+        }
+
+        private void QueryTextSuggestionBox_TextChanged(object sender, TextChangedEventArgs e)
+        {
+            SetPlaceholderText();
+        }
+
+        private void SetPlaceholderText()
+        {
+            var queryText = QueryTextBox.Text;
+            var suggestionText = QueryTextSuggestionBox.Text;
+            QueryTextPlaceholderBox.Visibility = string.IsNullOrEmpty(queryText) && string.IsNullOrEmpty(suggestionText) ? Visibility.Visible : Visibility.Collapsed;
+        }
+
+        #endregion
+
+        #region Resize Mode
+
+        private void SetupResizeMode()
+        {
+            ResizeMode = _settings.KeepMaxResults ? ResizeMode.NoResize : ResizeMode.CanResize;
+            if (WindowChrome.GetWindowChrome(this) is WindowChrome windowChrome)
+            {
+                _theme.SetResizeBorderThickness(windowChrome, _settings.KeepMaxResults);
+            }
+        }
+
+        #endregion
+
         #region IDisposable
 
         protected virtual void Dispose(bool disposing)
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
index 647a9bcfca0..e35c978ede7 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs
@@ -259,6 +259,23 @@ public double SoundEffectVolume
         set => Settings.SoundVolume = value;
     }
 
+    public bool ShowPlaceholder
+    {
+        get => Settings.ShowPlaceholder;
+        set => Settings.ShowPlaceholder = value;
+    }
+
+    public string PlaceholderTextTip
+    {
+        get => string.Format(App.API.GetTranslation("PlaceholderTextTip"), App.API.GetTranslation("queryTextBoxPlaceholder"));
+    }
+
+    public string PlaceholderText
+    {
+        get => Settings.PlaceholderText;
+        set => Settings.PlaceholderText = value;
+    }
+
     public bool UseClock
     {
         get => Settings.UseClock;
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml
index 6142371469d..5e1ba24ea96 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml
@@ -30,6 +30,7 @@
         VirtualizingStackPanel.IsVirtualizing="True"
         VirtualizingStackPanel.ScrollUnit="Pixel">
         <StackPanel>
+
             <!--  Page title  -->
             <TextBlock
                 Margin="5 23 0 5"
@@ -38,6 +39,7 @@
                 Text="{DynamicResource appearance}"
                 TextAlignment="left"
                 Visibility="Collapsed" />
+
             <!--  Theme Preview and Editor  -->
             <Grid>
                 <Grid.Style>
@@ -68,6 +70,7 @@
                     <ColumnDefinition Width="8*" />
                     <ColumnDefinition MaxWidth="250" Style="{StaticResource SecondColumnStyle}" />
                 </Grid.ColumnDefinitions>
+
                 <!--  Theme Size Editor  -->
                 <Border
                     Grid.Column="1"
@@ -260,7 +263,8 @@
                         </StackPanel>
                     </ScrollViewer>
                 </Border>
-                <!--  Theme Preview  -->
+
+                <!--  Theme preview  -->
                 <Border
                     Grid.Column="0"
                     Background="{Binding PreviewBackground}"
@@ -477,7 +481,6 @@
                     <!--  ✅ 추가  -->
                 </cc:Card>
 
-
                 <!--  Drop shadow effect  -->
                 <cc:Card
                     Title="{DynamicResource queryWindowShadowEffect}"
@@ -496,18 +499,20 @@
                 Text="{DynamicResource browserMoreThemes}"
                 Uri="{Binding LinkThemeGallery}" />
 
-
-
-            <!--  Fixed Height  -->
+            <!--  Fixed size  -->
             <cc:CardGroup Margin="0 20 0 0">
                 <cc:Card
                     Title="{DynamicResource KeepMaxResults}"
-                    Icon="&#xe8fd;"
+                    Icon="&#xE744;"
                     Sub="{DynamicResource KeepMaxResultsToolTip}">
-                    <ui:ToggleSwitch IsOn="{Binding KeepMaxResults}" />
+                    <ui:ToggleSwitch
+                        IsOn="{Binding KeepMaxResults}"
+                        OffContent="{DynamicResource disable}"
+                        OnContent="{DynamicResource enable}" />
                 </cc:Card>
                 <cc:Card
                     Title="{DynamicResource maxShowResults}"
+                    Icon="&#xe8fd;"
                     Sub="{DynamicResource maxShowResultsToolTip}"
                     Visibility="{Binding KeepMaxResults, Converter={StaticResource BoolToVisibilityConverter}}">
                     <ComboBox
@@ -529,6 +534,29 @@
                     OnContent="{DynamicResource enable}" />
             </cc:Card>
 
+            <!--  Placeholder text  -->
+            <cc:CardGroup Margin="0 14 0 0">
+                <cc:Card
+                    Title="{DynamicResource ShowPlaceholder}"
+                    Icon="&#xE82F;"
+                    Sub="{DynamicResource ShowPlaceholderTip}">
+                    <ui:ToggleSwitch
+                        IsOn="{Binding ShowPlaceholder}"
+                        OffContent="{DynamicResource disable}"
+                        OnContent="{DynamicResource enable}" />
+                </cc:Card>
+
+                <cc:Card
+                    Title="{DynamicResource PlaceholderText}"
+                    Icon="&#xED59;"
+                    Sub="{Binding PlaceholderTextTip}">
+                    <TextBox
+                        MinWidth="150"
+                        Text="{Binding PlaceholderText}"
+                        TextWrapping="NoWrap" />
+                </cc:Card>
+            </cc:CardGroup>
+
             <!--  Time and date  -->
             <cc:CardGroup Margin="0 14 0 0">
                 <cc:Card Title="{DynamicResource Clock}" Icon="&#xec92;">
diff --git a/Flow.Launcher/Themes/Discord Dark.xaml b/Flow.Launcher/Themes/Discord Dark.xaml
index 9e39ee5bdaf..fb88da31353 100644
--- a/Flow.Launcher/Themes/Discord Dark.xaml	
+++ b/Flow.Launcher/Themes/Discord Dark.xaml	
@@ -28,7 +28,6 @@
         BasedOn="{StaticResource BaseQuerySuggestionBoxStyle}"
         TargetType="{x:Type TextBox}">
         <Setter Property="Foreground" Value="#72767d" />
-        <Setter Property="Background" Value="#36393f" />
         <Setter Property="Height" Value="42" />
         <Setter Property="FontSize" Value="24" />
         <Setter Property="Padding" Value="0,0,66,0" />
diff --git a/Flow.Launcher/Themes/League.xaml b/Flow.Launcher/Themes/League.xaml
index f1c8ba19222..ffecf3fcbb4 100644
--- a/Flow.Launcher/Themes/League.xaml
+++ b/Flow.Launcher/Themes/League.xaml
@@ -24,7 +24,6 @@
         x:Key="QuerySuggestionBoxStyle"
         BasedOn="{StaticResource BaseQuerySuggestionBoxStyle}"
         TargetType="{x:Type TextBox}">
-        <Setter Property="Background" Value="#161614" />
         <Setter Property="Foreground" Value="#a09b8c" />
         <Setter Property="Padding" Value="0,0,66,0" />
         <Setter Property="Height" Value="42" />
diff --git a/Flow.Launcher/Themes/Pink.xaml b/Flow.Launcher/Themes/Pink.xaml
index d7de4e2467d..5bbfa26d6e8 100644
--- a/Flow.Launcher/Themes/Pink.xaml
+++ b/Flow.Launcher/Themes/Pink.xaml
@@ -22,7 +22,6 @@
         x:Key="QuerySuggestionBoxStyle"
         BasedOn="{StaticResource BaseQuerySuggestionBoxStyle}"
         TargetType="{x:Type TextBox}">
-        <Setter Property="Background" Value="#1f1d1f" />
         <Setter Property="Foreground" Value="#71114b" />
     </Style>
 
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index c69fc4484a2..56de70b4785 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -584,7 +584,7 @@ public string QueryText
         [RelayCommand]
         private void IncreaseWidth()
         {
-            Settings.WindowSize += 100;
+            MainWindowWidth += 100;
             Settings.WindowLeft -= 50;
             OnPropertyChanged(nameof(MainWindowWidth));
         }
@@ -592,14 +592,14 @@ private void IncreaseWidth()
         [RelayCommand]
         private void DecreaseWidth()
         {
-            if (MainWindowWidth - 100 < 400 || Settings.WindowSize == 400)
+            if (MainWindowWidth - 100 < 400 || MainWindowWidth == 400)
             {
-                Settings.WindowSize = 400;
+                MainWindowWidth = 400;
             }
             else
             {
+                MainWindowWidth -= 100;
                 Settings.WindowLeft += 50;
-                Settings.WindowSize -= 100;
             }
 
             OnPropertyChanged(nameof(MainWindowWidth));
@@ -765,6 +765,17 @@ private ResultsViewModel SelectedResults
         public double ClockPanelOpacity { get; set; } = 1;
         public double SearchIconOpacity { get; set; } = 1;
 
+        private string _placeholderText;
+        public string PlaceholderText
+        {
+            get => string.IsNullOrEmpty(_placeholderText) ? App.API.GetTranslation("queryTextBoxPlaceholder") : _placeholderText;
+            set
+            {
+                _placeholderText = value;
+                OnPropertyChanged();
+            }
+        }
+
         public double MainWindowWidth
         {
             get => Settings.WindowSize;


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>Flow.Launcher.Core/Resource/Theme.cs (1)</summary><blockquote>

`546-570`: **Fixed minor typo in method name.**

The method name contains a typo: "Boarder" should be "Border". This appears to be consistent with the existing codebase and isn't introduced by this PR, but it might be worth correcting in a future update.

```diff
-private void SetResizeBoarderThickness(Thickness? effectMargin)
+private void SetResizeBorderThickness(Thickness? effectMargin)
```

Also applies to the method name on line 534.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 697fb7218e0467b01aeeb3b546181fb3d4091e92 and c74dd200886b809c709f63e13a83e52098b93b1f.

</details>

<details>
<summary>📒 Files selected for processing (9)</summary>

* `Flow.Launcher.Core/Resource/Theme.cs` (8 hunks)
* `Flow.Launcher.Core/Resource/ThemeManager.cs` (0 hunks)
* `Flow.Launcher.Infrastructure/UserSettings/Settings.cs` (1 hunks)
* `Flow.Launcher/App.xaml.cs` (0 hunks)
* `Flow.Launcher/Languages/en.xaml` (2 hunks)
* `Flow.Launcher/MainWindow.xaml` (1 hunks)
* `Flow.Launcher/MainWindow.xaml.cs` (5 hunks)
* `Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs` (1 hunks)
* `Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml` (5 hunks)

</details>

<details>
<summary>💤 Files with no reviewable changes (2)</summary>

* Flow.Launcher/App.xaml.cs
* Flow.Launcher.Core/Resource/ThemeManager.cs

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Definitions (1)</summary>

<details>
<summary>Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs (1)</summary><blockquote>

<details>
<summary>Flow.Launcher.Infrastructure/UserSettings/Settings.cs (1)</summary>

* `Settings` (16-413)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (2)</summary>

* GitHub Check: gitStream workflow automation
* GitHub Check: gitStream.cm

</details>

<details>
<summary>🔇 Additional comments (24)</summary><blockquote>

<details>
<summary>Flow.Launcher/MainWindow.xaml (1)</summary>

`221-228`: **Well-structured implementation of placeholder text functionality**

The new TextBox implementation provides a clean way to show placeholder text when the query box is empty. The control is properly configured with:
- Appropriate binding to maintain consistent styling with the main query box
- IsEnabled="False" to ensure it's just a visual element with no input capability
- Visibility set to "Collapsed" by default, which will be toggled based on the ShowPlaceholder setting

</details>
<details>
<summary>Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs (2)</summary>

`262-266`: **Clean implementation of ResizeWindow property**

The property is correctly implemented with a simple getter and setter that interacts with the Settings object. This provides a clean way for the UI to bind to this setting.

---

`268-272`: **Good implementation of ShowPlaceholder property**

The property properly exposes the ShowPlaceholder setting from the Settings object, enabling the UI to toggle the placeholder text visibility.

</details>
<details>
<summary>Flow.Launcher.Infrastructure/UserSettings/Settings.cs (2)</summary>

`116-125`: **Good implementation of ResizeWindow setting with default value**

The ResizeWindow property is correctly implemented with:
- Private backing field initialized to true (sensible default to enable window resizing)
- Property change notification via OnPropertyChanged()
- Clean getter and setter implementation

---

`127-136`: **Well-implemented ShowPlaceholder setting with appropriate default**

The ShowPlaceholder property is well-structured with:
- Private backing field initialized to false (logical default - don't show placeholder until user enables it)
- Property change notification properly implemented
- Clean property implementation

</details>
<details>
<summary>Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml (4)</summary>

`501-511`: **Good UI implementation for ResizeWindow setting**

The Card element for the ResizeWindow setting is well-structured with:
- Appropriate title and icon
- Tooltip providing context via the "ResizeWindowTip" resource
- ToggleSwitch properly bound to the ResizeWindow property
- Consistent UI styling with other settings cards

---

`544-554`: **Well-structured UI implementation for PlaceholderText setting**

The Card element for the PlaceholderText setting is properly implemented with:
- Clear title and appropriate icon
- Tooltip providing context via the "PlaceholderTextTip" resource
- ToggleSwitch correctly bound to the ShowPlaceholder property
- Consistent UI styling with other settings cards

---

`513-514`: **Minor comment improvement for consistency**

Updated the comment to use lowercase "height" for consistency in the comments formatting throughout the file.

---

`266-267`: **Minor comment improvement for consistency**

Updated the comment to use lowercase "preview" for consistency in the comments formatting throughout the file.

</details>
<details>
<summary>Flow.Launcher/MainWindow.xaml.cs (6)</summary>

`14-14`: **Added System.Windows.Shell namespace.**

This is a necessary addition to support the WindowChrome functionality used for the window resizing feature.

---

`119-121`: **Good placement for placeholder text initialization.**

The placeholder text setup is correctly initialized after the control elements are created but before the window is shown to the user.

---

`153-157`: **Good sequencing of resize mode initialization.**

Setting up the resize mode after theme frame refresh ensures that any theme-related border settings are applied correctly before configuring the resize behavior.

---

`248-253`: **Proper property change notification handling.**

The code correctly subscribes to property changes for the new settings and calls the appropriate setup methods when those settings change, enabling dynamic UI updates.

---

`1045-1080`: **Well-structured placeholder text implementation.**

The placeholder text implementation follows a clean pattern:
1. The setup method adds/removes event handlers based on settings
2. Event handlers update the placeholder visibility when text changes
3. The visibility logic correctly checks both text boxes

---

`1082-1093`: **Well-implemented resize mode functionality.**

The resize mode implementation correctly:
1. Sets the window's ResizeMode property based on user settings
2. Updates the window chrome's border thickness using the theme object
3. Accesses the theme functionality through the appropriate method call

</details>
<details>
<summary>Flow.Launcher.Core/Resource/Theme.cs (6)</summary>

`27-27`: **Improved encapsulation by restricting the BlurEnabled property setter.**

Changing the setter from public to private ensures that this property can only be modified within the Theme class, preventing unexpected changes from external code.

---

`45-46`: **Added private field to store theme resize border thickness.**

This field appropriately stores the theme-specific border thickness that's needed for the window resizing functionality.

---

`468-469`: **Generalized property references.**

Replacing Border-specific property references with more general UIElement and FrameworkElement references broadens their application scope and is more appropriate for the intended usage.



Also applies to: 483-484

---

`513-514`: **Consistent property reference updates.**

These property reference updates maintain consistency with the earlier changes and follow the same pattern of using more general property accessors.



Also applies to: 518-519

---

`534-544`: **New method for configuring WindowChrome resize behavior.**

This method cleanly implements the functionality to toggle the resize border thickness based on the user's preference. The conditional logic ensures that resize borders are only applied when the feature is enabled.

---

`600-601`: **Changed dispatcher priority to improve UI responsiveness.**

Changing the DispatcherPriority from Normal to Render may help ensure that UI updates related to theme changes happen at the most appropriate time in the rendering pipeline.



Also applies to: 614-615

</details>
<details>
<summary>Flow.Launcher/Languages/en.xaml (3)</summary>

`42-42`: **Added placeholder text resource.**

The "Type here to search" message provides clear guidance to users about the purpose of the search box.

---

`198-202`: **Added backdrop type resources.**

These resources provide localized strings for the different backdrop type options in the UI.

---

`205-208`: **Added resources for new UI features.**

These well-named resources provide clear and descriptive text for the placeholder and resize window features in the settings UI, including helpful tooltips that explain their functionality.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-29T06:27:15Z
user: login: copilot-pull-request-reviewer[bot]
body: ## Pull Request Overview

This pull request introduces support for displaying placeholder text when the query is empty and enables users to toggle window resize mode. The changes include adding new settings properties for placeholder text and resize behavior, updating the main window logic to initialize these features, removing an obsolete ThemeManager, and enhancing theme-related logic in the application.

### Reviewed Changes

Copilot reviewed 6 out of 9 changed files in this pull request and generated no comments.

<details>
<summary>Show a summary per file</summary>

| File | Description |
| ---- | ----------- |
| Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs | Added properties to expose ResizeWindow and ShowPlaceholder settings. |
| Flow.Launcher/MainWindow.xaml.cs | Integrated initialization for placeholder text and resize mode with new setup methods. |
| Flow.Launcher/App.xaml.cs | Removed an obsolete comment regarding ThemeManager usage. |
| Flow.Launcher.Infrastructure/UserSettings/Settings.cs | Introduced backing fields and properties for ResizeWindow and ShowPlaceholder. |
| Flow.Launcher.Core/Resource/ThemeManager.cs | Removed obsolete ThemeManager in favor of using DI for Theme. |
| Flow.Launcher.Core/Resource/Theme.cs | Updated DropShadow effect settings and added methods for adjusting the resize border thickness. |
</details>


<details>
<summary>Files not reviewed (3)</summary>

* **Flow.Launcher/Languages/en.xaml**: Language not supported
* **Flow.Launcher/MainWindow.xaml**: Language not supported
* **Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml**: Language not supported
</details>

<details>
<summary>Comments suppressed due to low confidence (2)</summary>

**Flow.Launcher.Core/Resource/Theme.cs:534**
* The method name 'SetResizeBoarderThickness' contains a misspelling; consider renaming it to 'SetResizeBorderThickness' for clarity.
```
public void SetResizeBoarderThickness(WindowChrome windowChrome, bool resizeWindow)
```
**Flow.Launcher.Core/Resource/Theme.cs:548**
* The private method 'SetResizeBoarderThickness' has a typographical error in its name; it should be renamed to 'SetResizeBorderThickness' to match standard naming conventions.
```
private void SetResizeBoarderThickness(Thickness? effectMargin)
```
</details>


state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-29T06:28:35Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (4)</summary><blockquote>

<details>
<summary>Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml (2)</summary><blockquote>

`267-267`: **Improved comment format consistency.**

Minor improvement to comment format for better consistency.

---

`514-514`: **Improved comment format consistency.**

Minor improvement to comment format for better consistency.

</blockquote></details>
<details>
<summary>Flow.Launcher/MainWindow.xaml.cs (2)</summary><blockquote>

`1049-1084`: **Well-structured placeholder text implementation.**

The placeholder region provides a clean, organized implementation for the placeholder text functionality. Key observations:

1. Good separation of concerns with distinct methods for setup, event handling, and visibility logic
2. Proper event subscription/unsubscription based on settings
3. Clear visibility logic checking both text inputs

Consider adding null checks for UI elements to prevent potential NullReferenceExceptions if called before UI initialization:

```diff
private void SetPlaceholderText()
{
    if (QueryTextBox == null || QueryTextSuggestionBox == null || QueryTextPlaceholderBox == null)
        return;
        
    var queryText = QueryTextBox.Text;
    var suggestionText = QueryTextSuggestionBox.Text;
    QueryTextPlaceholderBox.Visibility = string.IsNullOrEmpty(queryText) && string.IsNullOrEmpty(suggestionText) ? Visibility.Visible : Visibility.Collapsed;
}
```

---

`1086-1097`: **Clean resize mode implementation with minor spelling inconsistency.**

The resize mode implementation is concise and effectively toggles the window's resize capability. However, there's a spelling inconsistency in the method name being called from Theme.cs - `SetResizeBoarderThickness` should be "Border" not "Boarder".

This is consistent with the misspelling in the Theme class itself, but it would be good to correct this spelling across the codebase in a future update.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between c74dd200886b809c709f63e13a83e52098b93b1f and 84f2686710e937621ecdc7a864ad944fa4f89fe8.

</details>

<details>
<summary>📒 Files selected for processing (7)</summary>

* `Flow.Launcher.Infrastructure/UserSettings/Settings.cs` (1 hunks)
* `Flow.Launcher/Languages/en.xaml` (2 hunks)
* `Flow.Launcher/MainWindow.xaml` (1 hunks)
* `Flow.Launcher/MainWindow.xaml.cs` (5 hunks)
* `Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs` (1 hunks)
* `Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml` (6 hunks)
* `Flow.Launcher/ViewModel/MainViewModel.cs` (1 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (2)</summary>

* Flow.Launcher/MainWindow.xaml
* Flow.Launcher/Languages/en.xaml

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Definitions (3)</summary>

<details>
<summary>Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs (1)</summary><blockquote>

<details>
<summary>Flow.Launcher.Infrastructure/UserSettings/Settings.cs (1)</summary>

* `Settings` (16-423)

</details>

</blockquote></details>
<details>
<summary>Flow.Launcher/ViewModel/MainViewModel.cs (2)</summary><blockquote>

<details>
<summary>Flow.Launcher/App.xaml.cs (2)</summary>

* `App` (28-338)
* `App` (50-114)

</details>
<details>
<summary>Flow.Launcher/PublicAPIInstance.cs (1)</summary>

* `GetTranslation` (158-158)

</details>

</blockquote></details>
<details>
<summary>Flow.Launcher/MainWindow.xaml.cs (2)</summary><blockquote>

<details>
<summary>Flow.Launcher.Infrastructure/UserSettings/Settings.cs (1)</summary>

* `Settings` (16-423)

</details>
<details>
<summary>Flow.Launcher.Core/Resource/Theme.cs (2)</summary>

* `SetResizeBoarderThickness` (534-544)
* `SetResizeBoarderThickness` (548-570)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (2)</summary>

* GitHub Check: gitStream workflow automation
* GitHub Check: gitStream.cm

</details>

<details>
<summary>🔇 Additional comments (11)</summary><blockquote>

<details>
<summary>Flow.Launcher/ViewModel/MainViewModel.cs (1)</summary>

`768-784`: **Implementation of PlaceholderText looks good.**

The property correctly handles the null/empty case by providing a localized default value, and properly implements property change notification. This approach ensures the UI will always have appropriate placeholder text to display.

</details>
<details>
<summary>Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs (1)</summary>

`262-278`: **Well-implemented settings properties.**

The three new properties (ResizeWindow, ShowPlaceholder, and PlaceholderText) follow the established pattern in this class, correctly delegating to the corresponding properties in the Settings object. They are logically grouped together, making the code easy to understand and maintain.

</details>
<details>
<summary>Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml (2)</summary>

`502-512`: **Good implementation of the window resize option UI.**

The card for the "Resize Window" setting follows the established pattern with appropriate icon, tooltip, and binding to the view model. The UI element is positioned logically in the settings flow.

---

`546-566`: **Well-structured placeholder text settings UI.**

The card group for placeholder text settings provides a clean interface with both the toggle option and text input field. The implementation follows the established UI patterns with proper bindings, informative tooltips, and consistent styling.

</details>
<details>
<summary>Flow.Launcher.Infrastructure/UserSettings/Settings.cs (1)</summary>

`116-146`: **Well-implemented settings properties with appropriate defaults.**

The three new properties (ResizeWindow, ShowPlaceholder, and PlaceholderText) follow the established pattern in the Settings class with private backing fields and proper property change notification. The default values are sensible: window resizing is enabled by default while the placeholder feature is disabled by default with an empty placeholder text.

</details>
<details>
<summary>Flow.Launcher/MainWindow.xaml.cs (6)</summary>

`14-14`: **Appropriate addition of System.Windows.Shell namespace.**

The added import is necessary for accessing the WindowChrome class, which is used in the resize mode implementation. Good practice to only add the namespaces that are needed.

---

`119-121`: **Good initialization sequence for placeholder text.**

The implementation properly initializes the placeholder text feature during window loading. The code sets up event handlers and updates the UI with the configured placeholder text from settings.

---

`156-157`: **Proper sequencing of resize mode setup.**

Setting up the resize mode after refreshing the theme frame is the correct approach, as it ensures that the theme's properties are fully initialized before configuring the resize behavior.

---

`249-251`: **Appropriate property change handler for ShowPlaceholder.**

The code correctly responds to changes in the ShowPlaceholder setting by calling SetupPlaceholderText(), which will add or remove the necessary event handlers.

---

`252-254`: **Synchronizing PlaceholderText with ViewModel.**

The implementation properly updates the ViewModel's PlaceholderText property when the setting changes, maintaining the data binding consistency.

---

`255-257`: **Responsive window resize mode update.**

The property change handler correctly calls SetupResizeMode() when the ResizeWindow setting changes, allowing for dynamic updates to the window's resize behavior.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-29T07:11:41Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>Flow.Launcher/MainWindow.xaml.cs (1)</summary><blockquote>

`1093-1104`: **Typo in method name referenced.**

The implementation of the resize mode functionality is good, but there's a spelling error in the method name referenced.


In `_theme.SetResizeBoarderThickness()`, "Boarder" should be "Border":

```diff
-        _theme.SetResizeBoarderThickness(windowChrome, _settings.KeepMaxResults);
+        _theme.SetResizeBorderThickness(windowChrome, _settings.KeepMaxResults);
```

This should be fixed here and in the Theme class where the method is defined.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 91c5e84ca0f89d5ab0714ddcae86541c51b89778 and 10d43875ea02fd0559b30be5cb4a7414f300eca4.

</details>

<details>
<summary>📒 Files selected for processing (2)</summary>

* `Flow.Launcher/MainWindow.xaml` (2 hunks)
* `Flow.Launcher/MainWindow.xaml.cs` (7 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* Flow.Launcher/MainWindow.xaml

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (1)</summary>

* GitHub Check: gitStream.cm

</details>

<details>
<summary>🔇 Additional comments (7)</summary><blockquote>

<details>
<summary>Flow.Launcher/MainWindow.xaml.cs (7)</summary>

`14-14`: **Appropriate import for window chrome functionality.**

The addition of the `System.Windows.Shell` namespace is necessary for accessing the `WindowChrome` class used in the new resize mode functionality.

---

`119-122`: **Good initialization of placeholder text functionality.**

The placeholder setup is appropriately placed in the window's loading sequence, ensuring it's initialized before the user interacts with the interface.

---

`156-157`: **Proper sequencing of resize mode initialization.**

The resize mode is correctly set up after the theme frame is refreshed, ensuring all visual elements are properly initialized before applying resize behavior.

---

`249-257`: **Appropriate property change handlers for new settings.**

The addition of these property change handlers ensures the UI correctly responds when the user changes placeholder or resize mode settings. This follows good reactive programming practices.

---

`467-476`: **Good handling of shadow margins in size calculations.**

The code now accounts for drop shadow effects when calculating the available space, which will provide more consistent UI sizing across different theme configurations.

---

`492-496`: **Proper conditional width updating.**

The code correctly updates the window width in the view model only when resizing is enabled, maintaining consistency with the application's settings.

---

`1056-1091`: **Well-implemented placeholder text functionality.**

The placeholder implementation follows good practices:
1. Properly manages event subscriptions based on settings
2. Uses a clean separation of concerns with dedicated methods
3. Correctly determines visibility based on the state of both text boxes

This will improve user experience by providing guidance when the input is empty.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-29T07:41:25Z
user: login: onesounds
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-03-29T08:07:10Z
user: login: onesounds
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-03-29T08:36:48Z
user: login: copilot-pull-request-reviewer[bot]
body: ## Pull Request Overview

This PR introduces placeholder text functionality when the query is empty and enables toggling the fixed window size, along with updating related settings and UI behavior.  
- Updates width adjustment commands in the main view model.  
- Adds placeholder text properties and event handlers in both view model and view layers.  
- Refactors settings management and theme resource methods while removing an obsolete ThemeManager.

### Reviewed Changes

Copilot reviewed 7 out of 13 changed files in this pull request and generated 1 comment.

<details>
<summary>Show a summary per file</summary>

| File | Description |
| ---- | ----------- |
| Flow.Launcher/ViewModel/MainViewModel.cs | Replaces direct Settings.WindowSize updates with MainWindowWidth and adds placeholder text support. |
| Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs | Adds properties to control and display placeholder text options and tips. |
| Flow.Launcher/MainWindow.xaml.cs | Integrates placeholder text setup, updates theme refresh, and initializes window resize mode. |
| Flow.Launcher/App.xaml.cs | Removes an obsolete comment and retains theme change behavior. |
| Flow.Launcher.Infrastructure/UserSettings/Settings.cs | Introduces properties for placeholder text and refactors the KeepMaxResults setting with proper change notifications. |
| Flow.Launcher.Core/Resource/ThemeManager.cs | Removes the obsolete ThemeManager. |
| Flow.Launcher.Core/Resource/Theme.cs | Refines drop shadow effect implementation and adds a new method for setting the resize border thickness. |
</details>


<details>
<summary>Files not reviewed (6)</summary>

* **Flow.Launcher/Languages/en.xaml**: Language not supported
* **Flow.Launcher/MainWindow.xaml**: Language not supported
* **Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml**: Language not supported
* **Flow.Launcher/Themes/Discord Dark.xaml**: Language not supported
* **Flow.Launcher/Themes/League.xaml**: Language not supported
* **Flow.Launcher/Themes/Pink.xaml**: Language not supported
</details>



state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-29T08:37:17Z
user: login: copilot-pull-request-reviewer[bot]
body: ## Pull Request Overview

This PR adds support for displaying placeholder text when the query is empty and enables toggling the window resize mode based on user settings. Key changes include updating the window width logic in the main view model, adding new properties and initialization for placeholder text in multiple view models and the main window, and refactoring theme management to update resize border thickness.

### Reviewed Changes

Copilot reviewed 7 out of 13 changed files in this pull request and generated no comments.

<details>
<summary>Show a summary per file</summary>

| File                                                           | Description                                                                                     |
| -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
| Flow.Launcher/ViewModel/MainViewModel.cs                       | Updates window width handling and adds a new PlaceholderText property.                          |
| Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs | Introduces ShowPlaceholder and PlaceholderText properties, and provides a translated tip.         |
| Flow.Launcher/MainWindow.xaml.cs                               | Initializes placeholder text and sets up event handlers; adds support for toggling resize mode.  |
| Flow.Launcher/App.xaml.cs                                       | Minor cleanup by removing a TODO comment.                                                      |
| Flow.Launcher.Infrastructure/UserSettings/Settings.cs          | Modifies property setters for ShowPlaceholder, PlaceholderText, and KeepMaxResults.              |
| Flow.Launcher.Core/Resource/ThemeManager.cs                     | Removes obsolete ThemeManager class.                                                            |
| Flow.Launcher.Core/Resource/Theme.cs                            | Updates drop shadow effect and border margin properties, and adds logic to update resize border thickness.  |
</details>


<details>
<summary>Files not reviewed (6)</summary>

* **Flow.Launcher/Languages/en.xaml**: Language not supported
* **Flow.Launcher/MainWindow.xaml**: Language not supported
* **Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml**: Language not supported
* **Flow.Launcher/Themes/Discord Dark.xaml**: Language not supported
* **Flow.Launcher/Themes/League.xaml**: Language not supported
* **Flow.Launcher/Themes/Pink.xaml**: Language not supported
</details>

<details>
<summary>Comments suppressed due to low confidence (1)</summary>

**Flow.Launcher.Core/Resource/Theme.cs:548**
* The method name 'SetResizeBoarderThickness' contains a typo ('Boarder' instead of 'Border'). Consider renaming it to 'SetResizeBorderThickness' for clarity and consistency.
```
private void SetResizeBoarderThickness(Thickness? effectMargin)
```
</details>


state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-29T08:41:44Z
user: login: onesounds
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-29T08:42:14Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 1**

<details>
<summary>🧹 Nitpick comments (3)</summary><blockquote>

<details>
<summary>Flow.Launcher/MainWindow.xaml.cs (3)</summary><blockquote>

`468-473`: **Consider documenting the shadow margin magic number.**

While the shadow margin calculation is correct, the value `32` appears to be a magic number without explanation.

```diff
// Get shadow margin
var shadowMargin = 0;
var (_, useDropShadowEffect) = _theme.GetActualValue();
if (useDropShadowEffect)
{
-    shadowMargin = 32;
+    // Shadow margin of 32 accounts for the drop shadow effect's visual overflow
+    shadowMargin = 32;
}
```

---

`475-476`: **Document the formula for calculating max results.**

The calculation formula includes magic numbers that would benefit from clarification for future maintainers.

```diff
// Calculate max results to show
-var itemCount = (Height - (_settings.WindowHeightSize + 14) - shadowMargin) / _settings.ItemHeightSize;
+// Height - (window header height + padding(14px)) - shadow margin divided by individual item height
+var itemCount = (Height - (_settings.WindowHeightSize + 14) - shadowMargin) / _settings.ItemHeightSize;
```

---

`1056-1091`: **Consider using IsNullOrWhiteSpace for better placeholder behavior.**

The placeholder implementation is well-structured, but consider using `string.IsNullOrWhiteSpace()` instead of `string.IsNullOrEmpty()` to handle cases where the text boxes contain only whitespace.

```diff
private void SetPlaceholderText()
{
    var queryText = QueryTextBox.Text;
    var suggestionText = QueryTextSuggestionBox.Text;
-    QueryTextPlaceholderBox.Visibility = string.IsNullOrEmpty(queryText) && string.IsNullOrEmpty(suggestionText) ? Visibility.Visible : Visibility.Collapsed;
+    QueryTextPlaceholderBox.Visibility = string.IsNullOrWhiteSpace(queryText) && string.IsNullOrWhiteSpace(suggestionText) ? Visibility.Visible : Visibility.Collapsed;
}
```

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 356f229fd44e65f0975ca3f700df3e96b4a87a5c and cd01260ee91686e0ae2ca051c834bbe2a7c6e5f6.

</details>

<details>
<summary>📒 Files selected for processing (2)</summary>

* `Flow.Launcher.Core/Resource/Theme.cs` (8 hunks)
* `Flow.Launcher/MainWindow.xaml.cs` (7 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* Flow.Launcher.Core/Resource/Theme.cs

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Definitions (1)</summary>

<details>
<summary>Flow.Launcher/MainWindow.xaml.cs (4)</summary><blockquote>

<details>
<summary>Flow.Launcher/ViewModel/MainViewModel.cs (1)</summary>

* `ResetPreview` (980-995)

</details>
<details>
<summary>Flow.Launcher.Infrastructure/UserSettings/Settings.cs (1)</summary>

* `Settings` (16-435)

</details>
<details>
<summary>Flow.Launcher.Infrastructure/Win32Helper.cs (1)</summary>

* `Win32Helper` (19-491)

</details>
<details>
<summary>Flow.Launcher.Core/Resource/Theme.cs (1)</summary>

* `SetResizeBorderThickness` (534-544)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>🔇 Additional comments (6)</summary><blockquote>

<details>
<summary>Flow.Launcher/MainWindow.xaml.cs (6)</summary>

`14-14`: **Import added for window chrome customization.**

The addition of the `System.Windows.Shell` namespace is necessary for utilizing the `WindowChrome` class in the resize mode functionality.

---

`119-122`: **Good initialization of placeholder text functionality.**

The placeholder functionality is correctly initialized during window loading, ensuring it's set up before the UI is shown to users. The view model is properly updated with the placeholder text from settings.

---

`154-158`: **Proper sequencing of resize mode setup after theme refresh.**

Setting up the resize mode after refreshing the theme frame ensures that all visual elements are properly initialized before configuring resizing behavior.

---

`249-257`: **Well-structured property change handlers for new settings.**

The added handlers react appropriately to changes in the relevant settings, ensuring UI synchronization with user preferences for placeholders and window resizing.

---

`492-496`: **Width update conditional is properly implemented.**

The width update properly respects the `KeepMaxResults` setting, only updating the view model's width property when resizing is allowed.

---

`1093-1104`: **Clean implementation of resize mode toggle.**

The resize mode functionality is well-implemented, appropriately setting the window's `ResizeMode` property and border thickness based on user settings. The null check on `WindowChrome.GetWindowChrome(this)` is a good defensive programming practice.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-29T08:44:13Z
user: login: onesounds
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-10T22:26:46Z
user: login: Jack251970
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-10T23:38:21Z
user: login: Jack251970
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-11T02:28:24Z

Review comments:
diff_hunk: @@ -529,28 +531,41 @@ public void RemoveDropShadowEffectFromCurrentTheme()
             UpdateResourceDictionary(dict);
         }
 
+        public void SetResizeBoarderThickness(WindowChrome windowChrome, bool fixedWindowSize)
path: Flow.Launcher.Core/Resource/Theme.cs
user: login: Copilot
body: The method name 'SetResizeBoarderThickness' contains a spelling mistake ('Boarder' should be 'Border'). Consider renaming it for clarity.
```suggestion
        public void SetResizeBorderThickness(WindowChrome windowChrome, bool fixedWindowSize)
```
created_at: 2025-03-29T08:37:16Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1028,6 +1053,56 @@ private void QueryTextBox_OnPreviewDragOver(object sender, DragEventArgs e)
 
         #endregion
 
+        #region Placeholder
+
+        private void SetupPlaceholderText()
+        {
+            if (_settings.ShowPlaceholder)
+            {
+                QueryTextBox.TextChanged += QueryTextBox_TextChanged;
+                QueryTextSuggestionBox.TextChanged += QueryTextSuggestionBox_TextChanged;
+                SetPlaceholderText();
+            }
+            else
+            {
+                QueryTextBox.TextChanged -= QueryTextBox_TextChanged;
+                QueryTextSuggestionBox.TextChanged -= QueryTextSuggestionBox_TextChanged;
+                QueryTextPlaceholderBox.Visibility = Visibility.Collapsed;
+            }
+        }
path: Flow.Launcher/MainWindow.xaml.cs
user: login: coderabbitai[bot]
body: _💡 Verification agent_

<details>
<summary>🧩 Analysis chain</summary>

**Consider event handler cleanup in Dispose method.**

Event handlers are correctly added/removed based on settings, but consider also ensuring these handlers are detached in the `Dispose` method to prevent potential memory leaks.

---

🏁 Script executed:

```shell
#!/bin/bash
# Check if event handlers are properly cleaned up in Dispose method

echo "Checking MainWindow.xaml.cs for event handler cleanup in Dispose method..."
rg -A 5 -B 5 "Dispose\(bool disposing\)" Flow.Launcher/MainWindow.xaml.cs
```

Length of output: 708

---



</details>

**Event Handler Cleanup in Dispose Method Needed**

The setup in `SetupPlaceholderText` properly adds and removes the event handlers based on settings, but as verified, the `Dispose(bool disposing)` method does not currently include logic to detach these handlers. This omission could lead to memory leaks if the handlers remain attached even after disposal.

- **Action Item:** Update the `Dispose(bool disposing)` method (in `Flow.Launcher/MainWindow.xaml.cs`) to remove the attached event handlers (e.g., detach `QueryTextBox_TextChanged` and `QueryTextSuggestionBox_TextChanged`) when `disposing` is true.

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-03-29T08:44:12Z
author_association: CONTRIBUTOR
diff_hunk: @@ -39,7 +39,7 @@
     <system:String x:Key="GameMode">Game Mode</system:String>
     <system:String x:Key="GameModeToolTip">Suspend the use of Hotkeys.</system:String>
     <system:String x:Key="PositionReset">Position Reset</system:String>
-    <system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
path: Flow.Launcher/Languages/en.xaml
user: login: onesounds
body: @Jack251970 Man~!
created_at: 2025-04-10T22:26:45Z
author_association: CONTRIBUTOR
diff_hunk: @@ -39,7 +39,7 @@
     <system:String x:Key="GameMode">Game Mode</system:String>
     <system:String x:Key="GameModeToolTip">Suspend the use of Hotkeys.</system:String>
     <system:String x:Key="PositionReset">Position Reset</system:String>
-    <system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
path: Flow.Launcher/Languages/en.xaml
user: login: Jack251970
body: oh no
created_at: 2025-04-10T23:38:20Z
author_association: MEMBER
diff_hunk: @@ -39,7 +39,7 @@
     <system:String x:Key="GameMode">Game Mode</system:String>
     <system:String x:Key="GameModeToolTip">Suspend the use of Hotkeys.</system:String>
     <system:String x:Key="PositionReset">Position Reset</system:String>
-    <system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
path: Flow.Launcher/Languages/en.xaml
user: login: Jack251970
body: Please see #3448
created_at: 2025-04-11T02:28:24Z
author_association: MEMBER

PR comments:
user: login: github-actions[bot]
created_at: 2025-03-29T06:25:24Z
body: 
# @check-spelling-bot Report
## :red_circle: Please review
### See the [:open_file_folder: files](https://github.com/Flow-Launcher/Flow.Launcher/pull/3396/files/) view, the [:scroll:action log](https://github.com/Flow-Launcher/Flow.Launcher/actions/runs/14143035827/job/39626968724#step:4:1),  or [:memo: job summary](https://github.com/Flow-Launcher/Flow.Launcher/actions/runs/14143035827/attempts/1#summary-39626968724) for details.

[:x: Errors](https://docs.check-spelling.dev/Event-descriptions) | Count
-|-
[:x: forbidden-pattern](https://docs.check-spelling.dev/Event-descriptions#forbidden-pattern) | 24
[:warning: non-alpha-in-dictionary](https://docs.check-spelling.dev/Event-descriptions#non-alpha-in-dictionary) | 19

See [:x: Event descriptions](https://docs.check-spelling.dev/Event-descriptions) for more information.

<!-- Because only_check_changed_files is active, checking for obsolete items cannot be performed-->

<details><summary>Forbidden patterns :no_good: (1)</summary>

In order to address this, you could change the content to not match the forbidden patterns (comments before forbidden patterns may help explain why they're forbidden), add patterns for acceptable instances, or adjust the forbidden patterns themselves.

These forbidden patterns matched content:

#### s.b. workaround(s)
```
\bwork[- ]arounds?\b
```

</details>

<!-- See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-advice --> <!-- markdownlint-disable MD033 MD041 -->
<details><summary>If the flagged items are :exploding_head: false positives</summary>

If items relate to a ...
* binary file (or some other file you wouldn't want to check at all).

  Please add a file path to the `excludes.txt` file matching the containing file.

  File paths are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your files.

  `^` refers to the file's path from the root of the repository, so `^README\.md$` would exclude [README.md](
../tree/HEAD/README.md) (on whichever branch you're using).

* well-formed pattern.

  If you can write a [pattern](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns) that would match it,
  try adding it to the `patterns.txt` file.

  Patterns are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your lines.

  Note that patterns can't match multiline strings.

</details>

author_association: NONE
user: login: coderabbitai[bot]
created_at: 2025-03-29T06:27:11Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

<details>
<summary>📝 Walkthrough</summary>

## Walkthrough
This pull request introduces several UI and functionality changes across multiple modules. In the core theme file, property access levels are restricted, and methods for adjusting window border thickness are added. The obsolete `ThemeManager` is removed. New settings properties for placeholder display and window resizing are introduced, along with corresponding UI elements in XAML and adjustments to the `MainWindow` for placeholder management and resize mode. String resources in the language file are updated to reflect these changes.

## Changes

| File(s)                                                     | Change Summary                                                                                                                                                                                                                                                                    |
|-------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `Flow.Launcher.Core/Resource/Theme.cs`                       | Updated property access for `BlurEnabled`, changed property references for effects and margins, added new method `SetResizeBorderThickness(WindowChrome, bool)`, and converted an existing static method to an instance method; updated dispatcher priority in async methods.  |
| `Flow.Launcher.Core/Resource/ThemeManager.cs`                | Removed the `ThemeManager` class and its static `Instance` property.                                                                                                                                                                                                             |
| `Flow.Launcher.Infrastructure/UserSettings/Settings.cs`      | Added new properties: `ShowPlaceholder` and `PlaceholderText` with corresponding backing fields and change notifications; refactored `KeepMaxResults` property.                                                                                                               |
| `Flow.Launcher/App.xaml.cs`                                  | Removed a comment line referencing a future cleanup of `ThemeManager.Instance`.                                                                                                                                                                                                  |
| `Flow.Launcher/Languages/en.xaml`                           | Removed the "PositionResetToolTip"; added new string resources for query suggestions, backdrop types, placeholder text, and window resize options; rearranged some existing string resource declarations.                                                                     |
| `Flow.Launcher/MainWindow.xaml`                             | Added a new disabled `TextBox` (`QueryTextPlaceholderBox`) within the `QueryBoxArea` grid, configured as a placeholder with dynamic resource binding and collapsed visibility.                                                                                               |
| `Flow.Launcher/MainWindow.xaml.cs`                          | Introduced a new region for placeholder text management (setup and event handlers for updating placeholder visibility) and a region for resize mode management (adjusts window resize mode and border thickness based on settings).                                          |
| `Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs` | Added new public properties `ShowPlaceholder` and `PlaceholderText` to proxy the corresponding settings values.                                                                                                                                                                       |
| `Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml`   | Added two new `cc:Card` UI elements for "ShowPlaceholder" and "PlaceholderText" featuring toggle switches; updated comment casings in the file.                                                                                                                                 |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant MW as MainWindow
    participant QTB as QueryTextBox
    participant QTSB as QueryTextSuggestionBox
    participant PTB as QueryTextPlaceholderBox
    participant Settings as Settings

    MW->>MW: SetupPlaceholderText()
    MW->>QTB: Subscribe to TextChanged event
    MW->>QTSB: Subscribe to TextChanged event
    QTB->>MW: TextChanged event triggered
    QTSB->>MW: TextChanged event triggered
    MW->>MW: SetPlaceholderText() updates PTB visibility
```

```mermaid
sequenceDiagram
    participant MW as MainWindow
    participant Settings as Settings
    participant Theme as Theme

    MW->>Settings: Retrieve ResizeWindow setting
    MW->>Theme: Call SetResizeBorderThickness(Thickness?)
    MW->>MW: Update window ResizeMode based on setting
```

## Possibly related PRs
- **Flow-Launcher/Flow.Launcher#3232** – The changes in the main PR regarding the `SetResizeBorderThickness` method and the handling of resize border thickness are directly related to the modifications made in the retrieved PR, which also involves the `SetResizeBoarderThickness` method and adjustments to the window's resize border thickness.
- **Flow-Launcher/Flow.Launcher#3377** – The changes in the main PR are related to those in the retrieved PR as both involve modifications to the `Theme.cs` file, specifically in the management of properties and methods related to theme functionality, including the introduction of new methods and adjustments to existing ones.

## Suggested labels
`kind/ui`, `20 min review`

## Suggested reviewers
- jjw24
- onesounds

## Poem
> I'm a rabbit, hopping with glee,  
> Code changes sprout like carrots in a field,  
> Borders refined and placeholders set free,  
> UI and settings form a brighter yield,  
> With whiskers twitching in code harmony 🐰,  
> I celebrate clean lines and tweaks so real!  
> Hop on into the new feature reveal!

</details>

<!-- walkthrough_end -->
<!-- internal state start -->


<!-- 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= -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details>
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=Flow-Launcher/Flow.Launcher&utm_content=3396):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai plan` to trigger planning for file edits and PR creation.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-03-29T07:09:53Z
body: 
# @check-spelling-bot Report
## :red_circle: Please review
### See the [:open_file_folder: files](https://github.com/Flow-Launcher/Flow.Launcher/pull/3396/files/) view, the [:scroll:action log](https://github.com/Flow-Launcher/Flow.Launcher/actions/runs/14143360422/job/39627671327#step:4:1),  or [:memo: job summary](https://github.com/Flow-Launcher/Flow.Launcher/actions/runs/14143360422/attempts/1#summary-39627671327) for details.

[:x: Errors](https://docs.check-spelling.dev/Event-descriptions) | Count
-|-
[:x: forbidden-pattern](https://docs.check-spelling.dev/Event-descriptions#forbidden-pattern) | 24
[:warning: non-alpha-in-dictionary](https://docs.check-spelling.dev/Event-descriptions#non-alpha-in-dictionary) | 19

See [:x: Event descriptions](https://docs.check-spelling.dev/Event-descriptions) for more information.

<!-- Because only_check_changed_files is active, checking for obsolete items cannot be performed-->

<details><summary>Forbidden patterns :no_good: (1)</summary>

In order to address this, you could change the content to not match the forbidden patterns (comments before forbidden patterns may help explain why they're forbidden), add patterns for acceptable instances, or adjust the forbidden patterns themselves.

These forbidden patterns matched content:

#### s.b. workaround(s)
```
\bwork[- ]arounds?\b
```

</details>

<!-- See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-advice --> <!-- markdownlint-disable MD033 MD041 -->
<details><summary>If the flagged items are :exploding_head: false positives</summary>

If items relate to a ...
* binary file (or some other file you wouldn't want to check at all).

  Please add a file path to the `excludes.txt` file matching the containing file.

  File paths are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your files.

  `^` refers to the file's path from the root of the repository, so `^README\.md$` would exclude [README.md](
../tree/HEAD/README.md) (on whichever branch you're using).

* well-formed pattern.

  If you can write a [pattern](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns) that would match it,
  try adding it to the `patterns.txt` file.

  Patterns are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your lines.

  Note that patterns can't match multiline strings.

</details>

author_association: NONE
user: login: gitstream-cm[bot]
created_at: 2025-03-29T07:11:03Z
body: 🥷 **Code experts: onesounds** 
 
Jack251970, onesounds have most 👩‍💻 **activity** in the files. 
Jack251970, onesounds have most 🧠 **knowledge** in the files. 
 <details>
 <summary>See details</summary>


`Flow.Launcher.Core/Resource/Theme.cs` 
 

Activity based on git-commit: 

 |  | Jack251970 | onesounds| 
 | --- | --- | --- | 
 | MAR | 846 additions & 934 deletions |1159 additions & 895 deletions | 
| FEB | 64 additions & 28 deletions |333 additions & 17 deletions | 
| JAN | 7 additions & 4 deletions |  
| DEC | 2 additions & 96 deletions |  
| NOV | 2 additions & 2 deletions |  
| OCT |   |  
 

Knowledge based on git-blame: 
 Jack251970: 64% 
onesounds: 22% 

`Flow.Launcher.Infrastructure/UserSettings/Settings.cs` 
 

Activity based on git-commit: 

 |  | Jack251970 | onesounds| 
 | --- | --- | --- | 
 | MAR | 3 additions & 2 deletions |10 additions & 0 deletions | 
| FEB | 10 additions & 4 deletions |  
| JAN | 17 additions & 4 deletions |  
| DEC | 1 additions & 1 deletions |  
| NOV |   |  
| OCT |   |  
 

Knowledge based on git-blame: 
 onesounds: 25% 
Jack251970: 7% 

`Flow.Launcher/App.xaml.cs` 
 

Activity based on git-commit: 

 |  | Jack251970 | onesounds| 
 | --- | --- | --- | 
 | MAR | 168 additions & 93 deletions |  
| FEB | 79 additions & 40 deletions |  
| JAN | 86 additions & 66 deletions |  
| DEC |   |  
| NOV |   |  
| OCT |   |  
 

Knowledge based on git-blame: 
 Jack251970: 61% 

`Flow.Launcher/Languages/en.xaml` 
 

Activity based on git-commit: 

 |  | Jack251970 | onesounds| 
 | --- | --- | --- | 
 | MAR | 6 additions & 3 deletions |7 additions & 3 deletions | 
| FEB | 13 additions & 9 deletions |  
| JAN | 1 additions & 0 deletions |  
| DEC |   |  
| NOV |   |  
| OCT |   |  
 

Knowledge based on git-blame: 
 onesounds: 43% 
Jack251970: 3% 

`Flow.Launcher/MainWindow.xaml` 
 

Activity based on git-commit: 

 |  | Jack251970 | onesounds| 
 | --- | --- | --- | 
 | MAR | 28 additions & 21 deletions |  
| FEB | 1 additions & 1 deletions |  
| JAN |   |  
| DEC |   |  
| NOV | 1 additions & 1 deletions |  
| OCT |   |  
 

Knowledge based on git-blame: 
 onesounds: 87% 
Jack251970: 4% 

`Flow.Launcher/MainWindow.xaml.cs` 
 

Activity based on git-commit: 

 |  | Jack251970 | onesounds| 
 | --- | --- | --- | 
 | MAR | 851 additions & 852 deletions |327 additions & 141 deletions | 
| FEB | 1 additions & 1 deletions |8 additions & 4 deletions | 
| JAN |   |  
| DEC | 5 additions & 10 deletions |  
| NOV |   |  
| OCT |   |  
 

Knowledge based on git-blame: 
 Jack251970: 61% 
onesounds: 18% 

`Flow.Launcher/SettingPages/ViewModels/SettingsPaneThemeViewModel.cs` 
 

Activity based on git-commit: 

 |  | Jack251970 | onesounds| 
 | --- | --- | --- | 
 | MAR | 88 additions & 105 deletions |153 additions & 86 deletions | 
| FEB | 1 additions & 20 deletions |2 additions & 0 deletions | 
| JAN | 1 additions & 1 deletions |  
| DEC |   |  
| NOV | 2 additions & 2 deletions |  
| OCT |   |  
 

Knowledge based on git-blame: 
 onesounds: 24% 
Jack251970: 13% 

`Flow.Launcher/SettingPages/Views/SettingsPaneTheme.xaml` 
 

Activity based on git-commit: 

 |  | Jack251970 | onesounds| 
 | --- | --- | --- | 
 | MAR | 2 additions & 3 deletions |104 additions & 81 deletions | 
| FEB |   |  
| JAN |   |  
| DEC |   |  
| NOV |   |  
| OCT |   |  
 

Knowledge based on git-blame: 
 onesounds: 79% 

`Flow.Launcher/ViewModel/MainViewModel.cs` 
 

Activity based on git-commit: 

 |  | Jack251970 | onesounds| 
 | --- | --- | --- | 
 | MAR | 459 additions & 422 deletions |293 additions & 201 deletions | 
| FEB | 63 additions & 21 deletions |23 additions & 25 deletions | 
| JAN | 17 additions & 21 deletions |  
| DEC | 59 additions & 63 deletions |  
| NOV | 39 additions & 15 deletions |  
| OCT |   |  
 

Knowledge based on git-blame: 
 Jack251970: 26% 
onesounds: 11% 

</details>
 
 
 
 
To learn more about /:\ gitStream - [Visit our Docs](https://docs.gitstream.cm/) 
 
 

<automation id="gitstream/explain_code_experts"/>
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-29T07:28:27Z
body: 
# @check-spelling-bot Report
## :red_circle: Please review
### See the [:open_file_folder: files](https://github.com/Flow-Launcher/Flow.Launcher/pull/3396/files/) view, the [:scroll:action log](https://github.com/Flow-Launcher/Flow.Launcher/actions/runs/14143503561/job/39627969913#step:4:1),  or [:memo: job summary](https://github.com/Flow-Launcher/Flow.Launcher/actions/runs/14143503561/attempts/1#summary-39627969913) for details.

[:x: Errors](https://docs.check-spelling.dev/Event-descriptions) | Count
-|-
[:x: forbidden-pattern](https://docs.check-spelling.dev/Event-descriptions#forbidden-pattern) | 24
[:warning: non-alpha-in-dictionary](https://docs.check-spelling.dev/Event-descriptions#non-alpha-in-dictionary) | 19

See [:x: Event descriptions](https://docs.check-spelling.dev/Event-descriptions) for more information.

<!-- Because only_check_changed_files is active, checking for obsolete items cannot be performed-->

<details><summary>Forbidden patterns :no_good: (1)</summary>

In order to address this, you could change the content to not match the forbidden patterns (comments before forbidden patterns may help explain why they're forbidden), add patterns for acceptable instances, or adjust the forbidden patterns themselves.

These forbidden patterns matched content:

#### s.b. workaround(s)
```
\bwork[- ]arounds?\b
```

</details>

<!-- See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-advice --> <!-- markdownlint-disable MD033 MD041 -->
<details><summary>If the flagged items are :exploding_head: false positives</summary>

If items relate to a ...
* binary file (or some other file you wouldn't want to check at all).

  Please add a file path to the `excludes.txt` file matching the containing file.

  File paths are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your files.

  `^` refers to the file's path from the root of the repository, so `^README\.md$` would exclude [README.md](
../tree/HEAD/README.md) (on whichever branch you're using).

* well-formed pattern.

  If you can write a [pattern](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns) that would match it,
  try adding it to the `patterns.txt` file.

  Patterns are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your lines.

  Note that patterns can't match multiline strings.

</details>

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-29T07:39:41Z
body: 
# @check-spelling-bot Report
## :red_circle: Please review
### See the [:open_file_folder: files](https://github.com/Flow-Launcher/Flow.Launcher/pull/3396/files/) view, the [:scroll:action log](https://github.com/Flow-Launcher/Flow.Launcher/actions/runs/14143588668/job/39628145376#step:4:1),  or [:memo: job summary](https://github.com/Flow-Launcher/Flow.Launcher/actions/runs/14143588668/attempts/1#summary-39628145376) for details.

[:x: Errors](https://docs.check-spelling.dev/Event-descriptions) | Count
-|-
[:x: forbidden-pattern](https://docs.check-spelling.dev/Event-descriptions#forbidden-pattern) | 24
[:warning: non-alpha-in-dictionary](https://docs.check-spelling.dev/Event-descriptions#non-alpha-in-dictionary) | 19

See [:x: Event descriptions](https://docs.check-spelling.dev/Event-descriptions) for more information.

<!-- Because only_check_changed_files is active, checking for obsolete items cannot be performed-->

<details><summary>Forbidden patterns :no_good: (1)</summary>

In order to address this, you could change the content to not match the forbidden patterns (comments before forbidden patterns may help explain why they're forbidden), add patterns for acceptable instances, or adjust the forbidden patterns themselves.

These forbidden patterns matched content:

#### s.b. workaround(s)
```
\bwork[- ]arounds?\b
```

</details>

<!-- See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-advice --> <!-- markdownlint-disable MD033 MD041 -->
<details><summary>If the flagged items are :exploding_head: false positives</summary>

If items relate to a ...
* binary file (or some other file you wouldn't want to check at all).

  Please add a file path to the `excludes.txt` file matching the containing file.

  File paths are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your files.

  `^` refers to the file's path from the root of the repository, so `^README\.md$` would exclude [README.md](
../tree/HEAD/README.md) (on whichever branch you're using).

* well-formed pattern.

  If you can write a [pattern](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns) that would match it,
  try adding it to the `patterns.txt` file.

  Patterns are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your lines.

  Note that patterns can't match multiline strings.

</details>

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-29T07:50:12Z
body: 
# @check-spelling-bot Report
## :red_circle: Please review
### See the [:open_file_folder: files](https://github.com/Flow-Launcher/Flow.Launcher/pull/3396/files/) view, the [:scroll:action log](https://github.com/Flow-Launcher/Flow.Launcher/actions/runs/14143648896/job/39628285868#step:4:1),  or [:memo: job summary](https://github.com/Flow-Launcher/Flow.Launcher/actions/runs/14143648896/attempts/1#summary-39628285868) for details.

[:x: Errors](https://docs.check-spelling.dev/Event-descriptions) | Count
-|-
[:x: forbidden-pattern](https://docs.check-spelling.dev/Event-descriptions#forbidden-pattern) | 24
[:warning: non-alpha-in-dictionary](https://docs.check-spelling.dev/Event-descriptions#non-alpha-in-dictionary) | 19

See [:x: Event descriptions](https://docs.check-spelling.dev/Event-descriptions) for more information.

<!-- Because only_check_changed_files is active, checking for obsolete items cannot be performed-->

<details><summary>Forbidden patterns :no_good: (1)</summary>

In order to address this, you could change the content to not match the forbidden patterns (comments before forbidden patterns may help explain why they're forbidden), add patterns for acceptable instances, or adjust the forbidden patterns themselves.

These forbidden patterns matched content:

#### s.b. workaround(s)
```
\bwork[- ]arounds?\b
```

</details>

<!-- See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-advice --> <!-- markdownlint-disable MD033 MD041 -->
<details><summary>If the flagged items are :exploding_head: false positives</summary>

If items relate to a ...
* binary file (or some other file you wouldn't want to check at all).

  Please add a file path to the `excludes.txt` file matching the containing file.

  File paths are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your files.

  `^` refers to the file's path from the root of the repository, so `^README\.md$` would exclude [README.md](
../tree/HEAD/README.md) (on whichever branch you're using).

* well-formed pattern.

  If you can write a [pattern](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns) that would match it,
  try adding it to the `patterns.txt` file.

  Patterns are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your lines.

  Note that patterns can't match multiline strings.

</details>

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-29T08:04:45Z
body: 
# @check-spelling-bot Report
## :red_circle: Please review
### See the [:open_file_folder: files](https://github.com/Flow-Launcher/Flow.Launcher/pull/3396/files/) view, the [:scroll:action log](https://github.com/Flow-Launcher/Flow.Launcher/actions/runs/14143733918/job/39628481393#step:4:1),  or [:memo: job summary](https://github.com/Flow-Launcher/Flow.Launcher/actions/runs/14143733918/attempts/1#summary-39628481393) for details.

[:x: Errors](https://docs.check-spelling.dev/Event-descriptions) | Count
-|-
[:x: forbidden-pattern](https://docs.check-spelling.dev/Event-descriptions#forbidden-pattern) | 24
[:warning: non-alpha-in-dictionary](https://docs.check-spelling.dev/Event-descriptions#non-alpha-in-dictionary) | 19

See [:x: Event descriptions](https://docs.check-spelling.dev/Event-descriptions) for more information.

<!-- Because only_check_changed_files is active, checking for obsolete items cannot be performed-->

<details><summary>Forbidden patterns :no_good: (1)</summary>

In order to address this, you could change the content to not match the forbidden patterns (comments before forbidden patterns may help explain why they're forbidden), add patterns for acceptable instances, or adjust the forbidden patterns themselves.

These forbidden patterns matched content:

#### s.b. workaround(s)
```
\bwork[- ]arounds?\b
```

</details>

<!-- See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-advice --> <!-- markdownlint-disable MD033 MD041 -->
<details><summary>If the flagged items are :exploding_head: false positives</summary>

If items relate to a ...
* binary file (or some other file you wouldn't want to check at all).

  Please add a file path to the `excludes.txt` file matching the containing file.

  File paths are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your files.

  `^` refers to the file's path from the root of the repository, so `^README\.md$` would exclude [README.md](
../tree/HEAD/README.md) (on whichever branch you're using).

* well-formed pattern.

  If you can write a [pattern](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns) that would match it,
  try adding it to the `patterns.txt` file.

  Patterns are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your lines.

  Note that patterns can't match multiline strings.

</details>

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-29T08:25:43Z
body: 
# @check-spelling-bot Report
## :red_circle: Please review
### See the [:open_file_folder: files](https://github.com/Flow-Launcher/Flow.Launcher/pull/3396/files/) view, the [:scroll:action log](https://github.com/Flow-Launcher/Flow.Launcher/actions/runs/14143890645/job/39628848432#step:4:1),  or [:memo: job summary](https://github.com/Flow-Launcher/Flow.Launcher/actions/runs/14143890645/attempts/1#summary-39628848432) for details.

[:x: Errors](https://docs.check-spelling.dev/Event-descriptions) | Count
-|-
[:x: forbidden-pattern](https://docs.check-spelling.dev/Event-descriptions#forbidden-pattern) | 24
[:warning: non-alpha-in-dictionary](https://docs.check-spelling.dev/Event-descriptions#non-alpha-in-dictionary) | 19

See [:x: Event descriptions](https://docs.check-spelling.dev/Event-descriptions) for more information.

<!-- Because only_check_changed_files is active, checking for obsolete items cannot be performed-->

<details><summary>Forbidden patterns :no_good: (1)</summary>

In order to address this, you could change the content to not match the forbidden patterns (comments before forbidden patterns may help explain why they're forbidden), add patterns for acceptable instances, or adjust the forbidden patterns themselves.

These forbidden patterns matched content:

#### s.b. workaround(s)
```
\bwork[- ]arounds?\b
```

</details>

<!-- See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-advice --> <!-- markdownlint-disable MD033 MD041 -->
<details><summary>If the flagged items are :exploding_head: false positives</summary>

If items relate to a ...
* binary file (or some other file you wouldn't want to check at all).

  Please add a file path to the `excludes.txt` file matching the containing file.

  File paths are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your files.

  `^` refers to the file's path from the root of the repository, so `^README\.md$` would exclude [README.md](
../tree/HEAD/README.md) (on whichever branch you're using).

* well-formed pattern.

  If you can write a [pattern](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns) that would match it,
  try adding it to the `patterns.txt` file.

  Patterns are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your lines.

  Note that patterns can't match multiline strings.

</details>

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-29T08:39:53Z
body: 
# @check-spelling-bot Report
## :red_circle: Please review
### See the [:open_file_folder: files](https://github.com/Flow-Launcher/Flow.Launcher/pull/3396/files/) view, the [:scroll:action log](https://github.com/Flow-Launcher/Flow.Launcher/actions/runs/14143994614/job/39629083048#step:4:1),  or [:memo: job summary](https://github.com/Flow-Launcher/Flow.Launcher/actions/runs/14143994614/attempts/1#summary-39629083048) for details.

[:x: Errors](https://docs.check-spelling.dev/Event-descriptions) | Count
-|-
[:x: forbidden-pattern](https://docs.check-spelling.dev/Event-descriptions#forbidden-pattern) | 24
[:warning: non-alpha-in-dictionary](https://docs.check-spelling.dev/Event-descriptions#non-alpha-in-dictionary) | 19

See [:x: Event descriptions](https://docs.check-spelling.dev/Event-descriptions) for more information.

<!-- Because only_check_changed_files is active, checking for obsolete items cannot be performed-->

<details><summary>Forbidden patterns :no_good: (1)</summary>

In order to address this, you could change the content to not match the forbidden patterns (comments before forbidden patterns may help explain why they're forbidden), add patterns for acceptable instances, or adjust the forbidden patterns themselves.

These forbidden patterns matched content:

#### s.b. workaround(s)
```
\bwork[- ]arounds?\b
```

</details>

<!-- See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-advice --> <!-- markdownlint-disable MD033 MD041 -->
<details><summary>If the flagged items are :exploding_head: false positives</summary>

If items relate to a ...
* binary file (or some other file you wouldn't want to check at all).

  Please add a file path to the `excludes.txt` file matching the containing file.

  File paths are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your files.

  `^` refers to the file's path from the root of the repository, so `^README\.md$` would exclude [README.md](
../tree/HEAD/README.md) (on whichever branch you're using).

* well-formed pattern.

  If you can write a [pattern](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns) that would match it,
  try adding it to the `patterns.txt` file.

  Patterns are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your lines.

  Note that patterns can't match multiline strings.

</details>

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-29T08:42:01Z
body: 
# @check-spelling-bot Report
## :red_circle: Please review
### See the [:open_file_folder: files](https://github.com/Flow-Launcher/Flow.Launcher/pull/3396/files/) view, the [:scroll:action log](https://github.com/Flow-Launcher/Flow.Launcher/actions/runs/14144012084/job/39629131236#step:4:1),  or [:memo: job summary](https://github.com/Flow-Launcher/Flow.Launcher/actions/runs/14144012084/attempts/1#summary-39629131236) for details.

[:x: Errors](https://docs.check-spelling.dev/Event-descriptions) | Count
-|-
[:x: forbidden-pattern](https://docs.check-spelling.dev/Event-descriptions#forbidden-pattern) | 24
[:warning: non-alpha-in-dictionary](https://docs.check-spelling.dev/Event-descriptions#non-alpha-in-dictionary) | 19

See [:x: Event descriptions](https://docs.check-spelling.dev/Event-descriptions) for more information.

<!-- Because only_check_changed_files is active, checking for obsolete items cannot be performed-->

<details><summary>Forbidden patterns :no_good: (1)</summary>

In order to address this, you could change the content to not match the forbidden patterns (comments before forbidden patterns may help explain why they're forbidden), add patterns for acceptable instances, or adjust the forbidden patterns themselves.

These forbidden patterns matched content:

#### s.b. workaround(s)
```
\bwork[- ]arounds?\b
```

</details>

<!-- See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-advice --> <!-- markdownlint-disable MD033 MD041 -->
<details><summary>If the flagged items are :exploding_head: false positives</summary>

If items relate to a ...
* binary file (or some other file you wouldn't want to check at all).

  Please add a file path to the `excludes.txt` file matching the containing file.

  File paths are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your files.

  `^` refers to the file's path from the root of the repository, so `^README\.md$` would exclude [README.md](
../tree/HEAD/README.md) (on whichever branch you're using).

* well-formed pattern.

  If you can write a [pattern](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns) that would match it,
  try adding it to the `patterns.txt` file.

  Patterns are Perl 5 Regular Expressions - you can [test](
https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your lines.

  Note that patterns can't match multiline strings.

</details>

author_association: NONE