From eaeb6b5c2a3934925e6b9653f4cf3b91ddd2e437 Mon Sep 17 00:00:00 2001
From: Michael Pilosov
Date: Tue, 21 Apr 2026 20:07:42 -0600
Subject: [PATCH] styling changes (radio for N)
---
app/web/static/dataset-picker.js | 10 ++++-----
app/web/static/style.css | 35 ++++++++++++++++----------------
app/web/templates/index.html | 15 +++++++++-----
3 files changed, 33 insertions(+), 27 deletions(-)
diff --git a/app/web/static/dataset-picker.js b/app/web/static/dataset-picker.js
index d78d645..b15d4e0 100644
--- a/app/web/static/dataset-picker.js
+++ b/app/web/static/dataset-picker.js
@@ -236,18 +236,18 @@ async function main() {
continueBtn.title = selectedId ? '' : 'pick a dataset first';
}
- const slider = document.getElementById('n-slider');
- const nValue = document.getElementById('n-value');
+ const nInputs = document.querySelectorAll('input[name="n"]');
function applyN(n) {
- nValue.textContent = n.toLocaleString();
hidden.numPoints.value = String(n);
for (const s of scenes) {
const cap = s.geometry.attributes.position.count;
s.geometry.setDrawRange(0, Math.min(n, cap));
}
}
- slider.addEventListener('input', (e) => applyN(parseInt(e.target.value, 10)));
- applyN(parseInt(slider.value, 10));
+ nInputs.forEach(input => {
+ input.addEventListener('change', (e) => applyN(parseInt(e.target.value, 10)));
+ });
+ applyN(parseInt(document.querySelector('input[name="n"]:checked').value, 10));
let jitterScale = 0;
const jInputs = document.querySelectorAll('input[name="j"]');
diff --git a/app/web/static/style.css b/app/web/static/style.css
index f717a93..85ef745 100644
--- a/app/web/static/style.css
+++ b/app/web/static/style.css
@@ -625,40 +625,41 @@ button.submit:disabled { background: var(--faint); border-color: var(--faint); c
text-transform: uppercase;
color: var(--mute);
}
-.picker-controls .ctl-value {
- font-family: var(--mono);
- font-size: 0.82rem;
- color: var(--accent);
- min-width: 3.5rem;
- text-align: right;
- font-variant-numeric: tabular-nums;
-}
-.picker-controls input[type="range"] {
- width: 100%;
- accent-color: var(--accent);
- height: 4px;
-}
.picker-controls .segmented {
grid-column: 2 / -1;
- display: flex;
- justify-content: space-between;
+ /* Shared 5-column track across every segmented row. 3-option rows drop
+ their options into columns 1/3/5 so first/middle/last align with the
+ 5-option row's first/middle/last. */
+ display: grid;
+ grid-template-columns: repeat(5, 1fr);
align-items: center;
}
+.picker-controls .segmented.count-3 > label:nth-child(1) { grid-column: 1; }
+.picker-controls .segmented.count-3 > label:nth-child(2) { grid-column: 3; }
+.picker-controls .segmented.count-3 > label:nth-child(3) { grid-column: 5; }
.picker-controls .segmented label {
font-family: var(--mono);
font-size: 0.78rem;
color: var(--mute);
cursor: pointer;
padding: 3px 2px 4px;
- border-bottom: 1px solid transparent;
- transition: color 120ms ease, border-color 120ms ease;
+ transition: color 120ms ease;
user-select: none;
font-variant-numeric: tabular-nums;
position: relative;
+ text-align: center;
+}
+.picker-controls .segmented label > span {
+ display: inline-block;
+ padding: 0 2px 1px;
+ border-bottom: 1px solid transparent;
+ transition: border-color 120ms ease;
}
.picker-controls .segmented label:hover { color: var(--ink); }
.picker-controls .segmented label:has(input:checked) {
color: var(--accent);
+}
+.picker-controls .segmented label:has(input:checked) > span {
border-bottom-color: var(--accent);
}
.picker-controls .segmented label:has(input:focus-visible) {
diff --git a/app/web/templates/index.html b/app/web/templates/index.html
index 5872252..81fe9bc 100644
--- a/app/web/templates/index.html
+++ b/app/web/templates/index.html
@@ -49,19 +49,24 @@