@next_term/react 0.1.0-next.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.
@@ -0,0 +1,34 @@
1
+ import type { Theme } from "@next_term/core";
2
+ import type React from "react";
3
+ export interface TerminalProps {
4
+ cols?: number;
5
+ rows?: number;
6
+ fontSize?: number;
7
+ fontFamily?: string;
8
+ theme?: Partial<Theme>;
9
+ scrollback?: number;
10
+ onData?: (data: Uint8Array) => void;
11
+ onResize?: (size: {
12
+ cols: number;
13
+ rows: number;
14
+ }) => void;
15
+ onTitleChange?: (title: string) => void;
16
+ autoFit?: boolean;
17
+ className?: string;
18
+ style?: React.CSSProperties;
19
+ /** Force main-thread rendering ('main') or use auto-detection ('auto'). */
20
+ renderMode?: "auto" | "offscreen" | "main";
21
+ /** Renderer backend: 'auto', 'webgl', or 'canvas2d'. */
22
+ renderer?: "auto" | "webgl" | "canvas2d";
23
+ /** Whether to use a Web Worker for VT parsing. */
24
+ useWorker?: boolean;
25
+ }
26
+ export interface TerminalHandle {
27
+ write(data: string | Uint8Array): void;
28
+ resize(cols: number, rows: number): void;
29
+ focus(): void;
30
+ blur(): void;
31
+ fit(): void;
32
+ }
33
+ export declare const Terminal: React.ForwardRefExoticComponent<TerminalProps & React.RefAttributes<TerminalHandle>>;
34
+ //# sourceMappingURL=Terminal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Terminal.d.ts","sourceRoot":"","sources":["../src/Terminal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC3C,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;IACzC,kDAAkD;IAClD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,IAAI,CAAC;IACb,GAAG,IAAI,IAAI,CAAC;CACb;AAED,eAAO,MAAM,QAAQ,sFA+KnB,CAAC"}
@@ -0,0 +1,151 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { calculateFit, WebTerminal } from "@next_term/web";
3
+ import { forwardRef, useEffect, useImperativeHandle, useRef } from "react";
4
+ export const Terminal = forwardRef(function Terminal(props, ref) {
5
+ const { cols = 80, rows = 24, fontSize = 16, fontFamily = "'Courier New', monospace", theme, scrollback = 1000, onData, onResize, onTitleChange, autoFit = false, className, style, renderMode, renderer: rendererProp, useWorker, } = props;
6
+ const containerRef = useRef(null);
7
+ const termRef = useRef(null);
8
+ const initialized = useRef(false);
9
+ // Keep callback refs stable to avoid re-creating the terminal
10
+ const onDataRef = useRef(onData);
11
+ const onResizeRef = useRef(onResize);
12
+ const onTitleChangeRef = useRef(onTitleChange);
13
+ useEffect(() => {
14
+ onDataRef.current = onData;
15
+ }, [onData]);
16
+ useEffect(() => {
17
+ onResizeRef.current = onResize;
18
+ }, [onResize]);
19
+ useEffect(() => {
20
+ onTitleChangeRef.current = onTitleChange;
21
+ }, [onTitleChange]);
22
+ // Expose imperative handle
23
+ useImperativeHandle(ref, () => ({
24
+ write(data) {
25
+ termRef.current?.write(data);
26
+ },
27
+ resize(cols, rows) {
28
+ termRef.current?.resize(cols, rows);
29
+ },
30
+ focus() {
31
+ termRef.current?.focus();
32
+ },
33
+ blur() {
34
+ termRef.current?.blur();
35
+ },
36
+ fit() {
37
+ const terminal = termRef.current;
38
+ const container = containerRef.current;
39
+ if (!terminal || !container)
40
+ return;
41
+ const { width, height } = terminal.getCellSize();
42
+ if (width <= 0 || height <= 0)
43
+ return;
44
+ const { cols: fitCols, rows: fitRows } = calculateFit(container, width, height);
45
+ terminal.resize(fitCols, fitRows);
46
+ },
47
+ }), []);
48
+ // Initialize WebTerminal on mount (handles StrictMode double-mount)
49
+ useEffect(() => {
50
+ if (initialized.current)
51
+ return;
52
+ initialized.current = true;
53
+ const container = containerRef.current;
54
+ if (!container)
55
+ return;
56
+ const terminal = new WebTerminal(container, {
57
+ cols,
58
+ rows,
59
+ fontSize,
60
+ fontFamily,
61
+ theme,
62
+ scrollback,
63
+ renderMode,
64
+ renderer: rendererProp,
65
+ useWorker,
66
+ onData: (data) => onDataRef.current?.(data),
67
+ onResize: (size) => onResizeRef.current?.(size),
68
+ onTitleChange: (title) => onTitleChangeRef.current?.(title),
69
+ });
70
+ termRef.current = terminal;
71
+ return () => {
72
+ termRef.current?.dispose();
73
+ termRef.current = null;
74
+ initialized.current = false;
75
+ };
76
+ }, [cols, fontFamily, fontSize, renderMode, rendererProp, rows, scrollback, theme, useWorker]); // eslint-disable-line react-hooks/exhaustive-deps
77
+ // Update theme when it changes
78
+ useEffect(() => {
79
+ if (termRef.current && theme) {
80
+ termRef.current.setTheme(theme);
81
+ }
82
+ }, [theme]);
83
+ // Update font when it changes
84
+ useEffect(() => {
85
+ if (termRef.current) {
86
+ termRef.current.setFont(fontSize, fontFamily);
87
+ }
88
+ }, [fontSize, fontFamily]);
89
+ // AutoFit: observe container size via ResizeObserver, debounced with rAF.
90
+ // Also listen to visualViewport resize for iOS keyboard show/hide.
91
+ useEffect(() => {
92
+ if (!autoFit)
93
+ return;
94
+ const container = containerRef.current;
95
+ if (!container)
96
+ return;
97
+ let rafId = null;
98
+ const doFit = () => {
99
+ if (rafId !== null)
100
+ cancelAnimationFrame(rafId);
101
+ rafId = requestAnimationFrame(() => {
102
+ rafId = null;
103
+ const terminal = termRef.current;
104
+ if (!terminal || !container)
105
+ return;
106
+ // On iOS, when the virtual keyboard is open, visualViewport.height
107
+ // is the visible area above the keyboard. Use it to constrain the
108
+ // container height so the terminal fits the visible viewport.
109
+ // Only update when values actually change to avoid ResizeObserver loop.
110
+ const vv = window.visualViewport;
111
+ if (vv) {
112
+ const newHeight = `${vv.height}px`;
113
+ const newMargin = `${vv.offsetTop}px`;
114
+ if (container.style.height !== newHeight)
115
+ container.style.height = newHeight;
116
+ if (container.style.marginTop !== newMargin)
117
+ container.style.marginTop = newMargin;
118
+ }
119
+ const { width, height } = terminal.getCellSize();
120
+ if (width <= 0 || height <= 0)
121
+ return;
122
+ const { cols: fitCols, rows: fitRows } = calculateFit(container, width, height);
123
+ terminal.resize(fitCols, fitRows);
124
+ });
125
+ };
126
+ const observer = new ResizeObserver(doFit);
127
+ observer.observe(container);
128
+ // Listen for visualViewport resize (keyboard show/hide on iOS/Android)
129
+ const vv = window.visualViewport;
130
+ if (vv) {
131
+ vv.addEventListener("resize", doFit);
132
+ vv.addEventListener("scroll", doFit);
133
+ }
134
+ return () => {
135
+ observer.disconnect();
136
+ if (vv) {
137
+ vv.removeEventListener("resize", doFit);
138
+ vv.removeEventListener("scroll", doFit);
139
+ }
140
+ if (rafId !== null)
141
+ cancelAnimationFrame(rafId);
142
+ // Reset container styles
143
+ if (container) {
144
+ container.style.height = "";
145
+ container.style.marginTop = "";
146
+ }
147
+ };
148
+ }, [autoFit]);
149
+ return _jsx("div", { ref: containerRef, className: className, style: style });
150
+ });
151
+ //# sourceMappingURL=Terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Terminal.js","sourceRoot":"","sources":["../src/Terminal.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AA+B3E,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAgC,SAAS,QAAQ,CAAC,KAAK,EAAE,GAAG;IAC5F,MAAM,EACJ,IAAI,GAAG,EAAE,EACT,IAAI,GAAG,EAAE,EACT,QAAQ,GAAG,EAAE,EACb,UAAU,GAAG,0BAA0B,EACvC,KAAK,EACL,UAAU,GAAG,IAAI,EACjB,MAAM,EACN,QAAQ,EACR,aAAa,EACb,OAAO,GAAG,KAAK,EACf,SAAS,EACT,KAAK,EACL,UAAU,EACV,QAAQ,EAAE,YAAY,EACtB,SAAS,GACV,GAAG,KAAK,CAAC;IAEV,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAElC,8DAA8D;IAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,gBAAgB,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IAE/C,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAC7B,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACb,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IACjC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACf,SAAS,CAAC,GAAG,EAAE;QACb,gBAAgB,CAAC,OAAO,GAAG,aAAa,CAAC;IAC3C,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,2BAA2B;IAC3B,mBAAmB,CACjB,GAAG,EACH,GAAG,EAAE,CAAC,CAAC;QACL,KAAK,CAAC,IAAyB;YAC7B,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,CAAC,IAAY,EAAE,IAAY;YAC/B,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;QACD,KAAK;YACH,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI;YACF,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;QACD,GAAG;YACD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;YACjC,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;YACvC,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS;gBAAE,OAAO;YACpC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;YACjD,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC;gBAAE,OAAO;YACtC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAChF,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpC,CAAC;KACF,CAAC,EACF,EAAE,CACH,CAAC;IAEF,oEAAoE;IACpE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,WAAW,CAAC,OAAO;YAAE,OAAO;QAChC,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;QAE3B,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,SAAS,EAAE;YAC1C,IAAI;YACJ,IAAI;YACJ,QAAQ;YACR,UAAU;YACV,KAAK;YACL,UAAU;YACV,UAAU;YACV,QAAQ,EAAE,YAAY;YACtB,SAAS;YACT,MAAM,EAAE,CAAC,IAAgB,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC;YACvD,QAAQ,EAAE,CAAC,IAAoC,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC;YAC/E,aAAa,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;SACpE,CAAC,CAAC;QAEH,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC;QAE3B,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YAC3B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;YACvB,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC;QAC9B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,kDAAkD;IAElJ,+BAA+B;IAC/B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC;YAC7B,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,8BAA8B;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IAE3B,0EAA0E;IAC1E,mEAAmE;IACnE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,IAAI,KAAK,GAAkB,IAAI,CAAC;QAEhC,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,IAAI,KAAK,KAAK,IAAI;gBAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAChD,KAAK,GAAG,qBAAqB,CAAC,GAAG,EAAE;gBACjC,KAAK,GAAG,IAAI,CAAC;gBACb,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;gBACjC,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS;oBAAE,OAAO;gBAEpC,mEAAmE;gBACnE,kEAAkE;gBAClE,8DAA8D;gBAC9D,wEAAwE;gBACxE,MAAM,EAAE,GAAG,MAAM,CAAC,cAAc,CAAC;gBACjC,IAAI,EAAE,EAAE,CAAC;oBACP,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,MAAM,IAAI,CAAC;oBACnC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,SAAS,IAAI,CAAC;oBACtC,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS;wBAAE,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;oBAC7E,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS;wBAAE,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;gBACrF,CAAC;gBAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;gBACjD,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC;oBAAE,OAAO;gBACtC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;gBAChF,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;QAC3C,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE5B,uEAAuE;QACvE,MAAM,EAAE,GAAG,MAAM,CAAC,cAAc,CAAC;QACjC,IAAI,EAAE,EAAE,CAAC;YACP,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACrC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtB,IAAI,EAAE,EAAE,CAAC;gBACP,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBACxC,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC1C,CAAC;YACD,IAAI,KAAK,KAAK,IAAI;gBAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAChD,yBAAyB;YACzB,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;gBAC5B,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;YACjC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,OAAO,cAAK,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAI,CAAC;AACxE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * TerminalPane — a container component that manages multiple terminal
3
+ * instances in a split-pane layout.
4
+ *
5
+ * All panes share rendering resources (e.g. the same WebGL context when
6
+ * using the WebGL backend), which avoids hitting Chrome's 16-context limit.
7
+ *
8
+ * Layout is described as a recursive tree of horizontal / vertical splits.
9
+ */
10
+ import type { Theme } from "@next_term/core";
11
+ import type React from "react";
12
+ import { type PaneLayout } from "./pane-layout.js";
13
+ import type { TerminalHandle } from "./Terminal.js";
14
+ export type { PaneLayout } from "./pane-layout.js";
15
+ export interface TerminalPaneProps {
16
+ layout: PaneLayout;
17
+ onData?: (paneId: string, data: Uint8Array) => void;
18
+ theme?: Partial<Theme>;
19
+ fontSize?: number;
20
+ fontFamily?: string;
21
+ className?: string;
22
+ style?: React.CSSProperties;
23
+ }
24
+ export interface TerminalPaneHandle {
25
+ /** Get the terminal handle for a specific pane by id. */
26
+ getTerminal(paneId: string): TerminalHandle | null;
27
+ /** Get all pane ids. */
28
+ getPaneIds(): string[];
29
+ }
30
+ export declare const TerminalPane: React.ForwardRefExoticComponent<TerminalPaneProps & React.RefAttributes<TerminalPaneHandle>>;
31
+ //# sourceMappingURL=TerminalPane.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TerminalPane.d.ts","sourceRoot":"","sources":["../src/TerminalPane.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAMnD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IACpD,KAAK,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,yDAAyD;IACzD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAC;IACnD,wBAAwB;IACxB,UAAU,IAAI,MAAM,EAAE,CAAC;CACxB;AAiID,eAAO,MAAM,YAAY,8FA8CxB,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef } from "react";
3
+ import { collectPaneIds } from "./pane-layout.js";
4
+ import { Terminal } from "./Terminal.js";
5
+ function PaneLeaf({ id, onData, theme, fontSize, fontFamily, onRef }) {
6
+ const termRef = useRef(null);
7
+ useEffect(() => {
8
+ onRef(id, termRef.current);
9
+ return () => {
10
+ onRef(id, null);
11
+ };
12
+ }, [id, onRef]);
13
+ const handleData = useCallback((data) => {
14
+ onData?.(id, data);
15
+ }, [id, onData]);
16
+ return (_jsx(Terminal, { ref: termRef, autoFit: true, theme: theme, fontSize: fontSize, fontFamily: fontFamily, onData: handleData, style: { width: "100%", height: "100%" } }));
17
+ }
18
+ function PaneNode({ layout, onData, theme, fontSize, fontFamily, onRef }) {
19
+ if (layout.type === "single") {
20
+ return (_jsx(PaneLeaf, { id: layout.id, onData: onData, theme: theme, fontSize: fontSize, fontFamily: fontFamily, onRef: onRef }));
21
+ }
22
+ const isHorizontal = layout.type === "horizontal";
23
+ const children = layout.children;
24
+ const sizes = layout.sizes ?? children.map(() => 1 / children.length);
25
+ return (_jsx("div", { style: {
26
+ display: "flex",
27
+ flexDirection: isHorizontal ? "row" : "column",
28
+ width: "100%",
29
+ height: "100%",
30
+ }, children: children.map((child, i) => {
31
+ const basis = `${(sizes[i] ?? 1 / children.length) * 100}%`;
32
+ return (_jsx("div", { style: {
33
+ flexBasis: basis,
34
+ flexGrow: 0,
35
+ flexShrink: 0,
36
+ overflow: "hidden",
37
+ position: "relative",
38
+ // Add a small border between panes
39
+ ...(i > 0
40
+ ? isHorizontal
41
+ ? { borderLeft: "1px solid #444" }
42
+ : { borderTop: "1px solid #444" }
43
+ : {}),
44
+ }, children: _jsx(PaneNode, { layout: child, onData: onData, theme: theme, fontSize: fontSize, fontFamily: fontFamily, onRef: onRef }) }, child.type === "single" ? child.id : `split-${i}`));
45
+ }) }));
46
+ }
47
+ // ---------------------------------------------------------------------------
48
+ // TerminalPane
49
+ // ---------------------------------------------------------------------------
50
+ export const TerminalPane = forwardRef(function TerminalPane(props, ref) {
51
+ const { layout, onData, theme, fontSize, fontFamily, className, style } = props;
52
+ const terminalsRef = useRef(new Map());
53
+ const handleRef = useCallback((id, handle) => {
54
+ if (handle) {
55
+ terminalsRef.current.set(id, handle);
56
+ }
57
+ else {
58
+ terminalsRef.current.delete(id);
59
+ }
60
+ }, []);
61
+ useImperativeHandle(ref, () => ({
62
+ getTerminal(paneId) {
63
+ return terminalsRef.current.get(paneId) ?? null;
64
+ },
65
+ getPaneIds() {
66
+ return collectPaneIds(layout);
67
+ },
68
+ }), [layout]);
69
+ return (_jsx("div", { className: className, style: {
70
+ position: "relative",
71
+ overflow: "hidden",
72
+ ...style,
73
+ }, children: _jsx(PaneNode, { layout: layout, onData: onData, theme: theme, fontSize: fontSize, fontFamily: fontFamily, onRef: handleRef }) }));
74
+ });
75
+ //# sourceMappingURL=TerminalPane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TerminalPane.js","sourceRoot":"","sources":["../src/TerminalPane.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { collectPaneIds } from "./pane-layout.js";
2
+ export { Terminal } from "./Terminal.js";
3
+ export { TerminalPane } from "./TerminalPane.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pane-layout.d.ts","sourceRoot":"","sources":["../src/pane-layout.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAChE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEnE,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CAS3D"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * PaneLayout — recursive layout tree for TerminalPane.
3
+ * Kept in a separate module so pure layout logic can be unit-tested without
4
+ * pulling in React/JSX.
5
+ */
6
+ /** Collect all leaf pane ids from a layout tree (depth-first, left-to-right). */
7
+ export function collectPaneIds(layout) {
8
+ if (layout.type === "single") {
9
+ return [layout.id];
10
+ }
11
+ const ids = [];
12
+ for (const child of layout.children) {
13
+ ids.push(...collectPaneIds(child));
14
+ }
15
+ return ids;
16
+ }
17
+ //# sourceMappingURL=pane-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pane-layout.js","sourceRoot":"","sources":["../src/pane-layout.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,iFAAiF;AACjF,MAAM,UAAU,cAAc,CAAC,MAAkB;IAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACrB,CAAC;IACD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpC,GAAG,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@next_term/react",
3
+ "version": "0.1.0-next.0",
4
+ "license": "MIT",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/rahulpandita/react-term",
8
+ "directory": "packages/react"
9
+ },
10
+ "type": "module",
11
+ "main": "dist/index.js",
12
+ "types": "dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js"
17
+ }
18
+ },
19
+ "scripts": {
20
+ "build": "tsc"
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "!dist/__tests__"
25
+ ],
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "peerDependencies": {
30
+ "react": "^18.0.0 || ^19.0.0",
31
+ "react-dom": "^18.0.0 || ^19.0.0"
32
+ },
33
+ "dependencies": {
34
+ "@next_term/core": "workspace:*",
35
+ "@next_term/web": "workspace:*"
36
+ },
37
+ "devDependencies": {
38
+ "typescript": "^5.5.0",
39
+ "react": "^19.0.0",
40
+ "react-dom": "^19.0.0",
41
+ "@types/react": "^19.0.0",
42
+ "@types/react-dom": "^19.0.0"
43
+ }
44
+ }