@@ -113,6 +113,9 @@ def index_html(
113113 <label>Window size <span id="windowSizeValue"></span>
114114 <input id="windowSize" type="range" min="25" max="1000" step="25">
115115 </label>
116+ <div class="row">
117+ <label><input id="lockStep" type="checkbox" checked> lock step to size</label>
118+ </div>
116119 <label>Window step <span id="windowStepValue"></span>
117120 <input id="windowStep" type="range" min="25" max="1000" step="25">
118121 </label>
@@ -139,6 +142,7 @@ def index_html(
139142 metric: document.getElementById("metric"),
140143 color: document.getElementById("color"),
141144 perToken: document.getElementById("perToken"),
145+ lockStep: document.getElementById("lockStep"),
142146 windowSize: document.getElementById("windowSize"),
143147 windowStep: document.getElementById("windowStep"),
144148 windowSizeValue: document.getElementById("windowSizeValue"),
@@ -156,8 +160,14 @@ def index_html(
156160 els.color.value = DEFAULT_COLOR;
157161 els.windowSize.value = DEFAULT_WINDOW_SIZE;
158162 els.windowStep.value = DEFAULT_WINDOW_STEP;
159- for (const el of [els.book, els.metric, els.color, els.perToken, els.windowSize, els.windowStep]) {{
160- el.addEventListener("input", () => el === els.book ? loadBook() : render());
163+ els.lockStep.checked = DEFAULT_WINDOW_SIZE === DEFAULT_WINDOW_STEP;
164+ els.book.addEventListener("input", loadBook);
165+ for (const el of [els.metric, els.color, els.perToken, els.lockStep, els.windowSize, els.windowStep]) {{
166+ el.addEventListener("input", () => {{
167+ if (el === els.windowSize && els.lockStep.checked) els.windowStep.value = els.windowSize.value;
168+ if (el === els.lockStep && els.lockStep.checked) els.windowStep.value = els.windowSize.value;
169+ render();
170+ }});
161171 }}
162172 els.canvas.addEventListener("mousemove", showDetails);
163173 els.canvas.addEventListener("mouseleave", () => setDetails("Hover over the image", ""));
@@ -183,8 +193,10 @@ def index_html(
183193 const canUsePerToken = TOKEN_METRICS.includes(metric);
184194 els.perToken.disabled = !canUsePerToken;
185195 const useWindows = !canUsePerToken || !els.perToken.checked;
196+ if (els.lockStep.checked) els.windowStep.value = els.windowSize.value;
186197 els.windowSize.disabled = !useWindows;
187- els.windowStep.disabled = !useWindows;
198+ els.lockStep.disabled = !useWindows;
199+ els.windowStep.disabled = !useWindows || els.lockStep.checked;
188200 els.windowSizeValue.textContent = els.windowSize.value;
189201 els.windowStepValue.textContent = els.windowStep.value;
190202 const result = useWindows
0 commit comments