rastrillo / fiesta Public

Task 4: the column footer row, red then green open

On branch fiesta-1-1

Commit b5dcf46, "The column shell's language and scheme menus move to a footer row at the foot of the page". Model: Claude Opus 5.5 (claude-opus-5-5), default reasoning.

Red, before the change

Untagged, against the tree before any edit (go test ./check -run TestTheColumnShellEndsWithItsFooterRow):

--- FAIL: TestTheColumnShellEndsWithItsFooterRow (0.00s)
    footer_test.go:41: layout-column: between <main rst-page id="main"> and the slot there is "\n<details rst-dropdown rst-locale name=\"rst-menus\"><summary>Language<span rst-ca"; the page header must be the first thing in the page
    footer_test.go:44: layout-column: a <details> sits between <main> and the slot
    footer_test.go:64: layout-column: after the slot comes "</main>\n</body>\n</html>\n", want <footer rst-page-foot> next: the footer row, the language menu, the scheme menu, then </footer> and </main>
FAIL
FAIL	amadan.net/rastrillo/fiesta/check	0.003s
FAIL

The same test with the markup moved and the CSS not yet written (the CSS half):

--- FAIL: TestTheColumnShellEndsWithItsFooterRow (0.01s)
    footer_test.go:102: the summary face's rule :active does not list .rst-page__foot .rst-dropdown in its :not(); a footer menu would wear a face in that state
    footer_test.go:102: the summary face's rule :active does not list [rst-page-foot] [rst-dropdown] in its :not(); a footer menu would wear a face in that state
    footer_test.go:102: the summary face's rule :hover does not list .rst-page__foot .rst-dropdown in its :not(); a footer menu would wear a face in that state
    footer_test.go:102: the summary face's rule :hover does not list [rst-page-foot] [rst-dropdown] in its :not(); a footer menu would wear a face in that state
    footer_test.go:102: the summary face's rule :hover:active does not list .rst-page__foot .rst-dropdown in its :not(); a footer menu would wear a face in that state
    footer_test.go:102: the summary face's rule :hover:active does not list [rst-page-foot] [rst-dropdown] in its :not(); a footer menu would wear a face in that state
    footer_test.go:102: the summary face's rule at rest does not list .rst-page__foot .rst-dropdown in its :not(); a footer menu would wear a face in that state
    footer_test.go:102: the summary face's rule at rest does not list [rst-page-foot] [rst-dropdown] in its :not(); a footer menu would wear a face in that state
    footer_test.go:112: tokens.css does not carry [rst-page-foot]:not(:has(> *)) { display: none }
    footer_test.go:112: tokens.css does not carry .rst-page__foot:not(:has(> *)) { display: none }
    footer_test.go:112: tokens.css does not carry [rst-page-foot] [rst-dropdown] { position: static }
    footer_test.go:112: tokens.css does not carry .rst-page__foot .rst-dropdown { position: static }
FAIL
FAIL	amadan.net/rastrillo/fiesta/check	0.008s
FAIL

Gallery, before any edit (go test ./internal/gallery -run TestTheColumnDemosMenusAreInItsFooter), with the twenty-four 'is not in the footer row' lines cut:

--- FAIL: TestTheColumnDemosMenusAreInItsFooter (3.94s)
    frame_test.go:575: day/en/frames/layout-column/default.html: a <details> comes before the page header; the title must be the first thing on the page
    frame_test.go:582: day/en/frames/layout-column/default.html: 1 rst-locale menus, want one, inside rst-page-foot
    frame_test.go:582: day/en/frames/layout-column/default.html: 0 rst-scheme menus, want one, inside rst-page-foot
    frame_test.go:575: day/ar/frames/layout-column/default.html: a <details> comes before the page header; the title must be the first thing on the page
    frame_test.go:582: day/ar/frames/layout-column/default.html: 1 rst-locale menus, want one, inside rst-page-foot
    frame_test.go:582: day/ar/frames/layout-column/default.html: 0 rst-scheme menus, want one, inside rst-page-foot
FAIL
FAIL	amadan.net/rastrillo/fiesta/internal/gallery	3.967s
FAIL

