Skip to content

feat/portal design v2 tune - #877

Closed
mortondev wants to merge 16 commits into
feat/portal-design-v2-parityfrom
feat/portal-design-v2-tune
Closed

mortondev wants to merge 16 commits into
feat/portal-design-v2-parityfrom
feat/portal-design-v2-tune

Conversation

@mortondev

Copy link
Copy Markdown
Member

Stack created with GitHub Stacks CLI • Give Feedback 💬

@mortondev
mortondev added this pull request to stack #833 October 31, 2026 18:15
A brand sits between the tiles' steps: its headline 48px at weight 300,
its buttons 40px tall with 4px corners. A design's tune sets exact values
for headlines, section headings, labels, buttons, cards and fields, each
bounded so no value can break a page, and each one left out keeps what the
tiles choose. Headlines take their own weight, defaulting to the heading
weight; a headline's size scales down on a phone. Section headings are a
part, so a tune sizes them without touching smaller headings.

tuneFromMeasurements turns what a reader measured on a brand's own pages
into exact values a person would choose, rounding to steps and holding a
site's hero-sized section headings to what a card can carry.
The reader finds a page's headline, a section heading, its main button, a
card and a field in its HTML, and applies the CSS rules that match them in
cascade order, utility classes included, with rem, clamp(), min(), max(),
vw and the page's custom properties resolved as a wide, light screen sees
them. Rules for states, theme scopes, dark themes and small screens are
left out, and what cannot be read stays unmeasured. No browser is needed.

The faithful look takes what was measured as exact values, and every look's
brief says what was measured so its steps start near it. A tracking
measured as none is kept as none.
A tune can colour headlines and section headings and fill primary buttons
with their own label, weight and case, in light mode. Each colour is
checked where it sits: a headline at 3:1 on the page and the band (and not
at all across a blend or an image), a section heading at 3:1 on the page
and a card, and a button's label at 4.5:1 on its fill, else the fill's
best label. A colour that would not read is left out.

The website reader measures the headline's and heading's colours and the
main button's fill, label, weight and case, and the faithful look takes
them.
From a keyboard sweep of every public page on ten branded portals:

- Anything focused by keyboard gets a ring in the solved focus colour, in
  the base layer, so a component without its own focus style still shows
  one; the vote box's own ring replaces the browser's, which vanished on
  a dark page.
- A card style's shadow gives way to a focus ring, which is drawn as one;
  linked help cards on filled designs lost their ring.
- Small targets reach 24px without changing their look: tags, author
  names, the composer's sign-in link and Home's roadmap links.
- The composer and the help search show a full-strength ring while typed
  in, and author names a ring as well as an underline.
- The logo link is named for whose portal it is when it shows a wordmark
  or a mark alone.
- A section heading's own colour must read at 4.5:1, as it shrinks to body
  size on a phone.
From the second keyboard sweep:

- The rich text editor is a multi-line text field named by its
  placeholder, where it had no name for a screen reader.
- The composer rings itself with an outline while typed in, which its
  animated shadow cannot draw over.
- The feed's search field fills its pill, so the whole pill is the field,
  and rings at full strength.
- A page's own buttons on the band ring in the band's ink, where the
  page's grey ring was faint on a dark band.
- Home blocks' links reach a 24px target without moving their line.
…led faces

From a review of the branded portals' typography:

- A brand's measured section headings keep its face, weight, tracking and
  colour but take a card title's size: 18px, a little more the larger the
  brand sets them, never past 24px, with tight tracking eased. A site's
  h2 introduces a screen; here it titles a card over 14-16px content, and
  at the brand's own size it outweighed everything around it.
- A headline's line grows with it, on the tiles' scale and with an exact
  headline size, so it never reads as a caption under a poster.
- Eight grotesk and geometric faces carry a light weight, for brands whose
  headlines are set light; only workspaces that choose them load it.
- nearestBundledFont maps a brand's face to itself when bundled and to the
  bundled face of its class and build when it is a well-known brand face.
  The faithful look takes them, and every look's brief names them.
A stack's first known family wins, so a brand face ahead of a Helvetica
fallback is matched as itself.
system-ui, sans-serif and the platform defaults count only when they lead
the stack, where a brand chose them.
…eave the page room

A light weight that carries a brand's 32px heading is too faint at a card
title's size, so a measured section heading is at least weight 400. A
measured headline is held under 88px: a portal's headline leads a page
of content, not a marketing screen.
Brand has an Exact values section, folded away until wanted: the
headline's size, weight, spacing, line height and colour; section
headings' size, weight and colour; buttons' corners, height, fill and
label; cards' corners, edge and shadow. A field left blank keeps what the
choices give, each value is held within its bounds, and one button clears
them all. The review list names them. The colour field is shared with the
rest of Brand.
@mortondev
mortondev force-pushed the feat/portal-design-v2-tune branch from 5da7588 to c372ef0 Compare October 31, 2026 18:22
… faithful look takes the site's main button

From judging the AI's portals against the approved goals:

- The headline is the largest h1 in sight, past hidden, screen-reader-only
  and notice elements; a size set only by a reset (h1 { font-size: 2em })
  says nothing about the brand and is left unmeasured.
- The main button is the one filled with the site's own button colour,
  where a secondary button came first in the page.
- The faithful look takes a coloured main button as its brand colour, and
  fills buttons with the text colour where the site's are near-black.
…very look words every page

- When a site fills its hero with a colour, the faithful look's band
  takes it: the brand colour when the hero is that colour, else the
  hero's colour as the second.
- Looks write the roadmap's, changelog's, help centre's and support's
  titles and lines in the brand's voice, where every page said its own
  name; the edit tool writes a page's title from plain text, a line at a
  time, as it does a headline.
- The faithful look's rules, applied after the model's choices from what
  was read and measured on the site, live in their own module.
…compiles

A look is answered under a strict schema the provider compiles into a
grammar, and past a size it refuses the request: every start then fell
back to an unbranded portal. The page words are now a flat list of eight
lines, and faces are named as plain text and checked after, a face that
is not bundled being left out. A test holds the schema at the size that
compiles, so a new field is flattened or asked for separately rather than
growing the look.
… only its colours

Asked to match a screenshot, the edit chat saw only the picture's colours,
so it could not read the layout, type or shapes it was asked to match. An
attached image now goes to the model as an image, downscaled as the looks'
start does, with its colours alongside. An answer to match a picture can
touch many fields, so it has more room; one that does not fit is asked for
once more, then without the picture.
…ounts the styles its page uses

- A site that bundles its styles into one sheet can ship it at a few
  megabytes; the reader dropped any sheet over 1 MB, so a 2 MB bundle went
  unread and the reader measured whatever sheets were left. It now reads
  up to 4 MB a sheet.
- A bundle carries styles for screens the page is not showing. A rule
  whose classes the page's HTML never uses counts a quarter towards the
  brand's colours and fonts, so a site's own buttons lead its palette
  rather than years of components it no longer shows.
…s seen bears it out

A measurement can land on the wrong element: on wise.com the reader took
an old blue button its bundle still styles for the main one, and the
faithful look's brand colour, band and headline went blue and slate over
a model that had seen the lime and forest green in the screenshot. A
measured colour now counts only when it is among the screenshot's colours,
or without a screenshot among the site's leading ones; a label's black or
white needs no evidence. Exact sizes, weights and corners still apply.
@mortondev

Copy link
Copy Markdown
Member Author

Condensed into #881. The stack is now five PRs, #878 to #882; this branch is kept as it was.

@mortondev mortondev closed this Nov 1, 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.

2 participants