@deepseek-harness-tui/dsh-tui 0.5.0

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 (638) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +235 -0
  3. package/bin/dsh-tui.js +95 -0
  4. package/cordis.patch.yml +218 -0
  5. package/cordis.yml +185 -0
  6. package/lib/invariant.js +28 -0
  7. package/lib/types/activityPrefs.d.ts +29 -0
  8. package/lib/types/activityPrefs.d.ts.map +1 -0
  9. package/lib/types/activityPrefs.js +60 -0
  10. package/lib/types/bootstrap/state.d.ts +13 -0
  11. package/lib/types/bootstrap/state.d.ts.map +1 -0
  12. package/lib/types/bootstrap/state.js +12 -0
  13. package/lib/types/cc/cliHighlight.d.ts +20 -0
  14. package/lib/types/cc/cliHighlight.d.ts.map +1 -0
  15. package/lib/types/cc/cliHighlight.js +53 -0
  16. package/lib/types/cc/figures.d.ts +59 -0
  17. package/lib/types/cc/figures.d.ts.map +1 -0
  18. package/lib/types/cc/figures.js +69 -0
  19. package/lib/types/cc/format.d.ts +26 -0
  20. package/lib/types/cc/format.d.ts.map +1 -0
  21. package/lib/types/cc/format.js +55 -0
  22. package/lib/types/cc/hash.d.ts +25 -0
  23. package/lib/types/cc/hash.d.ts.map +1 -0
  24. package/lib/types/cc/hash.js +41 -0
  25. package/lib/types/cc/hyperlink.d.ts +21 -0
  26. package/lib/types/cc/hyperlink.d.ts.map +1 -0
  27. package/lib/types/cc/hyperlink.js +31 -0
  28. package/lib/types/cc/markdown.d.ts +43 -0
  29. package/lib/types/cc/markdown.d.ts.map +1 -0
  30. package/lib/types/cc/markdown.js +345 -0
  31. package/lib/types/cc/spinnerVerbs.d.ts +3 -0
  32. package/lib/types/cc/spinnerVerbs.d.ts.map +1 -0
  33. package/lib/types/cc/spinnerVerbs.js +190 -0
  34. package/lib/types/cc/terminal.d.ts +15 -0
  35. package/lib/types/cc/terminal.d.ts.map +1 -0
  36. package/lib/types/cc/terminal.js +84 -0
  37. package/lib/types/channel.d.ts +672 -0
  38. package/lib/types/channel.d.ts.map +1 -0
  39. package/lib/types/channel.js +2427 -0
  40. package/lib/types/childStderr.d.ts +63 -0
  41. package/lib/types/childStderr.d.ts.map +1 -0
  42. package/lib/types/childStderr.js +161 -0
  43. package/lib/types/commands.d.ts +55 -0
  44. package/lib/types/commands.d.ts.map +1 -0
  45. package/lib/types/commands.js +101 -0
  46. package/lib/types/components/ActivityLine.d.ts +29 -0
  47. package/lib/types/components/ActivityLine.d.ts.map +1 -0
  48. package/lib/types/components/ActivityLine.js +47 -0
  49. package/lib/types/components/ActivityPicker.d.ts +13 -0
  50. package/lib/types/components/ActivityPicker.d.ts.map +1 -0
  51. package/lib/types/components/ActivityPicker.js +24 -0
  52. package/lib/types/components/CommandSuggestions.d.ts +14 -0
  53. package/lib/types/components/CommandSuggestions.d.ts.map +1 -0
  54. package/lib/types/components/CommandSuggestions.js +33 -0
  55. package/lib/types/components/FileSuggestions.d.ts +12 -0
  56. package/lib/types/components/FileSuggestions.d.ts.map +1 -0
  57. package/lib/types/components/FileSuggestions.js +26 -0
  58. package/lib/types/components/GoalTodoPanel.d.ts +13 -0
  59. package/lib/types/components/GoalTodoPanel.d.ts.map +1 -0
  60. package/lib/types/components/GoalTodoPanel.js +57 -0
  61. package/lib/types/components/HelpMenu.d.ts +12 -0
  62. package/lib/types/components/HelpMenu.d.ts.map +1 -0
  63. package/lib/types/components/HelpMenu.js +12 -0
  64. package/lib/types/components/HistorySearchDialog.d.ts +16 -0
  65. package/lib/types/components/HistorySearchDialog.d.ts.map +1 -0
  66. package/lib/types/components/HistorySearchDialog.js +31 -0
  67. package/lib/types/components/InterruptedByUser.d.ts +7 -0
  68. package/lib/types/components/InterruptedByUser.d.ts.map +1 -0
  69. package/lib/types/components/InterruptedByUser.js +9 -0
  70. package/lib/types/components/LoadedContextPanel.d.ts +20 -0
  71. package/lib/types/components/LoadedContextPanel.d.ts.map +1 -0
  72. package/lib/types/components/LoadedContextPanel.js +30 -0
  73. package/lib/types/components/LogoV2.d.ts +23 -0
  74. package/lib/types/components/LogoV2.d.ts.map +1 -0
  75. package/lib/types/components/LogoV2.js +95 -0
  76. package/lib/types/components/Markdown.d.ts +24 -0
  77. package/lib/types/components/Markdown.d.ts.map +1 -0
  78. package/lib/types/components/Markdown.js +106 -0
  79. package/lib/types/components/MarkdownTable.d.ts +17 -0
  80. package/lib/types/components/MarkdownTable.d.ts.map +1 -0
  81. package/lib/types/components/MarkdownTable.js +272 -0
  82. package/lib/types/components/MessageList.d.ts +41 -0
  83. package/lib/types/components/MessageList.d.ts.map +1 -0
  84. package/lib/types/components/MessageList.js +303 -0
  85. package/lib/types/components/ModelPicker.d.ts +14 -0
  86. package/lib/types/components/ModelPicker.d.ts.map +1 -0
  87. package/lib/types/components/ModelPicker.js +15 -0
  88. package/lib/types/components/PresetPicker.d.ts +17 -0
  89. package/lib/types/components/PresetPicker.d.ts.map +1 -0
  90. package/lib/types/components/PresetPicker.js +25 -0
  91. package/lib/types/components/PromptInput.d.ts +67 -0
  92. package/lib/types/components/PromptInput.d.ts.map +1 -0
  93. package/lib/types/components/PromptInput.js +778 -0
  94. package/lib/types/components/ResumePicker.d.ts +15 -0
  95. package/lib/types/components/ResumePicker.d.ts.map +1 -0
  96. package/lib/types/components/ResumePicker.js +34 -0
  97. package/lib/types/components/RewindPicker.d.ts +14 -0
  98. package/lib/types/components/RewindPicker.d.ts.map +1 -0
  99. package/lib/types/components/RewindPicker.js +23 -0
  100. package/lib/types/components/SearchBox.d.ts +20 -0
  101. package/lib/types/components/SearchBox.d.ts.map +1 -0
  102. package/lib/types/components/SearchBox.js +33 -0
  103. package/lib/types/components/Select.d.ts +22 -0
  104. package/lib/types/components/Select.d.ts.map +1 -0
  105. package/lib/types/components/Select.js +19 -0
  106. package/lib/types/components/Spinner/GlimmerMessage.d.ts +19 -0
  107. package/lib/types/components/Spinner/GlimmerMessage.d.ts.map +1 -0
  108. package/lib/types/components/Spinner/GlimmerMessage.js +78 -0
  109. package/lib/types/components/Spinner/SpinnerAnimationRow.d.ts +31 -0
  110. package/lib/types/components/Spinner/SpinnerAnimationRow.d.ts.map +1 -0
  111. package/lib/types/components/Spinner/SpinnerAnimationRow.js +162 -0
  112. package/lib/types/components/Spinner/SpinnerGlyph.d.ts +16 -0
  113. package/lib/types/components/Spinner/SpinnerGlyph.d.ts.map +1 -0
  114. package/lib/types/components/Spinner/SpinnerGlyph.js +36 -0
  115. package/lib/types/components/Spinner/spinnerMode.d.ts +6 -0
  116. package/lib/types/components/Spinner/spinnerMode.d.ts.map +1 -0
  117. package/lib/types/components/Spinner/spinnerMode.js +1 -0
  118. package/lib/types/components/Spinner/spinnerUtils.d.ts +41 -0
  119. package/lib/types/components/Spinner/spinnerUtils.d.ts.map +1 -0
  120. package/lib/types/components/Spinner/spinnerUtils.js +104 -0
  121. package/lib/types/components/Spinner/useStalledAnimation.d.ts +16 -0
  122. package/lib/types/components/Spinner/useStalledAnimation.d.ts.map +1 -0
  123. package/lib/types/components/Spinner/useStalledAnimation.js +71 -0
  124. package/lib/types/components/StreamingMarkdown.d.ts +12 -0
  125. package/lib/types/components/StreamingMarkdown.d.ts.map +1 -0
  126. package/lib/types/components/StreamingMarkdown.js +39 -0
  127. package/lib/types/components/ThemePicker.d.ts +22 -0
  128. package/lib/types/components/ThemePicker.d.ts.map +1 -0
  129. package/lib/types/components/ThemePicker.js +51 -0
  130. package/lib/types/components/ThinkingToggle.d.ts +17 -0
  131. package/lib/types/components/ThinkingToggle.d.ts.map +1 -0
  132. package/lib/types/components/ThinkingToggle.js +30 -0
  133. package/lib/types/components/ToolUseLoader.d.ts +13 -0
  134. package/lib/types/components/ToolUseLoader.d.ts.map +1 -0
  135. package/lib/types/components/ToolUseLoader.js +17 -0
  136. package/lib/types/components/Whale.d.ts +22 -0
  137. package/lib/types/components/Whale.d.ts.map +1 -0
  138. package/lib/types/components/Whale.js +78 -0
  139. package/lib/types/components/WorkingSpinner.d.ts +26 -0
  140. package/lib/types/components/WorkingSpinner.d.ts.map +1 -0
  141. package/lib/types/components/WorkingSpinner.js +68 -0
  142. package/lib/types/components/activityFrames.d.ts +31 -0
  143. package/lib/types/components/activityFrames.d.ts.map +1 -0
  144. package/lib/types/components/activityFrames.js +83 -0
  145. package/lib/types/components/bigfont.d.ts +28 -0
  146. package/lib/types/components/bigfont.d.ts.map +1 -0
  147. package/lib/types/components/bigfont.js +91 -0
  148. package/lib/types/components/design-system/Byline.d.ts +14 -0
  149. package/lib/types/components/design-system/Byline.d.ts.map +1 -0
  150. package/lib/types/components/design-system/Byline.js +17 -0
  151. package/lib/types/components/design-system/Divider.d.ts +40 -0
  152. package/lib/types/components/design-system/Divider.d.ts.map +1 -0
  153. package/lib/types/components/design-system/Divider.js +24 -0
  154. package/lib/types/components/design-system/KeyboardShortcutHint.d.ts +19 -0
  155. package/lib/types/components/design-system/KeyboardShortcutHint.d.ts.map +1 -0
  156. package/lib/types/components/design-system/KeyboardShortcutHint.js +14 -0
  157. package/lib/types/components/design-system/ListItem.d.ts +36 -0
  158. package/lib/types/components/design-system/ListItem.d.ts.map +1 -0
  159. package/lib/types/components/design-system/ListItem.js +48 -0
  160. package/lib/types/components/design-system/LoadingState.d.ts +19 -0
  161. package/lib/types/components/design-system/LoadingState.d.ts.map +1 -0
  162. package/lib/types/components/design-system/LoadingState.js +22 -0
  163. package/lib/types/components/design-system/Pane.d.ts +17 -0
  164. package/lib/types/components/design-system/Pane.d.ts.map +1 -0
  165. package/lib/types/components/design-system/Pane.js +15 -0
  166. package/lib/types/components/design-system/ProgressBar.d.ts +22 -0
  167. package/lib/types/components/design-system/ProgressBar.d.ts.map +1 -0
  168. package/lib/types/components/design-system/ProgressBar.js +27 -0
  169. package/lib/types/components/design-system/StatusIcon.d.ts +15 -0
  170. package/lib/types/components/design-system/StatusIcon.d.ts.map +1 -0
  171. package/lib/types/components/design-system/StatusIcon.js +20 -0
  172. package/lib/types/components/design-system/ThemeProvider.d.ts +11 -0
  173. package/lib/types/components/design-system/ThemeProvider.d.ts.map +1 -0
  174. package/lib/types/components/design-system/ThemeProvider.js +135 -0
  175. package/lib/types/components/design-system/ThemedBox.d.ts +37 -0
  176. package/lib/types/components/design-system/ThemedBox.d.ts.map +1 -0
  177. package/lib/types/components/design-system/ThemedBox.js +26 -0
  178. package/lib/types/components/design-system/ThemedText.d.ts +56 -0
  179. package/lib/types/components/design-system/ThemedText.d.ts.map +1 -0
  180. package/lib/types/components/design-system/ThemedText.js +45 -0
  181. package/lib/types/components/messages/AssistantTextMessage.d.ts +18 -0
  182. package/lib/types/components/messages/AssistantTextMessage.d.ts.map +1 -0
  183. package/lib/types/components/messages/AssistantTextMessage.js +15 -0
  184. package/lib/types/components/messages/AssistantThinkingMessage.d.ts +23 -0
  185. package/lib/types/components/messages/AssistantThinkingMessage.d.ts.map +1 -0
  186. package/lib/types/components/messages/AssistantThinkingMessage.js +23 -0
  187. package/lib/types/components/messages/AssistantToolUseMessage.d.ts +23 -0
  188. package/lib/types/components/messages/AssistantToolUseMessage.d.ts.map +1 -0
  189. package/lib/types/components/messages/AssistantToolUseMessage.js +220 -0
  190. package/lib/types/components/messages/MessageMetadata.d.ts +15 -0
  191. package/lib/types/components/messages/MessageMetadata.d.ts.map +1 -0
  192. package/lib/types/components/messages/MessageMetadata.js +20 -0
  193. package/lib/types/components/messages/UserPromptMessage.d.ts +19 -0
  194. package/lib/types/components/messages/UserPromptMessage.d.ts.map +1 -0
  195. package/lib/types/components/messages/UserPromptMessage.js +15 -0
  196. package/lib/types/components/questions/AskUserQuestionPanel.d.ts +39 -0
  197. package/lib/types/components/questions/AskUserQuestionPanel.d.ts.map +1 -0
  198. package/lib/types/components/questions/AskUserQuestionPanel.js +228 -0
  199. package/lib/types/components/shimmer.d.ts +35 -0
  200. package/lib/types/components/shimmer.d.ts.map +1 -0
  201. package/lib/types/components/shimmer.js +43 -0
  202. package/lib/types/components/whaleFrames.d.ts +25 -0
  203. package/lib/types/components/whaleFrames.d.ts.map +1 -0
  204. package/lib/types/components/whaleFrames.js +419 -0
  205. package/lib/types/customTheme.d.ts +104 -0
  206. package/lib/types/customTheme.d.ts.map +1 -0
  207. package/lib/types/customTheme.js +268 -0
  208. package/lib/types/effortPrefs.d.ts +22 -0
  209. package/lib/types/effortPrefs.d.ts.map +1 -0
  210. package/lib/types/effortPrefs.js +45 -0
  211. package/lib/types/history.d.ts +24 -0
  212. package/lib/types/history.d.ts.map +1 -0
  213. package/lib/types/history.js +75 -0
  214. package/lib/types/hooks/useBlink.d.ts +11 -0
  215. package/lib/types/hooks/useBlink.d.ts.map +1 -0
  216. package/lib/types/hooks/useBlink.js +20 -0
  217. package/lib/types/i18n.d.ts +926 -0
  218. package/lib/types/i18n.d.ts.map +1 -0
  219. package/lib/types/i18n.js +356 -0
  220. package/lib/types/index.d.ts +70 -0
  221. package/lib/types/index.d.ts.map +1 -0
  222. package/lib/types/index.js +31 -0
  223. package/lib/types/ink/Ansi.d.ts +11 -0
  224. package/lib/types/ink/Ansi.d.ts.map +1 -0
  225. package/lib/types/ink/Ansi.js +269 -0
  226. package/lib/types/ink/bidi.d.ts +18 -0
  227. package/lib/types/ink/bidi.d.ts.map +1 -0
  228. package/lib/types/ink/bidi.js +119 -0
  229. package/lib/types/ink/clearTerminal.d.ts +22 -0
  230. package/lib/types/ink/clearTerminal.d.ts.map +1 -0
  231. package/lib/types/ink/clearTerminal.js +72 -0
  232. package/lib/types/ink/colorize.d.ts +33 -0
  233. package/lib/types/ink/colorize.d.ts.map +1 -0
  234. package/lib/types/ink/colorize.js +213 -0
  235. package/lib/types/ink/components/AlternateScreen.d.ts +22 -0
  236. package/lib/types/ink/components/AlternateScreen.d.ts.map +1 -0
  237. package/lib/types/ink/components/AlternateScreen.js +74 -0
  238. package/lib/types/ink/components/App.d.ts +73 -0
  239. package/lib/types/ink/components/App.d.ts.map +1 -0
  240. package/lib/types/ink/components/App.js +597 -0
  241. package/lib/types/ink/components/AppContext.d.ts +15 -0
  242. package/lib/types/ink/components/AppContext.d.ts.map +1 -0
  243. package/lib/types/ink/components/AppContext.js +11 -0
  244. package/lib/types/ink/components/Box.d.ts +49 -0
  245. package/lib/types/ink/components/Box.d.ts.map +1 -0
  246. package/lib/types/ink/components/Box.js +153 -0
  247. package/lib/types/ink/components/Button.d.ts +37 -0
  248. package/lib/types/ink/components/Button.d.ts.map +1 -0
  249. package/lib/types/ink/components/Button.js +166 -0
  250. package/lib/types/ink/components/ClockContext.d.ts +10 -0
  251. package/lib/types/ink/components/ClockContext.d.ts.map +1 -0
  252. package/lib/types/ink/components/ClockContext.js +108 -0
  253. package/lib/types/ink/components/CursorDeclarationContext.d.ts +30 -0
  254. package/lib/types/ink/components/CursorDeclarationContext.d.ts.map +1 -0
  255. package/lib/types/ink/components/CursorDeclarationContext.js +6 -0
  256. package/lib/types/ink/components/ErrorOverview.d.ts +7 -0
  257. package/lib/types/ink/components/ErrorOverview.d.ts.map +1 -0
  258. package/lib/types/ink/components/ErrorOverview.js +49 -0
  259. package/lib/types/ink/components/Link.d.ts +8 -0
  260. package/lib/types/ink/components/Link.d.ts.map +1 -0
  261. package/lib/types/ink/components/Link.js +33 -0
  262. package/lib/types/ink/components/Newline.d.ts +13 -0
  263. package/lib/types/ink/components/Newline.d.ts.map +1 -0
  264. package/lib/types/ink/components/Newline.js +29 -0
  265. package/lib/types/ink/components/NoSelect.d.ts +20 -0
  266. package/lib/types/ink/components/NoSelect.d.ts.map +1 -0
  267. package/lib/types/ink/components/NoSelect.js +56 -0
  268. package/lib/types/ink/components/RawAnsi.d.ts +17 -0
  269. package/lib/types/ink/components/RawAnsi.d.ts.map +1 -0
  270. package/lib/types/ink/components/RawAnsi.js +45 -0
  271. package/lib/types/ink/components/ScrollBox.d.ts +78 -0
  272. package/lib/types/ink/components/ScrollBox.d.ts.map +1 -0
  273. package/lib/types/ink/components/ScrollBox.js +174 -0
  274. package/lib/types/ink/components/Spacer.d.ts +6 -0
  275. package/lib/types/ink/components/Spacer.d.ts.map +1 -0
  276. package/lib/types/ink/components/Spacer.js +19 -0
  277. package/lib/types/ink/components/StdinContext.d.ts +32 -0
  278. package/lib/types/ink/components/StdinContext.d.ts.map +1 -0
  279. package/lib/types/ink/components/StdinContext.js +16 -0
  280. package/lib/types/ink/components/TerminalFocusContext.d.ts +11 -0
  281. package/lib/types/ink/components/TerminalFocusContext.d.ts.map +1 -0
  282. package/lib/types/ink/components/TerminalFocusContext.js +45 -0
  283. package/lib/types/ink/components/TerminalSizeContext.d.ts +6 -0
  284. package/lib/types/ink/components/TerminalSizeContext.d.ts.map +1 -0
  285. package/lib/types/ink/components/TerminalSizeContext.js +3 -0
  286. package/lib/types/ink/components/Text.d.ts +56 -0
  287. package/lib/types/ink/components/Text.d.ts.map +1 -0
  288. package/lib/types/ink/components/Text.js +194 -0
  289. package/lib/types/ink/constants.d.ts +3 -0
  290. package/lib/types/ink/constants.d.ts.map +1 -0
  291. package/lib/types/ink/constants.js +2 -0
  292. package/lib/types/ink/cursor.d.ts +11 -0
  293. package/lib/types/ink/cursor.d.ts.map +1 -0
  294. package/lib/types/ink/cursor.js +1 -0
  295. package/lib/types/ink/devtools.d.ts +7 -0
  296. package/lib/types/ink/devtools.d.ts.map +1 -0
  297. package/lib/types/ink/devtools.js +1 -0
  298. package/lib/types/ink/dom.d.ts +178 -0
  299. package/lib/types/ink/dom.d.ts.map +1 -0
  300. package/lib/types/ink/dom.js +424 -0
  301. package/lib/types/ink/events/click-event.d.ts +32 -0
  302. package/lib/types/ink/events/click-event.d.ts.map +1 -0
  303. package/lib/types/ink/events/click-event.js +36 -0
  304. package/lib/types/ink/events/dispatcher.d.ts +63 -0
  305. package/lib/types/ink/events/dispatcher.d.ts.map +1 -0
  306. package/lib/types/ink/events/dispatcher.js +194 -0
  307. package/lib/types/ink/events/emitter.d.ts +20 -0
  308. package/lib/types/ink/events/emitter.d.ts.map +1 -0
  309. package/lib/types/ink/events/emitter.js +43 -0
  310. package/lib/types/ink/events/event-handlers.d.ts +47 -0
  311. package/lib/types/ink/events/event-handlers.d.ts.map +1 -0
  312. package/lib/types/ink/events/event-handlers.js +30 -0
  313. package/lib/types/ink/events/event.d.ts +19 -0
  314. package/lib/types/ink/events/event.d.ts.map +1 -0
  315. package/lib/types/ink/events/event.js +22 -0
  316. package/lib/types/ink/events/focus-event.d.ts +19 -0
  317. package/lib/types/ink/events/focus-event.d.ts.map +1 -0
  318. package/lib/types/ink/events/focus-event.js +21 -0
  319. package/lib/types/ink/events/input-event.d.ts +53 -0
  320. package/lib/types/ink/events/input-event.d.ts.map +1 -0
  321. package/lib/types/ink/events/input-event.js +180 -0
  322. package/lib/types/ink/events/keyboard-event.d.ts +40 -0
  323. package/lib/types/ink/events/keyboard-event.d.ts.map +1 -0
  324. package/lib/types/ink/events/keyboard-event.js +65 -0
  325. package/lib/types/ink/events/paste-event.d.ts +11 -0
  326. package/lib/types/ink/events/paste-event.d.ts.map +1 -0
  327. package/lib/types/ink/events/paste-event.js +13 -0
  328. package/lib/types/ink/events/resize-event.d.ts +13 -0
  329. package/lib/types/ink/events/resize-event.d.ts.map +1 -0
  330. package/lib/types/ink/events/resize-event.js +16 -0
  331. package/lib/types/ink/events/terminal-event.d.ts +112 -0
  332. package/lib/types/ink/events/terminal-event.d.ts.map +1 -0
  333. package/lib/types/ink/events/terminal-event.js +131 -0
  334. package/lib/types/ink/events/terminal-focus-event.d.ts +21 -0
  335. package/lib/types/ink/events/terminal-focus-event.d.ts.map +1 -0
  336. package/lib/types/ink/events/terminal-focus-event.js +18 -0
  337. package/lib/types/ink/focus.d.ts +74 -0
  338. package/lib/types/ink/focus.d.ts.map +1 -0
  339. package/lib/types/ink/focus.js +188 -0
  340. package/lib/types/ink/frame.d.ts +119 -0
  341. package/lib/types/ink/frame.d.ts.map +1 -0
  342. package/lib/types/ink/frame.js +43 -0
  343. package/lib/types/ink/get-max-width.d.ts +20 -0
  344. package/lib/types/ink/get-max-width.d.ts.map +1 -0
  345. package/lib/types/ink/get-max-width.js +25 -0
  346. package/lib/types/ink/hit-test.d.ts +47 -0
  347. package/lib/types/ink/hit-test.d.ts.map +1 -0
  348. package/lib/types/ink/hit-test.js +126 -0
  349. package/lib/types/ink/hooks/use-animation-frame.d.ts +27 -0
  350. package/lib/types/ink/hooks/use-animation-frame.d.ts.map +1 -0
  351. package/lib/types/ink/hooks/use-animation-frame.js +48 -0
  352. package/lib/types/ink/hooks/use-app.d.ts +8 -0
  353. package/lib/types/ink/hooks/use-app.d.ts.map +1 -0
  354. package/lib/types/ink/hooks/use-app.js +8 -0
  355. package/lib/types/ink/hooks/use-copy-on-select.d.ts +22 -0
  356. package/lib/types/ink/hooks/use-copy-on-select.d.ts.map +1 -0
  357. package/lib/types/ink/hooks/use-copy-on-select.js +40 -0
  358. package/lib/types/ink/hooks/use-declared-cursor.d.ts +31 -0
  359. package/lib/types/ink/hooks/use-declared-cursor.d.ts.map +1 -0
  360. package/lib/types/ink/hooks/use-declared-cursor.js +65 -0
  361. package/lib/types/ink/hooks/use-input.d.ts +41 -0
  362. package/lib/types/ink/hooks/use-input.d.ts.map +1 -0
  363. package/lib/types/ink/hooks/use-input.js +73 -0
  364. package/lib/types/ink/hooks/use-interval.d.ts +23 -0
  365. package/lib/types/ink/hooks/use-interval.d.ts.map +1 -0
  366. package/lib/types/ink/hooks/use-interval.js +58 -0
  367. package/lib/types/ink/hooks/use-search-highlight.d.ts +34 -0
  368. package/lib/types/ink/hooks/use-search-highlight.d.ts.map +1 -0
  369. package/lib/types/ink/hooks/use-search-highlight.js +35 -0
  370. package/lib/types/ink/hooks/use-selection.d.ts +44 -0
  371. package/lib/types/ink/hooks/use-selection.d.ts.map +1 -0
  372. package/lib/types/ink/hooks/use-selection.js +64 -0
  373. package/lib/types/ink/hooks/use-stdin.d.ts +8 -0
  374. package/lib/types/ink/hooks/use-stdin.d.ts.map +1 -0
  375. package/lib/types/ink/hooks/use-stdin.js +8 -0
  376. package/lib/types/ink/hooks/use-tab-status.d.ts +18 -0
  377. package/lib/types/ink/hooks/use-tab-status.d.ts.map +1 -0
  378. package/lib/types/ink/hooks/use-tab-status.js +58 -0
  379. package/lib/types/ink/hooks/use-terminal-focus.d.ts +11 -0
  380. package/lib/types/ink/hooks/use-terminal-focus.d.ts.map +1 -0
  381. package/lib/types/ink/hooks/use-terminal-focus.js +15 -0
  382. package/lib/types/ink/hooks/use-terminal-size.d.ts +6 -0
  383. package/lib/types/ink/hooks/use-terminal-size.d.ts.map +1 -0
  384. package/lib/types/ink/hooks/use-terminal-size.js +12 -0
  385. package/lib/types/ink/hooks/use-terminal-title.d.ts +14 -0
  386. package/lib/types/ink/hooks/use-terminal-title.d.ts.map +1 -0
  387. package/lib/types/ink/hooks/use-terminal-title.js +30 -0
  388. package/lib/types/ink/hooks/use-terminal-viewport.d.ts +32 -0
  389. package/lib/types/ink/hooks/use-terminal-viewport.d.ts.map +1 -0
  390. package/lib/types/ink/hooks/use-terminal-viewport.js +79 -0
  391. package/lib/types/ink/ink.d.ts +370 -0
  392. package/lib/types/ink/ink.d.ts.map +1 -0
  393. package/lib/types/ink/ink.js +1665 -0
  394. package/lib/types/ink/instances.d.ts +10 -0
  395. package/lib/types/ink/instances.d.ts.map +1 -0
  396. package/lib/types/ink/instances.js +13 -0
  397. package/lib/types/ink/layout/engine.d.ts +7 -0
  398. package/lib/types/ink/layout/engine.d.ts.map +1 -0
  399. package/lib/types/ink/layout/engine.js +8 -0
  400. package/lib/types/ink/layout/geometry.d.ts +86 -0
  401. package/lib/types/ink/layout/geometry.d.ts.map +1 -0
  402. package/lib/types/ink/layout/geometry.js +95 -0
  403. package/lib/types/ink/layout/node.d.ts +151 -0
  404. package/lib/types/ink/layout/node.d.ts.map +1 -0
  405. package/lib/types/ink/layout/node.js +72 -0
  406. package/lib/types/ink/layout/yoga.d.ts +69 -0
  407. package/lib/types/ink/layout/yoga.d.ts.map +1 -0
  408. package/lib/types/ink/layout/yoga.js +249 -0
  409. package/lib/types/ink/line-width-cache.d.ts +9 -0
  410. package/lib/types/ink/line-width-cache.d.ts.map +1 -0
  411. package/lib/types/ink/line-width-cache.js +45 -0
  412. package/lib/types/ink/log-update.d.ts +57 -0
  413. package/lib/types/ink/log-update.d.ts.map +1 -0
  414. package/lib/types/ink/log-update.js +710 -0
  415. package/lib/types/ink/measure-element.d.ts +19 -0
  416. package/lib/types/ink/measure-element.d.ts.map +1 -0
  417. package/lib/types/ink/measure-element.js +10 -0
  418. package/lib/types/ink/measure-text.d.ts +13 -0
  419. package/lib/types/ink/measure-text.d.ts.map +1 -0
  420. package/lib/types/ink/measure-text.js +38 -0
  421. package/lib/types/ink/node-cache.d.ts +33 -0
  422. package/lib/types/ink/node-cache.d.ts.map +1 -0
  423. package/lib/types/ink/node-cache.js +42 -0
  424. package/lib/types/ink/optimizer.d.ts +18 -0
  425. package/lib/types/ink/optimizer.d.ts.map +1 -0
  426. package/lib/types/ink/optimizer.js +83 -0
  427. package/lib/types/ink/output.d.ts +200 -0
  428. package/lib/types/ink/output.d.ts.map +1 -0
  429. package/lib/types/ink/output.js +663 -0
  430. package/lib/types/ink/parse-keypress.d.ts +132 -0
  431. package/lib/types/ink/parse-keypress.d.ts.map +1 -0
  432. package/lib/types/ink/parse-keypress.js +707 -0
  433. package/lib/types/ink/reconciler.d.ts +43 -0
  434. package/lib/types/ink/reconciler.d.ts.map +1 -0
  435. package/lib/types/ink/reconciler.js +413 -0
  436. package/lib/types/ink/render-border.d.ts +36 -0
  437. package/lib/types/ink/render-border.d.ts.map +1 -0
  438. package/lib/types/ink/render-border.js +143 -0
  439. package/lib/types/ink/render-node-to-output.d.ts +93 -0
  440. package/lib/types/ink/render-node-to-output.d.ts.map +1 -0
  441. package/lib/types/ink/render-node-to-output.js +1290 -0
  442. package/lib/types/ink/render-to-screen.d.ts +65 -0
  443. package/lib/types/ink/render-to-screen.d.ts.map +1 -0
  444. package/lib/types/ink/render-to-screen.js +189 -0
  445. package/lib/types/ink/renderer.d.ts +24 -0
  446. package/lib/types/ink/renderer.d.ts.map +1 -0
  447. package/lib/types/ink/renderer.js +136 -0
  448. package/lib/types/ink/root.d.ts +91 -0
  449. package/lib/types/ink/root.d.ts.map +1 -0
  450. package/lib/types/ink/root.js +93 -0
  451. package/lib/types/ink/screen.d.ts +443 -0
  452. package/lib/types/ink/screen.d.ts.map +1 -0
  453. package/lib/types/ink/screen.js +1295 -0
  454. package/lib/types/ink/searchHighlight.d.ts +25 -0
  455. package/lib/types/ink/searchHighlight.d.ts.map +1 -0
  456. package/lib/types/ink/searchHighlight.js +82 -0
  457. package/lib/types/ink/selection.d.ts +323 -0
  458. package/lib/types/ink/selection.d.ts.map +1 -0
  459. package/lib/types/ink/selection.js +881 -0
  460. package/lib/types/ink/squash-text-nodes.d.ts +30 -0
  461. package/lib/types/ink/squash-text-nodes.d.ts.map +1 -0
  462. package/lib/types/ink/squash-text-nodes.js +63 -0
  463. package/lib/types/ink/stringWidth.d.ts +11 -0
  464. package/lib/types/ink/stringWidth.d.ts.map +1 -0
  465. package/lib/types/ink/stringWidth.js +209 -0
  466. package/lib/types/ink/styles.d.ts +324 -0
  467. package/lib/types/ink/styles.d.ts.map +1 -0
  468. package/lib/types/ink/styles.js +307 -0
  469. package/lib/types/ink/supports-hyperlinks.d.ts +20 -0
  470. package/lib/types/ink/supports-hyperlinks.d.ts.map +1 -0
  471. package/lib/types/ink/supports-hyperlinks.js +44 -0
  472. package/lib/types/ink/tabstops.d.ts +9 -0
  473. package/lib/types/ink/tabstops.d.ts.map +1 -0
  474. package/lib/types/ink/tabstops.js +46 -0
  475. package/lib/types/ink/terminal-focus-state.d.ts +35 -0
  476. package/lib/types/ink/terminal-focus-state.d.ts.map +1 -0
  477. package/lib/types/ink/terminal-focus-state.js +57 -0
  478. package/lib/types/ink/terminal-querier.d.ts +161 -0
  479. package/lib/types/ink/terminal-querier.d.ts.map +1 -0
  480. package/lib/types/ink/terminal-querier.js +204 -0
  481. package/lib/types/ink/terminal.d.ts +80 -0
  482. package/lib/types/ink/terminal.d.ts.map +1 -0
  483. package/lib/types/ink/terminal.js +268 -0
  484. package/lib/types/ink/termio/ansi.d.ts +75 -0
  485. package/lib/types/ink/termio/ansi.d.ts.map +1 -0
  486. package/lib/types/ink/termio/ansi.js +79 -0
  487. package/lib/types/ink/termio/csi.d.ts +253 -0
  488. package/lib/types/ink/termio/csi.d.ts.map +1 -0
  489. package/lib/types/ink/termio/csi.js +347 -0
  490. package/lib/types/ink/termio/dec.d.ts +61 -0
  491. package/lib/types/ink/termio/dec.d.ts.map +1 -0
  492. package/lib/types/ink/termio/dec.js +76 -0
  493. package/lib/types/ink/termio/esc.d.ts +15 -0
  494. package/lib/types/ink/termio/esc.d.ts.map +1 -0
  495. package/lib/types/ink/termio/esc.js +57 -0
  496. package/lib/types/ink/termio/osc.d.ts +208 -0
  497. package/lib/types/ink/termio/osc.d.ts.map +1 -0
  498. package/lib/types/ink/termio/osc.js +466 -0
  499. package/lib/types/ink/termio/parser.d.ts +46 -0
  500. package/lib/types/ink/termio/parser.d.ts.map +1 -0
  501. package/lib/types/ink/termio/parser.js +366 -0
  502. package/lib/types/ink/termio/sgr.d.ts +17 -0
  503. package/lib/types/ink/termio/sgr.d.ts.map +1 -0
  504. package/lib/types/ink/termio/sgr.js +300 -0
  505. package/lib/types/ink/termio/tokenize.d.ts +50 -0
  506. package/lib/types/ink/termio/tokenize.d.ts.map +1 -0
  507. package/lib/types/ink/termio/tokenize.js +266 -0
  508. package/lib/types/ink/termio/types.d.ts +211 -0
  509. package/lib/types/ink/termio/types.d.ts.map +1 -0
  510. package/lib/types/ink/termio/types.js +68 -0
  511. package/lib/types/ink/termio.d.ts +25 -0
  512. package/lib/types/ink/termio.d.ts.map +1 -0
  513. package/lib/types/ink/termio.js +24 -0
  514. package/lib/types/ink/truncateToWidth.d.ts +7 -0
  515. package/lib/types/ink/truncateToWidth.d.ts.map +1 -0
  516. package/lib/types/ink/truncateToWidth.js +18 -0
  517. package/lib/types/ink/useTerminalNotification.d.ts +45 -0
  518. package/lib/types/ink/useTerminalNotification.d.ts.map +1 -0
  519. package/lib/types/ink/useTerminalNotification.js +70 -0
  520. package/lib/types/ink/warn.d.ts +7 -0
  521. package/lib/types/ink/warn.d.ts.map +1 -0
  522. package/lib/types/ink/warn.js +15 -0
  523. package/lib/types/ink/widest-line.d.ts +7 -0
  524. package/lib/types/ink/widest-line.d.ts.map +1 -0
  525. package/lib/types/ink/widest-line.js +19 -0
  526. package/lib/types/ink/wrap-text.d.ts +10 -0
  527. package/lib/types/ink/wrap-text.d.ts.map +1 -0
  528. package/lib/types/ink/wrap-text.js +61 -0
  529. package/lib/types/ink/wrapAnsi.d.ts +18 -0
  530. package/lib/types/ink/wrapAnsi.d.ts.map +1 -0
  531. package/lib/types/ink/wrapAnsi.js +16 -0
  532. package/lib/types/invariant.d.ts +20 -0
  533. package/lib/types/invariant.d.ts.map +1 -0
  534. package/lib/types/invariant.js +26 -0
  535. package/lib/types/modelPrefs.d.ts +37 -0
  536. package/lib/types/modelPrefs.d.ts.map +1 -0
  537. package/lib/types/modelPrefs.js +66 -0
  538. package/lib/types/modelRoute.d.ts +79 -0
  539. package/lib/types/modelRoute.d.ts.map +1 -0
  540. package/lib/types/modelRoute.js +96 -0
  541. package/lib/types/native-ts/yoga-layout/enums.d.ts +183 -0
  542. package/lib/types/native-ts/yoga-layout/enums.d.ts.map +1 -0
  543. package/lib/types/native-ts/yoga-layout/enums.js +150 -0
  544. package/lib/types/native-ts/yoga-layout/index.d.ts +788 -0
  545. package/lib/types/native-ts/yoga-layout/index.d.ts.map +1 -0
  546. package/lib/types/native-ts/yoga-layout/index.js +2571 -0
  547. package/lib/types/packaged-skills.d.ts +10 -0
  548. package/lib/types/packaged-skills.d.ts.map +1 -0
  549. package/lib/types/packaged-skills.js +63 -0
  550. package/lib/types/plugin.d.ts +33 -0
  551. package/lib/types/plugin.d.ts.map +1 -0
  552. package/lib/types/plugin.js +454 -0
  553. package/lib/types/presetPrefs.d.ts +29 -0
  554. package/lib/types/presetPrefs.d.ts.map +1 -0
  555. package/lib/types/presetPrefs.js +61 -0
  556. package/lib/types/presets.d.ts +110 -0
  557. package/lib/types/presets.d.ts.map +1 -0
  558. package/lib/types/presets.js +114 -0
  559. package/lib/types/questions.d.ts +97 -0
  560. package/lib/types/questions.d.ts.map +1 -0
  561. package/lib/types/questions.js +201 -0
  562. package/lib/types/screens/Chat.d.ts +23 -0
  563. package/lib/types/screens/Chat.d.ts.map +1 -0
  564. package/lib/types/screens/Chat.js +1263 -0
  565. package/lib/types/screens/StatusLine.d.ts +16 -0
  566. package/lib/types/screens/StatusLine.d.ts.map +1 -0
  567. package/lib/types/screens/StatusLine.js +105 -0
  568. package/lib/types/screens/StatusMetrics.d.ts +87 -0
  569. package/lib/types/screens/StatusMetrics.d.ts.map +1 -0
  570. package/lib/types/screens/StatusMetrics.js +252 -0
  571. package/lib/types/sessionHistory.d.ts +32 -0
  572. package/lib/types/sessionHistory.d.ts.map +1 -0
  573. package/lib/types/sessionHistory.js +87 -0
  574. package/lib/types/theme.d.ts +115 -0
  575. package/lib/types/theme.d.ts.map +1 -0
  576. package/lib/types/theme.js +300 -0
  577. package/lib/types/themePrefs.d.ts +28 -0
  578. package/lib/types/themePrefs.d.ts.map +1 -0
  579. package/lib/types/themePrefs.js +59 -0
  580. package/lib/types/ui.d.ts +28 -0
  581. package/lib/types/ui.d.ts.map +1 -0
  582. package/lib/types/ui.js +25 -0
  583. package/lib/types/update.d.ts +76 -0
  584. package/lib/types/update.d.ts.map +1 -0
  585. package/lib/types/update.js +203 -0
  586. package/lib/types/utils/clipboard.d.ts +43 -0
  587. package/lib/types/utils/clipboard.d.ts.map +1 -0
  588. package/lib/types/utils/clipboard.js +82 -0
  589. package/lib/types/utils/debug.d.ts +8 -0
  590. package/lib/types/utils/debug.d.ts.map +1 -0
  591. package/lib/types/utils/debug.js +12 -0
  592. package/lib/types/utils/earlyInput.d.ts +7 -0
  593. package/lib/types/utils/earlyInput.d.ts.map +1 -0
  594. package/lib/types/utils/earlyInput.js +6 -0
  595. package/lib/types/utils/env.d.ts +10 -0
  596. package/lib/types/utils/env.d.ts.map +1 -0
  597. package/lib/types/utils/env.js +9 -0
  598. package/lib/types/utils/envUtils.d.ts +8 -0
  599. package/lib/types/utils/envUtils.d.ts.map +1 -0
  600. package/lib/types/utils/envUtils.js +13 -0
  601. package/lib/types/utils/execFileNoThrow.d.ts +34 -0
  602. package/lib/types/utils/execFileNoThrow.d.ts.map +1 -0
  603. package/lib/types/utils/execFileNoThrow.js +31 -0
  604. package/lib/types/utils/fullscreen.d.ts +8 -0
  605. package/lib/types/utils/fullscreen.d.ts.map +1 -0
  606. package/lib/types/utils/fullscreen.js +10 -0
  607. package/lib/types/utils/intl.d.ts +7 -0
  608. package/lib/types/utils/intl.d.ts.map +1 -0
  609. package/lib/types/utils/intl.js +9 -0
  610. package/lib/types/utils/loaded-context.d.ts +20 -0
  611. package/lib/types/utils/loaded-context.d.ts.map +1 -0
  612. package/lib/types/utils/loaded-context.js +36 -0
  613. package/lib/types/utils/log.d.ts +7 -0
  614. package/lib/types/utils/log.d.ts.map +1 -0
  615. package/lib/types/utils/log.js +9 -0
  616. package/lib/types/utils/mentions.d.ts +30 -0
  617. package/lib/types/utils/mentions.d.ts.map +1 -0
  618. package/lib/types/utils/mentions.js +72 -0
  619. package/lib/types/utils/narration.d.ts +11 -0
  620. package/lib/types/utils/narration.d.ts.map +1 -0
  621. package/lib/types/utils/narration.js +16 -0
  622. package/lib/types/utils/semver.d.ts +9 -0
  623. package/lib/types/utils/semver.d.ts.map +1 -0
  624. package/lib/types/utils/semver.js +24 -0
  625. package/lib/types/utils/sliceAnsi.d.ts +12 -0
  626. package/lib/types/utils/sliceAnsi.d.ts.map +1 -0
  627. package/lib/types/utils/sliceAnsi.js +79 -0
  628. package/lib/types/working-activity.d.ts +19 -0
  629. package/lib/types/working-activity.d.ts.map +1 -0
  630. package/lib/types/working-activity.js +18 -0
  631. package/package.json +141 -0
  632. package/skills/audit/SKILL.md +24 -0
  633. package/skills/bug/SKILL.md +27 -0
  634. package/skills/pr-comments/SKILL.md +20 -0
  635. package/skills/practice/SKILL.md +22 -0
  636. package/skills/release-notes/SKILL.md +25 -0
  637. package/skills/review/SKILL.md +25 -0
  638. package/skills/vuln-check/SKILL.md +25 -0
