<%# Wat er onder de zoekbalk staat. EEN render voor beide ingangen: het live resultatenvak (via /search/results) en de pagina /search?q=... zelf. Zo zien ze er per constructie hetzelfde uit; twee renders lopen gegarandeerd uit de pas. Verwacht: query, results (posts), tracks, events, pages, queryError, remoteUri, remote, remoteKind, mayLookup, remoteReacted, siteTitle, siteUrlBase, formatDate, t. GEEN SCRIPT hierin: het live vak zet dit via innerHTML neer, en daar draait niets. Gedrag (afspelen, waarderen, htmx-links) luistert op document. %> <% const _base = (typeof siteUrlBase !== 'undefined' && siteUrlBase) ? siteUrlBase : ''; const _results = (typeof results !== 'undefined' && results) ? results : []; const _tracks = (typeof tracks !== 'undefined' && tracks) ? tracks : []; const _events = (typeof events !== 'undefined' && events) ? events : []; const _pages = (typeof pages !== 'undefined' && pages) ? pages : []; const _remote = (typeof remoteUri !== 'undefined' && remoteUri) ? remoteUri : ''; // Alles via locals: een veld dat een aanroeper vergeet mag de render niet // laten omvallen (een kale verwijzing naar iets ongedefinieerds gooit). const _queryError = !!locals.queryError; const _mayLookup = !!locals.mayLookup; const _found = locals.remote || null; const _kind = locals.remoteKind || null; const _reacted = locals.remoteReacted || { liked: false, boosted: false }; const _siteTitle = locals.siteTitle || ''; const _inPost = t('search.in_post'); const _any = _results.length || _tracks.length || _events.length || _pages.length; %> <% if (locals.query) { %>
<% if (_remote) { %> <%# Een geplakt adres is geen zoekterm maar een aanwijzing (shaer-utpi). Ophalen doen we alleen namens een ingelogde beheerder van de site. %>

<%= t('search.section_fediverse') %>

<% if (!_mayLookup) { %>

<%= t('search.fedi_signin') %>

<% } else if (_found && _kind === 'note') { %> <%- include('./remote-object', { target: _found, uri: _remote, reacted: _reacted, siteTitle: _siteTitle, compact: true }) %> <% } else if (_found && _kind === 'actor') { %> <%- include('./remote-actor', { actor: _found, siteTitle: _siteTitle, compact: true }) %> <% } else { %>

<%= t('fedi.remote_notfound') %>

<% } %> <% if (_found) { %><%- include('./fedi-interact-styles') %><% } %>
<% } %> <% if (_queryError) { %>

<%= t('search.error') %>

<% } %> <% if (_tracks.length) { %>

<%= t('search.section_tracks') %>

<% _tracks.forEach(function (tr) { const tj = JSON.stringify({ id: tr.id, url: tr.url, title: tr.title, artist: tr.artist || '', cover: tr.cover || '' }) .replace(/&/g, '&').replace(/'/g, ''').replace(/
<% if (tr.cover) { %> <% } %>
<%= tr.title %>
<% if (tr.artist || tr.album) { %>
<%= tr.artist %><% if (tr.artist && tr.album) { %> · <% } %><%= tr.album %>
<% } %>
<% if (tr.postUrl) { %> <%= _inPost %> <% } %>
<% }); %>
<% } %> <% if (_results.length) { %>

<%= t('search.section_posts') %>

    <% _results.forEach(function (r) { %>
  1. <%= r.title || '(zonder titel)' %> <%= r.author_username %><% if (r.published_at) { %> · <%= formatDate(r.published_at) %><% } %> <% if (r.snippet) { %><%- r.snippet %><% } %>
  2. <% }); %>
<% } %> <% if (_events.length) { %>

<%= t('search.section_events') %>

    <% _events.forEach(function (ev) { %>
  1. <%= ev.where || ev.date %> <%= [ev.date, ev.time].filter(Boolean).join(' ') %>
  2. <% }); %>
<% } %> <% if (_pages.length) { %>

<%= t('search.section_pages') %>

<% } %> <% if (!_queryError && !_any && !_remote) { %>

<%= t('search.empty') %>

<% } %>
<% } %>