@opentuah/core 0.1.77
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/3d/SpriteResourceManager.d.ts +74 -0
- package/3d/SpriteUtils.d.ts +13 -0
- package/3d/TextureUtils.d.ts +24 -0
- package/3d/ThreeRenderable.d.ts +40 -0
- package/3d/WGPURenderer.d.ts +61 -0
- package/3d/animation/ExplodingSpriteEffect.d.ts +71 -0
- package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +76 -0
- package/3d/animation/SpriteAnimator.d.ts +124 -0
- package/3d/animation/SpriteParticleGenerator.d.ts +62 -0
- package/3d/canvas.d.ts +44 -0
- package/3d/index.d.ts +12 -0
- package/3d/physics/PlanckPhysicsAdapter.d.ts +19 -0
- package/3d/physics/RapierPhysicsAdapter.d.ts +19 -0
- package/3d/physics/physics-interface.d.ts +27 -0
- package/3d.d.ts +2 -0
- package/3d.js +2805 -0
- package/3d.js.map +22 -0
- package/LICENSE +21 -0
- package/README.md +59 -0
- package/Renderable.d.ts +334 -0
- package/animation/Timeline.d.ts +126 -0
- package/ansi.d.ts +13 -0
- package/assets/javascript/highlights.scm +205 -0
- package/assets/javascript/tree-sitter-javascript.wasm +0 -0
- package/assets/markdown/highlights.scm +150 -0
- package/assets/markdown/injections.scm +27 -0
- package/assets/markdown/tree-sitter-markdown.wasm +0 -0
- package/assets/markdown_inline/highlights.scm +115 -0
- package/assets/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
- package/assets/typescript/highlights.scm +604 -0
- package/assets/typescript/tree-sitter-typescript.wasm +0 -0
- package/assets/zig/highlights.scm +284 -0
- package/assets/zig/tree-sitter-zig.wasm +0 -0
- package/buffer.d.ts +98 -0
- package/console.d.ts +140 -0
- package/edit-buffer.d.ts +98 -0
- package/editor-view.d.ts +73 -0
- package/index-cgvb25mm.js +14921 -0
- package/index-cgvb25mm.js.map +56 -0
- package/index.d.ts +17 -0
- package/index.js +9331 -0
- package/index.js.map +37 -0
- package/lib/KeyHandler.d.ts +61 -0
- package/lib/RGBA.d.ts +27 -0
- package/lib/ascii.font.d.ts +508 -0
- package/lib/border.d.ts +49 -0
- package/lib/bunfs.d.ts +7 -0
- package/lib/clipboard.d.ts +17 -0
- package/lib/data-paths.d.ts +26 -0
- package/lib/debounce.d.ts +42 -0
- package/lib/env.d.ts +42 -0
- package/lib/extmarks-history.d.ts +17 -0
- package/lib/extmarks.d.ts +89 -0
- package/lib/hast-styled-text.d.ts +17 -0
- package/lib/index.d.ts +18 -0
- package/lib/keymapping.d.ts +25 -0
- package/lib/objects-in-viewport.d.ts +24 -0
- package/lib/output.capture.d.ts +24 -0
- package/lib/parse.keypress-kitty.d.ts +2 -0
- package/lib/parse.keypress.d.ts +26 -0
- package/lib/parse.mouse.d.ts +23 -0
- package/lib/queue.d.ts +15 -0
- package/lib/renderable.validations.d.ts +12 -0
- package/lib/scroll-acceleration.d.ts +43 -0
- package/lib/selection.d.ts +63 -0
- package/lib/singleton.d.ts +7 -0
- package/lib/stdin-buffer.d.ts +44 -0
- package/lib/styled-text.d.ts +63 -0
- package/lib/terminal-capability-detection.d.ts +30 -0
- package/lib/terminal-palette.d.ts +43 -0
- package/lib/tree-sitter/assets/update.d.ts +11 -0
- package/lib/tree-sitter/client.d.ts +47 -0
- package/lib/tree-sitter/default-parsers.d.ts +2 -0
- package/lib/tree-sitter/download-utils.d.ts +21 -0
- package/lib/tree-sitter/index.d.ts +8 -0
- package/lib/tree-sitter/parser.worker.d.ts +1 -0
- package/lib/tree-sitter/parsers-config.d.ts +38 -0
- package/lib/tree-sitter/resolve-ft.d.ts +2 -0
- package/lib/tree-sitter/types.d.ts +81 -0
- package/lib/tree-sitter-styled-text.d.ts +14 -0
- package/lib/validate-dir-name.d.ts +1 -0
- package/lib/yoga.options.d.ts +32 -0
- package/package.json +67 -0
- package/parser.worker.js +855 -0
- package/parser.worker.js.map +12 -0
- package/post/filters.d.ts +105 -0
- package/renderables/ASCIIFont.d.ts +52 -0
- package/renderables/Box.d.ts +72 -0
- package/renderables/Code.d.ts +66 -0
- package/renderables/Diff.d.ts +185 -0
- package/renderables/EditBufferRenderable.d.ts +162 -0
- package/renderables/FrameBuffer.d.ts +16 -0
- package/renderables/Input.d.ts +60 -0
- package/renderables/LineNumberRenderable.d.ts +111 -0
- package/renderables/Markdown.d.ts +98 -0
- package/renderables/ScrollBar.d.ts +77 -0
- package/renderables/ScrollBox.d.ts +116 -0
- package/renderables/Select.d.ts +115 -0
- package/renderables/Slider.d.ts +44 -0
- package/renderables/TabSelect.d.ts +96 -0
- package/renderables/Text.d.ts +36 -0
- package/renderables/TextBufferRenderable.d.ts +103 -0
- package/renderables/TextNode.d.ts +91 -0
- package/renderables/Textarea.d.ts +114 -0
- package/renderables/__tests__/renderable-test-utils.d.ts +7 -0
- package/renderables/composition/VRenderable.d.ts +16 -0
- package/renderables/composition/constructs.d.ts +35 -0
- package/renderables/composition/vnode.d.ts +46 -0
- package/renderables/index.d.ts +20 -0
- package/renderables/markdown-parser.d.ts +10 -0
- package/renderer.d.ts +370 -0
- package/syntax-style.d.ts +54 -0
- package/testing/mock-keys.d.ts +80 -0
- package/testing/mock-mouse.d.ts +38 -0
- package/testing/mock-tree-sitter-client.d.ts +23 -0
- package/testing/spy.d.ts +7 -0
- package/testing/test-recorder.d.ts +61 -0
- package/testing/test-renderer.d.ts +23 -0
- package/testing.d.ts +6 -0
- package/testing.js +670 -0
- package/testing.js.map +15 -0
- package/text-buffer-view.d.ts +42 -0
- package/text-buffer.d.ts +67 -0
- package/types.d.ts +120 -0
- package/utils.d.ts +14 -0
- package/zig-structs.d.ts +42 -0
- package/zig.d.ts +326 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { OptimizedBuffer } from "../buffer";
|
|
2
|
+
import { fonts } from "../lib/ascii.font";
|
|
3
|
+
import type { KeyEvent } from "../lib/KeyHandler";
|
|
4
|
+
import { type ColorInput } from "../lib/RGBA";
|
|
5
|
+
import { Renderable, type RenderableOptions } from "../Renderable";
|
|
6
|
+
import type { RenderContext } from "../types";
|
|
7
|
+
import { type KeyBinding as BaseKeyBinding, type KeyAliasMap } from "../lib/keymapping";
|
|
8
|
+
export interface SelectOption {
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
value?: any;
|
|
12
|
+
}
|
|
13
|
+
export type SelectAction = "move-up" | "move-down" | "move-up-fast" | "move-down-fast" | "select-current";
|
|
14
|
+
export type SelectKeyBinding = BaseKeyBinding<SelectAction>;
|
|
15
|
+
export interface SelectRenderableOptions extends RenderableOptions<SelectRenderable> {
|
|
16
|
+
backgroundColor?: ColorInput;
|
|
17
|
+
textColor?: ColorInput;
|
|
18
|
+
focusedBackgroundColor?: ColorInput;
|
|
19
|
+
focusedTextColor?: ColorInput;
|
|
20
|
+
options?: SelectOption[];
|
|
21
|
+
selectedIndex?: number;
|
|
22
|
+
selectedBackgroundColor?: ColorInput;
|
|
23
|
+
selectedTextColor?: ColorInput;
|
|
24
|
+
descriptionColor?: ColorInput;
|
|
25
|
+
selectedDescriptionColor?: ColorInput;
|
|
26
|
+
showScrollIndicator?: boolean;
|
|
27
|
+
wrapSelection?: boolean;
|
|
28
|
+
showDescription?: boolean;
|
|
29
|
+
font?: keyof typeof fonts;
|
|
30
|
+
itemSpacing?: number;
|
|
31
|
+
fastScrollStep?: number;
|
|
32
|
+
keyBindings?: SelectKeyBinding[];
|
|
33
|
+
keyAliasMap?: KeyAliasMap;
|
|
34
|
+
}
|
|
35
|
+
export declare enum SelectRenderableEvents {
|
|
36
|
+
SELECTION_CHANGED = "selectionChanged",
|
|
37
|
+
ITEM_SELECTED = "itemSelected"
|
|
38
|
+
}
|
|
39
|
+
export declare class SelectRenderable extends Renderable {
|
|
40
|
+
protected _focusable: boolean;
|
|
41
|
+
private _options;
|
|
42
|
+
private _selectedIndex;
|
|
43
|
+
private scrollOffset;
|
|
44
|
+
private maxVisibleItems;
|
|
45
|
+
private _backgroundColor;
|
|
46
|
+
private _textColor;
|
|
47
|
+
private _focusedBackgroundColor;
|
|
48
|
+
private _focusedTextColor;
|
|
49
|
+
private _selectedBackgroundColor;
|
|
50
|
+
private _selectedTextColor;
|
|
51
|
+
private _descriptionColor;
|
|
52
|
+
private _selectedDescriptionColor;
|
|
53
|
+
private _showScrollIndicator;
|
|
54
|
+
private _wrapSelection;
|
|
55
|
+
private _showDescription;
|
|
56
|
+
private _font?;
|
|
57
|
+
private _itemSpacing;
|
|
58
|
+
private linesPerItem;
|
|
59
|
+
private fontHeight;
|
|
60
|
+
private _fastScrollStep;
|
|
61
|
+
private _keyBindingsMap;
|
|
62
|
+
private _keyAliasMap;
|
|
63
|
+
private _keyBindings;
|
|
64
|
+
protected _defaultOptions: {
|
|
65
|
+
backgroundColor: string;
|
|
66
|
+
textColor: string;
|
|
67
|
+
focusedBackgroundColor: string;
|
|
68
|
+
focusedTextColor: string;
|
|
69
|
+
selectedBackgroundColor: string;
|
|
70
|
+
selectedTextColor: string;
|
|
71
|
+
selectedIndex: number;
|
|
72
|
+
descriptionColor: string;
|
|
73
|
+
selectedDescriptionColor: string;
|
|
74
|
+
showScrollIndicator: false;
|
|
75
|
+
wrapSelection: false;
|
|
76
|
+
showDescription: true;
|
|
77
|
+
itemSpacing: number;
|
|
78
|
+
fastScrollStep: number;
|
|
79
|
+
};
|
|
80
|
+
constructor(ctx: RenderContext, options: SelectRenderableOptions);
|
|
81
|
+
protected renderSelf(buffer: OptimizedBuffer, deltaTime: number): void;
|
|
82
|
+
private refreshFrameBuffer;
|
|
83
|
+
private renderScrollIndicatorToFrameBuffer;
|
|
84
|
+
get options(): SelectOption[];
|
|
85
|
+
set options(options: SelectOption[]);
|
|
86
|
+
getSelectedOption(): SelectOption | null;
|
|
87
|
+
getSelectedIndex(): number;
|
|
88
|
+
moveUp(steps?: number): void;
|
|
89
|
+
moveDown(steps?: number): void;
|
|
90
|
+
selectCurrent(): void;
|
|
91
|
+
setSelectedIndex(index: number): void;
|
|
92
|
+
private updateScrollOffset;
|
|
93
|
+
protected onResize(width: number, height: number): void;
|
|
94
|
+
handleKeyPress(key: KeyEvent): boolean;
|
|
95
|
+
get showScrollIndicator(): boolean;
|
|
96
|
+
set showScrollIndicator(show: boolean);
|
|
97
|
+
get showDescription(): boolean;
|
|
98
|
+
set showDescription(show: boolean);
|
|
99
|
+
get wrapSelection(): boolean;
|
|
100
|
+
set wrapSelection(wrap: boolean);
|
|
101
|
+
set backgroundColor(value: ColorInput);
|
|
102
|
+
set textColor(value: ColorInput);
|
|
103
|
+
set focusedBackgroundColor(value: ColorInput);
|
|
104
|
+
set focusedTextColor(value: ColorInput);
|
|
105
|
+
set selectedBackgroundColor(value: ColorInput);
|
|
106
|
+
set selectedTextColor(value: ColorInput);
|
|
107
|
+
set descriptionColor(value: ColorInput);
|
|
108
|
+
set selectedDescriptionColor(value: ColorInput);
|
|
109
|
+
set font(font: keyof typeof fonts);
|
|
110
|
+
set itemSpacing(spacing: number);
|
|
111
|
+
set fastScrollStep(step: number);
|
|
112
|
+
set keyBindings(bindings: SelectKeyBinding[]);
|
|
113
|
+
set keyAliasMap(aliases: KeyAliasMap);
|
|
114
|
+
set selectedIndex(value: number);
|
|
115
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type ColorInput, OptimizedBuffer, Renderable, type RenderableOptions, type RenderContext, RGBA } from "../index";
|
|
2
|
+
export interface SliderOptions extends RenderableOptions<SliderRenderable> {
|
|
3
|
+
orientation: "vertical" | "horizontal";
|
|
4
|
+
value?: number;
|
|
5
|
+
min?: number;
|
|
6
|
+
max?: number;
|
|
7
|
+
viewPortSize?: number;
|
|
8
|
+
backgroundColor?: ColorInput;
|
|
9
|
+
foregroundColor?: ColorInput;
|
|
10
|
+
onChange?: (value: number) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare class SliderRenderable extends Renderable {
|
|
13
|
+
readonly orientation: "vertical" | "horizontal";
|
|
14
|
+
private _value;
|
|
15
|
+
private _min;
|
|
16
|
+
private _max;
|
|
17
|
+
private _viewPortSize;
|
|
18
|
+
private _backgroundColor;
|
|
19
|
+
private _foregroundColor;
|
|
20
|
+
private _onChange?;
|
|
21
|
+
constructor(ctx: RenderContext, options: SliderOptions);
|
|
22
|
+
get value(): number;
|
|
23
|
+
set value(newValue: number);
|
|
24
|
+
get min(): number;
|
|
25
|
+
set min(newMin: number);
|
|
26
|
+
get max(): number;
|
|
27
|
+
set max(newMax: number);
|
|
28
|
+
set viewPortSize(size: number);
|
|
29
|
+
get viewPortSize(): number;
|
|
30
|
+
get backgroundColor(): RGBA;
|
|
31
|
+
set backgroundColor(value: ColorInput);
|
|
32
|
+
get foregroundColor(): RGBA;
|
|
33
|
+
set foregroundColor(value: ColorInput);
|
|
34
|
+
private calculateDragOffsetVirtual;
|
|
35
|
+
private setupMouseHandling;
|
|
36
|
+
private updateValueFromMouseDirect;
|
|
37
|
+
private updateValueFromMouseWithOffset;
|
|
38
|
+
private getThumbRect;
|
|
39
|
+
protected renderSelf(buffer: OptimizedBuffer): void;
|
|
40
|
+
private renderHorizontal;
|
|
41
|
+
private renderVertical;
|
|
42
|
+
private getVirtualThumbSize;
|
|
43
|
+
private getVirtualThumbStart;
|
|
44
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { Renderable, type RenderableOptions } from "../Renderable";
|
|
2
|
+
import { OptimizedBuffer } from "../buffer";
|
|
3
|
+
import { type ColorInput } from "../lib/RGBA";
|
|
4
|
+
import type { KeyEvent } from "../lib/KeyHandler";
|
|
5
|
+
import type { RenderContext } from "../types";
|
|
6
|
+
import { type KeyBinding as BaseKeyBinding, type KeyAliasMap } from "../lib/keymapping";
|
|
7
|
+
export interface TabSelectOption {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
value?: any;
|
|
11
|
+
}
|
|
12
|
+
export type TabSelectAction = "move-left" | "move-right" | "select-current";
|
|
13
|
+
export type TabSelectKeyBinding = BaseKeyBinding<TabSelectAction>;
|
|
14
|
+
export interface TabSelectRenderableOptions extends Omit<RenderableOptions<TabSelectRenderable>, "height"> {
|
|
15
|
+
height?: number;
|
|
16
|
+
options?: TabSelectOption[];
|
|
17
|
+
tabWidth?: number;
|
|
18
|
+
backgroundColor?: ColorInput;
|
|
19
|
+
textColor?: ColorInput;
|
|
20
|
+
focusedBackgroundColor?: ColorInput;
|
|
21
|
+
focusedTextColor?: ColorInput;
|
|
22
|
+
selectedBackgroundColor?: ColorInput;
|
|
23
|
+
selectedTextColor?: ColorInput;
|
|
24
|
+
selectedDescriptionColor?: ColorInput;
|
|
25
|
+
showScrollArrows?: boolean;
|
|
26
|
+
showDescription?: boolean;
|
|
27
|
+
showUnderline?: boolean;
|
|
28
|
+
wrapSelection?: boolean;
|
|
29
|
+
keyBindings?: TabSelectKeyBinding[];
|
|
30
|
+
keyAliasMap?: KeyAliasMap;
|
|
31
|
+
}
|
|
32
|
+
export declare enum TabSelectRenderableEvents {
|
|
33
|
+
SELECTION_CHANGED = "selectionChanged",
|
|
34
|
+
ITEM_SELECTED = "itemSelected"
|
|
35
|
+
}
|
|
36
|
+
export declare class TabSelectRenderable extends Renderable {
|
|
37
|
+
protected _focusable: boolean;
|
|
38
|
+
private _options;
|
|
39
|
+
private selectedIndex;
|
|
40
|
+
private scrollOffset;
|
|
41
|
+
private _tabWidth;
|
|
42
|
+
private maxVisibleTabs;
|
|
43
|
+
private _backgroundColor;
|
|
44
|
+
private _textColor;
|
|
45
|
+
private _focusedBackgroundColor;
|
|
46
|
+
private _focusedTextColor;
|
|
47
|
+
private _selectedBackgroundColor;
|
|
48
|
+
private _selectedTextColor;
|
|
49
|
+
private _selectedDescriptionColor;
|
|
50
|
+
private _showScrollArrows;
|
|
51
|
+
private _showDescription;
|
|
52
|
+
private _showUnderline;
|
|
53
|
+
private _wrapSelection;
|
|
54
|
+
private _keyBindingsMap;
|
|
55
|
+
private _keyAliasMap;
|
|
56
|
+
private _keyBindings;
|
|
57
|
+
constructor(ctx: RenderContext, options: TabSelectRenderableOptions);
|
|
58
|
+
private calculateDynamicHeight;
|
|
59
|
+
protected renderSelf(buffer: OptimizedBuffer, deltaTime: number): void;
|
|
60
|
+
private refreshFrameBuffer;
|
|
61
|
+
private truncateText;
|
|
62
|
+
private renderScrollArrowsToFrameBuffer;
|
|
63
|
+
setOptions(options: TabSelectOption[]): void;
|
|
64
|
+
getSelectedOption(): TabSelectOption | null;
|
|
65
|
+
getSelectedIndex(): number;
|
|
66
|
+
moveLeft(): void;
|
|
67
|
+
moveRight(): void;
|
|
68
|
+
selectCurrent(): void;
|
|
69
|
+
setSelectedIndex(index: number): void;
|
|
70
|
+
private updateScrollOffset;
|
|
71
|
+
protected onResize(width: number, height: number): void;
|
|
72
|
+
setTabWidth(tabWidth: number): void;
|
|
73
|
+
getTabWidth(): number;
|
|
74
|
+
handleKeyPress(key: KeyEvent): boolean;
|
|
75
|
+
get options(): TabSelectOption[];
|
|
76
|
+
set options(options: TabSelectOption[]);
|
|
77
|
+
set backgroundColor(color: ColorInput);
|
|
78
|
+
set textColor(color: ColorInput);
|
|
79
|
+
set focusedBackgroundColor(color: ColorInput);
|
|
80
|
+
set focusedTextColor(color: ColorInput);
|
|
81
|
+
set selectedBackgroundColor(color: ColorInput);
|
|
82
|
+
set selectedTextColor(color: ColorInput);
|
|
83
|
+
set selectedDescriptionColor(color: ColorInput);
|
|
84
|
+
get showDescription(): boolean;
|
|
85
|
+
set showDescription(show: boolean);
|
|
86
|
+
get showUnderline(): boolean;
|
|
87
|
+
set showUnderline(show: boolean);
|
|
88
|
+
get showScrollArrows(): boolean;
|
|
89
|
+
set showScrollArrows(show: boolean);
|
|
90
|
+
get wrapSelection(): boolean;
|
|
91
|
+
set wrapSelection(wrap: boolean);
|
|
92
|
+
get tabWidth(): number;
|
|
93
|
+
set tabWidth(tabWidth: number);
|
|
94
|
+
set keyBindings(bindings: TabSelectKeyBinding[]);
|
|
95
|
+
set keyAliasMap(aliases: KeyAliasMap);
|
|
96
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { BaseRenderable } from "../Renderable";
|
|
2
|
+
import { StyledText } from "../lib/styled-text";
|
|
3
|
+
import { type TextChunk } from "../text-buffer";
|
|
4
|
+
import { RGBA } from "../lib/RGBA";
|
|
5
|
+
import { type RenderContext } from "../types";
|
|
6
|
+
import { RootTextNodeRenderable, TextNodeRenderable } from "./TextNode";
|
|
7
|
+
import { TextBufferRenderable, type TextBufferOptions } from "./TextBufferRenderable";
|
|
8
|
+
export interface TextOptions extends TextBufferOptions {
|
|
9
|
+
content?: StyledText | string;
|
|
10
|
+
}
|
|
11
|
+
export declare class TextRenderable extends TextBufferRenderable {
|
|
12
|
+
private _text;
|
|
13
|
+
private _hasManualStyledText;
|
|
14
|
+
protected rootTextNode: RootTextNodeRenderable;
|
|
15
|
+
protected _contentDefaultOptions: {
|
|
16
|
+
content: string;
|
|
17
|
+
};
|
|
18
|
+
constructor(ctx: RenderContext, options: TextOptions);
|
|
19
|
+
private updateTextBuffer;
|
|
20
|
+
private clearChunks;
|
|
21
|
+
get content(): StyledText;
|
|
22
|
+
get chunks(): TextChunk[];
|
|
23
|
+
get textNode(): RootTextNodeRenderable;
|
|
24
|
+
set content(value: StyledText | string);
|
|
25
|
+
private updateTextFromNodes;
|
|
26
|
+
add(obj: TextNodeRenderable | StyledText | string, index?: number): number;
|
|
27
|
+
remove(id: string): void;
|
|
28
|
+
insertBefore(obj: BaseRenderable | any, anchor?: TextNodeRenderable): number;
|
|
29
|
+
getTextChildren(): BaseRenderable[];
|
|
30
|
+
clear(): void;
|
|
31
|
+
onLifecyclePass: () => void;
|
|
32
|
+
protected onFgChanged(newColor: RGBA): void;
|
|
33
|
+
protected onBgChanged(newColor: RGBA): void;
|
|
34
|
+
protected onAttributesChanged(newAttributes: number): void;
|
|
35
|
+
destroy(): void;
|
|
36
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { Renderable, type RenderableOptions } from "../Renderable";
|
|
2
|
+
import { Selection, type LocalSelectionBounds } from "../lib/selection";
|
|
3
|
+
import { TextBuffer } from "../text-buffer";
|
|
4
|
+
import { TextBufferView } from "../text-buffer-view";
|
|
5
|
+
import { RGBA } from "../lib/RGBA";
|
|
6
|
+
import { type RenderContext, type LineInfoProvider } from "../types";
|
|
7
|
+
import type { OptimizedBuffer } from "../buffer";
|
|
8
|
+
import type { LineInfo } from "../zig";
|
|
9
|
+
export interface TextBufferOptions extends RenderableOptions<TextBufferRenderable> {
|
|
10
|
+
fg?: string | RGBA;
|
|
11
|
+
bg?: string | RGBA;
|
|
12
|
+
selectionBg?: string | RGBA;
|
|
13
|
+
selectionFg?: string | RGBA;
|
|
14
|
+
selectable?: boolean;
|
|
15
|
+
attributes?: number;
|
|
16
|
+
wrapMode?: "none" | "char" | "word";
|
|
17
|
+
tabIndicator?: string | number;
|
|
18
|
+
tabIndicatorColor?: string | RGBA;
|
|
19
|
+
truncate?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare abstract class TextBufferRenderable extends Renderable implements LineInfoProvider {
|
|
22
|
+
selectable: boolean;
|
|
23
|
+
protected _defaultFg: RGBA;
|
|
24
|
+
protected _defaultBg: RGBA;
|
|
25
|
+
protected _defaultAttributes: number;
|
|
26
|
+
protected _selectionBg: RGBA | undefined;
|
|
27
|
+
protected _selectionFg: RGBA | undefined;
|
|
28
|
+
protected _wrapMode: "none" | "char" | "word";
|
|
29
|
+
protected lastLocalSelection: LocalSelectionBounds | null;
|
|
30
|
+
protected _tabIndicator?: string | number;
|
|
31
|
+
protected _tabIndicatorColor?: RGBA;
|
|
32
|
+
protected _scrollX: number;
|
|
33
|
+
protected _scrollY: number;
|
|
34
|
+
protected _truncate: boolean;
|
|
35
|
+
protected textBuffer: TextBuffer;
|
|
36
|
+
protected textBufferView: TextBufferView;
|
|
37
|
+
protected _defaultOptions: {
|
|
38
|
+
fg: RGBA;
|
|
39
|
+
bg: RGBA;
|
|
40
|
+
selectionBg: undefined;
|
|
41
|
+
selectionFg: undefined;
|
|
42
|
+
selectable: true;
|
|
43
|
+
attributes: number;
|
|
44
|
+
wrapMode: "none" | "char" | "word";
|
|
45
|
+
tabIndicator: undefined;
|
|
46
|
+
tabIndicatorColor: undefined;
|
|
47
|
+
truncate: false;
|
|
48
|
+
};
|
|
49
|
+
constructor(ctx: RenderContext, options: TextBufferOptions);
|
|
50
|
+
protected onMouseEvent(event: any): void;
|
|
51
|
+
protected handleScroll(event: any): void;
|
|
52
|
+
get lineInfo(): LineInfo;
|
|
53
|
+
get lineCount(): number;
|
|
54
|
+
get virtualLineCount(): number;
|
|
55
|
+
get scrollY(): number;
|
|
56
|
+
set scrollY(value: number);
|
|
57
|
+
get scrollX(): number;
|
|
58
|
+
set scrollX(value: number);
|
|
59
|
+
get scrollWidth(): number;
|
|
60
|
+
get scrollHeight(): number;
|
|
61
|
+
get maxScrollY(): number;
|
|
62
|
+
get maxScrollX(): number;
|
|
63
|
+
protected updateViewportOffset(): void;
|
|
64
|
+
get plainText(): string;
|
|
65
|
+
get textLength(): number;
|
|
66
|
+
get fg(): RGBA;
|
|
67
|
+
set fg(value: RGBA | string | undefined);
|
|
68
|
+
get selectionBg(): RGBA | undefined;
|
|
69
|
+
set selectionBg(value: RGBA | string | undefined);
|
|
70
|
+
get selectionFg(): RGBA | undefined;
|
|
71
|
+
set selectionFg(value: RGBA | string | undefined);
|
|
72
|
+
get bg(): RGBA;
|
|
73
|
+
set bg(value: RGBA | string | undefined);
|
|
74
|
+
get attributes(): number;
|
|
75
|
+
set attributes(value: number);
|
|
76
|
+
get wrapMode(): "none" | "char" | "word";
|
|
77
|
+
set wrapMode(value: "none" | "char" | "word");
|
|
78
|
+
get tabIndicator(): string | number | undefined;
|
|
79
|
+
set tabIndicator(value: string | number | undefined);
|
|
80
|
+
get tabIndicatorColor(): RGBA | undefined;
|
|
81
|
+
set tabIndicatorColor(value: RGBA | string | undefined);
|
|
82
|
+
get truncate(): boolean;
|
|
83
|
+
set truncate(value: boolean);
|
|
84
|
+
protected onResize(width: number, height: number): void;
|
|
85
|
+
protected refreshLocalSelection(): boolean;
|
|
86
|
+
private updateLocalSelection;
|
|
87
|
+
protected updateTextInfo(): void;
|
|
88
|
+
private setupMeasureFunc;
|
|
89
|
+
shouldStartSelection(x: number, y: number): boolean;
|
|
90
|
+
onSelectionChanged(selection: Selection | null): boolean;
|
|
91
|
+
getSelectedText(): string;
|
|
92
|
+
hasSelection(): boolean;
|
|
93
|
+
getSelection(): {
|
|
94
|
+
start: number;
|
|
95
|
+
end: number;
|
|
96
|
+
} | null;
|
|
97
|
+
render(buffer: OptimizedBuffer, deltaTime: number): void;
|
|
98
|
+
protected renderSelf(buffer: OptimizedBuffer): void;
|
|
99
|
+
destroy(): void;
|
|
100
|
+
protected onFgChanged(newColor: RGBA): void;
|
|
101
|
+
protected onBgChanged(newColor: RGBA): void;
|
|
102
|
+
protected onAttributesChanged(newAttributes: number): void;
|
|
103
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { TextRenderable } from ".";
|
|
2
|
+
import { BaseRenderable, type BaseRenderableOptions } from "../Renderable";
|
|
3
|
+
import { RGBA } from "../lib/RGBA";
|
|
4
|
+
import { StyledText } from "../lib/styled-text";
|
|
5
|
+
import { type TextChunk } from "../text-buffer";
|
|
6
|
+
import type { RenderContext } from "../types";
|
|
7
|
+
export interface TextNodeOptions extends BaseRenderableOptions {
|
|
8
|
+
fg?: string | RGBA;
|
|
9
|
+
bg?: string | RGBA;
|
|
10
|
+
attributes?: number;
|
|
11
|
+
link?: {
|
|
12
|
+
url: string;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
declare const BrandedTextNodeRenderable: unique symbol;
|
|
16
|
+
export declare function isTextNodeRenderable(obj: any): obj is TextNodeRenderable;
|
|
17
|
+
export declare class TextNodeRenderable extends BaseRenderable {
|
|
18
|
+
[BrandedTextNodeRenderable]: boolean;
|
|
19
|
+
private _fg?;
|
|
20
|
+
private _bg?;
|
|
21
|
+
private _attributes;
|
|
22
|
+
private _link?;
|
|
23
|
+
private _children;
|
|
24
|
+
parent: TextNodeRenderable | null;
|
|
25
|
+
constructor(options: TextNodeOptions);
|
|
26
|
+
get children(): (string | TextNodeRenderable)[];
|
|
27
|
+
set children(children: (string | TextNodeRenderable)[]);
|
|
28
|
+
requestRender(): void;
|
|
29
|
+
add(obj: TextNodeRenderable | StyledText | string, index?: number): number;
|
|
30
|
+
replace(obj: TextNodeRenderable | string, index: number): void;
|
|
31
|
+
insertBefore(child: string | TextNodeRenderable | StyledText, anchorNode: TextNodeRenderable | string | unknown): this;
|
|
32
|
+
remove(id: string): this;
|
|
33
|
+
clear(): void;
|
|
34
|
+
mergeStyles(parentStyle: {
|
|
35
|
+
fg?: RGBA;
|
|
36
|
+
bg?: RGBA;
|
|
37
|
+
attributes: number;
|
|
38
|
+
link?: {
|
|
39
|
+
url: string;
|
|
40
|
+
};
|
|
41
|
+
}): {
|
|
42
|
+
fg?: RGBA;
|
|
43
|
+
bg?: RGBA;
|
|
44
|
+
attributes: number;
|
|
45
|
+
link?: {
|
|
46
|
+
url: string;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
gatherWithInheritedStyle(parentStyle?: {
|
|
50
|
+
fg?: RGBA;
|
|
51
|
+
bg?: RGBA;
|
|
52
|
+
attributes: number;
|
|
53
|
+
link?: {
|
|
54
|
+
url: string;
|
|
55
|
+
};
|
|
56
|
+
}): TextChunk[];
|
|
57
|
+
static fromString(text: string, options?: Partial<TextNodeOptions>): TextNodeRenderable;
|
|
58
|
+
static fromNodes(nodes: TextNodeRenderable[], options?: Partial<TextNodeOptions>): TextNodeRenderable;
|
|
59
|
+
toChunks(parentStyle?: {
|
|
60
|
+
fg?: RGBA;
|
|
61
|
+
bg?: RGBA;
|
|
62
|
+
attributes: number;
|
|
63
|
+
link?: {
|
|
64
|
+
url: string;
|
|
65
|
+
};
|
|
66
|
+
}): TextChunk[];
|
|
67
|
+
getChildren(): BaseRenderable[];
|
|
68
|
+
getChildrenCount(): number;
|
|
69
|
+
getRenderable(id: string): BaseRenderable | undefined;
|
|
70
|
+
getRenderableIndex(id: string): number;
|
|
71
|
+
get fg(): RGBA | undefined;
|
|
72
|
+
set fg(fg: RGBA | string | undefined);
|
|
73
|
+
set bg(bg: RGBA | string | undefined);
|
|
74
|
+
get bg(): RGBA | undefined;
|
|
75
|
+
set attributes(attributes: number);
|
|
76
|
+
get attributes(): number;
|
|
77
|
+
set link(link: {
|
|
78
|
+
url: string;
|
|
79
|
+
} | undefined);
|
|
80
|
+
get link(): {
|
|
81
|
+
url: string;
|
|
82
|
+
} | undefined;
|
|
83
|
+
findDescendantById(id: string): BaseRenderable | undefined;
|
|
84
|
+
}
|
|
85
|
+
export declare class RootTextNodeRenderable extends TextNodeRenderable {
|
|
86
|
+
private readonly ctx;
|
|
87
|
+
textParent: TextRenderable;
|
|
88
|
+
constructor(ctx: RenderContext, options: TextNodeOptions, textParent: TextRenderable);
|
|
89
|
+
requestRender(): void;
|
|
90
|
+
}
|
|
91
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { type RenderContext } from "../types";
|
|
2
|
+
import { EditBufferRenderable, type EditBufferOptions } from "./EditBufferRenderable";
|
|
3
|
+
import type { KeyEvent, PasteEvent } from "../lib/KeyHandler";
|
|
4
|
+
import { RGBA, type ColorInput } from "../lib/RGBA";
|
|
5
|
+
import { type KeyBinding as BaseKeyBinding, type KeyAliasMap } from "../lib/keymapping";
|
|
6
|
+
import { type StyledText } from "../lib/styled-text";
|
|
7
|
+
import type { ExtmarksController } from "../lib/extmarks";
|
|
8
|
+
export type TextareaAction = "move-left" | "move-right" | "move-up" | "move-down" | "select-left" | "select-right" | "select-up" | "select-down" | "line-home" | "line-end" | "select-line-home" | "select-line-end" | "visual-line-home" | "visual-line-end" | "select-visual-line-home" | "select-visual-line-end" | "buffer-home" | "buffer-end" | "select-buffer-home" | "select-buffer-end" | "delete-line" | "delete-to-line-end" | "delete-to-line-start" | "backspace" | "delete" | "newline" | "undo" | "redo" | "word-forward" | "word-backward" | "select-word-forward" | "select-word-backward" | "delete-word-forward" | "delete-word-backward" | "select-all" | "submit";
|
|
9
|
+
export type KeyBinding = BaseKeyBinding<TextareaAction>;
|
|
10
|
+
export interface SubmitEvent {
|
|
11
|
+
}
|
|
12
|
+
export interface TextareaOptions extends EditBufferOptions {
|
|
13
|
+
initialValue?: string;
|
|
14
|
+
backgroundColor?: ColorInput;
|
|
15
|
+
textColor?: ColorInput;
|
|
16
|
+
focusedBackgroundColor?: ColorInput;
|
|
17
|
+
focusedTextColor?: ColorInput;
|
|
18
|
+
placeholder?: StyledText | string | null;
|
|
19
|
+
placeholderColor?: ColorInput;
|
|
20
|
+
keyBindings?: KeyBinding[];
|
|
21
|
+
keyAliasMap?: KeyAliasMap;
|
|
22
|
+
onSubmit?: (event: SubmitEvent) => void;
|
|
23
|
+
}
|
|
24
|
+
export declare class TextareaRenderable extends EditBufferRenderable {
|
|
25
|
+
private _placeholder;
|
|
26
|
+
private _placeholderColor;
|
|
27
|
+
private _unfocusedBackgroundColor;
|
|
28
|
+
private _unfocusedTextColor;
|
|
29
|
+
private _focusedBackgroundColor;
|
|
30
|
+
private _focusedTextColor;
|
|
31
|
+
private _keyBindingsMap;
|
|
32
|
+
private _keyAliasMap;
|
|
33
|
+
private _keyBindings;
|
|
34
|
+
private _actionHandlers;
|
|
35
|
+
private _initialValueSet;
|
|
36
|
+
private _submitListener;
|
|
37
|
+
private static readonly defaults;
|
|
38
|
+
constructor(ctx: RenderContext, options: TextareaOptions);
|
|
39
|
+
private applyPlaceholder;
|
|
40
|
+
private buildActionHandlers;
|
|
41
|
+
handlePaste(event: PasteEvent): void;
|
|
42
|
+
handleKeyPress(key: KeyEvent): boolean;
|
|
43
|
+
private updateColors;
|
|
44
|
+
insertChar(char: string): void;
|
|
45
|
+
insertText(text: string): void;
|
|
46
|
+
deleteChar(): boolean;
|
|
47
|
+
deleteCharBackward(): boolean;
|
|
48
|
+
private deleteSelectedText;
|
|
49
|
+
newLine(): boolean;
|
|
50
|
+
deleteLine(): boolean;
|
|
51
|
+
moveCursorLeft(options?: {
|
|
52
|
+
select?: boolean;
|
|
53
|
+
}): boolean;
|
|
54
|
+
moveCursorRight(options?: {
|
|
55
|
+
select?: boolean;
|
|
56
|
+
}): boolean;
|
|
57
|
+
moveCursorUp(options?: {
|
|
58
|
+
select?: boolean;
|
|
59
|
+
}): boolean;
|
|
60
|
+
moveCursorDown(options?: {
|
|
61
|
+
select?: boolean;
|
|
62
|
+
}): boolean;
|
|
63
|
+
gotoLine(line: number): void;
|
|
64
|
+
gotoLineHome(options?: {
|
|
65
|
+
select?: boolean;
|
|
66
|
+
}): boolean;
|
|
67
|
+
gotoLineEnd(options?: {
|
|
68
|
+
select?: boolean;
|
|
69
|
+
}): boolean;
|
|
70
|
+
gotoVisualLineHome(options?: {
|
|
71
|
+
select?: boolean;
|
|
72
|
+
}): boolean;
|
|
73
|
+
gotoVisualLineEnd(options?: {
|
|
74
|
+
select?: boolean;
|
|
75
|
+
}): boolean;
|
|
76
|
+
gotoBufferHome(options?: {
|
|
77
|
+
select?: boolean;
|
|
78
|
+
}): boolean;
|
|
79
|
+
gotoBufferEnd(options?: {
|
|
80
|
+
select?: boolean;
|
|
81
|
+
}): boolean;
|
|
82
|
+
selectAll(): boolean;
|
|
83
|
+
deleteToLineEnd(): boolean;
|
|
84
|
+
deleteToLineStart(): boolean;
|
|
85
|
+
undo(): boolean;
|
|
86
|
+
redo(): boolean;
|
|
87
|
+
moveWordForward(options?: {
|
|
88
|
+
select?: boolean;
|
|
89
|
+
}): boolean;
|
|
90
|
+
moveWordBackward(options?: {
|
|
91
|
+
select?: boolean;
|
|
92
|
+
}): boolean;
|
|
93
|
+
deleteWordForward(): boolean;
|
|
94
|
+
deleteWordBackward(): boolean;
|
|
95
|
+
focus(): void;
|
|
96
|
+
blur(): void;
|
|
97
|
+
get placeholder(): StyledText | string | null;
|
|
98
|
+
set placeholder(value: StyledText | string | null);
|
|
99
|
+
get placeholderColor(): RGBA;
|
|
100
|
+
set placeholderColor(value: ColorInput);
|
|
101
|
+
get backgroundColor(): RGBA;
|
|
102
|
+
set backgroundColor(value: RGBA | string | undefined);
|
|
103
|
+
get textColor(): RGBA;
|
|
104
|
+
set textColor(value: RGBA | string | undefined);
|
|
105
|
+
set focusedBackgroundColor(value: ColorInput);
|
|
106
|
+
set focusedTextColor(value: ColorInput);
|
|
107
|
+
set initialValue(value: string);
|
|
108
|
+
submit(): boolean;
|
|
109
|
+
set onSubmit(handler: ((event: SubmitEvent) => void) | undefined);
|
|
110
|
+
get onSubmit(): ((event: SubmitEvent) => void) | undefined;
|
|
111
|
+
set keyBindings(bindings: KeyBinding[]);
|
|
112
|
+
set keyAliasMap(aliases: KeyAliasMap);
|
|
113
|
+
get extmarks(): ExtmarksController;
|
|
114
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TextareaRenderable } from "../Textarea";
|
|
2
|
+
import { type TestRenderer } from "../../testing/test-renderer";
|
|
3
|
+
import { type TextareaOptions } from "../Textarea";
|
|
4
|
+
export declare function createTextareaRenderable(renderer: TestRenderer, renderOnce: () => Promise<void>, options: TextareaOptions): Promise<{
|
|
5
|
+
textarea: TextareaRenderable;
|
|
6
|
+
root: any;
|
|
7
|
+
}>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Renderable, type RenderableOptions } from "../../Renderable";
|
|
2
|
+
import type { OptimizedBuffer } from "../../buffer";
|
|
3
|
+
import type { RenderContext } from "../../types";
|
|
4
|
+
export interface VRenderableOptions extends RenderableOptions<VRenderable> {
|
|
5
|
+
render?: (this: VRenderable | VRenderableOptions, buffer: OptimizedBuffer, deltaTime: number, renderable: VRenderable) => void;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* A generic renderable that accepts a custom render function as a prop.
|
|
9
|
+
* This allows functional constructs to specify custom rendering behavior
|
|
10
|
+
* without needing to subclass Renderable.
|
|
11
|
+
*/
|
|
12
|
+
export declare class VRenderable extends Renderable {
|
|
13
|
+
private options;
|
|
14
|
+
constructor(ctx: RenderContext, options: VRenderableOptions);
|
|
15
|
+
protected renderSelf(buffer: OptimizedBuffer, deltaTime: number): void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ASCIIFontRenderable, BoxRenderable, CodeRenderable, InputRenderable, ScrollBoxRenderable, SelectRenderable, TabSelectRenderable, TextRenderable, VRenderable, FrameBufferRenderable, type ASCIIFontOptions, type BoxOptions, type CodeOptions, type TextOptions, type VRenderableOptions, type InputRenderableOptions, type ScrollBoxOptions, type SelectRenderableOptions, type TabSelectRenderableOptions, type FrameBufferOptions } from "../";
|
|
2
|
+
import { TextNodeRenderable } from "../TextNode";
|
|
3
|
+
import { type VChild } from "./vnode";
|
|
4
|
+
import type { RGBA } from "../../lib/RGBA";
|
|
5
|
+
export declare function Generic(props?: VRenderableOptions, ...children: VChild[]): import("./vnode").ProxiedVNode<typeof VRenderable>;
|
|
6
|
+
export declare function Box(props?: BoxOptions, ...children: VChild[]): import("./vnode").ProxiedVNode<typeof BoxRenderable>;
|
|
7
|
+
export declare function Text(props?: TextOptions & {
|
|
8
|
+
content?: any;
|
|
9
|
+
}, ...children: VChild[] | TextNodeRenderable[]): import("./vnode").ProxiedVNode<typeof TextRenderable>;
|
|
10
|
+
export declare function ASCIIFont(props?: ASCIIFontOptions, ...children: VChild[]): import("./vnode").ProxiedVNode<typeof ASCIIFontRenderable>;
|
|
11
|
+
export declare function Input(props?: InputRenderableOptions, ...children: VChild[]): import("./vnode").ProxiedVNode<typeof InputRenderable>;
|
|
12
|
+
export declare function Select(props?: SelectRenderableOptions, ...children: VChild[]): import("./vnode").ProxiedVNode<typeof SelectRenderable>;
|
|
13
|
+
export declare function TabSelect(props?: TabSelectRenderableOptions, ...children: VChild[]): import("./vnode").ProxiedVNode<typeof TabSelectRenderable>;
|
|
14
|
+
export declare function FrameBuffer(props: FrameBufferOptions, ...children: VChild[]): import("./vnode").ProxiedVNode<typeof FrameBufferRenderable>;
|
|
15
|
+
export declare function Code(props: CodeOptions, ...children: VChild[]): import("./vnode").ProxiedVNode<typeof CodeRenderable>;
|
|
16
|
+
export declare function ScrollBox(props?: ScrollBoxOptions, ...children: VChild[]): import("./vnode").ProxiedVNode<typeof ScrollBoxRenderable>;
|
|
17
|
+
export declare const vstyles: {
|
|
18
|
+
bold: (...children: (string | TextNodeRenderable)[]) => TextNodeRenderable;
|
|
19
|
+
italic: (...children: (string | TextNodeRenderable)[]) => TextNodeRenderable;
|
|
20
|
+
underline: (...children: (string | TextNodeRenderable)[]) => TextNodeRenderable;
|
|
21
|
+
dim: (...children: (string | TextNodeRenderable)[]) => TextNodeRenderable;
|
|
22
|
+
blink: (...children: (string | TextNodeRenderable)[]) => TextNodeRenderable;
|
|
23
|
+
inverse: (...children: (string | TextNodeRenderable)[]) => TextNodeRenderable;
|
|
24
|
+
hidden: (...children: (string | TextNodeRenderable)[]) => TextNodeRenderable;
|
|
25
|
+
strikethrough: (...children: (string | TextNodeRenderable)[]) => TextNodeRenderable;
|
|
26
|
+
boldItalic: (...children: (string | TextNodeRenderable)[]) => TextNodeRenderable;
|
|
27
|
+
boldUnderline: (...children: (string | TextNodeRenderable)[]) => TextNodeRenderable;
|
|
28
|
+
italicUnderline: (...children: (string | TextNodeRenderable)[]) => TextNodeRenderable;
|
|
29
|
+
boldItalicUnderline: (...children: (string | TextNodeRenderable)[]) => TextNodeRenderable;
|
|
30
|
+
color: (color: string | RGBA, ...children: (string | TextNodeRenderable)[]) => TextNodeRenderable;
|
|
31
|
+
bgColor: (bgColor: string | RGBA, ...children: (string | TextNodeRenderable)[]) => TextNodeRenderable;
|
|
32
|
+
fg: (color: string | RGBA, ...children: (string | TextNodeRenderable)[]) => TextNodeRenderable;
|
|
33
|
+
bg: (bgColor: string | RGBA, ...children: (string | TextNodeRenderable)[]) => TextNodeRenderable;
|
|
34
|
+
styled: (attributes?: number, ...children: (string | TextNodeRenderable)[]) => TextNodeRenderable;
|
|
35
|
+
};
|