@@ -0,0 +1,74 @@
1
+ import type { DOMElement } from './dom.js';
2
+ import { FocusEvent } from './events/focus-event.js';
3
+ /**
4
+ * DOM-like focus manager for the Ink terminal UI.
5
+ *
6
+ * Pure state — tracks activeElement and a focus stack. Has no reference
7
+ * to the tree; callers pass the root when tree walks are needed.
8
+ *
9
+ * Stored on the root DOMElement so any node can reach it by walking
10
+ * parentNode (like browser's `node.ownerDocument`).
11
+ */
12
+ export declare class FocusManager {
13
+ /** The element that currently has focus, or null when nothing is focused. */
14
+ activeElement: DOMElement | null;
15
+ private dispatchFocusEvent;
16
+ private enabled;
17
+ private focusStack;
18
+ constructor(dispatchFocusEvent: (target: DOMElement, event: FocusEvent) => boolean);
19
+ /**
20
+ * Move focus to a node.
21
+ * @param node - the element to focus.
22
+ */
23
+ focus(node: DOMElement): void;
24
+ /** Drop focus from the active element, dispatching a blur event. */
25
+ blur(): void;
26
+ /**
27
+ * Called by the reconciler when a node is removed from the tree.
28
+ * Handles both the exact node and any focused descendant within
29
+ * the removed subtree. Dispatches blur and restores focus from stack.
30
+ * @param node - the removed element.
31
+ * @param root - the tree root used to test whether elements are still mounted.
32
+ */
33
+ handleNodeRemoved(node: DOMElement, root: DOMElement): void;
34
+ /**
35
+ * Focus a node on mount when it requests auto-focus.
36
+ * @param node - the element to focus.
37
+ */
38
+ handleAutoFocus(node: DOMElement): void;
39
+ /**
40
+ * Focus a node when it is clicked, provided it carries a numeric `tabIndex`.
41
+ * @param node - the clicked element.
42
+ */
43
+ handleClickFocus(node: DOMElement): void;
44
+ /** Re-enable focus tracking after a disable. */
45
+ enable(): void;
46
+ /** Disable focus tracking: focus requests are ignored until re-enabled. */
47
+ disable(): void;
48
+ /**
49
+ * Move focus to the next tabbable element within the tree.
50
+ * @param root - the tree root whose tabbable elements are cycled.
51
+ */
52
+ focusNext(root: DOMElement): void;
53
+ /**
54
+ * Move focus to the previous tabbable element within the tree.
55
+ * @param root - the tree root whose tabbable elements are cycled.
56
+ */
57
+ focusPrevious(root: DOMElement): void;
58
+ private moveFocus;
59
+ }
60
+ /**
61
+ * Walk up to root and return it. The root is the node that holds
62
+ * the FocusManager — like browser's `node.getRootNode()`.
63
+ * @param node - the node to walk up from.
64
+ * @returns the nearest ancestor holding a FocusManager.
65
+ */
66
+ export declare function getRootNode(node: DOMElement): DOMElement;
67
+ /**
68
+ * Walk up to root and return its FocusManager.
69
+ * Like browser's `node.ownerDocument` — focus belongs to the root.
70
+ * @param node - the node to walk up from.
71
+ * @returns the root's FocusManager.
72
+ */
73
+ export declare function getFocusManager(node: DOMElement): FocusManager;
74
+ //# sourceMappingURL=focus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus.d.ts","sourceRoot":"","sources":["../../../src/ink/focus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAIpD;;;;;;;;GAQG;AACH,qBAAa,YAAY;IACvB,6EAA6E;IAC7E,aAAa,EAAE,UAAU,GAAG,IAAI,CAAO;IACvC,OAAO,CAAC,kBAAkB,CAAoD;IAC9E,OAAO,CAAC,OAAO,CAAO;IACtB,OAAO,CAAC,UAAU,CAAmB;gBAGnC,kBAAkB,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,KAAK,OAAO;IAKxE;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAiB7B,oEAAoE;IACpE,IAAI,IAAI,IAAI;IAQZ;;;;;;OAMG;IACH,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI;IA2B3D;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIvC;;;OAGG;IACH,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAMxC,gDAAgD;IAChD,MAAM,IAAI,IAAI;IAId,2EAA2E;IAC3E,OAAO,IAAI,IAAI;IAIf;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIjC;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIrC,OAAO,CAAC,SAAS;CAsBlB;AA8BD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAOxD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY,CAE9D"}
@@ -0,0 +1,188 @@
1
+ import { FocusEvent } from './events/focus-event.js';
2
+ const MAX_FOCUS_STACK = 32;
3
+ /**
4
+ * DOM-like focus manager for the Ink terminal UI.
5
+ *
6
+ * Pure state — tracks activeElement and a focus stack. Has no reference
7
+ * to the tree; callers pass the root when tree walks are needed.
8
+ *
9
+ * Stored on the root DOMElement so any node can reach it by walking
10
+ * parentNode (like browser's `node.ownerDocument`).
11
+ */
12
+ export class FocusManager {
13
+ /** The element that currently has focus, or null when nothing is focused. */
14
+ activeElement = null;
15
+ dispatchFocusEvent;
16
+ enabled = true;
17
+ focusStack = [];
18
+ constructor(dispatchFocusEvent) {
19
+ this.dispatchFocusEvent = dispatchFocusEvent;
20
+ }
21
+ /**
22
+ * Move focus to a node.
23
+ * @param node - the element to focus.
24
+ */
25
+ focus(node) {
26
+ if (node === this.activeElement)
27
+ return;
28
+ if (!this.enabled)
29
+ return;
30
+ const previous = this.activeElement;
31
+ if (previous) {
32
+ // Deduplicate before pushing to prevent unbounded growth from Tab cycling
33
+ const idx = this.focusStack.indexOf(previous);
34
+ if (idx !== -1)
35
+ this.focusStack.splice(idx, 1);
36
+ this.focusStack.push(previous);
37
+ if (this.focusStack.length > MAX_FOCUS_STACK)
38
+ this.focusStack.shift();
39
+ this.dispatchFocusEvent(previous, new FocusEvent('blur', node));
40
+ }
41
+ this.activeElement = node;
42
+ this.dispatchFocusEvent(node, new FocusEvent('focus', previous));
43
+ }
44
+ /** Drop focus from the active element, dispatching a blur event. */
45
+ blur() {
46
+ if (!this.activeElement)
47
+ return;
48
+ const previous = this.activeElement;
49
+ this.activeElement = null;
50
+ this.dispatchFocusEvent(previous, new FocusEvent('blur', null));
51
+ }
52
+ /**
53
+ * Called by the reconciler when a node is removed from the tree.
54
+ * Handles both the exact node and any focused descendant within
55
+ * the removed subtree. Dispatches blur and restores focus from stack.
56
+ * @param node - the removed element.
57
+ * @param root - the tree root used to test whether elements are still mounted.
58
+ */
59
+ handleNodeRemoved(node, root) {
60
+ // Remove the node and any descendants from the stack
61
+ this.focusStack = this.focusStack.filter(n => n !== node && isInTree(n, root));
62
+ // Check if activeElement is the removed node OR a descendant
63
+ if (!this.activeElement)
64
+ return;
65
+ if (this.activeElement !== node && isInTree(this.activeElement, root)) {
66
+ return;
67
+ }
68
+ const removed = this.activeElement;
69
+ this.activeElement = null;
70
+ this.dispatchFocusEvent(removed, new FocusEvent('blur', null));
71
+ // Restore focus to the most recent still-mounted element
72
+ while (this.focusStack.length > 0) {
73
+ const candidate = this.focusStack.pop();
74
+ if (isInTree(candidate, root)) {
75
+ this.activeElement = candidate;
76
+ this.dispatchFocusEvent(candidate, new FocusEvent('focus', removed));
77
+ return;
78
+ }
79
+ }
80
+ }
81
+ /**
82
+ * Focus a node on mount when it requests auto-focus.
83
+ * @param node - the element to focus.
84
+ */
85
+ handleAutoFocus(node) {
86
+ this.focus(node);
87
+ }
88
+ /**
89
+ * Focus a node when it is clicked, provided it carries a numeric `tabIndex`.
90
+ * @param node - the clicked element.
91
+ */
92
+ handleClickFocus(node) {
93
+ const tabIndex = node.attributes['tabIndex'];
94
+ if (typeof tabIndex !== 'number')
95
+ return;
96
+ this.focus(node);
97
+ }
98
+ /** Re-enable focus tracking after a disable. */
99
+ enable() {
100
+ this.enabled = true;
101
+ }
102
+ /** Disable focus tracking: focus requests are ignored until re-enabled. */
103
+ disable() {
104
+ this.enabled = false;
105
+ }
106
+ /**
107
+ * Move focus to the next tabbable element within the tree.
108
+ * @param root - the tree root whose tabbable elements are cycled.
109
+ */
110
+ focusNext(root) {
111
+ this.moveFocus(1, root);
112
+ }
113
+ /**
114
+ * Move focus to the previous tabbable element within the tree.
115
+ * @param root - the tree root whose tabbable elements are cycled.
116
+ */
117
+ focusPrevious(root) {
118
+ this.moveFocus(-1, root);
119
+ }
120
+ moveFocus(direction, root) {
121
+ if (!this.enabled)
122
+ return;
123
+ const tabbable = collectTabbable(root);
124
+ if (tabbable.length === 0)
125
+ return;
126
+ const currentIndex = this.activeElement
127
+ ? tabbable.indexOf(this.activeElement)
128
+ : -1;
129
+ const nextIndex = currentIndex === -1
130
+ ? direction === 1
131
+ ? 0
132
+ : tabbable.length - 1
133
+ : (currentIndex + direction + tabbable.length) % tabbable.length;
134
+ const next = tabbable[nextIndex];
135
+ if (next) {
136
+ this.focus(next);
137
+ }
138
+ }
139
+ }
140
+ function collectTabbable(root) {
141
+ const result = [];
142
+ walkTree(root, result);
143
+ return result;
144
+ }
145
+ function walkTree(node, result) {
146
+ const tabIndex = node.attributes['tabIndex'];
147
+ if (typeof tabIndex === 'number' && tabIndex >= 0) {
148
+ result.push(node);
149
+ }
150
+ for (const child of node.childNodes) {
151
+ if (child.nodeName !== '#text') {
152
+ walkTree(child, result);
153
+ }
154
+ }
155
+ }
156
+ function isInTree(node, root) {
157
+ let current = node;
158
+ while (current) {
159
+ if (current === root)
160
+ return true;
161
+ current = current.parentNode;
162
+ }
163
+ return false;
164
+ }
165
+ /**
166
+ * Walk up to root and return it. The root is the node that holds
167
+ * the FocusManager — like browser's `node.getRootNode()`.
168
+ * @param node - the node to walk up from.
169
+ * @returns the nearest ancestor holding a FocusManager.
170
+ */
171
+ export function getRootNode(node) {
172
+ let current = node;
173
+ while (current) {
174
+ if (current.focusManager)
175
+ return current;
176
+ current = current.parentNode;
177
+ }
178
+ throw new Error('Node is not in a tree with a FocusManager');
179
+ }
180
+ /**
181
+ * Walk up to root and return its FocusManager.
182
+ * Like browser's `node.ownerDocument` — focus belongs to the root.
183
+ * @param node - the node to walk up from.
184
+ * @returns the root's FocusManager.
185
+ */
186
+ export function getFocusManager(node) {
187
+ return getRootNode(node).focusManager;
188
+ }
@@ -0,0 +1,119 @@
1
+ import type { Cursor } from './cursor.js';
2
+ import type { Size } from './layout/geometry.js';
3
+ import type { ScrollHint } from './render-node-to-output.js';
4
+ import { type CharPool, type HyperlinkPool, type Screen, type StylePool } from './screen.js';
5
+ /**
6
+ * A complete rendered frame: the painted screen buffer plus the viewport
7
+ * size and cursor position for this render.
8
+ */
9
+ export type Frame = {
10
+ readonly screen: Screen;
11
+ readonly viewport: Size;
12
+ readonly cursor: Cursor;
13
+ /** DECSTBM scroll optimization hint (alt-screen only, null otherwise). */
14
+ readonly scrollHint?: ScrollHint | null;
15
+ /** A ScrollBox has remaining pendingScrollDelta — schedule another frame. */
16
+ readonly scrollDrainPending?: boolean;
17
+ };
18
+ /**
19
+ * Create an empty frame with a zero-size screen, the given viewport, and a
20
+ * visible cursor at the origin.
21
+ * @param rows - the viewport height in rows.
22
+ * @param columns - the viewport width in columns.
23
+ * @param stylePool - the style pool backing the new screen.
24
+ * @param charPool - the character pool backing the new screen.
25
+ * @param hyperlinkPool - the hyperlink pool backing the new screen.
26
+ * @returns a frame with an empty screen and the given viewport.
27
+ */
28
+ export declare function emptyFrame(rows: number, columns: number, stylePool: StylePool, charPool: CharPool, hyperlinkPool: HyperlinkPool): Frame;
29
+ /** The reason a full screen clear is triggered: viewport resize, content overflowing the terminal, or an explicit clear. */
30
+ export type FlickerReason = 'resize' | 'offscreen' | 'clear';
31
+ /**
32
+ * Timing and flicker telemetry for one rendered frame, reported through
33
+ * the onFrame option when frame-timing instrumentation is enabled.
34
+ */
35
+ export type FrameEvent = {
36
+ durationMs: number;
37
+ /** Phase breakdown in ms + patch count. Populated when the ink instance
38
+ * has frame-timing instrumentation enabled (via onFrame wiring). */
39
+ phases?: {
40
+ /** createRenderer output: DOM → yoga layout → screen buffer */
41
+ renderer: number;
42
+ /** LogUpdate.render(): screen diff → Patch[] (the hot path this PR optimizes) */
43
+ diff: number;
44
+ /** optimize(): patch merge/dedupe */
45
+ optimize: number;
46
+ /** writeDiffToTerminal(): serialize patches → ANSI → stdout */
47
+ write: number;
48
+ /** Pre-optimize patch count (proxy for how much changed this frame) */
49
+ patches: number;
50
+ /** yoga calculateLayout() time (runs in resetAfterCommit, before onRender) */
51
+ yoga: number;
52
+ /** React reconcile time: scrollMutated → resetAfterCommit. 0 if no commit. */
53
+ commit: number;
54
+ /** layoutNode() calls this frame (recursive, includes cache-hit returns) */
55
+ yogaVisited: number;
56
+ /** measureFunc (text wrap/width) calls — the expensive part */
57
+ yogaMeasured: number;
58
+ /** early returns via _hasL single-slot cache */
59
+ yogaCacheHits: number;
60
+ /** total yoga Node instances alive (create - free). Growth = leak. */
61
+ yogaLive: number;
62
+ };
63
+ flickers: Array<{
64
+ desiredHeight: number;
65
+ availableHeight: number;
66
+ reason: FlickerReason;
67
+ }>;
68
+ };
69
+ /** A single terminal write operation emitted for one frame. */
70
+ export type Patch = {
71
+ type: 'stdout';
72
+ content: string;
73
+ } | {
74
+ type: 'clear';
75
+ count: number;
76
+ } | {
77
+ type: 'clearTerminal';
78
+ reason: FlickerReason;
79
+ debug?: {
80
+ triggerY: number;
81
+ prevLine: string;
82
+ nextLine: string;
83
+ };
84
+ } | {
85
+ type: 'cursorHide';
86
+ } | {
87
+ type: 'cursorShow';
88
+ } | {
89
+ type: 'cursorMove';
90
+ x: number;
91
+ y: number;
92
+ } | {
93
+ type: 'cursorTo';
94
+ col: number;
95
+ } | {
96
+ type: 'carriageReturn';
97
+ } | {
98
+ type: 'hyperlink';
99
+ uri: string;
100
+ } | {
101
+ type: 'styleStr';
102
+ str: string;
103
+ };
104
+ /** The ordered list of patches that update the terminal for one frame. */
105
+ export type Diff = Patch[];
106
+ /**
107
+ * Determines whether the screen should be cleared based on the current and previous frame.
108
+ * Returns the reason for clearing, or undefined if no clear is needed.
109
+ *
110
+ * Screen clearing is triggered when:
111
+ * 1. Terminal has been resized (viewport dimensions changed) → 'resize'
112
+ * 2. Current frame screen height exceeds available terminal rows → 'offscreen'
113
+ * 3. Previous frame screen height exceeded available terminal rows → 'offscreen'
114
+ * @param prevFrame - the previously rendered frame.
115
+ * @param frame - the frame about to be rendered.
116
+ * @returns the clearing reason, or undefined when no clear is needed.
117
+ */
118
+ export declare function shouldClearScreen(prevFrame: Frame, frame: Frame): FlickerReason | undefined;
119
+ //# sourceMappingURL=frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../../src/ink/frame.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EACL,KAAK,QAAQ,EAEb,KAAK,aAAa,EAClB,KAAK,MAAM,EACX,KAAK,SAAS,EACf,MAAM,aAAa,CAAA;AAEpB;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG;IAClB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;IACvC,6EAA6E;IAC7E,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;CACtC,CAAA;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,GAC3B,KAAK,CAMP;AAED,4HAA4H;AAC5H,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAA;AAE5D;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB;yEACqE;IACrE,MAAM,CAAC,EAAE;QACP,+DAA+D;QAC/D,QAAQ,EAAE,MAAM,CAAA;QAChB,iFAAiF;QACjF,IAAI,EAAE,MAAM,CAAA;QACZ,qCAAqC;QACrC,QAAQ,EAAE,MAAM,CAAA;QAChB,+DAA+D;QAC/D,KAAK,EAAE,MAAM,CAAA;QACb,uEAAuE;QACvE,OAAO,EAAE,MAAM,CAAA;QACf,8EAA8E;QAC9E,IAAI,EAAE,MAAM,CAAA;QACZ,8EAA8E;QAC9E,MAAM,EAAE,MAAM,CAAA;QACd,4EAA4E;QAC5E,WAAW,EAAE,MAAM,CAAA;QACnB,+DAA+D;QAC/D,YAAY,EAAE,MAAM,CAAA;QACpB,gDAAgD;QAChD,aAAa,EAAE,MAAM,CAAA;QACrB,sEAAsE;QACtE,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;IACD,QAAQ,EAAE,KAAK,CAAC;QACd,aAAa,EAAE,MAAM,CAAA;QACrB,eAAe,EAAE,MAAM,CAAA;QACvB,MAAM,EAAE,aAAa,CAAA;KACtB,CAAC,CAAA;CACH,CAAA;AAED,+DAA+D;AAC/D,MAAM,MAAM,KAAK,GACb;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IACE,IAAI,EAAE,eAAe,CAAA;IACrB,MAAM,EAAE,aAAa,CAAA;IAIrB,KAAK,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CACjE,GACD;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAGlC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAErC,0EAA0E;AAC1E,MAAM,MAAM,IAAI,GAAG,KAAK,EAAE,CAAA;AAE1B;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,KAAK,EAChB,KAAK,EAAE,KAAK,GACX,aAAa,GAAG,SAAS,CAgB3B"}
@@ -0,0 +1,43 @@
1
+ import { createScreen, } from './screen.js';
2
+ /**
3
+ * Create an empty frame with a zero-size screen, the given viewport, and a
4
+ * visible cursor at the origin.
5
+ * @param rows - the viewport height in rows.
6
+ * @param columns - the viewport width in columns.
7
+ * @param stylePool - the style pool backing the new screen.
8
+ * @param charPool - the character pool backing the new screen.
9
+ * @param hyperlinkPool - the hyperlink pool backing the new screen.
10
+ * @returns a frame with an empty screen and the given viewport.
11
+ */
12
+ export function emptyFrame(rows, columns, stylePool, charPool, hyperlinkPool) {
13
+ return {
14
+ screen: createScreen(0, 0, stylePool, charPool, hyperlinkPool),
15
+ viewport: { width: columns, height: rows },
16
+ cursor: { x: 0, y: 0, visible: true },
17
+ };
18
+ }
19
+ /**
20
+ * Determines whether the screen should be cleared based on the current and previous frame.
21
+ * Returns the reason for clearing, or undefined if no clear is needed.
22
+ *
23
+ * Screen clearing is triggered when:
24
+ * 1. Terminal has been resized (viewport dimensions changed) → 'resize'
25
+ * 2. Current frame screen height exceeds available terminal rows → 'offscreen'
26
+ * 3. Previous frame screen height exceeded available terminal rows → 'offscreen'
27
+ * @param prevFrame - the previously rendered frame.
28
+ * @param frame - the frame about to be rendered.
29
+ * @returns the clearing reason, or undefined when no clear is needed.
30
+ */
31
+ export function shouldClearScreen(prevFrame, frame) {
32
+ const didResize = frame.viewport.height !== prevFrame.viewport.height ||
33
+ frame.viewport.width !== prevFrame.viewport.width;
34
+ if (didResize) {
35
+ return 'resize';
36
+ }
37
+ const currentFrameOverflows = frame.screen.height >= frame.viewport.height;
38
+ const previousFrameOverflowed = prevFrame.screen.height >= prevFrame.viewport.height;
39
+ if (currentFrameOverflows || previousFrameOverflowed) {
40
+ return 'offscreen';
41
+ }
42
+ return undefined;
43
+ }
@@ -0,0 +1,20 @@
1
+ import { type LayoutNode } from './layout/node.js';
2
+ /**
3
+ * Returns the yoga node's content width (computed width minus padding and
4
+ * border).
5
+ *
6
+ * Warning: can return a value WIDER than the parent container. In a
7
+ * column-direction flex parent, width is the cross axis — align-items:
8
+ * stretch never shrinks children below their intrinsic size, so the text
9
+ * node overflows (standard CSS behavior). Yoga measures leaf nodes in two
10
+ * passes: the AtMost pass determines width, the Exactly pass determines
11
+ * height. getComputedWidth() reflects the wider AtMost result while
12
+ * getComputedHeight() reflects the narrower Exactly result. Callers that
13
+ * use this for wrapping should clamp to actual available screen space so
14
+ * the rendered line count stays consistent with the layout height.
15
+ * @param yogaNode - the laid-out node to measure.
16
+ * @returns the node's content width: computed width minus padding and border.
17
+ */
18
+ declare const getMaxWidth: (yogaNode: LayoutNode) => number;
19
+ export default getMaxWidth;
20
+ //# sourceMappingURL=get-max-width.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-max-width.d.ts","sourceRoot":"","sources":["../../../src/ink/get-max-width.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE9D;;;;;;;;;;;;;;;GAeG;AACH,QAAA,MAAM,WAAW,GAAI,UAAU,UAAU,KAAG,MAQ3C,CAAA;AAED,eAAe,WAAW,CAAA"}
@@ -0,0 +1,25 @@
1
+ import { LayoutEdge } from './layout/node.js';
2
+ /**
3
+ * Returns the yoga node's content width (computed width minus padding and
4
+ * border).
5
+ *
6
+ * Warning: can return a value WIDER than the parent container. In a
7
+ * column-direction flex parent, width is the cross axis — align-items:
8
+ * stretch never shrinks children below their intrinsic size, so the text
9
+ * node overflows (standard CSS behavior). Yoga measures leaf nodes in two
10
+ * passes: the AtMost pass determines width, the Exactly pass determines
11
+ * height. getComputedWidth() reflects the wider AtMost result while
12
+ * getComputedHeight() reflects the narrower Exactly result. Callers that
13
+ * use this for wrapping should clamp to actual available screen space so
14
+ * the rendered line count stays consistent with the layout height.
15
+ * @param yogaNode - the laid-out node to measure.
16
+ * @returns the node's content width: computed width minus padding and border.
17
+ */
18
+ const getMaxWidth = (yogaNode) => {
19
+ return (yogaNode.getComputedWidth() -
20
+ yogaNode.getComputedPadding(LayoutEdge.Left) -
21
+ yogaNode.getComputedPadding(LayoutEdge.Right) -
22
+ yogaNode.getComputedBorder(LayoutEdge.Left) -
23
+ yogaNode.getComputedBorder(LayoutEdge.Right));
24
+ };
25
+ export default getMaxWidth;
@@ -0,0 +1,47 @@
1
+ import type { DOMElement } from './dom.js';
2
+ /**
3
+ * Find the deepest DOM element whose rendered rect contains (col, row).
4
+ *
5
+ * Uses the nodeCache populated by renderNodeToOutput — rects are in screen
6
+ * coordinates with all offsets (including scrollTop translation) already
7
+ * applied. Children are traversed in reverse so later siblings (painted on
8
+ * top) win. Nodes not in nodeCache (not rendered this frame, or lacking a
9
+ * yogaNode) are skipped along with their subtrees.
10
+ *
11
+ * Returns the hit node even if it has no onClick — dispatchClick walks up
12
+ * via parentNode to find handlers.
13
+ * @param node - the subtree root to test.
14
+ * @param col - the screen column to test.
15
+ * @param row - the screen row to test.
16
+ * @returns the deepest element whose rect contains (col, row), or null.
17
+ */
18
+ export declare function hitTest(node: DOMElement, col: number, row: number): DOMElement | null;
19
+ /**
20
+ * Hit-test the root at (col, row) and bubble a ClickEvent from the deepest
21
+ * containing node up through parentNode. Only nodes with an onClick handler
22
+ * fire. Stops when a handler calls stopImmediatePropagation(). Returns
23
+ * true if at least one onClick handler fired.
24
+ * @param root - the tree root to hit-test.
25
+ * @param col - the screen column of the click.
26
+ * @param row - the screen row of the click.
27
+ * @param cellIsBlank - whether the clicked cell is blank, reported on the event.
28
+ * @returns true when at least one onClick handler fired.
29
+ */
30
+ export declare function dispatchClick(root: DOMElement, col: number, row: number, cellIsBlank?: boolean): boolean;
31
+ /**
32
+ * Fire onMouseEnter/onMouseLeave as the pointer moves. Like DOM
33
+ * mouseenter/mouseleave: does NOT bubble — moving between children does
34
+ * not re-fire on the parent. Walks up from the hit node collecting every
35
+ * ancestor with a hover handler; diffs against the previous hovered set;
36
+ * fires leave on the nodes exited, enter on the nodes entered.
37
+ *
38
+ * Mutates `hovered` in place so the caller (App instance) can hold it
39
+ * across calls. Clears the set when the hit is null (cursor moved into a
40
+ * non-rendered gap or off the root rect).
41
+ * @param root - the tree root to hit-test.
42
+ * @param col - the screen column of the pointer.
43
+ * @param row - the screen row of the pointer.
44
+ * @param hovered - the previously hovered element set; updated in place.
45
+ */
46
+ export declare function dispatchHover(root: DOMElement, col: number, row: number, hovered: Set<DOMElement>): void;
47
+ //# sourceMappingURL=hit-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hit-test.d.ts","sourceRoot":"","sources":["../../../src/ink/hit-test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAK1C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GACV,UAAU,GAAG,IAAI,CAmBnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,WAAW,UAAQ,GAClB,OAAO,CAmCT;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,GACvB,IAAI,CAuBN"}
@@ -0,0 +1,126 @@
1
+ import { ClickEvent } from './events/click-event.js';
2
+ import { nodeCache } from './node-cache.js';
3
+ /**
4
+ * Find the deepest DOM element whose rendered rect contains (col, row).
5
+ *
6
+ * Uses the nodeCache populated by renderNodeToOutput — rects are in screen
7
+ * coordinates with all offsets (including scrollTop translation) already
8
+ * applied. Children are traversed in reverse so later siblings (painted on
9
+ * top) win. Nodes not in nodeCache (not rendered this frame, or lacking a
10
+ * yogaNode) are skipped along with their subtrees.
11
+ *
12
+ * Returns the hit node even if it has no onClick — dispatchClick walks up
13
+ * via parentNode to find handlers.
14
+ * @param node - the subtree root to test.
15
+ * @param col - the screen column to test.
16
+ * @param row - the screen row to test.
17
+ * @returns the deepest element whose rect contains (col, row), or null.
18
+ */
19
+ export function hitTest(node, col, row) {
20
+ const rect = nodeCache.get(node);
21
+ if (!rect)
22
+ return null;
23
+ if (col < rect.x ||
24
+ col >= rect.x + rect.width ||
25
+ row < rect.y ||
26
+ row >= rect.y + rect.height) {
27
+ return null;
28
+ }
29
+ // Later siblings paint on top; reversed traversal returns topmost hit.
30
+ for (let i = node.childNodes.length - 1; i >= 0; i--) {
31
+ const child = node.childNodes[i];
32
+ if (child.nodeName === '#text')
33
+ continue;
34
+ const hit = hitTest(child, col, row);
35
+ if (hit)
36
+ return hit;
37
+ }
38
+ return node;
39
+ }
40
+ /**
41
+ * Hit-test the root at (col, row) and bubble a ClickEvent from the deepest
42
+ * containing node up through parentNode. Only nodes with an onClick handler
43
+ * fire. Stops when a handler calls stopImmediatePropagation(). Returns
44
+ * true if at least one onClick handler fired.
45
+ * @param root - the tree root to hit-test.
46
+ * @param col - the screen column of the click.
47
+ * @param row - the screen row of the click.
48
+ * @param cellIsBlank - whether the clicked cell is blank, reported on the event.
49
+ * @returns true when at least one onClick handler fired.
50
+ */
51
+ export function dispatchClick(root, col, row, cellIsBlank = false) {
52
+ let target = hitTest(root, col, row) ?? undefined;
53
+ if (!target)
54
+ return false;
55
+ // Click-to-focus: find the closest focusable ancestor and focus it.
56
+ // root is always ink-root, which owns the FocusManager.
57
+ if (root.focusManager) {
58
+ let focusTarget = target;
59
+ while (focusTarget) {
60
+ if (typeof focusTarget.attributes['tabIndex'] === 'number') {
61
+ root.focusManager.handleClickFocus(focusTarget);
62
+ break;
63
+ }
64
+ focusTarget = focusTarget.parentNode;
65
+ }
66
+ }
67
+ const event = new ClickEvent(col, row, cellIsBlank);
68
+ let handled = false;
69
+ while (target) {
70
+ const handler = target._eventHandlers?.onClick;
71
+ if (handler) {
72
+ handled = true;
73
+ const rect = nodeCache.get(target);
74
+ if (rect) {
75
+ event.localCol = col - rect.x;
76
+ event.localRow = row - rect.y;
77
+ }
78
+ handler(event);
79
+ if (event.didStopImmediatePropagation())
80
+ return true;
81
+ }
82
+ target = target.parentNode;
83
+ }
84
+ return handled;
85
+ }
86
+ /**
87
+ * Fire onMouseEnter/onMouseLeave as the pointer moves. Like DOM
88
+ * mouseenter/mouseleave: does NOT bubble — moving between children does
89
+ * not re-fire on the parent. Walks up from the hit node collecting every
90
+ * ancestor with a hover handler; diffs against the previous hovered set;
91
+ * fires leave on the nodes exited, enter on the nodes entered.
92
+ *
93
+ * Mutates `hovered` in place so the caller (App instance) can hold it
94
+ * across calls. Clears the set when the hit is null (cursor moved into a
95
+ * non-rendered gap or off the root rect).
96
+ * @param root - the tree root to hit-test.
97
+ * @param col - the screen column of the pointer.
98
+ * @param row - the screen row of the pointer.
99
+ * @param hovered - the previously hovered element set; updated in place.
100
+ */
101
+ export function dispatchHover(root, col, row, hovered) {
102
+ const next = new Set();
103
+ let node = hitTest(root, col, row) ?? undefined;
104
+ while (node) {
105
+ const h = node._eventHandlers;
106
+ if (h?.onMouseEnter || h?.onMouseLeave)
107
+ next.add(node);
108
+ node = node.parentNode;
109
+ }
110
+ for (const old of hovered) {
111
+ if (!next.has(old)) {
112
+ hovered.delete(old);
113
+ // Skip handlers on detached nodes (removed between mouse events)
114
+ if (old.parentNode) {
115
+ ;
116
+ old._eventHandlers?.onMouseLeave?.();
117
+ }
118
+ }
119
+ }
120
+ for (const n of next) {
121
+ if (!hovered.has(n)) {
122
+ hovered.add(n);
123
+ n._eventHandlers?.onMouseEnter?.();
124
+ }
125
+ }
126
+ }