@dst0/p-tui 0.4.41 → 5.0.2

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.
Files changed (387) hide show
  1. package/dist/autocomplete.d.ts.map +1 -1
  2. package/dist/autocomplete.js.map +1 -1
  3. package/dist/components/box.d.ts +3 -1
  4. package/dist/components/box.d.ts.map +1 -1
  5. package/dist/components/box.js +19 -10
  6. package/dist/components/box.js.map +1 -1
  7. package/dist/components/cancellable-loader.d.ts.map +1 -1
  8. package/dist/components/cancellable-loader.js.map +1 -1
  9. package/dist/components/editor/constants.d.ts +9 -0
  10. package/dist/components/editor/constants.d.ts.map +1 -0
  11. package/dist/components/editor/constants.js +12 -0
  12. package/dist/components/editor/constants.js.map +1 -0
  13. package/dist/components/editor/editor-methods/autocomplete-matching.d.ts +29 -0
  14. package/dist/components/editor/editor-methods/autocomplete-matching.d.ts.map +1 -0
  15. package/dist/components/editor/editor-methods/autocomplete-matching.js +104 -0
  16. package/dist/components/editor/editor-methods/autocomplete-matching.js.map +1 -0
  17. package/dist/components/editor/editor-methods/autocomplete-request.d.ts +14 -0
  18. package/dist/components/editor/editor-methods/autocomplete-request.d.ts.map +1 -0
  19. package/dist/components/editor/editor-methods/autocomplete-request.js +72 -0
  20. package/dist/components/editor/editor-methods/autocomplete-request.js.map +1 -0
  21. package/dist/components/editor/editor-methods/backspace-cursor.d.ts +9 -0
  22. package/dist/components/editor/editor-methods/backspace-cursor.d.ts.map +1 -0
  23. package/dist/components/editor/editor-methods/backspace-cursor.js +122 -0
  24. package/dist/components/editor/editor-methods/backspace-cursor.js.map +1 -0
  25. package/dist/components/editor/editor-methods/configuration.d.ts +17 -0
  26. package/dist/components/editor/editor-methods/configuration.d.ts.map +1 -0
  27. package/dist/components/editor/editor-methods/configuration.js +107 -0
  28. package/dist/components/editor/editor-methods/configuration.js.map +1 -0
  29. package/dist/components/editor/editor-methods/cursor-movement.d.ts +7 -0
  30. package/dist/components/editor/editor-methods/cursor-movement.d.ts.map +1 -0
  31. package/dist/components/editor/editor-methods/cursor-movement.js +112 -0
  32. package/dist/components/editor/editor-methods/cursor-movement.js.map +1 -0
  33. package/dist/components/editor/editor-methods/input-handling.d.ts +3 -0
  34. package/dist/components/editor/editor-methods/input-handling.d.ts.map +1 -0
  35. package/dist/components/editor/editor-methods/input-handling.js +257 -0
  36. package/dist/components/editor/editor-methods/input-handling.js.map +1 -0
  37. package/dist/components/editor/editor-methods/paste-submit.d.ts +7 -0
  38. package/dist/components/editor/editor-methods/paste-submit.d.ts.map +1 -0
  39. package/dist/components/editor/editor-methods/paste-submit.js +105 -0
  40. package/dist/components/editor/editor-methods/paste-submit.js.map +1 -0
  41. package/dist/components/editor/editor-methods/render.d.ts +3 -0
  42. package/dist/components/editor/editor-methods/render.d.ts.map +1 -0
  43. package/dist/components/editor/editor-methods/render.js +114 -0
  44. package/dist/components/editor/editor-methods/render.js.map +1 -0
  45. package/dist/components/editor/editor-methods/text-insertion.d.ts +4 -0
  46. package/dist/components/editor/editor-methods/text-insertion.d.ts.map +1 -0
  47. package/dist/components/editor/editor-methods/text-insertion.js +91 -0
  48. package/dist/components/editor/editor-methods/text-insertion.js.map +1 -0
  49. package/dist/components/editor/editor-methods/text-layout.d.ts +15 -0
  50. package/dist/components/editor/editor-methods/text-layout.d.ts.map +1 -0
  51. package/dist/components/editor/editor-methods/text-layout.js +129 -0
  52. package/dist/components/editor/editor-methods/text-layout.js.map +1 -0
  53. package/dist/components/editor/editor-methods/vertical-movement.d.ts +8 -0
  54. package/dist/components/editor/editor-methods/vertical-movement.d.ts.map +1 -0
  55. package/dist/components/editor/editor-methods/vertical-movement.js +123 -0
  56. package/dist/components/editor/editor-methods/vertical-movement.js.map +1 -0
  57. package/dist/components/editor/editor-methods/word-operations.d.ts +19 -0
  58. package/dist/components/editor/editor-methods/word-operations.d.ts.map +1 -0
  59. package/dist/components/editor/editor-methods/word-operations.js +122 -0
  60. package/dist/components/editor/editor-methods/word-operations.js.map +1 -0
  61. package/dist/components/editor/editor-methods/yank-undo.d.ts +11 -0
  62. package/dist/components/editor/editor-methods/yank-undo.d.ts.map +1 -0
  63. package/dist/components/editor/editor-methods/yank-undo.js +132 -0
  64. package/dist/components/editor/editor-methods/yank-undo.js.map +1 -0
  65. package/dist/components/editor/editor.d.ts +67 -0
  66. package/dist/components/editor/editor.d.ts.map +1 -0
  67. package/dist/components/editor/editor.js +93 -0
  68. package/dist/components/editor/editor.js.map +1 -0
  69. package/dist/components/editor/helpers.d.ts +3 -0
  70. package/dist/components/editor/helpers.d.ts.map +1 -0
  71. package/dist/components/editor/helpers.js +3 -0
  72. package/dist/components/editor/helpers.js.map +1 -0
  73. package/dist/components/editor/index.d.ts +4 -0
  74. package/dist/components/editor/index.d.ts.map +1 -0
  75. package/dist/components/editor/index.js +3 -0
  76. package/dist/components/editor/index.js.map +1 -0
  77. package/dist/components/editor/paste-marker.d.ts +5 -0
  78. package/dist/components/editor/paste-marker.d.ts.map +1 -0
  79. package/dist/components/editor/paste-marker.js +134 -0
  80. package/dist/components/editor/paste-marker.js.map +1 -0
  81. package/dist/components/editor/trigger-patterns.d.ts +4 -0
  82. package/dist/components/editor/trigger-patterns.d.ts.map +1 -0
  83. package/dist/components/editor/trigger-patterns.js +11 -0
  84. package/dist/components/editor/trigger-patterns.js.map +1 -0
  85. package/dist/components/editor/types.d.ts +25 -0
  86. package/dist/components/editor/types.d.ts.map +1 -0
  87. package/dist/components/editor/types.js +2 -0
  88. package/dist/components/editor/types.js.map +1 -0
  89. package/dist/components/editor.d.ts +1 -253
  90. package/dist/components/editor.d.ts.map +1 -1
  91. package/dist/components/editor.js +1 -1915
  92. package/dist/components/editor.js.map +1 -1
  93. package/dist/components/image.d.ts.map +1 -1
  94. package/dist/components/image.js.map +1 -1
  95. package/dist/components/input/constants.d.ts +2 -0
  96. package/dist/components/input/constants.d.ts.map +1 -0
  97. package/dist/components/input/constants.js +3 -0
  98. package/dist/components/input/constants.js.map +1 -0
  99. package/dist/components/input/index.d.ts +2 -0
  100. package/dist/components/input/index.d.ts.map +1 -0
  101. package/dist/components/input/index.js +2 -0
  102. package/dist/components/input/index.js.map +1 -0
  103. package/dist/components/input/input-methods/input-handling.d.ts +3 -0
  104. package/dist/components/input/input-methods/input-handling.d.ts.map +1 -0
  105. package/dist/components/input/input-methods/input-handling.js +145 -0
  106. package/dist/components/input/input-methods/input-handling.js.map +1 -0
  107. package/dist/components/input/input-methods/render.d.ts +3 -0
  108. package/dist/components/input/input-methods/render.d.ts.map +1 -0
  109. package/dist/components/input/input-methods/render.js +62 -0
  110. package/dist/components/input/input-methods/render.js.map +1 -0
  111. package/dist/components/input/input-methods/text-editing.d.ts +17 -0
  112. package/dist/components/input/input-methods/text-editing.d.ts.map +1 -0
  113. package/dist/components/input/input-methods/text-editing.js +145 -0
  114. package/dist/components/input/input-methods/text-editing.js.map +1 -0
  115. package/dist/components/input/input-methods/value-access.d.ts +4 -0
  116. package/dist/components/input/input-methods/value-access.d.ts.map +1 -0
  117. package/dist/components/input/input-methods/value-access.js +20 -0
  118. package/dist/components/input/input-methods/value-access.js.map +1 -0
  119. package/dist/components/input/input.d.ts +37 -0
  120. package/dist/components/input/input.d.ts.map +1 -0
  121. package/dist/components/input/input.js +77 -0
  122. package/dist/components/input/input.js.map +1 -0
  123. package/dist/components/input/types.d.ts +5 -0
  124. package/dist/components/input/types.d.ts.map +1 -0
  125. package/dist/components/input/types.js +2 -0
  126. package/dist/components/input/types.js.map +1 -0
  127. package/dist/components/input.d.ts +1 -36
  128. package/dist/components/input.d.ts.map +1 -1
  129. package/dist/components/input.js +1 -377
  130. package/dist/components/input.js.map +1 -1
  131. package/dist/components/loader.d.ts.map +1 -1
  132. package/dist/components/loader.js.map +1 -1
  133. package/dist/components/markdown/constants.d.ts +4 -0
  134. package/dist/components/markdown/constants.d.ts.map +1 -0
  135. package/dist/components/markdown/constants.js +8 -0
  136. package/dist/components/markdown/constants.js.map +1 -0
  137. package/dist/components/markdown/index.d.ts +3 -0
  138. package/dist/components/markdown/index.d.ts.map +1 -0
  139. package/dist/components/markdown/index.js +2 -0
  140. package/dist/components/markdown/index.js.map +1 -0
  141. package/dist/components/markdown/markdown-methods/inline-rendering.d.ts +7 -0
  142. package/dist/components/markdown/markdown-methods/inline-rendering.d.ts.map +1 -0
  143. package/dist/components/markdown/markdown-methods/inline-rendering.js +95 -0
  144. package/dist/components/markdown/markdown-methods/inline-rendering.js.map +1 -0
  145. package/dist/components/markdown/markdown-methods/list-table-helpers.d.ts +7 -0
  146. package/dist/components/markdown/markdown-methods/list-table-helpers.d.ts.map +1 -0
  147. package/dist/components/markdown/markdown-methods/list-table-helpers.js +61 -0
  148. package/dist/components/markdown/markdown-methods/list-table-helpers.js.map +1 -0
  149. package/dist/components/markdown/markdown-methods/table-rendering.d.ts +5 -0
  150. package/dist/components/markdown/markdown-methods/table-rendering.d.ts.map +1 -0
  151. package/dist/components/markdown/markdown-methods/table-rendering.js +146 -0
  152. package/dist/components/markdown/markdown-methods/table-rendering.js.map +1 -0
  153. package/dist/components/markdown/markdown-methods/text-rendering.d.ts +6 -0
  154. package/dist/components/markdown/markdown-methods/text-rendering.d.ts.map +1 -0
  155. package/dist/components/markdown/markdown-methods/text-rendering.js +115 -0
  156. package/dist/components/markdown/markdown-methods/text-rendering.js.map +1 -0
  157. package/dist/components/markdown/markdown-methods/theming.d.ts +6 -0
  158. package/dist/components/markdown/markdown-methods/theming.d.ts.map +1 -0
  159. package/dist/components/markdown/markdown-methods/theming.js +41 -0
  160. package/dist/components/markdown/markdown-methods/theming.js.map +1 -0
  161. package/dist/components/markdown/markdown-methods/token-rendering.d.ts +5 -0
  162. package/dist/components/markdown/markdown-methods/token-rendering.d.ts.map +1 -0
  163. package/dist/components/markdown/markdown-methods/token-rendering.js +142 -0
  164. package/dist/components/markdown/markdown-methods/token-rendering.js.map +1 -0
  165. package/dist/components/markdown/markdown.d.ts +32 -0
  166. package/dist/components/markdown/markdown.d.ts.map +1 -0
  167. package/dist/components/markdown/markdown.js +72 -0
  168. package/dist/components/markdown/markdown.js.map +1 -0
  169. package/dist/components/markdown/strictstrikethroughtokenizer.d.ts +6 -0
  170. package/dist/components/markdown/strictstrikethroughtokenizer.d.ts.map +1 -0
  171. package/dist/components/markdown/strictstrikethroughtokenizer.js +18 -0
  172. package/dist/components/markdown/strictstrikethroughtokenizer.js.map +1 -0
  173. package/dist/components/markdown/types.d.ts +42 -0
  174. package/dist/components/markdown/types.d.ts.map +1 -0
  175. package/dist/components/markdown/types.js +2 -0
  176. package/dist/components/markdown/types.js.map +1 -0
  177. package/dist/components/markdown.d.ts +1 -96
  178. package/dist/components/markdown.d.ts.map +1 -1
  179. package/dist/components/markdown.js +1 -653
  180. package/dist/components/markdown.js.map +1 -1
  181. package/dist/components/select-list.d.ts.map +1 -1
  182. package/dist/components/select-list.js +8 -3
  183. package/dist/components/select-list.js.map +1 -1
  184. package/dist/components/settings-list.d.ts.map +1 -1
  185. package/dist/components/settings-list.js +2 -6
  186. package/dist/components/settings-list.js.map +1 -1
  187. package/dist/components/spacer.d.ts.map +1 -1
  188. package/dist/components/spacer.js.map +1 -1
  189. package/dist/components/text.d.ts.map +1 -1
  190. package/dist/components/text.js +2 -2
  191. package/dist/components/text.js.map +1 -1
  192. package/dist/components/truncated-text.d.ts.map +1 -1
  193. package/dist/components/truncated-text.js.map +1 -1
  194. package/dist/editor-component.d.ts.map +1 -1
  195. package/dist/editor-component.js.map +1 -1
  196. package/dist/fuzzy.d.ts.map +1 -1
  197. package/dist/fuzzy.js.map +1 -1
  198. package/dist/index.d.ts +1 -1
  199. package/dist/index.d.ts.map +1 -1
  200. package/dist/index.js +1 -1
  201. package/dist/index.js.map +1 -1
  202. package/dist/keybindings.d.ts.map +1 -1
  203. package/dist/keybindings.js.map +1 -1
  204. package/dist/keys.d.ts.map +1 -1
  205. package/dist/keys.js +145 -14
  206. package/dist/keys.js.map +1 -1
  207. package/dist/kill-ring.d.ts.map +1 -1
  208. package/dist/kill-ring.js.map +1 -1
  209. package/dist/native-modifiers.d.ts +9 -0
  210. package/dist/native-modifiers.d.ts.map +1 -1
  211. package/dist/native-modifiers.js +5 -0
  212. package/dist/native-modifiers.js.map +1 -1
  213. package/dist/stdin-buffer.d.ts +3 -0
  214. package/dist/stdin-buffer.d.ts.map +1 -1
  215. package/dist/stdin-buffer.js +24 -21
  216. package/dist/stdin-buffer.js.map +1 -1
  217. package/dist/terminal/constants.d.ts +9 -0
  218. package/dist/terminal/constants.d.ts.map +1 -0
  219. package/dist/terminal/constants.js +10 -0
  220. package/dist/terminal/constants.js.map +1 -0
  221. package/dist/terminal/helpers.d.ts +6 -0
  222. package/dist/terminal/helpers.d.ts.map +1 -0
  223. package/dist/terminal/helpers.js +23 -0
  224. package/dist/terminal/helpers.js.map +1 -0
  225. package/dist/terminal/index.d.ts +4 -0
  226. package/dist/terminal/index.d.ts.map +1 -0
  227. package/dist/terminal/index.js +3 -0
  228. package/dist/terminal/index.js.map +1 -0
  229. package/dist/terminal/processterminal-methods/cursor-screen.d.ts +11 -0
  230. package/dist/terminal/processterminal-methods/cursor-screen.d.ts.map +1 -0
  231. package/dist/terminal/processterminal-methods/cursor-screen.js +50 -0
  232. package/dist/terminal/processterminal-methods/cursor-screen.js.map +1 -0
  233. package/dist/terminal/processterminal-methods/keyboard-protocol.d.ts +14 -0
  234. package/dist/terminal/processterminal-methods/keyboard-protocol.d.ts.map +1 -0
  235. package/dist/terminal/processterminal-methods/keyboard-protocol.js +147 -0
  236. package/dist/terminal/processterminal-methods/keyboard-protocol.js.map +1 -0
  237. package/dist/terminal/processterminal-methods/terminal-io.d.ts +9 -0
  238. package/dist/terminal/processterminal-methods/terminal-io.d.ts.map +1 -0
  239. package/dist/terminal/processterminal-methods/terminal-io.js +153 -0
  240. package/dist/terminal/processterminal-methods/terminal-io.js.map +1 -0
  241. package/dist/terminal/processterminal.d.ts +49 -0
  242. package/dist/terminal/processterminal.d.ts.map +1 -0
  243. package/dist/terminal/processterminal.js +129 -0
  244. package/dist/terminal/processterminal.js.map +1 -0
  245. package/dist/terminal/types.d.ts +31 -0
  246. package/dist/terminal/types.d.ts.map +1 -0
  247. package/dist/terminal/types.js +2 -0
  248. package/dist/terminal/types.js.map +1 -0
  249. package/dist/terminal-colors.d.ts +2 -0
  250. package/dist/terminal-colors.d.ts.map +1 -1
  251. package/dist/terminal-colors.js +17 -5
  252. package/dist/terminal-colors.js.map +1 -1
  253. package/dist/terminal-image.d.ts.map +1 -1
  254. package/dist/terminal-image.js.map +1 -1
  255. package/dist/terminal.d.ts +1 -109
  256. package/dist/terminal.d.ts.map +1 -1
  257. package/dist/terminal.js +1 -432
  258. package/dist/terminal.js.map +1 -1
  259. package/dist/tui/constants.d.ts +3 -0
  260. package/dist/tui/constants.d.ts.map +1 -0
  261. package/dist/tui/constants.js +3 -0
  262. package/dist/tui/constants.js.map +1 -0
  263. package/dist/tui/container.d.ts +10 -0
  264. package/dist/tui/container.d.ts.map +1 -0
  265. package/dist/tui/container.js +31 -0
  266. package/dist/tui/container.js.map +1 -0
  267. package/dist/tui/helpers.d.ts +8 -0
  268. package/dist/tui/helpers.d.ts.map +1 -0
  269. package/dist/tui/helpers.js +53 -0
  270. package/dist/tui/helpers.js.map +1 -0
  271. package/dist/tui/index.d.ts +6 -0
  272. package/dist/tui/index.d.ts.map +1 -0
  273. package/dist/tui/index.js +5 -0
  274. package/dist/tui/index.js.map +1 -0
  275. package/dist/tui/tui-methods/configuration.d.ts +20 -0
  276. package/dist/tui/tui-methods/configuration.d.ts.map +1 -0
  277. package/dist/tui/tui-methods/configuration.js +131 -0
  278. package/dist/tui/tui-methods/configuration.js.map +1 -0
  279. package/dist/tui/tui-methods/cursor-background.d.ts +10 -0
  280. package/dist/tui/tui-methods/cursor-background.d.ts.map +1 -0
  281. package/dist/tui/tui-methods/cursor-background.js +52 -0
  282. package/dist/tui/tui-methods/cursor-background.js.map +1 -0
  283. package/dist/tui/tui-methods/incremental-render.d.ts +17 -0
  284. package/dist/tui/tui-methods/incremental-render.d.ts.map +1 -0
  285. package/dist/tui/tui-methods/incremental-render.js +259 -0
  286. package/dist/tui/tui-methods/incremental-render.js.map +1 -0
  287. package/dist/tui/tui-methods/input-handling.d.ts +5 -0
  288. package/dist/tui/tui-methods/input-handling.d.ts.map +1 -0
  289. package/dist/tui/tui-methods/input-handling.js +111 -0
  290. package/dist/tui/tui-methods/input-handling.js.map +1 -0
  291. package/dist/tui/tui-methods/line-compositing.d.ts +7 -0
  292. package/dist/tui/tui-methods/line-compositing.d.ts.map +1 -0
  293. package/dist/tui/tui-methods/line-compositing.js +61 -0
  294. package/dist/tui/tui-methods/line-compositing.js.map +1 -0
  295. package/dist/tui/tui-methods/overlay-compositing.d.ts +12 -0
  296. package/dist/tui/tui-methods/overlay-compositing.d.ts.map +1 -0
  297. package/dist/tui/tui-methods/overlay-compositing.js +123 -0
  298. package/dist/tui/tui-methods/overlay-compositing.js.map +1 -0
  299. package/dist/tui/tui-methods/overlay-layout.d.ts +11 -0
  300. package/dist/tui/tui-methods/overlay-layout.d.ts.map +1 -0
  301. package/dist/tui/tui-methods/overlay-layout.js +124 -0
  302. package/dist/tui/tui-methods/overlay-layout.js.map +1 -0
  303. package/dist/tui/tui-methods/overlay-management.d.ts +11 -0
  304. package/dist/tui/tui-methods/overlay-management.d.ts.map +1 -0
  305. package/dist/tui/tui-methods/overlay-management.js +152 -0
  306. package/dist/tui/tui-methods/overlay-management.js.map +1 -0
  307. package/dist/tui/tui-methods/render-pipeline.d.ts +3 -0
  308. package/dist/tui/tui-methods/render-pipeline.d.ts.map +1 -0
  309. package/dist/tui/tui-methods/render-pipeline.js +176 -0
  310. package/dist/tui/tui-methods/render-pipeline.js.map +1 -0
  311. package/dist/tui/tui-methods/render-width-error.d.ts +3 -0
  312. package/dist/tui/tui-methods/render-width-error.d.ts.map +1 -0
  313. package/dist/tui/tui-methods/render-width-error.js +28 -0
  314. package/dist/tui/tui-methods/render-width-error.js.map +1 -0
  315. package/dist/tui/tui-methods/terminal-control.d.ts +8 -0
  316. package/dist/tui/tui-methods/terminal-control.d.ts.map +1 -0
  317. package/dist/tui/tui-methods/terminal-control.js +101 -0
  318. package/dist/tui/tui-methods/terminal-control.js.map +1 -0
  319. package/dist/tui/tui.d.ts +59 -0
  320. package/dist/tui/tui.d.ts.map +1 -0
  321. package/dist/tui/tui.js +78 -0
  322. package/dist/tui/tui.js.map +1 -0
  323. package/dist/tui/types.d.ts +124 -0
  324. package/dist/tui/types.d.ts.map +1 -0
  325. package/dist/tui/types.js +2 -0
  326. package/dist/tui/types.js.map +1 -0
  327. package/dist/tui.d.ts +1 -254
  328. package/dist/tui.d.ts.map +1 -1
  329. package/dist/tui.js +1 -1344
  330. package/dist/tui.js.map +1 -1
  331. package/dist/undo-stack.d.ts.map +1 -1
  332. package/dist/undo-stack.js.map +1 -1
  333. package/dist/utils/ansi-wrapping.d.ts +5 -0
  334. package/dist/utils/ansi-wrapping.d.ts.map +1 -0
  335. package/dist/utils/ansi-wrapping.js +52 -0
  336. package/dist/utils/ansi-wrapping.js.map +1 -0
  337. package/dist/utils/ansicodetracker.d.ts +27 -0
  338. package/dist/utils/ansicodetracker.d.ts.map +1 -0
  339. package/dist/utils/ansicodetracker.js +222 -0
  340. package/dist/utils/ansicodetracker.js.map +1 -0
  341. package/dist/utils/column-slicing.d.ts +12 -0
  342. package/dist/utils/column-slicing.d.ts.map +1 -0
  343. package/dist/utils/column-slicing.js +111 -0
  344. package/dist/utils/column-slicing.js.map +1 -0
  345. package/dist/utils/column-truncation.d.ts +2 -0
  346. package/dist/utils/column-truncation.d.ts.map +1 -0
  347. package/dist/utils/column-truncation.js +129 -0
  348. package/dist/utils/column-truncation.js.map +1 -0
  349. package/dist/utils/constants.d.ts +12 -0
  350. package/dist/utils/constants.d.ts.map +1 -0
  351. package/dist/utils/constants.js +12 -0
  352. package/dist/utils/constants.js.map +1 -0
  353. package/dist/utils/index.d.ts +8 -0
  354. package/dist/utils/index.d.ts.map +1 -0
  355. package/dist/utils/index.js +8 -0
  356. package/dist/utils/index.js.map +1 -0
  357. package/dist/utils/install-delegated-methods.d.ts +5 -0
  358. package/dist/utils/install-delegated-methods.d.ts.map +1 -0
  359. package/dist/utils/install-delegated-methods.js +27 -0
  360. package/dist/utils/install-delegated-methods.js.map +1 -0
  361. package/dist/utils/segmentation.d.ts +10 -0
  362. package/dist/utils/segmentation.d.ts.map +1 -0
  363. package/dist/utils/segmentation.js +111 -0
  364. package/dist/utils/segmentation.js.map +1 -0
  365. package/dist/utils/terminal-output.d.ts +10 -0
  366. package/dist/utils/terminal-output.d.ts.map +1 -0
  367. package/dist/utils/terminal-output.js +122 -0
  368. package/dist/utils/terminal-output.js.map +1 -0
  369. package/dist/utils/types.d.ts +7 -0
  370. package/dist/utils/types.d.ts.map +1 -0
  371. package/dist/utils/types.js +2 -0
  372. package/dist/utils/types.js.map +1 -0
  373. package/dist/utils/width-truncation.d.ts +6 -0
  374. package/dist/utils/width-truncation.d.ts.map +1 -0
  375. package/dist/utils/width-truncation.js +121 -0
  376. package/dist/utils/width-truncation.js.map +1 -0
  377. package/dist/utils/word-wrapping.d.ts +4 -0
  378. package/dist/utils/word-wrapping.d.ts.map +1 -0
  379. package/dist/utils/word-wrapping.js +139 -0
  380. package/dist/utils/word-wrapping.js.map +1 -0
  381. package/dist/utils.d.ts +1 -84
  382. package/dist/utils.d.ts.map +1 -1
  383. package/dist/utils.js +1 -1059
  384. package/dist/utils.js.map +1 -1
  385. package/dist/word-navigation.d.ts.map +1 -1
  386. package/dist/word-navigation.js.map +1 -1
  387. package/package.json +2 -1
