@authagonal/login 0.1.97
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +348 -0
- package/dist/App.d.ts +1 -0
- package/dist/api.d.ts +35 -0
- package/dist/branding.d.ts +22 -0
- package/dist/branding.json +8 -0
- package/dist/components/AuthLayout.d.ts +7 -0
- package/dist/components/ui/alert.d.ts +9 -0
- package/dist/components/ui/button.d.ts +11 -0
- package/dist/components/ui/card.d.ts +8 -0
- package/dist/components/ui/input.d.ts +3 -0
- package/dist/components/ui/label.d.ts +3 -0
- package/dist/components/ui/separator.d.ts +6 -0
- package/dist/favicon.svg +1 -0
- package/dist/hooks/useDarkMode.d.ts +6 -0
- package/dist/i18n/index.d.ts +2 -0
- package/dist/icons.svg +24 -0
- package/dist/index.css +3 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +6332 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/main.d.ts +2 -0
- package/dist/pages/ConsentPage.d.ts +1 -0
- package/dist/pages/DevicePage.d.ts +1 -0
- package/dist/pages/ForgotPasswordPage.d.ts +1 -0
- package/dist/pages/GrantsPage.d.ts +1 -0
- package/dist/pages/LoginPage.d.ts +1 -0
- package/dist/pages/MfaChallengePage.d.ts +1 -0
- package/dist/pages/MfaSetupPage.d.ts +1 -0
- package/dist/pages/RegisterPage.d.ts +1 -0
- package/dist/pages/ResetPasswordPage.d.ts +1 -0
- package/dist/types.d.ts +91 -0
- package/index.html +13 -0
- package/package.json +65 -0
- package/public/branding.json +8 -0
- package/public/favicon.svg +1 -0
- package/public/icons.svg +24 -0
- package/src/App.tsx +32 -0
- package/src/api.ts +156 -0
- package/src/branding.ts +55 -0
- package/src/components/AuthLayout.tsx +107 -0
- package/src/components/ui/alert.tsx +31 -0
- package/src/components/ui/button.tsx +51 -0
- package/src/components/ui/card.tsx +50 -0
- package/src/components/ui/input.tsx +21 -0
- package/src/components/ui/label.tsx +17 -0
- package/src/components/ui/separator.tsx +16 -0
- package/src/hooks/useDarkMode.ts +39 -0
- package/src/i18n/de.json +111 -0
- package/src/i18n/en.json +136 -0
- package/src/i18n/es.json +111 -0
- package/src/i18n/fr.json +111 -0
- package/src/i18n/index.ts +39 -0
- package/src/i18n/pt.json +111 -0
- package/src/i18n/tlh.json +111 -0
- package/src/i18n/vi.json +111 -0
- package/src/i18n/zh-Hans.json +111 -0
- package/src/index.ts +44 -0
- package/src/lib/utils.ts +6 -0
- package/src/main.tsx +19 -0
- package/src/pages/ConsentPage.tsx +144 -0
- package/src/pages/DevicePage.tsx +145 -0
- package/src/pages/ForgotPasswordPage.tsx +90 -0
- package/src/pages/GrantsPage.tsx +87 -0
- package/src/pages/LoginPage.tsx +423 -0
- package/src/pages/MfaChallengePage.tsx +246 -0
- package/src/pages/MfaSetupPage.tsx +366 -0
- package/src/pages/RegisterPage.tsx +161 -0
- package/src/pages/ResetPasswordPage.tsx +219 -0
- package/src/styles.css +33 -0
- package/src/types.ts +112 -0
- package/tsconfig.app.json +37 -0
- package/tsconfig.json +7 -0
- package/vite.config.ts +54 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type HTMLAttributes, forwardRef } from 'react';
|
|
2
|
+
import { cva, type VariantProps } from 'class-variance-authority';
|
|
3
|
+
import { cn } from '@/lib/utils';
|
|
4
|
+
|
|
5
|
+
const alertVariants = cva(
|
|
6
|
+
'rounded-md border px-3 py-2.5 text-sm mb-4',
|
|
7
|
+
{
|
|
8
|
+
variants: {
|
|
9
|
+
variant: {
|
|
10
|
+
error: 'bg-red-50 text-red-800 border-red-200 dark:bg-red-950/40 dark:text-red-300 dark:border-red-900',
|
|
11
|
+
success: 'bg-green-50 text-green-800 border-green-200 dark:bg-green-950/40 dark:text-green-300 dark:border-green-900',
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
defaultVariants: {
|
|
15
|
+
variant: 'error',
|
|
16
|
+
},
|
|
17
|
+
}
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
export interface AlertProps
|
|
21
|
+
extends HTMLAttributes<HTMLDivElement>,
|
|
22
|
+
VariantProps<typeof alertVariants> {}
|
|
23
|
+
|
|
24
|
+
const Alert = forwardRef<HTMLDivElement, AlertProps>(
|
|
25
|
+
({ className, variant, ...props }, ref) => (
|
|
26
|
+
<div ref={ref} className={cn(alertVariants({ variant, className }))} {...props} />
|
|
27
|
+
)
|
|
28
|
+
);
|
|
29
|
+
Alert.displayName = 'Alert';
|
|
30
|
+
|
|
31
|
+
export { Alert, alertVariants };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type ButtonHTMLAttributes, forwardRef } from 'react';
|
|
2
|
+
import { cva, type VariantProps } from 'class-variance-authority';
|
|
3
|
+
import { cn } from '@/lib/utils';
|
|
4
|
+
import { Loader2 } from 'lucide-react';
|
|
5
|
+
|
|
6
|
+
const buttonVariants = cva(
|
|
7
|
+
'inline-flex w-full items-center justify-center gap-2 rounded-md text-base font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/30 disabled:pointer-events-none disabled:opacity-50 cursor-pointer',
|
|
8
|
+
{
|
|
9
|
+
variants: {
|
|
10
|
+
variant: {
|
|
11
|
+
default: 'bg-primary text-white hover:bg-primary/85',
|
|
12
|
+
secondary: 'border border-gray-300 bg-white text-gray-700 hover:bg-gray-50 hover:border-gray-400 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700 dark:hover:border-gray-600',
|
|
13
|
+
ghost: 'bg-transparent hover:bg-gray-100 text-gray-500 dark:hover:bg-gray-800 dark:text-gray-400',
|
|
14
|
+
link: 'bg-transparent text-primary underline-offset-4 hover:underline p-0 h-auto font-medium',
|
|
15
|
+
},
|
|
16
|
+
size: {
|
|
17
|
+
default: 'h-11 px-4 py-2.5',
|
|
18
|
+
sm: 'h-9 px-3 text-sm',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
defaultVariants: {
|
|
22
|
+
variant: 'default',
|
|
23
|
+
size: 'default',
|
|
24
|
+
},
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
export interface ButtonProps
|
|
29
|
+
extends ButtonHTMLAttributes<HTMLButtonElement>,
|
|
30
|
+
VariantProps<typeof buttonVariants> {
|
|
31
|
+
loading?: boolean;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const Button = forwardRef<HTMLButtonElement, ButtonProps>(
|
|
35
|
+
({ className, variant, size, loading, children, disabled, ...props }, ref) => {
|
|
36
|
+
return (
|
|
37
|
+
<button
|
|
38
|
+
className={cn(buttonVariants({ variant, size, className }))}
|
|
39
|
+
ref={ref}
|
|
40
|
+
disabled={disabled || loading}
|
|
41
|
+
{...props}
|
|
42
|
+
>
|
|
43
|
+
{loading && <Loader2 className="h-4 w-4 animate-spin" />}
|
|
44
|
+
{children}
|
|
45
|
+
</button>
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
Button.displayName = 'Button';
|
|
50
|
+
|
|
51
|
+
export { Button, buttonVariants };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type HTMLAttributes, forwardRef } from 'react';
|
|
2
|
+
import { cn } from '@/lib/utils';
|
|
3
|
+
|
|
4
|
+
const Card = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(
|
|
5
|
+
({ className, ...props }, ref) => (
|
|
6
|
+
<div
|
|
7
|
+
ref={ref}
|
|
8
|
+
className={cn('w-full max-w-[420px] rounded-lg shadow-sm border border-gray-100 dark:border-gray-800 p-8', className)}
|
|
9
|
+
{...props}
|
|
10
|
+
/>
|
|
11
|
+
)
|
|
12
|
+
);
|
|
13
|
+
Card.displayName = 'Card';
|
|
14
|
+
|
|
15
|
+
const CardHeader = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(
|
|
16
|
+
({ className, ...props }, ref) => (
|
|
17
|
+
<div ref={ref} className={cn('text-center mb-6', className)} {...props} />
|
|
18
|
+
)
|
|
19
|
+
);
|
|
20
|
+
CardHeader.displayName = 'CardHeader';
|
|
21
|
+
|
|
22
|
+
const CardTitle = forwardRef<HTMLHeadingElement, HTMLAttributes<HTMLHeadingElement>>(
|
|
23
|
+
({ className, ...props }, ref) => (
|
|
24
|
+
<h2 ref={ref} className={cn('text-xl font-semibold text-gray-900 dark:text-gray-100 mb-2', className)} {...props} />
|
|
25
|
+
)
|
|
26
|
+
);
|
|
27
|
+
CardTitle.displayName = 'CardTitle';
|
|
28
|
+
|
|
29
|
+
const CardDescription = forwardRef<HTMLParagraphElement, HTMLAttributes<HTMLParagraphElement>>(
|
|
30
|
+
({ className, ...props }, ref) => (
|
|
31
|
+
<p ref={ref} className={cn('text-sm text-gray-500 dark:text-gray-400', className)} {...props} />
|
|
32
|
+
)
|
|
33
|
+
);
|
|
34
|
+
CardDescription.displayName = 'CardDescription';
|
|
35
|
+
|
|
36
|
+
const CardContent = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(
|
|
37
|
+
({ className, ...props }, ref) => (
|
|
38
|
+
<div ref={ref} className={cn('', className)} {...props} />
|
|
39
|
+
)
|
|
40
|
+
);
|
|
41
|
+
CardContent.displayName = 'CardContent';
|
|
42
|
+
|
|
43
|
+
const CardFooter = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(
|
|
44
|
+
({ className, ...props }, ref) => (
|
|
45
|
+
<div ref={ref} className={cn('mt-4 text-center', className)} {...props} />
|
|
46
|
+
)
|
|
47
|
+
);
|
|
48
|
+
CardFooter.displayName = 'CardFooter';
|
|
49
|
+
|
|
50
|
+
export { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type InputHTMLAttributes, forwardRef } from 'react';
|
|
2
|
+
import { cn } from '@/lib/utils';
|
|
3
|
+
|
|
4
|
+
const Input = forwardRef<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>>(
|
|
5
|
+
({ className, type, ...props }, ref) => {
|
|
6
|
+
return (
|
|
7
|
+
<input
|
|
8
|
+
type={type}
|
|
9
|
+
className={cn(
|
|
10
|
+
'flex h-11 w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-base text-gray-900 placeholder:text-gray-400 transition-colors focus-visible:outline-none focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary/15 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:placeholder:text-gray-500',
|
|
11
|
+
className
|
|
12
|
+
)}
|
|
13
|
+
ref={ref}
|
|
14
|
+
{...props}
|
|
15
|
+
/>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
);
|
|
19
|
+
Input.displayName = 'Input';
|
|
20
|
+
|
|
21
|
+
export { Input };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type LabelHTMLAttributes, forwardRef } from 'react';
|
|
2
|
+
import { cn } from '@/lib/utils';
|
|
3
|
+
|
|
4
|
+
const Label = forwardRef<HTMLLabelElement, LabelHTMLAttributes<HTMLLabelElement>>(
|
|
5
|
+
({ className, ...props }, ref) => {
|
|
6
|
+
return (
|
|
7
|
+
<label
|
|
8
|
+
ref={ref}
|
|
9
|
+
className={cn('block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1.5', className)}
|
|
10
|
+
{...props}
|
|
11
|
+
/>
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
);
|
|
15
|
+
Label.displayName = 'Label';
|
|
16
|
+
|
|
17
|
+
export { Label };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { cn } from '@/lib/utils';
|
|
2
|
+
|
|
3
|
+
interface SeparatorProps {
|
|
4
|
+
label?: string;
|
|
5
|
+
className?: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function Separator({ label, className }: SeparatorProps) {
|
|
9
|
+
return (
|
|
10
|
+
<div className={cn('flex items-center gap-3 my-4 text-gray-400 dark:text-gray-500 text-[13px]', className)}>
|
|
11
|
+
<div className="flex-1 h-px bg-gray-200 dark:bg-gray-800" />
|
|
12
|
+
{label && <span>{label}</span>}
|
|
13
|
+
<div className="flex-1 h-px bg-gray-200 dark:bg-gray-800" />
|
|
14
|
+
</div>
|
|
15
|
+
);
|
|
16
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
type Theme = 'light' | 'dark' | 'system';
|
|
4
|
+
|
|
5
|
+
const STORAGE_KEY = 'auth-theme';
|
|
6
|
+
|
|
7
|
+
function getSystemPreference(): boolean {
|
|
8
|
+
return window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function applyTheme(theme: Theme) {
|
|
12
|
+
const isDark = theme === 'dark' || (theme === 'system' && getSystemPreference());
|
|
13
|
+
document.documentElement.classList.toggle('dark', isDark);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function useDarkMode() {
|
|
17
|
+
const [theme, setThemeState] = useState<Theme>(() => {
|
|
18
|
+
const stored = localStorage.getItem(STORAGE_KEY) as Theme | null;
|
|
19
|
+
return stored ?? 'system';
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
applyTheme(theme);
|
|
24
|
+
|
|
25
|
+
if (theme === 'system') {
|
|
26
|
+
const mq = window.matchMedia('(prefers-color-scheme: dark)');
|
|
27
|
+
const handler = () => applyTheme('system');
|
|
28
|
+
mq.addEventListener('change', handler);
|
|
29
|
+
return () => mq.removeEventListener('change', handler);
|
|
30
|
+
}
|
|
31
|
+
}, [theme]);
|
|
32
|
+
|
|
33
|
+
const setTheme = (t: Theme) => {
|
|
34
|
+
localStorage.setItem(STORAGE_KEY, t);
|
|
35
|
+
setThemeState(t);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
return { theme, setTheme };
|
|
39
|
+
}
|
package/src/i18n/de.json
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
{
|
|
2
|
+
"signIn": "Anmelden",
|
|
3
|
+
"email": "E-Mail",
|
|
4
|
+
"password": "Passwort",
|
|
5
|
+
"emailPlaceholder": "you@example.com",
|
|
6
|
+
"passwordPlaceholder": "Passwort eingeben",
|
|
7
|
+
"signingIn": "Anmeldung läuft...",
|
|
8
|
+
"forgotPassword": "Passwort vergessen?",
|
|
9
|
+
"ssoChecking": "Anmeldeoptionen werden überprüft...",
|
|
10
|
+
"ssoNotice": "Ihre Organisation verwendet Single Sign-On",
|
|
11
|
+
"continueWithSso": "Weiter mit SSO",
|
|
12
|
+
"errorInvalidCredentials": "Ungültige E-Mail-Adresse oder ungültiges Passwort",
|
|
13
|
+
"errorLockedOut": "Konto gesperrt. Versuchen Sie es in {{seconds}} Sekunden erneut",
|
|
14
|
+
"errorEmailNotConfirmed": "Bitte überprüfen Sie Ihre E-Mail, um Ihr Konto zu bestätigen",
|
|
15
|
+
"errorSsoRequired": "Für dieses Konto ist Single Sign-On erforderlich",
|
|
16
|
+
"errorEmailRequired": "E-Mail ist erforderlich",
|
|
17
|
+
"errorPasswordRequired": "Passwort ist erforderlich",
|
|
18
|
+
"errorUnexpected": "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es erneut.",
|
|
19
|
+
"resetYourPassword": "Passwort zurücksetzen",
|
|
20
|
+
"resetSubtitle": "Geben Sie Ihre E-Mail-Adresse ein und wir senden Ihnen einen Link zum Zurücksetzen Ihres Passworts.",
|
|
21
|
+
"sending": "Wird gesendet...",
|
|
22
|
+
"sendResetLink": "Link zum Zurücksetzen senden",
|
|
23
|
+
"backToSignIn": "Zurück zur Anmeldung",
|
|
24
|
+
"checkYourEmail": "Überprüfen Sie Ihre E-Mail",
|
|
25
|
+
"resetEmailSent": "Falls ein Konto mit dieser E-Mail-Adresse existiert, erhalten Sie in Kürze einen Link zum Zurücksetzen.",
|
|
26
|
+
"setNewPassword": "Neues Passwort festlegen",
|
|
27
|
+
"newPassword": "Neues Passwort",
|
|
28
|
+
"newPasswordPlaceholder": "Neues Passwort eingeben",
|
|
29
|
+
"confirmPassword": "Passwort bestätigen",
|
|
30
|
+
"confirmPasswordPlaceholder": "Neues Passwort bestätigen",
|
|
31
|
+
"resetting": "Wird zurückgesetzt...",
|
|
32
|
+
"resetPassword": "Passwort zurücksetzen",
|
|
33
|
+
"passwordResetSuccess": "Passwort erfolgreich zurückgesetzt",
|
|
34
|
+
"passwordResetSuccessMessage": "Ihr Passwort wurde zurückgesetzt. Sie können sich jetzt mit Ihrem neuen Passwort anmelden.",
|
|
35
|
+
"invalidLink": "Ungültiger Link",
|
|
36
|
+
"invalidOrExpiredLink": "Dieser Link zum Zurücksetzen ist ungültig oder abgelaufen.",
|
|
37
|
+
"requestNewResetLink": "Neuen Link zum Zurücksetzen anfordern",
|
|
38
|
+
"passwordNotMeetRequirements": "Passwort erfüllt nicht die Anforderungen",
|
|
39
|
+
"passwordsDoNotMatch": "Passwörter stimmen nicht überein",
|
|
40
|
+
"passwordWeakError": "Passwort erfüllt nicht die Stärkeanforderungen",
|
|
41
|
+
"signInTitle": "Anmelden — {{appName}}",
|
|
42
|
+
"ruleMinLength": "Mindestens {{count}} Zeichen",
|
|
43
|
+
"ruleUppercase": "Großbuchstabe",
|
|
44
|
+
"ruleLowercase": "Kleinbuchstabe",
|
|
45
|
+
"ruleDigit": "Zahl",
|
|
46
|
+
"ruleSpecialChar": "Sonderzeichen",
|
|
47
|
+
"continueWith": "Weiter mit {{provider}}",
|
|
48
|
+
"or": "oder",
|
|
49
|
+
"signedInAs": "Angemeldet als {{name}}",
|
|
50
|
+
"signedInMessage": "Sie sind bereits authentifiziert.",
|
|
51
|
+
"welcomeTitle": "Willkommen bei {{appName}}",
|
|
52
|
+
"welcomeSubtitle": "Melden Sie sich an, um auf Ihr Konto zuzugreifen",
|
|
53
|
+
"signOut": "Abmelden",
|
|
54
|
+
"mfaTitle": "Zwei-Faktor-Authentifizierung",
|
|
55
|
+
"mfaSubtitle": "Geben Sie den Bestätigungscode ein, um fortzufahren",
|
|
56
|
+
"mfaMethodTotp": "Authentifikator",
|
|
57
|
+
"mfaMethodRecovery": "Wiederherstellungscode",
|
|
58
|
+
"mfaTotpLabel": "6-stelliger Code",
|
|
59
|
+
"mfaRecoveryLabel": "Wiederherstellungscode",
|
|
60
|
+
"mfaVerify": "Bestätigen",
|
|
61
|
+
"mfaVerifying": "Wird überprüft...",
|
|
62
|
+
"mfaInvalidCode": "Ungültiger Code. Bitte versuchen Sie es erneut.",
|
|
63
|
+
"mfaChallengeExpired": "Überprüfungssitzung abgelaufen. Bitte melden Sie sich erneut an.",
|
|
64
|
+
"mfaSetupTitle": "Multi-Faktor-Authentifizierung",
|
|
65
|
+
"mfaStatusEnabled": "MFA ist für Ihr Konto aktiviert.",
|
|
66
|
+
"mfaStatusDisabled": "MFA ist noch nicht eingerichtet.",
|
|
67
|
+
"mfaEnrolledMethods": "Registrierte Methoden",
|
|
68
|
+
"mfaAddedOn": "Hinzugefügt am {{date}}",
|
|
69
|
+
"mfaRemove": "Entfernen",
|
|
70
|
+
"mfaSetupTotp": "Authentifikator-App einrichten",
|
|
71
|
+
"mfaScanQrCode": "Scannen Sie diesen QR-Code mit Ihrer Authentifikator-App",
|
|
72
|
+
"mfaEnterCode": "Geben Sie den Code aus Ihrer App ein",
|
|
73
|
+
"mfaConfirm": "Bestätigen",
|
|
74
|
+
"mfaTotpAlreadyEnrolled": "Eine Authentifikator-App ist bereits registriert.",
|
|
75
|
+
"mfaGenerateRecoveryCodes": "Wiederherstellungscodes generieren",
|
|
76
|
+
"mfaRegenerateRecoveryCodes": "Wiederherstellungscodes neu generieren",
|
|
77
|
+
"mfaRecoveryCodesTitle": "Wiederherstellungscodes",
|
|
78
|
+
"mfaRecoveryCodesWarning": "Bewahren Sie diese Codes an einem sicheren Ort auf. Jeder Code kann nur einmal verwendet werden.",
|
|
79
|
+
"mfaRecoveryRequiresPrimary": "Richten Sie zuerst eine Authentifikator-App ein.",
|
|
80
|
+
"mfaMethodWebAuthn": "Passkey",
|
|
81
|
+
"mfaUsePasskey": "Passkey verwenden",
|
|
82
|
+
"mfaSetupPasskey": "Passkey einrichten",
|
|
83
|
+
"mfaWebAuthnCancelled": "Passkey-Authentifizierung wurde abgebrochen.",
|
|
84
|
+
"mfaManualKeyLabel": "Oder diesen Schlüssel manuell eingeben:",
|
|
85
|
+
"mfaCopyKey": "Zum Kopieren klicken",
|
|
86
|
+
"mfaSkipSetup": "Jetzt überspringen",
|
|
87
|
+
"mfaBackToApp": "Zurück zur Anwendung",
|
|
88
|
+
"mfaDone": "Fertig",
|
|
89
|
+
"mfaLoading": "Wird geladen...",
|
|
90
|
+
"mfaPromptTitle": "Konto absichern",
|
|
91
|
+
"mfaPromptMessage": "Fügen Sie die Multi-Faktor-Authentifizierung hinzu, um Ihr Konto mit einer zusätzlichen Sicherheitsebene zu schützen.",
|
|
92
|
+
"mfaPromptSetup": "MFA einrichten",
|
|
93
|
+
"mfaPromptSkip": "Nicht jetzt",
|
|
94
|
+
"noAccount": "Noch kein Konto?",
|
|
95
|
+
"createAccount": "Konto erstellen",
|
|
96
|
+
"continue": "Weiter",
|
|
97
|
+
"orSignInWith": "Oder anmelden mit {{provider}}",
|
|
98
|
+
"registerTitle": "Konto erstellen",
|
|
99
|
+
"firstName": "Vorname",
|
|
100
|
+
"firstNamePlaceholder": "Max",
|
|
101
|
+
"lastName": "Nachname",
|
|
102
|
+
"lastNamePlaceholder": "Mustermann",
|
|
103
|
+
"registering": "Konto wird erstellt...",
|
|
104
|
+
"registerButton": "Konto erstellen",
|
|
105
|
+
"alreadyHaveAccount": "Bereits ein Konto?",
|
|
106
|
+
"registrationSuccess": "Registrierung erfolgreich! Bitte überprüfen Sie Ihre E-Mail, um Ihr Konto zu bestätigen, und melden Sie sich dann an.",
|
|
107
|
+
"errorEmailAlreadyRegistered": "Ein Konto mit dieser E-Mail-Adresse existiert bereits.",
|
|
108
|
+
"errorWeakPassword": "Das Passwort erfüllt nicht die Anforderungen.",
|
|
109
|
+
"errorEmailAndPasswordRequired": "E-Mail und Passwort sind erforderlich.",
|
|
110
|
+
"errorRegistrationFailed": "Registrierung fehlgeschlagen. Bitte versuchen Sie es erneut."
|
|
111
|
+
}
|
package/src/i18n/en.json
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
{
|
|
2
|
+
"signIn": "Sign in",
|
|
3
|
+
"email": "Email",
|
|
4
|
+
"password": "Password",
|
|
5
|
+
"emailPlaceholder": "you@example.com",
|
|
6
|
+
"passwordPlaceholder": "Enter your password",
|
|
7
|
+
"signingIn": "Signing in...",
|
|
8
|
+
"forgotPassword": "Forgot password?",
|
|
9
|
+
"ssoChecking": "Checking sign-in options...",
|
|
10
|
+
"ssoNotice": "Your organization uses single sign-on",
|
|
11
|
+
"continueWithSso": "Continue with SSO",
|
|
12
|
+
"errorInvalidCredentials": "Invalid email or password",
|
|
13
|
+
"errorLockedOut": "Account locked. Try again in {{seconds}} seconds",
|
|
14
|
+
"errorEmailNotConfirmed": "Please check your email to verify your account",
|
|
15
|
+
"errorSsoRequired": "Single sign-on is required for this account",
|
|
16
|
+
"errorEmailRequired": "Email is required",
|
|
17
|
+
"errorPasswordRequired": "Password is required",
|
|
18
|
+
"errorUnexpected": "An unexpected error occurred. Please try again.",
|
|
19
|
+
"resetYourPassword": "Reset your password",
|
|
20
|
+
"resetSubtitle": "Enter your email address and we'll send you a link to reset your password.",
|
|
21
|
+
"sending": "Sending...",
|
|
22
|
+
"sendResetLink": "Send reset link",
|
|
23
|
+
"backToSignIn": "Back to sign in",
|
|
24
|
+
"checkYourEmail": "Check your email",
|
|
25
|
+
"resetEmailSent": "If an account exists with that email, you'll receive a reset link shortly.",
|
|
26
|
+
"setNewPassword": "Set new password",
|
|
27
|
+
"newPassword": "New password",
|
|
28
|
+
"newPasswordPlaceholder": "Enter new password",
|
|
29
|
+
"confirmPassword": "Confirm password",
|
|
30
|
+
"confirmPasswordPlaceholder": "Confirm new password",
|
|
31
|
+
"resetting": "Resetting...",
|
|
32
|
+
"resetPassword": "Reset password",
|
|
33
|
+
"passwordResetSuccess": "Password reset successfully",
|
|
34
|
+
"passwordResetSuccessMessage": "Your password has been reset. You can now sign in with your new password.",
|
|
35
|
+
"invalidLink": "Invalid link",
|
|
36
|
+
"invalidOrExpiredLink": "This reset link is invalid or has expired.",
|
|
37
|
+
"requestNewResetLink": "Request a new reset link",
|
|
38
|
+
"passwordNotMeetRequirements": "Password does not meet the requirements",
|
|
39
|
+
"passwordsDoNotMatch": "Passwords do not match",
|
|
40
|
+
"passwordWeakError": "Password does not meet strength requirements",
|
|
41
|
+
"signInTitle": "Sign In — {{appName}}",
|
|
42
|
+
"ruleMinLength": "At least {{count}} characters",
|
|
43
|
+
"ruleUppercase": "Uppercase letter",
|
|
44
|
+
"ruleLowercase": "Lowercase letter",
|
|
45
|
+
"ruleDigit": "Number",
|
|
46
|
+
"ruleSpecialChar": "Special character",
|
|
47
|
+
"continueWith": "Continue with {{provider}}",
|
|
48
|
+
"or": "or",
|
|
49
|
+
"signedInAs": "Signed in as {{name}}",
|
|
50
|
+
"signedInMessage": "You are already authenticated.",
|
|
51
|
+
"welcomeTitle": "Welcome to {{appName}}",
|
|
52
|
+
"welcomeSubtitle": "Sign in to access your account",
|
|
53
|
+
"signOut": "Sign out",
|
|
54
|
+
"mfaTitle": "Two-factor authentication",
|
|
55
|
+
"mfaSubtitle": "Enter the verification code to continue",
|
|
56
|
+
"mfaMethodTotp": "Authenticator",
|
|
57
|
+
"mfaMethodRecovery": "Recovery code",
|
|
58
|
+
"mfaTotpLabel": "6-digit code",
|
|
59
|
+
"mfaRecoveryLabel": "Recovery code",
|
|
60
|
+
"mfaVerify": "Verify",
|
|
61
|
+
"mfaVerifying": "Verifying...",
|
|
62
|
+
"mfaInvalidCode": "Invalid code. Please try again.",
|
|
63
|
+
"mfaChallengeExpired": "Verification session expired. Please log in again.",
|
|
64
|
+
"mfaSetupTitle": "Multi-factor authentication",
|
|
65
|
+
"mfaStatusEnabled": "MFA is enabled on your account.",
|
|
66
|
+
"mfaStatusDisabled": "MFA is not yet set up.",
|
|
67
|
+
"mfaEnrolledMethods": "Enrolled methods",
|
|
68
|
+
"mfaAddedOn": "Added {{date}}",
|
|
69
|
+
"mfaRemove": "Remove",
|
|
70
|
+
"mfaSetupTotp": "Set up authenticator app",
|
|
71
|
+
"mfaScanQrCode": "Scan this QR code with your authenticator app",
|
|
72
|
+
"mfaEnterCode": "Enter the code from your app",
|
|
73
|
+
"mfaConfirm": "Confirm",
|
|
74
|
+
"mfaTotpAlreadyEnrolled": "An authenticator app is already enrolled.",
|
|
75
|
+
"mfaGenerateRecoveryCodes": "Generate recovery codes",
|
|
76
|
+
"mfaRegenerateRecoveryCodes": "Regenerate recovery codes",
|
|
77
|
+
"mfaRecoveryCodesTitle": "Recovery codes",
|
|
78
|
+
"mfaRecoveryCodesWarning": "Save these codes in a safe place. Each code can only be used once.",
|
|
79
|
+
"mfaRecoveryRequiresPrimary": "Set up an authenticator app first.",
|
|
80
|
+
"mfaMethodWebAuthn": "Passkey",
|
|
81
|
+
"mfaUsePasskey": "Use passkey",
|
|
82
|
+
"mfaSetupPasskey": "Set up passkey",
|
|
83
|
+
"mfaWebAuthnCancelled": "Passkey authentication was cancelled.",
|
|
84
|
+
"mfaManualKeyLabel": "Or enter this key manually:",
|
|
85
|
+
"mfaCopyKey": "Click to copy",
|
|
86
|
+
"mfaSkipSetup": "Skip for now",
|
|
87
|
+
"mfaBackToApp": "Back to application",
|
|
88
|
+
"mfaDone": "Done",
|
|
89
|
+
"mfaLoading": "Loading...",
|
|
90
|
+
"mfaPromptTitle": "Secure your account",
|
|
91
|
+
"mfaPromptMessage": "Add multi-factor authentication to protect your account with an extra layer of security.",
|
|
92
|
+
"mfaPromptSetup": "Set up MFA",
|
|
93
|
+
"mfaPromptSkip": "Not now",
|
|
94
|
+
"noAccount": "Don't have an account?",
|
|
95
|
+
"createAccount": "Create one",
|
|
96
|
+
"continue": "Continue",
|
|
97
|
+
"orSignInWith": "Or sign in with {{provider}}",
|
|
98
|
+
"registerTitle": "Create account",
|
|
99
|
+
"firstName": "First name",
|
|
100
|
+
"firstNamePlaceholder": "Jane",
|
|
101
|
+
"lastName": "Last name",
|
|
102
|
+
"lastNamePlaceholder": "Doe",
|
|
103
|
+
"registering": "Creating account...",
|
|
104
|
+
"registerButton": "Create account",
|
|
105
|
+
"alreadyHaveAccount": "Already have an account?",
|
|
106
|
+
"registrationSuccess": "Registration successful! Please check your email to verify your account, then sign in.",
|
|
107
|
+
"errorEmailAlreadyRegistered": "An account with this email already exists.",
|
|
108
|
+
"errorWeakPassword": "Password does not meet strength requirements.",
|
|
109
|
+
"errorEmailAndPasswordRequired": "Email and password are required.",
|
|
110
|
+
"errorRegistrationFailed": "Registration failed. Please try again.",
|
|
111
|
+
|
|
112
|
+
"consent.title": "Authorize {{appName}}",
|
|
113
|
+
"consent.subtitle": "{{appName}} wants to access your account",
|
|
114
|
+
"consent.scopeOpenid": "Verify your identity",
|
|
115
|
+
"consent.scopeProfile": "View your name and profile picture",
|
|
116
|
+
"consent.scopeEmail": "View your email address",
|
|
117
|
+
"consent.scopeOfflineAccess": "Stay signed in on your behalf",
|
|
118
|
+
"consent.scopeAddress": "View your address",
|
|
119
|
+
"consent.scopePhone": "View your phone number",
|
|
120
|
+
"consent.allow": "Allow",
|
|
121
|
+
"consent.deny": "Deny",
|
|
122
|
+
"consent.hint": "You can manage authorized apps from the Authorized Apps page.",
|
|
123
|
+
"consent.loading": "Loading...",
|
|
124
|
+
"consent.loadError": "Failed to load application details.",
|
|
125
|
+
"consent.submitError": "Something went wrong. Please try again.",
|
|
126
|
+
|
|
127
|
+
"grants.title": "Authorized Apps",
|
|
128
|
+
"grants.subtitle": "Apps you've granted access to your account.",
|
|
129
|
+
"grants.loading": "Loading...",
|
|
130
|
+
"grants.loadError": "Failed to load authorized apps.",
|
|
131
|
+
"grants.noGrants": "No apps have been authorized yet.",
|
|
132
|
+
"grants.grantedOn": "Authorized on {{date}}",
|
|
133
|
+
"grants.revoke": "Revoke",
|
|
134
|
+
"grants.revokeConfirm": "Revoke access for this app? You'll need to re-authorize next time.",
|
|
135
|
+
"grants.revokeFailed": "Failed to revoke access."
|
|
136
|
+
}
|
package/src/i18n/es.json
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
{
|
|
2
|
+
"signIn": "Iniciar sesión",
|
|
3
|
+
"email": "Correo electrónico",
|
|
4
|
+
"password": "Contraseña",
|
|
5
|
+
"emailPlaceholder": "you@example.com",
|
|
6
|
+
"passwordPlaceholder": "Ingrese su contraseña",
|
|
7
|
+
"signingIn": "Iniciando sesión...",
|
|
8
|
+
"forgotPassword": "¿Olvidaste tu contraseña?",
|
|
9
|
+
"ssoChecking": "Verificando opciones de inicio de sesión...",
|
|
10
|
+
"ssoNotice": "Su organización utiliza inicio de sesión único",
|
|
11
|
+
"continueWithSso": "Continuar con SSO",
|
|
12
|
+
"errorInvalidCredentials": "Correo electrónico o contraseña no válidos",
|
|
13
|
+
"errorLockedOut": "Cuenta bloqueada. Inténtelo de nuevo en {{seconds}} segundos",
|
|
14
|
+
"errorEmailNotConfirmed": "Revise su correo electrónico para verificar su cuenta",
|
|
15
|
+
"errorSsoRequired": "Se requiere inicio de sesión único para esta cuenta",
|
|
16
|
+
"errorEmailRequired": "El correo electrónico es obligatorio",
|
|
17
|
+
"errorPasswordRequired": "La contraseña es obligatoria",
|
|
18
|
+
"errorUnexpected": "Se produjo un error inesperado. Por favor, inténtelo de nuevo.",
|
|
19
|
+
"resetYourPassword": "Restablecer su contraseña",
|
|
20
|
+
"resetSubtitle": "Ingrese su dirección de correo electrónico y le enviaremos un enlace para restablecer su contraseña.",
|
|
21
|
+
"sending": "Enviando...",
|
|
22
|
+
"sendResetLink": "Enviar enlace de restablecimiento",
|
|
23
|
+
"backToSignIn": "Volver al inicio de sesión",
|
|
24
|
+
"checkYourEmail": "Revise su correo electrónico",
|
|
25
|
+
"resetEmailSent": "Si existe una cuenta con ese correo electrónico, recibirá un enlace de restablecimiento en breve.",
|
|
26
|
+
"setNewPassword": "Establecer nueva contraseña",
|
|
27
|
+
"newPassword": "Nueva contraseña",
|
|
28
|
+
"newPasswordPlaceholder": "Ingrese la nueva contraseña",
|
|
29
|
+
"confirmPassword": "Confirmar contraseña",
|
|
30
|
+
"confirmPasswordPlaceholder": "Confirme la nueva contraseña",
|
|
31
|
+
"resetting": "Restableciendo...",
|
|
32
|
+
"resetPassword": "Restablecer contraseña",
|
|
33
|
+
"passwordResetSuccess": "Contraseña restablecida exitosamente",
|
|
34
|
+
"passwordResetSuccessMessage": "Su contraseña ha sido restablecida. Ahora puede iniciar sesión con su nueva contraseña.",
|
|
35
|
+
"invalidLink": "Enlace no válido",
|
|
36
|
+
"invalidOrExpiredLink": "Este enlace de restablecimiento no es válido o ha expirado.",
|
|
37
|
+
"requestNewResetLink": "Solicitar un nuevo enlace de restablecimiento",
|
|
38
|
+
"passwordNotMeetRequirements": "La contraseña no cumple con los requisitos",
|
|
39
|
+
"passwordsDoNotMatch": "Las contraseñas no coinciden",
|
|
40
|
+
"passwordWeakError": "La contraseña no cumple con los requisitos de seguridad",
|
|
41
|
+
"signInTitle": "Iniciar sesión — {{appName}}",
|
|
42
|
+
"ruleMinLength": "Al menos {{count}} caracteres",
|
|
43
|
+
"ruleUppercase": "Letra mayúscula",
|
|
44
|
+
"ruleLowercase": "Letra minúscula",
|
|
45
|
+
"ruleDigit": "Número",
|
|
46
|
+
"ruleSpecialChar": "Carácter especial",
|
|
47
|
+
"continueWith": "Continuar con {{provider}}",
|
|
48
|
+
"or": "o",
|
|
49
|
+
"signedInAs": "Conectado como {{name}}",
|
|
50
|
+
"signedInMessage": "Ya est\u00e1s autenticado.",
|
|
51
|
+
"welcomeTitle": "Bienvenido a {{appName}}",
|
|
52
|
+
"welcomeSubtitle": "Inicia sesi\u00f3n para acceder a tu cuenta",
|
|
53
|
+
"signOut": "Cerrar sesión",
|
|
54
|
+
"mfaTitle": "Autenticación de dos factores",
|
|
55
|
+
"mfaSubtitle": "Ingrese el código de verificación para continuar",
|
|
56
|
+
"mfaMethodTotp": "Autenticador",
|
|
57
|
+
"mfaMethodRecovery": "Código de recuperación",
|
|
58
|
+
"mfaTotpLabel": "Código de 6 dígitos",
|
|
59
|
+
"mfaRecoveryLabel": "Código de recuperación",
|
|
60
|
+
"mfaVerify": "Verificar",
|
|
61
|
+
"mfaVerifying": "Verificando...",
|
|
62
|
+
"mfaInvalidCode": "Código inválido. Inténtelo de nuevo.",
|
|
63
|
+
"mfaChallengeExpired": "Sesión de verificación expirada. Inicie sesión de nuevo.",
|
|
64
|
+
"mfaSetupTitle": "Autenticación multifactor",
|
|
65
|
+
"mfaStatusEnabled": "La MFA está habilitada en su cuenta.",
|
|
66
|
+
"mfaStatusDisabled": "La MFA aún no está configurada.",
|
|
67
|
+
"mfaEnrolledMethods": "Métodos registrados",
|
|
68
|
+
"mfaAddedOn": "Agregado el {{date}}",
|
|
69
|
+
"mfaRemove": "Eliminar",
|
|
70
|
+
"mfaSetupTotp": "Configurar aplicación de autenticación",
|
|
71
|
+
"mfaScanQrCode": "Escanee este código QR con su aplicación de autenticación",
|
|
72
|
+
"mfaEnterCode": "Ingrese el código de su aplicación",
|
|
73
|
+
"mfaConfirm": "Confirmar",
|
|
74
|
+
"mfaTotpAlreadyEnrolled": "Ya hay una aplicación de autenticación registrada.",
|
|
75
|
+
"mfaGenerateRecoveryCodes": "Generar códigos de recuperación",
|
|
76
|
+
"mfaRegenerateRecoveryCodes": "Regenerar códigos de recuperación",
|
|
77
|
+
"mfaRecoveryCodesTitle": "Códigos de recuperación",
|
|
78
|
+
"mfaRecoveryCodesWarning": "Guarde estos códigos en un lugar seguro. Cada código solo se puede usar una vez.",
|
|
79
|
+
"mfaRecoveryRequiresPrimary": "Configure primero una aplicación de autenticación.",
|
|
80
|
+
"mfaMethodWebAuthn": "Passkey",
|
|
81
|
+
"mfaUsePasskey": "Usar passkey",
|
|
82
|
+
"mfaSetupPasskey": "Configurar passkey",
|
|
83
|
+
"mfaWebAuthnCancelled": "La autenticación con passkey fue cancelada.",
|
|
84
|
+
"mfaManualKeyLabel": "O introduzca esta clave manualmente:",
|
|
85
|
+
"mfaCopyKey": "Haga clic para copiar",
|
|
86
|
+
"mfaSkipSetup": "Omitir por ahora",
|
|
87
|
+
"mfaBackToApp": "Volver a la aplicación",
|
|
88
|
+
"mfaDone": "Listo",
|
|
89
|
+
"mfaLoading": "Cargando...",
|
|
90
|
+
"mfaPromptTitle": "Protege tu cuenta",
|
|
91
|
+
"mfaPromptMessage": "Añade la autenticación multifactor para proteger tu cuenta con una capa adicional de seguridad.",
|
|
92
|
+
"mfaPromptSetup": "Configurar MFA",
|
|
93
|
+
"mfaPromptSkip": "Ahora no",
|
|
94
|
+
"noAccount": "¿No tienes cuenta?",
|
|
95
|
+
"createAccount": "Crear una",
|
|
96
|
+
"continue": "Continuar",
|
|
97
|
+
"orSignInWith": "O iniciar sesión con {{provider}}",
|
|
98
|
+
"registerTitle": "Crear cuenta",
|
|
99
|
+
"firstName": "Nombre",
|
|
100
|
+
"firstNamePlaceholder": "Juan",
|
|
101
|
+
"lastName": "Apellido",
|
|
102
|
+
"lastNamePlaceholder": "García",
|
|
103
|
+
"registering": "Creando cuenta...",
|
|
104
|
+
"registerButton": "Crear cuenta",
|
|
105
|
+
"alreadyHaveAccount": "¿Ya tienes cuenta?",
|
|
106
|
+
"registrationSuccess": "¡Registro exitoso! Revisa tu correo para verificar tu cuenta y luego inicia sesión.",
|
|
107
|
+
"errorEmailAlreadyRegistered": "Ya existe una cuenta con este correo.",
|
|
108
|
+
"errorWeakPassword": "La contraseña no cumple los requisitos.",
|
|
109
|
+
"errorEmailAndPasswordRequired": "El correo y la contraseña son obligatorios.",
|
|
110
|
+
"errorRegistrationFailed": "Error en el registro. Inténtalo de nuevo."
|
|
111
|
+
}
|