@effect-tui/react 0.1.3 → 0.1.5

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 (442) hide show
  1. package/dist/jsx-runtime.d.ts +13 -0
  2. package/dist/jsx-runtime.d.ts.map +1 -1
  3. package/dist/jsx-runtime.js.map +1 -1
  4. package/dist/src/codeblock.d.ts.map +1 -1
  5. package/dist/src/codeblock.js.map +1 -1
  6. package/dist/src/components/Divider.d.ts +18 -0
  7. package/dist/src/components/Divider.d.ts.map +1 -0
  8. package/dist/src/components/Divider.js +17 -0
  9. package/dist/src/components/Divider.js.map +1 -0
  10. package/dist/src/components/Markdown.d.ts +66 -0
  11. package/dist/src/components/Markdown.d.ts.map +1 -0
  12. package/dist/src/components/Markdown.js +226 -0
  13. package/dist/src/components/Markdown.js.map +1 -0
  14. package/dist/src/components/MultilineTextInput.d.ts +65 -0
  15. package/dist/src/components/MultilineTextInput.d.ts.map +1 -0
  16. package/dist/src/components/MultilineTextInput.js +607 -0
  17. package/dist/src/components/MultilineTextInput.js.map +1 -0
  18. package/dist/src/components/Overlay.d.ts +46 -0
  19. package/dist/src/components/Overlay.d.ts.map +1 -0
  20. package/dist/src/components/Overlay.js +11 -0
  21. package/dist/src/components/Overlay.js.map +1 -0
  22. package/dist/src/components/Static.d.ts +44 -0
  23. package/dist/src/components/Static.d.ts.map +1 -0
  24. package/dist/src/components/Static.js +53 -0
  25. package/dist/src/components/Static.js.map +1 -0
  26. package/dist/src/components/TextInput.d.ts +55 -0
  27. package/dist/src/components/TextInput.d.ts.map +1 -0
  28. package/dist/src/components/TextInput.js +277 -0
  29. package/dist/src/components/TextInput.js.map +1 -0
  30. package/dist/src/components/index.d.ts +7 -0
  31. package/dist/src/components/index.d.ts.map +1 -0
  32. package/dist/src/components/index.js +7 -0
  33. package/dist/src/components/index.js.map +1 -0
  34. package/dist/src/components/text-editing.d.ts +62 -0
  35. package/dist/src/components/text-editing.d.ts.map +1 -0
  36. package/dist/src/components/text-editing.js +385 -0
  37. package/dist/src/components/text-editing.js.map +1 -0
  38. package/dist/src/console/ConsoleCapture.d.ts +36 -0
  39. package/dist/src/console/ConsoleCapture.d.ts.map +1 -0
  40. package/dist/src/console/ConsoleCapture.js +210 -0
  41. package/dist/src/console/ConsoleCapture.js.map +1 -0
  42. package/dist/src/console/ConsolePopover.d.ts +18 -0
  43. package/dist/src/console/ConsolePopover.d.ts.map +1 -0
  44. package/dist/src/console/ConsolePopover.js +324 -0
  45. package/dist/src/console/ConsolePopover.js.map +1 -0
  46. package/dist/src/console/clipboard.d.ts +10 -0
  47. package/dist/src/console/clipboard.d.ts.map +1 -0
  48. package/dist/src/console/clipboard.js +74 -0
  49. package/dist/src/console/clipboard.js.map +1 -0
  50. package/dist/src/console/index.d.ts +5 -0
  51. package/dist/src/console/index.d.ts.map +1 -0
  52. package/dist/src/console/index.js +33 -0
  53. package/dist/src/console/index.js.map +1 -0
  54. package/dist/src/console/useConsole.d.ts +44 -0
  55. package/dist/src/console/useConsole.d.ts.map +1 -0
  56. package/dist/src/console/useConsole.js +91 -0
  57. package/dist/src/console/useConsole.js.map +1 -0
  58. package/dist/src/debug/DebugOverlay.d.ts +49 -0
  59. package/dist/src/debug/DebugOverlay.d.ts.map +1 -0
  60. package/dist/src/debug/DebugOverlay.js +438 -0
  61. package/dist/src/debug/DebugOverlay.js.map +1 -0
  62. package/dist/src/debug/DiagnosticsPanel.d.ts.map +1 -1
  63. package/dist/src/debug/DiagnosticsPanel.js.map +1 -1
  64. package/dist/src/dev/Toast.d.ts +19 -0
  65. package/dist/src/dev/Toast.d.ts.map +1 -0
  66. package/dist/src/dev/Toast.js +72 -0
  67. package/dist/src/dev/Toast.js.map +1 -0
  68. package/dist/src/dev/index.d.ts +2 -0
  69. package/dist/src/dev/index.d.ts.map +1 -0
  70. package/dist/src/dev/index.js +3 -0
  71. package/dist/src/dev/index.js.map +1 -0
  72. package/dist/src/dev.d.ts +114 -0
  73. package/dist/src/dev.d.ts.map +1 -0
  74. package/dist/src/dev.js +373 -0
  75. package/dist/src/dev.js.map +1 -0
  76. package/dist/src/highlight.d.ts +3 -3
  77. package/dist/src/highlight.d.ts.map +1 -1
  78. package/dist/src/highlight.js.map +1 -1
  79. package/dist/src/hmr-plugin.d.ts +2 -0
  80. package/dist/src/hmr-plugin.d.ts.map +1 -0
  81. package/dist/src/hmr-plugin.js +53 -0
  82. package/dist/src/hmr-plugin.js.map +1 -0
  83. package/dist/src/hooks/index.d.ts +4 -0
  84. package/dist/src/hooks/index.d.ts.map +1 -1
  85. package/dist/src/hooks/index.js +2 -0
  86. package/dist/src/hooks/index.js.map +1 -1
  87. package/dist/src/hooks/use-keyboard.d.ts +11 -0
  88. package/dist/src/hooks/use-keyboard.d.ts.map +1 -1
  89. package/dist/src/hooks/use-keyboard.js +22 -4
  90. package/dist/src/hooks/use-keyboard.js.map +1 -1
  91. package/dist/src/hooks/use-mouse.d.ts +24 -0
  92. package/dist/src/hooks/use-mouse.d.ts.map +1 -0
  93. package/dist/src/hooks/use-mouse.js +41 -0
  94. package/dist/src/hooks/use-mouse.js.map +1 -0
  95. package/dist/src/hooks/use-paste.d.ts +11 -0
  96. package/dist/src/hooks/use-paste.d.ts.map +1 -1
  97. package/dist/src/hooks/use-paste.js +17 -3
  98. package/dist/src/hooks/use-paste.js.map +1 -1
  99. package/dist/src/hooks/use-scroll.d.ts +79 -0
  100. package/dist/src/hooks/use-scroll.d.ts.map +1 -0
  101. package/dist/src/hooks/use-scroll.js +239 -0
  102. package/dist/src/hooks/use-scroll.js.map +1 -0
  103. package/dist/src/hooks/useFrameStats.js.map +1 -1
  104. package/dist/src/hosts/base.d.ts +62 -1
  105. package/dist/src/hosts/base.d.ts.map +1 -1
  106. package/dist/src/hosts/base.js +118 -5
  107. package/dist/src/hosts/base.js.map +1 -1
  108. package/dist/src/hosts/box.d.ts +7 -7
  109. package/dist/src/hosts/box.d.ts.map +1 -1
  110. package/dist/src/hosts/box.js +30 -23
  111. package/dist/src/hosts/box.js.map +1 -1
  112. package/dist/src/hosts/canvas.d.ts +16 -8
  113. package/dist/src/hosts/canvas.d.ts.map +1 -1
  114. package/dist/src/hosts/canvas.js +27 -22
  115. package/dist/src/hosts/canvas.js.map +1 -1
  116. package/dist/src/hosts/codeblock.d.ts +7 -7
  117. package/dist/src/hosts/codeblock.d.ts.map +1 -1
  118. package/dist/src/hosts/codeblock.js +11 -20
  119. package/dist/src/hosts/codeblock.js.map +1 -1
  120. package/dist/src/hosts/flex-container.d.ts +45 -0
  121. package/dist/src/hosts/flex-container.d.ts.map +1 -0
  122. package/dist/src/hosts/flex-container.js +90 -0
  123. package/dist/src/hosts/flex-container.js.map +1 -0
  124. package/dist/src/hosts/hstack.d.ts +6 -11
  125. package/dist/src/hosts/hstack.d.ts.map +1 -1
  126. package/dist/src/hosts/hstack.js +6 -41
  127. package/dist/src/hosts/hstack.js.map +1 -1
  128. package/dist/src/hosts/index.d.ts +4 -0
  129. package/dist/src/hosts/index.d.ts.map +1 -1
  130. package/dist/src/hosts/index.js +10 -0
  131. package/dist/src/hosts/index.js.map +1 -1
  132. package/dist/src/hosts/overlay-item.d.ts +32 -0
  133. package/dist/src/hosts/overlay-item.d.ts.map +1 -0
  134. package/dist/src/hosts/overlay-item.js +54 -0
  135. package/dist/src/hosts/overlay-item.js.map +1 -0
  136. package/dist/src/hosts/overlay.d.ts +30 -0
  137. package/dist/src/hosts/overlay.d.ts.map +1 -0
  138. package/dist/src/hosts/overlay.js +105 -0
  139. package/dist/src/hosts/overlay.js.map +1 -0
  140. package/dist/src/hosts/scroll.d.ts +56 -0
  141. package/dist/src/hosts/scroll.d.ts.map +1 -0
  142. package/dist/src/hosts/scroll.js +204 -0
  143. package/dist/src/hosts/scroll.js.map +1 -0
  144. package/dist/src/hosts/single-child.d.ts +16 -0
  145. package/dist/src/hosts/single-child.d.ts.map +1 -0
  146. package/dist/src/hosts/single-child.js +45 -0
  147. package/dist/src/hosts/single-child.js.map +1 -0
  148. package/dist/src/hosts/spacer.d.ts.map +1 -1
  149. package/dist/src/hosts/spacer.js +7 -3
  150. package/dist/src/hosts/spacer.js.map +1 -1
  151. package/dist/src/hosts/text.d.ts +9 -6
  152. package/dist/src/hosts/text.d.ts.map +1 -1
  153. package/dist/src/hosts/text.js +49 -22
  154. package/dist/src/hosts/text.js.map +1 -1
  155. package/dist/src/hosts/vstack.d.ts +6 -11
  156. package/dist/src/hosts/vstack.d.ts.map +1 -1
  157. package/dist/src/hosts/vstack.js +6 -41
  158. package/dist/src/hosts/vstack.js.map +1 -1
  159. package/dist/src/hosts/zstack.d.ts.map +1 -1
  160. package/dist/src/hosts/zstack.js +16 -5
  161. package/dist/src/hosts/zstack.js.map +1 -1
  162. package/dist/src/index.d.ts +9 -2
  163. package/dist/src/index.d.ts.map +1 -1
  164. package/dist/src/index.js +10 -2
  165. package/dist/src/index.js.map +1 -1
  166. package/dist/src/inline/index.d.ts.map +1 -1
  167. package/dist/src/inline/index.js.map +1 -1
  168. package/dist/src/motion/color-motion-value.d.ts.map +1 -1
  169. package/dist/src/motion/color-motion-value.js.map +1 -1
  170. package/dist/src/motion/color.d.ts +1 -29
  171. package/dist/src/motion/color.d.ts.map +1 -1
  172. package/dist/src/motion/color.js +2 -170
  173. package/dist/src/motion/color.js.map +1 -1
  174. package/dist/src/motion/color.test.js.map +1 -1
  175. package/dist/src/motion/event-emitter.d.ts.map +1 -1
  176. package/dist/src/motion/event-emitter.js.map +1 -1
  177. package/dist/src/motion/frame.js.map +1 -1
  178. package/dist/src/motion/hooks.d.ts.map +1 -1
  179. package/dist/src/motion/hooks.js +8 -3
  180. package/dist/src/motion/hooks.js.map +1 -1
  181. package/dist/src/motion/index.d.ts.map +1 -1
  182. package/dist/src/motion/index.js.map +1 -1
  183. package/dist/src/motion/motion-value.d.ts.map +1 -1
  184. package/dist/src/motion/motion-value.js.map +1 -1
  185. package/dist/src/motion/motion-value.test.js.map +1 -1
  186. package/dist/src/motion/spring-math.d.ts +6 -1
  187. package/dist/src/motion/spring-math.d.ts.map +1 -1
  188. package/dist/src/motion/spring-math.js +6 -1
  189. package/dist/src/motion/spring-math.js.map +1 -1
  190. package/dist/src/motion/types.d.ts.map +1 -1
  191. package/dist/src/motion/types.js.map +1 -1
  192. package/dist/src/profiler.js.map +1 -1
  193. package/dist/src/reconciler/host-config.d.ts +5 -5
  194. package/dist/src/reconciler/host-config.d.ts.map +1 -1
  195. package/dist/src/reconciler/host-config.js +43 -51
  196. package/dist/src/reconciler/host-config.js.map +1 -1
  197. package/dist/src/reconciler/noop-methods.d.ts +29 -0
  198. package/dist/src/reconciler/noop-methods.d.ts.map +1 -0
  199. package/dist/src/reconciler/noop-methods.js +43 -0
  200. package/dist/src/reconciler/noop-methods.js.map +1 -0
  201. package/dist/src/reconciler/types.d.ts +68 -14
  202. package/dist/src/reconciler/types.d.ts.map +1 -1
  203. package/dist/src/remote/Procedures.d.ts +22 -0
  204. package/dist/src/remote/Procedures.d.ts.map +1 -0
  205. package/dist/src/remote/Procedures.js +42 -0
  206. package/dist/src/remote/Procedures.js.map +1 -0
  207. package/dist/src/remote/Router.d.ts +20 -0
  208. package/dist/src/remote/Router.d.ts.map +1 -0
  209. package/dist/src/remote/Router.js +26 -0
  210. package/dist/src/remote/Router.js.map +1 -0
  211. package/dist/src/remote/Server.d.ts +6 -0
  212. package/dist/src/remote/Server.d.ts.map +1 -0
  213. package/dist/src/remote/Server.js +53 -0
  214. package/dist/src/remote/Server.js.map +1 -0
  215. package/dist/src/remote/index.d.ts +18 -0
  216. package/dist/src/remote/index.d.ts.map +1 -0
  217. package/dist/src/remote/index.js +74 -0
  218. package/dist/src/remote/index.js.map +1 -0
  219. package/dist/src/renderer/core/FrameBuilder.d.ts +18 -0
  220. package/dist/src/renderer/core/FrameBuilder.d.ts.map +1 -0
  221. package/dist/src/renderer/core/FrameBuilder.js +38 -0
  222. package/dist/src/renderer/core/FrameBuilder.js.map +1 -0
  223. package/dist/src/renderer/core/RendererState.d.ts +41 -0
  224. package/dist/src/renderer/core/RendererState.d.ts.map +1 -0
  225. package/dist/src/renderer/core/RendererState.js +70 -0
  226. package/dist/src/renderer/core/RendererState.js.map +1 -0
  227. package/dist/src/renderer/core/index.d.ts +3 -0
  228. package/dist/src/renderer/core/index.d.ts.map +1 -0
  229. package/dist/src/renderer/core/index.js +3 -0
  230. package/dist/src/renderer/core/index.js.map +1 -0
  231. package/dist/src/renderer/input/InputProcessor.d.ts +25 -0
  232. package/dist/src/renderer/input/InputProcessor.d.ts.map +1 -0
  233. package/dist/src/renderer/input/InputProcessor.js +81 -0
  234. package/dist/src/renderer/input/InputProcessor.js.map +1 -0
  235. package/dist/src/renderer/input/index.d.ts +2 -0
  236. package/dist/src/renderer/input/index.d.ts.map +1 -0
  237. package/dist/src/renderer/input/index.js +2 -0
  238. package/dist/src/renderer/input/index.js.map +1 -0
  239. package/dist/src/renderer/lifecycle/EventBus.d.ts +41 -0
  240. package/dist/src/renderer/lifecycle/EventBus.d.ts.map +1 -0
  241. package/dist/src/renderer/lifecycle/EventBus.js +78 -0
  242. package/dist/src/renderer/lifecycle/EventBus.js.map +1 -0
  243. package/dist/src/renderer/lifecycle/ResizeManager.d.ts +34 -0
  244. package/dist/src/renderer/lifecycle/ResizeManager.d.ts.map +1 -0
  245. package/dist/src/renderer/lifecycle/ResizeManager.js +47 -0
  246. package/dist/src/renderer/lifecycle/ResizeManager.js.map +1 -0
  247. package/dist/src/renderer/lifecycle/TerminalSetup.d.ts +36 -0
  248. package/dist/src/renderer/lifecycle/TerminalSetup.d.ts.map +1 -0
  249. package/dist/src/renderer/lifecycle/TerminalSetup.js +82 -0
  250. package/dist/src/renderer/lifecycle/TerminalSetup.js.map +1 -0
  251. package/dist/src/renderer/lifecycle/index.d.ts +4 -0
  252. package/dist/src/renderer/lifecycle/index.d.ts.map +1 -0
  253. package/dist/src/renderer/lifecycle/index.js +4 -0
  254. package/dist/src/renderer/lifecycle/index.js.map +1 -0
  255. package/dist/src/renderer/modes/FullscreenRenderer.d.ts +12 -0
  256. package/dist/src/renderer/modes/FullscreenRenderer.d.ts.map +1 -0
  257. package/dist/src/renderer/modes/FullscreenRenderer.js +52 -0
  258. package/dist/src/renderer/modes/FullscreenRenderer.js.map +1 -0
  259. package/dist/src/renderer/modes/InlineRenderer.d.ts +25 -0
  260. package/dist/src/renderer/modes/InlineRenderer.d.ts.map +1 -0
  261. package/dist/src/renderer/modes/InlineRenderer.js +161 -0
  262. package/dist/src/renderer/modes/InlineRenderer.js.map +1 -0
  263. package/dist/src/renderer/modes/RendererMode.d.ts +42 -0
  264. package/dist/src/renderer/modes/RendererMode.d.ts.map +1 -0
  265. package/dist/src/renderer/modes/RendererMode.js +2 -0
  266. package/dist/src/renderer/modes/RendererMode.js.map +1 -0
  267. package/dist/src/renderer/modes/StaticContentRenderer.d.ts +25 -0
  268. package/dist/src/renderer/modes/StaticContentRenderer.d.ts.map +1 -0
  269. package/dist/src/renderer/modes/StaticContentRenderer.js +47 -0
  270. package/dist/src/renderer/modes/StaticContentRenderer.js.map +1 -0
  271. package/dist/src/renderer/modes/index.d.ts +5 -0
  272. package/dist/src/renderer/modes/index.d.ts.map +1 -0
  273. package/dist/src/renderer/modes/index.js +4 -0
  274. package/dist/src/renderer/modes/index.js.map +1 -0
  275. package/dist/src/renderer-context.d.ts +9 -0
  276. package/dist/src/renderer-context.d.ts.map +1 -0
  277. package/dist/src/renderer-context.js +22 -0
  278. package/dist/src/renderer-context.js.map +1 -0
  279. package/dist/src/renderer-types.d.ts +103 -0
  280. package/dist/src/renderer-types.d.ts.map +1 -0
  281. package/dist/src/renderer-types.js +2 -0
  282. package/dist/src/renderer-types.js.map +1 -0
  283. package/dist/src/renderer.d.ts +4 -86
  284. package/dist/src/renderer.d.ts.map +1 -1
  285. package/dist/src/renderer.js +214 -384
  286. package/dist/src/renderer.js.map +1 -1
  287. package/dist/src/test/index.d.ts.map +1 -1
  288. package/dist/src/test/index.js.map +1 -1
  289. package/dist/src/test/mock-streams.d.ts.map +1 -1
  290. package/dist/src/test/mock-streams.js.map +1 -1
  291. package/dist/src/test/render-tui.d.ts.map +1 -1
  292. package/dist/src/test/render-tui.js +2 -5
  293. package/dist/src/test/render-tui.js.map +1 -1
  294. package/dist/src/trace/SpanTree.d.ts.map +1 -1
  295. package/dist/src/trace/SpanTree.js +21 -11
  296. package/dist/src/trace/SpanTree.js.map +1 -1
  297. package/dist/src/trace/format-value.d.ts +15 -0
  298. package/dist/src/trace/format-value.d.ts.map +1 -0
  299. package/dist/src/trace/format-value.js +77 -0
  300. package/dist/src/trace/format-value.js.map +1 -0
  301. package/dist/src/trace/index.d.ts.map +1 -1
  302. package/dist/src/trace/index.js.map +1 -1
  303. package/dist/src/trace/location.js +1 -1
  304. package/dist/src/trace/location.js.map +1 -1
  305. package/dist/src/trace/span-processor.d.ts.map +1 -1
  306. package/dist/src/trace/span-processor.js.map +1 -1
  307. package/dist/src/trace/span-state.d.ts +19 -2
  308. package/dist/src/trace/span-state.d.ts.map +1 -1
  309. package/dist/src/trace/span-state.js +62 -31
  310. package/dist/src/trace/span-state.js.map +1 -1
  311. package/dist/src/trace/tui-logger.js.map +1 -1
  312. package/dist/src/utils/border.d.ts +1 -1
  313. package/dist/src/utils/border.d.ts.map +1 -1
  314. package/dist/src/utils/border.js +6 -0
  315. package/dist/src/utils/border.js.map +1 -1
  316. package/dist/src/utils/flex-layout.d.ts +2 -1
  317. package/dist/src/utils/flex-layout.d.ts.map +1 -1
  318. package/dist/src/utils/flex-layout.js +22 -33
  319. package/dist/src/utils/flex-layout.js.map +1 -1
  320. package/dist/src/utils/index.d.ts +1 -1
  321. package/dist/src/utils/index.d.ts.map +1 -1
  322. package/dist/src/utils/index.js +1 -1
  323. package/dist/src/utils/index.js.map +1 -1
  324. package/dist/src/utils/padding.d.ts.map +1 -1
  325. package/dist/src/utils/padding.js.map +1 -1
  326. package/dist/src/utils/styles.d.ts +20 -1
  327. package/dist/src/utils/styles.d.ts.map +1 -1
  328. package/dist/src/utils/styles.js +36 -1
  329. package/dist/src/utils/styles.js.map +1 -1
  330. package/dist/src/visualize/index.d.ts +8 -19
  331. package/dist/src/visualize/index.d.ts.map +1 -1
  332. package/dist/src/visualize/index.js +11 -25
  333. package/dist/src/visualize/index.js.map +1 -1
  334. package/dist/tsconfig.tsbuildinfo +1 -1
  335. package/jsx-dev-runtime.ts +5 -0
  336. package/jsx-runtime.ts +54 -0
  337. package/package.json +124 -92
  338. package/src/codeblock.tsx +34 -34
  339. package/src/components/Divider.tsx +23 -0
  340. package/src/components/Markdown.tsx +380 -0
  341. package/src/components/MultilineTextInput.tsx +749 -0
  342. package/src/components/Overlay.tsx +56 -0
  343. package/src/components/Static.tsx +68 -0
  344. package/src/components/TextInput.tsx +356 -0
  345. package/src/components/index.ts +6 -0
  346. package/src/components/text-editing.ts +464 -0
  347. package/src/console/ConsoleCapture.ts +272 -0
  348. package/src/console/ConsolePopover.tsx +487 -0
  349. package/src/console/clipboard.ts +81 -0
  350. package/src/console/index.ts +42 -0
  351. package/src/console/useConsole.ts +129 -0
  352. package/src/debug/DebugOverlay.ts +557 -0
  353. package/src/debug/DiagnosticsPanel.tsx +27 -27
  354. package/src/dev/Toast.tsx +117 -0
  355. package/src/dev/index.ts +2 -0
  356. package/src/dev.tsx +489 -0
  357. package/src/highlight.ts +46 -46
  358. package/src/hmr-plugin.ts +61 -0
  359. package/src/hooks/index.ts +4 -0
  360. package/src/hooks/use-keyboard.ts +44 -24
  361. package/src/hooks/use-mouse.ts +51 -0
  362. package/src/hooks/use-paste.ts +21 -6
  363. package/src/hooks/use-scroll.ts +386 -0
  364. package/src/hooks/useFrameStats.ts +17 -17
  365. package/src/hosts/base.ts +180 -59
  366. package/src/hosts/box.ts +117 -94
  367. package/src/hosts/canvas.ts +170 -141
  368. package/src/hosts/codeblock.ts +117 -133
  369. package/src/hosts/flex-container.ts +124 -0
  370. package/src/hosts/hstack.ts +11 -59
  371. package/src/hosts/index.ts +24 -14
  372. package/src/hosts/overlay-item.ts +72 -0
  373. package/src/hosts/overlay.ts +125 -0
  374. package/src/hosts/scroll.ts +255 -0
  375. package/src/hosts/single-child.ts +52 -0
  376. package/src/hosts/spacer.ts +30 -26
  377. package/src/hosts/text.ts +198 -164
  378. package/src/hosts/vstack.ts +11 -59
  379. package/src/hosts/zstack.ts +79 -67
  380. package/src/index.ts +44 -19
  381. package/src/inline/index.tsx +123 -123
  382. package/src/motion/color-motion-value.ts +67 -67
  383. package/src/motion/color.test.ts +107 -107
  384. package/src/motion/color.ts +9 -190
  385. package/src/motion/event-emitter.ts +20 -20
  386. package/src/motion/frame.ts +35 -35
  387. package/src/motion/hooks.ts +144 -139
  388. package/src/motion/index.ts +10 -10
  389. package/src/motion/motion-value.test.ts +207 -207
  390. package/src/motion/motion-value.ts +112 -112
  391. package/src/motion/spring-math.ts +88 -83
  392. package/src/motion/types.ts +25 -25
  393. package/src/profiler.ts +50 -50
  394. package/src/reconciler/host-config.ts +152 -174
  395. package/src/reconciler/noop-methods.ts +55 -0
  396. package/src/reconciler/types.ts +112 -46
  397. package/src/remote/Procedures.ts +52 -0
  398. package/src/remote/Router.ts +58 -0
  399. package/src/remote/Server.ts +76 -0
  400. package/src/remote/index.ts +90 -0
  401. package/src/renderer/core/FrameBuilder.ts +49 -0
  402. package/src/renderer/core/RendererState.ts +80 -0
  403. package/src/renderer/core/index.ts +2 -0
  404. package/src/renderer/input/InputProcessor.ts +94 -0
  405. package/src/renderer/input/index.ts +1 -0
  406. package/src/renderer/lifecycle/EventBus.ts +90 -0
  407. package/src/renderer/lifecycle/ResizeManager.ts +65 -0
  408. package/src/renderer/lifecycle/TerminalSetup.ts +105 -0
  409. package/src/renderer/lifecycle/index.ts +3 -0
  410. package/src/renderer/modes/FullscreenRenderer.ts +53 -0
  411. package/src/renderer/modes/InlineRenderer.ts +186 -0
  412. package/src/renderer/modes/RendererMode.ts +46 -0
  413. package/src/renderer/modes/StaticContentRenderer.ts +56 -0
  414. package/src/renderer/modes/index.ts +4 -0
  415. package/src/renderer-context.ts +27 -0
  416. package/src/renderer-types.ts +109 -0
  417. package/src/renderer.ts +392 -642
  418. package/src/test/index.ts +5 -5
  419. package/src/test/mock-streams.ts +115 -115
  420. package/src/test/render-tui.ts +84 -87
  421. package/src/utils/border.ts +79 -73
  422. package/src/utils/flex-layout.ts +80 -93
  423. package/src/utils/index.ts +1 -1
  424. package/src/utils/padding.ts +27 -27
  425. package/src/utils/styles.ts +50 -7
  426. package/src/visualize/index.tsx +225 -240
  427. package/dist/src/output.d.ts +0 -47
  428. package/dist/src/output.d.ts.map +0 -1
  429. package/dist/src/output.js +0 -125
  430. package/dist/src/output.js.map +0 -1
  431. package/dist/src/terminal.d.ts +0 -37
  432. package/dist/src/terminal.d.ts.map +0 -1
  433. package/dist/src/terminal.js +0 -65
  434. package/dist/src/terminal.js.map +0 -1
  435. package/src/output.ts +0 -156
  436. package/src/terminal.ts +0 -67
  437. package/src/trace/SpanTree.tsx +0 -195
  438. package/src/trace/index.tsx +0 -205
  439. package/src/trace/location.ts +0 -90
  440. package/src/trace/span-processor.ts +0 -65
  441. package/src/trace/span-state.ts +0 -286
  442. package/src/trace/tui-logger.ts +0 -72
