@nice2dev/auth 1.0.21 → 1.0.23
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/dist/NiceCaptcha.d.ts +54 -12
- package/dist/NiceCaptcha.d.ts.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +629 -392
- package/dist/index.mjs.map +1 -1
- package/dist/style.css +1 -0
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/useAuth.ts","../src/NiceLoginForm.tsx","../src/NicePasswordStrength.tsx","../src/NiceRegistrationForm.tsx","../src/NiceChangePassword.tsx","../src/NiceTwoFaSetup.tsx","../src/NiceCaptcha.tsx","../src/NiceOAuthButtons.tsx","../src/NiceTokenManagement.tsx"],"sourcesContent":["import { useState, useCallback, useMemo as _useMemo } from 'react';\r\n\r\n/** User info from auth. */\r\nexport interface AuthUser {\r\n id: string;\r\n email: string;\r\n name?: string;\r\n avatarUrl?: string;\r\n roles: string[];\r\n permissions: string[];\r\n}\r\n\r\n/** Auth tokens. */\r\nexport interface AuthTokens {\r\n accessToken: string;\r\n refreshToken?: string;\r\n expiresAt?: number;\r\n}\r\n\r\n/** Auth state. */\r\nexport interface AuthState {\r\n /** Whether the user is authenticated. */\r\n isAuthenticated: boolean;\r\n /** Current user info. */\r\n user: AuthUser | null;\r\n /** Tokens (for advanced usage). */\r\n tokens: AuthTokens | null;\r\n /** Whether a login/refresh is in progress. */\r\n loading: boolean;\r\n /** Last auth error. */\r\n error: string | null;\r\n}\r\n\r\n/** Auth actions returned by useAuth. */\r\nexport interface AuthActions {\r\n /** Login with credentials. Returns success status. */\r\n login: (email: string, password: string) => Promise<boolean>;\r\n /** Logout and clear tokens. */\r\n logout: () => void;\r\n /** Refresh the access token. */\r\n refreshToken: () => Promise<boolean>;\r\n /** Set auth state from external source (e.g. SSO callback). */\r\n setAuth: (user: AuthUser, tokens: AuthTokens) => void;\r\n /** Check if user has all specified roles. */\r\n hasRoles: (...roles: string[]) => boolean;\r\n /** Check if user has all specified permissions. */\r\n hasPermissions: (...permissions: string[]) => boolean;\r\n /** Clear error. */\r\n clearError: () => void;\r\n}\r\n\r\n/** Configuration for useAuth. */\r\nexport interface UseAuthConfig {\r\n /** Login endpoint. */\r\n loginUrl?: string;\r\n /** Refresh endpoint. */\r\n refreshUrl?: string;\r\n /** Logout endpoint. */\r\n logoutUrl?: string;\r\n /** Custom login handler (overrides loginUrl). */\r\n onLogin?: (email: string, password: string) => Promise<{ user: AuthUser; tokens: AuthTokens }>;\r\n /** Custom refresh handler (overrides refreshUrl). */\r\n onRefresh?: (refreshToken: string) => Promise<AuthTokens>;\r\n /** Custom logout handler. */\r\n onLogout?: () => void | Promise<void>;\r\n /** Storage key for persisting auth state. */\r\n storageKey?: string;\r\n /** Whether to persist in localStorage. */\r\n persistAuth?: boolean;\r\n}\r\n\r\n/**\r\n * {@link useAuth} — Auth state management hook with JWT, roles, refresh token, and logout.\r\n *\r\n * Usage:\r\n * ```tsx\r\n * const { isAuthenticated, user, login, logout, hasRoles } = useAuth({\r\n * onLogin: async (email, password) => {\r\n * const res = await api.login(email, password);\r\n * return { user: res.user, tokens: { accessToken: res.token } };\r\n * }\r\n * });\r\n * ```\r\n */\r\nexport function useAuth(config: UseAuthConfig = {}): AuthState & AuthActions {\r\n const { onLogin, onRefresh, onLogout, storageKey = 'nice_auth', persistAuth = false } = config;\r\n\r\n const [state, setState] = useState<AuthState>(() => {\r\n if (persistAuth && typeof window !== 'undefined') {\r\n try {\r\n const stored = localStorage.getItem(storageKey);\r\n if (stored) {\r\n const parsed = JSON.parse(stored);\r\n return { ...parsed, loading: false, error: null };\r\n }\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n return { isAuthenticated: false, user: null, tokens: null, loading: false, error: null };\r\n });\r\n\r\n const persist = useCallback(\r\n (newState: Partial<AuthState>) => {\r\n setState((prev) => {\r\n const next = { ...prev, ...newState };\r\n if (persistAuth && typeof window !== 'undefined') {\r\n if (next.isAuthenticated) {\r\n // Security: only persist non-sensitive data (user info).\r\n // Tokens are kept in-memory only to prevent XSS-based token theft.\r\n localStorage.setItem(\r\n storageKey,\r\n JSON.stringify({ isAuthenticated: true, user: next.user }),\r\n );\r\n } else {\r\n localStorage.removeItem(storageKey);\r\n }\r\n }\r\n return next;\r\n });\r\n },\r\n [persistAuth, storageKey],\r\n );\r\n\r\n const login = useCallback(\r\n async (email: string, password: string): Promise<boolean> => {\r\n persist({ loading: true, error: null });\r\n try {\r\n if (onLogin) {\r\n const result = await onLogin(email, password);\r\n persist({\r\n isAuthenticated: true,\r\n user: result.user,\r\n tokens: result.tokens,\r\n loading: false,\r\n });\r\n return true;\r\n }\r\n persist({ loading: false, error: 'No login handler configured' });\r\n return false;\r\n } catch (err: unknown) {\r\n persist({\r\n loading: false,\r\n error: (err as { message?: string })?.message ?? 'Login failed',\r\n });\r\n return false;\r\n }\r\n },\r\n [onLogin, persist],\r\n );\r\n\r\n const logout = useCallback(() => {\r\n onLogout?.();\r\n persist({ isAuthenticated: false, user: null, tokens: null, loading: false, error: null });\r\n }, [onLogout, persist]);\r\n\r\n const refreshToken = useCallback(async (): Promise<boolean> => {\r\n if (!state.tokens?.refreshToken || !onRefresh) {\r\n return false;\r\n }\r\n try {\r\n const tokens = await onRefresh(state.tokens.refreshToken);\r\n persist({ tokens });\r\n return true;\r\n } catch {\r\n logout();\r\n return false;\r\n }\r\n }, [state.tokens, onRefresh, persist, logout]);\r\n\r\n const setAuth = useCallback(\r\n (user: AuthUser, tokens: AuthTokens) => {\r\n persist({ isAuthenticated: true, user, tokens, loading: false, error: null });\r\n },\r\n [persist],\r\n );\r\n\r\n const hasRoles = useCallback(\r\n (...roles: string[]) => {\r\n if (!state.user) {\r\n return false;\r\n }\r\n return roles.every((r) => state.user!.roles.includes(r));\r\n },\r\n [state.user],\r\n );\r\n\r\n const hasPermissions = useCallback(\r\n (...permissions: string[]) => {\r\n if (!state.user) {\r\n return false;\r\n }\r\n return permissions.every((p) => state.user!.permissions.includes(p));\r\n },\r\n [state.user],\r\n );\r\n\r\n const clearError = useCallback(() => {\r\n persist({ error: null });\r\n }, [persist]);\r\n\r\n return {\r\n ...state,\r\n login,\r\n logout,\r\n refreshToken,\r\n setAuth,\r\n hasRoles,\r\n hasPermissions,\r\n clearError,\r\n };\r\n}\r\n","import React, { forwardRef, useState, useCallback, useMemo } from 'react';\r\n\r\n// Traceless types (inline to avoid cross-package dependency)\r\ninterface TracelessPolicy {\r\n cookiesAllowed: boolean;\r\n localStorageAllowed: boolean;\r\n sessionStorageAllowed: boolean;\r\n}\r\n\r\ninterface _TracelessContextValue {\r\n policy: TracelessPolicy;\r\n}\r\n\r\nconst _defaultPolicy: TracelessPolicy = {\r\n cookiesAllowed: true,\r\n localStorageAllowed: true,\r\n sessionStorageAllowed: true,\r\n};\r\n\r\n/** Props for the {@link NiceLoginForm} component. */\r\nexport interface NiceLoginFormProps {\r\n /** Fires on form submit. */\r\n onSubmit?: (credentials: { email: string; password: string; rememberMe: boolean }) => void;\r\n /** Whether a login request is in progress. */\r\n loading?: boolean;\r\n /** External error message (e.g. \"Invalid credentials\"). */\r\n error?: string;\r\n /** Whether to show \"Remember me\" checkbox. */\r\n showRememberMe?: boolean;\r\n /** Whether to show \"Forgot password\" link. */\r\n showForgotPassword?: boolean;\r\n /** Fires when \"Forgot password\" is clicked. */\r\n onForgotPassword?: () => void;\r\n /** Whether to show \"Register\" link. */\r\n showRegisterLink?: boolean;\r\n /** Fires when \"Register\" is clicked. */\r\n onRegisterClick?: () => void;\r\n /** Title text. */\r\n title?: string;\r\n /** Submit button label. */\r\n submitLabel?: string;\r\n /** Logo element. */\r\n logo?: React.ReactNode;\r\n /** Additional content below the form (OAuth buttons, etc.). */\r\n footer?: React.ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n /** Email field label. */\r\n emailLabel?: string;\r\n /** Password field label. */\r\n passwordLabel?: string;\r\n /** Traceless policy - when provided and cookies not allowed, hides \"Remember me\" */\r\n tracelessPolicy?: TracelessPolicy;\r\n /** Message shown when \"Remember me\" is hidden due to privacy policy */\r\n privacyMessage?: string;\r\n}\r\n\r\n/**\r\n * {@link NiceLoginForm} — Login form with email, password, remember me,\r\n * forgot password link, and optional OAuth footer.\r\n *\r\n * **Traceless™ Integration**: When `tracelessPolicy` is provided and cookies\r\n * are not allowed, the \"Remember me\" checkbox is automatically hidden to\r\n * respect user privacy settings.\r\n */\r\nexport const NiceLoginForm = forwardRef<HTMLFormElement, NiceLoginFormProps>(\r\n (\r\n {\r\n onSubmit,\r\n loading = false,\r\n error,\r\n showRememberMe = true,\r\n showForgotPassword = true,\r\n onForgotPassword,\r\n showRegisterLink = true,\r\n onRegisterClick,\r\n title = 'Sign In',\r\n submitLabel = 'Sign In',\r\n logo,\r\n footer,\r\n className,\r\n style,\r\n emailLabel = 'Email',\r\n passwordLabel = 'Password',\r\n tracelessPolicy,\r\n privacyMessage,\r\n },\r\n ref,\r\n ) => {\r\n const [email, setEmail] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [rememberMe, setRememberMe] = useState(false);\r\n\r\n // Determine if \"Remember me\" can be shown based on Traceless policy\r\n const canShowRememberMe = useMemo(() => {\r\n if (!showRememberMe) {\r\n return false;\r\n }\r\n // If Traceless policy is provided and cookies aren't allowed, hide \"Remember me\"\r\n if (tracelessPolicy && !tracelessPolicy.cookiesAllowed) {\r\n return false;\r\n }\r\n return true;\r\n }, [showRememberMe, tracelessPolicy]);\r\n\r\n const handleSubmit = useCallback(\r\n (e: React.FormEvent) => {\r\n e.preventDefault();\r\n // If cookies aren't allowed, always submit with rememberMe=false\r\n const effectiveRememberMe = tracelessPolicy?.cookiesAllowed === false ? false : rememberMe;\r\n onSubmit?.({ email, password, rememberMe: effectiveRememberMe });\r\n },\r\n [email, password, rememberMe, onSubmit, tracelessPolicy],\r\n );\r\n\r\n return (\r\n <form\r\n ref={ref}\r\n className={`nice-login-form${className ? ` ${className}` : ''}`}\r\n style={style}\r\n onSubmit={handleSubmit}\r\n noValidate\r\n >\r\n {logo && <div className=\"nice-login-form__logo\">{logo}</div>}\r\n <h2 className=\"nice-login-form__title\">{title}</h2>\r\n\r\n {error && (\r\n <div className=\"nice-login-form__error\" role=\"alert\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div className=\"nice-login-form__field\">\r\n <label htmlFor=\"nice-login-email\">{emailLabel}</label>\r\n <input\r\n id=\"nice-login-email\"\r\n className=\"nice-input\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n autoComplete=\"email\"\r\n required\r\n disabled={loading}\r\n />\r\n </div>\r\n\r\n <div className=\"nice-login-form__field\">\r\n <label htmlFor=\"nice-login-password\">{passwordLabel}</label>\r\n <input\r\n id=\"nice-login-password\"\r\n className=\"nice-input\"\r\n type=\"password\"\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n autoComplete=\"current-password\"\r\n required\r\n disabled={loading}\r\n />\r\n </div>\r\n\r\n <div className=\"nice-login-form__options\">\r\n {canShowRememberMe && (\r\n <label className=\"nice-login-form__remember\">\r\n <input\r\n type=\"checkbox\"\r\n checked={rememberMe}\r\n onChange={(e) => setRememberMe(e.target.checked)}\r\n disabled={loading}\r\n />\r\n <span>Remember me</span>\r\n </label>\r\n )}\r\n {!canShowRememberMe && showRememberMe && privacyMessage && (\r\n <span className=\"nice-login-form__privacy-notice\">{privacyMessage}</span>\r\n )}\r\n {showForgotPassword && (\r\n <button\r\n type=\"button\"\r\n className=\"nice-login-form__forgot\"\r\n onClick={onForgotPassword}\r\n disabled={loading}\r\n >\r\n Forgot password?\r\n </button>\r\n )}\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n className=\"nice-btn nice-btn--primary nice-login-form__submit\"\r\n disabled={loading || !email || !password}\r\n >\r\n {loading ? '…' : submitLabel}\r\n </button>\r\n\r\n {showRegisterLink && (\r\n <div className=\"nice-login-form__register\">\r\n <span>Don't have an account? </span>\r\n <button type=\"button\" onClick={onRegisterClick} disabled={loading}>\r\n Register\r\n </button>\r\n </div>\r\n )}\r\n\r\n {footer && <div className=\"nice-login-form__footer\">{footer}</div>}\r\n </form>\r\n );\r\n },\r\n);\r\n\r\nNiceLoginForm.displayName = 'NiceLoginForm';\r\n","import React, { forwardRef, useMemo as _useMemo } from 'react';\r\n\r\n/** Password strength level (0 = very weak, 4 = very strong). */\r\nexport type PasswordStrengthLevel = 0 | 1 | 2 | 3 | 4;\r\n\r\n/** Props for the {@link NicePasswordStrength} component. */\r\nexport interface NicePasswordStrengthProps {\r\n /** The password to evaluate. */\r\n password: string;\r\n /** Override calculated strength. */\r\n strength?: PasswordStrengthLevel;\r\n /** Whether to show text labels. */\r\n showLabel?: boolean;\r\n /** Custom labels for each level. */\r\n labels?: Record<PasswordStrengthLevel, string>;\r\n className?: string;\r\n}\r\n\r\nconst DEFAULT_LABELS: Record<PasswordStrengthLevel, string> = {\r\n 0: 'Very weak',\r\n 1: 'Weak',\r\n 2: 'Fair',\r\n 3: 'Strong',\r\n 4: 'Very strong',\r\n};\r\n\r\nconst COLORS: Record<PasswordStrengthLevel, string> = {\r\n 0: '#d9534f',\r\n 1: '#f0ad4e',\r\n 2: '#5bc0de',\r\n 3: '#5cb85c',\r\n 4: '#2e7d32',\r\n};\r\n\r\n/** Calculate password strength score (0-4). */\r\nexport function calcPasswordStrength(password: string): PasswordStrengthLevel {\r\n if (!password) {\r\n return 0;\r\n }\r\n let score = 0;\r\n if (password.length >= 8) {\r\n score++;\r\n }\r\n if (password.length >= 12) {\r\n score++;\r\n }\r\n if (/[a-z]/.test(password) && /[A-Z]/.test(password)) {\r\n score++;\r\n }\r\n if (/\\d/.test(password)) {\r\n score++;\r\n }\r\n if (/[^a-zA-Z0-9]/.test(password)) {\r\n score++;\r\n }\r\n return Math.min(4, score) as PasswordStrengthLevel;\r\n}\r\n\r\n/**\r\n * {@link NicePasswordStrength} — Visual password strength indicator bar\r\n * with color-coded levels and text labels.\r\n */\r\nexport const NicePasswordStrength = forwardRef<HTMLDivElement, NicePasswordStrengthProps>(\r\n (\r\n { password, strength: overrideStrength, showLabel = true, labels = DEFAULT_LABELS, className },\r\n ref,\r\n ) => {\r\n const level = overrideStrength ?? calcPasswordStrength(password);\r\n const color = COLORS[level];\r\n const pct = ((level + 1) / 5) * 100;\r\n\r\n return (\r\n <div ref={ref} className={`nice-password-strength${className ? ` ${className}` : ''}`}>\r\n <div className=\"nice-password-strength__bar\">\r\n <div\r\n className=\"nice-password-strength__fill\"\r\n style={{ width: `${pct}%`, backgroundColor: color }}\r\n />\r\n </div>\r\n {showLabel && (\r\n <span className=\"nice-password-strength__label\" style={{ color }}>\r\n {labels[level]}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nNicePasswordStrength.displayName = 'NicePasswordStrength';\r\n","import React, { forwardRef, useState, useCallback } from 'react';\r\n\r\nimport { NicePasswordStrength, calcPasswordStrength } from './NicePasswordStrength';\r\n\r\n/** Registration data payload. */\r\nexport interface RegistrationData {\r\n firstName: string;\r\n lastName: string;\r\n email: string;\r\n password: string;\r\n acceptTerms: boolean;\r\n}\r\n\r\n/** Props for the {@link NiceRegistrationForm} component. */\r\nexport interface NiceRegistrationFormProps {\r\n /** Fires on form submit. */\r\n onSubmit?: (data: RegistrationData) => void;\r\n /** Whether a request is in progress. */\r\n loading?: boolean;\r\n /** External error message. */\r\n error?: string;\r\n /** Fires when \"Login\" link is clicked. */\r\n onLoginClick?: () => void;\r\n /** Whether to show password strength meter. */\r\n showPasswordStrength?: boolean;\r\n /** Minimum password strength level to allow submit (0-4). */\r\n minPasswordStrength?: number;\r\n /** Terms URL. */\r\n termsUrl?: string;\r\n /** Privacy URL. */\r\n privacyUrl?: string;\r\n /** Title. */\r\n title?: string;\r\n /** Logo element. */\r\n logo?: React.ReactNode;\r\n /** Footer content (OAuth buttons, etc.). */\r\n footer?: React.ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * {@link NiceRegistrationForm} — Registration form with name, email, password,\r\n * strength meter, terms acceptance, and optional OAuth footer.\r\n */\r\nexport const NiceRegistrationForm = forwardRef<HTMLFormElement, NiceRegistrationFormProps>(\r\n (\r\n {\r\n onSubmit,\r\n loading = false,\r\n error,\r\n onLoginClick,\r\n showPasswordStrength = true,\r\n minPasswordStrength = 2,\r\n termsUrl,\r\n privacyUrl,\r\n title = 'Create Account',\r\n logo,\r\n footer,\r\n className,\r\n style,\r\n },\r\n ref,\r\n ) => {\r\n const [firstName, setFirstName] = useState('');\r\n const [lastName, setLastName] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [acceptTerms, setAcceptTerms] = useState(false);\r\n\r\n const strength = calcPasswordStrength(password);\r\n const passwordsMatch = password === confirmPassword;\r\n const canSubmit =\r\n firstName &&\r\n email &&\r\n password &&\r\n passwordsMatch &&\r\n acceptTerms &&\r\n strength >= minPasswordStrength &&\r\n !loading;\r\n\r\n const handleSubmit = useCallback(\r\n (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (canSubmit) {\r\n onSubmit?.({ firstName, lastName, email, password, acceptTerms });\r\n }\r\n },\r\n [canSubmit, firstName, lastName, email, password, acceptTerms, onSubmit],\r\n );\r\n\r\n return (\r\n <form\r\n ref={ref}\r\n className={`nice-register-form${className ? ` ${className}` : ''}`}\r\n style={style}\r\n onSubmit={handleSubmit}\r\n noValidate\r\n >\r\n {logo && <div className=\"nice-register-form__logo\">{logo}</div>}\r\n <h2 className=\"nice-register-form__title\">{title}</h2>\r\n\r\n {error && (\r\n <div className=\"nice-register-form__error\" role=\"alert\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div className=\"nice-register-form__row\">\r\n <div className=\"nice-register-form__field\">\r\n <label htmlFor=\"nice-reg-first\">First name *</label>\r\n <input\r\n id=\"nice-reg-first\"\r\n className=\"nice-input\"\r\n type=\"text\"\r\n value={firstName}\r\n onChange={(e) => setFirstName(e.target.value)}\r\n required\r\n disabled={loading}\r\n autoComplete=\"given-name\"\r\n />\r\n </div>\r\n <div className=\"nice-register-form__field\">\r\n <label htmlFor=\"nice-reg-last\">Last name</label>\r\n <input\r\n id=\"nice-reg-last\"\r\n className=\"nice-input\"\r\n type=\"text\"\r\n value={lastName}\r\n onChange={(e) => setLastName(e.target.value)}\r\n disabled={loading}\r\n autoComplete=\"family-name\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"nice-register-form__field\">\r\n <label htmlFor=\"nice-reg-email\">Email *</label>\r\n <input\r\n id=\"nice-reg-email\"\r\n className=\"nice-input\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n disabled={loading}\r\n autoComplete=\"email\"\r\n />\r\n </div>\r\n\r\n <div className=\"nice-register-form__field\">\r\n <label htmlFor=\"nice-reg-pass\">Password *</label>\r\n <input\r\n id=\"nice-reg-pass\"\r\n className=\"nice-input\"\r\n type=\"password\"\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={loading}\r\n autoComplete=\"new-password\"\r\n />\r\n {showPasswordStrength && password.length > 0 && (\r\n <NicePasswordStrength password={password} />\r\n )}\r\n </div>\r\n\r\n <div className=\"nice-register-form__field\">\r\n <label htmlFor=\"nice-reg-confirm\">Confirm password *</label>\r\n <input\r\n id=\"nice-reg-confirm\"\r\n className=\"nice-input\"\r\n type=\"password\"\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={loading}\r\n autoComplete=\"new-password\"\r\n />\r\n {confirmPassword && !passwordsMatch && (\r\n <span className=\"nice-error-text\">Passwords do not match</span>\r\n )}\r\n </div>\r\n\r\n <label className=\"nice-register-form__terms\">\r\n <input\r\n type=\"checkbox\"\r\n checked={acceptTerms}\r\n onChange={(e) => setAcceptTerms(e.target.checked)}\r\n disabled={loading}\r\n />\r\n <span>\r\n I accept the{' '}\r\n {termsUrl ? (\r\n <a href={termsUrl} target=\"_blank\" rel=\"noopener noreferrer\">\r\n Terms\r\n </a>\r\n ) : (\r\n 'Terms'\r\n )}\r\n {privacyUrl && (\r\n <>\r\n {' '}\r\n and{' '}\r\n <a href={privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\">\r\n Privacy Policy\r\n </a>\r\n </>\r\n )}\r\n {' *'}\r\n </span>\r\n </label>\r\n\r\n <button\r\n type=\"submit\"\r\n className=\"nice-btn nice-btn--primary nice-register-form__submit\"\r\n disabled={!canSubmit}\r\n >\r\n {loading ? '…' : 'Register'}\r\n </button>\r\n\r\n {onLoginClick && (\r\n <div className=\"nice-register-form__login\">\r\n <span>Already have an account? </span>\r\n <button type=\"button\" onClick={onLoginClick}>\r\n Sign in\r\n </button>\r\n </div>\r\n )}\r\n\r\n {footer && <div className=\"nice-register-form__footer\">{footer}</div>}\r\n </form>\r\n );\r\n },\r\n);\r\n\r\nNiceRegistrationForm.displayName = 'NiceRegistrationForm';\r\n","import React, { forwardRef, useState, useCallback } from 'react';\r\n\r\nimport { NicePasswordStrength, calcPasswordStrength } from './NicePasswordStrength';\r\n\r\n/** Props for the {@link NiceChangePassword} component. */\r\nexport interface NiceChangePasswordProps {\r\n /** Whether the user must provide current password. */\r\n requireCurrentPassword?: boolean;\r\n /** Fires on submit. */\r\n onSubmit?: (data: { currentPassword?: string; newPassword: string }) => void;\r\n /** Whether a request is in progress. */\r\n loading?: boolean;\r\n /** External error message. */\r\n error?: string;\r\n /** Success message after password change. */\r\n success?: string;\r\n /** Minimum password strength to allow submit (0-4). */\r\n minPasswordStrength?: number;\r\n /** Title. */\r\n title?: string;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * {@link NiceChangePassword} — Change/reset password form with strength meter.\r\n */\r\nexport const NiceChangePassword = forwardRef<HTMLFormElement, NiceChangePasswordProps>(\r\n (\r\n {\r\n requireCurrentPassword = true,\r\n onSubmit,\r\n loading = false,\r\n error,\r\n success,\r\n minPasswordStrength = 2,\r\n title = 'Change Password',\r\n className,\r\n style,\r\n },\r\n ref,\r\n ) => {\r\n const [currentPassword, setCurrentPassword] = useState('');\r\n const [newPassword, setNewPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n\r\n const strength = calcPasswordStrength(newPassword);\r\n const passwordsMatch = newPassword === confirmPassword;\r\n const canSubmit =\r\n (!requireCurrentPassword || currentPassword.length > 0) &&\r\n newPassword.length > 0 &&\r\n passwordsMatch &&\r\n strength >= minPasswordStrength &&\r\n !loading;\r\n\r\n const handleSubmit = useCallback(\r\n (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (canSubmit) {\r\n onSubmit?.({\r\n currentPassword: requireCurrentPassword ? currentPassword : undefined,\r\n newPassword,\r\n });\r\n }\r\n },\r\n [canSubmit, currentPassword, newPassword, requireCurrentPassword, onSubmit],\r\n );\r\n\r\n return (\r\n <form\r\n ref={ref}\r\n className={`nice-change-password${className ? ` ${className}` : ''}`}\r\n style={style}\r\n onSubmit={handleSubmit}\r\n noValidate\r\n >\r\n <h3 className=\"nice-change-password__title\">{title}</h3>\r\n\r\n {error && (\r\n <div className=\"nice-change-password__error\" role=\"alert\">\r\n {error}\r\n </div>\r\n )}\r\n {success && (\r\n <div className=\"nice-change-password__success\" role=\"status\">\r\n {success}\r\n </div>\r\n )}\r\n\r\n {requireCurrentPassword && (\r\n <div className=\"nice-change-password__field\">\r\n <label htmlFor=\"nice-cp-current\">Current password</label>\r\n <input\r\n id=\"nice-cp-current\"\r\n className=\"nice-input\"\r\n type=\"password\"\r\n value={currentPassword}\r\n onChange={(e) => setCurrentPassword(e.target.value)}\r\n autoComplete=\"current-password\"\r\n disabled={loading}\r\n required\r\n />\r\n </div>\r\n )}\r\n\r\n <div className=\"nice-change-password__field\">\r\n <label htmlFor=\"nice-cp-new\">New password</label>\r\n <input\r\n id=\"nice-cp-new\"\r\n className=\"nice-input\"\r\n type=\"password\"\r\n value={newPassword}\r\n onChange={(e) => setNewPassword(e.target.value)}\r\n autoComplete=\"new-password\"\r\n disabled={loading}\r\n required\r\n />\r\n {newPassword.length > 0 && <NicePasswordStrength password={newPassword} />}\r\n </div>\r\n\r\n <div className=\"nice-change-password__field\">\r\n <label htmlFor=\"nice-cp-confirm\">Confirm new password</label>\r\n <input\r\n id=\"nice-cp-confirm\"\r\n className=\"nice-input\"\r\n type=\"password\"\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n autoComplete=\"new-password\"\r\n disabled={loading}\r\n required\r\n />\r\n {confirmPassword && !passwordsMatch && (\r\n <span className=\"nice-error-text\">Passwords do not match</span>\r\n )}\r\n </div>\r\n\r\n <button type=\"submit\" className=\"nice-btn nice-btn--primary\" disabled={!canSubmit}>\r\n {loading ? '…' : 'Change Password'}\r\n </button>\r\n </form>\r\n );\r\n },\r\n);\r\n\r\nNiceChangePassword.displayName = 'NiceChangePassword';\r\n","import React, { forwardRef, useState, useCallback } from 'react';\r\n\r\n/** Props for the {@link NiceTwoFaSetup} component. */\r\nexport interface NiceTwoFaSetupProps {\r\n /** The TOTP secret key (base32 encoded). */\r\n secret: string;\r\n /** QR code image URL or data URL for the authenticator app. */\r\n qrCodeUrl?: string;\r\n /** Issuer name for the TOTP URI. */\r\n issuer?: string;\r\n /** User's account name. */\r\n accountName?: string;\r\n /** Fires when user submits verification code. */\r\n onVerify?: (code: string) => void;\r\n /** Whether verification is in progress. */\r\n loading?: boolean;\r\n /** Error message (e.g. \"Invalid code\"). */\r\n error?: string;\r\n /** Fires on back/cancel. */\r\n onCancel?: () => void;\r\n /** Recovery codes to display after setup. */\r\n recoveryCodes?: string[];\r\n /** Step: 'setup' = show QR, 'verify' = enter code, 'recovery' = show codes. */\r\n step?: 'setup' | 'verify' | 'recovery';\r\n /** Fires when step changes. */\r\n onStepChange?: (step: 'setup' | 'verify' | 'recovery') => void;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * {@link NiceTwoFaSetup} — Two-factor authentication setup wizard with\r\n * QR code display, secret key, verification code input, and recovery codes.\r\n */\r\nexport const NiceTwoFaSetup = forwardRef<HTMLDivElement, NiceTwoFaSetupProps>(({\r\n secret, qrCodeUrl, issuer, accountName,\r\n onVerify, loading = false, error, onCancel,\r\n recoveryCodes, step = 'setup', onStepChange,\r\n className, style,\r\n}, ref) => {\r\n const [code, setCode] = useState('');\r\n const [showSecret, setShowSecret] = useState(false);\r\n const [copiedCodes, setCopiedCodes] = useState(false);\r\n\r\n const handleVerify = useCallback((e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (code.length >= 6) {\r\n onVerify?.(code);\r\n }\r\n }, [code, onVerify]);\r\n\r\n const totpUri = `otpauth://totp/${issuer ? `${issuer}:` : ''}${accountName ?? 'user'}?secret=${secret}${issuer ? `&issuer=${issuer}` : ''}&digits=6&period=30`;\r\n\r\n return (\r\n <div ref={ref} className={`nice-2fa-setup${className ? ` ${className}` : ''}`} style={style}>\r\n <h3 className=\"nice-2fa-setup__title\">Two-Factor Authentication</h3>\r\n\r\n {step === 'setup' && (\r\n <div className=\"nice-2fa-setup__step\">\r\n <p className=\"nice-2fa-setup__instruction\">\r\n Scan this QR code with your authenticator app (Google Authenticator, Authy, etc.):\r\n </p>\r\n\r\n {qrCodeUrl ? (\r\n <img src={qrCodeUrl} alt=\"2FA QR Code\" className=\"nice-2fa-setup__qr\" />\r\n ) : (\r\n <div className=\"nice-2fa-setup__qr-placeholder\">\r\n <span>QR Code</span>\r\n <code className=\"nice-2fa-setup__uri\">{totpUri}</code>\r\n </div>\r\n )}\r\n\r\n <div className=\"nice-2fa-setup__secret\">\r\n <span>Or enter manually: </span>\r\n {showSecret ? (\r\n <code className=\"nice-2fa-setup__secret-key\">{secret}</code>\r\n ) : (\r\n <button type=\"button\" onClick={() => setShowSecret(true)}>Show secret key</button>\r\n )}\r\n </div>\r\n\r\n <button type=\"button\" className=\"nice-btn nice-btn--primary\" onClick={() => onStepChange?.('verify')}>\r\n Next — Verify\r\n </button>\r\n </div>\r\n )}\r\n\r\n {step === 'verify' && (\r\n <form className=\"nice-2fa-setup__step\" onSubmit={handleVerify}>\r\n <p className=\"nice-2fa-setup__instruction\">\r\n Enter the 6-digit code from your authenticator app:\r\n </p>\r\n\r\n {error && <div className=\"nice-2fa-setup__error\" role=\"alert\">{error}</div>}\r\n\r\n <input\r\n className=\"nice-input nice-2fa-setup__code-input\"\r\n type=\"text\"\r\n inputMode=\"numeric\"\r\n maxLength={6}\r\n value={code}\r\n onChange={e => setCode(e.target.value.replace(/\\D/g, '').slice(0, 6))}\r\n placeholder=\"000000\"\r\n autoFocus\r\n disabled={loading}\r\n autoComplete=\"one-time-code\"\r\n />\r\n\r\n <div className=\"nice-2fa-setup__actions\">\r\n <button type=\"button\" className=\"nice-btn\" onClick={() => onStepChange?.('setup')}>Back</button>\r\n <button type=\"submit\" className=\"nice-btn nice-btn--primary\" disabled={loading || code.length < 6}>\r\n {loading ? '…' : 'Verify'}\r\n </button>\r\n </div>\r\n </form>\r\n )}\r\n\r\n {step === 'recovery' && recoveryCodes && (\r\n <div className=\"nice-2fa-setup__step\">\r\n <p className=\"nice-2fa-setup__instruction\">\r\n Save these recovery codes in a safe place. Each code can only be used once:\r\n </p>\r\n\r\n <div className=\"nice-2fa-setup__recovery-codes\">\r\n {recoveryCodes.map((rc, i) => (\r\n <code key={i} className=\"nice-2fa-setup__recovery-code\">{rc}</code>\r\n ))}\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n className=\"nice-btn\"\r\n onClick={() => {\r\n navigator.clipboard?.writeText(recoveryCodes.join('\\n'));\r\n setCopiedCodes(true);\r\n }}\r\n >\r\n {copiedCodes ? 'Copied!' : 'Copy all codes'}\r\n </button>\r\n\r\n {onCancel && <button type=\"button\" className=\"nice-btn nice-btn--primary\" onClick={onCancel}>Done</button>}\r\n </div>\r\n )}\r\n\r\n {onCancel && step !== 'recovery' && (\r\n <button type=\"button\" className=\"nice-2fa-setup__cancel\" onClick={onCancel}>Cancel</button>\r\n )}\r\n </div>\r\n );\r\n});\r\n\r\nNiceTwoFaSetup.displayName = 'NiceTwoFaSetup';\r\n","import React, { forwardRef } from 'react';\r\n\r\n/** Captcha provider type. */\r\nexport type CaptchaProvider = 'custom' | 'recaptcha' | 'hcaptcha' | 'turnstile';\r\n\r\n/** Props for the {@link NiceCaptcha} component. */\r\nexport interface NiceCaptchaProps {\r\n /** Captcha provider. */\r\n provider?: CaptchaProvider;\r\n /** Site key for the captcha provider. */\r\n siteKey?: string;\r\n /** Fires when captcha is verified with a token. */\r\n onVerify?: (token: string) => void;\r\n /** Fires when captcha expires. */\r\n onExpire?: () => void;\r\n /** Fires on captcha error. */\r\n onError?: (error: unknown) => void;\r\n /** Theme. */\r\n theme?: 'light' | 'dark';\r\n /** Size. */\r\n size?: 'normal' | 'compact' | 'invisible';\r\n /** Custom render for provider='custom'. */\r\n customRender?: React.ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * {@link NiceCaptcha} — Pluggable captcha widget shell.\r\n * For production use, inject the actual captcha SDK via `customRender` or\r\n * integrate the provider script externally. This component provides a\r\n * consistent wrapper API.\r\n */\r\nexport const NiceCaptcha = forwardRef<HTMLDivElement, NiceCaptchaProps>(\r\n (\r\n {\r\n provider = 'custom',\r\n siteKey,\r\n onVerify: _onVerify,\r\n onExpire: _onExpire,\r\n onError: _onError,\r\n theme = 'light',\r\n size = 'normal',\r\n customRender,\r\n className,\r\n style,\r\n },\r\n ref,\r\n ) => {\r\n if (provider === 'custom' && customRender) {\r\n return (\r\n <div\r\n ref={ref}\r\n className={`nice-captcha nice-captcha--custom${className ? ` ${className}` : ''}`}\r\n style={style}\r\n >\r\n {customRender}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={`nice-captcha nice-captcha--${provider} nice-captcha--${theme}${size === 'compact' ? ' nice-captcha--compact' : ''}${className ? ` ${className}` : ''}`}\r\n style={style}\r\n data-sitekey={siteKey}\r\n data-theme={theme}\r\n data-size={size}\r\n >\r\n <div className=\"nice-captcha__placeholder\">\r\n <span>🔒 Captcha ({provider})</span>\r\n <p>Load the {provider} SDK to activate verification.</p>\r\n </div>\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nNiceCaptcha.displayName = 'NiceCaptcha';\r\n","import React, { forwardRef } from 'react';\r\n\r\n/** OAuth provider definition. */\r\nexport interface OAuthProvider {\r\n /** Unique provider id. */\r\n id: string;\r\n /** Display label. */\r\n label: string;\r\n /** Icon (emoji, SVG element, or URL). */\r\n icon?: React.ReactNode;\r\n /** Brand color for the button. */\r\n color?: string;\r\n /** Text color. */\r\n textColor?: string;\r\n}\r\n\r\n/** Props for the {@link NiceOAuthButtons} component. */\r\nexport interface NiceOAuthButtonsProps {\r\n /** Providers to display. */\r\n providers?: OAuthProvider[];\r\n /** Fires when a provider button is clicked. */\r\n onProviderClick?: (providerId: string) => void;\r\n /** Whether buttons are disabled. */\r\n disabled?: boolean;\r\n /** Loading provider id (shows spinner on that button). */\r\n loadingProvider?: string;\r\n /** Layout direction. */\r\n direction?: 'horizontal' | 'vertical';\r\n /** Separator text (e.g. \"or continue with\"). */\r\n separatorText?: string;\r\n /** Whether to show separator above buttons. */\r\n showSeparator?: boolean;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nconst DEFAULT_PROVIDERS: OAuthProvider[] = [\r\n { id: 'google', label: 'Google', icon: '🔵', color: '#4285f4', textColor: '#fff' },\r\n { id: 'microsoft', label: 'Microsoft', icon: '🟦', color: '#00a4ef', textColor: '#fff' },\r\n { id: 'discord', label: 'Discord', icon: '💬', color: '#5865f2', textColor: '#fff' },\r\n { id: 'spotify', label: 'Spotify', icon: '🎵', color: '#1db954', textColor: '#fff' },\r\n { id: 'github', label: 'GitHub', icon: '🐙', color: '#24292e', textColor: '#fff' },\r\n];\r\n\r\n/**\r\n * {@link NiceOAuthButtons} — OAuth login/registration buttons for popular providers.\r\n */\r\nexport const NiceOAuthButtons = forwardRef<HTMLDivElement, NiceOAuthButtonsProps>(({\r\n providers = DEFAULT_PROVIDERS, onProviderClick, disabled = false,\r\n loadingProvider, direction = 'vertical', separatorText = 'or continue with',\r\n showSeparator = true, className, style,\r\n}, ref) => (\r\n <div\r\n ref={ref}\r\n className={`nice-oauth nice-oauth--${direction}${className ? ` ${className}` : ''}`}\r\n style={style}\r\n >\r\n {showSeparator && (\r\n <div className=\"nice-oauth__separator\">\r\n <hr /><span>{separatorText}</span><hr />\r\n </div>\r\n )}\r\n\r\n <div className=\"nice-oauth__buttons\">\r\n {providers.map(provider => (\r\n <button\r\n key={provider.id}\r\n type=\"button\"\r\n className={`nice-oauth__btn${loadingProvider === provider.id ? ' nice-oauth__btn--loading' : ''}`}\r\n style={{ backgroundColor: provider.color, color: provider.textColor }}\r\n onClick={() => onProviderClick?.(provider.id)}\r\n disabled={disabled || !!loadingProvider}\r\n >\r\n {provider.icon && <span className=\"nice-oauth__btn-icon\">{provider.icon}</span>}\r\n <span className=\"nice-oauth__btn-label\">\r\n {loadingProvider === provider.id ? '…' : provider.label}\r\n </span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n));\r\n\r\nNiceOAuthButtons.displayName = 'NiceOAuthButtons';\r\n","import React, { useState, forwardRef, useCallback } from 'react';\r\n\r\n// ── Types ──────────────────────────────────────────────────\r\n\r\n/** API token entry. */\r\nexport interface ApiToken {\r\n id: string;\r\n name: string;\r\n prefix: string;\r\n createdAt: string;\r\n expiresAt?: string;\r\n lastUsedAt?: string;\r\n scopes?: string[];\r\n}\r\n\r\n/** Props for {@link NiceTokenManagement}. */\r\nexport interface NiceTokenManagementProps {\r\n /** Existing tokens. */\r\n tokens: ApiToken[];\r\n /** Called to create a new token. Should return the full token string (only shown once). */\r\n onCreate?: (name: string, scopes: string[], expiresInDays?: number) => Promise<string>;\r\n /** Called to revoke a token. */\r\n onRevoke?: (tokenId: string) => Promise<void>;\r\n /** Available scopes for new tokens. */\r\n availableScopes?: string[];\r\n /** Maximum number of tokens allowed. */\r\n maxTokens?: number;\r\n /** Title. */\r\n title?: string;\r\n /** CSS class name. */\r\n className?: string;\r\n /** Inline styles. */\r\n style?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * {@link NiceTokenManagement} — API token management UI.\r\n *\r\n * Create, view, and revoke personal API tokens. New token values are shown\r\n * once after creation. Supports scopes and expiration.\r\n */\r\nexport const NiceTokenManagement = forwardRef<HTMLDivElement, NiceTokenManagementProps>(\r\n function NiceTokenManagement(props, ref) {\r\n const {\r\n tokens,\r\n onCreate,\r\n onRevoke,\r\n availableScopes = [],\r\n maxTokens = 10,\r\n title = 'API Tokens',\r\n className,\r\n style,\r\n } = props;\r\n\r\n const [showCreate, setShowCreate] = useState(false);\r\n const [newName, setNewName] = useState('');\r\n const [selectedScopes, setSelectedScopes] = useState<string[]>([]);\r\n const [expDays, setExpDays] = useState('90');\r\n const [newTokenValue, setNewTokenValue] = useState<string | null>(null);\r\n const [loading, setLoading] = useState(false);\r\n const [revoking, setRevoking] = useState<string | null>(null);\r\n\r\n const handleCreate = useCallback(async () => {\r\n if (!onCreate || !newName.trim()) {\r\n return;\r\n }\r\n setLoading(true);\r\n try {\r\n const days = expDays ? parseInt(expDays, 10) : undefined;\r\n const tokenStr = await onCreate(newName.trim(), selectedScopes, days);\r\n setNewTokenValue(tokenStr);\r\n setNewName('');\r\n setSelectedScopes([]);\r\n setShowCreate(false);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [onCreate, newName, selectedScopes, expDays]);\r\n\r\n const handleRevoke = useCallback(\r\n async (id: string) => {\r\n if (!onRevoke) {\r\n return;\r\n }\r\n setRevoking(id);\r\n try {\r\n await onRevoke(id);\r\n } finally {\r\n setRevoking(null);\r\n }\r\n },\r\n [onRevoke],\r\n );\r\n\r\n const toggleScope = (scope: string) => {\r\n setSelectedScopes((prev) =>\r\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\r\n );\r\n };\r\n\r\n const canCreate = tokens.length < maxTokens;\r\n\r\n return (\r\n <div ref={ref} className={`nice-token-management ${className ?? ''}`} style={style}>\r\n <div className=\"nice-token-management__header\">\r\n <h3>{title}</h3>\r\n {canCreate && (\r\n <button\r\n className=\"nice-token-management__new-btn\"\r\n onClick={() => setShowCreate(true)}\r\n disabled={showCreate}\r\n >\r\n + New Token\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* ── Reveal banner ── */}\r\n {newTokenValue && (\r\n <div className=\"nice-token-management__reveal\">\r\n <p>\r\n <strong>New token created!</strong> Copy it now — it won't be shown again.\r\n </p>\r\n <code className=\"nice-token-management__token-value\">{newTokenValue}</code>\r\n <button onClick={() => setNewTokenValue(null)}>Dismiss</button>\r\n </div>\r\n )}\r\n\r\n {/* ── Create form ── */}\r\n {showCreate && (\r\n <div className=\"nice-token-management__create-form\">\r\n <label>\r\n Name\r\n <input\r\n type=\"text\"\r\n value={newName}\r\n onChange={(e) => setNewName(e.target.value)}\r\n placeholder=\"My API token\"\r\n maxLength={64}\r\n />\r\n </label>\r\n\r\n {availableScopes.length > 0 && (\r\n <fieldset>\r\n <legend>Scopes</legend>\r\n {availableScopes.map((scope) => (\r\n <label key={scope} className=\"nice-token-management__scope\">\r\n <input\r\n type=\"checkbox\"\r\n checked={selectedScopes.includes(scope)}\r\n onChange={() => toggleScope(scope)}\r\n />\r\n {scope}\r\n </label>\r\n ))}\r\n </fieldset>\r\n )}\r\n\r\n <label>\r\n Expires in (days)\r\n <input\r\n type=\"number\"\r\n value={expDays}\r\n onChange={(e) => setExpDays(e.target.value)}\r\n min={1}\r\n max={365}\r\n />\r\n </label>\r\n\r\n <div className=\"nice-token-management__create-actions\">\r\n <button onClick={handleCreate} disabled={loading || !newName.trim()}>\r\n {loading ? 'Creating…' : 'Create Token'}\r\n </button>\r\n <button onClick={() => setShowCreate(false)}>Cancel</button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* ── Token list ── */}\r\n {tokens.length === 0 ? (\r\n <p className=\"nice-token-management__empty\">No API tokens yet.</p>\r\n ) : (\r\n <table className=\"nice-token-management__table\">\r\n <thead>\r\n <tr>\r\n <th>Name</th>\r\n <th>Prefix</th>\r\n <th>Created</th>\r\n <th>Expires</th>\r\n <th>Last Used</th>\r\n <th>Scopes</th>\r\n <th />\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {tokens.map((t) => (\r\n <tr key={t.id}>\r\n <td>{t.name}</td>\r\n <td>\r\n <code>{t.prefix}…</code>\r\n </td>\r\n <td>{t.createdAt}</td>\r\n <td>{t.expiresAt ?? '—'}</td>\r\n <td>{t.lastUsedAt ?? 'Never'}</td>\r\n <td>{t.scopes?.join(', ') || '—'}</td>\r\n <td>\r\n <button\r\n className=\"nice-token-management__revoke-btn\"\r\n onClick={() => handleRevoke(t.id)}\r\n disabled={revoking === t.id}\r\n >\r\n {revoking === t.id ? 'Revoking…' : 'Revoke'}\r\n </button>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n"],"names":["useAuth","config","onLogin","onRefresh","onLogout","storageKey","persistAuth","state","setState","useState","stored","persist","useCallback","newState","prev","next","login","email","password","result","err","logout","refreshToken","_a","tokens","setAuth","user","hasRoles","roles","r","hasPermissions","permissions","p","clearError","NiceLoginForm","forwardRef","onSubmit","loading","error","showRememberMe","showForgotPassword","onForgotPassword","showRegisterLink","onRegisterClick","title","submitLabel","logo","footer","className","style","emailLabel","passwordLabel","tracelessPolicy","privacyMessage","ref","setEmail","setPassword","rememberMe","setRememberMe","canShowRememberMe","useMemo","handleSubmit","e","effectiveRememberMe","jsxs","jsx","DEFAULT_LABELS","COLORS","calcPasswordStrength","score","NicePasswordStrength","overrideStrength","showLabel","labels","level","color","pct","NiceRegistrationForm","onLoginClick","showPasswordStrength","minPasswordStrength","termsUrl","privacyUrl","firstName","setFirstName","lastName","setLastName","confirmPassword","setConfirmPassword","acceptTerms","setAcceptTerms","strength","passwordsMatch","canSubmit","Fragment","NiceChangePassword","requireCurrentPassword","success","currentPassword","setCurrentPassword","newPassword","setNewPassword","NiceTwoFaSetup","secret","qrCodeUrl","issuer","accountName","onVerify","onCancel","recoveryCodes","step","onStepChange","code","setCode","showSecret","setShowSecret","copiedCodes","setCopiedCodes","handleVerify","totpUri","rc","i","NiceCaptcha","provider","siteKey","_onVerify","_onExpire","_onError","theme","size","customRender","DEFAULT_PROVIDERS","NiceOAuthButtons","providers","onProviderClick","disabled","loadingProvider","direction","separatorText","showSeparator","NiceTokenManagement","props","onCreate","onRevoke","availableScopes","maxTokens","showCreate","setShowCreate","newName","setNewName","selectedScopes","setSelectedScopes","expDays","setExpDays","newTokenValue","setNewTokenValue","setLoading","revoking","setRevoking","handleCreate","days","tokenStr","handleRevoke","id","toggleScope","scope","s","canCreate","t"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/useAuth.ts","../src/NiceLoginForm.tsx","../src/NicePasswordStrength.tsx","../src/NiceRegistrationForm.tsx","../src/NiceChangePassword.tsx","../src/NiceTwoFaSetup.tsx","../src/NiceCaptcha.tsx","../src/NiceOAuthButtons.tsx","../src/NiceTokenManagement.tsx"],"sourcesContent":["import { useState, useCallback, useMemo as _useMemo } from 'react';\r\n\r\n/** User info from auth. */\r\nexport interface AuthUser {\r\n id: string;\r\n email: string;\r\n name?: string;\r\n avatarUrl?: string;\r\n roles: string[];\r\n permissions: string[];\r\n}\r\n\r\n/** Auth tokens. */\r\nexport interface AuthTokens {\r\n accessToken: string;\r\n refreshToken?: string;\r\n expiresAt?: number;\r\n}\r\n\r\n/** Auth state. */\r\nexport interface AuthState {\r\n /** Whether the user is authenticated. */\r\n isAuthenticated: boolean;\r\n /** Current user info. */\r\n user: AuthUser | null;\r\n /** Tokens (for advanced usage). */\r\n tokens: AuthTokens | null;\r\n /** Whether a login/refresh is in progress. */\r\n loading: boolean;\r\n /** Last auth error. */\r\n error: string | null;\r\n}\r\n\r\n/** Auth actions returned by useAuth. */\r\nexport interface AuthActions {\r\n /** Login with credentials. Returns success status. */\r\n login: (email: string, password: string) => Promise<boolean>;\r\n /** Logout and clear tokens. */\r\n logout: () => void;\r\n /** Refresh the access token. */\r\n refreshToken: () => Promise<boolean>;\r\n /** Set auth state from external source (e.g. SSO callback). */\r\n setAuth: (user: AuthUser, tokens: AuthTokens) => void;\r\n /** Check if user has all specified roles. */\r\n hasRoles: (...roles: string[]) => boolean;\r\n /** Check if user has all specified permissions. */\r\n hasPermissions: (...permissions: string[]) => boolean;\r\n /** Clear error. */\r\n clearError: () => void;\r\n}\r\n\r\n/** Configuration for useAuth. */\r\nexport interface UseAuthConfig {\r\n /** Login endpoint. */\r\n loginUrl?: string;\r\n /** Refresh endpoint. */\r\n refreshUrl?: string;\r\n /** Logout endpoint. */\r\n logoutUrl?: string;\r\n /** Custom login handler (overrides loginUrl). */\r\n onLogin?: (email: string, password: string) => Promise<{ user: AuthUser; tokens: AuthTokens }>;\r\n /** Custom refresh handler (overrides refreshUrl). */\r\n onRefresh?: (refreshToken: string) => Promise<AuthTokens>;\r\n /** Custom logout handler. */\r\n onLogout?: () => void | Promise<void>;\r\n /** Storage key for persisting auth state. */\r\n storageKey?: string;\r\n /** Whether to persist in localStorage. */\r\n persistAuth?: boolean;\r\n}\r\n\r\n/**\r\n * {@link useAuth} — Auth state management hook with JWT, roles, refresh token, and logout.\r\n *\r\n * Usage:\r\n * ```tsx\r\n * const { isAuthenticated, user, login, logout, hasRoles } = useAuth({\r\n * onLogin: async (email, password) => {\r\n * const res = await api.login(email, password);\r\n * return { user: res.user, tokens: { accessToken: res.token } };\r\n * }\r\n * });\r\n * ```\r\n */\r\nexport function useAuth(config: UseAuthConfig = {}): AuthState & AuthActions {\r\n const { onLogin, onRefresh, onLogout, storageKey = 'nice_auth', persistAuth = false } = config;\r\n\r\n const [state, setState] = useState<AuthState>(() => {\r\n if (persistAuth && typeof window !== 'undefined') {\r\n try {\r\n const stored = localStorage.getItem(storageKey);\r\n if (stored) {\r\n const parsed = JSON.parse(stored);\r\n return { ...parsed, loading: false, error: null };\r\n }\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n return { isAuthenticated: false, user: null, tokens: null, loading: false, error: null };\r\n });\r\n\r\n const persist = useCallback(\r\n (newState: Partial<AuthState>) => {\r\n setState((prev) => {\r\n const next = { ...prev, ...newState };\r\n if (persistAuth && typeof window !== 'undefined') {\r\n if (next.isAuthenticated) {\r\n // Security: only persist non-sensitive data (user info).\r\n // Tokens are kept in-memory only to prevent XSS-based token theft.\r\n localStorage.setItem(\r\n storageKey,\r\n JSON.stringify({ isAuthenticated: true, user: next.user }),\r\n );\r\n } else {\r\n localStorage.removeItem(storageKey);\r\n }\r\n }\r\n return next;\r\n });\r\n },\r\n [persistAuth, storageKey],\r\n );\r\n\r\n const login = useCallback(\r\n async (email: string, password: string): Promise<boolean> => {\r\n persist({ loading: true, error: null });\r\n try {\r\n if (onLogin) {\r\n const result = await onLogin(email, password);\r\n persist({\r\n isAuthenticated: true,\r\n user: result.user,\r\n tokens: result.tokens,\r\n loading: false,\r\n });\r\n return true;\r\n }\r\n persist({ loading: false, error: 'No login handler configured' });\r\n return false;\r\n } catch (err: unknown) {\r\n persist({\r\n loading: false,\r\n error: (err as { message?: string })?.message ?? 'Login failed',\r\n });\r\n return false;\r\n }\r\n },\r\n [onLogin, persist],\r\n );\r\n\r\n const logout = useCallback(() => {\r\n onLogout?.();\r\n persist({ isAuthenticated: false, user: null, tokens: null, loading: false, error: null });\r\n }, [onLogout, persist]);\r\n\r\n const refreshToken = useCallback(async (): Promise<boolean> => {\r\n if (!state.tokens?.refreshToken || !onRefresh) {\r\n return false;\r\n }\r\n try {\r\n const tokens = await onRefresh(state.tokens.refreshToken);\r\n persist({ tokens });\r\n return true;\r\n } catch {\r\n logout();\r\n return false;\r\n }\r\n }, [state.tokens, onRefresh, persist, logout]);\r\n\r\n const setAuth = useCallback(\r\n (user: AuthUser, tokens: AuthTokens) => {\r\n persist({ isAuthenticated: true, user, tokens, loading: false, error: null });\r\n },\r\n [persist],\r\n );\r\n\r\n const hasRoles = useCallback(\r\n (...roles: string[]) => {\r\n if (!state.user) {\r\n return false;\r\n }\r\n return roles.every((r) => state.user!.roles.includes(r));\r\n },\r\n [state.user],\r\n );\r\n\r\n const hasPermissions = useCallback(\r\n (...permissions: string[]) => {\r\n if (!state.user) {\r\n return false;\r\n }\r\n return permissions.every((p) => state.user!.permissions.includes(p));\r\n },\r\n [state.user],\r\n );\r\n\r\n const clearError = useCallback(() => {\r\n persist({ error: null });\r\n }, [persist]);\r\n\r\n return {\r\n ...state,\r\n login,\r\n logout,\r\n refreshToken,\r\n setAuth,\r\n hasRoles,\r\n hasPermissions,\r\n clearError,\r\n };\r\n}\r\n","import React, { forwardRef, useState, useCallback, useMemo } from 'react';\r\n\r\n// Traceless types (inline to avoid cross-package dependency)\r\ninterface TracelessPolicy {\r\n cookiesAllowed: boolean;\r\n localStorageAllowed: boolean;\r\n sessionStorageAllowed: boolean;\r\n}\r\n\r\ninterface _TracelessContextValue {\r\n policy: TracelessPolicy;\r\n}\r\n\r\nconst _defaultPolicy: TracelessPolicy = {\r\n cookiesAllowed: true,\r\n localStorageAllowed: true,\r\n sessionStorageAllowed: true,\r\n};\r\n\r\n/** Props for the {@link NiceLoginForm} component. */\r\nexport interface NiceLoginFormProps {\r\n /** Fires on form submit. */\r\n onSubmit?: (credentials: { email: string; password: string; rememberMe: boolean }) => void;\r\n /** Whether a login request is in progress. */\r\n loading?: boolean;\r\n /** External error message (e.g. \"Invalid credentials\"). */\r\n error?: string;\r\n /** Whether to show \"Remember me\" checkbox. */\r\n showRememberMe?: boolean;\r\n /** Whether to show \"Forgot password\" link. */\r\n showForgotPassword?: boolean;\r\n /** Fires when \"Forgot password\" is clicked. */\r\n onForgotPassword?: () => void;\r\n /** Whether to show \"Register\" link. */\r\n showRegisterLink?: boolean;\r\n /** Fires when \"Register\" is clicked. */\r\n onRegisterClick?: () => void;\r\n /** Title text. */\r\n title?: string;\r\n /** Submit button label. */\r\n submitLabel?: string;\r\n /** Logo element. */\r\n logo?: React.ReactNode;\r\n /** Additional content below the form (OAuth buttons, etc.). */\r\n footer?: React.ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n /** Email field label. */\r\n emailLabel?: string;\r\n /** Password field label. */\r\n passwordLabel?: string;\r\n /** Traceless policy - when provided and cookies not allowed, hides \"Remember me\" */\r\n tracelessPolicy?: TracelessPolicy;\r\n /** Message shown when \"Remember me\" is hidden due to privacy policy */\r\n privacyMessage?: string;\r\n}\r\n\r\n/**\r\n * {@link NiceLoginForm} — Login form with email, password, remember me,\r\n * forgot password link, and optional OAuth footer.\r\n *\r\n * **Traceless™ Integration**: When `tracelessPolicy` is provided and cookies\r\n * are not allowed, the \"Remember me\" checkbox is automatically hidden to\r\n * respect user privacy settings.\r\n */\r\nexport const NiceLoginForm = forwardRef<HTMLFormElement, NiceLoginFormProps>(\r\n (\r\n {\r\n onSubmit,\r\n loading = false,\r\n error,\r\n showRememberMe = true,\r\n showForgotPassword = true,\r\n onForgotPassword,\r\n showRegisterLink = true,\r\n onRegisterClick,\r\n title = 'Sign In',\r\n submitLabel = 'Sign In',\r\n logo,\r\n footer,\r\n className,\r\n style,\r\n emailLabel = 'Email',\r\n passwordLabel = 'Password',\r\n tracelessPolicy,\r\n privacyMessage,\r\n },\r\n ref,\r\n ) => {\r\n const [email, setEmail] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [rememberMe, setRememberMe] = useState(false);\r\n\r\n // Determine if \"Remember me\" can be shown based on Traceless policy\r\n const canShowRememberMe = useMemo(() => {\r\n if (!showRememberMe) {\r\n return false;\r\n }\r\n // If Traceless policy is provided and cookies aren't allowed, hide \"Remember me\"\r\n if (tracelessPolicy && !tracelessPolicy.cookiesAllowed) {\r\n return false;\r\n }\r\n return true;\r\n }, [showRememberMe, tracelessPolicy]);\r\n\r\n const handleSubmit = useCallback(\r\n (e: React.FormEvent) => {\r\n e.preventDefault();\r\n // If cookies aren't allowed, always submit with rememberMe=false\r\n const effectiveRememberMe = tracelessPolicy?.cookiesAllowed === false ? false : rememberMe;\r\n onSubmit?.({ email, password, rememberMe: effectiveRememberMe });\r\n },\r\n [email, password, rememberMe, onSubmit, tracelessPolicy],\r\n );\r\n\r\n return (\r\n <form\r\n ref={ref}\r\n className={`nice-login-form${className ? ` ${className}` : ''}`}\r\n style={style}\r\n onSubmit={handleSubmit}\r\n noValidate\r\n >\r\n {logo && <div className=\"nice-login-form__logo\">{logo}</div>}\r\n <h2 className=\"nice-login-form__title\">{title}</h2>\r\n\r\n {error && (\r\n <div className=\"nice-login-form__error\" role=\"alert\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div className=\"nice-login-form__field\">\r\n <label htmlFor=\"nice-login-email\">{emailLabel}</label>\r\n <input\r\n id=\"nice-login-email\"\r\n className=\"nice-input\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n autoComplete=\"email\"\r\n required\r\n disabled={loading}\r\n />\r\n </div>\r\n\r\n <div className=\"nice-login-form__field\">\r\n <label htmlFor=\"nice-login-password\">{passwordLabel}</label>\r\n <input\r\n id=\"nice-login-password\"\r\n className=\"nice-input\"\r\n type=\"password\"\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n autoComplete=\"current-password\"\r\n required\r\n disabled={loading}\r\n />\r\n </div>\r\n\r\n <div className=\"nice-login-form__options\">\r\n {canShowRememberMe && (\r\n <label className=\"nice-login-form__remember\">\r\n <input\r\n type=\"checkbox\"\r\n checked={rememberMe}\r\n onChange={(e) => setRememberMe(e.target.checked)}\r\n disabled={loading}\r\n />\r\n <span>Remember me</span>\r\n </label>\r\n )}\r\n {!canShowRememberMe && showRememberMe && privacyMessage && (\r\n <span className=\"nice-login-form__privacy-notice\">{privacyMessage}</span>\r\n )}\r\n {showForgotPassword && (\r\n <button\r\n type=\"button\"\r\n className=\"nice-login-form__forgot\"\r\n onClick={onForgotPassword}\r\n disabled={loading}\r\n >\r\n Forgot password?\r\n </button>\r\n )}\r\n </div>\r\n\r\n <button\r\n type=\"submit\"\r\n className=\"nice-btn nice-btn--primary nice-login-form__submit\"\r\n disabled={loading || !email || !password}\r\n >\r\n {loading ? '…' : submitLabel}\r\n </button>\r\n\r\n {showRegisterLink && (\r\n <div className=\"nice-login-form__register\">\r\n <span>Don't have an account? </span>\r\n <button type=\"button\" onClick={onRegisterClick} disabled={loading}>\r\n Register\r\n </button>\r\n </div>\r\n )}\r\n\r\n {footer && <div className=\"nice-login-form__footer\">{footer}</div>}\r\n </form>\r\n );\r\n },\r\n);\r\n\r\nNiceLoginForm.displayName = 'NiceLoginForm';\r\n","import React, { forwardRef, useMemo as _useMemo } from 'react';\r\n\r\n/** Password strength level (0 = very weak, 4 = very strong). */\r\nexport type PasswordStrengthLevel = 0 | 1 | 2 | 3 | 4;\r\n\r\n/** Props for the {@link NicePasswordStrength} component. */\r\nexport interface NicePasswordStrengthProps {\r\n /** The password to evaluate. */\r\n password: string;\r\n /** Override calculated strength. */\r\n strength?: PasswordStrengthLevel;\r\n /** Whether to show text labels. */\r\n showLabel?: boolean;\r\n /** Custom labels for each level. */\r\n labels?: Record<PasswordStrengthLevel, string>;\r\n className?: string;\r\n}\r\n\r\nconst DEFAULT_LABELS: Record<PasswordStrengthLevel, string> = {\r\n 0: 'Very weak',\r\n 1: 'Weak',\r\n 2: 'Fair',\r\n 3: 'Strong',\r\n 4: 'Very strong',\r\n};\r\n\r\nconst COLORS: Record<PasswordStrengthLevel, string> = {\r\n 0: '#d9534f',\r\n 1: '#f0ad4e',\r\n 2: '#5bc0de',\r\n 3: '#5cb85c',\r\n 4: '#2e7d32',\r\n};\r\n\r\n/** Calculate password strength score (0-4). */\r\nexport function calcPasswordStrength(password: string): PasswordStrengthLevel {\r\n if (!password) {\r\n return 0;\r\n }\r\n let score = 0;\r\n if (password.length >= 8) {\r\n score++;\r\n }\r\n if (password.length >= 12) {\r\n score++;\r\n }\r\n if (/[a-z]/.test(password) && /[A-Z]/.test(password)) {\r\n score++;\r\n }\r\n if (/\\d/.test(password)) {\r\n score++;\r\n }\r\n if (/[^a-zA-Z0-9]/.test(password)) {\r\n score++;\r\n }\r\n return Math.min(4, score) as PasswordStrengthLevel;\r\n}\r\n\r\n/**\r\n * {@link NicePasswordStrength} — Visual password strength indicator bar\r\n * with color-coded levels and text labels.\r\n */\r\nexport const NicePasswordStrength = forwardRef<HTMLDivElement, NicePasswordStrengthProps>(\r\n (\r\n { password, strength: overrideStrength, showLabel = true, labels = DEFAULT_LABELS, className },\r\n ref,\r\n ) => {\r\n const level = overrideStrength ?? calcPasswordStrength(password);\r\n const color = COLORS[level];\r\n const pct = ((level + 1) / 5) * 100;\r\n\r\n return (\r\n <div ref={ref} className={`nice-password-strength${className ? ` ${className}` : ''}`}>\r\n <div className=\"nice-password-strength__bar\">\r\n <div\r\n className=\"nice-password-strength__fill\"\r\n style={{ width: `${pct}%`, backgroundColor: color }}\r\n />\r\n </div>\r\n {showLabel && (\r\n <span className=\"nice-password-strength__label\" style={{ color }}>\r\n {labels[level]}\r\n </span>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nNicePasswordStrength.displayName = 'NicePasswordStrength';\r\n","import React, { forwardRef, useState, useCallback } from 'react';\r\n\r\nimport { NicePasswordStrength, calcPasswordStrength } from './NicePasswordStrength';\r\n\r\n/** Registration data payload. */\r\nexport interface RegistrationData {\r\n firstName: string;\r\n lastName: string;\r\n email: string;\r\n password: string;\r\n acceptTerms: boolean;\r\n}\r\n\r\n/** Props for the {@link NiceRegistrationForm} component. */\r\nexport interface NiceRegistrationFormProps {\r\n /** Fires on form submit. */\r\n onSubmit?: (data: RegistrationData) => void;\r\n /** Whether a request is in progress. */\r\n loading?: boolean;\r\n /** External error message. */\r\n error?: string;\r\n /** Fires when \"Login\" link is clicked. */\r\n onLoginClick?: () => void;\r\n /** Whether to show password strength meter. */\r\n showPasswordStrength?: boolean;\r\n /** Minimum password strength level to allow submit (0-4). */\r\n minPasswordStrength?: number;\r\n /** Terms URL. */\r\n termsUrl?: string;\r\n /** Privacy URL. */\r\n privacyUrl?: string;\r\n /** Title. */\r\n title?: string;\r\n /** Logo element. */\r\n logo?: React.ReactNode;\r\n /** Footer content (OAuth buttons, etc.). */\r\n footer?: React.ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * {@link NiceRegistrationForm} — Registration form with name, email, password,\r\n * strength meter, terms acceptance, and optional OAuth footer.\r\n */\r\nexport const NiceRegistrationForm = forwardRef<HTMLFormElement, NiceRegistrationFormProps>(\r\n (\r\n {\r\n onSubmit,\r\n loading = false,\r\n error,\r\n onLoginClick,\r\n showPasswordStrength = true,\r\n minPasswordStrength = 2,\r\n termsUrl,\r\n privacyUrl,\r\n title = 'Create Account',\r\n logo,\r\n footer,\r\n className,\r\n style,\r\n },\r\n ref,\r\n ) => {\r\n const [firstName, setFirstName] = useState('');\r\n const [lastName, setLastName] = useState('');\r\n const [email, setEmail] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [acceptTerms, setAcceptTerms] = useState(false);\r\n\r\n const strength = calcPasswordStrength(password);\r\n const passwordsMatch = password === confirmPassword;\r\n const canSubmit =\r\n firstName &&\r\n email &&\r\n password &&\r\n passwordsMatch &&\r\n acceptTerms &&\r\n strength >= minPasswordStrength &&\r\n !loading;\r\n\r\n const handleSubmit = useCallback(\r\n (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (canSubmit) {\r\n onSubmit?.({ firstName, lastName, email, password, acceptTerms });\r\n }\r\n },\r\n [canSubmit, firstName, lastName, email, password, acceptTerms, onSubmit],\r\n );\r\n\r\n return (\r\n <form\r\n ref={ref}\r\n className={`nice-register-form${className ? ` ${className}` : ''}`}\r\n style={style}\r\n onSubmit={handleSubmit}\r\n noValidate\r\n >\r\n {logo && <div className=\"nice-register-form__logo\">{logo}</div>}\r\n <h2 className=\"nice-register-form__title\">{title}</h2>\r\n\r\n {error && (\r\n <div className=\"nice-register-form__error\" role=\"alert\">\r\n {error}\r\n </div>\r\n )}\r\n\r\n <div className=\"nice-register-form__row\">\r\n <div className=\"nice-register-form__field\">\r\n <label htmlFor=\"nice-reg-first\">First name *</label>\r\n <input\r\n id=\"nice-reg-first\"\r\n className=\"nice-input\"\r\n type=\"text\"\r\n value={firstName}\r\n onChange={(e) => setFirstName(e.target.value)}\r\n required\r\n disabled={loading}\r\n autoComplete=\"given-name\"\r\n />\r\n </div>\r\n <div className=\"nice-register-form__field\">\r\n <label htmlFor=\"nice-reg-last\">Last name</label>\r\n <input\r\n id=\"nice-reg-last\"\r\n className=\"nice-input\"\r\n type=\"text\"\r\n value={lastName}\r\n onChange={(e) => setLastName(e.target.value)}\r\n disabled={loading}\r\n autoComplete=\"family-name\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"nice-register-form__field\">\r\n <label htmlFor=\"nice-reg-email\">Email *</label>\r\n <input\r\n id=\"nice-reg-email\"\r\n className=\"nice-input\"\r\n type=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n required\r\n disabled={loading}\r\n autoComplete=\"email\"\r\n />\r\n </div>\r\n\r\n <div className=\"nice-register-form__field\">\r\n <label htmlFor=\"nice-reg-pass\">Password *</label>\r\n <input\r\n id=\"nice-reg-pass\"\r\n className=\"nice-input\"\r\n type=\"password\"\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n required\r\n disabled={loading}\r\n autoComplete=\"new-password\"\r\n />\r\n {showPasswordStrength && password.length > 0 && (\r\n <NicePasswordStrength password={password} />\r\n )}\r\n </div>\r\n\r\n <div className=\"nice-register-form__field\">\r\n <label htmlFor=\"nice-reg-confirm\">Confirm password *</label>\r\n <input\r\n id=\"nice-reg-confirm\"\r\n className=\"nice-input\"\r\n type=\"password\"\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n required\r\n disabled={loading}\r\n autoComplete=\"new-password\"\r\n />\r\n {confirmPassword && !passwordsMatch && (\r\n <span className=\"nice-error-text\">Passwords do not match</span>\r\n )}\r\n </div>\r\n\r\n <label className=\"nice-register-form__terms\">\r\n <input\r\n type=\"checkbox\"\r\n checked={acceptTerms}\r\n onChange={(e) => setAcceptTerms(e.target.checked)}\r\n disabled={loading}\r\n />\r\n <span>\r\n I accept the{' '}\r\n {termsUrl ? (\r\n <a href={termsUrl} target=\"_blank\" rel=\"noopener noreferrer\">\r\n Terms\r\n </a>\r\n ) : (\r\n 'Terms'\r\n )}\r\n {privacyUrl && (\r\n <>\r\n {' '}\r\n and{' '}\r\n <a href={privacyUrl} target=\"_blank\" rel=\"noopener noreferrer\">\r\n Privacy Policy\r\n </a>\r\n </>\r\n )}\r\n {' *'}\r\n </span>\r\n </label>\r\n\r\n <button\r\n type=\"submit\"\r\n className=\"nice-btn nice-btn--primary nice-register-form__submit\"\r\n disabled={!canSubmit}\r\n >\r\n {loading ? '…' : 'Register'}\r\n </button>\r\n\r\n {onLoginClick && (\r\n <div className=\"nice-register-form__login\">\r\n <span>Already have an account? </span>\r\n <button type=\"button\" onClick={onLoginClick}>\r\n Sign in\r\n </button>\r\n </div>\r\n )}\r\n\r\n {footer && <div className=\"nice-register-form__footer\">{footer}</div>}\r\n </form>\r\n );\r\n },\r\n);\r\n\r\nNiceRegistrationForm.displayName = 'NiceRegistrationForm';\r\n","import React, { forwardRef, useState, useCallback } from 'react';\r\n\r\nimport { NicePasswordStrength, calcPasswordStrength } from './NicePasswordStrength';\r\n\r\n/** Props for the {@link NiceChangePassword} component. */\r\nexport interface NiceChangePasswordProps {\r\n /** Whether the user must provide current password. */\r\n requireCurrentPassword?: boolean;\r\n /** Fires on submit. */\r\n onSubmit?: (data: { currentPassword?: string; newPassword: string }) => void;\r\n /** Whether a request is in progress. */\r\n loading?: boolean;\r\n /** External error message. */\r\n error?: string;\r\n /** Success message after password change. */\r\n success?: string;\r\n /** Minimum password strength to allow submit (0-4). */\r\n minPasswordStrength?: number;\r\n /** Title. */\r\n title?: string;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * {@link NiceChangePassword} — Change/reset password form with strength meter.\r\n */\r\nexport const NiceChangePassword = forwardRef<HTMLFormElement, NiceChangePasswordProps>(\r\n (\r\n {\r\n requireCurrentPassword = true,\r\n onSubmit,\r\n loading = false,\r\n error,\r\n success,\r\n minPasswordStrength = 2,\r\n title = 'Change Password',\r\n className,\r\n style,\r\n },\r\n ref,\r\n ) => {\r\n const [currentPassword, setCurrentPassword] = useState('');\r\n const [newPassword, setNewPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n\r\n const strength = calcPasswordStrength(newPassword);\r\n const passwordsMatch = newPassword === confirmPassword;\r\n const canSubmit =\r\n (!requireCurrentPassword || currentPassword.length > 0) &&\r\n newPassword.length > 0 &&\r\n passwordsMatch &&\r\n strength >= minPasswordStrength &&\r\n !loading;\r\n\r\n const handleSubmit = useCallback(\r\n (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (canSubmit) {\r\n onSubmit?.({\r\n currentPassword: requireCurrentPassword ? currentPassword : undefined,\r\n newPassword,\r\n });\r\n }\r\n },\r\n [canSubmit, currentPassword, newPassword, requireCurrentPassword, onSubmit],\r\n );\r\n\r\n return (\r\n <form\r\n ref={ref}\r\n className={`nice-change-password${className ? ` ${className}` : ''}`}\r\n style={style}\r\n onSubmit={handleSubmit}\r\n noValidate\r\n >\r\n <h3 className=\"nice-change-password__title\">{title}</h3>\r\n\r\n {error && (\r\n <div className=\"nice-change-password__error\" role=\"alert\">\r\n {error}\r\n </div>\r\n )}\r\n {success && (\r\n <div className=\"nice-change-password__success\" role=\"status\">\r\n {success}\r\n </div>\r\n )}\r\n\r\n {requireCurrentPassword && (\r\n <div className=\"nice-change-password__field\">\r\n <label htmlFor=\"nice-cp-current\">Current password</label>\r\n <input\r\n id=\"nice-cp-current\"\r\n className=\"nice-input\"\r\n type=\"password\"\r\n value={currentPassword}\r\n onChange={(e) => setCurrentPassword(e.target.value)}\r\n autoComplete=\"current-password\"\r\n disabled={loading}\r\n required\r\n />\r\n </div>\r\n )}\r\n\r\n <div className=\"nice-change-password__field\">\r\n <label htmlFor=\"nice-cp-new\">New password</label>\r\n <input\r\n id=\"nice-cp-new\"\r\n className=\"nice-input\"\r\n type=\"password\"\r\n value={newPassword}\r\n onChange={(e) => setNewPassword(e.target.value)}\r\n autoComplete=\"new-password\"\r\n disabled={loading}\r\n required\r\n />\r\n {newPassword.length > 0 && <NicePasswordStrength password={newPassword} />}\r\n </div>\r\n\r\n <div className=\"nice-change-password__field\">\r\n <label htmlFor=\"nice-cp-confirm\">Confirm new password</label>\r\n <input\r\n id=\"nice-cp-confirm\"\r\n className=\"nice-input\"\r\n type=\"password\"\r\n value={confirmPassword}\r\n onChange={(e) => setConfirmPassword(e.target.value)}\r\n autoComplete=\"new-password\"\r\n disabled={loading}\r\n required\r\n />\r\n {confirmPassword && !passwordsMatch && (\r\n <span className=\"nice-error-text\">Passwords do not match</span>\r\n )}\r\n </div>\r\n\r\n <button type=\"submit\" className=\"nice-btn nice-btn--primary\" disabled={!canSubmit}>\r\n {loading ? '…' : 'Change Password'}\r\n </button>\r\n </form>\r\n );\r\n },\r\n);\r\n\r\nNiceChangePassword.displayName = 'NiceChangePassword';\r\n","import React, { forwardRef, useState, useCallback } from 'react';\r\n\r\n/** Props for the {@link NiceTwoFaSetup} component. */\r\nexport interface NiceTwoFaSetupProps {\r\n /** The TOTP secret key (base32 encoded). */\r\n secret: string;\r\n /** QR code image URL or data URL for the authenticator app. */\r\n qrCodeUrl?: string;\r\n /** Issuer name for the TOTP URI. */\r\n issuer?: string;\r\n /** User's account name. */\r\n accountName?: string;\r\n /** Fires when user submits verification code. */\r\n onVerify?: (code: string) => void;\r\n /** Whether verification is in progress. */\r\n loading?: boolean;\r\n /** Error message (e.g. \"Invalid code\"). */\r\n error?: string;\r\n /** Fires on back/cancel. */\r\n onCancel?: () => void;\r\n /** Recovery codes to display after setup. */\r\n recoveryCodes?: string[];\r\n /** Step: 'setup' = show QR, 'verify' = enter code, 'recovery' = show codes. */\r\n step?: 'setup' | 'verify' | 'recovery';\r\n /** Fires when step changes. */\r\n onStepChange?: (step: 'setup' | 'verify' | 'recovery') => void;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * {@link NiceTwoFaSetup} — Two-factor authentication setup wizard with\r\n * QR code display, secret key, verification code input, and recovery codes.\r\n */\r\nexport const NiceTwoFaSetup = forwardRef<HTMLDivElement, NiceTwoFaSetupProps>(({\r\n secret, qrCodeUrl, issuer, accountName,\r\n onVerify, loading = false, error, onCancel,\r\n recoveryCodes, step = 'setup', onStepChange,\r\n className, style,\r\n}, ref) => {\r\n const [code, setCode] = useState('');\r\n const [showSecret, setShowSecret] = useState(false);\r\n const [copiedCodes, setCopiedCodes] = useState(false);\r\n\r\n const handleVerify = useCallback((e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (code.length >= 6) {\r\n onVerify?.(code);\r\n }\r\n }, [code, onVerify]);\r\n\r\n const totpUri = `otpauth://totp/${issuer ? `${issuer}:` : ''}${accountName ?? 'user'}?secret=${secret}${issuer ? `&issuer=${issuer}` : ''}&digits=6&period=30`;\r\n\r\n return (\r\n <div ref={ref} className={`nice-2fa-setup${className ? ` ${className}` : ''}`} style={style}>\r\n <h3 className=\"nice-2fa-setup__title\">Two-Factor Authentication</h3>\r\n\r\n {step === 'setup' && (\r\n <div className=\"nice-2fa-setup__step\">\r\n <p className=\"nice-2fa-setup__instruction\">\r\n Scan this QR code with your authenticator app (Google Authenticator, Authy, etc.):\r\n </p>\r\n\r\n {qrCodeUrl ? (\r\n <img src={qrCodeUrl} alt=\"2FA QR Code\" className=\"nice-2fa-setup__qr\" />\r\n ) : (\r\n <div className=\"nice-2fa-setup__qr-placeholder\">\r\n <span>QR Code</span>\r\n <code className=\"nice-2fa-setup__uri\">{totpUri}</code>\r\n </div>\r\n )}\r\n\r\n <div className=\"nice-2fa-setup__secret\">\r\n <span>Or enter manually: </span>\r\n {showSecret ? (\r\n <code className=\"nice-2fa-setup__secret-key\">{secret}</code>\r\n ) : (\r\n <button type=\"button\" onClick={() => setShowSecret(true)}>Show secret key</button>\r\n )}\r\n </div>\r\n\r\n <button type=\"button\" className=\"nice-btn nice-btn--primary\" onClick={() => onStepChange?.('verify')}>\r\n Next — Verify\r\n </button>\r\n </div>\r\n )}\r\n\r\n {step === 'verify' && (\r\n <form className=\"nice-2fa-setup__step\" onSubmit={handleVerify}>\r\n <p className=\"nice-2fa-setup__instruction\">\r\n Enter the 6-digit code from your authenticator app:\r\n </p>\r\n\r\n {error && <div className=\"nice-2fa-setup__error\" role=\"alert\">{error}</div>}\r\n\r\n <input\r\n className=\"nice-input nice-2fa-setup__code-input\"\r\n type=\"text\"\r\n inputMode=\"numeric\"\r\n maxLength={6}\r\n value={code}\r\n onChange={e => setCode(e.target.value.replace(/\\D/g, '').slice(0, 6))}\r\n placeholder=\"000000\"\r\n autoFocus\r\n disabled={loading}\r\n autoComplete=\"one-time-code\"\r\n />\r\n\r\n <div className=\"nice-2fa-setup__actions\">\r\n <button type=\"button\" className=\"nice-btn\" onClick={() => onStepChange?.('setup')}>Back</button>\r\n <button type=\"submit\" className=\"nice-btn nice-btn--primary\" disabled={loading || code.length < 6}>\r\n {loading ? '…' : 'Verify'}\r\n </button>\r\n </div>\r\n </form>\r\n )}\r\n\r\n {step === 'recovery' && recoveryCodes && (\r\n <div className=\"nice-2fa-setup__step\">\r\n <p className=\"nice-2fa-setup__instruction\">\r\n Save these recovery codes in a safe place. Each code can only be used once:\r\n </p>\r\n\r\n <div className=\"nice-2fa-setup__recovery-codes\">\r\n {recoveryCodes.map((rc, i) => (\r\n <code key={i} className=\"nice-2fa-setup__recovery-code\">{rc}</code>\r\n ))}\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n className=\"nice-btn\"\r\n onClick={() => {\r\n navigator.clipboard?.writeText(recoveryCodes.join('\\n'));\r\n setCopiedCodes(true);\r\n }}\r\n >\r\n {copiedCodes ? 'Copied!' : 'Copy all codes'}\r\n </button>\r\n\r\n {onCancel && <button type=\"button\" className=\"nice-btn nice-btn--primary\" onClick={onCancel}>Done</button>}\r\n </div>\r\n )}\r\n\r\n {onCancel && step !== 'recovery' && (\r\n <button type=\"button\" className=\"nice-2fa-setup__cancel\" onClick={onCancel}>Cancel</button>\r\n )}\r\n </div>\r\n );\r\n});\r\n\r\nNiceTwoFaSetup.displayName = 'NiceTwoFaSetup';\r\n","import React, {\r\n forwardRef,\r\n useCallback,\r\n useEffect,\r\n useImperativeHandle,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react';\r\n\r\nimport './NiceCaptcha.css';\r\n\r\n/** Captcha provider type (third-party SDK shell). */\r\nexport type CaptchaProvider = 'custom' | 'recaptcha' | 'hcaptcha' | 'turnstile';\r\n\r\n/** Built-in, self-contained challenge variant. */\r\nexport type CaptchaVariant = 'checkbox' | 'math' | 'text' | 'slider';\r\n\r\n/** Difficulty of a built-in challenge. */\r\nexport type CaptchaDifficulty = 'easy' | 'medium' | 'hard';\r\n\r\n/** Imperative handle exposed via `ref`. */\r\nexport interface NiceCaptchaHandle {\r\n /** Reset to the initial unsolved state with a fresh challenge. */\r\n reset: () => void;\r\n /** Generate a fresh challenge (also fires `onRefresh`). */\r\n refresh: () => void;\r\n /** The root DOM element, if mounted. */\r\n container: HTMLDivElement | null;\r\n}\r\n\r\n/** Props for the {@link NiceCaptcha} component. */\r\nexport interface NiceCaptchaProps {\r\n /**\r\n * Built-in challenge variant. When set, NiceCaptcha renders a self-contained\r\n * challenge instead of the third-party `provider` shell.\r\n */\r\n variant?: CaptchaVariant;\r\n /** Difficulty of the built-in challenge. @default 'medium' */\r\n difficulty?: CaptchaDifficulty;\r\n /** Whether to show the refresh button (built-in variants). @default true */\r\n refreshable?: boolean;\r\n /**\r\n * Optional async server-side verification hook. Receives the locally\r\n * generated token and resolves to `true` when the server accepts it.\r\n * NOTE: built-in challenges are a UX/deterrent layer only — real bot\r\n * protection must be enforced on the server. Use this hook to do so.\r\n */\r\n verifyToken?: (token: string) => Promise<boolean>;\r\n /** Time-to-live (ms) of a solved state; after it elapses `onExpire` fires and the challenge resets. */\r\n expiresMs?: number;\r\n /** Label for the checkbox variant. @default \"I'm not a robot\" */\r\n label?: string;\r\n /** Captcha provider (used when `variant` is not set). */\r\n provider?: CaptchaProvider;\r\n /** Site key for the captcha provider. */\r\n siteKey?: string;\r\n /** Fires when the captcha is verified with a token. */\r\n onVerify?: (token: string) => void;\r\n /** Fires when a solved captcha expires. */\r\n onExpire?: () => void;\r\n /** Fires on a verification error (e.g. `verifyToken` rejected). */\r\n onError?: (error: unknown) => void;\r\n /** Fires when the challenge is refreshed. */\r\n onRefresh?: () => void;\r\n /** Theme. @default 'light' */\r\n theme?: 'light' | 'dark';\r\n /** Size. @default 'normal' */\r\n size?: 'normal' | 'compact' | 'invisible';\r\n /** Custom render for provider='custom'. */\r\n customRender?: React.ReactNode;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\ntype CaptchaStatus = 'idle' | 'verifying' | 'verified' | 'error';\r\n\r\ntype Challenge =\r\n | { kind: 'checkbox' }\r\n | { kind: 'math'; prompt: string; answer: number }\r\n | { kind: 'text'; text: string }\r\n | { kind: 'slider'; target: number; tolerance: number };\r\n\r\nconst CHECKBOX_DELAY_MS = 500;\r\n\r\nfunction randInt(min: number, max: number): number {\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n}\r\n\r\nfunction makeNonce(): string {\r\n return `${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`;\r\n}\r\n\r\nfunction buildChallenge(variant: CaptchaVariant, difficulty: CaptchaDifficulty): Challenge {\r\n switch (variant) {\r\n case 'math': {\r\n const max = difficulty === 'easy' ? 5 : difficulty === 'hard' ? 20 : 10;\r\n const a = randInt(1, max);\r\n const b = randInt(1, max);\r\n const sub = difficulty !== 'easy' && a >= b && Math.random() < 0.5;\r\n const answer = sub ? a - b : a + b;\r\n const prompt = `${a} ${sub ? '−' : '+'} ${b}`;\r\n return { kind: 'math', prompt, answer };\r\n }\r\n case 'text': {\r\n const len = difficulty === 'easy' ? 4 : difficulty === 'hard' ? 7 : 5;\r\n // Exclude visually ambiguous characters (0/O, 1/I/L).\r\n const chars = 'ABCDEFGHJKMNPQRSTUVWXYZ23456789';\r\n let text = '';\r\n for (let i = 0; i < len; i++) {\r\n text += chars[randInt(0, chars.length - 1)];\r\n }\r\n return { kind: 'text', text };\r\n }\r\n case 'slider': {\r\n const target = randInt(70, 92);\r\n const tolerance = difficulty === 'easy' ? 8 : difficulty === 'hard' ? 2 : 4;\r\n return { kind: 'slider', target, tolerance };\r\n }\r\n case 'checkbox':\r\n default:\r\n return { kind: 'checkbox' };\r\n }\r\n}\r\n\r\n/** Draw distorted challenge text onto a canvas (no-op when canvas is unavailable, e.g. jsdom). */\r\nfunction drawTextChallenge(canvas: HTMLCanvasElement | null, text: string, dark: boolean): void {\r\n if (!canvas) {\r\n return;\r\n }\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) {\r\n return;\r\n }\r\n const w = canvas.width;\r\n const h = canvas.height;\r\n ctx.clearRect(0, 0, w, h);\r\n ctx.fillStyle = dark ? '#1a1a1a' : '#f3f4f6';\r\n ctx.fillRect(0, 0, w, h);\r\n\r\n // Noise lines.\r\n ctx.strokeStyle = dark ? 'rgba(255,255,255,0.18)' : 'rgba(0,0,0,0.18)';\r\n ctx.lineWidth = 1;\r\n for (let i = 0; i < 6; i++) {\r\n ctx.beginPath();\r\n ctx.moveTo(randInt(0, w), randInt(0, h));\r\n ctx.lineTo(randInt(0, w), randInt(0, h));\r\n ctx.stroke();\r\n }\r\n\r\n // Distorted characters.\r\n ctx.fillStyle = dark ? '#e5e7eb' : '#111827';\r\n ctx.textBaseline = 'middle';\r\n const step = w / (text.length + 1);\r\n for (let i = 0; i < text.length; i++) {\r\n const size = randInt(22, 30);\r\n ctx.save();\r\n ctx.translate(step * (i + 1), h / 2 + randInt(-4, 4));\r\n ctx.rotate((randInt(-22, 22) * Math.PI) / 180);\r\n ctx.font = `bold ${size}px monospace`;\r\n ctx.fillText(text[i], -size / 3, 0);\r\n ctx.restore();\r\n }\r\n}\r\n\r\n/**\r\n * {@link NiceCaptcha} — captcha widget with two modes:\r\n *\r\n * 1. **Built-in challenges** (set `variant`): self-contained `checkbox`, `math`,\r\n * `text` or `slider` challenges with refresh, difficulty levels, a11y and an\r\n * optional async server-verification hook (`verifyToken`).\r\n * 2. **Provider shell** (set `provider`): a consistent wrapper around reCAPTCHA,\r\n * hCaptcha or Turnstile — inject the actual SDK via `customRender` or load the\r\n * provider script externally.\r\n *\r\n * SECURITY: built-in challenges run client-side and are a UX/deterrent layer\r\n * only. Enforce real verification on the server (see `verifyToken`).\r\n */\r\nexport const NiceCaptcha = forwardRef<NiceCaptchaHandle, NiceCaptchaProps>((props, ref) => {\r\n const {\r\n variant,\r\n difficulty = 'medium',\r\n refreshable = true,\r\n verifyToken,\r\n expiresMs,\r\n label = \"I'm not a robot\",\r\n provider = 'custom',\r\n siteKey,\r\n onVerify,\r\n onExpire,\r\n onError,\r\n onRefresh,\r\n theme = 'light',\r\n size = 'normal',\r\n customRender,\r\n className,\r\n style,\r\n } = props;\r\n\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const checkboxTimer = useRef<ReturnType<typeof setTimeout>>();\r\n const [nonce, setNonce] = useState(0);\r\n const [status, setStatus] = useState<CaptchaStatus>('idle');\r\n const [message, setMessage] = useState('');\r\n const [input, setInput] = useState('');\r\n const [sliderValue, setSliderValue] = useState(0);\r\n\r\n const challenge = useMemo<Challenge>(\r\n () => buildChallenge(variant ?? 'checkbox', difficulty),\r\n [variant, difficulty, nonce],\r\n );\r\n\r\n const resetState = useCallback(() => {\r\n setStatus('idle');\r\n setMessage('');\r\n setInput('');\r\n setSliderValue(0);\r\n setNonce((n) => n + 1);\r\n }, []);\r\n\r\n const refresh = useCallback(() => {\r\n resetState();\r\n onRefresh?.();\r\n }, [resetState, onRefresh]);\r\n\r\n useImperativeHandle(\r\n ref,\r\n () => ({ reset: resetState, refresh, container: containerRef.current }),\r\n [resetState, refresh],\r\n );\r\n\r\n // Redraw the text canvas whenever the challenge or theme changes.\r\n useEffect(() => {\r\n if (variant === 'text' && challenge.kind === 'text') {\r\n drawTextChallenge(canvasRef.current, challenge.text, theme === 'dark');\r\n }\r\n }, [variant, challenge, theme]);\r\n\r\n // Auto-expire a solved challenge.\r\n useEffect(() => {\r\n if (status !== 'verified' || !expiresMs) {\r\n return;\r\n }\r\n const t = setTimeout(() => {\r\n onExpire?.();\r\n resetState();\r\n }, expiresMs);\r\n return () => clearTimeout(t);\r\n }, [status, expiresMs, onExpire, resetState]);\r\n\r\n const succeed = useCallback(() => {\r\n const token = `ntd-cap:${variant}:${makeNonce()}`;\r\n if (verifyToken) {\r\n setStatus('verifying');\r\n setMessage('');\r\n Promise.resolve()\r\n .then(() => verifyToken(token))\r\n .then((ok) => {\r\n if (ok) {\r\n setStatus('verified');\r\n onVerify?.(token);\r\n } else {\r\n setStatus('error');\r\n setMessage('Verification failed. Please try again.');\r\n setNonce((n) => n + 1);\r\n setInput('');\r\n }\r\n })\r\n .catch((err) => {\r\n setStatus('error');\r\n setMessage('Verification error. Please try again.');\r\n onError?.(err);\r\n });\r\n } else {\r\n setStatus('verified');\r\n onVerify?.(token);\r\n }\r\n }, [variant, verifyToken, onVerify, onError]);\r\n\r\n const fail = useCallback(() => {\r\n setStatus('error');\r\n setMessage('Incorrect, please try again.');\r\n setNonce((n) => n + 1);\r\n setInput('');\r\n }, []);\r\n\r\n const handleCheckbox = useCallback(() => {\r\n if (status === 'verifying' || status === 'verified') {\r\n return;\r\n }\r\n setStatus('verifying');\r\n setMessage('');\r\n checkboxTimer.current = setTimeout(succeed, CHECKBOX_DELAY_MS);\r\n }, [status, succeed]);\r\n\r\n // Clear a pending checkbox timer on unmount.\r\n useEffect(() => () => clearTimeout(checkboxTimer.current), []);\r\n\r\n const submitAnswer = useCallback(() => {\r\n if (challenge.kind === 'math') {\r\n if (input.trim() !== '' && Number(input) === challenge.answer) {\r\n succeed();\r\n } else {\r\n fail();\r\n }\r\n } else if (challenge.kind === 'text') {\r\n if (input.trim().toUpperCase() === challenge.text) {\r\n succeed();\r\n } else {\r\n fail();\r\n }\r\n }\r\n }, [challenge, input, succeed, fail]);\r\n\r\n const handleSlider = useCallback(\r\n (value: number) => {\r\n setSliderValue(value);\r\n if (challenge.kind !== 'slider' || status === 'verified' || status === 'verifying') {\r\n return;\r\n }\r\n if (Math.abs(value - challenge.target) <= challenge.tolerance) {\r\n succeed();\r\n }\r\n },\r\n [challenge, status, succeed],\r\n );\r\n\r\n // ── Provider shell mode (unchanged, backward-compatible) ──\r\n if (!variant) {\r\n if (provider === 'custom' && customRender) {\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={`nice-captcha nice-captcha--custom${className ? ` ${className}` : ''}`}\r\n style={style}\r\n >\r\n {customRender}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={`nice-captcha nice-captcha--${provider} nice-captcha--${theme}${size === 'compact' ? ' nice-captcha--compact' : ''}${className ? ` ${className}` : ''}`}\r\n style={style}\r\n data-sitekey={siteKey}\r\n data-theme={theme}\r\n data-size={size}\r\n >\r\n <div className=\"nice-captcha__placeholder\">\r\n <span>🔒 Captcha ({provider})</span>\r\n <p>Load the {provider} SDK to activate verification.</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // ── Built-in challenge mode ──\r\n const verifying = status === 'verifying';\r\n const verified = status === 'verified';\r\n const rootClass =\r\n `nice-captcha nice-captcha--${variant} nice-captcha--${theme} nice-captcha--${status}` +\r\n `${size === 'compact' ? ' nice-captcha--compact' : ''}${className ? ` ${className}` : ''}`;\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={rootClass}\r\n style={style}\r\n role=\"group\"\r\n aria-label=\"Captcha challenge\"\r\n data-variant={variant}\r\n data-status={status}\r\n data-theme={theme}\r\n >\r\n {variant === 'checkbox' && (\r\n <button\r\n type=\"button\"\r\n className=\"nice-captcha__checkbox\"\r\n role=\"checkbox\"\r\n aria-checked={verified}\r\n aria-busy={verifying}\r\n disabled={verifying || verified}\r\n onClick={handleCheckbox}\r\n >\r\n <span className=\"nice-captcha__box\" aria-hidden=\"true\">\r\n {verifying ? '…' : verified ? '✓' : ''}\r\n </span>\r\n <span className=\"nice-captcha__label\">{label}</span>\r\n </button>\r\n )}\r\n\r\n {variant === 'math' && challenge.kind === 'math' && (\r\n <div className=\"nice-captcha__challenge\">\r\n <span className=\"nice-captcha__prompt\" aria-hidden=\"true\">\r\n {challenge.prompt} =\r\n </span>\r\n <input\r\n className=\"nice-input nice-captcha__answer\"\r\n type=\"number\"\r\n inputMode=\"numeric\"\r\n value={input}\r\n aria-label={`What is ${challenge.prompt}?`}\r\n disabled={verifying || verified}\r\n onChange={(e) => setInput(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n submitAnswer();\r\n }\r\n }}\r\n />\r\n <button\r\n type=\"button\"\r\n className=\"nice-btn nice-btn--primary nice-captcha__verify\"\r\n disabled={verifying || verified || input.trim() === ''}\r\n onClick={submitAnswer}\r\n >\r\n {verifying ? '…' : 'Verify'}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {variant === 'text' && challenge.kind === 'text' && (\r\n <div className=\"nice-captcha__challenge\">\r\n <canvas\r\n ref={canvasRef}\r\n className=\"nice-captcha__canvas\"\r\n width={160}\r\n height={56}\r\n aria-hidden=\"true\"\r\n />\r\n <input\r\n className=\"nice-input nice-captcha__answer\"\r\n type=\"text\"\r\n autoCapitalize=\"characters\"\r\n autoComplete=\"off\"\r\n value={input}\r\n aria-label=\"Type the characters shown in the image\"\r\n disabled={verifying || verified}\r\n onChange={(e) => setInput(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n submitAnswer();\r\n }\r\n }}\r\n />\r\n <button\r\n type=\"button\"\r\n className=\"nice-btn nice-btn--primary nice-captcha__verify\"\r\n disabled={verifying || verified || input.trim() === ''}\r\n onClick={submitAnswer}\r\n >\r\n {verifying ? '…' : 'Verify'}\r\n </button>\r\n </div>\r\n )}\r\n\r\n {variant === 'slider' && challenge.kind === 'slider' && (\r\n <div className=\"nice-captcha__challenge nice-captcha__challenge--slider\">\r\n <span className=\"nice-captcha__slider-hint\" aria-hidden=\"true\">\r\n {verified ? 'Verified ✓' : 'Slide to the marker'}\r\n </span>\r\n <div className=\"nice-captcha__track\">\r\n <span\r\n className=\"nice-captcha__target\"\r\n aria-hidden=\"true\"\r\n style={{ left: `${challenge.target}%` }}\r\n />\r\n <input\r\n className=\"nice-captcha__slider\"\r\n type=\"range\"\r\n min={0}\r\n max={100}\r\n value={sliderValue}\r\n aria-label=\"Slide the handle to the marker to verify\"\r\n aria-valuetext={`${sliderValue}%`}\r\n disabled={verified || verifying}\r\n onChange={(e) => handleSlider(Number(e.target.value))}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div className=\"nice-captcha__footer\">\r\n <div className=\"nice-captcha__message\" role=\"status\" aria-live=\"polite\">\r\n {message}\r\n </div>\r\n {refreshable && (\r\n <button\r\n type=\"button\"\r\n className=\"nice-captcha__refresh\"\r\n aria-label=\"Refresh challenge\"\r\n title=\"Refresh challenge\"\r\n onClick={refresh}\r\n >\r\n ↻\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n});\r\n\r\nNiceCaptcha.displayName = 'NiceCaptcha';\r\n","import React, { forwardRef } from 'react';\r\n\r\n/** OAuth provider definition. */\r\nexport interface OAuthProvider {\r\n /** Unique provider id. */\r\n id: string;\r\n /** Display label. */\r\n label: string;\r\n /** Icon (emoji, SVG element, or URL). */\r\n icon?: React.ReactNode;\r\n /** Brand color for the button. */\r\n color?: string;\r\n /** Text color. */\r\n textColor?: string;\r\n}\r\n\r\n/** Props for the {@link NiceOAuthButtons} component. */\r\nexport interface NiceOAuthButtonsProps {\r\n /** Providers to display. */\r\n providers?: OAuthProvider[];\r\n /** Fires when a provider button is clicked. */\r\n onProviderClick?: (providerId: string) => void;\r\n /** Whether buttons are disabled. */\r\n disabled?: boolean;\r\n /** Loading provider id (shows spinner on that button). */\r\n loadingProvider?: string;\r\n /** Layout direction. */\r\n direction?: 'horizontal' | 'vertical';\r\n /** Separator text (e.g. \"or continue with\"). */\r\n separatorText?: string;\r\n /** Whether to show separator above buttons. */\r\n showSeparator?: boolean;\r\n className?: string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nconst DEFAULT_PROVIDERS: OAuthProvider[] = [\r\n { id: 'google', label: 'Google', icon: '🔵', color: '#4285f4', textColor: '#fff' },\r\n { id: 'microsoft', label: 'Microsoft', icon: '🟦', color: '#00a4ef', textColor: '#fff' },\r\n { id: 'discord', label: 'Discord', icon: '💬', color: '#5865f2', textColor: '#fff' },\r\n { id: 'spotify', label: 'Spotify', icon: '🎵', color: '#1db954', textColor: '#fff' },\r\n { id: 'github', label: 'GitHub', icon: '🐙', color: '#24292e', textColor: '#fff' },\r\n];\r\n\r\n/**\r\n * {@link NiceOAuthButtons} — OAuth login/registration buttons for popular providers.\r\n */\r\nexport const NiceOAuthButtons = forwardRef<HTMLDivElement, NiceOAuthButtonsProps>(({\r\n providers = DEFAULT_PROVIDERS, onProviderClick, disabled = false,\r\n loadingProvider, direction = 'vertical', separatorText = 'or continue with',\r\n showSeparator = true, className, style,\r\n}, ref) => (\r\n <div\r\n ref={ref}\r\n className={`nice-oauth nice-oauth--${direction}${className ? ` ${className}` : ''}`}\r\n style={style}\r\n >\r\n {showSeparator && (\r\n <div className=\"nice-oauth__separator\">\r\n <hr /><span>{separatorText}</span><hr />\r\n </div>\r\n )}\r\n\r\n <div className=\"nice-oauth__buttons\">\r\n {providers.map(provider => (\r\n <button\r\n key={provider.id}\r\n type=\"button\"\r\n className={`nice-oauth__btn${loadingProvider === provider.id ? ' nice-oauth__btn--loading' : ''}`}\r\n style={{ backgroundColor: provider.color, color: provider.textColor }}\r\n onClick={() => onProviderClick?.(provider.id)}\r\n disabled={disabled || !!loadingProvider}\r\n >\r\n {provider.icon && <span className=\"nice-oauth__btn-icon\">{provider.icon}</span>}\r\n <span className=\"nice-oauth__btn-label\">\r\n {loadingProvider === provider.id ? '…' : provider.label}\r\n </span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n));\r\n\r\nNiceOAuthButtons.displayName = 'NiceOAuthButtons';\r\n","import React, { useState, forwardRef, useCallback } from 'react';\r\n\r\n// ── Types ──────────────────────────────────────────────────\r\n\r\n/** API token entry. */\r\nexport interface ApiToken {\r\n id: string;\r\n name: string;\r\n prefix: string;\r\n createdAt: string;\r\n expiresAt?: string;\r\n lastUsedAt?: string;\r\n scopes?: string[];\r\n}\r\n\r\n/** Props for {@link NiceTokenManagement}. */\r\nexport interface NiceTokenManagementProps {\r\n /** Existing tokens. */\r\n tokens: ApiToken[];\r\n /** Called to create a new token. Should return the full token string (only shown once). */\r\n onCreate?: (name: string, scopes: string[], expiresInDays?: number) => Promise<string>;\r\n /** Called to revoke a token. */\r\n onRevoke?: (tokenId: string) => Promise<void>;\r\n /** Available scopes for new tokens. */\r\n availableScopes?: string[];\r\n /** Maximum number of tokens allowed. */\r\n maxTokens?: number;\r\n /** Title. */\r\n title?: string;\r\n /** CSS class name. */\r\n className?: string;\r\n /** Inline styles. */\r\n style?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * {@link NiceTokenManagement} — API token management UI.\r\n *\r\n * Create, view, and revoke personal API tokens. New token values are shown\r\n * once after creation. Supports scopes and expiration.\r\n */\r\nexport const NiceTokenManagement = forwardRef<HTMLDivElement, NiceTokenManagementProps>(\r\n function NiceTokenManagement(props, ref) {\r\n const {\r\n tokens,\r\n onCreate,\r\n onRevoke,\r\n availableScopes = [],\r\n maxTokens = 10,\r\n title = 'API Tokens',\r\n className,\r\n style,\r\n } = props;\r\n\r\n const [showCreate, setShowCreate] = useState(false);\r\n const [newName, setNewName] = useState('');\r\n const [selectedScopes, setSelectedScopes] = useState<string[]>([]);\r\n const [expDays, setExpDays] = useState('90');\r\n const [newTokenValue, setNewTokenValue] = useState<string | null>(null);\r\n const [loading, setLoading] = useState(false);\r\n const [revoking, setRevoking] = useState<string | null>(null);\r\n\r\n const handleCreate = useCallback(async () => {\r\n if (!onCreate || !newName.trim()) {\r\n return;\r\n }\r\n setLoading(true);\r\n try {\r\n const days = expDays ? parseInt(expDays, 10) : undefined;\r\n const tokenStr = await onCreate(newName.trim(), selectedScopes, days);\r\n setNewTokenValue(tokenStr);\r\n setNewName('');\r\n setSelectedScopes([]);\r\n setShowCreate(false);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [onCreate, newName, selectedScopes, expDays]);\r\n\r\n const handleRevoke = useCallback(\r\n async (id: string) => {\r\n if (!onRevoke) {\r\n return;\r\n }\r\n setRevoking(id);\r\n try {\r\n await onRevoke(id);\r\n } finally {\r\n setRevoking(null);\r\n }\r\n },\r\n [onRevoke],\r\n );\r\n\r\n const toggleScope = (scope: string) => {\r\n setSelectedScopes((prev) =>\r\n prev.includes(scope) ? prev.filter((s) => s !== scope) : [...prev, scope],\r\n );\r\n };\r\n\r\n const canCreate = tokens.length < maxTokens;\r\n\r\n return (\r\n <div ref={ref} className={`nice-token-management ${className ?? ''}`} style={style}>\r\n <div className=\"nice-token-management__header\">\r\n <h3>{title}</h3>\r\n {canCreate && (\r\n <button\r\n className=\"nice-token-management__new-btn\"\r\n onClick={() => setShowCreate(true)}\r\n disabled={showCreate}\r\n >\r\n + New Token\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* ── Reveal banner ── */}\r\n {newTokenValue && (\r\n <div className=\"nice-token-management__reveal\">\r\n <p>\r\n <strong>New token created!</strong> Copy it now — it won't be shown again.\r\n </p>\r\n <code className=\"nice-token-management__token-value\">{newTokenValue}</code>\r\n <button onClick={() => setNewTokenValue(null)}>Dismiss</button>\r\n </div>\r\n )}\r\n\r\n {/* ── Create form ── */}\r\n {showCreate && (\r\n <div className=\"nice-token-management__create-form\">\r\n <label>\r\n Name\r\n <input\r\n type=\"text\"\r\n value={newName}\r\n onChange={(e) => setNewName(e.target.value)}\r\n placeholder=\"My API token\"\r\n maxLength={64}\r\n />\r\n </label>\r\n\r\n {availableScopes.length > 0 && (\r\n <fieldset>\r\n <legend>Scopes</legend>\r\n {availableScopes.map((scope) => (\r\n <label key={scope} className=\"nice-token-management__scope\">\r\n <input\r\n type=\"checkbox\"\r\n checked={selectedScopes.includes(scope)}\r\n onChange={() => toggleScope(scope)}\r\n />\r\n {scope}\r\n </label>\r\n ))}\r\n </fieldset>\r\n )}\r\n\r\n <label>\r\n Expires in (days)\r\n <input\r\n type=\"number\"\r\n value={expDays}\r\n onChange={(e) => setExpDays(e.target.value)}\r\n min={1}\r\n max={365}\r\n />\r\n </label>\r\n\r\n <div className=\"nice-token-management__create-actions\">\r\n <button onClick={handleCreate} disabled={loading || !newName.trim()}>\r\n {loading ? 'Creating…' : 'Create Token'}\r\n </button>\r\n <button onClick={() => setShowCreate(false)}>Cancel</button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* ── Token list ── */}\r\n {tokens.length === 0 ? (\r\n <p className=\"nice-token-management__empty\">No API tokens yet.</p>\r\n ) : (\r\n <table className=\"nice-token-management__table\">\r\n <thead>\r\n <tr>\r\n <th>Name</th>\r\n <th>Prefix</th>\r\n <th>Created</th>\r\n <th>Expires</th>\r\n <th>Last Used</th>\r\n <th>Scopes</th>\r\n <th />\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {tokens.map((t) => (\r\n <tr key={t.id}>\r\n <td>{t.name}</td>\r\n <td>\r\n <code>{t.prefix}…</code>\r\n </td>\r\n <td>{t.createdAt}</td>\r\n <td>{t.expiresAt ?? '—'}</td>\r\n <td>{t.lastUsedAt ?? 'Never'}</td>\r\n <td>{t.scopes?.join(', ') || '—'}</td>\r\n <td>\r\n <button\r\n className=\"nice-token-management__revoke-btn\"\r\n onClick={() => handleRevoke(t.id)}\r\n disabled={revoking === t.id}\r\n >\r\n {revoking === t.id ? 'Revoking…' : 'Revoke'}\r\n </button>\r\n </td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n"],"names":["useAuth","config","onLogin","onRefresh","onLogout","storageKey","persistAuth","state","setState","useState","stored","persist","useCallback","newState","prev","next","login","email","password","result","err","logout","refreshToken","_a","tokens","setAuth","user","hasRoles","roles","r","hasPermissions","permissions","p","clearError","NiceLoginForm","forwardRef","onSubmit","loading","error","showRememberMe","showForgotPassword","onForgotPassword","showRegisterLink","onRegisterClick","title","submitLabel","logo","footer","className","style","emailLabel","passwordLabel","tracelessPolicy","privacyMessage","ref","setEmail","setPassword","rememberMe","setRememberMe","canShowRememberMe","useMemo","handleSubmit","e","effectiveRememberMe","jsxs","jsx","DEFAULT_LABELS","COLORS","calcPasswordStrength","score","NicePasswordStrength","overrideStrength","showLabel","labels","level","color","pct","NiceRegistrationForm","onLoginClick","showPasswordStrength","minPasswordStrength","termsUrl","privacyUrl","firstName","setFirstName","lastName","setLastName","confirmPassword","setConfirmPassword","acceptTerms","setAcceptTerms","strength","passwordsMatch","canSubmit","Fragment","NiceChangePassword","requireCurrentPassword","success","currentPassword","setCurrentPassword","newPassword","setNewPassword","NiceTwoFaSetup","secret","qrCodeUrl","issuer","accountName","onVerify","onCancel","recoveryCodes","step","onStepChange","code","setCode","showSecret","setShowSecret","copiedCodes","setCopiedCodes","handleVerify","totpUri","rc","i","CHECKBOX_DELAY_MS","randInt","min","max","makeNonce","buildChallenge","variant","difficulty","b","sub","answer","len","chars","text","drawTextChallenge","canvas","dark","ctx","w","h","size","NiceCaptcha","props","refreshable","verifyToken","expiresMs","label","provider","siteKey","onExpire","onError","theme","customRender","containerRef","useRef","canvasRef","checkboxTimer","nonce","setNonce","status","setStatus","message","setMessage","input","setInput","sliderValue","setSliderValue","challenge","resetState","n","refresh","useImperativeHandle","useEffect","t","succeed","token","ok","fail","handleCheckbox","submitAnswer","handleSlider","value","verifying","verified","rootClass","DEFAULT_PROVIDERS","NiceOAuthButtons","providers","onProviderClick","disabled","loadingProvider","direction","separatorText","showSeparator","NiceTokenManagement","onCreate","onRevoke","availableScopes","maxTokens","showCreate","setShowCreate","newName","setNewName","selectedScopes","setSelectedScopes","expDays","setExpDays","newTokenValue","setNewTokenValue","setLoading","revoking","setRevoking","handleCreate","days","tokenStr","handleRevoke","id","toggleScope","scope","s","canCreate"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export type { NiceChangePasswordProps } from './NiceChangePassword';
|
|
|
11
11
|
export { NiceTwoFaSetup } from './NiceTwoFaSetup';
|
|
12
12
|
export type { NiceTwoFaSetupProps } from './NiceTwoFaSetup';
|
|
13
13
|
export { NiceCaptcha } from './NiceCaptcha';
|
|
14
|
-
export type { CaptchaProvider, NiceCaptchaProps } from './NiceCaptcha';
|
|
14
|
+
export type { CaptchaProvider, CaptchaVariant, CaptchaDifficulty, NiceCaptchaHandle, NiceCaptchaProps, } from './NiceCaptcha';
|
|
15
15
|
export { NiceOAuthButtons } from './NiceOAuthButtons';
|
|
16
16
|
export type { OAuthProvider, NiceOAuthButtonsProps } from './NiceOAuthButtons';
|
|
17
17
|
export { NiceTokenManagement } from './NiceTokenManagement';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG7F,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAG1F,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACpF,YAAY,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAE/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAGpE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG5D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG7F,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAG1F,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACpF,YAAY,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAE/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAGpE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG5D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EACV,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAG/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,QAAQ,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC"}
|