+ {isVncConnected && (
+
+
+
+
+
+
+
+
+ )}
+ {!isVncConnected && (
+
+
+
+ )}
+
+ );
+}
+
+export { WorkflowRunStreamVnc };
diff --git a/skyvern-frontend/src/routes/workflows/workflowRun/workflow-run-stream-vnc.css b/skyvern-frontend/src/routes/workflows/workflowRun/workflow-run-stream-vnc.css
new file mode 100644
index 00000000..fe0185ad
--- /dev/null
+++ b/skyvern-frontend/src/routes/workflows/workflowRun/workflow-run-stream-vnc.css
@@ -0,0 +1,96 @@
+.workflow-run-stream-vnc {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ min-height: 0;
+ padding: 0.5rem;
+ overflow: visible;
+
+ transition: padding 0.2s ease-in-out;
+}
+
+.workflow-run-stream-vnc.user-is-controlling {
+ padding: 0rem;
+}
+
+.workflow-run-stream-vnc .overlay-container {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.workflow-run-stream-vnc .overlay {
+ position: relative;
+ height: auto;
+ width: 100%;
+ max-height: 100%;
+ aspect-ratio: 16 / 9;
+ object-fit: cover;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.workflow-run-stream-vnc.user-is-controlling .overlay {
+ pointer-events: none;
+}
+
+.workflow-run-stream-vnc.user-is-controlling .overlay-container {
+ pointer-events: none;
+}
+
+.workflow-run-stream-vnc .take-control {
+ transform: translateY(0);
+ transition:
+ transform 0.2s ease-in-out,
+ opacity 0.2s ease-in-out;
+ opacity: 0.3;
+}
+
+.workflow-run-stream-vnc .take-control:not(.hide):hover {
+ opacity: 1;
+}
+
+.workflow-run-stream-vnc .take-control.hide {
+ transform: translateY(100%);
+ opacity: 0;
+ pointer-events: none;
+}
+
+.workflow-run-stream-vnc .relinquish-control {
+ transform: translateY(0);
+ transition:
+ transform 0.2s ease-in-out,
+ opacity 0.2s ease-in-out;
+ opacity: 0.3;
+ pointer-events: all;
+}
+
+.workflow-run-stream-vnc .relinquish-control:not(.hide):hover {
+ opacity: 1;
+}
+
+.workflow-run-stream-vnc .relinquish-control.hide {
+ transform: translateY(100%);
+ opacity: 0;
+ pointer-events: none;
+}
+
+.workflow-run-stream-vnc > div > canvas {
+ opacity: 0;
+ animation: skyvern-anim-fadeIn 1s ease-in forwards;
+}
+
+@keyframes skyvern-anim-fadeIn {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}