Changeset 1f640ff in Klonkt


Ignore:
Timestamp:
07/30/2026 12:04:21 PM (6 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
f9b1c5c
Parents:
6dd26e5
Message:

Audio-tegel: golfvorm en titel elk hun eigen band, en balkjes ipv de rauwe golf

De titel stond dwars door de golfvorm heen (Robins schermafdruk): de
golfvorm hing absoluut gecentreerd en de flex-tegel centreerde de titel
er bovenop. Nu heeft elk zijn eigen band: golfvorm in de bovenhelft
(8-54 procent), titel op 60 procent, bronregel op 76. De maten staan
expliciet: een absoluut gepositioneerde img valt bij width/height auto
terug op zijn intrinsieke maat en de band klapte dicht.

En de golfvorm zelf is mooier (Robins tweede vraag): geen harige rauwe
golf meer maar balkjes in SoundCloud-stijl. Peak en average worden op 57
kolommen gesampled (zachte piek-top over heldere kern), nearest-neighbor
opgeblazen tot balkjes van 14px, en drawgrid wist er transparante
spleetjes van 5px tussen (c=black@0 met replace=1 schrijft echte
transparantie).

Changed files:
src/routes/activitypub.js

  • het showwavespic-recept vervangen door de gelaagde balkjes-graph

src/views/partials/post-tile.ejs

  • grid-tile-audio-klasse op de anchor als er een golfvorm is

src/assets/css/style.css

  • grid-tile-wave: expliciete band (top 8, hoogte 46, breedte 84)
  • grid-tile-audio: titel op 60 procent, bronregel op 76

remarks: geometrie numeriek geverifieerd in een browser-preview (golf
17.6-44.4 procent, titel 60-65.2, 58px ruimte, gradient intact) en het
balkjes-recept visueel beoordeeld op een tegel-gradient-compositie. De
bestaande audiopost houdt zijn oude dunne golfvorm-png; een verse upload
krijgt de balkjes. 345 tests groen.

-robo
Co-Authored-By: Claude Opus 4.8 <noreply@…>

Location:
src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/assets/css/style.css

    r6dd26e5 r1f640ff  
    24232423/* Audio tile (Shaer, Robins vraag 30-7): the waveform PNG is white on
    24242424   transparent and floats OVER the tile's own hue gradient, so every audio
    2425    post keeps its color and gets its shape. Contain + padding leaves the
    2426    centered title readable. */
     2425   post keeps its color and gets its shape. Wave and title each get their
     2426   own band (wave upper, title lower): centering both stacked them right
     2427   through each other (Robins schermafdruk). */
    24272428.grid-tile-img.grid-tile-wave {
    24282429    background-color: transparent;
    24292430    object-fit: contain;
    2430     padding: 26% 10%;
     2431    /* explicit box, not auto: an absolutely positioned img falls back to its
     2432       intrinsic size when width/height are auto, collapsing the band */
     2433    top: 8%; left: 8%; right: auto; bottom: auto;
     2434    width: 84%; height: 46%;
    24312435    opacity: .85;
    24322436}
     2437.grid-tile-audio .grid-tile-title { position: absolute; left: 10%; right: 10%; top: 60%; }
     2438.grid-tile-audio .grid-tile-gradient-src { position: absolute; left: 10%; right: 10%; top: 76%; }
    24332439/* Cover videos are decorative, not players: let clicks + right-click pass through to the
    24342440   tile link so you get the normal link menu (not the browser's <video> menu/controls).
  • src/routes/activitypub.js

    r6dd26e5 r1f640ff  
    357357    // audio-tegel op): ffmpeg draws the waveform into <name>.poster.png.
    358358    // White on transparent, so the tile's own gradient stays the backdrop
    359     // and every audio post keeps its own hue.
     359    // and every audio post keeps its own hue. The shape is bars, not the
     360    // raw hairy wave (Robins tweede vraag): peak and average sampled into
     361    // 57 columns (soft tip over bright core), blown up nearest-neighbor to
     362    // 14px bars, and drawgrid ERASES 5px gaps (c=black@0 + replace=1 writes
     363    // transparent pixels; h=2*ih keeps horizontal grid lines out of frame).
    360364    if (mime.startsWith('audio/')) {
    361365      Promise.all([import('child_process'), import('ffmpeg-static')]).then(([{ execFile }, ff]) => {
     
    363367        if (!bin) return;
    364368        const poster = req.file.path + '.poster.png';
    365         execFile(bin, ['-hide_banner', '-loglevel', 'error', '-y', '-i', req.file.path, '-filter_complex', 'showwavespic=s=800x256:colors=white', '-frames:v', '1', poster],
     369        const graph = '[0:a]aformat=channel_layouts=mono,asplit[a][b];'
     370          + '[a]showwavespic=s=57x256:colors=white@0.5:filter=peak:scale=sqrt:draw=full[pk];'
     371          + '[b]showwavespic=s=57x256:colors=white:filter=average:scale=sqrt:draw=full[av];'
     372          + '[pk][av]overlay=format=auto,scale=798:256:flags=neighbor,drawgrid=w=14:h=2*ih:t=5:c=black@0:replace=1';
     373        execFile(bin, ['-hide_banner', '-loglevel', 'error', '-y', '-i', req.file.path, '-filter_complex', graph, '-frames:v', '1', poster],
    366374          { timeout: 30000 }, (e) => { if (e && e.code !== 'ENOENT') console.warn('[media] waveform failed:', e.message); });
    367375      }).catch(() => { /* never blocks the upload */ });
  • src/views/partials/post-tile.ejs

    r6dd26e5 r1f640ff  
    4343const _ext = !!_external;
    4444%>
    45 <a class="grid-tile<%= _showCover ? '' : ' grid-tile-gradient' %><%= (_isPinned || _isBoost) ? ' is-pinned' : '' %><%= post.nsfw ? ' nsfw-media' : '' %>"
     45<a class="grid-tile<%= _showCover ? '' : ' grid-tile-gradient' %><%= _cWave ? ' grid-tile-audio' : '' %><%= (_isPinned || _isBoost) ? ' is-pinned' : '' %><%= post.nsfw ? ' nsfw-media' : '' %>"
    4646   href="<%= _href %>"
    4747   style="--tile-hue: <%= _tileHue %>;"
Note: See TracChangeset for help on using the changeset viewer.