vole
Clone
Read only, no credentials:
https://rodent.software/git/vole.git
Write over SSH with a registered key:
git clone ssh://git@0.0.0.0:2222/vole.git
A free and open-source forge that lives in your Git repo.
Restore the home header and put the introduction in the list column
164ad9f58199497f55bd6ae5a6ab8bca27618d9d · Keenan Nemetz · 1d ago · parent ff9870f1
Restore the home header and put the introduction in the list column Bring back the identity strip with the New repository button in it; the section heading goes back to just the list title and clear-search link. Move the introduction inside the repository column above the grid, so it is as wide as the work and the activity rail stays beside it. With no repositories there is no column, so the introduction stays full width above the empty state.
server/web/static/vole.css +29−6
| @@ -2729,10 +2729,32 @@ textarea:focus-visible { | |||
| 2729 | 2729 | ||
| 2730 | 2730 | /* ---------- landing page ---------- */ | |
| 2731 | 2731 | ||
| 2732 | /* The introduction, the repository grid and the merged feed as a rail. The feed | ||
| 2733 | has a full page at /activity; here it is a sign the forge is alive, not the | ||
| 2734 | subject of the page. The introduction is the instance's own prose, read from | ||
| 2735 | the instance repository, so it has no header or editor of its own. */ | ||
| 2732 | /* The identity strip, the introduction, the repository grid and the merged feed | ||
| 2733 | as a rail. The feed has a full page at /activity; here it is a sign the forge | ||
| 2734 | is alive, not the subject of the page. */ | ||
| 2735 | .hero { | ||
| 2736 | display: flex; | ||
| 2737 | align-items: flex-end; | ||
| 2738 | justify-content: space-between; | ||
| 2739 | gap: 24px; | ||
| 2740 | padding: 26px 0 20px; | ||
| 2741 | border-bottom: 1px solid var(--border); | ||
| 2742 | margin-bottom: 20px; | ||
| 2743 | } | ||
| 2744 | .hero-main { min-width: 0; } | ||
| 2745 | .hero h1 { | ||
| 2746 | font-size: calc(28.6px * var(--font-scale)); | ||
| 2747 | line-height: 1.2; | ||
| 2748 | letter-spacing: -0.025em; | ||
| 2749 | margin: 0; | ||
| 2750 | overflow: hidden; | ||
| 2751 | text-overflow: ellipsis; | ||
| 2752 | white-space: nowrap; | ||
| 2753 | } | ||
| 2754 | .hero-actions { display: flex; flex: 0 0 auto; flex-wrap: wrap; align-items: center; gap: 8px; } | ||
| 2755 | |||
| 2756 | /* The introduction sits in the repository column, above the list, so it is as | ||
| 2757 | wide as the work rather than as wide as the page. */ | ||
| 2736 | 2758 | .readme-card { margin: 0 0 20px; } | |
| 2737 | 2759 | .readme-body { padding: 18px 20px; } | |
| 2738 | 2760 | .readme-empty { | |
| @@ -2762,8 +2784,6 @@ textarea:focus-visible { | |||
| 2762 | 2784 | .section-head .more { font-size: calc(12.65px * var(--font-scale)); color: var(--fg-muted); } | |
| 2763 | 2785 | .section-head .more:hover { color: var(--accent); } | |
| 2764 | 2786 | .section-head .muted { font-size: calc(12.65px * var(--font-scale)); } | |
| 2765 | .section-actions { display: flex; align-items: center; gap: 12px; } | ||
| 2766 | .section-actions .button { font-size: calc(12.65px * var(--font-scale)); padding: 4px 10px; } | ||
| 2767 | 2787 | ||
| 2768 | 2788 | .repo-grid { | |
| 2769 | 2789 | display: grid; | |
| @@ -2835,6 +2855,9 @@ textarea:focus-visible { | |||
| 2835 | 2855 | .home-main { order: 1; } | |
| 2836 | 2856 | } | |
| 2837 | 2857 | @media (max-width: 720px) { | |
| 2858 | .hero { flex-wrap: wrap; align-items: flex-start; padding-top: 18px; } | ||
| 2859 | .hero-actions { width: 100%; } | ||
| 2860 | .hero h1 { font-size: calc(24.2px * var(--font-scale)); } | ||
| 2838 | 2861 | .repo-grid { grid-template-columns: 1fr; } | |
| 2839 | 2862 | } | |
| 2840 | 2863 | ||