Browser, with the markup moved and the CSS not yet written (./hack/gotest.sh browser check -run 'TestTheFooterRowSitsUnderThePage|TestTheFootersMenusWearNoFace|TestTheFootersMenusOpenOnScreen|TestAnEmptyFooterRowDrawsNothing'):

gotest: on DOCS-T1, driving the harness's own choice (/usr/bin/chromium)
gotest: ./check/ runs its 216 browser tests
--- FAIL: TestTheFooterRowSitsUnderThePage (0.73s)
    footer_browser_test.go:105: / at 1280: the scheme menu ends at 277.1, the footer's content box at 1128.5; the menus belong at the row's inline end
    footer_browser_test.go:108: / at 1280: the two summaries start at 474.5 and 508.3; at this width they fit on one line
    footer_browser_test.go:114: / at 1280: the footer's text is rgb(24, 24, 27), want the muted text colour rgb(82, 82, 92)
    footer_browser_test.go:117: / at 1280: the footer's top border is 0px none rgb(24, 24, 27), want 1px solid rgb(230, 230, 234), the line colour
    footer_browser_test.go:105: /rtl at 1280: the scheme menu ends at 987.9, the footer's content box at 136.5; the menus belong at the row's inline end
    footer_browser_test.go:108: /rtl at 1280: the two summaries start at 474.5 and 508.3; at this width they fit on one line
    footer_browser_test.go:114: /rtl at 1280: the footer's text is rgb(24, 24, 27), want the muted text colour rgb(82, 82, 92)
    footer_browser_test.go:117: /rtl at 1280: the footer's top border is 0px none rgb(24, 24, 27), want 1px solid rgb(230, 230, 234), the line colour
    footer_browser_test.go:105: / at 390: the scheme menu ends at 171.5, the footer's content box at 359.0; the menus belong at the row's inline end
    footer_browser_test.go:108: / at 390: the two summaries start at 723.5 and 767.5; at this width they fit on one line
    footer_browser_test.go:114: / at 390: the footer's text is rgb(24, 24, 27), want the muted text colour rgb(82, 82, 92)
    footer_browser_test.go:117: / at 390: the footer's top border is 0px none rgb(24, 24, 27), want 1px solid rgb(230, 230, 234), the line colour
    footer_browser_test.go:105: /rtl at 390: the scheme menu ends at 203.5, the footer's content box at 16.0; the menus belong at the row's inline end
    footer_browser_test.go:108: /rtl at 390: the two summaries start at 723.5 and 767.5; at this width they fit on one line
    footer_browser_test.go:114: /rtl at 390: the footer's text is rgb(24, 24, 27), want the muted text colour rgb(82, 82, 92)
    footer_browser_test.go:117: /rtl at 390: the footer's top border is 0px none rgb(24, 24, 27), want 1px solid rgb(230, 230, 234), the line colour
    footer_browser_test.go:105: / at 320: the scheme menu ends at 171.5, the footer's content box at 289.0; the menus belong at the row's inline end
    footer_browser_test.go:114: / at 320: the footer's text is rgb(24, 24, 27), want the muted text colour rgb(82, 82, 92)
    footer_browser_test.go:117: / at 320: the footer's top border is 0px none rgb(24, 24, 27), want 1px solid rgb(230, 230, 234), the line colour
    footer_browser_test.go:105: /rtl at 320: the scheme menu ends at 133.5, the footer's content box at 16.0; the menus belong at the row's inline end
    footer_browser_test.go:114: /rtl at 320: the footer's text is rgb(24, 24, 27), want the muted text colour rgb(82, 82, 92)
    footer_browser_test.go:117: /rtl at 320: the footer's top border is 0px none rgb(24, 24, 27), want 1px solid rgb(230, 230, 234), the line colour
--- FAIL: TestTheFootersMenusWearNoFace (0.00s)
    rig_browser_test.go:546: the fixture writes [rst-page-foot], which tokens.css has no class for — the round trip cannot be checked
    footer_browser_test.go:136: the class-spelled footer is "<main class=\"rst-page\"><footer rst-page-foot>\n<details class=\"rst-dropdown rst-locale\" name=\"rst-menus\"><summary>Languag"; it does not carry .rst-page__foot
