mm-key-vault 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +226 -0
- package/dist/api.d.ts +80 -0
- package/dist/components/Dashboard.d.ts +6 -0
- package/dist/components/LoginModal.d.ts +6 -0
- package/dist/index.d.ts +25 -0
- package/dist/mm-key-vault.cjs.js +2 -0
- package/dist/mm-key-vault.cjs.js.map +1 -0
- package/dist/mm-key-vault.esm.js +901 -0
- package/dist/mm-key-vault.esm.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mm-key-vault.cjs.js","sources":["../src/api.ts","../src/components/LoginModal.tsx","../src/components/Dashboard.tsx","../src/index.tsx"],"sourcesContent":["// ─── API Client ──────────────────────────────────────────────────────────────\n// Base URL is set ONCE via initKeyVault({ apiBaseUrl }) and stored here.\n// All API calls read from this single source.\n\nconst STORAGE_KEY = \"kv_widget_token\";\n\n/** Backend is locked — do not expose or override */\nconst BASE_URL = \"https://probioticbackend.masterymade.com\";\n\n// ─── Token helpers ────────────────────────────────────────────────────────────\n\ninterface AuthData {\n token: string;\n expires: number;\n}\n\nexport function getToken(): string | null {\n if (typeof window === \"undefined\") return null;\n\n // 1) Check sessionStorage first (non-remembered logins)\n const rawSession = window.sessionStorage.getItem(STORAGE_KEY);\n if (rawSession) {\n try {\n const data: AuthData | string = JSON.parse(rawSession);\n return typeof data === \"string\" ? data : data?.token || null;\n } catch {\n return rawSession;\n }\n }\n\n // 2) Then check localStorage (remembered logins)\n const rawLocal = window.localStorage.getItem(STORAGE_KEY);\n if (!rawLocal) return null;\n\n try {\n const data: AuthData | string = JSON.parse(rawLocal);\n return typeof data === \"string\" ? data : data?.token || null;\n } catch {\n return rawLocal;\n }\n}\n\nexport function setToken(token: string, remember: boolean = false) {\n if (typeof window === \"undefined\") return;\n\n // Clear any previous value so we only keep one source of truth\n window.sessionStorage.removeItem(STORAGE_KEY);\n window.localStorage.removeItem(STORAGE_KEY);\n\n if (remember) {\n window.localStorage.setItem(STORAGE_KEY, token);\n } else {\n window.sessionStorage.setItem(STORAGE_KEY, token);\n }\n}\n\nexport function clearToken() {\n if (typeof window === \"undefined\") return;\n window.sessionStorage.removeItem(STORAGE_KEY);\n window.localStorage.removeItem(STORAGE_KEY);\n}\n\nexport function isAuthenticated(): boolean {\n return !!getToken();\n}\n\n// ─── HTTP helper ──────────────────────────────────────────────────────────────\n\nasync function request<T>(path: string, options: RequestInit = {}): Promise<T> {\n const token = getToken();\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...(options.headers as Record<string, string>),\n };\n if (token) headers[\"Authorization\"] = `Bearer ${token}`;\n\n const res = await fetch(`${BASE_URL}${path}`, { ...options, headers });\n\n if (!res.ok) {\n let message = `Request failed (${res.status})`;\n try {\n const data = await res.json();\n const detail = data?.detail;\n if (typeof detail === \"string\") {\n message = detail;\n } else if (detail && typeof detail === \"object\") {\n message = detail.message || detail.error || data?.message || data?.error || message;\n } else {\n message = data?.message || data?.error || message;\n }\n } catch { /* ignore */ }\n throw new Error(message);\n }\n\n if (res.status === 204) return undefined as unknown as T;\n return res.json() as Promise<T>;\n}\n\n// ─── Auth ─────────────────────────────────────────────────────────────────────\n\nexport interface SignupPayload {\n email: string;\n password: string;\n callback?: string; // optional email-verification callback URL\n}\n\nexport interface LoginPayload {\n email: string;\n password: string;\n}\n\n// Generic wrapper returned by this backend\nexport interface ApiResponse<T = unknown> {\n status: number; // 1 = success\n message: string;\n data?: T;\n}\n\nexport interface SignupData {\n user_id: string;\n email: string;\n email_verified: boolean;\n}\n\nexport interface LoginData {\n token?: string;\n access_token?: string;\n user_id?: string;\n email?: string;\n}\n\nexport async function signup(payload: SignupPayload): Promise<ApiResponse<SignupData>> {\n const data = await request<ApiResponse<SignupData>>(\"/auth/signup\", {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n if (data.status !== 1) throw new Error(data.message || \"Signup failed\");\n return data;\n}\n\nexport async function login(credentials: LoginPayload, remember: boolean = false): Promise<ApiResponse<LoginData>> {\n const data = await request<ApiResponse<LoginData> & { token?: string }>(\"/auth/login\", {\n method: \"POST\",\n body: JSON.stringify(credentials),\n });\n // the backend sometimes returns status: 1, sometimes not. Let's be flexible\n if (data.status && data.status !== 1) throw new Error(data.message || \"Login failed\");\n\n const token = data.data?.access_token || data.data?.token || data.token;\n if (!token) {\n throw new Error(\"Login succeeded but no token returned by API\");\n }\n setToken(token, remember);\n return data;\n}\n\nexport async function verifyEmail(token: string): Promise<ApiResponse> {\n return request<ApiResponse>(\"/auth/verify-email\", {\n method: \"POST\",\n body: JSON.stringify({ token }),\n });\n}\n\nexport interface ForgotPasswordPayload {\n email: string;\n callback?: string;\n}\n\nexport async function forgotPassword(payload: ForgotPasswordPayload): Promise<ApiResponse> {\n return request<ApiResponse>(\"/auth/forgot-password\", {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n}\n\nexport interface ResetPasswordPayload {\n token: string;\n new_password: string;\n}\n\nexport async function resetPassword(payload: ResetPasswordPayload): Promise<ApiResponse> {\n const { token, new_password } = payload;\n const search = new URLSearchParams({ token }).toString();\n return request<ApiResponse>(`/auth/reset-password?${search}`, {\n method: \"POST\",\n body: JSON.stringify({ new_password }),\n });\n}\n\n// ─── Platforms ────────────────────────────────────────────────────────────────\n\nexport type SortOrder = \"asc\" | \"desc\";\n\nexport interface PlatformRecord {\n id: number;\n platform: string;\n created_at?: string;\n updated_at?: string;\n}\n\nexport interface ListPlatformsParams {\n search?: string;\n page?: number;\n limit?: number;\n sort_by?: string;\n order?: SortOrder;\n}\n\nexport interface ListPlatformsData {\n user_id: string;\n current_page: number;\n total_pages: number;\n has_next_page: boolean;\n has_previous_page: boolean;\n limit: number;\n total_database_count: number;\n result: PlatformRecord[];\n}\n\nfunction toQuery(params: Record<string, string | number | boolean | undefined | null>): string {\n const qs = new URLSearchParams();\n Object.entries(params).forEach(([k, v]) => {\n if (v === undefined || v === null || v === \"\") return;\n qs.set(k, String(v));\n });\n const s = qs.toString();\n return s ? `?${s}` : \"\";\n}\n\nexport async function listPlatforms(params: ListPlatformsParams = {}): Promise<ApiResponse<ListPlatformsData>> {\n const {\n search,\n page = 1,\n limit = 10,\n sort_by,\n order = \"asc\",\n } = params;\n\n const q = toQuery({ search, page, limit, sort_by, order });\n return request<ApiResponse<ListPlatformsData>>(`/auth/list_platforms${q}`);\n}\n\nexport interface UpsertPlatformPayload {\n platform: string;\n api_key?: string;\n}\n\nexport async function addKey(payload: Required<Pick<UpsertPlatformPayload, \"platform\" | \"api_key\">>): Promise<ApiResponse<{ platform: string }>> {\n return request<ApiResponse<{ platform: string }>>(\"/auth/add_key\", {\n method: \"POST\",\n body: JSON.stringify(payload),\n });\n}\n\nexport async function getKey(credentialId: number): Promise<ApiResponse<{ platform: string; api_key: string }>> {\n return request<ApiResponse<{ platform: string; api_key: string }>>(`/auth/get_key/${credentialId}`);\n}\n\n// NOTE: Edit endpoint name isn't confirmed yet; keeping this for later wiring if needed.\nexport async function updateKey(id: number, payload: UpsertPlatformPayload): Promise<ApiResponse> {\n return request<ApiResponse>(`/auth/update_key/${id}`, {\n method: \"PUT\",\n body: JSON.stringify(payload),\n });\n}\n\nexport async function deletePlatform(id: number): Promise<ApiResponse> {\n return request<ApiResponse>(`/auth/delete_platform/${id}`, { method: \"DELETE\" });\n}\n","import React, { useEffect, useState } from \"react\";\nimport * as api from \"../api\";\n\ninterface Props {\n onLoginSuccess: () => void;\n}\n\ntype Tab = \"login\" | \"signup\";\n\n// ── Inline field error component ──────────────────────────────────────────────\nconst FieldError = ({ msg }: { msg: string }) =>\n msg ? <span className=\"kv-field-error\">⚠ {msg}</span> : null;\n\nconst LoginModal: React.FC<Props> = ({ onLoginSuccess }) => {\n const [tab, setTab] = useState<Tab>(\"login\");\n const [showForgot, setShowForgot] = useState(false);\n\n // ── Login state ─────────────────────────────────────────────────────────────\n const [lEmail, setLEmail] = useState(\"\");\n const [lPassword, setLPassword] = useState(\"\");\n const [lShowPassword, setLShowPassword] = useState(false);\n const [lRemember, setLRemember] = useState(false);\n const [lLoading, setLLoading] = useState(false);\n const [lError, setLError] = useState(\"\");\n const [lFieldErr, setLFieldErr] = useState({ email: \"\", password: \"\" });\n\n // ── Forgot password state ──────────────────────────────────────────────────\n const [fEmail, setFEmail] = useState(\"\");\n const [fLoading, setFLoading] = useState(false);\n const [fError, setFError] = useState(\"\");\n const [fSuccess, setFSuccess] = useState(\"\");\n const [fFieldErr, setFFieldErr] = useState({ email: \"\" });\n\n // ── Signup state ────────────────────────────────────────────\n const [sEmail, setSEmail] = useState(\"\");\n const [sPassword, setSPassword] = useState(\"\");\n const [sShowPassword, setSSHowPassword] = useState(false);\n const [sLoading, setSLoading] = useState(false);\n const [sError, setSError] = useState(\"\");\n const [sSuccess, setSSuccess] = useState(false);\n const [sSuccessMsg, setSSuccessMsg] = useState(\"\");\n const [sFieldErr, setSFieldErr] = useState({ email: \"\", password: \"\" });\n\n // ── Reset password state (via email link token) ─────────────\n const [resetToken, setResetToken] = useState<string | null>(null);\n const [rPassword, setRPassword] = useState(\"\");\n const [rConfirm, setRConfirm] = useState(\"\");\n const [rShowPassword, setRShowPassword] = useState(false);\n const [rShowConfirm, setRShowConfirm] = useState(false);\n const [rLoading, setRLoading] = useState(false);\n const [rError, setRError] = useState(\"\");\n const [rSuccess, setRSuccess] = useState(\"\");\n\n // ── Shared validators ────────────────────────────────────────────────────────\n const validateEmail = (email: string): string => {\n if (!email.trim()) return \"Email is required\";\n if (email.length < 5) return \"Email must be at least 5 characters\";\n if (email.length > 60) return \"Email must be at most 60 characters\";\n if (/\\s/.test(email)) return \"Email must not contain spaces\";\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/.test(email)) return \"Enter a valid email address\";\n if (/\\.\\./.test(email)) return \"Email must not contain consecutive dots\";\n return \"\";\n };\n\n const validatePassword = (password: string): string => {\n if (!password) return \"Password is required\";\n if (password.length < 8) return \"Password must be at least 8 characters\";\n if (password.length > 16) return \"Password must be at most 16 characters\";\n if (!/[A-Z]/.test(password)) return \"Password must contain at least one uppercase letter\";\n if (!/[a-z]/.test(password)) return \"Password must contain at least one lowercase letter\";\n if (!/[0-9]/.test(password)) return \"Password must contain at least one number\";\n if (!/[^A-Za-z0-9]/.test(password)) return \"Password must contain at least one special character\";\n return \"\";\n };\n\n const validateResetPassword = () => {\n const pwdError = validatePassword(rPassword);\n if (pwdError) {\n setRError(pwdError);\n return false;\n }\n if (rPassword !== rConfirm) {\n setRError(\"Passwords do not match\");\n return false;\n }\n setRError(\"\");\n return true;\n };\n\n // On mount, check URL for reset token (?token=...)\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const params = new URLSearchParams(window.location.search);\n const token = params.get(\"token\");\n if (token) {\n setResetToken(token);\n setShowForgot(false);\n setTab(\"login\");\n }\n }, []);\n\n // ── Login validation ─────────────────────────────────────────────────────────\n const validateLogin = () => {\n const errs = {\n email: validateEmail(lEmail),\n password: validatePassword(lPassword),\n };\n setLFieldErr(errs);\n return !errs.email && !errs.password;\n };\n\n const validateForgot = () => {\n const errs = { email: validateEmail(fEmail) };\n setFFieldErr(errs);\n return !errs.email;\n };\n\n // ── Signup validation ──────────────────────────────────────────\n const validateSignup = () => {\n const errs = {\n email: validateEmail(sEmail),\n password: validatePassword(sPassword),\n };\n setSFieldErr(errs);\n return !errs.email && !errs.password;\n };\n\n const handleLogin = async (e: React.FormEvent) => {\n e.preventDefault();\n setLError(\"\");\n if (!validateLogin()) return;\n setLLoading(true);\n try {\n await api.login({\n email: lEmail,\n password: lPassword,\n }, lRemember);\n onLoginSuccess();\n } catch (err: unknown) {\n setLError(err instanceof Error ? err.message : \"Login failed\");\n } finally {\n setLLoading(false);\n }\n };\n\n const handleForgot = async (e: React.FormEvent) => {\n e.preventDefault();\n setFError(\"\");\n setFSuccess(\"\");\n if (!validateForgot()) return;\n setFLoading(true);\n try {\n // Only send origin (protocol + host), e.g. https://site.com\n const callback = window.location.origin;\n const res = await api.forgotPassword({ email: fEmail.trim(), callback });\n // backend returns status 0 or 1, but we show message in both cases\n if (res.status === 0) {\n setFError(res.message || \"Your email address is not verified.\");\n } else {\n setFSuccess(res.message || \"If your email is registered, you will receive a password reset link.\");\n }\n } catch (err: unknown) {\n setFError(err instanceof Error ? err.message : \"Request failed\");\n } finally {\n setFLoading(false);\n }\n };\n\n const handleResetPassword = async (e: React.FormEvent) => {\n e.preventDefault();\n setRError(\"\");\n setRSuccess(\"\");\n if (!resetToken) {\n setRError(\"Reset link is invalid or has expired.\");\n return;\n }\n if (!validateResetPassword()) return;\n\n setRLoading(true);\n try {\n const res = await api.resetPassword({ token: resetToken, new_password: rPassword });\n if (res.status !== 1) {\n setRError(res.message || \"Could not reset password.\");\n return;\n }\n setRSuccess(res.message || \"Your password has been reset. You can now log in with the new password.\");\n\n // Remove token from URL so modal behaves normally next time\n if (typeof window !== \"undefined\" && window.history?.replaceState) {\n const url = new URL(window.location.href);\n url.searchParams.delete(\"token\");\n window.history.replaceState({}, \"\", url.toString());\n }\n\n // Optionally, switch back to login after a short delay\n setTimeout(() => {\n setResetToken(null);\n setRPassword(\"\");\n setRConfirm(\"\");\n }, 2000);\n } catch (err: unknown) {\n setRError(err instanceof Error ? err.message : \"Password reset failed\");\n } finally {\n setRLoading(false);\n }\n };\n\n const handleSignup = async (e: React.FormEvent) => {\n e.preventDefault();\n setSError(\"\");\n if (!validateSignup()) return;\n setSLoading(true);\n try {\n const res = await api.signup({\n email: sEmail,\n password: sPassword,\n callback: window.location.href, // automatic — current page URL\n });\n setSSuccessMsg(res.message || \"Account created successfully!\");\n setSSuccess(true);\n } catch (err: unknown) {\n setSError(err instanceof Error ? err.message : \"Signup failed\");\n } finally {\n setSLoading(false);\n }\n };\n\n return (\n <>\n {/* Tabs (hidden when reset-password is active) */}\n {!showForgot && !resetToken ? (\n <div className=\"kv-tabs\">\n <button\n className={`kv-tab ${tab === \"login\" ? \"kv-active\" : \"\"}`}\n onClick={() => {\n setTab(\"login\");\n setShowForgot(false);\n setLError(\"\");\n setLFieldErr({ email: \"\", password: \"\" });\n setFError(\"\");\n setFSuccess(\"\");\n setFFieldErr({ email: \"\" });\n }}\n >\n Log In\n </button>\n <button\n className={`kv-tab ${tab === \"signup\" ? \"kv-active\" : \"\"}`}\n onClick={() => {\n setTab(\"signup\");\n setSError(\"\");\n setSSuccess(false);\n setSFieldErr({ email: \"\", password: \"\" });\n }}\n >\n Sign Up\n </button>\n </div>\n ) : !resetToken ? (\n <div className=\"kv-forgot-header\">\n Forgot Password\n </div>\n ) : (\n <div className=\"kv-forgot-header\">\n Reset Password\n </div>\n )}\n\n {/* ── Login / Forgot / Reset ── */}\n {tab === \"login\" && !resetToken && (\n <>\n {!showForgot ? (\n <form className=\"kv-form\" onSubmit={handleLogin}>\n {lError && <div className=\"kv-alert kv-alert-error\">{lError}</div>}\n\n <div className=\"kv-field\">\n <label className=\"kv-label\">Email</label>\n <input\n className={`kv-input${lFieldErr.email ? \" kv-input-error\" : \"\"}`}\n type=\"text\"\n placeholder=\"you@example.com\"\n value={lEmail}\n onChange={(e) => { setLEmail(e.target.value); if (lFieldErr.email) setLFieldErr(p => ({ ...p, email: \"\" })); }}\n />\n <FieldError msg={lFieldErr.email} />\n </div>\n\n <div className=\"kv-field\">\n <label className=\"kv-label\">Password</label>\n <div style={{ position: \"relative\" }}>\n <input\n className={`kv-input${lFieldErr.password ? \" kv-input-error\" : \"\"}`}\n type={lShowPassword ? \"text\" : \"password\"}\n placeholder=\"••••••••\"\n value={lPassword}\n onChange={(e) => { setLPassword(e.target.value); if (lFieldErr.password) setLFieldErr(p => ({ ...p, password: \"\" })); }}\n style={{ paddingRight: 40 }}\n />\n <button\n type=\"button\"\n onClick={() => setLShowPassword(v => !v)}\n aria-label={lShowPassword ? \"Hide password\" : \"Show password\"}\n style={{\n position: \"absolute\",\n right: 10,\n top: \"50%\",\n transform: \"translateY(-50%)\",\n border: \"none\",\n background: \"transparent\",\n cursor: \"pointer\",\n color: \"#fff\",\n fontSize: 14,\n padding: 0,\n }}\n >\n {lShowPassword ? \"🙈\" : \"👁️\"}\n </button>\n </div>\n <FieldError msg={lFieldErr.password} />\n </div>\n\n <div className=\"kv-remember\" style={{ justifyContent: \"space-between\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <input\n id=\"kv-remember-me\"\n type=\"checkbox\"\n checked={lRemember}\n onChange={(e) => setLRemember(e.target.checked)}\n />\n <label htmlFor=\"kv-remember-me\">Remember me</label>\n </div>\n <button\n type=\"button\"\n className=\"kv-btn kv-btn-ghost\"\n style={{ padding: \"6px 10px\", fontSize: 12 }}\n onClick={() => {\n setShowForgot(true);\n setFEmail(lEmail);\n setFError(\"\");\n setFSuccess(\"\");\n setFFieldErr({ email: \"\" });\n }}\n >\n Forgot password?\n </button>\n </div>\n\n <button className=\"kv-btn kv-btn-primary\" type=\"submit\" disabled={lLoading}>\n {lLoading ? <><span className=\"kv-spinner\" /> Logging in…</> : \"Log In\"}\n </button>\n </form>\n ) : (\n <>\n <form className=\"kv-form\" onSubmit={handleForgot} noValidate>\n {fError && <div className=\"kv-alert kv-alert-error\">{fError}</div>}\n {fSuccess && <div className=\"kv-alert kv-alert-success\">{fSuccess}</div>}\n\n <div className=\"kv-field\">\n <label className=\"kv-label\">Email</label>\n <input\n className={`kv-input${fFieldErr.email ? \" kv-input-error\" : \"\"}`}\n type=\"text\"\n placeholder=\"you@example.com\"\n value={fEmail}\n onChange={(e) => { setFEmail(e.target.value); if (fFieldErr.email) setFFieldErr({ email: \"\" }); }}\n />\n <FieldError msg={fFieldErr.email} />\n </div>\n\n <button className=\"kv-btn kv-btn-primary\" type=\"submit\" disabled={fLoading}>\n {fLoading ? <><span className=\"kv-spinner\" /> Sending…</> : \"Send reset link\"}\n </button>\n </form>\n <button\n type=\"button\"\n className=\"kv-btn kv-btn-ghost\"\n style={{ width: \"100%\" }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setShowForgot(false);\n setFError(\"\");\n setFSuccess(\"\");\n setFFieldErr({ email: \"\" });\n }}\n >\n Back to login\n </button>\n </>\n )}\n </>\n )}\n\n {/* ── Signup Form ── */}\n {tab === \"signup\" && !resetToken && (\n <>\n {sSuccess ? (\n <div className=\"kv-verify-banner\">\n 🎉 <strong>{sSuccessMsg}</strong><br />\n Please verify your email before logging in.\n </div>\n ) : (\n <form className=\"kv-form\" onSubmit={handleSignup}>\n {sError && <div className=\"kv-alert kv-alert-error\">{sError}</div>}\n\n <div className=\"kv-field\">\n <label className=\"kv-label\">Email</label>\n <input\n className={`kv-input${sFieldErr.email ? \" kv-input-error\" : \"\"}`}\n type=\"text\"\n placeholder=\"you@example.com\"\n value={sEmail}\n onChange={(e) => { setSEmail(e.target.value); if (sFieldErr.email) setSFieldErr(p => ({ ...p, email: \"\" })); }}\n />\n <FieldError msg={sFieldErr.email} />\n </div>\n\n <div className=\"kv-field\">\n <label className=\"kv-label\">Password</label>\n <div style={{ position: \"relative\" }}>\n <input\n className={`kv-input${sFieldErr.password ? \" kv-input-error\" : \"\"}`}\n type={sShowPassword ? \"text\" : \"password\"}\n placeholder=\"Min. 8 characters\"\n value={sPassword}\n onChange={(e) => { setSPassword(e.target.value); if (sFieldErr.password) setSFieldErr(p => ({ ...p, password: \"\" })); }}\n style={{ paddingRight: 40 }}\n />\n <button\n type=\"button\"\n onClick={() => setSSHowPassword(v => !v)}\n aria-label={sShowPassword ? \"Hide password\" : \"Show password\"}\n style={{\n position: \"absolute\",\n right: 10,\n top: \"50%\",\n transform: \"translateY(-50%)\",\n border: \"none\",\n background: \"transparent\",\n cursor: \"pointer\",\n color: \"#fff\",\n fontSize: 14,\n padding: 0,\n }}\n >\n {sShowPassword ? \"🙈\" : \"👁️\"}\n </button>\n </div>\n <FieldError msg={sFieldErr.password} />\n </div>\n\n <button className=\"kv-btn kv-btn-primary\" type=\"submit\" disabled={sLoading}>\n {sLoading ? <><span className=\"kv-spinner\" /> Creating account…</> : \"Create Account\"}\n </button>\n </form>\n )}\n </>\n )}\n\n {/* ── Reset-password Form (from email link) ── */}\n {resetToken && (\n <form className=\"kv-form\" onSubmit={handleResetPassword} noValidate>\n {rError && <div className=\"kv-alert kv-alert-error\">{rError}</div>}\n {rSuccess && <div className=\"kv-alert kv-alert-success\">{rSuccess}</div>}\n\n <div className=\"kv-field\">\n <label className=\"kv-label\">New password</label>\n <div style={{ position: \"relative\" }}>\n <input\n className=\"kv-input\"\n type={rShowPassword ? \"text\" : \"password\"}\n placeholder=\"Enter new password\"\n value={rPassword}\n onChange={(e) => setRPassword(e.target.value)}\n style={{ paddingRight: 40 }}\n />\n <button\n type=\"button\"\n onClick={() => setRShowPassword(v => !v)}\n aria-label={rShowPassword ? \"Hide password\" : \"Show password\"}\n style={{\n position: \"absolute\",\n right: 10,\n top: \"50%\",\n transform: \"translateY(-50%)\",\n border: \"none\",\n background: \"transparent\",\n cursor: \"pointer\",\n color: \"#fff\",\n fontSize: 14,\n padding: 0,\n }}\n >\n {rShowPassword ? \"🙈\" : \"👁️\"}\n </button>\n </div>\n </div>\n\n <div className=\"kv-field\">\n <label className=\"kv-label\">Confirm password</label>\n <div style={{ position: \"relative\" }}>\n <input\n className=\"kv-input\"\n type={rShowConfirm ? \"text\" : \"password\"}\n placeholder=\"Re-enter new password\"\n value={rConfirm}\n onChange={(e) => setRConfirm(e.target.value)}\n style={{ paddingRight: 40 }}\n />\n <button\n type=\"button\"\n onClick={() => setRShowConfirm(v => !v)}\n aria-label={rShowConfirm ? \"Hide password\" : \"Show password\"}\n style={{\n position: \"absolute\",\n right: 10,\n top: \"50%\",\n transform: \"translateY(-50%)\",\n border: \"none\",\n background: \"transparent\",\n cursor: \"pointer\",\n color: \"#fff\",\n fontSize: 14,\n padding: 0,\n }}\n >\n {rShowConfirm ? \"🙈\" : \"👁️\"}\n </button>\n </div>\n </div>\n\n <button className=\"kv-btn kv-btn-primary\" type=\"submit\" disabled={rLoading}>\n {rLoading ? (\n <>\n <span className=\"kv-spinner\" /> Saving…\n </>\n ) : (\n \"Save password\"\n )}\n </button>\n\n <button\n type=\"button\"\n className=\"kv-btn kv-btn-ghost\"\n style={{ width: \"100%\", marginTop: 8 }}\n onClick={() => {\n setResetToken(null);\n setRPassword(\"\");\n setRConfirm(\"\");\n setRSuccess(\"\");\n setRError(\"\");\n if (typeof window !== \"undefined\" && window.history?.replaceState) {\n const url = new URL(window.location.href);\n url.searchParams.delete(\"token\");\n window.history.replaceState({}, \"\", url.toString());\n }\n }}\n >\n Back to login\n </button>\n </form>\n )}\n </>\n );\n};\n\nexport default LoginModal;\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport * as api from \"../api\";\n\ninterface Props {\n onLogout: () => void;\n}\n\nconst EditIcon = () => (\n <svg viewBox=\"0 0 24 24\" width={14} height={14} fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.1 2.1 0 013 3L7 19l-4 1 1-4 12.5-12.5z\" />\n </svg>\n);\n\nconst CopyIcon = () => (\n <svg viewBox=\"0 0 24 24\" width={14} height={14} fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\n </svg>\n);\n\nconst EyeIcon = ({ off }: { off?: boolean }) => (\n <svg viewBox=\"0 0 24 24\" width={16} height={16} fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {off ? (\n <>\n <path d=\"M17.94 17.94A10.94 10.94 0 0112 20C7 20 2.73 16.11 1 12c.74-1.77 1.86-3.39 3.29-4.76\" />\n <path d=\"M10.58 10.58A2 2 0 0012 14a2 2 0 001.42-.58\" />\n <path d=\"M9.88 5.09A10.94 10.94 0 0112 4c5 0 9.27 3.89 11 8-1.05 2.52-2.86 4.67-5.19 6.18\" />\n <path d=\"M1 1l22 22\" />\n </>\n ) : (\n <>\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8S1 12 1 12z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </>\n )}\n </svg>\n);\n\nconst Dashboard: React.FC<Props> = ({ onLogout }) => {\n type View = \"list\" | \"add\" | \"edit\";\n const [view, setView] = useState<View>(\"list\");\n const [editing, setEditing] = useState<api.PlatformRecord | null>(null);\n\n const [items, setItems] = useState<api.PlatformRecord[]>([]);\n const [loading, setLoading] = useState(true);\n const [loadingMore, setLoadingMore] = useState(false);\n const [error, setError] = useState(\"\");\n\n const [page, setPage] = useState(1);\n const [hasNext, setHasNext] = useState(false);\n\n const [search, setSearch] = useState(\"\");\n const [debouncedSearch, setDebouncedSearch] = useState(\"\");\n const [sortBy, setSortBy] = useState<string>(\"platform\");\n const [order, setOrder] = useState<api.SortOrder>(\"desc\");\n\n // add/edit form\n const [platformName, setPlatformName] = useState(\"\");\n const [apiKey, setApiKey] = useState(\"\");\n const [apiKeyVisible, setApiKeyVisible] = useState(false);\n const [saving, setSaving] = useState(false);\n const [saveError, setSaveError] = useState(\"\");\n const [fieldErrors, setFieldErrors] = useState<{ platform: string; apiKey: string }>({ platform: \"\", apiKey: \"\" });\n const [detailsLoading, setDetailsLoading] = useState(false);\n const [copyingId, setCopyingId] = useState<number | null>(null);\n const [copiedId, setCopiedId] = useState<number | null>(null);\n\n useEffect(() => {\n const t = window.setTimeout(() => setDebouncedSearch(search.trim()), 350);\n return () => window.clearTimeout(t);\n }, [search]);\n\n const badgeCount = useMemo(() => items.length, [items.length]);\n\n const fetchPage = useCallback(async (opts: { page: number; append: boolean }) => {\n const { page: pageToFetch, append } = opts;\n append ? setLoadingMore(true) : setLoading(true);\n setError(\"\");\n try {\n const res = await api.listPlatforms({\n search: debouncedSearch || undefined,\n page: pageToFetch,\n limit: 10,\n sort_by: sortBy || undefined,\n order,\n });\n if (res.status !== 1) throw new Error(res.message || \"Failed to load platforms\");\n const data = res.data;\n const nextItems = data?.result ?? [];\n setItems((prev) => (append ? [...prev, ...nextItems] : nextItems));\n setPage(data?.current_page ?? pageToFetch);\n setHasNext(Boolean(data?.has_next_page));\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : \"Failed to load platforms\");\n if (!append) {\n setItems([]);\n setHasNext(false);\n }\n } finally {\n append ? setLoadingMore(false) : setLoading(false);\n }\n }, [debouncedSearch, order, sortBy]);\n\n useEffect(() => {\n if (view !== \"list\") return;\n fetchPage({ page: 1, append: false });\n }, [fetchPage, view]);\n\n const handleLoadMore = async () => {\n if (!hasNext || loadingMore) return;\n await fetchPage({ page: page + 1, append: true });\n };\n\n const copyKey = async (credentialId: number) => {\n if (copyingId) return;\n setCopyingId(credentialId);\n setCopiedId(null);\n try {\n const res = await api.getKey(credentialId);\n if (res.status !== 1) throw new Error(res.message || \"Failed to fetch key\");\n const key = res.data?.api_key;\n if (!key) throw new Error(\"No api_key returned\");\n\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(key);\n } else {\n const ta = document.createElement(\"textarea\");\n ta.value = key;\n ta.style.position = \"fixed\";\n ta.style.left = \"-9999px\";\n ta.style.top = \"0\";\n document.body.appendChild(ta);\n ta.focus();\n ta.select();\n document.execCommand(\"copy\");\n ta.remove();\n }\n\n setCopiedId(credentialId);\n window.setTimeout(() => setCopiedId((v) => (v === credentialId ? null : v)), 1200);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : \"Copy failed\");\n } finally {\n setCopyingId(null);\n }\n };\n\n const startAdd = () => {\n setSaveError(\"\");\n setPlatformName(\"\");\n setApiKey(\"\");\n setApiKeyVisible(false);\n setEditing(null);\n setView(\"add\");\n };\n\n const startEdit = (item: api.PlatformRecord) => {\n setSaveError(\"\");\n setEditing(item);\n setPlatformName(\"\");\n setApiKey(\"\");\n setApiKeyVisible(false);\n setFieldErrors({ platform: \"\", apiKey: \"\" });\n setView(\"edit\");\n\n setDetailsLoading(true);\n api.getKey(item.id)\n .then((res) => {\n if (res.status !== 1) throw new Error(res.message || \"Failed to load key details\");\n setPlatformName(res.data?.platform ?? item.platform ?? \"\");\n setApiKey(res.data?.api_key ?? \"\");\n })\n .catch((err: unknown) => {\n setSaveError(err instanceof Error ? err.message : \"Failed to load key details\");\n setPlatformName(item.platform || \"\");\n setApiKey(\"\");\n })\n .finally(() => setDetailsLoading(false));\n };\n\n const goBackToList = () => {\n setView(\"list\");\n setEditing(null);\n setSaveError(\"\");\n setPlatformName(\"\");\n setApiKey(\"\");\n setApiKeyVisible(false);\n setFieldErrors({ platform: \"\", apiKey: \"\" });\n };\n\n const handleSave = async (e: React.FormEvent) => {\n e.preventDefault();\n setSaveError(\"\");\n setFieldErrors({ platform: \"\", apiKey: \"\" });\n const name = platformName.trim();\n const key = apiKey.trim();\n\n const nextErrors: { platform: string; apiKey: string } = { platform: \"\", apiKey: \"\" };\n if (!name) nextErrors.platform = \"Platform is required\";\n else if (name.length < 2) nextErrors.platform = \"Platform must be at least 2 characters\";\n else if (name.length > 60) nextErrors.platform = \"Platform must be at most 60 characters\";\n\n // Same pattern for details (edit) page: required + min/max\n if (!key) nextErrors.apiKey = \"API key is required\";\n else if (key.length < 2) nextErrors.apiKey = \"API key must be at least 2 characters\";\n else if (key.length > 200) nextErrors.apiKey = \"API key must be at most 200 characters\";\n\n if (nextErrors.platform || nextErrors.apiKey) {\n setFieldErrors(nextErrors);\n return;\n }\n setSaving(true);\n try {\n if (view === \"add\") {\n const res = await api.addKey({ platform: name, api_key: key });\n if (res.status !== 1) throw new Error(res.message || \"Failed to add key\");\n } else if (view === \"edit\" && editing) {\n const res = await api.updateKey(editing.id, { platform: name, api_key: key });\n if (res.status !== 1) throw new Error(res.message || \"Failed to update key\");\n }\n goBackToList();\n await fetchPage({ page: 1, append: false });\n } catch (err: unknown) {\n setSaveError(err instanceof Error ? err.message : \"Save failed\");\n } finally {\n setSaving(false);\n }\n };\n\n const handleLogout = () => {\n api.clearToken();\n onLogout();\n };\n\n return (\n <>\n {/* Header meta row */}\n <div className=\"kv-dash-meta\">\n <span className=\"kv-badge\">{badgeCount} {badgeCount === 1 ? \"Platform\" : \"Platforms\"}</span>\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\" }}>\n {view === \"list\" && (\n <button className=\"kv-btn kv-btn-primary\" style={{ width: \"auto\", padding: \"8px 12px\", fontSize: 12 }} onClick={startAdd}>\n Add Key\n </button>\n )}\n <button className=\"kv-btn kv-btn-ghost\" style={{ fontSize: 12, padding: \"5px 12px\" }} onClick={handleLogout}>\n Sign out\n </button>\n </div>\n </div>\n\n {view === \"list\" && (\n <>\n <div className=\"kv-toolbar\" style={{ display: \"grid\", gridTemplateColumns: \"1fr auto auto\", gap: 10, margin: \"6px 0 14px\" }}>\n <input\n className=\"kv-input\"\n type=\"text\"\n placeholder=\"Search platforms…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n <select className=\"kv-input\" style={{ padding: \"10px 12px\" }} value={sortBy} onChange={(e) => setSortBy(e.target.value)}>\n <option value=\"\">Sort by</option>\n <option value=\"platform\">Platform</option>\n <option value=\"created_at\">Created</option>\n <option value=\"updated_at\">Updated</option>\n </select>\n <select className=\"kv-input\" style={{ padding: \"10px 12px\" }} value={order} onChange={(e) => setOrder(e.target.value as api.SortOrder)}>\n <option value=\"asc\">Asc</option>\n <option value=\"desc\">Desc</option>\n </select>\n </div>\n\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 12 }}>\n <p className=\"kv-section-title\">Listing</p>\n {loading && (\n <span style={{ fontSize: 12, color: \"var(--kv-text-muted)\" }}>\n Loading platforms…\n </span>\n )}\n </div>\n <div className=\"kv-list-scroll\">\n <div className=\"kv-key-list\">\n {loading && (\n <>\n {Array.from({ length: 6 }).map((_, idx) => (\n <div className=\"kv-key-item kv-skeleton kv-skel-row\" key={`skel-${idx}`}>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10, width: \"100%\" }}>\n <div className=\"kv-skel-line\" style={{ width: \"42%\" }} />\n <div className=\"kv-skel-line\" style={{ width: \"22%\", opacity: 0.75 }} />\n </div>\n </div>\n ))}\n </>\n )}\n\n {!loading && error && (\n <div className=\"kv-alert kv-alert-error\">{error}</div>\n )}\n\n {!loading && !error && items.length === 0 && (\n <div className=\"kv-empty-state\">\n <p>No platforms found.</p>\n </div>\n )}\n\n {!loading && items.map((p) => (\n <div className=\"kv-key-item\" key={p.id}>\n <div className=\"kv-key-info\" style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 12 }}>\n <div style={{ minWidth: 0 }}>\n <div className=\"kv-key-service\">{p.platform}</div>\n <div className=\"kv-key-id\">ID #{p.id}</div>\n </div>\n <div style={{ display: \"flex\", gap: 8, alignItems: \"center\" }}>\n <button\n className=\"kv-btn kv-btn-ghost\"\n style={{ padding: \"6px 10px\", fontSize: 12 }}\n onClick={() => startEdit(p)}\n title=\"Edit\"\n >\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}>\n <EditIcon /> Edit\n </span>\n </button>\n <button\n className=\"kv-btn kv-btn-ghost\"\n style={{ padding: \"6px 10px\", fontSize: 12 }}\n onClick={() => copyKey(p.id)}\n title=\"Copy API key\"\n disabled={copyingId === p.id}\n >\n <span style={{ display: \"inline-flex\", alignItems: \"center\", gap: 6 }}>\n {copyingId === p.id ? <span className=\"kv-spinner\" /> : <CopyIcon />}\n {copiedId === p.id ? \"Copied\" : \"Copy\"}\n </span>\n </button>\n </div>\n </div>\n </div>\n ))}\n </div>\n\n {!loading && hasNext && (\n <button className=\"kv-btn kv-btn-ghost\" style={{ width: \"100%\", marginTop: 12 }} onClick={handleLoadMore} disabled={loadingMore}>\n {loadingMore ? <><span className=\"kv-spinner\" /> Loading…</> : \"Load more\"}\n </button>\n )}\n </div>\n </>\n )}\n\n {(view === \"add\" || view === \"edit\") && (\n <div className=\"kv-add-section\" style={{ borderTop: \"none\", paddingTop: 0 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: 10 }}>\n <p className=\"kv-section-title\" style={{ marginBottom: 0 }}>{view === \"add\" ? \"Add Key\" : \"Edit Key\"}</p>\n <button className=\"kv-btn kv-btn-ghost\" style={{ padding: \"6px 10px\", fontSize: 12 }} onClick={goBackToList}>\n Back\n </button>\n </div>\n {saveError && <div className=\"kv-alert kv-alert-error\" style={{ marginBottom: 12 }}>{saveError}</div>}\n <form className=\"kv-form\" onSubmit={handleSave} autoComplete=\"off\" noValidate>\n {/* Autofill guard: browsers sometimes force-fill saved credentials into unrelated inputs. */}\n <div style={{ position: \"absolute\", left: \"-10000px\", top: \"auto\", width: 1, height: 1, overflow: \"hidden\" }} aria-hidden=\"true\">\n <input type=\"text\" name=\"username\" autoComplete=\"username\" tabIndex={-1} />\n <input type=\"password\" name=\"password\" autoComplete=\"current-password\" tabIndex={-1} />\n </div>\n <div className=\"kv-field\">\n <label className=\"kv-label\">Platform</label>\n <input\n className=\"kv-input\"\n type=\"text\"\n placeholder=\"e.g. shopify, wordpress\"\n name=\"kv_platform\"\n value={platformName}\n onChange={(e) => setPlatformName(e.target.value)}\n autoComplete=\"new-password\"\n autoCorrect=\"off\"\n autoCapitalize=\"none\"\n disabled={detailsLoading}\n />\n {fieldErrors.platform && (\n <div className=\"kv-field-error\">{fieldErrors.platform}</div>\n )}\n </div>\n <div className=\"kv-field\">\n <label className=\"kv-label\">API Key</label>\n <div className=\"kv-add-row\">\n <input\n className=\"kv-input\"\n type={apiKeyVisible ? \"text\" : \"password\"}\n placeholder=\"Paste API key\"\n name=\"kv_api_key\"\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n autoComplete=\"new-password\"\n autoCorrect=\"off\"\n autoCapitalize=\"none\"\n disabled={detailsLoading}\n />\n <button\n className=\"kv-btn kv-btn-ghost\"\n type=\"button\"\n style={{ width: \"auto\", padding: \"11px 14px\" }}\n onClick={() => setApiKeyVisible((v) => !v)}\n aria-label={apiKeyVisible ? \"Hide API key\" : \"Show API key\"}\n title={apiKeyVisible ? \"Hide\" : \"Show\"}\n disabled={detailsLoading}\n >\n <EyeIcon off={apiKeyVisible} />\n </button>\n </div>\n {fieldErrors.apiKey && (\n <div className=\"kv-field-error\">{fieldErrors.apiKey}</div>\n )}\n </div>\n <button className=\"kv-btn kv-btn-primary\" type=\"submit\" disabled={saving}>\n {saving ? <><span className=\"kv-spinner\" /> Saving…</> : \"Save\"}\n </button>\n </form>\n </div>\n )}\n </>\n );\n};\n\nexport default Dashboard;\n","import React, { useEffect, useState } from \"react\";\nimport ReactDOM from \"react-dom/client\";\nimport { isAuthenticated } from \"./api\";\nimport LoginModal from \"./components/LoginModal\";\nimport Dashboard from \"./components/Dashboard\";\nimport cssText from \"./styles/widget.css?inline\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\ntype Position = \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\" | \"center\";\n\nexport interface KeyVaultConfig {\n /** Where to place the floating button. Default: \"bottom-right\" */\n position?: Position;\n /** Horizontal offset from the edge. Default: \"20px\" */\n offsetX?: string;\n /** Vertical offset from the edge. Default: \"20px\" */\n offsetY?: string;\n /** CSS z-index of the widget. Default: 9999 */\n zIndex?: number;\n}\n\n// ─── Position helpers ─────────────────────────────────────────────────────────\n\nfunction buildPositionStyle(pos: Position, offsetX: string, offsetY: string): React.CSSProperties {\n switch (pos) {\n case \"bottom-right\": return { bottom: offsetY, right: offsetX };\n case \"bottom-left\": return { bottom: offsetY, left: offsetX };\n case \"top-right\": return { top: offsetY, right: offsetX };\n case \"top-left\": return { top: offsetY, left: offsetX };\n case \"center\": return { top: \"50%\", left: \"50%\", transform: \"translate(-50%, -50%)\" };\n }\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nconst VaultIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" width={26} height={26}>\n <rect x={3} y={3} width={18} height={18} rx={3} ry={3} />\n <circle cx={12} cy={12} r={4} />\n <circle cx={12} cy={12} r={1.5} />\n <line x1={12} y1={8} x2={12} y2={6} />\n <line x1={12} y1={18} x2={12} y2={16} />\n <line x1={8} y1={12} x2={6} y2={12} />\n <line x1={18} y1={12} x2={16} y2={12} />\n </svg>\n);\n\nconst CloseIcon = () => (\n <svg viewBox=\"0 0 24 24\" width={18} height={18} fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n);\n\n// ─── App component ────────────────────────────────────────────────────────────\n\ninterface AppProps {\n position: Position;\n offsetX: string;\n offsetY: string;\n zIndex: number;\n}\n\nconst App: React.FC<AppProps> = ({ position, offsetX, offsetY, zIndex }) => {\n const [open, setOpen] = useState(() => {\n if (typeof window !== \"undefined\") {\n return new URLSearchParams(window.location.search).has(\"token\");\n }\n return false;\n });\n const [authed, setAuthed] = useState(() => isAuthenticated());\n\n useEffect(() => {\n if (open) {\n // Re-verify auth status when opening (in case token expired)\n setAuthed(isAuthenticated());\n }\n }, [open]);\n\n const posStyle = buildPositionStyle(position, offsetX, offsetY);\n\n const handleOpen = () => {\n setAuthed(isAuthenticated());\n setOpen(true);\n };\n const handleClose = () => setOpen(false);\n const handleLoginSuccess = () => setAuthed(true);\n const handleLogout = () => { setAuthed(false); setOpen(false); };\n\n return (\n <div className=\"kv-root\" style={{ \"--kv-z\": zIndex } as React.CSSProperties}>\n {/* Floating Action Button */}\n <button\n className=\"kv-fab\"\n style={posStyle}\n onClick={handleOpen}\n aria-label=\"Open Key Vault\"\n title=\"Key Vault\"\n >\n <VaultIcon />\n </button>\n\n {/* Modal */}\n {open && (\n <div\n className=\"kv-backdrop\"\n onClick={(e) => { if (e.target === e.currentTarget) handleClose(); }}\n >\n <div className=\"kv-modal\" role=\"dialog\" aria-modal={true} aria-label=\"Key Vault\">\n {/* Header */}\n <div className=\"kv-modal-header\">\n <svg width={28} height={28} viewBox=\"0 0 24 24\" fill=\"none\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <defs>\n <linearGradient id=\"kv-grad\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#8b85ff\" />\n <stop offset=\"100%\" stopColor=\"#c4b5fd\" />\n </linearGradient>\n </defs>\n <rect x={3} y={3} width={18} height={18} rx={3} stroke=\"url(#kv-grad)\" />\n <circle cx={12} cy={12} r={4} stroke=\"url(#kv-grad)\" />\n <circle cx={12} cy={12} r={1.5} stroke=\"url(#kv-grad)\" />\n </svg>\n <span className=\"kv-modal-title\">Key Vault</span>\n <button className=\"kv-close-btn\" onClick={handleClose} aria-label=\"Close\">\n <CloseIcon />\n </button>\n </div>\n\n {/* Body */}\n <div className=\"kv-modal-body\">\n {authed\n ? <Dashboard onLogout={handleLogout} />\n : <LoginModal onLoginSuccess={handleLoginSuccess} />\n }\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\n// ─── initKeyVault ─────────────────────────────────────────────────────────────\n\nlet _initialized = false;\n\n/**\n * Initialize the Key Vault floating widget.\n *\n * ```ts\n * import { initKeyVault } from \"keyvault-widget\";\n * initKeyVault({ apiBaseUrl: \"https://api.example.com\" });\n * ```\n */\nexport function initKeyVault(config: KeyVaultConfig = {}): void {\n if (_initialized) {\n console.warn(\"[keyvault-widget] Already initialized.\");\n return;\n }\n _initialized = true;\n\n const {\n position = \"bottom-right\",\n offsetX = \"20px\",\n offsetY = \"20px\",\n zIndex = 9999,\n } = config;\n\n // Create host element\n const host = document.createElement(\"div\");\n host.id = \"kv-widget-host\";\n document.body.appendChild(host);\n\n // Shadow DOM for full style isolation\n const shadow = host.attachShadow({ mode: \"open\" });\n\n // Inject styles into shadow root\n const styleEl = document.createElement(\"style\");\n styleEl.textContent = cssText;\n shadow.appendChild(styleEl);\n\n // Mount point\n const mountPoint = document.createElement(\"div\");\n shadow.appendChild(mountPoint);\n\n // Render\n const root = ReactDOM.createRoot(mountPoint);\n root.render(\n <React.StrictMode>\n <App position={position} offsetX={offsetX} offsetY={offsetY} zIndex={zIndex} />\n </React.StrictMode>\n );\n}\n\n/**\n * Destroy the Key Vault widget and clean up.\n */\nexport function destroyKeyVault(): void {\n const host = document.getElementById(\"kv-widget-host\");\n if (host) host.remove();\n _initialized = false;\n}\n"],"names":["STORAGE_KEY","BASE_URL","getToken","rawSession","data","rawLocal","setToken","token","remember","clearToken","isAuthenticated","request","path","options","headers","res","message","detail","signup","payload","login","credentials","_a","_b","forgotPassword","resetPassword","new_password","search","toQuery","params","qs","k","v","s","listPlatforms","page","limit","sort_by","order","q","addKey","getKey","credentialId","updateKey","id","FieldError","msg","jsxs","LoginModal","onLoginSuccess","tab","setTab","useState","showForgot","setShowForgot","lEmail","setLEmail","lPassword","setLPassword","lShowPassword","setLShowPassword","lRemember","setLRemember","lLoading","setLLoading","lError","setLError","lFieldErr","setLFieldErr","fEmail","setFEmail","fLoading","setFLoading","fError","setFError","fSuccess","setFSuccess","fFieldErr","setFFieldErr","sEmail","setSEmail","sPassword","setSPassword","sShowPassword","setSSHowPassword","sLoading","setSLoading","sError","setSError","sSuccess","setSSuccess","sSuccessMsg","setSSuccessMsg","sFieldErr","setSFieldErr","resetToken","setResetToken","rPassword","setRPassword","rConfirm","setRConfirm","rShowPassword","setRShowPassword","rShowConfirm","setRShowConfirm","rLoading","setRLoading","rError","setRError","rSuccess","setRSuccess","validateEmail","email","validatePassword","password","validateResetPassword","pwdError","useEffect","validateLogin","errs","validateForgot","validateSignup","handleLogin","e","api.login","err","handleForgot","callback","api.forgotPassword","handleResetPassword","api.resetPassword","url","handleSignup","api.signup","Fragment","jsx","p","EditIcon","CopyIcon","EyeIcon","off","Dashboard","onLogout","view","setView","editing","setEditing","items","setItems","loading","setLoading","loadingMore","setLoadingMore","error","setError","setPage","hasNext","setHasNext","setSearch","debouncedSearch","setDebouncedSearch","sortBy","setSortBy","setOrder","platformName","setPlatformName","apiKey","setApiKey","apiKeyVisible","setApiKeyVisible","saving","setSaving","saveError","setSaveError","fieldErrors","setFieldErrors","detailsLoading","setDetailsLoading","copyingId","setCopyingId","copiedId","setCopiedId","t","badgeCount","useMemo","fetchPage","useCallback","opts","pageToFetch","append","api.listPlatforms","nextItems","prev","handleLoadMore","copyKey","api.getKey","key","ta","startAdd","startEdit","item","goBackToList","handleSave","name","nextErrors","api.addKey","api.updateKey","handleLogout","api.clearToken","_","idx","buildPositionStyle","pos","offsetX","offsetY","VaultIcon","CloseIcon","App","position","zIndex","open","setOpen","authed","setAuthed","posStyle","handleOpen","handleClose","handleLoginSuccess","_initialized","initKeyVault","config","host","shadow","styleEl","cssText","mountPoint","ReactDOM","React","destroyKeyVault"],"mappings":"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"}
|