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.
Throw the merge confetti from the page edges
258ed80130fea4f1e0877f9dbb1b093d47430556 · Keenan Nemetz · 10d ago · parent 31c03fc8
Throw the merge confetti from the page edges The landed-change celebration opened with a 500-particle burst from the centre of the page, which covered the content the reader had just landed on. Keep only the fireworks volley, from the left and right edges, and raise its per-frame count so the moment still reads at about the same density.
server/web/static/app.js +9−11
| @@ -518,12 +518,12 @@ const copyText = (value, done) => { | |||
| 518 | 518 | // thread costs a few hundred particles for a few seconds, which is nothing, and | |
| 519 | 519 | // needs no CSP change. | |
| 520 | 520 | // | |
| 521 | // The numbers are two of the library's own examples. The opening burst is the | ||
| 522 | // "realistic look" preset: more particles, a wider spread, a longer life, lower | ||
| 523 | // gravity and scalar > 1, which is what stops it reading as a small puff. The | ||
| 524 | // volley that follows is the "fireworks" preset from both edges, cut from fifteen | ||
| 525 | // seconds to just over one, because the page this lands on is one you are about to | ||
| 526 | // read. Together they are under a thousand particles. | ||
| 521 | // The volley is the library's "fireworks" preset, cut from fifteen seconds to just | ||
| 522 | // over one, because the page this lands on is one you are about to read. Every | ||
| 523 | // particle is thrown in from the left or right edge of the viewport: nothing opens | ||
| 524 | // in the middle of the page, so the celebration frames the content instead of | ||
| 525 | // covering it. The count steps down with the clock, which keeps it to roughly five | ||
| 526 | // hundred particles in total. | ||
| 527 | 527 | (() => { | |
| 528 | 528 | const params = new URLSearchParams(window.location.search); | |
| 529 | 529 | if (!params.has('merged')) return; | |
| @@ -547,16 +547,14 @@ const copyText = (value, done) => { | |||
| 547 | 547 | disableForReducedMotion: true, | |
| 548 | 548 | }; | |
| 549 | 549 | ||
| 550 | // The "realistic look" burst. | ||
| 551 | burst({ ...look, particleCount: 500, origin: { x: 0.5, y: 0.6 } }); | ||
| 552 | |||
| 553 | // The "fireworks" volley, from both edges, tapering as the clock runs out. | ||
| 550 | // The "fireworks" volley, from the two side edges only, tapering as the clock | ||
| 551 | // runs out. | ||
| 554 | 552 | const volleyMs = 1200; | |
| 555 | 553 | const end = Date.now() + volleyMs; | |
| 556 | 554 | (function frame() { | |
| 557 | 555 | const left = end - Date.now(); | |
| 558 | 556 | if (left <= 0) return; | |
| 559 | const particleCount = 30 * (left / volleyMs); | ||
| 557 | const particleCount = 60 * (left / volleyMs); | ||
| 560 | 558 | burst({ ...look, particleCount, angle: 60, spread: 55, origin: { x: 0 } }); | |
| 561 | 559 | burst({ ...look, particleCount, angle: 120, spread: 55, origin: { x: 1 } }); | |
| 562 | 560 | setTimeout(frame, 250); | |