--- FAIL: TestTheFootersMenusOpenOnScreen (3.52s)
    footer_browser_test.go:255: the widest left-to-right labels are pt-PT's: "Idioma" and "Esquema de cores"
    --- FAIL: TestTheFootersMenusOpenOnScreen/no_anchor_positioning,_anchor.js (1.12s)
        footer_browser_test.go:335: /ltr at 390x640, rst-locale: the panel starts at 560.5, above the footer's foot at 600.5; it must open under the row
        footer_browser_test.go:332: /ltr at 390x640, rst-scheme: the panel spans 13.1 to 199.1 and the footer 16.0 to 359.0; the row must hold its panel
        footer_browser_test.go:335: /rtl at 390x640, rst-locale: the panel starts at 560.5, above the footer's foot at 600.5; it must open under the row
        footer_browser_test.go:335: /ltr at 320x568, rst-locale: the panel starts at 487.5, above the footer's foot at 527.5; it must open under the row
        footer_browser_test.go:332: /ltr at 320x568, rst-scheme: the panel spans 13.1 to 199.1 and the footer 16.0 to 289.0; the row must hold its panel
        footer_browser_test.go:335: /rtl at 320x568, rst-locale: the panel starts at 487.5, above the footer's foot at 527.5; it must open under the row
    --- FAIL: TestTheFootersMenusOpenOnScreen/no_anchor_positioning,_no_scripts (0.86s)
        footer_browser_test.go:335: /ltr at 390x640, rst-locale: the panel starts at 560.5, above the footer's foot at 600.5; it must open under the row
        footer_browser_test.go:335: /rtl at 390x640, rst-locale: the panel starts at 560.5, above the footer's foot at 600.5; it must open under the row
        footer_browser_test.go:335: /ltr at 320x568, rst-locale: the panel starts at 487.5, above the footer's foot at 527.5; it must open under the row
        footer_browser_test.go:335: /rtl at 320x568, rst-locale: the panel starts at 487.5, above the footer's foot at 527.5; it must open under the row
--- FAIL: TestAnEmptyFooterRowDrawsNothing (0.52s)
    footer_browser_test.go:366: footer #empty is display block, want none
    footer_browser_test.go:366: footer #held is display block, want flex
    footer_browser_test.go:366: footer #empty-c is display block, want none
    footer_browser_test.go:366: footer #held-c is display block, want flex
FAIL
FAIL	amadan.net/rastrillo/fiesta/check	4.778s
FAIL

TestTheFootersMenusWearNoFace could not run before: tokens.css had no class for the row to respell it with. The anchored leg of TestTheFootersMenusOpenOnScreen already passed: 1.0's anchor rules already flip a panel. Both are shown catching a change below.

Green

--- PASS: TestTheShellTailsMenusWearNoFace (1.15s)
--- PASS: TestTheFooterRowSitsUnderThePage (0.79s)
--- PASS: TestTheFootersMenusWearNoFace (1.37s)
--- PASS: TestTheFootersMenusOpenOnScreen (3.52s)
--- PASS: TestAnEmptyFooterRowDrawsNothing (0.54s)
--- PASS: TestTheColumnShellEndsWithItsFooterRow (0.01s)
--- PASS: TestEveryThemeAndShellRendersAsTheBaseline (40.35s)
PASS
ok  	amadan.net/rastrillo/fiesta/check	47.731s
ok  	amadan.net/rastrillo/fiesta/check	2.491s
ok  	amadan.net/rastrillo/fiesta/internal/gallery	79.877s
ok  	amadan.net/rastrillo/fiesta/example	0.034s
ok  	amadan.net/rastrillo/fiesta	0.726s
ok  	amadan.net/rastrillo/fiesta/internal/gallery	421.941s

The last line is ./hack/gotest.sh browser internal.gallery -run 'TestPreviewFrameHeightsFit|TestEveryExamplePassesAxe|TestFramePaddingIsAsTheRuleSays' after the heights were raised to the numbers its first run named.

Mutations, each in a scratch worktree, each reverted

M1: delete .rst-page__foot .rst-dropdown, [rst-page-foot] [rst-dropdown] { position: static; }:

