Skip to content

Password Strength

A copy-paste form states component in pure HTML, CSS & vanilla JS. Zero dependencies, framework-agnostic, MIT-licensed.

Form StatesHTMLCSSJavaScriptany framework
Strong

Copy into your project

HTML
<!-- Password Strength — set data-strength to 0–4 from JS as the user types -->
<div class="nuda-pw">
  <input class="nuda-pw__input" type="password" placeholder="Password" />
  <div class="nuda-pw__meter" data-strength="0">
    <span></span><span></span><span></span><span></span>
  </div>
  <span class="nuda-pw__label">Weak</span>
</div>
CSS
/* Password Strength
   Strength meter with colored segments per level (1–4).
   Customize: --pw-bg, --pw-strong, the per-level colors. */

.nuda-pw {
  --pw-strong: #e4ff54;
  display: flex;
  flex-direction: column;
  gap: 8px;
  width: 100%;
  max-width: 240px;
}

.nuda-pw__input {
  width: 100%;
  padding: 10px 12px;
  background: rgba(255, 255, 255, 0.03);
  border: 1px solid rgba(255, 255, 255, 0.08);
  border-radius: 8px;
  color: #fafafa;
  font: 500 0.875rem ui-sans-serif, system-ui, sans-serif;
  outline: none;
  transition: border-color 0.25s;
}

.nuda-pw__input:focus { border-color: rgba(228, 255, 84, 0.4); }

.nuda-pw__meter {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 4px;
  height: 4px;
}

.nuda-pw__meter span {
  background: rgba(255, 255, 255, 0.06);
  border-radius: 2px;
  transform: scaleX(0.4);
  transform-origin: left;
  transition: background 0.3s, transform 0.3s;
}

.nuda-pw__meter[data-strength="1"] span:nth-child(-n+1),
.nuda-pw__meter[data-strength="2"] span:nth-child(-n+2),
.nuda-pw__meter[data-strength="3"] span:nth-child(-n+3),
.nuda-pw__meter[data-strength="4"] span:nth-child(-n+4) { transform: scaleX(1); }

.nuda-pw__meter[data-strength="1"] span:nth-child(-n+1) { background: #ff6363; }
.nuda-pw__meter[data-strength="2"] span:nth-child(-n+2) { background: #ffae54; }
.nuda-pw__meter[data-strength="3"] span:nth-child(-n+3) {
  background: var(--pw-strong);
  box-shadow: 0 0 4px rgba(228, 255, 84, 0.3);
}
.nuda-pw__meter[data-strength="4"] span:nth-child(-n+4) {
  background: var(--pw-strong);
  box-shadow: 0 0 6px rgba(228, 255, 84, 0.5);
}

.nuda-pw__label {
  font: 600 0.625rem ui-sans-serif, system-ui, sans-serif;
  color: var(--pw-strong);
  text-transform: uppercase;
  letter-spacing: 0.08em;
}
JavaScript
/* Password Strength — minimal scoring you can swap for zxcvbn / your rules. */

(function () {
  var input = document.querySelector('.nuda-pw__input');
  var meter = document.querySelector('.nuda-pw__meter');
  var label = document.querySelector('.nuda-pw__label');
  if (!input || !meter || !label) return;

  var labels = ['', 'Weak', 'Fair', 'Strong', 'Excellent'];

  function score(v) {
    if (!v) return 0;
    var n = 0;
    if (v.length >= 8) n++;
    if (/[A-Z]/.test(v) && /[a-z]/.test(v)) n++;
    if (/\d/.test(v)) n++;
    if (/[^A-Za-z0-9]/.test(v)) n++;
    return n;
  }

  input.addEventListener('input', function () {
    var s = score(input.value);
    meter.dataset.strength = String(s);
    label.textContent = labels[s] || '';
  });
})();

How to use Password Strength

Paste the HTML where you need it and the CSS into a global stylesheet (or a <style> tag). Every class is prefixed nuda- so it never collides with Tailwind or your own styles. Tweak the CSS custom properties to match your design system.

Works in React, Vue, Svelte, Astro, Next.js, Nuxt, Laravel Blade, Django, Rails — or a single .html file. No npm install, no build step.

More form states components

← Browse all NudaUI components