diff --git a/web/src/Login.tsx b/web/src/Login.tsx
index 2c9cea4..ccb6e8b 100644
--- a/web/src/Login.tsx
+++ b/web/src/Login.tsx
@@ -2,6 +2,19 @@ import { FormEvent, useState } from 'react'
import { api } from './api'
import { Spinner } from './ui'
+// Drawn, not typed: 👁 is an emoji on phones, full colour and its own size. Outline strokes
+// match the glyphs in the rail and the power button.
+const EyeIcon = (
+
+)
+const EyeOffIcon = (
+
+)
+
const USER_KEY = 'hamlab.user' // the last account signed in on this device, offered again
export default function Login({ onLogin }: { onLogin: () => void }) {
@@ -9,6 +22,9 @@ export default function Login({ onLogin }: { onLogin: () => void }) {
const [pw, setPw] = useState('')
const [err, setErr] = useState('')
const [busy, setBusy] = useState(false)
+ // Shown on request: a generated password is typed by hand off a message, and a wrong
+ // character looks exactly like a wrong password from here.
+ const [show, setShow] = useState(false)
async function submit(e: FormEvent) {
e.preventDefault()
@@ -26,8 +42,17 @@ export default function Login({ onLogin }: { onLogin: () => void }) {
setUser(e.target.value)} disabled={busy} />
- setPw(e.target.value)} disabled={busy} />
+
+ {/* revealed, the field is a text field, so the keyboard would otherwise offer to
+ capitalise and correct what is typed into it */}
+ setPw(e.target.value)} disabled={busy} />
+
+