--- import AppLayout from '../layouts/AppLayout.astro'; import Avatar from '../components/Avatar.astro'; import { getAllCabMembers } from '../lib/db'; import { pigmentForId, readFocusTags } from '../lib/format'; const user = Astro.locals.user; const members = getAllCabMembers(); function memberSinceLabel(member: { cab_joined_date: string | null; created_at: string }): string { const iso = member.cab_joined_date ?? member.created_at; const normalised = iso.includes('T') ? iso : iso.replace(' ', 'T') + 'Z'; return new Intl.DateTimeFormat('en-GB', { month: 'long', year: 'numeric', timeZone: 'Europe/Copenhagen', }).format(new Date(normalised)); } --- The council. An invited circle of operators shaping what Project Bifrost becomes. {members.map(m => { const pigment = pigmentForId(m.id); const tags = readFocusTags(m.focus_tags); const isMe = m.id === user.id; const metaParts = [m.title, m.organisation, `Member since ${memberSinceLabel(m)}`].filter(Boolean); return ( {m.name} {isMe && You} {metaParts.join(' ยท ')} {m.pull_quote && ( {m.pull_quote} )} {tags.length > 0 && ( {tags.map(t => {t})} )} ); })} {members.length === 0 && ( The council is still being formed. )}
An invited circle of operators shaping what Project Bifrost becomes.
{metaParts.join(' ยท ')}
{m.pull_quote}