(event: KeyboardEvent)
| 1377 | } |
| 1378 | |
| 1379 | export function sequenceTokenFromEvent(event: KeyboardEvent): string | null { |
| 1380 | const resolved = resolveKeyFromEvent(event); |
| 1381 | // Sequence tokens are case-sensitive for letters (`<leader>q` vs |
| 1382 | // `<leader>Q` are different bindings). resolveKeyFromEvent returns |
| 1383 | // uppercase letters — fold them down so unmodified letters still |
| 1384 | // produce lowercase tokens, then promote to upper if Shift is held. |
| 1385 | let base: string | null |
| 1386 | if (resolved && /^[A-Z]$/.test(resolved)) { |
| 1387 | base = event.shiftKey ? resolved : resolved.toLowerCase() |
| 1388 | } else if (resolved) { |
| 1389 | base = resolved |
| 1390 | } else { |
| 1391 | base = normalizeSequenceBaseToken(event.key); |
| 1392 | } |
| 1393 | if (!base) return null; |
| 1394 | const modifiers: string[] = []; |
| 1395 | if (event.ctrlKey) modifiers.push("Ctrl"); |
| 1396 | if (event.altKey) modifiers.push("Alt"); |
| 1397 | if (event.metaKey) modifiers.push("Meta"); |
| 1398 | if (event.shiftKey && base.length !== 1) modifiers.push("Shift"); |
| 1399 | return normalizeSequenceToken( |
| 1400 | modifiers.length > 0 ? `${modifiers.join("+")}+${base}` : base, |
| 1401 | ); |
| 1402 | } |
| 1403 | |
| 1404 | export function matchesShortcutBinding( |
| 1405 | event: KeyboardEvent, |
no test coverage detected