Add conference stage layouts for plenary and panel discussions.
Deploy Ladill Meet / deploy (push) Successful in 37s

Speakers get a full-screen spotlight with overlapping audience avatars; hosts can configure panels in the green room and switch layouts live.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-07-01 21:03:02 +00:00
co-authored by Cursor
parent 158b7b650a
commit 1037cd6ee6
14 changed files with 889 additions and 32 deletions
@@ -15,6 +15,7 @@ use App\Services\Meet\FileSharingService;
use App\Services\Meet\LiveStreamService;
use App\Services\Meet\PollService;
use App\Services\Meet\QaService;
use App\Services\Meet\StageLayoutService;
use App\Services\Meet\TownHallService;
use App\Services\Meet\WhiteboardService;
use Illuminate\Http\JsonResponse;
@@ -32,6 +33,7 @@ class MeetingFeaturesController extends Controller
protected WhiteboardService $whiteboards,
protected LiveStreamService $liveStreams,
protected TownHallService $townHall,
protected StageLayoutService $stageLayout,
) {}
// --- Q&A ---
@@ -320,6 +322,29 @@ class MeetingFeaturesController extends Controller
]);
}
public function updateStage(Request $request, Session $session): JsonResponse
{
$this->hostOnly($request, $session);
$room = $session->room;
abort_unless($this->stageLayout->usesStageLayout($room), 422);
$validated = $request->validate([
'panel_discussions' => ['sometimes', 'boolean'],
'stage_layout' => ['sometimes', 'string', 'in:plenary,panel'],
'active_panel_id' => ['nullable', 'string', 'max:64'],
'spotlight_speaker_ref' => ['nullable', 'string', 'max:64'],
'panels' => ['sometimes', 'array', 'max:12'],
'panels.*.id' => ['nullable', 'string', 'max:64'],
'panels.*.name' => ['required_with:panels', 'string', 'max:100'],
'panels.*.speaker_refs' => ['nullable', 'array'],
'panels.*.speaker_refs.*' => ['string', 'max:64'],
]);
$room = $this->stageLayout->update($room, $validated);
return response()->json($this->stageLayout->config($room));
}
protected function participant(Request $request, Session $session): Participant
{
$uuid = $request->session()->get("meet.participant.{$session->uuid}");