Changeset ddecd9a in Klonkt


Ignore:
Timestamp:
06/14/2026 10:17:23 PM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
102d2f0
Parents:
a1c8cb8
Message:

feat: audio player three layouts — desktop mini-only, tablet/auto full-player

  • Desktop (>=1200px): NO full player anymore; the expand trigger opens nothing (JS guard) and doesn't look clickable. Mini player only.
  • Tablet/auto (768-1199px): new large, full-screen, button-friendly full-player variant (large cover + large controls) for tablets + tablet-in-the-car. Opens on tap and auto-opens on a fresh queue.
  • Phone (<768px): unchanged fullscreen sheet (breakpoint 720->768).
  • Cache busters: audio-player.js v9->v10, audio.css (new) v2.

Note: real Android Auto requires a native app; this is the web tablet/car variant.

Co-Authored-By: Claude <noreply@…>

Location:
src
Files:
3 edited

Legend:

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

    ra1c8cb8 rddecd9a  
    148148.audio-player-expand-trigger:hover {
    149149  background: color-mix(in srgb, var(--ink, #000) 6%, transparent);
     150}
     151/* DESKTOP (≥1200px): geen full player — de expand-trigger opent niets (JS),
     152   dus 'm niet als klikbaar laten ogen. */
     153@media (min-width: 1200px) {
     154  .audio-player-expand-trigger { cursor: default; }
     155  .audio-player-expand-trigger:hover { background: none; }
    150156}
    151157
     
    350356body.audio-sheet-locked { overflow: hidden; }
    351357
    352 /* MOBILE (<720px): full-width sheet, slide up from bottom */
    353 @media (max-width: 719.98px) {
     358/* TELEFOON (<768px): full-width sheet, slide up from bottom */
     359@media (max-width: 767.98px) {
    354360  .audio-sheet-panel {
    355361    /* Real full-screen, edge-to-edge, no rounded corners or shadow */
     
    371377}
    372378
    373 /* DESKTOP (≥720px): 480px wide, horizontally centered (v9 design intent).
    374    We MUST set width here because v9's style.css sets width:480px and
    375    we don't want left/right:0 stretching to override it.
    376    The -50% horizontal centering is preserved during drag by composing
    377    --pcms-drag-y into the existing translate(-50%, ...) transform. */
    378 @media (min-width: 720px) {
     379/* TABLET / AUTO (768–1199px): grote, landscape, knop-vriendelijke full-player
     380   voor tablets + een tablet-in-de-auto. Bewust full-screen + grote touch-targets.
     381   Desktop (≥1200px) opent de full player NIET (afgehandeld in audio-player.js),
     382   dus daar is geen sheet-styling nodig. */
     383@media (min-width: 768px) and (max-width: 1199.98px) {
    379384  .audio-sheet-panel {
    380     left: 50%;
    381     right: auto;
    382     width: 480px;
    383     transform: translate(-50%, 100%);
    384     border-top-left-radius: 20px;
    385     border-top-right-radius: 20px;
     385    inset: 0; left: 0; right: 0; width: auto;
     386    max-height: none;
     387    border-radius: 0;
     388    box-shadow: none;
     389    transform: translateY(100%);
     390    padding: clamp(2rem, 5vh, 4rem) clamp(2rem, 6vw, 5rem);
     391    gap: clamp(1.25rem, 3vh, 2.5rem);
     392    justify-content: center;
     393    align-items: center;
    386394  }
    387   .audio-sheet.is-open .audio-sheet-panel {
    388     transform: translate(-50%, var(--pcms-drag-y, 0px));
    389   }
     395  .audio-sheet.is-open .audio-sheet-panel { transform: translateY(var(--pcms-drag-y, 0px)); }
     396
     397  .audio-sheet-drag-zone { align-items: center; width: 100%; margin: 0; padding: 0; }
     398  .audio-sheet-cover { width: min(48vh, 460px); max-width: none; border-radius: 20px; }
     399  .audio-sheet-cover svg { width: 26%; height: 26%; }
     400  .audio-sheet-info { width: 100%; max-width: 660px; }
     401  .audio-sheet-title  { font-size: clamp(2rem, 4vw, 3rem); }
     402  .audio-sheet-artist { font-size: clamp(1.1rem, 2vw, 1.5rem); margin-top: .5rem; }
     403  .audio-sheet-album  { font-size: 1rem; margin-top: .25rem; }
     404  .audio-sheet-progress { width: 100%; max-width: 660px; gap: 1.25rem; }
     405  .audio-sheet-progress .audio-time { font-size: 1.05rem; min-width: 3.2em; }
     406  .audio-sheet-controls { gap: clamp(1.5rem, 5vw, 3.5rem); }
     407  .audio-sheet-btn { width: 76px; height: 76px; }
     408  .audio-sheet-btn svg { width: 34px; height: 34px; }
     409  .audio-sheet-play { width: 108px; height: 108px; }
     410  .audio-sheet-play svg { width: 46px; height: 46px; }
    390411}
    391412
  • src/assets/js/audio-player.js

    ra1c8cb8 rddecd9a  
    327327  // (@media max-width:719.98px). On wider/desktop widths the sheet is a centered
    328328  // panel, so we do NOT auto-open it there.
    329   function isMobileView() {
    330     return window.matchMedia('(max-width: 719.98px)').matches;
    331   }
     329  // Drie weergaves (Robin 2026-06-15): telefoon (<768) = fullscreen sheet;
     330  // tablet/auto (768–1199) = grote landscape full-player (tablet + tablet-in-de-
     331  // auto); desktop (≥1200) = alleen mini-speler, GEEN full player. matchMedia
     332  // zodat dit exact de CSS-breekpunten volgt.
     333  function playerTier() {
     334    if (window.matchMedia('(min-width: 1200px)').matches) return 'desktop';
     335    if (window.matchMedia('(min-width: 768px)').matches) return 'tablet';
     336    return 'phone';
     337  }
     338  function hasFullPlayer() { return playerTier() !== 'desktop'; }
     339  function isMobileView() { return playerTier() === 'phone'; }
    332340
    333341  function setQueue(tracks, startIdx, opts) {
     
    341349    // niet bij next/prev of de site-pre-seed — zodat een sheet die de gebruiker
    342350    // bewust sloot niet vanzelf terugkomt.
    343     if (isMobileView()) openSheet();
     351    if (hasFullPlayer()) openSheet();
    344352  }
    345353
     
    502510
    503511  function openSheet() {
     512    if (!hasFullPlayer()) return; // desktop (≥1200): geen full player, alleen mini-speler
    504513    if (sheet.classList.contains('is-open')) return;
    505514    sheet.classList.add('is-open');
    506515    sheet.setAttribute('aria-hidden', 'false');
    507516    document.body.classList.add('audio-sheet-locked');
    508     if (isMobileView()) {
    509       try { history.pushState({ pcmsSheet: true }, ''); sheetHistoryPushed = true; } catch (e) {}
    510     }
     517    // Telefoon + tablet: history-entry zodat de terug-knop eerst de sheet sluit.
     518    try { history.pushState({ pcmsSheet: true }, ''); sheetHistoryPushed = true; } catch (e) {}
    511519  }
    512520  function closeSheet(fromPopstate) {
     
    532540  document.addEventListener('keydown', (e) => {
    533541    if (e.key === 'Escape' && sheet.classList.contains('is-open')) closeSheet();
     542  });
     543  // Naar desktop-breedte (≥1200) gesleept terwijl de full player open is? Sluiten —
     544  // op desktop bestaat de full player niet.
     545  window.addEventListener('resize', () => {
     546    if (!hasFullPlayer() && sheet.classList.contains('is-open')) closeSheet();
    534547  });
    535548
  • src/views/shell.ejs

    ra1c8cb8 rddecd9a  
    168168     anywhere (admin previews, post embeds, etc). The player itself is
    169169     a singleton — see the script tag near </body>. -->
    170 <link rel="stylesheet" href="/assets/css/audio.css">
     170<link rel="stylesheet" href="/assets/css/audio.css?v=2">
    171171
    172172<%- include('partials/shared-styles') %>
     
    309309     ?v=N — cache-buster: bump bij elke audio-player.js wijziging zodat
    310310     Cloudflare (max-age=1y) niet de oude versie blijft serveren. -->
    311 <script src="/assets/js/audio-player.js?v=9"></script>
     311<script src="/assets/js/audio-player.js?v=10"></script>
    312312<% if (site && site.enable_audio_player && audioTracks && audioTracks.length > 0) { %>
    313313  <script>window.PCMS_SITE_TRACKS = <%- JSON.stringify(audioTracks) %>;</script>
Note: See TracChangeset for help on using the changeset viewer.