From 1f79b7c737c8d3b30bb9c2ea6003cf573b9be56c Mon Sep 17 00:00:00 2001 From: Nitish Agarwal <1592163+nitishagar@users.noreply.github.com> Date: Mon, 17 Nov 2025 08:01:18 +0530 Subject: [PATCH] fix: normalize Unicode characters in paste modal for proper detection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #957 - Paste modal now correctly detects Spanish characters requiring AltRight modifier (@, |, #) and accented characters (ñ) by normalizing all input text to NFC form before keyboard layout lookup. Root cause: macOS and other sources may provide text in NFD (decomposed) form while keyboard layouts store characters in NFC (composed) form. JavaScript object property lookup requires exact byte match, causing lookups to fail despite characters being defined. Solution: Apply .normalize('NFC') to all user input characters before validation and paste execution. Testing: Browser-based validation testing completed with Spanish keyboard layout (es-ES) using text from multiple sources (TextEdit, Safari, Notes) on macOS. Hardware testing requires JetKVM device. --- ui/src/components/popovers/PasteModal.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ui/src/components/popovers/PasteModal.tsx b/ui/src/components/popovers/PasteModal.tsx index ccc5d307..9bc122d5 100644 --- a/ui/src/components/popovers/PasteModal.tsx +++ b/ui/src/components/popovers/PasteModal.tsx @@ -66,7 +66,8 @@ export default function PasteModal() { const macroSteps: MacroStep[] = []; for (const char of text) { - const keyprops = selectedKeyboard.chars[char]; + const normalizedChar = char.normalize('NFC'); + const keyprops = selectedKeyboard.chars[normalizedChar]; if (!keyprops) continue; const { key, shift, altRight, deadKey, accentKey } = keyprops; @@ -164,7 +165,7 @@ export default function PasteModal() { ...new Set( // @ts-expect-error TS doesn't recognize Intl.Segmenter in some environments [...new Intl.Segmenter().segment(value)] - .map(x => x.segment) + .map(x => x.segment.normalize('NFC')) .filter(char => !selectedKeyboard.chars[char]), ), ];