From 71ddd37711f63d6a58290ab20c247bfc8528bda3 Mon Sep 17 00:00:00 2001 From: Dejvino Date: Tue, 18 Aug 2026 16:29:09 +0200 Subject: [PATCH] A minimum variety bar in the gallery, drawn as a red line MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A visualizer that looks the same wherever it appears does not just fail to vary — it leaks between songs, because it is cast into many of them and the viewer who watches two videos ends up recognising the shot rather than the song. That makes the floor a property of the scene, so the gallery now states it and the scene has to clear it. 0.04 to start with, and honestly a starting bar rather than a derived one: set where the flat cluster measurably sits, to be raised as scenes are lifted to it. Drawn twice, because the two readings are different questions. Every meter carries a red marker at the bar, so a single row can be judged on its own. And in the default sort the list is cut by one red line where the scores cross it, which answers the browsing question — everything above that line repeats itself between songs. Also restored progressive drawing, which the caching rewrite had quietly lost: every draw had moved to the end of the build, leaving three minutes of spinner and nothing to look at. The first rows are the interesting ones, since the sort puts the repetitive scenes on top. Verified by seeding the cache with rows spanning the bar and reloading: four below, four above, the line between them, the marker at 20% of each meter, and the grade colours switching at the right place. Co-Authored-By: Claude Opus 5 --- flow-state/gallery.html | 68 +++++++++++++++++++------------- flow-state/src/checks/gallery.js | 14 +++++++ 2 files changed, 54 insertions(+), 28 deletions(-) diff --git a/flow-state/gallery.html b/flow-state/gallery.html index 6c56f5c..ec61e19 100644 --- a/flow-state/gallery.html +++ b/flow-state/gallery.html @@ -47,8 +47,10 @@ .name { font-size: 14px; color: #e6eaf2; } .fam { color: #6b7280; } .score { color: #9aa3b5; } - .meter { display: inline-block; width: 130px; height: 7px; background: #1a1e28; border-radius: 4px; overflow: hidden; vertical-align: middle; } - .meter i { display: block; height: 100%; background: #4ade80; } + .meter { position: relative; display: inline-block; width: 130px; height: 7px; background: #1a1e28; border-radius: 4px; vertical-align: middle; } + .meter i { display: block; height: 100%; background: #4ade80; border-radius: 4px 0 0 4px; } + /* The bar, on every meter, so a row can be read on its own. */ + .meter b { position: absolute; top: -2px; bottom: -2px; width: 2px; background: #ef4444; } .row.flat .meter i { background: #ef4444; } .row.thin .meter i { background: #eab308; } .blocks { color: #5c6577; font-size: 11px; } @@ -57,6 +59,11 @@ .thumbs canvas { width: 100%; display: block; background: #05070a; border-radius: 2px; aspect-ratio: 16 / 9; } .thumbs figcaption { font-size: 10px; color: #565f70; margin-top: 3px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .err { color: #f87171; } + .cutline { position: relative; border-top: 2px solid #ef4444; margin: 26px 0 24px; } + .cutline span { + position: absolute; top: -9px; left: 12px; background: #0b0d12; + padding: 0 8px; color: #ef4444; font-size: 11px; letter-spacing: .04em; + } @media (max-width: 1100px) { .thumbs { grid-template-columns: repeat(3, 1fr); } } @@ -87,7 +94,7 @@