@mariozechner/pi-tui 0.29.1 → 0.30.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/keys.d.ts +11 -0
- package/dist/keys.d.ts.map +1 -1
- package/dist/keys.js +17 -0
- package/dist/keys.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export { type SettingItem, SettingsList, type SettingsListTheme } from "./compon
|
|
|
10
10
|
export { Spacer } from "./components/spacer.js";
|
|
11
11
|
export { Text } from "./components/text.js";
|
|
12
12
|
export { TruncatedText } from "./components/truncated-text.js";
|
|
13
|
-
export { isAltBackspace, isAltEnter, isAltLeft, isAltRight, isArrowDown, isArrowLeft, isArrowRight, isArrowUp, isBackspace, isCtrlA, isCtrlC, isCtrlD, isCtrlE, isCtrlG, isCtrlK, isCtrlLeft, isCtrlO, isCtrlP, isCtrlRight, isCtrlT, isCtrlU, isCtrlW, isCtrlZ, isDelete, isEnd, isEnter, isEscape, isHome, isShiftEnter, isShiftTab, isTab, Keys, } from "./keys.js";
|
|
13
|
+
export { isAltBackspace, isAltEnter, isAltLeft, isAltRight, isArrowDown, isArrowLeft, isArrowRight, isArrowUp, isBackspace, isCtrlA, isCtrlC, isCtrlD, isCtrlE, isCtrlG, isCtrlK, isCtrlL, isCtrlLeft, isCtrlO, isCtrlP, isCtrlRight, isCtrlT, isCtrlU, isCtrlW, isCtrlZ, isDelete, isEnd, isEnter, isEscape, isHome, isShiftCtrlP, isShiftEnter, isShiftTab, isTab, Keys, } from "./keys.js";
|
|
14
14
|
export { ProcessTerminal, type Terminal } from "./terminal.js";
|
|
15
15
|
export { type CellDimensions, calculateImageRows, detectCapabilities, encodeITerm2, encodeKitty, getCapabilities, getCellDimensions, getGifDimensions, getImageDimensions, getJpegDimensions, getPngDimensions, getWebpDimensions, type ImageDimensions, type ImageProtocol, type ImageRenderOptions, imageFallback, renderImage, resetCapabilitiesCache, setCellDimensions, type TerminalCapabilities, } from "./terminal-image.js";
|
|
16
16
|
export { type Component, Container, TUI } from "./tui.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACN,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,4BAA4B,EAC5B,KAAK,YAAY,GACjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,KAAK,gBAAgB,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC/F,OAAO,EAAE,KAAK,UAAU,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAChG,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvG,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EACN,cAAc,EACd,UAAU,EACV,SAAS,EACT,UAAU,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,WAAW,EACX,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,UAAU,EACV,OAAO,EACP,OAAO,EACP,WAAW,EACX,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,QAAQ,EACR,KAAK,EACL,OAAO,EACP,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,UAAU,EACV,KAAK,EACL,IAAI,GACJ,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE/D,OAAO,EACN,KAAK,cAAc,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,aAAa,EACb,WAAW,EACX,sBAAsB,EACtB,iBAAiB,EACjB,KAAK,oBAAoB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC","sourcesContent":["// Core TUI interfaces and classes\n\n// Autocomplete support\nexport {\n\ttype AutocompleteItem,\n\ttype AutocompleteProvider,\n\tCombinedAutocompleteProvider,\n\ttype SlashCommand,\n} from \"./autocomplete.js\";\n// Components\nexport { Box } from \"./components/box.js\";\nexport { Editor, type EditorTheme } from \"./components/editor.js\";\nexport { Image, type ImageOptions, type ImageTheme } from \"./components/image.js\";\nexport { Input } from \"./components/input.js\";\nexport { Loader } from \"./components/loader.js\";\nexport { type DefaultTextStyle, Markdown, type MarkdownTheme } from \"./components/markdown.js\";\nexport { type SelectItem, SelectList, type SelectListTheme } from \"./components/select-list.js\";\nexport { type SettingItem, SettingsList, type SettingsListTheme } from \"./components/settings-list.js\";\nexport { Spacer } from \"./components/spacer.js\";\nexport { Text } from \"./components/text.js\";\nexport { TruncatedText } from \"./components/truncated-text.js\";\n// Kitty keyboard protocol helpers\nexport {\n\tisAltBackspace,\n\tisAltEnter,\n\tisAltLeft,\n\tisAltRight,\n\tisArrowDown,\n\tisArrowLeft,\n\tisArrowRight,\n\tisArrowUp,\n\tisBackspace,\n\tisCtrlA,\n\tisCtrlC,\n\tisCtrlD,\n\tisCtrlE,\n\tisCtrlG,\n\tisCtrlK,\n\tisCtrlLeft,\n\tisCtrlO,\n\tisCtrlP,\n\tisCtrlRight,\n\tisCtrlT,\n\tisCtrlU,\n\tisCtrlW,\n\tisCtrlZ,\n\tisDelete,\n\tisEnd,\n\tisEnter,\n\tisEscape,\n\tisHome,\n\tisShiftEnter,\n\tisShiftTab,\n\tisTab,\n\tKeys,\n} from \"./keys.js\";\n// Terminal interface and implementations\nexport { ProcessTerminal, type Terminal } from \"./terminal.js\";\n// Terminal image support\nexport {\n\ttype CellDimensions,\n\tcalculateImageRows,\n\tdetectCapabilities,\n\tencodeITerm2,\n\tencodeKitty,\n\tgetCapabilities,\n\tgetCellDimensions,\n\tgetGifDimensions,\n\tgetImageDimensions,\n\tgetJpegDimensions,\n\tgetPngDimensions,\n\tgetWebpDimensions,\n\ttype ImageDimensions,\n\ttype ImageProtocol,\n\ttype ImageRenderOptions,\n\timageFallback,\n\trenderImage,\n\tresetCapabilitiesCache,\n\tsetCellDimensions,\n\ttype TerminalCapabilities,\n} from \"./terminal-image.js\";\nexport { type Component, Container, TUI } from \"./tui.js\";\n// Utilities\nexport { truncateToWidth, visibleWidth } from \"./utils.js\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACN,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,4BAA4B,EAC5B,KAAK,YAAY,GACjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,KAAK,gBAAgB,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC/F,OAAO,EAAE,KAAK,UAAU,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAChG,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvG,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EACN,cAAc,EACd,UAAU,EACV,SAAS,EACT,UAAU,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,WAAW,EACX,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,UAAU,EACV,OAAO,EACP,OAAO,EACP,WAAW,EACX,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,QAAQ,EACR,KAAK,EACL,OAAO,EACP,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,KAAK,EACL,IAAI,GACJ,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE/D,OAAO,EACN,KAAK,cAAc,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,aAAa,EACb,WAAW,EACX,sBAAsB,EACtB,iBAAiB,EACjB,KAAK,oBAAoB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC","sourcesContent":["// Core TUI interfaces and classes\n\n// Autocomplete support\nexport {\n\ttype AutocompleteItem,\n\ttype AutocompleteProvider,\n\tCombinedAutocompleteProvider,\n\ttype SlashCommand,\n} from \"./autocomplete.js\";\n// Components\nexport { Box } from \"./components/box.js\";\nexport { Editor, type EditorTheme } from \"./components/editor.js\";\nexport { Image, type ImageOptions, type ImageTheme } from \"./components/image.js\";\nexport { Input } from \"./components/input.js\";\nexport { Loader } from \"./components/loader.js\";\nexport { type DefaultTextStyle, Markdown, type MarkdownTheme } from \"./components/markdown.js\";\nexport { type SelectItem, SelectList, type SelectListTheme } from \"./components/select-list.js\";\nexport { type SettingItem, SettingsList, type SettingsListTheme } from \"./components/settings-list.js\";\nexport { Spacer } from \"./components/spacer.js\";\nexport { Text } from \"./components/text.js\";\nexport { TruncatedText } from \"./components/truncated-text.js\";\n// Kitty keyboard protocol helpers\nexport {\n\tisAltBackspace,\n\tisAltEnter,\n\tisAltLeft,\n\tisAltRight,\n\tisArrowDown,\n\tisArrowLeft,\n\tisArrowRight,\n\tisArrowUp,\n\tisBackspace,\n\tisCtrlA,\n\tisCtrlC,\n\tisCtrlD,\n\tisCtrlE,\n\tisCtrlG,\n\tisCtrlK,\n\tisCtrlL,\n\tisCtrlLeft,\n\tisCtrlO,\n\tisCtrlP,\n\tisCtrlRight,\n\tisCtrlT,\n\tisCtrlU,\n\tisCtrlW,\n\tisCtrlZ,\n\tisDelete,\n\tisEnd,\n\tisEnter,\n\tisEscape,\n\tisHome,\n\tisShiftCtrlP,\n\tisShiftEnter,\n\tisShiftTab,\n\tisTab,\n\tKeys,\n} from \"./keys.js\";\n// Terminal interface and implementations\nexport { ProcessTerminal, type Terminal } from \"./terminal.js\";\n// Terminal image support\nexport {\n\ttype CellDimensions,\n\tcalculateImageRows,\n\tdetectCapabilities,\n\tencodeITerm2,\n\tencodeKitty,\n\tgetCapabilities,\n\tgetCellDimensions,\n\tgetGifDimensions,\n\tgetImageDimensions,\n\tgetJpegDimensions,\n\tgetPngDimensions,\n\tgetWebpDimensions,\n\ttype ImageDimensions,\n\ttype ImageProtocol,\n\ttype ImageRenderOptions,\n\timageFallback,\n\trenderImage,\n\tresetCapabilitiesCache,\n\tsetCellDimensions,\n\ttype TerminalCapabilities,\n} from \"./terminal-image.js\";\nexport { type Component, Container, TUI } from \"./tui.js\";\n// Utilities\nexport { truncateToWidth, visibleWidth } from \"./utils.js\";\n"]}
|
package/dist/index.js
CHANGED
|
@@ -14,7 +14,7 @@ export { Spacer } from "./components/spacer.js";
|
|
|
14
14
|
export { Text } from "./components/text.js";
|
|
15
15
|
export { TruncatedText } from "./components/truncated-text.js";
|
|
16
16
|
// Kitty keyboard protocol helpers
|
|
17
|
-
export { isAltBackspace, isAltEnter, isAltLeft, isAltRight, isArrowDown, isArrowLeft, isArrowRight, isArrowUp, isBackspace, isCtrlA, isCtrlC, isCtrlD, isCtrlE, isCtrlG, isCtrlK, isCtrlLeft, isCtrlO, isCtrlP, isCtrlRight, isCtrlT, isCtrlU, isCtrlW, isCtrlZ, isDelete, isEnd, isEnter, isEscape, isHome, isShiftEnter, isShiftTab, isTab, Keys, } from "./keys.js";
|
|
17
|
+
export { isAltBackspace, isAltEnter, isAltLeft, isAltRight, isArrowDown, isArrowLeft, isArrowRight, isArrowUp, isBackspace, isCtrlA, isCtrlC, isCtrlD, isCtrlE, isCtrlG, isCtrlK, isCtrlL, isCtrlLeft, isCtrlO, isCtrlP, isCtrlRight, isCtrlT, isCtrlU, isCtrlW, isCtrlZ, isDelete, isEnd, isEnter, isEscape, isHome, isShiftCtrlP, isShiftEnter, isShiftTab, isTab, Keys, } from "./keys.js";
|
|
18
18
|
// Terminal interface and implementations
|
|
19
19
|
export { ProcessTerminal } from "./terminal.js";
|
|
20
20
|
// Terminal image support
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAElC,uBAAuB;AACvB,OAAO,EAGN,4BAA4B,GAE5B,MAAM,mBAAmB,CAAC;AAC3B,aAAa;AACb,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAoB,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,KAAK,EAAsC,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAyB,QAAQ,EAAsB,MAAM,0BAA0B,CAAC;AAC/F,OAAO,EAAmB,UAAU,EAAwB,MAAM,6BAA6B,CAAC;AAChG,OAAO,EAAoB,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AACvG,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,kCAAkC;AAClC,OAAO,EACN,cAAc,EACd,UAAU,EACV,SAAS,EACT,UAAU,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,WAAW,EACX,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,UAAU,EACV,OAAO,EACP,OAAO,EACP,WAAW,EACX,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,QAAQ,EACR,KAAK,EACL,OAAO,EACP,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,UAAU,EACV,KAAK,EACL,IAAI,GACJ,MAAM,WAAW,CAAC;AACnB,yCAAyC;AACzC,OAAO,EAAE,eAAe,EAAiB,MAAM,eAAe,CAAC;AAC/D,yBAAyB;AACzB,OAAO,EAEN,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EAIjB,aAAa,EACb,WAAW,EACX,sBAAsB,EACtB,iBAAiB,GAEjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAkB,SAAS,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC1D,YAAY;AACZ,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC","sourcesContent":["// Core TUI interfaces and classes\n\n// Autocomplete support\nexport {\n\ttype AutocompleteItem,\n\ttype AutocompleteProvider,\n\tCombinedAutocompleteProvider,\n\ttype SlashCommand,\n} from \"./autocomplete.js\";\n// Components\nexport { Box } from \"./components/box.js\";\nexport { Editor, type EditorTheme } from \"./components/editor.js\";\nexport { Image, type ImageOptions, type ImageTheme } from \"./components/image.js\";\nexport { Input } from \"./components/input.js\";\nexport { Loader } from \"./components/loader.js\";\nexport { type DefaultTextStyle, Markdown, type MarkdownTheme } from \"./components/markdown.js\";\nexport { type SelectItem, SelectList, type SelectListTheme } from \"./components/select-list.js\";\nexport { type SettingItem, SettingsList, type SettingsListTheme } from \"./components/settings-list.js\";\nexport { Spacer } from \"./components/spacer.js\";\nexport { Text } from \"./components/text.js\";\nexport { TruncatedText } from \"./components/truncated-text.js\";\n// Kitty keyboard protocol helpers\nexport {\n\tisAltBackspace,\n\tisAltEnter,\n\tisAltLeft,\n\tisAltRight,\n\tisArrowDown,\n\tisArrowLeft,\n\tisArrowRight,\n\tisArrowUp,\n\tisBackspace,\n\tisCtrlA,\n\tisCtrlC,\n\tisCtrlD,\n\tisCtrlE,\n\tisCtrlG,\n\tisCtrlK,\n\tisCtrlLeft,\n\tisCtrlO,\n\tisCtrlP,\n\tisCtrlRight,\n\tisCtrlT,\n\tisCtrlU,\n\tisCtrlW,\n\tisCtrlZ,\n\tisDelete,\n\tisEnd,\n\tisEnter,\n\tisEscape,\n\tisHome,\n\tisShiftEnter,\n\tisShiftTab,\n\tisTab,\n\tKeys,\n} from \"./keys.js\";\n// Terminal interface and implementations\nexport { ProcessTerminal, type Terminal } from \"./terminal.js\";\n// Terminal image support\nexport {\n\ttype CellDimensions,\n\tcalculateImageRows,\n\tdetectCapabilities,\n\tencodeITerm2,\n\tencodeKitty,\n\tgetCapabilities,\n\tgetCellDimensions,\n\tgetGifDimensions,\n\tgetImageDimensions,\n\tgetJpegDimensions,\n\tgetPngDimensions,\n\tgetWebpDimensions,\n\ttype ImageDimensions,\n\ttype ImageProtocol,\n\ttype ImageRenderOptions,\n\timageFallback,\n\trenderImage,\n\tresetCapabilitiesCache,\n\tsetCellDimensions,\n\ttype TerminalCapabilities,\n} from \"./terminal-image.js\";\nexport { type Component, Container, TUI } from \"./tui.js\";\n// Utilities\nexport { truncateToWidth, visibleWidth } from \"./utils.js\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAElC,uBAAuB;AACvB,OAAO,EAGN,4BAA4B,GAE5B,MAAM,mBAAmB,CAAC;AAC3B,aAAa;AACb,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAoB,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,KAAK,EAAsC,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAyB,QAAQ,EAAsB,MAAM,0BAA0B,CAAC;AAC/F,OAAO,EAAmB,UAAU,EAAwB,MAAM,6BAA6B,CAAC;AAChG,OAAO,EAAoB,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AACvG,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,kCAAkC;AAClC,OAAO,EACN,cAAc,EACd,UAAU,EACV,SAAS,EACT,UAAU,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,WAAW,EACX,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,UAAU,EACV,OAAO,EACP,OAAO,EACP,WAAW,EACX,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,QAAQ,EACR,KAAK,EACL,OAAO,EACP,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,KAAK,EACL,IAAI,GACJ,MAAM,WAAW,CAAC;AACnB,yCAAyC;AACzC,OAAO,EAAE,eAAe,EAAiB,MAAM,eAAe,CAAC;AAC/D,yBAAyB;AACzB,OAAO,EAEN,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EAIjB,aAAa,EACb,WAAW,EACX,sBAAsB,EACtB,iBAAiB,GAEjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAkB,SAAS,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC1D,YAAY;AACZ,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC","sourcesContent":["// Core TUI interfaces and classes\n\n// Autocomplete support\nexport {\n\ttype AutocompleteItem,\n\ttype AutocompleteProvider,\n\tCombinedAutocompleteProvider,\n\ttype SlashCommand,\n} from \"./autocomplete.js\";\n// Components\nexport { Box } from \"./components/box.js\";\nexport { Editor, type EditorTheme } from \"./components/editor.js\";\nexport { Image, type ImageOptions, type ImageTheme } from \"./components/image.js\";\nexport { Input } from \"./components/input.js\";\nexport { Loader } from \"./components/loader.js\";\nexport { type DefaultTextStyle, Markdown, type MarkdownTheme } from \"./components/markdown.js\";\nexport { type SelectItem, SelectList, type SelectListTheme } from \"./components/select-list.js\";\nexport { type SettingItem, SettingsList, type SettingsListTheme } from \"./components/settings-list.js\";\nexport { Spacer } from \"./components/spacer.js\";\nexport { Text } from \"./components/text.js\";\nexport { TruncatedText } from \"./components/truncated-text.js\";\n// Kitty keyboard protocol helpers\nexport {\n\tisAltBackspace,\n\tisAltEnter,\n\tisAltLeft,\n\tisAltRight,\n\tisArrowDown,\n\tisArrowLeft,\n\tisArrowRight,\n\tisArrowUp,\n\tisBackspace,\n\tisCtrlA,\n\tisCtrlC,\n\tisCtrlD,\n\tisCtrlE,\n\tisCtrlG,\n\tisCtrlK,\n\tisCtrlL,\n\tisCtrlLeft,\n\tisCtrlO,\n\tisCtrlP,\n\tisCtrlRight,\n\tisCtrlT,\n\tisCtrlU,\n\tisCtrlW,\n\tisCtrlZ,\n\tisDelete,\n\tisEnd,\n\tisEnter,\n\tisEscape,\n\tisHome,\n\tisShiftCtrlP,\n\tisShiftEnter,\n\tisShiftTab,\n\tisTab,\n\tKeys,\n} from \"./keys.js\";\n// Terminal interface and implementations\nexport { ProcessTerminal, type Terminal } from \"./terminal.js\";\n// Terminal image support\nexport {\n\ttype CellDimensions,\n\tcalculateImageRows,\n\tdetectCapabilities,\n\tencodeITerm2,\n\tencodeKitty,\n\tgetCapabilities,\n\tgetCellDimensions,\n\tgetGifDimensions,\n\tgetImageDimensions,\n\tgetJpegDimensions,\n\tgetPngDimensions,\n\tgetWebpDimensions,\n\ttype ImageDimensions,\n\ttype ImageProtocol,\n\ttype ImageRenderOptions,\n\timageFallback,\n\trenderImage,\n\tresetCapabilitiesCache,\n\tsetCellDimensions,\n\ttype TerminalCapabilities,\n} from \"./terminal-image.js\";\nexport { type Component, Container, TUI } from \"./tui.js\";\n// Utilities\nexport { truncateToWidth, visibleWidth } from \"./utils.js\";\n"]}
|
package/dist/keys.d.ts
CHANGED
|
@@ -27,6 +27,7 @@ export declare const Keys: {
|
|
|
27
27
|
readonly CTRL_E: string;
|
|
28
28
|
readonly CTRL_G: string;
|
|
29
29
|
readonly CTRL_K: string;
|
|
30
|
+
readonly CTRL_L: string;
|
|
30
31
|
readonly CTRL_O: string;
|
|
31
32
|
readonly CTRL_P: string;
|
|
32
33
|
readonly CTRL_T: string;
|
|
@@ -86,6 +87,11 @@ export declare function isCtrlG(data: string): boolean;
|
|
|
86
87
|
* that may send trailing bytes.
|
|
87
88
|
*/
|
|
88
89
|
export declare function isCtrlK(data: string): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Check if input matches Ctrl+L (raw byte or Kitty protocol).
|
|
92
|
+
* Ignores lock key bits.
|
|
93
|
+
*/
|
|
94
|
+
export declare function isCtrlL(data: string): boolean;
|
|
89
95
|
/**
|
|
90
96
|
* Check if input matches Ctrl+O (raw byte or Kitty protocol).
|
|
91
97
|
* Ignores lock key bits.
|
|
@@ -96,6 +102,11 @@ export declare function isCtrlO(data: string): boolean;
|
|
|
96
102
|
* Ignores lock key bits.
|
|
97
103
|
*/
|
|
98
104
|
export declare function isCtrlP(data: string): boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Check if input matches Shift+Ctrl+P (Kitty protocol only).
|
|
107
|
+
* Ignores lock key bits.
|
|
108
|
+
*/
|
|
109
|
+
export declare function isShiftCtrlP(data: string): boolean;
|
|
99
110
|
/**
|
|
100
111
|
* Check if input matches Ctrl+T (raw byte or Kitty protocol).
|
|
101
112
|
* Ignores lock key bits.
|
package/dist/keys.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Kitty keyboard protocol key sequence helpers.\n *\n * The Kitty keyboard protocol sends enhanced escape sequences in the format:\n * \\x1b[<codepoint>;<modifier>u\n *\n * Modifier bits (before adding 1 for transmission):\n * - Shift: 1 (value 2)\n * - Alt: 2 (value 3)\n * - Ctrl: 4 (value 5)\n * - Super: 8 (value 9)\n * - Hyper: 16\n * - Meta: 32\n * - Caps_Lock: 64\n * - Num_Lock: 128\n *\n * See: https://sw.kovidgoyal.net/kitty/keyboard-protocol/\n *\n * NOTE: Some terminals (e.g., Ghostty on Linux) include lock key states\n * (Caps Lock, Num Lock) in the modifier field. We mask these out when\n * checking for key combinations since they shouldn't affect behavior.\n */\n\n// Common codepoints\nconst CODEPOINTS = {\n\t// Letters (lowercase ASCII)\n\ta: 97,\n\tc: 99,\n\td: 100,\n\te: 101,\n\tg: 103,\n\tk: 107,\n\to: 111,\n\tp: 112,\n\tt: 116,\n\tu: 117,\n\tw: 119,\n\tz: 122,\n\n\t// Special keys\n\tescape: 27,\n\ttab: 9,\n\tenter: 13,\n\tbackspace: 127,\n} as const;\n\n// Lock key bits to ignore when matching (Caps Lock + Num Lock)\nconst LOCK_MASK = 64 + 128; // 192\n\n// Modifier bits (before adding 1)\nconst MODIFIERS = {\n\tshift: 1,\n\talt: 2,\n\tctrl: 4,\n\tsuper: 8,\n} as const;\n\n/**\n * Build a Kitty keyboard protocol sequence for a key with modifier.\n */\nfunction kittySequence(codepoint: number, modifier: number): string {\n\treturn `\\x1b[${codepoint};${modifier + 1}u`;\n}\n\n/**\n * Parsed Kitty keyboard protocol sequence.\n */\ninterface ParsedKittySequence {\n\tcodepoint: number;\n\tmodifier: number; // Actual modifier bits (after subtracting 1)\n}\n\n/**\n * Parse a Kitty keyboard protocol sequence.\n * Handles formats:\n * - \\x1b[<codepoint>u (no modifier)\n * - \\x1b[<codepoint>;<modifier>u (with modifier)\n * - \\x1b[1;<modifier>A/B/C/D (arrow keys with modifier)\n *\n * Returns null if not a valid Kitty sequence.\n */\n// Virtual codepoints for functional keys (negative to avoid conflicts)\nconst FUNCTIONAL_CODEPOINTS = {\n\tdelete: -10,\n\tinsert: -11,\n\tpageUp: -12,\n\tpageDown: -13,\n\thome: -14,\n\tend: -15,\n} as const;\n\nfunction parseKittySequence(data: string): ParsedKittySequence | null {\n\t// Match CSI u format: \\x1b[<num>u or \\x1b[<num>;<mod>u\n\tconst csiUMatch = data.match(/^\\x1b\\[(\\d+)(?:;(\\d+))?u$/);\n\tif (csiUMatch) {\n\t\tconst codepoint = parseInt(csiUMatch[1]!, 10);\n\t\tconst modValue = csiUMatch[2] ? parseInt(csiUMatch[2], 10) : 1;\n\t\treturn { codepoint, modifier: modValue - 1 };\n\t}\n\n\t// Match arrow keys with modifier: \\x1b[1;<mod>A/B/C/D\n\tconst arrowMatch = data.match(/^\\x1b\\[1;(\\d+)([ABCD])$/);\n\tif (arrowMatch) {\n\t\tconst modValue = parseInt(arrowMatch[1]!, 10);\n\t\t// Map arrow letters to virtual codepoints for easier matching\n\t\tconst arrowCodes: Record<string, number> = { A: -1, B: -2, C: -3, D: -4 };\n\t\tconst codepoint = arrowCodes[arrowMatch[2]!]!;\n\t\treturn { codepoint, modifier: modValue - 1 };\n\t}\n\n\t// Match functional keys with ~ terminator: \\x1b[<num>~ or \\x1b[<num>;<mod>~\n\t// DELETE=3, INSERT=2, PAGEUP=5, PAGEDOWN=6, etc.\n\tconst funcMatch = data.match(/^\\x1b\\[(\\d+)(?:;(\\d+))?~$/);\n\tif (funcMatch) {\n\t\tconst keyNum = parseInt(funcMatch[1]!, 10);\n\t\tconst modValue = funcMatch[2] ? parseInt(funcMatch[2], 10) : 1;\n\t\t// Map functional key numbers to virtual codepoints\n\t\tconst funcCodes: Record<number, number> = {\n\t\t\t2: FUNCTIONAL_CODEPOINTS.insert,\n\t\t\t3: FUNCTIONAL_CODEPOINTS.delete,\n\t\t\t5: FUNCTIONAL_CODEPOINTS.pageUp,\n\t\t\t6: FUNCTIONAL_CODEPOINTS.pageDown,\n\t\t\t7: FUNCTIONAL_CODEPOINTS.home, // Alternative home\n\t\t\t8: FUNCTIONAL_CODEPOINTS.end, // Alternative end\n\t\t};\n\t\tconst codepoint = funcCodes[keyNum];\n\t\tif (codepoint !== undefined) {\n\t\t\treturn { codepoint, modifier: modValue - 1 };\n\t\t}\n\t}\n\n\t// Match Home/End with modifier: \\x1b[1;<mod>H/F\n\tconst homeEndMatch = data.match(/^\\x1b\\[1;(\\d+)([HF])$/);\n\tif (homeEndMatch) {\n\t\tconst modValue = parseInt(homeEndMatch[1]!, 10);\n\t\tconst codepoint = homeEndMatch[2] === \"H\" ? FUNCTIONAL_CODEPOINTS.home : FUNCTIONAL_CODEPOINTS.end;\n\t\treturn { codepoint, modifier: modValue - 1 };\n\t}\n\n\treturn null;\n}\n\n/**\n * Check if a Kitty sequence matches the expected codepoint and modifier,\n * ignoring lock key bits (Caps Lock, Num Lock).\n */\nfunction matchesKittySequence(data: string, expectedCodepoint: number, expectedModifier: number): boolean {\n\tconst parsed = parseKittySequence(data);\n\tif (!parsed) return false;\n\n\t// Mask out lock bits from both sides for comparison\n\tconst actualMod = parsed.modifier & ~LOCK_MASK;\n\tconst expectedMod = expectedModifier & ~LOCK_MASK;\n\n\treturn parsed.codepoint === expectedCodepoint && actualMod === expectedMod;\n}\n\n// Pre-built sequences for common key combinations\nexport const Keys = {\n\t// Ctrl+<letter> combinations\n\tCTRL_A: kittySequence(CODEPOINTS.a, MODIFIERS.ctrl),\n\tCTRL_C: kittySequence(CODEPOINTS.c, MODIFIERS.ctrl),\n\tCTRL_D: kittySequence(CODEPOINTS.d, MODIFIERS.ctrl),\n\tCTRL_E: kittySequence(CODEPOINTS.e, MODIFIERS.ctrl),\n\tCTRL_G: kittySequence(CODEPOINTS.g, MODIFIERS.ctrl),\n\tCTRL_K: kittySequence(CODEPOINTS.k, MODIFIERS.ctrl),\n\tCTRL_O: kittySequence(CODEPOINTS.o, MODIFIERS.ctrl),\n\tCTRL_P: kittySequence(CODEPOINTS.p, MODIFIERS.ctrl),\n\tCTRL_T: kittySequence(CODEPOINTS.t, MODIFIERS.ctrl),\n\tCTRL_U: kittySequence(CODEPOINTS.u, MODIFIERS.ctrl),\n\tCTRL_W: kittySequence(CODEPOINTS.w, MODIFIERS.ctrl),\n\tCTRL_Z: kittySequence(CODEPOINTS.z, MODIFIERS.ctrl),\n\n\t// Enter combinations\n\tSHIFT_ENTER: kittySequence(CODEPOINTS.enter, MODIFIERS.shift),\n\tALT_ENTER: kittySequence(CODEPOINTS.enter, MODIFIERS.alt),\n\tCTRL_ENTER: kittySequence(CODEPOINTS.enter, MODIFIERS.ctrl),\n\n\t// Tab combinations\n\tSHIFT_TAB: kittySequence(CODEPOINTS.tab, MODIFIERS.shift),\n\n\t// Backspace combinations\n\tALT_BACKSPACE: kittySequence(CODEPOINTS.backspace, MODIFIERS.alt),\n} as const;\n\n/**\n * Check if input matches a Kitty protocol Ctrl+<key> sequence.\n * Ignores lock key bits (Caps Lock, Num Lock).\n * @param data - The input data to check\n * @param key - Single lowercase letter (e.g., 'c' for Ctrl+C)\n */\nexport function isKittyCtrl(data: string, key: string): boolean {\n\tif (key.length !== 1) return false;\n\tconst codepoint = key.charCodeAt(0);\n\t// Check exact match first (fast path)\n\tif (data === kittySequence(codepoint, MODIFIERS.ctrl)) return true;\n\t// Check with lock bits masked out\n\treturn matchesKittySequence(data, codepoint, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches a Kitty protocol key sequence with specific modifier.\n * Ignores lock key bits (Caps Lock, Num Lock).\n * @param data - The input data to check\n * @param codepoint - ASCII codepoint of the key\n * @param modifier - Modifier value (use MODIFIERS constants)\n */\nexport function isKittyKey(data: string, codepoint: number, modifier: number): boolean {\n\t// Check exact match first (fast path)\n\tif (data === kittySequence(codepoint, modifier)) return true;\n\t// Check with lock bits masked out\n\treturn matchesKittySequence(data, codepoint, modifier);\n}\n\n// Raw control character codes\nconst RAW = {\n\tCTRL_A: \"\\x01\",\n\tCTRL_C: \"\\x03\",\n\tCTRL_D: \"\\x04\",\n\tCTRL_E: \"\\x05\",\n\tCTRL_G: \"\\x07\",\n\tCTRL_K: \"\\x0b\",\n\tCTRL_O: \"\\x0f\",\n\tCTRL_P: \"\\x10\",\n\tCTRL_T: \"\\x14\",\n\tCTRL_U: \"\\x15\",\n\tCTRL_W: \"\\x17\",\n\tCTRL_Z: \"\\x1a\",\n\tALT_BACKSPACE: \"\\x1b\\x7f\",\n\tSHIFT_TAB: \"\\x1b[Z\",\n} as const;\n\n/**\n * Check if input matches Ctrl+A (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlA(data: string): boolean {\n\treturn data === RAW.CTRL_A || data === Keys.CTRL_A || matchesKittySequence(data, CODEPOINTS.a, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+C (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlC(data: string): boolean {\n\treturn data === RAW.CTRL_C || data === Keys.CTRL_C || matchesKittySequence(data, CODEPOINTS.c, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+D (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlD(data: string): boolean {\n\treturn data === RAW.CTRL_D || data === Keys.CTRL_D || matchesKittySequence(data, CODEPOINTS.d, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+E (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlE(data: string): boolean {\n\treturn data === RAW.CTRL_E || data === Keys.CTRL_E || matchesKittySequence(data, CODEPOINTS.e, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+G (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlG(data: string): boolean {\n\treturn data === RAW.CTRL_G || data === Keys.CTRL_G || matchesKittySequence(data, CODEPOINTS.g, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+K (raw byte or Kitty protocol).\n * Ignores lock key bits.\n * Also checks if first byte is 0x0b for compatibility with terminals\n * that may send trailing bytes.\n */\nexport function isCtrlK(data: string): boolean {\n\treturn (\n\t\tdata === RAW.CTRL_K ||\n\t\t(data.length > 0 && data.charCodeAt(0) === 0x0b) ||\n\t\tdata === Keys.CTRL_K ||\n\t\tmatchesKittySequence(data, CODEPOINTS.k, MODIFIERS.ctrl)\n\t);\n}\n\n/**\n * Check if input matches Ctrl+O (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlO(data: string): boolean {\n\treturn data === RAW.CTRL_O || data === Keys.CTRL_O || matchesKittySequence(data, CODEPOINTS.o, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+P (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlP(data: string): boolean {\n\treturn data === RAW.CTRL_P || data === Keys.CTRL_P || matchesKittySequence(data, CODEPOINTS.p, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+T (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlT(data: string): boolean {\n\treturn data === RAW.CTRL_T || data === Keys.CTRL_T || matchesKittySequence(data, CODEPOINTS.t, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+U (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlU(data: string): boolean {\n\treturn data === RAW.CTRL_U || data === Keys.CTRL_U || matchesKittySequence(data, CODEPOINTS.u, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+W (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlW(data: string): boolean {\n\treturn data === RAW.CTRL_W || data === Keys.CTRL_W || matchesKittySequence(data, CODEPOINTS.w, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+Z (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlZ(data: string): boolean {\n\treturn data === RAW.CTRL_Z || data === Keys.CTRL_Z || matchesKittySequence(data, CODEPOINTS.z, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Alt+Backspace (legacy or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isAltBackspace(data: string): boolean {\n\treturn (\n\t\tdata === RAW.ALT_BACKSPACE ||\n\t\tdata === Keys.ALT_BACKSPACE ||\n\t\tmatchesKittySequence(data, CODEPOINTS.backspace, MODIFIERS.alt)\n\t);\n}\n\n/**\n * Check if input matches Shift+Tab (legacy or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isShiftTab(data: string): boolean {\n\treturn (\n\t\tdata === RAW.SHIFT_TAB || data === Keys.SHIFT_TAB || matchesKittySequence(data, CODEPOINTS.tab, MODIFIERS.shift)\n\t);\n}\n\n/**\n * Check if input matches the Escape key (raw byte or Kitty protocol).\n * Raw: \\x1b (single byte)\n * Kitty: \\x1b[27u (codepoint 27 = escape)\n * Ignores lock key bits.\n */\nexport function isEscape(data: string): boolean {\n\treturn data === \"\\x1b\" || data === `\\x1b[${CODEPOINTS.escape}u` || matchesKittySequence(data, CODEPOINTS.escape, 0);\n}\n\n// Arrow key virtual codepoints (negative to avoid conflicts with real codepoints)\nconst ARROW_CODEPOINTS = {\n\tup: -1,\n\tdown: -2,\n\tright: -3,\n\tleft: -4,\n} as const;\n\n/**\n * Check if input matches Arrow Up key.\n * Handles both legacy (\\x1b[A) and Kitty protocol with modifiers.\n */\nexport function isArrowUp(data: string): boolean {\n\treturn data === \"\\x1b[A\" || matchesKittySequence(data, ARROW_CODEPOINTS.up, 0);\n}\n\n/**\n * Check if input matches Arrow Down key.\n * Handles both legacy (\\x1b[B) and Kitty protocol with modifiers.\n */\nexport function isArrowDown(data: string): boolean {\n\treturn data === \"\\x1b[B\" || matchesKittySequence(data, ARROW_CODEPOINTS.down, 0);\n}\n\n/**\n * Check if input matches Arrow Right key.\n * Handles both legacy (\\x1b[C) and Kitty protocol with modifiers.\n */\nexport function isArrowRight(data: string): boolean {\n\treturn data === \"\\x1b[C\" || matchesKittySequence(data, ARROW_CODEPOINTS.right, 0);\n}\n\n/**\n * Check if input matches Arrow Left key.\n * Handles both legacy (\\x1b[D) and Kitty protocol with modifiers.\n */\nexport function isArrowLeft(data: string): boolean {\n\treturn data === \"\\x1b[D\" || matchesKittySequence(data, ARROW_CODEPOINTS.left, 0);\n}\n\n/**\n * Check if input matches plain Tab key (no modifiers).\n * Handles both legacy (\\t) and Kitty protocol.\n */\nexport function isTab(data: string): boolean {\n\treturn data === \"\\t\" || matchesKittySequence(data, CODEPOINTS.tab, 0);\n}\n\n/**\n * Check if input matches plain Enter/Return key (no modifiers).\n * Handles both legacy (\\r) and Kitty protocol.\n */\nexport function isEnter(data: string): boolean {\n\treturn data === \"\\r\" || matchesKittySequence(data, CODEPOINTS.enter, 0);\n}\n\n/**\n * Check if input matches plain Backspace key (no modifiers).\n * Handles both legacy (\\x7f, \\x08) and Kitty protocol.\n */\nexport function isBackspace(data: string): boolean {\n\treturn data === \"\\x7f\" || data === \"\\x08\" || matchesKittySequence(data, CODEPOINTS.backspace, 0);\n}\n\n/**\n * Check if input matches Shift+Enter.\n * Ignores lock key bits.\n */\nexport function isShiftEnter(data: string): boolean {\n\treturn data === Keys.SHIFT_ENTER || matchesKittySequence(data, CODEPOINTS.enter, MODIFIERS.shift);\n}\n\n/**\n * Check if input matches Alt+Enter.\n * Ignores lock key bits.\n */\nexport function isAltEnter(data: string): boolean {\n\treturn data === Keys.ALT_ENTER || data === \"\\x1b\\r\" || matchesKittySequence(data, CODEPOINTS.enter, MODIFIERS.alt);\n}\n\n/**\n * Check if input matches Option/Alt+Left (word navigation).\n * Handles multiple formats including Kitty protocol.\n */\nexport function isAltLeft(data: string): boolean {\n\treturn data === \"\\x1b[1;3D\" || data === \"\\x1bb\" || matchesKittySequence(data, ARROW_CODEPOINTS.left, MODIFIERS.alt);\n}\n\n/**\n * Check if input matches Option/Alt+Right (word navigation).\n * Handles multiple formats including Kitty protocol.\n */\nexport function isAltRight(data: string): boolean {\n\treturn data === \"\\x1b[1;3C\" || data === \"\\x1bf\" || matchesKittySequence(data, ARROW_CODEPOINTS.right, MODIFIERS.alt);\n}\n\n/**\n * Check if input matches Ctrl+Left (word navigation).\n * Handles multiple formats including Kitty protocol.\n */\nexport function isCtrlLeft(data: string): boolean {\n\treturn data === \"\\x1b[1;5D\" || matchesKittySequence(data, ARROW_CODEPOINTS.left, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+Right (word navigation).\n * Handles multiple formats including Kitty protocol.\n */\nexport function isCtrlRight(data: string): boolean {\n\treturn data === \"\\x1b[1;5C\" || matchesKittySequence(data, ARROW_CODEPOINTS.right, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Home key.\n * Handles legacy formats and Kitty protocol with lock key modifiers.\n */\nexport function isHome(data: string): boolean {\n\treturn (\n\t\tdata === \"\\x1b[H\" ||\n\t\tdata === \"\\x1b[1~\" ||\n\t\tdata === \"\\x1b[7~\" ||\n\t\tmatchesKittySequence(data, FUNCTIONAL_CODEPOINTS.home, 0)\n\t);\n}\n\n/**\n * Check if input matches End key.\n * Handles legacy formats and Kitty protocol with lock key modifiers.\n */\nexport function isEnd(data: string): boolean {\n\treturn (\n\t\tdata === \"\\x1b[F\" ||\n\t\tdata === \"\\x1b[4~\" ||\n\t\tdata === \"\\x1b[8~\" ||\n\t\tmatchesKittySequence(data, FUNCTIONAL_CODEPOINTS.end, 0)\n\t);\n}\n\n/**\n * Check if input matches Delete key (forward delete).\n * Handles legacy format and Kitty protocol with lock key modifiers.\n */\nexport function isDelete(data: string): boolean {\n\treturn data === \"\\x1b[3~\" || matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.delete, 0);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Kitty keyboard protocol key sequence helpers.\n *\n * The Kitty keyboard protocol sends enhanced escape sequences in the format:\n * \\x1b[<codepoint>;<modifier>u\n *\n * Modifier bits (before adding 1 for transmission):\n * - Shift: 1 (value 2)\n * - Alt: 2 (value 3)\n * - Ctrl: 4 (value 5)\n * - Super: 8 (value 9)\n * - Hyper: 16\n * - Meta: 32\n * - Caps_Lock: 64\n * - Num_Lock: 128\n *\n * See: https://sw.kovidgoyal.net/kitty/keyboard-protocol/\n *\n * NOTE: Some terminals (e.g., Ghostty on Linux) include lock key states\n * (Caps Lock, Num Lock) in the modifier field. We mask these out when\n * checking for key combinations since they shouldn't affect behavior.\n */\n\n// Common codepoints\nconst CODEPOINTS = {\n\t// Letters (lowercase ASCII)\n\ta: 97,\n\tc: 99,\n\td: 100,\n\te: 101,\n\tg: 103,\n\tk: 107,\n\tl: 108,\n\to: 111,\n\tp: 112,\n\tt: 116,\n\tu: 117,\n\tw: 119,\n\tz: 122,\n\n\t// Special keys\n\tescape: 27,\n\ttab: 9,\n\tenter: 13,\n\tbackspace: 127,\n} as const;\n\n// Lock key bits to ignore when matching (Caps Lock + Num Lock)\nconst LOCK_MASK = 64 + 128; // 192\n\n// Modifier bits (before adding 1)\nconst MODIFIERS = {\n\tshift: 1,\n\talt: 2,\n\tctrl: 4,\n\tsuper: 8,\n} as const;\n\n/**\n * Build a Kitty keyboard protocol sequence for a key with modifier.\n */\nfunction kittySequence(codepoint: number, modifier: number): string {\n\treturn `\\x1b[${codepoint};${modifier + 1}u`;\n}\n\n/**\n * Parsed Kitty keyboard protocol sequence.\n */\ninterface ParsedKittySequence {\n\tcodepoint: number;\n\tmodifier: number; // Actual modifier bits (after subtracting 1)\n}\n\n/**\n * Parse a Kitty keyboard protocol sequence.\n * Handles formats:\n * - \\x1b[<codepoint>u (no modifier)\n * - \\x1b[<codepoint>;<modifier>u (with modifier)\n * - \\x1b[1;<modifier>A/B/C/D (arrow keys with modifier)\n *\n * Returns null if not a valid Kitty sequence.\n */\n// Virtual codepoints for functional keys (negative to avoid conflicts)\nconst FUNCTIONAL_CODEPOINTS = {\n\tdelete: -10,\n\tinsert: -11,\n\tpageUp: -12,\n\tpageDown: -13,\n\thome: -14,\n\tend: -15,\n} as const;\n\nfunction parseKittySequence(data: string): ParsedKittySequence | null {\n\t// Match CSI u format: \\x1b[<num>u or \\x1b[<num>;<mod>u\n\tconst csiUMatch = data.match(/^\\x1b\\[(\\d+)(?:;(\\d+))?u$/);\n\tif (csiUMatch) {\n\t\tconst codepoint = parseInt(csiUMatch[1]!, 10);\n\t\tconst modValue = csiUMatch[2] ? parseInt(csiUMatch[2], 10) : 1;\n\t\treturn { codepoint, modifier: modValue - 1 };\n\t}\n\n\t// Match arrow keys with modifier: \\x1b[1;<mod>A/B/C/D\n\tconst arrowMatch = data.match(/^\\x1b\\[1;(\\d+)([ABCD])$/);\n\tif (arrowMatch) {\n\t\tconst modValue = parseInt(arrowMatch[1]!, 10);\n\t\t// Map arrow letters to virtual codepoints for easier matching\n\t\tconst arrowCodes: Record<string, number> = { A: -1, B: -2, C: -3, D: -4 };\n\t\tconst codepoint = arrowCodes[arrowMatch[2]!]!;\n\t\treturn { codepoint, modifier: modValue - 1 };\n\t}\n\n\t// Match functional keys with ~ terminator: \\x1b[<num>~ or \\x1b[<num>;<mod>~\n\t// DELETE=3, INSERT=2, PAGEUP=5, PAGEDOWN=6, etc.\n\tconst funcMatch = data.match(/^\\x1b\\[(\\d+)(?:;(\\d+))?~$/);\n\tif (funcMatch) {\n\t\tconst keyNum = parseInt(funcMatch[1]!, 10);\n\t\tconst modValue = funcMatch[2] ? parseInt(funcMatch[2], 10) : 1;\n\t\t// Map functional key numbers to virtual codepoints\n\t\tconst funcCodes: Record<number, number> = {\n\t\t\t2: FUNCTIONAL_CODEPOINTS.insert,\n\t\t\t3: FUNCTIONAL_CODEPOINTS.delete,\n\t\t\t5: FUNCTIONAL_CODEPOINTS.pageUp,\n\t\t\t6: FUNCTIONAL_CODEPOINTS.pageDown,\n\t\t\t7: FUNCTIONAL_CODEPOINTS.home, // Alternative home\n\t\t\t8: FUNCTIONAL_CODEPOINTS.end, // Alternative end\n\t\t};\n\t\tconst codepoint = funcCodes[keyNum];\n\t\tif (codepoint !== undefined) {\n\t\t\treturn { codepoint, modifier: modValue - 1 };\n\t\t}\n\t}\n\n\t// Match Home/End with modifier: \\x1b[1;<mod>H/F\n\tconst homeEndMatch = data.match(/^\\x1b\\[1;(\\d+)([HF])$/);\n\tif (homeEndMatch) {\n\t\tconst modValue = parseInt(homeEndMatch[1]!, 10);\n\t\tconst codepoint = homeEndMatch[2] === \"H\" ? FUNCTIONAL_CODEPOINTS.home : FUNCTIONAL_CODEPOINTS.end;\n\t\treturn { codepoint, modifier: modValue - 1 };\n\t}\n\n\treturn null;\n}\n\n/**\n * Check if a Kitty sequence matches the expected codepoint and modifier,\n * ignoring lock key bits (Caps Lock, Num Lock).\n */\nfunction matchesKittySequence(data: string, expectedCodepoint: number, expectedModifier: number): boolean {\n\tconst parsed = parseKittySequence(data);\n\tif (!parsed) return false;\n\n\t// Mask out lock bits from both sides for comparison\n\tconst actualMod = parsed.modifier & ~LOCK_MASK;\n\tconst expectedMod = expectedModifier & ~LOCK_MASK;\n\n\treturn parsed.codepoint === expectedCodepoint && actualMod === expectedMod;\n}\n\n// Pre-built sequences for common key combinations\nexport const Keys = {\n\t// Ctrl+<letter> combinations\n\tCTRL_A: kittySequence(CODEPOINTS.a, MODIFIERS.ctrl),\n\tCTRL_C: kittySequence(CODEPOINTS.c, MODIFIERS.ctrl),\n\tCTRL_D: kittySequence(CODEPOINTS.d, MODIFIERS.ctrl),\n\tCTRL_E: kittySequence(CODEPOINTS.e, MODIFIERS.ctrl),\n\tCTRL_G: kittySequence(CODEPOINTS.g, MODIFIERS.ctrl),\n\tCTRL_K: kittySequence(CODEPOINTS.k, MODIFIERS.ctrl),\n\tCTRL_L: kittySequence(CODEPOINTS.l, MODIFIERS.ctrl),\n\tCTRL_O: kittySequence(CODEPOINTS.o, MODIFIERS.ctrl),\n\tCTRL_P: kittySequence(CODEPOINTS.p, MODIFIERS.ctrl),\n\tCTRL_T: kittySequence(CODEPOINTS.t, MODIFIERS.ctrl),\n\tCTRL_U: kittySequence(CODEPOINTS.u, MODIFIERS.ctrl),\n\tCTRL_W: kittySequence(CODEPOINTS.w, MODIFIERS.ctrl),\n\tCTRL_Z: kittySequence(CODEPOINTS.z, MODIFIERS.ctrl),\n\n\t// Enter combinations\n\tSHIFT_ENTER: kittySequence(CODEPOINTS.enter, MODIFIERS.shift),\n\tALT_ENTER: kittySequence(CODEPOINTS.enter, MODIFIERS.alt),\n\tCTRL_ENTER: kittySequence(CODEPOINTS.enter, MODIFIERS.ctrl),\n\n\t// Tab combinations\n\tSHIFT_TAB: kittySequence(CODEPOINTS.tab, MODIFIERS.shift),\n\n\t// Backspace combinations\n\tALT_BACKSPACE: kittySequence(CODEPOINTS.backspace, MODIFIERS.alt),\n} as const;\n\n/**\n * Check if input matches a Kitty protocol Ctrl+<key> sequence.\n * Ignores lock key bits (Caps Lock, Num Lock).\n * @param data - The input data to check\n * @param key - Single lowercase letter (e.g., 'c' for Ctrl+C)\n */\nexport function isKittyCtrl(data: string, key: string): boolean {\n\tif (key.length !== 1) return false;\n\tconst codepoint = key.charCodeAt(0);\n\t// Check exact match first (fast path)\n\tif (data === kittySequence(codepoint, MODIFIERS.ctrl)) return true;\n\t// Check with lock bits masked out\n\treturn matchesKittySequence(data, codepoint, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches a Kitty protocol key sequence with specific modifier.\n * Ignores lock key bits (Caps Lock, Num Lock).\n * @param data - The input data to check\n * @param codepoint - ASCII codepoint of the key\n * @param modifier - Modifier value (use MODIFIERS constants)\n */\nexport function isKittyKey(data: string, codepoint: number, modifier: number): boolean {\n\t// Check exact match first (fast path)\n\tif (data === kittySequence(codepoint, modifier)) return true;\n\t// Check with lock bits masked out\n\treturn matchesKittySequence(data, codepoint, modifier);\n}\n\n// Raw control character codes\nconst RAW = {\n\tCTRL_A: \"\\x01\",\n\tCTRL_C: \"\\x03\",\n\tCTRL_D: \"\\x04\",\n\tCTRL_E: \"\\x05\",\n\tCTRL_G: \"\\x07\",\n\tCTRL_K: \"\\x0b\",\n\tCTRL_L: \"\\x0c\",\n\tCTRL_O: \"\\x0f\",\n\tCTRL_P: \"\\x10\",\n\tCTRL_T: \"\\x14\",\n\tCTRL_U: \"\\x15\",\n\tCTRL_W: \"\\x17\",\n\tCTRL_Z: \"\\x1a\",\n\tALT_BACKSPACE: \"\\x1b\\x7f\",\n\tSHIFT_TAB: \"\\x1b[Z\",\n} as const;\n\n/**\n * Check if input matches Ctrl+A (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlA(data: string): boolean {\n\treturn data === RAW.CTRL_A || data === Keys.CTRL_A || matchesKittySequence(data, CODEPOINTS.a, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+C (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlC(data: string): boolean {\n\treturn data === RAW.CTRL_C || data === Keys.CTRL_C || matchesKittySequence(data, CODEPOINTS.c, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+D (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlD(data: string): boolean {\n\treturn data === RAW.CTRL_D || data === Keys.CTRL_D || matchesKittySequence(data, CODEPOINTS.d, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+E (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlE(data: string): boolean {\n\treturn data === RAW.CTRL_E || data === Keys.CTRL_E || matchesKittySequence(data, CODEPOINTS.e, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+G (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlG(data: string): boolean {\n\treturn data === RAW.CTRL_G || data === Keys.CTRL_G || matchesKittySequence(data, CODEPOINTS.g, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+K (raw byte or Kitty protocol).\n * Ignores lock key bits.\n * Also checks if first byte is 0x0b for compatibility with terminals\n * that may send trailing bytes.\n */\nexport function isCtrlK(data: string): boolean {\n\treturn (\n\t\tdata === RAW.CTRL_K ||\n\t\t(data.length > 0 && data.charCodeAt(0) === 0x0b) ||\n\t\tdata === Keys.CTRL_K ||\n\t\tmatchesKittySequence(data, CODEPOINTS.k, MODIFIERS.ctrl)\n\t);\n}\n\n/**\n * Check if input matches Ctrl+L (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlL(data: string): boolean {\n\treturn data === RAW.CTRL_L || data === Keys.CTRL_L || matchesKittySequence(data, CODEPOINTS.l, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+O (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlO(data: string): boolean {\n\treturn data === RAW.CTRL_O || data === Keys.CTRL_O || matchesKittySequence(data, CODEPOINTS.o, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+P (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlP(data: string): boolean {\n\treturn data === RAW.CTRL_P || data === Keys.CTRL_P || matchesKittySequence(data, CODEPOINTS.p, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Shift+Ctrl+P (Kitty protocol only).\n * Ignores lock key bits.\n */\nexport function isShiftCtrlP(data: string): boolean {\n\treturn matchesKittySequence(data, CODEPOINTS.p, MODIFIERS.shift + MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+T (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlT(data: string): boolean {\n\treturn data === RAW.CTRL_T || data === Keys.CTRL_T || matchesKittySequence(data, CODEPOINTS.t, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+U (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlU(data: string): boolean {\n\treturn data === RAW.CTRL_U || data === Keys.CTRL_U || matchesKittySequence(data, CODEPOINTS.u, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+W (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlW(data: string): boolean {\n\treturn data === RAW.CTRL_W || data === Keys.CTRL_W || matchesKittySequence(data, CODEPOINTS.w, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+Z (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlZ(data: string): boolean {\n\treturn data === RAW.CTRL_Z || data === Keys.CTRL_Z || matchesKittySequence(data, CODEPOINTS.z, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Alt+Backspace (legacy or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isAltBackspace(data: string): boolean {\n\treturn (\n\t\tdata === RAW.ALT_BACKSPACE ||\n\t\tdata === Keys.ALT_BACKSPACE ||\n\t\tmatchesKittySequence(data, CODEPOINTS.backspace, MODIFIERS.alt)\n\t);\n}\n\n/**\n * Check if input matches Shift+Tab (legacy or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isShiftTab(data: string): boolean {\n\treturn (\n\t\tdata === RAW.SHIFT_TAB || data === Keys.SHIFT_TAB || matchesKittySequence(data, CODEPOINTS.tab, MODIFIERS.shift)\n\t);\n}\n\n/**\n * Check if input matches the Escape key (raw byte or Kitty protocol).\n * Raw: \\x1b (single byte)\n * Kitty: \\x1b[27u (codepoint 27 = escape)\n * Ignores lock key bits.\n */\nexport function isEscape(data: string): boolean {\n\treturn data === \"\\x1b\" || data === `\\x1b[${CODEPOINTS.escape}u` || matchesKittySequence(data, CODEPOINTS.escape, 0);\n}\n\n// Arrow key virtual codepoints (negative to avoid conflicts with real codepoints)\nconst ARROW_CODEPOINTS = {\n\tup: -1,\n\tdown: -2,\n\tright: -3,\n\tleft: -4,\n} as const;\n\n/**\n * Check if input matches Arrow Up key.\n * Handles both legacy (\\x1b[A) and Kitty protocol with modifiers.\n */\nexport function isArrowUp(data: string): boolean {\n\treturn data === \"\\x1b[A\" || matchesKittySequence(data, ARROW_CODEPOINTS.up, 0);\n}\n\n/**\n * Check if input matches Arrow Down key.\n * Handles both legacy (\\x1b[B) and Kitty protocol with modifiers.\n */\nexport function isArrowDown(data: string): boolean {\n\treturn data === \"\\x1b[B\" || matchesKittySequence(data, ARROW_CODEPOINTS.down, 0);\n}\n\n/**\n * Check if input matches Arrow Right key.\n * Handles both legacy (\\x1b[C) and Kitty protocol with modifiers.\n */\nexport function isArrowRight(data: string): boolean {\n\treturn data === \"\\x1b[C\" || matchesKittySequence(data, ARROW_CODEPOINTS.right, 0);\n}\n\n/**\n * Check if input matches Arrow Left key.\n * Handles both legacy (\\x1b[D) and Kitty protocol with modifiers.\n */\nexport function isArrowLeft(data: string): boolean {\n\treturn data === \"\\x1b[D\" || matchesKittySequence(data, ARROW_CODEPOINTS.left, 0);\n}\n\n/**\n * Check if input matches plain Tab key (no modifiers).\n * Handles both legacy (\\t) and Kitty protocol.\n */\nexport function isTab(data: string): boolean {\n\treturn data === \"\\t\" || matchesKittySequence(data, CODEPOINTS.tab, 0);\n}\n\n/**\n * Check if input matches plain Enter/Return key (no modifiers).\n * Handles both legacy (\\r) and Kitty protocol.\n */\nexport function isEnter(data: string): boolean {\n\treturn data === \"\\r\" || matchesKittySequence(data, CODEPOINTS.enter, 0);\n}\n\n/**\n * Check if input matches plain Backspace key (no modifiers).\n * Handles both legacy (\\x7f, \\x08) and Kitty protocol.\n */\nexport function isBackspace(data: string): boolean {\n\treturn data === \"\\x7f\" || data === \"\\x08\" || matchesKittySequence(data, CODEPOINTS.backspace, 0);\n}\n\n/**\n * Check if input matches Shift+Enter.\n * Ignores lock key bits.\n */\nexport function isShiftEnter(data: string): boolean {\n\treturn data === Keys.SHIFT_ENTER || matchesKittySequence(data, CODEPOINTS.enter, MODIFIERS.shift);\n}\n\n/**\n * Check if input matches Alt+Enter.\n * Ignores lock key bits.\n */\nexport function isAltEnter(data: string): boolean {\n\treturn data === Keys.ALT_ENTER || data === \"\\x1b\\r\" || matchesKittySequence(data, CODEPOINTS.enter, MODIFIERS.alt);\n}\n\n/**\n * Check if input matches Option/Alt+Left (word navigation).\n * Handles multiple formats including Kitty protocol.\n */\nexport function isAltLeft(data: string): boolean {\n\treturn data === \"\\x1b[1;3D\" || data === \"\\x1bb\" || matchesKittySequence(data, ARROW_CODEPOINTS.left, MODIFIERS.alt);\n}\n\n/**\n * Check if input matches Option/Alt+Right (word navigation).\n * Handles multiple formats including Kitty protocol.\n */\nexport function isAltRight(data: string): boolean {\n\treturn data === \"\\x1b[1;3C\" || data === \"\\x1bf\" || matchesKittySequence(data, ARROW_CODEPOINTS.right, MODIFIERS.alt);\n}\n\n/**\n * Check if input matches Ctrl+Left (word navigation).\n * Handles multiple formats including Kitty protocol.\n */\nexport function isCtrlLeft(data: string): boolean {\n\treturn data === \"\\x1b[1;5D\" || matchesKittySequence(data, ARROW_CODEPOINTS.left, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+Right (word navigation).\n * Handles multiple formats including Kitty protocol.\n */\nexport function isCtrlRight(data: string): boolean {\n\treturn data === \"\\x1b[1;5C\" || matchesKittySequence(data, ARROW_CODEPOINTS.right, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Home key.\n * Handles legacy formats and Kitty protocol with lock key modifiers.\n */\nexport function isHome(data: string): boolean {\n\treturn (\n\t\tdata === \"\\x1b[H\" ||\n\t\tdata === \"\\x1b[1~\" ||\n\t\tdata === \"\\x1b[7~\" ||\n\t\tmatchesKittySequence(data, FUNCTIONAL_CODEPOINTS.home, 0)\n\t);\n}\n\n/**\n * Check if input matches End key.\n * Handles legacy formats and Kitty protocol with lock key modifiers.\n */\nexport function isEnd(data: string): boolean {\n\treturn (\n\t\tdata === \"\\x1b[F\" ||\n\t\tdata === \"\\x1b[4~\" ||\n\t\tdata === \"\\x1b[8~\" ||\n\t\tmatchesKittySequence(data, FUNCTIONAL_CODEPOINTS.end, 0)\n\t);\n}\n\n/**\n * Check if input matches Delete key (forward delete).\n * Handles legacy format and Kitty protocol with lock key modifiers.\n */\nexport function isDelete(data: string): boolean {\n\treturn data === \"\\x1b[3~\" || matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.delete, 0);\n}\n"]}
|
package/dist/keys.js
CHANGED
|
@@ -29,6 +29,7 @@ const CODEPOINTS = {
|
|
|
29
29
|
e: 101,
|
|
30
30
|
g: 103,
|
|
31
31
|
k: 107,
|
|
32
|
+
l: 108,
|
|
32
33
|
o: 111,
|
|
33
34
|
p: 112,
|
|
34
35
|
t: 116,
|
|
@@ -142,6 +143,7 @@ export const Keys = {
|
|
|
142
143
|
CTRL_E: kittySequence(CODEPOINTS.e, MODIFIERS.ctrl),
|
|
143
144
|
CTRL_G: kittySequence(CODEPOINTS.g, MODIFIERS.ctrl),
|
|
144
145
|
CTRL_K: kittySequence(CODEPOINTS.k, MODIFIERS.ctrl),
|
|
146
|
+
CTRL_L: kittySequence(CODEPOINTS.l, MODIFIERS.ctrl),
|
|
145
147
|
CTRL_O: kittySequence(CODEPOINTS.o, MODIFIERS.ctrl),
|
|
146
148
|
CTRL_P: kittySequence(CODEPOINTS.p, MODIFIERS.ctrl),
|
|
147
149
|
CTRL_T: kittySequence(CODEPOINTS.t, MODIFIERS.ctrl),
|
|
@@ -195,6 +197,7 @@ const RAW = {
|
|
|
195
197
|
CTRL_E: "\x05",
|
|
196
198
|
CTRL_G: "\x07",
|
|
197
199
|
CTRL_K: "\x0b",
|
|
200
|
+
CTRL_L: "\x0c",
|
|
198
201
|
CTRL_O: "\x0f",
|
|
199
202
|
CTRL_P: "\x10",
|
|
200
203
|
CTRL_T: "\x14",
|
|
@@ -251,6 +254,13 @@ export function isCtrlK(data) {
|
|
|
251
254
|
data === Keys.CTRL_K ||
|
|
252
255
|
matchesKittySequence(data, CODEPOINTS.k, MODIFIERS.ctrl));
|
|
253
256
|
}
|
|
257
|
+
/**
|
|
258
|
+
* Check if input matches Ctrl+L (raw byte or Kitty protocol).
|
|
259
|
+
* Ignores lock key bits.
|
|
260
|
+
*/
|
|
261
|
+
export function isCtrlL(data) {
|
|
262
|
+
return data === RAW.CTRL_L || data === Keys.CTRL_L || matchesKittySequence(data, CODEPOINTS.l, MODIFIERS.ctrl);
|
|
263
|
+
}
|
|
254
264
|
/**
|
|
255
265
|
* Check if input matches Ctrl+O (raw byte or Kitty protocol).
|
|
256
266
|
* Ignores lock key bits.
|
|
@@ -265,6 +275,13 @@ export function isCtrlO(data) {
|
|
|
265
275
|
export function isCtrlP(data) {
|
|
266
276
|
return data === RAW.CTRL_P || data === Keys.CTRL_P || matchesKittySequence(data, CODEPOINTS.p, MODIFIERS.ctrl);
|
|
267
277
|
}
|
|
278
|
+
/**
|
|
279
|
+
* Check if input matches Shift+Ctrl+P (Kitty protocol only).
|
|
280
|
+
* Ignores lock key bits.
|
|
281
|
+
*/
|
|
282
|
+
export function isShiftCtrlP(data) {
|
|
283
|
+
return matchesKittySequence(data, CODEPOINTS.p, MODIFIERS.shift + MODIFIERS.ctrl);
|
|
284
|
+
}
|
|
268
285
|
/**
|
|
269
286
|
* Check if input matches Ctrl+T (raw byte or Kitty protocol).
|
|
270
287
|
* Ignores lock key bits.
|
package/dist/keys.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Kitty keyboard protocol key sequence helpers.\n *\n * The Kitty keyboard protocol sends enhanced escape sequences in the format:\n * \\x1b[<codepoint>;<modifier>u\n *\n * Modifier bits (before adding 1 for transmission):\n * - Shift: 1 (value 2)\n * - Alt: 2 (value 3)\n * - Ctrl: 4 (value 5)\n * - Super: 8 (value 9)\n * - Hyper: 16\n * - Meta: 32\n * - Caps_Lock: 64\n * - Num_Lock: 128\n *\n * See: https://sw.kovidgoyal.net/kitty/keyboard-protocol/\n *\n * NOTE: Some terminals (e.g., Ghostty on Linux) include lock key states\n * (Caps Lock, Num Lock) in the modifier field. We mask these out when\n * checking for key combinations since they shouldn't affect behavior.\n */\n\n// Common codepoints\nconst CODEPOINTS = {\n\t// Letters (lowercase ASCII)\n\ta: 97,\n\tc: 99,\n\td: 100,\n\te: 101,\n\tg: 103,\n\tk: 107,\n\to: 111,\n\tp: 112,\n\tt: 116,\n\tu: 117,\n\tw: 119,\n\tz: 122,\n\n\t// Special keys\n\tescape: 27,\n\ttab: 9,\n\tenter: 13,\n\tbackspace: 127,\n} as const;\n\n// Lock key bits to ignore when matching (Caps Lock + Num Lock)\nconst LOCK_MASK = 64 + 128; // 192\n\n// Modifier bits (before adding 1)\nconst MODIFIERS = {\n\tshift: 1,\n\talt: 2,\n\tctrl: 4,\n\tsuper: 8,\n} as const;\n\n/**\n * Build a Kitty keyboard protocol sequence for a key with modifier.\n */\nfunction kittySequence(codepoint: number, modifier: number): string {\n\treturn `\\x1b[${codepoint};${modifier + 1}u`;\n}\n\n/**\n * Parsed Kitty keyboard protocol sequence.\n */\ninterface ParsedKittySequence {\n\tcodepoint: number;\n\tmodifier: number; // Actual modifier bits (after subtracting 1)\n}\n\n/**\n * Parse a Kitty keyboard protocol sequence.\n * Handles formats:\n * - \\x1b[<codepoint>u (no modifier)\n * - \\x1b[<codepoint>;<modifier>u (with modifier)\n * - \\x1b[1;<modifier>A/B/C/D (arrow keys with modifier)\n *\n * Returns null if not a valid Kitty sequence.\n */\n// Virtual codepoints for functional keys (negative to avoid conflicts)\nconst FUNCTIONAL_CODEPOINTS = {\n\tdelete: -10,\n\tinsert: -11,\n\tpageUp: -12,\n\tpageDown: -13,\n\thome: -14,\n\tend: -15,\n} as const;\n\nfunction parseKittySequence(data: string): ParsedKittySequence | null {\n\t// Match CSI u format: \\x1b[<num>u or \\x1b[<num>;<mod>u\n\tconst csiUMatch = data.match(/^\\x1b\\[(\\d+)(?:;(\\d+))?u$/);\n\tif (csiUMatch) {\n\t\tconst codepoint = parseInt(csiUMatch[1]!, 10);\n\t\tconst modValue = csiUMatch[2] ? parseInt(csiUMatch[2], 10) : 1;\n\t\treturn { codepoint, modifier: modValue - 1 };\n\t}\n\n\t// Match arrow keys with modifier: \\x1b[1;<mod>A/B/C/D\n\tconst arrowMatch = data.match(/^\\x1b\\[1;(\\d+)([ABCD])$/);\n\tif (arrowMatch) {\n\t\tconst modValue = parseInt(arrowMatch[1]!, 10);\n\t\t// Map arrow letters to virtual codepoints for easier matching\n\t\tconst arrowCodes: Record<string, number> = { A: -1, B: -2, C: -3, D: -4 };\n\t\tconst codepoint = arrowCodes[arrowMatch[2]!]!;\n\t\treturn { codepoint, modifier: modValue - 1 };\n\t}\n\n\t// Match functional keys with ~ terminator: \\x1b[<num>~ or \\x1b[<num>;<mod>~\n\t// DELETE=3, INSERT=2, PAGEUP=5, PAGEDOWN=6, etc.\n\tconst funcMatch = data.match(/^\\x1b\\[(\\d+)(?:;(\\d+))?~$/);\n\tif (funcMatch) {\n\t\tconst keyNum = parseInt(funcMatch[1]!, 10);\n\t\tconst modValue = funcMatch[2] ? parseInt(funcMatch[2], 10) : 1;\n\t\t// Map functional key numbers to virtual codepoints\n\t\tconst funcCodes: Record<number, number> = {\n\t\t\t2: FUNCTIONAL_CODEPOINTS.insert,\n\t\t\t3: FUNCTIONAL_CODEPOINTS.delete,\n\t\t\t5: FUNCTIONAL_CODEPOINTS.pageUp,\n\t\t\t6: FUNCTIONAL_CODEPOINTS.pageDown,\n\t\t\t7: FUNCTIONAL_CODEPOINTS.home, // Alternative home\n\t\t\t8: FUNCTIONAL_CODEPOINTS.end, // Alternative end\n\t\t};\n\t\tconst codepoint = funcCodes[keyNum];\n\t\tif (codepoint !== undefined) {\n\t\t\treturn { codepoint, modifier: modValue - 1 };\n\t\t}\n\t}\n\n\t// Match Home/End with modifier: \\x1b[1;<mod>H/F\n\tconst homeEndMatch = data.match(/^\\x1b\\[1;(\\d+)([HF])$/);\n\tif (homeEndMatch) {\n\t\tconst modValue = parseInt(homeEndMatch[1]!, 10);\n\t\tconst codepoint = homeEndMatch[2] === \"H\" ? FUNCTIONAL_CODEPOINTS.home : FUNCTIONAL_CODEPOINTS.end;\n\t\treturn { codepoint, modifier: modValue - 1 };\n\t}\n\n\treturn null;\n}\n\n/**\n * Check if a Kitty sequence matches the expected codepoint and modifier,\n * ignoring lock key bits (Caps Lock, Num Lock).\n */\nfunction matchesKittySequence(data: string, expectedCodepoint: number, expectedModifier: number): boolean {\n\tconst parsed = parseKittySequence(data);\n\tif (!parsed) return false;\n\n\t// Mask out lock bits from both sides for comparison\n\tconst actualMod = parsed.modifier & ~LOCK_MASK;\n\tconst expectedMod = expectedModifier & ~LOCK_MASK;\n\n\treturn parsed.codepoint === expectedCodepoint && actualMod === expectedMod;\n}\n\n// Pre-built sequences for common key combinations\nexport const Keys = {\n\t// Ctrl+<letter> combinations\n\tCTRL_A: kittySequence(CODEPOINTS.a, MODIFIERS.ctrl),\n\tCTRL_C: kittySequence(CODEPOINTS.c, MODIFIERS.ctrl),\n\tCTRL_D: kittySequence(CODEPOINTS.d, MODIFIERS.ctrl),\n\tCTRL_E: kittySequence(CODEPOINTS.e, MODIFIERS.ctrl),\n\tCTRL_G: kittySequence(CODEPOINTS.g, MODIFIERS.ctrl),\n\tCTRL_K: kittySequence(CODEPOINTS.k, MODIFIERS.ctrl),\n\tCTRL_O: kittySequence(CODEPOINTS.o, MODIFIERS.ctrl),\n\tCTRL_P: kittySequence(CODEPOINTS.p, MODIFIERS.ctrl),\n\tCTRL_T: kittySequence(CODEPOINTS.t, MODIFIERS.ctrl),\n\tCTRL_U: kittySequence(CODEPOINTS.u, MODIFIERS.ctrl),\n\tCTRL_W: kittySequence(CODEPOINTS.w, MODIFIERS.ctrl),\n\tCTRL_Z: kittySequence(CODEPOINTS.z, MODIFIERS.ctrl),\n\n\t// Enter combinations\n\tSHIFT_ENTER: kittySequence(CODEPOINTS.enter, MODIFIERS.shift),\n\tALT_ENTER: kittySequence(CODEPOINTS.enter, MODIFIERS.alt),\n\tCTRL_ENTER: kittySequence(CODEPOINTS.enter, MODIFIERS.ctrl),\n\n\t// Tab combinations\n\tSHIFT_TAB: kittySequence(CODEPOINTS.tab, MODIFIERS.shift),\n\n\t// Backspace combinations\n\tALT_BACKSPACE: kittySequence(CODEPOINTS.backspace, MODIFIERS.alt),\n} as const;\n\n/**\n * Check if input matches a Kitty protocol Ctrl+<key> sequence.\n * Ignores lock key bits (Caps Lock, Num Lock).\n * @param data - The input data to check\n * @param key - Single lowercase letter (e.g., 'c' for Ctrl+C)\n */\nexport function isKittyCtrl(data: string, key: string): boolean {\n\tif (key.length !== 1) return false;\n\tconst codepoint = key.charCodeAt(0);\n\t// Check exact match first (fast path)\n\tif (data === kittySequence(codepoint, MODIFIERS.ctrl)) return true;\n\t// Check with lock bits masked out\n\treturn matchesKittySequence(data, codepoint, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches a Kitty protocol key sequence with specific modifier.\n * Ignores lock key bits (Caps Lock, Num Lock).\n * @param data - The input data to check\n * @param codepoint - ASCII codepoint of the key\n * @param modifier - Modifier value (use MODIFIERS constants)\n */\nexport function isKittyKey(data: string, codepoint: number, modifier: number): boolean {\n\t// Check exact match first (fast path)\n\tif (data === kittySequence(codepoint, modifier)) return true;\n\t// Check with lock bits masked out\n\treturn matchesKittySequence(data, codepoint, modifier);\n}\n\n// Raw control character codes\nconst RAW = {\n\tCTRL_A: \"\\x01\",\n\tCTRL_C: \"\\x03\",\n\tCTRL_D: \"\\x04\",\n\tCTRL_E: \"\\x05\",\n\tCTRL_G: \"\\x07\",\n\tCTRL_K: \"\\x0b\",\n\tCTRL_O: \"\\x0f\",\n\tCTRL_P: \"\\x10\",\n\tCTRL_T: \"\\x14\",\n\tCTRL_U: \"\\x15\",\n\tCTRL_W: \"\\x17\",\n\tCTRL_Z: \"\\x1a\",\n\tALT_BACKSPACE: \"\\x1b\\x7f\",\n\tSHIFT_TAB: \"\\x1b[Z\",\n} as const;\n\n/**\n * Check if input matches Ctrl+A (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlA(data: string): boolean {\n\treturn data === RAW.CTRL_A || data === Keys.CTRL_A || matchesKittySequence(data, CODEPOINTS.a, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+C (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlC(data: string): boolean {\n\treturn data === RAW.CTRL_C || data === Keys.CTRL_C || matchesKittySequence(data, CODEPOINTS.c, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+D (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlD(data: string): boolean {\n\treturn data === RAW.CTRL_D || data === Keys.CTRL_D || matchesKittySequence(data, CODEPOINTS.d, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+E (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlE(data: string): boolean {\n\treturn data === RAW.CTRL_E || data === Keys.CTRL_E || matchesKittySequence(data, CODEPOINTS.e, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+G (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlG(data: string): boolean {\n\treturn data === RAW.CTRL_G || data === Keys.CTRL_G || matchesKittySequence(data, CODEPOINTS.g, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+K (raw byte or Kitty protocol).\n * Ignores lock key bits.\n * Also checks if first byte is 0x0b for compatibility with terminals\n * that may send trailing bytes.\n */\nexport function isCtrlK(data: string): boolean {\n\treturn (\n\t\tdata === RAW.CTRL_K ||\n\t\t(data.length > 0 && data.charCodeAt(0) === 0x0b) ||\n\t\tdata === Keys.CTRL_K ||\n\t\tmatchesKittySequence(data, CODEPOINTS.k, MODIFIERS.ctrl)\n\t);\n}\n\n/**\n * Check if input matches Ctrl+O (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlO(data: string): boolean {\n\treturn data === RAW.CTRL_O || data === Keys.CTRL_O || matchesKittySequence(data, CODEPOINTS.o, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+P (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlP(data: string): boolean {\n\treturn data === RAW.CTRL_P || data === Keys.CTRL_P || matchesKittySequence(data, CODEPOINTS.p, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+T (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlT(data: string): boolean {\n\treturn data === RAW.CTRL_T || data === Keys.CTRL_T || matchesKittySequence(data, CODEPOINTS.t, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+U (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlU(data: string): boolean {\n\treturn data === RAW.CTRL_U || data === Keys.CTRL_U || matchesKittySequence(data, CODEPOINTS.u, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+W (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlW(data: string): boolean {\n\treturn data === RAW.CTRL_W || data === Keys.CTRL_W || matchesKittySequence(data, CODEPOINTS.w, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+Z (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlZ(data: string): boolean {\n\treturn data === RAW.CTRL_Z || data === Keys.CTRL_Z || matchesKittySequence(data, CODEPOINTS.z, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Alt+Backspace (legacy or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isAltBackspace(data: string): boolean {\n\treturn (\n\t\tdata === RAW.ALT_BACKSPACE ||\n\t\tdata === Keys.ALT_BACKSPACE ||\n\t\tmatchesKittySequence(data, CODEPOINTS.backspace, MODIFIERS.alt)\n\t);\n}\n\n/**\n * Check if input matches Shift+Tab (legacy or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isShiftTab(data: string): boolean {\n\treturn (\n\t\tdata === RAW.SHIFT_TAB || data === Keys.SHIFT_TAB || matchesKittySequence(data, CODEPOINTS.tab, MODIFIERS.shift)\n\t);\n}\n\n/**\n * Check if input matches the Escape key (raw byte or Kitty protocol).\n * Raw: \\x1b (single byte)\n * Kitty: \\x1b[27u (codepoint 27 = escape)\n * Ignores lock key bits.\n */\nexport function isEscape(data: string): boolean {\n\treturn data === \"\\x1b\" || data === `\\x1b[${CODEPOINTS.escape}u` || matchesKittySequence(data, CODEPOINTS.escape, 0);\n}\n\n// Arrow key virtual codepoints (negative to avoid conflicts with real codepoints)\nconst ARROW_CODEPOINTS = {\n\tup: -1,\n\tdown: -2,\n\tright: -3,\n\tleft: -4,\n} as const;\n\n/**\n * Check if input matches Arrow Up key.\n * Handles both legacy (\\x1b[A) and Kitty protocol with modifiers.\n */\nexport function isArrowUp(data: string): boolean {\n\treturn data === \"\\x1b[A\" || matchesKittySequence(data, ARROW_CODEPOINTS.up, 0);\n}\n\n/**\n * Check if input matches Arrow Down key.\n * Handles both legacy (\\x1b[B) and Kitty protocol with modifiers.\n */\nexport function isArrowDown(data: string): boolean {\n\treturn data === \"\\x1b[B\" || matchesKittySequence(data, ARROW_CODEPOINTS.down, 0);\n}\n\n/**\n * Check if input matches Arrow Right key.\n * Handles both legacy (\\x1b[C) and Kitty protocol with modifiers.\n */\nexport function isArrowRight(data: string): boolean {\n\treturn data === \"\\x1b[C\" || matchesKittySequence(data, ARROW_CODEPOINTS.right, 0);\n}\n\n/**\n * Check if input matches Arrow Left key.\n * Handles both legacy (\\x1b[D) and Kitty protocol with modifiers.\n */\nexport function isArrowLeft(data: string): boolean {\n\treturn data === \"\\x1b[D\" || matchesKittySequence(data, ARROW_CODEPOINTS.left, 0);\n}\n\n/**\n * Check if input matches plain Tab key (no modifiers).\n * Handles both legacy (\\t) and Kitty protocol.\n */\nexport function isTab(data: string): boolean {\n\treturn data === \"\\t\" || matchesKittySequence(data, CODEPOINTS.tab, 0);\n}\n\n/**\n * Check if input matches plain Enter/Return key (no modifiers).\n * Handles both legacy (\\r) and Kitty protocol.\n */\nexport function isEnter(data: string): boolean {\n\treturn data === \"\\r\" || matchesKittySequence(data, CODEPOINTS.enter, 0);\n}\n\n/**\n * Check if input matches plain Backspace key (no modifiers).\n * Handles both legacy (\\x7f, \\x08) and Kitty protocol.\n */\nexport function isBackspace(data: string): boolean {\n\treturn data === \"\\x7f\" || data === \"\\x08\" || matchesKittySequence(data, CODEPOINTS.backspace, 0);\n}\n\n/**\n * Check if input matches Shift+Enter.\n * Ignores lock key bits.\n */\nexport function isShiftEnter(data: string): boolean {\n\treturn data === Keys.SHIFT_ENTER || matchesKittySequence(data, CODEPOINTS.enter, MODIFIERS.shift);\n}\n\n/**\n * Check if input matches Alt+Enter.\n * Ignores lock key bits.\n */\nexport function isAltEnter(data: string): boolean {\n\treturn data === Keys.ALT_ENTER || data === \"\\x1b\\r\" || matchesKittySequence(data, CODEPOINTS.enter, MODIFIERS.alt);\n}\n\n/**\n * Check if input matches Option/Alt+Left (word navigation).\n * Handles multiple formats including Kitty protocol.\n */\nexport function isAltLeft(data: string): boolean {\n\treturn data === \"\\x1b[1;3D\" || data === \"\\x1bb\" || matchesKittySequence(data, ARROW_CODEPOINTS.left, MODIFIERS.alt);\n}\n\n/**\n * Check if input matches Option/Alt+Right (word navigation).\n * Handles multiple formats including Kitty protocol.\n */\nexport function isAltRight(data: string): boolean {\n\treturn data === \"\\x1b[1;3C\" || data === \"\\x1bf\" || matchesKittySequence(data, ARROW_CODEPOINTS.right, MODIFIERS.alt);\n}\n\n/**\n * Check if input matches Ctrl+Left (word navigation).\n * Handles multiple formats including Kitty protocol.\n */\nexport function isCtrlLeft(data: string): boolean {\n\treturn data === \"\\x1b[1;5D\" || matchesKittySequence(data, ARROW_CODEPOINTS.left, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+Right (word navigation).\n * Handles multiple formats including Kitty protocol.\n */\nexport function isCtrlRight(data: string): boolean {\n\treturn data === \"\\x1b[1;5C\" || matchesKittySequence(data, ARROW_CODEPOINTS.right, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Home key.\n * Handles legacy formats and Kitty protocol with lock key modifiers.\n */\nexport function isHome(data: string): boolean {\n\treturn (\n\t\tdata === \"\\x1b[H\" ||\n\t\tdata === \"\\x1b[1~\" ||\n\t\tdata === \"\\x1b[7~\" ||\n\t\tmatchesKittySequence(data, FUNCTIONAL_CODEPOINTS.home, 0)\n\t);\n}\n\n/**\n * Check if input matches End key.\n * Handles legacy formats and Kitty protocol with lock key modifiers.\n */\nexport function isEnd(data: string): boolean {\n\treturn (\n\t\tdata === \"\\x1b[F\" ||\n\t\tdata === \"\\x1b[4~\" ||\n\t\tdata === \"\\x1b[8~\" ||\n\t\tmatchesKittySequence(data, FUNCTIONAL_CODEPOINTS.end, 0)\n\t);\n}\n\n/**\n * Check if input matches Delete key (forward delete).\n * Handles legacy format and Kitty protocol with lock key modifiers.\n */\nexport function isDelete(data: string): boolean {\n\treturn data === \"\\x1b[3~\" || matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.delete, 0);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,oBAAoB;AACpB,MAAM,UAAU,GAAG;IAClB,4BAA4B;IAC5B,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,EAAE;IACL,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IAEN,eAAe;IACf,MAAM,EAAE,EAAE;IACV,GAAG,EAAE,CAAC;IACN,KAAK,EAAE,EAAE;IACT,SAAS,EAAE,GAAG;CACL,CAAC;AAEX,+DAA+D;AAC/D,MAAM,SAAS,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,MAAM;AAElC,kCAAkC;AAClC,MAAM,SAAS,GAAG;IACjB,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACC,CAAC;AAEX;;GAEG;AACH,SAAS,aAAa,CAAC,SAAiB,EAAE,QAAgB,EAAU;IACnE,OAAO,QAAQ,SAAS,IAAI,QAAQ,GAAG,CAAC,GAAG,CAAC;AAAA,CAC5C;AAUD;;;;;;;;GAQG;AACH,uEAAuE;AACvE,MAAM,qBAAqB,GAAG;IAC7B,MAAM,EAAE,CAAC,EAAE;IACX,MAAM,EAAE,CAAC,EAAE;IACX,MAAM,EAAE,CAAC,EAAE;IACX,QAAQ,EAAE,CAAC,EAAE;IACb,IAAI,EAAE,CAAC,EAAE;IACT,GAAG,EAAE,CAAC,EAAE;CACC,CAAC;AAEX,SAAS,kBAAkB,CAAC,IAAY,EAA8B;IACrE,uDAAuD;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC1D,IAAI,SAAS,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,GAAG,CAAC,EAAE,CAAC;IAC9C,CAAC;IAED,sDAAsD;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACzD,IAAI,UAAU,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QAC9C,8DAA8D;QAC9D,MAAM,UAAU,GAA2B,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC1E,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAE,CAAE,CAAC;QAC9C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,GAAG,CAAC,EAAE,CAAC;IAC9C,CAAC;IAED,4EAA4E;IAC5E,iDAAiD;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC1D,IAAI,SAAS,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,mDAAmD;QACnD,MAAM,SAAS,GAA2B;YACzC,CAAC,EAAE,qBAAqB,CAAC,MAAM;YAC/B,CAAC,EAAE,qBAAqB,CAAC,MAAM;YAC/B,CAAC,EAAE,qBAAqB,CAAC,MAAM;YAC/B,CAAC,EAAE,qBAAqB,CAAC,QAAQ;YACjC,CAAC,EAAE,qBAAqB,CAAC,IAAI,EAAE,mBAAmB;YAClD,CAAC,EAAE,qBAAqB,CAAC,GAAG,EAAE,kBAAkB;SAChD,CAAC;QACF,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,GAAG,CAAC,EAAE,CAAC;QAC9C,CAAC;IACF,CAAC;IAED,gDAAgD;IAChD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACzD,IAAI,YAAY,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,GAAG,CAAC;QACnG,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,GAAG,CAAC,EAAE,CAAC;IAC9C,CAAC;IAED,OAAO,IAAI,CAAC;AAAA,CACZ;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,IAAY,EAAE,iBAAyB,EAAE,gBAAwB,EAAW;IACzG,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAE1B,oDAAoD;IACpD,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,GAAG,CAAC,SAAS,CAAC;IAC/C,MAAM,WAAW,GAAG,gBAAgB,GAAG,CAAC,SAAS,CAAC;IAElD,OAAO,MAAM,CAAC,SAAS,KAAK,iBAAiB,IAAI,SAAS,KAAK,WAAW,CAAC;AAAA,CAC3E;AAED,kDAAkD;AAClD,MAAM,CAAC,MAAM,IAAI,GAAG;IACnB,6BAA6B;IAC7B,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC;IACnD,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC;IACnD,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC;IACnD,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC;IACnD,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC;IACnD,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC;IACnD,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC;IACnD,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC;IACnD,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC;IACnD,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC;IACnD,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC;IACnD,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC;IACnD,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC;IAEnD,qBAAqB;IACrB,WAAW,EAAE,aAAa,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC;IAC7D,SAAS,EAAE,aAAa,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC;IACzD,UAAU,EAAE,aAAa,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC;IAE3D,mBAAmB;IACnB,SAAS,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC;IAEzD,yBAAyB;IACzB,aAAa,EAAE,aAAa,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC;CACxD,CAAC;AAEX;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,GAAW,EAAW;IAC/D,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACpC,sCAAsC;IACtC,IAAI,IAAI,KAAK,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,kCAAkC;IAClC,OAAO,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAAA,CAC7D;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,SAAiB,EAAE,QAAgB,EAAW;IACtF,sCAAsC;IACtC,IAAI,IAAI,KAAK,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,kCAAkC;IAClC,OAAO,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,CACvD;AAED,8BAA8B;AAC9B,MAAM,GAAG,GAAG;IACX,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,aAAa,EAAE,UAAU;IACzB,SAAS,EAAE,QAAQ;CACV,CAAC;AAEX;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAW;IAC9C,OAAO,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAAA,CAC/G;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAW;IAC9C,OAAO,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAAA,CAC/G;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAW;IAC9C,OAAO,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAAA,CAC/G;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAW;IAC9C,OAAO,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAAA,CAC/G;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAW;IAC9C,OAAO,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAAA,CAC/G;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAW;IAC9C,OAAO,CACN,IAAI,KAAK,GAAG,CAAC,MAAM;QACnB,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QAChD,IAAI,KAAK,IAAI,CAAC,MAAM;QACpB,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CACxD,CAAC;AAAA,CACF;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAW;IAC9C,OAAO,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAAA,CAC/G;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAW;IAC9C,OAAO,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAAA,CAC/G;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAW;IAC9C,OAAO,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAAA,CAC/G;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAW;IACnD,OAAO,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAAA,CAClF;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAW;IAC9C,OAAO,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAAA,CAC/G;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAW;IAC9C,OAAO,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAAA,CAC/G;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAW;IAC9C,OAAO,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAAA,CAC/G;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAW;IAC9C,OAAO,IAAI,KAAK,GAAG,CAAC,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAAA,CAC/G;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAW;IACrD,OAAO,CACN,IAAI,KAAK,GAAG,CAAC,aAAa;QAC1B,IAAI,KAAK,IAAI,CAAC,aAAa;QAC3B,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAC/D,CAAC;AAAA,CACF;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAW;IACjD,OAAO,CACN,IAAI,KAAK,GAAG,CAAC,SAAS,IAAI,IAAI,KAAK,IAAI,CAAC,SAAS,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,CAChH,CAAC;AAAA,CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAW;IAC/C,OAAO,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ,UAAU,CAAC,MAAM,GAAG,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAAA,CACpH;AAED,kFAAkF;AAClF,MAAM,gBAAgB,GAAG;IACxB,EAAE,EAAE,CAAC,CAAC;IACN,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,EAAE,CAAC,CAAC;CACC,CAAC;AAEX;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAW;IAChD,OAAO,IAAI,KAAK,QAAQ,IAAI,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAAA,CAC/E;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAW;IAClD,OAAO,IAAI,KAAK,QAAQ,IAAI,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAAA,CACjF;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAW;IACnD,OAAO,IAAI,KAAK,QAAQ,IAAI,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAAA,CAClF;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAW;IAClD,OAAO,IAAI,KAAK,QAAQ,IAAI,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAAA,CACjF;AAED;;;GAGG;AACH,MAAM,UAAU,KAAK,CAAC,IAAY,EAAW;IAC5C,OAAO,IAAI,KAAK,IAAI,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAAA,CACtE;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAW;IAC9C,OAAO,IAAI,KAAK,IAAI,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAAA,CACxE;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAW;IAClD,OAAO,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;AAAA,CACjG;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAW;IACnD,OAAO,IAAI,KAAK,IAAI,CAAC,WAAW,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;AAAA,CAClG;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAW;IACjD,OAAO,IAAI,KAAK,IAAI,CAAC,SAAS,IAAI,IAAI,KAAK,QAAQ,IAAI,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;AAAA,CACnH;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAW;IAChD,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,OAAO,IAAI,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;AAAA,CACpH;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAW;IACjD,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,OAAO,IAAI,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;AAAA,CACrH;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAW;IACjD,OAAO,IAAI,KAAK,WAAW,IAAI,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAAA,CACjG;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAW;IAClD,OAAO,IAAI,KAAK,WAAW,IAAI,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;AAAA,CAClG;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,IAAY,EAAW;IAC7C,OAAO,CACN,IAAI,KAAK,QAAQ;QACjB,IAAI,KAAK,SAAS;QAClB,IAAI,KAAK,SAAS;QAClB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,CAAC,IAAI,EAAE,CAAC,CAAC,CACzD,CAAC;AAAA,CACF;AAED;;;GAGG;AACH,MAAM,UAAU,KAAK,CAAC,IAAY,EAAW;IAC5C,OAAO,CACN,IAAI,KAAK,QAAQ;QACjB,IAAI,KAAK,SAAS;QAClB,IAAI,KAAK,SAAS;QAClB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,CAAC,GAAG,EAAE,CAAC,CAAC,CACxD,CAAC;AAAA,CACF;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAW;IAC/C,OAAO,IAAI,KAAK,SAAS,IAAI,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAAA,CACzF","sourcesContent":["/**\n * Kitty keyboard protocol key sequence helpers.\n *\n * The Kitty keyboard protocol sends enhanced escape sequences in the format:\n * \\x1b[<codepoint>;<modifier>u\n *\n * Modifier bits (before adding 1 for transmission):\n * - Shift: 1 (value 2)\n * - Alt: 2 (value 3)\n * - Ctrl: 4 (value 5)\n * - Super: 8 (value 9)\n * - Hyper: 16\n * - Meta: 32\n * - Caps_Lock: 64\n * - Num_Lock: 128\n *\n * See: https://sw.kovidgoyal.net/kitty/keyboard-protocol/\n *\n * NOTE: Some terminals (e.g., Ghostty on Linux) include lock key states\n * (Caps Lock, Num Lock) in the modifier field. We mask these out when\n * checking for key combinations since they shouldn't affect behavior.\n */\n\n// Common codepoints\nconst CODEPOINTS = {\n\t// Letters (lowercase ASCII)\n\ta: 97,\n\tc: 99,\n\td: 100,\n\te: 101,\n\tg: 103,\n\tk: 107,\n\tl: 108,\n\to: 111,\n\tp: 112,\n\tt: 116,\n\tu: 117,\n\tw: 119,\n\tz: 122,\n\n\t// Special keys\n\tescape: 27,\n\ttab: 9,\n\tenter: 13,\n\tbackspace: 127,\n} as const;\n\n// Lock key bits to ignore when matching (Caps Lock + Num Lock)\nconst LOCK_MASK = 64 + 128; // 192\n\n// Modifier bits (before adding 1)\nconst MODIFIERS = {\n\tshift: 1,\n\talt: 2,\n\tctrl: 4,\n\tsuper: 8,\n} as const;\n\n/**\n * Build a Kitty keyboard protocol sequence for a key with modifier.\n */\nfunction kittySequence(codepoint: number, modifier: number): string {\n\treturn `\\x1b[${codepoint};${modifier + 1}u`;\n}\n\n/**\n * Parsed Kitty keyboard protocol sequence.\n */\ninterface ParsedKittySequence {\n\tcodepoint: number;\n\tmodifier: number; // Actual modifier bits (after subtracting 1)\n}\n\n/**\n * Parse a Kitty keyboard protocol sequence.\n * Handles formats:\n * - \\x1b[<codepoint>u (no modifier)\n * - \\x1b[<codepoint>;<modifier>u (with modifier)\n * - \\x1b[1;<modifier>A/B/C/D (arrow keys with modifier)\n *\n * Returns null if not a valid Kitty sequence.\n */\n// Virtual codepoints for functional keys (negative to avoid conflicts)\nconst FUNCTIONAL_CODEPOINTS = {\n\tdelete: -10,\n\tinsert: -11,\n\tpageUp: -12,\n\tpageDown: -13,\n\thome: -14,\n\tend: -15,\n} as const;\n\nfunction parseKittySequence(data: string): ParsedKittySequence | null {\n\t// Match CSI u format: \\x1b[<num>u or \\x1b[<num>;<mod>u\n\tconst csiUMatch = data.match(/^\\x1b\\[(\\d+)(?:;(\\d+))?u$/);\n\tif (csiUMatch) {\n\t\tconst codepoint = parseInt(csiUMatch[1]!, 10);\n\t\tconst modValue = csiUMatch[2] ? parseInt(csiUMatch[2], 10) : 1;\n\t\treturn { codepoint, modifier: modValue - 1 };\n\t}\n\n\t// Match arrow keys with modifier: \\x1b[1;<mod>A/B/C/D\n\tconst arrowMatch = data.match(/^\\x1b\\[1;(\\d+)([ABCD])$/);\n\tif (arrowMatch) {\n\t\tconst modValue = parseInt(arrowMatch[1]!, 10);\n\t\t// Map arrow letters to virtual codepoints for easier matching\n\t\tconst arrowCodes: Record<string, number> = { A: -1, B: -2, C: -3, D: -4 };\n\t\tconst codepoint = arrowCodes[arrowMatch[2]!]!;\n\t\treturn { codepoint, modifier: modValue - 1 };\n\t}\n\n\t// Match functional keys with ~ terminator: \\x1b[<num>~ or \\x1b[<num>;<mod>~\n\t// DELETE=3, INSERT=2, PAGEUP=5, PAGEDOWN=6, etc.\n\tconst funcMatch = data.match(/^\\x1b\\[(\\d+)(?:;(\\d+))?~$/);\n\tif (funcMatch) {\n\t\tconst keyNum = parseInt(funcMatch[1]!, 10);\n\t\tconst modValue = funcMatch[2] ? parseInt(funcMatch[2], 10) : 1;\n\t\t// Map functional key numbers to virtual codepoints\n\t\tconst funcCodes: Record<number, number> = {\n\t\t\t2: FUNCTIONAL_CODEPOINTS.insert,\n\t\t\t3: FUNCTIONAL_CODEPOINTS.delete,\n\t\t\t5: FUNCTIONAL_CODEPOINTS.pageUp,\n\t\t\t6: FUNCTIONAL_CODEPOINTS.pageDown,\n\t\t\t7: FUNCTIONAL_CODEPOINTS.home, // Alternative home\n\t\t\t8: FUNCTIONAL_CODEPOINTS.end, // Alternative end\n\t\t};\n\t\tconst codepoint = funcCodes[keyNum];\n\t\tif (codepoint !== undefined) {\n\t\t\treturn { codepoint, modifier: modValue - 1 };\n\t\t}\n\t}\n\n\t// Match Home/End with modifier: \\x1b[1;<mod>H/F\n\tconst homeEndMatch = data.match(/^\\x1b\\[1;(\\d+)([HF])$/);\n\tif (homeEndMatch) {\n\t\tconst modValue = parseInt(homeEndMatch[1]!, 10);\n\t\tconst codepoint = homeEndMatch[2] === \"H\" ? FUNCTIONAL_CODEPOINTS.home : FUNCTIONAL_CODEPOINTS.end;\n\t\treturn { codepoint, modifier: modValue - 1 };\n\t}\n\n\treturn null;\n}\n\n/**\n * Check if a Kitty sequence matches the expected codepoint and modifier,\n * ignoring lock key bits (Caps Lock, Num Lock).\n */\nfunction matchesKittySequence(data: string, expectedCodepoint: number, expectedModifier: number): boolean {\n\tconst parsed = parseKittySequence(data);\n\tif (!parsed) return false;\n\n\t// Mask out lock bits from both sides for comparison\n\tconst actualMod = parsed.modifier & ~LOCK_MASK;\n\tconst expectedMod = expectedModifier & ~LOCK_MASK;\n\n\treturn parsed.codepoint === expectedCodepoint && actualMod === expectedMod;\n}\n\n// Pre-built sequences for common key combinations\nexport const Keys = {\n\t// Ctrl+<letter> combinations\n\tCTRL_A: kittySequence(CODEPOINTS.a, MODIFIERS.ctrl),\n\tCTRL_C: kittySequence(CODEPOINTS.c, MODIFIERS.ctrl),\n\tCTRL_D: kittySequence(CODEPOINTS.d, MODIFIERS.ctrl),\n\tCTRL_E: kittySequence(CODEPOINTS.e, MODIFIERS.ctrl),\n\tCTRL_G: kittySequence(CODEPOINTS.g, MODIFIERS.ctrl),\n\tCTRL_K: kittySequence(CODEPOINTS.k, MODIFIERS.ctrl),\n\tCTRL_L: kittySequence(CODEPOINTS.l, MODIFIERS.ctrl),\n\tCTRL_O: kittySequence(CODEPOINTS.o, MODIFIERS.ctrl),\n\tCTRL_P: kittySequence(CODEPOINTS.p, MODIFIERS.ctrl),\n\tCTRL_T: kittySequence(CODEPOINTS.t, MODIFIERS.ctrl),\n\tCTRL_U: kittySequence(CODEPOINTS.u, MODIFIERS.ctrl),\n\tCTRL_W: kittySequence(CODEPOINTS.w, MODIFIERS.ctrl),\n\tCTRL_Z: kittySequence(CODEPOINTS.z, MODIFIERS.ctrl),\n\n\t// Enter combinations\n\tSHIFT_ENTER: kittySequence(CODEPOINTS.enter, MODIFIERS.shift),\n\tALT_ENTER: kittySequence(CODEPOINTS.enter, MODIFIERS.alt),\n\tCTRL_ENTER: kittySequence(CODEPOINTS.enter, MODIFIERS.ctrl),\n\n\t// Tab combinations\n\tSHIFT_TAB: kittySequence(CODEPOINTS.tab, MODIFIERS.shift),\n\n\t// Backspace combinations\n\tALT_BACKSPACE: kittySequence(CODEPOINTS.backspace, MODIFIERS.alt),\n} as const;\n\n/**\n * Check if input matches a Kitty protocol Ctrl+<key> sequence.\n * Ignores lock key bits (Caps Lock, Num Lock).\n * @param data - The input data to check\n * @param key - Single lowercase letter (e.g., 'c' for Ctrl+C)\n */\nexport function isKittyCtrl(data: string, key: string): boolean {\n\tif (key.length !== 1) return false;\n\tconst codepoint = key.charCodeAt(0);\n\t// Check exact match first (fast path)\n\tif (data === kittySequence(codepoint, MODIFIERS.ctrl)) return true;\n\t// Check with lock bits masked out\n\treturn matchesKittySequence(data, codepoint, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches a Kitty protocol key sequence with specific modifier.\n * Ignores lock key bits (Caps Lock, Num Lock).\n * @param data - The input data to check\n * @param codepoint - ASCII codepoint of the key\n * @param modifier - Modifier value (use MODIFIERS constants)\n */\nexport function isKittyKey(data: string, codepoint: number, modifier: number): boolean {\n\t// Check exact match first (fast path)\n\tif (data === kittySequence(codepoint, modifier)) return true;\n\t// Check with lock bits masked out\n\treturn matchesKittySequence(data, codepoint, modifier);\n}\n\n// Raw control character codes\nconst RAW = {\n\tCTRL_A: \"\\x01\",\n\tCTRL_C: \"\\x03\",\n\tCTRL_D: \"\\x04\",\n\tCTRL_E: \"\\x05\",\n\tCTRL_G: \"\\x07\",\n\tCTRL_K: \"\\x0b\",\n\tCTRL_L: \"\\x0c\",\n\tCTRL_O: \"\\x0f\",\n\tCTRL_P: \"\\x10\",\n\tCTRL_T: \"\\x14\",\n\tCTRL_U: \"\\x15\",\n\tCTRL_W: \"\\x17\",\n\tCTRL_Z: \"\\x1a\",\n\tALT_BACKSPACE: \"\\x1b\\x7f\",\n\tSHIFT_TAB: \"\\x1b[Z\",\n} as const;\n\n/**\n * Check if input matches Ctrl+A (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlA(data: string): boolean {\n\treturn data === RAW.CTRL_A || data === Keys.CTRL_A || matchesKittySequence(data, CODEPOINTS.a, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+C (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlC(data: string): boolean {\n\treturn data === RAW.CTRL_C || data === Keys.CTRL_C || matchesKittySequence(data, CODEPOINTS.c, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+D (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlD(data: string): boolean {\n\treturn data === RAW.CTRL_D || data === Keys.CTRL_D || matchesKittySequence(data, CODEPOINTS.d, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+E (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlE(data: string): boolean {\n\treturn data === RAW.CTRL_E || data === Keys.CTRL_E || matchesKittySequence(data, CODEPOINTS.e, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+G (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlG(data: string): boolean {\n\treturn data === RAW.CTRL_G || data === Keys.CTRL_G || matchesKittySequence(data, CODEPOINTS.g, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+K (raw byte or Kitty protocol).\n * Ignores lock key bits.\n * Also checks if first byte is 0x0b for compatibility with terminals\n * that may send trailing bytes.\n */\nexport function isCtrlK(data: string): boolean {\n\treturn (\n\t\tdata === RAW.CTRL_K ||\n\t\t(data.length > 0 && data.charCodeAt(0) === 0x0b) ||\n\t\tdata === Keys.CTRL_K ||\n\t\tmatchesKittySequence(data, CODEPOINTS.k, MODIFIERS.ctrl)\n\t);\n}\n\n/**\n * Check if input matches Ctrl+L (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlL(data: string): boolean {\n\treturn data === RAW.CTRL_L || data === Keys.CTRL_L || matchesKittySequence(data, CODEPOINTS.l, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+O (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlO(data: string): boolean {\n\treturn data === RAW.CTRL_O || data === Keys.CTRL_O || matchesKittySequence(data, CODEPOINTS.o, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+P (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlP(data: string): boolean {\n\treturn data === RAW.CTRL_P || data === Keys.CTRL_P || matchesKittySequence(data, CODEPOINTS.p, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Shift+Ctrl+P (Kitty protocol only).\n * Ignores lock key bits.\n */\nexport function isShiftCtrlP(data: string): boolean {\n\treturn matchesKittySequence(data, CODEPOINTS.p, MODIFIERS.shift + MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+T (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlT(data: string): boolean {\n\treturn data === RAW.CTRL_T || data === Keys.CTRL_T || matchesKittySequence(data, CODEPOINTS.t, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+U (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlU(data: string): boolean {\n\treturn data === RAW.CTRL_U || data === Keys.CTRL_U || matchesKittySequence(data, CODEPOINTS.u, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+W (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlW(data: string): boolean {\n\treturn data === RAW.CTRL_W || data === Keys.CTRL_W || matchesKittySequence(data, CODEPOINTS.w, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+Z (raw byte or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isCtrlZ(data: string): boolean {\n\treturn data === RAW.CTRL_Z || data === Keys.CTRL_Z || matchesKittySequence(data, CODEPOINTS.z, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Alt+Backspace (legacy or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isAltBackspace(data: string): boolean {\n\treturn (\n\t\tdata === RAW.ALT_BACKSPACE ||\n\t\tdata === Keys.ALT_BACKSPACE ||\n\t\tmatchesKittySequence(data, CODEPOINTS.backspace, MODIFIERS.alt)\n\t);\n}\n\n/**\n * Check if input matches Shift+Tab (legacy or Kitty protocol).\n * Ignores lock key bits.\n */\nexport function isShiftTab(data: string): boolean {\n\treturn (\n\t\tdata === RAW.SHIFT_TAB || data === Keys.SHIFT_TAB || matchesKittySequence(data, CODEPOINTS.tab, MODIFIERS.shift)\n\t);\n}\n\n/**\n * Check if input matches the Escape key (raw byte or Kitty protocol).\n * Raw: \\x1b (single byte)\n * Kitty: \\x1b[27u (codepoint 27 = escape)\n * Ignores lock key bits.\n */\nexport function isEscape(data: string): boolean {\n\treturn data === \"\\x1b\" || data === `\\x1b[${CODEPOINTS.escape}u` || matchesKittySequence(data, CODEPOINTS.escape, 0);\n}\n\n// Arrow key virtual codepoints (negative to avoid conflicts with real codepoints)\nconst ARROW_CODEPOINTS = {\n\tup: -1,\n\tdown: -2,\n\tright: -3,\n\tleft: -4,\n} as const;\n\n/**\n * Check if input matches Arrow Up key.\n * Handles both legacy (\\x1b[A) and Kitty protocol with modifiers.\n */\nexport function isArrowUp(data: string): boolean {\n\treturn data === \"\\x1b[A\" || matchesKittySequence(data, ARROW_CODEPOINTS.up, 0);\n}\n\n/**\n * Check if input matches Arrow Down key.\n * Handles both legacy (\\x1b[B) and Kitty protocol with modifiers.\n */\nexport function isArrowDown(data: string): boolean {\n\treturn data === \"\\x1b[B\" || matchesKittySequence(data, ARROW_CODEPOINTS.down, 0);\n}\n\n/**\n * Check if input matches Arrow Right key.\n * Handles both legacy (\\x1b[C) and Kitty protocol with modifiers.\n */\nexport function isArrowRight(data: string): boolean {\n\treturn data === \"\\x1b[C\" || matchesKittySequence(data, ARROW_CODEPOINTS.right, 0);\n}\n\n/**\n * Check if input matches Arrow Left key.\n * Handles both legacy (\\x1b[D) and Kitty protocol with modifiers.\n */\nexport function isArrowLeft(data: string): boolean {\n\treturn data === \"\\x1b[D\" || matchesKittySequence(data, ARROW_CODEPOINTS.left, 0);\n}\n\n/**\n * Check if input matches plain Tab key (no modifiers).\n * Handles both legacy (\\t) and Kitty protocol.\n */\nexport function isTab(data: string): boolean {\n\treturn data === \"\\t\" || matchesKittySequence(data, CODEPOINTS.tab, 0);\n}\n\n/**\n * Check if input matches plain Enter/Return key (no modifiers).\n * Handles both legacy (\\r) and Kitty protocol.\n */\nexport function isEnter(data: string): boolean {\n\treturn data === \"\\r\" || matchesKittySequence(data, CODEPOINTS.enter, 0);\n}\n\n/**\n * Check if input matches plain Backspace key (no modifiers).\n * Handles both legacy (\\x7f, \\x08) and Kitty protocol.\n */\nexport function isBackspace(data: string): boolean {\n\treturn data === \"\\x7f\" || data === \"\\x08\" || matchesKittySequence(data, CODEPOINTS.backspace, 0);\n}\n\n/**\n * Check if input matches Shift+Enter.\n * Ignores lock key bits.\n */\nexport function isShiftEnter(data: string): boolean {\n\treturn data === Keys.SHIFT_ENTER || matchesKittySequence(data, CODEPOINTS.enter, MODIFIERS.shift);\n}\n\n/**\n * Check if input matches Alt+Enter.\n * Ignores lock key bits.\n */\nexport function isAltEnter(data: string): boolean {\n\treturn data === Keys.ALT_ENTER || data === \"\\x1b\\r\" || matchesKittySequence(data, CODEPOINTS.enter, MODIFIERS.alt);\n}\n\n/**\n * Check if input matches Option/Alt+Left (word navigation).\n * Handles multiple formats including Kitty protocol.\n */\nexport function isAltLeft(data: string): boolean {\n\treturn data === \"\\x1b[1;3D\" || data === \"\\x1bb\" || matchesKittySequence(data, ARROW_CODEPOINTS.left, MODIFIERS.alt);\n}\n\n/**\n * Check if input matches Option/Alt+Right (word navigation).\n * Handles multiple formats including Kitty protocol.\n */\nexport function isAltRight(data: string): boolean {\n\treturn data === \"\\x1b[1;3C\" || data === \"\\x1bf\" || matchesKittySequence(data, ARROW_CODEPOINTS.right, MODIFIERS.alt);\n}\n\n/**\n * Check if input matches Ctrl+Left (word navigation).\n * Handles multiple formats including Kitty protocol.\n */\nexport function isCtrlLeft(data: string): boolean {\n\treturn data === \"\\x1b[1;5D\" || matchesKittySequence(data, ARROW_CODEPOINTS.left, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Ctrl+Right (word navigation).\n * Handles multiple formats including Kitty protocol.\n */\nexport function isCtrlRight(data: string): boolean {\n\treturn data === \"\\x1b[1;5C\" || matchesKittySequence(data, ARROW_CODEPOINTS.right, MODIFIERS.ctrl);\n}\n\n/**\n * Check if input matches Home key.\n * Handles legacy formats and Kitty protocol with lock key modifiers.\n */\nexport function isHome(data: string): boolean {\n\treturn (\n\t\tdata === \"\\x1b[H\" ||\n\t\tdata === \"\\x1b[1~\" ||\n\t\tdata === \"\\x1b[7~\" ||\n\t\tmatchesKittySequence(data, FUNCTIONAL_CODEPOINTS.home, 0)\n\t);\n}\n\n/**\n * Check if input matches End key.\n * Handles legacy formats and Kitty protocol with lock key modifiers.\n */\nexport function isEnd(data: string): boolean {\n\treturn (\n\t\tdata === \"\\x1b[F\" ||\n\t\tdata === \"\\x1b[4~\" ||\n\t\tdata === \"\\x1b[8~\" ||\n\t\tmatchesKittySequence(data, FUNCTIONAL_CODEPOINTS.end, 0)\n\t);\n}\n\n/**\n * Check if input matches Delete key (forward delete).\n * Handles legacy format and Kitty protocol with lock key modifiers.\n */\nexport function isDelete(data: string): boolean {\n\treturn data === \"\\x1b[3~\" || matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.delete, 0);\n}\n"]}
|
package/package.json
CHANGED