diff --git a/apps/control-station/src/App.tsx b/apps/control-station/src/App.tsx
index a7bc5fb..04da62a 100644
--- a/apps/control-station/src/App.tsx
+++ b/apps/control-station/src/App.tsx
@@ -315,6 +315,8 @@ export default function App() {
const observationFullscreenActive = Boolean(
activeDefinition?.kind === "spatial"
? observationLayout.maximizedFloatingSourceId || focusedObservationSource?.modality === "point-cloud"
+ : activeDefinition?.kind === "lab-archive"
+ ? observationLayout.maximizedFloatingSourceId || focusedObservationSource?.modality === "point-cloud"
: activeDefinition?.kind === "cameras" && focusedObservationSource,
);
diff --git a/apps/control-station/src/styles/workspaces.css b/apps/control-station/src/styles/workspaces.css
index d58b18b..ee6d16d 100644
--- a/apps/control-station/src/styles/workspaces.css
+++ b/apps/control-station/src/styles/workspaces.css
@@ -2385,7 +2385,8 @@
.recordings-workspace,
.lab-archive-workspace,
-.lab-result-surface {
+.lab-result-surface,
+.laboratory-work-template {
display: grid;
gap: 0.85rem;
}
@@ -2542,12 +2543,52 @@
white-space: nowrap;
}
-.lab-result-surface {
+.laboratory-evidence-frame {
+ position: relative;
+ min-width: 0;
+ min-height: 0;
+ overflow: hidden;
+ border-radius: 1rem;
+}
+
+.lab-result-surface[data-resizable="true"] .laboratory-evidence-frame {
+ height: clamp(42rem, 68vh, 58rem);
+ min-height: 42rem;
+ resize: vertical;
+}
+
+.laboratory-evidence-frame > .spatial-workspace {
+ height: 100%;
min-height: 0;
}
-.lab-result-surface .spatial-workspace {
- min-height: 34rem;
+.laboratory-evidence-frame > .lidar-quality-workspace {
+ min-height: 42rem;
+}
+
+.lab-archive-workspace[data-viewer-focused="true"] {
+ height: 100%;
+ min-height: 0;
+ padding: 0;
+}
+
+.lab-archive-workspace[data-viewer-focused="true"] > .laboratory-selector,
+.lab-archive-workspace[data-viewer-focused="true"]
+ .laboratory-work-template > :not(.lab-result-surface),
+.lab-archive-workspace[data-viewer-focused="true"] .lab-result-surface > header {
+ display: none;
+}
+
+.lab-archive-workspace[data-viewer-focused="true"] > .laboratory-work-output,
+.lab-archive-workspace[data-viewer-focused="true"] .laboratory-work-template,
+.lab-archive-workspace[data-viewer-focused="true"] .lab-result-surface,
+.lab-archive-workspace[data-viewer-focused="true"] .laboratory-evidence-frame {
+ height: 100%;
+ min-height: 0;
+}
+
+.lab-archive-workspace[data-viewer-focused="true"] .laboratory-evidence-frame {
+ resize: none;
}
.laboratory-result-pending {
diff --git a/apps/control-station/src/workspaces/Workspaces.tsx b/apps/control-station/src/workspaces/Workspaces.tsx
index 3c5fc37..5bc1318 100644
--- a/apps/control-station/src/workspaces/Workspaces.tsx
+++ b/apps/control-station/src/workspaces/Workspaces.tsx
@@ -5,6 +5,7 @@ import {
useRef,
useState,
type ComponentType,
+ type ReactNode,
} from "react";
import {
Button,
@@ -1281,6 +1282,54 @@ function LaboratoryTask({
);
}
+function LaboratoryEvidence({
+ eyebrow,
+ title,
+ resizable = false,
+ children,
+}: {
+ eyebrow: string;
+ title: string;
+ resizable?: boolean;
+ children: ReactNode;
+}) {
+ return (
+
{result.decision.nextGate}
-