diff --git a/src/components/common/terminal-panel.tsx b/src/components/common/terminal-panel.tsx new file mode 100644 index 0000000..eb14c04 --- /dev/null +++ b/src/components/common/terminal-panel.tsx @@ -0,0 +1,100 @@ +"use client"; + +import { useEffect, useRef, useState } from "react"; +import { Download, Maximize2, RefreshCcw, Search, Trash2 } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; + +export function TerminalPanel() { + const targetRef = useRef(null); + const [connected, setConnected] = useState(true); + const [loaded, setLoaded] = useState(false); + + useEffect(() => { + let disposed = false; + async function boot() { + const [{ Terminal }, { FitAddon }] = await Promise.all([ + import("xterm"), + import("xterm-addon-fit"), + ]); + if (disposed || !targetRef.current) return; + const term = new Terminal({ + cursorBlink: true, + rows: 14, + convertEol: true, + disableStdin: true, + theme: { + background: "#0A0F1E", + foreground: "#E4E7EC", + cursor: "#FF8A00", + }, + }); + const fit = new FitAddon(); + term.loadAddon(fit); + term.open(targetRef.current); + fit.fit(); + term.writeln("CoaxysPanel mock terminal"); + term.writeln("Connected to srv-dal-01.coaxys.net as coaxys"); + term.writeln(""); + term.writeln("$ php -v"); + term.writeln("PHP 8.4.7 (mock output)"); + term.writeln("$ systemctl status nginx"); + term.writeln("active (running) - no command was executed on the host"); + setLoaded(true); + } + void boot(); + return () => { + disposed = true; + }; + }, []); + + return ( + + + Terminal +
+ + + {connected ? "Connected" : "Disconnected"} + + + + + + +
+
+ +
+ {!loaded ? ( +

Loading terminal emulator...

+ ) : null} + + + ); +}