package/src/test/index.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  export { renderTUI, type RenderTUIOptions, type RenderTUIResult } from "./render-tui.js"
2
2
  export {
3
- MockStdout,
4
- MockStdin,
5
- encodeKey,
6
- stripAnsi,
7
- getVisibleLines,
3
+ MockStdout,
4
+ MockStdin,
5
+ encodeKey,
6
+ stripAnsi,
7
+ getVisibleLines,
8
8
  } from "./mock-streams.js"
@@ -5,62 +5,62 @@ import type { KeyMsg } from "@effect-tui/core"
5
5
  * Mock stdout for testing. Captures all writes and simulates terminal properties.
6
6
  */
7
7
  export class MockStdout extends EventEmitter {
8
- columns: number
9
- rows: number
10
- buf = ""
11
-
12
- constructor(width = 80, height = 24) {
13
- super()
14
- this.columns = width
15
- this.rows = height
16
- }
17
-
18
- write(s: string): boolean {
19
- this.buf += s
20
- return true
21
- }
22
-
23
- /** Clear captured output */
24
- clear(): void {
25
- this.buf = ""
26
- }
27
-
28
- /** Simulate terminal resize */
29
- resize(width: number, height: number): void {
30
- this.columns = width
31
- this.rows = height
32
- this.emit("resize")
33
- }
8
+ columns: number
9
+ rows: number
10
+ buf = ""
11
+
12
+ constructor(width = 80, height = 24) {
13
+ super()
14
+ this.columns = width
15
+ this.rows = height
16
+ }
17
+
18
+ write(s: string): boolean {
19
+ this.buf += s
20
+ return true
21
+ }
22
+
23
+ /** Clear captured output */
24
+ clear(): void {
25
+ this.buf = ""
26
+ }
27
+
28
+ /** Simulate terminal resize */
29
+ resize(width: number, height: number): void {
30
+ this.columns = width
31
+ this.rows = height
32
+ this.emit("resize")
33
+ }
34
34
  }
