import * as React from "react"; import { cn } from "@/lib/utils"; /** * Base input primitive. * * v1.4 hardening: defaults `autoComplete` to `"off"` and tells * LastPass / 1Password to skip the field when the caller does not * opt in to a semantic autocomplete value. HealthLog is a health-data * app — letting browsers / password managers autofill measurement, * medication, mood, and AI-token inputs with the user's last-saved * email or account password is at best confusing and at worst leaks * credentials into a free-text field that gets persisted server-side. * * Auth and profile forms (login, register, change-email) keep working * because they already pass an explicit `autoComplete` value — * `"username"`, `"email"`, `"current-password"`, `"new-password"`. When * `autoComplete` is anything other than `"off"`, the LastPass / * 1Password / Bitwarden ignore attrs are dropped so password managers * fill the field normally. * * v1.25.11 — extend the cross-manager opt-out to Bitwarden * (`data-bwignore`) alongside the existing LastPass (`data-lpignore`) * and 1Password (`data-1p-ignore`) hints, so config / secret fields * (AI keys, bearer tokens, integration secrets, webhook URLs) are not * offered for autofill or saved as a login by any of the three. * * v1.4.27 mobile pass: derive a sensible `inputMode` default from the * `type` prop so every numeric / email / tel / url / search field * surfaces the right on-screen keyboard on iOS Safari and Android * Chrome without each call site having to repeat the attribute. Most * `type="number"` fields in HealthLog accept decimals (kg, mmol/L, * sleep hours), so the default is `"decimal"`; integer-only call * sites can still pass `inputMode="numeric"` explicitly. */ function deriveInputMode( type: React.HTMLInputTypeAttribute | undefined, ): React.HTMLAttributes["inputMode"] | undefined { switch (type) { case "number": return "decimal"; case "tel": return "tel"; case "email": return "email"; case "url": return "url"; case "search": return "search"; default: return undefined; } } function Input({ className, type, autoComplete, inputMode, ...props }: React.ComponentProps<"input">) { const resolvedAutoComplete = autoComplete ?? "off"; const skipAutofill = resolvedAutoComplete === "off"; const resolvedInputMode = inputMode ?? deriveInputMode(type); return ( ); } export { Input };