GeezerVison is showing github.com — feat: fonts, note styles, Groq voice & Firebase sync by devohmycode · Pull Request #4 · devohmycode/NoteUI
Conversation
devohmycode
commented
Mar 22, 2026
•
edited by coderabbitai
Bot
Loading
Uh oh!
There was an error while loading. Please reload this page.
Summary
- Custom fonts: Added Geist, Inter, and JetBrains Mono font families with runtime font switching via settings (Segoe UI / Geist / Inter / JetBrains Mono)
- Note color styles: New "Couleur" setting with title bar only or full note coloring modes, with proper dark theme text handling
- Groq Cloud Whisper: Added Groq API key input (DPAPI-secured) and Whisper Large v3 / v3 Turbo cloud STT models in voice settings
- Firebase Sync fix: Fixed sync reliability issues
- Raycast-style settings: Refactored settings panel with cascading sub-menus using consistent Raycast-style Flyout design (custom buttons, checkmarks, search)
- Theme/backdrop sync: Fixed visual glitches when switching themes by syncing
SystemBackdropConfiguration.Theme across all window types
Test plan
- Open settings, verify font picker shows 4 options and applies globally
- Change note color style between "Barre de titre" and "Pleine", verify rendering in both light/dark themes
- Switch themes and backdrops, verify no visual glitches
- Configure Groq API key, test Whisper Large v3 cloud transcription
- Verify Firebase sync works correctly
- Verify all settings sub-menus match the Raycast visual style
Summary by CodeRabbit
-
New Features
- Font selection with multiple typeface options (Geist, Inter, JetBrains Mono)
- Note styling modes to customize note appearance
- Groq Cloud speech-to-text engine support for voice transcription
- Reorganized settings interface with cascading menus
-
Bug Fixes
- Enhanced error reporting for authentication failures with detailed messages
-
Chores
- Added localization entries for new settings and features
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Add Groq API key input (DPAPI-secured) in the voice model settings panel
to enable cloud-based speech-to-text via Groq's Whisper Large v3 and
Whisper Large v3 Turbo models. Fix NoteWindow mic button not working
with Groq models by passing the API key to the recognizer factory.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
- Added support for custom fonts with new font loading and application methods.
- Introduced note style settings, allowing users to choose between title bar and full styles.
- Updated UI components to reflect selected font and note style dynamically.
- Enhanced AppSettings to manage font and note style persistence.
- Updated localization for new font and note style options.
coderabbitai
Bot
commented
Mar 22, 2026
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
Caution
Review failed
The pull request is closed.
ℹ️ Recent review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 82d68801-5106-45b4-af4a-80d80e6ac641
📥 Commits
Reviewing files that changed from the base of the PR and between bf9e2b6 and 312c2b6.
⛔ Files ignored due to path filters (9)
Assets/Fonts/Geist-Bold.otf is excluded by !**/*.otf
Assets/Fonts/Geist-Medium.otf is excluded by !**/*.otf
Assets/Fonts/Geist-Regular.otf is excluded by !**/*.otf
Assets/Fonts/Inter-Bold.ttf is excluded by !**/*.ttf
Assets/Fonts/Inter-Medium.ttf is excluded by !**/*.ttf
Assets/Fonts/Inter-Regular.ttf is excluded by !**/*.ttf
Assets/Fonts/JetBrainsMono-Bold.ttf is excluded by !**/*.ttf
Assets/Fonts/JetBrainsMono-Medium.ttf is excluded by !**/*.ttf
Assets/Fonts/JetBrainsMono-Regular.ttf is excluded by !**/*.ttf
📒 Files selected for processing (15)
AcrylicSettingsWindow.xaml.cs
ActionPanel.cs
App.xaml
App.xaml.cs
AppSettings.cs
FirebaseSync.cs
Lang.cs
MainWindow.xaml.cs
NoteUI.csproj
NoteWindow.xaml
NoteWindow.xaml.cs
NotepadWindow.xaml.cs
RuntimeSecrets.cs
SpeechRecognitionService.cs
VoiceNoteWindow.xaml.cs
📝 Walkthrough
Walkthrough
This PR introduces font customization, note styling options, and Groq Cloud speech recognition support. It redesigns the Settings UI panel with cascade buttons for better organization, updates theme/font application mechanisms across the app, adds localization entries for new settings, and integrates Groq API support for cloud-based speech transcription with improved OAuth error handling.
Changes
| Cohort / File(s) |
Summary |
Font Management App.xaml, App.xaml.cs, AppSettings.cs, NoteUI.csproj |
Added FontFamily resources (Geist/Inter/JetBrains Mono variants), font loading/saving methods, GetFontFamily() mapping, and ApplyFontToTree() for recursive UI font application. Build output now includes font files. |
Note Styling NoteWindow.xaml.cs, AppSettings.cs |
Introduced persistent note style state with load/save methods and ApplyNoteStyle() method. Extended ApplyNoteColor() to handle "titlebar"/"full"/"none" styles with distinct visual behaviors (transparency, color fills, icon/text color management). |
Settings Panel Redesign ActionPanel.cs, Lang.cs |
Refactored Settings UI from inline check-items to cascade-button model for Theme/Backdrop/Language/Storage. Added optional font and note-style configuration callbacks. Extended ShowVoiceModelsPanel() with Groq Cloud API key input section and model selection when AiManager is provided. Added localization strings for note style, font, and Groq sections. |
Theme & Acrylic Configuration AcrylicSettingsWindow.xaml.cs, NotepadWindow.xaml.cs, NoteWindow.xaml.cs, MainWindow.xaml.cs, AppSettings.cs |
Updated ApplyThemeToWindow() signature to accept optional SystemBackdropConfiguration parameter. All call sites now pass _configSource to ensure config source syncs with applied theme. Theme reapplication method added to NoteWindow. |
Groq Cloud Speech Recognition SpeechRecognitionService.cs, VoiceNoteWindow.xaml.cs, NoteWindow.xaml.cs, RuntimeSecrets.cs, FirebaseSync.cs |
Added SttEngine.GroqCloud enum value and new GroqWhisperRecognizer class for Groq API integration (PCM16 audio buffering, 5-second chunks, WAV format). Updated SpeechRecognizerFactory.Create() to accept optional groqApiKey. Extended RuntimeSecrets to retrieve Google client secret from environment. Enhanced OAuth error reporting with JSON error/error_description parsing. |
UI & AiManager Integration NoteWindow.xaml, MainWindow.xaml.cs, VoiceNoteWindow.xaml.cs |
Named FontIcon elements for code reference. Integrated AiManager lifecycle (lazy init, loading) in MainWindow and VoiceNoteWindow, passing instances to voice-related windows and settings panels. Updated recognizer creation to supply Groq API key when applicable. |
Sequence Diagram(s)
sequenceDiagram
participant User
participant NoteWindow
participant SpeechRecognizerFactory
participant GroqWhisperRecognizer
participant GroqAPI["Groq Cloud API"]
User->>NoteWindow: Start voice dictation (Groq model)
NoteWindow->>NoteWindow: Fetch Groq API key from AiManager
NoteWindow->>SpeechRecognizerFactory: Create(model, groqApiKey)
SpeechRecognizerFactory->>GroqWhisperRecognizer: new GroqWhisperRecognizer(apiKey, modelId)
GroqWhisperRecognizer->>GroqWhisperRecognizer: Start recording PCM16 audio
GroqWhisperRecognizer->>GroqWhisperRecognizer: Buffer into 5-sec chunks
GroqWhisperRecognizer->>GroqAPI: POST /openai/v1/audio/transcriptions<br/>(WAV chunk + API key)
GroqAPI-->>GroqWhisperRecognizer: JSON {text: "transcribed..."}
GroqWhisperRecognizer-->>NoteWindow: Emit final text result
NoteWindow->>NoteWindow: Insert text into editor
User->>NoteWindow: Stop recording
GroqWhisperRecognizer->>GroqWhisperRecognizer: Cleanup recording + cancel loop
Loading
sequenceDiagram
participant User
participant MainWindow
participant ActionPanel as ActionPanel.ShowVoiceModelsPanel
participant AiManager
participant SettingsUI as Settings UI Panel
User->>MainWindow: Open voice models settings
MainWindow->>MainWindow: Ensure AiManager loaded
MainWindow->>ActionPanel: ShowVoiceModelsPanel(aiManager)
ActionPanel->>AiManager: HasApiKey("groq")
AiManager-->>ActionPanel: true/false
alt Groq key exists
ActionPanel->>ActionPanel: Add Groq Cloud section<br/>with API key input
ActionPanel->>SettingsUI: Render Groq model buttons
User->>SettingsUI: Select Groq model
ActionPanel->>AiManager: Update selection
ActionPanel->>User: Hide flyout
else No Groq key
ActionPanel->>SettingsUI: Show Groq models disabled
end
Loading
Estimated code review effort
🎯 4 (Complex) | ⏱️ ~75 minutes
Possibly related PRs
- PR
#2: Modifies ActionPanel.CreateSettings() with AI callbacks, introduces AiManager integration in MainWindow/VoiceNoteWindow, and changes voice-model panel setup—overlapping feature and architecture.
- PR
#3: Updates backdrop/acrylic theming codepath by changing how AppSettings.ApplyToWindow() and ApplyThemeToWindow() handle config sources and acrylic controller state management.
Poem
🐰 Fonts now dance in Geist and Inter cheer,
Notes wear styles—full, titled, or clear!
Groq clouds whisper transcriptions so true,
Settings cascade with buttons anew! 🎨
Settings fly, styles bloom, voices soar! 🚀
✨ Finishing Touches
📝 Generate docstrings
- Create stacked PR
- Commit on current branch
🧪 Generate unit tests (beta)
- Create PR with unit tests
- Commit unit tests in branch
0.1.2
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
❤️ Share
Comment @coderabbitai help to get the list of available commands and usage tips.
Tip
CodeRabbit can generate a title for your PR based on the changes.
Add @coderabbitai placeholder anywhere in the title of your PR and CodeRabbit will replace it with a title based on the changes in the PR. You can change the placeholder by changing the reviews.auto_title_placeholder setting.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Review Summary by Qodo
Add custom fonts, note styles, Groq Cloud Whisper, and refactor settings UI
✨ Enhancement 🐞 Bug fix

Walkthroughs
Description
• Added custom font support (Geist, Inter, JetBrains Mono, Segoe UI) with runtime switching
• Implemented note color styling with title bar and full coloring modes
• Integrated Groq Cloud Whisper v3/v3 Turbo STT with DPAPI-secured API key storage
• Refactored settings panel with cascading Raycast-style submenus for cleaner UX
• Fixed Firebase OAuth flow by adding Google client secret support
• Fixed theme/backdrop synchronization across all window types
Diagram
flowchart LR
A["Settings Panel"] -->|"Cascade Buttons"| B["Font Selector"]
A -->|"Cascade Buttons"| C["Note Style Selector"]
A -->|"Cascade Buttons"| D["Theme/Backdrop"]
A -->|"Navigate Button"| E["Voice Models"]
E -->|"API Key Input"| F["Groq Cloud Whisper"]
F -->|"Cloud STT"| G["Speech Recognition"]
H["App Launch"] -->|"Load Font"| I["Apply Font Resource"]
J["NoteWindow"] -->|"Load Style"| K["Apply Color Mode"]
K -->|"Full Mode"| L["Full Background Color"]
K -->|"Title Bar Mode"| M["Title Bar Only Color"]
Loading

File Changes
1. ActionPanel.cs
✨ Enhancement +388/-199
Refactor settings with cascading submenus
ActionPanel.cs
2. AppSettings.cs
✨ Enhancement +82/-1
Add font and note style persistence
AppSettings.cs
3. App.xaml.cs
✨ Enhancement +8/-0
Apply font resource on app launch
App.xaml.cs
View more (12)
4. App.xaml
✨ Enhancement +10/-0
Define font family resources
App.xaml
5. AcrylicSettingsWindow.xaml.cs
🐞 Bug fix +1/-1
Fix theme sync with backdrop config
AcrylicSettingsWindow.xaml.cs
6. FirebaseSync.cs
🐞 Bug fix +32/-1
Add Google client secret to OAuth flow
FirebaseSync.cs
7. Lang.cs
✨ Enhancement +18/-0
Add localization for fonts and note styles
Lang.cs
8. MainWindow.xaml.cs
✨ Enhancement +33/-6
Integrate font, note style, and Groq settings
MainWindow.xaml.cs
9. NoteWindow.xaml.cs
✨ Enhancement +103/-8
Implement full and title-bar note coloring
NoteWindow.xaml.cs
10. NoteWindow.xaml
✨ Enhancement +2/-2
Add named references for status bar icons
NoteWindow.xaml
11. NotepadWindow.xaml.cs
🐞 Bug fix +1/-1
Fix theme sync with backdrop config
NotepadWindow.xaml.cs
12. RuntimeSecrets.cs
✨ Enhancement +15/-4
Add Google client secret environment variable
RuntimeSecrets.cs
13. SpeechRecognitionService.cs
✨ Enhancement +209/-5
Add Groq Cloud Whisper recognizer implementation
SpeechRecognitionService.cs
14. VoiceNoteWindow.xaml.cs
✨ Enhancement +38/-6
Integrate Groq Cloud models with API key support
VoiceNoteWindow.xaml.cs
15. NoteUI.csproj
⚙️ Configuration changes +3/-0
Include font assets in build output
NoteUI.csproj


|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Code Review by Qodo
🐞 Bugs (4) 📘 Rule violations (0) 📎 Requirement gaps (0) 📐 Spec deviations (0)


1. TTF fonts not copied 🐞 Bug ✓ Correctness
Description
Inter/JetBrains Mono are referenced as runtime font assets, but the project only copies *.otf fonts
to the output directory, so those fonts may be missing at runtime. Selecting “Inter” or “JetBrains
Mono” can silently fall back or fail to load the font resources.
Code
NoteUI.csproj[R25-27]
+ <Content Include="Assets\Fonts\*.otf">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
Evidence
The app references multiple .ttf font assets in XAML and in GetFontFamily(), but the .csproj change
only copies .otf files, leaving .ttf fonts not guaranteed to be present in the output/publish
directory.
NoteUI.csproj[18-28]
App.xaml[12-21]
AppSettings.cs[82-91]
Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution
## Issue description
Inter and JetBrains Mono are referenced as Assets/Fonts/*.ttf, but the project only copies Assets/Fonts/*.otf to the output directory. This can make Inter/JetBrains unavailable at runtime.
## Issue Context
- App.xaml defines FontFamily resources for Inter/JetBrains using .ttf paths.
- AppSettings.GetFontFamily("inter"/"jetbrains") also returns .ttf-based FontFamily values.
## Fix Focus Areas
- NoteUI.csproj[18-28]
## Suggested fix
- Add an additional Content include for `Assets\Fonts\*.ttf` (or a single `Assets\Fonts\*.*` include) with `CopyToOutputDirectory=PreserveNewest`.
- Ensure publish output includes these files as well (same mechanism as the .otf entry).
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
2. Editor color stuck black 🐞 Bug ✓ Correctness
Description
ApplyNoteColor() permanently rewrites the RichEditBox document character formatting to black in
"full" mode, but when leaving "full" it only clears the control Foreground property, leaving the
document’s RTF content black. This can make notes unreadable in dark theme after toggling note
style/color mode.
Code
NoteWindow.xaml.cs[R362-374]
+ // Editor text color: force black in full mode (pastel backgrounds)
+ if (isFull)
+ {
+ NoteEditor.Foreground = new SolidColorBrush(Microsoft.UI.Colors.Black);
+ TaskNoteEditor.Foreground = new SolidColorBrush(Microsoft.UI.Colors.Black);
+ SetEditorTextColor(NoteEditor, Microsoft.UI.Colors.Black);
+ SetEditorTextColor(TaskNoteEditor, Microsoft.UI.Colors.Black);
+ }
+ else
+ {
+ NoteEditor.ClearValue(RichEditBox.ForegroundProperty);
+ TaskNoteEditor.ClearValue(RichEditBox.ForegroundProperty);
+ }
Evidence
In full mode the code calls SetEditorTextColor() which sets range.CharacterFormat.ForegroundColor
(document-level formatting). When not full, it only clears RichEditBox.ForegroundProperty and does
not restore document formatting; the app also autosaves the document as RTF on TextChanged, so the
black formatting can persist into stored note content.
NoteWindow.xaml.cs[302-395]
NoteWindow.xaml.cs[417-423]
NoteWindow.xaml.cs[1019-1023]
Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution
## Issue description
`ApplyNoteColor()` sets document-wide character formatting to black in full-color mode via `SetEditorTextColor()`. When switching back to non-full mode, it only clears `RichEditBox.ForegroundProperty`, leaving the document's RTF character colors black.
## Issue Context
- Notes are persisted as RTF (`TextGetOptions.FormatRtf`) and saved on `NoteEditor_TextChanged`, so document formatting changes can become durable.
## Fix Focus Areas
- NoteWindow.xaml.cs[302-395]
- NoteWindow.xaml.cs[417-423]
- NoteWindow.xaml.cs[1019-1023]
## Suggested fix options
1) **Preferred (non-destructive):** Stop modifying document character formatting.
- Remove/avoid `SetEditorTextColor(...)` calls.
- Rely on `RichEditBox.Foreground` (and/or default character format for new text) to control readability without rewriting existing RTF.
2) **If you must rewrite the document:** Explicitly restore a theme-appropriate document color when leaving full mode.
- In the `else` branch (non-full), compute the theme text color (e.g., from `TextFillColorPrimaryBrush`) and call `SetEditorTextColor(editor, restoredColor)`.
- Consider temporarily suppressing autosave while applying formatting (so a style toggle doesn’t unintentionally persist formatting changes).
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
3. Local storage doesn't disconnect WebDAV 🐞 Bug ✓ Correctness
Description
In the new storage submenu, clicking “Local” does not disconnect WebDAV when WebDAV is currently
connected. This leaves the app still configured for WebDAV even though the UI action implies
switching back to local storage.
Code
ActionPanel.cs[R400-405]
+ bool isLocal = !isFirebaseConnected && !isWebDavConnected && !isCustomFolder;
+ panel.Children.Add(CreateCheckItem(Lang.T("local"), isLocal, () =>
+ {
+ if (isCustomFolder) onResetFolder(); else if (isFirebaseConnected) onDisconnectFirebase();
+ onDone();
+ }));
Evidence
CreateStorageSubMenu() receives isWebDavConnected and an onDisconnectWebDav action, but the
“Local” handler only resets a custom folder or disconnects Firebase; it never calls
onDisconnectWebDav when WebDAV is connected.
ActionPanel.cs[384-406]
ActionPanel.cs[426-435]
Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution
## Issue description
Selecting “Local” in the storage submenu does not disconnect WebDAV when WebDAV is connected, so the app may remain in WebDAV mode.
## Issue Context
`CreateStorageSubMenu()` already receives both `isWebDavConnected` and `onDisconnectWebDav`, but the Local handler doesn’t use them.
## Fix Focus Areas
- ActionPanel.cs[384-406]
## Suggested fix
- Update the Local handler to also handle WebDAV:
- If `isWebDavConnected`, call `onDisconnectWebDav()` before `onDone()`.
- (Optional) Consider making “Local”, “Cloud (Firebase)”, “WebDAV”, and “Custom folder” mutually exclusive transitions (disconnect the other modes when switching).
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

4. Groq STT failures hidden 🐞 Bug ✧ Quality
Description
GroqWhisperRecognizer ignores HTTP status codes and swallows JSON parse errors by returning an empty
string, so transcription failures can look like “no speech” with no error surfaced. This makes cloud
STT issues hard to diagnose and can break dictation silently.
Code
SpeechRecognitionService.cs[R625-635]
+ var response = await http.PostAsync(
+ "https://api.groq.com/openai/v1/audio/transcriptions", content, ct).ConfigureAwait(false);
+ var json = await response.Content.ReadAsStringAsync(ct).ConfigureAwait(false);
+
+ try
+ {
+ using var doc = JsonDocument.Parse(json);
+ return doc.RootElement.GetProperty("text").GetString() ?? "";
+ }
+ catch { return ""; }
+ }
Evidence
SendToGroqAsync() reads the response body but never checks response.IsSuccessStatusCode; it then
attempts to parse JSON and returns "" on any exception. Callers only emit a final result when text
is non-empty, so errors are silently dropped.
SpeechRecognitionService.cs[592-635]
Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution
## Issue description
Groq cloud transcription failures are silently ignored: non-2xx responses aren’t checked, and JSON parse errors return an empty string.
## Issue Context
The UI only appends text on non-empty final results, so returning "" effectively hides errors.
## Fix Focus Areas
- SpeechRecognitionService.cs[592-635]
## Suggested fix
- Check `response.IsSuccessStatusCode` and, on failure, parse and propagate an error message (e.g., throw an exception and catch it in `ProcessLoopAsync`, or invoke a dedicated error event).
- Include a short error string in the UI (or log) so users understand why transcription stopped working.
- Consider adding a small backoff/retry for transient failures.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

ⓘ The new review experience is currently in Beta. Learn more


|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Comment on lines
+25
to
+27
|
|
<Content Include="Assets\Fonts\*.otf">
|
|
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
|
</Content>
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.

1. Ttf fonts not copied 🐞 Bug ✓ Correctness
Inter/JetBrains Mono are referenced as runtime font assets, but the project only copies *.otf fonts
to the output directory, so those fonts may be missing at runtime. Selecting “Inter” or “JetBrains
Mono” can silently fall back or fail to load the font resources.
Agent Prompt
## Issue description
Inter and JetBrains Mono are referenced as Assets/Fonts/*.ttf, but the project only copies Assets/Fonts/*.otf to the output directory. This can make Inter/JetBrains unavailable at runtime.
## Issue Context
- App.xaml defines FontFamily resources for Inter/JetBrains using .ttf paths.
- AppSettings.GetFontFamily("inter"/"jetbrains") also returns .ttf-based FontFamily values.
## Fix Focus Areas
- NoteUI.csproj[18-28]
## Suggested fix
- Add an additional Content include for `Assets\Fonts\*.ttf` (or a single `Assets\Fonts\*.*` include) with `CopyToOutputDirectory=PreserveNewest`.
- Ensure publish output includes these files as well (same mechanism as the .otf entry).
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Comment on lines
+362
to
+374
|
|
// Editor text color: force black in full mode (pastel backgrounds)
|
|
|
if (isFull)
|
|
|
{
|
|
|
NoteEditor.Foreground = new SolidColorBrush(Microsoft.UI.Colors.Black);
|
|
|
TaskNoteEditor.Foreground = new SolidColorBrush(Microsoft.UI.Colors.Black);
|
|
|
SetEditorTextColor(NoteEditor, Microsoft.UI.Colors.Black);
|
|
|
SetEditorTextColor(TaskNoteEditor, Microsoft.UI.Colors.Black);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
NoteEditor.ClearValue(RichEditBox.ForegroundProperty);
|
|
|
TaskNoteEditor.ClearValue(RichEditBox.ForegroundProperty);
|
|
|
}
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.

2. Editor color stuck black 🐞 Bug ✓ Correctness
ApplyNoteColor() permanently rewrites the RichEditBox document character formatting to black in
"full" mode, but when leaving "full" it only clears the control Foreground property, leaving the
document’s RTF content black. This can make notes unreadable in dark theme after toggling note
style/color mode.
Agent Prompt
## Issue description
`ApplyNoteColor()` sets document-wide character formatting to black in full-color mode via `SetEditorTextColor()`. When switching back to non-full mode, it only clears `RichEditBox.ForegroundProperty`, leaving the document's RTF character colors black.
## Issue Context
- Notes are persisted as RTF (`TextGetOptions.FormatRtf`) and saved on `NoteEditor_TextChanged`, so document formatting changes can become durable.
## Fix Focus Areas
- NoteWindow.xaml.cs[302-395]
- NoteWindow.xaml.cs[417-423]
- NoteWindow.xaml.cs[1019-1023]
## Suggested fix options
1) **Preferred (non-destructive):** Stop modifying document character formatting.
- Remove/avoid `SetEditorTextColor(...)` calls.
- Rely on `RichEditBox.Foreground` (and/or default character format for new text) to control readability without rewriting existing RTF.
2) **If you must rewrite the document:** Explicitly restore a theme-appropriate document color when leaving full mode.
- In the `else` branch (non-full), compute the theme text color (e.g., from `TextFillColorPrimaryBrush`) and call `SetEditorTextColor(editor, restoredColor)`.
- Consider temporarily suppressing autosave while applying formatting (so a style toggle doesn’t unintentionally persist formatting changes).
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Comment on lines
+400
to
+405
|
|
bool isLocal = !isFirebaseConnected && !isWebDavConnected && !isCustomFolder;
|
|
|
panel.Children.Add(CreateCheckItem(Lang.T("local"), isLocal, () =>
|
|
|
{
|
|
|
if (isCustomFolder) onResetFolder(); else if (isFirebaseConnected) onDisconnectFirebase();
|
|
|
onDone();
|
|
|
}));
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.

3. Local storage doesn't disconnect webdav 🐞 Bug ✓ Correctness
In the new storage submenu, clicking “Local” does not disconnect WebDAV when WebDAV is currently
connected. This leaves the app still configured for WebDAV even though the UI action implies
switching back to local storage.
Agent Prompt
## Issue description
Selecting “Local” in the storage submenu does not disconnect WebDAV when WebDAV is connected, so the app may remain in WebDAV mode.
## Issue Context
`CreateStorageSubMenu()` already receives both `isWebDavConnected` and `onDisconnectWebDav`, but the Local handler doesn’t use them.
## Fix Focus Areas
- ActionPanel.cs[384-406]
## Suggested fix
- Update the Local handler to also handle WebDAV:
- If `isWebDavConnected`, call `onDisconnectWebDav()` before `onDone()`.
- (Optional) Consider making “Local”, “Cloud (Firebase)”, “WebDAV”, and “Custom folder” mutually exclusive transitions (disconnect the other modes when switching).
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Mar 25, 2026
Reviewers
1 more reviewer
Reviewers whose approvals may not affect merge requirements
Uh oh!
There was an error while loading. Please reload this page.
Assignees
No one assigned
Milestone
No milestone
Development
Successfully merging this pull request may close these issues.
Uh oh!
There was an error while loading. Please reload this page.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
|