diff --git a/trailer.html b/trailer.html
index 3ce228b..922e8b5 100644
--- a/trailer.html
+++ b/trailer.html
@@ -67,6 +67,17 @@
.fchk .w{display:block;margin:3px 0}
.fchk .w.serious{color:#b4531f;font-weight:600}
.fchk .go{font-size:12px;padding:2px 9px;margin-left:6px}
+ .vars{border:1px solid var(--line);border-radius:10px;padding:10px;margin:0 0 10px}
+ .vars h5{margin:0 0 3px;font-size:13px}
+ .vars p{margin:0 0 8px;font-size:12px;color:var(--muted)}
+ .vars .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:10px}
+ .vars .v{font-size:12px}
+ .vars .v img{width:100%;border-radius:7px;border:2px solid var(--line);display:block}
+ .vars .v.good img{border-color:#1f7a3a}
+ .vars .v.bad img{border-color:#b4531f}
+ .vars .v .say{margin:4px 0;color:var(--muted);min-height:2.6em}
+ .vars .v.bad .say{color:#b4531f}
+ .vars .v .btn{font-size:12px;padding:3px 10px}
.ffault{display:flex;gap:8px;margin:0 0 10px}
.ffault input{flex:1;min-width:0;font:inherit;font-size:12px;padding:5px 8px;
border:1px solid var(--line);border-radius:6px;background:transparent;color:inherit}
@@ -250,7 +261,7 @@
if (String(PKG.look_state || "")
&& (Date.now() - (Date.parse(PKG.look_started || "") || 0)) < 15 * 60 * 1000) return true;
return (PKG.shots || []).some(function (s) {
- return s.writing || s.drawing || s.fixing || stillFilming(s); });
+ return s.writing || s.drawing || s.fixing || s.varying || stillFilming(s); });
}
// Preparing the storyboard audio is work too. Without this the page stops
@@ -969,6 +980,34 @@
+ '';
}
+ // Several versions of one picture, best first, each with what the checker
+ // made of it. Picking the best of four needs no vocabulary at all.
+ function variantsHtml(s) {
+ if (s.varying) return '
Drawing several versions of this picture and checking each one\u2026 about a minute.
';
+ var v = s.variants;
+ if (!v || !(v.items || []).length)
+ return (v && v.error) ? '
' + esc(v.error) + '
' : "";
+ return '
' + v.items.length + ' versions of this picture \u2014 best first
'
+ + '
' + (v.note ? 'Drawn with your note: \u201c' + esc(v.note) + '\u201d. ' : '')
+ + 'Click a picture to see it large. Press \u201cUse this one\u201d under the one you like; '
+ + 'the ending picture is then drawn to match it.' + (v.error ? ' ' + esc(v.error) : '') + '
'
+ + '
' + v.items.map(function (it, i) {
+ var fc = it.check || {};
+ var faults = (fc.duplicated || []).filter(Boolean).map(function (d) { return "same person twice: " + d; })
+ .concat((fc.faults || []).filter(function (f) { return f && f.what && f.severity === "serious"; })
+ .map(function (f) { return f.what; }));
+ var minor = (fc.faults || []).filter(function (f) { return f && f.what && f.severity !== "serious"; });
+ var cls = fc.verdict === "broken" ? "bad" : (fc.verdict === "ok" ? "good" : "");
+ var say = faults.length ? faults[0]
+ : (minor.length ? "small things only: " + minor[0].what
+ : (fc.verdict ? "\u2713 the checker sees nothing wrong" : "not checked"));
+ return '
' + esc(String(say).slice(0, 150)) + '
'
+ + '
';
+ }).join("") + '
';
+ }
+
// "That is not right" - about the PICTURE, in the author's own words. The
// picture is what the shot is filmed from, so a fault here is inherited by
// the film and cannot be fixed by filming again.
@@ -982,7 +1021,10 @@
return '
'
- + '
' + err;
+ + ''
+ + '' + err;
}
// WHO IS IN THIS SCENE, as they look in it. This is where an author changes
@@ -1157,6 +1199,7 @@
+ (s.day ? ' · ' + esc(s.day) + '' : '')
+ ''
+ media
+ + variantsHtml(s)
+ frameCheckHtml(s)
+ frameFaultHtml(s)
+ whoInHtml(s)
@@ -1346,6 +1389,24 @@
z.classList.add("on");
return;
}
+ if ((el = hit("data-vargo"))) {
+ var vsid = el.getAttribute("data-vargo");
+ var vbox = document.getElementById("ff-" + vsid);
+ el.disabled = true; el.textContent = "starting\u2026";
+ r = await act("draw_variants", { draft_id: CUR, shot_id: vsid, n: 4,
+ note: vbox ? vbox.value.trim() : "" });
+ if (r) { showMsg("msg", "Drawing " + r.n + " versions of shot " + vsid + ", about $" + r.usd
+ + ". They appear here in about a minute.", "ok"); await refresh(); }
+ return;
+ }
+ if ((el = hit("data-pickvar"))) {
+ var pv = el.getAttribute("data-pickvar").split("|");
+ el.disabled = true; el.textContent = "working\u2026";
+ r = await act("pick_variant", { draft_id: CUR, shot_id: pv[0], index: Number(pv[1]) });
+ if (r) { showMsg("msg", "Using that version for shot " + pv[0] + " and drawing its ending picture to match.", "ok");
+ await refresh(); }
+ return;
+ }
if ((el = hit("data-chkpics"))) {
el.disabled = true; el.textContent = "starting\u2026";
r = await act("check_pictures", { draft_id: CUR });