Skip to content

Dashboard and one visual surface for studio and dashboard, in a picked design system - #7

Merged
junixlabs merged 3 commits into
mainfrom
claude/focused-carson-mj2px4
Oct 4, 2026
Merged

junixlabs merged 3 commits into
mainfrom
claude/focused-carson-mj2px4

Conversation

@junixlabs

Copy link
Copy Markdown
Owner

What

Three commits:

  1. uxcli dashboard: a management view of one or more projects, built from drawings the owner picked (layout "B · coverage matrix", theme "3 · Control room"). It is written once to .uxcli/dashboard/, or served for several folders with --serve, with a folder switch in the page. The command also fixes template apply so it honours --src.
  2. One visual surface (src/core/app-page.js) that the studio and the dashboard now share. Its design system lives in src/core/ui.js (tokens, icons, components); the owner chose it as direction "D · merge A + C" (drawings in docs/design/system/).
    • The canvas shows each journey as a filmstrip: real screenshots in device frames, the action and its seconds on the arrows between them, and findings pinned on the picture.
    • Two panels sit beside the canvas: "fix first" and a to-do bar ordered fail > finding > waiting on a person > not started.
    • The other views are Screens, Runs, People and Library.
    • The older pages (mockups, map, experience) take the new tokens through LEGACY_ALIASES.
  3. Simplify and code-review pass:
    • Fixes:
      • A malformed /f/ path no longer crashes the dashboard server. Both servers now serve files through src/adapters/serve-file.js.
      • Status titles and icon labels are escaped, closing an XSS through a drawing name.
      • Live refresh reloads the page, and waits behind a button while a textarea holds text.
      • An unknown #hash falls back to the Journeys view.
      • The dark tokens respect data-theme.
    • Structured verdicts: findings and verdicts now carry state, element and scrolls. The page reads state first and only parses the words for older packets; schemas/experience.schema.json declares the three new fields.
    • Reuse and speed:
      • gather reuses what buildStudio already read, plus existing helpers: esc, P.proposals, projectTemplate() and worst().
      • The served dashboard keeps one reading per folder until something under .uxcli/ changes.
      • Saving the canvas position is debounced.

Checks

  • uxcli gate: GATE PASS (exit 0) with Chrome.
  • studio-pairs: 34 checks. dashboard-pairs: 18 checks; its view check now looks inside the single page instead of at stale files. page-pairs: 57 checks. experience-pairs: 48 checks.
  • Checked by hand against a served dashboard:
    • a malformed path, a path escaping .uxcli/ and a directory each return 404;
    • an unknown hash falls back to Journeys;
    • dark mode and the forced light theme both render with the right background;
    • the page throws no errors.

Left for later

  • Computing each frame's health once on the server: the page's JavaScript still mirrors it.
  • Dropping the lastRuns special case for packets that kept no steps: this changes the map model.

🤖 Generated with Claude Code

https://claude.ai/code/session_011TUCUpbzmTpBE6ND7eHfzx


Generated by Claude Code

claude added 3 commits October 3, 2026 19:17
…honours --src

- uxcli dashboard [dir …] [--serve]: read-only management view of one or more
  projects. Overview is a coverage matrix (every screen the journeys pass
  through against understood, drawn, picked, reviewed, walked, verdict,
  estimate, walkthrough); a gap is never a pass and names the command that
  fills it. Runs, Design and Understanding views. Served, it switches folders,
  adds one from the page, and serves pictures only from under .uxcli/.
- Layout and look picked by the owner from three drawings each
  (docs/design/dashboard/): the coverage matrix, the "control room" theme.
- Gate: dashboard-pairs, which runs the page probes on every view.
- template apply --src=DIR wrote into the current directory; it now writes
  into DIR's project root.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011TUCUpbzmTpBE6ND7eHfzx
…wner picked

The owner on the first dashboard: a UI/UX tool that is all text is not right. Four
drawings with the CRM demo's real screenshots (docs/design/system/); picked: a canvas
laid out as filmstrips.

- src/core/ui.js: tokens, icons and shared components for every uxcli page.
- src/core/app-page.js: the page uxcli studio and uxcli dashboard both write. Each
  journey a filmstrip of device frames with the walk's pictures, action and seconds on
  the arrows; findings pinned on the screen they were measured on, in plain words;
  fix-first and a to-do bar ordered by urgency; Built/Drawn/Versions layers; Screens,
  Runs, People and Library views. Studio decisions and live refresh kept.
- Mockups, map and experience pages take the same tokens; the mockups page's 2.9:1
  grey now passes and page-pairs probes it. Two system tokens corrected to 4.5:1.
- The studio fits on a first visit (it used to save the view before checking).
- studio-pairs and dashboard-pairs follow the new layout: frames per screen, the
  to-do bar's order on the walked example and where a click lands, each view opens.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011TUCUpbzmTpBE6ND7eHfzx
Fixes
- dashboard server: a malformed /f/ path was an uncaught URIError; both
  servers now go through one serveFile helper (safe decode, under-base,
  isFile, typed)
- escape the status title and icon labels (a pick name reached an
  attribute unescaped)
- live refresh reloads the page instead of re-rendering the canvas only,
  and waits behind a button while a textarea holds text
- an unknown #hash falls back to Journeys; hashchange switches views
- dark tokens honour data-theme="light"/"dark"

Simplify / reuse
- verdicts and reach findings carry state, element, scrolls; the page
  reads v.state before parsing words; the Vietnamese regex in short() and
  the translated example packets are gone
- esc from wireflow, P.proposals, projectTemplate(), worst() from rank
- buildStudio hands gather the project, mockups and packets it read
- pageData() is the one payload for the page and the studio's data.json
- served dashboard keeps one reading per folder until .uxcli/ changes
- canvas position is saved debounced, not on every pointer move
- drop STATE_WORDS, the PATHS alias and the compareExperience re-export
- dashboard test checks the one-file page's views, not stale files

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011TUCUpbzmTpBE6ND7eHfzx
@junixlabs
junixlabs merged commit 0769a09 into main Oct 4, 2026
2 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.

2 participants