- Timestamp:
- 08/07/2026 12:00:22 PM (5 weeks ago)
- Branches:
- main
- Children:
- 4c1e327
- Parents:
- ea138c0
- git-author:
- Robin <roboburr@…> (08/07/2026 12:00:20 PM)
- git-committer:
- roboburr <roboburr@…> (08/07/2026 12:00:22 PM)
- Location:
- src/views
- Files:
-
- 2 edited
-
partials/bottom-tab.ejs (modified) (1 diff)
-
shell.ejs (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/views/partials/bottom-tab.ejs
rea138c0 r1e172f3 302 302 </style> 303 303 304 <script> 305 // Bottom-tab search button → opens #search-overlay. Using event delegation + looking 306 // up the overlay on EVERY click: the overlay lives in the chrome that is OOB-replaced 307 // during htmx navigation, so a once-captured reference goes stale 308 // (button did nothing afterwards). Guard against double-wiring. 309 (function() { 310 if (window.__btSearchWired) return; 311 window.__btSearchWired = true; 312 document.addEventListener('click', function(e) { 313 if (!e.target.closest || !e.target.closest('#bottom-tab-search-toggle')) return; 314 var o = document.getElementById('search-overlay'); 315 if (o) { o.hidden = false; var i = o.querySelector('input'); if (i) i.focus(); } 316 }); 317 })(); 318 </script> 304 <%# De zoekknop zit nu in de chrome-module (assets/js/mod/chrome.js). 305 Inline script hier wordt door de CSP geweigerd zodra deze partial via htmx 306 binnenkomt, en dat is bij elke navigatie -- zie shaer-0i6. %> -
src/views/shell.ejs
rea138c0 r1e172f3 339 339 </head> 340 340 341 <body class="<%= bodyClass || 'on-home' %> has-bottom-tab" data- feed-view="<%- _e(safeSite.feed_view_default || 'timeline') %>" data-grid-cols="3" data-site-base="<%- _e((typeof siteUrlBase !== 'undefined' && siteUrlBase) ? siteUrlBase : '') %>">341 <body class="<%= bodyClass || 'on-home' %> has-bottom-tab" data-js="chrome<%= (typeof pageJs !== 'undefined' && pageJs) ? ' ' + pageJs : '' %>" data-feed-view="<%- _e(safeSite.feed_view_default || 'timeline') %>" data-grid-cols="3" data-site-base="<%- _e((typeof siteUrlBase !== 'undefined' && siteUrlBase) ? siteUrlBase : '') %>"> 342 342 343 343 <% if (typeof isViewer !== 'undefined' && isViewer) { %> … … 449 449 } 450 450 451 // Welke modules deze pagina wil (shaer-bqr). De bootstrap hieronder leest 452 // dit zodra deze handler klaar is. 453 if (typeof d.js === 'string' && /^[a-z0-9 -]*$/.test(d.js)) { 454 document.body.setAttribute('data-js', d.js); 455 } 456 451 457 var next = d.bodyClass; 452 458 if (!next) return; … … 467 473 // de pcmsNav-trigger (accent/palette/bodyClass) correct toepast. De vroegere 468 474 // htmx:historyRestore-handler is vervallen nu htmx-history uitstaat.) 475 })(); 476 </script> 477 478 <!-- Modules laden (shaer-bqr). Inline script in gewisselde inhoud wordt door de 479 CSP geweigerd: de nonce rouleert per verzoek, dus een script dat via htmx 480 binnenkomt draagt er een die dit document niet kent (shaer-0i6). Alles wat 481 bij een pagina hoort komt daarom uit een module, en die wordt HIER geladen — 482 vanuit de shell, die alleen bij een volledige laadbeurt binnenkomt en dus 483 wél de goede nonce heeft. 484 485 Een dynamische import vanuit een vertrouwd (genonced) script is precies waar 486 'strict-dynamic' voor bedoeld is, dus de module zelf heeft geen nonce nodig. --> 487 <script> 488 (function () { 489 if (window.__modBoot) return; 490 window.__modBoot = true; 491 492 var loaded = {}; 493 function load() { 494 var names = (document.body.getAttribute('data-js') || '').trim().split(/\s+/); 495 names.forEach(function (name) { 496 // Streng: deze waarde komt uit een template en wordt een PAD. Alleen 497 // kleine letters, cijfers en streepjes; nooit een punt of een schuine 498 // streep. 499 if (!name || loaded[name] || !/^[a-z0-9-]+$/.test(name)) return; 500 loaded[name] = 1; 501 import('/assets/js/mod/' + name + '.js').catch(function (e) { 502 console.warn('[mod] ' + name + ' laadde niet:', e && e.message); 503 }); 504 }); 505 } 506 load(); 507 // Bij een htmx-navigatie wisselt de INHOUD, niet de body. De nav-trigger 508 // hieronder zet data-js opnieuw; daarna halen we op wat er nieuw bij staat. 509 // Een module die er al is wordt niet opnieuw geimporteerd -- vandaar dat elke 510 // module gedelegeerd moet werken en tegen een tweede aanroep moet kunnen. 511 document.body.addEventListener('pcmsNav', load); 469 512 })(); 470 513 </script>
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)