35
35
 
36
36
  /**
37
37
  * Mock stdin for testing. Simulates TTY input with key event emission.
38
38
  */
39
39
  export class MockStdin extends EventEmitter {
40
- isTTY = true
41
-
42
- setRawMode(_mode: boolean): this {
43
- return this
44
- }
45
-
46
- resume(): this {
47
- return this
48
- }
49
-
50
- pause(): this {
51
- return this
52
- }
53
-
54
- /** Send raw bytes (for testing decodeKeys directly) */
55
- sendRaw(data: Buffer): void {
56
- this.emit("data", data)
57
- }
58
-
59
- /** Send a key by encoding it to bytes */
60
- sendKey(key: KeyMsg): void {
61
- const encoded = encodeKey(key)
62
- this.emit("data", encoded)
63
- }
40
+ isTTY = true
41
+
42
+ setRawMode(_mode: boolean): this {
43
+ return this
44
+ }
45
+
46
+ resume(): this {
47
+ return this
48
+ }
49
+
50
+ pause(): this {
51
+ return this
52
+ }
53
+
54
+ /** Send raw bytes (for testing decodeKeys directly) */
55
+ sendRaw(data: Buffer): void {
56
+ this.emit("data", data)
57
+ }
58
+
59
+ /** Send a key by encoding it to bytes */
60
+ sendKey(key: KeyMsg): void {
61
+ const encoded = encodeKey(key)
62
+ this.emit("data", encoded)
63
+ }
64
64
  }
