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

magnetjs

v0.1.0

Published

Library for creating your own online magnets board.

Downloads

4

Readme

Magnet JS

#MagnetJS

An open source javascript library that allows you to create interactive fridge magnets.

npm version MIT license npm downloads

Live Example: www.online-fridge.com/example

Live Example (with dark theme): www.online-fridge.com/codetheme

Overview

MagnetJS is an open source javascript library for creating and interacting with virtual fridge magnets.

The library can be used in local mode (local movement of magnets), or using the online-fridge.com api (anybody can move the magnets in real-time).

It is designed to be modular and include other components in the future (for example post-it notes).

See the Quick Start section to get started.

Quick Start

To get started using MagnetJS, include the library.

<script src="magnet.min.js"></script>

Add a target to your website (this is where you board will be built).

<div id="root" />

Create your board (target: is the 'id' of your target element)

const board = new Magnet({ target: 'root' });

After the dom has loaded, mount the board.

window.onload = () => {
  board.mount();
};

And Vualá!!

MagnetJS Example

Making changes

To make changes to the library and test it out.

npm install

And run the example app:

npm start

The files that load the board are in example/html/..

Methods

mount()

Mounts the board to the target (set in config). This must only be called once the DOM has loaded.

Config

All values apart from the target are optional, however if you include a theme or item config they must be complete.

id

The id: value is not the target element for your board. This is used to identify the board when using online mode (see Online Mode). The board can also be viewed by visiting www.online-fridge.com/{id here}.

target

The target: value mounts the board to the DOM element with that id. In the example this is "root".

width

In pixels, the width of the board (not target element).

height

In pixels, the height of the board (not target element).

items

This contains the config for items on the board, they can come in one of two formats.

items -> Array

Array of items (for example, a letter item config as described here)

items -> Object

Items config, this is the information that is required to generate items.

spawn

The number of components to generate for the board.

options

An object containing options for the items. These are defined in the component config (for example here).

theme

An array of styles to be used as a theme for the board and its content.

If the structure of this config seems a little odd it is because it must also mimic the database structure for the use of the online-fridge.com api.

Each style is a javascript object with the following structure:

code

This value should be one of the following:

  • background - This means to set the style to the background of the board, this can be an rgb value for example.

  • color - This is to create a specific theme color that can be uniquely defined per item (see item 'color' values in the Letter component README)

  • Component name, e.g letter - This means a style to set for a specific item

id

This value should always be 1 unless it the style object has code: 'color'. If it has a 'color' code then it should increment per value and be used as a unique identifier for each color.

key

This value must be one of the following:

  • The key in css 'key / value pairs' but with camelCase instead of css hyphen-case.

  • rgb, which would convert into an rgb color value. This is then handled differently depending on the code value of the style object. For example, the background code will set this value as the background.

value

This will the one of the following:

  • The value in css 'key / value pairs'. This value can also perform calculations on the color value of its item. To do this you should use the following syntax:
    key: "textShadow",
    value : "0 10px 0 rgb({[r]-50},{[g]-50},{[b]-50})"

This is the same as an es6 template literal but without the $ and assuming that the rbg values are storage as variable with the name r, g and b. This allows you also use variations of the rgb color values.

Example config

var config = {
  id: 'test', // ID of the board (if using sockets)
  target: 'root', // ID of the element to build the board onto
  width: 1000, // Width of the board (px)
  height: 1000, // Height of the board (px)
  items: {
    spawn: 100, // Spawn 100 items to the board
    options: {
      text: ['Toast','is','Food','for','my','belly'], // Text combinations to create the items with.
      color: [1,2,3,4,5], // The themes color unique identifiers.
      type: 'Letter' // The item type
    }
  },
  theme: [
    {code: "background", id: 1, key: "rgb", value: "50,50,50"}, // Set the board background to rgb(50,50,50)
    {code: "color", id: 1, key: "rgb", value: "132,159,187"}, // First theme color
    {code: "color", id: 2, key: "rgb", value: "179,159,161"}, // Second theme color
    {code: "color", id: 3, key: "rgb", value: "110,201,151"}, // Third theme color
    {code: "color", id: 4, key: "rgb", value: "183,101,191"}, // Fourth theme color
    {code: "color", id: 5, key: "rgb", value: "255,132,107"}, // Fifth theme color
    {code: "letter", id: 1, key: "fontFamily", value: "'Baloo Bhaina', cursive"}, // Font family for `letter` component
    // Text shadow for the `letter` component that uses the theme color to build a shade.
    {
      code: "letter",
      id: 1,
      key: "textShadow",
      value : "0 1px 0 rgb({[r]-50},{[g]-50},{[b]-50}), 0 2px 0 rgb({[r]-50},{[g]-50},{[b]-50}), 0 3px 0 rgb({[r]-50},{[g]-50},{[b]-50}), 0 4px 0 rgb({[r]-50},{[g]-50},{[b]-50}), 0 5px 0 rgb({[r]-50},{[g]-50},{[b]-50}), 6px 6px 20px rgba(0,0,0,.1)"
    }
  ]
};

Online Mode

To enable the use of the online-fridge.com api you must:

Load socket.io from online-fridge.com

<script src="http://www.online-fridge.com/socket.io/socket.io.js"></script>

Include the id of the board you want to access in the config.

const board = new Magnet({
 target: 'root',
 id: 'example'
});

Compatibility

Browser support could stretch back further but will need further testing to confirm.

| Device | Browser | Version | |---------|---------|-------------| | Mobile | Safari | IOS 11.4.0+ | | Mobile | Chrome | 67.0.x+ | | Desktop | Chrome | 67.0.x+ | | Desktop | Safari | 11.1+ | | Desktop | Firefox | 40.0.2+ |

FAQ

Why did you make this?

For fun.... mostly. This was also my project for familiarising myself with sockets and javascript modules.

Why did you not choose canvas?

The decision for not using canvas was based on the idea that anybody can add to their own components. As DOM is more common I decided to not use canvas.

What I would like to change

  • There is some ambiguity between how classes are accessed, I would like to re-evaluate the class structure with SOLID design.

  • I would like to look at better alternative ways to load css, the current method of dynamically adding stylesheets to the webpage is probably not the bet option.

  • Move the config initialisation out of the socket class, this is more of a TODO as a result from originally not designing it to work offline.

  • Make this compatible for modern javascript libraries like ReactJS and VueJS. I started this project early on in my career as a developer and was not fully aware of these technologies and their importance at the time.

Release History

  • 0.1.0
    • The first proper release. Includes all core functionality for magnets and socket.io implementation.

Meta

MrVann - https://github.com/MrVann

Distributed under the MIT license. See LICENSE for more information.

Contributing

  1. Fork it (https://github.com/MrVann/MagnetJS/fork)
  2. Create your feature branch (git checkout -b feature/fooBar)
  3. Commit your changes (git commit -am 'Add some fooBar')
  4. Push to the branch (git push origin feature/fooBar)
  5. Create a new Pull Request