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

ottavino

v0.2.4

Published

tiny, fast and declarative custom elements library (but not only custom elements)

Downloads

10

Readme

ottavino

The piccolo /ˈpɪkəloʊ/ (Italian pronunciation: [ˈpikkolo]; Italian for "small", but named ottavino in Italy)

Tiny, Fast and Declarative User Interface Development

Using native custom elements API (but not only)

Build Status

As simple as it gets.

See the docs

import { component } from 'ottavino'

component({
  tag: 'tiny-moji',
  template: '<span>{{this.moodIcon}}</span>',
  shadow: true, // optional shadow DOM
  properties: {
    moodIcon: '😃'
  },
  attributes: {
    mood: function(newValue /*, oldValue, domElement */) {
      this.moodIcon = newValue === 'sad' ? '😢' : '😃'
    }
  }
})
<tiny-moji></tiny-moji>
<tiny-moji mood="sad"></tiny-moji>

IIFE Version (no es-modules)

<script src="/path/to/ottavino/index.nomodule.js"></script>
window.ottavino.component({
  // here you go
});

Footprint (KBGzipped) ~1.5

1534 bytes in commit hash 8c90491

API

component(options: ComponentDescriptor<T?>) => ComponentProxy<T>

ComponentDescriptor

  • tag? When creating a custom element, this will be the DOM tag name.
  • mount? When you want to "upgrade" a legacy element on the DOM (like a <div>) and make it behave just like it was a custom element. It can be a queryselector to be executed on the document or a reference to an element instance
    • If no tag nor mount are used (or both used) - expect dragons.
  • template: string (or reference for an existing HTML template element for reuse)
  • properties? key-value properties that are reflected from the DOM element into the component handler ("proxy")
  • attributes? key-value of functions handling attribute changes. Functions receives the new and old values and a reference to the DOM element. this will refer to the handler
  • init? Initialization function during component construction. The passed argument is the DOM reference
  • this? Your (optional) component handler. Anything can go here. From within the template, and usage of this would reach this object. If none defined, it will generate a default component proxy
  • shadow? opt in for shadow DOM
  • closed? opt in for closed mode shadow DOM
  • connectedCallback? linked with the DOM connectedCallback
  • disconnectedCallback? linked with the DOM disconnectedCallback

Under the hood

<span>{{this.counter}}</span>
<button onclick="{{this.counter++}}">Count UP!</button>
<button onclick="{{this.counter = 0}}">Reset</button>
<button onclick="{{this.hereBeDragons()}}DONT PUSH BUTTON</button>

Anything evaluated between mustache-braces will be executed within the component's context. Every execution can reach this (the component logic) and component as a reference to the DOM element. The component-handler is a component-proxy object that reflects anything to the actual DOM element and vice versa. The proxy is reachable from the DOM via proxy property name. Event handlers (any attribute that starts with "on...") also can use event as an argument passed into the expression.

Fun

Try mounting your awesome component (with shadow DOM) to the document body instead of using a custom element. In your template, don't use slots. Embed it in another webpage. Fun :unicorn:

Contribution / Roadmap

This project attempts to create the simplest developer experience while using the lastest and greatest features the borwser can provide. Next in the list:

  • "directives" (custom attributes that executes... anything),
  • Lifecycle global hooks
  • Plugins
  • Suggest your idea

#usetheplatform