Skip to content

UI redesign - #96

Merged
jsong1218 merged 7 commits into
mainfrom
ui-redesign
Aug 31, 2026
Merged

UI redesign#96
jsong1218 merged 7 commits into
mainfrom
ui-redesign

Conversation

@jsong1218

Copy link
Copy Markdown
Owner

No description provided.

jsong1218 and others added 7 commits August 30, 2026 17:48
…h a separate accent-text token (teal-as-text needs a lighter dark tone than the fill can give), a pinned system-only mono family + the DataValue primitive so every value/count/identifier is visually a number, and the primitives restyled on the tokens with zero IA change. The both-themes contrast guard was extended FIRST with the accent-text-on-surface pair (it failed until the token landed; the test drives the values); --cb-* and the M63-S2 viewer-chrome tokens untouched. The Button is locked token-driven; the shell nav + BackLink adopt text-accent-text; the stray-colour sweep tokenized the dev spike's themed slate roles (DocMarkdown's prose-pre slate-900 stays as a documented one-off — dark code blocks in both themes). One config companion: the vitest include is widened by a pattern so the root-level tailwind.config.test.ts actually runs in CI. Gates: Python unchanged (4229 passed, coverage 91.79%); vitest 575 passed; e2e-through-Docker 62/62 on a fresh down -v stack. D243 + MASTER_SPEC Revision 1.87 recorded.
…lives under /f/[file_id] behind a pinned source rail + tab bar (Inspect · Structure · Convert · Report, Analysis stubbed), the inspect/job/record content MOVED (not rewritten) into tabs, the guided-spine rail CTA advancing Inspect → Convert, and every legacy route kept resolving by redirect — no bookmark 404s. The job/record wire carries no file_id (Part 6 §3.2/§4.4), so /convert/[job_id] and /conversions/[id] resolve the workspace from a handed-forward ?file_id=, a bare record bookmark falls back to a one-shot /v1/history lookup (bounded default retry so a transient fetch never strands a resolvable bookmark), and the standalone render is the honest fallback when the source bytes are gone; /files/[id] and /convert are server redirects. Upload lives on the landing (LandingUpload island), history rows link into the workspace, the rail collapses under the breakpoint. One e2e reality-check caught by the suite: the regexes waitForURL built from template literals must double-escape the ? (single \\? is an identity escape, silently quantizing the t) — fixed in batch-ui. Gates: Python unchanged (4229 passed, coverage 91.79%, ruff/mypy/lint-imports clean); vitest 581 passed; e2e-through-Docker 65/65 on a fresh down -v stack (62 M63 journeys re-pointed at workspace URLs + a new legacy-redirect spec, 3 journeys; fixture-based record scans stay on the legacy URL to exercise the standalone path). D244 + MASTER_SPEC Revision 1.88 recorded in-commit.
…t with a persisted outcome/category toggle, filter chips (live counts, / focuses) narrowing only the visible rows, source values in the S1 mono never collapsed away, and Copy-as-JSON/Markdown/link exports from pure client-side serializations of the report model. The no-loss invariant is guarded three ways: the view model yields exactly one row per preserved/removed/assumption/warning entry; the panel test asserts default-complete, filter-narrowable, forced-loss-visible (the worked fixture is itself a forced-loss conversion — poscar cannot store forces/energy), and category-mode complete; the new e2e journey reads the live report model from the wire and asserts the rendered row set against it, the section order top-to-bottom, filter narrow/restore, and the copy-as-JSON body + permalink from the clipboard. The removed-row quantitative loss now renders in the mono DataValue slot. Harness companion beyond the frontend file set, flagged for Claude: the serial e2e suite bursts past the backend's 120/min per-caller rate limit on the geometry-heavy journeys, 429ing every browser request for the rest of that wall-clock minute — including the next journey's upload — a timing flake that also explains the S2 transients; compose.yaml gains the XTALATE_RATE_LIMIT_PER_MINUTE pass-through (default unchanged at 120) and the e2e lane (CI workflow env; the gitignored AGENTS.md gate command) raises it to 100000 so the limiter stays mechanically on while the suite is deterministic. Gates: Python unchanged (4229 passed, coverage 91.79%); vitest 609 passed; e2e-through-Docker 66/66 on a fresh down -v stack. D245 + MASTER_SPEC Revision 1.89 recorded.
…palette (focus-trapped, ARIA, fuzzy jump to formats/docs/recents/actions via the in-repo lib/command/fuzzy matcher over /v1/capabilities fetched only while open), named conversion presets with one-click re-convert (TargetPicker now reports its live target+mode via onSelection; PresetManager persists to localStorage), a landing recents strip merging local recents with /v1/history, and vendored samples that feed the same useUpload path. The report panel also gains the S4 j/k row navigation. Two pre-existing latent harness/test-set races surfaced by this slice's e2e gate and fixed here: the over-limit journey waited on /on this instance/, which the landing's server-rendered hero line matches immediately while the client's max_upload_bytes (the gate the client-side refusal needs) was still null — re-admitting the server-413 path under load; the wait now targets the drop zone's own client limits line. And the palette focused its input via setTimeout(0), handing the open-then-assert-focus journey a scheduler race on a cold dev server — focus is now synchronous on open, and lib/prefs/storage is SSR-safe. Gates: Python unchanged (4229 passed, 91.79%); vitest 645 passed; e2e-through-Docker 69/69 on a fresh down -v stack (including the new qol journeys). D246 + MASTER_SPEC Revision 1.90 recorded.
…ace tab — the dev render-proof journey now asserts the viewer at its promoted home /f/[id]/structure, and the dev spike is retained only as the memory-harness surface. The /f/[file_id]/structure tab (slotted in S2) already mounts the unchanged StructureTab/StructureViewer from the M59 geometry endpoints, so this slice moves rather than extends: the M60 absence invariant, D235 supplied-violet, and D234 bonds policy carry over untouched, and the structure chrome is verified (not re-tuned) to sit on the S1 semantic tokens with the loss/viewer-chrome token pairs exactly as D243/D241 left them. e2e/structure-viewer.spec.ts (the no-hidden-export witness, data-atoms, the bonds toggle) is repointed from /dev/structure to /f/{id}/structure. The dev spike /dev/structure is kept and justified in-comment: the committed heap-measurement journeys (geometry-spike, trajectory-playback-memory) are the benchmark harness and depend on its client-side window-link scrub to measure heap across sequential mounts in one JS context — a property the tab widget scrub does not share — and it stays production-gated. Gates: Python unchanged (4229 passed, 91.79%); vitest 645; e2e-through-Docker 69/69 on a fresh down -v stack (repointed structure-viewer plus the retained dev-spike harnesses); Docker production build (next build) green with the ssr:false Mol* chunk. Revision 1.91 recorded (Part 7 §6); no new D — a move + reskin changes no policy constant.
…ce seams (File Repair + Assistant under the source rail, the Analysis tab stub) render as honest, inert "coming later" planks, motion honours prefers-reduced-motion from the committed S1 stylesheet, and serious+critical axe-zero is made structural.

