{"version":3,"file":"text-B73vztfB.mjs","names":["FieldName","useField","Field","FieldProps","Input","InputProps","Props","Omit","Pick","name","TextField","t0","$","_c","color","disabled","forcedId","inputClassName","placeholder","prefix","prefixClassName","readOnly","rest","size","suffix","suffixClassName","type","variant","id","field","t1","defaultValue","t2","errors","getPasswordStrength","password","score","length","test","Math","min","gradientVariantFromScore","getFieldValue","useField","useFormData","FieldName","Field","FieldProps","Input","Button","useState","getPasswordStrength","gradientVariantFromScore","clsx","Props","Omit","name","showScore","PasswordField","t0","$","_c","forcedId","rest","t1","id","undefined","field","showPassword","setShowPassword","t2","formData","type","value","formId","T0","T1","t10","t11","t12","t3","t4","t5","t6","t7","t8","t9","defaultValue","errors","passwordScore","t13","Symbol","for","_temp","t14","width","s","useField","useControl","FieldName","Field","FieldProps","Input","slugify","ChangeEvent","Props","Omit","name","placeholder","SlugField","id","forcedId","rest","field","control","defaultValue","handleChange","e","HTMLInputElement","change","target","value","handleBlur","blur","register","errors"],"sources":["../src/components/fields/text/TextField.tsx","../src/lib/pass-checker.ts","../src/components/fields/text/PasswordField.tsx","../src/components/fields/text/SlugField.tsx"],"sourcesContent":["import { FieldName, useField } from \"@conform-to/react/future\";\nimport { Field, type FieldProps } from \"../field/Field\";\nimport { Input, type InputProps } from \"./Input\";\n\ntype Props = Omit<FieldProps, \"children\" | \"group\"> &\n  Pick<\n    InputProps,\n    | \"type\"\n    | \"placeholder\"\n    | \"prefix\"\n    | \"suffix\"\n    | \"variant\"\n    | \"color\"\n    | \"size\"\n    | \"disabled\"\n    | \"readOnly\"\n    | \"inputClassName\"\n    | \"prefixClassName\"\n    | \"suffixClassName\"\n  > & {\n    name: FieldName<string | number | null | undefined>;\n  };\n\nexport function TextField({\n  name,\n  type,\n  placeholder,\n  prefix,\n  suffix,\n  variant,\n  color,\n  size,\n  disabled,\n  readOnly,\n  inputClassName,\n  prefixClassName,\n  suffixClassName,\n  id: forcedId,\n  ...rest\n}: Props) {\n  const field = useField(name);\n  const id = forcedId ?? field.id;\n\n  return (\n    <Field id={id} errors={field.errors} data-testid={field.name} {...rest}>\n      <Input\n        name={field.name}\n        defaultValue={field.defaultValue}\n        type={type}\n        placeholder={placeholder}\n        prefix={prefix}\n        suffix={suffix}\n        variant={variant}\n        color={color}\n        size={size}\n        disabled={disabled}\n        readOnly={readOnly}\n        inputClassName={inputClassName}\n        prefixClassName={prefixClassName}\n        suffixClassName={suffixClassName}\n      />\n    </Field>\n  );\n}\n","export function getPasswordStrength(password: string = \"\"): number {\n  let score = 0;\n  const length = password.length;\n\n  if (length === 0) {\n    return 0;\n  }\n\n  if (length >= 8) score++; // Baseline minimale\n  if (length >= 12) score++; // Longueur robuste\n  if (/[a-z]/.test(password) && /[A-Z]/.test(password)) score++; // Majuscules + minuscules\n  if (/\\d/.test(password)) score++; // Chiffres\n  if (/[^A-Za-z0-9]/.test(password)) score++; // Caractères spéciaux\n\n  // Ajustements pour éviter des scores trop élevés avec de faibles critères\n  if (length < 8) return 1; // Trop court = très faible sécurité\n  if (score === 5 && length < 10) score--; // Évite un score max avec un mot de passe trop court\n\n  return Math.min(score, 5);\n}\n\nexport function gradientVariantFromScore(score: number) {\n  if (score <= 1) {\n    return \"from-red-5 to-red-3\";\n  } else if (score <= 2) {\n    return \"from-red-4 to-orange-3\";\n  } else if (score <= 3) {\n    return \"from-red-3 to-green-3\";\n  } else if (score <= 4) {\n    return \"from-orange-3 to-green-4\";\n  } else {\n    return \"from-green-4 to-green-4\";\n  }\n}\n","import { getFieldValue, useField, useFormData, type FieldName } from \"@conform-to/react/future\";\nimport { Field, type FieldProps } from \"../field/Field\";\nimport { Input } from \"./Input\";\nimport { Button } from \"../../button\";\nimport { useState } from \"react\";\nimport { getPasswordStrength, gradientVariantFromScore } from \"../../../lib/pass-checker\";\nimport clsx from \"clsx\";\n\ninterface Props extends Omit<FieldProps, \"errors\" | \"children\" | \"group\"> {\n  name: FieldName<string | undefined | null>;\n  showScore?: boolean;\n}\n\nexport function PasswordField({ name, showScore = false, id: forcedId, ...rest }: Props) {\n  const field = useField(name);\n  const id = forcedId ?? field.id;\n  const [showPassword, setShowPassword] = useState(false);\n\n  const value = useFormData(field.formId, (formData) =>\n    getFieldValue(formData, field.name, { type: \"string\" }),\n  );\n\n  const passwordScore = getPasswordStrength(value);\n\n  return (\n    <Field id={id} errors={field.errors} data-testid={field.name} {...rest}>\n      <Input\n        className=\"relative overflow-hidden\"\n        suffix={\n          <Button\n            size=\"input\"\n            type=\"button\"\n            withRipple={true}\n            icon\n            variant=\"ghost\"\n            color=\"gray\"\n            onClick={() => setShowPassword((s) => !s)}\n          >\n            <i className={showPassword ? \"fe-eye\" : \"fe-eye-closed\"}></i>\n          </Button>\n        }\n        defaultValue={field.defaultValue}\n        name={field.name}\n        type={showPassword ? \"text\" : \"password\"}\n      >\n        {showScore && (\n          <div\n            className=\"absolute bottom-0 left-0 h-[3px] overflow-hidden\"\n            style={{ width: `${passwordScore * 20}%` }}\n          >\n            <div\n              className={clsx(\n                \"absolute right-0 -bottom-px left-0 h-[3px] rounded-xs bg-linear-to-r\",\n                gradientVariantFromScore(passwordScore),\n              )}\n            ></div>\n          </div>\n        )}\n      </Input>\n    </Field>\n  );\n}\n","import { useField, useControl, type FieldName } from \"@conform-to/react/future\";\nimport { Field, type FieldProps } from \"../field/Field\";\nimport { Input } from \"./Input\";\nimport { slugify } from \"../../../lib/strUtil\";\nimport type { ChangeEvent } from \"react\";\n\ninterface Props extends Omit<FieldProps, \"errors\" | \"children\" | \"group\"> {\n  name: FieldName<string | null | undefined>;\n  placeholder?: string;\n}\n\nexport function SlugField({ name, id: forcedId, placeholder, ...rest }: Props) {\n  const field = useField(name);\n  const id = forcedId ?? field.id;\n  const control = useControl({\n    defaultValue: field.defaultValue,\n  });\n\n  function handleChange(e: ChangeEvent<HTMLInputElement>) {\n    control.change(slugify(e.target.value, false, false));\n  }\n\n  function handleBlur() {\n    if (control.value) {\n      control.change(slugify(control.value, false));\n    }\n    control.blur();\n  }\n\n  return (\n    <>\n      <input\n        type=\"text\"\n        hidden\n        name={field.name}\n        ref={control.register}\n        defaultValue={field.defaultValue}\n      />\n      <Field id={id} errors={field.errors} data-testid={field.name} {...rest}>\n        <Input\n          value={control.value ?? \"\"}\n          onBlur={handleBlur}\n          onChange={handleChange}\n          placeholder={placeholder}\n        />\n      </Field>\n    </>\n  );\n}\n"],"mappings":"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"}