@effect-tui/react 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +138 -0
  3. package/dist/jsx-dev-runtime.d.ts +3 -0
  4. package/dist/jsx-dev-runtime.d.ts.map +1 -0
  5. package/dist/jsx-dev-runtime.js +3 -0
  6. package/dist/jsx-dev-runtime.js.map +1 -0
  7. package/dist/jsx-runtime.d.ts +47 -0
  8. package/dist/jsx-runtime.d.ts.map +1 -0
  9. package/dist/jsx-runtime.js +6 -0
  10. package/dist/jsx-runtime.js.map +1 -0
  11. package/dist/src/codeblock.d.ts +9 -0
  12. package/dist/src/codeblock.d.ts.map +1 -0
  13. package/dist/src/codeblock.js +24 -0
  14. package/dist/src/codeblock.js.map +1 -0
  15. package/dist/src/constants.d.ts +3 -0
  16. package/dist/src/constants.d.ts.map +1 -0
  17. package/dist/src/constants.js +3 -0
  18. package/dist/src/constants.js.map +1 -0
  19. package/dist/src/debug/DiagnosticsPanel.d.ts +7 -0
  20. package/dist/src/debug/DiagnosticsPanel.d.ts.map +1 -0
  21. package/dist/src/debug/DiagnosticsPanel.js +13 -0
  22. package/dist/src/debug/DiagnosticsPanel.js.map +1 -0
  23. package/dist/src/highlight.d.ts +20 -0
  24. package/dist/src/highlight.d.ts.map +1 -0
  25. package/dist/src/highlight.js +51 -0
  26. package/dist/src/highlight.js.map +1 -0
  27. package/dist/src/hooks/index.d.ts +4 -0
  28. package/dist/src/hooks/index.d.ts.map +1 -0
  29. package/dist/src/hooks/index.js +3 -0
  30. package/dist/src/hooks/index.js.map +1 -0
  31. package/dist/src/hooks/use-keyboard.d.ts +18 -0
  32. package/dist/src/hooks/use-keyboard.d.ts.map +1 -0
  33. package/dist/src/hooks/use-keyboard.js +26 -0
  34. package/dist/src/hooks/use-keyboard.js.map +1 -0
  35. package/dist/src/hooks/use-paste.d.ts +5 -0
  36. package/dist/src/hooks/use-paste.d.ts.map +1 -0
  37. package/dist/src/hooks/use-paste.js +14 -0
  38. package/dist/src/hooks/use-paste.js.map +1 -0
  39. package/dist/src/hooks/useFrameStats.d.ts +7 -0
  40. package/dist/src/hooks/useFrameStats.d.ts.map +1 -0
  41. package/dist/src/hooks/useFrameStats.js +28 -0
  42. package/dist/src/hooks/useFrameStats.js.map +1 -0
  43. package/dist/src/hosts/base.d.ts +22 -0
  44. package/dist/src/hosts/base.d.ts.map +1 -0
  45. package/dist/src/hosts/base.js +53 -0
  46. package/dist/src/hosts/base.js.map +1 -0
  47. package/dist/src/hosts/box.d.ts +26 -0
  48. package/dist/src/hosts/box.d.ts.map +1 -0
  49. package/dist/src/hosts/box.js +84 -0
  50. package/dist/src/hosts/box.js.map +1 -0
  51. package/dist/src/hosts/canvas.d.ts +48 -0
  52. package/dist/src/hosts/canvas.d.ts.map +1 -0
  53. package/dist/src/hosts/canvas.js +109 -0
  54. package/dist/src/hosts/canvas.js.map +1 -0
  55. package/dist/src/hosts/codeblock.d.ts +32 -0
  56. package/dist/src/hosts/codeblock.d.ts.map +1 -0
  57. package/dist/src/hosts/codeblock.js +118 -0
  58. package/dist/src/hosts/codeblock.js.map +1 -0
  59. package/dist/src/hosts/hstack.d.ts +18 -0
  60. package/dist/src/hosts/hstack.d.ts.map +1 -0
  61. package/dist/src/hosts/hstack.js +45 -0
  62. package/dist/src/hosts/hstack.js.map +1 -0
  63. package/dist/src/hosts/index.d.ts +16 -0
  64. package/dist/src/hosts/index.d.ts.map +1 -0
  65. package/dist/src/hosts/index.js +40 -0
  66. package/dist/src/hosts/index.js.map +1 -0
  67. package/dist/src/hosts/spacer.d.ts +19 -0
  68. package/dist/src/hosts/spacer.d.ts.map +1 -0
  69. package/dist/src/hosts/spacer.js +28 -0
  70. package/dist/src/hosts/spacer.js.map +1 -0
  71. package/dist/src/hosts/text.d.ts +43 -0
  72. package/dist/src/hosts/text.d.ts.map +1 -0
  73. package/dist/src/hosts/text.js +148 -0
  74. package/dist/src/hosts/text.js.map +1 -0
  75. package/dist/src/hosts/vstack.d.ts +18 -0
  76. package/dist/src/hosts/vstack.d.ts.map +1 -0
  77. package/dist/src/hosts/vstack.js +45 -0
  78. package/dist/src/hosts/vstack.js.map +1 -0
  79. package/dist/src/hosts/zstack.d.ts +20 -0
  80. package/dist/src/hosts/zstack.d.ts.map +1 -0
  81. package/dist/src/hosts/zstack.js +65 -0
  82. package/dist/src/hosts/zstack.js.map +1 -0
  83. package/dist/src/index.d.ts +20 -0
  84. package/dist/src/index.d.ts.map +1 -0
  85. package/dist/src/index.js +20 -0
  86. package/dist/src/index.js.map +1 -0
  87. package/dist/src/inline/index.d.ts +32 -0
  88. package/dist/src/inline/index.d.ts.map +1 -0
  89. package/dist/src/inline/index.js +111 -0
  90. package/dist/src/inline/index.js.map +1 -0
  91. package/dist/src/jsx.d.ts +2 -0
  92. package/dist/src/jsx.d.ts.map +1 -0
  93. package/dist/src/jsx.js +4 -0
  94. package/dist/src/jsx.js.map +1 -0
  95. package/dist/src/motion/color-motion-value.d.ts +32 -0
  96. package/dist/src/motion/color-motion-value.d.ts.map +1 -0
  97. package/dist/src/motion/color-motion-value.js +80 -0
  98. package/dist/src/motion/color-motion-value.js.map +1 -0
  99. package/dist/src/motion/color.d.ts +30 -0
  100. package/dist/src/motion/color.d.ts.map +1 -0
  101. package/dist/src/motion/color.js +172 -0
  102. package/dist/src/motion/color.js.map +1 -0
  103. package/dist/src/motion/color.test.d.ts +2 -0
  104. package/dist/src/motion/color.test.d.ts.map +1 -0
  105. package/dist/src/motion/color.test.js +97 -0
  106. package/dist/src/motion/color.test.js.map +1 -0
  107. package/dist/src/motion/event-emitter.d.ts +18 -0
  108. package/dist/src/motion/event-emitter.d.ts.map +1 -0
  109. package/dist/src/motion/event-emitter.js +30 -0
  110. package/dist/src/motion/event-emitter.js.map +1 -0
  111. package/dist/src/motion/frame.d.ts +9 -0
  112. package/dist/src/motion/frame.d.ts.map +1 -0
  113. package/dist/src/motion/frame.js +51 -0
  114. package/dist/src/motion/frame.js.map +1 -0
  115. package/dist/src/motion/hooks.d.ts +75 -0
  116. package/dist/src/motion/hooks.d.ts.map +1 -0
  117. package/dist/src/motion/hooks.js +190 -0
  118. package/dist/src/motion/hooks.js.map +1 -0
  119. package/dist/src/motion/index.d.ts +4 -0
  120. package/dist/src/motion/index.d.ts.map +1 -0
  121. package/dist/src/motion/index.js +7 -0
  122. package/dist/src/motion/index.js.map +1 -0
  123. package/dist/src/motion/motion-value.d.ts +40 -0
  124. package/dist/src/motion/motion-value.d.ts.map +1 -0
  125. package/dist/src/motion/motion-value.js +109 -0
  126. package/dist/src/motion/motion-value.js.map +1 -0
  127. package/dist/src/motion/motion-value.test.d.ts +2 -0
  128. package/dist/src/motion/motion-value.test.d.ts.map +1 -0
  129. package/dist/src/motion/motion-value.test.js +177 -0
  130. package/dist/src/motion/motion-value.test.js.map +1 -0
  131. package/dist/src/motion/spring-math.d.ts +28 -0
  132. package/dist/src/motion/spring-math.d.ts.map +1 -0
  133. package/dist/src/motion/spring-math.js +81 -0
  134. package/dist/src/motion/spring-math.js.map +1 -0
  135. package/dist/src/motion/types.d.ts +25 -0
  136. package/dist/src/motion/types.d.ts.map +1 -0
  137. package/dist/src/motion/types.js +13 -0
  138. package/dist/src/motion/types.js.map +1 -0
  139. package/dist/src/output.d.ts +47 -0
  140. package/dist/src/output.d.ts.map +1 -0
  141. package/dist/src/output.js +125 -0
  142. package/dist/src/output.js.map +1 -0
  143. package/dist/src/profiler.d.ts +6 -0
  144. package/dist/src/profiler.d.ts.map +1 -0
  145. package/dist/src/profiler.js +73 -0
  146. package/dist/src/profiler.js.map +1 -0
  147. package/dist/src/reconciler/host-config.d.ts +16 -0
  148. package/dist/src/reconciler/host-config.d.ts.map +1 -0
  149. package/dist/src/reconciler/host-config.js +174 -0
  150. package/dist/src/reconciler/host-config.js.map +1 -0
  151. package/dist/src/reconciler/types.d.ts +52 -0
  152. package/dist/src/reconciler/types.d.ts.map +1 -0
  153. package/dist/src/reconciler/types.js +2 -0
  154. package/dist/src/reconciler/types.js.map +1 -0
  155. package/dist/src/renderer.d.ts +101 -0
  156. package/dist/src/renderer.d.ts.map +1 -0
  157. package/dist/src/renderer.js +509 -0
  158. package/dist/src/renderer.js.map +1 -0
  159. package/dist/src/terminal.d.ts +37 -0
  160. package/dist/src/terminal.d.ts.map +1 -0
  161. package/dist/src/terminal.js +65 -0
  162. package/dist/src/terminal.js.map +1 -0
  163. package/dist/src/test/index.d.ts +3 -0
  164. package/dist/src/test/index.d.ts.map +1 -0
  165. package/dist/src/test/index.js +3 -0
  166. package/dist/src/test/index.js.map +1 -0
  167. package/dist/src/test/mock-streams.d.ts +44 -0
  168. package/dist/src/test/mock-streams.d.ts.map +1 -0
  169. package/dist/src/test/mock-streams.js +136 -0
  170. package/dist/src/test/mock-streams.js.map +1 -0
  171. package/dist/src/test/render-tui.d.ts +47 -0
  172. package/dist/src/test/render-tui.d.ts.map +1 -0
  173. package/dist/src/test/render-tui.js +76 -0
  174. package/dist/src/test/render-tui.js.map +1 -0
  175. package/dist/src/trace/SpanTree.d.ts +10 -0
  176. package/dist/src/trace/SpanTree.d.ts.map +1 -0
  177. package/dist/src/trace/SpanTree.js +104 -0
  178. package/dist/src/trace/SpanTree.js.map +1 -0
  179. package/dist/src/trace/index.d.ts +30 -0
  180. package/dist/src/trace/index.d.ts.map +1 -0
  181. package/dist/src/trace/index.js +142 -0
  182. package/dist/src/trace/index.js.map +1 -0
  183. package/dist/src/trace/location.d.ts +9 -0
  184. package/dist/src/trace/location.d.ts.map +1 -0
  185. package/dist/src/trace/location.js +88 -0
  186. package/dist/src/trace/location.js.map +1 -0
  187. package/dist/src/trace/span-processor.d.ts +16 -0
  188. package/dist/src/trace/span-processor.d.ts.map +1 -0
  189. package/dist/src/trace/span-processor.js +54 -0
  190. package/dist/src/trace/span-processor.js.map +1 -0
  191. package/dist/src/trace/span-state.d.ts +79 -0
  192. package/dist/src/trace/span-state.d.ts.map +1 -0
  193. package/dist/src/trace/span-state.js +229 -0
  194. package/dist/src/trace/span-state.js.map +1 -0
  195. package/dist/src/trace/tui-logger.d.ts +8 -0
  196. package/dist/src/trace/tui-logger.d.ts.map +1 -0
  197. package/dist/src/trace/tui-logger.js +70 -0
  198. package/dist/src/trace/tui-logger.js.map +1 -0
  199. package/dist/src/utils/border.d.ts +31 -0
  200. package/dist/src/utils/border.d.ts.map +1 -0
  201. package/dist/src/utils/border.js +81 -0
  202. package/dist/src/utils/border.js.map +1 -0
  203. package/dist/src/utils/flex-layout.d.ts +20 -0
  204. package/dist/src/utils/flex-layout.d.ts.map +1 -0
  205. package/dist/src/utils/flex-layout.js +85 -0
  206. package/dist/src/utils/flex-layout.js.map +1 -0
  207. package/dist/src/utils/index.d.ts +5 -0
  208. package/dist/src/utils/index.d.ts.map +1 -0
  209. package/dist/src/utils/index.js +5 -0
  210. package/dist/src/utils/index.js.map +1 -0
  211. package/dist/src/utils/padding.d.ts +26 -0
  212. package/dist/src/utils/padding.d.ts.map +1 -0
  213. package/dist/src/utils/padding.js +34 -0
  214. package/dist/src/utils/padding.js.map +1 -0
  215. package/dist/src/utils/styles.d.ts +13 -0
  216. package/dist/src/utils/styles.d.ts.map +1 -0
  217. package/dist/src/utils/styles.js +5 -0
  218. package/dist/src/utils/styles.js.map +1 -0
  219. package/dist/src/visualize/index.d.ts +50 -0
  220. package/dist/src/visualize/index.d.ts.map +1 -0
  221. package/dist/src/visualize/index.js +194 -0
  222. package/dist/src/visualize/index.js.map +1 -0
  223. package/dist/tsconfig.tsbuildinfo +1 -0
  224. package/package.json +94 -0
  225. package/src/codeblock.tsx +47 -0
  226. package/src/constants.ts +2 -0
  227. package/src/debug/DiagnosticsPanel.tsx +38 -0
  228. package/src/highlight.ts +76 -0
  229. package/src/hooks/index.ts +3 -0
  230. package/src/hooks/use-keyboard.ts +37 -0
  231. package/src/hooks/use-paste.ts +14 -0
  232. package/src/hooks/useFrameStats.ts +32 -0
  233. package/src/hosts/base.ts +65 -0
  234. package/src/hosts/box.ts +105 -0
  235. package/src/hosts/canvas.ts +155 -0
  236. package/src/hosts/codeblock.ts +145 -0
  237. package/src/hosts/hstack.ts +64 -0
  238. package/src/hosts/index.ts +45 -0
  239. package/src/hosts/spacer.ts +40 -0
  240. package/src/hosts/text.ts +175 -0
  241. package/src/hosts/vstack.ts +64 -0
  242. package/src/hosts/zstack.ts +77 -0
  243. package/src/index.ts +62 -0
  244. package/src/inline/index.tsx +181 -0
  245. package/src/jsx.ts +3 -0
  246. package/src/motion/color-motion-value.ts +90 -0
  247. package/src/motion/color.test.ts +115 -0
  248. package/src/motion/color.ts +191 -0
  249. package/src/motion/event-emitter.ts +35 -0
  250. package/src/motion/frame.ts +59 -0
  251. package/src/motion/hooks.ts +237 -0
  252. package/src/motion/index.ts +17 -0
  253. package/src/motion/motion-value.test.ts +222 -0
  254. package/src/motion/motion-value.ts +140 -0
  255. package/src/motion/spring-math.ts +114 -0
  256. package/src/motion/types.ts +34 -0
  257. package/src/output.ts +156 -0
  258. package/src/profiler.ts +88 -0
  259. package/src/reconciler/host-config.ts +277 -0
  260. package/src/reconciler/types.ts +66 -0
  261. package/src/renderer.ts +661 -0
  262. package/src/terminal.ts +67 -0
  263. package/src/test/index.ts +8 -0
  264. package/src/test/mock-streams.ts +149 -0
  265. package/src/test/render-tui.ts +118 -0
  266. package/src/trace/SpanTree.tsx +195 -0
  267. package/src/trace/index.tsx +205 -0
  268. package/src/trace/location.ts +90 -0
  269. package/src/trace/span-processor.ts +65 -0
  270. package/src/trace/span-state.ts +286 -0
  271. package/src/trace/tui-logger.ts +72 -0
  272. package/src/utils/border.ts +108 -0
  273. package/src/utils/flex-layout.ts +125 -0
  274. package/src/utils/index.ts +4 -0
  275. package/src/utils/padding.ts +45 -0
  276. package/src/utils/styles.ts +14 -0
  277. package/src/visualize/index.tsx +305 -0
