{
  "example": "import { PasswordInput, PasswordStrength } from \"@godxjp/ui/data-entry\";\n\nexport default function PasswordBlock() {\n  const [value, setValue] = useState(\"\");\n  return (\n    <div className=\"ui-stack\">\n      <PasswordInput value={value} onChange={(event) => setValue(event.target.value)} />\n      <PasswordStrength value={value} rules={[\"length\", \"upper\", \"lower\", \"number\", \"symbol\"]} />\n    </div>\n  );\n}",
  "group": "data-entry",
  "importPath": "@godxjp/ui/data-entry",
  "name": "PasswordStrength",
  "props": [
    {
      "description": "The current password value to evaluate. While it is empty (or whitespace only) the meter is NEUTRAL (gh#1247): no segment lit, no tone, the label reads `labels.empty` (\"Enter a password\" / 「パスワードを入力」), every checklist item is `data-state=\"pending\"`, and the live region stays silent — no \"Weak\" verdict before anything is typed.",
      "name": "value",
      "required": true,
      "type": "string"
    },
    {
      "description": "`length` | `upper` | `lower` | `number` | `symbol`. Omit to use defaults.",
      "name": "rules",
      "type": "PasswordRule[]"
    },
    {
      "defaultValue": "true",
      "description": "Render an optional checklist of rule checks below the bar.",
      "name": "showChecklist",
      "type": "boolean"
    },
    {
      "defaultValue": "8",
      "description": "The length rule's threshold (gh#1193): drives the check, the score and the localized rule text (\"{n} 文字以上\" / \"{n}+ characters\"). Match the server's policy, e.g. 12 for Laravel Password::min(12), so the checklist never shows a password the server rejects as met.",
      "name": "minLength",
      "type": "number"
    },
    {
      "description": "Every visible and screen-reader string, each optional (gh#1191). Unset entries come from the kit's own ja / en / vi catalogue for the active locale, so most apps pass nothing: the score words, the neutral empty-field line (`empty`, gh#1247), the checklist line per rule (length / upper / lower / number / symbol), the sr-only passed / failed prefixes, and the polite live-region sentence (`announcement(strength)`). Pass only the ones your product words differently.",
      "name": "labels",
      "type": "{ weak?: string; fair?: string; strong?: string; empty?: string; rules?: Partial<Record<PasswordRule, string>>; passed?: string; failed?: string; announcement?: (strength: string) => string }"
    }
  ],
  "related": [
    "PasswordInput",
    "FormField",
    "Input"
  ],
  "rules": [
    3,
    6
  ],
  "storyPath": "data-entry/password-strength.tsx",
  "tagline": "Evaluates password quality with a 0-4 score and optional rule checklist. Use with PasswordInput in secure forms.",
  "usage": [
    "DO show PasswordStrength immediately below PasswordInput so users understand password quality before submitting.",
    "DO keep `rules` stable (default list is recommended for broad UI compatibility).",
    "DON'T treat the score as cryptographic strength; use it as a UI hint only."
  ],
  "useCases": [
    "Account signup password field",
    "Password reset workflow",
    "Admin user invite form"
  ]
}
