@atlashub/smartstack 3.8.0 → 3.10.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.
Files changed (37) hide show
  1. package/dist/{AuthCallbackPage-CbkCo5cL.cjs → AuthCallbackPage-Bv2Cyn80.cjs} +2 -2
  2. package/dist/{AuthCallbackPage-CbkCo5cL.cjs.map → AuthCallbackPage-Bv2Cyn80.cjs.map} +1 -1
  3. package/dist/{AuthCallbackPage-UbzOvvaa.js → AuthCallbackPage-Cu74zAX1.js} +2 -2
  4. package/dist/{AuthCallbackPage-UbzOvvaa.js.map → AuthCallbackPage-Cu74zAX1.js.map} +1 -1
  5. package/dist/{ConfirmEmailPage-Cui47UrD.js → ConfirmEmailPage-BTp8J0pw.js} +2 -2
  6. package/dist/{ConfirmEmailPage-Cui47UrD.js.map → ConfirmEmailPage-BTp8J0pw.js.map} +1 -1
  7. package/dist/{ConfirmEmailPage-BkCDKBy0.cjs → ConfirmEmailPage-su3Fvl0e.cjs} +2 -2
  8. package/dist/{ConfirmEmailPage-BkCDKBy0.cjs.map → ConfirmEmailPage-su3Fvl0e.cjs.map} +1 -1
  9. package/dist/{ForceChangePasswordPage-ov-jJgku.js → ForceChangePasswordPage-ClENqzCH.js} +2 -2
  10. package/dist/{ForceChangePasswordPage-ov-jJgku.js.map → ForceChangePasswordPage-ClENqzCH.js.map} +1 -1
  11. package/dist/{ForceChangePasswordPage-3ozgKLOY.cjs → ForceChangePasswordPage-kEFsb5Aq.cjs} +2 -2
  12. package/dist/{ForceChangePasswordPage-3ozgKLOY.cjs.map → ForceChangePasswordPage-kEFsb5Aq.cjs.map} +1 -1
  13. package/dist/{ForgotPasswordPage-DkrQI8cO.cjs → ForgotPasswordPage--Wl0Vxbv.cjs} +2 -2
  14. package/dist/{ForgotPasswordPage-DkrQI8cO.cjs.map → ForgotPasswordPage--Wl0Vxbv.cjs.map} +1 -1
  15. package/dist/{ForgotPasswordPage-CNyDYEfP.js → ForgotPasswordPage-BEgvV5f-.js} +2 -2
  16. package/dist/{ForgotPasswordPage-CNyDYEfP.js.map → ForgotPasswordPage-BEgvV5f-.js.map} +1 -1
  17. package/dist/{OnboardingWizardPage-DNoe1_iv.js → OnboardingWizardPage-Bx1UlTbr.js} +2 -2
  18. package/dist/{OnboardingWizardPage-DNoe1_iv.js.map → OnboardingWizardPage-Bx1UlTbr.js.map} +1 -1
  19. package/dist/{OnboardingWizardPage-BWMGYiu9.cjs → OnboardingWizardPage-C7vendrq.cjs} +2 -2
  20. package/dist/{OnboardingWizardPage-BWMGYiu9.cjs.map → OnboardingWizardPage-C7vendrq.cjs.map} +1 -1
  21. package/dist/{RegisterPage-DUGhJPnX.js → RegisterPage-BzV0sCTe.js} +2 -2
  22. package/dist/{RegisterPage-DUGhJPnX.js.map → RegisterPage-BzV0sCTe.js.map} +1 -1
  23. package/dist/{RegisterPage--lihqFk7.cjs → RegisterPage-DKr8quRk.cjs} +2 -2
  24. package/dist/{RegisterPage--lihqFk7.cjs.map → RegisterPage-DKr8quRk.cjs.map} +1 -1
  25. package/dist/{ResetPasswordPage-BxZb9y8W.js → ResetPasswordPage-DphmJrcJ.js} +2 -2
  26. package/dist/{ResetPasswordPage-BxZb9y8W.js.map → ResetPasswordPage-DphmJrcJ.js.map} +1 -1
  27. package/dist/{ResetPasswordPage-BpVqJA06.cjs → ResetPasswordPage-x4do1o-j.cjs} +2 -2
  28. package/dist/{ResetPasswordPage-BpVqJA06.cjs.map → ResetPasswordPage-x4do1o-j.cjs.map} +1 -1
  29. package/dist/{index-C2c3iEpN.js → index-0Jhdcj59.js} +3 -3
  30. package/dist/index-0Jhdcj59.js.map +1 -0
  31. package/dist/{index-CHdBJkh4.cjs → index-C6C5XmVj.cjs} +3 -3
  32. package/dist/index-C6C5XmVj.cjs.map +1 -0
  33. package/dist/smartstack.cjs +1 -1
  34. package/dist/smartstack.js +1 -1
  35. package/package.json +1 -1
  36. package/dist/index-C2c3iEpN.js.map +0 -1
  37. package/dist/index-CHdBJkh4.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ForceChangePasswordPage-3ozgKLOY.cjs","sources":["../src/pages/auth/ForceChangePasswordPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Lock, Eye, EyeOff, Loader2, AlertTriangle, CheckCircle } from 'lucide-react';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\nexport function ForceChangePasswordPage() {\r\n const { t } = useTranslation();\r\n const navigate = useNavigate();\r\n\r\n const [currentPassword, setCurrentPassword] = useState('');\r\n const [newPassword, setNewPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showCurrentPassword, setShowCurrentPassword] = useState(false);\r\n const [showNewPassword, setShowNewPassword] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const validatePassword = (password: string): string[] => {\r\n const errors: string[] = [];\r\n if (password.length < 8) errors.push('Au moins 8 caractères');\r\n if (!/[A-Z]/.test(password)) errors.push('Au moins une majuscule');\r\n if (!/[a-z]/.test(password)) errors.push('Au moins une minuscule');\r\n if (!/[0-9]/.test(password)) errors.push('Au moins un chiffre');\r\n return errors;\r\n };\r\n\r\n const passwordErrors = validatePassword(newPassword);\r\n const isValid = newPassword === confirmPassword && passwordErrors.length === 0 && currentPassword.length > 0;\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!isValid) return;\r\n\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n await authApi.changePassword(currentPassword, newPassword);\r\n setSuccess(true);\r\n setTimeout(() => {\r\n navigate('/');\r\n }, 2000);\r\n } catch (err: unknown) {\r\n if (err instanceof Error) {\r\n setError(err.message);\r\n } else {\r\n setError('Une erreur est survenue');\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800 p-4\">\r\n <div className=\"w-full max-w-md bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8 text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle className=\"w-8 h-8 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-2\">\r\n Mot de passe modifié\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Vous allez être redirigé vers l'accueil...\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800 p-4\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {/* Header */}\r\n <div className=\"text-center mb-8\">\r\n <div className=\"w-16 h-16 bg-amber-100 dark:bg-amber-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <Lock className=\"w-8 h-8 text-amber-600 dark:text-amber-400\" />\r\n </div>\r\n <h1 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\r\n {t('auth.forceChangePassword.title', 'Changement de mot de passe requis')}\r\n </h1>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n {t('auth.forceChangePassword.description', 'Pour des raisons de sécurité, vous devez définir un nouveau mot de passe.')}\r\n </p>\r\n </div>\r\n\r\n {/* Error */}\r\n {error && (\r\n <div className=\"mb-6 p-4 rounded-xl bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5 flex-shrink-0\" />\r\n <span>{error}</span>\r\n </div>\r\n )}\r\n\r\n {/* Form */}\r\n <form onSubmit={handleSubmit} className=\"space-y-6\">\r\n {/* Current Password */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {t('auth.forceChangePassword.currentPassword', 'Mot de passe actuel (temporaire)')}\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n type={showCurrentPassword ? 'text' : 'password'}\r\n required\r\n value={currentPassword}\r\n onChange={e => setCurrentPassword(e.target.value)}\r\n className=\"w-full px-4 py-3 rounded-xl border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n placeholder=\"Entrez le mot de passe fourni par l'administrateur\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowCurrentPassword(!showCurrentPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300\"\r\n >\r\n {showCurrentPassword ? <EyeOff className=\"w-5 h-5\" /> : <Eye className=\"w-5 h-5\" />}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* New Password */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {t('auth.forceChangePassword.newPassword', 'Nouveau mot de passe')}\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n type={showNewPassword ? 'text' : 'password'}\r\n required\r\n value={newPassword}\r\n onChange={e => setNewPassword(e.target.value)}\r\n className=\"w-full px-4 py-3 rounded-xl border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n placeholder=\"Choisissez un nouveau mot de passe\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowNewPassword(!showNewPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300\"\r\n >\r\n {showNewPassword ? <EyeOff className=\"w-5 h-5\" /> : <Eye className=\"w-5 h-5\" />}\r\n </button>\r\n </div>\r\n\r\n {/* Password requirements */}\r\n {newPassword && (\r\n <div className=\"mt-2 space-y-1\">\r\n {['Au moins 8 caractères', 'Au moins une majuscule', 'Au moins une minuscule', 'Au moins un chiffre'].map((req, i) => {\r\n const checks = [\r\n newPassword.length >= 8,\r\n /[A-Z]/.test(newPassword),\r\n /[a-z]/.test(newPassword),\r\n /[0-9]/.test(newPassword)\r\n ];\r\n return (\r\n <div key={`pwd-req-${i}`} className={`flex items-center gap-2 text-sm ${checks[i] ? 'text-green-600' : 'text-gray-500'}`}>\r\n {checks[i] ? <CheckCircle className=\"w-4 h-4\" /> : <div className=\"w-4 h-4 rounded-full border border-current\" />}\r\n {req}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Confirm Password */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {t('auth.forceChangePassword.confirmPassword', 'Confirmer le nouveau mot de passe')}\r\n </label>\r\n <input\r\n type=\"password\"\r\n required\r\n value={confirmPassword}\r\n onChange={e => setConfirmPassword(e.target.value)}\r\n className={`w-full px-4 py-3 rounded-xl border ${\r\n confirmPassword && confirmPassword !== newPassword\r\n ? 'border-red-500 focus:ring-red-500'\r\n : 'border-gray-300 dark:border-gray-600 focus:ring-blue-500'\r\n } bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2`}\r\n placeholder=\"Confirmez votre nouveau mot de passe\"\r\n />\r\n {confirmPassword && confirmPassword !== newPassword && (\r\n <p className=\"mt-1 text-sm text-red-600\">Les mots de passe ne correspondent pas</p>\r\n )}\r\n </div>\r\n\r\n {/* Submit */}\r\n <button\r\n type=\"submit\"\r\n disabled={!isValid || loading}\r\n className=\"w-full py-3 px-4 rounded-xl bg-blue-600 hover:bg-blue-700 text-white font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2\"\r\n >\r\n {loading ? (\r\n <>\r\n <Loader2 className=\"w-5 h-5 animate-spin\" />\r\n <span>Modification en cours...</span>\r\n </>\r\n ) : (\r\n <span>{t('auth.forceChangePassword.submit', 'Définir mon nouveau mot de passe')}</span>\r\n )}\r\n </button>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ForceChangePasswordPage","t","useTranslation","navigate","useNavigate","currentPassword","setCurrentPassword","useState","newPassword","setNewPassword","confirmPassword","setConfirmPassword","showCurrentPassword","setShowCurrentPassword","showNewPassword","setShowNewPassword","loading","setLoading","error","setError","success","setSuccess","passwordErrors","password","errors","isValid","handleSubmit","e","authApi","err","jsxs","jsx","CheckCircle","Lock","AlertTriangle","EyeOff","Eye","req","i","checks","Fragment","Loader2"],"mappings":"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"}