The empty second-ray goals get an honest home rather than a fake one: a new FutureSeams component (mounted in the workspace layout, under the source rail) renders File Repair and Assistant as short, single-affordance "coming later" rows that are inert-by-design — no redirect link to a stub route, no hidden affordance a keyboard or screen-reader user could tab to and then dead-end in — and the Analysis tab's S2 stub is consciously rendered as a passive support card, not a fake action (the D244 redirect-linking non-goal, honoured). The motion guard is a committed @media (prefers-reduced-motion: reduce) block in the @layer base, collapsing transition/animation/scroll motion to imperceptible under the OS preference. Serious+critical axe-zero is now a committed property: the e2e/accessibility.spec.ts sweep is extended so three additional landing states plus the workspace shell render zero serious/critical, and the new seams.spec.ts journey asserts the seams' copy + inertness, the Analysis seam, and the reduced-motion guard read numerically from computed style. One pre-existing latent harness race in the test set surfaced by S6's ⌘K journey and fixed here: the open-shortcut journey pressed Meta+K after only the server-rendered heading was visible, before the client hydrated the window keydown listener — CommandPaletteTrigger now sets a data-hydrated marker in the same commit that attaches the listener and the journey waits on it (flagged for the maintainer; a harness/test-set race, not a product defect). Gates: Python unchanged (4215 passed, coverage 91.79%, ruff/mypy/lint-imports clean); typecheck/lint clean; vitest 648 passed; Docker production build green; e2e-through-Docker 73/73 on a fresh down -v stack (66 M63/S2-S5 journeys + the S6 seams/reduced-motion + extended workspace-shell axe sweep, and the ⌘K journey now gated on the hydration marker). D247 + MASTER_SPEC Revision 1.92 recorded.

Generated with Codebuff  🤖
Co-Authored-By: Codebuff <noreply@codebuff.com>
@jsong1218
jsong1218 merged commit 3f5613d into main Aug 31, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant