Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

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);