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

@rhtml/modifiers

v0.0.148

Published

Reactive HyperText Markup Language

Readme

@rhtml/modifiers

Installation

npm i @rhtml/modifiers

Every modifier is actually custom attribute and modifiers is using package @rhtml/custom-attributes

FlexLayout Modifiers

Inspired by Angular Flex Layout, FlexLayout provides declarative responsive layout directives for web components. It uses CSS flexbox under the hood and supports media query breakpoints for adaptive layouts.

Available Directives

| Directive | Description | |-----------|-------------| | fxLayout | Sets flexbox layout direction (row/column) | | fxLayoutGap | Adds spacing between flex children | | fxLayoutAlign | Sets alignment of flex children | | fxFlex | Controls flex sizing of elements | | fxFlexFill | Makes element fill available space | | fxFlexAlign | Aligns a single element (align-self) | | fxFlexOffset | Adds left margin offset | | fxFlexOrder | Changes element order |

Breakpoints

FlexLayout supports responsive breakpoints matching Angular Flex Layout:

| Breakpoint | Media Query | Description | |------------|-------------|-------------| | xs | (max-width: 599px) | Extra small screens | | sm | (600px - 959px) | Small screens | | md | (960px - 1279px) | Medium screens | | lg | (1280px - 1919px) | Large screens | | xl | (1920px+) | Extra large screens | | lt-sm | (max-width: 599px) | Less than small | | lt-md | (max-width: 959px) | Less than medium | | lt-lg | (max-width: 1279px) | Less than large | | gt-xs | (min-width: 600px) | Greater than extra small | | gt-sm | (min-width: 960px) | Greater than small | | gt-md | (min-width: 1280px) | Greater than medium | | gt-lg | (min-width: 1920px) | Greater than large |

Usage: fxLayout.lt-md="column" applies column layout on screens smaller than medium.

Usage

import { Component, css, html, LitElement } from '@rxdi/lit-html';

import { FlexLayout } from '@rhtml/modifiers';

/**
 * @customElement home-component
 */
@Component({
  selector: 'home-component',
  style: css`
    .container {
      height: 200px;
    }

    .block {
      background: red;
      flex: 1;
    }
  `,
  modifiers: [...FlexLayout],
  template(this: HomeComponent) {
    return html`
      <div class="container" fxLayout="row" fxLayoutGap="10px">
        <div>
          <div class="block" fxLayoutAlign="center center" fxFlexFill>A</div>
        </div>
        <div>
          <div class="block" fxLayoutAlign="center center" fxFlexFill>B</div>
        </div>
        <div>
          <div class="block" fxLayoutAlign="center center" fxFlexFill>C</div>
        </div>
        <div>
          <div class="block" fxLayoutAlign="center center" fxFlexFill>D</div>
        </div>
      </div>
    `;
  }
})
export class HomeComponent extends LitElement {}

fxLayout

Sets display: flex and flex-direction on the element.

<!-- Row layout (default) -->
<div fxLayout="row">...</div>

<!-- Column layout -->
<div fxLayout="column">...</div>

<!-- Row with wrap -->
<div fxLayout="row wrap">...</div>

<!-- Responsive: row on desktop, column on mobile -->
<div fxLayout="row" fxLayout.lt-md="column">...</div>

Values: row, column, row wrap, column wrap, row inline, column inline

fxLayoutGap

Adds spacing between flex children. Applies margin to children (not on the container itself).

<!-- 10px gap between children -->
<div fxLayout="row" fxLayoutGap="10px">...</div>

<!-- Different gap on mobile -->
<div fxLayout="row" fxLayoutGap="0px" fxLayoutGap.lt-md="15px">...</div>

Note: In row layout, margin applies to the right side of each child except the last. In column layout, margin applies to the bottom of each child except the last.

fxLayoutAlign

Controls alignment of flex children along main and cross axes.

Format: fxLayoutAlign="<main-axis> <cross-axis>"

| Value | CSS Property | |-------|--------------| | start | justify-content: flex-start | | center | justify-content: center | | end | justify-content: flex-end | | space-between | justify-content: space-between | | space-around | justify-content: space-around | | space-evenly | justify-content: space-evenly | | stretch | align-items: stretch |

<!-- Space items horizontally, center vertically -->
<div fxLayout="row" fxLayoutAlign="space-between center">...</div>

<!-- Start horizontally, stretch vertically -->
<div fxLayout="row" fxLayoutAlign="start stretch">...</div>

