Put the link to the content first in the frame, and refuse a page that drops it [#73] - #155
Merged
Merged
Conversation
…t drops it [#73] The frame carries the head, the notice and the footer, and nothing above the text. So a keyboard reader arrives at the top of a page and reaches what they came for through everything the frame put in front of them, which is one key press per link once a navigation lands, and the only reader who can see that cost is the one paying it. The frame now opens with a link to the content, and the content carries the identifier that link reaches. The row refuses a produced page whose first focusable element is not that link. It judges the address as well as the position, because the way this rots is an identifier renamed on one side: both halves are still there, the markup reads correctly, and the key press moves nobody. What the row reads is the first element a tab key stops on, which is the set a browser puts in the order by default and the attribute that overrides it in either direction. That is a floor and the operator says so at the function: an element made focusable through something it does not read is focusable to a reader and invisible here, and a browser-backed leg is where that would be seen. Four near misses rather than one, because the position is lost in four different ways with four different repairs: a link written above it, a control written above it, an address that leaves the page, and a fragment no element answers to. The one in the table is the line deleted from the frame, which is the mistake somebody actually makes. The run asserts both produced pages rather than one, which is what tells a property of the frame from a property of a page. The means is the invariant table this tree already carries, so the change adds no language, no runtime and no dependency, and the row is proved by the suite every other row is proved by. Signed-off-by: Nils Lehnen <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What was wrong
Five issues write into the frame
#73lands, and each of them says thatsomething has to be on every page. The frame carries the head, the affiliation
notice and the footer today, and it carries nothing above the text. So a
keyboard reader arrives at the top of a page and reaches what they came for
through everything the frame put in front of them. On the two pages the build
writes that is one link. Once a navigation lands it is one key press per entry
in it, on every page, and the only reader who can see that cost is the one
paying it.
Nothing refused it either. The row over the notice says the sentence is on the
page and says nothing about what a reader meets first, and no leg reads the
order of a page at all.
What this does
The frame opens with a link to the content, and the content carries the
identifier that link reaches:
page-reaches-the-content-firstrefuses a produced page whose first focusableelement is not that link. It judges the address as well as the position,
because the way this rots is an identifier renamed on one side: both halves are
still there, the markup reads correctly, and the key press moves nobody.
What it reads as focusable is the set a browser puts in the tab order by
default, plus the attribute that overrides that answer in either direction.
That is a floor and the operator says so where the reader will meet it: an
element made focusable through something the row does not read is focusable to
a reader and invisible here, and a browser-backed leg is where that would be
seen.
The proof that it bites
The line deleted from the frame, which is the mistake somebody actually makes.
Both produced pages are refused and each says what a reader reaches instead:
The identifier renamed on the content and not in the link, which is the half
that looks correct:
Both runs against a one-line edit to
templates/page.html.tmplat4abd9f7,reverted afterwards.
The row taken out of the table, which is the direction that says the guard is
not inert:
Four near misses in the suite rather than one, because the position is lost in
four ways with four different repairs: a link written above it, a control
written above it, an address that leaves the page, and a fragment no element
answers to. A fifth case holds what must be left alone, which is what is in
front of the link and out of the tab order, because a row that refused a hidden
field or a region a script moves focus to is a row somebody switches off.
The run over the fixture tree asserts both produced pages rather than one. That
is what tells a property of the frame from a property of a page, and it is the
statement
#153added for the notice.What else already reads this anchor
The links leg refuses a fragment pointing at an identifier no element carries,
from the other direction, so the two halves are held to each other by two legs
rather than one:
The gate
Run at
4abd9f7.What it costs
74 bytes on each page, which is the element and the two attributes:
Run 2026-08-13, at
807975band at4abd9f7.The means
The invariant table this tree already carries. The change adds no language, no
runtime and no dependency, the row is decided by reading bytes the build wrote,
and it is proved by the suite every other row is proved by.
What this does not do, and what it leaves open
It does not close
#73. Two of that issue's conditions were already met, andthe third landed with
#153. This is the static half of the fourth. The clauseasks that the link be shown to be the first focusable element by the headless
run, and there is no headless run:
#63is where the browser is pinned, anduntil it lands the statement here is made by reading the produced bytes rather
than by a browser walking the tab order. The last condition, that the footer
links resolve from a page at every depth the site produces including the
not-found page, is untouched by this and waits on
#30.The link is visible rather than hidden until it is focused, because these pages
carry no stylesheet at all. That is a fact about today rather than a design
choice, and the day a stylesheet lands is the day it has to be decided.
The row says nothing about whether the link skips anything. On the pages the
build writes today it skips nothing, since there is no navigation between the
top of the page and the content. It is in the frame now so that the navigation
arrives behind it rather than in front of it.
Second reader
This change carries no second reader. What stands in place of one is the
evidence above: every claim in this body is a command with its output, run at
the commit being pushed rather than in a working tree, and the two directions
of the proof are here rather than the passing one alone.