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

freudjs

v3.0.3

Published

Simple component-like javascript library for when you don't need React, Vue, etc.

Downloads

12

Readme

FreudJS

Master: Build Status

sigmund

Add behaviours to DOM elements, somewhat like components. These are simple Javascript classes that can do whatever you want with the element. For when you need something simpler and more light weight than a library like jQuery, Vue or React.

freudsignature

What is a behaviour?

A behaviour is a simple class with a constructor that gets passed the element they are applied to. That class can then do all sorts of magical and not so magical things with that element.

This concept started out as a jQuery library I built a few years ago (abuisman/jquery-freud). Nowadays I found myself not wanting to introduce jQuery in new projects, but also not wanting to setup using bigger UI libraries like React and Vue. I therefore revamped the freud concept into this VanillaJS incarnation.

An example (ES6)

class IncreaseCount {
  constructor(element, options) {
    this.element = element;
    this.options = options;

    this.count = this.element.dataset['count'] || 0;
    this.element.innerHTML += "<button>Add one</button>";
    this.element.querySelector('button').addEventListener('click', this.buttonClick);
  }

  buttonClick = () => {
    this.count = this.count + 1;
    this.element.querySelector('.count').innerText = this.count;
  }
}

For brevity the above code is in ES6, but you can use any class you want. FreudJS creates an instance like this: new behaviour(element, options = {}).

You can now tell FreudJS about the behaviour like so:

Freud.register(IncreaseCount)

FreudJS now knows this behaviour as 'IncreaseCount'. If you want to use a different name you can do:

Freud.register('OtherName', IncreaseCount)

Of course you can also directly declare the behaviour as you pass it to freud:

Freud.register(
  class OttoLoewi {
    constructor(element, options = {}) {
      neurotransmit(element);
    }
  }
)

Applying behaviours

Data attribute 'behaviours'

By default behaviours can be applied to an element by setting a data attribute called behaviours on them with the name of the behaviour(s) as the value:

 -- HTML:
  <div class='greeting-card' data-behaviours='greetingCard'></div>

 -- Javascript


  $(function() {
    $('[data-behaviours]').freud();
  });

Passing behaviours to freud()

Alternatively you may pass data-attributes to FreudJS by passing an array to FreudJS when selecting elements:

-- HTML:
  <div class='greeting-card'></div>

-- Javascript
  // Freud comes with a document.ready implementation, but you can use your own:
  Freud.ready(function() {
    Freud.init(document.querySelector('.greeting-card'), { behaviours: ['greetingCard'] });
  });

Hybrid

You can also use both methods at the same time:

-- HTML:
  <div class='greeting-card' data-behaviours='anotherBehaviour'></div>

-- Javascript
  Freud.init(document.querySelector('.greeting-card'), { behaviours: ['greetingCard'] });

Other key

You can also use your own key in case you don't want to use 'behaviours':

 -- HTML:
  <div class='greeting-card' data-custom-key='greetingCard'></div>

 -- Javascript
  Freud.init('[data-behaviours]', { behaviourKey: 'custom-key' })

More than one behaviour

Apply more than one behaviour to the same element by passing a JSON array as the behaviours value:

  <div class='greeting-card' data-behaviours='["GreetingCard", "HelloWorld"]'></div>

  -- Javascript
  Freud.init()

You can also apply many behaviours through passing behaviours through the FreudJS function:

-- HTML:
  <div class='greeting-card'></div>

-- Javascript
  Freud.init(document.querySelector('.greeting-card'), { behaviours: ['greetingCard', 'anotherBehaviour'] });

Example uses

Some things that I have used behaviours for:

  • In a calculations app we have charts displaying the results of calculations. My behaviour sits on the chart's container and opens up the web socket connection to listen for changes to the chart.

  • In forms you sometimes have select boxes that manage the values of other select boxes. E.g. 'select country', 'select city'. When you select a country the list of cities changes to display the cities for that country, etc. Instead of binding directly to the first select box, you can manage the code more easily in a behaviour that you put on the whole form. If you use the same pattern more often for different forms you can even apply multiple behaviours:

<form behaviours='[“CountrySelect”, ”GoogleMaps”]'>

Feedback

If you find any bugs or issues please create a ticket here (on github). If you have any questions feel free to e-mail me at the e-mail address contained in the package.json.

Contributing

With regards to bugs and issues, or when you find a killer feature for FreudJS please consider contributing.

Webpack

FreudJS is written in ES6. You can edit the file in src and build it by running the command npm run build. Open spec/test.html in order to run the specs in your browser and have the library available to you during development. In which case running npm run dev is probably useful as it will compile the freud.js version for you continuously as you make changes.

Just make sure to add tests and build both the dev and minimal version with npm run build when you are done.

Also make sure that all tests are passing by running npm test.

License


The MIT License (MIT)

Copyright (c) 2017 Achilleas L.D. Buisman

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.