--- FAIL: TestTheFootersMenusOpenOnScreen (3.61s)
    --- FAIL: TestTheFootersMenusOpenOnScreen/no_anchor_positioning,_anchor.js (1.14s)
        footer_browser_test.go:332: /rtl at 320x568, rst-locale: the panel spans 15.3 to 201.3 and the footer 16.0 to 289.0; the row must hold its panel
    --- FAIL: TestTheFootersMenusOpenOnScreen/no_anchor_positioning,_no_scripts (0.92s)
        footer_browser_test.go:323: /ltr at 390x640, rst-locale: the panel spans -7.7 to 178.3 of a 390px viewport; it must open on the screen
        footer_browser_test.go:332: /ltr at 390x640, rst-locale: the panel spans -7.7 to 178.3 and the footer 16.0 to 359.0; the row must hold its panel
        footer_browser_test.go:323: /ltr at 320x568, rst-locale: the panel spans -77.7 to 108.3 of a 320px viewport; it must open on the screen
        footer_browser_test.go:332: /ltr at 320x568, rst-locale: the panel spans -77.7 to 108.3 and the footer 16.0 to 289.0; the row must hold its panel
        footer_browser_test.go:323: /rtl at 320x568, rst-locale: the panel spans 138.3 to 324.3 of a 320px viewport; it must open on the screen
        footer_browser_test.go:332: /rtl at 320x568, rst-locale: the panel spans 138.3 to 324.3 and the footer 16.0 to 289.0; the row must hold its panel

M2: take the row's dropdowns out of the four face rules' :not(), both spellings:

