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.
Offer instance theme packs in the appearance picker
f7a34d8749054b7ff9e1a304a3fc90ccf3786877 · Keenan Nemetz · 1d ago · parent bc95767f
Offer instance theme packs in the appearance picker Add profile/themes/index.json and one scoped stylesheet per theme. The loader validates ids and names, pairs each manifest entry with profile/themes/<id>.css, and exposes the list to the account picker and to theme.js before first paint. Theme stylesheets are linked before profile/custom.css, so an instance-wide override still wins. The starter repository now includes an empty manifest and documents the format in its root README. The configuration docs and the Admin Configuration path table describe the same convention.
server/web/static/theme.js +8−4
| @@ -1,12 +1,15 @@ | |||
| 1 | // Everforest is Vole's permanent theme, and the account page also carries a | ||
| 2 | // text-size preset. Both are browser preferences: a saved choice wins; with no | ||
| 3 | // saved theme, the medium variant follows the operating system. This runs before | ||
| 4 | // the stylesheet links in the document head so neither choice flashes. | ||
| 1 | // Everforest is built in, and the instance repository may add theme packs of | ||
| 2 | // its own. The account page also carries a text-size preset. All of it is a | ||
| 3 | // browser preference: a saved choice wins; with no saved theme, the medium | ||
| 4 | // Everforest variant follows the operating system. This runs before the | ||
| 5 | // stylesheet links in the document head so neither choice flashes. | ||
| 5 | 6 | (() => { | |
| 6 | 7 | const root = document.documentElement; | |
| 7 | 8 | const themeKey = 'vole-theme'; | |
| 8 | 9 | const scaleKey = 'vole-font-scale'; | |
| 9 | 10 | const dark = window.matchMedia('(prefers-color-scheme: dark)'); | |
| 11 | // The server writes the instance's theme ids to data-themes before this | ||
| 12 | // script runs, so a saved custom choice is accepted on the first paint. | ||
| 10 | 13 | const themes = new Set([ | |
| 11 | 14 | 'everforest-dark-hard', | |
| 12 | 15 | 'everforest-dark-medium', | |
| @@ -14,6 +17,7 @@ | |||
| 14 | 17 | 'everforest-light-hard', | |
| 15 | 18 | 'everforest-light-medium', | |
| 16 | 19 | 'everforest-light-soft', | |
| 20 | ...(root.dataset.themes || '').split(',').filter(Boolean), | ||
| 17 | 21 | ]); | |
| 18 | 22 | const scales = new Set(['small', 'medium', 'large']); | |
| 19 | 23 | ||