Skip to content

feat(ui): MVP UX polish from the heuristic evaluation - #45

Merged
jhosepmyr merged 23 commits into
developfrom
feature/mvp-ux-polish
Oct 7, 2026
Merged

jhosepmyr merged 23 commits into
developfrom
feature/mvp-ux-polish

Conversation

@jhosepmyr

Copy link
Copy Markdown
Contributor

Description

UX polish of the MVP screens, driven by a heuristic evaluation with six users. Builds on #43 and #44 (both merged into this branch); merge those first so this diff only shows the polish.

Finding (severity) Change
No processing state while the AI works (2) Status line in the session: listening (and time since the last suggestion), paused, processing after Stop, or failed with the reason; toast when an accepted suggestion lands in the backlog
Everything mixed in one feed (2) Pending AI suggestions in their own tray with counter and prev/next (arrow keys, Esc to minimize); it no longer covers Pause, Stop or the side panel; neutral transcript bubbles with speaker and time; compact "Accepted by the analyst" rows
Generated stories hard to read (2) Text areas grow with content (they were forced to a fixed height); stories read as one sentence; Given / When / Then shown as labelled steps everywhere
Unclear what came from the AI (2) Violet = AI, amber = draft, emerald = approved; new "Origin" column in the backlog; story detail leads with title, status meaning and origin, linked to its session
Modules look alike / low contrast (2) Priority scale with icons; page header on projects; active nav item, focus rings and every badge ≥ 4.5:1 in both themes
Optional fields unclear in project forms (2) Only the name is required and both forms say so; one optional technical-profile section; project settings from eight save cards to two
Ambiguous backlog ordering (2) Sortable headers with direction, caption explaining the order, card list on phones
Remote audio friction (3) Picker with text labels, "Record" button, calm two-step note for virtual meetings, Share again inside the warning

Impeccable critique score: live session 20 → 26 / 40, stories 20 → 24 / 40.

Brand changes to review: filled red moves from #ef4444 to #dc2626 (white text failed contrast at 3.76:1, now 4.83:1), and AI content is now violet.

Feature module / area: discovery / workspace / layout / shared / i18n

Related issue / US: usability findings #3–#9, #11–#13 of the MVP heuristic evaluation


Type of Change

  • feat — new feature or UI component
  • fix — bug fix
  • refactor — code change without behavior change
  • test — tests only
  • docs — documentation only
  • build / ci — build, dependencies, or CI/CD
  • chore — maintenance