65
65
 
66
66
  /**
@@ -68,73 +68,73 @@ export class MockStdin extends EventEmitter {
68
68
  * This is the reverse of decodeKeys().
69
69
  */
70
70
  export function encodeKey(key: KeyMsg): Buffer {
71
- const name = key.name
72
- const text = key.text
73
-
74
- // Control keys (Ctrl + printable character)
75
- if (key.ctrl && text) {
76
- const lower = text.toLowerCase()
77
- if (lower === "c") return Buffer.from([0x03])
78
- if (lower === "d") return Buffer.from([0x04])
79
- if (lower === "z") return Buffer.from([0x1a])
80
- if (lower === "w") return Buffer.from([0x17])
81
- // Ctrl+letter = letter code - 0x60
82
- if (text.length === 1) {
83
- const code = lower.charCodeAt(0) - 0x60
84
- if (code >= 1 && code <= 26) return Buffer.from([code])
85
- }
86
- }
87
-
88
- // Special keys (escape sequences)
89
- switch (name) {
90
- case "up":
91
- return Buffer.from([0x1b, 0x5b, 0x41])
92
- case "down":
93
- return Buffer.from([0x1b, 0x5b, 0x42])
94
- case "right":
95
- return Buffer.from([0x1b, 0x5b, 0x43])
96
- case "left":
97
- return Buffer.from([0x1b, 0x5b, 0x44])
98
- case "home":
99
- return Buffer.from([0x1b, 0x5b, 0x48])
100
- case "end":
101
- return Buffer.from([0x1b, 0x5b, 0x46])
102
- case "pageup":
103
- return Buffer.from([0x1b, 0x5b, 0x35, 0x7e])
104
- case "pagedown":
105
- return Buffer.from([0x1b, 0x5b, 0x36, 0x7e])
106
- case "delete":
107
- return Buffer.from([0x1b, 0x5b, 0x33, 0x7e])
108
- case "insert":
109
- return Buffer.from([0x1b, 0x5b, 0x32, 0x7e])
110
- case "escape":
111
- return Buffer.from([0x1b])
112
- case "tab":
113
- return Buffer.from([0x09])
114
- case "enter":
115
- case "return":
116
- return Buffer.from([0x0d])
117
- case "backspace":
118
- return Buffer.from([0x7f])
119
- case "space":
120
- return Buffer.from([0x20])
121
- }
122
-
123
- // Regular character
124
- if (text) {
125
- return Buffer.from(text, "utf8")
126
- }
127
-
128
- // Unknown key, return empty
129
- return Buffer.from([])
71
+ const name = key.name
72
+ const text = key.text
73
+
74
+ // Control keys (Ctrl + printable character)
75
+ if (key.ctrl && text) {
76
+ const lower = text.toLowerCase()
77
+ if (lower === "c") return Buffer.from([0x03])
78
+ if (lower === "d") return Buffer.from([0x04])
79
+ if (lower === "z") return Buffer.from([0x1a])
80
+ if (lower === "w") return Buffer.from([0x17])
81
+ // Ctrl+letter = letter code - 0x60
82
+ if (text.length === 1) {
83
+ const code = lower.charCodeAt(0) - 0x60
84
+ if (code >= 1 && code <= 26) return Buffer.from([code])
85
+ }
86
+ }
87
+
88
+ // Special keys (escape sequences)
89
+ switch (name) {
90
+ case "up":
91
+ return Buffer.from([0x1b, 0x5b, 0x41])
92
+ case "down":
93
+ return Buffer.from([0x1b, 0x5b, 0x42])
94
+ case "right":
95
+ return Buffer.from([0x1b, 0x5b, 0x43])
96
+ case "left":
97
+ return Buffer.from([0x1b, 0x5b, 0x44])
98
+ case "home":
99
+ return Buffer.from([0x1b, 0x5b, 0x48])
100
+ case "end":
101
+ return Buffer.from([0x1b, 0x5b, 0x46])
102
+ case "pageup":
103
+ return Buffer.from([0x1b, 0x5b, 0x35, 0x7e])
104
+ case "pagedown":
105
+ return Buffer.from([0x1b, 0x5b, 0x36, 0x7e])
106
+ case "delete":
107
+ return Buffer.from([0x1b, 0x5b, 0x33, 0x7e])
108
+ case "insert":
109
+ return Buffer.from([0x1b, 0x5b, 0x32, 0x7e])
110
+ case "escape":
111
+ return Buffer.from([0x1b])
112
+ case "tab":
113
+ return Buffer.from([0x09])
114
+ case "enter":
115
+ case "return":
116
+ return Buffer.from([0x0d])
117
+ case "backspace":
118
+ return Buffer.from([0x7f])
119
+ case "space":
120
+ return Buffer.from([0x20])
121
+ }
122
+
123
+ // Regular character
124
+ if (text) {
125
+ return Buffer.from(text, "utf8")
126
+ }
127
+
128
+ // Unknown key, return empty
129
+ return Buffer.from([])
130
130
  }
