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

@lume/custom-attributes

v0.2.4

Published

Custom attributes: like custom elements, but for attributes

Downloads

347

Readme

Build status npm version

custom-attributes

Define custom attributes in the same way you can define custom elements, which allows for rich mixin types of behaviors on elements.

Spec duscussions

The idea of "custom attributes" (and similar ideas) are being discussed as possibilities for web specs.

Existing conversations (please notify if this needs an update):

  • Element Behaviors, and the has="" attribute. A useful alternative to Custom Elements in many cases! WICG/webcomponents#727
  • Alternative to customized builtins (custom elements with is=) w3c/tpac2023-breakouts#44
  • Proposal: Custom attributes for all elements, enhancements for more complex use cases WICG/webcomponents#1029
  • Customized built-in elements WebKit/standards-positions#97
  • Make custom attribute rules consistent with custom element name rules whatwg/html#2271

Install

npm install custom-attributes --save

Add as a script tag:

<script src="node_modules/custom-attributes/attr.js" defer></script>

Or import as an ES module:

import customAttributes from 'custom-attributes'

Or you can just import the CustomAttributeRegistry and create your own instance:

import {CustomAttributeRegistry} from 'custom-attributes'

const customAttributes = new CustomAttributeRegistry(document)

Example

<article bg-color="green">
	<p>This will be shown in a green background!</p>
</article>
class BgColor {
	connectedCallback() {
		this.setColor()
	}

	disconnectedCallback() {
		// cleanup here!
	}

	// Called whenever the attribute's value changes
	changedCallback() {
		this.setColor()
	}

	setColor() {
		this.ownerElement.style.backgroundColor = this.value
	}
}

customAttributes.default.define('bg-color', BgColor)

API

custom-attributes follows a very similar API as v1 custom elements, but rather than a class instance representing the host element, the class instance is meant to represent the attribute.

Lifecycle callbacks

connectedCallback

This is called when the attribute is first connected to the document. If the host element is already in the DOM, and the attribute is set, connectedCallback will be called as all registered attributes are upgraded.

If the host element is already in the DOM and the attribute is programmatically added via setAttribute, then connectedCallback will be called asynchronously after.

If the host element is being programmatically created and the attribute is set before the element is inserted into the DOM, connectedCallback will only call when the host element is inserted.

disconnectedCallback

Called when the attribute is no longer part of the host element, or the host document. This callback should be used if any cleanup is needed.

If the attribute is removed via removeAttribute, then disconnectedCallback will be called asynchronously after this change. If the host element is removed from the DOM, disconnectedCallback will be called asynchronously after as well.

changedCallback

Called any time the attribute's value changes, after connected. Useful if you need to perform work based on the attribute value such as the example given in this readme.

Properties

ownerElement

this.ownerElement refers to the element which the attribute is attached.

name

The attribute's name. Since multiple class definitions can be used for multiple attribute names, this.name is useful if you need to know what the attribute is being referred to as.

value

The current value of the attribute (the string value) is available as this.value.

License

BSD 2 Clause