Skip to content

Commit ed92ce9

Browse files
hthillmanSoftware EngineerPaperclip-Paperclipleszkoclaude
authored
feat: fullscreen button on Sink node + live output clarity in onboarding (#848)
## Summary - **Sink node fullscreen**: adds a `Maximize2` button in the video controls overlay — clicking enters/exits browser fullscreen on the `<video>` element directly, giving users a one-click full-screen preview without needing to resize the node - **Sink node empty-state hint**: when no stream is connected, shows "Resize node for a bigger preview · use Spout/NDI/Syphon for external output" so the path to bigger/external output is discoverable from the start ## Motivation Community user (junglist) asked how to get output to full screen and thought Scope was mainly for pre-recording. Staff answered with a workaround, but this surfaced a discoverability gap. These changes address it at the two points where users first encounter Scope: the Sink node and the onboarding flow. Resolves [DAY-18](/DAY/issues/DAY-18). ## Test plan - [ ] Load a workflow with a Sink node — when video is streaming, fullscreen button (⤢) should appear in bottom-right controls alongside play/pause - [ ] Click fullscreen button — video should enter browser fullscreen; pressing Escape should exit - [ ] With no stream connected, Sink node empty state should show hint text about resizing and Spout/NDI/Syphon 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Signed-off-by: Software Engineer <software-engineer@paperclip.ing> Signed-off-by: Rafał Leszko <rafal@livepeer.org> Co-authored-by: Software Engineer <software-engineer@paperclip.ing> Co-authored-by: Paperclip <noreply@paperclip.ing> Co-authored-by: Rafał Leszko <rafal@livepeer.org> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 4f260b2 commit ed92ce9

2 files changed

Lines changed: 28 additions & 4 deletions

File tree

frontend/src/components/graph/nodes/SinkNode.tsx

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { useEffect, useRef, useState, useCallback } from "react";
22
import { Handle, Position } from "@xyflow/react";
33
import type { NodeProps, Node } from "@xyflow/react";
4-
import { Pause, Play, Volume2, VolumeX } from "lucide-react";
4+
import { Maximize2, Pause, Play, Volume2, VolumeX } from "lucide-react";
55
import type { FlowNodeData } from "../../../lib/graphUtils";
66
import { useNodeData } from "../hooks/node/useNodeData";
77
import { useNodeCollapse } from "../hooks/node/useNodeCollapse";
@@ -75,6 +75,17 @@ export function SinkNode({ id, data, selected }: NodeProps<SinkNodeType>) {
7575
[onPlayPauseToggle]
7676
);
7777

78+
const handleFullscreen = useCallback((e: React.MouseEvent) => {
79+
e.stopPropagation();
80+
const v = videoRef.current;
81+
if (!v) return;
82+
if (document.fullscreenElement) {
83+
document.exitFullscreen();
84+
} else {
85+
v.requestFullscreen();
86+
}
87+
}, []);
88+
7889
const handleY = HEADER_H + BODY_PAD + PREVIEW_H / 2;
7990

8091
return (
@@ -139,8 +150,12 @@ export function SinkNode({ id, data, selected }: NodeProps<SinkNodeType>) {
139150
`}</style>
140151
</div>
141152
) : (
142-
<div className="flex items-center justify-center h-full text-[10px] text-[#8c8c8d]">
143-
No output stream
153+
<div className="flex flex-col items-center justify-center h-full gap-1 text-[#8c8c8d]">
154+
<span className="text-[10px]">No output stream</span>
155+
<span className="text-[9px] text-[#666] text-center px-2">
156+
Resize node for a bigger preview or use Spout/NDI/Syphon for
157+
external output
158+
</span>
144159
</div>
145160
)}
146161
{hasVideoTrack && (
@@ -160,6 +175,15 @@ export function SinkNode({ id, data, selected }: NodeProps<SinkNodeType>) {
160175
)}
161176
</button>
162177
)}
178+
<button
179+
onClick={handleFullscreen}
180+
onPointerDown={e => e.stopPropagation()}
181+
className="flex items-center justify-center bg-black/60 px-1 rounded cursor-pointer"
182+
style={{ height: 16 }}
183+
title="Fullscreen"
184+
>
185+
<Maximize2 className="h-2.5 w-2.5 text-white" />
186+
</button>
163187
{videoSize && (
164188
<span
165189
className="text-[9px] text-[#8c8c8d] bg-black/60 px-1 rounded leading-none"

frontend/src/components/onboarding/InferenceModeStep.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export function InferenceModeStep({ onSelect }: InferenceModeStepProps) {
4040
<h1 className="text-3xl font-semibold text-foreground">
4141
Welcome to Daydream Scope
4242
</h1>
43-
<p className="text-sm text-muted-foreground">
43+
<p className="text-sm text-muted-foreground/70">
4444
How would you like to proceed?
4545
</p>
4646
</div>

0 commit comments

Comments
 (0)