feat: 4 new Aaron art assets — throne BLB hero, bone squad, horned warrior, skull knight across characters + gallery pages

This commit is contained in:
2026-04-11 12:05:46 -05:00
parent 2d5f589777
commit 4ae48d7ca1
11 changed files with 208 additions and 109 deletions
+5 -4
View File
@@ -111,11 +111,12 @@ export default function Home() {
</div> </div>
<div className={styles.aboutVisual}> <div className={styles.aboutVisual}>
<Image <Image
src="/blb-logo.png" src="/char-blb-throne.png"
alt="Bone Lord Bob" alt="Bone Lord Bob on his throne"
width={400} width={500}
height={600} height={500}
className={styles.aboutLogo} className={styles.aboutLogo}
style={{ borderRadius: "8px", border: "1px solid rgba(160,100,255,0.2)" }}
priority priority
/> />
</div> </div>
+161 -92
View File
@@ -37,113 +37,89 @@ const s = {
} as React.CSSProperties, } as React.CSSProperties,
grid: { grid: {
display: "grid", display: "grid",
gridTemplateColumns: "repeat(auto-fill, minmax(280px, 1fr))", gridTemplateColumns: "repeat(3, 1fr)",
gap: "24px", gap: "20px",
marginBottom: "40px", marginBottom: "40px",
} as React.CSSProperties, } as React.CSSProperties,
card: { card: {
background: "rgba(15, 8, 24, 0.82)", background: "rgba(15, 5, 28, 0.72)",
border: "1px solid rgba(180,140,255,0.18)", border: "1px solid rgba(160, 100, 255, 0.18)",
borderRadius: "6px", borderRadius: "8px",
overflow: "hidden" as const, overflow: "hidden",
backdropFilter: "blur(6px)",
display: "flex",
flexDirection: "column" as const,
transition: "border-color 0.2s, transform 0.2s", transition: "border-color 0.2s, transform 0.2s",
} as React.CSSProperties, } as React.CSSProperties,
cardImage: { cardImage: {
position: "relative" as const,
aspectRatio: "2/3",
width: "100%", width: "100%",
background: "#06030f", aspectRatio: "2/3",
overflow: "hidden" as const, position: "relative" as const,
overflow: "hidden",
} as React.CSSProperties, } as React.CSSProperties,
cardImagePlaceholder: { cardImageWide: {
position: "absolute" as const, width: "100%",
inset: 0, aspectRatio: "3/2",
display: "flex", position: "relative" as const,
alignItems: "center", overflow: "hidden",
justifyContent: "center",
fontSize: "4rem",
opacity: 0.12,
} as React.CSSProperties, } as React.CSSProperties,
cardBody: { cardBody: {
padding: "20px 22px 24px", padding: "24px 24px 28px",
} as React.CSSProperties,
cardEmoji: {
fontSize: "2.4rem",
display: "block",
marginBottom: "16px",
} as React.CSSProperties, } as React.CSSProperties,
cardName: { cardName: {
fontFamily: "'Georgia', 'Times New Roman', serif", fontFamily: "'Georgia', 'Times New Roman', serif",
fontSize: "1.2rem", fontSize: "1.3rem",
fontWeight: 700, fontWeight: 700,
color: "#e8dcc8", color: "#e8dcc8",
marginBottom: "4px", marginBottom: "6px",
} as React.CSSProperties, } as React.CSSProperties,
cardRole: { cardRole: {
fontSize: "0.72rem", fontSize: "0.75rem",
fontWeight: 700, fontWeight: 700,
letterSpacing: "0.14em", letterSpacing: "0.12em",
textTransform: "uppercase" as const, textTransform: "uppercase" as const,
color: "#c0392b", color: "#c0392b",
marginBottom: "12px", marginBottom: "14px",
} as React.CSSProperties, } as React.CSSProperties,
cardDesc: { cardDesc: {
fontSize: "0.88rem", fontSize: "0.92rem",
color: "#9e9080", color: "#9e9080",
lineHeight: 1.7, lineHeight: 1.65,
} as React.CSSProperties,
featuredCard: {
gridColumn: "1 / -1",
display: "grid",
gridTemplateColumns: "1fr 1fr",
background: "rgba(15, 5, 28, 0.72)",
border: "1px solid rgba(192, 57, 43, 0.35)",
borderRadius: "8px",
overflow: "hidden",
backdropFilter: "blur(6px)",
} as React.CSSProperties,
featuredImage: {
position: "relative" as const,
minHeight: "420px",
} as React.CSSProperties,
featuredBody: {
padding: "48px 40px",
display: "flex",
flexDirection: "column" as const,
justifyContent: "center" as const,
} as React.CSSProperties, } as React.CSSProperties,
credit: { credit: {
textAlign: "center" as const, textAlign: "center" as const,
fontSize: "0.8rem", fontSize: "0.82rem",
color: "#9e9080", color: "#9e9080",
opacity: 0.55,
marginTop: "8px", marginTop: "8px",
letterSpacing: "0.04em", letterSpacing: "0.04em",
} as React.CSSProperties, } as React.CSSProperties,
}; };
const CHARACTERS = [
{
image: null,
emoji: "🦴",
name: "Bone Lord Bob",
role: "The Protagonist",
desc: "A man cursed to walk between worlds — carrying the weight of the dead and the rage of the living. He answers to no one.",
},
{
image: "/character-cat.jpg",
imageAlt: "Character — ???",
emoji: "🐾",
name: "???",
role: "Coming Soon",
desc: "A creature that shouldn't exist — and yet here it is, collar and all. Whatever side it's on, it has teeth.",
},
{
image: "/character-bookie.jpg",
imageAlt: "Character — ???",
emoji: "📖",
name: "???",
role: "Coming Soon",
desc: "Knowledge is power in the Bone Kingdom. This one has both — and charges accordingly. The ledger is always open.",
},
{
image: null,
emoji: "🔥",
name: "???",
role: "Coming Soon",
desc: "A figure from the oldest part of the war. Their allegiance changes everything.",
},
{
image: null,
emoji: "⚔️",
name: "???",
role: "Coming Soon",
desc: "Every legend needs its foil. Every bone lord needs someone willing to break them.",
},
{
image: null,
emoji: "🌑",
name: "???",
role: "Coming Soon",
desc: "Some figures are felt before they are seen. This one you feel first.",
},
];
export default function Characters() { export default function Characters() {
return ( return (
<SiteLayout <SiteLayout
@@ -163,31 +139,124 @@ export default function Characters() {
{/* Grid */} {/* Grid */}
<div style={s.grid}> <div style={s.grid}>
{CHARACTERS.map((c, i) => (
<div key={i} style={s.card}> {/* BLB — full-width featured card */}
{/* Art panel */} <div style={s.featuredCard}>
<div style={s.cardImage}> <div style={s.featuredImage}>
{c.image ? (
<Image <Image
src={c.image} src="/char-blb-throne.png"
alt={c.imageAlt || c.name} alt="Bone Lord Bob on his throne"
fill fill
style={{ objectFit: "cover", objectPosition: "top" }} style={{ objectFit: "cover", objectPosition: "top center" }}
sizes="(max-width: 768px) 100vw, 33vw" sizes="50vw"
priority
/> />
) : ( </div>
<div style={s.cardImagePlaceholder}>{c.emoji}</div> <div style={s.featuredBody}>
)} <span style={s.eyebrow}>The Protagonist</span>
<div style={{ ...s.cardName, fontSize: "2rem", marginBottom: "12px" }}>Bone Lord Bob</div>
<div style={{ ...s.cardRole, marginBottom: "20px" }}>Lord of the Bone Kingdom</div>
<p style={{ ...s.cardDesc, fontSize: "1rem" }}>
A man cursed to walk between worlds carrying the weight of the
dead and the rage of the living. Seated on a throne of skulls,
flanked by candlelight, commanding what others cannot name.
He answers to no one.
</p>
</div>
</div> </div>
{/* Info */} {/* Unknown character 1 — skeleton dragon-thing */}
<div style={s.card}>
<div style={s.cardImage}>
<Image
src="/char-unknown-1.jpg"
alt="Unknown character — identity unrevealed"
fill
style={{ objectFit: "cover", objectPosition: "top" }}
sizes="33vw"
/>
</div>
<div style={s.cardBody}> <div style={s.cardBody}>
<div style={s.cardName}>{c.name}</div> <div style={s.cardName}>???</div>
<div style={s.cardRole}>{c.role}</div> <div style={s.cardRole}>???</div>
<p style={s.cardDesc}>{c.desc}</p> <p style={s.cardDesc}>
The bone tag around its neck says something. No one has gotten close enough to read it.
</p>
</div> </div>
</div> </div>
))}
{/* Unknown character 2 — robed scholar */}
<div style={s.card}>
<div style={s.cardImage}>
<Image
src="/char-unknown-2.jpg"
alt="Unknown character — identity unrevealed"
fill
style={{ objectFit: "cover", objectPosition: "top" }}
sizes="33vw"
/>
</div>
<div style={s.cardBody}>
<div style={s.cardName}>???</div>
<div style={s.cardRole}>???</div>
<p style={s.cardDesc}>
A robed scholar of the dead. The book glows. The eyes glow brighter. What it reads, it remembers forever.
</p>
</div>
</div>
{/* Unknown character 3 — horned warrior */}
<div style={s.card}>
<div style={s.cardImage}>
<Image
src="/char-unknown-3.jpg"
alt="Unknown character — identity unrevealed"
fill
style={{ objectFit: "cover", objectPosition: "top" }}
sizes="33vw"
/>
</div>
<div style={s.cardBody}>
<div style={s.cardName}>???</div>
<div style={s.cardRole}>???</div>
<p style={s.cardDesc}>
She stands in armor forged from shadow and gold. The horns are not a costume. The sword is not decorative.
</p>
</div>
</div>
{/* Unknown character 4 — skull knight */}
<div style={s.card}>
<div style={s.cardImage}>
<Image
src="/char-unknown-4.jpg"
alt="Unknown character — identity unrevealed"
fill
style={{ objectFit: "cover", objectPosition: "top" }}
sizes="33vw"
/>
</div>
<div style={s.cardBody}>
<div style={s.cardName}>???</div>
<div style={s.cardRole}>???</div>
<p style={s.cardDesc}>
Skull-adorned armor. A blade that has ended things that should not have been ended. He doesn&apos;t speak. He doesn&apos;t need to.
</p>
</div>
</div>
{/* Coming Soon placeholder */}
<div style={s.card}>
<div style={s.cardBody}>
<span style={s.cardEmoji}>🔮</span>
<div style={s.cardName}>???</div>
<div style={s.cardRole}>Coming Soon</div>
<p style={s.cardDesc}>
More characters will be revealed as the story unfolds. The roster goes deeper than you think.
</p>
</div>
</div>
</div> </div>
<p style={s.credit}>Character art by Aaron Pressey</p> <p style={s.credit}>Character art by Aaron Pressey</p>
+36 -7
View File
@@ -1,4 +1,5 @@
import { useState } from "react"; import { useState } from "react";
import Image from "next/image";
import SiteLayout from "@/pages/components/SiteLayout"; import SiteLayout from "@/pages/components/SiteLayout";
type Tab = "official" | "fan"; type Tab = "official" | "fan";
@@ -136,13 +137,41 @@ export default function Gallery() {
{/* Tab content */} {/* Tab content */}
{activeTab === "official" && ( {activeTab === "official" && (
<div style={s.card}> <div>
<span style={s.cardIcon}></span> <div style={{
<div style={s.cardTitle}>Official Art</div> display: "grid",
<p style={s.cardDesc}> gridTemplateColumns: "repeat(auto-fill, minmax(300px, 1fr))",
Official artwork coming soon. gap: "16px",
<br /> marginBottom: "24px",
Art by Aaron Pressey. }}>
{[
{ src: "/char-blb-throne.png", alt: "Bone Lord Bob on his throne — art by Aaron Pressey" },
{ src: "/art-bone-squad.png", alt: "The Bone Squad — four skeletal figures — art by Aaron Pressey" },
{ src: "/char-unknown-1.jpg", alt: "Unknown character — art by Aaron Pressey" },
{ src: "/char-unknown-2.jpg", alt: "Unknown robed scholar — art by Aaron Pressey" },
{ src: "/char-unknown-3.jpg", alt: "Unknown horned warrior — art by Aaron Pressey" },
{ src: "/char-unknown-4.jpg", alt: "Unknown skull knight — art by Aaron Pressey" },
].map((img, i) => (
<div key={i} style={{
position: "relative",
aspectRatio: img.src.includes("bone-squad") ? "16/9" : "2/3",
borderRadius: "8px",
overflow: "hidden",
border: "1px solid rgba(160, 100, 255, 0.2)",
background: "rgba(15, 5, 28, 0.6)",
}}>
<Image
src={img.src}
alt={img.alt}
fill
style={{ objectFit: "cover", objectPosition: "top" }}
sizes="(max-width: 768px) 100vw, 33vw"
/>
</div>
))}
</div>
<p style={{ textAlign: "center", fontSize: "0.82rem", color: "#9e9080", marginTop: "8px" }}>
Art by Aaron Pressey · More coming soon
</p> </p>
</div> </div>
)} )}
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB