{% extends "base.html" %} {% block content %}

Cast Discovery

Review and edit the speakers found in the manuscript. Each speaker gets one voice.

Loading speakers...

Loading voice analysis...

{% endblock %} // Approving used to be silent: the speaker simply stopped appearing in the // needs-check panel, which reads exactly like the speaker being deleted. Say // what happened, keep the counts honest, and drop the entry from the worklist. function markApproved(name) { var toast = document.createElement('div'); toast.textContent = '\u2713 ' + name + ' approved \u2014 still in the speaker list, just no longer needing review.'; toast.style.cssText = 'position:fixed; bottom:1.2rem; right:1.2rem; z-index:1100; ' + 'background:#065f46; color:#ecfdf5; padding:0.6rem 0.9rem; border-radius:6px; ' + 'font-size:0.84rem; box-shadow:0 4px 12px rgba(0,0,0,0.4); max-width:22rem'; document.body.appendChild(toast); setTimeout(function () { toast.remove(); }, 5000); var entry = document.querySelector('[data-review-item="' + CSS.escape(name) + '"]'); if (entry) entry.remove(); var needs = document.querySelector('[data-vq-needs-count]'); if (needs) { var n = Math.max(0, (parseInt(needs.textContent, 10) || 0) - 1); needs.textContent = n + ' need checking'; } var clear = document.querySelector('[data-vq-clear-count]'); if (clear) clear.textContent = ((parseInt(clear.textContent, 10) || 0) + 1) + ' clear'; var head = document.querySelector('[data-vq-needs-heading]'); if (head) { var left = (parseInt(head.getAttribute('data-left'), 10)); if (isNaN(left)) left = (parseInt(head.textContent, 10) || 1); head.setAttribute('data-left', left - 1); head.textContent = '\u26a0 ' + Math.max(0, left - 1) + ' speaker' + (left - 1 === 1 ? '' : 's') + ' need' + (left - 1 === 1 ? 's' : '') + ' checking'; } }