@dravyn/auth-ui 0.1.1

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 (52) hide show
  1. package/dist/chunk-35G4WYX3.mjs +154 -0
  2. package/dist/chunk-35G4WYX3.mjs.map +1 -0
  3. package/dist/chunk-6BBGRN4E.mjs +1 -0
  4. package/dist/chunk-6BBGRN4E.mjs.map +1 -0
  5. package/dist/chunk-FAI3ERB3.mjs +209 -0
  6. package/dist/chunk-FAI3ERB3.mjs.map +1 -0
  7. package/dist/chunk-FVXZZTKL.mjs +152 -0
  8. package/dist/chunk-FVXZZTKL.mjs.map +1 -0
  9. package/dist/chunk-Z2ICX4UY.mjs +132 -0
  10. package/dist/chunk-Z2ICX4UY.mjs.map +1 -0
  11. package/dist/index.css +235 -0
  12. package/dist/index.css.map +1 -0
  13. package/dist/index.d.mts +5 -0
  14. package/dist/index.d.ts +5 -0
  15. package/dist/index.js +678 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/index.mjs +22 -0
  18. package/dist/index.mjs.map +1 -0
  19. package/dist/screens/ForgotResetScreen.css +235 -0
  20. package/dist/screens/ForgotResetScreen.css.map +1 -0
  21. package/dist/screens/ForgotResetScreen.d.mts +17 -0
  22. package/dist/screens/ForgotResetScreen.d.ts +17 -0
  23. package/dist/screens/ForgotResetScreen.js +245 -0
  24. package/dist/screens/ForgotResetScreen.js.map +1 -0
  25. package/dist/screens/ForgotResetScreen.mjs +11 -0
  26. package/dist/screens/ForgotResetScreen.mjs.map +1 -0
  27. package/dist/screens/LoginScreen.css +235 -0
  28. package/dist/screens/LoginScreen.css.map +1 -0
  29. package/dist/screens/LoginScreen.d.mts +36 -0
  30. package/dist/screens/LoginScreen.d.ts +36 -0
  31. package/dist/screens/LoginScreen.js +167 -0
  32. package/dist/screens/LoginScreen.js.map +1 -0
  33. package/dist/screens/LoginScreen.mjs +9 -0
  34. package/dist/screens/LoginScreen.mjs.map +1 -0
  35. package/dist/screens/OTPScreen.css +235 -0
  36. package/dist/screens/OTPScreen.css.map +1 -0
  37. package/dist/screens/OTPScreen.d.mts +16 -0
  38. package/dist/screens/OTPScreen.d.ts +16 -0
  39. package/dist/screens/OTPScreen.js +187 -0
  40. package/dist/screens/OTPScreen.js.map +1 -0
  41. package/dist/screens/OTPScreen.mjs +9 -0
  42. package/dist/screens/OTPScreen.mjs.map +1 -0
  43. package/dist/screens/RegisterScreen.css +235 -0
  44. package/dist/screens/RegisterScreen.css.map +1 -0
  45. package/dist/screens/RegisterScreen.d.mts +21 -0
  46. package/dist/screens/RegisterScreen.d.ts +21 -0
  47. package/dist/screens/RegisterScreen.js +189 -0
  48. package/dist/screens/RegisterScreen.js.map +1 -0
  49. package/dist/screens/RegisterScreen.mjs +9 -0
  50. package/dist/screens/RegisterScreen.mjs.map +1 -0
  51. package/package.json +39 -0
  52. package/src/screens/auth.css +260 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/screens/LoginScreen.tsx","../src/screens/RegisterScreen.tsx","../src/screens/OTPScreen.tsx","../src/screens/ForgotResetScreen.tsx"],"sourcesContent":["// @dravyn/auth-ui — public API\n// Import tokens first: import 'dravyn-ui/tokens'\n// Then import screens: import { LoginScreen } from '@dravyn/auth-ui'\n\nexport { LoginScreen } from './screens/LoginScreen';\nexport type { LoginScreenProps } from './screens/LoginScreen';\n\nexport { RegisterScreen } from './screens/RegisterScreen';\nexport type { RegisterScreenProps } from './screens/RegisterScreen';\n\nexport { OTPScreen } from './screens/OTPScreen';\nexport type { OTPScreenProps } from './screens/OTPScreen';\n\nexport { ForgotPasswordScreen, ResetPasswordScreen } from './screens/ForgotResetScreen';\nexport type { ForgotPasswordScreenProps, ResetPasswordScreenProps } from './screens/ForgotResetScreen';\n","/**\n * Dravyn Auth — LoginScreen\n * Drop this into any Next.js / React project.\n * Requires: @dravyn/ui (or dravyn-ui) and @dravyn/auth-js\n *\n * Usage (Next.js App Router):\n * import { LoginScreen } from '@dravyn/auth-ui'\n * export default function LoginPage() {\n * return <LoginScreen redirectTo=\"/dashboard\" />\n * }\n */\n\n'use client';\n\nimport React from 'react';\nimport { Button } from '@dravyn/ui';\nimport { Input } from '@dravyn/ui';\nimport { Alert } from '@dravyn/ui';\nimport { Spinner } from '@dravyn/ui';\nimport './auth.css';\n\nexport interface LoginScreenProps {\n /** Where to send the user after a successful login */\n redirectTo?: string;\n /** Show / hide the \"Create account\" link */\n showRegisterLink?: boolean;\n /** Called with the JWT on success — use this OR redirectTo */\n onSuccess?: (token: string, user: AuthUser) => void;\n /** Override the logo node */\n logo?: React.ReactNode;\n /** Your brand name shown in the UI */\n brandName?: string;\n /** API base URL — defaults to NEXT_PUBLIC_AUTH_API_URL env var */\n apiBase?: string;\n}\n\ninterface AuthUser {\n id: string;\n email: string;\n name: string;\n}\n\nexport const LoginScreen: React.FC<LoginScreenProps> = ({\n redirectTo = '/dashboard',\n showRegisterLink = true,\n onSuccess,\n logo,\n brandName = 'Dravyn',\n apiBase = process.env.NEXT_PUBLIC_AUTH_API_URL ?? 'http://localhost:3001',\n}) => {\n const [email, setEmail] = React.useState('');\n const [password, setPassword] = React.useState('');\n const [showPass, setShowPass] = React.useState(false);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState('');\n\n const emailRef = React.useRef<HTMLInputElement>(null);\n React.useEffect(() => { emailRef.current?.focus(); }, []);\n\n const validate = () => {\n if (!email.trim()) return 'Email address is required.';\n if (!/\\S+@\\S+\\.\\S+/.test(email)) return 'Enter a valid email address.';\n if (!password) return 'Password is required.';\n if (password.length < 6) return 'Password must be at least 6 characters.';\n return null;\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n const err = validate();\n if (err) { setError(err); return; }\n\n setLoading(true);\n setError('');\n\n try {\n const res = await fetch(`${apiBase}/auth/login`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email: email.trim().toLowerCase(), password }),\n });\n\n const data = await res.json();\n\n if (!res.ok) {\n setError(data.message ?? 'Invalid email or password.');\n return;\n }\n\n // Store token\n localStorage.setItem('dravyn_token', data.accessToken);\n localStorage.setItem('dravyn_user', JSON.stringify(data.user));\n\n if (onSuccess) {\n onSuccess(data.accessToken, data.user);\n } else {\n window.location.href = redirectTo;\n }\n } catch {\n setError('Unable to connect. Please check your internet connection.');\n } finally {\n setLoading(false);\n }\n };\n\n const handleGoogle = async () => {\n window.location.href = `${apiBase}/auth/google`;\n };\n\n return (\n <div className=\"dauth-root\">\n <div className=\"dauth-card\">\n\n {/* Logo / brand */}\n <div className=\"dauth-brand\">\n {logo ?? (\n <div className=\"dauth-logo-default\">\n <span className=\"dauth-logo-dot\" />\n {brandName}\n </div>\n )}\n </div>\n\n <h1 className=\"dauth-title\">Welcome back</h1>\n <p className=\"dauth-sub\">Sign in to your {brandName} account</p>\n\n {/* Error */}\n {error && (\n <div style={{ marginBottom: 16 }}>\n <Alert variant=\"danger\">{error}</Alert>\n </div>\n )}\n\n <form onSubmit={handleSubmit} noValidate>\n <div className=\"dauth-fields\">\n <Input\n ref={emailRef}\n label=\"Email address\"\n type=\"email\"\n placeholder=\"you@example.com\"\n value={email}\n onChange={e => setEmail(e.target.value)}\n leftIcon={<EmailIcon />}\n autoComplete=\"email\"\n required\n />\n\n <div className=\"dauth-password-wrap\">\n <Input\n label=\"Password\"\n type={showPass ? 'text' : 'password'}\n placeholder=\"••••••••\"\n value={password}\n onChange={e => setPassword(e.target.value)}\n leftIcon={<LockIcon />}\n rightIcon={\n <button\n type=\"button\"\n className=\"dauth-eye\"\n onClick={() => setShowPass(v => !v)}\n aria-label={showPass ? 'Hide password' : 'Show password'}\n >\n {showPass ? <EyeOffIcon /> : <EyeIcon />}\n </button>\n }\n autoComplete=\"current-password\"\n required\n />\n <a href=\"/auth/forgot-password\" className=\"dauth-forgot\">\n Forgot password?\n </a>\n </div>\n </div>\n\n <Button\n type=\"submit\"\n variant=\"primary\"\n fullWidth\n loading={loading}\n style={{ marginTop: 8 }}\n >\n Sign in\n </Button>\n </form>\n\n {/* Divider */}\n <div className=\"dauth-divider\">\n <span>or continue with</span>\n </div>\n\n {/* Google OAuth */}\n <button\n type=\"button\"\n className=\"dauth-google-btn\"\n onClick={handleGoogle}\n disabled={loading}\n >\n <GoogleIcon />\n Continue with Google\n </button>\n\n {/* Register link */}\n {showRegisterLink && (\n <p className=\"dauth-footer-text\">\n Don't have an account?{' '}\n <a href=\"/auth/register\" className=\"dauth-link\">\n Create one\n </a>\n </p>\n )}\n </div>\n </div>\n );\n};\n\n// ── Inline SVG icons (zero extra deps) ───────────────────────────────────────\nconst EmailIcon = () => <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\"/><path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\"/></svg>;\nconst LockIcon = () => <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\"/><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"/></svg>;\nconst EyeIcon = () => <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>;\nconst EyeOffIcon = () => <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M9.88 9.88a3 3 0 1 0 4.24 4.24\"/><path d=\"M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68\"/><path d=\"M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61\"/><line x1=\"2\" x2=\"22\" y1=\"2\" y2=\"22\"/></svg>;\nconst GoogleIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\">\n <path fill=\"#4285F4\" d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"/>\n <path fill=\"#34A853\" d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"/>\n <path fill=\"#FBBC05\" d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"/>\n <path fill=\"#EA4335\" d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"/>\n </svg>\n);\n","'use client';\n\nimport React from 'react';\nimport { Button } from '@dravyn/ui';\nimport { Input } from '@dravyn/ui';\nimport { Alert } from '@dravyn/ui';\nimport './auth.css';\n\nexport interface RegisterScreenProps {\n redirectTo?: string;\n onSuccess?: (token: string, user: AuthUser) => void;\n logo?: React.ReactNode;\n brandName?: string;\n apiBase?: string;\n /** Extra fields to collect — rendered after the core fields */\n extraFields?: React.ReactNode;\n /** If true, redirect to OTP screen after register instead of auto-login */\n requireOTP?: boolean;\n}\n\ninterface AuthUser {\n id: string; email: string; name: string;\n}\n\nexport const RegisterScreen: React.FC<RegisterScreenProps> = ({\n redirectTo = '/auth/verify',\n onSuccess,\n logo,\n brandName = 'Dravyn',\n apiBase = process.env.NEXT_PUBLIC_AUTH_API_URL ?? 'http://localhost:3001',\n extraFields,\n requireOTP = true,\n}) => {\n const [form, setForm] = React.useState({\n firstName: '', lastName: '', email: '', password: '', confirm: '',\n });\n const [showPass, setShowPass] = React.useState(false);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState('');\n const [fieldErrs, setFieldErrs] = React.useState<Record<string, string>>({});\n\n const set = (k: keyof typeof form) => (e: React.ChangeEvent<HTMLInputElement>) =>\n setForm(f => ({ ...f, [k]: e.target.value }));\n\n const validate = () => {\n const errs: Record<string, string> = {};\n if (!form.firstName.trim()) errs.firstName = 'First name is required.';\n if (!form.lastName.trim()) errs.lastName = 'Last name is required.';\n if (!form.email.trim()) errs.email = 'Email is required.';\n else if (!/\\S+@\\S+\\.\\S+/.test(form.email)) errs.email = 'Enter a valid email.';\n if (!form.password) errs.password = 'Password is required.';\n else if (form.password.length < 8) errs.password = 'Password must be at least 8 characters.';\n if (form.confirm !== form.password) errs.confirm = 'Passwords do not match.';\n return errs;\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n const errs = validate();\n if (Object.keys(errs).length) { setFieldErrs(errs); return; }\n setFieldErrs({});\n setLoading(true);\n setError('');\n\n try {\n const res = await fetch(`${apiBase}/auth/register`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n firstName: form.firstName.trim(),\n lastName: form.lastName.trim(),\n email: form.email.trim().toLowerCase(),\n password: form.password,\n }),\n });\n const data = await res.json();\n if (!res.ok) { setError(data.message ?? 'Registration failed.'); return; }\n\n if (requireOTP) {\n // Store email for OTP screen to use\n sessionStorage.setItem('dravyn_pending_email', form.email.trim().toLowerCase());\n window.location.href = redirectTo;\n } else {\n localStorage.setItem('dravyn_token', data.accessToken);\n localStorage.setItem('dravyn_user', JSON.stringify(data.user));\n if (onSuccess) onSuccess(data.accessToken, data.user);\n else window.location.href = redirectTo;\n }\n } catch {\n setError('Unable to connect. Check your internet connection.');\n } finally {\n setLoading(false);\n }\n };\n\n const EyeIcon = () => <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>;\n const EyeOffIcon = () => <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M9.88 9.88a3 3 0 1 0 4.24 4.24\"/><path d=\"M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68\"/><path d=\"M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61\"/><line x1=\"2\" x2=\"22\" y1=\"2\" y2=\"22\"/></svg>;\n\n return (\n <div className=\"dauth-root\">\n <div className=\"dauth-card\">\n <div className=\"dauth-brand\">\n {logo ?? <div className=\"dauth-logo-default\"><span className=\"dauth-logo-dot\" />{brandName}</div>}\n </div>\n\n <h1 className=\"dauth-title\">Create your account</h1>\n <p className=\"dauth-sub\">Join {brandName} — it's free</p>\n\n {error && <div style={{ marginBottom: 16 }}><Alert variant=\"danger\">{error}</Alert></div>}\n\n <form onSubmit={handleSubmit} noValidate>\n <div className=\"dauth-fields\">\n <div className=\"dauth-row\">\n <Input\n label=\"First name\"\n placeholder=\"Jeremiah\"\n value={form.firstName}\n onChange={set('firstName')}\n error={fieldErrs.firstName}\n required\n />\n <Input\n label=\"Last name\"\n placeholder=\"Adeniyi\"\n value={form.lastName}\n onChange={set('lastName')}\n error={fieldErrs.lastName}\n required\n />\n </div>\n\n <Input\n label=\"Email address\"\n type=\"email\"\n placeholder=\"you@example.com\"\n value={form.email}\n onChange={set('email')}\n error={fieldErrs.email}\n autoComplete=\"email\"\n required\n />\n\n <Input\n label=\"Password\"\n type={showPass ? 'text' : 'password'}\n placeholder=\"Min. 8 characters\"\n value={form.password}\n onChange={set('password')}\n error={fieldErrs.password}\n hint={!fieldErrs.password ? 'At least 8 characters.' : undefined}\n rightIcon={\n <button type=\"button\" className=\"dauth-eye\"\n onClick={() => setShowPass(v => !v)}\n aria-label={showPass ? 'Hide' : 'Show'}>\n {showPass ? <EyeOffIcon /> : <EyeIcon />}\n </button>\n }\n autoComplete=\"new-password\"\n required\n />\n\n <Input\n label=\"Confirm password\"\n type={showPass ? 'text' : 'password'}\n placeholder=\"Re-enter your password\"\n value={form.confirm}\n onChange={set('confirm')}\n error={fieldErrs.confirm}\n autoComplete=\"new-password\"\n required\n />\n\n {/* Slot for extra fields (university, department, etc.) */}\n {extraFields}\n </div>\n\n <Button type=\"submit\" variant=\"primary\" fullWidth loading={loading} style={{ marginTop: 8 }}>\n Create account\n </Button>\n </form>\n\n <p className=\"dauth-footer-text\" style={{ marginTop: 20 }}>\n Already have an account?{' '}\n <a href=\"/auth/login\" className=\"dauth-link\">Sign in</a>\n </p>\n\n <p className=\"dauth-terms\">\n By creating an account you agree to our{' '}\n <a href=\"/terms\" className=\"dauth-link\">Terms of Service</a>{' '}\n and{' '}\n <a href=\"/privacy\" className=\"dauth-link\">Privacy Policy</a>.\n </p>\n </div>\n </div>\n );\n};\n","'use client';\n\nimport React from 'react';\nimport { Button } from '@dravyn/ui';\nimport { Alert } from '@dravyn/ui';\nimport './auth.css';\n\nexport interface OTPScreenProps {\n /** Pre-fill the email (e.g. passed via query param or sessionStorage) */\n email?: string;\n redirectTo?: string;\n onSuccess?: () => void;\n logo?: React.ReactNode;\n brandName?: string;\n apiBase?: string;\n /** OTP length — default 6 */\n length?: number;\n}\n\nexport const OTPScreen: React.FC<OTPScreenProps> = ({\n email: emailProp,\n redirectTo = '/dashboard',\n onSuccess,\n logo,\n brandName = 'Dravyn',\n apiBase = process.env.NEXT_PUBLIC_AUTH_API_URL ?? 'http://localhost:3001',\n length = 6,\n}) => {\n const email = emailProp\n ?? (typeof sessionStorage !== 'undefined'\n ? sessionStorage.getItem('dravyn_pending_email') ?? ''\n : '');\n\n const [otp, setOtp] = React.useState<string[]>(Array(length).fill(''));\n const [loading, setLoading] = React.useState(false);\n const [resending, setResending] = React.useState(false);\n const [error, setError] = React.useState('');\n const [success, setSuccess] = React.useState('');\n const [countdown, setCountdown] = React.useState(60);\n const inputRefs = React.useRef<(HTMLInputElement | null)[]>([]);\n\n // Countdown timer for resend\n React.useEffect(() => {\n if (countdown <= 0) return;\n const t = setTimeout(() => setCountdown(c => c - 1), 1000);\n return () => clearTimeout(t);\n }, [countdown]);\n\n // Auto-focus first box\n React.useEffect(() => { inputRefs.current[0]?.focus(); }, []);\n\n const handleInput = (i: number, val: string) => {\n // Allow paste of full code\n if (val.length > 1) {\n const digits = val.replace(/\\D/g, '').slice(0, length).split('');\n const next = [...otp];\n digits.forEach((d, idx) => { if (idx < length) next[idx] = d; });\n setOtp(next);\n const last = Math.min(digits.length, length - 1);\n inputRefs.current[last]?.focus();\n return;\n }\n const digit = val.replace(/\\D/g, '');\n const next = [...otp];\n next[i] = digit;\n setOtp(next);\n if (digit && i < length - 1) inputRefs.current[i + 1]?.focus();\n };\n\n const handleKeyDown = (i: number, e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace' && !otp[i] && i > 0) {\n inputRefs.current[i - 1]?.focus();\n }\n };\n\n const handleVerify = async () => {\n const code = otp.join('');\n if (code.length < length) { setError('Enter the complete verification code.'); return; }\n setLoading(true);\n setError('');\n try {\n const res = await fetch(`${apiBase}/auth/verify-otp`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, otp: code }),\n });\n const data = await res.json();\n if (!res.ok) { setError(data.message ?? 'Invalid or expired code.'); return; }\n sessionStorage.removeItem('dravyn_pending_email');\n if (data.accessToken) {\n localStorage.setItem('dravyn_token', data.accessToken);\n localStorage.setItem('dravyn_user', JSON.stringify(data.user));\n }\n if (onSuccess) onSuccess();\n else window.location.href = redirectTo;\n } catch {\n setError('Unable to connect.');\n } finally {\n setLoading(false);\n }\n };\n\n const handleResend = async () => {\n setResending(true);\n setError('');\n setSuccess('');\n try {\n const res = await fetch(`${apiBase}/auth/resend-otp`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email }),\n });\n if (res.ok) {\n setSuccess('A new code has been sent to your email.');\n setCountdown(60);\n setOtp(Array(length).fill(''));\n inputRefs.current[0]?.focus();\n } else {\n setError('Could not resend. Try again shortly.');\n }\n } catch {\n setError('Unable to connect.');\n } finally {\n setResending(false);\n }\n };\n\n return (\n <div className=\"dauth-root\">\n <div className=\"dauth-card\">\n <div className=\"dauth-brand\">\n {logo ?? <div className=\"dauth-logo-default\"><span className=\"dauth-logo-dot\" />{brandName}</div>}\n </div>\n\n <div className=\"dauth-otp-icon\" aria-hidden=\"true\">✉</div>\n <h1 className=\"dauth-title\">Check your email</h1>\n <p className=\"dauth-sub\">\n We sent a {length}-digit code to<br />\n <strong style={{ color: 'var(--dauth-text)' }}>{email || 'your email address'}</strong>\n </p>\n\n {error && <div style={{ margin: '12px 0' }}><Alert variant=\"danger\">{error}</Alert></div>}\n {success && <div style={{ margin: '12px 0' }}><Alert variant=\"success\">{success}</Alert></div>}\n\n {/* OTP boxes */}\n <div className=\"dauth-otp-boxes\" role=\"group\" aria-label=\"Verification code\">\n {otp.map((digit, i) => (\n <input\n key={i}\n ref={el => { inputRefs.current[i] = el; }}\n className={`dauth-otp-box ${digit ? 'dauth-otp-box--filled' : ''}`}\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n maxLength={length} // allow paste\n value={digit}\n onChange={e => handleInput(i, e.target.value)}\n onKeyDown={e => handleKeyDown(i, e)}\n onFocus={e => e.target.select()}\n aria-label={`Digit ${i + 1}`}\n />\n ))}\n </div>\n\n <Button\n variant=\"primary\"\n fullWidth\n loading={loading}\n onClick={handleVerify}\n style={{ marginTop: 8 }}\n >\n Verify email\n </Button>\n\n {/* Resend */}\n <div className=\"dauth-resend\">\n {countdown > 0 ? (\n <span>Resend code in <strong style={{ color: 'var(--dauth-teal)' }}>{countdown}s</strong></span>\n ) : (\n <button\n type=\"button\"\n className=\"dauth-link\"\n onClick={handleResend}\n disabled={resending}\n >\n {resending ? 'Sending…' : 'Resend code'}\n </button>\n )}\n </div>\n\n <p className=\"dauth-footer-text\">\n Wrong email?{' '}\n <a href=\"/auth/register\" className=\"dauth-link\">Go back</a>\n </p>\n </div>\n </div>\n );\n};\n","'use client';\n\nimport React from 'react';\nimport { Button } from '@dravyn/ui';\nimport { Input } from '@dravyn/ui';\nimport { Alert } from '@dravyn/ui';\nimport './auth.css';\n\n// ── ForgotPasswordScreen ──────────────────────────────────────────────────────\n\nexport interface ForgotPasswordScreenProps {\n logo?: React.ReactNode;\n brandName?: string;\n apiBase?: string;\n}\n\nexport const ForgotPasswordScreen: React.FC<ForgotPasswordScreenProps> = ({\n logo,\n brandName = 'Dravyn',\n apiBase = process.env.NEXT_PUBLIC_AUTH_API_URL ?? 'http://localhost:3001',\n}) => {\n const [email, setEmail] = React.useState('');\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState('');\n const [sent, setSent] = React.useState(false);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!email.trim()) { setError('Email address is required.'); return; }\n if (!/\\S+@\\S+\\.\\S+/.test(email)) { setError('Enter a valid email address.'); return; }\n\n setLoading(true);\n setError('');\n try {\n const res = await fetch(`${apiBase}/auth/forgot-password`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email: email.trim().toLowerCase() }),\n });\n // Always show success — don't reveal if email exists\n if (res.ok || res.status === 404) {\n sessionStorage.setItem('dravyn_reset_email', email.trim().toLowerCase());\n setSent(true);\n } else {\n const d = await res.json();\n setError(d.message ?? 'Something went wrong. Try again.');\n }\n } catch {\n setError('Unable to connect.');\n } finally {\n setLoading(false);\n }\n };\n\n if (sent) {\n return (\n <div className=\"dauth-root\">\n <div className=\"dauth-card\">\n <div className=\"dauth-brand\">\n {logo ?? <div className=\"dauth-logo-default\"><span className=\"dauth-logo-dot\" />{brandName}</div>}\n </div>\n <div className=\"dauth-otp-icon\">✓</div>\n <h1 className=\"dauth-title\">Check your inbox</h1>\n <p className=\"dauth-sub\">\n If <strong style={{ color: 'var(--dauth-text)' }}>{email}</strong> is\n registered, you'll receive a reset code shortly.\n </p>\n <Button\n variant=\"primary\"\n fullWidth\n style={{ marginTop: 20 }}\n onClick={() => window.location.href = '/auth/reset-password'}\n >\n Enter reset code\n </Button>\n <p className=\"dauth-footer-text\">\n <a href=\"/auth/login\" className=\"dauth-link\">Back to sign in</a>\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"dauth-root\">\n <div className=\"dauth-card\">\n <div className=\"dauth-brand\">\n {logo ?? <div className=\"dauth-logo-default\"><span className=\"dauth-logo-dot\" />{brandName}</div>}\n </div>\n\n <h1 className=\"dauth-title\">Reset your password</h1>\n <p className=\"dauth-sub\">\n Enter your email and we'll send you a reset code.\n </p>\n\n {error && <div style={{ marginBottom: 14 }}><Alert variant=\"danger\">{error}</Alert></div>}\n\n <form onSubmit={handleSubmit} noValidate>\n <div className=\"dauth-fields\">\n <Input\n label=\"Email address\"\n type=\"email\"\n placeholder=\"you@example.com\"\n value={email}\n onChange={e => setEmail(e.target.value)}\n autoComplete=\"email\"\n required\n />\n </div>\n <Button type=\"submit\" variant=\"primary\" fullWidth loading={loading} style={{ marginTop: 8 }}>\n Send reset code\n </Button>\n </form>\n\n <p className=\"dauth-footer-text\">\n Remember it?{' '}\n <a href=\"/auth/login\" className=\"dauth-link\">Back to sign in</a>\n </p>\n </div>\n </div>\n );\n};\n\n// ── ResetPasswordScreen ───────────────────────────────────────────────────────\n\nexport interface ResetPasswordScreenProps {\n logo?: React.ReactNode;\n brandName?: string;\n apiBase?: string;\n redirectTo?: string;\n}\n\nexport const ResetPasswordScreen: React.FC<ResetPasswordScreenProps> = ({\n logo,\n brandName = 'Dravyn',\n apiBase = process.env.NEXT_PUBLIC_AUTH_API_URL ?? 'http://localhost:3001',\n redirectTo = '/auth/login',\n}) => {\n const email = typeof sessionStorage !== 'undefined'\n ? sessionStorage.getItem('dravyn_reset_email') ?? '' : '';\n\n const [otp, setOtp] = React.useState(['', '', '', '', '', '']);\n const [password, setPassword] = React.useState('');\n const [confirm, setConfirm] = React.useState('');\n const [showPass, setShowPass] = React.useState(false);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState('');\n const [done, setDone] = React.useState(false);\n const inputRefs = React.useRef<(HTMLInputElement | null)[]>([]);\n\n const handleOtpInput = (i: number, val: string) => {\n if (val.length > 1) {\n const digits = val.replace(/\\D/g, '').slice(0, 6).split('');\n const next = [...otp];\n digits.forEach((d, idx) => { if (idx < 6) next[idx] = d; });\n setOtp(next);\n inputRefs.current[Math.min(digits.length, 5)]?.focus();\n return;\n }\n const digit = val.replace(/\\D/g, '');\n const next = [...otp]; next[i] = digit; setOtp(next);\n if (digit && i < 5) inputRefs.current[i + 1]?.focus();\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n const code = otp.join('');\n if (code.length < 6) { setError('Enter the complete 6-digit code.'); return; }\n if (!password) { setError('Enter a new password.'); return; }\n if (password.length < 8) { setError('Password must be at least 8 characters.'); return; }\n if (password !== confirm) { setError('Passwords do not match.'); return; }\n\n setLoading(true);\n setError('');\n try {\n const res = await fetch(`${apiBase}/auth/reset-password`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, otp: code, newPassword: password }),\n });\n const data = await res.json();\n if (!res.ok) { setError(data.message ?? 'Reset failed. Check the code and try again.'); return; }\n sessionStorage.removeItem('dravyn_reset_email');\n setDone(true);\n } catch {\n setError('Unable to connect.');\n } finally {\n setLoading(false);\n }\n };\n\n const EyeIcon = () => <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>;\n const EyeOffIcon = () => <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M9.88 9.88a3 3 0 1 0 4.24 4.24\"/><path d=\"M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68\"/><path d=\"M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61\"/><line x1=\"2\" x2=\"22\" y1=\"2\" y2=\"22\"/></svg>;\n\n if (done) {\n return (\n <div className=\"dauth-root\">\n <div className=\"dauth-card\">\n <div className=\"dauth-otp-icon\" style={{ color: 'var(--dauth-green)' }}>✓</div>\n <h1 className=\"dauth-title\">Password reset!</h1>\n <p className=\"dauth-sub\">Your password has been updated. You can now sign in.</p>\n <Button variant=\"primary\" fullWidth style={{ marginTop: 20 }}\n onClick={() => window.location.href = redirectTo}>\n Sign in\n </Button>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"dauth-root\">\n <div className=\"dauth-card\">\n <div className=\"dauth-brand\">\n {logo ?? <div className=\"dauth-logo-default\"><span className=\"dauth-logo-dot\" />{brandName}</div>}\n </div>\n\n <h1 className=\"dauth-title\">Set new password</h1>\n <p className=\"dauth-sub\">Enter the code we sent you and choose a new password.</p>\n\n {error && <div style={{ marginBottom: 14 }}><Alert variant=\"danger\">{error}</Alert></div>}\n\n <form onSubmit={handleSubmit} noValidate>\n {/* OTP row */}\n <div className=\"dauth-fields\">\n <div>\n <div className=\"dauth-label\">Reset code</div>\n <div className=\"dauth-otp-boxes\" style={{ marginTop: 6 }}>\n {otp.map((d, i) => (\n <input key={i}\n ref={el => { inputRefs.current[i] = el; }}\n className={`dauth-otp-box ${d ? 'dauth-otp-box--filled' : ''}`}\n type=\"text\" inputMode=\"numeric\" maxLength={6}\n value={d} onChange={e => handleOtpInput(i, e.target.value)}\n onKeyDown={e => { if (e.key === 'Backspace' && !d && i > 0) inputRefs.current[i-1]?.focus(); }}\n aria-label={`Digit ${i + 1}`}\n />\n ))}\n </div>\n </div>\n\n <Input\n label=\"New password\"\n type={showPass ? 'text' : 'password'}\n placeholder=\"Min. 8 characters\"\n value={password}\n onChange={e => setPassword(e.target.value)}\n rightIcon={\n <button type=\"button\" className=\"dauth-eye\"\n onClick={() => setShowPass(v => !v)}>\n {showPass ? <EyeOffIcon /> : <EyeIcon />}\n </button>\n }\n />\n <Input\n label=\"Confirm new password\"\n type={showPass ? 'text' : 'password'}\n placeholder=\"Re-enter password\"\n value={confirm}\n onChange={e => setConfirm(e.target.value)}\n />\n </div>\n\n <Button type=\"submit\" variant=\"primary\" fullWidth loading={loading} style={{ marginTop: 8 }}>\n Reset password\n </Button>\n </form>\n </div>\n </div>\n );\n};\n"],"mappings":"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","names":["import_ui","React","import_react","import_ui","React","EyeIcon","EyeOffIcon","import_react","import_ui","React","next","import_react","import_ui","React","next","EyeIcon","EyeOffIcon"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,22 @@
