2 Commits

Author SHA1 Message Date
umbra audio
d1b19fbdb3 Update the site icon and wire the UI to email login
Icon: the supplied artwork is now UmbraTrans_Icon2_899x920.jpg, gold and
cyan on white, with the wordmark corrected to "UmbraTrans". It is copied
verbatim to web/assets/umbratrans-icon.jpg as the source, and
web/assets/umbratrans-emblem.png is derived from it and is what the pages
load: the book cropped to its ink bounds, the white page made transparent
by flood-filling inward from the corners so the white lettering inside
the book survives, letterboxed square rather than side-trimmed so no part
of the emblem is cut, and emitted at 256px.

A square crop of a 827x695 emblem has to choose between trimming the
sides and letterboxing, and trimming was cutting the book's frame. The
glow also moved from box-shadow to filter, because a box-shadow follows
the border box rather than the artwork's alpha and would have drawn a
glowing rectangle behind a book-shaped emblem.

The UI was still written against username login, so the sign-in form
could not have worked against the API: it posted {username, password} and
LoginRequest requires {email, password}. Fixed, along with the rest of
the email-verification flow that had no UI at all:

- the sign-in form collects an email address, and its copy says so;
- a 403 email_not_verified, which is only ever reached once the password
  is already proven correct, reveals a panel offering a new link. The
  resend wording is the server's and is identical for real and unknown
  addresses;
- a confirmation view accepts a pasted link or token, and one is opened
  automatically when the URL carries a token, which is then stripped from
  the address bar so it is not left in history;
- the password-policy hint read the sign-in field to tell the user their
  password must avoid their "account name", but the rule checks the
  account's username. It now uses the signed-in account's handle, and
  says nothing rather than the wrong thing when there is no handle;
- the provision form called email optional while the API requires it,
  and let a member be created with no organization, which the store
  rejects. Both are caught client-side now with wording that names the
  field to fix;
- `serve` accepts --repository postgres, so the app can be exercised
  against the authoritative store.

Verified against a live server on PostgreSQL: sign-in with the email
address, forced first-password change, provisioning an invited member,
401 for a wrong password and 403 email_not_verified for the right one,
and byte-identical resend answers for a real and an unknown address.
2026-09-26 22:05:35 -07:00
umbra audio
37b2056808 Add UmbraTrans UI prototype and integration design 2026-09-26 07:57:11 -07:00