Changeset 2eca083 in Klonkt


Ignore:
Timestamp:
06/28/2026 11:05:58 AM (2 months ago)
Author:
Robin Genis <roboburr@…>
Branches:
main
Children:
69a10e7
Parents:
73cffc3
Message:

fix(images): render grid + related covers as <img> (no jagged downscaling)

High-res line-art covers went jagged when shrunk into the small grid tiles / related cards
because they were CSS background-images (lower-quality GPU downscaling, worse on the
transform:scale(0.98) hover layer). Switched both to a real <img object-fit:cover>, which
browsers downsample with the high-quality image pipeline.

  • views/partials/post-tile.ejs — grid cover = <img class=grid-tile-img>
  • views/pages/post.ejs — related cover = <img class=post-related-img>
  • assets/css/style.css — .grid-tile-img (absolute, object-fit:cover)
  • views/shell.ejs — style.css cache buster v58
Location:
src
Files:
4 edited

Legend:

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

    r73cffc3 r2eca083  
    23812381.post-list-cover img,
    23822382.grid-tile:not(.grid-tile-gradient) { background-color: #fff; }
     2383/* Cover as a real <img> (not background-image): browsers downsample <img> with the
     2384   high-quality image pipeline, so high-res line-art covers don't go jagged when shrunk. */
     2385.grid-tile-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: center; display: block; }
    23832386.grid-tile:hover { transform: scale(0.98); }
    23842387.grid-tile-overlay {
  • src/views/pages/post.ejs

    r73cffc3 r2eca083  
    177177               hx-push-url="/<%= rp.slug %>" hx-indicator="#pcms-loading"<% } %>>
    178178              <% if (rp.cover_image_url) { %>
    179                 <span class="post-related-cover<%= rp.nsfw ? ' nsfw-media' : '' %>"
    180                       style="background-image: url('<%= rp.cover_image_url %>')"
    181                       aria-hidden="true"><% if (rp.nsfw) { %><span class="nsfw-veil"><span class="nsfw-veil-label">🔞 <%= rp.content_warning || t('post.nsfw_warning') %></span><span class="nsfw-veil-btn"><%= t('post.nsfw_show') %></span></span><% } %></span>
     179                <span class="post-related-cover<%= rp.nsfw ? ' nsfw-media' : '' %>" aria-hidden="true"><img class="post-related-img" src="<%= rp.cover_image_url %>" alt="" loading="lazy" decoding="async"><% if (rp.nsfw) { %><span class="nsfw-veil"><span class="nsfw-veil-label">🔞 <%= rp.content_warning || t('post.nsfw_warning') %></span><span class="nsfw-veil-btn"><%= t('post.nsfw_show') %></span></span><% } %></span>
    182180              <% } else { %>
    183181                <span class="post-related-cover post-related-cover--empty<%= rp.nsfw ? ' nsfw-media' : '' %>" aria-hidden="true"><% if (rp.nsfw) { %><span class="nsfw-veil"><span class="nsfw-veil-label">🔞 <%= rp.content_warning || t('post.nsfw_warning') %></span><span class="nsfw-veil-btn"><%= t('post.nsfw_show') %></span></span><% } %></span>
     
    450448.post-related-cover {
    451449  display: block;
     450  position: relative;
     451  overflow: hidden;
    452452  aspect-ratio: 16 / 10;
    453453  background: var(--paper-2) center/cover no-repeat;
    454454}
     455.post-related-img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block; }
    455456.post-related-cover--empty {
    456457  background-image: linear-gradient(135deg,
  • src/views/partials/post-tile.ejs

    r73cffc3 r2eca083  
    1616<a class="grid-tile<%= _hasCover ? '' : ' grid-tile-gradient' %><%= (_isPinned || _isBoost) ? ' is-pinned' : '' %><%= post.nsfw ? ' nsfw-media' : '' %>"
    1717   href="<%= _href %>"
    18    <% if (_hasCover) { %>style="background-image: url('<%= post.cover_image_url %>'); --tile-hue: <%= _tileHue %>;"<% } else { %>style="--tile-hue: <%= _tileHue %>;"<% } %>
     18   style="--tile-hue: <%= _tileHue %>;"
    1919   <% if (_ext) { %>target="_blank" rel="noopener"<% } else { %>hx-get="<%= _href %>?partial=1" hx-target="#pcms-main" hx-swap="innerHTML" hx-push-url="<%= _href %>" hx-indicator="#pcms-loading"<% } %>>
     20
     21  <% if (_hasCover) { %><img class="grid-tile-img" src="<%= post.cover_image_url %>" alt="" loading="lazy" decoding="async"><% } %>
    2022
    2123  <% if (_typeLabel) { %>
  • src/views/shell.ejs

    r73cffc3 r2eca083  
    198198
    199199<!-- v9 stylesheet (full palette system) -->
    200 <link rel="stylesheet" href="/assets/css/style.css?v=57">
     200<link rel="stylesheet" href="/assets/css/style.css?v=58">
    201201<script>
    202202/* iOS safe-area, built by hand. env(safe-area-inset-top) resolves to 0 on this iOS in
Note: See TracChangeset for help on using the changeset viewer.