--- FAIL: TestTheFootersMenusWearNoFace (1.42s)
    footer_browser_test.go:167: 1280: footer summary [rst-page-foot] [rst-locale] > summary [] is rgb(255, 255, 255) with box-shadow "rgb(208, 212, 220) 0px 0px 0px 1px, rgba(255, 255, 255, 0.8) -0.8px 1px 0px 0px inset, rgba(16, 24, 40, 0.
    footer_browser_test.go:167: 1280: footer summary [rst-page-foot] [rst-locale] > summary [hover] is rgb(247, 248, 250) with box-shadow "rgb(138, 138, 149) 0px 0px 0px 1px, rgba(255, 255, 255, 0.8) -0.8px 1px 0px 0px inset, rgba(16, 24, 4
    footer_browser_test.go:167: 1280: footer summary [rst-page-foot] [rst-locale] > summary [hover active] is rgb(247, 248, 250) with box-shadow "rgb(138, 138, 149) 0px 0px 0px 1px, rgba(16, 24, 40, 0.1) 0px 1px 2px 0px inset"; want no face
    footer_browser_test.go:167: 1280: footer summary [rst-page-foot] [rst-locale] > summary [active] is rgb(255, 255, 255) with box-shadow "rgb(208, 212, 220) 0px 0px 0px 1px, rgba(16, 24, 40, 0.1) 0px 1px 2px 0px inset"; want no face (rgba
    footer_browser_test.go:167: 1280: footer summary [rst-page-foot] [rst-scheme] > summary [] is rgb(255, 255, 255) with box-shadow "rgb(208, 212, 220) 0px 0px 0px 1px, rgba(255, 255, 255, 0.8) -0.8px 1px 0px 0px inset, rgba(16, 24, 40, 0.
    footer_browser_test.go:167: 1280: footer summary [rst-page-foot] [rst-scheme] > summary [hover] is rgb(247, 248, 250) with box-shadow "rgb(138, 138, 149) 0px 0px 0px 1px, rgba(255, 255, 255, 0.8) 0px 1px 0px 0px inset, rgba(16, 24, 40, 
    footer_browser_test.go:167: 1280: footer summary [rst-page-foot] [rst-scheme] > summary [hover active] is rgb(247, 248, 250) with box-shadow "rgb(138, 138, 149) 0px 0px 0px 1px, rgba(16, 24, 40, 0.1) 0px 1px 2px 0px inset"; want no face
    footer_browser_test.go:167: 1280: footer summary [rst-page-foot] [rst-scheme] > summary [active] is rgb(255, 255, 255) with box-shadow "rgb(208, 212, 220) 0px 0px 0px 1px, rgba(16, 24, 40, 0.1) 0px 1px 2px 0px inset"; want no face (rgba
    footer_browser_test.go:167: 1280: footer summary #class-foot .rst-scheme > summary [] is rgb(255, 255, 255) with box-shadow "rgb(208, 212, 220) 0px 0px 0px 1px, rgba(255, 255, 255, 0.8) 0px 1px 0px 0px inset, rgba(16, 24, 40, 0.1) 0px 1
    footer_browser_test.go:167: 1280: footer summary #class-foot .rst-scheme > summary [hover] is rgb(247, 248, 250) with box-shadow "rgb(138, 138, 149) 0px 0px 0px 1px, rgba(255, 255, 255, 0.8) 0px 1px 0px 0px inset, rgba(16, 24, 40, 0.1) 
    footer_browser_test.go:167: 1280: footer summary #class-foot .rst-scheme > summary [hover active] is rgb(247, 248, 250) with box-shadow "rgb(138, 138, 149) 0px 0px 0px 1px, rgba(16, 24, 40, 0.1) 0px 1px 2px 0px inset"; want no face (rgb

M3: :not(:has(> *)) written as :empty:

--- FAIL: TestAnEmptyFooterRowDrawsNothing (0.55s)
    footer_browser_test.go:366: footer #empty is display flex, want none
    footer_browser_test.go:366: footer #empty-c is display flex, want none

M4: the row's justify-content: flex-end as flex-start:

--- FAIL: TestTheFooterRowSitsUnderThePage (0.74s)
    footer_browser_test.go:105: / at 1280: the scheme menu ends at 379.6, the footer's content box at 1128.5; the menus belong at the row's inline end
    footer_browser_test.go:105: /rtl at 1280: the scheme menu ends at 885.4, the footer's content box at 136.5; the menus belong at the row's inline end
    footer_browser_test.go:105: / at 390: the scheme menu ends at 277.7, the footer's content box at 359.0; the menus belong at the row's inline end
    footer_browser_test.go:105: /rtl at 390: the scheme menu ends at 97.3, the footer's content box at 16.0; the menus belong at the row's inline end
    footer_browser_test.go:105: / at 320: the scheme menu ends at 277.7, the footer's content box at 289.0; the menus belong at the row's inline end
    footer_browser_test.go:105: /rtl at 320: the scheme menu ends at 27.3, the footer's content box at 16.0; the menus belong at the row's inline end

M5: the row's justify-content: flex-end as right (physical):

--- FAIL: TestTheFooterRowSitsUnderThePage (0.77s)
    footer_browser_test.go:105: /rtl at 1280: the scheme menu ends at 885.4, the footer's content box at 136.5; the menus belong at the row's inline end
    footer_browser_test.go:105: /rtl at 390: the scheme menu ends at 97.3, the footer's content box at 16.0; the menus belong at the row's inline end
    footer_browser_test.go:105: /rtl at 320: the scheme menu ends at 27.3, the footer's content box at 16.0; the menus belong at the row's inline end

M6: the row's color: var(--rst-text-muted) deleted:

--- FAIL: TestTheFooterRowSitsUnderThePage (0.75s)
    footer_browser_test.go:114: / at 1280: the footer's text is rgb(24, 24, 27), want the muted text colour rgb(82, 82, 92)
    footer_browser_test.go:114: /rtl at 1280: the footer's text is rgb(24, 24, 27), want the muted text colour rgb(82, 82, 92)
    footer_browser_test.go:114: / at 390: the footer's text is rgb(24, 24, 27), want the muted text colour rgb(82, 82, 92)
    footer_browser_test.go:114: /rtl at 390: the footer's text is rgb(24, 24, 27), want the muted text colour rgb(82, 82, 92)
    footer_browser_test.go:114: / at 320: the footer's text is rgb(24, 24, 27), want the muted text colour rgb(82, 82, 92)
    footer_browser_test.go:114: /rtl at 320: the footer's text is rgb(24, 24, 27), want the muted text colour rgb(82, 82, 92)

M7: the anchored panels' position-try-fallbacks cut to flip-inline:

--- FAIL: TestTheFootersMenusOpenOnScreen (3.59s)
    --- FAIL: TestTheFootersMenusOpenOnScreen/anchor_positioning (1.10s)
        footer_browser_test.go:327: /ltr at 390x640, rst-locale: the panel runs from 530.5 to 860.5 of a 640px viewport; anchored, it must flip to stay on the screen
        footer_browser_test.go:327: /ltr at 390x640, rst-scheme: the panel runs from 604.5 to 746.5 of a 640px viewport; anchored, it must flip to stay on the screen
        footer_browser_test.go:327: /rtl at 390x640, rst-locale: the panel runs from 530.5 to 860.5 of a 640px viewport; anchored, it must flip to stay on the screen
        footer_browser_test.go:327: /rtl at 390x640, rst-scheme: the panel runs from 604.5 to 746.5 of a 640px viewport; anchored, it must flip to stay on the screen
        footer_browser_test.go:327: /ltr at 320x568, rst-locale: the panel runs from 531.5 to 861.5 of a 568px viewport; anchored, it must flip to stay on the screen
        footer_browser_test.go:327: /ltr at 320x568, rst-scheme: the panel runs from 531.5 to 673.5 of a 568px viewport; anchored, it must flip to stay on the screen
        footer_browser_test.go:327: /rtl at 320x568, rst-locale: the panel runs from 531.5 to 861.5 of a 568px viewport; anchored, it must flip to stay on the screen
        footer_browser_test.go:327: /rtl at 320x568, rst-scheme: the panel runs from 531.5 to 673.5 of a 568px viewport; anchored, it must flip to stay on the screen

M1 again, untagged:

--- FAIL: TestTheColumnShellEndsWithItsFooterRow (0.01s)
    footer_test.go:112: tokens.css does not carry [rst-page-foot] [rst-dropdown] { position: static }
    footer_test.go:112: tokens.css does not carry .rst-page__foot .rst-dropdown { position: static }
FAIL
FAIL	amadan.net/rastrillo/fiesta/check	0.008s
FAIL

Size

    build_test.go:138: fiesta-plain.css: 153737 bytes, 22431 bytes gzipped (21.9 KiB of the 25.0 KiB limit)
    build_test.go:138: fiesta-signal.css: 153832 bytes, 22542 bytes gzipped (22.0 KiB of the 25.0 KiB limit)
    build_test.go:138: fiesta.css: 156651 bytes, 23146 bytes gzipped (22.6 KiB of the 25.0 KiB limit)

Before: fiesta.css 23,018, fiesta-plain.css 22,303, fiesta-signal.css 22,414. +128 each, against the row's 150.

Hub

CI passed on b5dcf46, all 48 shards (suite step 100 s).

Astra's two fixes: 4ac98b3 (footer panels held to the row's inline end) and 4306038 (the column preview rests short and grows while a menu is open). Hub CI passed on 4306038, all 48 shards (suite step 103 s).

1. The panel's inline end is the row's

The strengthened TestTheFootersMenusOpenOnScreen passes against the footer's CSS, as it should, so it counts as already passing. Mutation: .rst-page__foot .rst-dropdown__menu, [rst-page-foot] [rst-dropdown-menu] { inset-inline-end: auto; inset-inline-start: 0; } appended to tokens.css. The old test stayed green under it:

gotest: ./check/ runs its 216 browser tests
ok  	amadan.net/rastrillo/fiesta/check	3.539s

The new test is red in 32 places: both no-anchor legs × both sizes × LTR/RTL × both spellings × both menus. The first lines:

--- FAIL: TestTheFootersMenusOpenOnScreen (4.75s)
    --- FAIL: TestTheFootersMenusOpenOnScreen/no_anchor_positioning,_anchor.js (1.60s)
        footer_browser_test.go:346: /ltr at 390x640, rst-locale: the panel's inline end is at 202.0 and the row's at 359.0; without anchoring every panel opens flush with the row's inline end
        footer_browser_test.go:346: /ltr at 390x640, rst-scheme: the panel's inline end is at 202.0 and the row's at 359.0; without anchoring every panel opens flush with the row's inline end
        footer_browser_test.go:346: /rtl at 390x640, rst-locale: the panel's inline end is at 173.0 and the row's at 16.0; without anchoring every panel opens flush with the row's inline end
        footer_browser_test.go:346: /rtl at 390x640, rst-scheme: the panel's inline end is at 173.0 and the row's at 16.0; without anchoring every panel opens flush with the row's inline end
        footer_browser_test.go:346: /ltr-class at 390x640, rst-locale: the panel's inline end is at 202.0 and the row's at 359.0; without anchoring every panel opens flush with the row's inline end
        footer_browser_test.go:346: /ltr-class at 390x640, rst-scheme: the panel's inline end is at 202.0 and the row's at 359.0; without anchoring every panel opens flush with the row's inline end
        footer_browser_test.go:346: /rtl-class at 390x640, rst-locale: the panel's inline end is at 173.0 and the row's at 16.0; without anchoring every panel opens flush with the row's inline end
        footer_browser_test.go:346: /rtl-class at 390x640, rst-scheme: the panel's inline end is at 173.0 and the row's at 16.0; without anchoring every panel opens flush with the row's inline end
        footer_browser_test.go:346: /ltr at 320x568, rst-locale: the panel's inline end is at 202.0 and the row's at 289.0; without anchoring every panel opens flush with the row's inline end
        footer_browser_test.go:346: /ltr at 320x568, rst-scheme: the panel's inline end is at 202.0 and the row's at 289.0; without anchoring every panel opens flush with the row's inline end
        footer_browser_test.go:346: /rtl at 320x568, rst-locale: the panel's inline end is at 103.0 and the row's at 16.0; without anchoring every panel opens flush with the row's inline end
        footer_browser_test.go:346: /rtl at 320x568, rst-scheme: the panel's inline end is at 103.0 and the row's at 16.0; without anchoring every panel opens flush with the row's inline end

2. Rest and open heights for the column preview

Red before the change, against a stub of the rest table:

--- FAIL: TestTheColumnPreviewRestsShorterThanItOpens (0.00s)
    heights_test.go:20: layout-column/default has no rest height; its box holds the open footer menus at rest
FAIL
FAIL	amadan.net/rastrillo/fiesta/internal/gallery	0.004s
FAIL

With the rest entry and style written but no view.js or view.css change:

gotest: on DOCS-T1, driving the harness's own choice (/usr/bin/chromium)
gotest: ./internal/gallery/ runs its 84 browser tests
--- FAIL: TestTheColumnPreviewGrowsOnlyWhileAMenuIsOpen (6.72s)
    heights_browser_test.go:802: en/layout-column.html: 1 frames settled; the page requested 1 frame documents
    heights_browser_test.go:813: en/layout-column.html Desktop at rest: the frame is 920px tall, want 640
    heights_browser_test.go:819: en/layout-column.html Desktop with both closed again: the frame is 920px tall, want 640
    heights_browser_test.go:813: en/layout-column.html Mobile at rest: the frame is 1330px tall, want 1110
    heights_browser_test.go:819: en/layout-column.html Mobile with both closed again: the frame is 1330px tall, want 1110
FAIL
FAIL	amadan.net/rastrillo/fiesta/internal/gallery	6.748s
FAIL

Green: the whole internal/gallery browser package (./hack/gotest.sh browser internal.gallery):

ok  	amadan.net/rastrillo/fiesta/internal/gallery	706.987s

Calibration: a scratch sweep of layout-column.html over all twelve locales (FIESTA_SWEEP=full, pages cut to the column). Rest needs at most 621 px on Desktop (ga) and 1085 px on a 320px phone (es, pt-PT), so the rest heights are Desktop 650 and Mobile 1110. Open needs fit the existing open heights in every locale; es and pt-PT need 1327 of 1330.

Mutations, each in a scratch worktree, each reverted:

R1, view.js without the toggle listener:

--- FAIL: TestTheColumnPreviewGrowsOnlyWhileAMenuIsOpen (6.69s)
    heights_browser_test.go:858: en/layout-column.html Desktop with both closed again: the frame is 920px tall, want 650
    heights_browser_test.go:852: en/layout-column.html Mobile at rest: the frame is 1330px tall, want 1110
    heights_browser_test.go:858: en/layout-column.html Mobile with both closed again: the frame is 1330px tall, want 1110

R2, the view.css rest rule deleted:

--- FAIL: TestTheColumnPreviewGrowsOnlyWhileAMenuIsOpen (6.74s)
    heights_browser_test.go:852: en/layout-column.html Desktop at rest: the frame is 920px tall, want 650
    heights_browser_test.go:858: en/layout-column.html Desktop with both closed again: the frame is 920px tall, want 650
    heights_browser_test.go:852: en/layout-column.html Mobile at rest: the frame is 1330px tall, want 1110
    heights_browser_test.go:858: en/layout-column.html Mobile with both closed again: the frame is 1330px tall, want 1110

R3, the rest rule keyed on the style instead of the script's mark:

--- FAIL: TestTheColumnPreviewGrowsOnlyWhileAMenuIsOpen (6.68s)
    heights_browser_test.go:854: en/layout-column.html Desktop with Language open: the frame is 650px tall, want 920
    heights_browser_test.go:856: en/layout-column.html Desktop with Colour scheme opened over Language: the frame is 650px tall, want 920
    heights_browser_test.go:854: en/layout-column.html Mobile with Language open: the frame is 1110px tall, want 1330
    heights_browser_test.go:856: en/layout-column.html Mobile with Colour scheme opened over Language: the frame is 1110px tall, want 1330
    heights_browser_test.go:868: en/layout-column.html, scripts off: the frame is 650px tall, want the open height 920, since nothing can grow it when a menu opens

D1, the rest Desktop height 650 changed to 540:

--- FAIL: TestPreviewFrameHeightsFitTheirContent1of3 (32.85s)
    heights_browser_test.go:584: en/modal.html at 1500px Desktop modal/default: 620px of frame for 144px of document; deliberate headroom, or a number to bring down
    heights_browser_test.go:605: en/modal.html at 1500px Mobile modal/default: 775px of frame for 155px of document; deliberate headroom, or a number to bring down
    heights_browser_test.go:584: en/layout-column.html at 1500px Desktop layout-column/default: its document needs 600px and its frame is 540px; raise its height (previewHeights for Desktop, previewMobileHeights or previewMobileLocaleHeight
    heights_browser_test.go:631: part 1: 25 pages, 57 frames measured and 10 opened over 1 locale(s); 1 short (enforced: true; the Overview's demo read here: true)

D4, the rest Mobile height 1110 changed to 1000:

--- FAIL: TestPreviewFrameHeightsFitAtThePhonesNarrowest7of12 (27.45s)
    heights_browser_test.go:745: en/layout-column.html at 320px layout-column/default: its document needs 1065px and its frame is 1000px; raise its height (previewHeights for Desktop, previewMobileHeights or previewMobileLocaleHeights for M
    heights_browser_test.go:745: ru/locale-menu.html at 320px locale-menu/twelve-languages-current-highlighted: 525px of frame for 76px of document; deliberate headroom, or a number to bring down
    heights_browser_test.go:784: part 7: 24 pages, 50 frames measured and 10 opened at 320px over 4 locale(s), 0 sidebar shells given grace; 1 short (enforced: true)
    heights_browser_test.go:786: Mobile entries to raise, as locale key: height:

D2, the open Desktop height 920 changed to 700:

--- FAIL: TestPreviewFrameHeightsFitTheirContent1of3 (32.51s)
    heights_browser_test.go:584: en/modal.html at 1500px Desktop modal/default: 620px of frame for 144px of document; deliberate headroom, or a number to bring down
    heights_browser_test.go:605: en/modal.html at 1500px Mobile modal/default: 775px of frame for 155px of document; deliberate headroom, or a number to bring down
    heights_browser_test.go:592: en/layout-column.html at 1500px Desktop with its menu (div[rst-dropdown-menu]) open layout-column/default: its document needs 894px and its frame is 700px; raise its height (previewHeights for Desktop, previ
    heights_browser_test.go:631: part 1: 25 pages, 57 frames measured and 10 opened over 1 locale(s); 1 short (enforced: true; the Overview's demo read here: true)

D3, view.js never marks a widget at rest:

--- FAIL: TestPreviewFrameHeightsFitTheirContent1of3 (25.21s)
    heights_browser_test.go:584: en/modal.html at 1500px Desktop modal/default: 620px of frame for 144px of document; deliberate headroom, or a number to bring down
    heights_browser_test.go:605: en/modal.html at 1500px Mobile modal/default: 775px of frame for 155px of document; deliberate headroom, or a number to bring down
    heights_browser_test.go:576: en/layout-column.html at 1500px Desktop layout-column/default: view.js has the widget at rest false, and previewRestHeights says it has a rest height true; the readings would be of the wrong box

(The rest Desktop height at 560 passed the wide drive, which grants every frame 48px at rest: 600 ≤ 560 + 48. 540 is the real shortfall.)