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

@preline/toggle-password

v4.2.0

Published

Preline UI is an open-source set of prebuilt UI components based on the utility-first Tailwind CSS framework.

Downloads

6,059

Readme

Toggle Password

Show or hide password field.

npm License: MIT Demo

Contents

Overview

The Toggle Password component provides a button to toggle password visibility in input fields. It allows users to switch between showing and hiding password text, improving usability while maintaining security.

Key Features:

  • Toggle password visibility
  • Show/hide password text
  • Support for multiple password fields
  • Grouped toggle support
  • Programmatic control via JavaScript API
  • Event system for visibility tracking

Installation

To get started, install Toggle Password plugin via npm, else you can skip this step if you are already using Preline UI as a package.

npm i @preline/toggle-password

CSS

@import the plugin's CSS file into your Tailwind CSS file.

@import "tailwindcss";

/* @preline/toggle-password */
@import "./node_modules/@preline/toggle-password/theme.css";

JavaScript

Include the JavaScript that powers the interactive elements near the end of your </body> tag:

<script src="./node_modules/@preline/toggle-password/index.js"></script>

Manual Initialization

Use the non-auto entry if you need manual initialization. In this mode, automatic initialization on page load is not included, so the component should be initialized explicitly.

<script type="module">
  import HSTogglePassword from "@preline/toggle-password/non-auto.mjs";

  new HSTogglePassword(document.querySelector("#toggle-password"));
</script>

Via Bundler

When using a bundler (Vite, webpack, etc.), import the plugin directly as an ES module.

@preline/toggle-password is the auto-init entry: it scans the DOM and initializes matching elements automatically.

import "@preline/toggle-password";

@preline/toggle-password/non-auto is the manual entry: use it when you want explicit control over when initialization happens, either via autoInit() or by creating a specific instance yourself.

import HSTogglePassword from "@preline/toggle-password/non-auto";

HSTogglePassword.autoInit();

// Or initialize a specific element manually
const el = document.querySelector("#toggle-password");
if (el) new HSTogglePassword(el);

TypeScript

This package ships with TypeScript type definitions. No additional @types/ package is needed.

Basic usage

The following example demonstrates the minimal HTML structure required for a toggle password component. This is a base template without custom styling - you can apply your own CSS classes and styles as needed. Clicking the button toggles password visibility.

<div class="relative">
  <input id="hs-toggle-password-first" type="password" name="password" class="py-3 px-4 block w-full border-gray-200 rounded-lg text-sm focus:border-blue-500 focus:ring-blue-500 dark:bg-neutral-800 dark:border-neutral-700 dark:text-neutral-400" value="12345qwerty" required>
  <button type="button" data-hs-toggle-password='{
      "target": "#hs-toggle-password-first"
    }' class="absolute inset-y-0 end-0 flex items-center pointer-events-none z-10 p-3.5">
    <svg class="shrink-0 text-gray-400 size-4" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
      <path class="hs-password-active:hidden" d="M13.359 11.238C15.06 9.72 16 8 16 8s-3-5.5-8-5.5a7.028 7.028 0 0 0-2.79.588l.77.771A5.944 5.944 0 0 1 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.134 13.134 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755-.165.165-.337.328-.517.486l.708.709z"/>
      <path class="hs-password-active:hidden" d="M11.297 9.176a3.5 3.5 0 0 0-4.474-4.474l.823.823a2.5 2.5 0 0 1 2.829 2.829l.822.822zm-2.943 1.299.822.822a3.5 3.5 0 0 1-4.474-4.474l.823.823a2.5 2.5 0 0 0 2.829 2.829z"/>
      <path class="hs-password-active:hidden" d="M3.35 5.47c-.18.16-.353.322-.518.487A13.134 13.134 0 0 0 1.172 8l.195.288c.335.48.83 1.12 1.465 1.755C4.121 11.332 5.881 12.5 8 12.5c.716 0 1.39-.133 2.02-.36l.77.772A7.029 7.029 0 0 1 8 13.5C3 13.5 0 8 0 8s.939-1.721 2.641-3.238l.708.709zm10.296 8.884-12-12 .708-.708 12 12-.708.708z"/>
      <path class="hidden hs-password-active:block" d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.133 13.133 0 0 1 1.66-2.043C4.12 4.668 5.88 3.5 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.133 13.133 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755C11.879 11.332 10.119 12.5 8 12.5c-2.12 0-3.879-1.168-5.168-2.457A13.134 13.134 0 0 1 1.172 8z"/>
      <path class="hidden hs-password-active:block" d="M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z"/>
    </svg>
    <span class="hs-password-active:hidden">
      <svg class="shrink-0 text-gray-400 size-4" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
        <path d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.133 13.133 0 0 1 1.66-2.043C4.12 4.668 5.88 3.5 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.133 13.133 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755C11.879 11.332 10.119 12.5 8 12.5c-2.12 0-3.879-1.168-5.168-2.457A13.134 13.134 0 0 1 1.172 8z"></path>
        <path d="M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z"></path>
      </svg>
    </span>
  </button>
</div>

Structure Requirements:

  • data-hs-toggle-password: Required on the toggle button, contains configuration options as JSON
  • :target: Required, must be a valid CSS selector pointing to the password input field
  • Password input field must exist in the DOM
  • Toggle button can be positioned anywhere (commonly inside a relative container)

