diff --git a/docs/WEBUI_BUNDLE_BUDGETS.md b/docs/WEBUI_BUNDLE_BUDGETS.md
index a976ee2..e00340b 100644
--- a/docs/WEBUI_BUNDLE_BUDGETS.md
+++ b/docs/WEBUI_BUNDLE_BUDGETS.md
@@ -89,3 +89,21 @@ The versioned default color document and its deep-clone helper live in
does not load editor defaults or construct a draft. The default values and public
helper names are unchanged; the theme regression checks independent draft clones
as well as synchronous validation, application, and reset.
+
+`PasswordField` keeps ordinary input and reveal controls synchronous. Its
+optional `PasswordGeneratorDialog` is imported only after an enabled, editable
+generator is explicitly opened, not for every sign-in/password field. Loading
+and failures use the shared resource boundary; the underlying field remains
+usable. Closing or revoking generation while loading cannot apply a candidate.
+The secure browser RNG, generation policy, public exports, and explicit
+"Use password" confirmation remain unchanged. The isolated browser fixture
+does not import the Core barrel, so it can verify that the generator is not
+requested before opening it, along with cancel/use and focus restoration.
+
+Deutsch: Normale Passworteingabe und Sichtbarkeitssteuerung bleiben unmittelbar
+verfügbar. Der optionale Generator wird erst beim bewussten Öffnen eines
+aktivierten, bearbeitbaren Felds geladen; Lade- und Fehlerzustände nutzen die
+gemeinsame Ressourcenanzeige. Ohne "Passwort verwenden" wird kein Kandidat
+übernommen. Sichere Browser-Zufallszahlen, Richtlinien und öffentliche
+Schnittstellen bleiben unverändert. Wird die Generierung während des Ladens
+deaktiviert, öffnet eine verspätete Antwort keinen Dialog.
diff --git a/webui/conformance/PasswordFieldMain.tsx b/webui/conformance/PasswordFieldMain.tsx
new file mode 100644
index 0000000..086feb8
--- /dev/null
+++ b/webui/conformance/PasswordFieldMain.tsx
@@ -0,0 +1,64 @@
+import { StrictMode, useState } from "react";
+import { createRoot } from "react-dom/client";
+import Button from "../src/components/Button";
+import FormField from "../src/components/FormField";
+import PasswordField from "../src/components/PasswordField";
+import { PlatformLanguageProvider } from "../src/i18n/LanguageContext";
+import "../src/styles/tokens.css";
+import "../src/styles/layout.css";
+import "../src/styles/forms.css";
+import "../src/styles/components.css";
+import "../src/styles/dialogs.css";
+import "./conformance.css";
+
+const GENERATOR_OPTIONS = { length: 24 };
+
+function PasswordFieldScenario() {
+ const [password, setPassword] = useState("fixture-unchanged-password");
+ const [disabled, setDisabled] = useState(false);
+ const [changes, setChanges] = useState(0);
+
+ return (
+
+
Optional password generator
+
+ {
+ setPassword(value);
+ setChanges((count) => count + 1);
+ }}
+ />
+
+
+
+
+ undefined} />
+
+
+ undefined} />
+
+
+ undefined} />
+
+
+ );
+}
+
+// Deliberately no Core barrel or other fixture imports: they could eagerly load
+// the generator and mask a regression in this field's real lazy boundary.
+createRoot(document.getElementById("root")!).render(
+
+
+
+
+ ,
+);
diff --git a/webui/conformance/password-field.html b/webui/conformance/password-field.html
new file mode 100644
index 0000000..2da649f
--- /dev/null
+++ b/webui/conformance/password-field.html
@@ -0,0 +1,12 @@
+
+
+