(function() {
var CMD_SCHEMA = {{ command_builder_schema | tojson }};
{% if command_builder_page_mode %}
var CMD_COMMAND_DOCS = {{ command_builder_command_docs | tojson }};
var CMD_MANUSCRIPT_URLS = {{ command_builder_manuscript_urls | tojson }};
var CMD_MANUSCRIPT_LABELS = {{ command_builder_manuscript_labels | tojson }};
{% endif %}
function shquote(s) {
if (!s || !String(s).trim()) return "";
s = String(s).trim();
if (/^[-\w@%+=:,./]+$/.test(s)) return s;
return "'" + s.replace(/'/g, "'\\''") + "'";
}
function val(id) {
var el = document.getElementById(id);
return el ? String(el.value || "").trim() : "";
}
var G_REQUIRED = "Required";
var G_DATASET = "Dataset loading";
function pushSeg(segments, group, text) {
if (text == null || text === "") return;
segments.push({ g: group, t: String(text) });
}
function appendOptSeg(segments, group, flag, value) {
if (!value) return;
pushSeg(segments, group, flag);
pushSeg(segments, group, shquote(value));
}
function pushPrefix(segments, cmdName) {
pushSeg(segments, "_prefix", "cryodrgn");
pushSeg(segments, "_prefix", cmdName);
}
function cliFlag(a) {
return a.cli && a.cli.length ? a.cli[0] : "";
}
function collectSchemaSegments(cmdKey, segments) {
var groups = CMD_SCHEMA[cmdKey];
if (!groups) return;
for (var gi = 0; gi < groups.length; gi++) {
var g = groups[gi];
var groupTitle = g.title;
for (var ai = 0; ai < g.args.length; ai++) {
var a = g.args[ai];
var w = a.w;
if (w === "no_amp") {
var ampEl = document.getElementById(a.id);
if (ampEl && !ampEl.checked) pushSeg(segments, groupTitle, "--no-amp");
continue;
}
if (w === "flag_true") {
var ft = document.getElementById(a.id);
if (ft && ft.checked) pushSeg(segments, groupTitle, cliFlag(a));
continue;
}
if (w === "flag_false") {
var ff = document.getElementById(a.id);
if (ff && !ff.checked) pushSeg(segments, groupTitle, cliFlag(a));
continue;
}
if (w === "norm2") {
var n0 = val(a.id + "_a");
var n1 = val(a.id + "_b");
if (n0 !== "" && n1 !== "") {
pushSeg(segments, groupTitle, cliFlag(a));
pushSeg(segments, groupTitle, shquote(n0));
pushSeg(segments, groupTitle, shquote(n1));
}
continue;
}
if (w === "text" || w === "number") {
var tv = val(a.id);
if (tv !== "") {
pushSeg(segments, groupTitle, cliFlag(a));
pushSeg(segments, groupTitle, shquote(tv));
}
continue;
}
if (w === "select") {
var sel = document.querySelector('input[name="' + a.id + '"]:checked');
if (!sel) continue;
var sv = String(sel.value || "");
var defaultChoice = "";
if (Object.prototype.hasOwnProperty.call(a, "default")) {
defaultChoice = String(a.default == null ? "" : a.default);
} else if (a.choices && a.choices.length) {
defaultChoice = String(a.choices[0]);
}
if (sv !== "" && sv !== defaultChoice) {
pushSeg(segments, groupTitle, cliFlag(a));
pushSeg(segments, groupTitle, shquote(sv));
}
continue;
}
}
}
}
function segmentsToText(segments) {
var out = [];
for (var i = 0; i < segments.length; i++) out.push(segments[i].t);
return out.join(" ");
}
var lastBashCommandText = "";
var CMD_WRAP_MIN_CHARS = 80;
var CMD_LINE_MAX_CHARS = 100;
var CMD_LINE_HANG_SPACES = " ";
function canBreakAfterCmdToken(token) {
if (!token) return false;
if (token.indexOf("=") >= 0) return true;
return token.charAt(0) !== "-";
}
function lineGroupCharLen(idxs, segments) {
if (!idxs.length) return 0;
var len = segments[idxs[0]].t.length;
for (var i = 1; i < idxs.length; i++) {
len += 1 + segments[idxs[i]].t.length;
}
return len;
}
function layoutBodyLineGroupsEvenly(bodyIdxs, segments, maxCols) {
if (!bodyIdxs.length) return [];
if (bodyIdxs.length === 1) return [bodyIdxs];
var totalLen = lineGroupCharLen(bodyIdxs, segments);
var numLines = Math.max(1, Math.ceil(totalLen / maxCols));
var target = totalLen / numLines;
var groups = [];
var cur = [];
var curLen = 0;
for (var bi = 0; bi < bodyIdxs.length; bi++) {
var idx = bodyIdxs[bi];
var tok = segments[idx].t;
var tokLen = tok.length;
var addLen = cur.length ? 1 + tokLen : tokLen;
var newLen = curLen + addLen;
var mustBreak = cur.length && newLen > maxCols;
var shouldBreak = false;
if (cur.length && !mustBreak) {
var linesRemaining = numLines - groups.length - 1;
var tokensRemaining = bodyIdxs.length - bi;
if (linesRemaining > 0 && tokensRemaining > linesRemaining) {
shouldBreak =
curLen >= target ||
(newLen > target && curLen >= target * 0.45);
}
}
if (cur.length && (mustBreak || shouldBreak)) {
var prevTok = segments[cur[cur.length - 1]].t;
if (canBreakAfterCmdToken(prevTok)) {
groups.push(cur);
cur = [idx];
curLen = tokLen;
continue;
}
}
if (!cur.length) {
cur = [idx];
curLen = tokLen;
} else {
cur.push(idx);
curLen = newLen;
}
}
if (cur.length) groups.push(cur);
return groups;
}
function layoutCommandLineGroups(segments) {
if (segmentsToText(segments).length <= CMD_WRAP_MIN_CHARS) {
var all = [];
for (var i = 0; i < segments.length; i++) all.push(i);
return all.length ? [all] : [];
}
var headIdxs = [];
var bodyIdxs = [];
for (var i = 0; i < segments.length; i++) {
if (segments[i].g === "_prefix") headIdxs.push(i);
else bodyIdxs.push(i);
}
var groups = [];
if (headIdxs.length) groups.push(headIdxs);
if (bodyIdxs.length) {
var bodyGroups = layoutBodyLineGroupsEvenly(
bodyIdxs,
segments,
CMD_LINE_MAX_CHARS
);
for (var j = 0; j < bodyGroups.length; j++) groups.push(bodyGroups[j]);
}
return groups;
}
function formatBashLineGroups(segments, lineGroups) {
var lines = lineGroups.map(function(idxs) {
return idxs.map(function(i) { return segments[i].t; }).join(" ");
});
return lines.map(function(line, i) {
var body = (i > 0 ? CMD_LINE_HANG_SPACES : "") + line;
return i < lines.length - 1 ? body + " \\" : body;
}).join("\n");
}
function segmentsToBashText(segments) {
if (!segments.length) return "";
return formatBashLineGroups(segments, layoutCommandLineGroups(segments));
}
function cmdDisplayFits() {
return (
out.clientHeight > 0 &&
out.scrollHeight <= out.clientHeight + 2 &&
out.scrollWidth <= out.clientWidth + 2
);
}
function renderCommandDisplay(segments, px) {
out.style.fontSize = px + "px";
var lineGroups = layoutCommandLineGroups(segments);
var bashText = formatBashLineGroups(segments, lineGroups);
if (cmdColorize) {
out.innerHTML = renderColoredCommandWrapped(segments, lineGroups);
} else {
out.textContent = bashText;
}
return bashText;
}
function renderColoredCommandWrapped(segments, lineGroups) {
var shadeIdx = {};
var html = [];
for (var li = 0; li < lineGroups.length; li++) {
if (li > 0) {
html.push(' \\\n');
}
var idxs = lineGroups[li];
for (var ii = 0; ii < idxs.length; ii++) {
if (ii > 0) html.push(" ");
var seg = segments[idxs[ii]];
if (seg.g === "_prefix") {
html.push('');
html.push(escCmdHtml(seg.t));
html.push("");
continue;
}
var shade = shadeIdx[seg.g] || 0;
shadeIdx[seg.g] = shade + 1;
var hue = hueForCmdGroup(seg.g);
var light = 86 - (shade % 4) * 9;
var sat = 56 + (shade % 3) * 11;
html.push('');
html.push(escCmdHtml(seg.t));
html.push("");
}
if (li > 0) html.push("");
}
return html.join("");
}
function updateCommandDisplay() {
var segments = buildSegments();
out.style.fontSize = "";
var maxPx = parseFloat(getComputedStyle(out).fontSize) || 12;
var minPx = Math.max(7, maxPx * 0.52);
var bashText = "";
for (var px = maxPx; px >= minPx; px -= 0.5) {
bashText = renderCommandDisplay(segments, px);
void out.offsetHeight;
if (cmdDisplayFits()) break;
}
lastBashCommandText = bashText;
}
function buildAbinitHetOldSegments() {
var segments = [];
pushPrefix(segments, "abinit_het_old");
var particles = val("ahet_particles");
if (particles) pushSeg(segments, G_REQUIRED, shquote(particles));
appendOptSeg(segments, G_REQUIRED, "-o", val("ahet_out"));
var zdim = val("ahet_zdim");
if (zdim !== "") {
pushSeg(segments, G_REQUIRED, "--zdim");
pushSeg(segments, G_REQUIRED, shquote(zdim));
}
appendOptSeg(segments, G_REQUIRED, "--ctf", val("ahet_ctf"));
appendOptSeg(segments, G_DATASET, "--datadir", val("ahet_datadir"));
collectSchemaSegments("abinit_het_old", segments);
return segments;
}
function buildAbinitHomoOldSegments() {
var segments = [];
pushPrefix(segments, "abinit_homo_old");
var particles = val("ahom_particles");
if (particles) pushSeg(segments, G_REQUIRED, shquote(particles));
appendOptSeg(segments, G_REQUIRED, "-o", val("ahom_out"));
appendOptSeg(segments, G_REQUIRED, "--ctf", val("ahom_ctf"));
appendOptSeg(segments, G_DATASET, "--datadir", val("ahom_datadir"));
collectSchemaSegments("abinit_homo_old", segments);
return segments;
}
function buildAbinitSegments() {
var segments = [];
pushPrefix(segments, "abinit");
var particles = val("ab_particles");
if (particles) pushSeg(segments, G_REQUIRED, shquote(particles));
appendOptSeg(segments, G_REQUIRED, "-o", val("ab_out"));
var zdim = val("ab_zdim");
if (zdim !== "") {
pushSeg(segments, G_REQUIRED, "--zdim");
pushSeg(segments, G_REQUIRED, shquote(zdim));
}
appendOptSeg(segments, G_REQUIRED, "--ctf", val("ab_ctf"));
appendOptSeg(segments, G_DATASET, "--datadir", val("ab_datadir"));
collectSchemaSegments("abinit", segments);
return segments;
}
function buildTrainVaeSegments() {
var segments = [];
pushPrefix(segments, "train_vae");
var p = val("vae_particles");
if (p) pushSeg(segments, G_REQUIRED, shquote(p));
appendOptSeg(segments, G_REQUIRED, "-o", val("vae_out"));
appendOptSeg(segments, G_REQUIRED, "--poses", val("vae_poses"));
var zd = val("vae_zdim");
if (zd !== "") {
pushSeg(segments, G_REQUIRED, "--zdim");
pushSeg(segments, G_REQUIRED, shquote(zd));
}
appendOptSeg(segments, G_REQUIRED, "--ctf", val("vae_ctf"));
appendOptSeg(segments, G_DATASET, "--datadir", val("vae_datadir"));
collectSchemaSegments("train_vae", segments);
return segments;
}
function buildTrainNnSegments() {
var segments = [];
pushPrefix(segments, "train_nn");
var p = val("nn_particles");
if (p) pushSeg(segments, G_REQUIRED, shquote(p));
appendOptSeg(segments, G_REQUIRED, "-o", val("nn_out"));
appendOptSeg(segments, G_REQUIRED, "--poses", val("nn_poses"));
appendOptSeg(segments, G_REQUIRED, "--ctf", val("nn_ctf"));
appendOptSeg(segments, G_DATASET, "--datadir", val("nn_datadir"));
collectSchemaSegments("train_nn", segments);
return segments;
}
function buildBackprojectVoxelSegments() {
var segments = [];
pushPrefix(segments, "backproject_voxel");
var p = val("bpv_particles");
if (p) pushSeg(segments, G_REQUIRED, shquote(p));
appendOptSeg(segments, G_REQUIRED, "--poses", val("bpv_poses"));
appendOptSeg(segments, G_REQUIRED, "-o", val("bpv_out"));
appendOptSeg(segments, G_REQUIRED, "--ctf", val("bpv_ctf"));
appendOptSeg(segments, G_DATASET, "--datadir", val("bpv_datadir"));
collectSchemaSegments("backproject_voxel", segments);
return segments;
}
function buildTrainDecSegments() {
var segments = [];
pushPrefix(segments, "train_dec");
var p = val("dec_particles");
if (p) pushSeg(segments, G_REQUIRED, shquote(p));
appendOptSeg(segments, G_REQUIRED, "-o", val("dec_out"));
appendOptSeg(segments, G_REQUIRED, "--poses", val("dec_poses"));
var zd = val("dec_zdim");
if (zd !== "") {
pushSeg(segments, G_REQUIRED, "--zdim");
pushSeg(segments, G_REQUIRED, shquote(zd));
}
appendOptSeg(segments, G_REQUIRED, "--ctf", val("dec_ctf"));
appendOptSeg(segments, G_DATASET, "--datadir", val("dec_datadir"));
collectSchemaSegments("train_dec", segments);
return segments;
}
function buildAnalyzeStyleSegments(cmdName, prefix) {
var segments = [];
pushPrefix(segments, cmdName);
var workdir = val(prefix + "_workdir");
var epoch = val(prefix + "_epoch");
if (workdir) pushSeg(segments, G_REQUIRED, shquote(workdir));
if (epoch !== "") pushSeg(segments, G_REQUIRED, shquote(epoch));
appendOptSeg(segments, G_REQUIRED, "-o", val(prefix + "_out"));
collectSchemaSegments(cmdName, segments);
return segments;
}
function buildSegments() {
var t = document.getElementById("cmd-type").value;
if (t === "abinit") return buildAbinitSegments();
if (t === "abinit_het_old") return buildAbinitHetOldSegments();
if (t === "abinit_homo_old") return buildAbinitHomoOldSegments();
if (t === "train_vae") return buildTrainVaeSegments();
if (t === "train_nn") return buildTrainNnSegments();
if (t === "train_dec") return buildTrainDecSegments();
if (t === "backproject_voxel") return buildBackprojectVoxelSegments();
if (t === "analyze") return buildAnalyzeStyleSegments("analyze", "ana");
if (t === "analyze_landscape") {
return buildAnalyzeStyleSegments("analyze_landscape", "alsc");
}
if (t === "analyze_landscape_full") {
return buildAnalyzeStyleSegments("analyze_landscape_full", "alfull");
}
return [];
}
function build() {
if (lastBashCommandText) return lastBashCommandText;
return segmentsToBashText(buildSegments());
}
function parseOutdirValue(raw, fallbackSuffix) {
var s = String(raw || "").trim();
if (!s) return { n: 1, suffix: fallbackSuffix, prefix: "" };
var sep = Math.max(s.lastIndexOf("/"), s.lastIndexOf("\\"));
var prefix = sep >= 0 ? s.slice(0, sep + 1) : "";
var base = sep >= 0 ? s.slice(sep + 1) : s;
var m = base.match(/^(\d{1,3})_(.+)$/);
if (m) {
return { n: parseInt(m[1], 10) || 1, suffix: m[2], prefix: prefix };
}
return { n: 1, suffix: fallbackSuffix, prefix: prefix };
}
function formatOutdir(parsed) {
var n = Math.max(1, Math.min(999, Math.floor(parsed.n)));
var num = String(n);
while (num.length < 3) num = "0" + num;
return parsed.prefix + num + "_" + parsed.suffix;
}
function syncOutdirInputSuffix(input) {
if (!input) return;
var fieldWrap = input.closest(".cmd-outdir-input-wrap");
if (!fieldWrap) return;
fieldWrap.classList.toggle(
"cmd-outdir-input-wrap--empty",
!String(input.value || "").trim()
);
}
function bindOutdirInputSuffix(input) {
if (!input || input.dataset.outdirSuffixBound === "1") return;
input.dataset.outdirSuffixBound = "1";
syncOutdirInputSuffix(input);
input.addEventListener("input", function() {
syncOutdirInputSuffix(input);
});
}
function initOutdirSteppers() {
if (!form) return;
var outdirInputs = form.querySelectorAll(".cmd-outdir-input-wrap .cmd-outdir-input");
for (var k = 0; k < outdirInputs.length; k++) {
bindOutdirInputSuffix(outdirInputs[k]);
}
var steppers = form.querySelectorAll(".cmd-outdir-stepper");
for (var i = 0; i < steppers.length; i++) {
(function(wrap) {
if (wrap.dataset.outdirBound === "1") return;
wrap.dataset.outdirBound = "1";
var cmdName = wrap.getAttribute("data-cmd-name") || "";
var input = wrap.querySelector(".cmd-outdir-input");
if (!input) return;
var steps = wrap.querySelectorAll(".cmd-outdir-step");
for (var j = 0; j < steps.length; j++) {
steps[j].addEventListener("click", function() {
var dir = parseInt(this.getAttribute("data-dir"), 10);
if (!input || !cmdName) return;
var parsed = parseOutdirValue(input.value, cmdName);
parsed.n = Math.max(1, Math.min(999, parsed.n + dir));
input.value = formatOutdir(parsed);
syncOutdirInputSuffix(input);
input.dispatchEvent(new Event("input", { bubbles: true }));
});
}
})(steppers[i]);
}
}
function scaleBatchSizeInput(input, factor) {
if (!input || !factor) return false;
var raw = String(input.value || "").trim();
if (!raw) raw = String(input.placeholder || "").trim();
if (!raw) return false;
var n = parseFloat(raw);
if (!isFinite(n) || n <= 0) return false;
n = Math.max(1, Math.round(n * factor));
input.value = String(n);
return true;
}
function initBatchSizeScalers() {
if (!form) return;
var bars = form.querySelectorAll(".cmd-batch-size-scale");
for (var i = 0; i < bars.length; i++) {
(function(bar) {
if (bar.dataset.batchScaleBound === "1") return;
bar.dataset.batchScaleBound = "1";
var panel = bar.closest(".cmd-panel");
var steps = bar.querySelectorAll(".cmd-batch-size-step");
for (var j = 0; j < steps.length; j++) {
steps[j].addEventListener("click", function() {
var factor = parseFloat(this.getAttribute("data-factor"));
if (!panel || !isFinite(factor) || factor <= 0) return;
var inputs = panel.querySelectorAll(
'input[type="number"][data-cmd-batch-size="1"]'
);
var changed = false;
for (var k = 0; k < inputs.length; k++) {
if (scaleBatchSizeInput(inputs[k], factor)) changed = true;
}
if (changed && inputs.length) {
inputs[0].dispatchEvent(new Event("input", { bubbles: true }));
}
});
}
})(bars[i]);
}
}
var out = document.getElementById("cmd-out");
var form = document.getElementById("cmd-form");
var cmdType = document.getElementById("cmd-type");
function syncCmdDocText() {
var el = document.getElementById("nav-cmd-doc-text");
if (!el || typeof CMD_COMMAND_DOCS === "undefined" || !cmdType) return;
el.textContent = CMD_COMMAND_DOCS[cmdType.value] || "";
}
function syncManuscriptLink() {
var link = document.getElementById("nav-manuscript-link");
var item = document.getElementById("nav-manuscript-icon-item");
var label = document.getElementById("nav-manuscript-label");
if (!link || !cmdType || typeof CMD_MANUSCRIPT_URLS === "undefined") return;
var url = CMD_MANUSCRIPT_URLS[cmdType.value] || "";
if (url) {
link.href = url;
link.hidden = false;
if (item) item.hidden = false;
link.title = "Read manuscript for cryodrgn " + cmdType.value;
link.setAttribute("aria-label", link.title);
if (label && typeof CMD_MANUSCRIPT_LABELS !== "undefined") {
label.textContent = CMD_MANUSCRIPT_LABELS[cmdType.value] || "paper";
}
} else {
link.hidden = true;
if (item) item.hidden = true;
link.removeAttribute("href");
}
}
function syncPanels() {
var t = cmdType.value;
var panels = document.querySelectorAll(".cmd-panel");
for (var i = 0; i < panels.length; i++) {
panels[i].classList.toggle("cmd-panel--active", panels[i].getAttribute("data-cmd") === t);
}
syncCmdDocText();
{% if command_builder_page_mode %}syncManuscriptLink();{% endif %}
refresh();
}
var cmdColorize = false;
var CMD_GROUP_HUES = {
"Required": 28,
"Dataset loading": 214,
"Training parameters": 207,
"Backprojection parameters": 200,
"Run options": 142,
"Volumes to generate": 88,
"Extra arguments for volume generation": 95,
"Volume generation arguments": 102,
"Volume mapping arguments": 168,
};
var cmdGroupHueCache = {};
function hueForCmdGroup(group) {
if (group === "_prefix") return null;
if (Object.prototype.hasOwnProperty.call(CMD_GROUP_HUES, group)) {
return CMD_GROUP_HUES[group];
}
if (!cmdGroupHueCache[group]) {
var h = 0;
for (var i = 0; i < group.length; i++) {
h = (h * 31 + group.charCodeAt(i)) % 360;
}
cmdGroupHueCache[group] = Math.round((47 + h * 137.508) % 360);
}
return cmdGroupHueCache[group];
}
function escCmdHtml(s) {
return String(s)
.replace(/&/g, "&")
.replace(//g, ">")
.replace(/"/g, """);
}
function refresh() {
updateCommandDisplay();
{% if command_builder_page_mode %}
scheduleFitPrimaryRegionFields();
{% endif %}
}
cmdType.addEventListener("change", syncPanels);
form.addEventListener("input", refresh);
form.addEventListener("change", refresh);
var colorizeBtn = document.getElementById("cmd-colorize");
if (colorizeBtn) {
colorizeBtn.addEventListener("click", function() {
cmdColorize = !cmdColorize;
colorizeBtn.setAttribute("aria-pressed", cmdColorize ? "true" : "false");
refresh();
});
}
document.getElementById("cmd-copy").addEventListener("click", function() {
var text = build();
var st = document.getElementById("cmd-copy-status");
function ok() {
st.textContent = "Copied.";
setTimeout(function() { st.textContent = ""; }, 2000);
}
function fail() {
st.textContent = "Copy failed — select the command manually.";
}
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text).then(ok).catch(fail);
} else {
fail();
}
});
initOutdirSteppers();
initBatchSizeScalers();
syncPanels();
(function initCommandDisplayResize() {
if (!out || !out.parentElement) return;
var pending = false;
function schedule() {
if (pending) return;
pending = true;
window.requestAnimationFrame(function() {
pending = false;
updateCommandDisplay();
});
}
if (window.CryoResizeObserverUtils) {
window.CryoResizeObserverUtils.observeResize(out.parentElement, schedule);
}
window.addEventListener("resize", schedule);
})();
{% if command_builder_page_mode %}
var fitPrimaryFieldsPending = false;
function containerOverflowIgnoringBatchControls(container) {
if (!container) return false;
var slots = container.querySelectorAll(".cmd-batch-size-controls-slot");
if (!slots.length) {
return container.scrollWidth > container.clientWidth + 2;
}
var saved = [];
for (var i = 0; i < slots.length; i++) {
saved.push([slots[i], slots[i].style.display]);
slots[i].style.display = "none";
}
var overflow = container.scrollWidth > container.clientWidth + 2;
for (var j = 0; j < saved.length; j++) {
saved[j][0].style.display = saved[j][1];
}
return overflow;
}
function primaryFieldsOverflow(container) {
if (!container || container.offsetParent === null) return false;
var cells = container.querySelectorAll(".cmd-builder-primary-arg-cell");
for (var i = 0; i < cells.length; i++) {
var cell = cells[i];
if (cell.classList.contains("cmd-batch-size-anchor-cell")) {
var batchLabel = cell.querySelector(
".cmd-batch-size-field-stack .cryo-select-line"
);
var batchInp = cell.querySelector(
".cmd-batch-size-field-stack input, select"
);
if (batchLabel && batchLabel.scrollWidth > batchLabel.clientWidth + 1) {
return true;
}
if (batchInp && batchInp.scrollWidth > batchInp.clientWidth + 1) {
return true;
}
continue;
}
if (cell.scrollWidth > cell.clientWidth + 1) return true;
var label = cell.querySelector(".cryo-select-line, .choice-line");
if (label && label.scrollWidth > label.clientWidth + 1) return true;
var inp = cell.querySelector("input, select");
if (inp && inp.scrollWidth > inp.clientWidth + 1) return true;
}
return containerOverflowIgnoringBatchControls(container);
}
function fitPrimaryFieldsContainer(container) {
if (!container) return;
container.style.setProperty("--gp-primary-field-scale", "1");
var scale = 1;
var minScale = 0.4;
while (scale > minScale && primaryFieldsOverflow(container)) {
scale = Math.max(minScale, scale - 0.025);
container.style.setProperty("--gp-primary-field-scale", String(scale));
void container.offsetWidth;
}
}
function primaryChecksOverflow(container) {
if (!container || container.offsetParent === null) return false;
var box = container.querySelector(".cmd-builder-primary-checkboxes");
if (!box) return false;
var lines = box.querySelectorAll(".check-line");
for (var i = 0; i < lines.length; i++) {
if (lines[i].scrollWidth > lines[i].clientWidth + 1) return true;
}
return box.scrollWidth > box.clientWidth + 2;
}
function fitPrimaryChecksContainer(container) {
if (!container) return;
container.style.setProperty("--gp-primary-checks-scale", "1");
var scale = 1;
var minScale = 0.4;
while (scale > minScale && primaryChecksOverflow(container)) {
scale = Math.max(minScale, scale - 0.025);
container.style.setProperty("--gp-primary-checks-scale", String(scale));
void container.offsetWidth;
}
}
function fitActivePrimaryRegionFields() {
var panel = document.querySelector(".cmd-panel.cmd-panel--active");
if (!panel) return;
fitPrimaryChecksContainer(
panel.querySelector(".cmd-builder-primary-checks-grid--2.cmd-builder-primary-checks-fit")
);
fitPrimaryFieldsContainer(
panel.querySelector(
".cmd-builder-primary-region--dataset .cmd-builder-dataset-rest-fields.cmd-builder-primary-fields-fit"
)
);
fitPrimaryFieldsContainer(
panel.querySelector(
".cmd-builder-primary-region--dataset .cmd-builder-dataset-core"
)
);
fitPrimaryFieldsContainer(
panel.querySelector(
".cmd-builder-primary-region--training .cmd-builder-primary-fields-grid--5.cmd-builder-primary-fields-fit"
)
);
}
function scheduleFitPrimaryRegionFields() {
if (fitPrimaryFieldsPending) return;
fitPrimaryFieldsPending = true;
window.requestAnimationFrame(function() {
window.requestAnimationFrame(function() {
fitPrimaryFieldsPending = false;
fitActivePrimaryRegionFields();
});
});
}
(function initPrimaryRegionFieldsResize() {
var page = document.querySelector(".cmd-builder-page--dock");
if (!page) return;
var pending = false;
function schedule() {
if (pending) return;
pending = true;
window.requestAnimationFrame(function() {
pending = false;
scheduleFitPrimaryRegionFields();
});
}
if (window.CryoResizeObserverUtils) {
window.CryoResizeObserverUtils.observeResize(page, schedule);
}
window.addEventListener("resize", schedule);
})();
(function initCommandBuilderPageGroupCards() {
function cardsInActivePanel() {
var panel = document.querySelector(".cmd-panel.cmd-panel--active");
return panel ? panel.querySelectorAll(".cmd-group-card") : [];
}
var cardOrderByGroup =
typeof WeakMap === "undefined" ? null : new WeakMap();
function rememberCardOrder(groupCards) {
if (!cardOrderByGroup || cardOrderByGroup.has(groupCards)) return;
var roots = [];
var ch = groupCards.children;
for (var i = 0; i < ch.length; i++) {
if (ch[i].classList && ch[i].classList.contains("cmd-group-card")) {
roots.push(ch[i]);
}
}
cardOrderByGroup.set(groupCards, roots);
}
function restoreCardOrder(groupCards) {
if (!cardOrderByGroup) return;
var rail = groupCards.querySelector(".cmd-builder-advanced-nav-rail");
if (rail) {
while (rail.firstChild) {
groupCards.appendChild(rail.firstChild);
}
rail.remove();
}
var list = cardOrderByGroup.get(groupCards);
if (!list) return;
for (var i = 0; i < list.length; i++) {
groupCards.appendChild(list[i]);
}
}
function stripSplitMarkers(nodeList) {
for (var i = 0; i < nodeList.length; i++) {
nodeList[i].classList.remove("cmd-group-card--split-main");
nodeList[i].classList.remove("cmd-group-card--split-nav");
}
}
function syncAdvancedSplit(advancedRegion) {
if (!advancedRegion) return;
var groupCards = advancedRegion.querySelector(".cmd-builder-group-cards");
if (!groupCards) return;
var openCard = groupCards.querySelector(".cmd-group-card--open");
if (!openCard) {
advancedRegion.classList.remove("cmd-builder-advanced-region--split");
groupCards.classList.remove("cmd-builder-group-cards--split");
stripSplitMarkers(groupCards.querySelectorAll(".cmd-group-card"));
restoreCardOrder(groupCards);
return;
}
rememberCardOrder(groupCards);
advancedRegion.classList.add("cmd-builder-advanced-region--split");
groupCards.classList.add("cmd-builder-group-cards--split");
groupCards.insertBefore(openCard, groupCards.firstChild);
var rail = groupCards.querySelector(".cmd-builder-advanced-nav-rail");
if (!rail) {
rail = document.createElement("div");
rail.className = "cmd-builder-advanced-nav-rail";
rail.setAttribute("role", "navigation");
rail.setAttribute("aria-label", "Other parameter groups");
}
groupCards.insertBefore(rail, openCard.nextSibling);
var allCards = Array.prototype.slice.call(
groupCards.querySelectorAll(".cmd-group-card")
);
stripSplitMarkers(allCards);
openCard.classList.add("cmd-group-card--split-main");
for (var i = 0; i < allCards.length; i++) {
var c = allCards[i];
if (c === openCard) continue;
rail.appendChild(c);
c.classList.add("cmd-group-card--split-nav");
}
}
function bindWheelScroll(body) {
if (body.dataset.cmdScrollBound === "1") return;
body.dataset.cmdScrollBound = "1";
body.addEventListener(
"wheel",
function(e) {
if (body.scrollHeight <= body.clientHeight + 1) return;
var dy = e.deltaY;
var atTop = body.scrollTop <= 0;
var atBottom = body.scrollTop + body.clientHeight >= body.scrollHeight - 1;
if ((dy < 0 && atTop) || (dy > 0 && atBottom)) return;
e.stopPropagation();
},
{ passive: true }
);
}
function setCardOpen(card, open) {
var curOpen = card.classList.contains("cmd-group-card--open");
if (!open && !curOpen) return;
if (open && curOpen) return;
if (open) {
var peers = cardsInActivePanel();
for (var i = 0; i < peers.length; i++) {
if (peers[i] === card) continue;
if (!peers[i].classList.contains("cmd-group-card--open")) continue;
peers[i].classList.remove("cmd-group-card--open");
var tr = peers[i].querySelector(".cmd-group-card-trigger");
var bd = peers[i].querySelector(".cmd-group-card-body");
if (tr) tr.setAttribute("aria-expanded", "false");
if (bd) {
bd.hidden = true;
bd.style.maxHeight = "";
}
}
}
card.classList.toggle("cmd-group-card--open", open);
var trigger = card.querySelector(".cmd-group-card-trigger");
var body = card.querySelector(".cmd-group-card-body");
if (trigger) trigger.setAttribute("aria-expanded", open ? "true" : "false");
if (body) {
body.hidden = !open;
body.style.maxHeight = "";
if (open) body.scrollTop = 0;
}
syncAdvancedSplit(card.closest(".cmd-builder-advanced-region"));
}
var form = document.getElementById("cmd-form");
if (!form) return;
var groupCardsLists = form.querySelectorAll(".cmd-builder-group-cards");
for (var gc = 0; gc < groupCardsLists.length; gc++) {
rememberCardOrder(groupCardsLists[gc]);
}
var cards = form.querySelectorAll(".cmd-group-card");
for (var j = 0; j < cards.length; j++) {
var card = cards[j];
var body = card.querySelector(".cmd-group-card-body");
if (body) bindWheelScroll(body);
}
form.addEventListener("click", function(e) {
if (e.target.closest && e.target.closest(".cmd-group-card-split-dismiss")) {
e.preventDefault();
e.stopPropagation();
var dc = e.target.closest(".cmd-group-card");
if (!dc || !form.contains(dc)) return;
setCardOpen(dc, false);
return;
}
var card = e.target.closest(".cmd-group-card");
if (!card || !form.contains(card)) return;
var panel = card.closest(".cmd-panel");
if (!panel || !panel.classList.contains("cmd-panel--active")) return;
var trigger = card.querySelector(".cmd-group-card-trigger");
var body = card.querySelector(".cmd-group-card-body");
if (!trigger || !body) return;
if (card.classList.contains("cmd-group-card--open")) {
if (trigger.contains(e.target)) {
setCardOpen(card, false);
return;
}
var interactive = e.target.closest(
"input, select, textarea, button, a, label, option"
);
if (interactive && body.contains(interactive) && interactive !== trigger) {
return;
}
return;
}
setCardOpen(card, true);
});
var cmdTypeEl = document.getElementById("cmd-type");
if (cmdTypeEl) {
cmdTypeEl.addEventListener("change", function() {
var panelCards = cardsInActivePanel();
for (var k = 0; k < panelCards.length; k++) setCardOpen(panelCards[k], false);
});
}
})();
{% endif %}
})();