source: Klonkt/src/assets/js/mod/post.js@ 0db68bd

main
Last change on this file since 0db68bd was 0db68bd, checked in by roboburr <roboburr@…>, 5 weeks ago

De post-pagina uit inline script naar een module (shaer-bqr, stap 3a)

Het remote-reply-veld ("beantwoorden vanaf je eigen server"). Kwam je op een post
via een link BINNEN de site, dan werd dat script geweigerd en deed de knop niets
-- precies op de plek waar de meeste bezoekers binnenkomen.

Kon ONGEWIJZIGD mee: alles al gedelegeerd op document, geen enkel pagina-element
vastgehouden, en er stond al een slot op. Dat is geen toeval -- het is geschreven
voor een popover die een htmx-swap moet overleven. Waar dat al zo is, is de
verhuizing puur verplaatsen.

Suite 556/556.

  • Property mode set to 100644
File size: 3.1 KB
Line 
1// De post-pagina: het "beantwoorden vanaf je eigen server"-veld (shaer-bqr).
2//
3// Stond inline in pages/post.ejs. Kwam je op een post via een link BINNEN de
4// site, dan arriveerde dat script via htmx met een nonce die het document niet
5// kent en weigerde de CSP het (shaer-0i6) -- dus deed de knop niets, precies op
6// de plek waar de meeste bezoekers binnenkomen.
7//
8// Kon ongewijzigd mee: alles is al gedelegeerd op document, er wordt geen enkel
9// pagina-element vastgehouden, en er staat een slot op. Dat is niet toevallig --
10// het is geschreven voor een popover die na een htmx-swap moet blijven werken.
11
12 (function(){
13 if (window.__fediRemoteWired) return; window.__fediRemoteWired = true;
14 var current = null, currentBtn = null;
15 function close(){ if (current) { current.remove(); current = null; currentBtn = null; } }
16 function go(raw, uri){
17 var d = (raw||'').trim().replace(/^@?[^@\s]*@/, '').replace(/^https?:\/\//i, '').replace(/\/.*$/, '').trim();
18 if (d) { try { localStorage.setItem('pcmsFediServer', d); } catch(e){} location.href = 'https://' + d + '/authorize_interaction?uri=' + encodeURIComponent(uri||''); }
19 }
20 function place(f, b){
21 var r = b.getBoundingClientRect();
22 f.style.top = (r.bottom + window.scrollY + 6) + 'px';
23 f.style.left = Math.max(8, Math.min(r.left + window.scrollX, window.scrollX + window.innerWidth - 340)) + 'px';
24 }
25 document.addEventListener('click', function(e){
26 if (e.target.closest && e.target.closest('.fedi-remote-cancel')) { close(); return; }
27 if (current && e.target.closest && e.target.closest('.fedi-remote-form')) return; // click inside → keep
28 var b = e.target.closest && e.target.closest('.fedi-remote-reply-btn');
29 if (b) {
30 e.preventDefault();
31 if (currentBtn === b) { close(); return; } // toggle off
32 close();
33 var f = document.createElement('form');
34 f.className = 'fedi-remote-form';
35 f.dataset.uri = b.getAttribute('data-fedi-uri') || '';
36 f.innerHTML = '<input type="text" autocomplete="off" spellcheck="false">'
37 + '<button type="submit" class="btn btn-primary fedi-remote-go" aria-label="ok">&rarr;</button>'
38 + '<button type="button" class="fedi-remote-cancel" aria-label="x">&times;</button>';
39 var _inp = f.querySelector('input');
40 _inp.placeholder = b.getAttribute('data-fedi-ph') || 'mastodon.social';
41 try { var _sv = localStorage.getItem('pcmsFediServer'); if (_sv) _inp.value = _sv; } catch(e){}
42 document.body.appendChild(f); // floating popover → no layout reflow
43 place(f, b); current = f; currentBtn = b;
44 _inp.focus(); _inp.select();
45 return;
46 }
47 if (current) close(); // click anywhere else closes it
48 });
49 document.addEventListener('submit', function(e){
50 var f = e.target.closest && e.target.closest('.fedi-remote-form');
51 if (!f) return; e.preventDefault();
52 go(f.querySelector('input').value, f.dataset.uri);
53 });
54 document.addEventListener('keydown', function(e){ if (e.key === 'Escape') close(); });
55 window.addEventListener('scroll', close, true);
56 })();
57
Note: See TracBrowser for help on using the repository browser.