Uptoolkit
GitHub

Actor Grid

Filterable people grid with Schema.org ItemList markup.

Followers6

Everyone following this actor across the fediverse.

  • @mira@fediverse.example

    Cartographer. I make maps of things that are hard to see.

    Atlas
    https://maps.example/mira
    Location
    Bergen, Norway

    Joined July 2019

  • @tobi@social.example

    Sound designer. Field recordings from very cold places.

    Joined March 2021

  • @juno@hachyderm.example

    Type designer, letterform historian, reluctant poster.

    Joined March 2021

  • @rk@social.example

    Infrastructure. I keep the boring parts running.

    Joined March 2021

  • @atlas-collective@coop.example

    A worker-owned studio for open mapping tools.

    Joined March 2021

  • @wren@social.example

    Botanist. Mostly mosses.

    Joined March 2021

People you may know3

  • @kestrel@birds.example

    Ornithologist. Posting hawks until further notice.

  • @lumen@photo.example

    Analogue film lab and community darkroom.

  • @sable@social.example

    Archivist. Digitising 40 years of community radio.

Installation

npx shadcn@latest add https://ui.uptoolkit.com/r/actor-grid.json

Usage

One block for every people list: followers, following, mutuals, suggestions, and search results.

import { ActorGrid } from "@/components/actor-grid";

const followers = await fetchFollowers(actor);

<ActorGrid
  actors={followers}
  heading="Followers"
  columns={3}
  searchable
  onFollowStateChange={(actor, state) => trackRelationship(actor, state)}
/>

Accepts a Collection or a plain array. When a collection carries totalItems, that is the count shown in the heading, so a paginated followers list reports its real size instead of the page length.

Layout

variant="card" uses the stacked card with profile fields; variant="row" renders compact rows and ignores columns, which is the shape for a sidebar.

<ActorGrid actors={suggestions} heading="People you may know" variant="row" columns={1} />

Filtering

searchable adds a client-side filter over display name, handle, and bio. initialCount limits the first render and adds a "show all" control:

<ActorGrid actors={followers} initialCount={6} searchable />

The empty state distinguishes "no results for this query" from "nothing here yet"; override it with emptyState.

Relationships

Pass followStates keyed by actor id to show mixed relationships in one list:

<ActorGrid actors={people} followStates={{ [actor.id]: "following" }} />

Structured data

Emits one Schema.org ItemList of Person nodes for the whole list, and the cards inside skip their own JSON-LD so the graph stays clean. Set includeJsonLd={false} when the page emits the list itself.