diff --git a/index.html b/index.html
index ed3e149..eaa7aa3 100644
--- a/index.html
+++ b/index.html
@@ -473,7 +473,22 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat
image-rendering: pixelated; border: 2px solid var(--line); color: inherit; font: inherit;
text-align: left; cursor: pointer; -webkit-tap-highlight-color: transparent;
position: relative; }
- .last { position: absolute; top: 7px; right: 9px; font: 400 8px Silkscreen, monospace;
+ /* THE CAPTION'S VEIL (2026-08-31, Oliver: "eine blurry verlauf als hintergrund, von oben aus dem
+ nichts kommend"). A hard scrim gradient used to ride in the button's own background stack; this
+ is a BLURRED backdrop instead, masked so it begins as literally nothing at its top edge and
+ only becomes a surface where the words are. Art stays art at the top of the poster, the caption
+ gets something to sit on, and there is no box edge anywhere. */
+ #modeList button.mode::after, #modeSub button.mode::after {
+ content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 62%;
+ backdrop-filter: blur(7px) saturate(0.85);
+ -webkit-backdrop-filter: blur(7px) saturate(0.85);
+ background: linear-gradient(180deg, rgba(8,12,9,0) 0%, rgba(8,12,9,0.42) 46%, rgba(8,12,9,0.8) 100%);
+ -webkit-mask-image: linear-gradient(180deg, transparent 0%, #000 44%);
+ mask-image: linear-gradient(180deg, transparent 0%, #000 44%);
+ pointer-events: none; }
+ /* the words and the chips ride ABOVE the veil — a pseudo-element is the last thing painted */
+ #modeList .cb, #modeSub .cb { position: relative; z-index: 2; }
+ .last { position: absolute; z-index: 2; top: 7px; right: 9px; font: 400 8px Silkscreen, monospace;
color: var(--acid); background: rgba(0,0,0,0.72); padding: 3px 6px;
letter-spacing: 1px; border: 1px solid rgba(188,212,85,0.5); }
#modeList b, #modeSub b { text-shadow: 0 1px 0 #000, 0 0 6px rgba(0,0,0,0.9); }
diff --git a/src/main.js b/src/main.js
index 71f62b7..d1d3218 100644
--- a/src/main.js
+++ b/src/main.js
@@ -127,9 +127,10 @@ const modeSub = document.getElementById('modeSub');
const banner = (card, cls, last) => {
const b = document.createElement('button');
b.className = cls;
- // the scrim rides IN the background stack (gradient over art), so the caption needs no extra box
- b.style.backgroundImage =
- `linear-gradient(180deg, rgba(0,0,0,0) 34%, rgba(0,0,0,0.78)), url(assets/${card.art}.png?v=${SPRV})`;
+ // JUST THE ART. The scrim used to ride in this background stack as a hard linear-gradient; the
+ // caption sits on a BLURRED veil now (index.html, button.mode::after) that fades in out of
+ // nothing from above, and stacking the old gradient under it only doubled the darkening.
+ b.style.backgroundImage = `url(assets/${card.art}.png?v=${SPRV})`;
b.innerHTML = `${card.name}${card.sub}`
+ (last ? 'LAST' : '')
// the standing answer to "how do I advance", worn by the poster it is true of (config MODES)