{{define "head"}} {{/* #devices is in the layout from the first paint, so its arrival does not push the page down when devices.js runs; without script this sheet hides it, as the hidden attribute used to. */}} {{end}} {{/* The holding screen. Its layout is fixed at the first paint (spec §2's "reserved up front"): the controls and the status line come first in the device panel, and the rows devices.js may reveal later come after them, the speaker last of all, so nothing that is already on screen moves when they arrive. */}} {{define "content"}} {{if .IsMember}}{{template "back-nav" dict "Href" "/" "Label" "Meetings"}}{{end}}
{{template "page-header" dict "Title" .Title}}

{{if .Starts}}Starts {{.Starts}}. {{end}}You’ll join as {{.Name}}{{if eq .Standing "guest"}}, a guest{{end}}.

{{if .Floor}}{{template "callout" dict "Body" "Calls outside your network may not connect yet." "Tone" "warning"}}{{end}} {{if .OpenElsewhere}}

This meeting is already open in another tab. Use this tab instead.

{{end}}

{{template "field-select" dict "ID" "pick-camera" "Name" "camera" "Label" "Camera"}}
{{template "field-select" dict "ID" "pick-mic" "Name" "mic" "Label" "Microphone"}}
{{/* Studio audio: the unprocessed capture option. field-check is the vendored toggle (AGENTS.md's field rule), and the sentence under it is wired to the input with aria-describedby by devices.js, because field-check gives its checkbox no id to write here. It is shown from the first paint, so the controls do not move when devices.js decides; devices.js hides it only where there is no microphone to apply it to. */}}
{{template "field-check" dict "Name" "raw-audio" "Label" "Studio audio"}}

Sends your microphone unprocessed and at a higher bitrate, for an audio interface in a room you have treated. It turns off echo cancellation, noise suppression and automatic gain, so leave it off on a laptop.

{{/* Last, so that revealing it (only where the browser can choose an output, and once it knows there is one) moves nothing below it. */}}
{{/* Spec §15.20: the audio test, beside the choices it tests. A native disclosure, so it opens and closes with no script of its own; devices.js removes it where there is no Web Audio to run it with, and like the rest of #devices it is never seen without script. Each result is said in words in its own status line, and the meters are native s with names of their own. Nothing here is sent anywhere: the recording is played back from memory and dropped. */}}
Test audio

Everything here stays in this browser. Nothing you say is sent anywhere.

Records five seconds from your microphone, with the same settings the call will use, and plays it back to you here. The recording never leaves this browser and is thrown away once it has played.

{{/* Spec §15.26: for ten minutes after leaving a call, the call can still be reported from here. report.js reveals it only when this tab left this meeting's call that recently, and never without script, which the sheet needs. */}}

Join in the app The Calls app must be installed to open it.

{{if .IsMember}}
{{end}} {{/* §15.26's disclosure, where the small print is. The switch is in the call's Devices panel. */}}

Calls sends anonymous connection quality reports to help fix call problems. You can turn them off under Devices during a call.

{{template "report-sheet" .}} {{end}}