polish: reduced-motion guard + sign-in host greeter (3.3.0)

- prefers-reduced-motion stills the painted scene's float/flicker/bob
  loops (ptbob/flicker/pulse, gm-bub-float, solbob, life pulse, cursor
  blink, apb drop, villa twinkle/flicker/wave, scroll reveals)
- the elf host greets you with a face-cropped portrait on the sign-in gate

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
artheru 2026-06-11 14:36:03 +08:00
parent 39e87dfa6f
commit 33d89c6b4a
4 changed files with 20 additions and 4 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="3.2.0-pty" />
<meta name="version" content="3.3.0-polish" />
<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": "3.2.0-pty",
"version": "3.3.0-polish",
"private": true,
"type": "module",
"scripts": {

View File

@ -12,7 +12,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 = '3.2.0-pty';
const RELEASE = '3.3.0-polish';
const NAV = [
{ id: 'home', label: 'Tavern' },
@ -414,7 +414,10 @@ 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">ONE ACCOUNT</span><h2>Welcome, mercenary</h2><p>Log in, or create your account in seconds.</p></header>
<header className="px-board-head">
<span className="gate-greeter" aria-hidden="true" />
<span className="px-board-tag">ONE ACCOUNT</span><h2>Welcome, mercenary</h2><p>The host greets you at the gate log in, or create your account in seconds.</p>
</header>
<AuthPanel auth={auth} onDone={() => setRoute('legion')} />
</div>
</div>
@ -482,6 +485,7 @@ function StatusPage() {
}
const CHANGELOG = [
{ v: '3.3', date: 'Jun 2026', title: 'Calmer, and a greeter', notes: ['The painted scene now holds still for anyone who prefers reduced motion', 'The host greets you with a portrait on the sign-in gate'] },
{ v: '3.2', date: 'Jun 2026', title: 'A native web terminal', notes: ['The Web PTY now runs on amerc itself — no relay: it streams the agents live terminal and sends your keystrokes (Enter, arrows, Ctrl-C, paste) straight through', 'Open it from a soldier in My Legion (Terminal tab) or from any agent you use'] },
{ v: '3.1', date: 'Jun 2026', title: 'The tavern breathes', notes: ['Lantern glow flickers and the bar light pulses over the painted scene', 'On phones the tavern reads cleanly with big tap targets for Browse, Legion and Mansion'] },
{ v: '3.0', date: 'Jun 2026', title: 'A painted tavern', notes: ['The home tavern is now a hand-painted scene — an elf host, an orc bartender and a dwarf patron in a lamplit hall — replacing the old pixel tiles', 'Every painted fixture is still a door: the board opens the roster, the barkeep signs you in, the elf pitches the tour, the side passages lead to your Legion and Mansion'] },

View File

@ -1963,3 +1963,15 @@ button {
.pty-screen.ro { cursor: default; }
.pty-hint { margin: 0; }
.pty-hint code { font-size: 11px; }
/* respect reduced-motion: still the painted scene + decorative loops (3.3) */
@media (prefers-reduced-motion: reduce) {
.pt-ch, .pt-elf-wrap, .pt-bub-orc, .pt-bub-dwarf, .pt-glow,
.gm-bub-float, .lg-sol.alive .lg-sol-fig, .ch-dot.online, .apb-life.on,
.gm-cursor, .apb-merc, .mn-villa-star, .mn-win, .mn-villa-flag i,
.cl-item, .reveal { animation: none !important; }
.reveal { opacity: 1 !important; transform: none !important; }
}
/* painted host greeter on the sign-in gate (3.3) */
.gate-greeter { display: block; width: 84px; height: 84px; border-radius: 50%; margin: 0 auto 10px; border: 2px solid #6a5a9a; box-shadow: 0 0 20px rgba(127,233,255,0.32); background-color: #15102a; background-image: url(/scene2d/painted/elf.webp); background-repeat: no-repeat; background-size: 240% auto; background-position: 50% 5%; }