diff --git a/site/package.json b/site/package.json
index 8f7f8f4f7c44a..c7a26c7af378c 100644
--- a/site/package.json
+++ b/site/package.json
@@ -32,9 +32,9 @@
"dependencies": {
"@emoji-mart/data": "1.0.5",
"@emoji-mart/react": "1.0.1",
- "@fastly/performance-observer-polyfill": "2.0.0",
"@emotion/react": "11.10.8",
"@emotion/styled": "11.11.0",
+ "@fastly/performance-observer-polyfill": "2.0.0",
"@fontsource/ibm-plex-mono": "4.5.10",
"@fontsource/inter": "5.0.2",
"@monaco-editor/react": "4.5.0",
@@ -94,6 +94,7 @@
"vite": "4.3.9",
"xstate": "4.37.2",
"xterm": "5.1.0",
+ "xterm-addon-canvas": "0.4.0",
"xterm-addon-fit": "0.7.0",
"xterm-addon-web-links": "0.8.0",
"yup": "0.32.11"
diff --git a/site/src/AppRouter.tsx b/site/src/AppRouter.tsx
index 1a8fa700ae77c..fd69971f09b36 100644
--- a/site/src/AppRouter.tsx
+++ b/site/src/AppRouter.tsx
@@ -317,7 +317,7 @@ export const AppRouter: FC = () => {
{/* Terminal and CLI auth pages don't have the dashboard layout */}
}
+ element={}
/>
} />
diff --git a/site/src/pages/TerminalPage/TerminalPage.test.tsx b/site/src/pages/TerminalPage/TerminalPage.test.tsx
index 45675ae547db5..6412efaaa519a 100644
--- a/site/src/pages/TerminalPage/TerminalPage.test.tsx
+++ b/site/src/pages/TerminalPage/TerminalPage.test.tsx
@@ -38,7 +38,7 @@ Object.defineProperty(window, "TextEncoder", {
const renderTerminal = async (
route = `/${MockUser.username}/${MockWorkspace.name}/terminal`,
) => {
- const utils = renderWithAuth(, {
+ const utils = renderWithAuth(, {
route,
path: "/:username/:workspace/terminal",
})
diff --git a/site/src/pages/TerminalPage/TerminalPage.tsx b/site/src/pages/TerminalPage/TerminalPage.tsx
index cec22093632d7..09fc1a0633511 100644
--- a/site/src/pages/TerminalPage/TerminalPage.tsx
+++ b/site/src/pages/TerminalPage/TerminalPage.tsx
@@ -8,6 +8,7 @@ import { useNavigate, useParams, useSearchParams } from "react-router-dom"
import { colors } from "theme/colors"
import { v4 as uuidv4 } from "uuid"
import * as XTerm from "xterm"
+import { CanvasAddon } from "xterm-addon-canvas"
import { FitAddon } from "xterm-addon-fit"
import { WebLinksAddon } from "xterm-addon-web-links"
import "xterm/css/xterm.css"
@@ -69,7 +70,11 @@ const useTerminalWarning = ({
}
}
-const TerminalPage: FC = () => {
+type TerminalPageProps = React.PropsWithChildren<{
+ renderer: "canvas" | "dom"
+}>
+
+const TerminalPage: FC = ({ renderer }) => {
const navigate = useNavigate()
const styles = useStyles()
const { proxy } = useProxy()
@@ -194,6 +199,10 @@ const TerminalPage: FC = () => {
background: colors.gray[16],
},
})
+ // DOM is the default renderer.
+ if (renderer === "canvas") {
+ terminal.loadAddon(new CanvasAddon())
+ }
const fitAddon = new FitAddon()
setFitAddon(fitAddon)
terminal.loadAddon(fitAddon)
@@ -230,7 +239,7 @@ const TerminalPage: FC = () => {
window.removeEventListener("resize", listener)
terminal.dispose()
}
- }, [sendEvent, xtermRef, handleWebLink])
+ }, [renderer, sendEvent, xtermRef, handleWebLink])
// Triggers the initial terminal connection using
// the reconnection token and workspace name found
diff --git a/site/yarn.lock b/site/yarn.lock
index 740ebb2dd4cfb..7f3bde87749c5 100644
--- a/site/yarn.lock
+++ b/site/yarn.lock
@@ -12043,6 +12043,11 @@ 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-addon-canvas@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/xterm-addon-canvas/-/xterm-addon-canvas-0.4.0.tgz#a6ee6a56deb0c495fcef29afe6d94b7119a0f334"
+ integrity sha512-iTC8CdjX9+hGX7jiEuiDMXzHsY/FKJdVnbjep5xjRXNu7RKOk15xuecIkJ7HZORqMVPpr4DGS3jyd9XUoBuxqw==
+
xterm-addon-fit@0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/xterm-addon-fit/-/xterm-addon-fit-0.7.0.tgz#b8ade6d96e63b47443862088f6670b49fb752c6a"