ContentScoreBar

Organism

Rule-based content quality score with Good ≥70 / Fair ≥40 / Poor <40 tier system. Each rule shown as a chip with passed/total count. role="progressbar" + aria-valuenow.

Live evaluation

Preview
Quality score
Good 80%
Min 20 charsHas numberHas uppercaseHas keywordMin 5 words

4 / 5 rules passed

Code
<%# Evaluate rules in your Express route, then pass score + results. %>
<%
  // const value   = req.body.content || '';
  // const rules   = [
  //   { label: 'Min 20 chars', check: function (v) { return v.length >= 20; }, points: 20 },
  //   { label: 'Has keyword',  check: function (v) { return /react/i.test(v); }, points: 20, hint: 'Include "React"' },
  //   // ...
  // ];
  // let earned = 0, total = 0;
  // const results = rules.map(function (r) {
  //   const pass = r.check(value); if (pass) earned += r.points; total += r.points;
  //   return { label: r.label, pass: pass, hint: r.hint };
  // });
  // const score = total > 0 ? Math.round((earned / total) * 100) : 0;
%>
<%- include('modules/ui/ContentScoreBar', {
  label: 'Quality score',
  score: score,
  results: results
}) %>

All tiers

Preview
Good (100%)
Good 100%
Rule 1Rule 2Rule 3Rule 4Rule 5

5 / 5 rules passed

Fair (60%)
Fair 60%
Rule 1Rule 2Rule 3Rule 4Rule 5

3 / 5 rules passed

Poor (20%)
Poor 20%
Rule 1Rule 2Rule 3Rule 4Rule 5

1 / 5 rules passed

Code
<%# Good tier  (score ≥ 70) %>
<%- include('modules/ui/ContentScoreBar', { score: 100, label: 'Good (100%)', results: allPassRules }) %>

<%# Fair tier  (40 ≤ score < 70) %>
<%- include('modules/ui/ContentScoreBar', { score: 60,  label: 'Fair (60%)',  results: halfPassRules }) %>

<%# Poor tier  (score < 40) %>
<%- include('modules/ui/ContentScoreBar', { score: 20,  label: 'Poor (20%)',  results: onePassRules  }) %>

Password strength

Preview
Password strength
Fair 50%
Min 8 charsUppercaseNumberSpecial char

2 / 4 rules passed

Code
<%# Server-side password rule evaluation (mirror of NextJS preview). %>
<%
  // const rules = [
  //   { label: 'Min 8 chars',  check: function (v) { return v.length >= 8; },          points: 25 },
  //   { label: 'Uppercase',    check: function (v) { return /[A-Z]/.test(v); },        points: 25 },
  //   { label: 'Number',       check: function (v) { return /\d/.test(v); },           points: 25 },
  //   { label: 'Special char', check: function (v) { return /[^A-Za-z0-9]/.test(v); }, points: 25 },
  // ];
%>
<%- include('modules/ui/ContentScoreBar', {
  label: 'Password strength',
  score: score,
  results: results
}) %>
Source modules/ui/ContentScoreBar.ejs