Changeset ce8c8c2 in Klonkt


Ignore:
Timestamp:
06/14/2026 06:46:13 PM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
74c2473
Parents:
a3169f5
Message:

feat: hub-home shows main/label account separately (not under Artists)

The main site (oldest = company/main account, e.g. Studio Noord) appeared
among the artists. Now it gets a highlighted "Main page" card above the roster
and is excluded from both the Artists roster and the /artiesten directory
(a label is not an artist).

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

Location:
src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/routes/artists.js

    ra3169f5 rce8c8c2  
    2626  if (!Number.isFinite(page) || page < 1) page = 1;
    2727
     28  // De hoofd-/labelsite (oudste) is geen artiest -> uit de directory weren,
     29  // consistent met de hub-home die 'm apart toont.
     30  const mainRow = db.prepare('SELECT id FROM sites ORDER BY created_at ASC LIMIT 1').get();
     31  const mainId = mainRow ? mainRow.id : '';
     32
    2833  // Zoekterm tegen titel/slug/tagline (case-insensitive via LIKE; SQLite LIKE is
    2934  // standaard ongevoelig voor ASCII-hoofdletters). De ESCAPE '\' maakt %, _ en \
    3035  // in de zoekterm letterlijk (anders zouden ze als wildcards werken).
    31   const where = q
    32     ? "WHERE (s.title LIKE @like ESCAPE '\\' OR s.slug LIKE @like ESCAPE '\\' OR s.tagline LIKE @like ESCAPE '\\')"
    33     : '';
    3436  const like = '%' + q.replace(/[\\%_]/g, (m) => '\\' + m) + '%';
    35   const params = q ? { like } : {};
     37  const conds = ['s.id != @mainId'];
     38  if (q) conds.push("(s.title LIKE @like ESCAPE '\\' OR s.slug LIKE @like ESCAPE '\\' OR s.tagline LIKE @like ESCAPE '\\')");
     39  const where = 'WHERE ' + conds.join(' AND ');
     40  const params = q ? { mainId, like } : { mainId };
    3641
    3742  const total = db.prepare(`SELECT COUNT(*) AS c FROM sites s ${where}`)
  • src/routes/hub.js

    ra3169f5 rce8c8c2  
    3535  `).all();
    3636
     37  // De hoofd-/labelsite (oudste = de bedrijfs-/hoofdaccount) is GEEN artiest;
     38  // die tonen we apart bovenaan, niet in de Artiesten-roster.
     39  const mainSite = db.prepare(`
     40    SELECT s.id, s.slug, s.title, s.tagline, s.profile_photo, s.accent,
     41           u.avatar_url AS owner_avatar,
     42           (SELECT COUNT(*) FROM posts WHERE site_id = s.id AND status = 'published') AS post_count
     43    FROM sites s
     44    LEFT JOIN users u ON u.id = s.owner_id
     45    ORDER BY s.created_at ASC
     46    LIMIT 1
     47  `).get() || null;
     48  const mainId = mainSite ? mainSite.id : '';
     49
    3750  // Uitgelichte PrutFolio's voor de home-roster: meest-actief eerst (aantal
    38   // gepubliceerde posts), dan nieuwste. Beperkt tot HOME_ROSTER_LIMIT zodat de
    39   // home schaalt — de volledige, doorzoekbare lijst staat op /artiesten.
     51  // gepubliceerde posts), dan nieuwste. Excl. de hoofdsite. Beperkt tot
     52  // HOME_ROSTER_LIMIT zodat de home schaalt — volledige lijst staat op /artiesten.
    4053  const HOME_ROSTER_LIMIT = 24;
    4154  const artists = db.prepare(`
     
    4558    FROM sites s
    4659    LEFT JOIN users u ON u.id = s.owner_id
     60    WHERE s.id != @mainId
    4761    ORDER BY post_count DESC, s.created_at DESC
    48     LIMIT ?
    49   `).all(HOME_ROSTER_LIMIT);
    50   const totalArtists = db.prepare('SELECT COUNT(*) AS c FROM sites').get().c;
     62    LIMIT @limit
     63  `).all({ mainId, limit: HOME_ROSTER_LIMIT });
     64  const totalArtists = db.prepare('SELECT COUNT(*) AS c FROM sites WHERE id != ?').get(mainId).c;
    5165
    5266  // De hub-pagina is GENERIEK (van geen enkele user) — branding komt uit globale
     
    6478    bodyClass: 'on-home on-hub',
    6579    hub,
     80    mainSite,
    6681    artists,
    6782    totalArtists,
  • src/views/pages/hub-home.ejs

    ra3169f5 rce8c8c2  
    3030
    3131  <div class="container hub-body">
     32
     33    <%# ── HOOFDPAGINA (label-/hoofdaccount — geen artiest) ──────────── %>
     34    <% if (mainSite) { %>
     35    <section class="hub-sec hub-sec-main">
     36      <a class="hub-main-card" href="/user/<%= mainSite.slug %>">
     37        <% var _mAva = mainSite.profile_photo || mainSite.owner_avatar; %>
     38        <span class="hub-main-avatar"<% if (_mAva) { %> style="background-image:url('<%= _mAva %>')"<% } else { %> style="background:<%= mainSite.accent || 'var(--accent)' %>;color:#fff"<% } %>>
     39          <% if (!_mAva) { %><%= (mainSite.title || mainSite.slug).charAt(0).toUpperCase() %><% } %>
     40        </span>
     41        <span class="hub-main-info">
     42          <span class="hub-main-badge">Hoofdpagina</span>
     43          <span class="hub-main-name"><%= mainSite.title %></span>
     44          <% if (mainSite.tagline) { %><span class="hub-main-tag"><%= mainSite.tagline %></span><% } %>
     45        </span>
     46        <span class="hub-main-cta">Bekijk de pagina <span aria-hidden="true">→</span></span>
     47      </a>
     48    </section>
     49    <% } %>
    3250
    3351    <%# ── ARTIESTEN-ROSTER ─────────────────────────────────────────── %>
     
    155173.hub-more-link:hover { border-color: var(--accent); background: color-mix(in srgb, var(--accent) 7%, var(--paper-2)); }
    156174
     175/* ── Hoofdpagina-kaart (label-/hoofdaccount, apart van de artiesten) ── */
     176.hub-sec-main { margin-top: 2.25rem; }
     177.hub-main-card {
     178  display: flex; align-items: center; gap: 1.25rem;
     179  padding: 1.2rem 1.5rem;
     180  border: 1px solid color-mix(in srgb, var(--accent) 40%, var(--rule));
     181  border-radius: 18px;
     182  background: linear-gradient(120deg, color-mix(in srgb, var(--accent) 11%, var(--paper-2)) 0%, var(--paper-2) 72%);
     183  color: var(--ink); text-decoration: none;
     184  transition: border-color 140ms, transform 140ms, box-shadow 140ms;
     185}
     186.hub-main-card:hover {
     187  border-color: var(--accent); transform: translateY(-2px);
     188  box-shadow: 0 12px 30px -16px color-mix(in srgb, var(--accent) 60%, transparent);
     189}
     190.hub-main-avatar {
     191  width: 72px; height: 72px; border-radius: 50%; flex-shrink: 0;
     192  background-size: cover; background-position: center;
     193  display: inline-flex; align-items: center; justify-content: center;
     194  font-family: var(--font-display, serif); font-size: 1.8rem; font-weight: 700; color: #fff;
     195  box-shadow: inset 0 0 0 2px rgba(255,255,255,.18);
     196}
     197.hub-main-info { display: flex; flex-direction: column; gap: 0.25rem; min-width: 0; flex: 1; }
     198.hub-main-badge {
     199  align-self: flex-start; font-size: 0.65rem; font-weight: 700;
     200  text-transform: uppercase; letter-spacing: 0.08em;
     201  color: var(--accent); background: color-mix(in srgb, var(--accent) 14%, transparent);
     202  padding: 0.12rem 0.55rem; border-radius: 99px;
     203}
     204.hub-main-name { font-family: var(--font-display, serif); font-size: 1.5rem; font-weight: 700; line-height: 1.1; }
     205.hub-main-tag { color: var(--ink-muted); font-size: 0.9rem; }
     206.hub-main-cta { color: var(--accent); font-weight: 600; font-size: 0.9rem; white-space: nowrap; flex-shrink: 0; }
     207@media (max-width: 560px) {
     208  .hub-main-card { flex-direction: column; text-align: center; }
     209  .hub-main-info { align-items: center; }
     210  .hub-main-badge { align-self: center; }
     211  .hub-main-cta { display: none; }
     212}
     213
    157214/* ── Roster (artiesten) ───────────────────────────────────────────── */
    158215.roster {
Note: See TracChangeset for help on using the changeset viewer.