feat(cast): add server-managed Google Cast playback (#34)

Add server-side Google Cast discovery and sessions, signed cast media URLs, browser device picker integration, and deployment documentation.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
blomios
2026-10-06 22:40:17 +02:00
parent e6e481bf0e
commit 5ee07570e0
15 changed files with 1394 additions and 9 deletions

View File

@ -4610,6 +4610,88 @@ select.form-input optgroup:disabled {
z-index: 100;
}
.cast-device-dialog {
width: min(520px, calc(100vw - 32px));
max-height: min(80vh, 680px);
padding: var(--space-lg);
border: 1px solid var(--color-border);
border-radius: var(--radius-lg);
background: var(--color-bg-secondary);
color: var(--color-text-primary);
box-shadow: var(--shadow-lg);
}
.cast-device-dialog::backdrop {
background: rgba(0, 0, 0, 0.72);
}
.cast-dialog-header,
.cast-dialog-actions {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-sm);
}
.cast-device-dialog .form-input {
width: 100%;
margin: var(--space-md) 0;
}
.cast-device-message {
min-height: 1.25rem;
margin-bottom: var(--space-sm);
color: var(--color-text-muted);
font-size: 0.8125rem;
}
.cast-device-message[data-state="error"] {
color: var(--color-error);
}
.cast-device-list {
display: grid;
gap: var(--space-sm);
max-height: 360px;
margin-bottom: var(--space-md);
overflow-y: auto;
}
.cast-device-item {
display: grid;
gap: 3px;
min-height: 56px;
padding: var(--space-sm) var(--space-md);
border: 1px solid var(--color-border);
border-radius: var(--radius-md);
background: var(--color-bg-tertiary);
color: var(--color-text-primary);
text-align: left;
cursor: pointer;
}
.cast-device-item:disabled {
cursor: not-allowed;
opacity: 0.65;
}
.cast-device-name {
font-weight: 600;
}
.cast-device-status,
.cast-device-explanation {
color: var(--color-text-muted);
font-size: 0.75rem;
}
@media (max-width: 520px) {
.cast-dialog-actions {
align-items: stretch;
flex-direction: column;
}
}
.overflow-menu-item {
display: flex;
align-items: center;