clone

a personal forge on plain git: static pages, stacked-diff reviews, signed local ci, repo sites and releases

main
forge / site / repo / home.njk
home.njk 6.4K
1---2pagination:3 data: forge.pages.homes4---5{% extends "base.njk" %}6{% import "macros.njk" as m with context %}7{% import "ui.njk" as ui %}8{% set u = p.repo.urls %}9{% block head %}{{ m.meta(p.title, p.repo.description or (p.readme.html | excerpt(true) if p.readme and p.readme.html else ''), u.home.href) }}{% endblock %}10{% block front %}11{% css %}12/* A repo's front matter, above its tabs: its name, what it is about and13 its topics; its facts in a column at the right, behind a hairline; on14 phones the facts go under the about line. */15.repo-front { display: grid; grid-template-columns: minmax(0, 1fr) minmax(15em, 21em); gap: var(--space-2) var(--space-6); margin: var(--space-2) 0 var(--space-3); }16.repo-front h1 { margin: 0; font-size: var(--text-2xl); line-height: 1.15; overflow-wrap: anywhere; }17.repo-front .about { margin: var(--space-2) 0 0; max-width: 46em; font-size: var(--text-prose); color: var(--fg); overflow-wrap: anywhere; }18.rf-topics { display: flex; flex-wrap: wrap; gap: var(--space-1) var(--space-3); margin: var(--space-2) 0 0; font-size: var(--text-sm); }19.rf-topics span { color: var(--muted); }20.facts { align-self: start; margin: 0; padding: var(--space-1) 0 var(--space-1) var(--space-4); border-left: var(--hairline) solid var(--border); font-size: var(--text-sm); }21.facts > div { display: grid; grid-template-columns: 5.5em minmax(0, 1fr); gap: var(--space-2); align-items: baseline; padding: var(--space-half) 0; }22.facts dt { color: var(--muted); }23.facts dd { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--space-1) var(--space-2); margin: 0; min-width: 0; color: var(--fg); }24.facts dd > a:first-child:not(.mono) { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }25.facts .site { display: inline-flex; align-items: center; gap: var(--space-1); }26.facts time { font-size: var(--text-xs); color: var(--faint); font-variant-numeric: tabular-nums; }27.facts .sha { font-size: var(--text-xs); }28.facts .pass { color: var(--pass); }29.facts .fail { color: var(--fail); }30.facts .unverified { color: var(--warn); }31.facts .none { color: var(--muted); }32.lang-bar { display: flex; width: 100%; height: var(--space-1); margin-top: var(--space-1); background: var(--lang-rest); overflow: hidden; }33.lang-bar > i { display: block; height: 100%; }34.langs { display: flex; flex-wrap: wrap; gap: 0 var(--space-3); color: var(--muted); }35.langs b { font-weight: var(--fw-medium); color: var(--fg); }36.lc1 { background: var(--lang-1); }37.lc2 { background: var(--lang-2); }38.lc3 { background: var(--lang-3); }39.langs i { display: inline-block; width: var(--space-2); height: var(--space-2); margin-right: var(--space-1); }40@media (max-width: 720px) {41 .repo-front { grid-template-columns: minmax(0, 1fr); }42 .facts { padding: var(--space-2) 0 0; border-left: 0; }43}44{% endcss %}45{% set f = p.front %}46<div class="repo-front">47<div class="rf-main">48<h1>{{ p.repo.name }}</h1>49{% if p.repo.description %}<p class="about">{{ p.repo.description }}</p>{% endif %}50{% if f.topics.length %}<p class="rf-topics" aria-label="topics">{% for t in f.topics %}{% if t.href %}<a href="{{ t.href }}">{{ t.title }}</a>{% else %}<span>{{ t.title }}</span>{% endif %}{% endfor %}</p>{% endif %}51</div>52{% if f.sites or f.release or f.ci or f.reviews or f.license or f.languages.length %}53<dl class="facts">54{% if f.sites %}<div><dt>site</dt><dd>{% if f.sites.url %}<a class="site" href="{{ f.sites.url }}">{{ ui.icon('globe') }}{{ f.sites.name }}</a>{% else %}<a class="site" href="{{ f.sites.href }}">{{ ui.icon('globe') }}{{ f.sites.n }} sites</a>{% endif %}</dd></div>{% endif %}55{% if f.release %}<div><dt>release</dt><dd><a class="mono" href="{{ f.release.href }}">{{ f.release.tag }}</a>{{ f.release.date | date }}</dd></div>{% endif %}56{% if f.ci %}<div><dt>ci</dt><dd><span class="{{ f.ci.state }}">{{ 'passed' if f.ci.state == 'pass' else ('failed' if f.ci.state == 'fail' else f.ci.state) }}</span><a class="sha" href="{{ f.ci.href }}">{{ f.ci.short }}</a></dd></div>{% endif %}57{% if f.reviews %}<div><dt>reviews</dt><dd><a href="{{ p.repo.urls.reviews.href }}">{{ f.reviews }} open</a></dd></div>{% endif %}58{% if f.license %}<div><dt>license</dt><dd><a href="{{ f.license.href }}"{% if not f.license.id %} class="mono"{% endif %}>{{ f.license.id if f.license.id else 'see ' + f.license.path }}</a></dd></div>{% endif %}59{% if f.languages.length %}<div><dt>languages</dt><dd><span class="lang-bar" aria-hidden="true">{% for l in f.languages %}<i class="lc{{ loop.index }}" style="width: {{ l.pct }}%"></i>{% endfor %}</span><span class="langs">{% for l in f.languages %}<span><i class="lc{{ loop.index }}" aria-hidden="true"></i>{{ l.name }} <b>{{ l.pct }}%</b></span>{% endfor %}</span></dd></div>{% endif %}60</dl>61{% endif %}62</div>63{% endblock %}64{% block content %}65{% if p.reviews.length %}66{% set head %}<b>open reviews</b><span class="n">{{ p.reviews.length }}</span><span class="end"><a href="{{ u.reviews.href }}">all reviews</a></span>{% endset %}67{% call ui.panel(head) %}{{ m.reviews(p.reviews, p.repo) }}{% endcall %}68{% endif %}69{# The files, under the last commit: who, what, which and when. #}70{% set head %}71{% if p.latest %}72<span class="grow"><b>{{ p.latest.author.name }}</b> <a class="key" href="{{ u.commit(p.latest.sha).href }}">{{ p.latest.subject }}</a></span>73<span class="end"><a class="sha" href="{{ u.commit(p.latest.sha).href }}">{{ p.latest.short }}</a>{{ p.latest.ci | ciHtml | safe }}{{ p.latest.author.date | date }}<a href="{{ u.log(p.repo.defaultBranch).href }}">{{ p.commitCount | plural('commit') }}</a><a href="{{ u.refs.href }}">{{ p.branchCount | plural('branch', 'branches') }}</a>{% if p.release %}<a href="{{ p.release.href }}" title="the latest release: {{ p.release.files | plural('file') }}">release {{ p.release.tag }}</a>{% endif %}{{ m.topic(p) }}</span>74{% else %}<span class="grow">No commits yet. Push to <span class="mono">{{ u.cloneSsh }}</span></span>{% endif %}75{% endset %}76{% call ui.panel(head, 'files-panel') %}{% if p.entries.length %}{{ m.files(p.entries) }}{% endif %}{% endcall %}77{% if p.readme %}78{% set head %}<a class="key mono" href="{{ u.blob(p.repo.defaultBranch, p.readme.path).href }}">{{ p.readme.path }}</a>{% endset %}79{% call ui.panel(head, 'readme') %}80{% if p.readme.html %}<div class="markdown">{{ p.readme.html | safe }}</div>{% else %}<div class="markdown"><pre>{{ p.readme.text }}</pre></div>{% endif %}81{% endcall %}82{% endif %}83{% endblock %}