@@ -0,0 +1,53 @@
1
+ let idCounter = 0;
2
+ export class BaseHost {
3
+ id;
4
+ type;
5
+ parent = null;
6
+ children = [];
7
+ rect = null;
8
+ // Common flex props
9
+ flexGrow = 0;
10
+ flexShrink = 1;
11
+ ctx;
12
+ constructor(type, props, ctx) {
13
+ this.id = `${type}-${idCounter++}`;
14
+ this.type = type;
15
+ this.ctx = ctx;
16
+ this.updateProps(props);
17
+ }
18
+ layout(rect) {
19
+ this.rect = rect;
20
+ }
21
+ updateProps(props) {
22
+ if (props.flexGrow !== undefined)
23
+ this.flexGrow = props.flexGrow;
24
+ if (props.flexShrink !== undefined)
25
+ this.flexShrink = props.flexShrink;
26
+ }
27
+ destroy() {
28
+ // Override in subclasses if cleanup needed
29
+ }
30
+ // Child management helpers
31
+ appendChild(child) {
32
+ this.children.push(child);
33
+ child.parent = this;
34
+ }
35
+ removeChild(child) {
36
+ const idx = this.children.indexOf(child);
37
+ if (idx >= 0) {
38
+ this.children.splice(idx, 1);
39
+ child.parent = null;
40
+ }
41
+ }
42
+ insertBefore(child, before) {
43
+ const idx = this.children.indexOf(before);
44
+ if (idx >= 0) {
45
+ this.children.splice(idx, 0, child);
46
+ }
47
+ else {
48
+ this.children.push(child);
49
+ }
50
+ child.parent = this;
51
+ }
52
+ }
53
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/hosts/base.ts"],"names":[],"mappings":"AAGA,IAAI,SAAS,GAAG,CAAC,CAAA;AAEjB,MAAM,OAAgB,QAAQ;IAC5B,EAAE,CAAQ;IACV,IAAI,CAAQ;IACZ,MAAM,GAAwB,IAAI,CAAA;IAClC,QAAQ,GAAmB,EAAE,CAAA;IAC7B,IAAI,GAAgB,IAAI,CAAA;IAExB,oBAAoB;IACpB,QAAQ,GAAG,CAAC,CAAA;IACZ,UAAU,GAAG,CAAC,CAAA;IAEJ,GAAG,CAAa;IAE1B,YAAY,IAAY,EAAE,KAAkB,EAAE,GAAgB;QAC5D,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,IAAI,SAAS,EAAE,EAAE,CAAA;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC;IAKD,MAAM,CAAC,IAAU;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAED,WAAW,CAAC,KAA8B;QACxC,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAkB,CAAA;QAC1E,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;YAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAoB,CAAA;IAClF,CAAC;IAED,OAAO;QACL,2CAA2C;IAC7C,CAAC;IAED,2BAA2B;IAC3B,WAAW,CAAC,KAAmB;QAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACzB,KAAK,CAAC,MAAM,GAAG,IAAI,CAAA;IACrB,CAAC;IAED,WAAW,CAAC,KAAmB;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACxC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YAC5B,KAAK,CAAC,MAAM,GAAG,IAAI,CAAA;QACrB,CAAC;IACH,CAAC;IAED,YAAY,CAAC,KAAmB,EAAE,MAAoB;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACzC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;QACrC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;QACD,KAAK,CAAC,MAAM,GAAG,IAAI,CAAA;IACrB,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ import type { CellBuffer, Palette, ColorValue } from "@effect-tui/core";
2
+ import type { HostContext, Rect, Size, CommonProps } from "../reconciler/types.js";
3
+ import { BaseHost } from "./base.js";
4
+ import { type BorderKind, type Padding, type PaddingInput } from "../utils/index.js";
5
+ export type { BorderKind };
6
+ export interface BoxProps extends CommonProps {
7
+ padding?: PaddingInput;
8
+ border?: BorderKind;
9
+ borderColor?: ColorValue;
10
+ bg?: ColorValue;
11
+ }
12
+ export declare class BoxHost extends BaseHost {
13
+ padding: Padding;
14
+ border: BorderKind;
15
+ borderColor?: ColorValue;
16
+ bg?: ColorValue;
17
+ constructor(props: BoxProps, ctx: HostContext);
18
+ private get borderThickness();
19
+ private get insetX();
20
+ private get insetY();
21
+ measure(maxW: number, maxH: number): Size;
22
+ layout(rect: Rect): void;
23
+ render(buffer: CellBuffer, palette: Palette): void;
24
+ updateProps(props: Record<string, unknown>): void;
25
+ }
26
+ //# sourceMappingURL=box.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../../../src/hosts/box.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAClF,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,KAAK,UAAU,EAA2B,KAAK,OAAO,EAAE,KAAK,YAAY,EAAkB,MAAM,mBAAmB,CAAA;AAE7H,YAAY,EAAE,UAAU,EAAE,CAAA;AAE1B,MAAM,WAAW,QAAS,SAAQ,WAAW;IAC3C,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,WAAW,CAAC,EAAE,UAAU,CAAA;IACxB,EAAE,CAAC,EAAE,UAAU,CAAA;CAChB;AAED,qBAAa,OAAQ,SAAQ,QAAQ;IACnC,OAAO,EAAE,OAAO,CAA2C;IAC3D,MAAM,EAAE,UAAU,CAAS;IAC3B,WAAW,CAAC,EAAE,UAAU,CAAA;IACxB,EAAE,CAAC,EAAE,UAAU,CAAA;gBAEH,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW;IAK7C,OAAO,KAAK,eAAe,GAE1B;IAED,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAmBhC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAiBjC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAuBzC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAO3D"}
@@ -0,0 +1,84 @@
1
+ import { Colors } from "@effect-tui/core";
2
+ import { BaseHost } from "./base.js";
3
+ import { borderChars, drawBorder, resolvePadding } from "../utils/index.js";
4
+ export class BoxHost extends BaseHost {
5
+ padding = { top: 0, right: 0, bottom: 0, left: 0 };
6
+ border = "none";
7
+ borderColor;
8
+ bg;
9
+ constructor(props, ctx) {
10
+ super("box", props, ctx);
11
+ this.updateProps(props);
12
+ }
13
+ get borderThickness() {
14
+ return this.border === "none" ? 0 : 1;
15
+ }
16
+ get insetX() {
17
+ return this.borderThickness + this.padding.left + this.padding.right + this.borderThickness;
18
+ }
19
+ get insetY() {
20
+ return this.borderThickness + this.padding.top + this.padding.bottom + this.borderThickness;
21
+ }
22
+ measure(maxW, maxH) {
23
+ const innerMaxW = Math.max(0, maxW - this.insetX);
24
+ const innerMaxH = Math.max(0, maxH - this.insetY);
25
+ // Measure single child (box should have at most one child)
26
+ let childW = 0;
27
+ let childH = 0;
28
+ if (this.children.length > 0) {
29
+ const childSize = this.children[0].measure(innerMaxW, innerMaxH);
30
+ childW = childSize.w;
31
+ childH = childSize.h;
32
+ }
33
+ return {
34
+ w: childW + this.insetX,
35
+ h: childH + this.insetY,
36
+ };
37
+ }
38
+ layout(rect) {
39
+ super.layout(rect);
40
+ const t = this.borderThickness;
41
+ const innerRect = {
42
+ x: rect.x + t + this.padding.left,
43
+ y: rect.y + t + this.padding.top,
44
+ w: Math.max(0, rect.w - this.insetX),
45
+ h: Math.max(0, rect.h - this.insetY),
46
+ };
47
+ // Layout single child
48
+ if (this.children.length > 0) {
49
+ this.children[0].layout(innerRect);
50
+ }
51
+ }
52
+ render(buffer, palette) {
53
+ if (!this.rect)
54
+ return;
55
+ const { x, y, w, h } = this.rect;
56
+ // Draw background if set
57
+ if (this.bg !== undefined) {
58
+ const bgStyle = palette.id({ bg: this.bg });
59
+ buffer.fillRect(x, y, w, h, " ".codePointAt(0), bgStyle);
60
+ }
61
+ // Draw border
62
+ if (this.border !== "none" && w >= 2 && h >= 2) {
63
+ const chars = borderChars(this.border);
64
+ const borderStyle = palette.id({ fg: this.borderColor ?? Colors.gray(8) });
65
+ drawBorder(buffer, x, y, w, h, chars, borderStyle);
66
+ }
67
+ // Render children
68
+ for (const child of this.children) {
69
+ child.render(buffer, palette);
70
+ }
71
+ }
72
+ updateProps(props) {
73
+ super.updateProps(props);
74
+ if (props.padding !== undefined)
75
+ this.padding = resolvePadding(props.padding);
76
+ if (props.border !== undefined)
77
+ this.border = props.border;
78
+ if (props.borderColor !== undefined)
79
+ this.borderColor = props.borderColor;
80
+ if (props.bg !== undefined)
81
+ this.bg = props.bg;
82
+ }
83
+ }
84
+ //# sourceMappingURL=box.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"box.js","sourceRoot":"","sources":["../../../src/hosts/box.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAmB,WAAW,EAAE,UAAU,EAAmC,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAW7H,MAAM,OAAO,OAAQ,SAAQ,QAAQ;IACnC,OAAO,GAAY,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;IAC3D,MAAM,GAAe,MAAM,CAAA;IAC3B,WAAW,CAAa;IACxB,EAAE,CAAa;IAEf,YAAY,KAAe,EAAE,GAAgB;QAC3C,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;QACxB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC;IAED,IAAY,eAAe;QACzB,OAAO,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACvC,CAAC;IAED,IAAY,MAAM;QAChB,OAAO,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe,CAAA;IAC7F,CAAC;IAED,IAAY,MAAM;QAChB,OAAO,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,CAAA;IAC7F,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,IAAY;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;QAEjD,2DAA2D;QAC3D,IAAI,MAAM,GAAG,CAAC,CAAA;QACd,IAAI,MAAM,GAAG,CAAC,CAAA;QACd,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;YAChE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;YACpB,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;QACtB,CAAC;QAED,OAAO;YACL,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM;YACvB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM;SACxB,CAAA;IACH,CAAC;IAEQ,MAAM,CAAC,IAAU;QACxB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAElB,MAAM,CAAC,GAAG,IAAI,CAAC,eAAe,CAAA;QAC9B,MAAM,SAAS,GAAS;YACtB,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI;YACjC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG;YAChC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YACpC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;SACrC,CAAA;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,MAAkB,EAAE,OAAgB;QACzC,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAM;QACtB,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAA;QAEhC,yBAAyB;QACzB,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;YAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAE,EAAE,OAAO,CAAC,CAAA;QAC3D,CAAC;QAED,cAAc;QACd,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACtC,MAAM,WAAW,GAAG,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YAC1E,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAA;QACpD,CAAC;QAED,kBAAkB;QAClB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IAEQ,WAAW,CAAC,KAA8B;QACjD,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QACxB,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,OAA8B,CAAC,CAAA;QACpG,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAoB,CAAA;QACxE,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAyB,CAAA;QACvF,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS;YAAE,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,EAAgB,CAAA;IAC9D,CAAC;CACF"}
@@ -0,0 +1,48 @@
1
+ import type { CellBuffer, Palette, ColorValue } from "@effect-tui/core";
2
+ import type { HostContext, Size, CommonProps } from "../reconciler/types.js";
3
+ import { BaseHost } from "./base.js";
4
+ import { type BorderKind } from "../utils/index.js";
5
+ export type { BorderKind };
6
+ export interface DrawContext {
7
+ /** Canvas width in cells */
8
+ width: number;
9
+ /** Canvas height in cells */
10
+ height: number;
11
+ /** Draw text at position */
12
+ text(x: number, y: number, str: string, opts?: {
13
+ fg?: ColorValue;
14
+ bg?: ColorValue;
15
+ }): void;
16
+ /** Fill rectangle with character */
17
+ fill(x: number, y: number, w: number, h: number, char?: string, opts?: {
18
+ fg?: ColorValue;
19
+ bg?: ColorValue;
20
+ }): void;
21
+ /** Draw box with optional border */
22
+ box(x: number, y: number, w: number, h: number, opts?: {
23
+ border?: BorderKind;
24
+ borderColor?: ColorValue;
25
+ bg?: ColorValue;
26
+ fg?: ColorValue;
27
+ }): void;
28
+ /** Clear entire canvas */
29
+ clear(): void;
30
+ }
31
+ export interface CanvasProps extends CommonProps {
32
+ /** Draw function called each render */
33
+ draw: (ctx: DrawContext) => void;
34
+ /** Fixed width (default: fill available) */
35
+ width?: number;
36
+ /** Fixed height (default: fill available) */
37
+ height?: number;
38
+ }
39
+ export declare class CanvasHost extends BaseHost {
40
+ draw: CanvasProps["draw"];
41
+ fixedWidth?: number;
42
+ fixedHeight?: number;
43
+ constructor(props: CanvasProps, ctx: HostContext);
44
+ measure(maxW: number, maxH: number): Size;
45
+ render(buffer: CellBuffer, palette: Palette): void;
46
+ updateProps(props: Record<string, unknown>): void;
47
+ }
48
+ //# sourceMappingURL=canvas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../../../src/hosts/canvas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,KAAK,UAAU,EAA2B,MAAM,mBAAmB,CAAA;AAE5E,YAAY,EAAE,UAAU,EAAE,CAAA;AAE1B,MAAM,WAAW,WAAW;IAC1B,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAA;IAEd,4BAA4B;IAC5B,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,UAAU,CAAC;QAAC,EAAE,CAAC,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAA;IAE1F,oCAAoC;IACpC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,UAAU,CAAC;QAAC,EAAE,CAAC,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAA;IAElH,oCAAoC;IACpC,GAAG,CACD,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,UAAU,CAAA;QACnB,WAAW,CAAC,EAAE,UAAU,CAAA;QACxB,EAAE,CAAC,EAAE,UAAU,CAAA;QACf,EAAE,CAAC,EAAE,UAAU,CAAA;KAChB,GACA,IAAI,CAAA;IAEP,0BAA0B;IAC1B,KAAK,IAAI,IAAI,CAAA;CACd;AAED,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC9C,uCAAuC;IACvC,IAAI,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAA;IAChC,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,qBAAa,UAAW,SAAQ,QAAQ;IACtC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAW;IACpC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;gBAER,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW;IAKhD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAOzC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAiFzC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAS3D"}
@@ -0,0 +1,109 @@
1
+ import { Colors } from "@effect-tui/core";
2
+ import { BaseHost } from "./base.js";
3
+ import { borderChars, drawBorder } from "../utils/index.js";
4
+ export class CanvasHost extends BaseHost {
5
+ draw = () => { };
6
+ fixedWidth;
7
+ fixedHeight;
8
+ constructor(props, ctx) {
9
+ super("canvas", props, ctx);
10
+ this.updateProps(props);
11
+ }
12
+ measure(maxW, maxH) {
13
+ return {
14
+ w: this.fixedWidth ?? maxW,
15
+ h: this.fixedHeight ?? maxH,
16
+ };
17
+ }
18
+ render(buffer, palette) {
19
+ if (!this.rect)
20
+ return;
21
+ const { x: ox, y: oy, w, h } = this.rect;
22
+ // Create draw context
23
+ const ctx = {
24
+ width: w,
25
+ height: h,
26
+ text: (x, y, str, opts) => {
27
+ const px = Math.round(ox + x);
28
+ const py = Math.round(oy + y);
29
+ if (py < oy || py >= oy + h)
30
+ return;
31
+ const style = palette.id({ fg: opts?.fg, bg: opts?.bg });
32
+ let col = px;
33
+ for (const char of str) {
34
+ if (col >= ox + w)
35
+ break;
36
+ if (col >= ox) {
37
+ buffer.drawCP(col, py, char.codePointAt(0), style);
38
+ }
39
+ col++;
40
+ }
41
+ },
42
+ fill: (x, y, fw, fh, char = " ", opts) => {
43
+ const px = Math.round(ox + x);
44
+ const py = Math.round(oy + y);
45
+ const cp = char.codePointAt(0);
46
+ const style = palette.id({ fg: opts?.fg, bg: opts?.bg });
47
+ for (let row = 0; row < fh; row++) {
48
+ const yy = py + row;
49
+ if (yy < oy || yy >= oy + h)
50
+ continue;
51
+ for (let col = 0; col < fw; col++) {
52
+ const xx = px + col;
53
+ if (xx < ox || xx >= ox + w)
54
+ continue;
55
+ buffer.drawCP(xx, yy, cp, style);
56
+ }
57
+ }
58
+ },
59
+ box: (x, y, bw, bh, opts) => {
60
+ const px = Math.round(ox + x);
61
+ const py = Math.round(oy + y);
62
+ const border = opts?.border ?? "none";
63
+ const bgStyle = opts?.bg !== undefined ? palette.id({ bg: opts.bg }) : undefined;
64
+ // Fill background (with clipping)
65
+ if (bgStyle !== undefined) {
66
+ for (let row = 0; row < bh; row++) {
67
+ const yy = py + row;
68
+ if (yy < oy || yy >= oy + h)
69
+ continue;
70
+ for (let col = 0; col < bw; col++) {
71
+ const xx = px + col;
72
+ if (xx < ox || xx >= ox + w)
73
+ continue;
74
+ buffer.drawCP(xx, yy, " ".codePointAt(0), bgStyle);
75
+ }
76
+ }
77
+ }
78
+ // Draw border (with clipping)
79
+ if (border !== "none" && bw >= 2 && bh >= 2) {
80
+ const chars = borderChars(border);
81
+ const borderStyle = palette.id({ fg: opts?.borderColor ?? opts?.fg ?? Colors.gray(8) });
82
+ drawBorder(buffer, px, py, bw, bh, chars, borderStyle, { ox, oy, w, h });
83
+ }
84
+ },
85
+ clear: () => {
86
+ const style = palette.id({});
87
+ for (let row = 0; row < h; row++) {
88
+ for (let col = 0; col < w; col++) {
89
+ buffer.drawCP(ox + col, oy + row, " ".codePointAt(0), style);
90
+ }
91
+ }
92
+ },
93
+ };
94
+ // Call user's draw function
95
+ this.draw(ctx);
96
+ }
97
+ updateProps(props) {
98
+ super.updateProps(props);
99
+ if (props.draw !== undefined) {
100
+ this.draw = props.draw;
101
+ this.ctx.requestRender(); // trigger repaint when draw function changes
102
+ }
103
+ if (props.width !== undefined)
104
+ this.fixedWidth = props.width;
105
+ if (props.height !== undefined)
106
+ this.fixedHeight = props.height;
107
+ }
108
+ }
109
+ //# sourceMappingURL=canvas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas.js","sourceRoot":"","sources":["../../../src/hosts/canvas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type CellBuffer, type ColorLike, type Palette } from "@effect-tui/core";
2
+ import type { HighlightLine } from "../highlight.js";
3
+ import type { HostContext, Rect, Size, CommonProps } from "../reconciler/types.js";
4
+ import { BaseHost } from "./base.js";
5
+ import { type Padding, type PaddingInput } from "../utils/index.js";
6
+ export interface CodeBlockProps extends CommonProps {
7
+ lines: HighlightLine[];
8
+ lineNumbers?: boolean;
9
+ padding?: PaddingInput;
10
+ background?: ColorLike;
11
+ lineNumberColor?: ColorLike;
12
+ lineNumberBackground?: ColorLike;
13
+ }
14
+ export declare class CodeBlockHost extends BaseHost {
15
+ lines: HighlightLine[];
16
+ lineNumbers: boolean;
17
+ padding: Padding;
18
+ background?: ColorLike;
19
+ lineNumberColor?: ColorLike;
20
+ lineNumberBackground?: ColorLike;
21
+ private cachedLineWidths;
22
+ private gutterWidth;
23
+ constructor(props: CodeBlockProps, ctx: HostContext);
24
+ private computeGutterWidth;
25
+ private get insetX();
26
+ private get insetY();
27
+ measure(maxW: number, maxH: number): Size;
28
+ layout(rect: Rect): void;
29
+ render(buffer: CellBuffer, palette: Palette): void;
30
+ updateProps(props: Record<string, unknown>): void;
31
+ }
32
+ //# sourceMappingURL=codeblock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeblock.d.ts","sourceRoot":"","sources":["../../../src/hosts/codeblock.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,OAAO,EAEb,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAClF,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,YAAY,EAAkB,MAAM,mBAAmB,CAAA;AAEnF,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,eAAe,CAAC,EAAE,SAAS,CAAA;IAC3B,oBAAoB,CAAC,EAAE,SAAS,CAAA;CACjC;AAYD,qBAAa,aAAc,SAAQ,QAAQ;IACzC,KAAK,EAAE,aAAa,EAAE,CAAO;IAC7B,WAAW,UAAQ;IACnB,OAAO,EAAE,OAAO,CAA2C;IAC3D,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,eAAe,CAAC,EAAE,SAAS,CAAA;IAC3B,oBAAoB,CAAC,EAAE,SAAS,CAAA;IAEhC,OAAO,CAAC,gBAAgB,CAAe;IACvC,OAAO,CAAC,WAAW,CAAI;gBAEX,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,WAAW;IAKnD,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAehC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAIjC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAmDzC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAS3D"}
@@ -0,0 +1,118 @@
1
+ import { Colors, displayWidth, parseColor, } from "@effect-tui/core";
2
+ import { BaseHost } from "./base.js";
3
+ import { resolvePadding } from "../utils/index.js";
4
+ function normalizeColor(c) {
5
+ if (c === undefined || c === null)
6
+ return undefined;
7
+ if (typeof c === "number" || typeof c === "object")
8
+ return c;
9
+ return parseColor(c);
10
+ }
11
+ function lineDisplayWidth(line) {
12
+ return line.reduce((w, token) => w + displayWidth(token.text), 0);
13
+ }
14
+ export class CodeBlockHost extends BaseHost {
15
+ lines = [[]];
16
+ lineNumbers = false;
17
+ padding = { top: 0, right: 0, bottom: 0, left: 0 };
18
+ background;
19
+ lineNumberColor;
20
+ lineNumberBackground;
21
+ cachedLineWidths = [];
22
+ gutterWidth = 0;
23
+ constructor(props, ctx) {
24
+ super("codeblock", props, ctx);
25
+ this.updateProps(props);
26
+ }
27
+ computeGutterWidth() {
28
+ if (!this.lineNumbers)
29
+ return 0;
30
+ // Fix width so layout doesn't shift when moving from 1→2 digits.
31
+ const digits = Math.max(2, String(Math.max(1, this.lines.length)).length);
32
+ // digits plus a trailing space
33
+ return digits + 1;
34
+ }
35
+ get insetX() {
36
+ return this.padding.left + this.padding.right + this.gutterWidth;
37
+ }
38
+ get insetY() {
39
+ return this.padding.top + this.padding.bottom;
40
+ }
41
+ measure(maxW, maxH) {
42
+ this.cachedLineWidths = this.lines.map((l) => lineDisplayWidth(l));
43
+ this.gutterWidth = this.computeGutterWidth();
44
+ const maxLineW = this.cachedLineWidths.reduce((max, w) => (w > max ? w : max), 0);
45
+ const contentW = maxLineW + this.insetX;
46
+ const innerHeight = Math.max(1, this.lines.length) + this.insetY;
47
+ return {
48
+ w: Math.min(maxW, contentW),
49
+ h: Math.min(maxH, innerHeight),
50
+ };
51
+ }
52
+ layout(rect) {
53
+ super.layout(rect);
54
+ }
55
+ render(buffer, palette) {
56
+ if (!this.rect)
57
+ return;
58
+ const { x, y, w, h } = this.rect;
59
+ const contentWidth = Math.max(0, w - this.insetX);
60
+ const maxLines = Math.max(0, Math.min(this.lines.length, h - this.insetY));
61
+ const startX = x + this.padding.left + this.gutterWidth;
62
+ const startY = y + this.padding.top;
63
+ if (this.background !== undefined && w > 0 && h > 0) {
64
+ const bgStyle = palette.id({ bg: normalizeColor(this.background) });
65
+ buffer.fillRect(x, y, w, h, " ".codePointAt(0), bgStyle);
66
+ }
67
+ for (let i = 0; i < maxLines; i++) {
68
+ const lineY = startY + i;
69
+ let drawX = startX;
70
+ if (this.lineNumbers) {
71
+ const gutterStyle = palette.id({
72
+ fg: normalizeColor(this.lineNumberColor) ?? Colors.gray(11),
73
+ bg: normalizeColor(this.lineNumberBackground ?? this.background),
74
+ });
75
+ const digits = String(i + 1).padStart(this.gutterWidth - 1, " ");
76
+ buffer.drawText(x + this.padding.left, lineY, `${digits} `, gutterStyle, this.gutterWidth);
77
+ }
78
+ const line = this.lines[i] ?? [];
79
+ for (const token of line) {
80
+ if (contentWidth <= 0)
81
+ break;
82
+ const remaining = x + w - drawX;
83
+ if (remaining <= 0)
84
+ break;
85
+ const style = token.style ?? {};
86
+ const fg = normalizeColor(style.fg);
87
+ const bg = normalizeColor(style.bg ?? this.background);
88
+ const styleId = palette.id({
89
+ fg,
90
+ bg,
91
+ bold: style.bold,
92
+ italic: style.italic,
93
+ underline: style.underline,
94
+ });
95
+ buffer.drawText(drawX, lineY, token.text, styleId, remaining);
96
+ drawX += displayWidth(token.text);
97
+ if (drawX >= x + w)
98
+ break;
99
+ }
100
+ }
101
+ }
102
+ updateProps(props) {
103
+ super.updateProps(props);
104
+ if (props.lines !== undefined)
105
+ this.lines = props.lines;
106
+ if (props.lineNumbers !== undefined)
107
+ this.lineNumbers = !!props.lineNumbers;
108
+ if (props.padding !== undefined)
109
+ this.padding = resolvePadding(props.padding);
110
+ if (props.background !== undefined)
111
+ this.background = props.background;
112
+ if (props.lineNumberColor !== undefined)
113
+ this.lineNumberColor = props.lineNumberColor;
114
+ if (props.lineNumberBackground !== undefined)
115
+ this.lineNumberBackground = props.lineNumberBackground;
116
+ }
117
+ }
118
+ //# sourceMappingURL=codeblock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeblock.js","sourceRoot":"","sources":["../../../src/hosts/codeblock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { CellBuffer, Palette } from "@effect-tui/core";
2
+ import type { HostContext, Rect, Size, CommonProps } from "../reconciler/types.js";
3
+ import { BaseHost } from "./base.js";
4
+ export interface HStackProps extends CommonProps {
5
+ spacing?: number;
6
+ alignment?: "top" | "center" | "bottom";
7
+ }
8
+ export declare class HStackHost extends BaseHost {
9
+ spacing: number;
10
+ alignment: "top" | "center" | "bottom";
11
+ private cachedSizes;
12
+ constructor(props: HStackProps, ctx: HostContext);
13
+ measure(maxW: number, maxH: number): Size;
14
+ layout(rect: Rect): void;
15
+ render(buffer: CellBuffer, palette: Palette): void;
16
+ updateProps(props: Record<string, unknown>): void;
17
+ }
18
+ //# sourceMappingURL=hstack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hstack.d.ts","sourceRoot":"","sources":["../../../src/hosts/hstack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAClF,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAGpC,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAA;CACxC;AAcD,qBAAa,UAAW,SAAQ,QAAQ;IACtC,OAAO,SAAI;IACX,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAQ;IAC9C,OAAO,CAAC,WAAW,CAAa;gBAEpB,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW;IAKhD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAMhC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAcjC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAMzC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAK3D"}
@@ -0,0 +1,45 @@
1
+ import { BaseHost } from "./base.js";
2
+ import { measureFlex, layoutFlex } from "../utils/index.js";
3
+ // Map HStack alignment names to generic flex alignment
4
+ function toFlexAlignment(alignment) {
5
+ switch (alignment) {
6
+ case "top":
7
+ return "start";
8
+ case "center":
9
+ return "center";
10
+ case "bottom":
11
+ return "end";
12
+ }
13
+ }
14
+ export class HStackHost extends BaseHost {
15
+ spacing = 0;
16
+ alignment = "top";
17
+ cachedSizes = [];
18
+ constructor(props, ctx) {
19
+ super("hstack", props, ctx);
20
+ this.updateProps(props);
21
+ }
22
+ measure(maxW, maxH) {
23
+ const result = measureFlex("horizontal", this.children, this.spacing, maxW, maxH);
24
+ this.cachedSizes = result.sizes;
25
+ return result.totalSize;
26
+ }
27
+ layout(rect) {
28
+ super.layout(rect);
29
+ const stretchCross = this.alignment === "top";
30
+ layoutFlex("horizontal", this.children, this.cachedSizes, rect, this.spacing, toFlexAlignment(this.alignment), stretchCross);
31
+ }
32
+ render(buffer, palette) {
33
+ for (const child of this.children) {
34
+ child.render(buffer, palette);
35
+ }
36
+ }
37
+ updateProps(props) {
38
+ super.updateProps(props);
39
+ if (props.spacing !== undefined)
40
+ this.spacing = props.spacing;
41
+ if (props.alignment !== undefined)
42
+ this.alignment = props.alignment;
43
+ }
44
+ }
45
+ //# sourceMappingURL=hstack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hstack.js","sourceRoot":"","sources":["../../../src/hosts/hstack.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAsB,MAAM,mBAAmB,CAAA;AAO/E,uDAAuD;AACvD,SAAS,eAAe,CAAC,SAAsC;IAC7D,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,KAAK;YACR,OAAO,OAAO,CAAA;QAChB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAA;QACjB,KAAK,QAAQ;YACX,OAAO,KAAK,CAAA;IAChB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,UAAW,SAAQ,QAAQ;IACtC,OAAO,GAAG,CAAC,CAAA;IACX,SAAS,GAAgC,KAAK,CAAA;IACtC,WAAW,GAAW,EAAE,CAAA;IAEhC,YAAY,KAAkB,EAAE,GAAgB;QAC9C,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;QAC3B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,IAAY;QAChC,MAAM,MAAM,GAAG,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QACjF,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAA;QAC/B,OAAO,MAAM,CAAC,SAAS,CAAA;IACzB,CAAC;IAEQ,MAAM,CAAC,IAAU;QACxB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAClB,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,KAAK,KAAK,CAAA;QAC7C,UAAU,CACR,YAAY,EACZ,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,WAAW,EAChB,IAAI,EACJ,IAAI,CAAC,OAAO,EACZ,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAC/B,YAAY,CACb,CAAA;IACH,CAAC;IAED,MAAM,CAAC,MAAkB,EAAE,OAAgB;QACzC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IAEQ,WAAW,CAAC,KAA8B;QACjD,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QACxB,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAiB,CAAA;QACvE,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAwC,CAAA;IACpG,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ import type { HostContext, CommonProps } from "../reconciler/types.js";
2
+ import type { BaseHost } from "./base.js";
3
+ import { RawTextHost } from "./text.js";
4
+ export { BaseHost } from "./base.js";
5
+ export { TextHost, RawTextHost, type TextProps } from "./text.js";
6
+ export { SpacerHost, type SpacerProps } from "./spacer.js";
7
+ export { VStackHost, type VStackProps } from "./vstack.js";
8
+ export { HStackHost, type HStackProps } from "./hstack.js";
9
+ export { ZStackHost, type ZStackProps } from "./zstack.js";
10
+ export { BoxHost, type BoxProps } from "./box.js";
11
+ export { CanvasHost, type CanvasProps, type DrawContext } from "./canvas.js";
12
+ export { CodeBlockHost, type CodeBlockProps } from "./codeblock.js";
13
+ export declare const hostRegistry: Record<string, new (props: any, ctx: HostContext) => BaseHost>;
14
+ export declare function createHostInstance(type: string, props: CommonProps, ctx: HostContext): BaseHost;
15
+ export declare function createTextInstance(text: string, ctx: HostContext): RawTextHost;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hosts/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAY,WAAW,EAAE,MAAM,WAAW,CAAA;AASjD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAC5E,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAInE,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,KAAK,QAAQ,CASvF,CAAA;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,GAAG,QAAQ,CAM/F;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,WAAW,CAE9E"}