pass-strength-indicator 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +191 -0
- package/dist/index.d.mts +94 -0
- package/dist/index.d.ts +94 -0
- package/dist/index.js +852 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +839 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/translations/en.ts","../src/lib/translations/fr.ts","../src/lib/translations/es.ts","../src/lib/translations/de.ts","../src/lib/translations/pt.ts","../src/lib/translations/it.ts","../src/lib/translations/nl.ts","../src/lib/translations/pl.ts","../src/lib/translations/sv.ts","../src/lib/translations/uk.ts","../src/lib/translations/zh.ts","../src/lib/translations/ja.ts","../src/lib/translations/ko.ts","../src/lib/rules.ts","../src/lib/usePasswordStrength.ts","../src/lib/translations/index.ts","../src/lib/icons.tsx","../src/lib/PasswordStrength.tsx"],"names":["useMemo","jsx","clsx","useState","useEffect","jsxs","Fragment"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,IAAA,UAAA,GAAA,EAAA;AAAA,QAAA,CAAA,UAAA,EAAA;AAAA,EAAA,EAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAEa,EAAA;AAFb,IAAA,OAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAEO,IAAM,EAAA,GAAkB;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,WAAA;AAAA,QACV,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,KAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,mBAAA,EAAqB,4BAAA;AAAA,MACrB,gBAAA,EAAkB,mBAAA;AAAA,MAClB,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,wBAAA;AAAA,QACX,SAAA,EAAW,+BAAA;AAAA,QACX,SAAA,EAAW,+BAAA;AAAA,QACX,MAAA,EAAQ,qBAAA;AAAA,QACR,OAAA,EAAS,gCAAA;AAAA,QACT,OAAA,EAAS,6BAAA;AAAA,QACT,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,WAAA,EAAa,qBAAA;AAAA,MACb,KAAA,EAAO;AAAA,KACT;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvBA,IAAA,UAAA,GAAA,EAAA;AAAA,QAAA,CAAA,UAAA,EAAA;AAAA,EAAA,EAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAEa,EAAA;AAFb,IAAA,OAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAEO,IAAM,EAAA,GAAkB;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,gBAAA;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,KAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,mBAAA,EAAqB,iCAAA;AAAA,MACrB,gBAAA,EAAkB,gCAAA;AAAA,MAClB,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,2BAAA;AAAA,QACX,SAAA,EAAW,+BAAA;AAAA,QACX,SAAA,EAAW,+BAAA;AAAA,QACX,MAAA,EAAQ,qBAAA;AAAA,QACR,OAAA,EAAS,qCAAA;AAAA,QACT,OAAA,EAAS,kCAAA;AAAA,QACT,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,WAAA,EAAa,2BAAA;AAAA,MACb,KAAA,EAAO;AAAA,KACT;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvBA,IAAA,UAAA,GAAA,EAAA;AAAA,QAAA,CAAA,UAAA,EAAA;AAAA,EAAA,EAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAEa,EAAA;AAFb,IAAA,OAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAEO,IAAM,EAAA,GAAkB;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,cAAA;AAAA,QACV,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,mBAAA,EAAqB,+BAAA;AAAA,MACrB,gBAAA,EAAkB,+BAAA;AAAA,MAClB,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,wBAAA;AAAA,QACX,SAAA,EAAW,iCAAA;AAAA,QACX,SAAA,EAAW,iCAAA;AAAA,QACX,MAAA,EAAQ,uBAAA;AAAA,QACR,OAAA,EAAS,kCAAA;AAAA,QACT,OAAA,EAAS,2BAAA;AAAA,QACT,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,WAAA,EAAa,0BAAA;AAAA,MACb,KAAA,EAAO;AAAA,KACT;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvBA,IAAA,UAAA,GAAA,EAAA;AAAA,QAAA,CAAA,UAAA,EAAA;AAAA,EAAA,EAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAEa,EAAA;AAFb,IAAA,OAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAEO,IAAM,EAAA,GAAkB;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,cAAA;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,KAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,mBAAA,EAAqB,6BAAA;AAAA,MACrB,gBAAA,EAAkB,mBAAA;AAAA,MAClB,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,uBAAA;AAAA,QACX,SAAA,EAAW,oCAAA;AAAA,QACX,SAAA,EAAW,kCAAA;AAAA,QACX,MAAA,EAAQ,sBAAA;AAAA,QACR,OAAA,EAAS,8BAAA;AAAA,QACT,OAAA,EAAS,kCAAA;AAAA,QACT,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,WAAA,EAAa,4BAAA;AAAA,MACb,KAAA,EAAO;AAAA,KACT;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvBA,IAAA,UAAA,GAAA,EAAA;AAAA,QAAA,CAAA,UAAA,EAAA;AAAA,EAAA,EAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAEa,EAAA;AAFb,IAAA,OAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAEO,IAAM,EAAA,GAAkB;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,aAAA;AAAA,QACV,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,KAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,mBAAA,EAAqB,wBAAA;AAAA,MACrB,gBAAA,EAAkB,mBAAA;AAAA,MAClB,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,0BAAA;AAAA,QACX,SAAA,EAAW,mCAAA;AAAA,QACX,SAAA,EAAW,mCAAA;AAAA,QACX,MAAA,EAAQ,yBAAA;AAAA,QACR,OAAA,EAAS,kCAAA;AAAA,QACT,OAAA,EAAS,8BAAA;AAAA,QACT,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,WAAA,EAAa,kBAAA;AAAA,MACb,KAAA,EAAO;AAAA,KACT;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvBA,IAAA,UAAA,GAAA,EAAA;AAAA,QAAA,CAAA,UAAA,EAAA;AAAA,EAAA,EAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAEa,EAAA;AAFb,IAAA,OAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAEO,IAAM,EAAA,GAAkB;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,cAAA;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,mBAAA,EAAqB,gCAAA;AAAA,MACrB,gBAAA,EAAkB,0BAAA;AAAA,MAClB,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,qBAAA;AAAA,QACX,SAAA,EAAW,8BAAA;AAAA,QACX,SAAA,EAAW,8BAAA;AAAA,QACX,MAAA,EAAQ,kBAAA;AAAA,QACR,OAAA,EAAS,8BAAA;AAAA,QACT,OAAA,EAAS,iCAAA;AAAA,QACT,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,WAAA,EAAa,2BAAA;AAAA,MACb,KAAA,EAAO;AAAA,KACT;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvBA,IAAA,UAAA,GAAA,EAAA;AAAA,QAAA,CAAA,UAAA,EAAA;AAAA,EAAA,EAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAEa,EAAA;AAFb,IAAA,OAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAEO,IAAM,EAAA,GAAkB;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,WAAA;AAAA,QACV,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,mBAAA,EAAqB,6BAAA;AAAA,MACrB,gBAAA,EAAkB,mBAAA;AAAA,MAClB,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,oBAAA;AAAA,QACX,SAAA,EAAW,gCAAA;AAAA,QACX,SAAA,EAAW,kCAAA;AAAA,QACX,MAAA,EAAQ,2BAAA;AAAA,QACR,OAAA,EAAS,mCAAA;AAAA,QACT,OAAA,EAAS,6BAAA;AAAA,QACT,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,WAAA,EAAa,uBAAA;AAAA,MACb,KAAA,EAAO;AAAA,KACT;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvBA,IAAA,UAAA,GAAA,EAAA;AAAA,QAAA,CAAA,UAAA,EAAA;AAAA,EAAA,EAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAEa,EAAA;AAFb,IAAA,OAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAEO,IAAM,EAAA,GAAkB;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,mBAAA;AAAA,QACV,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM,cAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,mBAAA,EAAqB,qCAAA;AAAA,MACrB,gBAAA,EAAkB,sBAAA;AAAA,MAClB,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,0BAAA;AAAA,QACX,SAAA,EAAW,gDAAA;AAAA,QACX,SAAA,EAAW,mDAAA;AAAA,QACX,MAAA,EAAQ,mCAAA;AAAA,QACR,OAAA,EAAS,kCAAA;AAAA,QACT,OAAA,EAAS,4CAAA;AAAA,QACT,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,WAAA,EAAa,0BAAA;AAAA,MACb,KAAA,EAAO;AAAA,KACT;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvBA,IAAA,UAAA,GAAA,EAAA;AAAA,QAAA,CAAA,UAAA,EAAA;AAAA,EAAA,EAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAEa,EAAA;AAFb,IAAA,OAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAEO,IAAM,EAAA,GAAkB;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,cAAA;AAAA,QACV,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,KAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,mBAAA,EAAqB,wCAAA;AAAA,MACrB,gBAAA,EAAkB,oBAAA;AAAA,MAClB,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,iBAAA;AAAA,QACX,SAAA,EAAW,uBAAA;AAAA,QACX,SAAA,EAAW,wBAAA;AAAA,QACX,MAAA,EAAQ,iBAAA;AAAA,QACR,OAAA,EAAS,yBAAA;AAAA,QACT,OAAA,EAAS,qCAAA;AAAA,QACT,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,WAAA,EAAa,uBAAA;AAAA,MACb,KAAA,EAAO;AAAA,KACT;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvBA,IAAA,UAAA,GAAA,EAAA;AAAA,QAAA,CAAA,UAAA,EAAA;AAAA,EAAA,EAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAEa,EAAA;AAFb,IAAA,OAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAEO,IAAM,EAAA,GAAkB;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,qEAAA;AAAA,QACV,IAAA,EAAM,4CAAA;AAAA,QACN,IAAA,EAAM,kDAAA;AAAA,QACN,IAAA,EAAM,sCAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,mBAAA,EAAqB,+IAAA;AAAA,MACrB,gBAAA,EAAkB,mGAAA;AAAA,MAClB,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,gGAAA;AAAA,QACX,SAAA,EAAW,2JAAA;AAAA,QACX,SAAA,EAAW,+IAAA;AAAA,QACX,MAAA,EAAQ,gHAAA;AAAA,QACR,OAAA,EAAS,yLAAA;AAAA,QACT,OAAA,EAAS,yNAAA;AAAA,QACT,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,WAAA,EAAa,iFAAA;AAAA,MACb,KAAA,EAAO;AAAA,KACT;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvBA,IAAA,UAAA,GAAA,EAAA;AAAA,QAAA,CAAA,UAAA,EAAA;AAAA,EAAA,EAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAEa,EAAA;AAFb,IAAA,OAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAEO,IAAM,EAAA,GAAkB;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,oBAAA;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,cAAA;AAAA,QACN,IAAA,EAAM,cAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,mBAAA,EAAqB,kDAAA;AAAA,MACrB,gBAAA,EAAkB,0BAAA;AAAA,MAClB,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,kCAAA;AAAA,QACX,SAAA,EAAW,kDAAA;AAAA,QACX,SAAA,EAAW,kDAAA;AAAA,QACX,MAAA,EAAQ,sCAAA;AAAA,QACR,OAAA,EAAS,kDAAA;AAAA,QACT,OAAA,EAAS,kDAAA;AAAA,QACT,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,WAAA,EAAa,gCAAA;AAAA,MACb,KAAA,EAAO;AAAA,KACT;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvBA,IAAA,UAAA,GAAA,EAAA;AAAA,QAAA,CAAA,UAAA,EAAA;AAAA,EAAA,EAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAEa,EAAA;AAFb,IAAA,OAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAEO,IAAM,EAAA,GAAkB;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,gCAAA;AAAA,QACV,IAAA,EAAM,cAAA;AAAA,QACN,IAAA,EAAM,cAAA;AAAA,QACN,IAAA,EAAM,cAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,mBAAA,EAAqB,sFAAA;AAAA,MACrB,gBAAA,EAAkB,4CAAA;AAAA,MAClB,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,4BAAA;AAAA,QACX,SAAA,EAAW,6CAAA;AAAA,QACX,SAAA,EAAW,6CAAA;AAAA,QACX,MAAA,EAAQ,uCAAA;AAAA,QACR,OAAA,EAAS,mDAAA;AAAA,QACT,OAAA,EAAS,0EAAA;AAAA,QACT,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,WAAA,EAAa,kDAAA;AAAA,MACb,KAAA,EAAO;AAAA,KACT;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvBA,IAAA,UAAA,GAAA,EAAA;AAAA,QAAA,CAAA,UAAA,EAAA;AAAA,EAAA,EAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAEa,EAAA;AAFb,IAAA,OAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAEO,IAAM,EAAA,GAAkB;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,QAAA,EAAU,2BAAA;AAAA,QACV,IAAA,EAAM,cAAA;AAAA,QACN,IAAA,EAAM,cAAA;AAAA,QACN,IAAA,EAAM,cAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,mBAAA,EAAqB,+FAAA;AAAA,MACrB,gBAAA,EAAkB,uCAAA;AAAA,MAClB,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,uBAAA;AAAA,QACX,SAAA,EAAW,yCAAA;AAAA,QACX,SAAA,EAAW,yCAAA;AAAA,QACX,MAAA,EAAQ,mCAAA;AAAA,QACR,OAAA,EAAS,+CAAA;AAAA,QACT,OAAA,EAAS,8CAAA;AAAA,QACT,gBAAA,EAAkB;AAAA,OACpB;AAAA,MACA,WAAA,EAAa,uCAAA;AAAA,MACb,KAAA,EAAO;AAAA,KACT;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACrBO,IAAM,YAAA,GAA+B;AAAA,EAC1C;AAAA,IACE,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,CAAC,QAAA,KAAa,QAAA,CAAS,MAAA,IAAU;AAAA,GACzC;AAAA,EACA;AAAA,IACE,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,CAAC,QAAA,KAAa,OAAA,CAAQ,KAAK,QAAQ;AAAA,GAC3C;AAAA,EACA;AAAA,IACE,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,CAAC,QAAA,KAAa,OAAA,CAAQ,KAAK,QAAQ;AAAA,GAC3C;AAAA,EACA;AAAA,IACE,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,CAAC,QAAA,KAAa,OAAA,CAAQ,KAAK,QAAQ;AAAA,GAC3C;AAAA,EACA;AAAA,IACE,EAAA,EAAI,SAAA;AAAA,IACJ,IAAA,EAAM,CAAC,QAAA,KAAa,yCAAA,CAA0C,KAAK,QAAQ;AAAA;AAE/E;AAEO,IAAM,aAAA,GAAgC;AAAA,EAC3C;AAAA,IACE,EAAA,EAAI,SAAA;AAAA,IACJ,IAAA,EAAM,CAAC,QAAA,EAAU,OAAA,KAA0B;AACzC,MAAA,IAAI,EAAC,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,KAAA,CAAA,EAAO,OAAO,IAAA;AAC5B,MAAA,MAAM,aAAa,OAAA,CAAQ,KAAA,CAAM,WAAA,EAAY,CAAE,MAAM,GAAG,CAAA;AACxD,MAAA,MAAM,QAAA,GAAW,WAAW,CAAC,CAAA;AAC7B,MAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,GAAG,OAAO,IAAA;AAE7C,MAAA,MAAM,aAAA,GAAgB,SAAS,WAAA,EAAY;AAC3C,MAAA,MAAM,SAAA,GAAY,CAAA;AAGlB,MAAA,KAAA,IAAS,GAAA,GAAM,SAAA,EAAW,GAAA,IAAO,QAAA,CAAS,QAAQ,GAAA,EAAA,EAAO;AACvD,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,IAAK,QAAA,CAAS,MAAA,GAAS,KAAK,CAAA,EAAA,EAAK;AAC/C,UAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,IAAI,GAAG,CAAA;AAC3C,UAAA,IAAI,aAAA,CAAc,QAAA,CAAS,SAAS,CAAA,EAAG;AACrC,YAAA,OAAO,KAAA;AAAA,UACT;AAAA,QACF;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,kBAAA;AAAA,IACJ,IAAA,EAAM,CAAC,QAAA,EAAU,OAAA,KAA0B;AACzC,MAAA,IAAI,EAAC,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,cAAA,CAAA,IAAkB,QAAQ,cAAA,CAAe,MAAA,KAAW,GAAG,OAAO,IAAA;AAC5E,MAAA,MAAM,aAAA,GAAgB,SAAS,WAAA,EAAY;AAC3C,MAAA,OAAO,CAAC,QAAQ,cAAA,CAAe,IAAA;AAAA,QAAK,CAAC,IAAA,KACnC,aAAA,CAAc,QAAA,CAAS,IAAA,CAAK,aAAa;AAAA,OAC3C;AAAA,IACF;AAAA;AAEJ;AAEO,SAAS,gBAAA,CACd,UACA,OAAA,EACiE;AAhEnE,EAAA,IAAA,EAAA;AAiEE,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,MAAM,cAAwB,EAAC;AAG/B,EAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA,EAAG;AAChC,MAAA,WAAA,CAAY,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,IAC1B;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAEhC,IAAA,IAAI,IAAA,CAAK,EAAA,KAAO,SAAA,KAAa,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,KAAA,CAAA,EAAO;AAC3C,MAAA,IAAI,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA,EAAG;AAChC,QAAA,WAAA,CAAY,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,MAC1B,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,MAC1B;AAAA,IACF;AAEA,IAAA,IAAI,KAAK,EAAA,KAAO,kBAAA,KAAA,CAAsB,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,cAAA,KAAT,mBAAyB,MAAA,CAAA,EAAQ;AACrE,MAAA,IAAI,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA,EAAG;AAChC,QAAA,WAAA,CAAY,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,MAC1B,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,MAAA,GAAS,WAAA,CAAY,MAAA;AACpD,EAAA,IAAI,KAAA,GAAQ,aAAa,CAAA,GAAI,IAAA,CAAK,MAAO,WAAA,CAAY,MAAA,GAAS,UAAA,GAAc,CAAC,CAAA,GAAI,CAAA;AAGjF,EAAA,IAAI,WAAA,CAAY,QAAA,CAAS,SAAS,CAAA,EAAG;AACnC,IAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA;AAAA,EAC/B;AAGA,EAAA,IAAI,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC5C,IAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,EAAE,WAAA,EAAa,WAAA,EAAa,KAAA,EAAM;AAC3C;;;ACzGA,SAAS,YAAA,CAAa,OAAe,MAAA,EAAkC;AACrE,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,IAAI,KAAA,KAAU,GAAG,OAAO,UAAA;AACxB,IAAA,IAAI,KAAA,KAAU,GAAG,OAAO,UAAA;AACxB,IAAA,IAAI,KAAA,KAAU,GAAG,OAAO,MAAA;AACxB,IAAA,IAAI,KAAA,KAAU,GAAG,OAAO,MAAA;AACxB,IAAA,IAAI,KAAA,KAAU,GAAG,OAAO,MAAA;AACxB,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,IAAI,KAAA,IAAS,GAAG,OAAO,MAAA;AACvB,IAAA,IAAI,KAAA,KAAU,GAAG,OAAO,MAAA;AACxB,IAAA,IAAI,KAAA,KAAU,CAAA,IAAK,KAAA,KAAU,CAAA,EAAG,OAAO,MAAA;AACvC,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAA,IAAS,GAAG,OAAO,MAAA;AACvB,EAAA,IAAI,KAAA,IAAS,GAAG,OAAO,MAAA;AACvB,EAAA,OAAO,QAAA;AACT;AAKO,SAAS,iBAAA,CAAkB,OAAsB,SAAA,EAA8B;AACpF,EAAA,MAAM,OAAA,GAA4D;AAAA,IAChE,UAAU,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,IAC7B,MAAM,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,IACzB,MAAM,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,IACzB,MAAM,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,IACzB,QAAQ,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAAE,GAC7B;AACA,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,SAAS,CAAA;AACjC;AAQO,SAAS,mBAAA,CACd,QAAA,EACA,OAAA,GAAsC,EAAC,EACf;AACxB,EAAA,MAAM,EAAE,UAAA,GAAa,CAAA,EAAG,KAAA,EAAO,gBAAe,GAAI,OAAA;AAElD,EAAA,OAAOA,cAAQ,MAAM;AACnB,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,CAAA;AAAA,QACP,KAAA,EAAO,UAAA;AAAA,QACP,aAAa,EAAC;AAAA,QACd,aAAa,CAAC,WAAA,EAAa,WAAA,EAAa,WAAA,EAAa,UAAU,SAAS,CAAA;AAAA,QACxE,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAA2B,EAAE,KAAA,EAAO,cAAA,EAAe;AACzD,IAAA,MAAM,EAAE,WAAA,EAAa,WAAA,EAAa,OAAM,GAAI,gBAAA,CAAiB,UAAU,WAAW,CAAA;AAClF,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAA,EAAO,UAAU,CAAA;AAC5C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAO,KAAA,GAAQ,IAAK,GAAG,CAAA;AAE/C,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,cAAc,CAAC,CAAA;AAClD;;;AC1EA,OAAA,EAAA;AAHA,IAAM,gBAAA,uBAAuB,GAAA,EAAyB;AAStD,eAAsB,gBAAgB,MAAA,EAAsC;AAE1E,EAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,MAAM,CAAA,EAAG;AAChC,IAAA,OAAO,gBAAA,CAAiB,IAAI,MAAM,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI;AACF,IAAA,IAAI,WAAA;AAGJ,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,IAAA;AACH,QAAA,WAAA,GAAA,CAAe,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,OAAA,EAAA,EAAA,UAAA,CAAA,CAAA,EAAgB,EAAA;AACrC,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,WAAA,GAAA,CAAe,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,OAAA,EAAA,EAAA,UAAA,CAAA,CAAA,EAAgB,EAAA;AACrC,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,WAAA,GAAA,CAAe,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,OAAA,EAAA,EAAA,UAAA,CAAA,CAAA,EAAgB,EAAA;AACrC,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,WAAA,GAAA,CAAe,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,OAAA,EAAA,EAAA,UAAA,CAAA,CAAA,EAAgB,EAAA;AACrC,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,WAAA,GAAA,CAAe,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,OAAA,EAAA,EAAA,UAAA,CAAA,CAAA,EAAgB,EAAA;AACrC,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,WAAA,GAAA,CAAe,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,OAAA,EAAA,EAAA,UAAA,CAAA,CAAA,EAAgB,EAAA;AACrC,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,WAAA,GAAA,CAAe,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,OAAA,EAAA,EAAA,UAAA,CAAA,CAAA,EAAgB,EAAA;AACrC,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,WAAA,GAAA,CAAe,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,OAAA,EAAA,EAAA,UAAA,CAAA,CAAA,EAAgB,EAAA;AACrC,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,WAAA,GAAA,CAAe,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,OAAA,EAAA,EAAA,UAAA,CAAA,CAAA,EAAgB,EAAA;AACrC,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,WAAA,GAAA,CAAe,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,OAAA,EAAA,EAAA,UAAA,CAAA,CAAA,EAAgB,EAAA;AACrC,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,WAAA,GAAA,CAAe,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,OAAA,EAAA,EAAA,UAAA,CAAA,CAAA,EAAgB,EAAA;AACrC,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,WAAA,GAAA,CAAe,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,OAAA,EAAA,EAAA,UAAA,CAAA,CAAA,EAAgB,EAAA;AACrC,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,WAAA,GAAA,CAAe,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,OAAA,EAAA,EAAA,UAAA,CAAA,CAAA,EAAgB,EAAA;AACrC,QAAA;AAAA,MACF;AACE,QAAA,WAAA,GAAc,EAAA;AAAA;AAIlB,IAAA,gBAAA,CAAiB,GAAA,CAAI,QAAQ,WAAW,CAAA;AACxC,IAAA,OAAO,WAAA;AAAA,EACT,CAAA,CAAA,OAAQ,CAAA,EAAA;AAEN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAMO,SAAS,mBAAmB,MAAA,EAA6B;AA/EhE,EAAA,IAAA,EAAA;AAgFE,EAAA,OAAA,CAAO,EAAA,GAAA,gBAAA,CAAiB,GAAA,CAAI,MAAM,CAAA,KAA3B,IAAA,GAAA,EAAA,GAAgC,EAAA;AACzC;AAKO,SAAS,mBAAmB,MAAA,EAAsB;AACvD,EAAA,eAAA,CAAgB,MAAM,CAAA;AACxB;AClFO,SAAS,SAAA,CAAU,EAAE,SAAA,EAAU,EAAc;AAClD,EAAA,uBACEC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,4BAAA;AAAA,MACN,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,cAAA;AAAA,MACL,SAAA,EAAWC,SAAA,CAAK,SAAA,EAAW,SAAS,CAAA;AAAA,MAEpC,QAAA,kBAAAD,cAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAS,SAAA;AAAA,UACT,CAAA,EAAE,8IAAA;AAAA,UACF,QAAA,EAAS;AAAA;AAAA;AACX;AAAA,GACF;AAEJ;AAEO,SAAS,KAAA,CAAM,EAAE,SAAA,EAAU,EAAc;AAC9C,EAAA,uBACEA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,4BAAA;AAAA,MACN,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,cAAA;AAAA,MACL,SAAA,EAAWC,SAAA,CAAK,SAAA,EAAW,SAAS,CAAA;AAAA,MAEpC,QAAA,kBAAAD,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,8KAAA,EAA+K;AAAA;AAAA,GACzL;AAEJ;ACpBA,IAAM,WAAA,GAAoE;AAAA,EACxE,QAAA,EAAU;AAAA,IACR,GAAA,EAAK,8BAAA;AAAA,IACL,IAAA,EAAM;AAAA,GACR;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK,YAAA;AAAA,IACL,IAAA,EAAM;AAAA,GACR;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK,eAAA;AAAA,IACL,IAAA,EAAM;AAAA,GACR;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK,aAAA;AAAA,IACL,IAAA,EAAM;AAAA,GACR;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,GAAA,EAAK,cAAA;AAAA,IACL,IAAA,EAAM;AAAA;AAEV,CAAA;AAEO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,KAAA;AAAA,EACA,MAAA,GAAS,IAAA;AAAA,EACT,UAAA,GAAa,CAAA;AAAA,EACb,QAAA,GAAW,CAAA;AAAA,EACX,KAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA,GAAU;AACZ,CAAA,EAA0B;AACxB,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIE,cAAA;AAAA,IAAsB,MAC1D,mBAAmB,MAAM;AAAA,GAC3B;AAGA,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,eAAA,CAAgB,MAAM,CAAA,CAAE,IAAA,CAAK,cAAc,CAAA;AAAA,EAC7C,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,WAAA,EAAa,YAAW,GAAI,mBAAA;AAAA,IACtD,KAAA;AAAA,IACA;AAAA,MACE,UAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAChC,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,KAAA,EAAO,UAAU,CAAA;AAGtD,EAAA,MAAM,YAAA,GAAeJ,aAAAA;AAAA,IACnB,MACE;AAAA,MACE,GAAG,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAAA,MAChC,GAAG,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,QAAA,GAAW,WAAA,CAAY,MAAM,CAAC;AAAA,KACpE,CAAE,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAAA,IACrB,CAAC,WAAA,EAAa,WAAA,EAAa,QAAQ;AAAA,GACrC;AAEA,EAAA,MAAM,QAAA,GAAW,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA;AAGzC,EAAA,MAAM,eAAe,QAAA,GAAW,CAAA,IAAK,YAAA,CAAa,MAAA,GAAS,qBACzDK,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAL,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sDAAA,EACV,sBAAY,mBAAA,EACf,CAAA;AAAA,oBACAA,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,aACX,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,MAAA,KAAW;AAC5B,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,CAAS,MAAM,CAAA;AAC5C,MAAA,MAAM,SAAA,GACJ,WAAA,CAAY,KAAA,CAAM,MAAwC,CAAA;AAE5D,MAAA,uBACEI,eAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAWH,SAAAA;AAAA,YACT,wDAAA;AAAA,YACA,WACI,oCAAA,GACA;AAAA,WACN;AAAA,UAEC,QAAA,EAAA;AAAA,YAAA,QAAA,mBACCD,cAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,wBAAA,EAAyB,oBAE9CA,cAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAAA,4BAE5CA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAA8B,QAAA,EAAA,SAAA,EAAU;AAAA;AAAA,SAAA;AAAA,QAbnD;AAAA,OAcP;AAAA,IAEJ,CAAC,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,IAAI,YAAY,SAAA,EAAW;AACzB,IAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWC,SAAAA,CAAK,kBAAA,EAAoB,SAAS,CAAA,EAC/C,QAAA,EAAA,QAAA,oBACCG,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEZ,QAAA,EAAA;AAAA,MAAA,YAAA,oBAAgBJ,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAa,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,sBAG1DI,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2CAAA,EACb,QAAA,EAAA;AAAA,0BAAAJ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CAAA,EACb,sBAAY,gBAAA,EACf,CAAA;AAAA,0BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWC,SAAAA,CAAK,aAAA,EAAe,MAAA,CAAO,IAAI,CAAA,EAC7C,QAAA,EAAA,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA,EAC3B;AAAA,SAAA,EACF,CAAA;AAAA,wBACAD,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWC,SAAAA;AAAA,cACT,sDAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,kBAAAD,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAWC,SAAAA;AAAA,kBACT,8CAAA;AAAA,kBACA,MAAA,CAAO;AAAA,iBACT;AAAA,gBACA,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,UAAU,CAAA,CAAA,CAAA;AAAI;AAAA;AACnC;AAAA;AACF,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EAEJ,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACED,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWC,SAAAA,CAAK,kBAAA,EAAoB,SAAS,CAAA,EAC/C,QAAA,EAAA,QAAA,oBACCG,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEZ,QAAA,EAAA;AAAA,IAAA,QAAA,GAAW,KAAK,YAAA,CAAa,MAAA,GAAS,qBACrCA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qEAAA,EACZ,QAAA,EAAA;AAAA,MAAA,YAAA;AAAA,sBAGDA,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gEAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2CAAA,EACb,QAAA,EAAA;AAAA,0BAAAJ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CAAA,EACb,sBAAY,gBAAA,EACf,CAAA;AAAA,0BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWC,SAAAA,CAAK,aAAA,EAAe,MAAA,CAAO,IAAI,CAAA,EAC7C,QAAA,EAAA,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA,EAC3B;AAAA,SAAA,EACF,CAAA;AAAA,wBACAD,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAWC,SAAAA,CAAK,YAAA,EAAc,YAAY,CAAA,EAC5C,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,YAAY,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,0BAC1CD,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAWC,SAAAA;AAAA,cACT,oEAAA;AAAA,cACA,KAAA,GAAQ,UAAA,GACJ,MAAA,CAAO,GAAA,GACP;AAAA;AACN,WAAA;AAAA,UANK;AAAA,SAQR,CAAA,EACH;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAID,QAAA,KAAa,CAAA,oBACZG,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2CAAA,EACb,QAAA,EAAA;AAAA,wBAAAJ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CAAA,EACb,sBAAY,gBAAA,EACf,CAAA;AAAA,wBACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWC,SAAAA,CAAK,aAAA,EAAe,MAAA,CAAO,IAAI,CAAA,EAC7C,QAAA,EAAA,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA,EAC3B;AAAA,OAAA,EACF,CAAA;AAAA,sBACAD,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAWC,SAAAA,CAAK,YAAA,EAAc,YAAY,CAAA,EAC5C,QAAA,EAAA,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,YAAY,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,0BAC1CD,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAWC,SAAAA;AAAA,YACT,kEAAA;AAAA,YACA,KAAA,GAAQ,UAAA,GACJ,MAAA,CAAO,GAAA,GACP;AAAA;AACN,SAAA;AAAA,QANK;AAAA,OAQR,CAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA,EAEJ,CAAA;AAEJ;AAEA,IAAO,wBAAA,GAAQ","file":"index.js","sourcesContent":["import type { Translation } from './types';\n\nexport const en: Translation = {\n levels: {\n veryWeak: 'Very Weak',\n weak: 'Weak',\n soso: 'Mid',\n good: 'Good',\n strong: 'Strong',\n },\n passwordMustInclude: 'Your Password must include',\n passwordStrength: 'Password Strength',\n rules: {\n minLength: 'At least 12 characters',\n uppercase: 'At least one uppercase letter',\n lowercase: 'At least one lowercase letter',\n number: 'At least one number',\n special: 'At least one special character',\n noEmail: 'Must not contain your email',\n noForbiddenWords: 'Must not contain forbidden words',\n },\n placeholder: 'Enter your password',\n label: 'Password',\n};\n","import type { Translation } from './types';\n\nexport const fr: Translation = {\n levels: {\n veryWeak: 'Très faible',\n weak: 'Faible',\n soso: 'Moyen',\n good: 'Bon',\n strong: 'Fort',\n },\n passwordMustInclude: 'Votre mot de passe doit inclure',\n passwordStrength: 'Sécurité du mot de passe',\n rules: {\n minLength: 'Au moins 12 caractères',\n uppercase: 'Au moins une lettre majuscule',\n lowercase: 'Au moins une lettre minuscule',\n number: 'Au moins un chiffre',\n special: 'Au moins un caractère spécial',\n noEmail: 'Ne doit pas contenir votre email',\n noForbiddenWords: 'Ne doit pas contenir de mots interdits',\n },\n placeholder: 'Entrez votre mot de passe',\n label: 'Mot de passe',\n};\n","import type { Translation } from './types';\n\nexport const es: Translation = {\n levels: {\n veryWeak: 'Muy débil',\n weak: 'Débil',\n soso: 'Regular',\n good: 'Buena',\n strong: 'Fuerte',\n },\n passwordMustInclude: 'Tu contraseña debe incluir',\n passwordStrength: 'Seguridad de la contraseña',\n rules: {\n minLength: 'Al menos 12 caracteres',\n uppercase: 'Al menos una letra mayúscula',\n lowercase: 'Al menos una letra minúscula',\n number: 'Al menos un número',\n special: 'Al menos un carácter especial',\n noEmail: 'No debe contener tu email',\n noForbiddenWords: 'No debe contener palabras prohibidas',\n },\n placeholder: 'Ingresa tu contraseña',\n label: 'Contraseña',\n};\n","import type { Translation } from './types';\n\nexport const de: Translation = {\n levels: {\n veryWeak: 'Sehr schwach',\n weak: 'Schwach',\n soso: 'Mittel',\n good: 'Gut',\n strong: 'Stark',\n },\n passwordMustInclude: 'Ihr Passwort muss enthalten',\n passwordStrength: 'Passwortstärke',\n rules: {\n minLength: 'Mindestens 12 Zeichen',\n uppercase: 'Mindestens einen Großbuchstaben',\n lowercase: 'Mindestens einen Kleinbuchstaben',\n number: 'Mindestens eine Zahl',\n special: 'Mindestens ein Sonderzeichen',\n noEmail: 'Darf Ihre E-Mail nicht enthalten',\n noForbiddenWords: 'Darf keine verbotenen Wörter enthalten',\n },\n placeholder: 'Geben Sie Ihr Passwort ein',\n label: 'Passwort',\n};\n","import type { Translation } from './types';\n\nexport const pt: Translation = {\n levels: {\n veryWeak: 'Muito fraca',\n weak: 'Fraca',\n soso: 'Média',\n good: 'Boa',\n strong: 'Forte',\n },\n passwordMustInclude: 'Sua senha deve incluir',\n passwordStrength: 'Força da senha',\n rules: {\n minLength: 'Pelo menos 12 caracteres',\n uppercase: 'Pelo menos uma letra maiúscula',\n lowercase: 'Pelo menos uma letra minúscula',\n number: 'Pelo menos um número',\n special: 'Pelo menos um caractere especial',\n noEmail: 'Não deve conter seu email',\n noForbiddenWords: 'Não deve conter palavras proibidas',\n },\n placeholder: 'Digite sua senha',\n label: 'Senha',\n};\n","import type { Translation } from './types';\n\nexport const it: Translation = {\n levels: {\n veryWeak: 'Molto debole',\n weak: 'Debole',\n soso: 'Media',\n good: 'Buona',\n strong: 'Forte',\n },\n passwordMustInclude: 'La tua password deve includere',\n passwordStrength: 'Sicurezza della password',\n rules: {\n minLength: 'Almeno 12 caratteri',\n uppercase: 'Almeno una lettera maiuscola',\n lowercase: 'Almeno una lettera minuscola',\n number: 'Almeno un numero',\n special: 'Almeno un carattere speciale',\n noEmail: 'Non deve contenere la tua email',\n noForbiddenWords: 'Non deve contenere parole vietate',\n },\n placeholder: 'Inserisci la tua password',\n label: 'Password',\n};\n","import type { Translation } from './types';\n\nexport const nl: Translation = {\n levels: {\n veryWeak: 'Zeer zwak',\n weak: 'Zwak',\n soso: 'Gemiddeld',\n good: 'Goed',\n strong: 'Sterk',\n },\n passwordMustInclude: 'Uw wachtwoord moet bevatten',\n passwordStrength: 'Wachtwoordsterkte',\n rules: {\n minLength: 'Minimaal 12 tekens',\n uppercase: 'Minimaal één hoofdletter',\n lowercase: 'Minimaal één kleine letter',\n number: 'Minimaal één cijfer',\n special: 'Minimaal één speciaal teken',\n noEmail: 'Mag uw e-mail niet bevatten',\n noForbiddenWords: 'Mag geen verboden woorden bevatten',\n },\n placeholder: 'Voer uw wachtwoord in',\n label: 'Wachtwoord',\n};\n","import type { Translation } from './types';\n\nexport const pl: Translation = {\n levels: {\n veryWeak: 'Bardzo słabe',\n weak: 'Słabe',\n soso: 'Średnie',\n good: 'Dobre',\n strong: 'Silne',\n },\n passwordMustInclude: 'Twoje hasło musi zawierać',\n passwordStrength: 'Siła hasła',\n rules: {\n minLength: 'Co najmniej 12 znaków',\n uppercase: 'Co najmniej jedną wielką literę',\n lowercase: 'Co najmniej jedną małą literę',\n number: 'Co najmniej jedną cyfrę',\n special: 'Co najmniej jeden znak specjalny',\n noEmail: 'Nie może zawierać Twojego emaila',\n noForbiddenWords: 'Nie może zawierać zabronionych słów',\n },\n placeholder: 'Wprowadź hasło',\n label: 'Hasło',\n};\n","import type { Translation } from './types';\n\nexport const sv: Translation = {\n levels: {\n veryWeak: 'Mycket svagt',\n weak: 'Svagt',\n soso: 'Medel',\n good: 'Bra',\n strong: 'Starkt',\n },\n passwordMustInclude: 'Ditt lösenord måste innehålla',\n passwordStrength: 'Lösenordsstyrka',\n rules: {\n minLength: 'Minst 12 tecken',\n uppercase: 'Minst en stor bokstav',\n lowercase: 'Minst en liten bokstav',\n number: 'Minst en siffra',\n special: 'Minst ett specialtecken',\n noEmail: 'Får inte innehålla din e-post',\n noForbiddenWords: 'Får inte innehålla förbjudna ord',\n },\n placeholder: 'Ange ditt lösenord',\n label: 'Lösenord',\n};\n","import type { Translation } from './types';\n\nexport const uk: Translation = {\n levels: {\n veryWeak: 'Дуже слабкий',\n weak: 'Слабкий',\n soso: 'Середній',\n good: 'Добрий',\n strong: 'Сильний',\n },\n passwordMustInclude: 'Ваш пароль повинен містити',\n passwordStrength: 'Надійність пароля',\n rules: {\n minLength: 'Мінімум 12 символів',\n uppercase: 'Принаймні одну велику літеру',\n lowercase: 'Принаймні одну малу літеру',\n number: 'Принаймні одну цифру',\n special: 'Принаймні один спеціальний символ',\n noEmail: 'Не повинен містити вашу електронну пошту',\n noForbiddenWords: 'Не повинен містити заборонені слова',\n },\n placeholder: 'Введіть пароль',\n label: 'Пароль',\n};\n","import type { Translation } from './types';\n\nexport const zh: Translation = {\n levels: {\n veryWeak: '非常弱',\n weak: '弱',\n soso: '中等',\n good: '良好',\n strong: '强',\n },\n passwordMustInclude: '您的密码必须包含',\n passwordStrength: '密码强度',\n rules: {\n minLength: '至少12个字符',\n uppercase: '至少一个大写字母',\n lowercase: '至少一个小写字母',\n number: '至少一个数字',\n special: '至少一个特殊字符',\n noEmail: '不能包含您的邮箱',\n noForbiddenWords: '不能包含禁用词',\n },\n placeholder: '请输入密码',\n label: '密码',\n};\n","import type { Translation } from './types';\n\nexport const ja: Translation = {\n levels: {\n veryWeak: '非常に弱い',\n weak: '弱い',\n soso: '普通',\n good: '良い',\n strong: '強い',\n },\n passwordMustInclude: 'パスワードには以下が必要です',\n passwordStrength: 'パスワード強度',\n rules: {\n minLength: '12文字以上',\n uppercase: '大文字を1つ以上',\n lowercase: '小文字を1つ以上',\n number: '数字を1つ以上',\n special: '特殊文字を1つ以上',\n noEmail: 'メールアドレスを含めない',\n noForbiddenWords: '禁止語を含めない',\n },\n placeholder: 'パスワードを入力',\n label: 'パスワード',\n};\n","import type { Translation } from './types';\n\nexport const ko: Translation = {\n levels: {\n veryWeak: '매우 약함',\n weak: '약함',\n soso: '보통',\n good: '좋음',\n strong: '강함',\n },\n passwordMustInclude: '비밀번호는 다음을 포함해야 합니다',\n passwordStrength: '비밀번호 강도',\n rules: {\n minLength: '최소 12자',\n uppercase: '대문자 1개 이상',\n lowercase: '소문자 1개 이상',\n number: '숫자 1개 이상',\n special: '특수문자 1개 이상',\n noEmail: '이메일 포함 불가',\n noForbiddenWords: '금지어 포함 불가',\n },\n placeholder: '비밀번호 입력',\n label: '비밀번호',\n};\n","import type { PasswordRule, RuleOptions } from \"./types\";\n\nexport const defaultRules: PasswordRule[] = [\n {\n id: \"minLength\",\n test: (password) => password.length >= 12,\n },\n {\n id: \"uppercase\",\n test: (password) => /[A-Z]/.test(password),\n },\n {\n id: \"lowercase\",\n test: (password) => /[a-z]/.test(password),\n },\n {\n id: \"number\",\n test: (password) => /[0-9]/.test(password),\n },\n {\n id: \"special\",\n test: (password) => /[!@#$%^&*(),.?\":{}|<>_\\-+=\\[\\]\\\\\\/`~;']/.test(password),\n },\n];\n\nexport const optionalRules: PasswordRule[] = [\n {\n id: \"noEmail\",\n test: (password, options?: RuleOptions) => {\n if (!options?.email) return true;\n const emailParts = options.email.toLowerCase().split(\"@\");\n const username = emailParts[0];\n if (!username || username.length < 4) return true;\n\n const lowerPassword = password.toLowerCase();\n const minLength = 4;\n\n // Check all substrings of 4+ characters from the username\n for (let len = minLength; len <= username.length; len++) {\n for (let i = 0; i <= username.length - len; i++) {\n const substring = username.slice(i, i + len);\n if (lowerPassword.includes(substring)) {\n return false;\n }\n }\n }\n return true;\n },\n },\n {\n id: \"noForbiddenWords\",\n test: (password, options?: RuleOptions) => {\n if (!options?.forbiddenWords || options.forbiddenWords.length === 0) return true;\n const lowerPassword = password.toLowerCase();\n return !options.forbiddenWords.some((word) =>\n lowerPassword.includes(word.toLowerCase())\n );\n },\n },\n];\n\nexport function evaluatePassword(\n password: string,\n options?: RuleOptions\n): { passedRules: string[]; failedRules: string[]; score: number } {\n const passedRules: string[] = [];\n const failedRules: string[] = [];\n\n // Evaluate default rules\n for (const rule of defaultRules) {\n if (rule.test(password, options)) {\n passedRules.push(rule.id);\n } else {\n failedRules.push(rule.id);\n }\n }\n\n // Evaluate optional rules if options are provided\n for (const rule of optionalRules) {\n // Only evaluate noEmail if email is provided\n if (rule.id === \"noEmail\" && options?.email) {\n if (rule.test(password, options)) {\n passedRules.push(rule.id);\n } else {\n failedRules.push(rule.id);\n }\n }\n // Only evaluate noForbiddenWords if forbiddenWords are provided\n if (rule.id === \"noForbiddenWords\" && options?.forbiddenWords?.length) {\n if (rule.test(password, options)) {\n passedRules.push(rule.id);\n } else {\n failedRules.push(rule.id);\n }\n }\n }\n\n // Calculate score based on passed rules (out of total evaluated rules)\n const totalRules = passedRules.length + failedRules.length;\n let score = totalRules > 0 ? Math.round((passedRules.length / totalRules) * 5) : 0;\n\n // Apply extra penalty for email pattern in password (-2 score)\n if (failedRules.includes(\"noEmail\")) {\n score = Math.max(0, score - 2);\n }\n\n // Apply extra penalty for forbidden words in password (-2 score)\n if (failedRules.includes(\"noForbiddenWords\")) {\n score = Math.max(0, score - 2);\n }\n\n return { passedRules, failedRules, score };\n}\n","import { useMemo } from 'react';\nimport type { PasswordStrengthResult, StrengthLevel, RuleOptions } from './types';\nimport { evaluatePassword } from './rules';\n\n/**\n * Maps a score (0-5) to a strength level\n */\nfunction scoreToLevel(score: number, levels: 3 | 4 | 5): StrengthLevel {\n if (levels === 5) {\n if (score === 0) return 'veryWeak';\n if (score === 1) return 'veryWeak';\n if (score === 2) return 'weak';\n if (score === 3) return 'soso';\n if (score === 4) return 'good';\n return 'strong';\n }\n\n if (levels === 4) {\n if (score <= 1) return 'weak';\n if (score === 2) return 'soso';\n if (score === 3 || score === 4) return 'good';\n return 'strong';\n }\n\n // 3 levels\n if (score <= 2) return 'weak';\n if (score <= 4) return 'soso';\n return 'strong';\n}\n\n/**\n * Maps a strength level to the number of active bars\n */\nexport function levelToActiveBars(level: StrengthLevel, totalBars: 3 | 4 | 5): number {\n const mapping: Record<StrengthLevel, Record<3 | 4 | 5, number>> = {\n veryWeak: { 3: 0, 4: 0, 5: 1 },\n weak: { 3: 1, 4: 1, 5: 2 },\n soso: { 3: 2, 4: 2, 5: 3 },\n good: { 3: 2, 4: 3, 5: 4 },\n strong: { 3: 3, 4: 4, 5: 5 },\n };\n return mapping[level][totalBars];\n}\n\nexport interface UsePasswordStrengthOptions {\n barsNumber?: 3 | 4 | 5;\n email?: string;\n forbiddenWords?: string[];\n}\n\nexport function usePasswordStrength(\n password: string,\n options: UsePasswordStrengthOptions = {}\n): PasswordStrengthResult {\n const { barsNumber = 5, email, forbiddenWords } = options;\n\n return useMemo(() => {\n if (!password) {\n return {\n score: 0,\n level: 'veryWeak' as StrengthLevel,\n passedRules: [],\n failedRules: ['minLength', 'uppercase', 'lowercase', 'number', 'special'],\n percentage: 0,\n };\n }\n\n const ruleOptions: RuleOptions = { email, forbiddenWords };\n const { passedRules, failedRules, score } = evaluatePassword(password, ruleOptions);\n const level = scoreToLevel(score, barsNumber);\n const percentage = Math.round((score / 5) * 100);\n\n return {\n score,\n level,\n passedRules,\n failedRules,\n percentage,\n };\n }, [password, barsNumber, email, forbiddenWords]);\n}\n","import type { Translation } from './types';\n\n// Cache des traductions déjà chargées\nconst translationCache = new Map<string, Translation>();\n\n// Traduction par défaut (anglais) chargée de manière synchrone pour le fallback\nimport { en as defaultTranslation } from './en';\n\n/**\n * Charge une traduction de manière asynchrone (lazy loading)\n * Retourne la traduction en cache si déjà chargée\n */\nexport async function loadTranslation(locale: string): Promise<Translation> {\n // Vérifier le cache\n if (translationCache.has(locale)) {\n return translationCache.get(locale)!;\n }\n\n try {\n let translation: Translation;\n\n // Dynamic imports pour chaque locale\n switch (locale) {\n case 'en':\n translation = (await import('./en')).en;\n break;\n case 'fr':\n translation = (await import('./fr')).fr;\n break;\n case 'es':\n translation = (await import('./es')).es;\n break;\n case 'de':\n translation = (await import('./de')).de;\n break;\n case 'pt':\n translation = (await import('./pt')).pt;\n break;\n case 'it':\n translation = (await import('./it')).it;\n break;\n case 'nl':\n translation = (await import('./nl')).nl;\n break;\n case 'pl':\n translation = (await import('./pl')).pl;\n break;\n case 'sv':\n translation = (await import('./sv')).sv;\n break;\n case 'uk':\n translation = (await import('./uk')).uk;\n break;\n case 'zh':\n translation = (await import('./zh')).zh;\n break;\n case 'ja':\n translation = (await import('./ja')).ja;\n break;\n case 'ko':\n translation = (await import('./ko')).ko;\n break;\n default:\n translation = defaultTranslation;\n }\n\n // Mettre en cache\n translationCache.set(locale, translation);\n return translation;\n } catch {\n // Fallback vers l'anglais en cas d'erreur\n return defaultTranslation;\n }\n}\n\n/**\n * Obtient une traduction de manière synchrone (depuis le cache ou fallback)\n * Utilisé pour le rendu initial avant que la traduction async soit chargée\n */\nexport function getTranslationSync(locale: string): Translation {\n return translationCache.get(locale) ?? defaultTranslation;\n}\n\n/**\n * Précharge une traduction (utile pour optimiser le chargement)\n */\nexport function preloadTranslation(locale: string): void {\n loadTranslation(locale);\n}\n\nexport type { Translation };\nexport { defaultTranslation };\n","import { clsx } from \"clsx\";\n\ninterface IconProps {\n className?: string;\n}\n\nexport function CheckIcon({ className }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={clsx(\"w-4 h-4\", className)}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M16.704 4.153a.75.75 0 01.143 1.052l-8 10.5a.75.75 0 01-1.127.075l-4.5-4.5a.75.75 0 011.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 011.05-.143z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\nexport function XIcon({ className }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={clsx(\"w-4 h-4\", className)}\n >\n <path d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\" />\n </svg>\n );\n}\n","\"use client\";\n\nimport React, { useState, useEffect, useMemo } from \"react\";\nimport { clsx } from \"clsx\";\nimport type { PasswordStrengthProps, StrengthLevel } from \"./types\";\nimport { usePasswordStrength, levelToActiveBars } from \"./usePasswordStrength\";\nimport {\n loadTranslation,\n getTranslationSync,\n type Translation,\n} from \"./translations/index\";\nimport { CheckIcon, XIcon } from \"./icons\";\n\n// Strength level colors\nconst levelColors: Record<StrengthLevel, { bar: string; text: string }> = {\n veryWeak: {\n bar: \"bg-gray-300 dark:bg-gray-600\",\n text: \"text-gray-500 dark:text-gray-400\",\n },\n weak: {\n bar: \"bg-red-500\",\n text: \"text-red-500\",\n },\n soso: {\n bar: \"bg-orange-400\",\n text: \"text-orange-400\",\n },\n good: {\n bar: \"bg-lime-500\",\n text: \"text-lime-500\",\n },\n strong: {\n bar: \"bg-green-500\",\n text: \"text-green-500\",\n },\n};\n\nexport function PasswordStrength({\n value,\n locale = \"en\",\n barsNumber = 5,\n maxRules = 2,\n email,\n forbiddenWords,\n className,\n barClassName,\n barMode = \"default\",\n}: PasswordStrengthProps) {\n const [translation, setTranslation] = useState<Translation>(() =>\n getTranslationSync(locale)\n );\n\n // Lazy load translation when locale changes\n useEffect(() => {\n loadTranslation(locale).then(setTranslation);\n }, [locale]);\n\n const { level, passedRules, failedRules, percentage } = usePasswordStrength(\n value,\n {\n barsNumber,\n email,\n forbiddenWords,\n }\n );\n\n const colors = levelColors[level];\n const activeBars = levelToActiveBars(level, barsNumber);\n\n // Memoized display rules calculation\n const displayRules = useMemo(\n () =>\n [\n ...failedRules.slice(0, maxRules),\n ...passedRules.slice(0, Math.max(0, maxRules - failedRules.length)),\n ].slice(0, maxRules),\n [failedRules, passedRules, maxRules]\n );\n\n const hasValue = value && value.length > 0;\n\n // Rules list rendering (shared between themes)\n const rulesContent = maxRules > 0 && displayRules.length > 0 && (\n <>\n <p className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {translation.passwordMustInclude}\n </p>\n <ul className=\"space-y-1\">\n {displayRules.map((ruleId) => {\n const isPassed = passedRules.includes(ruleId);\n const ruleLabel =\n translation.rules[ruleId as keyof typeof translation.rules];\n\n return (\n <li\n key={ruleId}\n className={clsx(\n \"flex items-center gap-[10px] text-sm transition-colors\",\n isPassed\n ? \"text-green-600 dark:text-green-400\"\n : \"text-gray-600 dark:text-gray-400\"\n )}\n >\n {isPassed ? (\n <CheckIcon className=\"text-blue-500 shrink-0\" />\n ) : (\n <XIcon className=\"text-gray-400 shrink-0\" />\n )}\n <span className=\"text-black dark:text-white\">{ruleLabel}</span>\n </li>\n );\n })}\n </ul>\n </>\n );\n\n if (barMode === \"rounded\") {\n return (\n <div className={clsx(\"w-full space-y-2\", className)}>\n {hasValue && (\n <div className=\"space-y-2\">\n {/* Rules list (no card wrapper) */}\n {rulesContent && <div className=\"space-y-2\">{rulesContent}</div>}\n\n {/* Continuous bar */}\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-gray-600 dark:text-gray-400 font-medium\">\n {translation.passwordStrength}\n </span>\n <span className={clsx(\"font-medium\", colors.text)}>\n {translation.levels[level]}\n </span>\n </div>\n <div\n className={clsx(\n \"h-1 w-full rounded-full bg-gray-200 dark:bg-gray-700\",\n barClassName\n )}\n >\n <div\n className={clsx(\n \"h-1 rounded-full transition-all duration-300\",\n colors.bar\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n </div>\n </div>\n )}\n </div>\n );\n }\n\n // Default theme\n return (\n <div className={clsx(\"w-full space-y-2\", className)}>\n {hasValue && (\n <div className=\"space-y-2\">\n {/* Rules section with strength bar inside (when maxRules > 0) */}\n {maxRules > 0 && displayRules.length > 0 && (\n <div className=\"p-3 rounded-lg bg-[#f9f9f9] dark:bg-[#eeeeee0f] space-y-2 mt-[17px]\">\n {rulesContent}\n\n {/* Strength bars and label inside card */}\n <div className=\"space-y-1.5 pt-[6px] pb-2 border-gray-200 dark:border-gray-700\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-gray-600 dark:text-gray-400 font-medium\">\n {translation.passwordStrength}\n </span>\n <span className={clsx(\"font-medium\", colors.text)}>\n {translation.levels[level]}\n </span>\n </div>\n <div className={clsx(\"flex gap-1\", barClassName)}>\n {Array.from({ length: barsNumber }).map((_, index) => (\n <div\n key={index}\n className={clsx(\n \"h-[3.5px] mt-[6px] flex-1 rounded-full transition-all duration-300\",\n index < activeBars\n ? colors.bar\n : \"bg-gray-200 dark:bg-gray-700\"\n )}\n />\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Strength bars only (when maxRules === 0) */}\n {maxRules === 0 && (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-gray-600 dark:text-gray-400 font-medium\">\n {translation.passwordStrength}\n </span>\n <span className={clsx(\"font-medium\", colors.text)}>\n {translation.levels[level]}\n </span>\n </div>\n <div className={clsx(\"flex gap-1\", barClassName)}>\n {Array.from({ length: barsNumber }).map((_, index) => (\n <div\n key={index}\n className={clsx(\n \"h-[3.5px] flex-1 mt-0.5 rounded-full transition-all duration-300\",\n index < activeBars\n ? colors.bar\n : \"bg-gray-200 dark:bg-gray-700\"\n )}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default PasswordStrength;\n"]}
|