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

@frontfactory/readmore

v1.2.0

Published

Lightweight plugin to clamp text to N lines with ellipsis and a read more action.

Readme

Readmore JS

Version Downloads License

Lightweight, framework-agnostic plugin to clamp text to N lines (or a fixed pixel height) with an ellipsis and a Read more / Read less toggle button.

  • Zero dependencies, ~1 KB
  • TypeScript types included
  • CSS-driven clamping via -webkit-line-clamp or max-height
  • The toggle button is only created when the text actually overflows

Installation

npm install @frontfactory/readmore

Playground

Try it live on StackBlitz — no installation required:

Open in StackBlitz

Or run it locally:

npm run dev

Usage

import { ReadMore } from '@frontfactory/readmore';
import '@frontfactory/readmore/style.css';

// clamp to 3 lines
ReadMore.init('.excerpt', {
    lines: 3
});

// clamp to a fixed pixel height
ReadMore.init('.excerpt', {
    height: 80
});

Or instantiate against a single element:

const el = document.querySelector<HTMLElement>('#bio');

if (el) new ReadMore(el, {
    lines: 4
});

Options

| Option | Type | Default | Description | |-----------------|----------|------------------|--------------------------------------------------------------------| | lines | number | 3 | Number of lines to clamp to. Ignored if height is set. | | height | number | — | Max height in pixels. Takes precedence over lines when provided. | | moreText | string | 'Read more' | Label of the button when the text is collapsed. | | lessText | string | 'Read less' | Label of the button when the text is expanded. | | buttonClass | string | 'readmore-btn' | Class applied to the toggle button. | | expandedClass | string | 'is-expanded' | Class applied to the target element while expanded. | | openingClass | string | 'is-opening' | Transient class applied while expanding, removed after transition. | | closingClass | string | 'is-closing' | Transient class applied while collapsing, removed after transition.|

API

const instance = new ReadMore(element, options);

instance.toggle();      // expand / collapse programmatically
instance.expanded;      // boolean getter
instance.destroy();     // remove button, classes and listeners

ReadMore.init(selector, options); // returns ReadMore[]

How it works

The plugin sets a CSS custom property on the target element and toggles .readmore-clamp. In lines mode (default), it sets --readmore-lines and the bundled stylesheet applies -webkit-line-clamp, producing an ellipsis at the end of the last visible line. In height mode (height option), it sets --readmore-height and applies max-height via the .readmore-clamp--height modifier class instead. The toggle button is mounted right after the element only when the content actually overflows, and unmounted again on resize if the text ends up fitting.

Transient classes for animations

In addition to expandedClass (which stays applied for the entire expanded state), the plugin applies short-lived openingClass and closingClass markers on the target element at the moment of expand and collapse respectively. Each is added when the toggle starts and removed automatically once the CSS transition on the element ends — or on the next tick if no transition is declared. Use them as hooks to drive enter/leave animations:

.is-opening { 
    /* expand animation */
}

.is-closing {
    /* collapse animation */ 
}