Skip to content

style: redesign the WebUI - #2

Merged
jatinkrmalik merged 1 commit into
mainfrom
style/redesign-webui
Aug 9, 2026
Merged

style: redesign the WebUI#2
jatinkrmalik merged 1 commit into
mainfrom
style/redesign-webui

Conversation

@Mr-Sunglasses

@Mr-Sunglasses Mr-Sunglasses commented Aug 8, 2026

Copy link
Copy Markdown
Member

Hierarchy from type and hairlines instead of boxes, on the product palette the
iOS and Android apps already use. Every fact stays on the page.

.card a section with a rule, not a filled box — only inputs, data strips, tables and the QR plate keep a surface
Overview the eight tinted metric tiles become one hairline-divided strip; status is a dot, not a coloured pill
Models a grouped list of rows instead of a 245px card grid with up to five pills each; Download is ghost so Select is the only green action
Settings six stacked boxes → four page sections; Network and storage merge so paths stop breaking mid-word
Test the benchmark grid reuses the operations strip

Also removed: the uppercase micro-labels (GATEWAY STATUS, LIVE OPERATIONS,
UPTIME…), the Models marketing hero, and the "ready for dictation" block that
repeated the headline above it.

Two fixes that came out of it:

  • pairing's <dl class="facts"> used div-wrapped pairs the two-column grid did
    not expect, so long URLs overflowed on narrow screens
  • one --gutter for header, tabs and content, computed from 100% rather than
    100vw so a scrollbar cannot pull the header out of line with the content

About app/webui/favicon.svg

It is generated output, and it is this repository's file — committed and
reviewed here, not written from outside. assets/generate.py in
VocaHQ/vocaphone draws it, because the geometry and the palette live there and
a second copy of that generator here would be the worse duplication. To refresh
it, from a vocaphone checkout with this repo as its server/ submodule:

python3 assets/generate.py --favicon server/app/webui/favicon.svg

That flag exists as of VocaHQ/vocaphone#43. Before it, the favicon was an
ordinary entry in the generator's output map, which meant a routine run there
silently dirtied a checkout of this repo. The neutral disc is deliberate — the
WebUI draws the mark small against its own dark chrome, where a green disc reads
as a smudge of colour.

The matching vocaphone PR is #43.

381 tests, ruff, ruff format and mypy all pass. Rendered headless at 1280px and
500px across all four tabs, plus the token modal, a mid-download row, a finished
test run and the not-ready setup state.

Mr-Sunglasses added a commit to VocaHQ/vocaphone that referenced this pull request Aug 8, 2026
The apps disagreed with each other and with their own icon: iOS was tinted
system blue, the keyboard's resting accent was blue again, Android used the
brand green, and the icon was navy on green — dark on dark.

Icon: the field keeps #0F6B57, the mark flips to near-white, and the outer arc
pair is dropped so the microphone can be drawn bigger. Contrast goes from 1.4:1
to 5.1:1 and it reads at 22px. mark_box("both") still reproduces the measured
349x329 avatar reconstruction exactly, so the provenance is intact.

iOS: BrandPalette holds the two values for every target. Explanations that were
List rows become Section footers, which is what made the screens read as a
column of slabs. SessionState gains displayName — the main screen was showing
raw case names like "uploadFailedRecoverable".

Android: SectionCard becomes Section, a heading and its content on the page
rather than fourteen filled cards down Settings; interruptions become Notice and
keep a container. Material's own button shape replaces a bespoke 16.dp corner
that was on buttons, chips and cards alike.

Two contrast bugs the blue was hiding, both of which would have shipped:

- SwiftUI .borderedProminent always draws a white label on the tint, which is
  1.7:1 on the dark palette's #77D0B2. Prominent buttons now go through
  brandProminentButton().
- The keyboard's dictation bar hardcoded a white title on its accent fill, and
  every dark-mode accent there is a light pastel, so all six states sat near
  2:1. The label colour is now derived from the fill's luminance.

