{$_("play.title")}

{$_("play.description")}

{#if devices.length > 0 && !data.recording} {#if !isRecording} {:else} {/if} {/if}
{#if data.recording}

{data.recording.title}

{#if data.recording.description}

{data.recording.description}

{/if}
{Math.floor(playbackProgress / 1000 / 60)}:{(Math.floor(playbackProgress / 1000) % 60).toString().padStart(2, '0')}
{ const rect = e.currentTarget.getBoundingClientRect(); const percentage = ((e.clientX - rect.left) / rect.width) * 100; seek(percentage); }}>
{Math.floor(data.recording.duration / 1000 / 60)}:{(Math.floor(data.recording.duration / 1000) % 60).toString().padStart(2, '0')}
{#if !isPlaying} {:else} {/if}

Events

{data.recording.events.length}

Devices

{data.recording.device_info.length}

Status

{data.recording.status}

{/if}
{#if devices} {#each devices as device (device.name)} handleChange(device, scalarIndex, val)} onStop={() => handleStop(device)} /> {/each} {/if}
{#if devices?.length === 0}

{$_("play.no_results")}

{/if}
({ name: d.name, index: d.info.index, capabilities: d.actuators.map((a) => a.outputType), }))} duration={recordingDuration} onSave={handleSaveRecording} onCancel={handleCancelSave} /> {#if data.recording} {/if}