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 🙏

© 2025 – Pkg Stats / Ryan Hefner

@lit-any/forms

v0.12.3

Published

Construct HTML forms from lightweight snippets for each field using `lit-html`

Downloads

42

Readme

@lit-any/forms codecov

Construct HTML forms from lightweight snippets for each field using lit-html

Installation

yarn add @lit-any/forms lit-html lit-element

Form setup

First you have to define a contract which will drive the form's appearance and functionality.

const contract = {
  fields: [{
    title: 'Age',
    property: 'age',
    type: 'http://www.w3.org/2001/XMLSchema#integer'
  }]
}

The contract will be used on a lit-form element to create an interactive form:

<lit-form .contract=${contract}
          submit-button-label="Register"
          @submit=${submitModel}></lit-form>

When the Register button is clicked submitModel will be called where the code will retrieve the form's value from event.detail.value.

function submitModel(e) {
  // submit lit-form's value
  fetch(e.detail.target, {
    method: e.detail.method,
    body: e.detail.value,
  })
}

The above is not enough to build a rich, convincing user experience as the form does not know how to receive the user's input. A plain <input type="text"> will be rendered.

Field setup

There are two ways for influencing the appearance of individual form input fields.

Pre-built component sets

The recommended way is to use a component to go with each field. Those components are imported as sets of elements which share design features and look & feel. Currently there are two such component sets being worked on:

The snippet below would be used to render a Vaadin text input for the age property used above

import { FieldTemplates } from '@lit-any/forms'
import { textbox } from '@lit-any/forms/components'
import vaadin from '@lit-any/components-vaadin'

// register Vaadin components to be used
FieldTemplates.default.useComponents(vaadin)

// render textbox when type in xds:integer
FieldTemplates.default.when
  .fieldMatches(field => field.type === 'http://www.w3.org/2001/XMLSchema#integer')
  .renders(textbox({
    type: 'single line',
  }))

Custom form fields

Alternatively the element's template can be handcrafted:

import { FieldTemplates } from '@lit-any/forms'

FieldTemplates.default.when
  .fieldMatches(field => field.type === 'http://www.w3.org/2001/XMLSchema#integer')
  .renders((field, id, value, set) => {
    return html`<input type=number value=${value} id=${id}
                       @change=${e => set(Number.parseInt(e.target.value, 0))}>`
  })

The field parameter is the description from the contract.

The id is unique id which can be set to the field.

The value is the initial value, if any. Setting it back will have no effect.

The set parameter is a function used to set tha value back to the form's model and has to be bound to the input control.