131
131
 
132
132
  /**
133
133
  * Strip ANSI escape codes from a string for easier assertions.
134
134
  */
135
135
  export function stripAnsi(str: string): string {
136
- // eslint-disable-next-line no-control-regex
137
- return str.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, "").replace(/\x1b\][^\x07]*\x07/g, "")
136
+ // eslint-disable-next-line no-control-regex
137
+ return str.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, "").replace(/\x1b\][^\x07]*\x07/g, "")
138
138
  }
139
139
 
140
140
  /**
@@ -142,8 +142,8 @@ export function stripAnsi(str: string): string {
142
142
  * Removes ANSI codes and splits by newlines.
143
143
  */
144
144
  export function getVisibleLines(output: string): string[] {
145
- const stripped = stripAnsi(output)
146
- // Replace carriage returns with newlines for consistency
147
- const normalized = stripped.replace(/\r\n/g, "\n").replace(/\r/g, "\n")
148
- return normalized.split("\n")
145
+ const stripped = stripAnsi(output)
146
+ // Replace carriage returns with newlines for consistency
147
+ const normalized = stripped.replace(/\r\n/g, "\n").replace(/\r/g, "\n")
148
+ return normalized.split("\n")
149
149
  }
@@ -1,33 +1,33 @@
1
1
  import type { ReactElement } from "react"
