Skip to content
KaufmannCommerce UI
Foundations · v0.1⌘ K

Kaufmann Commerce UI / Account family

Auth & Account

Sign-in, sign-up and an account shell — composition and field semantics only. These surfaces authenticate nobody, and are built so they cannot start to.

What these are not

There is no endpoint, no fetch, no storage and no session. The forms carry no action, submission is prevented, and the fields are cleared the moment the form is "submitted" so nothing typed outlives the interaction. The password input sets autocomplete="off" — a password manager should not be invited to save a credential for a form that signs nobody in.

Validation is deliberately shallow: the browser's own required and type checks, surfaced through React Aria's FieldError. That is form UX. It is not identity, and it never becomes identity without a real backend and a real security review.

The notice travels with the componentEach surface states its own limits in its own markup, rather than relying on a page to remember to say so. A composition cannot accidentally present these as working by leaving a banner off.

Sign in

Email, password, a remember toggle. Submitting shows what the next screen would say — and says plainly that nothing happened.

Live specimen

Welcome back

Sign in to see your orders and saved things.

This form is a projection. Nothing is sent, nothing is stored, and no account exists — submitting it only shows you what the next screen would look like.

New here? Create an account

Sign up

The same surface with a name field and different words. One component, two modes — not two components.

Live specimen

Make an account

So the book remembers you, and your orders find their way back.

This form is a projection. Nothing is sent, nothing is stored, and no account exists — submitting it only shows you what the next screen would look like.

Already have one? Sign in

Account shell

Where a record would live. The name is fixture text, the orders are illustrative shapes, and the notice says so before anything that could be mistaken for a ledger.

Live specimen

Posture, not status

The illustrative orders carry a posture rather than a status: one reads Confirmed, one reads Candidate. That distinction comes from the founding engines document and matters more than it looks — a projection may show that something is not yet settled, but it may never present a candidate as a fact.

Empty is the honest defaultAn account with no orders says "No orders to show" and explains why there is nothing to remember. It does not invent a history to make the layout look complete.
Astro
---
import { AuthForm, AccountShell } from "@kaufmann/ui";
---

<AuthForm client:load mode="sign-in" alternateHref="/account/sign-up/" />
<AuthForm client:load mode="sign-up" alternateHref="/account/sign-in/" />
<AccountShell account={account} />