Changeset 462a931 in Klonkt for src/views/pages/circle-feed.ejs


Ignore:
Timestamp:
06/30/2026 01:31:49 PM (2 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
8b700ad
Parents:
d5aa7c8
Message:

feat(circle): filter the Circle feed by member (clickable chips + Following "Show" link)

The member chips on the Circle page are now clickable filters: clicking one shows only that
account's posts, with an "Everyone" chip to clear and an active highlight. The Following page
gets a "Show" link per featured account that lands on the filtered Circle view. So Featured =
"include in my Circle", and Show lets you view just that one person here.

  • src/services/ActivityPubService.js — getCirkelPosts(slug, limit, actorUri) filter; members expose actor_uri
  • src/routes/circle.js — honour ?actor=<uri> (validated against the member list) + active flags
  • src/views/pages/circle-feed.ejs — chips + modal as filter links + Everyone + active state
  • src/views/pages/following.ejs — Show link for featured accounts
  • src/services/i18n.js — cfeed.all, tl.show (nl/en/de)

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/views/pages/circle-feed.ejs

    rd5aa7c8 r462a931  
    1414  </span>
    1515  <h1><%= t('cfeed.title') %></h1>
    16   <p class="cirkel-sub"><%= t('cfeed.sub') %></p>
     16  <p class="cirkel-sub"><%= (typeof activeName !== 'undefined' && activeName) ? activeName : t('cfeed.sub') %></p>
     17  <% var _everyoneActive = (typeof activeActor === 'undefined' || !activeActor); %>
    1718  <% if (typeof sites !== 'undefined' && sites && sites.length) { %>
    1819    <% if (sites.length <= 5) { %>
    1920    <div class="cirkel-members">
     21      <a class="cirkel-member cirkel-everyone <%= _everyoneActive ? 'is-active' : '' %>" href="/cirkel"><span class="cirkel-member-name"><%= t('cfeed.all') %></span></a>
    2022      <% sites.forEach(function(s){ %>
    21         <% if (s.url) { %><a class="cirkel-member" href="<%= s.url %>" target="_blank" rel="noopener" title="<%= s.name %>"><% } else { %><span class="cirkel-member" title="<%= s.name %>"><% } %>
     23        <% if (s.actor_uri) { %><a class="cirkel-member <%= s.active ? 'is-active' : '' %>" href="/cirkel?actor=<%= encodeURIComponent(s.actor_uri) %>" title="<%= s.name %>"><% } else { %><span class="cirkel-member" title="<%= s.name %>"><% } %>
    2224          <span class="cirkel-avatar"<% if (s.avatar) { %> style="background-image:url('<%= s.avatar %>');background-color:transparent"<% } %>><% if (!s.avatar) { %><%= (s.name || '?').charAt(0).toUpperCase() %><% } %></span>
    2325          <span class="cirkel-member-name"><%= s.name %></span>
    24         <% if (s.url) { %></a><% } else { %></span><% } %>
     26        <% if (s.actor_uri) { %></a><% } else { %></span><% } %>
    2527      <% }); %>
    2628    </div>
     
    3840          <h2 class="cirkel-modal-h"><%= t('cfeed.count', { n: sites.length }) %></h2>
    3941          <ul class="cirkel-modal-list">
     42            <li>
     43              <a class="cirkel-modal-link <%= _everyoneActive ? 'is-active' : '' %>" href="/cirkel">
     44                <span class="cirkel-member-name"><%= t('cfeed.all') %></span>
     45              </a>
     46            </li>
    4047            <% sites.forEach(function(s){ %>
    4148              <li>
    42                 <% if (s.url) { %><a class="cirkel-modal-link" href="<%= s.url %>" target="_blank" rel="noopener"><% } else { %><span class="cirkel-modal-link"><% } %>
     49                <% if (s.actor_uri) { %><a class="cirkel-modal-link <%= s.active ? 'is-active' : '' %>" href="/cirkel?actor=<%= encodeURIComponent(s.actor_uri) %>"><% } else { %><span class="cirkel-modal-link"><% } %>
    4350                  <span class="cirkel-avatar"<% if (s.avatar) { %> style="background-image:url('<%= s.avatar %>');background-color:transparent"<% } %>><% if (!s.avatar) { %><%= (s.name || '?').charAt(0).toUpperCase() %><% } %></span>
    4451                  <span class="cirkel-member-name"><%= s.name %></span>
    45                   <% if (s.url) { %><span class="cirkel-modal-go" aria-hidden="true">↗</span><% } %>
    46                 <% if (s.url) { %></a><% } else { %></span><% } %>
     52                <% if (s.actor_uri) { %></a><% } else { %></span><% } %>
    4753              </li>
    4854            <% }); %>
     
    98104  transition: border-color .15s, transform .15s; }
    99105.cirkel-member:hover { border-color: var(--accent); transform: translateY(-1px); }
     106.cirkel-member.is-active { border-color: var(--accent); background: color-mix(in srgb, var(--accent) 16%, transparent); }
     107.cirkel-everyone { padding: .28rem .9rem; }
     108.cirkel-modal-link.is-active { background: color-mix(in srgb, var(--accent) 14%, transparent); }
    100109.cirkel-avatar { width: 30px; height: 30px; border-radius: 50%; flex-shrink: 0;
    101110  background-size: cover; background-position: center; background-color: var(--accent);
Note: See TracChangeset for help on using the changeset viewer.