Changeset b12e20d in Klonkt


Ignore:
Timestamp:
06/19/2026 10:37:36 PM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
9163b15
Parents:
c1a4147
Message:

feat(editor): edit content as a fullscreen "page" with back button + Done

On touch: content inline = post-like preview (not typeable). Tap →
fullscreen writing page that pushes a history state, so browser back and
a clear "✓ Done" button close it and return to the form (same DOM → all
fields intact). Saving still uses the regular Save button. popstate closes
fullscreen; URL unchanged → the global nav popstate ignores it.

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

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • CHANGELOG.md

    rc1a4147 rb12e20d  
    5656  te scrollen (scroll-binnen-scroll was verwarrend). Het inline schrijfveld groeit
    5757  ook gewoon mee; typen op mobiel/tablet gaat sowieso fullscreen.
    58 - Op **mobiel & tablet** (touch) is het content-veld inline **niet meer typbaar** —
    59   het is geen tekstveld maar een tap-vlak met een "✎ Tik om te bewerken"-pill. Eén
    60   tik opent **volledig scherm**, waar het wél bewerkbaar is. Eruit met de knop (⤡)
    61   of Escape. Zo kun je nooit per ongeluk inline typen.
     58- Op **mobiel & tablet** (touch) gedraagt de inhoud zich als een post: inline is het
     59  **niet typbaar** (tap-vlak met "✎ Tik om te bewerken"-pill). Eén tik opent een
     60  **fullscreen schrijf-"pagina"** — met echte back-knop-ondersteuning, dus de
     61  browser-back of de **"✓ Klaar"-knop** sluit 'm en je staat terug in het formulier
     62  (alle velden intact), waarna je alles samen opslaat met de gewone Opslaan-knop.
    6263- Schrijfvenster kan op **volledig scherm** (knop in de editor-toolbar, of Escape om
    6364  terug te gaan) — fijn voor afleidingsvrij schrijven op mobiel. De opmaak-toolbar
  • src/views/pages/post-edit.ejs

    rc1a4147 rb12e20d  
    7777      <div class="pe-editor-frame">
    7878        <div class="pe-toolbar" id="pe-toolbar" role="toolbar" aria-label="Format">
     79          <button type="button" id="pe-fs-done" class="pe-fs-done" title="Klaar met bewerken">✓ Klaar</button>
    7980          <button type="button" data-cmd="bold" title="Vet (Ctrl+B)" aria-label="Vet">
    8081            <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 4h8a4 4 0 0 1 0 8H6z"/><path d="M6 12h9a4 4 0 0 1 0 8H6z"/></svg>
     
    461462   af, en op touch zijn de scrollbalken verborgen → geen dubbele balk nodig. */
    462463
     464/* "Klaar"-knop: alleen in fullscreen zichtbaar (links in de toolbar), duidelijke
     465   accent-pill i.p.v. een vierkant icoontje. */
     466.pe-fs-done { display: none; }
     467.pe-editor-frame.pe-fs .pe-fs-done {
     468  display: inline-flex; align-items: center;
     469  width: auto !important; height: auto !important;
     470  padding: .4rem .9rem !important; margin-right: .35rem;
     471  background: var(--accent); color: #fff;
     472  font-weight: 700; font-size: .9rem; border-radius: 999px;
     473}
     474.pe-editor-frame.pe-fs .pe-fs-done:hover { background: var(--accent); color: #fff; }
     475
    463476/* Editor body — looks like prose, behaves like a textarea */
    464477.pe-editor {
     
    12571270    editorFrame.style.height = '';
    12581271  }
    1259   function toggleFullscreen() {
     1272  function isFs() { return !!(editorFrame && editorFrame.classList.contains('pe-fs')); }
     1273  function applyFs(on) {
    12601274    if (!editorFrame) return;
    1261     const on = editorFrame.classList.toggle('pe-fs');
     1275    editorFrame.classList.toggle('pe-fs', on);
    12621276    document.body.classList.toggle('pe-fs-open', on);
    12631277    document.documentElement.classList.toggle('pe-fs-open', on);
    12641278    if (fsBtn) {
    12651279      fsBtn.setAttribute('aria-pressed', on ? 'true' : 'false');
    1266       fsBtn.title = on ? 'Verklein' : 'Volledig scherm';
     1280      fsBtn.title = on ? 'Klaar' : 'Volledig scherm';
    12671281    }
    12681282    if (window.visualViewport) {
     
    12831297    } else {
    12841298      if (isTouch) editor.blur();
    1285       // Bij verkleinen: naar de TOP van de content scrollen i.p.v. ergens onderaan
     1299      // Bij sluiten: naar de TOP van de content scrollen i.p.v. ergens onderaan
    12861300      // (footer) te blijven hangen.
    12871301      requestAnimationFrame(function () {
     
    12901304    }
    12911305  }
     1306  // De fullscreen schrijf-"pagina": openen pusht een history-state zodat de browser-
     1307  // back-knop (en de Klaar-knop) 'm sluit en je terug bent in het formulier — voelt
     1308  // als een aparte pagina, maar álle formuliervelden blijven intact (zelfde DOM).
     1309  function openFs() {
     1310    if (isFs()) return;
     1311    try { history.pushState({ peFs: true }, ''); } catch (_) {}
     1312    applyFs(true);
     1313  }
     1314  function closeFs() {
     1315    if (!isFs()) return;
     1316    if (history.state && history.state.peFs) history.back(); // → popstate sluit af
     1317    else applyFs(false);
     1318  }
     1319  function toggleFullscreen() { if (isFs()) closeFs(); else openFs(); }
     1320  window.addEventListener('popstate', function () { if (isFs()) applyFs(false); });
    12921321  if (fsBtn) fsBtn.addEventListener('click', toggleFullscreen);
     1322  var fsDoneBtn = document.getElementById('pe-fs-done');
     1323  if (fsDoneBtn) fsDoneBtn.addEventListener('click', closeFs);
    12931324  document.addEventListener('keydown', (e) => {
    1294     if (e.key === 'Escape' && editorFrame && editorFrame.classList.contains('pe-fs')) {
    1295       e.preventDefault();
    1296       toggleFullscreen();
    1297     }
     1325    if (e.key === 'Escape' && isFs()) { e.preventDefault(); closeFs(); }
    12981326  });
    12991327
     
    13061334    editor.setAttribute('data-placeholder', 'Tik om te schrijven…');
    13071335    editor.addEventListener('click', function () {
    1308       if (editorFrame && !editorFrame.classList.contains('pe-fs')) toggleFullscreen();
     1336      if (!isFs()) openFs();
    13091337    });
    13101338  }
Note: See TracChangeset for help on using the changeset viewer.