auth: clearer sign-in copy on the conversion gate (0.97.0)

the join form used confusing labels at the exact moment a visitor commits:
- the email field was labelled 'Guild handle email' (it is just an email)
- the password field was 'Access sigil'
- the login button was 'Enter Booth' (logging in does not go to the Booth)
- the card eyebrow was 'OPEN BOOTH' (publisher-biased; you might sign in to browse)

now: Email / Password, a clear 'Log in' button, and a neutral 'ONE ACCOUNT'
eyebrow that reinforces the single sign-on. theme stays in the heading
('Join the tavern', 'Welcome, mercenary') and the benefit points.

verified live: login shows Email/Password -> Log in; signup shows
Email/Display name/Password -> Create Account.
This commit is contained in:
artheru 2026-06-10 15:01:44 +08:00
parent 0775b79a1b
commit d05a5b110c
4 changed files with 8 additions and 7 deletions

View File

@ -17,7 +17,7 @@
@media (prefers-reduced-motion: reduce) { .app-loading-gem { animation: none; transform: rotate(45deg); } }
</style>
<meta name="description" content="amerc is the agent mercenary tavern — hire, run, publish, and remotely deliver AI agents across software boundaries. No infrastructure, just skills." />
<meta name="version" content="0.96.0-herofit" />
<meta name="version" content="0.97.0-signin" />
<link rel="icon" href="/favicon.svg" type="image/svg+xml" />
<link rel="icon" href="/app-192.png" type="image/png" sizes="192x192" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />

View File

@ -1,6 +1,6 @@
{
"name": "amerc-site",
"version": "0.96.0-herofit",
"version": "0.97.0-signin",
"private": true,
"type": "module",
"scripts": {

View File

@ -44,7 +44,7 @@ export function AuthPanel({ auth, onDone }) {
<button type="button" className={mode === 'login' ? 'active' : ''} onClick={() => setMode('login')}>Login</button>
<button type="button" className={mode === 'signup' ? 'active' : ''} onClick={() => setMode('signup')}>Sign Up</button>
</div>
<label className="px-field"><span>Guild handle email</span>
<label className="px-field"><span>Email</span>
<input type="email" autoComplete="email" value={email} onChange={(e) => setEmail(e.target.value)} placeholder="operator@vertical-site.ai" required />
</label>
{mode === 'signup' && (
@ -52,12 +52,12 @@ export function AuthPanel({ auth, onDone }) {
<input value={handle} onChange={(e) => setHandle(e.target.value)} placeholder="ironworks" />
</label>
)}
<label className="px-field"><span>Access sigil</span>
<label className="px-field"><span>Password</span>
<input type="password" autoComplete={mode === 'login' ? 'current-password' : 'new-password'} value={password} onChange={(e) => setPassword(e.target.value)} placeholder="min 6 chars" required minLength={6} />
</label>
{err && <p className="px-auth-err">{err}</p>}
<button type="submit" className="px-action px-auth-submit" disabled={busy}>
{busy ? '…' : mode === 'login' ? 'Enter Booth' : 'Create Account'}
{busy ? '…' : mode === 'login' ? 'Log in' : 'Create Account'}
</button>
<p className="px-auth-hint">{mode === 'login' ? 'New mercenary? Switch to Sign Up.' : 'The first account becomes Quartermaster (admin).'}</p>
</form>

View File

@ -10,7 +10,7 @@ import { api } from './api.js';
const Menu = ({ size = 20 }) => (<svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" aria-hidden="true"><line x1="3" y1="6" x2="21" y2="6" /><line x1="3" y1="12" x2="21" y2="12" /><line x1="3" y1="18" x2="21" y2="18" /></svg>);
const X = ({ size = 20 }) => (<svg width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" aria-hidden="true"><line x1="18" y1="6" x2="6" y2="18" /><line x1="6" y1="6" x2="18" y2="18" /></svg>);
const RELEASE = '0.96.0-herofit';
const RELEASE = '0.97.0-signin';
const NAV = [
{ id: 'home', label: 'Tavern' },
@ -397,7 +397,7 @@ function Gatehouse({ auth, setRoute }) {
</div>
<div className="gate-form">
<div className="px-board gate-board">
<header className="px-board-head"><span className="px-board-tag">OPEN BOOTH</span><h2>Welcome, mercenary</h2><p>Log in, or create your account in seconds.</p></header>
<header className="px-board-head"><span className="px-board-tag">ONE ACCOUNT</span><h2>Welcome, mercenary</h2><p>Log in, or create your account in seconds.</p></header>
<AuthPanel auth={auth} onDone={() => setRoute('booth')} />
</div>
</div>
@ -465,6 +465,7 @@ function StatusPage() {
}
const CHANGELOG = [
{ v: '0.97', date: 'Jun 2026', title: 'Clearer sign-in', notes: ['The join form now uses plain labels (Email, Password) and a clear Log in button'] },
{ v: '0.96', date: 'Jun 2026', title: 'Hero fits the fold', notes: ['The tagline, calls-to-action and live stats now sit above the fold on laptop screens'] },
{ v: '0.95', date: 'Jun 2026', title: 'Docs that flow', notes: ['Fixed dead Quickstart links and cross-linked the guides so you can click straight through'] },
{ v: '0.94', date: 'Jun 2026', title: 'Instant first call', notes: ['Minting an agent key now shows a ready-to-run curl with your key inlined'] },