1
+ {"version":3,"file":"ForceChangePasswordPage-kEFsb5Aq.cjs","sources":["../src/pages/auth/ForceChangePasswordPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Lock, Eye, EyeOff, Loader2, AlertTriangle, CheckCircle } from 'lucide-react';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\nexport function ForceChangePasswordPage() {\r\n const { t } = useTranslation();\r\n const navigate = useNavigate();\r\n\r\n const [currentPassword, setCurrentPassword] = useState('');\r\n const [newPassword, setNewPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [showCurrentPassword, setShowCurrentPassword] = useState(false);\r\n const [showNewPassword, setShowNewPassword] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const validatePassword = (password: string): string[] => {\r\n const errors: string[] = [];\r\n if (password.length < 8) errors.push('Au moins 8 caractères');\r\n if (!/[A-Z]/.test(password)) errors.push('Au moins une majuscule');\r\n if (!/[a-z]/.test(password)) errors.push('Au moins une minuscule');\r\n if (!/[0-9]/.test(password)) errors.push('Au moins un chiffre');\r\n return errors;\r\n };\r\n\r\n const passwordErrors = validatePassword(newPassword);\r\n const isValid = newPassword === confirmPassword && passwordErrors.length === 0 && currentPassword.length > 0;\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (!isValid) return;\r\n\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n await authApi.changePassword(currentPassword, newPassword);\r\n setSuccess(true);\r\n setTimeout(() => {\r\n navigate('/');\r\n }, 2000);\r\n } catch (err: unknown) {\r\n if (err instanceof Error) {\r\n setError(err.message);\r\n } else {\r\n setError('Une erreur est survenue');\r\n }\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800 p-4\">\r\n <div className=\"w-full max-w-md bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8 text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle className=\"w-8 h-8 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-2\">\r\n Mot de passe modifié\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Vous allez être redirigé vers l'accueil...\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800 p-4\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {/* Header */}\r\n <div className=\"text-center mb-8\">\r\n <div className=\"w-16 h-16 bg-amber-100 dark:bg-amber-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <Lock className=\"w-8 h-8 text-amber-600 dark:text-amber-400\" />\r\n </div>\r\n <h1 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\r\n {t('auth.forceChangePassword.title', 'Changement de mot de passe requis')}\r\n </h1>\r\n <p className=\"text-gray-600 dark:text-gray-400 mt-2\">\r\n {t('auth.forceChangePassword.description', 'Pour des raisons de sécurité, vous devez définir un nouveau mot de passe.')}\r\n </p>\r\n </div>\r\n\r\n {/* Error */}\r\n {error && (\r\n <div className=\"mb-6 p-4 rounded-xl bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 flex items-center gap-2\">\r\n <AlertTriangle className=\"w-5 h-5 flex-shrink-0\" />\r\n <span>{error}</span>\r\n </div>\r\n )}\r\n\r\n {/* Form */}\r\n <form onSubmit={handleSubmit} className=\"space-y-6\">\r\n {/* Current Password */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {t('auth.forceChangePassword.currentPassword', 'Mot de passe actuel (temporaire)')}\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n type={showCurrentPassword ? 'text' : 'password'}\r\n required\r\n value={currentPassword}\r\n onChange={e => setCurrentPassword(e.target.value)}\r\n className=\"w-full px-4 py-3 rounded-xl border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n placeholder=\"Entrez le mot de passe fourni par l'administrateur\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowCurrentPassword(!showCurrentPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300\"\r\n >\r\n {showCurrentPassword ? <EyeOff className=\"w-5 h-5\" /> : <Eye className=\"w-5 h-5\" />}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {/* New Password */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {t('auth.forceChangePassword.newPassword', 'Nouveau mot de passe')}\r\n </label>\r\n <div className=\"relative\">\r\n <input\r\n type={showNewPassword ? 'text' : 'password'}\r\n required\r\n value={newPassword}\r\n onChange={e => setNewPassword(e.target.value)}\r\n className=\"w-full px-4 py-3 rounded-xl border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n placeholder=\"Choisissez un nouveau mot de passe\"\r\n />\r\n <button\r\n type=\"button\"\r\n onClick={() => setShowNewPassword(!showNewPassword)}\r\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300\"\r\n >\r\n {showNewPassword ? <EyeOff className=\"w-5 h-5\" /> : <Eye className=\"w-5 h-5\" />}\r\n </button>\r\n </div>\r\n\r\n {/* Password requirements */}\r\n {newPassword && (\r\n <div className=\"mt-2 space-y-1\">\r\n {['Au moins 8 caractères', 'Au moins une majuscule', 'Au moins une minuscule', 'Au moins un chiffre'].map((req, i) => {\r\n const checks = [\r\n newPassword.length >= 8,\r\n /[A-Z]/.test(newPassword),\r\n /[a-z]/.test(newPassword),\r\n /[0-9]/.test(newPassword)\r\n ];\r\n return (\r\n <div key={`pwd-req-${i}`} className={`flex items-center gap-2 text-sm ${checks[i] ? 'text-green-600' : 'text-gray-500'}`}>\r\n {checks[i] ? <CheckCircle className=\"w-4 h-4\" /> : <div className=\"w-4 h-4 rounded-full border border-current\" />}\r\n {req}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Confirm Password */}\r\n <div>\r\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {t('auth.forceChangePassword.confirmPassword', 'Confirmer le nouveau mot de passe')}\r\n </label>\r\n <input\r\n type=\"password\"\r\n required\r\n value={confirmPassword}\r\n onChange={e => setConfirmPassword(e.target.value)}\r\n className={`w-full px-4 py-3 rounded-xl border ${\r\n confirmPassword && confirmPassword !== newPassword\r\n ? 'border-red-500 focus:ring-red-500'\r\n : 'border-gray-300 dark:border-gray-600 focus:ring-blue-500'\r\n } bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2`}\r\n placeholder=\"Confirmez votre nouveau mot de passe\"\r\n />\r\n {confirmPassword && confirmPassword !== newPassword && (\r\n <p className=\"mt-1 text-sm text-red-600\">Les mots de passe ne correspondent pas</p>\r\n )}\r\n </div>\r\n\r\n {/* Submit */}\r\n <button\r\n type=\"submit\"\r\n disabled={!isValid || loading}\r\n className=\"w-full py-3 px-4 rounded-xl bg-blue-600 hover:bg-blue-700 text-white font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2\"\r\n >\r\n {loading ? (\r\n <>\r\n <Loader2 className=\"w-5 h-5 animate-spin\" />\r\n <span>Modification en cours...</span>\r\n </>\r\n ) : (\r\n <span>{t('auth.forceChangePassword.submit', 'Définir mon nouveau mot de passe')}</span>\r\n )}\r\n </button>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ForceChangePasswordPage","t","useTranslation","navigate","useNavigate","currentPassword","setCurrentPassword","useState","newPassword","setNewPassword","confirmPassword","setConfirmPassword","showCurrentPassword","setShowCurrentPassword","showNewPassword","setShowNewPassword","loading","setLoading","error","setError","success","setSuccess","passwordErrors","password","errors","isValid","handleSubmit","e","authApi","err","jsxs","jsx","CheckCircle","Lock","AlertTriangle","EyeOff","Eye","req","i","checks","Fragment","Loader2"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react"),h=require("react-router-dom"),r=require("lucide-react"),o=require("./index-CHdBJkh4.cjs");function b(){const[s,c]=t.useState(""),[a,i]=t.useState(!1),[n,d]=t.useState(null),[m,x]=t.useState(!1),u=async l=>{l.preventDefault(),d(null),i(!0);try{await o.authApi.forgotPassword(s),x(!0)}catch(g){d(g?.message||"Une erreur est survenue")}finally{i(!1)}};return e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8",children:e.jsxs("div",{className:"w-full max-w-md",children:[e.jsx("div",{className:"flex justify-end mb-8",children:e.jsx(o.ThemeSwitcher,{})}),e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8",children:[m?e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4",children:e.jsx(r.CheckCircle2,{className:"w-10 h-10 text-green-600 dark:text-green-400"})}),e.jsx("h2",{className:"text-xl font-semibold text-gray-900 dark:text-white mb-2",children:"Email envoyé !"}),e.jsxs("p",{className:"text-gray-600 dark:text-gray-400 mb-6",children:["Si un compte existe avec l'adresse ",e.jsx("strong",{children:s}),", vous recevrez un lien de réinitialisation."]}),e.jsx("p",{className:"text-sm text-gray-500 dark:text-gray-400",children:"N'oubliez pas de vérifier vos spams."})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"text-center mb-8",children:[e.jsx("div",{className:"w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center mx-auto mb-4",children:e.jsx(r.Mail,{className:"w-8 h-8 text-blue-600 dark:text-blue-400"})}),e.jsx("h2",{className:"text-2xl font-bold text-gray-900 dark:text-white mb-2",children:"Mot de passe oublié ?"}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:"Entrez votre email et nous vous enverrons un lien pour réinitialiser votre mot de passe."})]}),n&&e.jsxs("div",{className:"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3",children:[e.jsx(r.AlertCircle,{className:"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5"}),e.jsx("p",{className:"text-sm text-red-500",children:n})]}),e.jsxs("form",{onSubmit:u,className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"email",className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2",children:"Adresse email"}),e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none",children:e.jsx(r.Mail,{className:"h-5 w-5 text-gray-400"})}),e.jsx("input",{id:"email",type:"email",value:s,onChange:l=>c(l.target.value),className:"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent",placeholder:"vous@exemple.com",required:!0,autoComplete:"email",disabled:a})]})]}),e.jsx("button",{type:"submit",disabled:a,className:"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 disabled:opacity-50 transition-all",children:a?e.jsxs(e.Fragment,{children:[e.jsx(r.Loader2,{className:"h-5 w-5 animate-spin"}),"Envoi en cours..."]}):"Envoyer le lien"})]})]}),e.jsx("div",{className:"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700",children:e.jsxs(h.Link,{to:"/login",className:"flex items-center justify-center gap-2 text-sm text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 transition-colors",children:[e.jsx(r.ArrowLeft,{className:"w-4 h-4"}),"Retour à la connexion"]})})]})]})})}exports.ForgotPasswordPage=b;
2
- //# sourceMappingURL=ForgotPasswordPage-DkrQI8cO.cjs.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react"),h=require("react-router-dom"),r=require("lucide-react"),o=require("./index-C6C5XmVj.cjs");function b(){const[s,c]=t.useState(""),[a,i]=t.useState(!1),[n,d]=t.useState(null),[m,x]=t.useState(!1),u=async l=>{l.preventDefault(),d(null),i(!0);try{await o.authApi.forgotPassword(s),x(!0)}catch(g){d(g?.message||"Une erreur est survenue")}finally{i(!1)}};return e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8",children:e.jsxs("div",{className:"w-full max-w-md",children:[e.jsx("div",{className:"flex justify-end mb-8",children:e.jsx(o.ThemeSwitcher,{})}),e.jsxs("div",{className:"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8",children:[m?e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4",children:e.jsx(r.CheckCircle2,{className:"w-10 h-10 text-green-600 dark:text-green-400"})}),e.jsx("h2",{className:"text-xl font-semibold text-gray-900 dark:text-white mb-2",children:"Email envoyé !"}),e.jsxs("p",{className:"text-gray-600 dark:text-gray-400 mb-6",children:["Si un compte existe avec l'adresse ",e.jsx("strong",{children:s}),", vous recevrez un lien de réinitialisation."]}),e.jsx("p",{className:"text-sm text-gray-500 dark:text-gray-400",children:"N'oubliez pas de vérifier vos spams."})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"text-center mb-8",children:[e.jsx("div",{className:"w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center mx-auto mb-4",children:e.jsx(r.Mail,{className:"w-8 h-8 text-blue-600 dark:text-blue-400"})}),e.jsx("h2",{className:"text-2xl font-bold text-gray-900 dark:text-white mb-2",children:"Mot de passe oublié ?"}),e.jsx("p",{className:"text-gray-600 dark:text-gray-400",children:"Entrez votre email et nous vous enverrons un lien pour réinitialiser votre mot de passe."})]}),n&&e.jsxs("div",{className:"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3",children:[e.jsx(r.AlertCircle,{className:"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5"}),e.jsx("p",{className:"text-sm text-red-500",children:n})]}),e.jsxs("form",{onSubmit:u,className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"email",className:"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2",children:"Adresse email"}),e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none",children:e.jsx(r.Mail,{className:"h-5 w-5 text-gray-400"})}),e.jsx("input",{id:"email",type:"email",value:s,onChange:l=>c(l.target.value),className:"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent",placeholder:"vous@exemple.com",required:!0,autoComplete:"email",disabled:a})]})]}),e.jsx("button",{type:"submit",disabled:a,className:"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 disabled:opacity-50 transition-all",children:a?e.jsxs(e.Fragment,{children:[e.jsx(r.Loader2,{className:"h-5 w-5 animate-spin"}),"Envoi en cours..."]}):"Envoyer le lien"})]})]}),e.jsx("div",{className:"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700",children:e.jsxs(h.Link,{to:"/login",className:"flex items-center justify-center gap-2 text-sm text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 transition-colors",children:[e.jsx(r.ArrowLeft,{className:"w-4 h-4"}),"Retour à la connexion"]})})]})]})})}exports.ForgotPasswordPage=b;
2
+ //# sourceMappingURL=ForgotPasswordPage--Wl0Vxbv.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ForgotPasswordPage-DkrQI8cO.cjs","sources":["../src/pages/auth/ForgotPasswordPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { Mail, Loader2, ArrowLeft, CheckCircle2, AlertCircle } from 'lucide-react';\r\nimport { ThemeSwitcher } from '@/components/ui/ThemeSwitcher';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\nexport function ForgotPasswordPage() {\r\n const [email, setEmail] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n setIsLoading(true);\r\n\r\n try {\r\n await authApi.forgotPassword(email);\r\n setSuccess(true);\r\n } catch (err) {\r\n const error = err as { message?: string };\r\n setError(error?.message || 'Une erreur est survenue');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"flex justify-end mb-8\">\r\n <ThemeSwitcher />\r\n </div>\r\n\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {!success ? (\r\n <>\r\n <div className=\"text-center mb-8\">\r\n <div className=\"w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <Mail className=\"w-8 h-8 text-blue-600 dark:text-blue-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-2\">\r\n Mot de passe oublié ?\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Entrez votre email et nous vous enverrons un lien pour réinitialiser votre mot de passe.\r\n </p>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5\" />\r\n <p className=\"text-sm text-red-500\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n <div>\r\n <label htmlFor=\"email\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n Adresse email\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Mail className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n placeholder=\"vous@exemple.com\"\r\n required\r\n autoComplete=\"email\"\r\n disabled={isLoading}\r\n />\r\n </div>\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 disabled:opacity-50 transition-all\"\r\n >\r\n {isLoading ? (\r\n <>\r\n <Loader2 className=\"h-5 w-5 animate-spin\" />\r\n Envoi en cours...\r\n </>\r\n ) : (\r\n 'Envoyer le lien'\r\n )}\r\n </button>\r\n </form>\r\n </>\r\n ) : (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle2 className=\"w-10 h-10 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n Email envoyé !\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n Si un compte existe avec l'adresse <strong>{email}</strong>, vous recevrez un lien de réinitialisation.\r\n </p>\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\r\n N'oubliez pas de vérifier vos spams.\r\n </p>\r\n </div>\r\n )}\r\n\r\n <div className=\"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700\">\r\n <Link\r\n to=\"/login\"\r\n className=\"flex items-center justify-center gap-2 text-sm text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n Retour à la connexion\r\n </Link>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ForgotPasswordPage","email","setEmail","useState","isLoading","setIsLoading","error","setError","success","setSuccess","handleSubmit","e","authApi","err","jsxs","jsx","ThemeSwitcher","CheckCircle2","Fragment","Mail","AlertCircle","Loader2","Link","ArrowLeft"],"mappings":"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"}
1
+ {"version":3,"file":"ForgotPasswordPage--Wl0Vxbv.cjs","sources":["../src/pages/auth/ForgotPasswordPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { Mail, Loader2, ArrowLeft, CheckCircle2, AlertCircle } from 'lucide-react';\r\nimport { ThemeSwitcher } from '@/components/ui/ThemeSwitcher';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\nexport function ForgotPasswordPage() {\r\n const [email, setEmail] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n setIsLoading(true);\r\n\r\n try {\r\n await authApi.forgotPassword(email);\r\n setSuccess(true);\r\n } catch (err) {\r\n const error = err as { message?: string };\r\n setError(error?.message || 'Une erreur est survenue');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"flex justify-end mb-8\">\r\n <ThemeSwitcher />\r\n </div>\r\n\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {!success ? (\r\n <>\r\n <div className=\"text-center mb-8\">\r\n <div className=\"w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <Mail className=\"w-8 h-8 text-blue-600 dark:text-blue-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-2\">\r\n Mot de passe oublié ?\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Entrez votre email et nous vous enverrons un lien pour réinitialiser votre mot de passe.\r\n </p>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5\" />\r\n <p className=\"text-sm text-red-500\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n <div>\r\n <label htmlFor=\"email\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n Adresse email\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Mail className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n placeholder=\"vous@exemple.com\"\r\n required\r\n autoComplete=\"email\"\r\n disabled={isLoading}\r\n />\r\n </div>\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 disabled:opacity-50 transition-all\"\r\n >\r\n {isLoading ? (\r\n <>\r\n <Loader2 className=\"h-5 w-5 animate-spin\" />\r\n Envoi en cours...\r\n </>\r\n ) : (\r\n 'Envoyer le lien'\r\n )}\r\n </button>\r\n </form>\r\n </>\r\n ) : (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle2 className=\"w-10 h-10 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n Email envoyé !\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n Si un compte existe avec l'adresse <strong>{email}</strong>, vous recevrez un lien de réinitialisation.\r\n </p>\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\r\n N'oubliez pas de vérifier vos spams.\r\n </p>\r\n </div>\r\n )}\r\n\r\n <div className=\"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700\">\r\n <Link\r\n to=\"/login\"\r\n className=\"flex items-center justify-center gap-2 text-sm text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n Retour à la connexion\r\n </Link>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ForgotPasswordPage","email","setEmail","useState","isLoading","setIsLoading","error","setError","success","setSuccess","handleSubmit","e","authApi","err","jsxs","jsx","ThemeSwitcher","CheckCircle2","Fragment","Mail","AlertCircle","Loader2","Link","ArrowLeft"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as r, Fragment as o } from "react/jsx-runtime";
2
2
  import { useState as t } from "react";
3
3
  import { Link as x } from "react-router-dom";
4
4
  import { Mail as c, AlertCircle as b, Loader2 as p, CheckCircle2 as f, ArrowLeft as y } from "lucide-react";
5
- import { T as v, a as N } from "./index-C2c3iEpN.js";
5
+ import { T as v, a as N } from "./index-0Jhdcj59.js";
6
6
  function A() {
7
7
  const [a, m] = t(""), [l, i] = t(!1), [n, d] = t(null), [u, h] = t(!1);
8
8
  return /* @__PURE__ */ e("div", { className: "min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8", children: /* @__PURE__ */ r("div", { className: "w-full max-w-md", children: [
@@ -88,4 +88,4 @@ function A() {
88
88
  export {
89
89
  A as ForgotPasswordPage
90
90
  };
91
- //# sourceMappingURL=ForgotPasswordPage-CNyDYEfP.js.map
91
+ //# sourceMappingURL=ForgotPasswordPage-BEgvV5f-.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ForgotPasswordPage-CNyDYEfP.js","sources":["../src/pages/auth/ForgotPasswordPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { Mail, Loader2, ArrowLeft, CheckCircle2, AlertCircle } from 'lucide-react';\r\nimport { ThemeSwitcher } from '@/components/ui/ThemeSwitcher';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\nexport function ForgotPasswordPage() {\r\n const [email, setEmail] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n setIsLoading(true);\r\n\r\n try {\r\n await authApi.forgotPassword(email);\r\n setSuccess(true);\r\n } catch (err) {\r\n const error = err as { message?: string };\r\n setError(error?.message || 'Une erreur est survenue');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"flex justify-end mb-8\">\r\n <ThemeSwitcher />\r\n </div>\r\n\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {!success ? (\r\n <>\r\n <div className=\"text-center mb-8\">\r\n <div className=\"w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <Mail className=\"w-8 h-8 text-blue-600 dark:text-blue-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-2\">\r\n Mot de passe oublié ?\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Entrez votre email et nous vous enverrons un lien pour réinitialiser votre mot de passe.\r\n </p>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5\" />\r\n <p className=\"text-sm text-red-500\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n <div>\r\n <label htmlFor=\"email\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n Adresse email\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Mail className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n placeholder=\"vous@exemple.com\"\r\n required\r\n autoComplete=\"email\"\r\n disabled={isLoading}\r\n />\r\n </div>\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 disabled:opacity-50 transition-all\"\r\n >\r\n {isLoading ? (\r\n <>\r\n <Loader2 className=\"h-5 w-5 animate-spin\" />\r\n Envoi en cours...\r\n </>\r\n ) : (\r\n 'Envoyer le lien'\r\n )}\r\n </button>\r\n </form>\r\n </>\r\n ) : (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle2 className=\"w-10 h-10 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n Email envoyé !\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n Si un compte existe avec l'adresse <strong>{email}</strong>, vous recevrez un lien de réinitialisation.\r\n </p>\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\r\n N'oubliez pas de vérifier vos spams.\r\n </p>\r\n </div>\r\n )}\r\n\r\n <div className=\"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700\">\r\n <Link\r\n to=\"/login\"\r\n className=\"flex items-center justify-center gap-2 text-sm text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n Retour à la connexion\r\n </Link>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ForgotPasswordPage","email","setEmail","useState","isLoading","setIsLoading","error","setError","success","setSuccess","jsxs","jsx","ThemeSwitcher","CheckCircle2","Fragment","Mail","AlertCircle","e","authApi","err","Loader2","Link","ArrowLeft"],"mappings":"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"}
1
+ {"version":3,"file":"ForgotPasswordPage-BEgvV5f-.js","sources":["../src/pages/auth/ForgotPasswordPage.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { Mail, Loader2, ArrowLeft, CheckCircle2, AlertCircle } from 'lucide-react';\r\nimport { ThemeSwitcher } from '@/components/ui/ThemeSwitcher';\r\nimport { authApi } from '@/services/api/authApi';\r\n\r\nexport function ForgotPasswordPage() {\r\n const [email, setEmail] = useState('');\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault();\r\n setError(null);\r\n setIsLoading(true);\r\n\r\n try {\r\n await authApi.forgotPassword(email);\r\n setSuccess(true);\r\n } catch (err) {\r\n const error = err as { message?: string };\r\n setError(error?.message || 'Une erreur est survenue');\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 p-8\">\r\n <div className=\"w-full max-w-md\">\r\n <div className=\"flex justify-end mb-8\">\r\n <ThemeSwitcher />\r\n </div>\r\n\r\n <div className=\"bg-white dark:bg-gray-800 rounded-2xl shadow-xl p-8\">\r\n {!success ? (\r\n <>\r\n <div className=\"text-center mb-8\">\r\n <div className=\"w-16 h-16 bg-blue-100 dark:bg-blue-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <Mail className=\"w-8 h-8 text-blue-600 dark:text-blue-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-2\">\r\n Mot de passe oublié ?\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400\">\r\n Entrez votre email et nous vous enverrons un lien pour réinitialiser votre mot de passe.\r\n </p>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mb-6 p-4 bg-red-500/10 border border-red-500/20 rounded-lg flex items-start gap-3\">\r\n <AlertCircle className=\"w-5 h-5 text-red-500 flex-shrink-0 mt-0.5\" />\r\n <p className=\"text-sm text-red-500\">{error}</p>\r\n </div>\r\n )}\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n <div>\r\n <label htmlFor=\"email\" className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\r\n Adresse email\r\n </label>\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\r\n <Mail className=\"h-5 w-5 text-gray-400\" />\r\n </div>\r\n <input\r\n id=\"email\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n className=\"block w-full pl-10 pr-3 py-2.5 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n placeholder=\"vous@exemple.com\"\r\n required\r\n autoComplete=\"email\"\r\n disabled={isLoading}\r\n />\r\n </div>\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n className=\"w-full flex items-center justify-center gap-2 px-4 py-3 bg-gradient-to-r from-blue-600 to-purple-600 text-white rounded-lg font-medium hover:from-blue-700 hover:to-purple-700 disabled:opacity-50 transition-all\"\r\n >\r\n {isLoading ? (\r\n <>\r\n <Loader2 className=\"h-5 w-5 animate-spin\" />\r\n Envoi en cours...\r\n </>\r\n ) : (\r\n 'Envoyer le lien'\r\n )}\r\n </button>\r\n </form>\r\n </>\r\n ) : (\r\n <div className=\"text-center\">\r\n <div className=\"w-16 h-16 bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <CheckCircle2 className=\"w-10 h-10 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\r\n Email envoyé !\r\n </h2>\r\n <p className=\"text-gray-600 dark:text-gray-400 mb-6\">\r\n Si un compte existe avec l'adresse <strong>{email}</strong>, vous recevrez un lien de réinitialisation.\r\n </p>\r\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\r\n N'oubliez pas de vérifier vos spams.\r\n </p>\r\n </div>\r\n )}\r\n\r\n <div className=\"mt-6 pt-6 border-t border-gray-200 dark:border-gray-700\">\r\n <Link\r\n to=\"/login\"\r\n className=\"flex items-center justify-center gap-2 text-sm text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n Retour à la connexion\r\n </Link>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["ForgotPasswordPage","email","setEmail","useState","isLoading","setIsLoading","error","setError","success","setSuccess","jsxs","jsx","ThemeSwitcher","CheckCircle2","Fragment","Mail","AlertCircle","e","authApi","err","Loader2","Link","ArrowLeft"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { useState as c, useEffect as k } from "react";
3
3
  import { useNavigate as D } from "react-router-dom";
4
4
  import { useTranslation as F } from "react-i18next";
5
5
  import { CheckCircle as w, Loader2 as C, Sparkles as S, Globe as j, Palette as K, ArrowLeft as M, ArrowRight as z } from "lucide-react";
6
- import { c as G, b as L } from "./index-C2c3iEpN.js";
6
+ import { c as G, b as L } from "./index-0Jhdcj59.js";
7
7
  const I = [
8
8
  { code: "fr", name: "Francais", flag: "🇫🇷" },
9
9
  { code: "en", name: "English", flag: "🇬🇧" },
@@ -208,4 +208,4 @@ function V() {
208
208
  export {
209
209
  V as OnboardingWizardPage
210
210
  };
211
- //# sourceMappingURL=OnboardingWizardPage-DNoe1_iv.js.map
211
+ //# sourceMappingURL=OnboardingWizardPage-Bx1UlTbr.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OnboardingWizardPage-DNoe1_iv.js","sources":["../src/pages/auth/OnboardingWizardPage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Loader2, CheckCircle, Globe, Palette, Sparkles, ArrowRight, ArrowLeft } from 'lucide-react';\r\nimport { api } from '@/services/api/apiClient';\r\nimport { changeLanguage } from '@/i18n/config';\r\n\r\ntype Step = 'language' | 'theme' | 'complete';\r\n\r\ninterface LanguageOption {\r\n code: string;\r\n name: string;\r\n flag: string;\r\n}\r\n\r\ninterface ThemeOption {\r\n value: string;\r\n labelKey: string;\r\n icon: string;\r\n}\r\n\r\nconst languages: LanguageOption[] = [\r\n { code: 'fr', name: 'Francais', flag: '🇫🇷' },\r\n { code: 'en', name: 'English', flag: '🇬🇧' },\r\n { code: 'de', name: 'Deutsch', flag: '🇩🇪' },\r\n { code: 'it', name: 'Italiano', flag: '🇮🇹' },\r\n];\r\n\r\nconst themes: ThemeOption[] = [\r\n { value: 'light', labelKey: 'themeLight', icon: '☀️' },\r\n { value: 'dark', labelKey: 'themeDark', icon: '🌙' },\r\n { value: 'system', labelKey: 'themeSystem', icon: '💻' },\r\n];\r\n\r\nconst accentColors = [\r\n { key: 'indigo', color: '#6366f1', name: 'Indigo' },\r\n { key: 'blue', color: '#3b82f6', name: 'Blue' },\r\n { key: 'emerald', color: '#10b981', name: 'Emerald' },\r\n { key: 'amber', color: '#f59e0b', name: 'Amber' },\r\n { key: 'rose', color: '#f43f5e', name: 'Rose' },\r\n { key: 'purple', color: '#a855f7', name: 'Purple' },\r\n];\r\n\r\nexport function OnboardingWizardPage() {\r\n const { t, i18n } = useTranslation('auth');\r\n const navigate = useNavigate();\r\n\r\n const [currentStep, setCurrentStep] = useState<Step>('language');\r\n const [selectedLanguage, setSelectedLanguage] = useState(i18n.language?.substring(0, 2) || 'fr');\r\n const [selectedTheme, setSelectedTheme] = useState('dark');\r\n const [selectedAccentColor, setSelectedAccentColor] = useState('indigo');\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n // Check onboarding status on load\r\n useEffect(() => {\r\n const checkOnboardingStatus = async () => {\r\n try {\r\n const response = await api.get<{ hasCompletedOnboarding: boolean }>('/api/onboarding/status');\r\n if (response.hasCompletedOnboarding) {\r\n // Already completed, redirect to home\r\n navigate('/myspace', { replace: true });\r\n }\r\n } catch {\r\n // If we can't check status, allow proceeding\r\n }\r\n };\r\n\r\n checkOnboardingStatus();\r\n }, [navigate]);\r\n\r\n // Update language immediately when selected (lazy loads translations if needed)\r\n useEffect(() => {\r\n if (selectedLanguage && selectedLanguage !== i18n.language?.substring(0, 2)) {\r\n changeLanguage(selectedLanguage);\r\n }\r\n }, [selectedLanguage, i18n]);\r\n\r\n const steps: { key: Step; labelKey: string; icon: React.ReactNode }[] = [\r\n { key: 'language', labelKey: 'stepLanguage', icon: <Globe className=\"w-5 h-5\" /> },\r\n { key: 'theme', labelKey: 'stepTheme', icon: <Palette className=\"w-5 h-5\" /> },\r\n { key: 'complete', labelKey: 'stepComplete', icon: <Sparkles className=\"w-5 h-5\" /> },\r\n ];\r\n\r\n const currentStepIndex = steps.findIndex((s) => s.key === currentStep);\r\n\r\n const handleNext = () => {\r\n const nextIndex = currentStepIndex + 1;\r\n if (nextIndex < steps.length) {\r\n setCurrentStep(steps[nextIndex].key);\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n const prevIndex = currentStepIndex - 1;\r\n if (prevIndex >= 0) {\r\n setCurrentStep(steps[prevIndex].key);\r\n }\r\n };\r\n\r\n const handleComplete = async () => {\r\n setIsSubmitting(true);\r\n setError(null);\r\n\r\n try {\r\n await api.post('/api/onboarding/complete', {\r\n language: selectedLanguage,\r\n theme: selectedTheme,\r\n accentColorKey: selectedAccentColor,\r\n });\r\n\r\n // Save preferences locally\r\n localStorage.setItem('i18nextLng', selectedLanguage);\r\n localStorage.setItem(\r\n 'smartstack-theme-config',\r\n JSON.stringify({\r\n mode: selectedTheme,\r\n accentColorKey: selectedAccentColor,\r\n borderRadius: {},\r\n itemPaletteKey: 'neutral',\r\n })\r\n );\r\n\r\n setSuccess(true);\r\n\r\n // Redirect after success animation\r\n setTimeout(() => {\r\n window.location.href = '/myspace';\r\n }, 2000);\r\n } catch (err) {\r\n console.error('Onboarding error:', err);\r\n setError(t('onboarding.errorMessage'));\r\n } finally {\r\n setIsSubmitting(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-[var(--bg-primary)]\">\r\n <div className=\"max-w-md w-full mx-4\">\r\n <div className=\"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]\">\r\n <div className=\"text-center\">\r\n <div className=\"w-20 h-20 mx-auto bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mb-6\">\r\n <CheckCircle className=\"w-12 h-12 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold mb-3\">{t('onboarding.successTitle')}</h2>\r\n <p className=\"text-[var(--text-secondary)]\">{t('onboarding.successMessage')}</p>\r\n <div className=\"mt-6\">\r\n <Loader2 className=\"w-6 h-6 mx-auto text-[var(--color-accent-500)] animate-spin\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-[var(--bg-primary)] p-4\">\r\n <div className=\"max-w-lg w-full\">\r\n {/* Header */}\r\n <div className=\"text-center mb-8\">\r\n <div className=\"flex items-center justify-center gap-2 mb-4\">\r\n <div className=\"w-12 h-12 bg-gradient-to-br from-blue-500 to-purple-600 rounded-xl flex items-center justify-center\">\r\n <span className=\"text-white text-xl font-bold\">S</span>\r\n </div>\r\n </div>\r\n <h1 className=\"text-3xl font-bold mb-2\">{t('onboarding.title')}</h1>\r\n <p className=\"text-[var(--text-secondary)]\">{t('onboarding.subtitle')}</p>\r\n </div>\r\n\r\n {/* Steps indicator */}\r\n <div className=\"flex justify-center mb-8\">\r\n <div className=\"flex items-center gap-2\">\r\n {steps.map((step, index) => (\r\n <div key={step.key} className=\"flex items-center\">\r\n <div\r\n className={`w-10 h-10 rounded-full flex items-center justify-center transition-all ${\r\n index <= currentStepIndex\r\n ? 'bg-[var(--color-accent-500)] text-white'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n {step.icon}\r\n </div>\r\n {index < steps.length - 1 && (\r\n <div\r\n className={`w-12 h-1 mx-1 rounded transition-all ${\r\n index < currentStepIndex\r\n ? 'bg-[var(--color-accent-500)]'\r\n : 'bg-[var(--bg-tertiary)]'\r\n }`}\r\n />\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Card */}\r\n <div className=\"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]\">\r\n {/* Language Step */}\r\n {currentStep === 'language' && (\r\n <div>\r\n <h2 className=\"text-xl font-semibold mb-6 text-center\">{t('onboarding.languageLabel')}</h2>\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n {languages.map((lang) => (\r\n <button\r\n key={lang.code}\r\n onClick={() => setSelectedLanguage(lang.code)}\r\n className={`p-4 rounded-xl border-2 transition-all ${\r\n selectedLanguage === lang.code\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n }`}\r\n >\r\n <span className=\"text-3xl mb-2 block\">{lang.flag}</span>\r\n <span className=\"font-medium\">{lang.name}</span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Theme Step */}\r\n {currentStep === 'theme' && (\r\n <div>\r\n <h2 className=\"text-xl font-semibold mb-6 text-center\">{t('onboarding.themeLabel')}</h2>\r\n\r\n {/* Theme selection */}\r\n <div className=\"grid grid-cols-3 gap-3 mb-8\">\r\n {themes.map((theme) => (\r\n <button\r\n key={theme.value}\r\n onClick={() => setSelectedTheme(theme.value)}\r\n className={`p-4 rounded-xl border-2 transition-all ${\r\n selectedTheme === theme.value\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n }`}\r\n >\r\n <span className=\"text-2xl mb-2 block\">{theme.icon}</span>\r\n <span className=\"text-sm font-medium\">{t(`onboarding.${theme.labelKey}`)}</span>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Accent color selection */}\r\n <div>\r\n <h3 className=\"text-sm font-medium mb-3 text-[var(--text-secondary)]\">\r\n {t('onboarding.accentColorLabel')}\r\n </h3>\r\n <div className=\"flex justify-center gap-3\">\r\n {accentColors.map((color) => (\r\n <button\r\n key={color.key}\r\n onClick={() => setSelectedAccentColor(color.key)}\r\n className={`w-10 h-10 rounded-full transition-all ${\r\n selectedAccentColor === color.key\r\n ? 'ring-2 ring-offset-2 ring-[var(--color-accent-500)] ring-offset-[var(--bg-secondary)]'\r\n : 'hover:scale-110'\r\n }`}\r\n style={{ backgroundColor: color.color }}\r\n title={color.name}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Complete Step */}\r\n {currentStep === 'complete' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-20 h-20 mx-auto bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 rounded-full flex items-center justify-center mb-6\">\r\n <Sparkles className=\"w-10 h-10 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold mb-4\">{t('onboarding.stepComplete')}</h2>\r\n <div className=\"text-[var(--text-secondary)] mb-6 space-y-2\">\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <Globe className=\"w-4 h-4\" />\r\n {languages.find((l) => l.code === selectedLanguage)?.name}\r\n </span>\r\n </p>\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <Palette className=\"w-4 h-4\" />\r\n {themes.find((t) => t.value === selectedTheme)?.icon}{' '}\r\n {t(`onboarding.${themes.find((th) => th.value === selectedTheme)?.labelKey}`)}\r\n </span>\r\n </p>\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <span\r\n className=\"w-4 h-4 rounded-full\"\r\n style={{ backgroundColor: accentColors.find((c) => c.key === selectedAccentColor)?.color }}\r\n />\r\n {accentColors.find((c) => c.key === selectedAccentColor)?.name}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300 rounded-lg p-3 mb-4 text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Navigation buttons */}\r\n <div className=\"flex justify-between mt-8\">\r\n {currentStepIndex > 0 ? (\r\n <button\r\n onClick={handleBack}\r\n className=\"flex items-center gap-2 px-4 py-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('onboarding.back')}\r\n </button>\r\n ) : (\r\n <div />\r\n )}\r\n\r\n {currentStep === 'complete' ? (\r\n <button\r\n onClick={handleComplete}\r\n disabled={isSubmitting}\r\n className=\"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {isSubmitting ? (\r\n <>\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {t('onboarding.completing')}\r\n </>\r\n ) : (\r\n <>\r\n {t('onboarding.complete')}\r\n <CheckCircle className=\"w-4 h-4\" />\r\n </>\r\n )}\r\n </button>\r\n ) : (\r\n <button\r\n onClick={handleNext}\r\n className=\"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors\"\r\n >\r\n {t('onboarding.continue')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["languages","themes","accentColors","OnboardingWizardPage","i18n","useTranslation","navigate","useNavigate","currentStep","setCurrentStep","useState","selectedLanguage","setSelectedLanguage","selectedTheme","setSelectedTheme","selectedAccentColor","setSelectedAccentColor","isSubmitting","setIsSubmitting","error","setError","success","setSuccess","useEffect","api","changeLanguage","steps","jsx","Globe","Palette","Sparkles","currentStepIndex","s","handleNext","nextIndex","handleBack","prevIndex","handleComplete","err","jsxs","CheckCircle","Loader2","step","index","lang","theme","color","l","t","th","c","ArrowLeft","Fragment","ArrowRight"],"mappings":"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"}
1
+ {"version":3,"file":"OnboardingWizardPage-Bx1UlTbr.js","sources":["../src/pages/auth/OnboardingWizardPage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Loader2, CheckCircle, Globe, Palette, Sparkles, ArrowRight, ArrowLeft } from 'lucide-react';\r\nimport { api } from '@/services/api/apiClient';\r\nimport { changeLanguage } from '@/i18n/config';\r\n\r\ntype Step = 'language' | 'theme' | 'complete';\r\n\r\ninterface LanguageOption {\r\n code: string;\r\n name: string;\r\n flag: string;\r\n}\r\n\r\ninterface ThemeOption {\r\n value: string;\r\n labelKey: string;\r\n icon: string;\r\n}\r\n\r\nconst languages: LanguageOption[] = [\r\n { code: 'fr', name: 'Francais', flag: '🇫🇷' },\r\n { code: 'en', name: 'English', flag: '🇬🇧' },\r\n { code: 'de', name: 'Deutsch', flag: '🇩🇪' },\r\n { code: 'it', name: 'Italiano', flag: '🇮🇹' },\r\n];\r\n\r\nconst themes: ThemeOption[] = [\r\n { value: 'light', labelKey: 'themeLight', icon: '☀️' },\r\n { value: 'dark', labelKey: 'themeDark', icon: '🌙' },\r\n { value: 'system', labelKey: 'themeSystem', icon: '💻' },\r\n];\r\n\r\nconst accentColors = [\r\n { key: 'indigo', color: '#6366f1', name: 'Indigo' },\r\n { key: 'blue', color: '#3b82f6', name: 'Blue' },\r\n { key: 'emerald', color: '#10b981', name: 'Emerald' },\r\n { key: 'amber', color: '#f59e0b', name: 'Amber' },\r\n { key: 'rose', color: '#f43f5e', name: 'Rose' },\r\n { key: 'purple', color: '#a855f7', name: 'Purple' },\r\n];\r\n\r\nexport function OnboardingWizardPage() {\r\n const { t, i18n } = useTranslation('auth');\r\n const navigate = useNavigate();\r\n\r\n const [currentStep, setCurrentStep] = useState<Step>('language');\r\n const [selectedLanguage, setSelectedLanguage] = useState(i18n.language?.substring(0, 2) || 'fr');\r\n const [selectedTheme, setSelectedTheme] = useState('dark');\r\n const [selectedAccentColor, setSelectedAccentColor] = useState('indigo');\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n // Check onboarding status on load\r\n useEffect(() => {\r\n const checkOnboardingStatus = async () => {\r\n try {\r\n const response = await api.get<{ hasCompletedOnboarding: boolean }>('/api/onboarding/status');\r\n if (response.hasCompletedOnboarding) {\r\n // Already completed, redirect to home\r\n navigate('/myspace', { replace: true });\r\n }\r\n } catch {\r\n // If we can't check status, allow proceeding\r\n }\r\n };\r\n\r\n checkOnboardingStatus();\r\n }, [navigate]);\r\n\r\n // Update language immediately when selected (lazy loads translations if needed)\r\n useEffect(() => {\r\n if (selectedLanguage && selectedLanguage !== i18n.language?.substring(0, 2)) {\r\n changeLanguage(selectedLanguage);\r\n }\r\n }, [selectedLanguage, i18n]);\r\n\r\n const steps: { key: Step; labelKey: string; icon: React.ReactNode }[] = [\r\n { key: 'language', labelKey: 'stepLanguage', icon: <Globe className=\"w-5 h-5\" /> },\r\n { key: 'theme', labelKey: 'stepTheme', icon: <Palette className=\"w-5 h-5\" /> },\r\n { key: 'complete', labelKey: 'stepComplete', icon: <Sparkles className=\"w-5 h-5\" /> },\r\n ];\r\n\r\n const currentStepIndex = steps.findIndex((s) => s.key === currentStep);\r\n\r\n const handleNext = () => {\r\n const nextIndex = currentStepIndex + 1;\r\n if (nextIndex < steps.length) {\r\n setCurrentStep(steps[nextIndex].key);\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n const prevIndex = currentStepIndex - 1;\r\n if (prevIndex >= 0) {\r\n setCurrentStep(steps[prevIndex].key);\r\n }\r\n };\r\n\r\n const handleComplete = async () => {\r\n setIsSubmitting(true);\r\n setError(null);\r\n\r\n try {\r\n await api.post('/api/onboarding/complete', {\r\n language: selectedLanguage,\r\n theme: selectedTheme,\r\n accentColorKey: selectedAccentColor,\r\n });\r\n\r\n // Save preferences locally\r\n localStorage.setItem('i18nextLng', selectedLanguage);\r\n localStorage.setItem(\r\n 'smartstack-theme-config',\r\n JSON.stringify({\r\n mode: selectedTheme,\r\n accentColorKey: selectedAccentColor,\r\n borderRadius: {},\r\n itemPaletteKey: 'neutral',\r\n })\r\n );\r\n\r\n setSuccess(true);\r\n\r\n // Redirect after success animation\r\n setTimeout(() => {\r\n window.location.href = '/myspace';\r\n }, 2000);\r\n } catch (err) {\r\n console.error('Onboarding error:', err);\r\n setError(t('onboarding.errorMessage'));\r\n } finally {\r\n setIsSubmitting(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-[var(--bg-primary)]\">\r\n <div className=\"max-w-md w-full mx-4\">\r\n <div className=\"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]\">\r\n <div className=\"text-center\">\r\n <div className=\"w-20 h-20 mx-auto bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mb-6\">\r\n <CheckCircle className=\"w-12 h-12 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold mb-3\">{t('onboarding.successTitle')}</h2>\r\n <p className=\"text-[var(--text-secondary)]\">{t('onboarding.successMessage')}</p>\r\n <div className=\"mt-6\">\r\n <Loader2 className=\"w-6 h-6 mx-auto text-[var(--color-accent-500)] animate-spin\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-[var(--bg-primary)] p-4\">\r\n <div className=\"max-w-lg w-full\">\r\n {/* Header */}\r\n <div className=\"text-center mb-8\">\r\n <div className=\"flex items-center justify-center gap-2 mb-4\">\r\n <div className=\"w-12 h-12 bg-gradient-to-br from-blue-500 to-purple-600 rounded-xl flex items-center justify-center\">\r\n <span className=\"text-white text-xl font-bold\">S</span>\r\n </div>\r\n </div>\r\n <h1 className=\"text-3xl font-bold mb-2\">{t('onboarding.title')}</h1>\r\n <p className=\"text-[var(--text-secondary)]\">{t('onboarding.subtitle')}</p>\r\n </div>\r\n\r\n {/* Steps indicator */}\r\n <div className=\"flex justify-center mb-8\">\r\n <div className=\"flex items-center gap-2\">\r\n {steps.map((step, index) => (\r\n <div key={step.key} className=\"flex items-center\">\r\n <div\r\n className={`w-10 h-10 rounded-full flex items-center justify-center transition-all ${\r\n index <= currentStepIndex\r\n ? 'bg-[var(--color-accent-500)] text-white'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n {step.icon}\r\n </div>\r\n {index < steps.length - 1 && (\r\n <div\r\n className={`w-12 h-1 mx-1 rounded transition-all ${\r\n index < currentStepIndex\r\n ? 'bg-[var(--color-accent-500)]'\r\n : 'bg-[var(--bg-tertiary)]'\r\n }`}\r\n />\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Card */}\r\n <div className=\"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]\">\r\n {/* Language Step */}\r\n {currentStep === 'language' && (\r\n <div>\r\n <h2 className=\"text-xl font-semibold mb-6 text-center\">{t('onboarding.languageLabel')}</h2>\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n {languages.map((lang) => (\r\n <button\r\n key={lang.code}\r\n onClick={() => setSelectedLanguage(lang.code)}\r\n className={`p-4 rounded-xl border-2 transition-all ${\r\n selectedLanguage === lang.code\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n }`}\r\n >\r\n <span className=\"text-3xl mb-2 block\">{lang.flag}</span>\r\n <span className=\"font-medium\">{lang.name}</span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Theme Step */}\r\n {currentStep === 'theme' && (\r\n <div>\r\n <h2 className=\"text-xl font-semibold mb-6 text-center\">{t('onboarding.themeLabel')}</h2>\r\n\r\n {/* Theme selection */}\r\n <div className=\"grid grid-cols-3 gap-3 mb-8\">\r\n {themes.map((theme) => (\r\n <button\r\n key={theme.value}\r\n onClick={() => setSelectedTheme(theme.value)}\r\n className={`p-4 rounded-xl border-2 transition-all ${\r\n selectedTheme === theme.value\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n }`}\r\n >\r\n <span className=\"text-2xl mb-2 block\">{theme.icon}</span>\r\n <span className=\"text-sm font-medium\">{t(`onboarding.${theme.labelKey}`)}</span>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Accent color selection */}\r\n <div>\r\n <h3 className=\"text-sm font-medium mb-3 text-[var(--text-secondary)]\">\r\n {t('onboarding.accentColorLabel')}\r\n </h3>\r\n <div className=\"flex justify-center gap-3\">\r\n {accentColors.map((color) => (\r\n <button\r\n key={color.key}\r\n onClick={() => setSelectedAccentColor(color.key)}\r\n className={`w-10 h-10 rounded-full transition-all ${\r\n selectedAccentColor === color.key\r\n ? 'ring-2 ring-offset-2 ring-[var(--color-accent-500)] ring-offset-[var(--bg-secondary)]'\r\n : 'hover:scale-110'\r\n }`}\r\n style={{ backgroundColor: color.color }}\r\n title={color.name}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Complete Step */}\r\n {currentStep === 'complete' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-20 h-20 mx-auto bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 rounded-full flex items-center justify-center mb-6\">\r\n <Sparkles className=\"w-10 h-10 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold mb-4\">{t('onboarding.stepComplete')}</h2>\r\n <div className=\"text-[var(--text-secondary)] mb-6 space-y-2\">\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <Globe className=\"w-4 h-4\" />\r\n {languages.find((l) => l.code === selectedLanguage)?.name}\r\n </span>\r\n </p>\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <Palette className=\"w-4 h-4\" />\r\n {themes.find((t) => t.value === selectedTheme)?.icon}{' '}\r\n {t(`onboarding.${themes.find((th) => th.value === selectedTheme)?.labelKey}`)}\r\n </span>\r\n </p>\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <span\r\n className=\"w-4 h-4 rounded-full\"\r\n style={{ backgroundColor: accentColors.find((c) => c.key === selectedAccentColor)?.color }}\r\n />\r\n {accentColors.find((c) => c.key === selectedAccentColor)?.name}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300 rounded-lg p-3 mb-4 text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Navigation buttons */}\r\n <div className=\"flex justify-between mt-8\">\r\n {currentStepIndex > 0 ? (\r\n <button\r\n onClick={handleBack}\r\n className=\"flex items-center gap-2 px-4 py-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('onboarding.back')}\r\n </button>\r\n ) : (\r\n <div />\r\n )}\r\n\r\n {currentStep === 'complete' ? (\r\n <button\r\n onClick={handleComplete}\r\n disabled={isSubmitting}\r\n className=\"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {isSubmitting ? (\r\n <>\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {t('onboarding.completing')}\r\n </>\r\n ) : (\r\n <>\r\n {t('onboarding.complete')}\r\n <CheckCircle className=\"w-4 h-4\" />\r\n </>\r\n )}\r\n </button>\r\n ) : (\r\n <button\r\n onClick={handleNext}\r\n className=\"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors\"\r\n >\r\n {t('onboarding.continue')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["languages","themes","accentColors","OnboardingWizardPage","i18n","useTranslation","navigate","useNavigate","currentStep","setCurrentStep","useState","selectedLanguage","setSelectedLanguage","selectedTheme","setSelectedTheme","selectedAccentColor","setSelectedAccentColor","isSubmitting","setIsSubmitting","error","setError","success","setSuccess","useEffect","api","changeLanguage","steps","jsx","Globe","Palette","Sparkles","currentStepIndex","s","handleNext","nextIndex","handleBack","prevIndex","handleComplete","err","jsxs","CheckCircle","Loader2","step","index","lang","theme","color","l","t","th","c","ArrowLeft","Fragment","ArrowRight"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),r=require("react"),P=require("react-router-dom"),T=require("react-i18next"),t=require("lucide-react"),g=require("./index-CHdBJkh4.cjs"),N=[{code:"fr",name:"Francais",flag:"🇫🇷"},{code:"en",name:"English",flag:"🇬🇧"},{code:"de",name:"Deutsch",flag:"🇩🇪"},{code:"it",name:"Italiano",flag:"🇮🇹"}],b=[{value:"light",labelKey:"themeLight",icon:"☀️"},{value:"dark",labelKey:"themeDark",icon:"🌙"},{value:"system",labelKey:"themeSystem",icon:"💻"}],u=[{key:"indigo",color:"#6366f1",name:"Indigo"},{key:"blue",color:"#3b82f6",name:"Blue"},{key:"emerald",color:"#10b981",name:"Emerald"},{key:"amber",color:"#f59e0b",name:"Amber"},{key:"rose",color:"#f43f5e",name:"Rose"},{key:"purple",color:"#a855f7",name:"Purple"}];function $(){const{t:s,i18n:x}=T.useTranslation("auth"),h=P.useNavigate(),[l,f]=r.useState("language"),[n,k]=r.useState(x.language?.substring(0,2)||"fr"),[o,w]=r.useState("dark"),[i,S]=r.useState("indigo"),[p,v]=r.useState(!1),[j,y]=r.useState(null),[C,L]=r.useState(!1);r.useEffect(()=>{(async()=>{try{(await g.api.get("/api/onboarding/status")).hasCompletedOnboarding&&h("/myspace",{replace:!0})}catch{}})()},[h]),r.useEffect(()=>{n&&n!==x.language?.substring(0,2)&&g.changeLanguage(n)},[n,x]);const c=[{key:"language",labelKey:"stepLanguage",icon:e.jsx(t.Globe,{className:"w-5 h-5"})},{key:"theme",labelKey:"stepTheme",icon:e.jsx(t.Palette,{className:"w-5 h-5"})},{key:"complete",labelKey:"stepComplete",icon:e.jsx(t.Sparkles,{className:"w-5 h-5"})}],d=c.findIndex(a=>a.key===l),I=()=>{const a=d+1;a<c.length&&f(c[a].key)},K=()=>{const a=d-1;a>=0&&f(c[a].key)},O=async()=>{v(!0),y(null);try{await g.api.post("/api/onboarding/complete",{language:n,theme:o,accentColorKey:i}),localStorage.setItem("i18nextLng",n),localStorage.setItem("smartstack-theme-config",JSON.stringify({mode:o,accentColorKey:i,borderRadius:{},itemPaletteKey:"neutral"})),L(!0),setTimeout(()=>{window.location.href="/myspace"},2e3)}catch(a){console.error("Onboarding error:",a),y(s("onboarding.errorMessage"))}finally{v(!1)}};return C?e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-[var(--bg-primary)]",children:e.jsx("div",{className:"max-w-md w-full mx-4",children:e.jsx("div",{className:"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"w-20 h-20 mx-auto bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mb-6",children:e.jsx(t.CheckCircle,{className:"w-12 h-12 text-green-600 dark:text-green-400"})}),e.jsx("h2",{className:"text-2xl font-bold mb-3",children:s("onboarding.successTitle")}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:s("onboarding.successMessage")}),e.jsx("div",{className:"mt-6",children:e.jsx(t.Loader2,{className:"w-6 h-6 mx-auto text-[var(--color-accent-500)] animate-spin"})})]})})})}):e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-[var(--bg-primary)] p-4",children:e.jsxs("div",{className:"max-w-lg w-full",children:[e.jsxs("div",{className:"text-center mb-8",children:[e.jsx("div",{className:"flex items-center justify-center gap-2 mb-4",children:e.jsx("div",{className:"w-12 h-12 bg-gradient-to-br from-blue-500 to-purple-600 rounded-xl flex items-center justify-center",children:e.jsx("span",{className:"text-white text-xl font-bold",children:"S"})})}),e.jsx("h1",{className:"text-3xl font-bold mb-2",children:s("onboarding.title")}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:s("onboarding.subtitle")})]}),e.jsx("div",{className:"flex justify-center mb-8",children:e.jsx("div",{className:"flex items-center gap-2",children:c.map((a,m)=>e.jsxs("div",{className:"flex items-center",children:[e.jsx("div",{className:`w-10 h-10 rounded-full flex items-center justify-center transition-all ${m<=d?"bg-[var(--color-accent-500)] text-white":"bg-[var(--bg-tertiary)] text-[var(--text-secondary)]"}`,children:a.icon}),m<c.length-1&&e.jsx("div",{className:`w-12 h-1 mx-1 rounded transition-all ${m<d?"bg-[var(--color-accent-500)]":"bg-[var(--bg-tertiary)]"}`})]},a.key))})}),e.jsxs("div",{className:"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]",children:[l==="language"&&e.jsxs("div",{children:[e.jsx("h2",{className:"text-xl font-semibold mb-6 text-center",children:s("onboarding.languageLabel")}),e.jsx("div",{className:"grid grid-cols-2 gap-4",children:N.map(a=>e.jsxs("button",{onClick:()=>k(a.code),className:`p-4 rounded-xl border-2 transition-all ${n===a.code?"border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20":"border-[var(--border-color)] hover:border-[var(--color-accent-300)]"}`,children:[e.jsx("span",{className:"text-3xl mb-2 block",children:a.flag}),e.jsx("span",{className:"font-medium",children:a.name})]},a.code))})]}),l==="theme"&&e.jsxs("div",{children:[e.jsx("h2",{className:"text-xl font-semibold mb-6 text-center",children:s("onboarding.themeLabel")}),e.jsx("div",{className:"grid grid-cols-3 gap-3 mb-8",children:b.map(a=>e.jsxs("button",{onClick:()=>w(a.value),className:`p-4 rounded-xl border-2 transition-all ${o===a.value?"border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20":"border-[var(--border-color)] hover:border-[var(--color-accent-300)]"}`,children:[e.jsx("span",{className:"text-2xl mb-2 block",children:a.icon}),e.jsx("span",{className:"text-sm font-medium",children:s(`onboarding.${a.labelKey}`)})]},a.value))}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-medium mb-3 text-[var(--text-secondary)]",children:s("onboarding.accentColorLabel")}),e.jsx("div",{className:"flex justify-center gap-3",children:u.map(a=>e.jsx("button",{onClick:()=>S(a.key),className:`w-10 h-10 rounded-full transition-all ${i===a.key?"ring-2 ring-offset-2 ring-[var(--color-accent-500)] ring-offset-[var(--bg-secondary)]":"hover:scale-110"}`,style:{backgroundColor:a.color},title:a.name},a.key))})]})]}),l==="complete"&&e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"w-20 h-20 mx-auto bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 rounded-full flex items-center justify-center mb-6",children:e.jsx(t.Sparkles,{className:"w-10 h-10 text-[var(--color-accent-500)]"})}),e.jsx("h2",{className:"text-xl font-semibold mb-4",children:s("onboarding.stepComplete")}),e.jsxs("div",{className:"text-[var(--text-secondary)] mb-6 space-y-2",children:[e.jsx("p",{children:e.jsxs("span",{className:"inline-flex items-center gap-2",children:[e.jsx(t.Globe,{className:"w-4 h-4"}),N.find(a=>a.code===n)?.name]})}),e.jsx("p",{children:e.jsxs("span",{className:"inline-flex items-center gap-2",children:[e.jsx(t.Palette,{className:"w-4 h-4"}),b.find(a=>a.value===o)?.icon," ",s(`onboarding.${b.find(a=>a.value===o)?.labelKey}`)]})}),e.jsx("p",{children:e.jsxs("span",{className:"inline-flex items-center gap-2",children:[e.jsx("span",{className:"w-4 h-4 rounded-full",style:{backgroundColor:u.find(a=>a.key===i)?.color}}),u.find(a=>a.key===i)?.name]})})]}),j&&e.jsx("div",{className:"bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300 rounded-lg p-3 mb-4 text-sm",children:j})]}),e.jsxs("div",{className:"flex justify-between mt-8",children:[d>0?e.jsxs("button",{onClick:K,className:"flex items-center gap-2 px-4 py-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors",children:[e.jsx(t.ArrowLeft,{className:"w-4 h-4"}),s("onboarding.back")]}):e.jsx("div",{}),l==="complete"?e.jsx("button",{onClick:O,disabled:p,className:"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors disabled:opacity-50",children:p?e.jsxs(e.Fragment,{children:[e.jsx(t.Loader2,{className:"w-4 h-4 animate-spin"}),s("onboarding.completing")]}):e.jsxs(e.Fragment,{children:[s("onboarding.complete"),e.jsx(t.CheckCircle,{className:"w-4 h-4"})]})}):e.jsxs("button",{onClick:I,className:"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors",children:[s("onboarding.continue"),e.jsx(t.ArrowRight,{className:"w-4 h-4"})]})]})]})]})})}exports.OnboardingWizardPage=$;
2
- //# sourceMappingURL=OnboardingWizardPage-BWMGYiu9.cjs.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),r=require("react"),P=require("react-router-dom"),T=require("react-i18next"),t=require("lucide-react"),g=require("./index-C6C5XmVj.cjs"),N=[{code:"fr",name:"Francais",flag:"🇫🇷"},{code:"en",name:"English",flag:"🇬🇧"},{code:"de",name:"Deutsch",flag:"🇩🇪"},{code:"it",name:"Italiano",flag:"🇮🇹"}],b=[{value:"light",labelKey:"themeLight",icon:"☀️"},{value:"dark",labelKey:"themeDark",icon:"🌙"},{value:"system",labelKey:"themeSystem",icon:"💻"}],u=[{key:"indigo",color:"#6366f1",name:"Indigo"},{key:"blue",color:"#3b82f6",name:"Blue"},{key:"emerald",color:"#10b981",name:"Emerald"},{key:"amber",color:"#f59e0b",name:"Amber"},{key:"rose",color:"#f43f5e",name:"Rose"},{key:"purple",color:"#a855f7",name:"Purple"}];function $(){const{t:s,i18n:x}=T.useTranslation("auth"),h=P.useNavigate(),[l,f]=r.useState("language"),[n,k]=r.useState(x.language?.substring(0,2)||"fr"),[o,w]=r.useState("dark"),[i,S]=r.useState("indigo"),[p,v]=r.useState(!1),[j,y]=r.useState(null),[C,L]=r.useState(!1);r.useEffect(()=>{(async()=>{try{(await g.api.get("/api/onboarding/status")).hasCompletedOnboarding&&h("/myspace",{replace:!0})}catch{}})()},[h]),r.useEffect(()=>{n&&n!==x.language?.substring(0,2)&&g.changeLanguage(n)},[n,x]);const c=[{key:"language",labelKey:"stepLanguage",icon:e.jsx(t.Globe,{className:"w-5 h-5"})},{key:"theme",labelKey:"stepTheme",icon:e.jsx(t.Palette,{className:"w-5 h-5"})},{key:"complete",labelKey:"stepComplete",icon:e.jsx(t.Sparkles,{className:"w-5 h-5"})}],d=c.findIndex(a=>a.key===l),I=()=>{const a=d+1;a<c.length&&f(c[a].key)},K=()=>{const a=d-1;a>=0&&f(c[a].key)},O=async()=>{v(!0),y(null);try{await g.api.post("/api/onboarding/complete",{language:n,theme:o,accentColorKey:i}),localStorage.setItem("i18nextLng",n),localStorage.setItem("smartstack-theme-config",JSON.stringify({mode:o,accentColorKey:i,borderRadius:{},itemPaletteKey:"neutral"})),L(!0),setTimeout(()=>{window.location.href="/myspace"},2e3)}catch(a){console.error("Onboarding error:",a),y(s("onboarding.errorMessage"))}finally{v(!1)}};return C?e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-[var(--bg-primary)]",children:e.jsx("div",{className:"max-w-md w-full mx-4",children:e.jsx("div",{className:"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]",children:e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"w-20 h-20 mx-auto bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mb-6",children:e.jsx(t.CheckCircle,{className:"w-12 h-12 text-green-600 dark:text-green-400"})}),e.jsx("h2",{className:"text-2xl font-bold mb-3",children:s("onboarding.successTitle")}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:s("onboarding.successMessage")}),e.jsx("div",{className:"mt-6",children:e.jsx(t.Loader2,{className:"w-6 h-6 mx-auto text-[var(--color-accent-500)] animate-spin"})})]})})})}):e.jsx("div",{className:"min-h-screen flex items-center justify-center bg-[var(--bg-primary)] p-4",children:e.jsxs("div",{className:"max-w-lg w-full",children:[e.jsxs("div",{className:"text-center mb-8",children:[e.jsx("div",{className:"flex items-center justify-center gap-2 mb-4",children:e.jsx("div",{className:"w-12 h-12 bg-gradient-to-br from-blue-500 to-purple-600 rounded-xl flex items-center justify-center",children:e.jsx("span",{className:"text-white text-xl font-bold",children:"S"})})}),e.jsx("h1",{className:"text-3xl font-bold mb-2",children:s("onboarding.title")}),e.jsx("p",{className:"text-[var(--text-secondary)]",children:s("onboarding.subtitle")})]}),e.jsx("div",{className:"flex justify-center mb-8",children:e.jsx("div",{className:"flex items-center gap-2",children:c.map((a,m)=>e.jsxs("div",{className:"flex items-center",children:[e.jsx("div",{className:`w-10 h-10 rounded-full flex items-center justify-center transition-all ${m<=d?"bg-[var(--color-accent-500)] text-white":"bg-[var(--bg-tertiary)] text-[var(--text-secondary)]"}`,children:a.icon}),m<c.length-1&&e.jsx("div",{className:`w-12 h-1 mx-1 rounded transition-all ${m<d?"bg-[var(--color-accent-500)]":"bg-[var(--bg-tertiary)]"}`})]},a.key))})}),e.jsxs("div",{className:"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]",children:[l==="language"&&e.jsxs("div",{children:[e.jsx("h2",{className:"text-xl font-semibold mb-6 text-center",children:s("onboarding.languageLabel")}),e.jsx("div",{className:"grid grid-cols-2 gap-4",children:N.map(a=>e.jsxs("button",{onClick:()=>k(a.code),className:`p-4 rounded-xl border-2 transition-all ${n===a.code?"border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20":"border-[var(--border-color)] hover:border-[var(--color-accent-300)]"}`,children:[e.jsx("span",{className:"text-3xl mb-2 block",children:a.flag}),e.jsx("span",{className:"font-medium",children:a.name})]},a.code))})]}),l==="theme"&&e.jsxs("div",{children:[e.jsx("h2",{className:"text-xl font-semibold mb-6 text-center",children:s("onboarding.themeLabel")}),e.jsx("div",{className:"grid grid-cols-3 gap-3 mb-8",children:b.map(a=>e.jsxs("button",{onClick:()=>w(a.value),className:`p-4 rounded-xl border-2 transition-all ${o===a.value?"border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20":"border-[var(--border-color)] hover:border-[var(--color-accent-300)]"}`,children:[e.jsx("span",{className:"text-2xl mb-2 block",children:a.icon}),e.jsx("span",{className:"text-sm font-medium",children:s(`onboarding.${a.labelKey}`)})]},a.value))}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-medium mb-3 text-[var(--text-secondary)]",children:s("onboarding.accentColorLabel")}),e.jsx("div",{className:"flex justify-center gap-3",children:u.map(a=>e.jsx("button",{onClick:()=>S(a.key),className:`w-10 h-10 rounded-full transition-all ${i===a.key?"ring-2 ring-offset-2 ring-[var(--color-accent-500)] ring-offset-[var(--bg-secondary)]":"hover:scale-110"}`,style:{backgroundColor:a.color},title:a.name},a.key))})]})]}),l==="complete"&&e.jsxs("div",{className:"text-center",children:[e.jsx("div",{className:"w-20 h-20 mx-auto bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 rounded-full flex items-center justify-center mb-6",children:e.jsx(t.Sparkles,{className:"w-10 h-10 text-[var(--color-accent-500)]"})}),e.jsx("h2",{className:"text-xl font-semibold mb-4",children:s("onboarding.stepComplete")}),e.jsxs("div",{className:"text-[var(--text-secondary)] mb-6 space-y-2",children:[e.jsx("p",{children:e.jsxs("span",{className:"inline-flex items-center gap-2",children:[e.jsx(t.Globe,{className:"w-4 h-4"}),N.find(a=>a.code===n)?.name]})}),e.jsx("p",{children:e.jsxs("span",{className:"inline-flex items-center gap-2",children:[e.jsx(t.Palette,{className:"w-4 h-4"}),b.find(a=>a.value===o)?.icon," ",s(`onboarding.${b.find(a=>a.value===o)?.labelKey}`)]})}),e.jsx("p",{children:e.jsxs("span",{className:"inline-flex items-center gap-2",children:[e.jsx("span",{className:"w-4 h-4 rounded-full",style:{backgroundColor:u.find(a=>a.key===i)?.color}}),u.find(a=>a.key===i)?.name]})})]}),j&&e.jsx("div",{className:"bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300 rounded-lg p-3 mb-4 text-sm",children:j})]}),e.jsxs("div",{className:"flex justify-between mt-8",children:[d>0?e.jsxs("button",{onClick:K,className:"flex items-center gap-2 px-4 py-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors",children:[e.jsx(t.ArrowLeft,{className:"w-4 h-4"}),s("onboarding.back")]}):e.jsx("div",{}),l==="complete"?e.jsx("button",{onClick:O,disabled:p,className:"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors disabled:opacity-50",children:p?e.jsxs(e.Fragment,{children:[e.jsx(t.Loader2,{className:"w-4 h-4 animate-spin"}),s("onboarding.completing")]}):e.jsxs(e.Fragment,{children:[s("onboarding.complete"),e.jsx(t.CheckCircle,{className:"w-4 h-4"})]})}):e.jsxs("button",{onClick:I,className:"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors",children:[s("onboarding.continue"),e.jsx(t.ArrowRight,{className:"w-4 h-4"})]})]})]})]})})}exports.OnboardingWizardPage=$;
2
+ //# sourceMappingURL=OnboardingWizardPage-C7vendrq.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"OnboardingWizardPage-BWMGYiu9.cjs","sources":["../src/pages/auth/OnboardingWizardPage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Loader2, CheckCircle, Globe, Palette, Sparkles, ArrowRight, ArrowLeft } from 'lucide-react';\r\nimport { api } from '@/services/api/apiClient';\r\nimport { changeLanguage } from '@/i18n/config';\r\n\r\ntype Step = 'language' | 'theme' | 'complete';\r\n\r\ninterface LanguageOption {\r\n code: string;\r\n name: string;\r\n flag: string;\r\n}\r\n\r\ninterface ThemeOption {\r\n value: string;\r\n labelKey: string;\r\n icon: string;\r\n}\r\n\r\nconst languages: LanguageOption[] = [\r\n { code: 'fr', name: 'Francais', flag: '🇫🇷' },\r\n { code: 'en', name: 'English', flag: '🇬🇧' },\r\n { code: 'de', name: 'Deutsch', flag: '🇩🇪' },\r\n { code: 'it', name: 'Italiano', flag: '🇮🇹' },\r\n];\r\n\r\nconst themes: ThemeOption[] = [\r\n { value: 'light', labelKey: 'themeLight', icon: '☀️' },\r\n { value: 'dark', labelKey: 'themeDark', icon: '🌙' },\r\n { value: 'system', labelKey: 'themeSystem', icon: '💻' },\r\n];\r\n\r\nconst accentColors = [\r\n { key: 'indigo', color: '#6366f1', name: 'Indigo' },\r\n { key: 'blue', color: '#3b82f6', name: 'Blue' },\r\n { key: 'emerald', color: '#10b981', name: 'Emerald' },\r\n { key: 'amber', color: '#f59e0b', name: 'Amber' },\r\n { key: 'rose', color: '#f43f5e', name: 'Rose' },\r\n { key: 'purple', color: '#a855f7', name: 'Purple' },\r\n];\r\n\r\nexport function OnboardingWizardPage() {\r\n const { t, i18n } = useTranslation('auth');\r\n const navigate = useNavigate();\r\n\r\n const [currentStep, setCurrentStep] = useState<Step>('language');\r\n const [selectedLanguage, setSelectedLanguage] = useState(i18n.language?.substring(0, 2) || 'fr');\r\n const [selectedTheme, setSelectedTheme] = useState('dark');\r\n const [selectedAccentColor, setSelectedAccentColor] = useState('indigo');\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n // Check onboarding status on load\r\n useEffect(() => {\r\n const checkOnboardingStatus = async () => {\r\n try {\r\n const response = await api.get<{ hasCompletedOnboarding: boolean }>('/api/onboarding/status');\r\n if (response.hasCompletedOnboarding) {\r\n // Already completed, redirect to home\r\n navigate('/myspace', { replace: true });\r\n }\r\n } catch {\r\n // If we can't check status, allow proceeding\r\n }\r\n };\r\n\r\n checkOnboardingStatus();\r\n }, [navigate]);\r\n\r\n // Update language immediately when selected (lazy loads translations if needed)\r\n useEffect(() => {\r\n if (selectedLanguage && selectedLanguage !== i18n.language?.substring(0, 2)) {\r\n changeLanguage(selectedLanguage);\r\n }\r\n }, [selectedLanguage, i18n]);\r\n\r\n const steps: { key: Step; labelKey: string; icon: React.ReactNode }[] = [\r\n { key: 'language', labelKey: 'stepLanguage', icon: <Globe className=\"w-5 h-5\" /> },\r\n { key: 'theme', labelKey: 'stepTheme', icon: <Palette className=\"w-5 h-5\" /> },\r\n { key: 'complete', labelKey: 'stepComplete', icon: <Sparkles className=\"w-5 h-5\" /> },\r\n ];\r\n\r\n const currentStepIndex = steps.findIndex((s) => s.key === currentStep);\r\n\r\n const handleNext = () => {\r\n const nextIndex = currentStepIndex + 1;\r\n if (nextIndex < steps.length) {\r\n setCurrentStep(steps[nextIndex].key);\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n const prevIndex = currentStepIndex - 1;\r\n if (prevIndex >= 0) {\r\n setCurrentStep(steps[prevIndex].key);\r\n }\r\n };\r\n\r\n const handleComplete = async () => {\r\n setIsSubmitting(true);\r\n setError(null);\r\n\r\n try {\r\n await api.post('/api/onboarding/complete', {\r\n language: selectedLanguage,\r\n theme: selectedTheme,\r\n accentColorKey: selectedAccentColor,\r\n });\r\n\r\n // Save preferences locally\r\n localStorage.setItem('i18nextLng', selectedLanguage);\r\n localStorage.setItem(\r\n 'smartstack-theme-config',\r\n JSON.stringify({\r\n mode: selectedTheme,\r\n accentColorKey: selectedAccentColor,\r\n borderRadius: {},\r\n itemPaletteKey: 'neutral',\r\n })\r\n );\r\n\r\n setSuccess(true);\r\n\r\n // Redirect after success animation\r\n setTimeout(() => {\r\n window.location.href = '/myspace';\r\n }, 2000);\r\n } catch (err) {\r\n console.error('Onboarding error:', err);\r\n setError(t('onboarding.errorMessage'));\r\n } finally {\r\n setIsSubmitting(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-[var(--bg-primary)]\">\r\n <div className=\"max-w-md w-full mx-4\">\r\n <div className=\"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]\">\r\n <div className=\"text-center\">\r\n <div className=\"w-20 h-20 mx-auto bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mb-6\">\r\n <CheckCircle className=\"w-12 h-12 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold mb-3\">{t('onboarding.successTitle')}</h2>\r\n <p className=\"text-[var(--text-secondary)]\">{t('onboarding.successMessage')}</p>\r\n <div className=\"mt-6\">\r\n <Loader2 className=\"w-6 h-6 mx-auto text-[var(--color-accent-500)] animate-spin\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-[var(--bg-primary)] p-4\">\r\n <div className=\"max-w-lg w-full\">\r\n {/* Header */}\r\n <div className=\"text-center mb-8\">\r\n <div className=\"flex items-center justify-center gap-2 mb-4\">\r\n <div className=\"w-12 h-12 bg-gradient-to-br from-blue-500 to-purple-600 rounded-xl flex items-center justify-center\">\r\n <span className=\"text-white text-xl font-bold\">S</span>\r\n </div>\r\n </div>\r\n <h1 className=\"text-3xl font-bold mb-2\">{t('onboarding.title')}</h1>\r\n <p className=\"text-[var(--text-secondary)]\">{t('onboarding.subtitle')}</p>\r\n </div>\r\n\r\n {/* Steps indicator */}\r\n <div className=\"flex justify-center mb-8\">\r\n <div className=\"flex items-center gap-2\">\r\n {steps.map((step, index) => (\r\n <div key={step.key} className=\"flex items-center\">\r\n <div\r\n className={`w-10 h-10 rounded-full flex items-center justify-center transition-all ${\r\n index <= currentStepIndex\r\n ? 'bg-[var(--color-accent-500)] text-white'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n {step.icon}\r\n </div>\r\n {index < steps.length - 1 && (\r\n <div\r\n className={`w-12 h-1 mx-1 rounded transition-all ${\r\n index < currentStepIndex\r\n ? 'bg-[var(--color-accent-500)]'\r\n : 'bg-[var(--bg-tertiary)]'\r\n }`}\r\n />\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Card */}\r\n <div className=\"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]\">\r\n {/* Language Step */}\r\n {currentStep === 'language' && (\r\n <div>\r\n <h2 className=\"text-xl font-semibold mb-6 text-center\">{t('onboarding.languageLabel')}</h2>\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n {languages.map((lang) => (\r\n <button\r\n key={lang.code}\r\n onClick={() => setSelectedLanguage(lang.code)}\r\n className={`p-4 rounded-xl border-2 transition-all ${\r\n selectedLanguage === lang.code\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n }`}\r\n >\r\n <span className=\"text-3xl mb-2 block\">{lang.flag}</span>\r\n <span className=\"font-medium\">{lang.name}</span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Theme Step */}\r\n {currentStep === 'theme' && (\r\n <div>\r\n <h2 className=\"text-xl font-semibold mb-6 text-center\">{t('onboarding.themeLabel')}</h2>\r\n\r\n {/* Theme selection */}\r\n <div className=\"grid grid-cols-3 gap-3 mb-8\">\r\n {themes.map((theme) => (\r\n <button\r\n key={theme.value}\r\n onClick={() => setSelectedTheme(theme.value)}\r\n className={`p-4 rounded-xl border-2 transition-all ${\r\n selectedTheme === theme.value\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n }`}\r\n >\r\n <span className=\"text-2xl mb-2 block\">{theme.icon}</span>\r\n <span className=\"text-sm font-medium\">{t(`onboarding.${theme.labelKey}`)}</span>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Accent color selection */}\r\n <div>\r\n <h3 className=\"text-sm font-medium mb-3 text-[var(--text-secondary)]\">\r\n {t('onboarding.accentColorLabel')}\r\n </h3>\r\n <div className=\"flex justify-center gap-3\">\r\n {accentColors.map((color) => (\r\n <button\r\n key={color.key}\r\n onClick={() => setSelectedAccentColor(color.key)}\r\n className={`w-10 h-10 rounded-full transition-all ${\r\n selectedAccentColor === color.key\r\n ? 'ring-2 ring-offset-2 ring-[var(--color-accent-500)] ring-offset-[var(--bg-secondary)]'\r\n : 'hover:scale-110'\r\n }`}\r\n style={{ backgroundColor: color.color }}\r\n title={color.name}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Complete Step */}\r\n {currentStep === 'complete' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-20 h-20 mx-auto bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 rounded-full flex items-center justify-center mb-6\">\r\n <Sparkles className=\"w-10 h-10 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold mb-4\">{t('onboarding.stepComplete')}</h2>\r\n <div className=\"text-[var(--text-secondary)] mb-6 space-y-2\">\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <Globe className=\"w-4 h-4\" />\r\n {languages.find((l) => l.code === selectedLanguage)?.name}\r\n </span>\r\n </p>\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <Palette className=\"w-4 h-4\" />\r\n {themes.find((t) => t.value === selectedTheme)?.icon}{' '}\r\n {t(`onboarding.${themes.find((th) => th.value === selectedTheme)?.labelKey}`)}\r\n </span>\r\n </p>\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <span\r\n className=\"w-4 h-4 rounded-full\"\r\n style={{ backgroundColor: accentColors.find((c) => c.key === selectedAccentColor)?.color }}\r\n />\r\n {accentColors.find((c) => c.key === selectedAccentColor)?.name}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300 rounded-lg p-3 mb-4 text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Navigation buttons */}\r\n <div className=\"flex justify-between mt-8\">\r\n {currentStepIndex > 0 ? (\r\n <button\r\n onClick={handleBack}\r\n className=\"flex items-center gap-2 px-4 py-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('onboarding.back')}\r\n </button>\r\n ) : (\r\n <div />\r\n )}\r\n\r\n {currentStep === 'complete' ? (\r\n <button\r\n onClick={handleComplete}\r\n disabled={isSubmitting}\r\n className=\"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {isSubmitting ? (\r\n <>\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {t('onboarding.completing')}\r\n </>\r\n ) : (\r\n <>\r\n {t('onboarding.complete')}\r\n <CheckCircle className=\"w-4 h-4\" />\r\n </>\r\n )}\r\n </button>\r\n ) : (\r\n <button\r\n onClick={handleNext}\r\n className=\"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors\"\r\n >\r\n {t('onboarding.continue')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["languages","themes","accentColors","OnboardingWizardPage","t","i18n","useTranslation","navigate","useNavigate","currentStep","setCurrentStep","useState","selectedLanguage","setSelectedLanguage","selectedTheme","setSelectedTheme","selectedAccentColor","setSelectedAccentColor","isSubmitting","setIsSubmitting","error","setError","success","setSuccess","useEffect","api","changeLanguage","steps","jsx","Globe","Palette","Sparkles","currentStepIndex","s","handleNext","nextIndex","handleBack","prevIndex","handleComplete","err","jsxs","CheckCircle","Loader2","step","index","lang","theme","color","l","th","c","ArrowLeft","Fragment","ArrowRight"],"mappings":"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"}
1
+ {"version":3,"file":"OnboardingWizardPage-C7vendrq.cjs","sources":["../src/pages/auth/OnboardingWizardPage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Loader2, CheckCircle, Globe, Palette, Sparkles, ArrowRight, ArrowLeft } from 'lucide-react';\r\nimport { api } from '@/services/api/apiClient';\r\nimport { changeLanguage } from '@/i18n/config';\r\n\r\ntype Step = 'language' | 'theme' | 'complete';\r\n\r\ninterface LanguageOption {\r\n code: string;\r\n name: string;\r\n flag: string;\r\n}\r\n\r\ninterface ThemeOption {\r\n value: string;\r\n labelKey: string;\r\n icon: string;\r\n}\r\n\r\nconst languages: LanguageOption[] = [\r\n { code: 'fr', name: 'Francais', flag: '🇫🇷' },\r\n { code: 'en', name: 'English', flag: '🇬🇧' },\r\n { code: 'de', name: 'Deutsch', flag: '🇩🇪' },\r\n { code: 'it', name: 'Italiano', flag: '🇮🇹' },\r\n];\r\n\r\nconst themes: ThemeOption[] = [\r\n { value: 'light', labelKey: 'themeLight', icon: '☀️' },\r\n { value: 'dark', labelKey: 'themeDark', icon: '🌙' },\r\n { value: 'system', labelKey: 'themeSystem', icon: '💻' },\r\n];\r\n\r\nconst accentColors = [\r\n { key: 'indigo', color: '#6366f1', name: 'Indigo' },\r\n { key: 'blue', color: '#3b82f6', name: 'Blue' },\r\n { key: 'emerald', color: '#10b981', name: 'Emerald' },\r\n { key: 'amber', color: '#f59e0b', name: 'Amber' },\r\n { key: 'rose', color: '#f43f5e', name: 'Rose' },\r\n { key: 'purple', color: '#a855f7', name: 'Purple' },\r\n];\r\n\r\nexport function OnboardingWizardPage() {\r\n const { t, i18n } = useTranslation('auth');\r\n const navigate = useNavigate();\r\n\r\n const [currentStep, setCurrentStep] = useState<Step>('language');\r\n const [selectedLanguage, setSelectedLanguage] = useState(i18n.language?.substring(0, 2) || 'fr');\r\n const [selectedTheme, setSelectedTheme] = useState('dark');\r\n const [selectedAccentColor, setSelectedAccentColor] = useState('indigo');\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [success, setSuccess] = useState(false);\r\n\r\n // Check onboarding status on load\r\n useEffect(() => {\r\n const checkOnboardingStatus = async () => {\r\n try {\r\n const response = await api.get<{ hasCompletedOnboarding: boolean }>('/api/onboarding/status');\r\n if (response.hasCompletedOnboarding) {\r\n // Already completed, redirect to home\r\n navigate('/myspace', { replace: true });\r\n }\r\n } catch {\r\n // If we can't check status, allow proceeding\r\n }\r\n };\r\n\r\n checkOnboardingStatus();\r\n }, [navigate]);\r\n\r\n // Update language immediately when selected (lazy loads translations if needed)\r\n useEffect(() => {\r\n if (selectedLanguage && selectedLanguage !== i18n.language?.substring(0, 2)) {\r\n changeLanguage(selectedLanguage);\r\n }\r\n }, [selectedLanguage, i18n]);\r\n\r\n const steps: { key: Step; labelKey: string; icon: React.ReactNode }[] = [\r\n { key: 'language', labelKey: 'stepLanguage', icon: <Globe className=\"w-5 h-5\" /> },\r\n { key: 'theme', labelKey: 'stepTheme', icon: <Palette className=\"w-5 h-5\" /> },\r\n { key: 'complete', labelKey: 'stepComplete', icon: <Sparkles className=\"w-5 h-5\" /> },\r\n ];\r\n\r\n const currentStepIndex = steps.findIndex((s) => s.key === currentStep);\r\n\r\n const handleNext = () => {\r\n const nextIndex = currentStepIndex + 1;\r\n if (nextIndex < steps.length) {\r\n setCurrentStep(steps[nextIndex].key);\r\n }\r\n };\r\n\r\n const handleBack = () => {\r\n const prevIndex = currentStepIndex - 1;\r\n if (prevIndex >= 0) {\r\n setCurrentStep(steps[prevIndex].key);\r\n }\r\n };\r\n\r\n const handleComplete = async () => {\r\n setIsSubmitting(true);\r\n setError(null);\r\n\r\n try {\r\n await api.post('/api/onboarding/complete', {\r\n language: selectedLanguage,\r\n theme: selectedTheme,\r\n accentColorKey: selectedAccentColor,\r\n });\r\n\r\n // Save preferences locally\r\n localStorage.setItem('i18nextLng', selectedLanguage);\r\n localStorage.setItem(\r\n 'smartstack-theme-config',\r\n JSON.stringify({\r\n mode: selectedTheme,\r\n accentColorKey: selectedAccentColor,\r\n borderRadius: {},\r\n itemPaletteKey: 'neutral',\r\n })\r\n );\r\n\r\n setSuccess(true);\r\n\r\n // Redirect after success animation\r\n setTimeout(() => {\r\n window.location.href = '/myspace';\r\n }, 2000);\r\n } catch (err) {\r\n console.error('Onboarding error:', err);\r\n setError(t('onboarding.errorMessage'));\r\n } finally {\r\n setIsSubmitting(false);\r\n }\r\n };\r\n\r\n if (success) {\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-[var(--bg-primary)]\">\r\n <div className=\"max-w-md w-full mx-4\">\r\n <div className=\"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]\">\r\n <div className=\"text-center\">\r\n <div className=\"w-20 h-20 mx-auto bg-green-100 dark:bg-green-900/30 rounded-full flex items-center justify-center mb-6\">\r\n <CheckCircle className=\"w-12 h-12 text-green-600 dark:text-green-400\" />\r\n </div>\r\n <h2 className=\"text-2xl font-bold mb-3\">{t('onboarding.successTitle')}</h2>\r\n <p className=\"text-[var(--text-secondary)]\">{t('onboarding.successMessage')}</p>\r\n <div className=\"mt-6\">\r\n <Loader2 className=\"w-6 h-6 mx-auto text-[var(--color-accent-500)] animate-spin\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"min-h-screen flex items-center justify-center bg-[var(--bg-primary)] p-4\">\r\n <div className=\"max-w-lg w-full\">\r\n {/* Header */}\r\n <div className=\"text-center mb-8\">\r\n <div className=\"flex items-center justify-center gap-2 mb-4\">\r\n <div className=\"w-12 h-12 bg-gradient-to-br from-blue-500 to-purple-600 rounded-xl flex items-center justify-center\">\r\n <span className=\"text-white text-xl font-bold\">S</span>\r\n </div>\r\n </div>\r\n <h1 className=\"text-3xl font-bold mb-2\">{t('onboarding.title')}</h1>\r\n <p className=\"text-[var(--text-secondary)]\">{t('onboarding.subtitle')}</p>\r\n </div>\r\n\r\n {/* Steps indicator */}\r\n <div className=\"flex justify-center mb-8\">\r\n <div className=\"flex items-center gap-2\">\r\n {steps.map((step, index) => (\r\n <div key={step.key} className=\"flex items-center\">\r\n <div\r\n className={`w-10 h-10 rounded-full flex items-center justify-center transition-all ${\r\n index <= currentStepIndex\r\n ? 'bg-[var(--color-accent-500)] text-white'\r\n : 'bg-[var(--bg-tertiary)] text-[var(--text-secondary)]'\r\n }`}\r\n >\r\n {step.icon}\r\n </div>\r\n {index < steps.length - 1 && (\r\n <div\r\n className={`w-12 h-1 mx-1 rounded transition-all ${\r\n index < currentStepIndex\r\n ? 'bg-[var(--color-accent-500)]'\r\n : 'bg-[var(--bg-tertiary)]'\r\n }`}\r\n />\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Card */}\r\n <div className=\"bg-[var(--bg-secondary)] rounded-2xl p-8 shadow-lg border border-[var(--border-color)]\">\r\n {/* Language Step */}\r\n {currentStep === 'language' && (\r\n <div>\r\n <h2 className=\"text-xl font-semibold mb-6 text-center\">{t('onboarding.languageLabel')}</h2>\r\n <div className=\"grid grid-cols-2 gap-4\">\r\n {languages.map((lang) => (\r\n <button\r\n key={lang.code}\r\n onClick={() => setSelectedLanguage(lang.code)}\r\n className={`p-4 rounded-xl border-2 transition-all ${\r\n selectedLanguage === lang.code\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n }`}\r\n >\r\n <span className=\"text-3xl mb-2 block\">{lang.flag}</span>\r\n <span className=\"font-medium\">{lang.name}</span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Theme Step */}\r\n {currentStep === 'theme' && (\r\n <div>\r\n <h2 className=\"text-xl font-semibold mb-6 text-center\">{t('onboarding.themeLabel')}</h2>\r\n\r\n {/* Theme selection */}\r\n <div className=\"grid grid-cols-3 gap-3 mb-8\">\r\n {themes.map((theme) => (\r\n <button\r\n key={theme.value}\r\n onClick={() => setSelectedTheme(theme.value)}\r\n className={`p-4 rounded-xl border-2 transition-all ${\r\n selectedTheme === theme.value\r\n ? 'border-[var(--color-accent-500)] bg-[var(--color-accent-50)] dark:bg-[var(--color-accent-900)]/20'\r\n : 'border-[var(--border-color)] hover:border-[var(--color-accent-300)]'\r\n }`}\r\n >\r\n <span className=\"text-2xl mb-2 block\">{theme.icon}</span>\r\n <span className=\"text-sm font-medium\">{t(`onboarding.${theme.labelKey}`)}</span>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Accent color selection */}\r\n <div>\r\n <h3 className=\"text-sm font-medium mb-3 text-[var(--text-secondary)]\">\r\n {t('onboarding.accentColorLabel')}\r\n </h3>\r\n <div className=\"flex justify-center gap-3\">\r\n {accentColors.map((color) => (\r\n <button\r\n key={color.key}\r\n onClick={() => setSelectedAccentColor(color.key)}\r\n className={`w-10 h-10 rounded-full transition-all ${\r\n selectedAccentColor === color.key\r\n ? 'ring-2 ring-offset-2 ring-[var(--color-accent-500)] ring-offset-[var(--bg-secondary)]'\r\n : 'hover:scale-110'\r\n }`}\r\n style={{ backgroundColor: color.color }}\r\n title={color.name}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Complete Step */}\r\n {currentStep === 'complete' && (\r\n <div className=\"text-center\">\r\n <div className=\"w-20 h-20 mx-auto bg-[var(--color-accent-100)] dark:bg-[var(--color-accent-900)]/30 rounded-full flex items-center justify-center mb-6\">\r\n <Sparkles className=\"w-10 h-10 text-[var(--color-accent-500)]\" />\r\n </div>\r\n <h2 className=\"text-xl font-semibold mb-4\">{t('onboarding.stepComplete')}</h2>\r\n <div className=\"text-[var(--text-secondary)] mb-6 space-y-2\">\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <Globe className=\"w-4 h-4\" />\r\n {languages.find((l) => l.code === selectedLanguage)?.name}\r\n </span>\r\n </p>\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <Palette className=\"w-4 h-4\" />\r\n {themes.find((t) => t.value === selectedTheme)?.icon}{' '}\r\n {t(`onboarding.${themes.find((th) => th.value === selectedTheme)?.labelKey}`)}\r\n </span>\r\n </p>\r\n <p>\r\n <span className=\"inline-flex items-center gap-2\">\r\n <span\r\n className=\"w-4 h-4 rounded-full\"\r\n style={{ backgroundColor: accentColors.find((c) => c.key === selectedAccentColor)?.color }}\r\n />\r\n {accentColors.find((c) => c.key === selectedAccentColor)?.name}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-300 rounded-lg p-3 mb-4 text-sm\">\r\n {error}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Navigation buttons */}\r\n <div className=\"flex justify-between mt-8\">\r\n {currentStepIndex > 0 ? (\r\n <button\r\n onClick={handleBack}\r\n className=\"flex items-center gap-2 px-4 py-2 text-[var(--text-secondary)] hover:text-[var(--text-primary)] transition-colors\"\r\n >\r\n <ArrowLeft className=\"w-4 h-4\" />\r\n {t('onboarding.back')}\r\n </button>\r\n ) : (\r\n <div />\r\n )}\r\n\r\n {currentStep === 'complete' ? (\r\n <button\r\n onClick={handleComplete}\r\n disabled={isSubmitting}\r\n className=\"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors disabled:opacity-50\"\r\n >\r\n {isSubmitting ? (\r\n <>\r\n <Loader2 className=\"w-4 h-4 animate-spin\" />\r\n {t('onboarding.completing')}\r\n </>\r\n ) : (\r\n <>\r\n {t('onboarding.complete')}\r\n <CheckCircle className=\"w-4 h-4\" />\r\n </>\r\n )}\r\n </button>\r\n ) : (\r\n <button\r\n onClick={handleNext}\r\n className=\"flex items-center gap-2 px-6 py-2 bg-[var(--color-accent-500)] hover:bg-[var(--color-accent-600)] text-white rounded-lg font-medium transition-colors\"\r\n >\r\n {t('onboarding.continue')}\r\n <ArrowRight className=\"w-4 h-4\" />\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n"],"names":["languages","themes","accentColors","OnboardingWizardPage","t","i18n","useTranslation","navigate","useNavigate","currentStep","setCurrentStep","useState","selectedLanguage","setSelectedLanguage","selectedTheme","setSelectedTheme","selectedAccentColor","setSelectedAccentColor","isSubmitting","setIsSubmitting","error","setError","success","setSuccess","useEffect","api","changeLanguage","steps","jsx","Globe","Palette","Sparkles","currentStepIndex","s","handleNext","nextIndex","handleBack","prevIndex","handleComplete","err","jsxs","CheckCircle","Loader2","step","index","lang","theme","color","l","th","c","ArrowLeft","Fragment","ArrowRight"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsxs as r, jsx as e, Fragment as C } from "react/jsx-runtime";
2
2
  import { useState as a } from "react";
3
3
  import { CheckCircle2 as V, AlertCircle as A, User as L, Mail as I, Lock as S, EyeOff as P, Eye as E, Loader2 as T } from "lucide-react";
4
4
  import { Link as D } from "react-router-dom";
5
- import { T as R, l as h, a as U, N as Z } from "./index-C2c3iEpN.js";
5
+ import { T as R, l as h, a as U, N as Z } from "./index-0Jhdcj59.js";
6
6
  function G() {
7
7
  const [i, p] = a(""), [o, b] = a(""), [d, f] = a(""), [c, x] = a(""), [m, y] = a(""), [u, j] = a(!1), [g, z] = a(!1), [l, v] = a(!1), [N, n] = a(null), [w, k] = a(null), F = () => !i || !o || !d || !c || !m ? (n("Tous les champs sont requis"), !1) : o !== d ? (n("Les mots de passe ne correspondent pas"), !1) : o.length < 8 ? (n("Le mot de passe doit contenir au moins 8 caractères"), !1) : !0, q = async (t) => {
8
8
  if (t.preventDefault(), n(null), k(null), !!F()) {
@@ -224,4 +224,4 @@ function G() {
224
224
  export {
225
225
  G as RegisterPage
226
226
  };
227
- //# sourceMappingURL=RegisterPage-DUGhJPnX.js.map
227
+ //# sourceMappingURL=RegisterPage-BzV0sCTe.js.map