Give a text-only dialog's scrolling body the first focus in every engine
With nothing focusable inside, showModal() focuses the <dialog> itself. Chrome's scroll containers are keyboard-focusable, so there the scrolling body became the focus delegate and modal.css drew its inset ring; Firefox and WebKit focused the dialog, where the arrow keys scroll nothing, and WebKit never lets Tab reach a scroll container, so a keyboard could not read a long text-only dialog there at all. <x-modal> now opens through materialShowModal() (resources/js/dialog.js): showModal(), and when the dialog took the focus itself and its body overflows, the body gets tabindex="0" and the focus, as in Chrome. The tabindex goes when the dialog closes. The body is wire:ignore.self, like the dialog: a Livewire render would otherwise morph the tabindex away and WebKit dropped the focus out of the dialog. ContainmentTest now also checks the focus stays on the body through a render. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
b4a82a4dbe
commit
921c8cef04
@@ -30,9 +30,11 @@
|
||||
* `> [data-md-modal-box] >`, as the divider marks do: a basic dialog opened from inside a
|
||||
* full-screen dialog's body is a descendant of it, and must keep its own title and padding.
|
||||
*
|
||||
* `[data-md-modal-body]:focus-visible` is Chrome's own focusable scroll container catching the
|
||||
* dialog's first focus when nothing inside can take it — M3's 3px secondary indicator, drawn
|
||||
* inside the edge because the box's rounded, overflow-hidden corner would clip one drawn outside.
|
||||
* `[data-md-modal-body]:focus-visible` is the scrolling body catching the dialog's first focus when
|
||||
* nothing inside can take it — natively in Chrome, whose scroll containers are focusable, and
|
||||
* through `materialShowModal()` (resources/js/dialog.js) in Firefox and WebKit — M3's 3px secondary
|
||||
* indicator, drawn inside the edge because the box's rounded, overflow-hidden corner would clip one
|
||||
* drawn outside.
|
||||
*/
|
||||
|
||||
@layer material.reset, material.tokens, material.base, material.layout, material.components, material.text, material.visibility;
|
||||
|
||||
Reference in New Issue
Block a user