diff --git a/src/components/AgentModelsDialog.tsx b/src/components/AgentModelsDialog.tsx
index 95ae4397c..0f88396b4 100644
--- a/src/components/AgentModelsDialog.tsx
+++ b/src/components/AgentModelsDialog.tsx
@@ -22,7 +22,12 @@ import {
serializeAgentConfig,
} from "../lib/models/agent-config-serialization";
import { formatCompactModelId, formatModelDisplay } from "../lib/models/display";
-import { type ModelOverrideMap, type ModelOverrideTarget } from "../lib/models/overrides";
+import type { ModelOverrideMap, ModelOverrideTarget } from "../lib/models/overrides";
+import {
+ DismissGuardNotice,
+ handleRovingFocusKeyDown,
+ useAccessibleDialog,
+} from "./accessibility/AccessibleDialog";
import type { ComposerModelOption } from "./ChatComposer";
import { CopyRawButton } from "./chat/CopyRawButton";
import type {
@@ -161,18 +166,13 @@ export function AgentModelsDialog({
}
}, [open]);
- useEffect(() => {
- if (!open) {
- return;
- }
- const handler = (event: KeyboardEvent) => {
- if (event.key === "Escape") {
- onClose();
- }
- };
- window.addEventListener("keydown", handler);
- return () => window.removeEventListener("keydown", handler);
- }, [open, onClose]);
+ const accessibleDialog = useAccessibleDialog({
+ open,
+ onClose,
+ hasUnsavedChanges: Boolean(
+ pasteValue.trim() || profileName.trim() || profileDescription.trim(),
+ ),
+ });
const serialized = useMemo(
() =>
@@ -329,13 +329,17 @@ export function AgentModelsDialog({
);
return (
-
+
event.stopPropagation()}
+ aria-describedby={
+ accessibleDialog.showDismissGuard ? "agent-models-dismiss-warning" : undefined
+ }
+ tabIndex={-1}
>
@@ -352,19 +356,22 @@ export function AgentModelsDialog({
className="icon-button"
type="button"
aria-label="Close agent models"
- onClick={onClose}
+ data-dialog-initial-focus
+ onClick={accessibleDialog.requestClose}
>
-