Checklist

  • The PR targets develop (not main)
  • Branch name follows feature/*, bugfix/*, or hotfix/*
  • Commits follow Conventional Commits
  • bun run lint passes locally (ESLint + angular-eslint)
  • bun run test passes locally (Vitest) — 393 passed
  • bun run build passes locally (no type errors, no budget exceeded)
  • New components use ChangeDetectionStrategy.OnPush and Angular signals
  • No localStorage/sessionStorage access for JWT tokens (use the auth store)
  • No bypassSecurityTrust* calls without explicit review
  • No secrets, credentials, or .env content committed
  • CHANGELOG.md updated under [Unreleased]

How to Test

  1. Start a live session: the status line reports what the AI is doing; suggestions appear in the tray without covering the controls.
  2. Accept, edit and dismiss suggestions; check the toast and the "Accepted by the analyst" row.
  3. Open the backlog: sort by priority and origin; on a phone width it becomes a card list.
  4. Open a story: status, origin and Gherkin steps are clear; text areas grow while typing.
  5. Create a project: only the name is required.
  6. Check light and dark themes.

Screenshots / recordings (if UI changes)

Light theme, 1440×900, in docs/screenshots/mvp/ (live session, AI question, processing state, audio picker, backlog, story detail with Gherkin).

Notes (optional)

Left out on purpose:

  • changing a story's status, because the backend has no endpoint for it;
  • undo for accept and dismiss, because they are permanent on the backend;
  • confirmation on Stop;
  • priority sorting across pages, because the backend sorts by name.

Adds ai / verified / pending and priority tokens (light + dark) so AI-originated,
human-validated and awaiting-review content stop sharing the brand red. The red
fill moves to #dc2626 so white button labels pass AA (4.83:1); in dark, red used
as text takes a lighter step. Muted text, the default focus outline and the
active sidebar item now meet AA, and the nav indicator animates with transform.
hlmInput gave textareas the inputs' fixed h-10, so rows were ignored and story
statements and Gherkin steps were clipped. Textareas now size to their content
(field-sizing) from a two-line minimum. hlmLabel also styles span and legend
labels, which rendered unstyled at 16px next to 14px labels.
AI status lines, review-tray and provenance labels, Gherkin hints, story status
explanations, the labelled audio-source picker and its two-step virtual-meeting
guidance, and the optional/required markers for the project forms. Speakers read
"Participante n" in Spanish so they no longer collide with the story role.
…dges

Shared presentational pieces: Given/When/Then steps behind a keyword gutter,
a priority chip with a direction glyph (critical red, high orange, medium and
low neutral), a review-status chip (draft = amber dashed, approved = emerald
check) and an origin chip (AI from a session vs manual). Backlog stories in the
chat store now keep their review status for the side panel.
…ions as AI

The decision queue no longer floats over the viewport: it docks to the feed
column, so the session bar (pause/stop), the header actions and the side panel
stay reachable. A tray header names it, carries the counter with prev/next and
minimize, and announces changes. Suggestion cards carry violet AI provenance,
read the story as its sentence and criteria as Gherkin steps, highlight every
field an update changes, edit in labelled auto-growing fields, and keep Discard
apart from Edit/Cancel.
…reams

A status line at the live edge of each session says whether the AI is listening
(with the last suggestion's age), paused, generating the final stories after
Stop, or failed (with the backend reason). The transcript recedes into neutral
bubbles with always-visible speaker and time; human decisions become compact
rows ("accepted/resolved by the analyst"); AI-generated stories carry violet
provenance plus "awaiting review". Accepting confirms where the content went,
the load error offers a retry, and screen readers hear the review count. The
side panel gains tab semantics, labelled filters, Gherkin steps and status chips.
…te announced

The picker becomes a labelled segmented control (In person / Virtual meeting)
so it is never confused with the record button, which now shows a record dot
and a "Record" label. The virtual-meeting guidance is a calm two-step note
(share the meeting tab with its audio; wear headphones), and the missing-audio
notice offers "Share again" in place. The session bar keeps its status label
for screen readers on mobile and shows the meeting-audio badge on every width.
Sortable column headers with a direction arrow and aria-sort, plus a visible
"sorted by" caption. Priority sorting is re-ordered by meaning on the page,
since the API sorts the enum alphabetically. Rows show priority, review status
and origin (AI from a session vs manual) chips, link their title for keyboard
users, collapse into a chip row below sm, and use unambiguous dates. The empty
state offers next steps and load errors offer a retry.
…d state

The detail page leads with the story's title, review status (with what it
means) and origin, linking an AI story back to its capture session. Role,
action and benefit read top-down as the story sentence in full-width,
auto-growing fields; Save enables only once something changed. Criteria use a
Gherkin keyword gutter with labelled fields, flag new or edited rows as unsaved
and only enable their own Save then. The create page shares the layout.
…tings

Only the name is required, and both forms now say so. The technical profile is
one clearly optional section grouped into business context (domain,
architecture) and tech stack (chip lists, with an Enter-to-add hint), with
placeholders that read as examples. Settings drop from eight one-field cards to
General and Technical profile, each with its own Save, and the logo card is
titled for the project. Chip inputs accept an id for their label, describe their
hint and name each remove button.
The projects page was the only module without a visible heading; it now opens
with its title and subtitle like the others, and the search field shows focus.
Light theme, 1440x900, Spanish demo data: projects list, new project and
project settings, the live session (review tray, suggestion editing, an update
diff, an AI question, processing after Stop), both audio sources, the backlog
(default and by priority) and the story detail with its Gherkin criteria.
Tailwind's utilities are imported unlayered, so the layered override lost to
.text-primary and red links stayed at 3.3:1 on navy. The override is now
unlayered and wins by specificity (4.5:1 or better).
Also rewords the draft status hint so it no longer contradicts "accepted by
the analyst": a draft is simply not approved yet.
…edge visible

Arrow keys browse the tray and Escape minimizes it (ignored while typing);
after a decision focus returns to the tray instead of the page body; focusing
a feed control the tray covers minimizes it (WCAG 2.4.11). From sm the tray
stops short of the feed bottom so the latest lines and the AI status stay in
view; on phones its title is shortened. The audio picker no longer truncates
its labels on desktop.
… fields

Below sm the backlog page scrolls instead of a nested box that showed about one
row. Draft status becomes an amber dashed outline so it is not mistaken for the
filled orange High priority beside it. Story create/edit fields now say inline
when a required field is left empty (aria-invalid + described message).
Both options split the picker evenly, which truncated "Reunión virtual". From
sm each option takes its own width; on phones they still share the full row.
@jhosepmyr
jhosepmyr merged commit c6fdbf0 into develop Oct 7, 2026
5 checks passed
@jhosepmyr jhosepmyr mentioned this pull request Oct 7, 2026
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