| [8afbdd6] | 1 | <%
|
|---|
| 2 | // Artiesten-directory — bodyClass 'on-hub' => headerloos (bareChrome), dus deze
|
|---|
| 3 | // pagina draagt z'n eigen minimale nav + kop, net als de hub-overview.
|
|---|
| 4 | function _qs(extra) {
|
|---|
| 5 | const p = new URLSearchParams();
|
|---|
| 6 | if (q) p.set('q', q);
|
|---|
| 7 | Object.keys(extra || {}).forEach(k => p.set(k, extra[k]));
|
|---|
| 8 | const s = p.toString();
|
|---|
| 9 | return s ? ('?' + s) : '';
|
|---|
| 10 | }
|
|---|
| 11 | %>
|
|---|
| 12 | <div class="adir">
|
|---|
| 13 |
|
|---|
| 14 | <%# ── Minimale nav (terug naar hub + auth) ── %>
|
|---|
| 15 | <nav class="adir-nav">
|
|---|
| 16 | <div class="adir-nav-inner container">
|
|---|
| 17 | <a class="adir-nav-home" href="/"><span aria-hidden="true">←</span> <%= (typeof hubTitle !== 'undefined' && hubTitle) ? hubTitle : 'Home' %></a>
|
|---|
| 18 | <span class="adir-nav-spacer"></span>
|
|---|
| 19 | <% if (user) { %>
|
|---|
| 20 | <a class="adir-nav-link" href="/account"><%= user.username %></a>
|
|---|
| 21 | <a class="adir-nav-link" href="/auth/logout">Uitloggen</a>
|
|---|
| 22 | <% } else { %>
|
|---|
| 23 | <a class="adir-nav-link" href="/auth/login">Inloggen</a>
|
|---|
| 24 | <% } %>
|
|---|
| 25 | </div>
|
|---|
| 26 | </nav>
|
|---|
| 27 |
|
|---|
| 28 | <header class="adir-head container">
|
|---|
| [74c2473] | 29 | <h1 class="adir-title">Leden</h1>
|
|---|
| [a1c8cb8] | 30 | <p class="adir-sub"><%= total %> Klonkt<%= total === 1 ? '' : "'s" %></p>
|
|---|
| [8afbdd6] | 31 |
|
|---|
| [a1c8cb8] | 32 | <form class="adir-search" method="get" action="/leden" role="search">
|
|---|
| [8afbdd6] | 33 | <input type="search" name="q" value="<%= q %>" placeholder="Zoek op naam…"
|
|---|
| [74c2473] | 34 | autocomplete="off" aria-label="Zoek leden">
|
|---|
| [8afbdd6] | 35 | <button type="submit" class="adir-search-btn" aria-label="Zoeken">
|
|---|
| 36 | <svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
|---|
| 37 | </button>
|
|---|
| [a1c8cb8] | 38 | <% if (q) { %><a class="adir-search-clear" href="/leden">Wissen</a><% } %>
|
|---|
| [8afbdd6] | 39 | </form>
|
|---|
| 40 | </header>
|
|---|
| 41 |
|
|---|
| 42 | <div class="container adir-body">
|
|---|
| 43 | <% if (!artists.length) { %>
|
|---|
| 44 | <p class="adir-empty">
|
|---|
| [74c2473] | 45 | <% if (q) { %>Geen leden gevonden voor "<strong><%= q %></strong>".<% } else { %>Nog geen leden.<% } %>
|
|---|
| [8afbdd6] | 46 | </p>
|
|---|
| 47 | <% } else { %>
|
|---|
| 48 | <div class="roster">
|
|---|
| 49 | <% artists.forEach(function(a){ %>
|
|---|
| 50 | <a class="roster-card" href="/user/<%= a.slug %>">
|
|---|
| 51 | <% var _ava = a.profile_photo || a.owner_avatar; %>
|
|---|
| 52 | <span class="roster-avatar"<% if (_ava) { %> style="background-image:url('<%= _ava %>')"<% } else { %> style="background:<%= a.accent || 'var(--accent)' %>;color:#fff"<% } %>>
|
|---|
| 53 | <% if (!_ava) { %><%= (a.title || a.slug).charAt(0).toUpperCase() %><% } %>
|
|---|
| 54 | </span>
|
|---|
| 55 | <span class="roster-name"><%= a.title %></span>
|
|---|
| 56 | <% if (a.tagline) { %><span class="roster-tag"><%= a.tagline %></span><% } %>
|
|---|
| 57 | <span class="roster-count"><%= a.post_count %> post<%= a.post_count === 1 ? '' : 's' %></span>
|
|---|
| 58 | </a>
|
|---|
| 59 | <% }); %>
|
|---|
| 60 | </div>
|
|---|
| 61 |
|
|---|
| 62 | <% if (pages > 1) { %>
|
|---|
| 63 | <nav class="adir-pager" aria-label="Paginering">
|
|---|
| 64 | <% if (page > 1) { %>
|
|---|
| 65 | <a class="adir-page" href="<%= _qs({ page: page - 1 }) %>" rel="prev">← Vorige</a>
|
|---|
| 66 | <% } else { %>
|
|---|
| 67 | <span class="adir-page is-disabled">← Vorige</span>
|
|---|
| 68 | <% } %>
|
|---|
| 69 | <span class="adir-page-info">Pagina <%= page %> van <%= pages %></span>
|
|---|
| 70 | <% if (page < pages) { %>
|
|---|
| 71 | <a class="adir-page" href="<%= _qs({ page: page + 1 }) %>" rel="next">Volgende →</a>
|
|---|
| 72 | <% } else { %>
|
|---|
| 73 | <span class="adir-page is-disabled">Volgende →</span>
|
|---|
| 74 | <% } %>
|
|---|
| 75 | </nav>
|
|---|
| 76 | <% } %>
|
|---|
| 77 | <% } %>
|
|---|
| 78 | </div>
|
|---|
| 79 | </div>
|
|---|
| 80 |
|
|---|
| 81 | <style>
|
|---|
| 82 | .adir { width: 100%; }
|
|---|
| 83 |
|
|---|
| 84 | /* ── Nav ── */
|
|---|
| 85 | .adir-nav { border-bottom: 1px solid var(--rule); padding: 0.9rem 0; }
|
|---|
| 86 | .adir-nav-inner { display: flex; align-items: center; gap: 1.2rem; }
|
|---|
| 87 | .adir-nav-home { color: var(--ink); text-decoration: none; font-weight: 700; }
|
|---|
| 88 | .adir-nav-home:hover { color: var(--accent); }
|
|---|
| 89 | .adir-nav-spacer { flex: 1; }
|
|---|
| 90 | .adir-nav-link { color: var(--ink-muted); text-decoration: none; font-weight: 600; font-size: 0.9rem; }
|
|---|
| 91 | .adir-nav-link:hover { color: var(--accent); }
|
|---|
| 92 |
|
|---|
| 93 | /* ── Header + search ── */
|
|---|
| 94 | .adir-head { padding: 2.5rem 1rem 1.5rem; }
|
|---|
| 95 | .adir-title { font-family: var(--font-display, serif); font-size: clamp(2rem, 5vw, 3rem); margin: 0; }
|
|---|
| 96 | .adir-sub { color: var(--ink-muted); margin: 0.3rem 0 1.3rem; }
|
|---|
| 97 | .adir-search { display: flex; align-items: center; gap: 0.5rem; max-width: 480px; }
|
|---|
| 98 | .adir-search input {
|
|---|
| 99 | flex: 1; min-width: 0; box-sizing: border-box;
|
|---|
| 100 | padding: 0.65rem 0.9rem; border: 1px solid var(--rule); border-radius: 99px;
|
|---|
| 101 | background: var(--paper-2); color: var(--ink); font: inherit; font-size: 0.95rem;
|
|---|
| 102 | }
|
|---|
| 103 | .adir-search input:focus { outline: 2px solid var(--accent); outline-offset: -1px; border-color: var(--accent); }
|
|---|
| 104 | .adir-search-btn {
|
|---|
| 105 | display: inline-flex; align-items: center; justify-content: center;
|
|---|
| 106 | width: 44px; height: 44px; flex-shrink: 0;
|
|---|
| 107 | border: 1px solid var(--accent); border-radius: 50%;
|
|---|
| 108 | background: var(--accent); color: #fff; cursor: pointer;
|
|---|
| 109 | }
|
|---|
| 110 | .adir-search-clear { color: var(--ink-muted); font-size: 0.85rem; text-decoration: underline; white-space: nowrap; }
|
|---|
| 111 |
|
|---|
| 112 | .adir-body { padding-bottom: 4rem; }
|
|---|
| 113 | .adir-empty { color: var(--ink-muted); padding: 2rem 0; }
|
|---|
| 114 |
|
|---|
| 115 | /* ── Roster (zelfde stijl als hub-home) ── */
|
|---|
| 116 | .roster {
|
|---|
| 117 | display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 1rem;
|
|---|
| 118 | }
|
|---|
| 119 | .roster-card {
|
|---|
| 120 | display: flex; flex-direction: column; align-items: center; text-align: center;
|
|---|
| 121 | gap: 0.4rem; padding: 1.6rem 1rem 1.3rem;
|
|---|
| 122 | border: 1px solid var(--rule); border-radius: 16px;
|
|---|
| 123 | background: var(--paper-2); color: var(--ink); text-decoration: none;
|
|---|
| 124 | transition: border-color 140ms, transform 140ms, box-shadow 140ms;
|
|---|
| 125 | }
|
|---|
| 126 | .roster-card:hover {
|
|---|
| 127 | border-color: var(--accent); transform: translateY(-3px);
|
|---|
| 128 | box-shadow: 0 10px 28px -14px color-mix(in srgb, var(--accent) 55%, transparent);
|
|---|
| 129 | }
|
|---|
| 130 | .roster-avatar {
|
|---|
| 131 | width: 88px; height: 88px; border-radius: 50%; margin-bottom: 0.45rem;
|
|---|
| 132 | background-size: cover; background-position: center;
|
|---|
| 133 | display: inline-flex; align-items: center; justify-content: center;
|
|---|
| 134 | font-family: var(--font-display, serif); font-size: 2.1rem; font-weight: 700; color: #fff;
|
|---|
| 135 | box-shadow: inset 0 0 0 2px rgba(255,255,255,.18);
|
|---|
| 136 | }
|
|---|
| 137 | .roster-name { font-weight: 700; font-size: 1.1rem; }
|
|---|
| 138 | .roster-tag { color: var(--ink-muted); font-size: 0.82rem; }
|
|---|
| 139 | .roster-count {
|
|---|
| 140 | margin-top: 0.35rem; font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.06em;
|
|---|
| 141 | color: var(--accent); background: color-mix(in srgb, var(--accent) 12%, transparent);
|
|---|
| 142 | padding: 0.15rem 0.6rem; border-radius: 99px;
|
|---|
| 143 | }
|
|---|
| 144 |
|
|---|
| 145 | /* ── Pager ── */
|
|---|
| 146 | .adir-pager { display: flex; align-items: center; justify-content: center; gap: 1.25rem; margin-top: 2.5rem; }
|
|---|
| 147 | .adir-page {
|
|---|
| 148 | color: var(--ink); text-decoration: none; font-weight: 600; font-size: 0.9rem;
|
|---|
| 149 | padding: 0.5rem 1rem; border: 1px solid var(--rule); border-radius: 99px;
|
|---|
| 150 | }
|
|---|
| 151 | .adir-page:hover { border-color: var(--accent); color: var(--accent); }
|
|---|
| 152 | .adir-page.is-disabled { color: var(--ink-muted); opacity: 0.4; pointer-events: none; }
|
|---|
| 153 | .adir-page-info { color: var(--ink-muted); font-size: 0.85rem; }
|
|---|
| 154 | </style>
|
|---|