1
+ import {
2
+ ForgotPasswordScreen,
3
+ ResetPasswordScreen
4
+ } from "./chunk-FAI3ERB3.mjs";
5
+ import {
6
+ LoginScreen
7
+ } from "./chunk-Z2ICX4UY.mjs";
8
+ import {
9
+ OTPScreen
10
+ } from "./chunk-FVXZZTKL.mjs";
11
+ import {
12
+ RegisterScreen
13
+ } from "./chunk-35G4WYX3.mjs";
14
+ import "./chunk-6BBGRN4E.mjs";
15
+ export {
16
+ ForgotPasswordScreen,
17
+ LoginScreen,
18
+ OTPScreen,
19
+ RegisterScreen,
20
+ ResetPasswordScreen
21
+ };
22
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,235 @@
1
+ /* src/screens/auth.css */
2
+ .dauth-root {
3
+ min-height: 100vh;
4
+ display: flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+ background: var(--dui-bg, #0d0d0d);
8
+ padding: 24px 16px;
9
+ font-family: var(--dui-font-sans, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif);
10
+ }
11
+ .dauth-card {
12
+ width: 100%;
13
+ max-width: 420px;
14
+ background: var(--dui-bg-raised, #161616);
15
+ border: 0.5px solid var(--dui-border-strong, rgba(255,255,255,0.16));
16
+ border-radius: 16px;
17
+ padding: 36px 32px 32px;
18
+ animation: dauth-in 220ms cubic-bezier(0.16, 1, 0.3, 1);
19
+ }
20
+ @keyframes dauth-in {
21
+ from {
22
+ opacity: 0;
23
+ transform: translateY(10px) scale(0.98);
24
+ }
25
+ to {
26
+ opacity: 1;
27
+ transform: translateY(0) scale(1);
28
+ }
29
+ }
30
+ .dauth-brand {
31
+ margin-bottom: 24px;
32
+ }
33
+ .dauth-logo-default {
34
+ display: inline-flex;
35
+ align-items: center;
36
+ gap: 7px;
37
+ font-size: 15px;
38
+ font-weight: 700;
39
+ color: var(--dui-text, #f0f0f0);
40
+ letter-spacing: -0.01em;
41
+ }
42
+ .dauth-logo-dot {
43
+ width: 8px;
44
+ height: 8px;
45
+ border-radius: 50%;
46
+ background: var(--dui-teal-400, #4ecdc4);
47
+ flex-shrink: 0;
48
+ }
49
+ .dauth-title {
50
+ font-size: 22px;
51
+ font-weight: 700;
52
+ color: var(--dui-text, #f0f0f0);
53
+ letter-spacing: -0.02em;
54
+ line-height: 1.2;
55
+ margin: 0 0 6px;
56
+ }
57
+ .dauth-sub {
58
+ font-size: 13.5px;
59
+ color: var(--dui-text-muted, #888);
60
+ line-height: 1.55;
61
+ margin: 0 0 22px;
62
+ }
63
+ .dauth-fields {
64
+ display: flex;
65
+ flex-direction: column;
66
+ gap: 14px;
67
+ margin-bottom: 14px;
68
+ }
69
+ .dauth-row {
70
+ display: grid;
71
+ grid-template-columns: 1fr 1fr;
72
+ gap: 10px;
73
+ }
74
+ .dauth-password-wrap {
75
+ display: flex;
76
+ flex-direction: column;
77
+ gap: 6px;
78
+ }
79
+ .dauth-forgot {
80
+ font-size: 12px;
81
+ color: var(--dui-text-muted, #888);
82
+ text-decoration: none;
83
+ align-self: flex-end;
84
+ transition: color 0.15s;
85
+ }
86
+ .dauth-forgot:hover {
87
+ color: var(--dui-teal-400, #4ecdc4);
88
+ }
89
+ .dauth-eye {
90
+ background: none;
91
+ border: none;
92
+ cursor: pointer;
93
+ color: var(--dui-text-hint, #555);
94
+ display: inline-flex;
95
+ align-items: center;
96
+ padding: 0;
97
+ transition: color 0.15s;
98
+ }
99
+ .dauth-eye:hover {
100
+ color: var(--dui-text-muted, #888);
101
+ }
102
+ .dauth-divider {
103
+ display: flex;
104
+ align-items: center;
105
+ gap: 10px;
106
+ margin: 18px 0;
107
+ color: var(--dui-text-hint, #555);
108
+ font-size: 12px;
109
+ }
110
+ .dauth-divider::before,
111
+ .dauth-divider::after {
112
+ content: "";
113
+ flex: 1;
114
+ height: 0.5px;
115
+ background: var(--dui-border, rgba(255,255,255,0.07));
116
+ }
117
+ .dauth-google-btn {
118
+ width: 100%;
119
+ display: flex;
120
+ align-items: center;
121
+ justify-content: center;
122
+ gap: 10px;
123
+ background: transparent;
124
+ border: 0.5px solid var(--dui-border-strong, rgba(255,255,255,0.16));
125
+ border-radius: 8px;
126
+ padding: 10px 18px;
127
+ font-family: var(--dui-font-sans);
128
+ font-size: 13px;
129
+ font-weight: 500;
130
+ color: var(--dui-text, #f0f0f0);
131
+ cursor: pointer;
132
+ transition: background 0.15s, border-color 0.15s;
133
+ }
134
+ .dauth-google-btn:hover:not(:disabled) {
135
+ background: var(--dui-bg-overlay, #1e1e1e);
136
+ border-color: rgba(255, 255, 255, 0.24);
137
+ }
138
+ .dauth-google-btn:disabled {
139
+ opacity: 0.4;
140
+ cursor: not-allowed;
141
+ }
142
+ .dauth-otp-icon {
143
+ font-size: 28px;
144
+ margin-bottom: 12px;
145
+ color: var(--dui-teal-400, #4ecdc4);
146
+ }
147
+ .dauth-otp-boxes {
148
+ display: flex;
149
+ gap: 8px;
150
+ justify-content: center;
151
+ margin: 20px 0 8px;
152
+ }
153
+ .dauth-otp-box {
154
+ width: 46px;
155
+ height: 54px;
156
+ background: var(--dui-bg, #0d0d0d);
157
+ border: 0.5px solid var(--dui-border-strong, rgba(255,255,255,0.16));
158
+ border-radius: 8px;
159
+ color: var(--dui-text, #f0f0f0);
160
+ font-size: 22px;
161
+ font-weight: 700;
162
+ font-family: var(--dui-font-sans);
163
+ text-align: center;
164
+ outline: none;
165
+ transition: border-color 0.15s, box-shadow 0.15s;
166
+ caret-color: var(--dui-teal-400, #4ecdc4);
167
+ }
168
+ .dauth-otp-box:focus {
169
+ border-color: var(--dui-teal-400, #4ecdc4);
170
+ box-shadow: 0 0 0 3px rgba(78, 205, 196, 0.12);
171
+ }
172
+ .dauth-otp-box--filled {
173
+ border-color: var(--dui-teal-400, #4ecdc4);
174
+ background: rgba(78, 205, 196, 0.04);
175
+ }
176
+ .dauth-resend {
177
+ text-align: center;
178
+ font-size: 13px;
179
+ color: var(--dui-text-muted, #888);
180
+ margin: 14px 0 4px;
181
+ }
182
+ .dauth-link {
183
+ color: var(--dui-teal-400, #4ecdc4);
184
+ text-decoration: none;
185
+ font-weight: 500;
186
+ background: none;
187
+ border: none;
188
+ cursor: pointer;
189
+ font-size: inherit;
190
+ font-family: inherit;
191
+ padding: 0;
192
+ transition: opacity 0.15s;
193
+ }
194
+ .dauth-link:hover {
195
+ opacity: 0.8;
196
+ }
197
+ .dauth-footer-text {
198
+ text-align: center;
199
+ font-size: 13px;
200
+ color: var(--dui-text-muted, #888);
201
+ margin-top: 18px;
202
+ }
203
+ .dauth-terms {
204
+ text-align: center;
205
+ font-size: 11.5px;
206
+ color: var(--dui-text-hint, #555);
207
+ margin-top: 12px;
208
+ line-height: 1.6;
209
+ }
210
+ :root {
211
+ --dauth-text: var(--dui-text, #f0f0f0);
212
+ --dauth-muted: var(--dui-text-muted, #888888);
213
+ --dauth-teal: var(--dui-teal-400, #4ecdc4);
214
+ --dauth-green: #22c55e;
215
+ --dauth-label: var(--dui-text-muted, #888888);
216
+ }
217
+ .dauth-label {
218
+ font-size: 12px;
219
+ font-weight: 500;
220
+ color: var(--dauth-label);
221
+ }
222
+ @media (max-width: 480px) {
223
+ .dauth-card {
224
+ padding: 28px 20px 24px;
225
+ }
226
+ .dauth-row {
227
+ grid-template-columns: 1fr;
228
+ }
229
+ .dauth-otp-box {
230
+ width: 40px;
231
+ height: 48px;
232
+ font-size: 20px;
233
+ }
234
+ }
235
+ /*# sourceMappingURL=ForgotResetScreen.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/screens/auth.css"],"sourcesContent":["/*\n Dravyn Auth UI — Styles\n Consumes @dravyn/ui CSS custom properties.\n Import tokens first: import 'dravyn-ui/tokens'\n Then import this file once: import '@dravyn/auth-ui/auth.css'\n*/\n\n/* ── Root / centred layout ──────────────────────────────────────────────── */\n.dauth-root {\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--dui-bg, #0d0d0d);\n padding: 24px 16px;\n font-family: var(--dui-font-sans, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif);\n}\n\n/* ── Card ───────────────────────────────────────────────────────────────── */\n.dauth-card {\n width: 100%;\n max-width: 420px;\n background: var(--dui-bg-raised, #161616);\n border: 0.5px solid var(--dui-border-strong, rgba(255,255,255,0.16));\n border-radius: 16px;\n padding: 36px 32px 32px;\n animation: dauth-in 220ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n@keyframes dauth-in {\n from { opacity: 0; transform: translateY(10px) scale(0.98); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n}\n\n/* ── Brand / logo ───────────────────────────────────────────────────────── */\n.dauth-brand {\n margin-bottom: 24px;\n}\n\n.dauth-logo-default {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n font-size: 15px;\n font-weight: 700;\n color: var(--dui-text, #f0f0f0);\n letter-spacing: -0.01em;\n}\n\n.dauth-logo-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--dui-teal-400, #4ecdc4);\n flex-shrink: 0;\n}\n\n/* ── Headings ────────────────────────────────────────────────────────────── */\n.dauth-title {\n font-size: 22px;\n font-weight: 700;\n color: var(--dui-text, #f0f0f0);\n letter-spacing: -0.02em;\n line-height: 1.2;\n margin: 0 0 6px;\n}\n\n.dauth-sub {\n font-size: 13.5px;\n color: var(--dui-text-muted, #888);\n line-height: 1.55;\n margin: 0 0 22px;\n}\n\n/* ── Form fields ─────────────────────────────────────────────────────────── */\n.dauth-fields {\n display: flex;\n flex-direction: column;\n gap: 14px;\n margin-bottom: 14px;\n}\n\n.dauth-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n}\n\n/* ── Password wrap (holds input + forgot link) ───────────────────────────── */\n.dauth-password-wrap {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.dauth-forgot {\n font-size: 12px;\n color: var(--dui-text-muted, #888);\n text-decoration: none;\n align-self: flex-end;\n transition: color 0.15s;\n}\n\n.dauth-forgot:hover { color: var(--dui-teal-400, #4ecdc4); }\n\n/* ── Show/hide password button ───────────────────────────────────────────── */\n.dauth-eye {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--dui-text-hint, #555);\n display: inline-flex;\n align-items: center;\n padding: 0;\n transition: color 0.15s;\n}\n.dauth-eye:hover { color: var(--dui-text-muted, #888); }\n\n/* ── Divider ─────────────────────────────────────────────────────────────── */\n.dauth-divider {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 18px 0;\n color: var(--dui-text-hint, #555);\n font-size: 12px;\n}\n.dauth-divider::before,\n.dauth-divider::after {\n content: '';\n flex: 1;\n height: 0.5px;\n background: var(--dui-border, rgba(255,255,255,0.07));\n}\n\n/* ── Google OAuth button ─────────────────────────────────────────────────── */\n.dauth-google-btn {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n background: transparent;\n border: 0.5px solid var(--dui-border-strong, rgba(255,255,255,0.16));\n border-radius: 8px;\n padding: 10px 18px;\n font-family: var(--dui-font-sans);\n font-size: 13px;\n font-weight: 500;\n color: var(--dui-text, #f0f0f0);\n cursor: pointer;\n transition: background 0.15s, border-color 0.15s;\n}\n.dauth-google-btn:hover:not(:disabled) {\n background: var(--dui-bg-overlay, #1e1e1e);\n border-color: rgba(255,255,255,0.24);\n}\n.dauth-google-btn:disabled { opacity: 0.4; cursor: not-allowed; }\n\n/* ── OTP boxes ───────────────────────────────────────────────────────────── */\n.dauth-otp-icon {\n font-size: 28px;\n margin-bottom: 12px;\n color: var(--dui-teal-400, #4ecdc4);\n}\n\n.dauth-otp-boxes {\n display: flex;\n gap: 8px;\n justify-content: center;\n margin: 20px 0 8px;\n}\n\n.dauth-otp-box {\n width: 46px;\n height: 54px;\n background: var(--dui-bg, #0d0d0d);\n border: 0.5px solid var(--dui-border-strong, rgba(255,255,255,0.16));\n border-radius: 8px;\n color: var(--dui-text, #f0f0f0);\n font-size: 22px;\n font-weight: 700;\n font-family: var(--dui-font-sans);\n text-align: center;\n outline: none;\n transition: border-color 0.15s, box-shadow 0.15s;\n caret-color: var(--dui-teal-400, #4ecdc4);\n}\n\n.dauth-otp-box:focus {\n border-color: var(--dui-teal-400, #4ecdc4);\n box-shadow: 0 0 0 3px rgba(78, 205, 196, 0.12);\n}\n\n.dauth-otp-box--filled {\n border-color: var(--dui-teal-400, #4ecdc4);\n background: rgba(78, 205, 196, 0.04);\n}\n\n/* ── Resend row ──────────────────────────────────────────────────────────── */\n.dauth-resend {\n text-align: center;\n font-size: 13px;\n color: var(--dui-text-muted, #888);\n margin: 14px 0 4px;\n}\n\n/* ── Links ───────────────────────────────────────────────────────────────── */\n.dauth-link {\n color: var(--dui-teal-400, #4ecdc4);\n text-decoration: none;\n font-weight: 500;\n background: none;\n border: none;\n cursor: pointer;\n font-size: inherit;\n font-family: inherit;\n padding: 0;\n transition: opacity 0.15s;\n}\n.dauth-link:hover { opacity: 0.8; }\n\n/* ── Footer text + terms ─────────────────────────────────────────────────── */\n.dauth-footer-text {\n text-align: center;\n font-size: 13px;\n color: var(--dui-text-muted, #888);\n margin-top: 18px;\n}\n\n.dauth-terms {\n text-align: center;\n font-size: 11.5px;\n color: var(--dui-text-hint, #555);\n margin-top: 12px;\n line-height: 1.6;\n}\n\n/* ── CSS variable aliases (readable names inside auth components) ─────────── */\n:root {\n --dauth-text: var(--dui-text, #f0f0f0);\n --dauth-muted: var(--dui-text-muted, #888888);\n --dauth-teal: var(--dui-teal-400, #4ecdc4);\n --dauth-green: #22c55e;\n --dauth-label: var(--dui-text-muted, #888888);\n}\n\n/* ── Label helper (used in ResetPasswordScreen) ───────────────────────────── */\n.dauth-label {\n font-size: 12px;\n font-weight: 500;\n color: var(--dauth-label);\n}\n\n/* ── Responsive ──────────────────────────────────────────────────────────── */\n@media (max-width: 480px) {\n .dauth-card { padding: 28px 20px 24px; }\n .dauth-row { grid-template-columns: 1fr; }\n .dauth-otp-box { width: 40px; height: 48px; font-size: 20px; }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+
3
+ interface ForgotPasswordScreenProps {
4
+ logo?: React.ReactNode;
5
+ brandName?: string;
6
+ apiBase?: string;
7
+ }
8
+ declare const ForgotPasswordScreen: React.FC<ForgotPasswordScreenProps>;
9
+ interface ResetPasswordScreenProps {
10
+ logo?: React.ReactNode;
11
+ brandName?: string;
12
+ apiBase?: string;
13
+ redirectTo?: string;
14
+ }
15
+ declare const ResetPasswordScreen: React.FC<ResetPasswordScreenProps>;
16
+
17
+ export { ForgotPasswordScreen, type ForgotPasswordScreenProps, ResetPasswordScreen, type ResetPasswordScreenProps };
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+
3
+ interface ForgotPasswordScreenProps {
4
+ logo?: React.ReactNode;
5
+ brandName?: string;
6
+ apiBase?: string;
7
+ }
8
+ declare const ForgotPasswordScreen: React.FC<ForgotPasswordScreenProps>;
9
+ interface ResetPasswordScreenProps {
10
+ logo?: React.ReactNode;
11
+ brandName?: string;
12
+ apiBase?: string;
13
+ redirectTo?: string;
14
+ }
15
+ declare const ResetPasswordScreen: React.FC<ResetPasswordScreenProps>;
16
+
17
+ export { ForgotPasswordScreen, type ForgotPasswordScreenProps, ResetPasswordScreen, type ResetPasswordScreenProps };