2
2
  import type { KeyMsg } from "@effect-tui/core"
3
3
  import { createRenderer, createRoot } from "../renderer.js"
4
- import { flushPassiveEffects, flushSync, discreteUpdates } from "../reconciler/host-config.js"
4
+ import { flushPassiveEffects, flushSync } from "../reconciler/host-config.js"
5
5
  import { MockStdout, MockStdin, stripAnsi, getVisibleLines } from "./mock-streams.js"
6
6
 
7
7
  export interface RenderTUIOptions {
8
- width?: number
9
- height?: number
8
+ width?: number
9
+ height?: number
10
10
  }
11
11
 
12
12
  export interface RenderTUIResult {
13
- /** Get last rendered frame as raw string (includes ANSI codes) */
14
- lastFrameRaw(): string
15
- /** Get last rendered frame with ANSI codes stripped */
16
- lastFrame(): string
17
- /** Get visible text lines from last frame */
18
- lines(): string[]
19
- /** Send a key event */
20
- sendKey(key: KeyMsg): void
21
- /** Trigger a render cycle and process React updates */
22
- flush(): void
23
- /** Unmount the component and stop the renderer */
24
- unmount(): void
25
- /** Access mock stdout for advanced assertions */
26
- stdout: MockStdout
27
- /** Access mock stdin for advanced input simulation */
28
- stdin: MockStdin
29
- /** Resize the terminal */
30
- resize(width: number, height: number): void
13
+ /** Get last rendered frame as raw string (includes ANSI codes) */
14
+ lastFrameRaw(): string
15
+ /** Get last rendered frame with ANSI codes stripped */
16
+ lastFrame(): string
17
+ /** Get visible text lines from last frame */
18
+ lines(): string[]
19
+ /** Send a key event */
20
+ sendKey(key: KeyMsg): void
21
+ /** Trigger a render cycle and process React updates */
22
+ flush(): void
23
+ /** Unmount the component and stop the renderer */
24
+ unmount(): void
25
+ /** Access mock stdout for advanced assertions */
26
+ stdout: MockStdout
27
+ /** Access mock stdin for advanced input simulation */
28
+ stdin: MockStdin
29
+ /** Resize the terminal */
30
+ resize(width: number, height: number): void
31
31
  }
