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

velm

v0.1.1

Published

Accessors/bindings for HTML element states

Downloads

2

Readme

velm

Introduction

Velm allows developers to attach JavaScript accessors/bindings on HTML view element state to JavaScript properties. These bindings have the following properties:

  • View-backed. With most binding libraries, custom JavaScript objects serve as the models for the binding. Velm is different. Bindings in velm are backed by directly by state stored in the view.
  • Two-way directionality. Bindings are two-way, because velm creates both the getter and the setter for you.
  • Flexible. A binding can be created to link any supported HTML element to any JavaScript object.
  • Consistent. Values returned by bindings are always consistent with the state in the view.
  • Light-weight. Bindings do not incur a maintenance penalty.

License

Alternatives

Velm is not for everyone. Some features are not present in Velm. For example, Velm does not have:

  • State change notification. Velm does not provide mechanisms to notify or respond to state changes. Developers are encouraged to utilize existing DOM event notification or use jQuery callbacks.
  • Templating. Velm does not provide templating.

If Velm does not meet your needs, then you might want to consider other binding libraries. These will provide a slightly different paradigm that might be better suited for your project. Fully baked binding libraries include:

  • Angular.js
  • Rivets.js

Sample Usage

Suppose we have a blank ui object:

var ui = {}
var div = document.getElementsByTagName('div')[0];

Standard bindings

HTML

On this ui object, we can attach a property that gives us access to the html within that div. The code for this very simple:

div.bind
  .html
  .to(ui, 'alert');

This will allow use to get and set the content of div via ui.content. For example, we can now do:

ui.alert = '<b>Hello world!</b>'
console.log(ui.alert);

.bind.html can provide an easy way to inject HTML into your page. For this reason, it's use should be both encouraged and discouraged. Be careful, when using this method with request or user-provided data. bind.html provides easy access to html, but this can also mean easier access for hackers to inject abritrary scripts.

Text

Of course, we do provide it's safer cousin .bind.text. We can replace the previous html binding with the following:

div.bind
  .text
  .to(ui, 'alert');

Again, we can set the alert message with a simple assignment. This time, however, the message will be in text.

ui.alert = 'Hello world!'

Classes

We can use the classList property to attach the class string on the element to an array of classes in the model. This is easier than it might sound. To do this, we just need to write:

div.bind
  .classList
  .to(ui, 'look');

And now, if we have Bootstrap configured, we can add in some Bootstrap classes with a simple assignment.

ui.look = [ 'btn', 'btn-default' ];

Often times, we will be using the existence of a class just to record the switch state. With bind.hasClass and bind.noClass, we can do both with a direct and an inverse mapping. Here's the direct mapping example:

article.bind
  .hasClass('on')
  .to(ui, 'showDate');

And here's the inverse mapping equivalent:

article.bind
  .noClass('off')
  .to(ui, 'showDate');

In both cases, we easily turn on dates with:

ui.showDate = true;

Attributes

If an element has a boolean attribute with values are like 'true' or 'false', 'yes' or 'no', we can expose whether or not it has a truthy value with bind.hasTruthyAttr. For example, we can bind an iframe's allowTransparency attribute. This exposes its value as a boolean property:

    iframe.bind
      .hasTruthyAttr('allowTransparency')
      .to(ui, 'iframeTransparent');

And we can do the inverse with bind.noTruthyAttr:

    iframe.bind
      .noTruthyAttr('allowTransparency')
      .to(ui, 'iframeOpaque');

To convert the attribute string, we trim and lowercase it, before a comparison is made. This should produce the following results:

Value | Truthy? -----------|-------- undefined | no null | no '' | yes 'undefined'| yes 'null' | yes 'yes' | yes 'no' | no 'true' | yes 'false' | no '1' | yes '0' | no

  •      | yes

Both hasTruthyAttr and noTruthyAttr provide setters. Their behavior is very different however. With hasTruthyAttr, we can assign most values to the property. Velm will do it's best to cast that value to a string before assigning to the attribute.

With noTruthyAttr, however assignment of a value to the property will result in the attribute being assigned the 'false' string if that value is JavaScript true and the 'true' string if that value is JavaScript false.

Specialized bindings

What we've talked about prior, are standard bindings. Velm also has specialized bindings for specialized elements.

Select elements

The bind property of select elements has an additional property called selectValue. Using this property, we can bind the value of this select element to the a boolean variable. For example:

    select.bind
      .selectValue
      .to(ui, 'color');

Input elements

Input elements of type text or password and textarea elements, have an additional property called textValue. We can use this property to attach variables to the text value of the input box or the textarea. For example, for input elements we can have the following:

    input.bind
      .textValue
      .to(ui, 'key');

And similarly, for textareas, we can have:

    textArea.bind
      .textValue
      .to(ui, 'message');

Radio elements

Input elements of type radio have an additional property called groupValue. groupValue allows us to attach properties to value of the radio group. It would look as follows:

    radio.bind
      .groupValue
      .to(ui, 'input');

An error will be thrown if the value assigned to the property is not found in any corresponding radio button's value attribute.

Checkbox

Input elements of type checkbox have an additional property called checked. checked allows us to attach a boolean property to the checked state of the checkbox. For example:

    checkbox.bind
      .checked
      .to(ui.options, 'showKey');