feat(web): block-playout troubleshooting + sequential schedule validator screens

Two new System-area screens over the new endpoints:

- /app/troubleshooting/blocks: pick a Block playout, browse its blocks
  (grouped, name filter), drill into paged block history, click a row to
  decode its details.
- /app/troubleshooting/yaml: paste YAML, toggle import schema, validate;
  shows messages + JSON conversion.

Adds api/playoutHistory client + validateSequentialSchedule; regenerated
generated/v1.d.ts. Async loads follow the LogsScreen seq-guard pattern
(no synchronous setState inside effects).

Refs #145 #158

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-07 22:10:57 +02:00
co-authored by Claude Fable 5
parent 7787b17495
commit ec7531d821
8 changed files with 807 additions and 1 deletions
+45
View File
@@ -3434,6 +3434,51 @@
word-break: break-word;
}
.ctv-textarea {
width: 100%;
padding: 10px 12px;
border-radius: var(--radius-sm);
background: var(--ctv-surface-2);
border: 1px solid var(--border-hairline);
color: var(--text-primary);
font: var(--text-xs) / 1.5 var(--font-mono);
}
.ctv-textarea:focus {
outline: none;
border-color: var(--status-accent, var(--ctv-accent, #4c8bf5));
}
.ctv-validation-messages {
margin: 0;
padding-left: 20px;
display: flex;
flex-direction: column;
gap: var(--space-3, 6px);
font: var(--text-xs) / 1.5 var(--font-mono);
}
.ctv-detail-grid {
display: grid;
grid-template-columns: minmax(140px, max-content) 1fr;
gap: var(--space-4, 8px) var(--space-7, 16px);
margin: 0;
}
.ctv-detail-grid dt {
color: var(--text-disabled);
font-size: var(--text-2xs, 11px);
font-weight: var(--weight-medium, 500);
letter-spacing: var(--tracking-caps, 0.06em);
text-transform: uppercase;
align-self: center;
}
.ctv-detail-grid dd {
margin: 0;
color: var(--text-primary);
}
.ctv-settings-flush-row {
display: flex;
align-items: center;