<!-- Center both axes -->
<div fxLayoutAlign="center center">...</div>

Note: First value is main-axis (justify-content), second value is cross-axis (align-items). If only one value is provided, it applies to both axes.

fxFlex

Controls the flex property of an element. Supports various value formats:

<!-- Fill remaining space (default flex: 1 1 0.000000001px) -->
<div fxFlex>...</div>

<!-- Explicit empty (same as above) -->
<div fxFlex="">...</div>

<!-- 20% width, no grow -->
<div fxFlex="0 1 20%">...</div>

<!-- 100% width -->
<div fxFlex="100%">...</div>

<!-- Responsive: 100% on mobile, 50% on tablet -->
<div fxFlex="100%" fxFlex.gt-sm="50%">...</div>

<!-- Auto (grow and shrink) -->
<div fxFlex="auto">...</div>

<!-- None (flex: none) -->
<div fxFlex="none">...</div>

Value Formats:

  • Empty/no value → flex: 1 1 0.000000001px (fills space)
  • Percentage → flex: 1 1 <percentage> (e.g., 25%flex: 1 1 25%)
  • autoflex: 1 1 auto
  • noneflex: none
  • Three parts → flex: <grow> <shrink> <basis>

fxFlexFill

Makes the element fill available space in a flex container.

<div fxFlexFill>...</div>

CSS Applied:

margin: 0;
height: 100%;
width: 100%;
min-height: 100%;
min-width: 100%;

fxFlexAlign

Aligns a single element within a flex container (uses align-self).

<div fxFlexAlign="center">...</div>

Values: start, center, end, stretch, baseline

fxFlexOffset

Adds left margin offset to an element.

<div fxFlexOffset="20px">...</div>

fxFlexOrder

Changes the order of an element in a flex container.

<div fxFlexOrder="1">...</div>

Complete Example with Responsive Layout

import { Component, html, LitElement } from '@rxdi/lit-html';
import { FlexLayout } from '@rhtml/modifiers';

@Component({
  selector: 'dashboard-component',
  modifiers: [...FlexLayout],
  template(this: DashboardComponent) {
    return html`
      <!-- Main container: row on desktop, column on mobile -->
      <div
        fxLayout="row wrap"
        fxLayout.lt-md="column"
        fxLayoutGap="0px"
        fxLayoutGap.lt-md="15px"
        fxLayoutAlign="start stretch"
      >
        <!-- Table section: fills remaining space (80%) -->
        <div class="table-section" fxFlex="" fxFlex.lt-md="100%">
          <!-- table content -->
        </div>

        <!-- Sidebar: fixed 20% width -->
        <aside fxFlex="0 1 20%" fxFlex.lt-md="100%">
          <!-- sidebar content -->
        </aside>
      </div>
    `;
  }
})
export class DashboardComponent extends LitElement {}

Best Practices

  1. Use fxFlex="0 1 20%" for fixed-width sidebars - The 0 for grow prevents expansion beyond the basis
  2. Use fxFlex="" for content areas - This fills remaining space with default flex behavior
  3. Use responsive suffixes (.lt-md, .gt-sm) for adaptive layouts
  4. Combine with CSS - FlexLayout provides inline styles; use CSS classes for complex styling

Angular Layout

ngIf attribute available at the moment to test the logic which represents

import { Component, html, LitElement, state } from '@rxdi/lit-html';

import { AngularLayout } from '@rhtml/modifiers';

/**
 * @customElement home-component
 */
@Component({
  selector: 'home-component',
  modifiers: [...AngularLayout],
  template(this: HomeComponent) {
    return html`
      <div ngIf=${this.show}>
        My Content
      </div>

      <button @click=${() => this.toggle()}>Toggle</button>
    `;
  }
})
export class HomeComponent extends LitElement {
  @state()
  show: boolean;

  toggle() {
    this.show = !this.show;
  }
}

Animation modifier

List of available animations can be found Here

import { Component, html, LitElement } from '@rxdi/lit-html';

import { Animation } from '@rhtml/modifiers';

/**
 * @customElement home-component
 */
@Component({
  selector: 'home-component',
  modifiers: [Animation],
  template(this: HomeComponent) {
    return html`
      <h2 animated="slideInLeft" delay="1s">
        Your Animated Element
      </h2>
    `;
  }
})
export class HomeComponent extends LitElement {}