The landing page uses Fiesta 1.1's snippet, copy, side nav, button tabs and phone layouts, and drops its own
The landing page carried six stand-ins for things Fiesta lacked: a copyable code box, its clipboard script, a sidebar that turns into a row, theme tabs as anchors whose navigation site.js cancelled, and two phone overrides for the sample's stats and statuses. 1.1.0 has all six, and the page loads Fiesta through /1/ like any user, so keeping its own copies would mean two versions of each to maintain, drifting apart. - The install line is rst-snippet, and copy.js does the copying. The site's own words go in as data-rst-copy-done and data-rst-copy-failed from its catalog's copied and copy.failed, so its failure sentence still names the link tag. site.css keeps one rule to centre the box in the hero. - The sample is rst-side with rst-side-nav. It answers to the window's width through Fiesta's container query instead of the site's 560px media rule. site.css keeps the window's 300px minimum height. - The theme choice is buttons with aria-pressed in a role="group" rst-seg-tabs. They change the page in place and have no address, and the bar is hidden without script. markTheme writes "true" or "false" on every button. The course tabs stay links, which still jump to their course with no script. - The stats are rst-stats="pairs" and the statuses rst-status="inline". The site's phone grid and flex overrides go. - site.js's pane switching now selects [rst-side-nav] a. Left on .site-side, it would find no links and show every pane at once. site/FOLLOW-UPS.md is empty now, so it is deleted, and neither file's header comment names it any more. Adapted preservation tests. The names and assertions are unchanged; only the selectors that named the site's classes moved: .site-copy to [rst-snippet-copy], #install .site-live to #install [rst-snippet-status], #sample .site-side a to #sample [rst-side-nav] a, and [data-site-theme][aria-current] to [data-site-theme][aria-pressed="true"]. Run against the unchanged page, all seven tests that use them failed by selector: TestTheLandingHasNoHorizontalScrollAt320, TestTheLandingReadsWithNoScript, TestABrokenStoredThemeFallsBackToDay, TestEverySamplePaneAndCourseSwitches, TestTheSampleFormsStayOnThePage, TestTheSampleSwitchDrags and TestCopy. After the change, go test ./internal/www and every internal/www browser test pass, against releases/1.1.0 through /1/.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 files changed,
+44
−117
internal/www/landing_browser_test.go+9 −9site/FOLLOW-UPS.md+0 −23site/landing/page.html.tmpl+11 −11site/static/site.css+10 −32site/static/site.js+14 −42
CI passed — run details
CI log
=== gofmt ===
=== no-rastrillo ===
go test -run '^(TestFiestaNeverImportsRastrillo|TestThePublicPackagesLinkNoBrowser)$' -count=1 .
ok amadan.net/rastrillo/fiesta 0.152s
=== size ===
go test ./internal/build -run '^TestTheOneLinkIsUnder25KiBGzipped$' -count=1 -v
=== RUN TestTheOneLinkIsUnder25KiBGzipped
build_test.go:138: fiesta-plain.css: 158347 bytes, 23104 bytes gzipped (22.6 KiB of the 25.0 KiB limit)
build_test.go:138: fiesta-signal.css: 158442 bytes, 23217 bytes gzipped (22.7 KiB of the 25.0 KiB limit)
build_test.go:138: fiesta.css: 161261 bytes, 23823 bytes gzipped (23.3 KiB of the 25.0 KiB limit)
--- PASS: TestTheOneLinkIsUnder25KiBGzipped (0.02s)
PASS
ok amadan.net/rastrillo/fiesta/internal/build 0.026s
=== history ===
history: 37 commits; release tags: v1.0.0
=== suite ===
--- shard 0 of 48 ---
==> shard 0 of 48: make root
go build ./...
go vet ./...
FIESTA_TEST_REQUIRE_NODE=1 FIESTA_TEST_REQUIRE_GIT=1 FIESTA_TEST_REQUIRE_TAGS=1 ./hack/gotest.sh root 'internal/gallery@3 cmd/fiesta@2 internal/www@2'
ok amadan.net/rastrillo/fiesta 2.845s
ok amadan.net/rastrillo/fiesta/check 8.021s
ok amadan.net/rastrillo/fiesta/example 0.123s
? amadan.net/rastrillo/fiesta/hack/seed/english [no test files]
ok amadan.net/rastrillo/fiesta/internal/axe 0.123s
ok amadan.net/rastrillo/fiesta/internal/build 1.069s
ok amadan.net/rastrillo/fiesta/internal/codeview 0.005s
? amadan.net/rastrillo/fiesta/internal/harness [no test files]
ok amadan.net/rastrillo/fiesta/internal/markup 0.008s
ok amadan.net/rastrillo/fiesta/internal/nodetest 0.367s
ok amadan.net/rastrillo/fiesta/internal/site 2.737s
ok amadan.net/rastrillo/fiesta/internal/tokens 0.006s
suite: root took 11s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m9.300000s 0m1.710000s
--- shard 1 of 48 ---
==> shard 1 of 48: make test.internal.gallery~1of3
FIESTA_TEST_REQUIRE_NODE=1 FIESTA_TEST_REQUIRE_GIT=1 FIESTA_TEST_REQUIRE_TAGS=1 ./hack/gotest.sh test 'internal.gallery~1of3'
gotest: slice 1 of 3 of ./internal/gallery/ runs 36 of 108 test tests
ok amadan.net/rastrillo/fiesta/internal/gallery 63.901s
suite: test.internal.gallery~1of3 took 65s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m48.360000s 0m1.110000s
--- shard 2 of 48 ---
==> shard 2 of 48: make test.internal.gallery~2of3
FIESTA_TEST_REQUIRE_NODE=1 FIESTA_TEST_REQUIRE_GIT=1 FIESTA_TEST_REQUIRE_TAGS=1 ./hack/gotest.sh test 'internal.gallery~2of3'
gotest: slice 2 of 3 of ./internal/gallery/ runs 36 of 108 test tests
ok amadan.net/rastrillo/fiesta/internal/gallery 66.716s
suite: test.internal.gallery~2of3 took 68s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m49.670000s 0m1.260000s
--- shard 3 of 48 ---
==> shard 3 of 48: make test.internal.gallery~3of3
FIESTA_TEST_REQUIRE_NODE=1 FIESTA_TEST_REQUIRE_GIT=1 FIESTA_TEST_REQUIRE_TAGS=1 ./hack/gotest.sh test 'internal.gallery~3of3'
gotest: slice 3 of 3 of ./internal/gallery/ runs 36 of 108 test tests
ok amadan.net/rastrillo/fiesta/internal/gallery 61.453s
suite: test.internal.gallery~3of3 took 63s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m45.260000s 0m1.010000s
--- shard 4 of 48 ---
==> shard 4 of 48: make test.cmd.fiesta~1of2
FIESTA_TEST_REQUIRE_NODE=1 FIESTA_TEST_REQUIRE_GIT=1 FIESTA_TEST_REQUIRE_TAGS=1 ./hack/gotest.sh test 'cmd.fiesta~1of2'
gotest: slice 1 of 2 of ./cmd/fiesta/ runs 7 of 12 test tests
ok amadan.net/rastrillo/fiesta/cmd/fiesta 48.356s
suite: test.cmd.fiesta~1of2 took 50s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m32.760000s 0m2.100000s
--- shard 5 of 48 ---
==> shard 5 of 48: make test.cmd.fiesta~2of2
FIESTA_TEST_REQUIRE_NODE=1 FIESTA_TEST_REQUIRE_GIT=1 FIESTA_TEST_REQUIRE_TAGS=1 ./hack/gotest.sh test 'cmd.fiesta~2of2'
gotest: slice 2 of 2 of ./cmd/fiesta/ runs 5 of 12 test tests
ok amadan.net/rastrillo/fiesta/cmd/fiesta 50.533s
suite: test.cmd.fiesta~2of2 took 52s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m34.990000s 0m2.340000s
--- shard 6 of 48 ---
==> shard 6 of 48: make test.internal.www~1of2
FIESTA_TEST_REQUIRE_NODE=1 FIESTA_TEST_REQUIRE_GIT=1 FIESTA_TEST_REQUIRE_TAGS=1 ./hack/gotest.sh test 'internal.www~1of2'
gotest: slice 1 of 2 of ./internal/www/ runs 11 of 25 test tests
ok amadan.net/rastrillo/fiesta/internal/www 62.309s
suite: test.internal.www~1of2 took 64s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m46.300000s 0m1.460000s
--- shard 7 of 48 ---
==> shard 7 of 48: make test.internal.www~2of2
FIESTA_TEST_REQUIRE_NODE=1 FIESTA_TEST_REQUIRE_GIT=1 FIESTA_TEST_REQUIRE_TAGS=1 ./hack/gotest.sh test 'internal.www~2of2'
gotest: slice 2 of 2 of ./internal/www/ runs 14 of 25 test tests
ok amadan.net/rastrillo/fiesta/internal/www 60.747s
suite: test.internal.www~2of2 took 63s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m44.430000s 0m1.560000s
--- shard 8 of 48 ---
==> shard 8 of 48: make staticcheck
go run honnef.co/go/tools/cmd/staticcheck@v0.8.2 -tags browser ./...
suite: staticcheck took 2s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m0.830000s 0m0.220000s
--- shard 9 of 48 ---
==> shard 9 of 48: make govulncheck
go run golang.org/x/vuln/cmd/govulncheck@v1.8.0 ./...
=== Symbol Results ===
No vulnerabilities found.
Your code is affected by 0 vulnerabilities.
This scan also found 2 vulnerabilities in packages you import and 5
vulnerabilities in modules you require, but your code doesn't appear to call
these vulnerabilities.
Use '-show verbose' for more details.
suite: govulncheck took 5s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m2.970000s 0m0.410000s
--- shard 10 of 48 ---
==> shard 10 of 48: make gitleaks
go run github.com/zricethezav/gitleaks/v8@v8.30.1 git --no-banner --redact --log-opts='--full-history --diff-filter=tuxdb HEAD' .
[90m9:24AM[0m [32mINF[0m [1mUnknown SCM platform. Use --platform to include links in findings.[0m [36mhost=[0mamadan.net
[90m9:24AM[0m [32mINF[0m [1m37 commits scanned.[0m
[90m9:24AM[0m [32mINF[0m [1mscanned ~9274069 bytes (9.27 MB) in 2.79s[0m
[90m9:24AM[0m [32mINF[0m [1mno leaks found[0m
suite: gitleaks took 3s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m8.110000s 0m0.190000s
--- shard 11 of 48 ---
==> shard 11 of 48: make browser.internal.harness
./hack/gotest.sh browser 'internal.harness'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: ./internal/harness/ runs its 10 browser tests
ok amadan.net/rastrillo/fiesta/internal/harness 3.985s
suite: browser.internal.harness took 6s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m1.630000s 0m1.260000s
--- shard 12 of 48 ---
==> shard 12 of 48: make browser.check~1of13
./hack/gotest.sh browser 'check~1of13'
gotest: on ip-172-31-27-73, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 1 of 13 of ./check/ runs 17 of 228 browser tests
ok amadan.net/rastrillo/fiesta/check 89.669s
suite: browser.check~1of13 took 92s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m41.100000s 0m13.650000s
--- shard 13 of 48 ---
==> shard 13 of 48: make browser.check~2of13
./hack/gotest.sh browser 'check~2of13'
gotest: on ip-172-31-27-73, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 2 of 13 of ./check/ runs 17 of 228 browser tests
ok amadan.net/rastrillo/fiesta/check 98.857s
suite: browser.check~2of13 took 102s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m47.970000s 0m15.320000s
--- shard 14 of 48 ---
==> shard 14 of 48: make browser.check~3of13
./hack/gotest.sh browser 'check~3of13'
gotest: on ip-172-31-27-73, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 3 of 13 of ./check/ runs 16 of 228 browser tests
ok amadan.net/rastrillo/fiesta/check 89.546s
suite: browser.check~3of13 took 92s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m35.260000s 0m12.020000s
--- shard 15 of 48 ---
==> shard 15 of 48: make browser.check~4of13
./hack/gotest.sh browser 'check~4of13'
gotest: on ip-172-31-27-73, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 4 of 13 of ./check/ runs 16 of 228 browser tests
ok amadan.net/rastrillo/fiesta/check 90.345s
suite: browser.check~4of13 took 93s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m47.280000s 0m16.560000s
--- shard 16 of 48 ---
==> shard 16 of 48: make browser.check~5of13
./hack/gotest.sh browser 'check~5of13'
gotest: on ip-172-31-27-73, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 5 of 13 of ./check/ runs 18 of 228 browser tests
ok amadan.net/rastrillo/fiesta/check 81.043s
suite: browser.check~5of13 took 84s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m33.540000s 0m14.000000s
--- shard 17 of 48 ---
==> shard 17 of 48: make browser.check~6of13
./hack/gotest.sh browser 'check~6of13'
gotest: on ip-172-31-27-73, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 6 of 13 of ./check/ runs 18 of 228 browser tests
ok amadan.net/rastrillo/fiesta/check 84.761s
suite: browser.check~6of13 took 87s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m39.640000s 0m16.130000s
--- shard 18 of 48 ---
==> shard 18 of 48: make browser.check~7of13
./hack/gotest.sh browser 'check~7of13'
gotest: on ip-172-31-27-73, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 7 of 13 of ./check/ runs 18 of 228 browser tests
ok amadan.net/rastrillo/fiesta/check 83.926s
suite: browser.check~7of13 took 87s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m38.080000s 0m14.000000s
--- shard 19 of 48 ---
==> shard 19 of 48: make browser.check~8of13
./hack/gotest.sh browser 'check~8of13'
gotest: on ip-172-31-27-73, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 8 of 13 of ./check/ runs 18 of 228 browser tests
ok amadan.net/rastrillo/fiesta/check 90.625s
suite: browser.check~8of13 took 94s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m36.920000s 0m14.590000s
--- shard 20 of 48 ---
==> shard 20 of 48: make browser.check~9of13
./hack/gotest.sh browser 'check~9of13'
gotest: on ip-172-31-27-73, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 9 of 13 of ./check/ runs 18 of 228 browser tests
ok amadan.net/rastrillo/fiesta/check 77.004s
suite: browser.check~9of13 took 80s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m24.580000s 0m9.830000s
--- shard 21 of 48 ---
==> shard 21 of 48: make browser.check~10of13
./hack/gotest.sh browser 'check~10of13'
gotest: on ip-172-31-27-73, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 10 of 13 of ./check/ runs 18 of 228 browser tests
ok amadan.net/rastrillo/fiesta/check 83.032s
suite: browser.check~10of13 took 86s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m31.930000s 0m12.220000s
--- shard 22 of 48 ---
==> shard 22 of 48: make browser.check~11of13
./hack/gotest.sh browser 'check~11of13'
gotest: on ip-172-31-27-73, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 11 of 13 of ./check/ runs 18 of 228 browser tests
ok amadan.net/rastrillo/fiesta/check 82.185s
suite: browser.check~11of13 took 85s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m34.360000s 0m13.090000s
--- shard 23 of 48 ---
==> shard 23 of 48: make browser.check~12of13
./hack/gotest.sh browser 'check~12of13'
gotest: on ip-172-31-27-73, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 12 of 13 of ./check/ runs 18 of 228 browser tests
ok amadan.net/rastrillo/fiesta/check 87.922s
suite: browser.check~12of13 took 91s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m39.650000s 0m14.910000s
--- shard 24 of 48 ---
==> shard 24 of 48: make browser.check~13of13
./hack/gotest.sh browser 'check~13of13'
gotest: on ip-172-31-27-73, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: slice 13 of 13 of ./check/ runs 18 of 228 browser tests
ok amadan.net/rastrillo/fiesta/check 82.793s
suite: browser.check~13of13 took 86s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m33.050000s 0m12.080000s
--- shard 25 of 48 ---
==> shard 25 of 48: make browser.internal.gallery~1of18
./hack/gotest.sh browser 'internal.gallery~1of18'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 1 of 18 of ./internal/gallery/ runs 6 of 84 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 39.970s
suite: browser.internal.gallery~1of18 took 43s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m11.900000s 0m3.430000s
--- shard 26 of 48 ---
==> shard 26 of 48: make browser.internal.gallery~2of18
./hack/gotest.sh browser 'internal.gallery~2of18'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 2 of 18 of ./internal/gallery/ runs 5 of 84 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 52.421s
suite: browser.internal.gallery~2of18 took 56s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m11.050000s 0m2.980000s
--- shard 27 of 48 ---
==> shard 27 of 48: make browser.internal.gallery~3of18
./hack/gotest.sh browser 'internal.gallery~3of18'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 3 of 18 of ./internal/gallery/ runs 5 of 84 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 60.296s
suite: browser.internal.gallery~3of18 took 63s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m12.160000s 0m3.680000s
--- shard 28 of 48 ---
==> shard 28 of 48: make browser.internal.gallery~4of18
./hack/gotest.sh browser 'internal.gallery~4of18'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 4 of 18 of ./internal/gallery/ runs 5 of 84 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 50.583s
suite: browser.internal.gallery~4of18 took 54s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m10.760000s 0m2.840000s
--- shard 29 of 48 ---
==> shard 29 of 48: make browser.internal.gallery~5of18
./hack/gotest.sh browser 'internal.gallery~5of18'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 5 of 18 of ./internal/gallery/ runs 6 of 84 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 64.043s
suite: browser.internal.gallery~5of18 took 67s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m15.460000s 0m5.440000s
--- shard 30 of 48 ---
==> shard 30 of 48: make browser.internal.gallery~6of18
./hack/gotest.sh browser 'internal.gallery~6of18'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 6 of 18 of ./internal/gallery/ runs 5 of 84 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 56.365s
suite: browser.internal.gallery~6of18 took 60s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m12.430000s 0m3.850000s
--- shard 31 of 48 ---
==> shard 31 of 48: make browser.internal.gallery~7of18
./hack/gotest.sh browser 'internal.gallery~7of18'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 7 of 18 of ./internal/gallery/ runs 5 of 84 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 57.117s
suite: browser.internal.gallery~7of18 took 60s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m10.270000s 0m2.640000s
--- shard 32 of 48 ---
==> shard 32 of 48: make browser.internal.gallery~8of18
./hack/gotest.sh browser 'internal.gallery~8of18'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 8 of 18 of ./internal/gallery/ runs 5 of 84 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 59.955s
suite: browser.internal.gallery~8of18 took 63s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m14.520000s 0m4.620000s
--- shard 33 of 48 ---
==> shard 33 of 48: make browser.internal.gallery~9of18
./hack/gotest.sh browser 'internal.gallery~9of18'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 9 of 18 of ./internal/gallery/ runs 6 of 84 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 69.728s
suite: browser.internal.gallery~9of18 took 73s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m20.050000s 0m7.560000s
--- shard 34 of 48 ---
==> shard 34 of 48: make browser.internal.gallery~10of18
./hack/gotest.sh browser 'internal.gallery~10of18'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 10 of 18 of ./internal/gallery/ runs 2 of 84 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 64.332s
suite: browser.internal.gallery~10of18 took 67s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m10.510000s 0m2.690000s
--- shard 35 of 48 ---
==> shard 35 of 48: make browser.internal.gallery~11of18
./hack/gotest.sh browser 'internal.gallery~11of18'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 11 of 18 of ./internal/gallery/ runs 2 of 84 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 66.049s
suite: browser.internal.gallery~11of18 took 69s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m10.970000s 0m2.800000s
--- shard 36 of 48 ---
==> shard 36 of 48: make browser.internal.gallery~12of18
./hack/gotest.sh browser 'internal.gallery~12of18'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 12 of 18 of ./internal/gallery/ runs 2 of 84 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 67.690s
suite: browser.internal.gallery~12of18 took 71s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m15.780000s 0m4.890000s
--- shard 37 of 48 ---
==> shard 37 of 48: make browser.internal.gallery~13of18
./hack/gotest.sh browser 'internal.gallery~13of18'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 13 of 18 of ./internal/gallery/ runs 4 of 84 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 67.313s
suite: browser.internal.gallery~13of18 took 71s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m15.800000s 0m5.330000s
--- shard 38 of 48 ---
==> shard 38 of 48: make browser.internal.gallery~14of18
./hack/gotest.sh browser 'internal.gallery~14of18'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 14 of 18 of ./internal/gallery/ runs 5 of 84 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 69.147s
suite: browser.internal.gallery~14of18 took 73s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m15.580000s 0m5.270000s
--- shard 39 of 48 ---
==> shard 39 of 48: make browser.internal.gallery~15of18
./hack/gotest.sh browser 'internal.gallery~15of18'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 15 of 18 of ./internal/gallery/ runs 5 of 84 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 70.763s
suite: browser.internal.gallery~15of18 took 74s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m16.090000s 0m5.590000s
--- shard 40 of 48 ---
==> shard 40 of 48: make browser.internal.gallery~16of18
./hack/gotest.sh browser 'internal.gallery~16of18'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 16 of 18 of ./internal/gallery/ runs 5 of 84 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 66.760s
suite: browser.internal.gallery~16of18 took 70s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m13.240000s 0m4.480000s
--- shard 41 of 48 ---
==> shard 41 of 48: make browser.internal.gallery~17of18
./hack/gotest.sh browser 'internal.gallery~17of18'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 17 of 18 of ./internal/gallery/ runs 5 of 84 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 70.617s
suite: browser.internal.gallery~17of18 took 74s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m15.870000s 0m5.750000s
--- shard 42 of 48 ---
==> shard 42 of 48: make browser.internal.gallery~18of18
./hack/gotest.sh browser 'internal.gallery~18of18'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 18 of 18 of ./internal/gallery/ runs 6 of 84 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery 71.683s
suite: browser.internal.gallery~18of18 took 75s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m17.280000s 0m6.570000s
--- shard 43 of 48 ---
==> shard 43 of 48: make browser.internal.gallery.history
./hack/gotest.sh browser 'internal.gallery.history'
gotest: on ip-172-31-27-73, driving /opt/amadan-browser/chromium-1234/chrome-linux/chrome
gotest: ./internal/gallery/history/ runs its 3 browser tests
ok amadan.net/rastrillo/fiesta/internal/gallery/history 34.516s
suite: browser.internal.gallery.history took 37s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m21.050000s 0m2.070000s
--- shard 44 of 48 ---
==> shard 44 of 48: make browser.internal.www~1of4
./hack/gotest.sh browser 'internal.www~1of4'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 1 of 4 of ./internal/www/ runs 4 of 22 browser tests
ok amadan.net/rastrillo/fiesta/internal/www 70.812s
suite: browser.internal.www~1of4 took 75s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m31.600000s 0m2.210000s
--- shard 45 of 48 ---
==> shard 45 of 48: make browser.internal.www~2of4
./hack/gotest.sh browser 'internal.www~2of4'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 2 of 4 of ./internal/www/ runs 6 of 22 browser tests
ok amadan.net/rastrillo/fiesta/internal/www 69.549s
suite: browser.internal.www~2of4 took 73s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m46.000000s 0m2.790000s
--- shard 46 of 48 ---
==> shard 46 of 48: make browser.internal.www~3of4
./hack/gotest.sh browser 'internal.www~3of4'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 3 of 4 of ./internal/www/ runs 6 of 22 browser tests
ok amadan.net/rastrillo/fiesta/internal/www 83.214s
suite: browser.internal.www~3of4 took 87s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m52.650000s 0m3.110000s
--- shard 47 of 48 ---
==> shard 47 of 48: make browser.internal.www~4of4
./hack/gotest.sh browser 'internal.www~4of4'
gotest: on ip-172-31-27-73, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 4 of 4 of ./internal/www/ runs 6 of 22 browser tests
ok amadan.net/rastrillo/fiesta/internal/www 78.785s
suite: browser.internal.www~4of4 took 83s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m46.210000s 0m3.010000s
Intent
diff --git a/internal/www/landing_browser_test.go b/internal/www/landing_browser_test.go| index a99b43d..071c725 100644 |
| --- a/internal/www/landing_browser_test.go |
| +++ b/internal/www/landing_browser_test.go |
| @@ -304,7 +304,7 @@ func TestTheLandingHasNoHorizontalScrollAt320(t *testing.T) { |
| {"#headline", 1}, |
| {"#install code", 1}, |
| {".site-themebar", 1}, |
| - {"#sample .site-side a", 5}, |
| + {"#sample [rst-side-nav] a", 5}, |
| {"#sample .site-pane", 5}, |
| {"#sample .site-pane h2", 5}, |
| {"#sample .site-course", 3}, |
| @@ -427,7 +427,7 @@ func TestTheLandingReadsWithNoScript(t *testing.T) { |
| t.Errorf("%s: %d on the page, %d shown; want %d shown with scripts off", sel, s.Total, s.Shown, want) |
| } |
| } |
| - for _, sel := range []string{".site-themebar", ".site-copy"} { |
| + for _, sel := range []string{".site-themebar", "[rst-snippet-copy]"} { |
| if s := visible(t, ctx, sel); s.Total != 1 || s.Shown != 0 { |
| t.Errorf("%s: %d on the page, %d shown; want 1 hidden with scripts off", sel, s.Total, s.Shown) |
| } |
| @@ -630,7 +630,7 @@ func TestTheSchemeMenuMarksTheRestoredScheme(t *testing.T) { |
| func themeLink(t *testing.T, ctx context.Context) (href, current string) { |
| t.Helper() |
| var got struct{ Href, Current string } |
| - at(t, ctx, `(() => { const l = document.getElementById("site-theme"), a = document.querySelector("[data-site-theme][aria-current]"); return JSON.stringify({Href: l ? l.getAttribute("href") : "", Current: a ? a.dataset.siteTheme : ""}); })()`, &got) |
| + at(t, ctx, `(() => { const l = document.getElementById("site-theme"), a = document.querySelector('[data-site-theme][aria-pressed="true"]'); return JSON.stringify({Href: l ? l.getAttribute("href") : "", Current: a ? a.dataset.siteTheme : ""}); })()`, &got) |
| return got.Href, got.Current |
| } |
| @@ -666,7 +666,7 @@ func TestABrokenStoredThemeFallsBackToDay(t *testing.T) { |
| // and which sidebar link and course tab are current. |
| const paneJS = `(() => JSON.stringify({ |
| Panes: [...document.querySelectorAll("#sample .site-pane")].filter(p => p.getClientRects().length > 0).map(p => p.id), |
| - Current: [...document.querySelectorAll("#sample .site-side a[aria-current]")].map(a => a.getAttribute("href")), |
| + Current: [...document.querySelectorAll("#sample [rst-side-nav] a[aria-current]")].map(a => a.getAttribute("href")), |
| Courses: [...document.querySelectorAll("#sample .site-course")].filter(p => p.getClientRects().length > 0).map(p => p.id), |
| Tab: [...document.querySelectorAll("#sample [data-site-course][aria-current]")].map(a => a.getAttribute("href")), |
| }))()` |
| @@ -683,7 +683,7 @@ func readPanes(t *testing.T, ctx context.Context) panes { |
| // showPane presses one sidebar link of the sample. |
| func showPane(t *testing.T, ctx context.Context, id string) { |
| t.Helper() |
| - mustRun(t, ctx, chromedp.Click(fmt.Sprintf(`#sample .site-side a[href="#%s"]`, id), chromedp.ByQuery)) |
| + mustRun(t, ctx, chromedp.Click(fmt.Sprintf(`#sample [rst-side-nav] a[href="#%s"]`, id), chromedp.ByQuery)) |
| } |
| // TestEverySamplePaneAndCourseSwitches: the sample opens on Overview; |
| @@ -838,7 +838,7 @@ func TestTheSampleSwitchDrags(t *testing.T) { |
| } |
| // copyJS reads the Copy button and its live region. |
| -const copyJS = `(() => { const b = document.querySelector(".site-copy"), l = document.querySelector("#install .site-live"); |
| +const copyJS = `(() => { const b = document.querySelector("[rst-snippet-copy]"), l = document.querySelector("#install [rst-snippet-status]"); |
| return JSON.stringify({Present: !!b, Shown: !!b && b.getClientRects().length > 0, Label: b ? b.textContent.trim() : "", Live: l ? l.textContent : "", Role: l ? l.getAttribute("role") : "", Selected: getSelection().toString()}); })()` |
| type copyReading struct { |
| @@ -868,12 +868,12 @@ func TestCopy(t *testing.T) { |
| mustRun(t, ctx, browser.GrantPermissions([]browser.PermissionType{browser.PermissionTypeClipboardReadWrite, browser.PermissionTypeClipboardSanitizedWrite}).WithOrigin(rig.Origin), |
| emulation.SetFocusEmulationEnabled(true)) |
| open(t, ctx, rig, 1280, 900) |
| - mustRun(t, ctx, soon(".site-copy")) |
| + mustRun(t, ctx, soon("[rst-snippet-copy]")) |
| t.Run("granted", func(t *testing.T) { |
| for i := 1; i <= 2; i++ { |
| mustRun(t, ctx, chromedp.Evaluate(`navigator.clipboard.writeText("")`, nil, awaitPromise), |
| - chromedp.Click(".site-copy", chromedp.ByQuery), chromedp.Sleep(200*time.Millisecond)) |
| + chromedp.Click("[rst-snippet-copy]", chromedp.ByQuery), chromedp.Sleep(200*time.Millisecond)) |
| var held string |
| mustRun(t, ctx, chromedp.Evaluate(`navigator.clipboard.readText()`, &held, awaitPromise)) |
| if held != installLink { |
| @@ -893,7 +893,7 @@ func TestCopy(t *testing.T) { |
| t.Run("refused", func(t *testing.T) { |
| mustRun(t, ctx, chromedp.Evaluate(`navigator.clipboard.writeText = () => Promise.reject(new Error("refused")); getSelection().removeAllRanges(); true`, nil), |
| - chromedp.Click(".site-copy", chromedp.ByQuery), chromedp.Sleep(200*time.Millisecond)) |
| + chromedp.Click("[rst-snippet-copy]", chromedp.ByQuery), chromedp.Sleep(200*time.Millisecond)) |
| if c := readCopy(t, ctx); c.Live != words["copy.failed"] || c.Selected != installLink { |
| t.Errorf("after a refused copy the live region says %q and the selection is %q; want %q and the link tag", c.Live, c.Selected, words["copy.failed"]) |
| } |
diff --git a/site/FOLLOW-UPS.md b/site/FOLLOW-UPS.md| deleted file mode 100644 |
| index 1bdf611..0000000 |
| --- a/site/FOLLOW-UPS.md |
| +++ /dev/null |
| @@ -1,23 +0,0 @@ |
| -# Follow-ups for Fiesta 1.1 |
| - |
| -Fiesta is frozen while the site is built. Anything the site needs that |
| -Fiesta lacks lives in `site/static/`, with a comment saying so, and is |
| -listed here for Fiesta 1.1 to take in. |
| - |
| -- A copyable code box. The landing page's install line is |
| - `.site-snippet` in `site/static/site.css`: a bordered box with the |
| - code `user-select: all` and a Copy button beside it. |
| -- An embeddable sidebar. The sample's `.site-side` is five links in a |
| - column that becomes a scrolling row on a phone. |
| -- Clipboard behaviour. `site/static/site.js` shows Copy only where |
| - `navigator.clipboard.writeText` exists, says Copied for two seconds |
| - and in a status region, and on failure selects the code and says so. |
| -- `rst-seg-tabs` for buttons. The theme choice and the sample's course |
| - tabs are anchors because anchors are what `rst-seg-tabs` styles; |
| - `site.js` cancels their navigation. |
| -- Stats two-up on phones. Fiesta stacks `rst-stat` one per line below |
| - 34rem; the sample's four sit two by two, scoped to `.site-window` in |
| - `site.css`. |
| -- A short row status stays inline when it fits. Fiesta moves |
| - `rst-status` under the row's text below 34rem; the sample's are short |
| - enough to stay beside it, scoped to `.site-window` in `site.css`. |
diff --git a/site/landing/page.html.tmpl b/site/landing/page.html.tmpl| index fc780f0..dc28067 100644 |
| --- a/site/landing/page.html.tmpl |
| +++ b/site/landing/page.html.tmpl |
| @@ -26,6 +26,7 @@ |
| <script src="/1/fiesta.js"></script> |
| <script defer src="/1/light.js"></script> |
| <script defer src="/1/anchor.js"></script> |
| +<script defer src="/1/copy.js"></script> |
| <script defer src="/static/site.js"></script> |
| <script defer src="/static/bunting.js"></script> |
| </head> |
| @@ -58,8 +59,7 @@ |
| <p class="site-lede">{{.T "lede"}}</p> |
| <div class="site-install" id="install"> |
| <p class="site-inote">{{.T "install"}}</p> |
| - <div class="site-snippet"><code dir="ltr" translate="no"><link rel="stylesheet" href="{{.Origin}}/1/fiesta.css"></code><button rst-btn="sm" type="button" class="site-copy" hidden data-site-copied="{{.T "copied"}}" data-site-failed="{{.T "copy.failed"}}">{{.T "copy"}}</button></div> |
| - <p class="site-live" role="status"></p> |
| + <div rst-snippet><code dir="ltr" translate="no"><link rel="stylesheet" href="{{.Origin}}/1/fiesta.css"></code><button rst-btn="sm" type="button" rst-snippet-copy hidden data-rst-copy-done="{{.T "copied"}}" data-rst-copy-failed="{{.T "copy.failed"}}">{{.T "copy"}}</button><span rst-snippet-status role="status"></span></div> |
| </div> |
| <div class="site-cta" id="actions"><a rst-btn="primary" href="{{.DesignSystem}}">{{.T "cta.see"}}</a><a rst-btn href="#themes">{{.T "cta.themes"}}</a></div> |
| </div> |
| @@ -67,7 +67,7 @@ |
| <div class="site-stage" id="themes"> |
| <div class="site-themebar" hidden> |
| <span class="site-themelabel" id="site-theme-label">{{.T "theme.label"}}</span> |
| - <nav rst-seg-tabs aria-labelledby="site-theme-label" class="site-themetabs"><a href="#themes" data-site-theme="day" aria-current="page" translate="no">{{.T "theme.day"}}</a><a href="#themes" data-site-theme="plain" translate="no">{{.T "theme.plain"}}</a><a href="#themes" data-site-theme="signal" translate="no">{{.T "theme.signal"}}</a></nav> |
| + <div rst-seg-tabs role="group" aria-labelledby="site-theme-label"><button type="button" data-site-theme="day" aria-pressed="true" translate="no">{{.T "theme.day"}}</button><button type="button" data-site-theme="plain" aria-pressed="false" translate="no">{{.T "theme.plain"}}</button><button type="button" data-site-theme="signal" aria-pressed="false" translate="no">{{.T "theme.signal"}}</button></div> |
| <details rst-dropdown rst-scheme name="rst-menus"> |
| <summary>{{.T "scheme.label"}}<span rst-caret aria-hidden="true"><svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg></span></summary> |
| <div rst-dropdown-menu role="group" aria-label="{{.T "scheme.label"}}"> |
| @@ -79,12 +79,12 @@ |
| </div> |
| <div class="site-window" id="sample" role="region" aria-label="{{.T "sample.label"}}"> |
| <div class="site-bar"><i></i><i></i><i></i></div> |
| - <div class="site-body"> |
| - <nav class="site-side" aria-label="{{.T "sample.nav.label"}}"><a href="#pane-overview" aria-current="page">{{.T "sample.overview"}}</a><a href="#pane-guests">{{.T "sample.guests"}}</a><a href="#pane-menu">{{.T "sample.menu"}}</a><a href="#pane-music">{{.T "sample.music"}}</a><a href="#pane-settings">{{.T "sample.settings"}}</a></nav> |
| - <div class="site-main"> |
| + <div rst-side> |
| + <nav rst-side-nav aria-label="{{.T "sample.nav.label"}}"><a href="#pane-overview" aria-current="page">{{.T "sample.overview"}}</a><a href="#pane-guests">{{.T "sample.guests"}}</a><a href="#pane-menu">{{.T "sample.menu"}}</a><a href="#pane-music">{{.T "sample.music"}}</a><a href="#pane-settings">{{.T "sample.settings"}}</a></nav> |
| + <div> |
| <section class="site-pane" id="pane-overview"> |
| <h2>{{.T "sample.overview"}}</h2> |
| - <div rst-stats> |
| + <div rst-stats="pairs"> |
| <div rst-stat><span rst-stat-label>{{.T "sample.guests"}}</span><span rst-stat-num translate="no">48</span><span rst-stat-delta rst-tone="positive" translate="no">+6</span></div> |
| <div rst-stat><span rst-stat-label>{{.T "sample.coming"}}</span><span rst-stat-num translate="no">31</span></div> |
| <div rst-stat><span rst-stat-label>{{.T "sample.dishes"}}</span><span rst-stat-num translate="no">12</span></div> |
| @@ -99,9 +99,9 @@ |
| <p class="site-live" role="status"></p> |
| </form> |
| <div rst-list> |
| - <div rst-row><span rst-row-lead data-lead="positive" aria-hidden="true" translate="no">AR</span><span rst-row-main><a href="#" translate="no">Ana Ruiz</a><small rst-row-sub>{{.T "sample.guest.plusone"}}</small></span><span rst-status rst-tone="positive">{{.T "sample.coming"}}</span></div> |
| - <div rst-row><span rst-row-lead aria-hidden="true" translate="no">TB</span><span rst-row-main><a href="#" translate="no">Tom Byrne</a><small rst-row-sub>{{.T "sample.guest.noreply"}}</small></span><span rst-status rst-tone="neutral">{{.T "sample.invited"}}</span></div> |
| - <div rst-row><span rst-row-lead data-lead="positive" aria-hidden="true" translate="no">MC</span><span rst-row-main><a href="#" translate="no">Mei Chen</a><small rst-row-sub>{{.T "sample.guest.vegetarian"}}</small></span><span rst-status rst-tone="positive">{{.T "sample.coming"}}</span></div> |
| + <div rst-row><span rst-row-lead data-lead="positive" aria-hidden="true" translate="no">AR</span><span rst-row-main><a href="#" translate="no">Ana Ruiz</a><small rst-row-sub>{{.T "sample.guest.plusone"}}</small></span><span rst-status="inline" rst-tone="positive">{{.T "sample.coming"}}</span></div> |
| + <div rst-row><span rst-row-lead aria-hidden="true" translate="no">TB</span><span rst-row-main><a href="#" translate="no">Tom Byrne</a><small rst-row-sub>{{.T "sample.guest.noreply"}}</small></span><span rst-status="inline" rst-tone="neutral">{{.T "sample.invited"}}</span></div> |
| + <div rst-row><span rst-row-lead data-lead="positive" aria-hidden="true" translate="no">MC</span><span rst-row-main><a href="#" translate="no">Mei Chen</a><small rst-row-sub>{{.T "sample.guest.vegetarian"}}</small></span><span rst-status="inline" rst-tone="positive">{{.T "sample.coming"}}</span></div> |
| </div> |
| <label rst-switch id="sample-reminders"><input type="checkbox" name="reminders" checked><span rst-switch-track aria-hidden="true"></span> <span>{{.T "sample.reminders"}}</span></label> |
| <p class="site-acts"><button rst-btn="primary" type="button">{{.T "sample.invite"}}</button> <button rst-btn type="button">{{.T "sample.export"}}</button></p> |
| @@ -125,7 +125,7 @@ |
| <section class="site-pane" id="pane-music"> |
| <h2>{{.T "sample.music"}}</h2> |
| <div rst-list> |
| - <div rst-row><span rst-row-main><a href="#" translate="no">Dancing Queen</a><small rst-row-sub translate="no">ABBA</small></span><span rst-status rst-tone="positive">{{.T "sample.playing"}}</span><span class="site-dur" translate="no">3:51</span></div> |
| + <div rst-row><span rst-row-main><a href="#" translate="no">Dancing Queen</a><small rst-row-sub translate="no">ABBA</small></span><span rst-status="inline" rst-tone="positive">{{.T "sample.playing"}}</span><span class="site-dur" translate="no">3:51</span></div> |
| <div rst-row><span rst-row-main><a href="#" translate="no">La Bamba</a><small rst-row-sub translate="no">Ritchie Valens</small></span><span class="site-dur" translate="no">2:06</span></div> |
| <div rst-row><span rst-row-main><a href="#" translate="no">September</a><small rst-row-sub translate="no">Earth, Wind & Fire</small></span><span class="site-dur" translate="no">3:35</span></div> |
| <div rst-row><span rst-row-main><a href="#" translate="no">Despacito</a><small rst-row-sub translate="no">Luis Fonsi</small></span><span class="site-dur" translate="no">3:48</span></div> |
diff --git a/site/static/site.css b/site/static/site.css| index 0e5519e..0122c5f 100644 |
| --- a/site/static/site.css |
| +++ b/site/static/site.css |
| @@ -2,8 +2,7 @@ |
| public URL and left as it is; what the page needs beyond it lives |
| here. Every class is site- prefixed and every colour is a Fiesta |
| token, so the page follows whichever theme and scheme the reader |
| - chose. The sample window's phone overrides of Fiesta's stats and |
| - rows, at the end, are listed in site/FOLLOW-UPS.md for Fiesta 1.1. */ |
| + chose. */ |
| /* The skip link: off screen until it has focus. */ |
| .site-skip { position: absolute; inset-inline-start: 0; top: 0; z-index: 10; padding: 0.5rem 0.75rem; background: var(--rst-surface); color: var(--rst-text); transform: translateY(-200%); } |
| @@ -37,11 +36,10 @@ |
| .site-lede { font-size: 1.15rem; color: var(--rst-text-muted); margin: 0 auto 22px; max-width: 64ch; text-wrap: pretty; } |
| .site-install { padding: 6px 0 0; } |
| .site-inote { margin: 0 auto 10px; font-size: 0.95rem; font-weight: 400; color: var(--rst-text-muted); } |
| -.site-snippet { display: flex; align-items: center; gap: 10px; font: 13px ui-monospace, SFMono-Regular, Menlo, monospace; background: var(--rst-surface); border: 1px solid var(--rst-line); border-radius: 6px; padding: 10px 12px; max-width: max-content; margin: 0 auto; } |
| -.site-snippet code { flex: 1; color: var(--rst-text); user-select: all; } |
| -.site-snippet button { flex: none; } |
| +/* Fiesta's snippet hugs its line from the inline start; the hero is |
| + centred, so the box is too. */ |
| +#install [rst-snippet] { margin-inline: auto; } |
| .site-live { margin: 0; font-size: 0.85rem; color: var(--rst-text-muted); } |
| -.site-install .site-live:not(:empty) { margin-top: 8px; } |
| .site-cta { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 16px; justify-content: center; } |
| /* The stage the sample sits on, with the theme bar over its end corner. */ |
| @@ -55,11 +53,9 @@ |
| .site-window { background: var(--rst-surface); border: 1px solid var(--rst-line); border-radius: 10px; box-shadow: var(--rst-shadow-pop); overflow: hidden; text-align: start; } |
| .site-bar { display: flex; gap: 6px; padding: 10px 12px; border-bottom: 1px solid var(--rst-line); } |
| .site-bar i { width: 10px; height: 10px; border-radius: 50%; background: var(--rst-line-strong); opacity: 0.5; } |
| -.site-body { display: grid; grid-template-columns: 150px 1fr; min-height: 300px; } |
| -.site-side { border-inline-end: 1px solid var(--rst-line); padding: 12px 8px; display: grid; gap: 2px; align-content: start; font-size: 0.85rem; } |
| -.site-side a { padding: 6px 10px; border-radius: 4px; color: var(--rst-text-muted); text-decoration: none; } |
| -.site-side a[aria-current] { background: var(--rst-accent-soft); color: var(--rst-text); font-weight: 600; } |
| -.site-main { padding: 16px 18px; min-width: 0; } |
| +/* The sample keeps the minimum height it had before it used rst-side, |
| + so its shortest pane still fills a window the size of an app's. */ |
| +.site-window [rst-side] { min-block-size: 300px; } |
| /* One column that never grows past the pane: an implicit auto column |
| would widen to the course tabs' max-content (328px in Spanish, 338 |
| in Arabic), and Fiesta's seg-tabs wrap only against a width that |
| @@ -103,12 +99,9 @@ |
| .site-foot a { color: var(--rst-text-muted); text-decoration: none; } |
| .site-foot a:hover { color: var(--rst-text); text-decoration: underline; } |
| -/* Narrower screens: the reasons stack, the link box wraps, the |
| - footer's columns pair up. */ |
| +/* Narrower screens: the reasons stack, the footer's columns pair up. */ |
| @media (max-width: 760px) { |
| .site-stage { padding: 20px 12px 28px; } |
| - .site-snippet { max-width: 100%; } |
| - .site-snippet code { white-space: normal; overflow-wrap: anywhere; } |
| .site-why { grid-template-columns: 1fr; } |
| .site-foot { padding: 24px 14px 32px; } |
| .site-foot-cols { grid-template-columns: repeat(2, minmax(0, 1fr)); } |
| @@ -116,8 +109,8 @@ |
| } |
| /* On a phone the window runs edge to edge, so its padding is the only |
| - margin: the stage drops its inline padding, the window its side |
| - borders and corners, and the sidebar becomes a row across the top. */ |
| + margin: the stage drops its inline padding, and the window its side |
| + borders and corners. */ |
| @media (max-width: 560px) { |
| /* The headline's longest word has to fit a 320px phone in every |
| language: Russian's Отпразднуйте is 329px at 2.6rem, so the size |
| @@ -126,19 +119,4 @@ |
| .site-stage { padding-inline: 0; } |
| .site-themebar { padding-inline: 14px; } |
| .site-window { border-inline: 0; border-radius: 0; } |
| - .site-body { grid-template-columns: minmax(0, 1fr); } |
| - .site-side { border-inline-end: 0; border-bottom: 1px solid var(--rst-line); grid-auto-flow: column; overflow-x: auto; } |
| - .site-main { padding: 16px 14px; } |
| - /* Fiesta stacks stats one per line here; the sample's four fit two |
| - by two. Scoped to the sample; a Fiesta 1.1 follow-up. */ |
| - .site-window [rst-stats] { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); } |
| - .site-window [rst-stat] { padding: 12px 14px; } |
| - .site-window [rst-stat]:nth-child(odd) { border-inline-start: 0; } |
| - .site-window [rst-stat]:nth-child(n+3) { border-top: 1px solid var(--rst-line); } |
| - /* Fiesta moves a row's status under its text below 34rem; the |
| - sample's are short enough to stay beside it. Scoped to the sample; |
| - a Fiesta 1.1 follow-up. */ |
| - .site-window [rst-row]:has(> [rst-status]) { display: flex; flex-wrap: nowrap; align-items: center; } |
| - .site-window [rst-row]:has(> [rst-status]) > [rst-row-main] { flex: 1 1 auto; min-width: 0; } |
| - .site-window [rst-row]:has(> [rst-status]) > [rst-status] { font-size: var(--rst-fs-xs); padding-block: 0.1rem; flex: none; } |
| } |
diff --git a/site/static/site.js b/site/static/site.js| index 6a2a078..71c4746 100644 |
| --- a/site/static/site.js |
| +++ b/site/static/site.js |
| @@ -1,23 +1,17 @@ |
| /* site.js: the landing page's own behaviour. Everything here enhances |
| markup that already works without it: the theme bar is hidden until |
| - this runs, the sample's panes all show and its forms reload the page |
| - at the sample, and the Copy button is hidden. |
| + this runs, and the sample's panes all show and its forms reload the |
| + page at the sample. The install line's Copy button is Fiesta's |
| + copy.js, given the site's own words as attributes. |
| - Theme. The three theme tabs swap the stylesheet the head wrote, |
| + Theme. The three theme buttons swap the stylesheet the head wrote, |
| remember the choice in localStorage["fiesta-theme"], and mark the |
| - current one. The scheme is fiesta.js's, through the scheme menu. |
| + pressed one. The scheme is fiesta.js's, through the scheme menu. |
| Sample. One pane shows at a time, chosen from the sidebar; the Menu |
| pane shows one course at a time, chosen from its tabs. Its two forms |
| never leave the page: a submit shows the form's own local message in |
| - a status region instead. |
| - |
| - Copy. Shown only where the clipboard API is there. A copy that works |
| - says Copied for two seconds, in the label and the status region; one |
| - that fails selects the link so it can be copied by hand, and says so. |
| - |
| - The clipboard behaviour and the copyable code box are listed in |
| - site/FOLLOW-UPS.md for Fiesta 1.1. */ |
| + a status region instead. */ |
| (function () { |
| "use strict"; |
| @@ -34,10 +28,11 @@ |
| function remember(theme) { |
| try { localStorage.setItem("fiesta-theme", theme); } catch (e) {} |
| } |
| + // Every button says "true" or "false": a toggle button with no |
| + // aria-pressed is announced as a plain button, not as one unpressed. |
| function markTheme(theme) { |
| - document.querySelectorAll("[data-site-theme]").forEach(function (a) { |
| - if (a.getAttribute("data-site-theme") === theme) a.setAttribute("aria-current", "page"); |
| - else a.removeAttribute("aria-current"); |
| + document.querySelectorAll("[data-site-theme]").forEach(function (button) { |
| + button.setAttribute("aria-pressed", button.getAttribute("data-site-theme") === theme ? "true" : "false"); |
| }); |
| } |
| @@ -48,10 +43,9 @@ |
| markTheme(theme); |
| bar.hidden = false; |
| bar.addEventListener("click", function (e) { |
| - var a = e.target.closest("[data-site-theme]"); |
| - if (!a) return; |
| - e.preventDefault(); |
| - var t = a.getAttribute("data-site-theme"); |
| + var button = e.target.closest("[data-site-theme]"); |
| + if (!button) return; |
| + var t = button.getAttribute("data-site-theme"); |
| if (!isTheme(t)) return; |
| if (link.getAttribute("href") !== THEMES[t]) link.setAttribute("href", THEMES[t]); |
| remember(t); |
| @@ -81,7 +75,7 @@ |
| }); |
| }); |
| } |
| - var side = Array.prototype.slice.call(sample.querySelectorAll('.site-side a[href^="#pane-"]')); |
| + var side = Array.prototype.slice.call(sample.querySelectorAll('[rst-side-nav] a[href^="#pane-"]')); |
| var panes = Array.prototype.slice.call(sample.querySelectorAll(".site-pane")); |
| if (side.length && panes.length) group(side, panes); |
| var tabs = Array.prototype.slice.call(sample.querySelectorAll("[data-site-course]")); |
| @@ -96,26 +90,4 @@ |
| live.textContent = done; |
| }); |
| } |
| - |
| - var copy = document.querySelector(".site-copy"); |
| - if (copy && navigator.clipboard && navigator.clipboard.writeText) { |
| - var code = copy.parentNode.querySelector("code"), live = copy.parentNode.parentNode.querySelector(".site-live"); |
| - var label = copy.textContent, timer = 0; |
| - copy.hidden = false; |
| - copy.addEventListener("click", function () { |
| - navigator.clipboard.writeText(code.textContent).then(function () { |
| - var copied = copy.getAttribute("data-site-copied"); |
| - copy.textContent = copied; |
| - if (live) { live.textContent = ""; live.textContent = copied; } |
| - clearTimeout(timer); |
| - timer = setTimeout(function () { copy.textContent = label; }, 2000); |
| - }, function () { |
| - var range = document.createRange(), selection = window.getSelection(); |
| - range.selectNodeContents(code); |
| - selection.removeAllRanges(); |
| - selection.addRange(range); |
| - if (live) { live.textContent = ""; live.textContent = copy.getAttribute("data-site-failed"); } |
| - }); |
| - }); |
| - } |
| })(); |