Adjust Image rendering in header

there are now layers in the card header so that the image does not
overlap any readable text
This commit is contained in:
2026-08-03 17:15:03 +02:00
parent e7ecbcabc0
commit 96bcc975a7
3 changed files with 65 additions and 6 deletions
+33 -6
View File
@@ -26,6 +26,12 @@ import {
import { useLore } from "../helpers/useLore";
import { HIDE_UNIT_COMPOSITION, ShortSummaryTable } from "../fork";
// Soft left edge for the model image in the card header. Opaque over the right
// two thirds of the image box, so only the part that reaches across the stat
// line is faded.
const imageFade =
"linear-gradient(90deg, rgba(0,0,0,0) 0%, rgba(0,0,0,0.55) 16%, rgba(0,0,0,1) 36%)";
const getShortSummarySubtitle = (force) => {
const details = [];
if (force.forceDisposition) {
@@ -388,6 +394,9 @@ const Unit = ({
backgroundSize: "cover",
color: "#fff",
position: "relative",
// Keeps the header's five layers to itself, so their z-indices
// never have to be compared against the rest of the card.
isolation: "isolate",
}}
>
<div
@@ -406,6 +415,11 @@ const Unit = ({
top: 0,
width: "100%",
display: "flex",
// The model image sits between this accent bar and the text,
// as it does on the official cards. Every layer of the header
// therefore needs an explicit z-index: bar 1, image 2, text 3,
// lore 4 and 5.
zIndex: 1,
}}
>
<div
@@ -446,22 +460,29 @@ const Unit = ({
lineHeight: "1",
fontWeight: 800,
textTransform: "uppercase",
zIndex: 1,
zIndex: 3,
position: "relative",
display: "flex",
justifyContent: "space-between",
alignItems: "center",
marginBottom: 2,
// This box is as wide as the card and now lies over the image,
// where it would swallow the drag and the wheel that place the
// image. Only the glyphs need the pointer.
pointerEvents: "none",
}}
>
{name}
<span style={{ pointerEvents: "auto" }}>{name}</span>
</div>
<div className="relative flex gap-4">
<div className="pointer-events-none relative z-[3] flex gap-4">
<div
style={{
display: "flex",
flexDirection: "column",
gap: 6,
// See the note on the name above. The stat boxes are narrow,
// but the box around them reaches the far edge of the card.
pointerEvents: "auto",
}}
>
{modelStats.map((model, index) => (
@@ -489,7 +510,7 @@ const Unit = ({
top: 0,
bottom: 0,
width: "40%",
zIndex: 101,
zIndex: 4,
pointerEvents: "none",
background:
"linear-gradient(90deg, rgba(0,0,0,0) 0%, rgba(0,0,0,.55) 40%, rgba(0,0,0,.7) 100%)",
@@ -502,7 +523,7 @@ const Unit = ({
top: 0,
bottom: 0,
width: "29%",
zIndex: 102,
zIndex: 5,
display: "flex",
alignItems: "center",
padding: "30px 14px 14px 6px",
@@ -547,8 +568,14 @@ const Unit = ({
height: "100%",
bottom: 0,
width: hasLore ? "40%" : "60%",
zIndex: 100,
zIndex: 2,
overflow: "hidden",
// A picture wider than its box would otherwise end at a hard
// vertical edge over the stat line. The official cards let it
// fade into the dark background instead. The mask fades the
// image itself, so the background stays untouched.
maskImage: imageFade,
WebkitMaskImage: imageFade,
}}
>
{hasImage && <ImgEditor image={image} name={name} />}
+12
View File
@@ -208,6 +208,18 @@
}
@media print {
/* The cards get cut apart, so the white border around a cut card comes
from two different places: the page margin on the outer edges, and
half of the gap between two cards on the edges in between. The gap is
therefore twice the page margin, and every edge ends up the same. */
@page {
margin: 8mm;
}
.avoid-page-break {
margin-bottom: 16mm !important;
}
.print-display-none,
.print-display-none * {
display: none !important;