diff --git a/package.json b/package.json
index 6b7c882b..08828414 100644
--- a/package.json
+++ b/package.json
@@ -21,7 +21,7 @@
"react-dropzone": "^10.2.2",
"react-scripts": "3.4.1",
"typescript": "~3.7.2",
- "xterm": "^4.4.0"
+ "xterm": "^4.5.0"
},
"scripts": {
"prepare": "mkdir -p public/static/js && cp node_modules/@pybricks/mpy-cross/build-wasm/mpy-cross.wasm public/static/js/",
diff --git a/src/components/App.tsx b/src/components/App.tsx
index ddbead7c..330a9a29 100644
--- a/src/components/App.tsx
+++ b/src/components/App.tsx
@@ -1,6 +1,7 @@
import React from 'react';
import Editor from './Editor';
import Toolbar from './Toolbar';
+import Terminal from './Terminal';
import Container from 'react-bootstrap/Container';
function App(): JSX.Element {
@@ -8,6 +9,7 @@ function App(): JSX.Element {
+
);
}
diff --git a/src/components/Terminal.tsx b/src/components/Terminal.tsx
index e0268dce..25bd3d39 100644
--- a/src/components/Terminal.tsx
+++ b/src/components/Terminal.tsx
@@ -1,40 +1,50 @@
import React from 'react';
-import { Terminal } from 'xterm';
+import { Terminal as XTerm } from 'xterm';
+import Row from 'react-bootstrap/Row';
+import Col from 'react-bootstrap/Col';
-const encoder = new TextEncoder();
+import 'xterm/css/xterm.css';
-type TerminalProps = {
- onData: (data: Uint8Array) => void;
-};
-
-export default class TerminalComponent extends React.Component {
- private term: Terminal;
+class Terminal extends React.Component {
+ private xterm: XTerm;
private terminalRef: React.RefObject;
- constructor(props: TerminalProps) {
+ constructor(props: {}) {
super(props);
- this.term = new Terminal();
+ this.xterm = new XTerm({
+ cursorBlink: true,
+ cursorStyle: 'underline',
+ fontSize: 18,
+ rows: 8,
+ theme: {
+ background: 'white',
+ foreground: 'black',
+ cursor: 'black',
+ // transparency is needed to work around https://github.com/xtermjs/xterm.js/issues/2808
+ selection: 'rgba(181,213,255,0.5)', // this should match AceEditor theme
+ },
+ });
+ this.xterm.onData((data) => this.xterm.write(data));
this.terminalRef = React.createRef();
- this.term.onData((data) => this.props.onData(encoder.encode(data)));
- }
-
- public write(data: Uint8Array): void {
- this.term.write(data);
}
componentDidMount(): void {
if (!this.terminalRef.current) {
+ console.error('Missing terminal reference');
return;
}
- this.term.open(this.terminalRef.current);
+ this.xterm.open(this.terminalRef.current);
}
render(): JSX.Element {
return (
-
+
+
+
+
+
);
}
}
-export { TerminalComponent as Terminal };
+
+export default Terminal;
diff --git a/yarn.lock b/yarn.lock
index b61cd8b9..06d5c588 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -12491,10 +12491,10 @@ xtend@^4.0.0, xtend@~4.0.1:
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
-xterm@^4.4.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.4.0.tgz#5915d3c4c8800fadbcf555a0a603c672ab9df589"
- integrity sha512-JGIpigWM3EBWvnS3rtBuefkiToIILSK1HYMXy4BCsUpO+O4UeeV+/U1AdAXgCB6qJrnPNb7yLgBsVCQUNMteig==
+xterm@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.5.0.tgz#c7fd145c6cf91c9f2ef07011a9b35026cf4bfecc"
+ integrity sha512-4t12tsvtYnv13FBJwewddxdI/j4kSonmbQQv50j34R/rPIFbUNGtptbprmuUlTDAKvHLMDZ/Np2XcpNimga/HQ==
y18n@^3.2.1:
version "3.2.1"