32
32
 
33
33
  /**
@@ -49,70 +49,67 @@ export interface RenderTUIResult {
49
49
  * ```
50
50
  */
51
51
  export function renderTUI(element: ReactElement, options?: RenderTUIOptions): RenderTUIResult {
52
- const width = options?.width ?? 80
53
- const height = options?.height ?? 24
54
-
55
- const stdout = new MockStdout(width, height)
56
- const stdin = new MockStdin()
57
-
58
- const renderer = createRenderer({
59
- stdout: stdout as any,
60
- stdin: stdin as any,
61
- manualMode: true,
62
- skipTerminalSetup: true,
63
- })
64
-
65
- const root = createRoot(renderer)
66
- root.render(element, true) // sync mode
67
-
68
- // Flush effects
69
- flushPassiveEffects()
70
-
71
- // Initial render
72
- renderer.flush()
73
-
74
- const flush = () => {
75
- // Flush React updates synchronously
76
- flushSync(() => {})
77
- flushPassiveEffects()
78
- // Clear buffer before re-render to get clean frame
79
- stdout.clear()
80
- renderer.requestRender()
81
- renderer.flush()
82
- }
83
-
84
- return {
85
- lastFrameRaw() {
86
- return stdout.buf
87
- },
88
-
89
- lastFrame() {
90
- return stripAnsi(stdout.buf)
91
- },
92
-
93
- lines() {
94
- return getVisibleLines(stdout.buf)
95
- },
96
-
97
- sendKey(key: KeyMsg) {
98
- // Use discreteUpdates to ensure React processes state updates synchronously
99
- discreteUpdates(() => {
100
- stdin.sendKey(key)
101
- })
102
- },
103
-
104
- flush,
105
-
106
- unmount() {
107
- root.unmount()
108
- },
109
-
110
- stdout,
111
- stdin,
112
-
113
- resize(w: number, h: number) {
114
- stdout.resize(w, h)
115
- flush()
116
- },
117
- }
52
+ const width = options?.width ?? 80
53
+ const height = options?.height ?? 24
54
+
55
+ const stdout = new MockStdout(width, height)
56
+ const stdin = new MockStdin()
57
+
58
+ const renderer = createRenderer({
59
+ stdout: stdout as any,
60
+ stdin: stdin as any,
61
+ manualMode: true,
62
+ skipTerminalSetup: true,
63
+ })
64
+
65
+ const root = createRoot(renderer)
66
+ root.render(element, true) // sync mode
67
+
68
+ // Flush effects
69
+ flushPassiveEffects()
70
+
71
+ // Initial render
72
+ renderer.flush()
73
+
74
+ const flush = () => {
75
+ // Flush React updates synchronously
76
+ flushSync(() => {})
77
+ flushPassiveEffects()
78
+ // Clear buffer before re-render to get clean frame
79
+ stdout.clear()
80
+ renderer.requestRender()
81
+ renderer.flush()
82
+ }
83
+
84
+ return {
85
+ lastFrameRaw() {
86
+ return stdout.buf
87
+ },
88
+
89
+ lastFrame() {
90
+ return stripAnsi(stdout.buf)
91
+ },
92
+
93
+ lines() {
94
+ return getVisibleLines(stdout.buf)
95
+ },
96
+
97
+ sendKey(key: KeyMsg) {
98
+ stdin.sendKey(key)
99
+ },
100
+
101
+ flush,
102
+
103
+ unmount() {
104
+ root.unmount()
105
+ },
106
+
107
+ stdout,
108
+ stdin,
109
+
110
+ resize(w: number, h: number) {
111
+ stdout.resize(w, h)
112
+ flush()
113
+ },
114
+ }
118
115
  }
@@ -4,15 +4,15 @@
4
4
 
5
5
  import type { CellBuffer } from "@effect-tui/core"
6
6
 
7
- export type BorderKind = "none" | "rounded" | "square" | "ascii"
7
+ export type BorderKind = "none" | "rounded" | "square" | "double" | "heavy" | "dashed" | "ascii"
8
8
 
9
9
  export interface BorderChars {
10
- tl: string // top-left
11
- tr: string // top-right
12
- bl: string // bottom-left
13
- br: string // bottom-right
14
- h: string // horizontal
15
- v: string // vertical
10
+ tl: string // top-left
11
+ tr: string // top-right
12
+ bl: string // bottom-left
13
+ br: string // bottom-right
14
+ h: string // horizontal
15
+ v: string // vertical
16
16
  }
17
17
 
18
18
  /**
@@ -20,23 +20,29 @@ export interface BorderChars {
20
20
  * Returns empty strings for "none" (drawing code should skip when border is "none").
21
21
  */
22
22
  export function borderChars(kind: BorderKind): BorderChars {
23
- switch (kind) {
24
- case "rounded":
25
- return { tl: "╭", tr: "╮", bl: "╰", br: "╯", h: "─", v: "│" }
26
- case "square":
27
- return { tl: "┌", tr: "┐", bl: "└", br: "┘", h: "─", v: "│" }
28
- case "ascii":
29
- return { tl: "+", tr: "+", bl: "+", br: "+", h: "-", v: "|" }
30
- default:
31
- return { tl: "", tr: "", bl: "", br: "", h: "", v: "" }
32
- }
23
+ switch (kind) {
24
+ case "rounded":
25
+ return { tl: "╭", tr: "╮", bl: "╰", br: "╯", h: "─", v: "│" }
26
+ case "square":
27
+ return { tl: "┌", tr: "┐", bl: "└", br: "┘", h: "─", v: "│" }
28
+ case "double":
29
+ return { tl: "", tr: "", bl: "", br: "", h: "", v: "" }
30
+ case "heavy":
31
+ return { tl: "", tr: "", bl: "", br: "", h: "", v: "" }
32
+ case "dashed":
33
+ return { tl: "┌", tr: "┐", bl: "└", br: "┘", h: "┄", v: "┆" }
34
+ case "ascii":
35
+ return { tl: "+", tr: "+", bl: "+", br: "+", h: "-", v: "|" }
36
+ default:
37
+ return { tl: "", tr: "", bl: "", br: "", h: "", v: "" }
38
+ }
33
39
  }
