Skip to content

UI polish overhaul - #96

Merged
adamXbot merged 7 commits into
mainfrom
polish/ui-terminal
Nov 8, 2026
Merged

adamXbot merged 7 commits into
mainfrom
polish/ui-terminal

Conversation

@adamXbot

@adamXbot adamXbot commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator

A consistent look for fxcss's terminal output: one style layer, used by every screen, and each screen reworked to use it.

What changed

One style layer (fxcss/style.py), used by every screen. Before this, colour and layout were decided separately in each command.

  • Colour follows the terminal: on for a TTY, off when piped, under NO_COLOR or with --no-colour, and forced with FORCE_COLOR. Only the 16 ANSI colours plus bold and dim are used, so the user's terminal theme picks the shades.
  • One glyph set (✓ ! ✗ · ● →) with ASCII fallbacks, always paired with a word.
  • One status rule: the mark carries the colour, the word carries the weight. Bold yellow renders bright yellow on light terminals, so colour never sits on the word.
  • Aligned label value rows, bold sentence-case headings with a dim note, ~ paths, real plurals (no more file(s)), and wrapping that never splits a word.

Per screen

  • fxcss --help: argparse's {try,install,…} brace list and the duplicate positional block are replaced by one grouped table, an Examples block and a one-line pointer. fxcss <command> --help is unchanged.
  • Bare fxcss: uses the same groups, order and summaries as --help, from one COMMANDS table.
  • try --info: facts in one aligned block, optional sheets packed into columns, setup rows marked ✓ automatic / ! check, README flags last and quiet, and a closing line naming the next command.
  • install: the profile is settled first; the 30-sheet menu is three right-aligned columns; one prompt shows its default; prefs are listed once; a one-line consequence sentence; the question names both theme and profile.
  • profiles: a title line, the shared profile folder named once, the default profile first, empty profiles on one line, and edits flagged with !.
  • watch: a context line instead of an echoed title, dim instructions, and reload rows as ✓ time files duration.
  • audit: verdict first, a ✗ / ! / · status column ordered by consequence (RENAMED and UNDEFINED above the housekeeping heading), one file:line column, and the context and collection log reduced to two closing rows.
  • doctor: a checklist with ✓ / ! / ✗, lower-case aligned labels, words instead of Python reprs (True, [1280, 480], Darwin), and a verdict that names what to know.
  • Numbered questions (which Gecko build, which theme in a repository, which version, which profile): one helper, _menu, asks all four the same way. A bold question with a dim note, number. name detail rows with the (Enter) default marked, Which one? 1-N [d], and a closing using X --flag X skips this question. A folder every choice shares is named once in the heading, and a long last column is cut (paths from the front, prose at a word) instead of wrapping under the numbers. The old build, theme and version prompts (Test against [1-3]:, Which one [1-3]:, Install [1-2]:) predate the style layer. The profile menu wrapped in the middle of long profile paths.

Behaviour changes reviewers should know about

  • audit no longer emits ANSI codes when its output is piped (it used to unless --no-colour was passed). fxcss check already passed --no-colour, and that switch is now scoped to the audit call (cli.py _run_audit).
  • audit prints a transient progress line on a TTY instead of the per-state ids/classes table. The totals remain in the closing checked row.
  • audit lists 5 NOT IMPORTED sheets and points to --all for the rest (it used to list 12).
  • install asks which profile (when that is ambiguous) before the optional-stylesheet menu, not after it.
  • profiles lists the default profile first, then the rest by name. --json output is unchanged.
  • Every numbered question ends with what was picked and the option that skips it next time (--firefox, --subpath, --ref/--commit, --profile). The build menu already said this; the other three are new.
  • The checklist shows the applied state as automatic. Before installing, "applied" read as though it had already happened. The data model is unchanged.

Test plan

  • python3 -m unittest discover -s tests passes: 695 tests, 1 skipped.
  • New tests/test_terminal_style.py covers plurals, column gutters, wrapping between words, the welcome and help screens at 80 and 100 columns, every command listed once, shared summaries, and the scope of --no-colour, and the numbered menus (rows, the prompt, clipping, the skip hint).
  • Run fxcss audit, fxcss doctor and fxcss install in your own terminal theme, and check the piped output of fxcss audit | cat.

🤖 Generated with Claude Code

adamXbot and others added 7 commits November 6, 2026 18:47
One terminal style layer (fxcss/style.py) used by every command: bold
magenta fxcss mark, bold sentence-case headings, dim labels in aligned
rows, a status column coloured by severity, one glyph set with ASCII
fallbacks, ~ paths, real plurals and wrapping that never splits a word.
Colour follows the terminal (TTY, NO_COLOR, FORCE_COLOR, --no-colour).

Rebuilt --help and the bare fxcss screen, and restyled try --info,
install, profiles, watch, audit and doctor: verdicts first or last,
duplicate lines removed, the stylesheet menu packed into columns, and
doctor turned into a checklist.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One command table drives both --help and bare fxcss, with the same
groups, order and summaries. Audit status words carry marks, every
context note sits in one Not counted block and file:line references
share one column. Setup rows say automatic or check, list pref names
one per line, and never claim something was applied before it was.
try --info ends on the next command; install settles the profile first
and says what it will write before asking; watch lines keep their
columns; doctor names what to know in its verdict.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Warnings put their colour on the ! mark and keep the words in the
terminal's own ink, since bold yellow is unreadable on a light
background. Audit's context collapses to two quiet closing lines (what
was not counted, what was checked) and long NOT IMPORTED lists defer to
--all. Profiles names the shared profile folder once and gives empty
profiles one line. Command summaries wrap under themselves on narrow
terminals, and new tests hold welcome and help inside 80 and 100
columns.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One status rule everywhere: the mark carries the colour, the word the
weight. Audit puts UNDEFINED with the breakage instead of under the
housekeeping heading, and closes on two single label rows. Install's
setup rows put pref names on one line and the consequence line is one
quiet sentence. Profiles lists the default first and makes 'installed'
a row of its own. Doctor's verdict is a tick when nothing failed. Watch
keeps durations plain. Welcome lists uninstall and uses one placeholder.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fxcss check runs the audit in-process with no_colour=True; the switch now
lasts only for the audit's own output.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Gecko build, theme and version prompts predated the style layer
(`Test against [1-3]:`, `Which one [1-3]:`, `Install [1-2]:`) and the
profile menu wrapped mid-path. All four now go through one helper: a bold
question with a dim note, number / bold name / dim detail rows with the
default marked, `Which one? 1-N [d]`, and a closing line naming the option
that skips the question next time. A folder every choice shares is named
once in the heading; a long last column is cut rather than wrapped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Run from a terminal, colour is on and the heading's bold codes sat in
front of the words the test looked for. Render it with colour off.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@adamXbot
adamXbot merged commit 6d10b54 into main Nov 8, 2026
18 of 19 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