feat(web): rework mod page header layout
Show the game name and thumbnail in the header, float the action buttons and object GUID to the right, and keep the viewer icon, label, and GUID on one line.
This commit is contained in:
@@ -41,13 +41,24 @@ export default function ModPage() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="space-y-6">
|
<div className="space-y-6">
|
||||||
<div>
|
<div className="flex items-start gap-4">
|
||||||
<h1 className="text-2xl font-semibold">Mod {id}</h1>
|
{item?.previewImageUrl && (
|
||||||
<p className="mt-1 text-sm text-zinc-400">
|
<img
|
||||||
{mod.GameMode} · {mod.Date} · {tree.length} objects · {refs.length}{' '}
|
src={item.previewImageUrl}
|
||||||
asset refs
|
alt={item.title}
|
||||||
</p>
|
className="h-20 w-20 shrink-0 rounded-lg border border-zinc-800 object-cover"
|
||||||
<div className="mt-3 flex gap-2">
|
/>
|
||||||
|
)}
|
||||||
|
<div className="min-w-0 flex-1">
|
||||||
|
<h1 className="truncate text-2xl font-semibold">
|
||||||
|
{item?.title ?? `Mod ${id}`}
|
||||||
|
</h1>
|
||||||
|
<p className="mt-1 text-sm text-zinc-400">
|
||||||
|
<span className="font-mono">{id}</span> · {mod.GameMode} ·{' '}
|
||||||
|
{mod.Date} · {tree.length} objects · {refs.length} asset refs
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div className="flex shrink-0 gap-2">
|
||||||
<a
|
<a
|
||||||
href={modFileUrl(id!, item?.fileUrl)}
|
href={modFileUrl(id!, item?.fileUrl)}
|
||||||
className="inline-block rounded-lg bg-zinc-100 px-4 py-2 text-sm font-medium text-zinc-900 hover:bg-zinc-300"
|
className="inline-block rounded-lg bg-zinc-100 px-4 py-2 text-sm font-medium text-zinc-900 hover:bg-zinc-300"
|
||||||
@@ -75,20 +86,23 @@ export default function ModPage() {
|
|||||||
<section className="rounded-lg border border-zinc-800 bg-zinc-900 p-4">
|
<section className="rounded-lg border border-zinc-800 bg-zinc-900 p-4">
|
||||||
{selected ? (
|
{selected ? (
|
||||||
<>
|
<>
|
||||||
<header className="mb-4">
|
<header className="mb-4 flex items-center gap-2">
|
||||||
<span
|
<span
|
||||||
title={selected.object.Name}
|
title={selected.object.Name}
|
||||||
className="inline-flex items-center gap-1 text-zinc-400"
|
className="inline-flex shrink-0 items-center gap-1 text-zinc-400"
|
||||||
>
|
>
|
||||||
{iconsForObject(selected.object.Name).map((icon) => (
|
{iconsForObject(selected.object.Name).map((icon) => (
|
||||||
<Icon key={icon} icon={icon} className="h-5 w-5" />
|
<Icon key={icon} icon={icon} className="h-5 w-5" />
|
||||||
))}
|
))}
|
||||||
</span>
|
</span>
|
||||||
<h2 className="mt-1 text-lg font-semibold">{selected.label}</h2>
|
<h2 className="min-w-0 flex-1 truncate text-lg font-semibold">
|
||||||
<p className="font-mono text-xs text-zinc-500">
|
{selected.label}
|
||||||
|
</h2>
|
||||||
|
<span className="shrink-0 font-mono text-xs text-zinc-500">
|
||||||
{selected.object.GUID}
|
{selected.object.GUID}
|
||||||
</p>
|
</span>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
{Viewer && (
|
{Viewer && (
|
||||||
<ErrorBoundary>
|
<ErrorBoundary>
|
||||||
<Suspense
|
<Suspense
|
||||||
|
|||||||
Reference in New Issue
Block a user