vole
Clone
Read only, no credentials:
https://rodent.software/vole.git
Write over SSH with a registered key:
git clone ssh://git@rodent.software:2222/vole.git
A free and open-source forge that lives in your Git repo.
Use the library's realistic-look and fireworks examples for the burst
5946444571d7784252b131623cd15679adabe18f · Keenan Nemetz · 13d ago · parent 6b7d6a18
Use the library's realistic-look and fireworks examples for the burst 120 particles at scalar 1 from one point read as a small puff on a full-width page. The opening burst is now canvas-confetti's "realistic look" preset — 500 particles, spread 180, ticks 400, gravity 0.5, decay 0.92, startVelocity 30 and scalar 1.2 — followed by its "fireworks" volley from both edges, tapering over 1.2s instead of the example's 15: the page this lands on is one you are about to read, not a celebration screen. Measured in a headless Firefox at 1360x682 after a real Merge click: 181 frames over 3s, median 17ms, p95 20ms, worst 23ms, so it holds 60fps while it runs, and the canvas is gone by the time the burst is over — the volley's timer ends with it rather than lingering. Refs #01M5Z00VJ6215NFZ8F3KJ48FXA
docs/ui-plan.md +3−1
| @@ -296,7 +296,9 @@ rest: `script-src 'self'`. | |||
| 296 | 296 | One asset is fetched on demand. Landing a change request redirects to the request | |
| 297 | 297 | page with `?merged=1`, and `static/app.js` answers that parameter by loading | |
| 298 | 298 | `static/confetti.browser.js` (canvas-confetti 1.9.3, ISC, license at | |
| 299 | `server/web/static/canvas-confetti.LICENSE`) and firing one burst. The parameter is | ||
| 299 | `server/web/static/canvas-confetti.LICENSE`) and firing the library's own | ||
| 300 | "realistic look" burst followed by a one-second version of its "fireworks" volley. | ||
| 301 | The parameter is | ||
| 300 | 302 | read once and removed from the address with `replaceState`, so a reload, a bookmark | |
| 301 | 303 | or a shared link is an ordinary visit; the library honours | |
| 302 | 304 | `prefers-reduced-motion` through `disableForReducedMotion`. Every other page pays | |