Implements the "Frontend Theme Redo" design (decision 1a): the logged-in player portal now uses the same sidebar shell as Admin, and Admin's own My Characters view gets the same stat-tile treatment. - PlayerPortalLayout: replace the light 820px top-tab header with the Admin sidebar shell (icon nav, sticky content header with page title, signed-in footer with sign out). Reuses .admin-grid so the two logged-in experiences read as one app. - Drop the now-redundant inner <h1> from PlayerCharacters/PlayerAccount; the title lives in the sticky header. - CharacterStats: new stat-tile row (Characters / Online now / Linked account) that tolerates a restarting shard and hides until an account is linked. - AdminCharacters: render CharacterStats above the roster instead of the bare intro paragraph, matching the Player Portal Characters page. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011qPmpmVH1xGCiZoz9m9vW3
16 lines
598 B
JavaScript
16 lines
598 B
JavaScript
import GameAccounts from '../../components/GameAccounts.jsx'
|
|
import VendorSales from '../../components/VendorSales.jsx'
|
|
import { api } from '../../api/client.js'
|
|
|
|
// The logged-in player's characters. Shows the link prompt when no game account
|
|
// is linked, otherwise their characters grouped by account (shared component),
|
|
// plus their own recent vendor sales.
|
|
export default function PlayerCharacters() {
|
|
return (
|
|
<div>
|
|
<GameAccounts scope={api.player.shard} charTo={(serial) => `/player/char/${serial}`} />
|
|
<VendorSales fetchSales={api.player.shard.sales} />
|
|
</div>
|
|
)
|
|
}
|