linecraft 0.1.0 → 0.2.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 (283) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +337 -64
  3. package/lib/api/color.d.ts +6 -0
  4. package/lib/api/color.d.ts.map +1 -0
  5. package/lib/api/color.js +9 -0
  6. package/lib/api/color.js.map +1 -0
  7. package/lib/api/color.test.d.ts +2 -0
  8. package/lib/api/color.test.d.ts.map +1 -0
  9. package/lib/api/color.test.js +23 -0
  10. package/lib/api/color.test.js.map +1 -0
  11. package/lib/api/flex.d.ts +55 -0
  12. package/lib/api/flex.d.ts.map +1 -0
  13. package/lib/api/flex.js +86 -0
  14. package/lib/api/flex.js.map +1 -0
  15. package/lib/api/flex.test.d.ts +2 -0
  16. package/lib/api/flex.test.d.ts.map +1 -0
  17. package/lib/api/flex.test.js +82 -0
  18. package/lib/api/flex.test.js.map +1 -0
  19. package/lib/api/grid.d.ts +22 -0
  20. package/lib/api/grid.d.ts.map +1 -0
  21. package/lib/api/grid.js +65 -0
  22. package/lib/api/grid.js.map +1 -0
  23. package/lib/api/grid.test.d.ts +2 -0
  24. package/lib/api/grid.test.d.ts.map +1 -0
  25. package/lib/api/grid.test.js +48 -0
  26. package/lib/api/grid.test.js.map +1 -0
  27. package/lib/components/base.d.ts +53 -0
  28. package/lib/components/base.d.ts.map +1 -0
  29. package/lib/components/base.js +47 -0
  30. package/lib/components/base.js.map +1 -0
  31. package/lib/components/col.d.ts +35 -0
  32. package/lib/components/col.d.ts.map +1 -0
  33. package/lib/components/col.js +168 -0
  34. package/lib/components/col.js.map +1 -0
  35. package/lib/components/col.test.d.ts +2 -0
  36. package/lib/components/col.test.d.ts.map +1 -0
  37. package/lib/components/col.test.js +96 -0
  38. package/lib/components/col.test.js.map +1 -0
  39. package/lib/components/index.d.ts +3 -0
  40. package/lib/components/index.d.ts.map +1 -0
  41. package/lib/components/index.js +5 -0
  42. package/lib/components/index.js.map +1 -0
  43. package/lib/components/progress-bar-grid.d.ts +20 -0
  44. package/lib/components/progress-bar-grid.d.ts.map +1 -0
  45. package/lib/components/progress-bar-grid.js +44 -0
  46. package/lib/components/progress-bar-grid.js.map +1 -0
  47. package/lib/components/progress-bar-grid.test.d.ts +2 -0
  48. package/lib/components/progress-bar-grid.test.d.ts.map +1 -0
  49. package/lib/components/progress-bar-grid.test.js +101 -0
  50. package/lib/components/progress-bar-grid.test.js.map +1 -0
  51. package/lib/components/progress-bar.d.ts +26 -3
  52. package/lib/components/progress-bar.d.ts.map +1 -1
  53. package/lib/components/progress-bar.js +62 -6
  54. package/lib/components/progress-bar.js.map +1 -1
  55. package/lib/components/progress-bar.test.d.ts +2 -0
  56. package/lib/components/progress-bar.test.d.ts.map +1 -0
  57. package/lib/components/progress-bar.test.js +153 -0
  58. package/lib/components/progress-bar.test.js.map +1 -0
  59. package/lib/components/prompt.d.ts +14 -0
  60. package/lib/components/prompt.d.ts.map +1 -0
  61. package/lib/components/prompt.js +77 -0
  62. package/lib/components/prompt.js.map +1 -0
  63. package/lib/components/renderable.d.ts +42 -0
  64. package/lib/components/renderable.d.ts.map +1 -0
  65. package/lib/components/renderable.js +225 -0
  66. package/lib/components/renderable.js.map +1 -0
  67. package/lib/components/spinner.d.ts +2 -2
  68. package/lib/components/spinner.d.ts.map +1 -1
  69. package/lib/components/spinner.js +3 -1
  70. package/lib/components/spinner.js.map +1 -1
  71. package/lib/components/spinner.test.d.ts +2 -0
  72. package/lib/components/spinner.test.d.ts.map +1 -0
  73. package/lib/components/spinner.test.js +168 -0
  74. package/lib/components/spinner.test.js.map +1 -0
  75. package/lib/components/style.d.ts +16 -0
  76. package/lib/components/style.d.ts.map +1 -0
  77. package/lib/components/style.js +72 -0
  78. package/lib/components/style.js.map +1 -0
  79. package/lib/components/style.test.d.ts +2 -0
  80. package/lib/components/style.test.d.ts.map +1 -0
  81. package/lib/components/style.test.js +135 -0
  82. package/lib/components/style.test.js.map +1 -0
  83. package/lib/components/text.d.ts +24 -0
  84. package/lib/components/text.d.ts.map +1 -0
  85. package/lib/components/text.js +65 -0
  86. package/lib/components/text.js.map +1 -0
  87. package/lib/drawing/boxes.d.ts +33 -0
  88. package/lib/drawing/boxes.d.ts.map +1 -0
  89. package/lib/drawing/boxes.js +76 -0
  90. package/lib/drawing/boxes.js.map +1 -0
  91. package/lib/index.d.ts +18 -11
  92. package/lib/index.d.ts.map +1 -1
  93. package/lib/index.js +21 -10
  94. package/lib/index.js.map +1 -1
  95. package/lib/index.test.d.ts +2 -0
  96. package/lib/index.test.d.ts.map +1 -0
  97. package/lib/index.test.js +80 -0
  98. package/lib/index.test.js.map +1 -0
  99. package/lib/layout/flex.d.ts +39 -0
  100. package/lib/layout/flex.d.ts.map +1 -0
  101. package/lib/layout/flex.js +300 -0
  102. package/lib/layout/flex.js.map +1 -0
  103. package/lib/layout/flex.test.d.ts +2 -0
  104. package/lib/layout/flex.test.d.ts.map +1 -0
  105. package/lib/layout/flex.test.js +206 -0
  106. package/lib/layout/flex.test.js.map +1 -0
  107. package/lib/layout/grid.d.ts +53 -0
  108. package/lib/layout/grid.d.ts.map +1 -0
  109. package/lib/layout/grid.js +421 -0
  110. package/lib/layout/grid.js.map +1 -0
  111. package/lib/layout/grid.test.d.ts +2 -0
  112. package/lib/layout/grid.test.d.ts.map +1 -0
  113. package/lib/layout/grid.test.js +139 -0
  114. package/lib/layout/grid.test.js.map +1 -0
  115. package/lib/native/ansi.d.ts +104 -0
  116. package/lib/native/ansi.d.ts.map +1 -0
  117. package/lib/native/ansi.js +120 -0
  118. package/lib/native/ansi.js.map +1 -0
  119. package/lib/native/ansi.test.d.ts +2 -0
  120. package/lib/native/ansi.test.d.ts.map +1 -0
  121. package/lib/native/ansi.test.js +57 -0
  122. package/lib/native/ansi.test.js.map +1 -0
  123. package/lib/native/buffer.d.ts +32 -0
  124. package/lib/native/buffer.d.ts.map +1 -0
  125. package/lib/native/buffer.js +49 -0
  126. package/lib/native/buffer.js.map +1 -0
  127. package/lib/native/buffer.test.d.ts +2 -0
  128. package/lib/native/buffer.test.d.ts.map +1 -0
  129. package/lib/native/buffer.test.js +64 -0
  130. package/lib/native/buffer.test.js.map +1 -0
  131. package/lib/native/diff.d.ts +20 -0
  132. package/lib/native/diff.d.ts.map +1 -0
  133. package/lib/native/diff.js +33 -0
  134. package/lib/native/diff.js.map +1 -0
  135. package/lib/native/diff.test.d.ts +2 -0
  136. package/lib/native/diff.test.d.ts.map +1 -0
  137. package/lib/native/diff.test.js +106 -0
  138. package/lib/native/diff.test.js.map +1 -0
  139. package/lib/native/region-old.d.ts +117 -0
  140. package/lib/native/region-old.d.ts.map +1 -0
  141. package/lib/native/region-old.js +539 -0
  142. package/lib/native/region-old.js.map +1 -0
  143. package/lib/native/region-renderer.d.ts +167 -0
  144. package/lib/native/region-renderer.d.ts.map +1 -0
  145. package/lib/native/region-renderer.js +1238 -0
  146. package/lib/native/region-renderer.js.map +1 -0
  147. package/lib/native/region-simple.d.ts +44 -0
  148. package/lib/native/region-simple.d.ts.map +1 -0
  149. package/lib/native/region-simple.js +290 -0
  150. package/lib/native/region-simple.js.map +1 -0
  151. package/lib/native/region.d.ts +53 -0
  152. package/lib/native/region.d.ts.map +1 -0
  153. package/lib/native/region.js +426 -0
  154. package/lib/native/region.js.map +1 -0
  155. package/lib/native/region.test.d.ts +2 -0
  156. package/lib/native/region.test.d.ts.map +1 -0
  157. package/lib/native/region.test.js +248 -0
  158. package/lib/native/region.test.js.map +1 -0
  159. package/lib/native/throttle.d.ts +29 -0
  160. package/lib/native/throttle.d.ts.map +1 -0
  161. package/lib/native/throttle.js +57 -0
  162. package/lib/native/throttle.js.map +1 -0
  163. package/lib/native/throttle.test.d.ts +2 -0
  164. package/lib/native/throttle.test.d.ts.map +1 -0
  165. package/lib/native/throttle.test.js +86 -0
  166. package/lib/native/throttle.test.js.map +1 -0
  167. package/lib/native.d.ts +5 -11
  168. package/lib/native.d.ts.map +1 -1
  169. package/lib/native.js +8 -64
  170. package/lib/native.js.map +1 -1
  171. package/lib/region.d.ts +48 -5
  172. package/lib/region.d.ts.map +1 -1
  173. package/lib/region.js +474 -36
  174. package/lib/region.js.map +1 -1
  175. package/lib/region.test.d.ts +2 -0
  176. package/lib/region.test.d.ts.map +1 -0
  177. package/lib/region.test.js +227 -0
  178. package/lib/region.test.js.map +1 -0
  179. package/lib/region.visual.test.d.ts +2 -0
  180. package/lib/region.visual.test.d.ts.map +1 -0
  181. package/lib/region.visual.test.js +55 -0
  182. package/lib/region.visual.test.js.map +1 -0
  183. package/lib/test-helpers/capturable-terminal.d.ts +61 -0
  184. package/lib/test-helpers/capturable-terminal.d.ts.map +1 -0
  185. package/lib/test-helpers/capturable-terminal.js +113 -0
  186. package/lib/test-helpers/capturable-terminal.js.map +1 -0
  187. package/lib/test-helpers/capturable-terminal.test.d.ts +2 -0
  188. package/lib/test-helpers/capturable-terminal.test.d.ts.map +1 -0
  189. package/lib/test-helpers/capturable-terminal.test.js +45 -0
  190. package/lib/test-helpers/capturable-terminal.test.js.map +1 -0
  191. package/lib/test-helpers/mock-region.d.ts +21 -0
  192. package/lib/test-helpers/mock-region.d.ts.map +1 -0
  193. package/lib/test-helpers/mock-region.js +37 -0
  194. package/lib/test-helpers/mock-region.js.map +1 -0
  195. package/lib/test-helpers/virtual-terminal-diff-reflow.test.d.ts +2 -0
  196. package/lib/test-helpers/virtual-terminal-diff-reflow.test.d.ts.map +1 -0
  197. package/lib/test-helpers/virtual-terminal-diff-reflow.test.js +256 -0
  198. package/lib/test-helpers/virtual-terminal-diff-reflow.test.js.map +1 -0
  199. package/lib/test-helpers/virtual-terminal-flex-resize.test.d.ts +2 -0
  200. package/lib/test-helpers/virtual-terminal-flex-resize.test.d.ts.map +1 -0
  201. package/lib/test-helpers/virtual-terminal-flex-resize.test.js +438 -0
  202. package/lib/test-helpers/virtual-terminal-flex-resize.test.js.map +1 -0
  203. package/lib/test-helpers/virtual-terminal.d.ts +176 -0
  204. package/lib/test-helpers/virtual-terminal.d.ts.map +1 -0
  205. package/lib/test-helpers/virtual-terminal.js +492 -0
  206. package/lib/test-helpers/virtual-terminal.js.map +1 -0
  207. package/lib/test-helpers/virtual-terminal.test.d.ts +2 -0
  208. package/lib/test-helpers/virtual-terminal.test.d.ts.map +1 -0
  209. package/lib/test-helpers/virtual-terminal.test.js +219 -0
  210. package/lib/test-helpers/virtual-terminal.test.js.map +1 -0
  211. package/lib/ts/components/spinner.test.d.ts +2 -0
  212. package/lib/ts/components/spinner.test.d.ts.map +1 -0
  213. package/lib/ts/components/spinner.test.js +168 -0
  214. package/lib/ts/components/spinner.test.js.map +1 -0
  215. package/lib/ts/utils/colors.test.d.ts +2 -0
  216. package/lib/ts/utils/colors.test.d.ts.map +1 -0
  217. package/lib/ts/utils/colors.test.js +87 -0
  218. package/lib/ts/utils/colors.test.js.map +1 -0
  219. package/lib/types.d.ts +8 -2
  220. package/lib/types.d.ts.map +1 -1
  221. package/lib/types.js.map +1 -1
  222. package/lib/utils/colors-simple.d.ts +51 -0
  223. package/lib/utils/colors-simple.d.ts.map +1 -0
  224. package/lib/utils/colors-simple.js +59 -0
  225. package/lib/utils/colors-simple.js.map +1 -0
  226. package/lib/utils/colors.d.ts +1 -1
  227. package/lib/utils/colors.d.ts.map +1 -1
  228. package/lib/utils/colors.js.map +1 -1
  229. package/lib/utils/colors.test.d.ts +2 -0
  230. package/lib/utils/colors.test.d.ts.map +1 -0
  231. package/lib/utils/colors.test.js +87 -0
  232. package/lib/utils/colors.test.js.map +1 -0
  233. package/lib/utils/cursor-position.d.ts +22 -0
  234. package/lib/utils/cursor-position.d.ts.map +1 -0
  235. package/lib/utils/cursor-position.js +139 -0
  236. package/lib/utils/cursor-position.js.map +1 -0
  237. package/lib/utils/debug-log.d.ts +2 -0
  238. package/lib/utils/debug-log.d.ts.map +1 -0
  239. package/lib/utils/debug-log.js +36 -0
  240. package/lib/utils/debug-log.js.map +1 -0
  241. package/lib/utils/terminal.d.ts +27 -0
  242. package/lib/utils/terminal.d.ts.map +1 -0
  243. package/lib/utils/terminal.js +116 -0
  244. package/lib/utils/terminal.js.map +1 -0
  245. package/lib/utils/text.d.ts +21 -0
  246. package/lib/utils/text.d.ts.map +1 -0
  247. package/lib/utils/text.js +82 -0
  248. package/lib/utils/text.js.map +1 -0
  249. package/lib/utils/wait-for-spacebar.d.ts +10 -0
  250. package/lib/utils/wait-for-spacebar.d.ts.map +1 -0
  251. package/lib/utils/wait-for-spacebar.js +71 -0
  252. package/lib/utils/wait-for-spacebar.js.map +1 -0
  253. package/package.json +35 -28
  254. package/.cursor/plan.md +0 -952
  255. package/TESTING.md +0 -102
  256. package/build.zig +0 -100
  257. package/examples/basic-progress.ts +0 -21
  258. package/examples/multi-lane.ts +0 -29
  259. package/examples/spinner.ts +0 -20
  260. package/examples/test-basic.ts +0 -23
  261. package/src/ts/components/progress-bar.ts +0 -53
  262. package/src/ts/components/spinner.ts +0 -56
  263. package/src/ts/index.ts +0 -37
  264. package/src/ts/native.ts +0 -86
  265. package/src/ts/region.ts +0 -89
  266. package/src/ts/types/ffi-napi.d.ts +0 -11
  267. package/src/ts/types/ref-napi.d.ts +0 -5
  268. package/src/ts/types.ts +0 -53
  269. package/src/ts/utils/colors.ts +0 -72
  270. package/src/zig/ansi.zig +0 -21
  271. package/src/zig/buffer.zig +0 -37
  272. package/src/zig/diff.zig +0 -43
  273. package/src/zig/region.zig +0 -292
  274. package/src/zig/renderer.zig +0 -92
  275. package/src/zig/test_ansi.zig +0 -66
  276. package/src/zig/test_buffer.zig +0 -82
  277. package/src/zig/test_diff.zig +0 -220
  278. package/src/zig/test_integration.zig +0 -76
  279. package/src/zig/test_region.zig +0 -191
  280. package/src/zig/test_runner.zig +0 -27
  281. package/src/zig/test_throttle.zig +0 -59
  282. package/src/zig/throttle.zig +0 -38
  283. package/tsconfig.json +0 -21
