@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
@@ -1,3 +1,5 @@
1
1
  export { useKeyboard } from "./use-keyboard.js";
2
+ export { useMouse } from "./use-mouse.js";
2
3
  export { usePaste } from "./use-paste.js";
4
+ export { useScroll } from "./use-scroll.js";
3
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA"}
@@ -13,6 +13,17 @@ export type UseKeyboardOptions = {
13
13
  /**
14
14
  * Subscribe to keyboard events.
15
15
  * Handler is called for every key press while mounted.
16
+ *
17
+ * Uses a ref internally so you don't need useCallback - the handler
18
+ * always sees the latest props/state without re-subscribing.
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * // No useCallback needed - just pass your handler directly
23
+ * useKeyboard((key) => {
24
+ * if (key.name === "enter") submitForm(currentValue)
25
+ * })
26
+ * ```
16
27
  */
17
28
  export declare function useKeyboard(handler: (key: KeyMsg) => void, opts?: UseKeyboardOptions): void;
18
29
  //# sourceMappingURL=use-keyboard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-keyboard.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-keyboard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAG9C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,0FAA0F;IAC1F,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAA;IAC9C,qEAAqE;IACrE,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;IACjC;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAA;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAgB3F"}
1
+ {"version":3,"file":"use-keyboard.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-keyboard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAG9C,MAAM,MAAM,kBAAkB,GAAG;IAChC,0FAA0F;IAC1F,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAA;IAC9C,qEAAqE;IACrE,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;IACjC;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;CACzB,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAyB3F"}
@@ -1,26 +1,44 @@
1
- import { useEffect } from "react";
1
+ import { useEffect, useRef } from "react";
2
2
  import { useRenderer } from "../renderer.js";
3
3
  /**
4
4
  * Subscribe to keyboard events.
5
5
  * Handler is called for every key press while mounted.
6
+ *
7
+ * Uses a ref internally so you don't need useCallback - the handler
8
+ * always sees the latest props/state without re-subscribing.
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * // No useCallback needed - just pass your handler directly
13
+ * useKeyboard((key) => {
14
+ * if (key.name === "enter") submitForm(currentValue)
15
+ * })
16
+ * ```
6
17
  */
7
18
  export function useKeyboard(handler, opts) {
8
19
  const renderer = useRenderer();
9
20
  const phase = opts?.phase ?? "press";
10
21
  const filter = opts?.filter;
11
22
  const stopPropagation = opts?.stopPropagation ?? false;
23
+ // Store handler in ref so we always call the latest version
24
+ // without needing to re-subscribe on every render
25
+ const handlerRef = useRef(handler);
26
+ handlerRef.current = handler;
27
+ // Store filter in ref too for same reason
28
+ const filterRef = useRef(filter);
29
+ filterRef.current = filter;
12
30
  useEffect(() => {
13
31
  const wrapped = (key) => {
14
32
  const keyPhase = key.phase ?? "press";
15
33
  if (phase !== "any" && phase !== keyPhase)
16
34
  return;
17
- if (filter && !filter(key))
35
+ if (filterRef.current && !filterRef.current(key))
18
36
  return;
19
37
  if (stopPropagation && key.preventDefault)
20
38
  key.preventDefault();
21
- handler(key);
39
+ handlerRef.current(key);
22
40
  };
23
41
  return renderer.onKey(wrapped);
24
- }, [renderer, handler, phase, filter, stopPropagation]);
42
+ }, [renderer, phase, stopPropagation]);
25
43
  }
26
44
  //# sourceMappingURL=use-keyboard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-keyboard.js","sourceRoot":"","sources":["../../../src/hooks/use-keyboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAc5C;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,OAA8B,EAAE,IAAyB;IACnF,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,OAAO,CAAA;IACpC,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,CAAA;IAC3B,MAAM,eAAe,GAAG,IAAI,EAAE,eAAe,IAAI,KAAK,CAAA;IAEtD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE;YAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,IAAI,OAAO,CAAA;YACrC,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,QAAQ;gBAAE,OAAM;YACjD,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;gBAAE,OAAM;YAClC,IAAI,eAAe,IAAI,GAAG,CAAC,cAAc;gBAAE,GAAG,CAAC,cAAc,EAAE,CAAA;YAC/D,OAAO,CAAC,GAAG,CAAC,CAAA;QACd,CAAC,CAAA;QACD,OAAO,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAA;AACzD,CAAC"}