@@ -0,0 +1,145 @@
1
+ import { getKeybindings } from "../../../keybindings.js";
2
+ import { decodeKittyPrintable } from "../../../keys.js";
3
+ import { segmenter } from "../constants.js";
4
+ export function do_handleInput(self, data) {
5
+ // Handle bracketed paste mode
6
+ // Start of paste: \x1b[200~
7
+ // End of paste: \x1b[201~
8
+ // Check if we're starting a bracketed paste
9
+ if (data.includes("\x1b[200~")) {
10
+ self.isInPaste = true;
11
+ self.pasteBuffer = "";
12
+ data = data.replace("\x1b[200~", "");
13
+ }
14
+ // If we're in a paste, buffer the data
15
+ if (self.isInPaste) {
16
+ // Check if self chunk contains the end marker
17
+ self.pasteBuffer += data;
18
+ const endIndex = self.pasteBuffer.indexOf("\x1b[201~");
19
+ if (endIndex !== -1) {
20
+ // Extract the pasted content
21
+ const pasteContent = self.pasteBuffer.substring(0, endIndex);
22
+ // Process the complete paste
23
+ self.handlePaste(pasteContent);
24
+ // Reset paste state
25
+ self.isInPaste = false;
26
+ // Handle any remaining input after the paste marker
27
+ const remaining = self.pasteBuffer.substring(endIndex + 6); // 6 = length of \x1b[201~
28
+ self.pasteBuffer = "";
29
+ if (remaining) {
30
+ self.handleInput(remaining);
31
+ }
32
+ }
33
+ return;
34
+ }
35
+ const kb = getKeybindings();
36
+ // Escape/Cancel
37
+ if (kb.matches(data, "tui.select.cancel")) {
38
+ if (self.onEscape)
39
+ self.onEscape();
40
+ return;
41
+ }
42
+ // Undo
43
+ if (kb.matches(data, "tui.editor.undo")) {
44
+ self.undo();
45
+ return;
46
+ }
47
+ // Submit
48
+ if (kb.matches(data, "tui.input.submit") || data === "\n") {
49
+ if (self.onSubmit)
50
+ self.onSubmit(self.value);
51
+ return;
52
+ }
53
+ // Deletion
54
+ if (kb.matches(data, "tui.editor.deleteCharBackward")) {
55
+ self.handleBackspace();
56
+ return;
57
+ }
58
+ if (kb.matches(data, "tui.editor.deleteCharForward")) {
59
+ self.handleForwardDelete();
60
+ return;
61
+ }
62
+ if (kb.matches(data, "tui.editor.deleteWordBackward")) {
63
+ self.deleteWordBackwards();
64
+ return;
65
+ }
66
+ if (kb.matches(data, "tui.editor.deleteWordForward")) {
67
+ self.deleteWordForward();
68
+ return;
69
+ }
70
+ if (kb.matches(data, "tui.editor.deleteToLineStart")) {
71
+ self.deleteToLineStart();
72
+ return;
73
+ }
74
+ if (kb.matches(data, "tui.editor.deleteToLineEnd")) {
75
+ self.deleteToLineEnd();
76
+ return;
77
+ }
78
+ // Kill ring actions
79
+ if (kb.matches(data, "tui.editor.yank")) {
80
+ self.yank();
81
+ return;
82
+ }
83
+ if (kb.matches(data, "tui.editor.yankPop")) {
84
+ self.yankPop();
85
+ return;
86
+ }
87
+ // Cursor movement
88
+ if (kb.matches(data, "tui.editor.cursorLeft")) {
89
+ self.lastAction = null;
90
+ if (self.cursor > 0) {
91
+ const beforeCursor = self.value.slice(0, self.cursor);
92
+ const graphemes = [...segmenter.segment(beforeCursor)];
93
+ const lastGrapheme = graphemes[graphemes.length - 1];
94
+ self.cursor -= lastGrapheme ? lastGrapheme.segment.length : 1;
95
+ }
96
+ return;
97
+ }
98
+ if (kb.matches(data, "tui.editor.cursorRight")) {
99
+ self.lastAction = null;
100
+ if (self.cursor < self.value.length) {
101
+ const afterCursor = self.value.slice(self.cursor);
102
+ const graphemes = [...segmenter.segment(afterCursor)];
103
+ const firstGrapheme = graphemes[0];
104
+ self.cursor += firstGrapheme ? firstGrapheme.segment.length : 1;
105
+ }
106
+ return;
107
+ }
108
+ if (kb.matches(data, "tui.editor.cursorLineStart")) {
109
+ self.lastAction = null;
110
+ self.cursor = 0;
111
+ return;
112
+ }
113
+ if (kb.matches(data, "tui.editor.cursorLineEnd")) {
114
+ self.lastAction = null;
115
+ self.cursor = self.value.length;
116
+ return;
117
+ }
118
+ if (kb.matches(data, "tui.editor.cursorWordLeft")) {
119
+ self.moveWordBackwards();
120
+ return;
121
+ }
122
+ if (kb.matches(data, "tui.editor.cursorWordRight")) {
123
+ self.moveWordForwards();
124
+ return;
125
+ }
126
+ // Kitty CSI-u printable character (e.g. \x1b[97u for 'a').
127
+ // Terminals with Kitty protocol flag 1 (disambiguate) send CSI-u for all keys,
128
+ // including plain printable characters. Decode before the control-char check
129
+ // since CSI-u sequences contain \x1b which would be rejected.
130
+ const kittyPrintable = decodeKittyPrintable(data);
131
+ if (kittyPrintable !== undefined) {
132
+ self.insertCharacter(kittyPrintable);
133
+ return;
134
+ }
135
+ // Regular character input - accept printable characters including Unicode,
136
+ // but reject control characters (C0: 0x00-0x1F, DEL: 0x7F, C1: 0x80-0x9F)
137
+ const hasControlChars = [...data].some((ch) => {
138
+ const code = ch.charCodeAt(0);
139
+ return code < 32 || code === 0x7f || (code >= 0x80 && code <= 0x9f);
140
+ });
141
+ if (!hasControlChars) {
142
+ self.insertCharacter(data);
143
+ }
144
+ }
145
+ //# sourceMappingURL=input-handling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-handling.js","sourceRoot":"","sources":["../../../../src/components/input/input-methods/input-handling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,UAAU,cAAc,CAAC,IAAW,EAAE,IAAY,EAAQ;IAC9D,8BAA8B;IAC9B,4BAA4B;IAC5B,0BAA0B;IAE1B,4CAA4C;IAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,uCAAuC;IACvC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,8CAA8C;QAC9C,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;QAEzB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACvD,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YACpB,6BAA6B;YAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAE7D,6BAA6B;YAC7B,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YAE/B,oBAAoB;YACpB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YAEvB,oDAAoD;YACpD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,0BAA0B;YACtF,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;YACtB,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IAE5B,gBAAgB;IAChB,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnC,OAAO;IACT,CAAC;IAED,OAAO;IACP,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,SAAS;IACT,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC1D,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,WAAW;IACX,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,+BAA+B,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,8BAA8B,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,+BAA+B,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,8BAA8B,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,8BAA8B,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,4BAA4B,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,oBAAoB;IACpB,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IACD,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IAED,kBAAkB;IAClB,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,uBAAuB,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;YACvD,MAAM,YAAY,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,wBAAwB,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;YACtD,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,4BAA4B,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,0BAA0B,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAChC,OAAO;IACT,CAAC;IAED,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,2BAA2B,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,4BAA4B,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,2DAA2D;IAC3D,+EAA+E;IAC/E,6EAA6E;IAC7E,8DAA8D;IAC9D,MAAM,cAAc,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,2EAA2E;IAC3E,0EAA0E;IAC1E,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC9B,OAAO,IAAI,GAAG,EAAE,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC;IAAA,CACrE,CAAC,CAAC;IACH,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AAAA,CACF","sourcesContent":["import { getKeybindings } from \"../../../keybindings.ts\";\nimport { decodeKittyPrintable } from \"../../../keys.ts\";\nimport { segmenter } from \"../constants.ts\";\nimport type { Input } from \"../input.ts\";\n\nexport function do_handleInput(self: Input, data: string): void {\n // Handle bracketed paste mode\n // Start of paste: \\x1b[200~\n // End of paste: \\x1b[201~\n\n // Check if we're starting a bracketed paste\n if (data.includes(\"\\x1b[200~\")) {\n self.isInPaste = true;\n self.pasteBuffer = \"\";\n data = data.replace(\"\\x1b[200~\", \"\");\n }\n\n // If we're in a paste, buffer the data\n if (self.isInPaste) {\n // Check if self chunk contains the end marker\n self.pasteBuffer += data;\n\n const endIndex = self.pasteBuffer.indexOf(\"\\x1b[201~\");\n if (endIndex !== -1) {\n // Extract the pasted content\n const pasteContent = self.pasteBuffer.substring(0, endIndex);\n\n // Process the complete paste\n self.handlePaste(pasteContent);\n\n // Reset paste state\n self.isInPaste = false;\n\n // Handle any remaining input after the paste marker\n const remaining = self.pasteBuffer.substring(endIndex + 6); // 6 = length of \\x1b[201~\n self.pasteBuffer = \"\";\n if (remaining) {\n self.handleInput(remaining);\n }\n }\n return;\n }\n\n const kb = getKeybindings();\n\n // Escape/Cancel\n if (kb.matches(data, \"tui.select.cancel\")) {\n if (self.onEscape) self.onEscape();\n return;\n }\n\n // Undo\n if (kb.matches(data, \"tui.editor.undo\")) {\n self.undo();\n return;\n }\n\n // Submit\n if (kb.matches(data, \"tui.input.submit\") || data === \"\\n\") {\n if (self.onSubmit) self.onSubmit(self.value);\n return;\n }\n\n // Deletion\n if (kb.matches(data, \"tui.editor.deleteCharBackward\")) {\n self.handleBackspace();\n return;\n }\n\n if (kb.matches(data, \"tui.editor.deleteCharForward\")) {\n self.handleForwardDelete();\n return;\n }\n\n if (kb.matches(data, \"tui.editor.deleteWordBackward\")) {\n self.deleteWordBackwards();\n return;\n }\n\n if (kb.matches(data, \"tui.editor.deleteWordForward\")) {\n self.deleteWordForward();\n return;\n }\n\n if (kb.matches(data, \"tui.editor.deleteToLineStart\")) {\n self.deleteToLineStart();\n return;\n }\n\n if (kb.matches(data, \"tui.editor.deleteToLineEnd\")) {\n self.deleteToLineEnd();\n return;\n }\n\n // Kill ring actions\n if (kb.matches(data, \"tui.editor.yank\")) {\n self.yank();\n return;\n }\n if (kb.matches(data, \"tui.editor.yankPop\")) {\n self.yankPop();\n return;\n }\n\n // Cursor movement\n if (kb.matches(data, \"tui.editor.cursorLeft\")) {\n self.lastAction = null;\n if (self.cursor > 0) {\n const beforeCursor = self.value.slice(0, self.cursor);\n const graphemes = [...segmenter.segment(beforeCursor)];\n const lastGrapheme = graphemes[graphemes.length - 1];\n self.cursor -= lastGrapheme ? lastGrapheme.segment.length : 1;\n }\n return;\n }\n\n if (kb.matches(data, \"tui.editor.cursorRight\")) {\n self.lastAction = null;\n if (self.cursor < self.value.length) {\n const afterCursor = self.value.slice(self.cursor);\n const graphemes = [...segmenter.segment(afterCursor)];\n const firstGrapheme = graphemes[0];\n self.cursor += firstGrapheme ? firstGrapheme.segment.length : 1;\n }\n return;\n }\n\n if (kb.matches(data, \"tui.editor.cursorLineStart\")) {\n self.lastAction = null;\n self.cursor = 0;\n return;\n }\n\n if (kb.matches(data, \"tui.editor.cursorLineEnd\")) {\n self.lastAction = null;\n self.cursor = self.value.length;\n return;\n }\n\n if (kb.matches(data, \"tui.editor.cursorWordLeft\")) {\n self.moveWordBackwards();\n return;\n }\n\n if (kb.matches(data, \"tui.editor.cursorWordRight\")) {\n self.moveWordForwards();\n return;\n }\n\n // Kitty CSI-u printable character (e.g. \\x1b[97u for 'a').\n // Terminals with Kitty protocol flag 1 (disambiguate) send CSI-u for all keys,\n // including plain printable characters. Decode before the control-char check\n // since CSI-u sequences contain \\x1b which would be rejected.\n const kittyPrintable = decodeKittyPrintable(data);\n if (kittyPrintable !== undefined) {\n self.insertCharacter(kittyPrintable);\n return;\n }\n\n // Regular character input - accept printable characters including Unicode,\n // but reject control characters (C0: 0x00-0x1F, DEL: 0x7F, C1: 0x80-0x9F)\n const hasControlChars = [...data].some((ch) => {\n const code = ch.charCodeAt(0);\n return code < 32 || code === 0x7f || (code >= 0x80 && code <= 0x9f);\n });\n if (!hasControlChars) {\n self.insertCharacter(data);\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Input } from "../input.ts";
2
+ export declare function do_render(self: Input, width: number): string[];
3
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../../src/components/input/input-methods/render.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,wBAAgB,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAsE9D","sourcesContent":["import { CURSOR_MARKER } from \"../../../tui.ts\";\nimport { sliceByColumn, visibleWidth } from \"../../../utils.ts\";\nimport { segmenter } from \"../constants.ts\";\nimport type { Input } from \"../input.ts\";\n\nexport function do_render(self: Input, width: number): string[] {\n // Calculate visible window\n const prompt = \"> \";\n const availableWidth = width - prompt.length;\n\n if (availableWidth <= 0) {\n return [prompt];\n }\n\n let visibleText = \"\";\n let cursorDisplay = self.cursor;\n const totalWidth = visibleWidth(self.value);\n\n if (totalWidth < availableWidth) {\n // Everything fits (leave room for cursor at end)\n visibleText = self.value;\n } else {\n // Need horizontal scrolling - use edge-based scrolling to avoid jitter\n const scrollWidth = self.cursor === self.value.length ? availableWidth - 1 : availableWidth;\n const cursorCol = visibleWidth(self.value.slice(0, self.cursor));\n const scrollMargin = Math.min(5, Math.floor(scrollWidth / 4));\n\n if (scrollWidth > 0) {\n // Adjust scroll offset only when cursor would go off-screen\n if (cursorCol < self.scrollOffset + scrollMargin) {\n // Cursor too far left — scroll left\n self.scrollOffset = Math.max(0, cursorCol - scrollMargin);\n } else if (cursorCol >= self.scrollOffset + scrollWidth - scrollMargin) {\n // Cursor too far right — scroll right\n self.scrollOffset = Math.max(0, cursorCol - scrollWidth + scrollMargin + 1);\n }\n // Clamp scroll offset to valid range\n self.scrollOffset = Math.min(self.scrollOffset, Math.max(0, totalWidth - scrollWidth));\n\n visibleText = sliceByColumn(self.value, self.scrollOffset, scrollWidth, true);\n const beforeCursor = sliceByColumn(\n self.value,\n self.scrollOffset,\n Math.max(0, cursorCol - self.scrollOffset),\n true,\n );\n cursorDisplay = beforeCursor.length;\n } else {\n visibleText = \"\";\n cursorDisplay = 0;\n }\n }\n\n // Build line with fake cursor\n // Insert cursor character at cursor position\n const graphemes = [...segmenter.segment(visibleText.slice(cursorDisplay))];\n const cursorGrapheme = graphemes[0];\n\n const beforeCursor = visibleText.slice(0, cursorDisplay);\n const atCursor = cursorGrapheme?.segment ?? \" \"; // Character at cursor, or space if at end\n const afterCursor = visibleText.slice(cursorDisplay + atCursor.length);\n\n // Hardware cursor marker (zero-width, emitted before fake cursor for IME positioning)\n const marker = self.focused ? CURSOR_MARKER : \"\";\n\n // Use inverse video to show cursor\n const cursorChar = `\\x1b[7m${atCursor}\\x1b[27m`; // ESC[7m = reverse video, ESC[27m = normal\n const textWithCursor = beforeCursor + marker + cursorChar + afterCursor;\n\n // Calculate visual width\n const visualLength = visibleWidth(textWithCursor);\n const padding = \" \".repeat(Math.max(0, availableWidth - visualLength));\n const line = prompt + textWithCursor + padding;\n\n return [line];\n}\n"]}
@@ -0,0 +1,62 @@
1
+ import { CURSOR_MARKER } from "../../../tui.js";
2
+ import { sliceByColumn, visibleWidth } from "../../../utils.js";
3
+ import { segmenter } from "../constants.js";
4
+ export function do_render(self, width) {
5
+ // Calculate visible window
6
+ const prompt = "> ";
7
+ const availableWidth = width - prompt.length;
8
+ if (availableWidth <= 0) {
9
+ return [prompt];
10
+ }
11
+ let visibleText = "";
12
+ let cursorDisplay = self.cursor;
13
+ const totalWidth = visibleWidth(self.value);
14
+ if (totalWidth < availableWidth) {
15
+ // Everything fits (leave room for cursor at end)
16
+ visibleText = self.value;
17
+ }
18
+ else {
19
+ // Need horizontal scrolling - use edge-based scrolling to avoid jitter
20
+ const scrollWidth = self.cursor === self.value.length ? availableWidth - 1 : availableWidth;
21
+ const cursorCol = visibleWidth(self.value.slice(0, self.cursor));
22
+ const scrollMargin = Math.min(5, Math.floor(scrollWidth / 4));
23
+ if (scrollWidth > 0) {
24
+ // Adjust scroll offset only when cursor would go off-screen
25
+ if (cursorCol < self.scrollOffset + scrollMargin) {
26
+ // Cursor too far left — scroll left
27
+ self.scrollOffset = Math.max(0, cursorCol - scrollMargin);
28
+ }
29
+ else if (cursorCol >= self.scrollOffset + scrollWidth - scrollMargin) {
30
+ // Cursor too far right — scroll right
31
+ self.scrollOffset = Math.max(0, cursorCol - scrollWidth + scrollMargin + 1);
32
+ }
33
+ // Clamp scroll offset to valid range
34
+ self.scrollOffset = Math.min(self.scrollOffset, Math.max(0, totalWidth - scrollWidth));
35
+ visibleText = sliceByColumn(self.value, self.scrollOffset, scrollWidth, true);
36
+ const beforeCursor = sliceByColumn(self.value, self.scrollOffset, Math.max(0, cursorCol - self.scrollOffset), true);
37
+ cursorDisplay = beforeCursor.length;
38
+ }
39
+ else {
40
+ visibleText = "";
41
+ cursorDisplay = 0;
42
+ }
43
+ }
44
+ // Build line with fake cursor
45
+ // Insert cursor character at cursor position
46
+ const graphemes = [...segmenter.segment(visibleText.slice(cursorDisplay))];
47
+ const cursorGrapheme = graphemes[0];
48
+ const beforeCursor = visibleText.slice(0, cursorDisplay);
49
+ const atCursor = cursorGrapheme?.segment ?? " "; // Character at cursor, or space if at end
50
+ const afterCursor = visibleText.slice(cursorDisplay + atCursor.length);
51
+ // Hardware cursor marker (zero-width, emitted before fake cursor for IME positioning)
52
+ const marker = self.focused ? CURSOR_MARKER : "";
53
+ // Use inverse video to show cursor
54
+ const cursorChar = `\x1b[7m${atCursor}\x1b[27m`; // ESC[7m = reverse video, ESC[27m = normal
55
+ const textWithCursor = beforeCursor + marker + cursorChar + afterCursor;
56
+ // Calculate visual width
57
+ const visualLength = visibleWidth(textWithCursor);
58
+ const padding = " ".repeat(Math.max(0, availableWidth - visualLength));
59
+ const line = prompt + textWithCursor + padding;
60
+ return [line];
61
+ }
62
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../src/components/input/input-methods/render.ts"],"names":[],"mappings":"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","sourcesContent":["import { CURSOR_MARKER } from \"../../../tui.ts\";\nimport { sliceByColumn, visibleWidth } from \"../../../utils.ts\";\nimport { segmenter } from \"../constants.ts\";\nimport type { Input } from \"../input.ts\";\n\nexport function do_render(self: Input, width: number): string[] {\n // Calculate visible window\n const prompt = \"> \";\n const availableWidth = width - prompt.length;\n\n if (availableWidth <= 0) {\n return [prompt];\n }\n\n let visibleText = \"\";\n let cursorDisplay = self.cursor;\n const totalWidth = visibleWidth(self.value);\n\n if (totalWidth < availableWidth) {\n // Everything fits (leave room for cursor at end)\n visibleText = self.value;\n } else {\n // Need horizontal scrolling - use edge-based scrolling to avoid jitter\n const scrollWidth = self.cursor === self.value.length ? availableWidth - 1 : availableWidth;\n const cursorCol = visibleWidth(self.value.slice(0, self.cursor));\n const scrollMargin = Math.min(5, Math.floor(scrollWidth / 4));\n\n if (scrollWidth > 0) {\n // Adjust scroll offset only when cursor would go off-screen\n if (cursorCol < self.scrollOffset + scrollMargin) {\n // Cursor too far left — scroll left\n self.scrollOffset = Math.max(0, cursorCol - scrollMargin);\n } else if (cursorCol >= self.scrollOffset + scrollWidth - scrollMargin) {\n // Cursor too far right — scroll right\n self.scrollOffset = Math.max(0, cursorCol - scrollWidth + scrollMargin + 1);\n }\n // Clamp scroll offset to valid range\n self.scrollOffset = Math.min(self.scrollOffset, Math.max(0, totalWidth - scrollWidth));\n\n visibleText = sliceByColumn(self.value, self.scrollOffset, scrollWidth, true);\n const beforeCursor = sliceByColumn(\n self.value,\n self.scrollOffset,\n Math.max(0, cursorCol - self.scrollOffset),\n true,\n );\n cursorDisplay = beforeCursor.length;\n } else {\n visibleText = \"\";\n cursorDisplay = 0;\n }\n }\n\n // Build line with fake cursor\n // Insert cursor character at cursor position\n const graphemes = [...segmenter.segment(visibleText.slice(cursorDisplay))];\n const cursorGrapheme = graphemes[0];\n\n const beforeCursor = visibleText.slice(0, cursorDisplay);\n const atCursor = cursorGrapheme?.segment ?? \" \"; // Character at cursor, or space if at end\n const afterCursor = visibleText.slice(cursorDisplay + atCursor.length);\n\n // Hardware cursor marker (zero-width, emitted before fake cursor for IME positioning)\n const marker = self.focused ? CURSOR_MARKER : \"\";\n\n // Use inverse video to show cursor\n const cursorChar = `\\x1b[7m${atCursor}\\x1b[27m`; // ESC[7m = reverse video, ESC[27m = normal\n const textWithCursor = beforeCursor + marker + cursorChar + afterCursor;\n\n // Calculate visual width\n const visualLength = visibleWidth(textWithCursor);\n const padding = \" \".repeat(Math.max(0, availableWidth - visualLength));\n const line = prompt + textWithCursor + padding;\n\n return [line];\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import type { Input } from "../input.ts";
2
+ export declare function do_insertCharacter(self: Input, char: string): void;
3
+ export declare function do_handleBackspace(self: Input): void;
4
+ export declare function do_handleForwardDelete(self: Input): void;
5
+ export declare function do_deleteToLineStart(self: Input): void;
6
+ export declare function do_deleteToLineEnd(self: Input): void;
7
+ export declare function do_deleteWordBackwards(self: Input): void;
8
+ export declare function do_deleteWordForward(self: Input): void;
9
+ export declare function do_yank(self: Input): void;
10
+ export declare function do_yankPop(self: Input): void;
11
+ export declare function do_pushUndo(self: Input): void;
12
+ export declare function do_undo(self: Input): void;
13
+ export declare function do_moveWordBackwards(self: Input): void;
14
+ export declare function do_moveWordForwards(self: Input): void;
15
+ export declare function do_handlePaste(self: Input, pastedText: string): void;
16
+ export declare function do_invalidate(_self: Input): void;
17
+ //# sourceMappingURL=text-editing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-editing.d.ts","sourceRoot":"","sources":["../../../../src/components/input/input-methods/text-editing.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CASlE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAWpD;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAUxD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAQtD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAOpD;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAmBxD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAkBtD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CASzC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAgB5C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAE7C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAMzC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAItD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAIrD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAUpE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAEhD","sourcesContent":["import { isWhitespaceChar } from \"../../../utils.ts\";\nimport { findWordBackward, findWordForward } from \"../../../word-navigation.ts\";\nimport { segmenter } from \"../constants.ts\";\nimport type { Input } from \"../input.ts\";\n\nexport function do_insertCharacter(self: Input, char: string): void {\n // Undo coalescing: consecutive word chars coalesce into one undo unit\n if (isWhitespaceChar(char) || self.lastAction !== \"type-word\") {\n self.pushUndo();\n }\n self.lastAction = \"type-word\";\n\n self.value = self.value.slice(0, self.cursor) + char + self.value.slice(self.cursor);\n self.cursor += char.length;\n}\n\nexport function do_handleBackspace(self: Input): void {\n self.lastAction = null;\n if (self.cursor > 0) {\n self.pushUndo();\n const beforeCursor = self.value.slice(0, self.cursor);\n const graphemes = [...segmenter.segment(beforeCursor)];\n const lastGrapheme = graphemes[graphemes.length - 1];\n const graphemeLength = lastGrapheme ? lastGrapheme.segment.length : 1;\n self.value = self.value.slice(0, self.cursor - graphemeLength) + self.value.slice(self.cursor);\n self.cursor -= graphemeLength;\n }\n}\n\nexport function do_handleForwardDelete(self: Input): void {\n self.lastAction = null;\n if (self.cursor < self.value.length) {\n self.pushUndo();\n const afterCursor = self.value.slice(self.cursor);\n const graphemes = [...segmenter.segment(afterCursor)];\n const firstGrapheme = graphemes[0];\n const graphemeLength = firstGrapheme ? firstGrapheme.segment.length : 1;\n self.value = self.value.slice(0, self.cursor) + self.value.slice(self.cursor + graphemeLength);\n }\n}\n\nexport function do_deleteToLineStart(self: Input): void {\n if (self.cursor === 0) return;\n self.pushUndo();\n const deletedText = self.value.slice(0, self.cursor);\n self.killRing.push(deletedText, { prepend: true, accumulate: self.lastAction === \"kill\" });\n self.lastAction = \"kill\";\n self.value = self.value.slice(self.cursor);\n self.cursor = 0;\n}\n\nexport function do_deleteToLineEnd(self: Input): void {\n if (self.cursor >= self.value.length) return;\n self.pushUndo();\n const deletedText = self.value.slice(self.cursor);\n self.killRing.push(deletedText, { prepend: false, accumulate: self.lastAction === \"kill\" });\n self.lastAction = \"kill\";\n self.value = self.value.slice(0, self.cursor);\n}\n\nexport function do_deleteWordBackwards(self: Input): void {\n if (self.cursor === 0) return;\n\n // Save lastAction before cursor movement (moveWordBackwards resets it)\n const wasKill = self.lastAction === \"kill\";\n\n self.pushUndo();\n\n const oldCursor = self.cursor;\n self.moveWordBackwards();\n const deleteFrom = self.cursor;\n self.cursor = oldCursor;\n\n const deletedText = self.value.slice(deleteFrom, self.cursor);\n self.killRing.push(deletedText, { prepend: true, accumulate: wasKill });\n self.lastAction = \"kill\";\n\n self.value = self.value.slice(0, deleteFrom) + self.value.slice(self.cursor);\n self.cursor = deleteFrom;\n}\n\nexport function do_deleteWordForward(self: Input): void {\n if (self.cursor >= self.value.length) return;\n\n // Save lastAction before cursor movement (moveWordForwards resets it)\n const wasKill = self.lastAction === \"kill\";\n\n self.pushUndo();\n\n const oldCursor = self.cursor;\n self.moveWordForwards();\n const deleteTo = self.cursor;\n self.cursor = oldCursor;\n\n const deletedText = self.value.slice(self.cursor, deleteTo);\n self.killRing.push(deletedText, { prepend: false, accumulate: wasKill });\n self.lastAction = \"kill\";\n\n self.value = self.value.slice(0, self.cursor) + self.value.slice(deleteTo);\n}\n\nexport function do_yank(self: Input): void {\n const text = self.killRing.peek();\n if (!text) return;\n\n self.pushUndo();\n\n self.value = self.value.slice(0, self.cursor) + text + self.value.slice(self.cursor);\n self.cursor += text.length;\n self.lastAction = \"yank\";\n}\n\nexport function do_yankPop(self: Input): void {\n if (self.lastAction !== \"yank\" || self.killRing.length <= 1) return;\n\n self.pushUndo();\n\n // Delete the previously yanked text (still at end of ring before rotation)\n const prevText = self.killRing.peek() || \"\";\n self.value = self.value.slice(0, self.cursor - prevText.length) + self.value.slice(self.cursor);\n self.cursor -= prevText.length;\n\n // Rotate and insert new entry\n self.killRing.rotate();\n const text = self.killRing.peek() || \"\";\n self.value = self.value.slice(0, self.cursor) + text + self.value.slice(self.cursor);\n self.cursor += text.length;\n self.lastAction = \"yank\";\n}\n\nexport function do_pushUndo(self: Input): void {\n self.undoStack.push({ value: self.value, cursor: self.cursor });\n}\n\nexport function do_undo(self: Input): void {\n const snapshot = self.undoStack.pop();\n if (!snapshot) return;\n self.value = snapshot.value;\n self.cursor = snapshot.cursor;\n self.lastAction = null;\n}\n\nexport function do_moveWordBackwards(self: Input): void {\n if (self.cursor === 0) return;\n self.lastAction = null;\n self.cursor = findWordBackward(self.value, self.cursor);\n}\n\nexport function do_moveWordForwards(self: Input): void {\n if (self.cursor >= self.value.length) return;\n self.lastAction = null;\n self.cursor = findWordForward(self.value, self.cursor);\n}\n\nexport function do_handlePaste(self: Input, pastedText: string): void {\n self.lastAction = null;\n self.pushUndo();\n\n // Clean the pasted text - remove newlines and carriage returns\n const cleanText = pastedText.replace(/\\r\\n/g, \"\").replace(/\\r/g, \"\").replace(/\\n/g, \"\").replace(/\\t/g, \" \");\n\n // Insert at cursor position\n self.value = self.value.slice(0, self.cursor) + cleanText + self.value.slice(self.cursor);\n self.cursor += cleanText.length;\n}\n\nexport function do_invalidate(_self: Input): void {\n // No cached state to invalidate currently\n}\n"]}
@@ -0,0 +1,145 @@
1
+ import { isWhitespaceChar } from "../../../utils.js";
2
+ import { findWordBackward, findWordForward } from "../../../word-navigation.js";
3
+ import { segmenter } from "../constants.js";
4
+ export function do_insertCharacter(self, char) {
5
+ // Undo coalescing: consecutive word chars coalesce into one undo unit
6
+ if (isWhitespaceChar(char) || self.lastAction !== "type-word") {
7
+ self.pushUndo();
8
+ }
9
+ self.lastAction = "type-word";
10
+ self.value = self.value.slice(0, self.cursor) + char + self.value.slice(self.cursor);
11
+ self.cursor += char.length;
12
+ }
13
+ export function do_handleBackspace(self) {
14
+ self.lastAction = null;
15
+ if (self.cursor > 0) {
16
+ self.pushUndo();
17
+ const beforeCursor = self.value.slice(0, self.cursor);
18
+ const graphemes = [...segmenter.segment(beforeCursor)];
19
+ const lastGrapheme = graphemes[graphemes.length - 1];
20
+ const graphemeLength = lastGrapheme ? lastGrapheme.segment.length : 1;
21
+ self.value = self.value.slice(0, self.cursor - graphemeLength) + self.value.slice(self.cursor);
22
+ self.cursor -= graphemeLength;
23
+ }
24
+ }
25
+ export function do_handleForwardDelete(self) {
26
+ self.lastAction = null;
27
+ if (self.cursor < self.value.length) {
28
+ self.pushUndo();
29
+ const afterCursor = self.value.slice(self.cursor);
30
+ const graphemes = [...segmenter.segment(afterCursor)];
31
+ const firstGrapheme = graphemes[0];
32
+ const graphemeLength = firstGrapheme ? firstGrapheme.segment.length : 1;
33
+ self.value = self.value.slice(0, self.cursor) + self.value.slice(self.cursor + graphemeLength);
34
+ }
35
+ }
36
+ export function do_deleteToLineStart(self) {
37
+ if (self.cursor === 0)
38
+ return;
39
+ self.pushUndo();
40
+ const deletedText = self.value.slice(0, self.cursor);
41
+ self.killRing.push(deletedText, { prepend: true, accumulate: self.lastAction === "kill" });
42
+ self.lastAction = "kill";
43
+ self.value = self.value.slice(self.cursor);
44
+ self.cursor = 0;
45
+ }
46
+ export function do_deleteToLineEnd(self) {
47
+ if (self.cursor >= self.value.length)
48
+ return;
49
+ self.pushUndo();
50
+ const deletedText = self.value.slice(self.cursor);
51
+ self.killRing.push(deletedText, { prepend: false, accumulate: self.lastAction === "kill" });
52
+ self.lastAction = "kill";
53
+ self.value = self.value.slice(0, self.cursor);
54
+ }
55
+ export function do_deleteWordBackwards(self) {
56
+ if (self.cursor === 0)
57
+ return;
58
+ // Save lastAction before cursor movement (moveWordBackwards resets it)
59
+ const wasKill = self.lastAction === "kill";
60
+ self.pushUndo();
61
+ const oldCursor = self.cursor;
62
+ self.moveWordBackwards();
63
+ const deleteFrom = self.cursor;
64
+ self.cursor = oldCursor;
65
+ const deletedText = self.value.slice(deleteFrom, self.cursor);
66
+ self.killRing.push(deletedText, { prepend: true, accumulate: wasKill });
67
+ self.lastAction = "kill";
68
+ self.value = self.value.slice(0, deleteFrom) + self.value.slice(self.cursor);
69
+ self.cursor = deleteFrom;
70
+ }
71
+ export function do_deleteWordForward(self) {
72
+ if (self.cursor >= self.value.length)
73
+ return;
74
+ // Save lastAction before cursor movement (moveWordForwards resets it)
75
+ const wasKill = self.lastAction === "kill";
76
+ self.pushUndo();
77
+ const oldCursor = self.cursor;
78
+ self.moveWordForwards();
79
+ const deleteTo = self.cursor;
80
+ self.cursor = oldCursor;
81
+ const deletedText = self.value.slice(self.cursor, deleteTo);
82
+ self.killRing.push(deletedText, { prepend: false, accumulate: wasKill });
83
+ self.lastAction = "kill";
84
+ self.value = self.value.slice(0, self.cursor) + self.value.slice(deleteTo);
85
+ }
86
+ export function do_yank(self) {
87
+ const text = self.killRing.peek();
88
+ if (!text)
89
+ return;
90
+ self.pushUndo();
91
+ self.value = self.value.slice(0, self.cursor) + text + self.value.slice(self.cursor);
92
+ self.cursor += text.length;
93
+ self.lastAction = "yank";
94
+ }
95
+ export function do_yankPop(self) {
96
+ if (self.lastAction !== "yank" || self.killRing.length <= 1)
97
+ return;
98
+ self.pushUndo();
99
+ // Delete the previously yanked text (still at end of ring before rotation)
100
+ const prevText = self.killRing.peek() || "";
101
+ self.value = self.value.slice(0, self.cursor - prevText.length) + self.value.slice(self.cursor);
102
+ self.cursor -= prevText.length;
103
+ // Rotate and insert new entry
104
+ self.killRing.rotate();
105
+ const text = self.killRing.peek() || "";
106
+ self.value = self.value.slice(0, self.cursor) + text + self.value.slice(self.cursor);
107
+ self.cursor += text.length;
108
+ self.lastAction = "yank";
109
+ }
110
+ export function do_pushUndo(self) {
111
+ self.undoStack.push({ value: self.value, cursor: self.cursor });
112
+ }
113
+ export function do_undo(self) {
114
+ const snapshot = self.undoStack.pop();
115
+ if (!snapshot)
116
+ return;
117
+ self.value = snapshot.value;
118
+ self.cursor = snapshot.cursor;
119
+ self.lastAction = null;
120
+ }
121
+ export function do_moveWordBackwards(self) {
122
+ if (self.cursor === 0)
123
+ return;
124
+ self.lastAction = null;
125
+ self.cursor = findWordBackward(self.value, self.cursor);
126
+ }
127
+ export function do_moveWordForwards(self) {
128
+ if (self.cursor >= self.value.length)
129
+ return;
130
+ self.lastAction = null;
131
+ self.cursor = findWordForward(self.value, self.cursor);
132
+ }
133
+ export function do_handlePaste(self, pastedText) {
134
+ self.lastAction = null;
135
+ self.pushUndo();
136
+ // Clean the pasted text - remove newlines and carriage returns
137
+ const cleanText = pastedText.replace(/\r\n/g, "").replace(/\r/g, "").replace(/\n/g, "").replace(/\t/g, " ");
138
+ // Insert at cursor position
139
+ self.value = self.value.slice(0, self.cursor) + cleanText + self.value.slice(self.cursor);
140
+ self.cursor += cleanText.length;
141
+ }
142
+ export function do_invalidate(_self) {
143
+ // No cached state to invalidate currently
144
+ }
145
+ //# sourceMappingURL=text-editing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-editing.js","sourceRoot":"","sources":["../../../../src/components/input/input-methods/text-editing.ts"],"names":[],"mappings":"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","sourcesContent":["import { isWhitespaceChar } from \"../../../utils.ts\";\nimport { findWordBackward, findWordForward } from \"../../../word-navigation.ts\";\nimport { segmenter } from \"../constants.ts\";\nimport type { Input } from \"../input.ts\";\n\nexport function do_insertCharacter(self: Input, char: string): void {\n // Undo coalescing: consecutive word chars coalesce into one undo unit\n if (isWhitespaceChar(char) || self.lastAction !== \"type-word\") {\n self.pushUndo();\n }\n self.lastAction = \"type-word\";\n\n self.value = self.value.slice(0, self.cursor) + char + self.value.slice(self.cursor);\n self.cursor += char.length;\n}\n\nexport function do_handleBackspace(self: Input): void {\n self.lastAction = null;\n if (self.cursor > 0) {\n self.pushUndo();\n const beforeCursor = self.value.slice(0, self.cursor);\n const graphemes = [...segmenter.segment(beforeCursor)];\n const lastGrapheme = graphemes[graphemes.length - 1];\n const graphemeLength = lastGrapheme ? lastGrapheme.segment.length : 1;\n self.value = self.value.slice(0, self.cursor - graphemeLength) + self.value.slice(self.cursor);\n self.cursor -= graphemeLength;\n }\n}\n\nexport function do_handleForwardDelete(self: Input): void {\n self.lastAction = null;\n if (self.cursor < self.value.length) {\n self.pushUndo();\n const afterCursor = self.value.slice(self.cursor);\n const graphemes = [...segmenter.segment(afterCursor)];\n const firstGrapheme = graphemes[0];\n const graphemeLength = firstGrapheme ? firstGrapheme.segment.length : 1;\n self.value = self.value.slice(0, self.cursor) + self.value.slice(self.cursor + graphemeLength);\n }\n}\n\nexport function do_deleteToLineStart(self: Input): void {\n if (self.cursor === 0) return;\n self.pushUndo();\n const deletedText = self.value.slice(0, self.cursor);\n self.killRing.push(deletedText, { prepend: true, accumulate: self.lastAction === \"kill\" });\n self.lastAction = \"kill\";\n self.value = self.value.slice(self.cursor);\n self.cursor = 0;\n}\n\nexport function do_deleteToLineEnd(self: Input): void {\n if (self.cursor >= self.value.length) return;\n self.pushUndo();\n const deletedText = self.value.slice(self.cursor);\n self.killRing.push(deletedText, { prepend: false, accumulate: self.lastAction === \"kill\" });\n self.lastAction = \"kill\";\n self.value = self.value.slice(0, self.cursor);\n}\n\nexport function do_deleteWordBackwards(self: Input): void {\n if (self.cursor === 0) return;\n\n // Save lastAction before cursor movement (moveWordBackwards resets it)\n const wasKill = self.lastAction === \"kill\";\n\n self.pushUndo();\n\n const oldCursor = self.cursor;\n self.moveWordBackwards();\n const deleteFrom = self.cursor;\n self.cursor = oldCursor;\n\n const deletedText = self.value.slice(deleteFrom, self.cursor);\n self.killRing.push(deletedText, { prepend: true, accumulate: wasKill });\n self.lastAction = \"kill\";\n\n self.value = self.value.slice(0, deleteFrom) + self.value.slice(self.cursor);\n self.cursor = deleteFrom;\n}\n\nexport function do_deleteWordForward(self: Input): void {\n if (self.cursor >= self.value.length) return;\n\n // Save lastAction before cursor movement (moveWordForwards resets it)\n const wasKill = self.lastAction === \"kill\";\n\n self.pushUndo();\n\n const oldCursor = self.cursor;\n self.moveWordForwards();\n const deleteTo = self.cursor;\n self.cursor = oldCursor;\n\n const deletedText = self.value.slice(self.cursor, deleteTo);\n self.killRing.push(deletedText, { prepend: false, accumulate: wasKill });\n self.lastAction = \"kill\";\n\n self.value = self.value.slice(0, self.cursor) + self.value.slice(deleteTo);\n}\n\nexport function do_yank(self: Input): void {\n const text = self.killRing.peek();\n if (!text) return;\n\n self.pushUndo();\n\n self.value = self.value.slice(0, self.cursor) + text + self.value.slice(self.cursor);\n self.cursor += text.length;\n self.lastAction = \"yank\";\n}\n\nexport function do_yankPop(self: Input): void {\n if (self.lastAction !== \"yank\" || self.killRing.length <= 1) return;\n\n self.pushUndo();\n\n // Delete the previously yanked text (still at end of ring before rotation)\n const prevText = self.killRing.peek() || \"\";\n self.value = self.value.slice(0, self.cursor - prevText.length) + self.value.slice(self.cursor);\n self.cursor -= prevText.length;\n\n // Rotate and insert new entry\n self.killRing.rotate();\n const text = self.killRing.peek() || \"\";\n self.value = self.value.slice(0, self.cursor) + text + self.value.slice(self.cursor);\n self.cursor += text.length;\n self.lastAction = \"yank\";\n}\n\nexport function do_pushUndo(self: Input): void {\n self.undoStack.push({ value: self.value, cursor: self.cursor });\n}\n\nexport function do_undo(self: Input): void {\n const snapshot = self.undoStack.pop();\n if (!snapshot) return;\n self.value = snapshot.value;\n self.cursor = snapshot.cursor;\n self.lastAction = null;\n}\n\nexport function do_moveWordBackwards(self: Input): void {\n if (self.cursor === 0) return;\n self.lastAction = null;\n self.cursor = findWordBackward(self.value, self.cursor);\n}\n\nexport function do_moveWordForwards(self: Input): void {\n if (self.cursor >= self.value.length) return;\n self.lastAction = null;\n self.cursor = findWordForward(self.value, self.cursor);\n}\n\nexport function do_handlePaste(self: Input, pastedText: string): void {\n self.lastAction = null;\n self.pushUndo();\n\n // Clean the pasted text - remove newlines and carriage returns\n const cleanText = pastedText.replace(/\\r\\n/g, \"\").replace(/\\r/g, \"\").replace(/\\n/g, \"\").replace(/\\t/g, \" \");\n\n // Insert at cursor position\n self.value = self.value.slice(0, self.cursor) + cleanText + self.value.slice(self.cursor);\n self.cursor += cleanText.length;\n}\n\nexport function do_invalidate(_self: Input): void {\n // No cached state to invalidate currently\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { Input } from "../input.ts";
2
+ export declare function do_getValue(self: Input): string;
3
+ export declare function do_setValue(self: Input, value: string): void;
4
+ //# sourceMappingURL=value-access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-access.d.ts","sourceRoot":"","sources":["../../../../src/components/input/input-methods/value-access.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,wBAAgB,WAAW,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,CAE/C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAc5D","sourcesContent":["import { segmenter } from \"../constants.ts\";\nimport type { Input } from \"../input.ts\";\n\nexport function do_getValue(self: Input): string {\n return self.value;\n}\n\nexport function do_setValue(self: Input, value: string): void {\n self.value = value;\n self.cursor = Math.min(self.cursor, value.length);\n self.scrollOffset = 0;\n if (self.cursor > 0 && self.cursor < value.length) {\n let pos = 0;\n for (const { segment } of segmenter.segment(value)) {\n if (pos + segment.length > self.cursor) {\n self.cursor = pos;\n break;\n }\n pos += segment.length;\n }\n }\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import { segmenter } from "../constants.js";
2
+ export function do_getValue(self) {
3
+ return self.value;
4
+ }
5
+ export function do_setValue(self, value) {
6
+ self.value = value;
7
+ self.cursor = Math.min(self.cursor, value.length);
8
+ self.scrollOffset = 0;
9
+ if (self.cursor > 0 && self.cursor < value.length) {
10
+ let pos = 0;
11
+ for (const { segment } of segmenter.segment(value)) {
12
+ if (pos + segment.length > self.cursor) {
13
+ self.cursor = pos;
14
+ break;
15
+ }
16
+ pos += segment.length;
17
+ }
18
+ }
19
+ }
20
+ //# sourceMappingURL=value-access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-access.js","sourceRoot":"","sources":["../../../../src/components/input/input-methods/value-access.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,UAAU,WAAW,CAAC,IAAW,EAAU;IAC/C,OAAO,IAAI,CAAC,KAAK,CAAC;AAAA,CACnB;AAED,MAAM,UAAU,WAAW,CAAC,IAAW,EAAE,KAAa,EAAQ;IAC5D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACnB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAClD,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IACtB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAClD,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACvC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;gBAClB,MAAM;YACR,CAAC;YACD,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;QACxB,CAAC;IACH,CAAC;AAAA,CACF","sourcesContent":["import { segmenter } from \"../constants.ts\";\nimport type { Input } from \"../input.ts\";\n\nexport function do_getValue(self: Input): string {\n return self.value;\n}\n\nexport function do_setValue(self: Input, value: string): void {\n self.value = value;\n self.cursor = Math.min(self.cursor, value.length);\n self.scrollOffset = 0;\n if (self.cursor > 0 && self.cursor < value.length) {\n let pos = 0;\n for (const { segment } of segmenter.segment(value)) {\n if (pos + segment.length > self.cursor) {\n self.cursor = pos;\n break;\n }\n pos += segment.length;\n }\n }\n}\n"]}
@@ -0,0 +1,37 @@
1
+ import { KillRing } from "../../kill-ring.ts";
2
+ import type { Component, Focusable } from "../../tui.ts";
3
+ import { UndoStack } from "../../undo-stack.ts";
4
+ import type { InputState } from "./types.ts";
5
+ export declare class Input implements Component, Focusable {
6
+ value: string;
7
+ cursor: number;
8
+ scrollOffset: number;
9
+ onSubmit?: (value: string) => void;
10
+ onEscape?: () => void;
11
+ focused: boolean;
12
+ pasteBuffer: string;
13
+ isInPaste: boolean;
14
+ killRing: KillRing;
15
+ lastAction: "kill" | "yank" | "type-word" | null;
16
+ undoStack: UndoStack<InputState>;
17
+ getValue(): string;
18
+ setValue(value: string): void;
19
+ handleInput(data: string): void;
20
+ insertCharacter(char: string): void;
21
+ handleBackspace(): void;
22
+ handleForwardDelete(): void;
23
+ deleteToLineStart(): void;
24
+ deleteToLineEnd(): void;
25
+ deleteWordBackwards(): void;
26
+ deleteWordForward(): void;
27
+ yank(): void;
28
+ yankPop(): void;
29
+ pushUndo(): void;
30
+ undo(): void;
31
+ moveWordBackwards(): void;
32
+ moveWordForwards(): void;
33
+ handlePaste(pastedText: string): void;
34
+ invalidate(): void;
35
+ render(width: number): string[];
36
+ }
37
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../src/components/input/input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAqBhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,qBAAa,KAAM,YAAW,SAAS,EAAE,SAAS;IACzC,KAAK,EAAE,MAAM,CAAM;IAEnB,MAAM,EAAE,MAAM,CAAK;IAEnB,YAAY,EAAE,MAAM,CAAK;IAEzB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAEnC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAE7B,OAAO,EAAE,OAAO,CAAS;IAElB,WAAW,EAAE,MAAM,CAAM;IAEzB,SAAS,EAAE,OAAO,CAAS;IAE3B,QAAQ,WAAkB;IAE1B,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,IAAI,CAAQ;IAExD,SAAS,wBAA+B;IAE/C,QAAQ,IAAI,MAAM,CAEjB;IAED,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE5B;IAED,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE9B;IAED,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAElC;IAED,eAAe,IAAI,IAAI,CAEtB;IAED,mBAAmB,IAAI,IAAI,CAE1B;IAED,iBAAiB,IAAI,IAAI,CAExB;IAED,eAAe,IAAI,IAAI,CAEtB;IAED,mBAAmB,IAAI,IAAI,CAE1B;IAED,iBAAiB,IAAI,IAAI,CAExB;IAED,IAAI,IAAI,IAAI,CAEX;IAED,OAAO,IAAI,IAAI,CAEd;IAED,QAAQ,IAAI,IAAI,CAEf;IAED,IAAI,IAAI,IAAI,CAEX;IAED,iBAAiB,IAAI,IAAI,CAExB;IAED,gBAAgB,IAAI,IAAI,CAEvB;IAED,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAEpC;IAED,UAAU,IAAI,IAAI,CAEjB;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAE9B;CACF","sourcesContent":["import { KillRing } from \"../../kill-ring.ts\";\nimport type { Component, Focusable } from \"../../tui.ts\";\nimport { UndoStack } from \"../../undo-stack.ts\";\nimport { do_handleInput } from \"./input-methods/input-handling.ts\";\nimport { do_render } from \"./input-methods/render.ts\";\nimport {\n do_deleteToLineEnd,\n do_deleteToLineStart,\n do_deleteWordBackwards,\n do_deleteWordForward,\n do_handleBackspace,\n do_handleForwardDelete,\n do_handlePaste,\n do_insertCharacter,\n do_invalidate,\n do_moveWordBackwards,\n do_moveWordForwards,\n do_pushUndo,\n do_undo,\n do_yank,\n do_yankPop,\n} from \"./input-methods/text-editing.ts\";\nimport { do_getValue, do_setValue } from \"./input-methods/value-access.ts\";\nimport type { InputState } from \"./types.ts\";\n\nexport class Input implements Component, Focusable {\n public value: string = \"\";\n\n public cursor: number = 0;\n\n public scrollOffset: number = 0;\n\n public onSubmit?: (value: string) => void;\n\n public onEscape?: () => void;\n\n focused: boolean = false;\n\n public pasteBuffer: string = \"\";\n\n public isInPaste: boolean = false;\n\n public killRing = new KillRing();\n\n public lastAction: \"kill\" | \"yank\" | \"type-word\" | null = null;\n\n public undoStack = new UndoStack<InputState>();\n\n getValue(): string {\n return do_getValue(this);\n }\n\n setValue(value: string): void {\n do_setValue(this, value);\n }\n\n handleInput(data: string): void {\n do_handleInput(this, data);\n }\n\n insertCharacter(char: string): void {\n do_insertCharacter(this, char);\n }\n\n handleBackspace(): void {\n do_handleBackspace(this);\n }\n\n handleForwardDelete(): void {\n do_handleForwardDelete(this);\n }\n\n deleteToLineStart(): void {\n do_deleteToLineStart(this);\n }\n\n deleteToLineEnd(): void {\n do_deleteToLineEnd(this);\n }\n\n deleteWordBackwards(): void {\n do_deleteWordBackwards(this);\n }\n\n deleteWordForward(): void {\n do_deleteWordForward(this);\n }\n\n yank(): void {\n do_yank(this);\n }\n\n yankPop(): void {\n do_yankPop(this);\n }\n\n pushUndo(): void {\n do_pushUndo(this);\n }\n\n undo(): void {\n do_undo(this);\n }\n\n moveWordBackwards(): void {\n do_moveWordBackwards(this);\n }\n\n moveWordForwards(): void {\n do_moveWordForwards(this);\n }\n\n handlePaste(pastedText: string): void {\n do_handlePaste(this, pastedText);\n }\n\n invalidate(): void {\n do_invalidate(this);\n }\n\n render(width: number): string[] {\n return do_render(this, width);\n }\n}\n"]}
@@ -0,0 +1,77 @@
1
+ import { KillRing } from "../../kill-ring.js";
2
+ import { UndoStack } from "../../undo-stack.js";
3
+ import { do_handleInput } from "./input-methods/input-handling.js";
4
+ import { do_render } from "./input-methods/render.js";
5
+ import { do_deleteToLineEnd, do_deleteToLineStart, do_deleteWordBackwards, do_deleteWordForward, do_handleBackspace, do_handleForwardDelete, do_handlePaste, do_insertCharacter, do_invalidate, do_moveWordBackwards, do_moveWordForwards, do_pushUndo, do_undo, do_yank, do_yankPop, } from "./input-methods/text-editing.js";
6
+ import { do_getValue, do_setValue } from "./input-methods/value-access.js";
7
+ export class Input {
8
+ value = "";
9
+ cursor = 0;
10
+ scrollOffset = 0;
11
+ onSubmit;
12
+ onEscape;
13
+ focused = false;
14
+ pasteBuffer = "";
15
+ isInPaste = false;
16
+ killRing = new KillRing();
17
+ lastAction = null;
18
+ undoStack = new UndoStack();
19
+ getValue() {
20
+ return do_getValue(this);
21
+ }
22
+ setValue(value) {
23
+ do_setValue(this, value);
24
+ }
25
+ handleInput(data) {
26
+ do_handleInput(this, data);
27
+ }
28
+ insertCharacter(char) {
29
+ do_insertCharacter(this, char);
30
+ }
31
+ handleBackspace() {
32
+ do_handleBackspace(this);
33
+ }
34
+ handleForwardDelete() {
35
+ do_handleForwardDelete(this);
36
+ }
37
+ deleteToLineStart() {
38
+ do_deleteToLineStart(this);
39
+ }
40
+ deleteToLineEnd() {
41
+ do_deleteToLineEnd(this);
42
+ }
43
+ deleteWordBackwards() {
44
+ do_deleteWordBackwards(this);
45
+ }
46
+ deleteWordForward() {
47
+ do_deleteWordForward(this);
48
+ }
49
+ yank() {
50
+ do_yank(this);
51
+ }
52
+ yankPop() {
53
+ do_yankPop(this);
54
+ }
55
+ pushUndo() {
56
+ do_pushUndo(this);
57
+ }
58
+ undo() {
59
+ do_undo(this);
60
+ }
61
+ moveWordBackwards() {
62
+ do_moveWordBackwards(this);
63
+ }
64
+ moveWordForwards() {
65
+ do_moveWordForwards(this);
66
+ }
67
+ handlePaste(pastedText) {
68
+ do_handlePaste(this, pastedText);
69
+ }
70
+ invalidate() {
71
+ do_invalidate(this);
72
+ }
73
+ render(width) {
74
+ return do_render(this, width);
75
+ }
76
+ }
77
+ //# sourceMappingURL=input.js.map