Removing Android's cards also broke what they were propping up: on the white
page a chip fill at #F4F5F3 was 1.09:1, and the *pending* setup-checklist icons
were 1.76:1. The light containers and outline moved; both themes now pass every
pair.

The gateway WebUI half of this work is VocaHQ/vocagateway#2, since server/ is
now a submodule.

iOS: 90 tests, both appearances checked in the simulator. Android: 116 tests,
assembleDebug and lintDebug clean, but no emulator image or device was available
so it is compile- and contrast-verified only.
Hierarchy from type and hairlines instead of boxes, on the product palette the
iOS and Android apps already use.

- .card is a section with a rule, not a filled box; only inputs, data strips,
  tables and the QR plate keep a surface
- the eight metric tiles become one hairline-divided strip; the benchmark grid
  matches it
- Models is a grouped list of rows, not a 245px card grid with up to five pills
  each; Download is ghost so Select is the only green action
- Settings drops six stacked boxes for four page sections; Network and storage
  merge so paths stop breaking mid-word
- status is a dot, not a coloured pill; uppercase micro-labels are gone
- fixed: pairing's <dl class="facts"> used div-wrapped pairs the grid did not
  expect, so long URLs overflowed
- one --gutter for header, tabs and content, computed from 100% so a scrollbar
  cannot pull the header out of line

favicon.svg is generated output — assets/generate.py in VocaHQ/vocaphone builds
it, and this is the four-arc mark from the icon work in that repo.
@jatinkrmalik
jatinkrmalik merged commit 2f5dea5 into main Aug 9, 2026
1 check passed
Mr-Sunglasses added a commit to VocaHQ/vocaphone that referenced this pull request Aug 9, 2026
The apps disagreed with each other and with their own icon: iOS was tinted
system blue, the keyboard's resting accent was blue again, Android used the
brand green, and the icon was navy on green — dark on dark.

Icon: the field keeps #0F6B57, the mark flips to near-white, and the outer arc
pair is dropped so the microphone can be drawn bigger. Mark-against-field
contrast goes from 2.98:1 to 5.90:1 and it reads at 22px -- measured, where the
figures first quoted for this were estimated and wrong. mark_box("both") still
reproduces the measured 349x329 avatar reconstruction exactly, so the
provenance is intact.

iOS: BrandPalette holds the two values for every target. Explanations that were
List rows become Section footers, which is what made the screens read as a
column of slabs. SessionState gains displayName — the main screen was showing
raw case names like "uploadFailedRecoverable".

Android: SectionCard becomes Section, a heading and its content on the page
rather than fourteen filled cards down Settings; interruptions become Notice and
keep a container. Material's own button shape replaces a bespoke 16.dp corner
that was on buttons, chips and cards alike.

Two contrast bugs the blue was hiding, both of which would have shipped:

- SwiftUI .borderedProminent always draws a white label on the tint, which is
  1.7:1 on the dark palette's #77D0B2. Prominent buttons now go through
  brandProminentButton().
- The keyboard's dictation bar hardcoded a white title on its accent fill, and
  every dark-mode accent there is a light pastel, so all six states sat near
  2:1. The label colour is now derived from the fill's luminance.

Removing Android's cards also broke what they were propping up: on the white
page a chip fill at #F4F5F3 was 1.09:1, and the *pending* setup-checklist icons
were 1.76:1. The light containers and outline moved; both themes now pass every
pair.

The gateway WebUI half of this work is VocaHQ/vocagateway#2, since server/ is
now a submodule.

iOS: 90 tests, both appearances checked in the simulator. Android: 116 tests,
assembleDebug and lintDebug clean, but no emulator image or device was available
so it is compile- and contrast-verified only.
@Mr-Sunglasses
Mr-Sunglasses deleted the style/redesign-webui branch September 3, 2026 10:03
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