1
+ {"version":3,"file":"use-keyboard.js","sourceRoot":"","sources":["../../../src/hooks/use-keyboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAc5C;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,WAAW,CAAC,OAA8B,EAAE,IAAyB;IACpF,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,OAAO,CAAA;IACpC,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,CAAA;IAC3B,MAAM,eAAe,GAAG,IAAI,EAAE,eAAe,IAAI,KAAK,CAAA;IAEtD,4DAA4D;IAC5D,kDAAkD;IAClD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IAClC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;IAE5B,0CAA0C;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IAChC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAA;IAE1B,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE;YAC/B,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,IAAI,OAAO,CAAA;YACrC,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,QAAQ;gBAAE,OAAM;YACjD,IAAI,SAAS,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,OAAM;YACxD,IAAI,eAAe,IAAI,GAAG,CAAC,cAAc;gBAAE,GAAG,CAAC,cAAc,EAAE,CAAA;YAC/D,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACxB,CAAC,CAAA;QACD,OAAO,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC/B,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAA;AACvC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { MouseMsg, MouseButton } from "@effect-tui/core";
2
+ export type UseMouseOptions = {
3
+ /** Filter by action type */
4
+ action?: "press" | "release" | "drag" | "move" | "any";
5
+ /** Filter by button */
6
+ button?: MouseButton | MouseButton[];
7
+ };
8
+ /**
9
+ * Subscribe to mouse events.
10
+ * Handler is called for mouse clicks, drags, and scroll while mounted.
11
+ *
12
+ * Uses a ref internally so you don't need useCallback - the handler
13
+ * always sees the latest props/state without re-subscribing.
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * // No useCallback needed - just pass your handler directly
18
+ * useMouse((mouse) => {
19
+ * if (mouse.action === "press") handleClick(mouse.x, mouse.y)
20
+ * })
21
+ * ```
22
+ */
23
+ export declare function useMouse(handler: (mouse: MouseMsg) => void, opts?: UseMouseOptions): void;
24
+ //# sourceMappingURL=use-mouse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-mouse.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-mouse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAG7D,MAAM,MAAM,eAAe,GAAG;IAC7B,4BAA4B;IAC5B,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAA;IACtD,uBAAuB;IACvB,MAAM,CAAC,EAAE,WAAW,GAAG,WAAW,EAAE,CAAA;CACpC,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,IAAI,CAwBzF"}
@@ -0,0 +1,41 @@
1
+ import { useEffect, useRef } from "react";
2
+ import { useRenderer } from "../renderer.js";
3
+ /**
4
+ * Subscribe to mouse events.
5
+ * Handler is called for mouse clicks, drags, and scroll while mounted.
6
+ *
7
+ * Uses a ref internally so you don't need useCallback - the handler
8
+ * always sees the latest props/state without re-subscribing.
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * // No useCallback needed - just pass your handler directly
13
+ * useMouse((mouse) => {
14
+ * if (mouse.action === "press") handleClick(mouse.x, mouse.y)
15
+ * })
16
+ * ```
17
+ */
18
+ export function useMouse(handler, opts) {
19
+ const renderer = useRenderer();
20
+ const action = opts?.action ?? "any";
21
+ const button = opts?.button;
22
+ // Store handler in ref so we always call the latest version
23
+ const handlerRef = useRef(handler);
24
+ handlerRef.current = handler;
25
+ useEffect(() => {
26
+ const wrapped = (mouse) => {
27
+ // Filter by action
28
+ if (action !== "any" && action !== mouse.action)
29
+ return;
30
+ // Filter by button
31
+ if (button !== undefined) {
32
+ const buttons = Array.isArray(button) ? button : [button];
33
+ if (!buttons.includes(mouse.button))
34
+ return;
35
+ }
36
+ handlerRef.current(mouse);
37
+ };
38
+ return renderer.onMouse(wrapped);
39
+ }, [renderer, action, button]);
40
+ }
41
+ //# sourceMappingURL=use-mouse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-mouse.js","sourceRoot":"","sources":["../../../src/hooks/use-mouse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAS5C;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAkC,EAAE,IAAsB;IAClF,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,KAAK,CAAA;IACpC,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,CAAA;IAE3B,4DAA4D;IAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IAClC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;IAE5B,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,OAAO,GAAG,CAAC,KAAe,EAAE,EAAE;YACnC,mBAAmB;YACnB,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,KAAK,CAAC,MAAM;gBAAE,OAAM;YAEvD,mBAAmB;YACnB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;gBACzD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;oBAAE,OAAM;YAC5C,CAAC;YAED,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC1B,CAAC,CAAA;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AAC/B,CAAC"}
@@ -1,5 +1,16 @@
1
1
  /**
2
2
  * Subscribe to bracketed paste events (if supported by renderer/terminal).
3
+ *
4
+ * Uses a ref internally so you don't need useCallback - the handler
5
+ * always sees the latest props/state without re-subscribing.
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * // No useCallback needed - just pass your handler directly
10
+ * usePaste((text) => {
11
+ * insertText(text, cursorPosition)
12
+ * })
13
+ * ```
3
14
  */
4
15
  export declare function usePaste(handler: (text: string) => void): void;
5
16
  //# sourceMappingURL=use-paste.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-paste.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-paste.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAO9D"}
1
+ {"version":3,"file":"use-paste.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-paste.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAW9D"}
@@ -1,14 +1,28 @@
1
- import { useEffect } from "react";
1
+ import { useEffect, useRef } from "react";
2
2
  import { useRenderer } from "../renderer.js";
3
3
  /**
4
4
  * Subscribe to bracketed paste events (if supported by renderer/terminal).
5
+ *
6
+ * Uses a ref internally so you don't need useCallback - the handler
7
+ * always sees the latest props/state without re-subscribing.
8
+ *
9
+ * @example
10
+ * ```tsx
11
+ * // No useCallback needed - just pass your handler directly
12
+ * usePaste((text) => {
13
+ * insertText(text, cursorPosition)
14
+ * })
15
+ * ```
5
16
  */
6
17
  export function usePaste(handler) {
7
18
  const renderer = useRenderer();
19
+ // Store handler in ref so we always call the latest version
20
+ const handlerRef = useRef(handler);
21
+ handlerRef.current = handler;
8
22
  useEffect(() => {
9
23
  if (!renderer.onPaste)
10
24
  return;
11
- return renderer.onPaste(handler);
12
- }, [renderer, handler]);
25
+ return renderer.onPaste((text) => handlerRef.current(text));
26
+ }, [renderer]);
13
27
  }
