Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/views/partials/profile-sheet.ejs

    r156baa3 re954722  
    105105          <svg class="psi-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"/></svg>
    106106          <span class="psi-label"><%= t('nav.theme_label') %></span>
    107           <span class="psi-meta" id="profile-sheet-theme-state" data-dark="<%= t('nav.dark') %>" data-light="<%= t('nav.light') %>"><%= t('nav.dark') %></span>
     107          <span class="psi-meta" id="profile-sheet-theme-state"><%= t('nav.dark') %></span>
    108108        </button>
    109109      </li>
     
    326326</style>
    327327
    328 <%# Het script van het profielblad staat in assets/js/mod/chrome.js (shaer-bqr). %>
     328<script>
     329(function() {
     330  const sheet = document.getElementById('profile-sheet');
     331  if (!sheet) return;
     332
     333  const backdrop  = document.getElementById('profile-sheet-backdrop');
     334  const panel     = sheet.querySelector('.profile-sheet-panel');
     335  const closeBtn  = document.getElementById('profile-sheet-close');
     336  const dragZone  = document.getElementById('profile-sheet-drag-zone');
     337  const themeBtn  = document.getElementById('profile-sheet-theme');
     338  const themeLbl  = document.getElementById('profile-sheet-theme-state');
     339
     340  function openSheet() {
     341    sheet.classList.add('is-open');
     342    sheet.setAttribute('aria-hidden', 'false');
     343    document.body.classList.add('profile-sheet-locked');
     344    syncTheme();
     345  }
     346  function closeSheet() {
     347    sheet.classList.remove('is-open');
     348    sheet.setAttribute('aria-hidden', 'true');
     349    document.body.classList.remove('profile-sheet-locked');
     350    panel.style.removeProperty('--pcms-drag-y');
     351  }
     352
     353  // Open: any element with [data-profile-sheet-toggle]
     354  document.addEventListener('click', function(e) {
     355    const trigger = e.target.closest('[data-profile-sheet-toggle]');
     356    if (trigger) {
     357      e.preventDefault();
     358      openSheet();
     359    }
     360  });
     361
     362  // Close: backdrop tap, handle tap, ESC, or any [data-close-sheet] item
     363  if (backdrop) backdrop.addEventListener('click', closeSheet);
     364  if (closeBtn) closeBtn.addEventListener('click', closeSheet);
     365  document.addEventListener('keydown', (e) => {
     366    if (e.key === 'Escape' && sheet.classList.contains('is-open')) closeSheet();
     367  });
     368
     369  // Menu items that navigate: close synchronously before nav fires
     370  sheet.querySelectorAll('[data-close-sheet]').forEach((el) => {
     371    el.addEventListener('click', closeSheet);
     372  });
     373
     374  // Drag-down-to-close on touch.
     375  // Uses --pcms-drag-y custom property rather than overwriting the panel's
     376  // transform string. This composes correctly with any horizontal centering
     377  // (currently none here, but the pattern matches audio-sheet for safety).
     378  let startY = 0, lastY = 0, dragging = false;
     379  function onDown(e) {
     380    if (e.pointerType !== 'touch') return;
     381    if (panel.scrollTop > 0) return;
     382    startY = lastY = e.clientY;
     383    dragging = true;
     384    panel.classList.add('is-dragging');
     385  }
     386  function onMove(e) {
     387    if (!dragging) return;
     388    lastY = e.clientY;
     389    const dy = Math.max(0, lastY - startY);
     390    panel.style.setProperty('--pcms-drag-y', dy + 'px');
     391  }
     392  function onUp() {
     393    if (!dragging) return;
     394    dragging = false;
     395    panel.classList.remove('is-dragging');
     396    const dy = lastY - startY;
     397    if (dy > 80) closeSheet();
     398    else panel.style.removeProperty('--pcms-drag-y');
     399  }
     400  if (window.PointerEvent && dragZone) {
     401    dragZone.addEventListener('pointerdown', onDown);
     402    document.addEventListener('pointermove', onMove);
     403    document.addEventListener('pointerup', onUp);
     404    document.addEventListener('pointercancel', onUp);
     405  }
     406
     407  // Theme toggle inside sheet — syncs label
     408  function syncTheme() {
     409    if (!themeLbl) return;
     410    const t = document.documentElement.getAttribute('data-theme') || 'dark';
     411    themeLbl.textContent = t === 'dark' ? '<%= t('nav.dark') %>' : '<%= t('nav.light') %>';
     412  }
     413  if (themeBtn) {
     414    themeBtn.addEventListener('click', function() {
     415      const cur = document.documentElement.getAttribute('data-theme') || 'dark';
     416      const next = cur === 'dark' ? 'light' : 'dark';
     417      document.documentElement.setAttribute('data-theme', next);
     418      try { localStorage.setItem('pcms-theme', next); } catch (e) {}
     419      syncTheme();
     420    });
     421  }
     422})();
     423</script>
Note: See TracChangeset for help on using the changeset viewer.