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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@bclonan/softform

v1.3.1

Published

Tactile components for Vue, React, and browser-native custom elements

Readme

Softform

Softform is a library of 53 responsive components for Vue, React, and plain JavaScript. The components use native HTML controls, configurable motion, and a shared visual system. Each one has a prop reference, a live demo, and a Storybook story. The library also includes a data adapter registry and a component dictionary for agents.

Live examples · Component docs · Storybook · npm package

Screenshots

The examples use local sample data. The charts show staged loading and animate when values change.

Workspace dashboard

Softform workspace dashboard with metrics, activity chart, and navigation

Analytics report

Softform analytics report with metrics and animated charts

Component documentation

Softform documentation with the SfSegmented live demo and prop controls

React example

Softform React example with controlled input, navigation, and chart

Install

npm install @bclonan/softform

Install Vue 3.5 or React 18.3/19 if you use that framework. Both are optional peer dependencies. Plain JavaScript users can register custom elements without mounting a framework app.

Vue

<script setup>
import SfSurface from '@bclonan/softform/components/SfSurface';
import SfButton from '@bclonan/softform/components/SfButton';
import '@bclonan/softform/styles.css';
</script>

<template>
  <SfSurface as="section" aria-labelledby="project-heading">
    <h2 id="project-heading">Projects</h2>
    <SfButton variant="accent">Create project</SfButton>
  </SfSurface>
</template>

Import from the package root when you prefer named Vue exports. Import from components/SfName when you want a path for one component.

React

import { useState } from 'react';
import { SfInput } from '@bclonan/softform/react/SfInput';

function NameField() {
  const [name, setName] = useState('');
  return <SfInput label="Name" modelValue={name} onValueChange={value => setName(String(value))} />;
}

The React adapter registers the custom element, sets arrays and objects as DOM properties, and listens to its native events. Import only the adapters you use.

Plain JavaScript

import { registerSfSlider } from '@bclonan/softform/elements/SfSlider';

registerSfSlider();
document.querySelector('sf-slider').addEventListener('input', event => {
  console.log(event.detail.value);
});
<sf-slider label="Volume" min="0" max="100"></sf-slider>

Custom element imports include their renderer and scoped styles. The Vue API imports CSS separately. Component JavaScript imports are tree shakable; custom elements share the library stylesheet.

Explore the examples

Dashboard · Inbox · Settings · Analytics · Planner · React · Plain HTML · 53-element gallery

Selection components expose motion, motionDelay, motionDuration, and motionEasing. Charts and metric components can animate data loading with configurable delays and durations. SfInput passes native input types and their matching attributes to the actual input. SfAdaptedCards accepts REST, GraphQL, legacy, or custom payload adapters.

See the package guide, design guidelines, and live component reference for props, events, and usage advice.

Develop locally

npm install
npm run dev
npm run storybook
npm run check

npm run check runs the tests, package and example builds, type checks, tree shaking smoke checks, and the Storybook build. The example sites use local sample data.

MIT licensed. See LICENSE.