@@ -0,0 +1,421 @@
1
+ // CSS Grid-based layout system for terminal components
2
+ // Simplified grid that eliminates circular measurement complexity
3
+ import { applyStyle } from '../utils/colors';
4
+ function parseTemplateEntry(entry) {
5
+ if (typeof entry === 'number') {
6
+ return { type: 'fixed', value: entry };
7
+ }
8
+ if (typeof entry === 'string') {
9
+ // Parse flex unit: '1*', '2*', etc.
10
+ const match = entry.match(/^(\d+)\*$/);
11
+ if (match) {
12
+ return { type: 'flex', value: 0, flexRatio: parseInt(match[1], 10) };
13
+ }
14
+ throw new Error(`Invalid flex unit: ${entry}. Use format like '1*', '2*'`);
15
+ }
16
+ // Minmax: { min: 40, width: '2*' }
17
+ const match = entry.width.match(/^(\d+)\*$/);
18
+ if (match) {
19
+ return {
20
+ type: 'minmax',
21
+ value: entry.min,
22
+ flexRatio: parseInt(match[1], 10),
23
+ };
24
+ }
25
+ throw new Error(`Invalid minmax width: ${entry.width}. Use format like '2*'`);
26
+ }
27
+ /**
28
+ * Calculate column widths from template
29
+ * Reference: https://www.w3.org/TR/css-grid-1/#track-sizing
30
+ */
31
+ function calculateColumnWidths(template, availableWidth, columnGap, numChildren) {
32
+ // Expand template if needed (repeat last value)
33
+ const expandedTemplate = [];
34
+ for (let i = 0; i < numChildren; i++) {
35
+ if (i < template.length) {
36
+ expandedTemplate.push(template[i]);
37
+ }
38
+ else {
39
+ // Repeat last template value
40
+ expandedTemplate.push(template[template.length - 1] ?? '1*');
41
+ }
42
+ }
43
+ // If template is empty, use equal flex for all
44
+ if (expandedTemplate.length === 0) {
45
+ expandedTemplate.push('1*');
46
+ }
47
+ // Parse all template entries
48
+ const tracks = expandedTemplate.map(parseTemplateEntry);
49
+ // Step 1: Calculate fixed track sizes
50
+ let fixedTotal = 0;
51
+ let flexTotal = 0;
52
+ const widths = new Array(tracks.length);
53
+ for (let i = 0; i < tracks.length; i++) {
54
+ const track = tracks[i];
55
+ if (track.type === 'fixed') {
56
+ widths[i] = track.value;
57
+ fixedTotal += track.value;
58
+ }
59
+ else if (track.type === 'flex') {
60
+ widths[i] = 0; // Will be calculated
61
+ flexTotal += track.flexRatio ?? 1;
62
+ }
63
+ else if (track.type === 'minmax') {
64
+ widths[i] = track.value; // Start with min
65
+ fixedTotal += track.value;
66
+ flexTotal += track.flexRatio ?? 1;
67
+ }
68
+ }
69
+ // Step 2: Calculate gap space
70
+ const gapSpace = columnGap * (tracks.length - 1);
71
+ const remainingSpace = availableWidth - fixedTotal - gapSpace;
72
+ // Step 3: Distribute remaining space to flex tracks proportionally
73
+ if (flexTotal > 0 && remainingSpace > 0) {
74
+ const flexUnit = remainingSpace / flexTotal;
75
+ for (let i = 0; i < tracks.length; i++) {
76
+ const track = tracks[i];
77
+ if (track.type === 'flex') {
78
+ widths[i] = (track.flexRatio ?? 1) * flexUnit;
79
+ }
80
+ else if (track.type === 'minmax') {
81
+ // Add flex space to min width
82
+ widths[i] = track.value + (track.flexRatio ?? 1) * flexUnit;
83
+ }
84
+ }
85
+ }
86
+ // Step 4: Round to integers
87
+ return widths.map(w => Math.floor(w));
88
+ }
89
+ /**
90
+ * Create a grid component that renders to region
91
+ */
92
+ export function createGrid(region, options, ...children) {
93
+ return {
94
+ getHeight() {
95
+ // Calculate height by rendering children and checking for multi-line
96
+ const { template, columnGap = 0 } = options;
97
+ const validChildren = children.filter(c => c !== null && c !== undefined);
98
+ if (validChildren.length === 0) {
99
+ return 0;
100
+ }
101
+ const columnWidths = calculateColumnWidths(template, region.width, columnGap, validChildren.length);
102
+ let maxLines = 1;
103
+ for (let i = 0; i < validChildren.length; i++) {
104
+ const child = validChildren[i];
105
+ const width = columnWidths[i] ?? 0;
106
+ const childCtx = {
107
+ availableWidth: width,
108
+ region: region,
109
+ columnIndex: i,
110
+ rowIndex: 0,
111
+ };
112
+ const result = child(childCtx);
113
+ if (result !== null) {
114
+ const lines = Array.isArray(result) ? result.length : 1;
115
+ maxLines = Math.max(maxLines, lines);
116
+ }
117
+ }
118
+ return maxLines;
119
+ },
120
+ render(x, y, width) {
121
+ const { template, columnGap = 0, spaceBetween, justify = 'start' } = options;
122
+ // Filter out null children
123
+ const validChildren = children.filter(c => c !== null && c !== undefined);
124
+ if (validChildren.length === 0) {
125
+ return;
126
+ }
127
+ // Calculate column widths
128
+ const columnWidths = calculateColumnWidths(template, width, columnGap, validChildren.length);
129
+ // Handle justify: 'space-between'
130
+ let startX = x;
131
+ let actualWidths = columnWidths;
132
+ if (justify === 'space-between' && validChildren.length > 1) {
133
+ const firstWidth = columnWidths[0];
134
+ const lastWidth = columnWidths[columnWidths.length - 1];
135
+ const middleTotal = columnWidths.slice(1, -1).reduce((sum, w) => sum + w, 0);
136
+ const middleFlex = width - firstWidth - lastWidth - (columnGap * (validChildren.length - 1));
137
+ actualWidths = [firstWidth];
138
+ for (let i = 1; i < columnWidths.length - 1; i++) {
139
+ const ratio = middleTotal > 0 ? columnWidths[i] / middleTotal : 1 / (columnWidths.length - 2);
140
+ actualWidths.push(Math.floor(middleFlex * ratio));
141
+ }
142
+ actualWidths.push(lastWidth);
143
+ }
144
+ // Render each child and collect results
145
+ const results = [];
146
+ let currentX = startX;
147
+ for (let i = 0; i < validChildren.length; i++) {
148
+ const child = validChildren[i];
149
+ const childWidth = actualWidths[i] ?? 0;
150
+ // Create context for child
151
+ const childCtx = {
152
+ availableWidth: childWidth,
153
+ region: region,
154
+ columnIndex: i,
155
+ rowIndex: 0,
156
+ };
157
+ // Render child
158
+ const result = child(childCtx);
159
+ results.push(result);
160
+ // Handle spaceBetween
161
+ if (i < validChildren.length - 1 && spaceBetween) {
162
+ const spaceChar = typeof spaceBetween === 'string'
163
+ ? spaceBetween
164
+ : Array.isArray(spaceBetween)
165
+ ? (spaceBetween[i] ?? spaceBetween[spaceBetween.length - 1])
166
+ : spaceBetween.char;
167
+ const spaceColor = typeof spaceBetween === 'object' && !Array.isArray(spaceBetween)
168
+ ? spaceBetween.color
169
+ : undefined;
170
+ const gapText = spaceChar.repeat(columnGap);
171
+ results.push(spaceColor ? applyStyle(gapText, { color: spaceColor }) : gapText);
172
+ }
173
+ currentX += childWidth + columnGap;
174
+ }
175
+ // Handle multi-line: if any result is string[], expand grid vertically
176
+ const maxLines = Math.max(...results.map(r => Array.isArray(r) ? r.length : 1), 1);
177
+ // Render line by line
178
+ for (let lineIdx = 0; lineIdx < maxLines; lineIdx++) {
179
+ const lineParts = [];
180
+ let partIdx = 0;
181
+ for (let i = 0; i < validChildren.length; i++) {
182
+ const result = results[partIdx];
183
+ partIdx++;
184
+ const columnWidth = actualWidths[i] ?? 0;
185
+ if (result === null) {
186
+ // Null result - pad to column width
187
+ lineParts.push(' '.repeat(columnWidth));
188
+ continue;
189
+ }
190
+ let columnContent;
191
+ if (Array.isArray(result)) {
192
+ columnContent = result[lineIdx] ?? '';
193
+ }
194
+ else {
195
+ columnContent = lineIdx === 0 ? result : '';
196
+ }
197
+ // CRITICAL: Pad each column to its allocated width
198
+ // This ensures flex columns actually fill their allocated space
199
+ const plainContent = columnContent.replace(/\x1b\[[0-9;]*m/g, '');
200
+ const paddedContent = plainContent.length < columnWidth
201
+ ? columnContent + ' '.repeat(columnWidth - plainContent.length)
202
+ : columnContent;
203
+ lineParts.push(paddedContent);
204
+ // Add gap (spaceBetween or spaces) if not last
205
+ if (i < validChildren.length - 1 && columnGap > 0) {
206
+ if (spaceBetween) {
207
+ const spaceChar = typeof spaceBetween === 'string'
208
+ ? spaceBetween
209
+ : Array.isArray(spaceBetween)
210
+ ? (spaceBetween[i] ?? spaceBetween[spaceBetween.length - 1])
211
+ : spaceBetween.char;
212
+ const spaceColor = typeof spaceBetween === 'object' && !Array.isArray(spaceBetween)
213
+ ? spaceBetween.color
214
+ : undefined;
215
+ const gapText = spaceChar.repeat(columnGap);
216
+ lineParts.push(spaceColor ? applyStyle(gapText, { color: spaceColor }) : gapText);
217
+ partIdx++; // spaceBetween adds an extra result
218
+ }
219
+ else {
220
+ // Just add spaces for columnGap
221
+ lineParts.push(' '.repeat(columnGap));
222
+ }
223
+ }
224
+ }
225
+ const line = lineParts.join('');
226
+ const lineY = y + lineIdx;
227
+ // CRITICAL: Pad line to full width to ensure grid fills the region
228
+ // This ensures grids are always full-width by default
229
+ const plainLine = line.replace(/\x1b\[[0-9;]*m/g, '');
230
+ const paddedLine = plainLine.length < width
231
+ ? line + ' '.repeat(width - plainLine.length)
232
+ : line;
233
+ // For now, just set the line (we can add merging later if needed)
234
+ region.setLine(lineY, paddedLine);
235
+ }
236
+ },
237
+ };
238
+ }
239
+ /**
240
+ * Create a grid component (function-based API)
241
+ * This returns a Component that can be used in other grids
242
+ */
243
+ export function grid(options, ...children) {
244
+ return (ctx) => {
245
+ const { template, columnGap = 0, spaceBetween, justify = 'start' } = options;
246
+ // Filter out null children (from when conditions)
247
+ const validChildren = children.filter(c => c !== null && c !== undefined);
248
+ if (validChildren.length === 0) {
249
+ return null;
250
+ }
251
+ // Calculate column widths
252
+ const columnWidths = calculateColumnWidths(template, ctx.availableWidth, columnGap, validChildren.length);
253
+ // Handle justify: 'space-between'
254
+ let startX = 0;
255
+ let actualWidths = columnWidths;
256
+ if (justify === 'space-between' && validChildren.length > 1) {
257
+ // First and last get their widths, middle flexes
258
+ const firstWidth = columnWidths[0];
259
+ const lastWidth = columnWidths[columnWidths.length - 1];
260
+ const middleTotal = columnWidths.slice(1, -1).reduce((sum, w) => sum + w, 0);
261
+ const middleFlex = ctx.availableWidth - firstWidth - lastWidth - (columnGap * (validChildren.length - 1));
262
+ actualWidths = [firstWidth];
263
+ for (let i = 1; i < columnWidths.length - 1; i++) {
264
+ // Distribute middle space proportionally
265
+ const ratio = columnWidths[i] / middleTotal;
266
+ actualWidths.push(Math.floor(middleFlex * ratio));
267
+ }
268
+ actualWidths.push(lastWidth);
269
+ }
270
+ // Render each child
271
+ const results = [];
272
+ let currentX = startX;
273
+ for (let i = 0; i < validChildren.length; i++) {
274
+ const child = validChildren[i];
275
+ const width = actualWidths[i] ?? 0;
276
+ // Create context for child
277
+ const childCtx = {
278
+ availableWidth: width,
279
+ region: ctx.region,
280
+ columnIndex: i,
281
+ rowIndex: 0,
282
+ };
283
+ // Render child
284
+ const result = child(childCtx);
285
+ results.push(result);
286
+ // Handle gap (spaceBetween or spaces)
287
+ if (i < validChildren.length - 1 && columnGap > 0) {
288
+ if (spaceBetween) {
289
+ const spaceChar = typeof spaceBetween === 'string'
290
+ ? spaceBetween
291
+ : Array.isArray(spaceBetween)
292
+ ? (spaceBetween[i] ?? spaceBetween[spaceBetween.length - 1])
293
+ : spaceBetween.char;
294
+ const spaceColor = typeof spaceBetween === 'object' && !Array.isArray(spaceBetween)
295
+ ? spaceBetween.color
296
+ : undefined;
297
+ // Fill gap with space character
298
+ const gapText = spaceChar.repeat(columnGap);
299
+ results.push(spaceColor ? applyStyle(gapText, { color: spaceColor }) : gapText);
300
+ }
301
+ else {
302
+ // Just add spaces for columnGap
303
+ results.push(' '.repeat(columnGap));
304
+ }
305
+ }
306
+ currentX += width + columnGap;
307
+ }
308
+ // Handle multi-line: if any result is string[], expand grid vertically
309
+ const maxLines = Math.max(...results.map(r => Array.isArray(r) ? r.length : 1), 1);
310
+ if (maxLines === 1) {
311
+ // Single line - join all results with proper column padding
312
+ const lineParts = [];
313
+ let partIdx = 0;
314
+ for (let i = 0; i < validChildren.length; i++) {
315
+ const result = results[partIdx];
316
+ partIdx++;
317
+ const columnWidth = actualWidths[i] ?? 0;
318
+ if (result === null) {
319
+ // Null result - pad to column width
320
+ lineParts.push(' '.repeat(columnWidth));
321
+ }
322
+ else {
323
+ const columnContent = typeof result === 'string' ? result : '';
324
+ // CRITICAL: Pad each column to its allocated width
325
+ // This ensures flex columns actually fill their allocated space
326
+ const plainContent = columnContent.replace(/\x1b\[[0-9;]*m/g, '');
327
+ const paddedContent = plainContent.length < columnWidth
328
+ ? columnContent + ' '.repeat(columnWidth - plainContent.length)
329
+ : columnContent;
330
+ lineParts.push(paddedContent);
331
+ }
332
+ // Add gap (spaceBetween or spaces) if not last
333
+ if (i < validChildren.length - 1 && columnGap > 0) {
334
+ if (spaceBetween) {
335
+ const spaceChar = typeof spaceBetween === 'string'
336
+ ? spaceBetween
337
+ : Array.isArray(spaceBetween)
338
+ ? (spaceBetween[i] ?? spaceBetween[spaceBetween.length - 1])
339
+ : spaceBetween.char;
340
+ const spaceColor = typeof spaceBetween === 'object' && !Array.isArray(spaceBetween)
341
+ ? spaceBetween.color
342
+ : undefined;
343
+ const gapText = spaceChar.repeat(columnGap);
344
+ lineParts.push(spaceColor ? applyStyle(gapText, { color: spaceColor }) : gapText);
345
+ partIdx++; // spaceBetween adds an extra result
346
+ }
347
+ else {
348
+ // Just add spaces for columnGap
349
+ lineParts.push(' '.repeat(columnGap));
350
+ }
351
+ }
352
+ }
353
+ const line = lineParts.join('');
354
+ // CRITICAL: Pad line to full availableWidth to ensure grid fills the region
355
+ const plainLine = line.replace(/\x1b\[[0-9;]*m/g, '');
356
+ const paddedLine = plainLine.length < ctx.availableWidth
357
+ ? line + ' '.repeat(ctx.availableWidth - plainLine.length)
358
+ : line;
359
+ return paddedLine;
360
+ }
361
+ // Multi-line - combine line by line
362
+ const lines = [];
363
+ for (let lineIdx = 0; lineIdx < maxLines; lineIdx++) {
364
+ const lineParts = [];
365
+ let partIdx = 0;
366
+ for (let i = 0; i < validChildren.length; i++) {
367
+ const result = results[partIdx];
368
+ partIdx++;
369
+ const columnWidth = actualWidths[i] ?? 0;
370
+ if (result === null) {
371
+ // Null result - pad to column width
372
+ lineParts.push(' '.repeat(columnWidth));
373
+ continue;
374
+ }
375
+ let columnContent;
376
+ if (Array.isArray(result)) {
377
+ columnContent = result[lineIdx] ?? '';
378
+ }
379
+ else {
380
+ columnContent = lineIdx === 0 ? result : '';
381
+ }
382
+ // CRITICAL: Pad each column to its allocated width
383
+ // This ensures flex columns actually fill their allocated space
384
+ const plainContent = columnContent.replace(/\x1b\[[0-9;]*m/g, '');
385
+ const paddedContent = plainContent.length < columnWidth
386
+ ? columnContent + ' '.repeat(columnWidth - plainContent.length)
387
+ : columnContent;
388
+ lineParts.push(paddedContent);
389
+ // Add gap (spaceBetween or spaces) if not last
390
+ if (i < validChildren.length - 1 && columnGap > 0) {
391
+ if (spaceBetween) {
392
+ const spaceChar = typeof spaceBetween === 'string'
393
+ ? spaceBetween
394
+ : Array.isArray(spaceBetween)
395
+ ? (spaceBetween[i] ?? spaceBetween[spaceBetween.length - 1])
396
+ : spaceBetween.char;
397
+ const spaceColor = typeof spaceBetween === 'object' && !Array.isArray(spaceBetween)
398
+ ? spaceBetween.color
399
+ : undefined;
400
+ const gapText = spaceChar.repeat(columnGap);
401
+ lineParts.push(spaceColor ? applyStyle(gapText, { color: spaceColor }) : gapText);
402
+ partIdx++; // spaceBetween adds an extra result
403
+ }
404
+ else {
405
+ // Just add spaces for columnGap
406
+ lineParts.push(' '.repeat(columnGap));
407
+ }
408
+ }
409
+ }
410
+ const line = lineParts.join('');
411
+ // CRITICAL: Pad line to full width to ensure grid fills the region
412
+ const plainLine = line.replace(/\x1b\[[0-9;]*m/g, '');
413
+ const paddedLine = plainLine.length < ctx.availableWidth
414
+ ? line + ' '.repeat(ctx.availableWidth - plainLine.length)
415
+ : line;
416
+ lines.push(paddedLine);
417
+ }
418
+ return lines;
419
+ };
420
+ }
421
+ //# sourceMappingURL=grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.js","sourceRoot":"","sources":["../../src/layout/grid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=grid.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.test.d.ts","sourceRoot":"","sources":["../../src/layout/grid.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,139 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { createGrid, grid } from './grid';
3
+ import { style } from '../components/style';
4
+ import { TerminalRegion } from '../region';
5
+ describe('Grid Layout', () => {
6
+ let region;
7
+ beforeEach(() => {
8
+ region = new TerminalRegion({ disableRendering: true, width: 80 });
9
+ });
10
+ describe('createGrid', () => {
11
+ it('should create a grid component', () => {
12
+ const gridComponent = createGrid(region, { template: [20, '1*'] }, style({}, 'A'), style({}, 'B'));
13
+ expect(gridComponent).toBeDefined();
14
+ expect(gridComponent.getHeight()).toBe(1);
15
+ });
16
+ it('should calculate column widths correctly', () => {
17
+ const gridComponent = createGrid(region, { template: [20, '1*'] }, style({}, 'A'), style({}, 'B'));
18
+ gridComponent.render(0, 1, 80);
19
+ // First column should be 20, second should be 60 (80 - 20)
20
+ const line = region.getLine(1);
21
+ expect(line).toContain('A');
22
+ expect(line).toContain('B');
23
+ });
24
+ it('should handle flex ratios', () => {
25
+ const gridComponent = createGrid(region, { template: ['1*', '2*', '1*'] }, style({}, 'A'), style({}, 'B'), style({}, 'C'));
26
+ gridComponent.render(0, 1, 60);
27
+ // Total flex = 4, so each 1* gets 15, 2* gets 30
28
+ const line = region.getLine(1);
29
+ expect(line).toContain('A');
30
+ expect(line).toContain('B');
31
+ expect(line).toContain('C');
32
+ });
33
+ it('should handle minmax', () => {
34
+ const gridComponent = createGrid(region, { template: [{ min: 40, width: '2*' }, '1*'] }, style({}, 'A'), style({}, 'B'));
35
+ gridComponent.render(0, 1, 80);
36
+ const line = region.getLine(1);
37
+ expect(line).toContain('A');
38
+ expect(line).toContain('B');
39
+ });
40
+ it('should handle columnGap', () => {
41
+ const gridComponent = createGrid(region, { template: [20, 20], columnGap: 2 }, style({}, 'A'.repeat(20)), style({}, 'B'.repeat(20)));
42
+ gridComponent.render(0, 1, 80);
43
+ const line = region.getLine(1);
44
+ const plain = line.replace(/\x1b\[[0-9;]*m/g, '');
45
+ // Should have 2 spaces between columns
46
+ const firstColEnd = plain.indexOf('A'.repeat(20)) + 20;
47
+ const secondColStart = plain.indexOf('B'.repeat(20));
48
+ expect(secondColStart - firstColEnd).toBeGreaterThanOrEqual(2);
49
+ });
50
+ it('should handle spaceBetween', () => {
51
+ const gridComponent = createGrid(region, { template: [20, 20], columnGap: 2, spaceBetween: '─' }, style({}, 'A'), style({}, 'B'));
52
+ gridComponent.render(0, 1, 80);
53
+ const line = region.getLine(1);
54
+ const plain = line.replace(/\x1b\[[0-9;]*m/g, '');
55
+ // Should have ─ characters between A and B
56
+ expect(plain).toContain('─');
57
+ });
58
+ it('should handle spaceBetween with color', () => {
59
+ const gridComponent = createGrid(region, {
60
+ template: [20, 20],
61
+ columnGap: 2,
62
+ spaceBetween: { char: '─', color: 'brightBlack' }
63
+ }, style({}, 'A'), style({}, 'B'));
64
+ gridComponent.render(0, 1, 80);
65
+ const line = region.getLine(1);
66
+ expect(line).toContain('─');
67
+ });
68
+ it('should handle justify space-between', () => {
69
+ const gridComponent = createGrid(region, {
70
+ template: [10, '1*', 10],
71
+ justify: 'space-between'
72
+ }, style({}, 'Left'), style({}, 'Middle'), style({}, 'Right'));
73
+ gridComponent.render(0, 1, 80);
74
+ const line = region.getLine(1);
75
+ expect(line).toContain('Left');
76
+ expect(line).toContain('Right');
77
+ });
78
+ it('should handle null components (from when condition)', () => {
79
+ const gridComponent = createGrid(region, { template: [20, '1*'] }, style({}, 'A'), style({ when: () => false }, 'B') // Returns null
80
+ );
81
+ gridComponent.render(0, 1, 80);
82
+ const line = region.getLine(1);
83
+ expect(line).toContain('A');
84
+ expect(line).not.toContain('B');
85
+ });
86
+ it('should handle multi-line content', () => {
87
+ const gridComponent = createGrid(region, { template: [20, '1*'] }, style({}, 'A'), style({}, ['Line 1', 'Line 2']));
88
+ expect(gridComponent.getHeight()).toBe(2);
89
+ gridComponent.render(0, 1, 80);
90
+ expect(region.getLine(1)).toContain('A');
91
+ expect(region.getLine(1)).toContain('Line 1');
92
+ expect(region.getLine(2)).toContain('Line 2');
93
+ });
94
+ it('should auto-repeat template for extra children', () => {
95
+ const gridComponent = createGrid(region, { template: [20, '1*'] }, style({}, 'A'), style({}, 'B'), style({}, 'C'), // Should use '1*' (repeated)
96
+ style({}, 'D') // Should use '1*' (repeated)
97
+ );
98
+ gridComponent.render(0, 1, 80);
99
+ const line = region.getLine(1);
100
+ expect(line).toContain('A');
101
+ expect(line).toContain('B');
102
+ expect(line).toContain('C');
103
+ expect(line).toContain('D');
104
+ });
105
+ it('should handle empty template (all equal flex)', () => {
106
+ const gridComponent = createGrid(region, { template: [] }, style({}, 'A'), style({}, 'B'), style({}, 'C'));
107
+ gridComponent.render(0, 1, 60);
108
+ const line = region.getLine(1);
109
+ expect(line).toContain('A');
110
+ expect(line).toContain('B');
111
+ expect(line).toContain('C');
112
+ });
113
+ });
114
+ describe('grid (Component API)', () => {
115
+ it('should return a Component', () => {
116
+ const component = grid({ template: [20, '1*'] }, style({}, 'A'), style({}, 'B'));
117
+ expect(typeof component).toBe('function');
118
+ const result = component({
119
+ availableWidth: 80,
120
+ region: region,
121
+ columnIndex: 0,
122
+ rowIndex: 0,
123
+ });
124
+ expect(result).toBeTruthy();
125
+ expect(typeof result === 'string' || Array.isArray(result)).toBe(true);
126
+ });
127
+ it('should return null if all children are null', () => {
128
+ const component = grid({ template: [20, '1*'] }, style({ when: () => false }, 'A'), style({ when: () => false }, 'B'));
129
+ const result = component({
130
+ availableWidth: 80,
131
+ region: region,
132
+ columnIndex: 0,
133
+ rowIndex: 0,
134
+ });
135
+ expect(result).toBeNull();
136
+ });
137
+ });
138
+ });
139
+ //# sourceMappingURL=grid.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.test.js","sourceRoot":"","sources":["../../src/layout/grid.test.ts"],"names":[],"mappings":"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"}