linecraft 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +313 -64
- package/lib/api/color.d.ts +6 -0
- package/lib/api/color.d.ts.map +1 -0
- package/lib/api/color.js +9 -0
- package/lib/api/color.js.map +1 -0
- package/lib/api/color.test.d.ts +2 -0
- package/lib/api/color.test.d.ts.map +1 -0
- package/lib/api/color.test.js +23 -0
- package/lib/api/color.test.js.map +1 -0
- package/lib/api/flex.d.ts +55 -0
- package/lib/api/flex.d.ts.map +1 -0
- package/lib/api/flex.js +86 -0
- package/lib/api/flex.js.map +1 -0
- package/lib/api/flex.test.d.ts +2 -0
- package/lib/api/flex.test.d.ts.map +1 -0
- package/lib/api/flex.test.js +82 -0
- package/lib/api/flex.test.js.map +1 -0
- package/lib/api/grid.d.ts +22 -0
- package/lib/api/grid.d.ts.map +1 -0
- package/lib/api/grid.js +65 -0
- package/lib/api/grid.js.map +1 -0
- package/lib/api/grid.test.d.ts +2 -0
- package/lib/api/grid.test.d.ts.map +1 -0
- package/lib/api/grid.test.js +48 -0
- package/lib/api/grid.test.js.map +1 -0
- package/lib/components/base.d.ts +53 -0
- package/lib/components/base.d.ts.map +1 -0
- package/lib/components/base.js +47 -0
- package/lib/components/base.js.map +1 -0
- package/lib/components/col.d.ts +35 -0
- package/lib/components/col.d.ts.map +1 -0
- package/lib/components/col.js +168 -0
- package/lib/components/col.js.map +1 -0
- package/lib/components/col.test.d.ts +2 -0
- package/lib/components/col.test.d.ts.map +1 -0
- package/lib/components/col.test.js +96 -0
- package/lib/components/col.test.js.map +1 -0
- package/lib/components/index.d.ts +3 -0
- package/lib/components/index.d.ts.map +1 -0
- package/lib/components/index.js +5 -0
- package/lib/components/index.js.map +1 -0
- package/lib/components/progress-bar-grid.d.ts +20 -0
- package/lib/components/progress-bar-grid.d.ts.map +1 -0
- package/lib/components/progress-bar-grid.js +44 -0
- package/lib/components/progress-bar-grid.js.map +1 -0
- package/lib/components/progress-bar-grid.test.d.ts +2 -0
- package/lib/components/progress-bar-grid.test.d.ts.map +1 -0
- package/lib/components/progress-bar-grid.test.js +101 -0
- package/lib/components/progress-bar-grid.test.js.map +1 -0
- package/lib/components/progress-bar.d.ts +26 -3
- package/lib/components/progress-bar.d.ts.map +1 -1
- package/lib/components/progress-bar.js +62 -6
- package/lib/components/progress-bar.js.map +1 -1
- package/lib/components/progress-bar.test.d.ts +2 -0
- package/lib/components/progress-bar.test.d.ts.map +1 -0
- package/lib/components/progress-bar.test.js +153 -0
- package/lib/components/progress-bar.test.js.map +1 -0
- package/lib/components/prompt.d.ts +14 -0
- package/lib/components/prompt.d.ts.map +1 -0
- package/lib/components/prompt.js +77 -0
- package/lib/components/prompt.js.map +1 -0
- package/lib/components/renderable.d.ts +42 -0
- package/lib/components/renderable.d.ts.map +1 -0
- package/lib/components/renderable.js +225 -0
- package/lib/components/renderable.js.map +1 -0
- package/lib/components/spinner.d.ts +2 -2
- package/lib/components/spinner.d.ts.map +1 -1
- package/lib/components/spinner.js +3 -1
- package/lib/components/spinner.js.map +1 -1
- package/lib/components/spinner.test.d.ts +2 -0
- package/lib/components/spinner.test.d.ts.map +1 -0
- package/lib/components/spinner.test.js +168 -0
- package/lib/components/spinner.test.js.map +1 -0
- package/lib/components/style.d.ts +16 -0
- package/lib/components/style.d.ts.map +1 -0
- package/lib/components/style.js +72 -0
- package/lib/components/style.js.map +1 -0
- package/lib/components/style.test.d.ts +2 -0
- package/lib/components/style.test.d.ts.map +1 -0
- package/lib/components/style.test.js +135 -0
- package/lib/components/style.test.js.map +1 -0
- package/lib/components/text.d.ts +24 -0
- package/lib/components/text.d.ts.map +1 -0
- package/lib/components/text.js +65 -0
- package/lib/components/text.js.map +1 -0
- package/lib/drawing/boxes.d.ts +33 -0
- package/lib/drawing/boxes.d.ts.map +1 -0
- package/lib/drawing/boxes.js +76 -0
- package/lib/drawing/boxes.js.map +1 -0
- package/lib/index.d.ts +18 -11
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +21 -10
- package/lib/index.js.map +1 -1
- package/lib/index.test.d.ts +2 -0
- package/lib/index.test.d.ts.map +1 -0
- package/lib/index.test.js +80 -0
- package/lib/index.test.js.map +1 -0
- package/lib/layout/flex.d.ts +39 -0
- package/lib/layout/flex.d.ts.map +1 -0
- package/lib/layout/flex.js +300 -0
- package/lib/layout/flex.js.map +1 -0
- package/lib/layout/flex.test.d.ts +2 -0
- package/lib/layout/flex.test.d.ts.map +1 -0
- package/lib/layout/flex.test.js +206 -0
- package/lib/layout/flex.test.js.map +1 -0
- package/lib/layout/grid.d.ts +53 -0
- package/lib/layout/grid.d.ts.map +1 -0
- package/lib/layout/grid.js +421 -0
- package/lib/layout/grid.js.map +1 -0
- package/lib/layout/grid.test.d.ts +2 -0
- package/lib/layout/grid.test.d.ts.map +1 -0
- package/lib/layout/grid.test.js +139 -0
- package/lib/layout/grid.test.js.map +1 -0
- package/lib/native/ansi.d.ts +104 -0
- package/lib/native/ansi.d.ts.map +1 -0
- package/lib/native/ansi.js +120 -0
- package/lib/native/ansi.js.map +1 -0
- package/lib/native/ansi.test.d.ts +2 -0
- package/lib/native/ansi.test.d.ts.map +1 -0
- package/lib/native/ansi.test.js +57 -0
- package/lib/native/ansi.test.js.map +1 -0
- package/lib/native/buffer.d.ts +32 -0
- package/lib/native/buffer.d.ts.map +1 -0
- package/lib/native/buffer.js +49 -0
- package/lib/native/buffer.js.map +1 -0
- package/lib/native/buffer.test.d.ts +2 -0
- package/lib/native/buffer.test.d.ts.map +1 -0
- package/lib/native/buffer.test.js +64 -0
- package/lib/native/buffer.test.js.map +1 -0
- package/lib/native/diff.d.ts +20 -0
- package/lib/native/diff.d.ts.map +1 -0
- package/lib/native/diff.js +33 -0
- package/lib/native/diff.js.map +1 -0
- package/lib/native/diff.test.d.ts +2 -0
- package/lib/native/diff.test.d.ts.map +1 -0
- package/lib/native/diff.test.js +106 -0
- package/lib/native/diff.test.js.map +1 -0
- package/lib/native/region-old.d.ts +117 -0
- package/lib/native/region-old.d.ts.map +1 -0
- package/lib/native/region-old.js +539 -0
- package/lib/native/region-old.js.map +1 -0
- package/lib/native/region-renderer.d.ts +167 -0
- package/lib/native/region-renderer.d.ts.map +1 -0
- package/lib/native/region-renderer.js +1238 -0
- package/lib/native/region-renderer.js.map +1 -0
- package/lib/native/region-simple.d.ts +44 -0
- package/lib/native/region-simple.d.ts.map +1 -0
- package/lib/native/region-simple.js +290 -0
- package/lib/native/region-simple.js.map +1 -0
- package/lib/native/region.d.ts +53 -0
- package/lib/native/region.d.ts.map +1 -0
- package/lib/native/region.js +426 -0
- package/lib/native/region.js.map +1 -0
- package/lib/native/region.test.d.ts +2 -0
- package/lib/native/region.test.d.ts.map +1 -0
- package/lib/native/region.test.js +248 -0
- package/lib/native/region.test.js.map +1 -0
- package/lib/native/throttle.d.ts +29 -0
- package/lib/native/throttle.d.ts.map +1 -0
- package/lib/native/throttle.js +57 -0
- package/lib/native/throttle.js.map +1 -0
- package/lib/native/throttle.test.d.ts +2 -0
- package/lib/native/throttle.test.d.ts.map +1 -0
- package/lib/native/throttle.test.js +86 -0
- package/lib/native/throttle.test.js.map +1 -0
- package/lib/native.d.ts +5 -11
- package/lib/native.d.ts.map +1 -1
- package/lib/native.js +8 -64
- package/lib/native.js.map +1 -1
- package/lib/region.d.ts +48 -5
- package/lib/region.d.ts.map +1 -1
- package/lib/region.js +474 -36
- package/lib/region.js.map +1 -1
- package/lib/region.test.d.ts +2 -0
- package/lib/region.test.d.ts.map +1 -0
- package/lib/region.test.js +227 -0
- package/lib/region.test.js.map +1 -0
- package/lib/region.visual.test.d.ts +2 -0
- package/lib/region.visual.test.d.ts.map +1 -0
- package/lib/region.visual.test.js +55 -0
- package/lib/region.visual.test.js.map +1 -0
- package/lib/test-helpers/capturable-terminal.d.ts +61 -0
- package/lib/test-helpers/capturable-terminal.d.ts.map +1 -0
- package/lib/test-helpers/capturable-terminal.js +113 -0
- package/lib/test-helpers/capturable-terminal.js.map +1 -0
- package/lib/test-helpers/capturable-terminal.test.d.ts +2 -0
- package/lib/test-helpers/capturable-terminal.test.d.ts.map +1 -0
- package/lib/test-helpers/capturable-terminal.test.js +45 -0
- package/lib/test-helpers/capturable-terminal.test.js.map +1 -0
- package/lib/test-helpers/mock-region.d.ts +21 -0
- package/lib/test-helpers/mock-region.d.ts.map +1 -0
- package/lib/test-helpers/mock-region.js +37 -0
- package/lib/test-helpers/mock-region.js.map +1 -0
- package/lib/test-helpers/virtual-terminal-diff-reflow.test.d.ts +2 -0
- package/lib/test-helpers/virtual-terminal-diff-reflow.test.d.ts.map +1 -0
- package/lib/test-helpers/virtual-terminal-diff-reflow.test.js +256 -0
- package/lib/test-helpers/virtual-terminal-diff-reflow.test.js.map +1 -0
- package/lib/test-helpers/virtual-terminal-flex-resize.test.d.ts +2 -0
- package/lib/test-helpers/virtual-terminal-flex-resize.test.d.ts.map +1 -0
- package/lib/test-helpers/virtual-terminal-flex-resize.test.js +438 -0
- package/lib/test-helpers/virtual-terminal-flex-resize.test.js.map +1 -0
- package/lib/test-helpers/virtual-terminal.d.ts +176 -0
- package/lib/test-helpers/virtual-terminal.d.ts.map +1 -0
- package/lib/test-helpers/virtual-terminal.js +492 -0
- package/lib/test-helpers/virtual-terminal.js.map +1 -0
- package/lib/test-helpers/virtual-terminal.test.d.ts +2 -0
- package/lib/test-helpers/virtual-terminal.test.d.ts.map +1 -0
- package/lib/test-helpers/virtual-terminal.test.js +219 -0
- package/lib/test-helpers/virtual-terminal.test.js.map +1 -0
- package/lib/ts/components/spinner.test.d.ts +2 -0
- package/lib/ts/components/spinner.test.d.ts.map +1 -0
- package/lib/ts/components/spinner.test.js +168 -0
- package/lib/ts/components/spinner.test.js.map +1 -0
- package/lib/ts/utils/colors.test.d.ts +2 -0
- package/lib/ts/utils/colors.test.d.ts.map +1 -0
- package/lib/ts/utils/colors.test.js +87 -0
- package/lib/ts/utils/colors.test.js.map +1 -0
- package/lib/types.d.ts +8 -2
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js.map +1 -1
- package/lib/utils/colors-simple.d.ts +51 -0
- package/lib/utils/colors-simple.d.ts.map +1 -0
- package/lib/utils/colors-simple.js +59 -0
- package/lib/utils/colors-simple.js.map +1 -0
- package/lib/utils/colors.d.ts +1 -1
- package/lib/utils/colors.d.ts.map +1 -1
- package/lib/utils/colors.js.map +1 -1
- package/lib/utils/colors.test.d.ts +2 -0
- package/lib/utils/colors.test.d.ts.map +1 -0
- package/lib/utils/colors.test.js +87 -0
- package/lib/utils/colors.test.js.map +1 -0
- package/lib/utils/cursor-position.d.ts +22 -0
- package/lib/utils/cursor-position.d.ts.map +1 -0
- package/lib/utils/cursor-position.js +139 -0
- package/lib/utils/cursor-position.js.map +1 -0
- package/lib/utils/debug-log.d.ts +2 -0
- package/lib/utils/debug-log.d.ts.map +1 -0
- package/lib/utils/debug-log.js +36 -0
- package/lib/utils/debug-log.js.map +1 -0
- package/lib/utils/terminal.d.ts +27 -0
- package/lib/utils/terminal.d.ts.map +1 -0
- package/lib/utils/terminal.js +116 -0
- package/lib/utils/terminal.js.map +1 -0
- package/lib/utils/text.d.ts +21 -0
- package/lib/utils/text.d.ts.map +1 -0
- package/lib/utils/text.js +82 -0
- package/lib/utils/text.js.map +1 -0
- package/lib/utils/wait-for-spacebar.d.ts +10 -0
- package/lib/utils/wait-for-spacebar.d.ts.map +1 -0
- package/lib/utils/wait-for-spacebar.js +71 -0
- package/lib/utils/wait-for-spacebar.js.map +1 -0
- package/package.json +31 -28
- package/.cursor/plan.md +0 -952
- package/TESTING.md +0 -102
- package/build.zig +0 -100
- package/examples/basic-progress.ts +0 -21
- package/examples/multi-lane.ts +0 -29
- package/examples/spinner.ts +0 -20
- package/examples/test-basic.ts +0 -23
- package/src/ts/components/progress-bar.ts +0 -53
- package/src/ts/components/spinner.ts +0 -56
- package/src/ts/index.ts +0 -37
- package/src/ts/native.ts +0 -86
- package/src/ts/region.ts +0 -89
- package/src/ts/types/ffi-napi.d.ts +0 -11
- package/src/ts/types/ref-napi.d.ts +0 -5
- package/src/ts/types.ts +0 -53
- package/src/ts/utils/colors.ts +0 -72
- package/src/zig/ansi.zig +0 -21
- package/src/zig/buffer.zig +0 -37
- package/src/zig/diff.zig +0 -43
- package/src/zig/region.zig +0 -292
- package/src/zig/renderer.zig +0 -92
- package/src/zig/test_ansi.zig +0 -66
- package/src/zig/test_buffer.zig +0 -82
- package/src/zig/test_diff.zig +0 -220
- package/src/zig/test_integration.zig +0 -76
- package/src/zig/test_region.zig +0 -191
- package/src/zig/test_runner.zig +0 -27
- package/src/zig/test_throttle.zig +0 -59
- package/src/zig/throttle.zig +0 -38
- package/tsconfig.json +0 -21
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { flex, col, resolveFlexTree } from './flex.js';
|
|
3
|
+
import { Flex } from '../layout/flex.js';
|
|
4
|
+
import { Col } from '../components/col.js';
|
|
5
|
+
describe('flex API', () => {
|
|
6
|
+
let region;
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
region = {
|
|
9
|
+
setLine: () => { },
|
|
10
|
+
width: 80,
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
describe('flex()', () => {
|
|
14
|
+
it('should create a flex descriptor', () => {
|
|
15
|
+
const descriptor = flex({ gap: 2 }, 'Hello', 'World');
|
|
16
|
+
expect(descriptor.type).toBe('flex');
|
|
17
|
+
expect(descriptor.options.gap).toBe(2);
|
|
18
|
+
expect(descriptor.children).toHaveLength(2);
|
|
19
|
+
expect(descriptor.children[0]).toBe('Hello');
|
|
20
|
+
expect(descriptor.children[1]).toBe('World');
|
|
21
|
+
});
|
|
22
|
+
it('should accept col descriptors as children', () => {
|
|
23
|
+
const colDesc = col({ flex: 1 }, 'Hello');
|
|
24
|
+
const descriptor = flex({ gap: 2 }, colDesc);
|
|
25
|
+
expect(descriptor.children[0]).toBe(colDesc);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
describe('col()', () => {
|
|
29
|
+
it('should create a col descriptor', () => {
|
|
30
|
+
const descriptor = col({ flex: 1 }, 'Hello');
|
|
31
|
+
expect(descriptor.type).toBe('col');
|
|
32
|
+
expect(descriptor.options.flex).toBe(1);
|
|
33
|
+
expect(descriptor.content).toBe('Hello');
|
|
34
|
+
});
|
|
35
|
+
it('should handle min and max options', () => {
|
|
36
|
+
const descriptor = col({ min: 5, max: 10 }, 'Hello');
|
|
37
|
+
expect(descriptor.options.min).toBe(5);
|
|
38
|
+
expect(descriptor.options.max).toBe(10);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe('resolveFlexTree', () => {
|
|
42
|
+
it('should resolve a flex descriptor to a Flex component', () => {
|
|
43
|
+
const descriptor = flex({ gap: 2 }, 'Hello', 'World');
|
|
44
|
+
const component = resolveFlexTree(region, descriptor);
|
|
45
|
+
expect(component).toBeInstanceOf(Flex);
|
|
46
|
+
});
|
|
47
|
+
it('should resolve a col descriptor to a Col component', () => {
|
|
48
|
+
const descriptor = col({ flex: 1 }, 'Hello');
|
|
49
|
+
const component = resolveFlexTree(region, descriptor);
|
|
50
|
+
expect(component).toBeInstanceOf(Col);
|
|
51
|
+
});
|
|
52
|
+
it('should wrap plain strings in Col components', () => {
|
|
53
|
+
const descriptor = flex({ gap: 2 }, 'Hello');
|
|
54
|
+
const component = resolveFlexTree(region, descriptor);
|
|
55
|
+
expect(component).toBeInstanceOf(Flex);
|
|
56
|
+
// Flex now handles strings directly, so children are Renderables
|
|
57
|
+
// We can't easily check the content, but we can verify it renders correctly
|
|
58
|
+
expect(component.getPreferredWidth()).toBeGreaterThan(0);
|
|
59
|
+
});
|
|
60
|
+
it('should resolve nested flex structures', () => {
|
|
61
|
+
const innerFlex = flex({ gap: 1 }, 'A', 'B');
|
|
62
|
+
const outerFlex = flex({ gap: 2 }, innerFlex, 'C');
|
|
63
|
+
const component = resolveFlexTree(region, outerFlex);
|
|
64
|
+
expect(component).toBeInstanceOf(Flex);
|
|
65
|
+
expect(component['children']).toHaveLength(2);
|
|
66
|
+
expect(component['children'][0]).toBeInstanceOf(Flex);
|
|
67
|
+
// 'C' is a string, which gets converted to a Renderable (not a Col instance)
|
|
68
|
+
// We can verify it's a Renderable by checking it has the required methods
|
|
69
|
+
expect(component['children'][1]).toHaveProperty('render');
|
|
70
|
+
expect(component['children'][1]).toHaveProperty('getPreferredWidth');
|
|
71
|
+
});
|
|
72
|
+
it('should apply col options correctly', () => {
|
|
73
|
+
const descriptor = col({ flex: 2, min: 10, max: 50 }, 'Hello');
|
|
74
|
+
const component = resolveFlexTree(region, descriptor);
|
|
75
|
+
expect(component).toBeInstanceOf(Col);
|
|
76
|
+
expect(component.flexGrow).toBe(2);
|
|
77
|
+
expect(component.getMinWidth()).toBe(10);
|
|
78
|
+
expect(component.getMaxWidth()).toBe(50);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=flex.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flex.test.js","sourceRoot":"","sources":["../../src/ts/api/flex.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { TerminalRegion } from '../region';
|
|
2
|
+
import { type GridComponent, type Component, type GridOptions } from '../layout/grid';
|
|
3
|
+
import { style, type StyleOptions } from '../components/style';
|
|
4
|
+
/**
|
|
5
|
+
* Create a grid descriptor (for use with region.set())
|
|
6
|
+
* This is the main API - returns a descriptor that region.set() can handle
|
|
7
|
+
*/
|
|
8
|
+
export declare function grid(options: GridOptions, ...children: (Component | string | GridDescriptor)[]): GridDescriptor;
|
|
9
|
+
export interface GridDescriptor {
|
|
10
|
+
type: 'grid';
|
|
11
|
+
options: GridOptions;
|
|
12
|
+
children: (Component | GridDescriptor)[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Resolve a grid descriptor into a GridComponent
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveGrid(region: TerminalRegion, descriptor: GridDescriptor): GridComponent;
|
|
18
|
+
/**
|
|
19
|
+
* Export style function for convenience
|
|
20
|
+
*/
|
|
21
|
+
export { style, type StyleOptions };
|
|
22
|
+
//# sourceMappingURL=grid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../src/api/grid.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAc,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAyB,MAAM,gBAAgB,CAAC;AACzH,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE/D;;;GAGG;AACH,wBAAgB,IAAI,CAClB,OAAO,EAAE,WAAW,EACpB,GAAG,QAAQ,EAAE,CAAC,SAAS,GAAG,MAAM,GAAG,cAAc,CAAC,EAAE,GACnD,cAAc,CAgBhB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,CAAC,SAAS,GAAG,cAAc,CAAC,EAAE,CAAC;CAC1C;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,cAAc,GACzB,aAAa,CAmCf;AAED;;GAEG;AACH,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,CAAC"}
|
package/lib/api/grid.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// Grid API - public functions for creating grid components
|
|
2
|
+
import { createGrid } from '../layout/grid';
|
|
3
|
+
import { style } from '../components/style';
|
|
4
|
+
/**
|
|
5
|
+
* Create a grid descriptor (for use with region.set())
|
|
6
|
+
* This is the main API - returns a descriptor that region.set() can handle
|
|
7
|
+
*/
|
|
8
|
+
export function grid(options, ...children) {
|
|
9
|
+
// Convert strings to style components
|
|
10
|
+
// Convert nested GridDescriptors to Components
|
|
11
|
+
const convertedChildren = children.map(child => {
|
|
12
|
+
if (typeof child === 'string') {
|
|
13
|
+
return style({}, child);
|
|
14
|
+
}
|
|
15
|
+
// Keep GridDescriptors as-is - they'll be resolved later in resolveGrid
|
|
16
|
+
return child;
|
|
17
|
+
});
|
|
18
|
+
return {
|
|
19
|
+
type: 'grid',
|
|
20
|
+
options,
|
|
21
|
+
children: convertedChildren,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Resolve a grid descriptor into a GridComponent
|
|
26
|
+
*/
|
|
27
|
+
export function resolveGrid(region, descriptor) {
|
|
28
|
+
// Convert children - GridDescriptors become Components, Components stay as-is
|
|
29
|
+
const convertedChildren = descriptor.children.map((child) => {
|
|
30
|
+
if (typeof child === 'object' && child !== null && 'type' in child && child.type === 'grid') {
|
|
31
|
+
// It's a nested GridDescriptor - recursively resolve it, then convert to Component
|
|
32
|
+
const nestedGridComponent = resolveGrid(region, child);
|
|
33
|
+
// Convert GridComponent to Component by wrapping it
|
|
34
|
+
return (ctx) => {
|
|
35
|
+
// Save current line content
|
|
36
|
+
const savedLines = [];
|
|
37
|
+
const startLine = ctx.rowIndex + 1;
|
|
38
|
+
const maxLines = nestedGridComponent.getHeight();
|
|
39
|
+
for (let i = 0; i < maxLines; i++) {
|
|
40
|
+
savedLines.push(region.getLine(startLine + i) || '');
|
|
41
|
+
}
|
|
42
|
+
// Render the nested grid
|
|
43
|
+
nestedGridComponent.render(ctx.columnIndex, startLine, ctx.availableWidth);
|
|
44
|
+
// Read back the rendered content
|
|
45
|
+
if (maxLines === 1) {
|
|
46
|
+
return region.getLine(startLine) || '';
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const lines = [];
|
|
50
|
+
for (let i = 0; i < maxLines; i++) {
|
|
51
|
+
lines.push(region.getLine(startLine + i) || '');
|
|
52
|
+
}
|
|
53
|
+
return lines;
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return child;
|
|
58
|
+
});
|
|
59
|
+
return createGrid(region, descriptor.options, ...convertedChildren);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Export style function for convenience
|
|
63
|
+
*/
|
|
64
|
+
export { style };
|
|
65
|
+
//# sourceMappingURL=grid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid.js","sourceRoot":"","sources":["../../src/api/grid.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAG3D,OAAO,EAAE,UAAU,EAA+E,MAAM,gBAAgB,CAAC;AACzH,OAAO,EAAE,KAAK,EAAqB,MAAM,qBAAqB,CAAC;AAE/D;;;GAGG;AACH,MAAM,UAAU,IAAI,CAClB,OAAoB,EACpB,GAAG,QAAiD;IAEpD,sCAAsC;IACtC,+CAA+C;IAC/C,MAAM,iBAAiB,GAAmC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QAC7E,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC1B,CAAC;QACD,wEAAwE;QACxE,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO;QACP,QAAQ,EAAE,iBAAiB;KAC5B,CAAC;AACJ,CAAC;AAQD;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,MAAsB,EACtB,UAA0B;IAE1B,8EAA8E;IAC9E,MAAM,iBAAiB,GAAgB,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAa,EAAE;QAClF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5F,mFAAmF;YACnF,MAAM,mBAAmB,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACvD,oDAAoD;YACpD,OAAO,CAAC,GAAG,EAAE,EAAE;gBACb,4BAA4B;gBAC5B,MAAM,UAAU,GAAa,EAAE,CAAC;gBAChC,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACnC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,SAAS,EAAE,CAAC;gBACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;oBAClC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACvD,CAAC;gBAED,yBAAyB;gBACzB,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;gBAE3E,iCAAiC;gBACjC,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;oBACnB,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,MAAM,KAAK,GAAa,EAAE,CAAC;oBAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;wBAClC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;oBAClD,CAAC;oBACD,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,KAAkB,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,OAAO,EAAE,KAAK,EAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid.test.d.ts","sourceRoot":"","sources":["../../src/api/grid.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import { grid, resolveGrid } from './grid';
|
|
3
|
+
import { style } from './grid';
|
|
4
|
+
import { TerminalRegion } from '../region';
|
|
5
|
+
describe('Grid API', () => {
|
|
6
|
+
let region;
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
region = new TerminalRegion({ disableRendering: true, width: 80 });
|
|
9
|
+
});
|
|
10
|
+
describe('grid()', () => {
|
|
11
|
+
it('should create a grid descriptor', () => {
|
|
12
|
+
const descriptor = grid({ template: [20, '1*'] }, 'A', 'B');
|
|
13
|
+
expect(descriptor.type).toBe('grid');
|
|
14
|
+
expect(descriptor.options.template).toEqual([20, '1*']);
|
|
15
|
+
expect(descriptor.children.length).toBe(2);
|
|
16
|
+
});
|
|
17
|
+
it('should convert strings to style components', () => {
|
|
18
|
+
const descriptor = grid({ template: [20, '1*'] }, 'A', 'B');
|
|
19
|
+
expect(descriptor.children.length).toBe(2);
|
|
20
|
+
// Both should be Components (functions)
|
|
21
|
+
expect(typeof descriptor.children[0]).toBe('function');
|
|
22
|
+
expect(typeof descriptor.children[1]).toBe('function');
|
|
23
|
+
});
|
|
24
|
+
it('should accept Component children', () => {
|
|
25
|
+
const childComponent = style({ color: 'red' }, 'Hello');
|
|
26
|
+
const descriptor = grid({ template: [20, '1*'] }, childComponent);
|
|
27
|
+
expect(descriptor.children.length).toBe(1);
|
|
28
|
+
expect(descriptor.children[0]).toBe(childComponent);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe('resolveGrid', () => {
|
|
32
|
+
it('should resolve grid descriptor to GridComponent', () => {
|
|
33
|
+
const descriptor = grid({ template: [20, '1*'] }, 'A', 'B');
|
|
34
|
+
const gridComponent = resolveGrid(region, descriptor);
|
|
35
|
+
expect(gridComponent).toBeDefined();
|
|
36
|
+
expect(gridComponent.getHeight()).toBe(1);
|
|
37
|
+
});
|
|
38
|
+
it('should render resolved grid', () => {
|
|
39
|
+
const descriptor = grid({ template: [20, '1*'] }, 'A', 'B');
|
|
40
|
+
const gridComponent = resolveGrid(region, descriptor);
|
|
41
|
+
gridComponent.render(0, 1, 80);
|
|
42
|
+
const line = region.getLine(1);
|
|
43
|
+
expect(line).toContain('A');
|
|
44
|
+
expect(line).toContain('B');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=grid.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid.test.js","sourceRoot":"","sources":["../../src/api/grid.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { TerminalRegion } from '../region.js';
|
|
2
|
+
import type { Renderable } from './renderable.js';
|
|
3
|
+
/**
|
|
4
|
+
* Base class for terminal UI components
|
|
5
|
+
* Provides layout properties and rendering interface
|
|
6
|
+
*
|
|
7
|
+
* Note: We don't need parent/child relationships. Flex just needs:
|
|
8
|
+
* - An array of renderables to measure and render
|
|
9
|
+
* - No need for components to know their parent
|
|
10
|
+
*/
|
|
11
|
+
export declare abstract class Component implements Renderable {
|
|
12
|
+
protected region: TerminalRegion;
|
|
13
|
+
protected children: Component[];
|
|
14
|
+
protected minWidth: number;
|
|
15
|
+
protected maxWidth: number;
|
|
16
|
+
readonly flexGrow: number;
|
|
17
|
+
readonly flexShrink: number;
|
|
18
|
+
protected width?: number;
|
|
19
|
+
constructor(region: TerminalRegion, options?: ComponentOptions);
|
|
20
|
+
/**
|
|
21
|
+
* Add a child component (for Flex to build its children array)
|
|
22
|
+
* No parent wiring needed - Flex just iterates over children
|
|
23
|
+
*/
|
|
24
|
+
addChild(child: Component): void;
|
|
25
|
+
/**
|
|
26
|
+
* Get the preferred width of this component
|
|
27
|
+
*/
|
|
28
|
+
abstract getPreferredWidth(): number;
|
|
29
|
+
/**
|
|
30
|
+
* Get the minimum width this component needs
|
|
31
|
+
*/
|
|
32
|
+
getMinWidth(): number;
|
|
33
|
+
/**
|
|
34
|
+
* Get the maximum width this component can use
|
|
35
|
+
*/
|
|
36
|
+
getMaxWidth(): number;
|
|
37
|
+
/**
|
|
38
|
+
* Render the component at the given position and width
|
|
39
|
+
*/
|
|
40
|
+
abstract render(x: number, y: number, width: number): void;
|
|
41
|
+
/**
|
|
42
|
+
* Get the height this component will take
|
|
43
|
+
*/
|
|
44
|
+
abstract getHeight(): number;
|
|
45
|
+
}
|
|
46
|
+
export interface ComponentOptions {
|
|
47
|
+
minWidth?: number;
|
|
48
|
+
maxWidth?: number;
|
|
49
|
+
flexGrow?: number;
|
|
50
|
+
flexShrink?: number;
|
|
51
|
+
width?: number;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/ts/components/base.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;;;;;GAOG;AACH,8BAAsB,SAAU,YAAW,UAAU;IACnD,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC;IACjC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAM;IACrC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAK;IAC/B,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAY;IACtC,SAAgB,QAAQ,EAAE,MAAM,CAAK;IACrC,SAAgB,UAAU,EAAE,MAAM,CAAK;IACvC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;gBAEb,MAAM,EAAE,cAAc,EAAE,OAAO,GAAE,gBAAqB;IASlE;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAIhC;;OAEG;IACH,QAAQ,CAAC,iBAAiB,IAAI,MAAM;IAEpC;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAE1D;;OAEG;IACH,QAAQ,CAAC,SAAS,IAAI,MAAM;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Base component system for terminal UI
|
|
2
|
+
// Simplified - no parent/child wiring needed
|
|
3
|
+
/**
|
|
4
|
+
* Base class for terminal UI components
|
|
5
|
+
* Provides layout properties and rendering interface
|
|
6
|
+
*
|
|
7
|
+
* Note: We don't need parent/child relationships. Flex just needs:
|
|
8
|
+
* - An array of renderables to measure and render
|
|
9
|
+
* - No need for components to know their parent
|
|
10
|
+
*/
|
|
11
|
+
export class Component {
|
|
12
|
+
region;
|
|
13
|
+
children = [];
|
|
14
|
+
minWidth = 0;
|
|
15
|
+
maxWidth = Infinity;
|
|
16
|
+
flexGrow = 0;
|
|
17
|
+
flexShrink = 1;
|
|
18
|
+
width; // Explicit width override
|
|
19
|
+
constructor(region, options = {}) {
|
|
20
|
+
this.region = region;
|
|
21
|
+
this.minWidth = options.minWidth ?? 0;
|
|
22
|
+
this.maxWidth = options.maxWidth ?? Infinity;
|
|
23
|
+
this.flexGrow = options.flexGrow ?? 0;
|
|
24
|
+
this.flexShrink = options.flexShrink ?? 1;
|
|
25
|
+
this.width = options.width;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Add a child component (for Flex to build its children array)
|
|
29
|
+
* No parent wiring needed - Flex just iterates over children
|
|
30
|
+
*/
|
|
31
|
+
addChild(child) {
|
|
32
|
+
this.children.push(child);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get the minimum width this component needs
|
|
36
|
+
*/
|
|
37
|
+
getMinWidth() {
|
|
38
|
+
return this.minWidth;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get the maximum width this component can use
|
|
42
|
+
*/
|
|
43
|
+
getMaxWidth() {
|
|
44
|
+
return this.maxWidth;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/ts/components/base.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,6CAA6C;AAK7C;;;;;;;GAOG;AACH,MAAM,OAAgB,SAAS;IACnB,MAAM,CAAiB;IACvB,QAAQ,GAAgB,EAAE,CAAC;IAC3B,QAAQ,GAAW,CAAC,CAAC;IACrB,QAAQ,GAAW,QAAQ,CAAC;IACtB,QAAQ,GAAW,CAAC,CAAC;IACrB,UAAU,GAAW,CAAC,CAAC;IAC7B,KAAK,CAAU,CAAC,0BAA0B;IAEpD,YAAY,MAAsB,EAAE,UAA4B,EAAE;QAChE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAC,KAAgB;QACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAOD;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CAWF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { TerminalRegion } from '../region.js';
|
|
2
|
+
import type { Renderable } from './renderable.js';
|
|
3
|
+
export type TextOverflow = 'none' | 'ellipsis-end' | 'ellipsis-start' | 'ellipsis-middle' | 'wrap';
|
|
4
|
+
/**
|
|
5
|
+
* Create a column renderable - just a function, no class!
|
|
6
|
+
*/
|
|
7
|
+
export declare function createCol(region: TerminalRegion, content: string, options?: ColOptions): Renderable;
|
|
8
|
+
export declare class Col {
|
|
9
|
+
private renderable;
|
|
10
|
+
private region;
|
|
11
|
+
private options;
|
|
12
|
+
constructor(region: TerminalRegion, content: string, options?: ColOptions);
|
|
13
|
+
getPreferredWidth(): number;
|
|
14
|
+
getMinWidth(): number;
|
|
15
|
+
getMaxWidth(): number;
|
|
16
|
+
getHeight(): number;
|
|
17
|
+
render(x: number, y: number, width: number): void;
|
|
18
|
+
get flexGrow(): number;
|
|
19
|
+
get flexShrink(): number;
|
|
20
|
+
/**
|
|
21
|
+
* Update content (creates new renderable)
|
|
22
|
+
*/
|
|
23
|
+
setContent(content: string): void;
|
|
24
|
+
}
|
|
25
|
+
export interface ColOptions {
|
|
26
|
+
width?: number;
|
|
27
|
+
flex?: number;
|
|
28
|
+
min?: number;
|
|
29
|
+
max?: number;
|
|
30
|
+
overflow?: TextOverflow;
|
|
31
|
+
minWidth?: number;
|
|
32
|
+
maxWidth?: number;
|
|
33
|
+
flexGrow?: number;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=col.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"col.d.ts","sourceRoot":"","sources":["../../src/ts/components/col.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,cAAc,GAAG,gBAAgB,GAAG,iBAAiB,GAAG,MAAM,CAAC;AAEnG;;GAEG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,UAAe,GACvB,UAAU,CAoJZ;AAGD,qBAAa,GAAG;IACd,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAAa;gBAEhB,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe;IAM7E,iBAAiB,IAAI,MAAM;IAC3B,WAAW,IAAI,MAAM;IACrB,WAAW,IAAI,MAAM;IACrB,SAAS,IAAI,MAAM;IACnB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IACjD,IAAI,QAAQ,IAAI,MAAM,CAAqC;IAC3D,IAAI,UAAU,IAAI,MAAM,CAAuC;IAE/D;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAGlC;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
// Column component - flex item wrapper for terminal UI
|
|
2
|
+
// Handles text content with overflow and flex properties
|
|
3
|
+
// Just a function that returns a Renderable object - no class needed!
|
|
4
|
+
import { truncateEnd, truncateStart, truncateMiddle, wrapText } from '../utils/text.js';
|
|
5
|
+
/**
|
|
6
|
+
* Create a column renderable - just a function, no class!
|
|
7
|
+
*/
|
|
8
|
+
export function createCol(region, content, options = {}) {
|
|
9
|
+
// Calculate content width for default min (strip ANSI codes)
|
|
10
|
+
const contentWidth = content.replace(/\x1b\[[0-9;]*m/g, '').length;
|
|
11
|
+
// If width is specified, set both min and max to that value (fixed width)
|
|
12
|
+
const fixedWidth = options.width;
|
|
13
|
+
const minWidth = fixedWidth ?? options.min ?? options.minWidth ?? contentWidth;
|
|
14
|
+
const maxWidth = fixedWidth ?? options.max ?? options.maxWidth ?? Infinity;
|
|
15
|
+
const flexGrow = options.flex ?? options.flexGrow ?? 0;
|
|
16
|
+
const overflow = options.overflow ?? 'ellipsis-end';
|
|
17
|
+
// Return a plain object that implements Renderable
|
|
18
|
+
return {
|
|
19
|
+
flexGrow,
|
|
20
|
+
flexShrink: 1,
|
|
21
|
+
getPreferredWidth() {
|
|
22
|
+
return contentWidth;
|
|
23
|
+
},
|
|
24
|
+
getMinWidth() {
|
|
25
|
+
return minWidth;
|
|
26
|
+
},
|
|
27
|
+
getMaxWidth() {
|
|
28
|
+
return maxWidth;
|
|
29
|
+
},
|
|
30
|
+
getHeight() {
|
|
31
|
+
if (overflow === 'wrap') {
|
|
32
|
+
const width = undefined; // Will be set during render
|
|
33
|
+
return wrapText(content.replace(/\x1b\[[0-9;]*m/g, ''), width ?? contentWidth).length;
|
|
34
|
+
}
|
|
35
|
+
return 1;
|
|
36
|
+
},
|
|
37
|
+
render(x, y, width) {
|
|
38
|
+
let text = content;
|
|
39
|
+
const textWidth = content.replace(/\x1b\[[0-9;]*m/g, '').length;
|
|
40
|
+
// Handle overflow
|
|
41
|
+
if (overflow === 'ellipsis-end' && textWidth > width) {
|
|
42
|
+
text = truncateEnd(content.replace(/\x1b\[[0-9;]*m/g, ''), width);
|
|
43
|
+
}
|
|
44
|
+
else if (overflow === 'ellipsis-start' && textWidth > width) {
|
|
45
|
+
text = truncateStart(content.replace(/\x1b\[[0-9;]*m/g, ''), width);
|
|
46
|
+
}
|
|
47
|
+
else if (overflow === 'ellipsis-middle' && textWidth > width) {
|
|
48
|
+
text = truncateMiddle(content.replace(/\x1b\[[0-9;]*m/g, ''), width);
|
|
49
|
+
}
|
|
50
|
+
else if (overflow === 'wrap') {
|
|
51
|
+
const lines = wrapText(content.replace(/\x1b\[[0-9;]*m/g, ''), width);
|
|
52
|
+
for (let i = 0; i < lines.length; i++) {
|
|
53
|
+
// For wrap, we need to handle x position too
|
|
54
|
+
const existingLine = region.getLine(y + i) || '';
|
|
55
|
+
const before = existingLine.slice(0, x);
|
|
56
|
+
const after = existingLine.slice(x + width);
|
|
57
|
+
const wrappedText = lines[i].padEnd(width, ' ');
|
|
58
|
+
region.setLine(y + i, before + wrappedText + after);
|
|
59
|
+
}
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// Pad to width
|
|
63
|
+
const plainText = text.replace(/\x1b\[[0-9;]*m/g, '');
|
|
64
|
+
const padding = width - plainText.length;
|
|
65
|
+
if (padding > 0) {
|
|
66
|
+
text = text + ' '.repeat(padding);
|
|
67
|
+
}
|
|
68
|
+
// Get existing line and merge at x position
|
|
69
|
+
const existingLine = region.getLine(y) || '';
|
|
70
|
+
// Helper to find character position for a visual column (accounting for ANSI codes)
|
|
71
|
+
const findCharPosForVisual = (line, targetVisual) => {
|
|
72
|
+
let charPos = 0;
|
|
73
|
+
let visualPos = 0;
|
|
74
|
+
while (charPos < line.length && visualPos < targetVisual) {
|
|
75
|
+
if (line[charPos] === '\x1b') {
|
|
76
|
+
// Found start of ANSI code, skip to end
|
|
77
|
+
let ansiEnd = charPos + 1;
|
|
78
|
+
while (ansiEnd < line.length) {
|
|
79
|
+
if (line[ansiEnd] === 'm') {
|
|
80
|
+
ansiEnd++;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
// Valid ANSI code characters
|
|
84
|
+
if ((line[ansiEnd] >= '0' && line[ansiEnd] <= '9') ||
|
|
85
|
+
line[ansiEnd] === ';' ||
|
|
86
|
+
line[ansiEnd] === '[') {
|
|
87
|
+
ansiEnd++;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
charPos = ansiEnd;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
charPos++;
|
|
97
|
+
visualPos++;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return charPos;
|
|
101
|
+
};
|
|
102
|
+
// Calculate visual width of existing line
|
|
103
|
+
const existingPlain = existingLine.replace(/\x1b\[[0-9;]*m/g, '');
|
|
104
|
+
const existingVisualWidth = existingPlain.length;
|
|
105
|
+
if (x === 0 && existingVisualWidth === 0) {
|
|
106
|
+
// Starting at beginning with empty line - just set it
|
|
107
|
+
region.setLine(y, text);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// Need to merge: before + text + after
|
|
111
|
+
const beforeEnd = findCharPosForVisual(existingLine, x);
|
|
112
|
+
// If existing line is shorter than x, we need to pad it first
|
|
113
|
+
if (existingVisualWidth < x) {
|
|
114
|
+
// Pad existing line to x position, then append our text
|
|
115
|
+
const padding = x - existingVisualWidth;
|
|
116
|
+
const newLine = existingLine + ' '.repeat(padding) + text;
|
|
117
|
+
region.setLine(y, newLine);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// Find where x + width starts in the existing line
|
|
121
|
+
let afterStart;
|
|
122
|
+
if (existingVisualWidth <= x + width) {
|
|
123
|
+
// Existing line ends before or at our end position - no "after" content
|
|
124
|
+
afterStart = existingLine.length;
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// Find where x + width starts in the existing line
|
|
128
|
+
afterStart = findCharPosForVisual(existingLine, x + width);
|
|
129
|
+
}
|
|
130
|
+
const before = existingLine.slice(0, beforeEnd);
|
|
131
|
+
const after = existingLine.slice(afterStart);
|
|
132
|
+
// Build new line
|
|
133
|
+
const newLine = before + text + after;
|
|
134
|
+
// Only update if the section we're replacing actually changed
|
|
135
|
+
// Extract the section we're replacing from existing line
|
|
136
|
+
const existingSection = existingLine.slice(beforeEnd, afterStart);
|
|
137
|
+
if (existingSection !== text) {
|
|
138
|
+
region.setLine(y, newLine);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
// Keep Col class for backward compatibility (used by resolveFlexTree)
|
|
145
|
+
export class Col {
|
|
146
|
+
renderable;
|
|
147
|
+
region;
|
|
148
|
+
options;
|
|
149
|
+
constructor(region, content, options = {}) {
|
|
150
|
+
this.region = region;
|
|
151
|
+
this.options = options;
|
|
152
|
+
this.renderable = createCol(region, content, options);
|
|
153
|
+
}
|
|
154
|
+
getPreferredWidth() { return this.renderable.getPreferredWidth(); }
|
|
155
|
+
getMinWidth() { return this.renderable.getMinWidth(); }
|
|
156
|
+
getMaxWidth() { return this.renderable.getMaxWidth(); }
|
|
157
|
+
getHeight() { return this.renderable.getHeight(); }
|
|
158
|
+
render(x, y, width) { this.renderable.render(x, y, width); }
|
|
159
|
+
get flexGrow() { return this.renderable.flexGrow; }
|
|
160
|
+
get flexShrink() { return this.renderable.flexShrink; }
|
|
161
|
+
/**
|
|
162
|
+
* Update content (creates new renderable)
|
|
163
|
+
*/
|
|
164
|
+
setContent(content) {
|
|
165
|
+
this.renderable = createCol(this.region, content, this.options);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=col.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"col.js","sourceRoot":"","sources":["../../src/ts/components/col.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,yDAAyD;AACzD,sEAAsE;AAItE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIxF;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,MAAsB,EACtB,OAAe,EACf,UAAsB,EAAE;IAExB,6DAA6D;IAC7D,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;IAEnE,0EAA0E;IAC1E,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC;IACjC,MAAM,QAAQ,GAAG,UAAU,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,QAAQ,IAAI,YAAY,CAAC;IAC/E,MAAM,QAAQ,GAAG,UAAU,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAC3E,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,cAAc,CAAC;IAEpD,mDAAmD;IACnD,OAAO;QACL,QAAQ;QACR,UAAU,EAAE,CAAC;QAEb,iBAAiB;YACf,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,WAAW;YACT,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,WAAW;YACT,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,SAAS;YACP,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACxB,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,4BAA4B;gBACrD,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,EAAE,KAAK,IAAI,YAAY,CAAC,CAAC,MAAM,CAAC;YACxF,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,CAAC,CAAS,EAAE,CAAS,EAAE,KAAa;YACxC,IAAI,IAAI,GAAG,OAAO,CAAC;YACnB,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;YAEhE,kBAAkB;YAClB,IAAI,QAAQ,KAAK,cAAc,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC;gBACrD,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YACpE,CAAC;iBAAM,IAAI,QAAQ,KAAK,gBAAgB,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC;gBAC9D,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YACtE,CAAC;iBAAM,IAAI,QAAQ,KAAK,iBAAiB,IAAI,SAAS,GAAG,KAAK,EAAE,CAAC;gBAC/D,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YACvE,CAAC;iBAAM,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;gBACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACtC,6CAA6C;oBAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;oBACjD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBACxC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;oBAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBAChD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,KAAK,CAAC,CAAC;gBACtD,CAAC;gBACD,OAAO;YACT,CAAC;YAED,eAAe;YACf,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC;YACzC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC;YAED,4CAA4C;YAC5C,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAE7C,oFAAoF;YACpF,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAE,YAAoB,EAAU,EAAE;gBAC1E,IAAI,OAAO,GAAG,CAAC,CAAC;gBAChB,IAAI,SAAS,GAAG,CAAC,CAAC;gBAElB,OAAO,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,GAAG,YAAY,EAAE,CAAC;oBACzD,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;wBAC7B,wCAAwC;wBACxC,IAAI,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC;wBAC1B,OAAO,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;4BAC7B,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;gCAC1B,OAAO,EAAE,CAAC;gCACV,MAAM;4BACR,CAAC;4BACD,6BAA6B;4BAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC;gCAC9C,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG;gCACrB,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;gCAC1B,OAAO,EAAE,CAAC;4BACZ,CAAC;iCAAM,CAAC;gCACN,MAAM;4BACR,CAAC;wBACH,CAAC;wBACD,OAAO,GAAG,OAAO,CAAC;oBACpB,CAAC;yBAAM,CAAC;wBACN,OAAO,EAAE,CAAC;wBACV,SAAS,EAAE,CAAC;oBACd,CAAC;gBACH,CAAC;gBAED,OAAO,OAAO,CAAC;YACjB,CAAC,CAAC;YAEF,0CAA0C;YAC1C,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;YAClE,MAAM,mBAAmB,GAAG,aAAa,CAAC,MAAM,CAAC;YAEjD,IAAI,CAAC,KAAK,CAAC,IAAI,mBAAmB,KAAK,CAAC,EAAE,CAAC;gBACzC,sDAAsD;gBACtD,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,uCAAuC;gBACvC,MAAM,SAAS,GAAG,oBAAoB,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;gBAExD,8DAA8D;gBAC9D,IAAI,mBAAmB,GAAG,CAAC,EAAE,CAAC;oBAC5B,wDAAwD;oBACxD,MAAM,OAAO,GAAG,CAAC,GAAG,mBAAmB,CAAC;oBACxC,MAAM,OAAO,GAAG,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;oBAC1D,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC3B,OAAO;gBACT,CAAC;gBAED,mDAAmD;gBACnD,IAAI,UAAkB,CAAC;gBACvB,IAAI,mBAAmB,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC;oBACrC,wEAAwE;oBACxE,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,mDAAmD;oBACnD,UAAU,GAAG,oBAAoB,CAAC,YAAY,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;gBAC7D,CAAC;gBAED,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;gBAChD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAE7C,iBAAiB;gBACjB,MAAM,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC;gBAEtC,8DAA8D;gBAC9D,yDAAyD;gBACzD,MAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;gBAClE,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;oBAC7B,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,sEAAsE;AACtE,MAAM,OAAO,GAAG;IACN,UAAU,CAAa;IACvB,MAAM,CAAiB;IACvB,OAAO,CAAa;IAE5B,YAAY,MAAsB,EAAE,OAAe,EAAE,UAAsB,EAAE;QAC3E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,iBAAiB,KAAa,OAAO,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;IAC3E,WAAW,KAAa,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC/D,WAAW,KAAa,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC/D,SAAS,KAAa,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,CAAC,CAAS,EAAE,CAAS,EAAE,KAAa,IAAU,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1F,IAAI,QAAQ,KAAa,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3D,IAAI,UAAU,KAAa,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IAE/D;;OAEG;IACH,UAAU,CAAC,OAAe;QACxB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAClE,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"col.test.d.ts","sourceRoot":"","sources":["../../src/ts/components/col.test.ts"],"names":[],"mappings":""}
|