34
40
 
35
41
  export interface ClipRect {
36
- ox: number
37
- oy: number
38
- w: number
39
- h: number
42
+ ox: number
43
+ oy: number
44
+ w: number
45
+ h: number
40
46
  }
41
47
 
42
48
  /**
@@ -45,64 +51,64 @@ export interface ClipRect {
45
51
  * If clip is not provided, draws the full border (for box).
46
52
  */
47
53
  export function drawBorder(
48
- buffer: CellBuffer,
49
- x: number,
50
- y: number,
51
- w: number,
52
- h: number,
53
- chars: BorderChars,
54
- style: number,
55
- clip?: ClipRect,
54
+ buffer: CellBuffer,
55
+ x: number,
56
+ y: number,
57
+ w: number,
58
+ h: number,
59
+ chars: BorderChars,
60
+ style: number,
61
+ clip?: ClipRect,
56
62
  ): void {
57
- if (w < 2 || h < 2) return
63
+ if (w < 2 || h < 2) return
58
64
 
59
- const tlcp = chars.tl.codePointAt(0)!
60
- const trcp = chars.tr.codePointAt(0)!
61
- const blcp = chars.bl.codePointAt(0)!
62
- const brcp = chars.br.codePointAt(0)!
63
- const hcp = chars.h.codePointAt(0)!
64
- const vcp = chars.v.codePointAt(0)!
65
+ const tlcp = chars.tl.codePointAt(0)!
66
+ const trcp = chars.tr.codePointAt(0)!
67
+ const blcp = chars.bl.codePointAt(0)!
68
+ const brcp = chars.br.codePointAt(0)!
69
+ const hcp = chars.h.codePointAt(0)!
70
+ const vcp = chars.v.codePointAt(0)!
65
71
 
66
- if (clip) {
67
- // Clipped drawing (for canvas)
68
- const { ox, oy, w: cw, h: ch } = clip
69
- const inBounds = (px: number, py: number) => px >= ox && px < ox + cw && py >= oy && py < oy + ch
72
+ if (clip) {
73
+ // Clipped drawing (for canvas)
74
+ const { ox, oy, w: cw, h: ch } = clip
75
+ const inBounds = (px: number, py: number) => px >= ox && px < ox + cw && py >= oy && py < oy + ch
70
76
 
71
- // Corners
72
- if (inBounds(x, y)) buffer.drawCP(x, y, tlcp, style)
73
- if (inBounds(x + w - 1, y)) buffer.drawCP(x + w - 1, y, trcp, style)
74
- if (inBounds(x, y + h - 1)) buffer.drawCP(x, y + h - 1, blcp, style)
75
- if (inBounds(x + w - 1, y + h - 1)) buffer.drawCP(x + w - 1, y + h - 1, brcp, style)
77
+ // Corners
78
+ if (inBounds(x, y)) buffer.drawCP(x, y, tlcp, style)
79
+ if (inBounds(x + w - 1, y)) buffer.drawCP(x + w - 1, y, trcp, style)
80
+ if (inBounds(x, y + h - 1)) buffer.drawCP(x, y + h - 1, blcp, style)
81
+ if (inBounds(x + w - 1, y + h - 1)) buffer.drawCP(x + w - 1, y + h - 1, brcp, style)
76
82
 
77
- // Horizontal lines
78
- for (let col = 1; col < w - 1; col++) {
79
- const xx = x + col
80
- if (inBounds(xx, y)) buffer.drawCP(xx, y, hcp, style)
81
- if (inBounds(xx, y + h - 1)) buffer.drawCP(xx, y + h - 1, hcp, style)
82
- }
83
+ // Horizontal lines
84
+ for (let col = 1; col < w - 1; col++) {
85
+ const xx = x + col
86
+ if (inBounds(xx, y)) buffer.drawCP(xx, y, hcp, style)
87
+ if (inBounds(xx, y + h - 1)) buffer.drawCP(xx, y + h - 1, hcp, style)
88
+ }
83
89
 
84
- // Vertical lines
85
- for (let row = 1; row < h - 1; row++) {
86
- const yy = y + row
87
- if (inBounds(x, yy)) buffer.drawCP(x, yy, vcp, style)
88
- if (inBounds(x + w - 1, yy)) buffer.drawCP(x + w - 1, yy, vcp, style)
89
- }
90
- } else {
91
- // Full drawing (for box)
92
- // Corners
93
- buffer.drawCP(x, y, tlcp, style)
94
- buffer.drawCP(x + w - 1, y, trcp, style)
95
- buffer.drawCP(x, y + h - 1, blcp, style)
96
- buffer.drawCP(x + w - 1, y + h - 1, brcp, style)
90
+ // Vertical lines
91
+ for (let row = 1; row < h - 1; row++) {
92
+ const yy = y + row
93
+ if (inBounds(x, yy)) buffer.drawCP(x, yy, vcp, style)
94
+ if (inBounds(x + w - 1, yy)) buffer.drawCP(x + w - 1, yy, vcp, style)
95
+ }
96
+ } else {
97
+ // Full drawing (for box)
98
+ // Corners
99
+ buffer.drawCP(x, y, tlcp, style)
100
+ buffer.drawCP(x + w - 1, y, trcp, style)
101
+ buffer.drawCP(x, y + h - 1, blcp, style)
102
+ buffer.drawCP(x + w - 1, y + h - 1, brcp, style)
97
103
 
98
- // Horizontal lines
99
- buffer.fillRect(x + 1, y, w - 2, 1, hcp, style)
100
- buffer.fillRect(x + 1, y + h - 1, w - 2, 1, hcp, style)
104
+ // Horizontal lines
105
+ buffer.fillRect(x + 1, y, w - 2, 1, hcp, style)
106
+ buffer.fillRect(x + 1, y + h - 1, w - 2, 1, hcp, style)
101
107
 
102
- // Vertical lines
103
- for (let yy = y + 1; yy < y + h - 1; yy++) {
104
- buffer.drawCP(x, yy, vcp, style)
105
- buffer.drawCP(x + w - 1, yy, vcp, style)
106
- }
107
- }
108
+ // Vertical lines
109
+ for (let yy = y + 1; yy < y + h - 1; yy++) {
110
+ buffer.drawCP(x, yy, vcp, style)
111
+ buffer.drawCP(x + w - 1, yy, vcp, style)
112
+ }
113
+ }
108
114
  }