From 374440a392e5030a5b880c9a2464a416b9f8ac8f Mon Sep 17 00:00:00 2001 From: artheru Date: Thu, 11 Jun 2026 09:14:10 +0800 Subject: [PATCH] =?UTF-8?q?browse:=20the=20roster=20door=20=E2=80=94=20mer?= =?UTF-8?q?cenaries=20descend=20with=20bubble=20briefs=20(2.1.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AgentBrowse is a doorway: a glowing open-door graphic, then mercs descend (staggered drop animation) hanging on wooden sign-bubbles that show each agent's brief; portraits carry a live/offline dot + managed crest - ClassModal rebuilt on the shared GameDialog (extracted to GameDialog.jsx to avoid a Scene2D<->AgentPlatform circular import); instances render as a squad β€” living soldiers (online) vs fallen (down) - verified locally against a seeded backend (6 mercs, squad dialog) Co-Authored-By: Claude Fable 5 --- index.html | 2 +- package.json | 2 +- src/AgentPlatform.jsx | 133 ++++++++++++++++++++++++------------------ src/GameDialog.jsx | 27 +++++++++ src/Scene2D.jsx | 27 +-------- src/styles.css | 53 +++++++++++++++++ 6 files changed, 160 insertions(+), 84 deletions(-) create mode 100644 src/GameDialog.jsx diff --git a/index.html b/index.html index dd691f3..2e7d3d8 100644 --- a/index.html +++ b/index.html @@ -17,7 +17,7 @@ @media (prefers-reduced-motion: reduce) { .app-loading-gem { animation: none; transform: rotate(45deg); } } - + diff --git a/package.json b/package.json index e37b53b..5b14bcb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "amerc-site", - "version": "2.0.0-tavern", + "version": "2.1.0-roster", "private": true, "type": "module", "scripts": { diff --git a/src/AgentPlatform.jsx b/src/AgentPlatform.jsx index 4f2730a..82b53f2 100644 --- a/src/AgentPlatform.jsx +++ b/src/AgentPlatform.jsx @@ -2,6 +2,7 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'; import { api } from './api.js'; import { copyToast } from './toast.js'; import ChatPanel, { SessionLog } from './Chat.jsx'; +import { GameDialog } from './GameDialog.jsx'; const STATUS_COLOR = { online: '#36f0b0', pending: '#f2b85f', lost: '#ff9f5a', down: '#ff7a8c' }; const TAG_EMOJI = { backend: 'πŸ› οΈ', model: '🧠', frontend: '🎨', ui: 'πŸ–ŒοΈ', web: '🌐', data: 'πŸ“Š', devops: 'βš™οΈ', ml: 'πŸ€–', security: 'πŸ”', api: 'πŸ”Œ', bot: 'πŸ€–', chat: 'πŸ’¬', test: 'πŸ§ͺ', docs: 'πŸ“„', design: '✏️', ops: '🚦', research: 'πŸ”¬' }; @@ -77,13 +78,17 @@ export function AgentBrowse({ auth, setRoute }) { }, [classes]); return ( -
-
-
-

The mercenary roster

-

Hire a ready-made agent by skill and tag β€” chat with it, embed it on your site, or drive its terminal. Bring your own and it joins the roster.

+
+
+ +
+

βš” The mercenary roster

+

Open the door and the mercenaries come down. Hire one β€” chat, embed, or drive its terminal. {loaded ? {classes.length} answering the call. : 'Mustering…'}

+ setQ(e.target.value)} />
- setQ(e.target.value)} />
@@ -92,38 +97,51 @@ export function AgentBrowse({ auth, setRoute }) { ))}
{err &&

{err}

} -
- {!loaded && Array.from({ length: 3 }).map((_, i) => ( -