14
28
  //# sourceMappingURL=use-paste.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-paste.js","sourceRoot":"","sources":["../../../src/hooks/use-paste.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,OAA+B;IACtD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAE9B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,OAAM;QAC7B,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;AACzB,CAAC"}
1
+ {"version":3,"file":"use-paste.js","sourceRoot":"","sources":["../../../src/hooks/use-paste.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,QAAQ,CAAC,OAA+B;IACvD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAE9B,4DAA4D;IAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IAClC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;IAE5B,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,OAAM;QAC7B,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAC5D,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;AACf,CAAC"}
@@ -0,0 +1,79 @@
1
+ export interface ScrollState {
2
+ /** Current scroll offset (pixels from start) */
3
+ offset: number;
4
+ /** Maximum scroll offset */
5
+ maxOffset: number;
6
+ /** Viewport height (or width for horizontal) */
7
+ viewportSize: number;
8
+ /** Total content size */
9
+ contentSize: number;
10
+ /** Whether we're at the start edge */
11
+ atStart: boolean;
12
+ /** Whether we're at the end edge */
13
+ atEnd: boolean;
14
+ }
15
+ export interface UseScrollOptions {
16
+ /** Scroll axis: "vertical" (default) or "horizontal" */
17
+ axis?: "vertical" | "horizontal";
18
+ /** Initial scroll offset */
19
+ initialOffset?: number;
20
+ /** Enable keyboard navigation (default: true) */
21
+ enableKeyboard?: boolean;
22
+ /** Enable mouse wheel (default: true) */
23
+ enableMouseWheel?: boolean;
24
+ /** Enable scroll acceleration (default: true) */
25
+ enableAcceleration?: boolean;
26
+ /** Sticky scroll - auto-scroll to end when content grows (default: false) */
27
+ sticky?: boolean;
28
+ /** Scroll speed for arrow keys (pixels, default: 1) */
29
+ arrowSpeed?: number;
30
+ /** Scroll speed for page up/down (fraction of viewport, default: 0.5) */
31
+ pageSpeed?: number;
32
+ }
33
+ export interface UseScrollReturn {
34
+ /** Current scroll state */
35
+ state: ScrollState;
36
+ /** Set scroll offset directly */
37
+ setOffset: (offset: number) => void;
38
+ /** Scroll by delta pixels */
39
+ scrollBy: (delta: number) => void;
40
+ /** Scroll to start */
41
+ scrollToStart: () => void;
42
+ /** Scroll to end */
43
+ scrollToEnd: () => void;
44
+ /**
45
+ * Scroll to make a position visible in the viewport.
46
+ * Useful for keeping a selected item in view.
47
+ * @param position - The position (row/col index or pixel offset)
48
+ * @param itemSize - Size of each item (default: 1 for row-based lists)
49
+ * @param padding - Extra padding around the item (default: 0)
50
+ */
51
+ scrollToVisible: (position: number, itemSize?: number, padding?: number) => void;
52
+ /** Props to spread on <scroll> element */
53
+ scrollProps: {
54
+ offset: number;
55
+ axis: "vertical" | "horizontal";
56
+ onContentSize: (width: number, height: number) => void;
57
+ onViewportSize: (width: number, height: number) => void;
58
+ };
59
+ }
60
+ /**
61
+ * Hook for managing scroll state with keyboard/mouse input.
62
+ *
63
+ * @example
64
+ * ```tsx
65
+ * function ScrollableList({ items }) {
66
+ * const { state, scrollProps } = useScroll({ sticky: true })
67
+ *
68
+ * return (
69
+ * <scroll {...scrollProps}>
70
+ * <vstack>
71
+ * {items.map(item => <text key={item.id}>{item.text}</text>)}
72
+ * </vstack>
73
+ * </scroll>
74
+ * )
75
+ * }
76
+ * ```
77
+ */
78
+ export declare function useScroll(options?: UseScrollOptions): UseScrollReturn;
79
+ //# sourceMappingURL=use-scroll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-scroll.d.ts","sourceRoot":"","sources":["../../../src/hooks/use-scroll.ts"],"names":[],"mappings":"AAqFA,MAAM,WAAW,WAAW;IAC3B,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAA;IACd,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAA;IACpB,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAA;IAChB,oCAAoC;IACpC,KAAK,EAAE,OAAO,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAChC,wDAAwD;IACxD,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY,CAAA;IAChC,4BAA4B;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,iDAAiD;IACjD,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,6EAA6E;IAC7E,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,eAAe;IAC/B,2BAA2B;IAC3B,KAAK,EAAE,WAAW,CAAA;IAClB,iCAAiC;IACjC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,6BAA6B;IAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,sBAAsB;IACtB,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,oBAAoB;IACpB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB;;;;;;OAMG;IACH,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAChF,0CAA0C;IAC1C,WAAW,EAAE;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,EAAE,UAAU,GAAG,YAAY,CAAA;QAC/B,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;QACtD,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;KACvD,CAAA;CACD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,eAAe,CA4NzE"}
@@ -0,0 +1,239 @@
1
+ // use-scroll.ts — Hook for managing scroll state with keyboard/mouse input
2
+ import { useState, useCallback, useRef, useMemo, useLayoutEffect } from "react";
3
+ import { useKeyboard } from "./use-keyboard.js";
4
+ import { useTerminalSize } from "../renderer.js";
5
+ /**
6
+ * macOS-inspired scroll acceleration.
7
+ * Tracks velocity via moving window of tick intervals.
8
+ * Fast scrolling gets progressively faster.
9
+ */
10
+ class MacOSScrollAccel {
11
+ opts;
12
+ lastTickTime = 0;
13
+ velocityHistory = [];
14
+ historySize = 3;
15
+ streakTimeout = 150;
16
+ // Some terminals send duplicate ticks ~4ms apart (Ghostty workaround)
17
+ minTickInterval = 6;
18
+ constructor(opts = {}) {
19
+ this.opts = opts;
20
+ }
21
+ tick(now = Date.now()) {
22
+ const A = this.opts.A ?? 0.8;
23
+ const tau = this.opts.tau ?? 3;
24
+ const maxMultiplier = this.opts.maxMultiplier ?? 6;
25
+ const dt = this.lastTickTime ? now - this.lastTickTime : Infinity;
26
+ // Reset if too much time passed
27
+ if (dt === Infinity || dt > this.streakTimeout) {
28
+ this.lastTickTime = now;
29
+ this.velocityHistory = [];
30
+ return 1;
31
+ }
32
+ // Ignore duplicate ticks (terminal quirks)
33
+ if (dt < this.minTickInterval) {
34
+ return 1;
35
+ }
36
+ this.lastTickTime = now;
37
+ this.velocityHistory.push(dt);
38
+ if (this.velocityHistory.length > this.historySize) {
39
+ this.velocityHistory.shift();
40
+ }
41
+ // Calculate average interval (lower = faster scrolling)
42
+ const avgInterval = this.velocityHistory.reduce((a, b) => a + b, 0) / this.velocityHistory.length;
43
+ // Convert to velocity: faster ticks = higher velocity
44
+ const referenceInterval = 100;
45
+ const velocity = referenceInterval / avgInterval;
46
+ // Apply exponential curve
47
+ const x = velocity / tau;
48
+ const multiplier = 1 + A * (Math.exp(x) - 1);
49
+ return Math.min(multiplier, maxMultiplier);
50
+ }
51
+ reset() {
52
+ this.lastTickTime = 0;
53
+ this.velocityHistory = [];
54
+ }
55
+ }
56
+ /**
57
+ * Hook for managing scroll state with keyboard/mouse input.
58
+ *
59
+ * @example
60
+ * ```tsx
61
+ * function ScrollableList({ items }) {
62
+ * const { state, scrollProps } = useScroll({ sticky: true })
63
+ *
64
+ * return (
65
+ * <scroll {...scrollProps}>
66
+ * <vstack>
67
+ * {items.map(item => <text key={item.id}>{item.text}</text>)}
68
+ * </vstack>
69
+ * </scroll>
70
+ * )
71
+ * }
72
+ * ```
73
+ */
74
+ export function useScroll(options = {}) {
75
+ const { axis = "vertical", initialOffset = 0, enableKeyboard = true, enableMouseWheel = true, enableAcceleration = true, sticky = false, arrowSpeed = 1, pageSpeed = 0.5, } = options;
76
+ const { width: termWidth, height: termHeight } = useTerminalSize();
77
+ // Scroll state
78
+ const [offset, setOffsetRaw] = useState(initialOffset);
79
+ const [contentSize, setContentSize] = useState(0);
80
+ // Use terminal size as initial estimate, but scroll component will report actual size
81
+ const [viewportSize, setViewportSize] = useState(axis === "vertical" ? termHeight : termWidth);
82
+ // Refs for sticky scroll behavior
83
+ const wasAtEndRef = useRef(sticky);
84
+ const prevContentSizeRef = useRef(0);
85
+ // Scroll acceleration
86
+ const accel = useMemo(() => (enableAcceleration ? new MacOSScrollAccel() : { tick: () => 1, reset: () => { } }), [enableAcceleration]);
87
+ // Fractional accumulator for smooth sub-pixel scrolling
88
+ const accumulatorRef = useRef(0);
89
+ // Ref for scrollToVisible so it doesn't change on every scroll
90
+ const offsetRef = useRef(offset);
91
+ offsetRef.current = offset;
92
+ // Calculate derived state
93
+ const maxOffset = Math.max(0, contentSize - viewportSize);
94
+ const atStart = offset <= 0;
95
+ const atEnd = offset >= maxOffset;
96
+ // Clamp and set offset
97
+ const setOffset = useCallback((newOffset) => {
98
+ const clamped = Math.max(0, Math.min(maxOffset, newOffset));
99
+ setOffsetRaw(clamped);
100
+ // Track if we're at end for sticky behavior
101
+ wasAtEndRef.current = clamped >= maxOffset - 1;
102
+ }, [maxOffset]);
103
+ // Scroll by delta with accumulator for fractional scrolling
104
+ const scrollBy = useCallback((delta) => {
105
+ accumulatorRef.current += delta;
106
+ const integerDelta = Math.trunc(accumulatorRef.current);
107
+ if (integerDelta !== 0) {
108
+ setOffset(offset + integerDelta);
109
+ accumulatorRef.current -= integerDelta;
110
+ }
111
+ }, [offset, setOffset]);
112
+ const scrollToStart = useCallback(() => {
113
+ setOffset(0);
114
+ accumulatorRef.current = 0;
115
+ accel.reset();
116
+ }, [setOffset, accel]);
117
+ const scrollToEnd = useCallback(() => {
118
+ setOffset(maxOffset);
119
+ accumulatorRef.current = 0;
120
+ accel.reset();
121
+ }, [setOffset, maxOffset, accel]);
122
+ // Handle content size changes (for sticky scroll)
123
+ const handleContentSize = useCallback((width, height) => {
124
+ const newSize = axis === "vertical" ? height : width;
125
+ setContentSize(newSize);
126
+ prevContentSizeRef.current = newSize;
127
+ }, [axis]);
128
+ // Synchronous sticky scroll: snap to end when content grows
129
+ // useLayoutEffect runs synchronously after React commit but before paint
130
+ useLayoutEffect(() => {
131
+ if (!sticky)
132
+ return;
133
+ const newMaxOffset = Math.max(0, contentSize - viewportSize);
134
+ if (wasAtEndRef.current && contentSize > 0) {
135
+ setOffsetRaw(newMaxOffset);
136
+ }
137
+ }, [sticky, contentSize, viewportSize]);
138
+ // Handle viewport size changes (reported by scroll component)
139
+ const handleViewportSize = useCallback((width, height) => {
140
+ const newSize = axis === "vertical" ? height : width;
141
+ setViewportSize(newSize);
142
+ }, [axis]);
143
+ // Keyboard handler
144
+ const handleKey = useCallback((key) => {
145
+ // Mouse wheel comes as pageup/pagedown with meta=true
146
+ // Handle separately from keyboard since enableKeyboard shouldn't disable mouse
147
+ if (key.meta && enableMouseWheel && (key.name === "pageup" || key.name === "pagedown")) {
148
+ const multiplier = accel.tick();
149
+ const delta = Math.ceil(arrowSpeed * multiplier);
150
+ scrollBy(key.name === "pageup" ? -delta : delta);
151
+ return;
152
+ }
153
+ if (!enableKeyboard)
154
+ return;
155
+ const isVertical = axis === "vertical";
156
+ const upKey = isVertical ? "up" : "left";
157
+ const downKey = isVertical ? "down" : "right";
158
+ switch (key.name) {
159
+ case upKey:
160
+ scrollBy(-arrowSpeed);
161
+ break;
162
+ case downKey:
163
+ scrollBy(arrowSpeed);
164
+ break;
165
+ case "pageup":
166
+ scrollBy(-Math.floor(viewportSize * pageSpeed));
167
+ break;
168
+ case "pagedown":
169
+ scrollBy(Math.floor(viewportSize * pageSpeed));
170
+ break;
171
+ case "home":
172
+ scrollToStart();
173
+ break;
174
+ case "end":
175
+ scrollToEnd();
176
+ break;
177
+ }
178
+ }, [
179
+ enableKeyboard,
180
+ axis,
181
+ arrowSpeed,
182
+ pageSpeed,
183
+ viewportSize,
184
+ enableMouseWheel,
185
+ accel,
186
+ scrollBy,
187
+ scrollToStart,
188
+ scrollToEnd,
189
+ ]);
190
+ useKeyboard(handleKey);
191
+ // Scroll to make a position visible (for keeping selection in view)
192
+ // Uses refs to avoid changing on every scroll - only triggers when selection changes
193
+ const scrollToVisible = useCallback((position, itemSize = 1, padding = 0) => {
194
+ const currentOffset = offsetRef.current;
195
+ const itemStart = position * itemSize;
196
+ const itemEnd = itemStart + itemSize;
197
+ // If item is above viewport, scroll up to show it
198
+ if (itemStart < currentOffset + padding) {
199
+ setOffset(Math.max(0, itemStart - padding));
200
+ }
201
+ // If item is below viewport, scroll down to show it
202
+ else if (itemEnd > currentOffset + viewportSize - padding) {
203
+ const currentMaxOffset = Math.max(0, contentSize - viewportSize);
204
+ setOffset(Math.min(currentMaxOffset, itemEnd - viewportSize + padding));
205
+ }
206
+ }, [viewportSize, contentSize, setOffset]);
207
+ const state = {
208
+ offset,
209
+ maxOffset,
210
+ viewportSize,
211
+ contentSize,
212
+ atStart,
213
+ atEnd,
214
+ };
215
+ // Handle effective offset sync from host (when sticky adjusts the offset)
216
+ const handleEffectiveOffset = useCallback((effectiveOffset) => {
217
+ // Sync the ref so scrollToVisible uses the actual rendered position
218
+ offsetRef.current = effectiveOffset;
219
+ // Also update state to keep in sync (but don't trigger wasAtEnd change)
220
+ setOffsetRaw(effectiveOffset);
221
+ }, []);
222
+ const scrollProps = {
223
+ offset,
224
+ axis,
225
+ onContentSize: handleContentSize,
226
+ onViewportSize: handleViewportSize,
227
+ onEffectiveOffset: handleEffectiveOffset,
228
+ };
229
+ return {
230
+ state,
231
+ setOffset,
232
+ scrollBy,
233
+ scrollToStart,
234
+ scrollToEnd,
235
+ scrollToVisible,
236
+ scrollProps,
237
+ };
238
+ }
239
+ //# sourceMappingURL=use-scroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-scroll.js","sourceRoot":"","sources":["../../../src/hooks/use-scroll.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useFrameStats.js","sourceRoot":"","sources":["../../../src/hooks/useFrameStats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAG5C;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAQ,GAAG,GAAG;IAC1C,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAoB,IAAI,CAAC,CAAA;IAE3D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,QAAQ,CAAC,YAAY;YAAE,OAAM;QAElC,IAAI,IAAI,GAAsB,IAAI,CAAA;QAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE;YACxC,IAAI,GAAG,CAAC,CAAA;QACV,CAAC,CAAC,CAAA;QAEF,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;YAC1B,IAAI,IAAI;gBAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC1B,CAAC,EAAE,QAAQ,CAAC,CAAA;QAEZ,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,EAAE,CAAC,CAAA;YACjB,KAAK,EAAE,EAAE,CAAA;QACX,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;IAExB,OAAO,KAAK,CAAA;AACd,CAAC"}
1
+ {"version":3,"file":"useFrameStats.js","sourceRoot":"","sources":["../../../src/hooks/useFrameStats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAG5C;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAQ,GAAG,GAAG;IAC3C,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAoB,IAAI,CAAC,CAAA;IAE3D,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,QAAQ,CAAC,YAAY;YAAE,OAAM;QAElC,IAAI,IAAI,GAAsB,IAAI,CAAA;QAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE;YACzC,IAAI,GAAG,CAAC,CAAA;QACT,CAAC,CAAC,CAAA;QAEF,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE;YAC3B,IAAI,IAAI;gBAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;QACzB,CAAC,EAAE,QAAQ,CAAC,CAAA;QAEZ,OAAO,GAAG,EAAE;YACX,aAAa,CAAC,EAAE,CAAC,CAAA;YACjB,KAAK,EAAE,EAAE,CAAA;QACV,CAAC,CAAA;IACF,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;IAExB,OAAO,KAAK,CAAA;AACb,CAAC"}
@@ -1,5 +1,11 @@
1
- import type { CellBuffer, Palette } from "@effect-tui/core";
1
+ import type { CellBuffer, Palette, Color } from "@effect-tui/core";
2
2
  import type { HostInstance, Rect, Size, HostContext, CommonProps } from "../reconciler/types.js";
3
+ /** Host that may have a background color (e.g., BoxHost) */
4
+ export interface HostWithBg extends HostInstance {
5
+ bg?: Color;
6
+ }
7
+ /** Walk up parent chain to find inherited background color */
8
+ export declare function getInheritedBg(startParent: HostInstance | null): Color | undefined;
3
9
  export declare abstract class BaseHost implements HostInstance {
4
10
  id: string;
5
11
  type: string;
@@ -8,11 +14,66 @@ export declare abstract class BaseHost implements HostInstance {
8
14
  rect: Rect | null;
9
15
  flexGrow: number;
10
16
  flexShrink: number;
17
+ frameWidth?: number;
18
+ frameHeight?: number;
19
+ frameMinWidth?: number;
20
+ frameMaxWidth?: number;
21
+ frameMinHeight?: number;
22
+ frameMaxHeight?: number;
23
+ /** @internal Marks this node as static content (for Static component) */
24
+ __static?: boolean;
11
25
  protected ctx: HostContext;
12
26
  constructor(type: string, props: CommonProps, ctx: HostContext);
13
27
  abstract measure(maxW: number, maxH: number): Size;
14
28
  abstract render(buffer: CellBuffer, palette: Palette): void;
15
29
  layout(rect: Rect): void;
30
+ /**
31
+ * Apply frame constraints to a proposed size before passing to children.
32
+ *
33
+ * This is the first half of SwiftUI-style frame semantics. When a parent
34
+ * proposes a size to us, we modify it based on our constraints before
35
+ * passing it down to our children.
36
+ *
37
+ * @example
38
+ * ```
39
+ * Parent proposes: 100x100
40
+ * Our height constraint: 10
41
+ * We propose to children: 100x10
42
+ * ```
43
+ *
44
+ * This prevents greedy children (like scroll) from measuring larger than
45
+ * our constrained size.
46
+ *
47
+ * @param maxW - Width proposed by parent
48
+ * @param maxH - Height proposed by parent
49
+ * @returns Constrained size to propose to children
50
+ */
51
+ protected constrainProposal(maxW: number, maxH: number): {
52
+ w: number;
53
+ h: number;
54
+ };
55
+ /**
56
+ * Apply frame constraints to our measured size before returning to parent.
57
+ *
58
+ * This is the second half of SwiftUI-style frame semantics. After measuring
59
+ * our children, we modify our reported size based on our constraints before
60
+ * returning it to our parent.
61
+ *
62
+ * @example
63
+ * ```
64
+ * Children measured: 5x1 (small content)
65
+ * Our height constraint: 10
66
+ * We report to parent: 5x10
67
+ * ```
68
+ *
69
+ * This ensures we report our constrained size regardless of children's
70
+ * natural size, which is essential for layout composition (e.g., spacer
71
+ * needs to know our fixed size to calculate remaining space).
72
+ *
73
+ * @param size - Natural size from measuring children
74
+ * @returns Constrained size to report to parent
75
+ */
76
+ protected constrainResult(size: Size): Size;
16
77
  updateProps(props: Record<string, unknown>): void;
17
78
  destroy(): void;
18
79
  appendChild(child: HostInstance): void;