npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

vue-particles-background

v0.3.1

Published

Vue component for nice background vue-particles-background

Downloads

6

Readme

Particles

This package is available on npm.

The idea

The idea was to have animated particle style (star-like) image with gradient background and ability to set static points/shapes that would interact with moving particles. Also some interaction with mouse cursor would be a plus.

demo

Lets start

The easiest way – in my opinion – to start with a semi-scientific web/JS project is to use P5.js. Look, there is already an example that could serve as a starting point:

https://p5js.org/examples/simulate-particles.html

Few tweaks (lower speed, more particles, more visible lines) and we have nice looking, moving particles. Let’s also add some background and we have nice looking starting point:

https://editor.p5js.org/gacek.borowy/sketches/rPUUXzFFB

Now to add some static points. Coordinates for image points can be created quite simply: open image in some sort of image editor (like GIMP), hower over each point and note the coordinates. Then note also total size of the image and here you go. It is nice to add some sort of scaling factor to give us more control over final size of the image. Thanks to that we can easily center the image and scale it to any size we want:

let xOffset = width/2 - scale*imageSize.x/2;
let yOffset = height/2 - scale*imageSize.y/2;
...
particles.push(new StaticParticle(
    xOffset + scale*points[0], 
    yOffset+scale*points[1])
);

Let’s also add some neat visual adjustments to it and here we have the result:

https://editor.p5js.org/gacek.borowy/sketches/ncRaNVdon

The final step is to add some interactivity with the mouse. To accomplish it we "drag" particles towards the mouse pointer in some area (let's use line distance for it, since we have it) by some factor:

...
particles[i].drag(mouseX, mouseY);
...

drag(px, py)
  {
    if(dist(this.x, this.y, px, py) < 2*this.lineDistance){
      this.x -= 0.05*(this.x - px);
      this.y -= 0.05*(this.y - py);
    }
  }

https://editor.p5js.org/gacek.borowy/sketches/dKeah_0jy

This outcome is quite satisfying, we can now start extracting it to more structured, confined and configurable code.

Move to components

Let’s create a new Vue 2 component for our particles. To handle P5.js inside of vue one can use this package:

https://www.npmjs.com/package/vue-p5

First of all, let’s extract our particle classes to separate file called particles.js. These classess heavily depend on p5’s methods and sketch object, so it has to have access to it.

this.particles.push((new Particle(sketch));
...
export class Particle {
    constructor(sketch) {
        this.sketch = sketch;
...

Then if one has to access any p5's bilt-in function, just refer to it through passed sketch object:

createParticle() {
    this.sketch.noStroke();
    this.sketch.fill('rgba(200,169,169,0.8)');
    this.sketch.circle(this.x, this.y, this.r);

    return this;
}

First iteration is finished – all functionality from demo code (web editor) is moved to working vue component.

https://github.com/apsg/particles/commit/7d4277f6389b76097d3003cbd634817c1305ce7a

Now it’s time to add a bit of configurability and smart behaviour to it. First of all, it should allow to use it as a wrapper, background, for anything passed to it into . Secondly, parameters like gradient color, number of particles, line distance etc should be configurable through props. Also let’s add some fluent syntax to Particle class.

https://github.com/apsg/particles/commit/f24243f9785ae69d99ae0137da5767b22f44f794

Note: To run the demo at this point just serve the project using Vue CLI:

vue serve demo/Demo.vue

or

npm run dev

Package it

Final step is to package and bundle the code for reusability and to publish it for npm.

Unfortunately Vue documentation is not very helpful. It points to main direction but leaves with few loose ends to fix on your own.

https://vuejs.org/v2/cookbook/packaging-sfc-for-npm.html

The biggest one is to be even able to compile it we have to add VuePlugin to rollup.config.js

import VuePlugin from "rollup-plugin-vue";
...
    plugins: [
        VuePlugin(),
        ... 

Note that the order of plugins matter and VuePlugin should be first one.

After cleaning up some imports in rollup config we can finally use npm run build to create 3 versions of bundled code. The final step is to publish it to NPM.

Conclusions

There are already great alternatives to this package, for example this one I discovered while trying to publish my own package to npm (names clash!). So what's the point in creating another one? Isn't it just another trash-package out there in code multiverse, which makes it harder to find real useful ones?

Learning! Creating this package took me two evenings. In the process:

  • I refreshed my little rusty knowledge of p5.js,
  • learned how to create npm package containing Vue components,
  • learned how to bundle things using rollup,
  • published my first package to npm,
  • created this blog-like article/readme showing my whole thought process (which can be useful for learning purposes, I presume).

I will work on my package for fun and to use it in another personal project (it gives me the ability to add images in form of static points).