Initial State:

  • Password input is hidden (type="password")
  • Toggle button shows "show" icon

Configuration Options

Data Options

Data options are specified in the data-hs-toggle-password attribute as a JSON object.

| Option | Target Element | Type | Default | Description | | --- | --- | --- | --- | --- | | data-hs-toggle-password | Toggle button | - | - | Activate a Toggle Password by specifying on an element. Should be added to the button (trigger). | | :target | Inside data-hs-toggle-password | string (CSS selector) | - | Determines which element will change type on click. This must be a valid CSS selector pointing to the password input field. Required. | | :isShown | Inside data-hs-toggle-password | boolean | false | Determines password visibility initially. When true, password is shown by default. | | :eventType | Inside data-hs-toggle-password | 'change' | 'click' | 'click' | Determines event type. click for button clicks, change for checkbox/radio changes. | | data-hs-toggle-password-group | Container element | - | - | This option allows you to group multiple toggle password elements together so that they can be toggled simultaneously. It should be added to the parent element of the toggle password elements. Should be added to the container. |

Example:

<button data-hs-toggle-password='{
  "target": "#hs-password-input",
  "isShown": false,
  "eventType": "click"
}'>
  Toggle
</button>

Tailwind Modifiers

| Name | Description | | --- | --- | | hs-password-active:* | A modifier that allows you to set Tailwind classes when the password was shown. |

JavaScript API

The HSTogglePassword object is available in the global window object after the plugin is loaded.

Instance Methods

These methods are called on a toggle password instance.

| Method | Parameters | Return Type | Description | | --- | --- | --- | --- | | show() | None | void | Toggle the field to type text (show password). Changes input type from password to text. | | hide() | None | void | Toggle the field to type password (hide password). Changes input type from text to password. | | destroy() | None | void | Destroys the toggle password instance, removes all generated markup, classes, and event listeners. Use when removing toggle password from DOM. |

Static Methods

These methods are called directly on the HSTogglePassword class.

| Method | Parameters | Return Type | Description | | --- | --- | --- | --- | | HSTogglePassword.getInstance(target, isInstance) | target: HTMLElement \| string (CSS selector)isInstance: boolean (optional) | HSTogglePassword \| { id: string \| number, element: HSTogglePassword } \| null | Returns the toggle password instance associated with the target. If isInstance is true, returns collection item object { id, element } where element is the HSTogglePassword instance. If isInstance is false or omitted, returns the HSTogglePassword instance directly. Returns null if toggle password instance is not found. |

Usage Examples

Example 1: Showing password programmatically

// Get the toggle password instance
const instance = HSTogglePassword.getInstance('#hs-toggle-password', true);

if (instance) {
  const { element } = instance;
  const showBtn = document.querySelector('#hs-show-btn');

  showBtn.addEventListener('click', () => {
    element.show();
  });
}

Example 2: Hiding password programmatically

const instance = HSTogglePassword.getInstance('#hs-toggle-password', true);

if (instance) {
  const { element } = instance;
  const hideBtn = document.querySelector('#hs-hide-btn');

  hideBtn.addEventListener('click', () => {
    element.hide();
  });
}

Example 3: Getting instance and accessing properties

// Get the toggle password instance
const instance = HSTogglePassword.getInstance('#hs-toggle-password', true);

if (instance) {
  const { element } = instance;

  // Access instance properties
  console.log('Is shown:', element.isShown);
  console.log('Target:', element.target);

  // Clean up when removing from DOM
  function removeTogglePassword() {
    element.destroy();
  }
}

Example 4: Destroying toggle password instance

const instance = HSTogglePassword.getInstance('#hs-toggle-password', true);

if (instance) {
  const { element } = instance;
  const removeBtn = document.querySelector('#hs-remove-btn');

  removeBtn.addEventListener('click', () => {
    // Clean up before removing from DOM
    element.destroy();
    // Now safe to remove the element
    document.querySelector('#hs-toggle-password').remove();
  });
}

Events

Toggle password instances emit events that can be listened to for visibility tracking and custom behavior.

| Event Name | When Fired | Callback Parameter | Description | | --- | --- | --- | --- | | on:toggle | When password was shown or hidden | HTMLElement (target input element) | Fires when password visibility changes. Returns the target password input element. |

Event Usage Example

// Get toggle password instance
const instance = HSTogglePassword.getInstance('#hs-toggle-password', true);

if (instance) {
  const { element } = instance;

  // Listen to toggle event
  element.on('toggle', (target) => {
    console.log('Password visibility toggled:', target);
    // Perform actions after password visibility changes
    // e.g., track analytics, update UI
  });
}

Common Patterns

Pattern 1: Grouped Toggle

Group multiple password fields to toggle simultaneously.

<div data-hs-toggle-password-group>
  <input type="password" id="password-1">
  <button data-hs-toggle-password='{"target": "#password-1"}'>Toggle</button>
  
  <input type="password" id="password-2">
  <button data-hs-toggle-password='{"target": "#password-2"}'>Toggle</button>
</div>

Pattern 2: Initially Shown

Show password by default.

<button data-hs-toggle-password='{
  "target": "#hs-password-input",
  "isShown": true
}'>
  Toggle
</button>

License

Copyright (c) 2026 Preline Labs.

Licensed under the MIT License.