From 081209decf78ab61e0ddd06965a0c056207ee198 Mon Sep 17 00:00:00 2001 From: Henrik Muehe Date: Thu, 30 Apr 2026 20:43:29 +0200 Subject: [PATCH] Plan: resolve open questions (hard cut, macros slice, override drawer, defer pin) Replaces the 'Open questions' section with 'Resolved decisions' and propagates the four decisions into the relevant phases: - Hard cut: no config.ui.layout flag. Phase 6 now includes the removal of .nav-header, side-menu.css and the #tab1..#tab4 block with a git grep verification step. - Macros: Control row binds to config.macros.slice(0, 8); Settings -> Macros owns the master list and reordering. - Pin to Control: deferred, status strip stays at State / V&F / Spindle / Job for this iteration. - Feed/spindle override: bottom drawer triggered by the Spindle KPI tile, reusing override_feed / override_speed. Goals (s.1) and Phase 6 testing checklist updated to match. --- plans/2026-04-30_ux_redesign.md | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/plans/2026-04-30_ux_redesign.md b/plans/2026-04-30_ux_redesign.md index 1b66b66..744b587 100644 --- a/plans/2026-04-30_ux_redesign.md +++ b/plans/2026-04-30_ux_redesign.md @@ -16,6 +16,8 @@ The redesign keeps every existing feature but reorganizes the page into a single - Touch targets ≥ 64 px (jog tiles 72 px, axis action icons 72 px, macro buttons 84 px). - All action chip-soup (WiFi/Camera/Rotary/IP/Version) collapses into one "All systems · view" pill that opens a popover. Burger menu removed (Settings tab supersedes it). - V09 jog/macro palette: flat soft slate (#3f4b63), no drop shadow; yellow (#fde047) accent for active states (step seg, tab underline, macro number badge). +- Spindle override / feed override sliders live in a bottom-edge drawer triggered by tapping the Spindle KPI tile (no permanent screen real estate). +- Hard cut: no `config.ui.layout` flag; the new shell replaces the old in a single release. ## 2. Scope of code change @@ -33,6 +35,7 @@ Files we will touch: - `src/stylus/style.styl` — add `.app-shell`, `.head`, `.tabs-host`, `.ktab`, panel styles, V09 jog tokens. Keep legacy classes alive until templates fully migrated. - `src/static/css/side-menu.css` — stop including in `index.pug`. - Settings: keep `settings-view.pug`, `admin-general-view.pug`, `admin-network-view.pug`, `motor-view.pug`, `tool-view.pug`, `io-view.pug`, etc., and surface them through a left-rail navigator inside the Settings panel rather than the sidebar. +- Settings → Macros owns the full macro list (1…N). Control's macro row is a slice of the first 8; reordering happens in Settings. ## 3. Routing model @@ -92,7 +95,7 @@ The header tab bar maps URL prefix → active tab. A tiny helper `topTabFromHash 3. Build the new `.step-seg` with the existing `jog_incr` model. The four buttons stay wired to `jog_incr = 'fine' | 'small' | 'medium' | 'large'`. 4. Build `.dro-card` from the existing `table.axes` markup. Each row gets the new 7-column grid; axis cells just need `.dro-axis`, `.dro-pos`, `.dro-sec` classes. 5. Move the four KPI tiles (`State / Velocity-Feed / Spindle / Job`) into `.status-strip`. Existing `state.v`, `state.feed`, `state.s`, `state.line` bindings are unchanged. -6. Move `.macros-div` into a `.macro-row` 8-column grid. Cap visible buttons to 8 — overflow lives in Settings → Macros (or an "All macros" sheet for later). +6. Move `.macros-div` into a `.macro-row` 8-column grid. The row binds to `config.macros.slice(0, 8)`; macros 9…N are editable and runnable only from Settings → Macros (no drawer in Control). Reordering in Settings changes which macros appear in the visible 8. 7. Drop the legacy `.tabs / #tab1 …` block from `control-view.pug` entirely. ### Phase 3 — Program panel (1.5 days) @@ -121,7 +124,8 @@ The header tab bar maps URL prefix → active tab. A tiny helper `topTabFromHash 2. System pill popover content: WiFi state + button, Camera state + retry, Rotary toggle, IP address, firmware version, "Open Settings". 3. Disabled states: jog buttons + macro buttons honor `is_ready` like before; gray them out instead of hiding. 4. Decimal-places setting from the existing `display_units` plumbing — wire to a new `precision` config the DRO reads. -5. Add a feature flag `config.ui.layout = "v09" | "legacy"` in `config-template.json`. If `legacy`, keep the old `index.pug` tree for one release. Default to `v09` after a beta cycle. +5. Build the **Spindle override drawer**: clicking the `.stat-card` for Spindle toggles `.override-drawer.open` anchored to the bottom edge of the body. The drawer hosts the two existing `` controls for `feed_override` and `speed_override` plus `Reset` buttons. Bind to the existing `override_feed` / `override_speed` methods. +6. **Hard cut cleanup:** delete the legacy `.nav-header`, side-menu markup, and the inline `.tabs / #tab1…#tab4` block from `control-view.pug`. Remove `src/static/css/side-menu.css` from `index.pug` includes. Sweep `style.styl` for orphan rules (`.nav-header`, `.brand`, `.menu-link`, `.pure-menu*` overrides, `.tabs > input` selectors) and delete them in the same commit so we don't ship dead CSS. ## 5. Migration risks & mitigations @@ -141,23 +145,25 @@ The header tab bar maps URL prefix → active tab. A tiny helper `topTabFromHash - Touch hit-tests: every interactive target ≥ 48 px on its shortest side, primary jog tiles ≥ 72 px. - Existing flows still work end-to-end: home all axes, run a small program, MDI a `G0 X10`, switch to Imperial, upload a folder, delete a file. - Hash routing: hand-type `#motor:1` and confirm Settings tab activates with Motor 1 selected. +- Spindle override drawer: tap Spindle KPI tile, sliders move feed/speed override, `Reset` returns both to 100 %, tile tap closes drawer. +- Macro row shows macros 1–8 only; reordering in Settings → Macros changes which 8 appear on Control. - Pulse-dot animation respects `prefers-reduced-motion`. -- Audit `style.styl` for orphan rules from removed templates and delete them. +- Hard-cut cleanup verified: `git grep` finds no references to the old `.nav-header`, `side-menu.css`, or the `#tab1…#tab4` selectors after the rename. ## 7. Estimated effort About 6–7 working days for one developer: 1. Mock parity & header — 1.5 days -2. Control panel — 2 days +2. Control panel (incl. macro slice + DRO grid) — 2 days 3. Program panel — 1.5 days 4. Console panel — 1 day 5. Settings shell — 1 day -6. Polish, feature flag, regression tests — 0.5–1 day +6. Override drawer, polish, hard-cut cleanup, regression tests — 0.5–1 day -## 8. Open questions +## 8. Resolved decisions -- Do we ship the redesign behind `config.ui.layout` or a single hard cut? Recommendation: feature flag for one beta release, then default-on. -- Macros above 8: drawer in Control or move overflow into Settings → Macros? Recommendation: Settings owns the master list; Control surfaces the first 8 (configurable). -- Do we want a "Pin to Control" affordance (e.g. let the user pin a chosen indicator into the status strip)? Defer to a later iteration. -- Spindle override / feed override sliders are not in the V09 mock. Decide whether they live in the status strip or as a quick-action drawer pulled from the bottom edge. Recommendation: drawer triggered by the spindle KPI tile. +- **Rollout: hard cut.** No `config.ui.layout` feature flag, no parallel legacy shell. The new `index.pug` tree replaces the old one in a single release; the old `.nav-header`, side menu, and embedded `.tabs` block are deleted (not gated). One pre-release internal QA pass on real hardware before tagging. +- **Macros above 8: Settings owns the master list; Control surfaces the first 8 (configurable).** The Control macro row reads from `config.macros[0..7]`; everything beyond index 7 is editable / runnable only from Settings → Macros. Users can reorder which macros land in the visible 8 there. +- **"Pin to Control" indicator slot: defer.** Not in this redesign. Tracked as a follow-up; current status strip stays fixed at State / Velocity·Feed / Spindle / Job. +- **Feed & spindle override: drawer triggered by the Spindle KPI tile.** The Spindle card in the status strip becomes tappable. Tap opens a bottom-edge drawer (≈ 220 px tall) containing the two existing range inputs (`feed_override`, `speed_override`) at touch-friendly size with `Reset to 100 %` buttons. Closes by tapping the tile again or the drawer chevron. No protocol change; reuses the existing `override_feed` / `override_speed` handlers.