rastrillo / fiesta Public

rst-status=inline: a short status kept on its row's first line on a phone

Below 34rem 1.0 drops a row's status onto a line of its own under the
name, so a long name gets the row. For a status that is one short word
beside a short name that costs a line per row for nothing. A page can
now mark the status rst-status="inline": it stays on the first line in
its source place, an implicit grid column straight after the name's,
so the line reads lead, name, status, action, mirrored right to left,
and the name's column takes what is left and wraps inside it. Two grid
declarations override 1.0's placement and nothing else, so the status
keeps 1.0's phone size. Marking it is the page saying the status is
short; the CSS does not measure it.

Rejected: a wrapping flex line that keeps the status up only where it
fits. Flex wraps item by item, so whether the status, or the action
after it, dropped to the second line would depend on each name's
length, varying row to row in one list. Opt-in for all of 1.x, since a
1.0 page's status must stay where 1.0 put it. The rule positively
requires the new value in both spellings (.rst-status--inline), so the
promise gates pass with no exception and no widening.

TestAnInlineStatusStaysOnTheNamesLine reads the new list-row-action
state at 390 and 320, left to right and in Arabic: all four parts on
the row's first line in source order from the inline start, and the
name's column holding the room the others leave; a scratch name long
enough to wrap wraps in its column with the status and action still up;
a scratch row with no lead and no action ends the status at the row's
content end. Unmarked, each of those rows puts the status under the
name, the control that the value does the work. At 1280 each row,
English and Arabic, paints as the same row unmarked, at zero tolerance.
It was red by assertion with the example in and no CSS: the status on
the second line, before the name's end, and short of the content end
in the bare row. The class-spelling fixture gains a row with a
class-spelled inline status (outside the plan's files), so the
both-spellings drive compares the rule.

The label "A short status beside the name" and its note are the
approved English, byte for byte. Their translations in the eleven
gallery catalogs are machine drafts from that English, not reviewed;
drafts.json names each. The state reuses the default state's words, so
no sample phrase is new. Heights from the drives: Desktop needs 100px,
Mobile en and ga 299, ar 320, ru 323 (the name's narrower column wraps
more than the default state's); the table adds slack.

Size, gzip level 6 (allotment 100, on target):
  fiesta.css        23,801 -> 23,822 (+21)
  fiesta-plain.css  23,082 -> 23,102 (+20)
  fiesta-signal.css 23,195 -> 23,216 (+21)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev d33262a5ee697bdd72ad2e7c342221720fb2569d parent 51a9282
19 files changed, +264 −3
  • check/phone_variants_browser_test.go +158 −0
  • check/testdata/fixtures/spelling-class.html +1 −0
  • css/tokens.css +14 −0
  • examples/examples.json +8 −0
  • examples/list-row-action/a-short-status-beside-the-name.html +19 −0
  • examples/prose.json +4 −1
  • internal/gallery/heights.go +6 −2
  • internal/gallery/i18n/ar.json +2 −0
  • internal/gallery/i18n/bn.json +2 −0
  • internal/gallery/i18n/drafts.json +32 −0
  • internal/gallery/i18n/es.json +2 −0
  • internal/gallery/i18n/ga.json +2 −0
  • internal/gallery/i18n/hi.json +2 −0
  • internal/gallery/i18n/ja.json +2 −0
  • internal/gallery/i18n/pt-PT.json +2 −0
  • internal/gallery/i18n/ru.json +2 −0
  • internal/gallery/i18n/vi.json +2 −0
  • internal/gallery/i18n/yue.json +2 −0
  • internal/gallery/i18n/zh-Hans.json +2 −0

CI passed — run details

CI log
=== gofmt ===
=== no-rastrillo ===
go test -run '^(TestFiestaNeverImportsRastrillo|TestThePublicPackagesLinkNoBrowser)$' -count=1 .
ok  	amadan.net/rastrillo/fiesta	0.151s
=== size ===
go test ./internal/build -run '^TestTheOneLinkIsUnder25KiBGzipped$' -count=1 -v
=== RUN   TestTheOneLinkIsUnder25KiBGzipped
    build_test.go:138: fiesta-plain.css: 158347 bytes, 23102 bytes gzipped (22.6 KiB of the 25.0 KiB limit)
    build_test.go:138: fiesta-signal.css: 158442 bytes, 23216 bytes gzipped (22.7 KiB of the 25.0 KiB limit)
    build_test.go:138: fiesta.css: 161261 bytes, 23822 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: 30 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.741s
ok  	amadan.net/rastrillo/fiesta/check	7.769s
ok  	amadan.net/rastrillo/fiesta/example	0.138s
?   	amadan.net/rastrillo/fiesta/hack/seed/english	[no test files]
ok  	amadan.net/rastrillo/fiesta/internal/axe	0.137s
ok  	amadan.net/rastrillo/fiesta/internal/build	0.586s
ok  	amadan.net/rastrillo/fiesta/internal/codeview	0.010s
?   	amadan.net/rastrillo/fiesta/internal/harness	[no test files]
ok  	amadan.net/rastrillo/fiesta/internal/markup	0.015s
ok  	amadan.net/rastrillo/fiesta/internal/nodetest	0.348s
ok  	amadan.net/rastrillo/fiesta/internal/site	2.875s
ok  	amadan.net/rastrillo/fiesta/internal/tokens	0.015s
suite: root took 11s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m9.220000s 0m1.660000s
--- 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	65.917s
suite: test.internal.gallery~1of3 took 68s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m49.530000s 0m1.220000s
--- 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	68.338s
suite: test.internal.gallery~2of3 took 70s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m52.480000s 0m1.270000s
--- 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	62.951s
suite: test.internal.gallery~3of3 took 65s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m47.250000s 0m1.270000s
--- 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.000s
suite: test.cmd.fiesta~1of2 took 50s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m32.680000s 0m2.020000s
--- 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.786s
suite: test.cmd.fiesta~2of2 took 53s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m35.440000s 0m2.310000s
--- 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.851s
suite: test.internal.www~1of2 took 65s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m46.680000s 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	59.889s
suite: test.internal.www~2of2 took 62s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m44.320000s 0m1.520000s
--- 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.570000s 0m0.200000s
--- 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 4s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m3.260000s 0m0.380000s
--- 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' .
8:10AM INF Unknown SCM platform. Use --platform to include links in findings. host=amadan.net
8:10AM INF 30 commits scanned.
8:10AM INF scanned ~8415193 bytes (8.42 MB) in 2.69s
8:10AM INF no leaks found
suite: gitleaks took 3s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m6.780000s 0m0.170000s
--- shard 11 of 48 ---
==> shard 11 of 48: make browser.internal.harness
./hack/gotest.sh browser 'internal.harness'
gotest: on ip-172-31-18-51, 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.921s
suite: browser.internal.harness took 6s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m1.610000s 0m1.230000s
--- shard 12 of 48 ---
==> shard 12 of 48: make browser.check~1of13
./hack/gotest.sh browser 'check~1of13'
gotest: on ip-172-31-18-51, 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	91.630s
suite: browser.check~1of13 took 95s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m42.880000s 0m14.540000s
--- shard 13 of 48 ---
==> shard 13 of 48: make browser.check~2of13
./hack/gotest.sh browser 'check~2of13'
gotest: on ip-172-31-18-51, 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	96.656s
suite: browser.check~2of13 took 100s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m44.960000s 0m13.900000s
--- shard 14 of 48 ---
==> shard 14 of 48: make browser.check~3of13
./hack/gotest.sh browser 'check~3of13'
gotest: on ip-172-31-18-51, 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	92.819s
suite: browser.check~3of13 took 96s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m36.010000s 0m11.850000s
--- shard 15 of 48 ---
==> shard 15 of 48: make browser.check~4of13
./hack/gotest.sh browser 'check~4of13'
gotest: on ip-172-31-18-51, 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	91.648s
suite: browser.check~4of13 took 95s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m47.420000s 0m16.170000s
--- shard 16 of 48 ---
==> shard 16 of 48: make browser.check~5of13
./hack/gotest.sh browser 'check~5of13'
gotest: on ip-172-31-18-51, 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	83.365s
suite: browser.check~5of13 took 86s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m34.420000s 0m14.380000s
--- shard 17 of 48 ---
==> shard 17 of 48: make browser.check~6of13
./hack/gotest.sh browser 'check~6of13'
gotest: on ip-172-31-18-51, 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	80.526s
suite: browser.check~6of13 took 84s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m36.580000s 0m14.120000s
--- shard 18 of 48 ---
==> shard 18 of 48: make browser.check~7of13
./hack/gotest.sh browser 'check~7of13'
gotest: on ip-172-31-18-51, 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	84.314s
suite: browser.check~7of13 took 87s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m37.420000s 0m13.600000s
--- shard 19 of 48 ---
==> shard 19 of 48: make browser.check~8of13
./hack/gotest.sh browser 'check~8of13'
gotest: on ip-172-31-18-51, 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	92.308s
suite: browser.check~8of13 took 95s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m40.590000s 0m16.150000s
--- shard 20 of 48 ---
==> shard 20 of 48: make browser.check~9of13
./hack/gotest.sh browser 'check~9of13'
gotest: on ip-172-31-18-51, 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	79.651s
suite: browser.check~9of13 took 83s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m24.220000s 0m9.610000s
--- shard 21 of 48 ---
==> shard 21 of 48: make browser.check~10of13
./hack/gotest.sh browser 'check~10of13'
gotest: on ip-172-31-18-51, 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	82.572s
suite: browser.check~10of13 took 86s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m32.810000s 0m12.390000s
--- shard 22 of 48 ---
==> shard 22 of 48: make browser.check~11of13
./hack/gotest.sh browser 'check~11of13'
gotest: on ip-172-31-18-51, 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	84.793s
suite: browser.check~11of13 took 88s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m37.470000s 0m14.600000s
--- shard 23 of 48 ---
==> shard 23 of 48: make browser.check~12of13
./hack/gotest.sh browser 'check~12of13'
gotest: on ip-172-31-18-51, 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	86.273s
suite: browser.check~12of13 took 89s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m39.370000s 0m15.850000s
--- shard 24 of 48 ---
==> shard 24 of 48: make browser.check~13of13
./hack/gotest.sh browser 'check~13of13'
gotest: on ip-172-31-18-51, 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	81.522s
suite: browser.check~13of13 took 85s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m31.770000s 0m11.050000s
--- 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-18-51, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 1 of 18 of ./internal/gallery/ runs 5 of 84 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	40.055s
suite: browser.internal.gallery~1of18 took 44s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m12.490000s 0m3.690000s
--- 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-18-51, 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	50.232s
suite: browser.internal.gallery~2of18 took 53s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m10.010000s 0m2.490000s
--- 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-18-51, 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.059s
suite: browser.internal.gallery~3of18 took 63s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m12.370000s 0m4.120000s
--- 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-18-51, driving the harness's own choice (/usr/local/bin/chromium)
gotest: slice 4 of 18 of ./internal/gallery/ runs 6 of 84 browser tests
ok  	amadan.net/rastrillo/fiesta/internal/gallery	51.480s
suite: browser.internal.gallery~4of18 took 55s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m10.610000s 0m2.710000s
--- 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-18-51, 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	62.899s
suite: browser.internal.gallery~5of18 took 66s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m15.510000s 0m5.420000s
--- 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-18-51, 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	57.293s
suite: browser.internal.gallery~6of18 took 61s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m12.480000s 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-18-51, 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	58.852s
suite: browser.internal.gallery~7of18 took 62s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m10.540000s 0m2.650000s
--- 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-18-51, 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	61.037s
suite: browser.internal.gallery~8of18 took 65s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m14.630000s 0m4.710000s
--- 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-18-51, 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.212s
suite: browser.internal.gallery~9of18 took 72s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m19.830000s 0m7.470000s
--- 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-18-51, 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	63.703s
suite: browser.internal.gallery~10of18 took 67s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m10.610000s 0m2.610000s
--- 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-18-51, 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.114s
suite: browser.internal.gallery~11of18 took 69s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m10.890000s 0m2.790000s
--- 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-18-51, 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.970s
suite: browser.internal.gallery~12of18 took 71s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m15.390000s 0m4.980000s
--- 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-18-51, 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.722s
suite: browser.internal.gallery~13of18 took 71s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m15.840000s 0m5.300000s
--- 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-18-51, 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	70.991s
suite: browser.internal.gallery~14of18 took 74s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m16.170000s 0m5.510000s
--- 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-18-51, 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	72.169s
suite: browser.internal.gallery~15of18 took 75s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m16.280000s 0m5.600000s
--- 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-18-51, 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	67.410s
suite: browser.internal.gallery~16of18 took 70s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m13.230000s 0m4.570000s
--- 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-18-51, 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.973s
suite: browser.internal.gallery~17of18 took 74s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m16.050000s 0m5.630000s
--- 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-18-51, 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	72.491s
suite: browser.internal.gallery~18of18 took 76s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m17.490000s 0m6.450000s
--- 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-18-51, 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.199s
suite: browser.internal.gallery.history took 37s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m20.930000s 0m2.040000s
--- 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-18-51, 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	72.350s
suite: browser.internal.www~1of4 took 76s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m30.610000s 0m2.100000s
--- 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-18-51, 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	68.895s
suite: browser.internal.www~2of4 took 72s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m45.360000s 0m2.730000s
--- 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-18-51, 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	82.607s
suite: browser.internal.www~3of4 took 86s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m51.950000s 0m2.840000s
--- 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-18-51, 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	79.886s
suite: browser.internal.www~4of4 took 83s; CPU, user then system, of this shell and then of the role:
0m0.000000s 0m0.000000s
0m45.730000s 0m2.990000s
diff --git a/check/phone_variants_browser_test.go b/check/phone_variants_browser_test.go
index 9b87f44..90db7d8 100644
--- a/check/phone_variants_browser_test.go
+++ b/check/phone_variants_browser_test.go
@@ -11,6 +11,7 @@ package check
import (
"context"
"fmt"
+ "math"
"strings"
"testing"
"time"
@@ -176,3 +177,160 @@ func TestPairsPutTwoStatsOnALineOnAPhone(t *testing.T) {
sameAtDesktop(t, ctx, rig.Origin, "/", "/plain", `rst-stats="pairs"`)
sameAtDesktop(t, ctx, rig.Origin, "/rtl", "/plain-rtl", `rst-stats="pairs" in Arabic`)
}
+
+// rowItem is one child of a row as the inline test reads it; Present
+// is false for a part the row does not have.
+type rowItem struct {
+ Present bool
+ Left, Right, Top, Bottom float64
+}
+
+// rowReading is the first row on the page: its four parts, how many
+// lines the name's link takes, the row's content box (its inline start
+// and end, and its top) and column gap, and the document's scroll and
+// client widths.
+type rowReading struct {
+ Lead, Name, Status, Action rowItem
+ NameLines int
+ Start, End, Top, Gap float64
+ RTL bool
+ DocScroll, DocClient float64
+}
+
+const rowJS = `(() => {
+ const row = document.querySelector("[rst-row]"), cs = getComputedStyle(row), r = row.getBoundingClientRect(), px = (v) => parseFloat(v) || 0;
+ const item = (sel) => { const el = row.querySelector(":scope > " + sel); if (!el) return {Present: false};
+ const b = el.getBoundingClientRect(); return {Present: true, Left: b.left, Right: b.right, Top: b.top, Bottom: b.bottom}; };
+ const words = document.createRange(); words.selectNodeContents(row.querySelector("[rst-row-main] > a"));
+ const rtl = cs.direction === "rtl", left = r.left + px(cs.borderLeftWidth) + px(cs.paddingLeft), right = r.right - px(cs.borderRightWidth) - px(cs.paddingRight);
+ return JSON.stringify({Lead: item("[rst-row-lead]"), Name: item("[rst-row-main]"), Status: item("[rst-status]"), Action: item("[rst-row-action]"),
+ NameLines: new Set([...words.getClientRects()].map((q) => Math.round(q.top))).size,
+ Start: rtl ? right : left, End: rtl ? left : right, Top: r.top + px(cs.borderTopWidth) + px(cs.paddingTop), Gap: px(cs.columnGap), RTL: rtl,
+ DocScroll: document.documentElement.scrollWidth, DocClient: document.documentElement.clientWidth});
+})()`
+
+func readRow(t *testing.T, ctx context.Context, url string, width int64) rowReading {
+ t.Helper()
+ mustRun(t, ctx, chromedp.EmulateViewport(width, 844), chromedp.Navigate(url), chromedp.WaitReady("[rst-row]", chromedp.ByQuery))
+ settleUntil(t, ctx, `document.readyState === "complete"`)
+ var r rowReading
+ at(t, ctx, rowJS, &r)
+ if !r.Name.Present || !r.Status.Present {
+ t.Fatalf("%s: the row has no name or no status to read", url)
+ }
+ return r
+}
+
+// span is a part's start and end measured along the row from its
+// inline start: from the left in English, from the right in Arabic, so
+// one ordering holds both directions.
+func (r rowReading) span(it rowItem) (start, end float64) {
+ if r.RTL {
+ return r.Start - it.Right, r.Start - it.Left
+ }
+ return it.Left - r.Start, it.Right - r.Start
+}
+
+// width is the row's content width.
+func (r rowReading) width() float64 { return max(r.End-r.Start, r.Start-r.End) }
+
+// onFirstLine is whether a part starts at the top of the row's content.
+func (r rowReading) onFirstLine(it rowItem) bool { return math.Abs(it.Top-r.Top) <= 1 }
+
+// TestAnInlineStatusStaysOnTheNamesLine: at 390 and 320, in both
+// directions, the list-row-action state with its status marked inline
+// keeps all four parts on the row's first line, in source order from
+// the inline start (lead, name, status, action), and the name's column
+// takes the room the other three leave. A name long enough to wrap
+// wraps inside its column and the status and action stay up; with no
+// lead and no action the status ends at the row's content end. Without
+// the value each of those rows puts the status under the name, as 1.0
+// does, which is the control that the legs above see the value's work.
+// At 1280 each row paints as the same row unmarked, pixel for pixel.
+func TestAnInlineStatusStaysOnTheNamesLine(t *testing.T) {
+ doc := stateDoc(t, "list-row-action", "A short status beside the name")
+ long := swapped(t, doc, ">Release notes, August</a>", ">Release notes for August, with every change since the spring</a>")
+ bare := swapped(t, doc, "\n <span rst-row-lead data-lead=\"accent\" aria-hidden=\"true\">RN</span>", "")
+ bare = swapped(t, bare, "\n <a rst-row-action href=\"/posts/1/edit\" aria-label=\"Edit Release notes, August\">Edit</a>", "")
+ pages := map[string]string{}
+ for name, d := range map[string]string{"/": doc, "/long": long, "/bare": bare} {
+ for _, dir := range []string{"", "-rtl"} {
+ if dir != "" {
+ d = inArabic(t, d)
+ }
+ pages[name+dir] = d
+ pages[name+dir+"-plain"] = swapped(t, d, `<span rst-status="inline" `, `<span rst-status `)
+ }
+ }
+ rig, ctx := phoneVariantRig(t, pages)
+ for _, dir := range []string{"", "-rtl"} {
+ for _, width := range []int64{390, 320} {
+ leg := func(name string) string { return fmt.Sprintf("%s%s at %d", name, dir, width) }
+ r := readRow(t, ctx, rig.Origin+"/"+dir, width)
+ if r.RTL != (dir != "") {
+ t.Fatalf("%s: the row reads right to left %v; this leg needs %v", leg("/"), r.RTL, dir != "")
+ }
+ parts := []struct {
+ name string
+ it rowItem
+ }{{"the lead", r.Lead}, {"the name", r.Name}, {"the status", r.Status}, {"the action", r.Action}}
+ room := r.width()
+ for i, p := range parts {
+ if !p.it.Present {
+ t.Fatalf("%s: the state's row has no %s", leg("/"), p.name)
+ }
+ if !r.onFirstLine(p.it) {
+ t.Errorf("%s: %s starts at %.1f, off the row's first line at %.1f", leg("/"), p.name, p.it.Top, r.Top)
+ }
+ start, end := r.span(p.it)
+ if i > 0 {
+ if _, before := r.span(parts[i-1].it); start < before-0.5 {
+ t.Errorf("%s: %s starts %.1fpx along the row, before %s ends at %.1fpx; the line must read lead, name, status, action", leg("/"), p.name, start, parts[i-1].name, before)
+ }
+ }
+ if p.name != "the name" {
+ room -= end - start + r.Gap
+ }
+ }
+ if start, end := r.span(r.Name); end-start < room-0.5 {
+ t.Errorf("%s: the name is %.1fpx wide with %.1fpx left by the others; its column must take the room", leg("/"), end-start, room)
+ }
+
+ l := readRow(t, ctx, rig.Origin+"/long"+dir, width)
+ if l.NameLines < 2 {
+ t.Errorf("%s: the long name takes %d line; it must wrap inside its column", leg("/long"), l.NameLines)
+ }
+ _, nameEnd := l.span(l.Name)
+ if statusStart, _ := l.span(l.Status); statusStart < nameEnd-0.5 {
+ t.Errorf("%s: the status starts %.1fpx along, inside the long name's column, which ends at %.1fpx", leg("/long"), statusStart, nameEnd)
+ }
+ if !l.onFirstLine(l.Status) || !l.onFirstLine(l.Action) {
+ t.Errorf("%s: under a long name the status starts at %.1f and the action at %.1f; both must stay on the first line at %.1f", leg("/long"), l.Status.Top, l.Action.Top, l.Top)
+ }
+ if l.DocScroll > l.DocClient {
+ t.Errorf("%s: the page is %.0fpx wide in a %.0fpx viewport; it scrolls sideways", leg("/long"), l.DocScroll, l.DocClient)
+ }
+
+ b := readRow(t, ctx, rig.Origin+"/bare"+dir, width)
+ if b.Lead.Present || b.Action.Present {
+ t.Fatalf("%s: the scratch row still has a lead or an action", leg("/bare"))
+ }
+ if _, end := b.span(b.Status); math.Abs(end-b.width()) > 0.5 {
+ t.Errorf("%s: with no lead and no action the status ends %.1fpx along a row whose content ends at %.1fpx", leg("/bare"), end, b.width())
+ }
+ if !b.onFirstLine(b.Status) {
+ t.Errorf("%s: the status starts at %.1f, off the first line at %.1f", leg("/bare"), b.Status.Top, b.Top)
+ }
+
+ for _, name := range []string{"/", "/long", "/bare"} {
+ p := readRow(t, ctx, rig.Origin+name+dir+"-plain", width)
+ if p.Status.Top < p.Name.Bottom-0.5 {
+ t.Errorf("%s unmarked: the status starts at %.1f, above the name's foot at %.1f; 1.0 puts it under the name", leg(name), p.Status.Top, p.Name.Bottom)
+ }
+ }
+ }
+ }
+ for _, name := range []string{"/", "/long", "/bare", "/-rtl"} {
+ sameAtDesktop(t, ctx, rig.Origin, name, name+"-plain", `rst-status="inline" (`+name+`)`)
+ }
+}
diff --git a/check/testdata/fixtures/spelling-class.html b/check/testdata/fixtures/spelling-class.html
index 24f4f61..4987e9f 100644
--- a/check/testdata/fixtures/spelling-class.html
+++ b/check/testdata/fixtures/spelling-class.html
@@ -33,6 +33,7 @@
<div class="rst-lbar" ><search><form class="rst-search" method="get" action="/x"><svg class="icon" viewBox="0 0 16 16"><circle cx="8" cy="8" r="7"></circle></svg><input type="search" name="q" value="a" aria-label="Search"><a class="rst-search__clear" href="/x" aria-label="Clear">x</a><button class="rst-sr-only" type="submit">Search</button></form></search></div>
<div class="rst-row" ><span class="rst-row__lead" data-lead="positive"></span><div class="rst-row__main" ><a href="#a">Name</a><span class="rst-row__sub" >Sub</span></div><span class="rst-status" data-tone="positive">Live</span><a class="rst-row__action" href="#a">Edit</a></div>
<div class="rst-row" ><span class="rst-row__lead" data-lead="warning"></span><div class="rst-row__main" ><a href="#a">Second</a></div></div>
+ <div class="rst-row" ><span class="rst-row__lead" data-lead="positive"></span><div class="rst-row__main" ><a href="#a">Third</a><span class="rst-row__sub" >Sub</span></div><span class="rst-status rst-status--inline" data-tone="positive">Live</span><a class="rst-row__action" href="#a">Edit</a></div>
</div>
<div class="rst-list" ><form class="rst-search" method="get" action="/x"><input type="search" name="q" aria-label="Search"></form></div>
<div class="rst-list" ><div class="rst-empty" ><h2 class="rst-empty__title" >Nothing yet</h2><p class="rst-empty__body" >Body.</p><a class="rst-btn rst-btn--primary rst-empty__cta" href="#a">Start</a></div></div>
diff --git a/css/tokens.css b/css/tokens.css
index fbf0659..c7e2ea4 100644
--- a/css/tokens.css
+++ b/css/tokens.css
@@ -1455,6 +1455,20 @@ body {
justify-self: start;
padding-block: 0.05rem;
}
+ /* A status the page marks inline stays on the first line, in its
+ source place: an implicit column straight after the name's, so the
+ line reads lead, name, status, action (mirrored right to left), and
+ the name's column takes what is left and wraps inside it. It keeps
+ the size above. Marking it is the page saying the status is short;
+ nothing here measures it. Not a wrapping flex line, which would
+ keep the status up only where it fit: flex wraps item by item, so
+ whether the status or the action after it dropped would depend on
+ each name's length, row to row in one list. Opt-in, because a 1.0
+ page's status must stay where 1.0 put it. */
+ .rst-row:has(> .rst-status) > .rst-status--inline, [rst-row]:has(> [rst-status]) > [rst-status~="inline"] {
+ grid-column: auto;
+ grid-row: 1;
+ }
/* min(), not a second token: a theme that already chose a title at or
under the narrow size keeps it, and one above it steps down. */
.rst-page-header h1, [rst-page-header] h1 {
diff --git a/examples/examples.json b/examples/examples.json
index f4981c3..bacba41 100644
--- a/examples/examples.json
+++ b/examples/examples.json
@@ -133,6 +133,14 @@
"sampleURLs": [
"/posts/2"
]
+ },
+ {
+ "id": "a-short-status-beside-the-name",
+ "label": "A short status beside the name",
+ "sampleURLs": [
+ "/posts/1",
+ "/posts/1/edit"
+ ]
}
]
},
diff --git a/examples/list-row-action/a-short-status-beside-the-name.html b/examples/list-row-action/a-short-status-beside-the-name.html
new file mode 100644
index 0000000..c6d6774
--- /dev/null
+++ b/examples/list-row-action/a-short-status-beside-the-name.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<html lang="en" dir="ltr">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width">
+<title>list-row-action: A short status beside the name</title>
+<link rel="stylesheet" href="../../css/tokens.css">
+<link rel="stylesheet" href="../../css/themes/day.css">
+<script defer src="../../js/light.js"></script>
+</head>
+<body>
+<div rst-list><div rst-row>
+ <span rst-row-lead data-lead="accent" aria-hidden="true">RN</span>
+ <span rst-row-main><a href="/posts/1">Release notes, August</a><small rst-row-sub>Published 2 August · 4 min read</small></span>
+ <span rst-status="inline" rst-tone="positive">Published</span>
+ <a rst-row-action href="/posts/1/edit" aria-label="Edit Release notes, August">Edit</a>
+</div></div>
+</body>
+</html>
diff --git a/examples/prose.json b/examples/prose.json
index 6da2ddf..985e229 100644
--- a/examples/prose.json
+++ b/examples/prose.json
@@ -249,7 +249,10 @@
"blurb": "The real data-table vocabulary: the card sets its columns once, rows only choose cells."
},
"list-row-action": {
- "blurb": "One list row: the record's name as the primary link, a meta line, and a secondary action."
+ "blurb": "One list row: the record's name as the primary link, a meta line, and a secondary action.",
+ "states": {
+ "a-short-status-beside-the-name": "rst-status=\"inline\" keeps a short status on the name's line on a phone. Without it the status moves under the name."
+ }
},
"list-search-submit": {
"blurb": "The search form's real submit button: visually hidden, in the tab order, and it un-hides on keyboard focus.",
diff --git a/internal/gallery/heights.go b/internal/gallery/heights.go
index 4d58ff6..9a6db30 100644
--- a/internal/gallery/heights.go
+++ b/internal/gallery/heights.go
@@ -147,6 +147,7 @@ var previewHeights = map[string]int{
"list-bar-search/with-a-query-on-page-4": 120,
"list-bar/search-with-a-filter-dropdown": 210,
"list-grid/default": 280,
+ "list-row-action/a-short-status-beside-the-name": 120,
"list-row-action/lead-marker-status-and-an-action": 120,
"list-row-action/name-and-meta-line-only": 120,
"list-search-submit/default-label": 130,
@@ -220,6 +221,7 @@ var previewMobileHeights = map[string]int{
"layout-stage/default": 640,
"layout-topbar/default": 1070,
"list-bar/search-with-a-filter-dropdown": 310,
+ "list-row-action/a-short-status-beside-the-name": 300,
"list-row-action/lead-marker-status-and-an-action": 240,
"media-grid/screenshots-a-logo-and-a-banner": 1590,
"media-grid/select-mode-one-tile-selected": 850,
@@ -248,8 +250,9 @@ var previewMobileHeights = map[string]int{
// previewMobileHeights allows, read for that language's pages only.
var previewMobileLocaleHeights = map[string]map[string]int{
"ar": {
- "api-tokens/four-tokens-two-of-them-live": 1880,
- "stat-band/two-to-a-line-on-a-phone": 330,
+ "api-tokens/four-tokens-two-of-them-live": 1880,
+ "list-row-action/a-short-status-beside-the-name": 320,
+ "stat-band/two-to-a-line-on-a-phone": 330,
},
"bn": {
"form-layout/default": 510,
@@ -346,6 +349,7 @@ var previewMobileLocaleHeights = map[string]map[string]int{
"layout-column/default": 1400,
"layout-console-page/default": 1200,
"layout-topbar/default": 1140,
+ "list-row-action/a-short-status-beside-the-name": 330,
"list-row-action/lead-marker-status-and-an-action": 290,
"modal/default": 350,
"seg-tabs/buttons-that-switch-in-place": 170,
diff --git a/internal/gallery/i18n/ar.json b/internal/gallery/i18n/ar.json
index 7c8e86e..4225bf9 100644
--- a/internal/gallery/i18n/ar.json
+++ b/internal/gallery/i18n/ar.json
@@ -74,6 +74,7 @@
"examples.list-bar.blurb": "شريط الأدوات أعلى بطاقة القائمة، مع البحث والتصفية.",
"examples.list-grid.blurb": "مفردات جداول البيانات الحقيقية: البطاقة تحدّد أعمدتها مرة واحدة، والصفوف تختار الخلايا فحسب.",
"examples.list-row-action.blurb": "صف واحد من القائمة: اسم السجل رابطًا رئيسيًا، وسطر معلومات، وإجراء ثانوي.",
+ "examples.list-row-action.states.a-short-status-beside-the-name": "‎rst-status=\"inline\"‎ يُبقي حالةً قصيرة على سطر الاسم في الهاتف. ومن دونه تنتقل الحالة إلى تحت الاسم.",
"examples.list-search-submit.blurb": "زر الإرسال الحقيقي لنموذج البحث: مخفيّ بصريًّا، لكنه ضمن ترتيب Tab، ويظهر حين يصله تركيز لوحة المفاتيح.",
"examples.list-search-submit.states.default-label": "لا يظهر هنا شيء إلى أن تصل إليه بمفتاح Tab.",
"examples.locale-menu.blurb": "مبدّل اللغة: قائمة details من نماذج POST ذات حقل واحد، فيُرسَل الاختيار إلى تطبيقك ويبقى القارئ على المسار نفسه.",
@@ -350,6 +351,7 @@
"labels.list-bar-search.with-a-query": "مع استعلام",
"labels.list-bar-search.with-a-query-on-page-4": "مع استعلام، في الصفحة 4",
"labels.list-bar.search-with-a-filter-dropdown": "بحث مع قائمة تصفية منسدلة",
+ "labels.list-row-action.a-short-status-beside-the-name": "حالة قصيرة بجانب الاسم",
"labels.list-row-action.lead-marker-status-and-an-action": "علامة في المقدّمة وحالة وإجراء واحد",
"labels.list-row-action.name-and-meta-line-only": "الاسم وسطر البيانات الفرعية فقط",
"labels.list-search-submit.default-label": "التسمية الافتراضية",
diff --git a/internal/gallery/i18n/bn.json b/internal/gallery/i18n/bn.json
index 1190eb0..6a5538f 100644
--- a/internal/gallery/i18n/bn.json
+++ b/internal/gallery/i18n/bn.json
@@ -74,6 +74,7 @@
"examples.list-bar.blurb": "তালিকা কার্ডের উপরের টুলবার, সঙ্গে অনুসন্ধান ও ফিল্টার।",
"examples.list-grid.blurb": "ডেটা টেবিলের আসল শব্দভান্ডার: কার্ড একবারেই তার কলাম ঠিক করে, সারিরা কেবল ঘর বেছে নেয়।",
"examples.list-row-action.blurb": "একটি তালিকা সারি: রেকর্ডের নাম মূল লিংক হিসেবে, একটি মেটা লাইন, আর একটি গৌণ ক্রিয়া।",
+ "examples.list-row-action.states.a-short-status-beside-the-name": "rst-status=\"inline\" ফোনে একটি ছোট অবস্থাকে নামের লাইনেই রাখে। এটি ছাড়া অবস্থাটি নামের নিচে চলে যায়।",
"examples.list-search-submit.blurb": "খোঁজার ফর্মের আসল সাবমিট বোতাম: চোখের আড়ালে, কিন্তু Tab ক্রমে আছে, আর কীবোর্ড ফোকাস পেলেই সামনে আসে।",
"examples.list-search-submit.states.default-label": "ট্যাব দিয়ে এখানে না আসা পর্যন্ত কিছুই দেখা যায় না।",
"examples.locale-menu.blurb": "ভাষা বদলানোর মেনু: এক-ফিল্ডের POST ফর্ম দিয়ে তৈরি একটি details মেনু, তাই পছন্দটি আপনার অ্যাপে যায় আর পাঠক একই পাথে থাকেন।",
@@ -350,6 +351,7 @@
"labels.list-bar-search.with-a-query": "একটি অনুসন্ধানসহ",
"labels.list-bar-search.with-a-query-on-page-4": "একটি অনুসন্ধানসহ, ৪ নম্বর পাতায়",
"labels.list-bar.search-with-a-filter-dropdown": "খোঁজা, সঙ্গে একটি ফিল্টার ড্রপডাউন",
+ "labels.list-row-action.a-short-status-beside-the-name": "নামের পাশে একটি ছোট অবস্থা",
"labels.list-row-action.lead-marker-status-and-an-action": "শুরুর চিহ্ন, অবস্থা আর একটি কাজ",
"labels.list-row-action.name-and-meta-line-only": "শুধু নাম আর মেটা লাইন",
"labels.list-search-submit.default-label": "পূর্বনির্ধারিত লেবেল",
diff --git a/internal/gallery/i18n/drafts.json b/internal/gallery/i18n/drafts.json
index 4157713..95e7ace 100644
--- a/internal/gallery/i18n/drafts.json
+++ b/internal/gallery/i18n/drafts.json
@@ -527,6 +527,22 @@
"zh-Hans"
]
},
+ "examples.list-row-action.states.a-short-status-beside-the-name": {
+ "english": "rst-status=\"inline\" keeps a short status on the name's line on a phone. Without it the status moves under the name.",
+ "locales": [
+ "ar",
+ "bn",
+ "es",
+ "ga",
+ "hi",
+ "ja",
+ "pt-PT",
+ "ru",
+ "vi",
+ "yue",
+ "zh-Hans"
+ ]
+ },
"examples.locale-menu.blurb": {
"english": "The language switcher: a details menu of one-field POST forms, so the choice is sent to your app and the reader stays on the same path.",
"locales": [
@@ -1583,6 +1599,22 @@
"zh-Hans"
]
},
+ "labels.list-row-action.a-short-status-beside-the-name": {
+ "english": "A short status beside the name",
+ "locales": [
+ "ar",
+ "bn",
+ "es",
+ "ga",
+ "hi",
+ "ja",
+ "pt-PT",
+ "ru",
+ "vi",
+ "yue",
+ "zh-Hans"
+ ]
+ },
"labels.scheme-menu.standalone": {
"english": "Standalone: the page remembers the choice",
"locales": [
diff --git a/internal/gallery/i18n/es.json b/internal/gallery/i18n/es.json
index 31c6598..a65f479 100644
--- a/internal/gallery/i18n/es.json
+++ b/internal/gallery/i18n/es.json
@@ -74,6 +74,7 @@
"examples.list-bar.blurb": "La barra de herramientas en la parte superior de una tarjeta de lista, con búsqueda y filtro.",
"examples.list-grid.blurb": "El vocabulario real de las tablas de datos: la tarjeta define sus columnas una vez y las filas solo eligen celdas.",
"examples.list-row-action.blurb": "Una fila de lista: el nombre del registro como enlace principal, una línea de datos y una acción secundaria.",
+ "examples.list-row-action.states.a-short-status-beside-the-name": "rst-status=\"inline\" mantiene un estado corto en la línea del nombre en un móvil. Sin él, el estado pasa debajo del nombre.",
"examples.list-search-submit.blurb": "El botón de enviar de verdad del formulario de búsqueda: oculto a la vista, dentro del orden de tabulación, y aparece al recibir el foco del teclado.",
"examples.list-search-submit.states.default-label": "Aquí no se ve nada hasta que llegas con el tabulador.",
"examples.locale-menu.blurb": "El selector de idioma: un menú details con formularios POST de un solo campo, para que la elección llegue a tu aplicación y quien lee se mantenga en la misma ruta.",
@@ -350,6 +351,7 @@
"labels.list-bar-search.with-a-query": "Con una consulta",
"labels.list-bar-search.with-a-query-on-page-4": "Con una consulta, en la página 4",
"labels.list-bar.search-with-a-filter-dropdown": "Búsqueda con un desplegable de filtro",
+ "labels.list-row-action.a-short-status-beside-the-name": "Un estado corto junto al nombre",
"labels.list-row-action.lead-marker-status-and-an-action": "Marca inicial, estado y una acción",
"labels.list-row-action.name-and-meta-line-only": "Solo el nombre y la línea de detalle",
"labels.list-search-submit.default-label": "Etiqueta por defecto",
diff --git a/internal/gallery/i18n/ga.json b/internal/gallery/i18n/ga.json
index 5926052..b3c4fb2 100644
--- a/internal/gallery/i18n/ga.json
+++ b/internal/gallery/i18n/ga.json
@@ -74,6 +74,7 @@
"examples.list-bar.blurb": "An barra uirlisí ag barr cárta liosta, le cuardach agus scagaire.",
"examples.list-grid.blurb": "Fíorfhoclóir na dtáblaí sonraí: socraíonn an cárta a cholúin uair amháin, ní roghnaíonn na rónna ach cealla.",
"examples.list-row-action.blurb": "Ró liosta amháin: ainm an taifid mar an príomhnasc, líne mheiteashonraí, agus gníomh tánaisteach.",
+ "examples.list-row-action.states.a-short-status-beside-the-name": "Coinníonn rst-status=\"inline\" stádas gearr ar líne an ainm ar fhón. Gan é, bogann an stádas faoin ainm.",
"examples.list-search-submit.blurb": "Fíorchnaipe seolta na foirme cuardaigh: folaithe ó radharc, san ord táib, agus nochtann sé é féin nuair a fhaigheann sé fócas ón méarchlár.",
"examples.list-search-submit.states.default-label": "Ní bhíonn aon rud le feiceáil anseo go dtí go mbogann tú isteach ann leis an eochair táib.",
"examples.locale-menu.blurb": "An malartóir teanga: roghchlár details d'fhoirmeacha POST aon réimse, ionas go seoltar an rogha chuig d'aip agus go bhfanann an léitheoir ar an gconair chéanna.",
@@ -350,6 +351,7 @@
"labels.list-bar-search.with-a-query": "Le ceist",
"labels.list-bar-search.with-a-query-on-page-4": "Le ceist, ar leathanach 4",
"labels.list-bar.search-with-a-filter-dropdown": "Cuardach le hanuas-roghchlár scagtha",
+ "labels.list-row-action.a-short-status-beside-the-name": "Stádas gearr in aice leis an ainm",
"labels.list-row-action.lead-marker-status-and-an-action": "Marcóir tosaigh, stádas agus gníomh",
"labels.list-row-action.name-and-meta-line-only": "Ainm agus líne meiteashonraí amháin",
"labels.list-search-submit.default-label": "Lipéad réamhshocraithe",
diff --git a/internal/gallery/i18n/hi.json b/internal/gallery/i18n/hi.json
index e5bae82..e06afd3 100644
--- a/internal/gallery/i18n/hi.json
+++ b/internal/gallery/i18n/hi.json
@@ -74,6 +74,7 @@
"examples.list-bar.blurb": "सूची कार्ड के ऊपर की टूलबार, खोज और फ़िल्टर के साथ।",
"examples.list-grid.blurb": "डेटा तालिका की असली शब्दावली: कार्ड अपने स्तंभ एक बार तय करता है, पंक्तियाँ बस कोशिकाएँ चुनती हैं।",
"examples.list-row-action.blurb": "एक सूची पंक्ति: रिकॉर्ड का नाम मुख्य लिंक के रूप में, एक मेटा पंक्ति, और एक द्वितीयक क्रिया।",
+ "examples.list-row-action.states.a-short-status-beside-the-name": "rst-status=\"inline\" फ़ोन पर छोटी स्थिति को नाम की पंक्ति में ही रखता है। इसके बिना स्थिति नाम के नीचे चली जाती है।",
"examples.list-search-submit.blurb": "खोज फ़ॉर्म का असली सबमिट बटन: दिखने में छिपा, पर Tab क्रम में मौजूद, और कीबोर्ड फ़ोकस मिलते ही सामने आ जाता है।",
"examples.list-search-submit.states.default-label": "जब तक आप टैब से यहाँ नहीं पहुँचते, यहाँ कुछ दिखाई नहीं देता।",
"examples.locale-menu.blurb": "भाषा बदलने का मेन्यू: एक-फ़ील्ड वाले POST फ़ॉर्म का details मेन्यू, ताकि चुनाव आपके ऐप तक जाए और पाठक उसी पाथ पर रहे।",
@@ -350,6 +351,7 @@
"labels.list-bar-search.with-a-query": "एक क्वेरी के साथ",
"labels.list-bar-search.with-a-query-on-page-4": "एक क्वेरी के साथ, पृष्ठ 4 पर",
"labels.list-bar.search-with-a-filter-dropdown": "खोज, साथ में फ़िल्टर ड्रॉपडाउन",
+ "labels.list-row-action.a-short-status-beside-the-name": "नाम के बगल में एक छोटी स्थिति",
"labels.list-row-action.lead-marker-status-and-an-action": "आरंभिक निशान, स्थिति और एक क्रिया",
"labels.list-row-action.name-and-meta-line-only": "सिर्फ़ नाम और मेटा पंक्ति",
"labels.list-search-submit.default-label": "डिफ़ॉल्ट लेबल",
diff --git a/internal/gallery/i18n/ja.json b/internal/gallery/i18n/ja.json
index 2f65789..072788b 100644
--- a/internal/gallery/i18n/ja.json
+++ b/internal/gallery/i18n/ja.json
@@ -74,6 +74,7 @@
"examples.list-bar.blurb": "一覧カードの上部にあるツールバー。検索と絞り込みが入ります。",
"examples.list-grid.blurb": "データテーブルの本当の語彙です。列を決めるのはカードで一度きり、行はセルを選ぶだけです。",
"examples.list-row-action.blurb": "一覧の1行。レコード名を主リンクに、補足の1行、そして副次的な操作がひとつ。",
+ "examples.list-row-action.states.a-short-status-beside-the-name": "rst-status=\"inline\" を付けると、スマートフォンでも短い状態を名前と同じ行に置きます。付けなければ状態は名前の下に移ります。",
"examples.list-search-submit.blurb": "検索フォームの本物の送信ボタンです。目には見えませんがタブ順には入っていて、キーボードでフォーカスすると姿を現します。",
"examples.list-search-submit.states.default-label": "Tab キーで入るまで、ここには何も表示されません。",
"examples.locale-menu.blurb": "言語スイッチャーです。一項目だけの POST フォームを details メニューに並べたもので、選択はアプリに送られ、読者は同じパスにとどまります。",
@@ -350,6 +351,7 @@
"labels.list-bar-search.with-a-query": "検索語あり",
"labels.list-bar-search.with-a-query-on-page-4": "検索語あり、4 ページ目",
"labels.list-bar.search-with-a-filter-dropdown": "検索と絞り込みのドロップダウン",
+ "labels.list-row-action.a-short-status-beside-the-name": "名前の横に短い状態",
"labels.list-row-action.lead-marker-status-and-an-action": "先頭の目印、状態、そしてひとつの操作",
"labels.list-row-action.name-and-meta-line-only": "名前と補足行だけ",
"labels.list-search-submit.default-label": "既定のラベル",
diff --git a/internal/gallery/i18n/pt-PT.json b/internal/gallery/i18n/pt-PT.json
index 2e7be2d..d7c57fb 100644
--- a/internal/gallery/i18n/pt-PT.json
+++ b/internal/gallery/i18n/pt-PT.json
@@ -74,6 +74,7 @@
"examples.list-bar.blurb": "A barra de ferramentas no topo de um cartão de lista, com pesquisa e filtro.",
"examples.list-grid.blurb": "O vocabulário a sério das tabelas de dados: o cartão define as suas colunas uma vez e as linhas só escolhem células.",
"examples.list-row-action.blurb": "Uma linha de lista: o nome do registo como ligação principal, uma linha de dados e uma ação secundária.",
+ "examples.list-row-action.states.a-short-status-beside-the-name": "rst-status=\"inline\" mantém um estado curto na linha do nome num telemóvel. Sem ele, o estado passa para baixo do nome.",
"examples.list-search-submit.blurb": "O verdadeiro botão de envio do formulário de pesquisa: escondido à vista, dentro da ordem de tabulação, e aparece quando recebe o foco do teclado.",
"examples.list-search-submit.states.default-label": "Aqui não se vê nada até chegar com a tecla de tabulação.",
"examples.locale-menu.blurb": "O seletor de idioma: um menu details de formulários POST de um só campo, para que a escolha seja enviada à sua aplicação e quem lê fique no mesmo caminho.",
@@ -350,6 +351,7 @@
"labels.list-bar-search.with-a-query": "Com uma consulta",
"labels.list-bar-search.with-a-query-on-page-4": "Com uma consulta, na página 4",
"labels.list-bar.search-with-a-filter-dropdown": "Pesquisa com um menu de filtro",
+ "labels.list-row-action.a-short-status-beside-the-name": "Um estado curto ao lado do nome",
"labels.list-row-action.lead-marker-status-and-an-action": "Marca inicial, estado e uma ação",
"labels.list-row-action.name-and-meta-line-only": "Só o nome e a linha de detalhe",
"labels.list-search-submit.default-label": "Etiqueta por omissão",
diff --git a/internal/gallery/i18n/ru.json b/internal/gallery/i18n/ru.json
index 02aa769..909690f 100644
--- a/internal/gallery/i18n/ru.json
+++ b/internal/gallery/i18n/ru.json
@@ -74,6 +74,7 @@
"examples.list-bar.blurb": "Панель инструментов вверху карточки списка, с поиском и фильтром.",
"examples.list-grid.blurb": "Настоящий словарь таблиц данных: карточка задаёт колонки один раз, строки только выбирают ячейки.",
"examples.list-row-action.blurb": "Одна строка списка: имя записи как основная ссылка, строка сведений и второстепенное действие.",
+ "examples.list-row-action.states.a-short-status-beside-the-name": "rst-status=\"inline\" оставляет короткий статус на строке имени на телефоне. Без него статус переходит под имя.",
"examples.list-search-submit.blurb": "Настоящая кнопка отправки формы поиска: визуально скрыта, но в порядке табуляции, и показывается при фокусе с клавиатуры.",
"examples.list-search-submit.states.default-label": "Здесь ничего не видно, пока вы не перейдёте сюда клавишей Tab.",
"examples.locale-menu.blurb": "Переключатель языка: меню details из POST-форм с одним полем, так что выбор отправляется вашему приложению, а читатель остаётся на том же пути.",
@@ -350,6 +351,7 @@
"labels.list-bar-search.with-a-query": "С запросом",
"labels.list-bar-search.with-a-query-on-page-4": "С запросом, на странице 4",
"labels.list-bar.search-with-a-filter-dropdown": "Поиск с выпадающим фильтром",
+ "labels.list-row-action.a-short-status-beside-the-name": "Короткий статус рядом с именем",
"labels.list-row-action.lead-marker-status-and-an-action": "Начальная метка, статус и одно действие",
"labels.list-row-action.name-and-meta-line-only": "Только имя и строка сведений",
"labels.list-search-submit.default-label": "Подпись по умолчанию",
diff --git a/internal/gallery/i18n/vi.json b/internal/gallery/i18n/vi.json
index f5aaf57..a262516 100644
--- a/internal/gallery/i18n/vi.json
+++ b/internal/gallery/i18n/vi.json
@@ -74,6 +74,7 @@
"examples.list-bar.blurb": "Thanh công cụ ở đầu thẻ danh sách, có tìm kiếm và bộ lọc.",
"examples.list-grid.blurb": "Bộ từ vựng thật của bảng dữ liệu: thẻ định các cột một lần, các hàng chỉ chọn ô.",
"examples.list-row-action.blurb": "Một hàng danh sách: tên bản ghi làm liên kết chính, một dòng thông tin phụ và một hành động phụ.",
+ "examples.list-row-action.states.a-short-status-beside-the-name": "rst-status=\"inline\" giữ một trạng thái ngắn trên dòng của tên trên điện thoại. Không có nó, trạng thái chuyển xuống dưới tên.",
"examples.list-search-submit.blurb": "Nút gửi thật của biểu mẫu tìm kiếm: ẩn khỏi mắt nhìn, vẫn nằm trong thứ tự Tab, và hiện ra khi nhận tiêu điểm bàn phím.",
"examples.list-search-submit.states.default-label": "Không có gì hiện ra ở đây cho đến khi bạn dùng phím Tab đi vào.",
"examples.locale-menu.blurb": "Bộ chuyển ngôn ngữ: một menu details gồm các biểu mẫu POST một trường, nên lựa chọn được gửi tới ứng dụng của bạn và người đọc vẫn ở cùng đường dẫn.",
@@ -350,6 +351,7 @@
"labels.list-bar-search.with-a-query": "Có truy vấn",
"labels.list-bar-search.with-a-query-on-page-4": "Có truy vấn, ở trang 4",
"labels.list-bar.search-with-a-filter-dropdown": "Tìm kiếm kèm trình đơn lọc",
+ "labels.list-row-action.a-short-status-beside-the-name": "Một trạng thái ngắn cạnh tên",
"labels.list-row-action.lead-marker-status-and-an-action": "Dấu dẫn đầu, trạng thái và một hành động",
"labels.list-row-action.name-and-meta-line-only": "Chỉ có tên và dòng thông tin phụ",
"labels.list-search-submit.default-label": "Nhãn mặc định",
diff --git a/internal/gallery/i18n/yue.json b/internal/gallery/i18n/yue.json
index ec14a33..7886091 100644
--- a/internal/gallery/i18n/yue.json
+++ b/internal/gallery/i18n/yue.json
@@ -74,6 +74,7 @@
"examples.list-bar.blurb": "清單卡頂部嘅工具列,有搜尋同篩選。",
"examples.list-grid.blurb": "真正嘅資料表格講法:卡片一次過定好啲欄,行淨係揀格。",
"examples.list-row-action.blurb": "一行清單:記錄名做主要連結、一行附加資料,同一個次要動作。",
+ "examples.list-row-action.states.a-short-status-beside-the-name": "rst-status=\"inline\" 喺手機上將短嘅狀態留喺名嗰行。冇佢嘅話,狀態就會搬去名下面。",
"examples.list-search-submit.blurb": "搜尋表單真正嘅提交掣:視覺上收埋咗,但喺 Tab 次序裏面,一攞到鍵盤焦點就現身。",
"examples.list-search-submit.states.default-label": "喺你用 Tab 掣入去之前,呢度乜都睇唔到。",
"examples.locale-menu.blurb": "語言切換器:一個 details 選單,入面係單一欄位嘅 POST 表格,咁選擇會送去你個應用程式,讀者亦會留喺同一條路徑。",
@@ -350,6 +351,7 @@
"labels.list-bar-search.with-a-query": "有查詢",
"labels.list-bar-search.with-a-query-on-page-4": "有查詢,第 4 頁",
"labels.list-bar.search-with-a-filter-dropdown": "搜尋,加一個篩選下拉選單",
+ "labels.list-row-action.a-short-status-beside-the-name": "名隔籬一個短嘅狀態",
"labels.list-row-action.lead-marker-status-and-an-action": "前面嘅記號、狀態同一個動作",
"labels.list-row-action.name-and-meta-line-only": "淨係有名稱同輔助資料嗰行",
"labels.list-search-submit.default-label": "預設標籤",
diff --git a/internal/gallery/i18n/zh-Hans.json b/internal/gallery/i18n/zh-Hans.json
index cbfd1da..41c2d98 100644
--- a/internal/gallery/i18n/zh-Hans.json
+++ b/internal/gallery/i18n/zh-Hans.json
@@ -74,6 +74,7 @@
"examples.list-bar.blurb": "列表卡片顶部的工具栏,带搜索和筛选。",
"examples.list-grid.blurb": "真正的数据表格语汇:卡片一次性定好列,行只负责挑单元格。",
"examples.list-row-action.blurb": "一条列表行:记录名称作为主链接、一行附加信息,以及一个次要操作。",
+ "examples.list-row-action.states.a-short-status-beside-the-name": "rst-status=\"inline\" 让手机上的简短状态留在名称那一行。没有它,状态会移到名称下方。",
"examples.list-search-submit.blurb": "搜索表单真正的提交按钮:视觉上隐藏,但在 Tab 顺序里,一旦获得键盘焦点就现身。",
"examples.list-search-submit.states.default-label": "在你用 Tab 键进入之前,这里什么都看不到。",
"examples.locale-menu.blurb": "语言切换器:一个 details 菜单,里面是单字段的 POST 表单,这样选择会发送到你的应用,读者仍留在同一个路径上。",
@@ -350,6 +351,7 @@
"labels.list-bar-search.with-a-query": "已有查询",
"labels.list-bar-search.with-a-query-on-page-4": "已有查询,第 4 页",
"labels.list-bar.search-with-a-filter-dropdown": "搜索,外加一个筛选下拉菜单",
+ "labels.list-row-action.a-short-status-beside-the-name": "名称旁的简短状态",
"labels.list-row-action.lead-marker-status-and-an-action": "前导标记、状态和一个操作",
"labels.list-row-action.name-and-meta-line-only": "只有名称和辅助信息行",
"labels.list-search-submit.default-label": "默认标签",